[PATCH 2/7] drm/gma500: Move fbdev code into separate source file

Thomas Zimmermann tzimmermann at suse.de
Mon Feb 27 07:40:59 UTC 2023


Hi

Am 27.02.23 um 08:10 schrieb Patrik Jakobsson:
> On Thu, Feb 23, 2023 at 1:17 PM Thomas Zimmermann <tzimmermann at suse.de> wrote:
>>
>> Move the fbdev emulation from framebuffer.c into fbdev.c. Only build
>> the source code if the Kconfig symbol has been selected. Remaining in
>> framebuffer.c is gma500's code for DRM frambuffers. No functional
>> hanges.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> 
> Hi Thomas, this patch doesn't apply to drm-misc. I seem to be missing
> drm_fb_helper_prepare/unprepare().

Could be. I'm on drm-tip for development. And we're in the merge window, 
which is a bad time to sync-ing trees. Let me see if I can easiyl 
backmerge now. Or otherwise things should stabilize after -rc1 has been 
tagged.

Best regards
Thomas

> 
> -Patrik
> 
>> ---
>>   drivers/gpu/drm/gma500/Makefile      |   1 +
>>   drivers/gpu/drm/gma500/fbdev.c       | 325 +++++++++++++++++++++++++++
>>   drivers/gpu/drm/gma500/framebuffer.c | 318 +-------------------------
>>   drivers/gpu/drm/gma500/psb_drv.h     |  17 ++
>>   4 files changed, 346 insertions(+), 315 deletions(-)
>>   create mode 100644 drivers/gpu/drm/gma500/fbdev.c
>>
>> diff --git a/drivers/gpu/drm/gma500/Makefile b/drivers/gpu/drm/gma500/Makefile
>> index 63012bf2485a..4f302cd5e1a6 100644
>> --- a/drivers/gpu/drm/gma500/Makefile
>> +++ b/drivers/gpu/drm/gma500/Makefile
>> @@ -38,5 +38,6 @@ gma500_gfx-y += \
>>            psb_irq.o
>>
>>   gma500_gfx-$(CONFIG_ACPI) +=  opregion.o
>> +gma500_gfx-$(CONFIG_DRM_FBDEV_EMULATION) +=  fbdev.o
>>
>>   obj-$(CONFIG_DRM_GMA500) += gma500_gfx.o
>> diff --git a/drivers/gpu/drm/gma500/fbdev.c b/drivers/gpu/drm/gma500/fbdev.c
>> new file mode 100644
>> index 000000000000..9ce76b11d256
>> --- /dev/null
>> +++ b/drivers/gpu/drm/gma500/fbdev.c
>> @@ -0,0 +1,325 @@
>> +// SPDX-License-Identifier: GPL-2.0-only
>> +/**************************************************************************
>> + * Copyright (c) 2007-2011, Intel Corporation.
>> + * All Rights Reserved.
>> + *
>> + **************************************************************************/
>> +
>> +#include <linux/pfn_t.h>
>> +
>> +#include <drm/drm_crtc_helper.h>
>> +#include <drm/drm_fb_helper.h>
>> +#include <drm/drm_framebuffer.h>
>> +
>> +#include "gem.h"
>> +#include "psb_drv.h"
>> +
>> +/*
>> + * VM area struct
>> + */
>> +
>> +static vm_fault_t psbfb_vm_fault(struct vm_fault *vmf)
>> +{
>> +       struct vm_area_struct *vma = vmf->vma;
>> +       struct drm_framebuffer *fb = vma->vm_private_data;
>> +       struct drm_device *dev = fb->dev;
>> +       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> +       struct psb_gem_object *pobj = to_psb_gem_object(fb->obj[0]);
>> +       int page_num;
>> +       int i;
>> +       unsigned long address;
>> +       vm_fault_t ret = VM_FAULT_SIGBUS;
>> +       unsigned long pfn;
>> +       unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + pobj->offset;
>> +
>> +       page_num = vma_pages(vma);
>> +       address = vmf->address - (vmf->pgoff << PAGE_SHIFT);
>> +
>> +       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
>> +
>> +       for (i = 0; i < page_num; i++) {
>> +               pfn = (phys_addr >> PAGE_SHIFT);
>> +
>> +               ret = vmf_insert_mixed(vma, address, __pfn_to_pfn_t(pfn, PFN_DEV));
>> +               if (unlikely(ret & VM_FAULT_ERROR))
>> +                       break;
>> +               address += PAGE_SIZE;
>> +               phys_addr += PAGE_SIZE;
>> +       }
>> +       return ret;
>> +}
>> +
>> +static void psbfb_vm_open(struct vm_area_struct *vma)
>> +{ }
>> +
>> +static void psbfb_vm_close(struct vm_area_struct *vma)
>> +{ }
>> +
>> +static const struct vm_operations_struct psbfb_vm_ops = {
>> +       .fault  = psbfb_vm_fault,
>> +       .open   = psbfb_vm_open,
>> +       .close  = psbfb_vm_close
>> +};
>> +
>> +/*
>> + * struct fb_ops
>> + */
>> +
>> +#define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
>> +
>> +static int psbfb_setcolreg(unsigned int regno,
>> +                          unsigned int red, unsigned int green,
>> +                          unsigned int blue, unsigned int transp,
>> +                          struct fb_info *info)
>> +{
>> +       struct drm_fb_helper *fb_helper = info->par;
>> +       struct drm_framebuffer *fb = fb_helper->fb;
>> +       uint32_t v;
>> +
>> +       if (!fb)
>> +               return -ENOMEM;
>> +
>> +       if (regno > 255)
>> +               return 1;
>> +
>> +       red = CMAP_TOHW(red, info->var.red.length);
>> +       blue = CMAP_TOHW(blue, info->var.blue.length);
>> +       green = CMAP_TOHW(green, info->var.green.length);
>> +       transp = CMAP_TOHW(transp, info->var.transp.length);
>> +
>> +       v = (red << info->var.red.offset) |
>> +           (green << info->var.green.offset) |
>> +           (blue << info->var.blue.offset) |
>> +           (transp << info->var.transp.offset);
>> +
>> +       if (regno < 16) {
>> +               switch (fb->format->cpp[0] * 8) {
>> +               case 16:
>> +                       ((uint32_t *) info->pseudo_palette)[regno] = v;
>> +                       break;
>> +               case 24:
>> +               case 32:
>> +                       ((uint32_t *) info->pseudo_palette)[regno] = v;
>> +                       break;
>> +               }
>> +       }
>> +
>> +       return 0;
>> +}
>> +
>> +static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
>> +{
>> +       struct drm_fb_helper *fb_helper = info->par;
>> +       struct drm_framebuffer *fb = fb_helper->fb;
>> +
>> +       if (vma->vm_pgoff != 0)
>> +               return -EINVAL;
>> +       if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
>> +               return -EINVAL;
>> +
>> +       /*
>> +        * If this is a GEM object then info->screen_base is the virtual
>> +        * kernel remapping of the object. FIXME: Review if this is
>> +        * suitable for our mmap work
>> +        */
>> +       vma->vm_ops = &psbfb_vm_ops;
>> +       vma->vm_private_data = (void *)fb;
>> +       vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP;
>> +
>> +       return 0;
>> +}
>> +
>> +static const struct fb_ops psbfb_unaccel_ops = {
>> +       .owner = THIS_MODULE,
>> +       DRM_FB_HELPER_DEFAULT_OPS,
>> +       .fb_setcolreg = psbfb_setcolreg,
>> +       .fb_read = drm_fb_helper_cfb_read,
>> +       .fb_write = drm_fb_helper_cfb_write,
>> +       .fb_fillrect = drm_fb_helper_cfb_fillrect,
>> +       .fb_copyarea = drm_fb_helper_cfb_copyarea,
>> +       .fb_imageblit = drm_fb_helper_cfb_imageblit,
>> +       .fb_mmap = psbfb_mmap,
>> +};
>> +
>> +/*
>> + * struct drm_fb_helper_funcs
>> + */
>> +
>> +static int psbfb_create(struct drm_fb_helper *fb_helper,
>> +                       struct drm_fb_helper_surface_size *sizes)
>> +{
>> +       struct drm_device *dev = fb_helper->dev;
>> +       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> +       struct pci_dev *pdev = to_pci_dev(dev->dev);
>> +       struct fb_info *info;
>> +       struct drm_framebuffer *fb;
>> +       struct drm_mode_fb_cmd2 mode_cmd;
>> +       int size;
>> +       int ret;
>> +       struct psb_gem_object *backing;
>> +       struct drm_gem_object *obj;
>> +       u32 bpp, depth;
>> +
>> +       mode_cmd.width = sizes->surface_width;
>> +       mode_cmd.height = sizes->surface_height;
>> +       bpp = sizes->surface_bpp;
>> +       depth = sizes->surface_depth;
>> +
>> +       /* No 24bit packed */
>> +       if (bpp == 24)
>> +               bpp = 32;
>> +
>> +       mode_cmd.pitches[0] = ALIGN(mode_cmd.width * DIV_ROUND_UP(bpp, 8), 64);
>> +
>> +       size = mode_cmd.pitches[0] * mode_cmd.height;
>> +       size = ALIGN(size, PAGE_SIZE);
>> +
>> +       /* Allocate the framebuffer in the GTT with stolen page backing */
>> +       backing = psb_gem_create(dev, size, "fb", true, PAGE_SIZE);
>> +       if (IS_ERR(backing))
>> +               return PTR_ERR(backing);
>> +       obj = &backing->base;
>> +
>> +       memset(dev_priv->vram_addr + backing->offset, 0, size);
>> +
>> +       info = drm_fb_helper_alloc_info(fb_helper);
>> +       if (IS_ERR(info)) {
>> +               ret = PTR_ERR(info);
>> +               goto err_drm_gem_object_put;
>> +       }
>> +
>> +       mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
>> +
>> +       fb = psb_framebuffer_create(dev, &mode_cmd, obj);
>> +       if (IS_ERR(fb)) {
>> +               ret = PTR_ERR(fb);
>> +               goto err_drm_gem_object_put;
>> +       }
>> +
>> +       fb_helper->fb = fb;
>> +
>> +       info->fbops = &psbfb_unaccel_ops;
>> +
>> +       info->fix.smem_start = dev_priv->fb_base;
>> +       info->fix.smem_len = size;
>> +       info->fix.ywrapstep = 0;
>> +       info->fix.ypanstep = 0;
>> +
>> +       /* Accessed stolen memory directly */
>> +       info->screen_base = dev_priv->vram_addr + backing->offset;
>> +       info->screen_size = size;
>> +
>> +       drm_fb_helper_fill_info(info, fb_helper, sizes);
>> +
>> +       info->fix.mmio_start = pci_resource_start(pdev, 0);
>> +       info->fix.mmio_len = pci_resource_len(pdev, 0);
>> +
>> +       /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
>> +
>> +       dev_dbg(dev->dev, "allocated %dx%d fb\n", fb->width, fb->height);
>> +
>> +       return 0;
>> +
>> +err_drm_gem_object_put:
>> +       drm_gem_object_put(obj);
>> +       return ret;
>> +}
>> +
>> +static int psbfb_probe(struct drm_fb_helper *fb_helper,
>> +                               struct drm_fb_helper_surface_size *sizes)
>> +{
>> +       struct drm_device *dev = fb_helper->dev;
>> +       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> +       unsigned int fb_size;
>> +       int bytespp;
>> +
>> +       bytespp = sizes->surface_bpp / 8;
>> +       if (bytespp == 3)       /* no 24bit packed */
>> +               bytespp = 4;
>> +
>> +       /*
>> +        * If the mode will not fit in 32bit then switch to 16bit to get
>> +        * a console on full resolution. The X mode setting server will
>> +        * allocate its own 32bit GEM framebuffer
>> +        */
>> +       fb_size = ALIGN(sizes->surface_width * bytespp, 64) *
>> +                 sizes->surface_height;
>> +       fb_size = ALIGN(fb_size, PAGE_SIZE);
>> +
>> +       if (fb_size > dev_priv->vram_stolen_size) {
>> +               sizes->surface_bpp = 16;
>> +               sizes->surface_depth = 16;
>> +       }
>> +
>> +       return psbfb_create(fb_helper, sizes);
>> +}
>> +
>> +static const struct drm_fb_helper_funcs psb_fb_helper_funcs = {
>> +       .fb_probe = psbfb_probe,
>> +};
>> +
>> +static int psb_fbdev_destroy(struct drm_device *dev,
>> +                            struct drm_fb_helper *fb_helper)
>> +{
>> +       struct drm_framebuffer *fb = fb_helper->fb;
>> +
>> +       drm_fb_helper_unregister_info(fb_helper);
>> +
>> +       drm_fb_helper_fini(fb_helper);
>> +       drm_framebuffer_unregister_private(fb);
>> +       drm_framebuffer_cleanup(fb);
>> +
>> +       if (fb->obj[0])
>> +               drm_gem_object_put(fb->obj[0]);
>> +       kfree(fb);
>> +
>> +       return 0;
>> +}
>> +
>> +int psb_fbdev_init(struct drm_device *dev)
>> +{
>> +       struct drm_fb_helper *fb_helper;
>> +       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> +       int ret;
>> +
>> +       fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
>> +       if (!fb_helper)
>> +               return -ENOMEM;
>> +
>> +       dev_priv->fb_helper = fb_helper;
>> +
>> +       drm_fb_helper_prepare(dev, fb_helper, 32, &psb_fb_helper_funcs);
>> +
>> +       ret = drm_fb_helper_init(dev, fb_helper);
>> +       if (ret)
>> +               goto free;
>> +
>> +       /* disable all the possible outputs/crtcs before entering KMS mode */
>> +       drm_helper_disable_unused_functions(dev);
>> +
>> +       ret = drm_fb_helper_initial_config(fb_helper);
>> +       if (ret)
>> +               goto fini;
>> +
>> +       return 0;
>> +
>> +fini:
>> +       drm_fb_helper_fini(fb_helper);
>> +free:
>> +       drm_fb_helper_unprepare(fb_helper);
>> +       kfree(fb_helper);
>> +       return ret;
>> +}
>> +
>> +void psb_fbdev_fini(struct drm_device *dev)
>> +{
>> +       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> +
>> +       if (!dev_priv->fb_helper)
>> +               return;
>> +
>> +       psb_fbdev_destroy(dev, dev_priv->fb_helper);
>> +       drm_fb_helper_unprepare(dev_priv->fb_helper);
>> +       kfree(dev_priv->fb_helper);
>> +       dev_priv->fb_helper = NULL;
>> +}
>> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
>> index df4dbc509f68..506b881a7b24 100644
>> --- a/drivers/gpu/drm/gma500/framebuffer.c
>> +++ b/drivers/gpu/drm/gma500/framebuffer.c
>> @@ -5,16 +5,12 @@
>>    *
>>    **************************************************************************/
>>
>> -#include <linux/pfn_t.h>
>> -
>> -#include <drm/drm_crtc_helper.h>
>>   #include <drm/drm_fb_helper.h>
>>   #include <drm/drm_framebuffer.h>
>>   #include <drm/drm_gem_framebuffer_helper.h>
>>   #include <drm/drm_modeset_helper.h>
>>
>>   #include "framebuffer.h"
>> -#include "gem.h"
>>   #include "psb_drv.h"
>>
>>   static const struct drm_framebuffer_funcs psb_fb_funcs = {
>> @@ -22,126 +18,6 @@ static const struct drm_framebuffer_funcs psb_fb_funcs = {
>>          .create_handle = drm_gem_fb_create_handle,
>>   };
>>
>> -#define CMAP_TOHW(_val, _width) ((((_val) << (_width)) + 0x7FFF - (_val)) >> 16)
>> -
>> -static int psbfb_setcolreg(unsigned regno, unsigned red, unsigned green,
>> -                          unsigned blue, unsigned transp,
>> -                          struct fb_info *info)
>> -{
>> -       struct drm_fb_helper *fb_helper = info->par;
>> -       struct drm_framebuffer *fb = fb_helper->fb;
>> -       uint32_t v;
>> -
>> -       if (!fb)
>> -               return -ENOMEM;
>> -
>> -       if (regno > 255)
>> -               return 1;
>> -
>> -       red = CMAP_TOHW(red, info->var.red.length);
>> -       blue = CMAP_TOHW(blue, info->var.blue.length);
>> -       green = CMAP_TOHW(green, info->var.green.length);
>> -       transp = CMAP_TOHW(transp, info->var.transp.length);
>> -
>> -       v = (red << info->var.red.offset) |
>> -           (green << info->var.green.offset) |
>> -           (blue << info->var.blue.offset) |
>> -           (transp << info->var.transp.offset);
>> -
>> -       if (regno < 16) {
>> -               switch (fb->format->cpp[0] * 8) {
>> -               case 16:
>> -                       ((uint32_t *) info->pseudo_palette)[regno] = v;
>> -                       break;
>> -               case 24:
>> -               case 32:
>> -                       ((uint32_t *) info->pseudo_palette)[regno] = v;
>> -                       break;
>> -               }
>> -       }
>> -
>> -       return 0;
>> -}
>> -
>> -static vm_fault_t psbfb_vm_fault(struct vm_fault *vmf)
>> -{
>> -       struct vm_area_struct *vma = vmf->vma;
>> -       struct drm_framebuffer *fb = vma->vm_private_data;
>> -       struct drm_device *dev = fb->dev;
>> -       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> -       struct psb_gem_object *pobj = to_psb_gem_object(fb->obj[0]);
>> -       int page_num;
>> -       int i;
>> -       unsigned long address;
>> -       vm_fault_t ret = VM_FAULT_SIGBUS;
>> -       unsigned long pfn;
>> -       unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + pobj->offset;
>> -
>> -       page_num = vma_pages(vma);
>> -       address = vmf->address - (vmf->pgoff << PAGE_SHIFT);
>> -
>> -       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
>> -
>> -       for (i = 0; i < page_num; i++) {
>> -               pfn = (phys_addr >> PAGE_SHIFT);
>> -
>> -               ret = vmf_insert_mixed(vma, address,
>> -                               __pfn_to_pfn_t(pfn, PFN_DEV));
>> -               if (unlikely(ret & VM_FAULT_ERROR))
>> -                       break;
>> -               address += PAGE_SIZE;
>> -               phys_addr += PAGE_SIZE;
>> -       }
>> -       return ret;
>> -}
>> -
>> -static void psbfb_vm_open(struct vm_area_struct *vma)
>> -{
>> -}
>> -
>> -static void psbfb_vm_close(struct vm_area_struct *vma)
>> -{
>> -}
>> -
>> -static const struct vm_operations_struct psbfb_vm_ops = {
>> -       .fault  = psbfb_vm_fault,
>> -       .open   = psbfb_vm_open,
>> -       .close  = psbfb_vm_close
>> -};
>> -
>> -static int psbfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
>> -{
>> -       struct drm_fb_helper *fb_helper = info->par;
>> -       struct drm_framebuffer *fb = fb_helper->fb;
>> -
>> -       if (vma->vm_pgoff != 0)
>> -               return -EINVAL;
>> -       if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT))
>> -               return -EINVAL;
>> -
>> -       /*
>> -        * If this is a GEM object then info->screen_base is the virtual
>> -        * kernel remapping of the object. FIXME: Review if this is
>> -        * suitable for our mmap work
>> -        */
>> -       vma->vm_ops = &psbfb_vm_ops;
>> -       vma->vm_private_data = (void *)fb;
>> -       vma->vm_flags |= VM_IO | VM_MIXEDMAP | VM_DONTEXPAND | VM_DONTDUMP;
>> -       return 0;
>> -}
>> -
>> -static const struct fb_ops psbfb_unaccel_ops = {
>> -       .owner = THIS_MODULE,
>> -       DRM_FB_HELPER_DEFAULT_OPS,
>> -       .fb_setcolreg = psbfb_setcolreg,
>> -       .fb_read = drm_fb_helper_cfb_read,
>> -       .fb_write = drm_fb_helper_cfb_write,
>> -       .fb_fillrect = drm_fb_helper_cfb_fillrect,
>> -       .fb_copyarea = drm_fb_helper_cfb_copyarea,
>> -       .fb_imageblit = drm_fb_helper_cfb_imageblit,
>> -       .fb_mmap = psbfb_mmap,
>> -};
>> -
>>   /**
>>    *     psb_framebuffer_init    -       initialize a framebuffer
>>    *     @dev: our DRM device
>> @@ -192,11 +68,9 @@ static int psb_framebuffer_init(struct drm_device *dev,
>>    *
>>    *     TODO: review object references
>>    */
>> -
>> -static struct drm_framebuffer *psb_framebuffer_create
>> -                       (struct drm_device *dev,
>> -                        const struct drm_mode_fb_cmd2 *mode_cmd,
>> -                        struct drm_gem_object *obj)
>> +struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
>> +                                              const struct drm_mode_fb_cmd2 *mode_cmd,
>> +                                              struct drm_gem_object *obj)
>>   {
>>          struct drm_framebuffer *fb;
>>          int ret;
>> @@ -213,93 +87,6 @@ static struct drm_framebuffer *psb_framebuffer_create
>>          return fb;
>>   }
>>
>> -/**
>> - *     psbfb_create            -       create a framebuffer
>> - *     @fb_helper: the framebuffer helper
>> - *     @sizes: specification of the layout
>> - *
>> - *     Create a framebuffer to the specifications provided
>> - */
>> -static int psbfb_create(struct drm_fb_helper *fb_helper,
>> -                               struct drm_fb_helper_surface_size *sizes)
>> -{
>> -       struct drm_device *dev = fb_helper->dev;
>> -       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> -       struct pci_dev *pdev = to_pci_dev(dev->dev);
>> -       struct fb_info *info;
>> -       struct drm_framebuffer *fb;
>> -       struct drm_mode_fb_cmd2 mode_cmd;
>> -       int size;
>> -       int ret;
>> -       struct psb_gem_object *backing;
>> -       struct drm_gem_object *obj;
>> -       u32 bpp, depth;
>> -
>> -       mode_cmd.width = sizes->surface_width;
>> -       mode_cmd.height = sizes->surface_height;
>> -       bpp = sizes->surface_bpp;
>> -       depth = sizes->surface_depth;
>> -
>> -       /* No 24bit packed */
>> -       if (bpp == 24)
>> -               bpp = 32;
>> -
>> -       mode_cmd.pitches[0] = ALIGN(mode_cmd.width * DIV_ROUND_UP(bpp, 8), 64);
>> -
>> -       size = mode_cmd.pitches[0] * mode_cmd.height;
>> -       size = ALIGN(size, PAGE_SIZE);
>> -
>> -       /* Allocate the framebuffer in the GTT with stolen page backing */
>> -       backing = psb_gem_create(dev, size, "fb", true, PAGE_SIZE);
>> -       if (IS_ERR(backing))
>> -               return PTR_ERR(backing);
>> -       obj = &backing->base;
>> -
>> -       memset(dev_priv->vram_addr + backing->offset, 0, size);
>> -
>> -       info = drm_fb_helper_alloc_info(fb_helper);
>> -       if (IS_ERR(info)) {
>> -               ret = PTR_ERR(info);
>> -               goto err_drm_gem_object_put;
>> -       }
>> -
>> -       mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
>> -
>> -       fb = psb_framebuffer_create(dev, &mode_cmd, obj);
>> -       if (IS_ERR(fb)) {
>> -               ret = PTR_ERR(fb);
>> -               goto err_drm_gem_object_put;
>> -       }
>> -
>> -       fb_helper->fb = fb;
>> -
>> -       info->fbops = &psbfb_unaccel_ops;
>> -
>> -       info->fix.smem_start = dev_priv->fb_base;
>> -       info->fix.smem_len = size;
>> -       info->fix.ywrapstep = 0;
>> -       info->fix.ypanstep = 0;
>> -
>> -       /* Accessed stolen memory directly */
>> -       info->screen_base = dev_priv->vram_addr + backing->offset;
>> -       info->screen_size = size;
>> -
>> -       drm_fb_helper_fill_info(info, fb_helper, sizes);
>> -
>> -       info->fix.mmio_start = pci_resource_start(pdev, 0);
>> -       info->fix.mmio_len = pci_resource_len(pdev, 0);
>> -
>> -       /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
>> -
>> -       dev_dbg(dev->dev, "allocated %dx%d fb\n", fb->width, fb->height);
>> -
>> -       return 0;
>> -
>> -err_drm_gem_object_put:
>> -       drm_gem_object_put(obj);
>> -       return ret;
>> -}
>> -
>>   /**
>>    *     psb_user_framebuffer_create     -       create framebuffer
>>    *     @dev: our DRM device
>> @@ -331,105 +118,6 @@ static struct drm_framebuffer *psb_user_framebuffer_create
>>          return fb;
>>   }
>>
>> -static int psbfb_probe(struct drm_fb_helper *fb_helper,
>> -                               struct drm_fb_helper_surface_size *sizes)
>> -{
>> -       struct drm_device *dev = fb_helper->dev;
>> -       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> -       unsigned int fb_size;
>> -       int bytespp;
>> -
>> -       bytespp = sizes->surface_bpp / 8;
>> -       if (bytespp == 3)       /* no 24bit packed */
>> -               bytespp = 4;
>> -
>> -       /* If the mode will not fit in 32bit then switch to 16bit to get
>> -          a console on full resolution. The X mode setting server will
>> -          allocate its own 32bit GEM framebuffer */
>> -       fb_size = ALIGN(sizes->surface_width * bytespp, 64) *
>> -                 sizes->surface_height;
>> -       fb_size = ALIGN(fb_size, PAGE_SIZE);
>> -
>> -       if (fb_size > dev_priv->vram_stolen_size) {
>> -                sizes->surface_bpp = 16;
>> -                sizes->surface_depth = 16;
>> -        }
>> -
>> -       return psbfb_create(fb_helper, sizes);
>> -}
>> -
>> -static const struct drm_fb_helper_funcs psb_fb_helper_funcs = {
>> -       .fb_probe = psbfb_probe,
>> -};
>> -
>> -static int psb_fbdev_destroy(struct drm_device *dev,
>> -                            struct drm_fb_helper *fb_helper)
>> -{
>> -       struct drm_framebuffer *fb = fb_helper->fb;
>> -
>> -       drm_fb_helper_unregister_info(fb_helper);
>> -
>> -       drm_fb_helper_fini(fb_helper);
>> -       drm_framebuffer_unregister_private(fb);
>> -       drm_framebuffer_cleanup(fb);
>> -
>> -       if (fb->obj[0])
>> -               drm_gem_object_put(fb->obj[0]);
>> -       kfree(fb);
>> -
>> -       return 0;
>> -}
>> -
>> -int psb_fbdev_init(struct drm_device *dev)
>> -{
>> -       struct drm_fb_helper *fb_helper;
>> -       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> -       int ret;
>> -
>> -       fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
>> -       if (!fb_helper) {
>> -               dev_err(dev->dev, "no memory\n");
>> -               return -ENOMEM;
>> -       }
>> -
>> -       dev_priv->fb_helper = fb_helper;
>> -
>> -       drm_fb_helper_prepare(dev, fb_helper, 32, &psb_fb_helper_funcs);
>> -
>> -       ret = drm_fb_helper_init(dev, fb_helper);
>> -       if (ret)
>> -               goto free;
>> -
>> -       /* disable all the possible outputs/crtcs before entering KMS mode */
>> -       drm_helper_disable_unused_functions(dev);
>> -
>> -       ret = drm_fb_helper_initial_config(fb_helper);
>> -       if (ret)
>> -               goto fini;
>> -
>> -       return 0;
>> -
>> -fini:
>> -       drm_fb_helper_fini(fb_helper);
>> -free:
>> -       drm_fb_helper_unprepare(fb_helper);
>> -       kfree(fb_helper);
>> -       return ret;
>> -}
>> -
>> -static void psb_fbdev_fini(struct drm_device *dev)
>> -{
>> -       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
>> -
>> -       if (!dev_priv->fb_helper)
>> -               return;
>> -
>> -       psb_fbdev_destroy(dev, dev_priv->fb_helper);
>> -       drm_fb_helper_unprepare(dev_priv->fb_helper);
>> -       kfree(dev_priv->fb_helper);
>> -       dev_priv->fb_helper = NULL;
>> -}
>> -
>>   static const struct drm_mode_config_funcs psb_mode_funcs = {
>>          .fb_create = psb_user_framebuffer_create,
>>          .output_poll_changed = drm_fb_helper_output_poll_changed,
>> diff --git a/drivers/gpu/drm/gma500/psb_drv.h b/drivers/gpu/drm/gma500/psb_drv.h
>> index a5df6d2f2cab..cd0a30011572 100644
>> --- a/drivers/gpu/drm/gma500/psb_drv.h
>> +++ b/drivers/gpu/drm/gma500/psb_drv.h
>> @@ -610,7 +610,24 @@ extern void psb_lid_timer_takedown(struct drm_psb_private *dev_priv);
>>   /* modesetting */
>>   extern void psb_modeset_init(struct drm_device *dev);
>>   extern void psb_modeset_cleanup(struct drm_device *dev);
>> +
>> +/* framebuffer */
>> +extern struct drm_framebuffer *psb_framebuffer_create(struct drm_device *dev,
>> +                                                     const struct drm_mode_fb_cmd2 *mode_cmd,
>> +                                                     struct drm_gem_object *obj);
>> +
>> +/* fbdev */
>> +#if defined(CONFIG_DRM_FBDEV_EMULATION)
>>   extern int psb_fbdev_init(struct drm_device *dev);
>> +extern void psb_fbdev_fini(struct drm_device *dev);
>> +#else
>> +int psb_fbdev_init(struct drm_device *dev)
>> +{
>> +       return 0;
>> +}
>> +void psb_fbdev_fini(struct drm_device *dev)
>> +{ }
>> +#endif
>>
>>   /* backlight.c */
>>   int gma_backlight_init(struct drm_device *dev);
>> --
>> 2.39.2
>>

-- 
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Maxfeldstr. 5, 90409 Nürnberg, Germany
(HRB 36809, AG Nürnberg)
Geschäftsführer: Ivo Totev
-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 840 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20230227/b71d2246/attachment-0001.sig>


More information about the dri-devel mailing list