64 lines
2.2 KiB
Diff
64 lines
2.2 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Thomas Zimmermann <tzimmermann@suse.de>
|
||
|
Date: Tue, 25 Jan 2022 10:12:20 +0100
|
||
|
Subject: [PATCH] drm/simpledrm: Request memory region in driver
|
||
|
|
||
|
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>
|
||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||
|
---
|
||
|
drivers/gpu/drm/tiny/simpledrm.c | 22 +++++++++++++++++-----
|
||
|
1 file changed, 17 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/tiny/simpledrm.c b/drivers/gpu/drm/tiny/simpledrm.c
|
||
|
index 5a6e89825bc2..6da507960af6 100644
|
||
|
--- a/drivers/gpu/drm/tiny/simpledrm.c
|
||
|
+++ b/drivers/gpu/drm/tiny/simpledrm.c
|
||
|
@@ -525,21 +525,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)
|