drivers/gpu/drm/openchrome/openchrome_drv.h |    2 
 drivers/gpu/drm/openchrome/openchrome_fb.c  |  116 +++++++++++++++-------------
 2 files changed, 66 insertions(+), 52 deletions(-)

New commits:
commit 455bc1584794c6ca3aa2f363f38008821838c5a5
Author: Kevin Brace <kevinbr...@gmx.com>
Date:   Mon Sep 14 15:02:41 2020 -0700

    drm/openchrome: Version bumped to 3.3.6
    
    Signed-off-by: Kevin Brace <kevinbr...@gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_drv.h 
b/drivers/gpu/drm/openchrome/openchrome_drv.h
index 6e43547127df..641166eed88b 100644
--- a/drivers/gpu/drm/openchrome/openchrome_drv.h
+++ b/drivers/gpu/drm/openchrome/openchrome_drv.h
@@ -61,7 +61,7 @@
 
 #define DRIVER_MAJOR           3
 #define DRIVER_MINOR           3
-#define DRIVER_PATCHLEVEL      5
+#define DRIVER_PATCHLEVEL      6
 #define DRIVER_NAME            "openchrome"
 #define DRIVER_DESC            "OpenChrome DRM for VIA Technologies Chrome IGP"
 #define DRIVER_DATE            "20200914"
commit 28b7dd7ad2527fb8cad5bf666146f11f644d51ce
Author: Kevin Brace <kevinbr...@gmx.com>
Date:   Mon Sep 14 15:02:04 2020 -0700

    drm/openchrome: Add openchrome_framebuffer_init()
    
    Move frame buffer initialization code into
    openchrome_framebuffer_init().
    
    Signed-off-by: Kevin Brace <kevinbr...@gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_fb.c 
b/drivers/gpu/drm/openchrome/openchrome_fb.c
index 223ff643d1e9..cc6e3a918a32 100644
--- a/drivers/gpu/drm/openchrome/openchrome_fb.c
+++ b/drivers/gpu/drm/openchrome/openchrome_fb.c
@@ -39,15 +39,48 @@ openchrome_drm_framebuffer_funcs = {
        .destroy        = drm_gem_fb_destroy,
 };
 
+static int openchrome_framebuffer_init(
+                       struct drm_device *dev,
+                       struct drm_gem_object *gem,
+                       const struct drm_mode_fb_cmd2 *mode_cmd,
+                       struct drm_framebuffer **pfb)
+{
+       struct drm_framebuffer *fb;
+       int ret = 0;
+
+       DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
+       fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
+       if (!fb) {
+               ret = -ENOMEM;
+               goto exit;
+       }
+
+       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
+       fb->obj[0] = gem;
+       ret = drm_framebuffer_init(dev, fb,
+                               &openchrome_drm_framebuffer_funcs);
+       if (ret) {
+               kfree(fb);
+       }
+exit:
+       *pfb = fb;
+
+       DRM_DEBUG_KMS("Exiting %s.\n", __func__);
+       return ret;
+}
+
 static struct drm_framebuffer *
