mbox series

[RFC,0/8] Support I/O memory in generic fbdev emulation

Message ID 20191106093121.21762-1-tzimmermann@suse.de (mailing list archive)
Headers show
Series Support I/O memory in generic fbdev emulation | expand

Message

Thomas Zimmermann Nov. 6, 2019, 9:31 a.m. UTC
We recently had a discussion if/how fbdev emulation could support
framebuffers in I/O memory on all platform. [1]

I typed up a patchset that passes information about the memory area
from memory manager to client (e.g., fbdev emulation). The client can
take this into consideration when accessing the framebuffer.

The alternative proposal is to introduce a separate vmap() call that
only returns I/O memorym or NULL if the framebuffer is not in I/O
memory. AFAICS the benefit of this idea is the cleaner interface and
the ability to modify drivers one by one. The drawback is some additional
boilerplate code in drivers and clients.

[1] https://lists.freedesktop.org/archives/dri-devel/2019-November/242464.html

Thomas Zimmermann (8):
  drm/vram-helper: Tell caller if vmap() returned I/O memory
  drm/qxl: Tell caller if kmap() returned I/O memory
  drm: Add is_iomem return parameter to struct drm_gem_object_funcs.vmap
  drm/gem: Return I/O-memory flag from drm_gem_vram()
  drm/client: Return I/O memory flag from drm_client_buffer_vmap()
  fbdev: Export default read and write operations as
    fb_cfb_{read,write}()
  drm/fb-helper: Select between fb_{sys,cfb}_read() and _write()
  drm/fb-helper: Handle I/O memory correctly when flushing shadow fb

 drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c |   6 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h |   2 +-
 drivers/gpu/drm/ast/ast_mode.c              |   6 +-
 drivers/gpu/drm/cirrus/cirrus.c             |   2 +-
 drivers/gpu/drm/drm_client.c                |  15 ++-
 drivers/gpu/drm/drm_fb_helper.c             | 118 ++++++++++++++++++--
 drivers/gpu/drm/drm_gem.c                   |   9 +-
 drivers/gpu/drm/drm_gem_cma_helper.c        |   7 +-
 drivers/gpu/drm/drm_gem_shmem_helper.c      |  12 +-
 drivers/gpu/drm/drm_gem_vram_helper.c       |  13 ++-
 drivers/gpu/drm/drm_internal.h              |   2 +-
 drivers/gpu/drm/drm_prime.c                 |   2 +-
 drivers/gpu/drm/etnaviv/etnaviv_drv.h       |   2 +-
 drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c |   4 +-
 drivers/gpu/drm/mgag200/mgag200_cursor.c    |   4 +-
 drivers/gpu/drm/nouveau/nouveau_gem.h       |   2 +-
 drivers/gpu/drm/nouveau/nouveau_prime.c     |   4 +-
 drivers/gpu/drm/panfrost/panfrost_perfcnt.c |   2 +-
 drivers/gpu/drm/qxl/qxl_display.c           |   6 +-
 drivers/gpu/drm/qxl/qxl_draw.c              |   4 +-
 drivers/gpu/drm/qxl/qxl_drv.h               |   4 +-
 drivers/gpu/drm/qxl/qxl_object.c            |   7 +-
 drivers/gpu/drm/qxl/qxl_object.h            |   2 +-
 drivers/gpu/drm/qxl/qxl_prime.c             |   4 +-
 drivers/gpu/drm/radeon/radeon_drv.c         |   2 +-
 drivers/gpu/drm/radeon/radeon_prime.c       |   4 +-
 drivers/gpu/drm/tiny/gm12u320.c             |   2 +-
 drivers/gpu/drm/vc4/vc4_bo.c                |   4 +-
 drivers/gpu/drm/vc4/vc4_drv.h               |   2 +-
 drivers/gpu/drm/vgem/vgem_drv.c             |   5 +-
 drivers/gpu/drm/xen/xen_drm_front_gem.c     |   6 +-
 drivers/gpu/drm/xen/xen_drm_front_gem.h     |   3 +-
 drivers/video/fbdev/core/fbmem.c            |  53 +++++++--
 include/drm/drm_client.h                    |   7 +-
 include/drm/drm_drv.h                       |   2 +-
 include/drm/drm_fb_helper.h                 |  14 +++
 include/drm/drm_gem.h                       |   2 +-
 include/drm/drm_gem_cma_helper.h            |   2 +-
 include/drm/drm_gem_shmem_helper.h          |   2 +-
 include/drm/drm_gem_vram_helper.h           |   2 +-
 include/linux/fb.h                          |   5 +
 41 files changed, 278 insertions(+), 78 deletions(-)

Comments

Daniel Vetter Nov. 6, 2019, 10:05 a.m. UTC | #1
On Wed, Nov 06, 2019 at 10:31:13AM +0100, Thomas Zimmermann wrote:
> We recently had a discussion if/how fbdev emulation could support
> framebuffers in I/O memory on all platform. [1]
> 
> I typed up a patchset that passes information about the memory area
> from memory manager to client (e.g., fbdev emulation). The client can
> take this into consideration when accessing the framebuffer.
> 
> The alternative proposal is to introduce a separate vmap() call that
> only returns I/O memorym or NULL if the framebuffer is not in I/O
> memory. AFAICS the benefit of this idea is the cleaner interface and
> the ability to modify drivers one by one. The drawback is some additional
> boilerplate code in drivers and clients.

