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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/17/2011 11:32 PM, Rob Clark wrote:
From: Rob Clark<rob@xxxxxx>

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@xxxxxx>
+ *
+ * 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@xxxxxx>
+ *
+ * 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__ */



_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/dri-devel


[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux