[PATCH] RFCv2: omapdrm DRM/KMS driver for TI OMAP platforms

Thomas Hellstrom thomas at shipmail.org
Sun Sep 18 12:36:50 PDT 2011


On 09/17/2011 11:32 PM, Rob Clark wrote:
> From: Rob Clark<rob at ti.com>
>
> A DRM display driver for TI OMAP platform.  Similar to omapfb (fbdev)
> and omap_vout (v4l2 display) drivers in the past, this driver uses the
> DSS2 driver to access the display hardware, including support for
> HDMI, DVI, and various types of LCD panels.  And it implements GEM
> support for buffer allocation (for KMS as well as offscreen buffers
> used by the xf86-video-omap userspace xorg driver).
>
> The driver maps CRTCs to overlays, encoders to overlay-managers, and
> connectors to dssdev's.  Note that this arrangement might change slightly
> when support for drm_plane overlays is added.
>
> For GEM support, non-scanout buffers are using the shmem backed pages
> provided by GEM core (In drm_gem_object_init()).  In the case of scanout
> buffers, which need to be physically contiguous, those are allocated
> with CMA and use drm_gem_private_object_init().
>
> See userspace xorg driver:
> git://github.com/robclark/xf86-video-omap.git
>
> Refer to this link for CMA (Continuous Memory Allocator):
> http://lkml.org/lkml/2011/8/19/302
>
> Links to previous versions of the patch:
> v1: http://lwn.net/Articles/458137/
>
> History:
>
> v2: replace omap_vram with CMA for scanout buffer allocation, remove
>      unneeded functions, use dma_addr_t for physical addresses, error
>      handling cleanup, refactor attach/detach pages into common drm
>      functions, split non-userspace-facing API into omap_priv.h, remove
>      plugin API
>
> v1: original
> ---
>   drivers/staging/Kconfig                  |    2 +
>   drivers/staging/Makefile                 |    1 +
>   drivers/staging/omapdrm/Kconfig          |   24 +
>   drivers/staging/omapdrm/Makefile         |    9 +
>   drivers/staging/omapdrm/TODO.txt         |   14 +
>   drivers/staging/omapdrm/omap_connector.c |  357 ++++++++++++++
>   drivers/staging/omapdrm/omap_crtc.c      |  332 +++++++++++++
>   drivers/staging/omapdrm/omap_drv.c       |  766 ++++++++++++++++++++++++++++++
>   drivers/staging/omapdrm/omap_drv.h       |  126 +++++
>   drivers/staging/omapdrm/omap_encoder.c   |  188 ++++++++
>   drivers/staging/omapdrm/omap_fb.c        |  259 ++++++++++
>   drivers/staging/omapdrm/omap_fbdev.c     |  309 ++++++++++++
>   drivers/staging/omapdrm/omap_gem.c       |  720 ++++++++++++++++++++++++++++
>   drivers/video/omap2/omapfb/Kconfig       |    2 +-
>   include/drm/Kbuild                       |    1 +
>   include/drm/omap_drm.h                   |  111 +++++
>   include/drm/omap_priv.h                  |   42 ++
>   17 files changed, 3262 insertions(+), 1 deletions(-)
>   create mode 100644 drivers/staging/omapdrm/Kconfig
>   create mode 100644 drivers/staging/omapdrm/Makefile
>   create mode 100644 drivers/staging/omapdrm/TODO.txt
>   create mode 100644 drivers/staging/omapdrm/omap_connector.c
>   create mode 100644 drivers/staging/omapdrm/omap_crtc.c
>   create mode 100644 drivers/staging/omapdrm/omap_drv.c
>   create mode 100644 drivers/staging/omapdrm/omap_drv.h
>   create mode 100644 drivers/staging/omapdrm/omap_encoder.c
>   create mode 100644 drivers/staging/omapdrm/omap_fb.c
>   create mode 100644 drivers/staging/omapdrm/omap_fbdev.c
>   create mode 100644 drivers/staging/omapdrm/omap_gem.c
>   create mode 100644 include/drm/omap_drm.h
>   create mode 100644 include/drm/omap_priv.h
>
>    

...

> diff --git a/include/drm/omap_drm.h b/include/drm/omap_drm.h
> new file mode 100644
> index 0000000..ea0ae8e
> --- /dev/null
> +++ b/include/drm/omap_drm.h
> @@ -0,0 +1,111 @@
> +/*
> + * linux/include/drm/omap_drm.h
> + *
> + * Copyright (C) 2011 Texas Instruments
> + * Author: Rob Clark<rob at ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published by
> + * the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program.  If not, see<http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __OMAP_DRM_H__
> +#define __OMAP_DRM_H__
> +
> +#include "drm.h"
> +
> +/* Please note that modifications to all structs defined here are
> + * subject to backwards-compatibility constraints.
> + */
> +
> +#define OMAP_PARAM_CHIPSET_ID	1	/* ie. 0x3430, 0x4430, etc */
> +
> +struct drm_omap_param {
> +	uint64_t param;			/* in */
> +	uint64_t value;			/* in (set_param), out (get_param) */
> +};
> +
> +struct drm_omap_get_base {
> +	char plugin_name[64];		/* in */
> +	uint32_t ioctl_base;		/* out */
> +};
>    

What about  future ARM 64-bit vs 32-bit structure sizes? On x86 we 
always take care to make structures appearing in the drm user-space 
interfaces having sizes that are a multiple of 64-bits, to avoid having 
to maintain compat code for  32-bit apps running on 64 bit kernels. For 
the same reasons, structure members with 64 bit alignment requirements 
on 64-bit systems need to be carefully places.

