]> git.proxmox.com Git - pve-kernel.git/blobdiff - patches/kernel/0012-fbdev-simplefb-Request-memory-region-in-driver.patch
rebase patches on top of Ubuntu-5.15.0-29.30
[pve-kernel.git] / patches / kernel / 0012-fbdev-simplefb-Request-memory-region-in-driver.patch
diff --git a/patches/kernel/0012-fbdev-simplefb-Request-memory-region-in-driver.patch b/patches/kernel/0012-fbdev-simplefb-Request-memory-region-in-driver.patch
new file mode 100644 (file)
index 0000000..dde776e
--- /dev/null
@@ -0,0 +1,144 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Thomas Zimmermann <tzimmermann@suse.de>
+Date: Tue, 25 Jan 2022 10:12:21 +0100
+Subject: [PATCH] fbdev/simplefb: 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:
+       * store memory region in struct for later cleanup (Javier)
+
+Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
+Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ drivers/video/fbdev/simplefb.c | 65 +++++++++++++++++++++++-----------
+ 1 file changed, 45 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
+index b63074fd892e..6885ac0203de 100644
+--- a/drivers/video/fbdev/simplefb.c
++++ b/drivers/video/fbdev/simplefb.c
+@@ -66,16 +66,36 @@ static int simplefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+       return 0;
+ }
+-struct simplefb_par;
++struct simplefb_par {
++      u32 palette[PSEUDO_PALETTE_SIZE];
++      struct resource *mem;
++#if defined CONFIG_OF && defined CONFIG_COMMON_CLK
++      bool clks_enabled;
++      unsigned int clk_count;
++      struct clk **clks;
++#endif
++#if defined CONFIG_OF && defined CONFIG_REGULATOR
++      bool regulators_enabled;
++      u32 regulator_count;
++      struct regulator **regulators;
++#endif
++};
++
+ static void simplefb_clocks_destroy(struct simplefb_par *par);
+ static void simplefb_regulators_destroy(struct simplefb_par *par);
+ static void simplefb_destroy(struct fb_info *info)
+ {
++      struct simplefb_par *par = info->par;
++      struct resource *mem = par->mem;
++
+       simplefb_regulators_destroy(info->par);
+       simplefb_clocks_destroy(info->par);
+       if (info->screen_base)
+               iounmap(info->screen_base);
++
++      if (mem)
++              release_mem_region(mem->start, resource_size(mem));
+ }
+ static const struct fb_ops simplefb_ops = {
+@@ -169,20 +189,6 @@ static int simplefb_parse_pd(struct platform_device *pdev,
+       return 0;
+ }
+-struct simplefb_par {
+-      u32 palette[PSEUDO_PALETTE_SIZE];
+-#if defined CONFIG_OF && defined CONFIG_COMMON_CLK
+-      bool clks_enabled;
+-      unsigned int clk_count;
+-      struct clk **clks;
+-#endif
+-#if defined CONFIG_OF && defined CONFIG_REGULATOR
+-      bool regulators_enabled;
+-      u32 regulator_count;
+-      struct regulator **regulators;
+-#endif
+-};
+-
+ #if defined CONFIG_OF && defined CONFIG_COMMON_CLK
+ /*
+  * Clock handling code.
+@@ -405,7 +411,7 @@ static int simplefb_probe(struct platform_device *pdev)
+       struct simplefb_params params;
+       struct fb_info *info;
+       struct simplefb_par *par;
+-      struct resource *mem;
++      struct resource *res, *mem;
+       /*
+        * Generic drivers must not be registered if a framebuffer exists.
+@@ -430,15 +436,28 @@ static int simplefb_probe(struct platform_device *pdev)
+       if (ret)
+               return ret;
+-      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+-      if (!mem) {
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!res) {
+               dev_err(&pdev->dev, "No memory resource\n");
+               return -EINVAL;
+       }
++      mem = request_mem_region(res->start, resource_size(res), "simplefb");
++      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.
++               */
++              dev_warn(&pdev->dev, "simplefb: cannot reserve video memory at %pR\n", res);
++              mem = res;
++      }
++
+       info = framebuffer_alloc(sizeof(struct simplefb_par), &pdev->dev);
+-      if (!info)
+-              return -ENOMEM;
++      if (!info) {
++              ret = -ENOMEM;
++              goto error_release_mem_region;
++      }
+       platform_set_drvdata(pdev, info);
+       par = info->par;
+@@ -495,6 +514,9 @@ static int simplefb_probe(struct platform_device *pdev)
+                            info->var.xres, info->var.yres,
+                            info->var.bits_per_pixel, info->fix.line_length);
++      if (mem != res)
++              par->mem = mem; /* release in clean-up handler */
++
+       ret = register_framebuffer(info);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "Unable to register simplefb: %d\n", ret);
+@@ -513,6 +535,9 @@ static int simplefb_probe(struct platform_device *pdev)
+       iounmap(info->screen_base);
+ error_fb_release:
+       framebuffer_release(info);
++error_release_mem_region:
++      if (mem != res)
++              release_mem_region(mem->start, resource_size(mem));
+       return ret;
+ }