[PATCH] RFCv2: omapdrm DRM/KMS driver for TI OMAP platforms
Thomas Hellstrom
thomas at shipmail.org
Sun Sep 18 13:00:17 PDT 2011
On 09/18/2011 09:50 PM, Rob Clark wrote:
> On Sun, Sep 18, 2011 at 2:36 PM, Thomas Hellstrom<thomas at shipmail.org> wrote:
>
>> 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.
>>
> There isn't currently any 64-bit ARM, but it is a safe assumption that
> there will be some day.. I guess we'll have enough fun w/ various
> random 32b devices when LPAE arrives w/ the cortex-a15..
>
> I did try to make sure any uint64_t's were aligned to a 64bit offset,
> but beyond that I confess to not being an expert on how 64 vs 32b
> ioctl compat stuff is handled or what the issues going from 32->64b
> are. If there are some additional considerations that should be taken
> care of, then now is the time. So far I don't have any pointer fields
> in any of the ioctl structs. Beyond that, I'm not entirely sure what
> else needs to be done, but would appreciate any pointers to docs about
> how the compat stuff works.
>
> BR,
> -R
>
I've actually avoided writing compat ioctl code myself, by trying to
make sure that structures look identical in the 64-bit and 32-bit x86
ABIs, but the compat code is there to translate pointers and to overcome
alignment incompatibilities.
A good way to at least try to avoid having to maintain compat code once
the 64-bit ABI shows up is to make sure that 64-bit scalars and embedded
structures are placed on 64-bit boundaries, padding if necessary, and to
make sure (using padding) that struct sizes are always multiples of 64 bits.
But since there is no 64-bit ARM yet, it might be better to rely on
using compat code in the future than on making guesses about alignment
restrictions of the ABI...
/Thomas
More information about the dri-devel
mailing list