[RFC 1/7] drm/gem: Add drm_gem_dumb_map_offset()
Daniel Vetter
daniel at ffwll.ch
Mon Jul 24 08:28:50 UTC 2017
On Fri, Jul 21, 2017 at 08:41:50PM +0200, Noralf Trønnes wrote:
>
> Den 20.07.2017 10.00, skrev Daniel Vetter:
> > On Thu, Jul 20, 2017 at 12:13:07AM +0200, Noralf Trønnes wrote:
> > > Den 19.07.2017 23.01, skrev Eric Anholt:
> > > > Noralf Trønnes <noralf at tronnes.org> writes:
> > > >
> > > > > Add a common drm_driver.dumb_map_offset function for GEM backed drivers.
> > > > >
> > > > > Signed-off-by: Noralf Trønnes <noralf at tronnes.org>
> > > > Instead of just introducing the new code, could we replace CMA's code
> > > > with calls to this at the same time?
> > > I have gone through all the drm_driver->dumb_map_offset
> > > implementations and found 23 drivers that could use it:
> > > - 18 drivers use drm_gem_cma_dumb_map_offset()
> > > - exynos_drm_gem_dumb_map_offset()
> > > - mtk_drm_gem_dumb_map_offset()
> > > - psb_gem_dumb_map_gtt()
> > > - rockchip_gem_dumb_map_offset()
> > > - tegra_bo_dumb_map_offset()
> > >
> > > vgem_gem_dumb_map() can't use it because of this check:
> > > if (!obj->filp) {
> > > ret = -EINVAL;
> > > goto unref;
> > > }
> > >
> > > armada_gem_dumb_map_offset() can't use it because of this check:
> > > /* Don't allow imported objects to be mapped */
> > > if (obj->obj.import_attach) {
> > > ret = -EINVAL;
> > > goto err_unref;
> > > }
> > >
> > > I see that drivers must implement all 3 .dumb_* callbacks:
> > >
> > > * To support dumb objects drivers must implement the
> > > &drm_driver.dumb_create,
> > > * &drm_driver.dumb_destroy and &drm_driver.dumb_map_offset operations. See
> > > * there for further details.
> > >
> > > I'm a fan of defaults, is there any reason we can't do this:
> > So in general we try not to set defaults for the main driver entry hooks,
> > to avoid the helper functions leaking into core and becoming mandatory.
> > So e.g. ->atomic_commit should never have a default of
> > drm_atomic_helper_commit.
> >
> > Same thought applied here for the dumb buffers - the idea is that drivers
> > using any kind of buffer manager scheme could have dumb buffers, including
> > maybe not having a buffer manager at all (and you get some cookie to
> > direct vram allocations or whatever). But everyone ended up with gem, just
> > with different kinds of backing storage implementations (cma, shmem or
> > ttm).
> >
> > I think it makes sense to make these the defaults and rip out the default
> > assignment from all drivers.
> > > int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
> > > void *data, struct drm_file *file_priv)
> > > {
> > > struct drm_mode_map_dumb *args = data;
> > >
> > > /* call driver ioctl to get mmap offset */
> > > - if (!dev->driver->dumb_map_offset)
> > > + if (!dev->driver->dumb_create)
> > > return -ENOSYS;
> > >
> > > - return dev->driver->dumb_map_offset(file_priv, dev, args->handle,
> > > &args->offset);
> > > + if (dev->driver->dumb_map_offset)
> > > + return dev->driver->dumb_map_offset(file_priv, dev, args->handle,
> > > &args->offset);
> > > + else
> > > + return drm_gem_dumb_map_offset(file_priv, dev, args->handle,
> > > &args->offset);
> > > }
> > >
> > > int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
> > > void *data, struct drm_file *file_priv)
> > > {
> > > struct drm_mode_destroy_dumb *args = data;
> > >
> > > - if (!dev->driver->dumb_destroy)
> > > + if (!dev->driver->dumb_create)
> > > return -ENOSYS;
> > >
> > > - return dev->driver->dumb_destroy(file_priv, dev, args->handle);
> > > + if (dev->driver->dumb_destroy)
> > > + return dev->driver->dumb_destroy(file_priv, dev, args->handle);
> > > + else
> > > + return drm_gem_dumb_destroy(file_priv, dev, args->handle);
> > > }
> > >
> > > There are 36 drivers that use drm_gem_dumb_destroy() directly.
> > > vgem violates the docs and doesn't set .dumb_destroy.
> > Interesting, suprising it doesn't leak like mad.
> > > > I suspect that if we had CMA subclass from drm_fb_gem (or we move the
> > > > gem objects to the base class), we could remove a lot of its code that
> > > > you're copying in patch 2, as well.
> > > Yes, that was the intention.
> > I guess we'd need to see more of the grand plan ...
>
> Currently it looks like 4 patchsets:
>
> 1. Add drm_gem_dumb_map_offset() and implement defaults as discussed above.
>
> 2. Add drm_gem_object pointers to drm_framebuffer and create matching
> helpers for:
> drm_framebuffer_funcs->create_handle
> drm_framebuffer_funcs->destroy
> drm_mode_config_funcs->fb_create
> Should I put the functions in drm_framebuffer_helper.[h,c] ?
I'd call them drm_gem_framebuffer_helper.[hc], just to highlight the
gem<->kms connection a bit more.
> Use these helpers in the cma library
>
> 3. Add drm_fb_helper_simple_init() and drm_fb_helper_simple_fini()
> Use them in drivers where applicable.
>
> 4. Add shmem library
> Convert tinydrm to shmem.
Sounds like a good plan. I'll try to scrape away some review bandwidth to
look at your patches.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
More information about the dri-devel
mailing list