Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e024f13 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau: bail out of auxch transaction if we repeatedly recieve defers



There's one known case where we never stop recieving DEFER, and loop here
forever.  Lets not do that..

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 45284162
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -483,7 +483,7 @@ nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr,
	ctrl |= (cmd << NV50_AUXCH_CTRL_CMD_SHIFT);
	ctrl |= ((data_nr - 1) << NV50_AUXCH_CTRL_LEN_SHIFT);

	for (;;) {
	for (i = 0; i < 16; i++) {
		nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x80000000);
		nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl);
		nv_wr32(dev, NV50_AUXCH_CTRL(index), ctrl | 0x00010000);
@@ -502,6 +502,12 @@ nouveau_dp_auxch(struct nouveau_i2c_chan *auxch, int cmd, int addr,
			break;
	}

	if (i == 16) {
		NV_ERROR(dev, "auxch DEFER too many times, bailing\n");
		ret = -EREMOTEIO;
		goto out;
	}

	if (cmd & 1) {
		if ((stat & NV50_AUXCH_STAT_COUNT) != data_nr) {
			ret = -EREMOTEIO;