linux/drivers/gpu/drm/exynos/exynos_drm_drv.h
<<
>>
Prefs
   1/* exynos_drm_drv.h
   2 *
   3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
   4 * Authors:
   5 *      Inki Dae <inki.dae@samsung.com>
   6 *      Joonyoung Shim <jy0922.shim@samsung.com>
   7 *      Seung-Woo Kim <sw0312.kim@samsung.com>
   8 *
   9 * This program is free software; you can redistribute  it and/or modify it
  10 * under  the terms of  the GNU General  Public License as published by the
  11 * Free Software Foundation;  either version 2 of the  License, or (at your
  12 * option) any later version.
  13 */
  14
  15#ifndef _EXYNOS_DRM_DRV_H_
  16#define _EXYNOS_DRM_DRV_H_
  17
  18#include <drm/drmP.h>
  19#include <linux/module.h>
  20
  21#define MAX_CRTC        3
  22#define MAX_PLANE       5
  23#define MAX_FB_BUFFER   4
  24
  25#define to_exynos_crtc(x)       container_of(x, struct exynos_drm_crtc, base)
  26#define to_exynos_plane(x)      container_of(x, struct exynos_drm_plane, base)
  27
  28/* this enumerates display type. */
  29enum exynos_drm_output_type {
  30        EXYNOS_DISPLAY_TYPE_NONE,
  31        /* RGB or CPU Interface. */
  32        EXYNOS_DISPLAY_TYPE_LCD,
  33        /* HDMI Interface. */
  34        EXYNOS_DISPLAY_TYPE_HDMI,
  35        /* Virtual Display Interface. */
  36        EXYNOS_DISPLAY_TYPE_VIDI,
  37};
  38
  39/*
  40 * Exynos drm common overlay structure.
  41 *
  42 * @base: plane object
  43 * @src_x: offset x on a framebuffer to be displayed.
  44 *      - the unit is screen coordinates.
  45 * @src_y: offset y on a framebuffer to be displayed.
  46 *      - the unit is screen coordinates.
  47 * @src_w: width of a partial image to be displayed from framebuffer.
  48 * @src_h: height of a partial image to be displayed from framebuffer.
  49 * @crtc_x: offset x on hardware screen.
  50 * @crtc_y: offset y on hardware screen.
  51 * @crtc_w: window width to be displayed (hardware screen).
  52 * @crtc_h: window height to be displayed (hardware screen).
  53 * @h_ratio: horizontal scaling ratio, 16.16 fixed point
  54 * @v_ratio: vertical scaling ratio, 16.16 fixed point
  55 * @dma_addr: array of bus(accessed by dma) address to the memory region
  56 *            allocated for a overlay.
  57 * @zpos: order of overlay layer(z position).
  58 *
  59 * this structure is common to exynos SoC and its contents would be copied
  60 * to hardware specific overlay info.
  61 */
  62
  63struct exynos_drm_plane {
  64        struct drm_plane base;
  65        unsigned int src_x;
  66        unsigned int src_y;
  67        unsigned int src_w;
  68        unsigned int src_h;
  69        unsigned int crtc_x;
  70        unsigned int crtc_y;
  71        unsigned int crtc_w;
  72        unsigned int crtc_h;
  73        unsigned int h_ratio;
  74        unsigned int v_ratio;
  75        dma_addr_t dma_addr[MAX_FB_BUFFER];
  76        unsigned int zpos;
  77        struct drm_framebuffer *pending_fb;
  78};
  79
  80/*
  81 * Exynos drm crtc ops
  82 *
  83 * @enable: enable the device
  84 * @disable: disable the device
  85 * @commit: set current hw specific display mode to hw.
  86 * @enable_vblank: specific driver callback for enabling vblank interrupt.
  87 * @disable_vblank: specific driver callback for disabling vblank interrupt.
  88 * @wait_for_vblank: wait for vblank interrupt to make sure that
  89 *      hardware overlay is updated.
  90 * @atomic_begin: prepare a window to receive a update
  91 * @atomic_flush: mark the end of a window update
  92 * @update_plane: apply hardware specific overlay data to registers.
  93 * @disable_plane: disable hardware specific overlay.
  94 * @te_handler: trigger to transfer video image at the tearing effect
  95 *      synchronization signal if there is a page flip request.
  96 * @clock_enable: optional function enabling/disabling display domain clock,
  97 *      called from exynos-dp driver before powering up (with
  98 *      'enable' argument as true) and after powering down (with
  99 *      'enable' as false).
 100 */
 101struct exynos_drm_crtc;
 102struct exynos_drm_crtc_ops {
 103        void (*enable)(struct exynos_drm_crtc *crtc);
 104        void (*disable)(struct exynos_drm_crtc *crtc);
 105        void (*commit)(struct exynos_drm_crtc *crtc);
 106        int (*enable_vblank)(struct exynos_drm_crtc *crtc);
 107        void (*disable_vblank)(struct exynos_drm_crtc *crtc);
 108        void (*wait_for_vblank)(struct exynos_drm_crtc *crtc);
 109        void (*atomic_begin)(struct exynos_drm_crtc *crtc,
 110                              struct exynos_drm_plane *plane);
 111        void (*update_plane)(struct exynos_drm_crtc *crtc,
 112                             struct exynos_drm_plane *plane);
 113        void (*disable_plane)(struct exynos_drm_crtc *crtc,
 114                              struct exynos_drm_plane *plane);
 115        void (*atomic_flush)(struct exynos_drm_crtc *crtc,
 116                              struct exynos_drm_plane *plane);
 117        void (*te_handler)(struct exynos_drm_crtc *crtc);
 118        void (*clock_enable)(struct exynos_drm_crtc *crtc, bool enable);
 119};
 120
 121/*
 122 * Exynos specific crtc structure.
 123 *
 124 * @base: crtc object.
 125 * @type: one of EXYNOS_DISPLAY_TYPE_LCD and HDMI.
 126 * @pipe: a crtc index created at load() with a new crtc object creation
 127 *      and the crtc object would be set to private->crtc array
 128 *      to get a crtc object corresponding to this pipe from private->crtc
 129 *      array when irq interrupt occurred. the reason of using this pipe is that
 130 *      drm framework doesn't support multiple irq yet.
 131 *      we can refer to the crtc to current hardware interrupt occurred through
 132 *      this pipe value.
 133 * @enabled: if the crtc is enabled or not
 134 * @event: vblank event that is currently queued for flip
 135 * @wait_update: wait all pending planes updates to finish
 136 * @pending_update: number of pending plane updates in this crtc
 137 * @ops: pointer to callbacks for exynos drm specific functionality
 138 * @ctx: A pointer to the crtc's implementation specific context
 139 */
 140struct exynos_drm_crtc {
 141        struct drm_crtc                 base;
 142        enum exynos_drm_output_type     type;
 143        unsigned int                    pipe;
 144        struct drm_pending_vblank_event *event;
 145        wait_queue_head_t               wait_update;
 146        atomic_t                        pending_update;
 147        const struct exynos_drm_crtc_ops        *ops;
 148        void                            *ctx;
 149};
 150
 151struct exynos_drm_g2d_private {
 152        struct device           *dev;
 153        struct list_head        inuse_cmdlist;
 154        struct list_head        event_list;
 155        struct list_head        userptr_list;
 156};
 157
 158struct drm_exynos_file_private {
 159        struct exynos_drm_g2d_private   *g2d_priv;
 160        struct device                   *ipp_dev;
 161};
 162
 163/*
 164 * Exynos drm private structure.
 165 *
 166 * @da_start: start address to device address space.
 167 *      with iommu, device address space starts from this address
 168 *      otherwise default one.
 169 * @da_space_size: size of device address space.
 170 *      if 0 then default value is used for it.
 171 * @pipe: the pipe number for this crtc/manager.
 172 * @pending: the crtcs that have pending updates to finish
 173 * @lock: protect access to @pending
 174 * @wait: wait an atomic commit to finish
 175 */
 176struct exynos_drm_private {
 177        struct drm_fb_helper *fb_helper;
 178
 179        /*
 180         * created crtc object would be contained at this array and
 181         * this array is used to be aware of which crtc did it request vblank.
 182         */
 183        struct drm_crtc *crtc[MAX_CRTC];
 184        struct drm_property *plane_zpos_property;
 185
 186        unsigned long da_start;
 187        unsigned long da_space_size;
 188
 189        unsigned int pipe;
 190
 191        /* for atomic commit */
 192        u32                     pending;
 193        spinlock_t              lock;
 194        wait_queue_head_t       wait;
 195};
 196
 197/*
 198 * Exynos drm sub driver structure.
 199 *
 200 * @list: sub driver has its own list object to register to exynos drm driver.
 201 * @dev: pointer to device object for subdrv device driver.
 202 * @drm_dev: pointer to drm_device and this pointer would be set
 203 *      when sub driver calls exynos_drm_subdrv_register().
 204 * @probe: this callback would be called by exynos drm driver after
 205 *     subdrv is registered to it.
 206 * @remove: this callback is used to release resources created
 207 *     by probe callback.
 208 * @open: this would be called with drm device file open.
 209 * @close: this would be called with drm device file close.
 210 */
 211struct exynos_drm_subdrv {
 212        struct list_head list;
 213        struct device *dev;
 214        struct drm_device *drm_dev;
 215
 216        int (*probe)(struct drm_device *drm_dev, struct device *dev);
 217        void (*remove)(struct drm_device *drm_dev, struct device *dev);
 218        int (*open)(struct drm_device *drm_dev, struct device *dev,
 219                        struct drm_file *file);
 220        void (*close)(struct drm_device *drm_dev, struct device *dev,
 221                        struct drm_file *file);
 222};
 223
 224 /* This function would be called by non kms drivers such as g2d and ipp. */
 225int exynos_drm_subdrv_register(struct exynos_drm_subdrv *drm_subdrv);
 226
 227/* this function removes subdrv list from exynos drm driver */
 228int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *drm_subdrv);
 229
 230int exynos_drm_device_subdrv_probe(struct drm_device *dev);
 231int exynos_drm_device_subdrv_remove(struct drm_device *dev);
 232int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file);
 233void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file);
 234
 235#ifdef CONFIG_DRM_EXYNOS_DPI
 236struct drm_encoder *exynos_dpi_probe(struct device *dev);
 237int exynos_dpi_remove(struct drm_encoder *encoder);
 238int exynos_dpi_bind(struct drm_device *dev, struct drm_encoder *encoder);
 239#else
 240static inline struct drm_encoder *
 241exynos_dpi_probe(struct device *dev) { return NULL; }
 242static inline int exynos_dpi_remove(struct drm_encoder *encoder)
 243{
 244        return 0;
 245}
 246static inline int exynos_dpi_bind(struct drm_device *dev,
 247                                  struct drm_encoder *encoder)
 248{
 249        return 0;
 250}
 251#endif
 252
 253int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
 254                         bool async);
 255
 256
 257extern struct platform_driver fimd_driver;
 258extern struct platform_driver exynos5433_decon_driver;
 259extern struct platform_driver decon_driver;
 260extern struct platform_driver dp_driver;
 261extern struct platform_driver dsi_driver;
 262extern struct platform_driver mixer_driver;
 263extern struct platform_driver hdmi_driver;
 264extern struct platform_driver exynos_drm_common_hdmi_driver;
 265extern struct platform_driver vidi_driver;
 266extern struct platform_driver g2d_driver;
 267extern struct platform_driver fimc_driver;
 268extern struct platform_driver rotator_driver;
 269extern struct platform_driver gsc_driver;
 270extern struct platform_driver ipp_driver;
 271extern struct platform_driver mic_driver;
 272#endif
 273