drm/nouveau/i2c: fix number of aux event slots
This was completely bogus before, using maximum DCB device index rather than maximum AUX ID to size the buffer that stores event refcounts. *Pretty* unlikely to have been an actual problem on most configurations, that is, unless you've got one of the rare boards that have off-chip DP. There, it'll likely crash. Cc: stable@vger.kernel.org # 6.4+ Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Karol Herbst <kherbst@redhat.com> Signed-off-by: Karol Herbst <kherbst@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20230719044051.6975-1-skeggsb@gmail.com
This commit is contained in:
parent
05abb3be91
commit
752a281032
@ -16,7 +16,7 @@ struct nvkm_i2c_bus {
|
||||
const struct nvkm_i2c_bus_func *func;
|
||||
struct nvkm_i2c_pad *pad;
|
||||
#define NVKM_I2C_BUS_CCB(n) /* 'n' is ccb index */ (n)
|
||||
#define NVKM_I2C_BUS_EXT(n) /* 'n' is dcb external encoder type */ ((n) + 0x100)
|
||||
#define NVKM_I2C_BUS_EXT(n) /* 'n' is dcb external encoder type */ ((n) + 0x10)
|
||||
#define NVKM_I2C_BUS_PRI /* ccb primary comm. port */ -1
|
||||
#define NVKM_I2C_BUS_SEC /* ccb secondary comm. port */ -2
|
||||
int id;
|
||||
@ -38,7 +38,7 @@ struct nvkm_i2c_aux {
|
||||
const struct nvkm_i2c_aux_func *func;
|
||||
struct nvkm_i2c_pad *pad;
|
||||
#define NVKM_I2C_AUX_CCB(n) /* 'n' is ccb index */ (n)
|
||||
#define NVKM_I2C_AUX_EXT(n) /* 'n' is dcb external encoder type */ ((n) + 0x100)
|
||||
#define NVKM_I2C_AUX_EXT(n) /* 'n' is dcb external encoder type */ ((n) + 0x10)
|
||||
int id;
|
||||
|
||||
struct mutex mutex;
|
||||
|
@ -260,10 +260,11 @@ nvkm_i2c_new_(const struct nvkm_i2c_func *func, struct nvkm_device *device,
|
||||
{
|
||||
struct nvkm_bios *bios = device->bios;
|
||||
struct nvkm_i2c *i2c;
|
||||
struct nvkm_i2c_aux *aux;
|
||||
struct dcb_i2c_entry ccbE;
|
||||
struct dcb_output dcbE;
|
||||
u8 ver, hdr;
|
||||
int ret, i;
|
||||
int ret, i, ids;
|
||||
|
||||
if (!(i2c = *pi2c = kzalloc(sizeof(*i2c), GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
@ -406,5 +407,11 @@ nvkm_i2c_new_(const struct nvkm_i2c_func *func, struct nvkm_device *device,
|
||||
}
|
||||
}
|
||||
|
||||
return nvkm_event_init(&nvkm_i2c_intr_func, &i2c->subdev, 4, i, &i2c->event);
|
||||
ids = 0;
|
||||
list_for_each_entry(aux, &i2c->aux, head)
|
||||
ids = max(ids, aux->id + 1);
|
||||
if (!ids)
|
||||
return 0;
|
||||
|
||||
return nvkm_event_init(&nvkm_i2c_intr_func, &i2c->subdev, 4, ids, &i2c->event);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user