From: Lin He <[email protected]>

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 <[email protected]>
Signed-off-by: Yongbang Shi <[email protected]>
---
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c  | 13 +++++++++++++
 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_regs.h |  3 +++
 2 files changed, 16 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..6436263a6c03 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
@@ -424,6 +424,16 @@ static int hibmc_load(struct drm_device *dev)
        return ret;
 }
 
+static inline void hibmc_set_enable_flag(struct hibmc_drm_private *priv)
+{
+       writel(HIBMC_ENABLE_STATE, priv->mmio + HIBMC_ENABLE_FLAG);
+}
+
+static inline void hibmc_set_disable_flag(struct hibmc_drm_private *priv)
+{
+       writel(0, priv->mmio + HIBMC_ENABLE_FLAG);
+}
+
 static int hibmc_pci_probe(struct pci_dev *pdev,
                           const struct pci_device_id *ent)
 {
@@ -468,6 +478,8 @@ static int hibmc_pci_probe(struct pci_dev *pdev,
 
        drm_client_setup(dev, NULL);
 
+       hibmc_set_enable_flag(priv);
+
        return 0;
 
 err_unload:
@@ -480,6 +492,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

Reply via email to