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)
 | 