-via_user_framebuffer_create(struct drm_device *dev,
-                               struct drm_file *file_priv,
-                               const struct drm_mode_fb_cmd2 *mode_cmd)
+openchrome_fb_create(struct drm_device *dev,
+                       struct drm_file *file_priv,
+                       const struct drm_mode_fb_cmd2 *mode_cmd)
 {
        struct drm_framebuffer *fb;
        struct drm_gem_object *gem;
        int ret;
 
+       DRM_DEBUG_KMS("Entered %s.\n", __func__);
+
        gem = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
        if (!gem) {
                DRM_ERROR("No GEM object found for handle 0x%08X\n",
@@ -55,26 +88,19 @@ via_user_framebuffer_create(struct drm_device *dev,
                return ERR_PTR(-ENOENT);
        }
 
-       fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
-       if (!fb) {
-               return ERR_PTR(-ENOMEM);
-       }
-
-       drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
-       fb->obj[0] = gem;
-       ret = drm_framebuffer_init(dev, fb,
-                               &openchrome_drm_framebuffer_funcs);
+       ret = openchrome_framebuffer_init(dev, gem, mode_cmd, &fb);
        if (ret) {
                drm_gem_object_put(gem);
-               kfree(fb);
+               DRM_DEBUG_KMS("Exiting %s.\n", __func__);
                return ERR_PTR(ret);
        }
 
+       DRM_DEBUG_KMS("Exiting %s.\n", __func__);
        return fb;
 }
 
-static const struct drm_mode_config_funcs via_mode_funcs = {
-       .fb_create              = via_user_framebuffer_create,
+static const struct drm_mode_config_funcs openchrome_drm_mode_config_funcs = {
+       .fb_create              = openchrome_fb_create,
        .output_poll_changed    = drm_fb_helper_output_poll_changed
 };
 
@@ -92,7 +118,7 @@ void openchrome_mode_config_init(
        dev->mode_config.max_width = 2044;
        dev->mode_config.max_height = 4096;
 
-       dev->mode_config.funcs = &via_mode_funcs;
+       dev->mode_config.funcs = &openchrome_drm_mode_config_funcs;
 
        dev->mode_config.preferred_depth = 24;
 
@@ -133,6 +159,7 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
        struct via_framebuffer_device *via_fbdev = container_of(helper,
                                struct via_framebuffer_device, helper);
        struct drm_framebuffer *fb;
+       struct drm_gem_object *gem;
        struct fb_info *info = helper->fbdev;
        const struct drm_format_info *format_info;
        struct drm_mode_fb_cmd2 mode_cmd;
@@ -164,18 +191,10 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
                goto exit;
        }
 
-       fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
-       if (!fb) {
-               ret = -ENOMEM;
-               goto free_bo;
-       }
-
-       drm_helper_mode_fill_fb_struct(dev, fb, &mode_cmd);
-       fb->obj[0] = &via_fbdev->bo->gem;
-       ret = drm_framebuffer_init(dev, fb,
-                               &openchrome_drm_framebuffer_funcs);
+       gem = &via_fbdev->bo->gem;
+       ret = openchrome_framebuffer_init(dev, gem, &mode_cmd, &fb);
        if (ret) {
-               goto free_fb;
+               goto free_bo;
        }
 
        info = drm_fb_helper_alloc_fbi(helper);
@@ -203,7 +222,12 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
        goto exit;
 cleanup_fb:
        drm_framebuffer_cleanup(fb);
-free_fb:
+
+       /*
+        * openchrome_framebuffer_init() allocates a drm_framebuffer
+        * struct (in this case, fb pointer), so it needs to be
+        * released if there was an error.
+        */
        kfree(fb);
 free_bo:
        openchrome_bo_destroy(via_fbdev->bo, true);
commit 5081a0a32b3f5fb9acbe96911cfa1260303674d5
Author: Kevin Brace <kevinbr...@gmx.com>
Date:   Mon Sep 14 15:01:49 2020 -0700

    drm/openchrome: Rely on drm_fb_helper_alloc_fbi() for FB initialization
    
    drm_fb_helper_alloc_fbi() framebuffer helper handles initialization of
    certain fields, so rely on that rather than doing it in
    openchrome_fb_probe().
    
    Signed-off-by: Kevin Brace <kevinbr...@gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_fb.c 
b/drivers/gpu/drm/openchrome/openchrome_fb.c
index c575899379fb..223ff643d1e9 100644
--- a/drivers/gpu/drm/openchrome/openchrome_fb.c
+++ b/drivers/gpu/drm/openchrome/openchrome_fb.c
@@ -136,7 +136,6 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
        struct fb_info *info = helper->fbdev;
        const struct drm_format_info *format_info;
        struct drm_mode_fb_cmd2 mode_cmd;
-       struct apertures_struct *ap;
        int size, cpp;
        int ret = 0;
 
@@ -171,14 +170,6 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
                goto free_bo;
        }
 
-       info = drm_fb_helper_alloc_fbi(helper);
-       if (IS_ERR(info)) {
-               ret = PTR_ERR(info);
-               goto free_fb;
-       }
-
-       info->skip_vt_switch = true;
-
        drm_helper_mode_fill_fb_struct(dev, fb, &mode_cmd);
        fb->obj[0] = &via_fbdev->bo->gem;
        ret = drm_framebuffer_init(dev, fb,
@@ -187,6 +178,12 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
                goto free_fb;
        }
 
+       info = drm_fb_helper_alloc_fbi(helper);
+       if (IS_ERR(info)) {
+               ret = PTR_ERR(info);
+               goto cleanup_fb;
+       }
+
        via_fbdev->helper.fb = fb;
        via_fbdev->helper.fbdev = info;
 
@@ -198,16 +195,9 @@ openchrome_fb_probe(struct drm_fb_helper *helper,
        info->screen_base = via_fbdev->bo->kmap.virtual;
        info->screen_size = size;
 
-       /* Setup aperture base / size for takeover (i.e., vesafb). */
-       ap = alloc_apertures(1);
-       if (!ap) {
-               goto cleanup_fb;
-       }
-
-       ap->ranges[0].size = via_fbdev->bo->kmap.bo->bdev->
+       info->apertures->ranges[0].size = via_fbdev->bo->kmap.bo->bdev->
                        man[via_fbdev->bo->kmap.bo->mem.mem_type].size;
-       ap->ranges[0].base = via_fbdev->bo->kmap.bo->mem.bus.base;
-       info->apertures = ap;
+       info->apertures->ranges[0].base = via_fbdev->bo->kmap.bo->mem.bus.base;
 
        drm_fb_helper_fill_info(info, helper, sizes);
        goto exit;
commit dfb06497f0a25d3715a306e47e614930c087ba56
Author: Kevin Brace <kevinbr...@gmx.com>
Date:   Mon Sep 14 15:01:31 2020 -0700

    drm/openchrome: Fix and improve error handling of openchrome_fb_probe()
    
    via_fb_probe() was renamed to openchrome_fb_probe().
    
    Signed-off-by: Kevin Brace <kevinbr...@gmx.com>

diff --git a/drivers/gpu/drm/openchrome/openchrome_fb.c 
b/drivers/gpu/drm/openchrome/openchrome_fb.c
index 13a3945f8841..c575899379fb 100644
--- a/drivers/gpu/drm/openchrome/openchrome_fb.c
+++ b/drivers/gpu/drm/openchrome/openchrome_fb.c
@@ -124,7 +124,7 @@ static struct fb_ops via_fb_ops = {
 };
 
 static int
-via_fb_probe(struct drm_fb_helper *helper,
+openchrome_fb_probe(struct drm_fb_helper *helper,
                struct drm_fb_helper_surface_size *sizes)
 {
        struct drm_device *dev = helper->dev;
@@ -167,13 +167,14 @@ via_fb_probe(struct drm_fb_helper *helper,
 
        fb = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
        if (!fb) {
-               return ret;
+               ret = -ENOMEM;
+               goto free_bo;
        }
 
        info = drm_fb_helper_alloc_fbi(helper);
        if (IS_ERR(info)) {
                ret = PTR_ERR(info);
-               goto out_err;
+               goto free_fb;
        }
 
        info->skip_vt_switch = true;
@@ -182,8 +183,8 @@ via_fb_probe(struct drm_fb_helper *helper,
        fb->obj[0] = &via_fbdev->bo->gem;
        ret = drm_framebuffer_init(dev, fb,
                                &openchrome_drm_framebuffer_funcs);
-       if (unlikely(ret)) {
-               goto out_err;
+       if (ret) {
+               goto free_fb;
        }
 
        via_fbdev->helper.fb = fb;
@@ -200,8 +201,7 @@ via_fb_probe(struct drm_fb_helper *helper,
        /* Setup aperture base / size for takeover (i.e., vesafb). */
        ap = alloc_apertures(1);
        if (!ap) {
-               drm_framebuffer_cleanup(fb);
-               goto out_err;
+               goto cleanup_fb;
        }
 
        ap->ranges[0].size = via_fbdev->bo->kmap.bo->bdev->
@@ -211,20 +211,20 @@ via_fb_probe(struct drm_fb_helper *helper,
 
        drm_fb_helper_fill_info(info, helper, sizes);
        goto exit;
-out_err:
-       if (via_fbdev->bo) {
-               openchrome_bo_destroy(via_fbdev->bo, true);
-               via_fbdev->bo = NULL;
-       }
-
+cleanup_fb:
+       drm_framebuffer_cleanup(fb);
+free_fb:
        kfree(fb);
+free_bo:
+       openchrome_bo_destroy(via_fbdev->bo, true);
+       via_fbdev->bo = NULL;
 exit:
        DRM_DEBUG_KMS("Exiting %s.\n", __func__);
        return ret;
 }
 
-static struct drm_fb_helper_funcs via_drm_fb_helper_funcs = {
-       .fb_probe = via_fb_probe,
+static struct drm_fb_helper_funcs openchrome_drm_fb_helper_funcs = {
+       .fb_probe = openchrome_fb_probe,
 };
 
 int via_fbdev_init(struct drm_device *dev)
@@ -246,7 +246,7 @@ int via_fbdev_init(struct drm_device *dev)
        dev_private->via_fbdev = via_fbdev;
 
        drm_fb_helper_prepare(dev, &via_fbdev->helper,
-                               &via_drm_fb_helper_funcs);
+                               &openchrome_drm_fb_helper_funcs);
 
        ret = drm_fb_helper_init(dev, &via_fbdev->helper);
        if (ret) {
_______________________________________________
openchrome-devel mailing list
openchrome-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/openchrome-devel

Reply via email to