drm/simpledrm: Request memory region in driver
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 25 Jan 2022 09:12:20 +0000 (10:12 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 27 Jan 2022 08:21:14 +0000 (09:21 +0100)
Requesting the framebuffer memory in simpledrm marks the memory
range as busy. This used to be done by the firmware sysfb code,
but the driver is the correct place.

v2:
* use I/O memory if request_mem_region() fails (Jocelyn)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220125091222.21457-4-tzimmermann@suse.de
drivers/gpu/drm/tiny/simpledrm.c

index b977f5c..0b7a8be 100644 (file)
@@ -526,21 +526,33 @@ static int simpledrm_device_init_mm(struct simpledrm_device *sdev)
 {
        struct drm_device *dev = &sdev->dev;
        struct platform_device *pdev = sdev->pdev;
-       struct resource *mem;
+       struct resource *res, *mem;
        void __iomem *screen_base;
        int ret;
 
-       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!mem)
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
                return -EINVAL;
 
-       ret = devm_aperture_acquire_from_firmware(dev, mem->start, resource_size(mem));
+       ret = devm_aperture_acquire_from_firmware(dev, res->start, resource_size(res));
        if (ret) {
                drm_err(dev, "could not acquire memory range %pr: error %d\n",
-                       mem, ret);
+                       res, ret);
                return ret;
        }
 
+       mem = devm_request_mem_region(&pdev->dev, res->start, resource_size(res),
+                                     sdev->dev.driver->name);
+       if (!mem) {
+               /*
+                * We cannot make this fatal. Sometimes this comes from magic
+                * spaces our resource handlers simply don't know about. Use
+                * the I/O-memory resource as-is and try to map that instead.
+                */
+               drm_warn(dev, "could not acquire memory region %pr\n", res);
+               mem = res;
+       }
+
        screen_base = devm_ioremap_wc(&pdev->dev, mem->start,
                                      resource_size(mem));
        if (!screen_base)