From 90820fd617e1b0818ce231860e66a17e0739b57c Mon Sep 17 00:00:00 2001 From: "kong.kongxinwei" Date: Thu, 21 Feb 2019 16:44:47 +0800 Subject: [PATCH] drm: hibmc: fix vga UNF ras error for rebooting system When rebooting this system, this vga will report unf bit error as follow: [ OK ] Reached target Unmount All Filesystems. [ OK ] Stopped Remount Root and Kernel File Systems. [ OK ] Reached target Shutdown. [ OK ] Reached target Final Step. Starting Reboot... [ OK ] Stopped LVM2 metadata daemon. NOTICE: #################################### NOTICE: [PciRasInterruptHandle]:[385L] PcieRasTestInterruptHandler NOTICE: #################################### NOTICE: [PciRasInterruptHandle]:[398L] CPU0 PCIe RAS Check... NOTICE: [PciRasInterruptHandle]:[409L] Chip: 0x0, PCIe_CE_status = 0x0 NOTICE: [PciRasInterruptHandle]:[410L] Chip: 0x0, PCIe_UNF_status = 0x10000 NOTICE: [PciRasInterruptHandle]:[411L] Chip: 0x0, PCIe_UF_status = 0x0 NOTICE: [PciRasInterruptHandle]:[426L] RP Error Source Identify = 0x800000 NOTICE: [PciRasInterruptHandle]:[438L] ErrSrc Identify = (Bus:0x0) (Dev:0x10) (Func: 0x0) NOTICE: [PciRasInterruptHandle]:[457L] DevSts = 0xa NOTICE: [PciRasInterruptHandle]:[458L] UncErrSts = 0x100000 NOTICE: [PciRasInterruptHandle]:[459L] CorErrSts = 0x0 NOTICE: [PciRasInterruptHandle]:[460L] RootErrSts = 0x8000024 NOTICE: #################################### NOTICE: Before Notify OS, Dump AER Error data. Feature or Bugfix:Bugfix Signed-off-by: allan.wang Signed-off-by: Xinwei Kong Signed-off-by: kong.kongxinwei Reviewed-by: liudongdong Signed-off-by: Yang Yingliang --- .../gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c index d4f6f1f9df5b..ac97166ff696 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c @@ -70,7 +70,7 @@ static struct drm_driver hibmc_driver = { .irq_handler = hibmc_drm_interrupt, }; -static int __maybe_unused hibmc_pm_suspend(struct device *dev) +static int hibmc_pm_suspend(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); struct drm_device *drm_dev = pci_get_drvdata(pdev); @@ -88,7 +88,7 @@ static int __maybe_unused hibmc_pm_suspend(struct device *dev) return 0; } -static int __maybe_unused hibmc_pm_resume(struct device *dev) +static int hibmc_pm_resume(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); struct drm_device *drm_dev = pci_get_drvdata(pdev); @@ -115,7 +115,7 @@ static int hibmc_kms_init(struct hibmc_drm_private *priv) priv->dev->mode_config.min_width = 0; priv->dev->mode_config.min_height = 0; priv->dev->mode_config.max_width = 1920; - priv->dev->mode_config.max_height = 1440; + priv->dev->mode_config.max_height = 1200; priv->dev->mode_config.fb_base = priv->fb_base; priv->dev->mode_config.preferred_depth = 24; @@ -138,6 +138,21 @@ static int hibmc_kms_init(struct hibmc_drm_private *priv) return 0; } +static void hibmc_hw_unmap(struct hibmc_drm_private *priv) +{ + struct drm_device *dev = priv->dev; + + if (priv->mmio) { + devm_iounmap(dev->dev, priv->mmio); + priv->mmio = NULL; + } + + if (priv->fb_map) { + devm_iounmap(dev->dev, priv->fb_map); + priv->fb_map = NULL; + } +} + static void hibmc_kms_fini(struct hibmc_drm_private *priv) { if (priv->mode_config_initialized) { @@ -284,6 +299,7 @@ static int hibmc_unload(struct drm_device *dev) hibmc_kms_fini(priv); hibmc_mm_fini(priv); + hibmc_hw_unmap(priv); dev->dev_private = NULL; return 0; } @@ -398,9 +414,15 @@ static void hibmc_pci_remove(struct pci_dev *pdev) drm_dev_unregister(dev); hibmc_unload(dev); + pci_disable_device(pdev); drm_dev_unref(dev); } +static void hibmc_pci_shutdown(struct pci_dev *pdev) +{ + hibmc_pci_remove(pdev); +} + static struct pci_device_id hibmc_pci_table[] = { {0x19e5, 0x1711, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0,} @@ -411,6 +433,7 @@ static struct pci_driver hibmc_pci_driver = { .id_table = hibmc_pci_table, .probe = hibmc_pci_probe, .remove = hibmc_pci_remove, + .shutdown = hibmc_pci_shutdown, .driver.pm = &hibmc_pm_ops, }; -- GitLab