--- a/sys/dev/drm/amd/display/dc/gpio/dce110/hw_translate_dce110.c 2026-09-25 12:29:23.378621889 +0000 +++ b/sys/dev/drm/amd/display/dc/gpio/dce110/hw_translate_dce110.c 2026-09-25 12:29:29.794538477 +0000 @@ -141,28 +141,36 @@ * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK * directly in the create method */ case mmDC_GPIO_DDC1_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC1; return true; case mmDC_GPIO_DDC2_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC2; return true; case mmDC_GPIO_DDC3_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC3; return true; case mmDC_GPIO_DDC4_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC4; return true; case mmDC_GPIO_DDC5_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC5; return true; case mmDC_GPIO_DDC6_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC6; return true; case mmDC_GPIO_DDCVGA_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_DDC_VGA; return true; /* GPIO_I2CPAD */ case mmDC_GPIO_I2CPAD_A: + *id = GPIO_ID_DDC_DATA; *en = GPIO_DDC_LINE_I2C_PAD; return true; /* Not implemented */ --- a2/sys/dev/drm/amd/display/dc/gpio/gpio_service.c 2026-09-25 12:29:36.498451317 +0000 +++ b2/sys/dev/drm/amd/display/dc/gpio/gpio_service.c 2026-09-25 12:29:36.510451160 +0000 @@ -145,13 +145,21 @@ uint32_t offset, uint32_t mask) { - enum gpio_id id; + enum gpio_id id = GPIO_ID_UNKNOWN; uint32_t en; if (!service->translate.funcs->offset_to_id(offset, mask, &id, &en)) { ASSERT_CRITICAL(false); return NULL; } + + /* several hw_translate offset_to_id() implementations leave *id + * unwritten for DDC-family offsets while returning success; + * never proceed on a decoder that forgot the id */ + if (id == GPIO_ID_UNKNOWN) { + ASSERT_CRITICAL(false); + return NULL; + } return dal_gpio_create_irq(service, id, en); }