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

Commit 5b34cebe authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/i2c: segregate aux channel adapter indices from bit-banged i2c



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 309a5702
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -85,7 +85,10 @@ nvkm_output_create_(struct nouveau_object *parent,
	    dcbE->sorconf.link : 0, dcbE->connector, dcbE->i2c_index,
	    dcbE->sorconf.link : 0, dcbE->connector, dcbE->i2c_index,
	    dcbE->bus, dcbE->heads);
	    dcbE->bus, dcbE->heads);


	outp->port = i2c->find(i2c, outp->info.i2c_index);
	if (outp->info.type != DCB_OUTPUT_DP)
		outp->port = i2c->find(i2c, NV_I2C_PORT(outp->info.i2c_index));
	else
		outp->port = i2c->find(i2c, NV_I2C_AUX(outp->info.i2c_index));
	outp->edid = outp->port;
	outp->edid = outp->port;


	data = nvbios_connEp(bios, outp->info.connector, &ver, &hdr, &connE);
	data = nvbios_connEp(bios, outp->info.connector, &ver, &hdr, &connE);
+2 −0
Original line number Original line Diff line number Diff line
@@ -8,6 +8,8 @@
#include <subdev/bios/i2c.h>
#include <subdev/bios/i2c.h>


#define NV_I2C_PORT(n)    (0x00 + (n))
#define NV_I2C_PORT(n)    (0x00 + (n))
#define NV_I2C_AUX(n)     (0x10 + (n))
#define NV_I2C_EXT(n)     (0x20 + (n))
#define NV_I2C_DEFAULT(n) (0x80 + (n))
#define NV_I2C_DEFAULT(n) (0x80 + (n))


#define NV_I2C_TYPE_DCBI2C(n) (0x0000 | (n))
#define NV_I2C_TYPE_DCBI2C(n) (0x0000 | (n))
+2 −0
Original line number Original line Diff line number Diff line
@@ -255,6 +255,8 @@ init_i2c(struct nvbios_init *init, int index)
		}
		}


		index = init->outp->i2c_index;
		index = init->outp->i2c_index;
		if (init->outp->type == DCB_OUTPUT_DP)
			index += NV_I2C_AUX(0);
	}
	}


	return i2c->find(i2c, index);
	return i2c->find(i2c, index);
+6 −2
Original line number Original line Diff line number Diff line
@@ -549,8 +549,12 @@ nouveau_i2c_create_(struct nouveau_object *parent,
		case DCB_I2C_NV04_BIT:
		case DCB_I2C_NV04_BIT:
		case DCB_I2C_NV4E_BIT:
		case DCB_I2C_NV4E_BIT:
		case DCB_I2C_NVIO_BIT:
		case DCB_I2C_NVIO_BIT:
			nouveau_i2c_create_port(i2c, NV_I2C_PORT(index),
						info.type, &info);
			break;
		case DCB_I2C_NVIO_AUX:
		case DCB_I2C_NVIO_AUX:
			nouveau_i2c_create_port(i2c, index, info.type, &info);
			nouveau_i2c_create_port(i2c, NV_I2C_AUX(index),
						info.type, &info);
			break;
			break;
		case DCB_I2C_UNUSED:
		case DCB_I2C_UNUSED:
		default:
		default:
@@ -562,7 +566,7 @@ nouveau_i2c_create_(struct nouveau_object *parent,
	 * may be ddc/aux channels hiding behind external tmds/dp/etc
	 * may be ddc/aux channels hiding behind external tmds/dp/etc
	 * transmitters.
	 * transmitters.
	 */
	 */
	index = ((index + 0x0f) / 0x10) * 0x10;
	index = NV_I2C_EXT(0);
	i = -1;
	i = -1;
	while ((data = dcb_outp_parse(bios, ++i, &ver, &hdr, &outp))) {
	while ((data = dcb_outp_parse(bios, ++i, &ver, &hdr, &outp))) {
		if (!outp.location || !outp.extdev)
		if (!outp.location || !outp.extdev)
+1 −0
Original line number Original line Diff line number Diff line
@@ -1493,6 +1493,7 @@ parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb,
			break;
			break;
		}
		}
		link = entry->dpconf.sor.link;
		link = entry->dpconf.sor.link;
		entry->i2c_index += NV_I2C_AUX(0);
		break;
		break;
	case DCB_OUTPUT_TMDS:
	case DCB_OUTPUT_TMDS:
		if (dcb->version >= 0x40) {
		if (dcb->version >= 0x40) {