Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
omap2+: add drm device
Register OMAP DRM/KMS platform device, and reserve a CMA region for
the device to use for buffer allocation.  DMM is split into a
separate device using hwmod.

Signed-off-by: Andy Gross <andy.gross@ti.com>
Signed-off-by: Rob Clark <rob@ti.com>
  • Loading branch information
andygross authored and Rob Clark committed Mar 13, 2012
1 parent 6416dae commit c972836
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 1 deletion.
4 changes: 4 additions & 0 deletions arch/arm/mach-omap2/Makefile
Expand Up @@ -189,6 +189,10 @@ ifneq ($(CONFIG_TIDSPBRIDGE),)
obj-y += dsp.o
endif

ifneq ($(CONFIG_DRM_OMAP),)
obj-y += drm.o
endif

# Specific board support
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
Expand Down
83 changes: 83 additions & 0 deletions arch/arm/mach-omap2/drm.c
@@ -0,0 +1,83 @@
/*
* DRM/KMS device registration for TI OMAP platforms
*
* Copyright (C) 2012 Texas Instruments
* Author: Rob Clark <rob.clark@linaro.org>
*
* 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/>.
*/

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#ifdef CONFIG_CMA
# include <linux/dma-contiguous.h>
#endif

#include <plat/omap_device.h>
#include <plat/omap_hwmod.h>

#include <plat/drm.h>

#if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE)

static struct omap_drm_platform_data omapdrm_platdata;

static struct platform_device omap_drm_device = {
.dev = {
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &omapdrm_platdata,
},
.name = "omapdrm",
.id = 0,
};

static int __init omap_init_drm(void)
{
struct omap_hwmod *oh = NULL;
struct platform_device *pdev;

/* lookup and populate the DMM information, if present - OMAP4+ */
oh = omap_hwmod_lookup("dmm");

if (oh) {
pdev = omap_device_build(oh->name, -1, oh, NULL, 0, NULL, 0,
false);
WARN(IS_ERR(pdev), "Could not build omap_device for %s\n",
oh->name);
}

return platform_device_register(&omap_drm_device);

}

arch_initcall(omap_init_drm);

void omapdrm_reserve_vram(void)
{
#ifdef CONFIG_CMA
/*
* Create private 32MiB contiguous memory area for omapdrm.0 device
* TODO revisit size.. if uc/wc buffers are allocated from CMA pages
* then the amount of memory we need goes up..
*/
dma_declare_contiguous(&omap_drm_device.dev, 32 * SZ_1M, 0, 0);
#else
# warning "CMA is not enabled, there may be limitations about scanout buffer allocations on OMAP3 and earlier"
#endif
}

#endif
3 changes: 2 additions & 1 deletion arch/arm/plat-omap/common.c
Expand Up @@ -21,10 +21,10 @@
#include <plat/board.h>
#include <plat/vram.h>
#include <plat/dsp.h>
#include <plat/drm.h>

#include <plat/omap-secure.h>


#define NO_LENGTH_CHECK 0xffffffff

struct omap_board_config_kernel *omap_board_config __initdata;
Expand Down Expand Up @@ -65,6 +65,7 @@ const void *__init omap_get_var_config(u16 tag, size_t *len)

void __init omap_reserve(void)
{
omapdrm_reserve_vram();
omapfb_reserve_sdram_memblock();
omap_vram_reserve_sdram_memblock();
omap_dsp_reserve_sdram_memblock();
Expand Down
64 changes: 64 additions & 0 deletions arch/arm/plat-omap/include/plat/drm.h
@@ -0,0 +1,64 @@
/*
* DRM/KMS device registration for TI OMAP platforms
*
* Copyright (C) 2012 Texas Instruments
* Author: Rob Clark <rob.clark@linaro.org>
*
* 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 __PLAT_OMAP_DRM_H__
#define __PLAT_OMAP_DRM_H__

/*
* 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. Remaining overlays are used as video planes. 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_kms_platform_data {
/* overlays to use as CRTCs: */
int ovl_cnt;
const int *ovl_ids;

/* overlays to use as video planes: */
int pln_cnt;
const int *pln_ids;

int mgr_cnt;
const int *mgr_ids;

int dev_cnt;
const char **dev_names;
};

struct omap_drm_platform_data {
struct omap_kms_platform_data *kms_pdata;
};

#if defined(CONFIG_DRM_OMAP) || defined(CONFIG_DRM_OMAP_MODULE)

void omapdrm_reserve_vram(void);

#else

static inline void omapdrm_reserve_vram(void)
{
}

#endif

#endif /* __PLAT_OMAP_DRM_H__ */

0 comments on commit c972836

Please sign in to comment.