[PATCH v2 0/2] Fixes for omapdrm console
Thomas Zimmermann
tzimmermann at suse.de
Tue Feb 27 11:34:28 UTC 2024
Hi
Am 27.02.24 um 11:19 schrieb Tony Lindgren:
> * Tony Lindgren <tony at atomide.com> [240227 11:47]:
>> * Thomas Zimmermann <tzimmermann at suse.de> [240227 09:16]:
>>> I just realized the fb_deferred_io_mmap() is already exported. So please use
>>> it instead of duplicating the code in omapdrm.
>>>
>>> [1] https://elixir.bootlin.com/linux/v6.7/source/drivers/video/fbdev/core/fb_defio.c#L237
>> Yeah I have now:
>>
>> static int omap_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
>> {
>> vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
>>
>> return fb_deferred_io_mmap(info, vma);
>> }
>>
>>> I also noticed that omapdrm does not yet select the correct Kconfig symbols.
>>> That can be fixed by
>>>
>>> 1) creating Kconfig FB_DMAMEM_HELPERS_DEFERRED that are similar to their
>>> SYSMEM equivalent at [2]. The tokens should look like this
>>>
>>> configFB_DMAMEM_HELPERS_DEFERRED <https://elixir.bootlin.com/linux/latest/K/ident/CONFIG_FB_SYSMEM_HELPERS_DEFERRED>
>>> bool
>>> depends onFB_CORE <https://elixir.bootlin.com/linux/latest/K/ident/CONFIG_FB_CORE>
>>> selectFB_DEFERRED_IO <https://elixir.bootlin.com/linux/latest/K/ident/CONFIG_FB_DEFERRED_IO>
>>> selectFB_DMAMEM_HELPERS <https://elixir.bootlin.com/linux/latest/K/ident/CONFIG_FB_SYSMEM_HELPERS>
>> OK
>>
>>> 2) and selecting it instead of FB_DMAMEM_HELPERS under omapdrm's Kconfig
>>> symbol.
>> OK
> So here's what I have now, does that look OK?
Looks good. You can add
Reviewed-by: Thomas Zimmermann <tzimmermann at suse.de>
to the final patch.
Best regards
Thomas
>
> Regards,
>
> Tony
>
> 8< -------------------------
> diff --git a/drivers/gpu/drm/omapdrm/Kconfig b/drivers/gpu/drm/omapdrm/Kconfig
> --- a/drivers/gpu/drm/omapdrm/Kconfig
> +++ b/drivers/gpu/drm/omapdrm/Kconfig
> @@ -4,7 +4,7 @@ config DRM_OMAP
> depends on DRM && OF
> depends on ARCH_OMAP2PLUS
> select DRM_KMS_HELPER
> - select FB_DMAMEM_HELPERS if DRM_FBDEV_EMULATION
> + select FB_DMAMEM_HELPERS_DEFERRED if DRM_FBDEV_EMULATION
> select VIDEOMODE_HELPERS
> select HDMI
> default n
> diff --git a/drivers/gpu/drm/omapdrm/omap_fbdev.c b/drivers/gpu/drm/omapdrm/omap_fbdev.c
> --- a/drivers/gpu/drm/omapdrm/omap_fbdev.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fbdev.c
> @@ -51,6 +51,10 @@ static void pan_worker(struct work_struct *work)
> omap_gem_roll(bo, fbi->var.yoffset * npages);
> }
>
> +FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(omap_fbdev,
> + drm_fb_helper_damage_range,
> + drm_fb_helper_damage_area)
> +
> static int omap_fbdev_pan_display(struct fb_var_screeninfo *var,
> struct fb_info *fbi)
> {
> @@ -78,11 +82,9 @@ static int omap_fbdev_pan_display(struct fb_var_screeninfo *var,
>
> static int omap_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
> {
> - struct drm_fb_helper *helper = info->par;
> - struct drm_framebuffer *fb = helper->fb;
> - struct drm_gem_object *bo = drm_gem_fb_get_obj(fb, 0);
> + vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
>
> - return drm_gem_mmap_obj(bo, omap_gem_mmap_size(bo), vma);
> + return fb_deferred_io_mmap(info, vma);
> }
>
> static void omap_fbdev_fb_destroy(struct fb_info *info)
> @@ -94,6 +96,7 @@ static void omap_fbdev_fb_destroy(struct fb_info *info)
>
> DBG();
>
> + fb_deferred_io_cleanup(info);
> drm_fb_helper_fini(helper);
>
> omap_gem_unpin(bo);
> @@ -104,15 +107,19 @@ static void omap_fbdev_fb_destroy(struct fb_info *info)
> kfree(fbdev);
> }
>
> +/*
> + * For now, we cannot use FB_DEFAULT_DEFERRED_OPS and fb_deferred_io_mmap()
> + * because we use write-combine.
> + */
> static const struct fb_ops omap_fb_ops = {
> .owner = THIS_MODULE,
> - __FB_DEFAULT_DMAMEM_OPS_RDWR,
> + __FB_DEFAULT_DEFERRED_OPS_RDWR(omap_fbdev),
> .fb_check_var = drm_fb_helper_check_var,
> .fb_set_par = drm_fb_helper_set_par,
> .fb_setcmap = drm_fb_helper_setcmap,
> .fb_blank = drm_fb_helper_blank,
> .fb_pan_display = omap_fbdev_pan_display,
> - __FB_DEFAULT_DMAMEM_OPS_DRAW,
> + __FB_DEFAULT_DEFERRED_OPS_DRAW(omap_fbdev),
> .fb_ioctl = drm_fb_helper_ioctl,
> .fb_mmap = omap_fbdev_fb_mmap,
> .fb_destroy = omap_fbdev_fb_destroy,
> @@ -213,6 +220,15 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
> fbi->fix.smem_start = dma_addr;
> fbi->fix.smem_len = bo->size;
>
> + /* deferred I/O */
> + helper->fbdefio.delay = HZ / 20;
> + helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
> +
> + fbi->fbdefio = &helper->fbdefio;
> + ret = fb_deferred_io_init(fbi);
> + if (ret)
> + goto fail;
> +
> /* if we have DMM, then we can use it for scrolling by just
> * shuffling pages around in DMM rather than doing sw blit.
> */
> diff --git a/drivers/video/fbdev/core/Kconfig b/drivers/video/fbdev/core/Kconfig
> --- a/drivers/video/fbdev/core/Kconfig
> +++ b/drivers/video/fbdev/core/Kconfig
> @@ -144,6 +144,12 @@ config FB_DMAMEM_HELPERS
> select FB_SYS_IMAGEBLIT
> select FB_SYSMEM_FOPS
>
> +config FB_DMAMEM_HELPERS_DEFERRED
> + bool
> + depends on FB_CORE
> + select FB_DEFERRED_IO
> + select FB_DMAMEM_HELPERS
> +
> config FB_IOMEM_FOPS
> tristate
> depends on FB_CORE
> diff --git a/include/linux/fb.h b/include/linux/fb.h
> --- a/include/linux/fb.h
> +++ b/include/linux/fb.h
> @@ -686,6 +686,10 @@ extern int fb_deferred_io_fsync(struct file *file, loff_t start,
> __FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, sys) \
> __FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, sys)
>
> +#define FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(__prefix, __damage_range, __damage_area) \
> + __FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, sys) \
> + __FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, sys)
> +
> /*
> * Initializes struct fb_ops for deferred I/O.
> */
--
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)
More information about the dri-devel
mailing list