I don't know whether there is or will be a 64-bit ARM, but it might be 
worth taking into consideration.

/Thomas





> +
> +#define OMAP_BO_SCANOUT		0x00000001	/* scanout capable (phys contiguous) */
> +#define OMAP_BO_CACHE_MASK	0x00000006	/* cache type mask, see cache modes */
> +#define OMAP_BO_TILED_MASK	0x00000f00	/* tiled mapping mask, see tiled modes */
> +
> +/* cache modes */
> +#define OMAP_BO_CACHED		0x00000000	/* default */
> +#define OMAP_BO_WC		0x00000002	/* write-combine */
> +#define OMAP_BO_UNCACHED	0x00000004	/* strongly-ordered (uncached) */
> +
> +/* tiled modes */
> +#define OMAP_BO_TILED_8		0x00000100
> +#define OMAP_BO_TILED_16	0x00000200
> +#define OMAP_BO_TILED_32	0x00000300
> +
> +struct drm_omap_gem_new {
> +	union {				/* in */
> +		uint32_t bytes;		/* (for non-tiled formats) */
> +		struct {
> +			uint16_t width;
> +			uint16_t height;
> +		} tiled;		/* (for tiled formats) */
> +	} size;
> +	uint32_t flags;			/* in */
> +	uint32_t handle;		/* out */
> +};
> +
> +/* mask of operations: */
> +enum omap_gem_op {
> +	OMAP_GEM_READ = 0x01,
> +	OMAP_GEM_WRITE = 0x02,
> +};
> +
> +struct drm_omap_gem_cpu_prep {
> +	uint32_t handle;		/* buffer handle (in) */
> +	uint32_t op;			/* mask of omap_gem_op (in) */
> +};
> +
> +struct drm_omap_gem_cpu_fini {
> +	uint32_t handle;		/* buffer handle (in) */
> +	uint32_t op;			/* mask of omap_gem_op (in) */
> +	/* TODO maybe here we pass down info about what regions are touched
> +	 * by sw so we can be clever about cache ops?  For now a placeholder,
> +	 * set to zero and we just do full buffer flush..
> +	 */
> +	uint32_t nregions;
> +};
> +
> +struct drm_omap_gem_info {
> +	uint32_t handle;		/* buffer handle (in) */
> +	uint32_t pad;
> +	uint64_t offset;		/* out */
> +};
> +
> +#define DRM_OMAP_GET_PARAM		0x00
> +#define DRM_OMAP_SET_PARAM		0x01
> +#define DRM_OMAP_GET_BASE		0x02
> +#define DRM_OMAP_GEM_NEW		0x03
> +#define DRM_OMAP_GEM_CPU_PREP	0x04
> +#define DRM_OMAP_GEM_CPU_FINI	0x05
> +#define DRM_OMAP_GEM_INFO	0x06
> +#define DRM_OMAP_NUM_IOCTLS		0x07
> +
> +#define DRM_IOCTL_OMAP_GET_PARAM	DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GET_PARAM, struct drm_omap_param)
> +#define DRM_IOCTL_OMAP_SET_PARAM	DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_SET_PARAM, struct drm_omap_param)
> +#define DRM_IOCTL_OMAP_GET_BASE		DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GET_BASE, struct drm_omap_get_base)
> +#define DRM_IOCTL_OMAP_GEM_NEW		DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GEM_NEW, struct drm_omap_gem_new)
> +#define DRM_IOCTL_OMAP_GEM_CPU_PREP	DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_GEM_CPU_PREP, struct drm_omap_gem_cpu_prep)
> +#define DRM_IOCTL_OMAP_GEM_CPU_FINI	DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_GEM_CPU_FINI, struct drm_omap_gem_cpu_fini)
> +#define DRM_IOCTL_OMAP_GEM_INFO		DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GEM_INFO, struct drm_omap_gem_info)
> +
> +#endif /* __OMAP_DRM_H__ */
> diff --git a/include/drm/omap_priv.h b/include/drm/omap_priv.h
> new file mode 100644
> index 0000000..ca7d975
> --- /dev/null
> +++ b/include/drm/omap_priv.h
> @@ -0,0 +1,42 @@
> +/*
> + * linux/include/drm/omap_priv.h
> + *
> + * Copyright (C) 2011 Texas Instruments
> + * Author: Rob Clark<rob at ti.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published by
> + * the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program.  If not, see<http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef __OMAP_PRIV_H__
> +#define __OMAP_PRIV_H__
> +
> +/* Non-userspace facing APIs
> + */
> +
> +/* optional platform data to configure the default configuration of which
> + * pipes/overlays/CRTCs are used.. if this is not provided, then instead the
> + * first CONFIG_DRM_OMAP_NUM_CRTCS are used, and they are each connected to
> + * one manager, with priority given to managers that are connected to
> + * detected devices.  This should be a good default behavior for most cases,
> + * but yet there still might be times when you wish to do something different.
> + */
> +struct omap_drm_platform_data {
> +	int ovl_cnt;
> +	const int *ovl_ids;
> +	int mgr_cnt;
> +	const int *mgr_ids;
> +	int dev_cnt;
> +	const char **dev_names;
> +};
> +
> +#endif /* __OMAP_DRM_H__ */
>    





More information about the dri-devel mailing list