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

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

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 309a5702
...@@ -85,7 +85,10 @@ nvkm_output_create_(struct nouveau_object *parent, ...@@ -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);
......
...@@ -8,6 +8,8 @@ ...@@ -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))
......
...@@ -255,6 +255,8 @@ init_i2c(struct nvbios_init *init, int index) ...@@ -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);
......
...@@ -549,8 +549,12 @@ nouveau_i2c_create_(struct nouveau_object *parent, ...@@ -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, ...@@ -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)
......
...@@ -1493,6 +1493,7 @@ parse_dcb20_entry(struct drm_device *dev, struct dcb_table *dcb, ...@@ -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) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment