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

Commit dc5bc4ed authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau: construct a connector table for cards that lack a real one



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f66fa771
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -5754,7 +5754,7 @@ static void
fixup_legacy_connector(struct nvbios *bios)
{
	struct dcb_table *dcb = &bios->dcb;
	int high = 0, i;
	int i, i2c, i2c_conn[DCB_MAX_NUM_I2C_ENTRIES] = { };

	/*
	 * DCB 3.0 also has the table in most cases, but there are some cards
@@ -5765,6 +5765,8 @@ fixup_legacy_connector(struct nvbios *bios)
	if (dcb->version >= 0x40)
		return;

	dcb->connector.entries = 0;

	/*
	 * No known connector info before v3.0, so make it up.  the rule here
	 * is: anything on the same i2c bus is considered to be on the same
@@ -5772,30 +5774,31 @@ fixup_legacy_connector(struct nvbios *bios)
	 * its own unique connector index.
	 */
	for (i = 0; i < dcb->entries; i++) {
		if (dcb->entry[i].i2c_index == 0xf)
			continue;

		/*
		 * Ignore the I2C index for on-chip TV-out, as there
		 * are cards with bogus values (nv31m in bug 23212),
		 * and it's otherwise useless.
		 */
		if (dcb->entry[i].type == OUTPUT_TV &&
		    dcb->entry[i].location == DCB_LOC_ON_CHIP) {
		    dcb->entry[i].location == DCB_LOC_ON_CHIP)
			dcb->entry[i].i2c_index = 0xf;
		i2c = dcb->entry[i].i2c_index;

		if (i2c_conn[i2c]) {
			dcb->entry[i].connector = i2c_conn[i2c] - 1;
			continue;
		}

		dcb->entry[i].connector = dcb->entry[i].i2c_index;
		if (dcb->entry[i].connector > high)
			high = dcb->entry[i].connector;
		dcb->entry[i].connector = dcb->connector.entries++;
		if (i2c != 0xf)
			i2c_conn[i2c] = dcb->connector.entries;
	}

	for (i = 0; i < dcb->entries; i++) {
		if (dcb->entry[i].i2c_index != 0xf)
			continue;

		dcb->entry[i].connector = ++high;
	/* Fake the connector table as well as just connector indices */
	for (i = 0; i < dcb->connector.entries; i++) {
		dcb->connector.entry[i].index = i;
		dcb->connector.entry[i].type = divine_connector_type(bios, i);
		dcb->connector.entry[i].gpio_tag = 0xff;
	}
}