⬢ DragonFlyBSD Kernel Audit
DF-4965 / fix.diff
← back to finding ↓ download raw
--- 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);
 }