[PATCH for drm-misc-fixes v2 2/2] drm/hisilicon/hibmc: Add a flag to indicate whether the OS-side driver has been loaded

From: Yongbang Shi

Date: Tue Jul 21 2026 - 08:54:10 EST


From: Lin He <helin52@xxxxxxxxxx>

Add a flag to indicate whether the OS-side driver has been loaded to
prevent the BMC from enabling DP if the driver is not loaded, which could
lead to system failure in handling interrupts and generate error messages
like:

irq xx: nobody cared (try booting with the "irqpoll" option)
...
Call Trace:
<TRQ>
...

Fixes: 0ab6ea261c1f ("drm/hisilicon/hibmc: add dp module in hibmc")
Signed-off-by: Lin He <helin52@xxxxxxxxxx>
Signed-off-by: Yongbang Shi <shiyongbang@xxxxxxxxxx>
---
ChangeLog:
v1 -> v2:
- The call to `hibmc_set_enable_flag()` has been moved before
`drm_client_setup()`, specifically before the connector detection
triggers the I2C bit operation. (sashiko-bot)
- A read-modify-write operation has been implemented instead of directly
writing to prevent clearing the I2C mask bits. (sashiko-bot)
---
.../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 21 +++++++++++++++++++
.../gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h | 3 +++
2 files changed, 24 insertions(+)

diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
index e5cca7b63b78..53c02f8b8841 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -424,6 +424,24 @@ static int hibmc_load(struct drm_device *dev)
return ret;
}

+static inline void hibmc_set_enable_flag(struct hibmc_drm_private *priv)
+{
+ u32 value;
+
+ value = readl(priv->mmio + HIBMC_ENABLE_FLAG);
+ value |= HIBMC_ENABLE_STATE;
+ writel(value, priv->mmio + HIBMC_ENABLE_FLAG);
+}
+
+static inline void hibmc_set_disable_flag(struct hibmc_drm_private *priv)
+{
+ u32 value;
+
+ value = readl(priv->mmio + HIBMC_ENABLE_FLAG);
+ value &= ~HIBMC_ENABLE_STATE;
+ writel(value, priv->mmio + HIBMC_ENABLE_FLAG);
+}
+
static int hibmc_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
@@ -466,6 +484,8 @@ static int hibmc_pci_probe(struct pci_dev *pdev,
goto err_unload;
}

+ hibmc_set_enable_flag(priv);
+
drm_client_setup(dev, NULL);

return 0;
@@ -480,6 +500,7 @@ static void hibmc_pci_remove(struct pci_dev *pdev)
{
struct drm_device *dev = pci_get_drvdata(pdev);

+ hibmc_set_disable_flag(to_hibmc_drm_private(dev));
drm_dev_unregister(dev);
hibmc_unload(dev);
}
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h
index 17b30c393b10..b95add5b253c 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h
@@ -200,5 +200,8 @@

#define HIBMC_CRT_PALETTE 0x80C00

+#define HIBMC_ENABLE_FLAG 0x802A4
+#define HIBMC_ENABLE_STATE BIT(2)
+
#define HIBMC_FIELD(field, value) (field(value) & field##_MASK)
#endif
--
2.43.0