Imo we need the correct types, to let sparse check this stuff for us.
Otherwise this is just going to be whack-a-mole, since on x86 (and I think
also on arm) there's not really a difference between iomem and system
memory.

One idea I had is to do a new opaque pointer struct, and _lots_ of new
functions to handle it. Unfortunately that means no more pointer
arithmetic on that pointer (this isn't C++):

	struct opaque_dev_ptr {
		union { void * __iomem; void * smem; };
		bool is_iomem;
	};

So really it's a _lot_ of work.

The other issue is that we also need to fix the dma-buf interfaces. Which
is going to be even more work.

All that for gain I'm not really sure is worth it - I don't even know
which platforms we're fixing with this.
-Daniel

> 
> [1] https://lists.freedesktop.org/archives/dri-devel/2019-November/242464.html
> 
> Thomas Zimmermann (8):
>   drm/vram-helper: Tell caller if vmap() returned I/O memory
>   drm/qxl: Tell caller if kmap() returned I/O memory
>   drm: Add is_iomem return parameter to struct drm_gem_object_funcs.vmap
>   drm/gem: Return I/O-memory flag from drm_gem_vram()
>   drm/client: Return I/O memory flag from drm_client_buffer_vmap()
>   fbdev: Export default read and write operations as
>     fb_cfb_{read,write}()
>   drm/fb-helper: Select between fb_{sys,cfb}_read() and _write()
>   drm/fb-helper: Handle I/O memory correctly when flushing shadow fb
> 
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c |   6 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h |   2 +-
>  drivers/gpu/drm/ast/ast_mode.c              |   6 +-
>  drivers/gpu/drm/cirrus/cirrus.c             |   2 +-
>  drivers/gpu/drm/drm_client.c                |  15 ++-
>  drivers/gpu/drm/drm_fb_helper.c             | 118 ++++++++++++++++++--
>  drivers/gpu/drm/drm_gem.c                   |   9 +-
>  drivers/gpu/drm/drm_gem_cma_helper.c        |   7 +-
>  drivers/gpu/drm/drm_gem_shmem_helper.c      |  12 +-
>  drivers/gpu/drm/drm_gem_vram_helper.c       |  13 ++-
>  drivers/gpu/drm/drm_internal.h              |   2 +-
>  drivers/gpu/drm/drm_prime.c                 |   2 +-
>  drivers/gpu/drm/etnaviv/etnaviv_drv.h       |   2 +-
>  drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c |   4 +-
>  drivers/gpu/drm/mgag200/mgag200_cursor.c    |   4 +-
>  drivers/gpu/drm/nouveau/nouveau_gem.h       |   2 +-
>  drivers/gpu/drm/nouveau/nouveau_prime.c     |   4 +-
>  drivers/gpu/drm/panfrost/panfrost_perfcnt.c |   2 +-
>  drivers/gpu/drm/qxl/qxl_display.c           |   6 +-
>  drivers/gpu/drm/qxl/qxl_draw.c              |   4 +-
>  drivers/gpu/drm/qxl/qxl_drv.h               |   4 +-
>  drivers/gpu/drm/qxl/qxl_object.c            |   7 +-
>  drivers/gpu/drm/qxl/qxl_object.h            |   2 +-
>  drivers/gpu/drm/qxl/qxl_prime.c             |   4 +-
>  drivers/gpu/drm/radeon/radeon_drv.c         |   2 +-
>  drivers/gpu/drm/radeon/radeon_prime.c       |   4 +-
>  drivers/gpu/drm/tiny/gm12u320.c             |   2 +-
>  drivers/gpu/drm/vc4/vc4_bo.c                |   4 +-
>  drivers/gpu/drm/vc4/vc4_drv.h               |   2 +-
>  drivers/gpu/drm/vgem/vgem_drv.c             |   5 +-
>  drivers/gpu/drm/xen/xen_drm_front_gem.c     |   6 +-
>  drivers/gpu/drm/xen/xen_drm_front_gem.h     |   3 +-
>  drivers/video/fbdev/core/fbmem.c            |  53 +++++++--
>  include/drm/drm_client.h                    |   7 +-
>  include/drm/drm_drv.h                       |   2 +-
>  include/drm/drm_fb_helper.h                 |  14 +++
>  include/drm/drm_gem.h                       |   2 +-
>  include/drm/drm_gem_cma_helper.h            |   2 +-
>  include/drm/drm_gem_shmem_helper.h          |   2 +-
>  include/drm/drm_gem_vram_helper.h           |   2 +-
>  include/linux/fb.h                          |   5 +
>  41 files changed, 278 insertions(+), 78 deletions(-)
> 
> -- 
> 2.23.0
>