remove the framebuffer initialized by fireware/bootloader,which will use hibmc's pcie resource, and may cause conflict.
Signed-off-by: Tian Tao tiantao6@hisilicon.com Signed-off-by: Gong junjie gongjunjie2@huawei.com --- drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c index 5f612f6..7ebe831 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c @@ -47,6 +47,22 @@ static irqreturn_t hibmc_drm_interrupt(int irq, void *arg) return IRQ_HANDLED; }
+static void hibmc_remove_framebuffers(struct pci_dev *pdev) +{ + struct apertures_struct *ap; + + ap = alloc_apertures(1); + if (!ap) + return; + + ap->ranges[0].base = pci_resource_start(pdev, 0); + ap->ranges[0].size = pci_resource_len(pdev, 0); + + drm_fb_helper_remove_conflicting_framebuffers(ap, "hibmcdrmfb", false); + + kfree(ap); +} + static struct drm_driver hibmc_driver = { .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC, .fops = &hibmc_fops, @@ -327,6 +343,8 @@ static int hibmc_pci_probe(struct pci_dev *pdev, struct drm_device *dev; int ret;
+ hibmc_remove_framebuffers(pdev); + dev = drm_dev_alloc(&hibmc_driver, &pdev->dev); if (IS_ERR(dev)) { DRM_ERROR("failed to allocate drm_device\n");
Hi
Am 19.02.20 um 08:57 schrieb Tian Tao:
remove the framebuffer initialized by fireware/bootloader,which will use hibmc's pcie resource, and may cause conflict.
Signed-off-by: Tian Tao tiantao6@hisilicon.com Signed-off-by: Gong junjie gongjunjie2@huawei.com
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c index 5f612f6..7ebe831 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c @@ -47,6 +47,22 @@ static irqreturn_t hibmc_drm_interrupt(int irq, void *arg) return IRQ_HANDLED; }
+static void hibmc_remove_framebuffers(struct pci_dev *pdev) +{
- struct apertures_struct *ap;
- ap = alloc_apertures(1);
- if (!ap)
return;
- ap->ranges[0].base = pci_resource_start(pdev, 0);
- ap->ranges[0].size = pci_resource_len(pdev, 0);
- drm_fb_helper_remove_conflicting_framebuffers(ap, "hibmcdrmfb", false);
- kfree(ap);
+}
static struct drm_driver hibmc_driver = { .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC, .fops = &hibmc_fops, @@ -327,6 +343,8 @@ static int hibmc_pci_probe(struct pci_dev *pdev, struct drm_device *dev; int ret;
- hibmc_remove_framebuffers(pdev);
Instead of rolling your own, you should try drm_fb_helper_remove_conflicting_pci_framebuffers(). It releases any I/O memory resource of the device.
Best regards Thomas
- dev = drm_dev_alloc(&hibmc_driver, &pdev->dev); if (IS_ERR(dev)) { DRM_ERROR("failed to allocate drm_device\n");
dri-devel@lists.freedesktop.org