18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* exynos_drm_drv.h 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (c) 2011 Samsung Electronics Co., Ltd. 58c2ecf20Sopenharmony_ci * Authors: 68c2ecf20Sopenharmony_ci * Inki Dae <inki.dae@samsung.com> 78c2ecf20Sopenharmony_ci * Joonyoung Shim <jy0922.shim@samsung.com> 88c2ecf20Sopenharmony_ci * Seung-Woo Kim <sw0312.kim@samsung.com> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef _EXYNOS_DRM_DRV_H_ 128c2ecf20Sopenharmony_ci#define _EXYNOS_DRM_DRV_H_ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/module.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <drm/drm_crtc.h> 178c2ecf20Sopenharmony_ci#include <drm/drm_device.h> 188c2ecf20Sopenharmony_ci#include <drm/drm_plane.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define MAX_CRTC 3 218c2ecf20Sopenharmony_ci#define MAX_PLANE 5 228c2ecf20Sopenharmony_ci#define MAX_FB_BUFFER 4 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define DEFAULT_WIN 0 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cistruct drm_crtc_state; 278c2ecf20Sopenharmony_cistruct drm_display_mode; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#define to_exynos_crtc(x) container_of(x, struct exynos_drm_crtc, base) 308c2ecf20Sopenharmony_ci#define to_exynos_plane(x) container_of(x, struct exynos_drm_plane, base) 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci/* this enumerates display type. */ 338c2ecf20Sopenharmony_cienum exynos_drm_output_type { 348c2ecf20Sopenharmony_ci EXYNOS_DISPLAY_TYPE_NONE, 358c2ecf20Sopenharmony_ci /* RGB or CPU Interface. */ 368c2ecf20Sopenharmony_ci EXYNOS_DISPLAY_TYPE_LCD, 378c2ecf20Sopenharmony_ci /* HDMI Interface. */ 388c2ecf20Sopenharmony_ci EXYNOS_DISPLAY_TYPE_HDMI, 398c2ecf20Sopenharmony_ci /* Virtual Display Interface. */ 408c2ecf20Sopenharmony_ci EXYNOS_DISPLAY_TYPE_VIDI, 418c2ecf20Sopenharmony_ci}; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistruct exynos_drm_rect { 448c2ecf20Sopenharmony_ci unsigned int x, y; 458c2ecf20Sopenharmony_ci unsigned int w, h; 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci/* 498c2ecf20Sopenharmony_ci * Exynos drm plane state structure. 508c2ecf20Sopenharmony_ci * 518c2ecf20Sopenharmony_ci * @base: plane_state object (contains drm_framebuffer pointer) 528c2ecf20Sopenharmony_ci * @src: rectangle of the source image data to be displayed (clipped to 538c2ecf20Sopenharmony_ci * visible part). 548c2ecf20Sopenharmony_ci * @crtc: rectangle of the target image position on hardware screen 558c2ecf20Sopenharmony_ci * (clipped to visible part). 568c2ecf20Sopenharmony_ci * @h_ratio: horizontal scaling ratio, 16.16 fixed point 578c2ecf20Sopenharmony_ci * @v_ratio: vertical scaling ratio, 16.16 fixed point 588c2ecf20Sopenharmony_ci * 598c2ecf20Sopenharmony_ci * this structure consists plane state data that will be applied to hardware 608c2ecf20Sopenharmony_ci * specific overlay info. 618c2ecf20Sopenharmony_ci */ 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistruct exynos_drm_plane_state { 648c2ecf20Sopenharmony_ci struct drm_plane_state base; 658c2ecf20Sopenharmony_ci struct exynos_drm_rect crtc; 668c2ecf20Sopenharmony_ci struct exynos_drm_rect src; 678c2ecf20Sopenharmony_ci unsigned int h_ratio; 688c2ecf20Sopenharmony_ci unsigned int v_ratio; 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistatic inline struct exynos_drm_plane_state * 728c2ecf20Sopenharmony_cito_exynos_plane_state(struct drm_plane_state *state) 738c2ecf20Sopenharmony_ci{ 748c2ecf20Sopenharmony_ci return container_of(state, struct exynos_drm_plane_state, base); 758c2ecf20Sopenharmony_ci} 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci/* 788c2ecf20Sopenharmony_ci * Exynos drm common overlay structure. 798c2ecf20Sopenharmony_ci * 808c2ecf20Sopenharmony_ci * @base: plane object 818c2ecf20Sopenharmony_ci * @index: hardware index of the overlay layer 828c2ecf20Sopenharmony_ci * 838c2ecf20Sopenharmony_ci * this structure is common to exynos SoC and its contents would be copied 848c2ecf20Sopenharmony_ci * to hardware specific overlay info. 858c2ecf20Sopenharmony_ci */ 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistruct exynos_drm_plane { 888c2ecf20Sopenharmony_ci struct drm_plane base; 898c2ecf20Sopenharmony_ci const struct exynos_drm_plane_config *config; 908c2ecf20Sopenharmony_ci unsigned int index; 918c2ecf20Sopenharmony_ci}; 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci#define EXYNOS_DRM_PLANE_CAP_DOUBLE (1 << 0) 948c2ecf20Sopenharmony_ci#define EXYNOS_DRM_PLANE_CAP_SCALE (1 << 1) 958c2ecf20Sopenharmony_ci#define EXYNOS_DRM_PLANE_CAP_ZPOS (1 << 2) 968c2ecf20Sopenharmony_ci#define EXYNOS_DRM_PLANE_CAP_TILE (1 << 3) 978c2ecf20Sopenharmony_ci#define EXYNOS_DRM_PLANE_CAP_PIX_BLEND (1 << 4) 988c2ecf20Sopenharmony_ci#define EXYNOS_DRM_PLANE_CAP_WIN_BLEND (1 << 5) 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci/* 1018c2ecf20Sopenharmony_ci * Exynos DRM plane configuration structure. 1028c2ecf20Sopenharmony_ci * 1038c2ecf20Sopenharmony_ci * @zpos: initial z-position of the plane. 1048c2ecf20Sopenharmony_ci * @type: type of the plane (primary, cursor or overlay). 1058c2ecf20Sopenharmony_ci * @pixel_formats: supported pixel formats. 1068c2ecf20Sopenharmony_ci * @num_pixel_formats: number of elements in 'pixel_formats'. 1078c2ecf20Sopenharmony_ci * @capabilities: supported features (see EXYNOS_DRM_PLANE_CAP_*) 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_cistruct exynos_drm_plane_config { 1118c2ecf20Sopenharmony_ci unsigned int zpos; 1128c2ecf20Sopenharmony_ci enum drm_plane_type type; 1138c2ecf20Sopenharmony_ci const uint32_t *pixel_formats; 1148c2ecf20Sopenharmony_ci unsigned int num_pixel_formats; 1158c2ecf20Sopenharmony_ci unsigned int capabilities; 1168c2ecf20Sopenharmony_ci}; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci/* 1198c2ecf20Sopenharmony_ci * Exynos drm crtc ops 1208c2ecf20Sopenharmony_ci * 1218c2ecf20Sopenharmony_ci * @atomic_enable: enable the device 1228c2ecf20Sopenharmony_ci * @atomic_disable: disable the device 1238c2ecf20Sopenharmony_ci * @enable_vblank: specific driver callback for enabling vblank interrupt. 1248c2ecf20Sopenharmony_ci * @disable_vblank: specific driver callback for disabling vblank interrupt. 1258c2ecf20Sopenharmony_ci * @mode_valid: specific driver callback for mode validation 1268c2ecf20Sopenharmony_ci * @atomic_check: validate state 1278c2ecf20Sopenharmony_ci * @atomic_begin: prepare device to receive an update 1288c2ecf20Sopenharmony_ci * @atomic_flush: mark the end of device update 1298c2ecf20Sopenharmony_ci * @update_plane: apply hardware specific overlay data to registers. 1308c2ecf20Sopenharmony_ci * @disable_plane: disable hardware specific overlay. 1318c2ecf20Sopenharmony_ci * @te_handler: trigger to transfer video image at the tearing effect 1328c2ecf20Sopenharmony_ci * synchronization signal if there is a page flip request. 1338c2ecf20Sopenharmony_ci */ 1348c2ecf20Sopenharmony_cistruct exynos_drm_crtc; 1358c2ecf20Sopenharmony_cistruct exynos_drm_crtc_ops { 1368c2ecf20Sopenharmony_ci void (*atomic_enable)(struct exynos_drm_crtc *crtc); 1378c2ecf20Sopenharmony_ci void (*atomic_disable)(struct exynos_drm_crtc *crtc); 1388c2ecf20Sopenharmony_ci int (*enable_vblank)(struct exynos_drm_crtc *crtc); 1398c2ecf20Sopenharmony_ci void (*disable_vblank)(struct exynos_drm_crtc *crtc); 1408c2ecf20Sopenharmony_ci enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc, 1418c2ecf20Sopenharmony_ci const struct drm_display_mode *mode); 1428c2ecf20Sopenharmony_ci bool (*mode_fixup)(struct exynos_drm_crtc *crtc, 1438c2ecf20Sopenharmony_ci const struct drm_display_mode *mode, 1448c2ecf20Sopenharmony_ci struct drm_display_mode *adjusted_mode); 1458c2ecf20Sopenharmony_ci int (*atomic_check)(struct exynos_drm_crtc *crtc, 1468c2ecf20Sopenharmony_ci struct drm_crtc_state *state); 1478c2ecf20Sopenharmony_ci void (*atomic_begin)(struct exynos_drm_crtc *crtc); 1488c2ecf20Sopenharmony_ci void (*update_plane)(struct exynos_drm_crtc *crtc, 1498c2ecf20Sopenharmony_ci struct exynos_drm_plane *plane); 1508c2ecf20Sopenharmony_ci void (*disable_plane)(struct exynos_drm_crtc *crtc, 1518c2ecf20Sopenharmony_ci struct exynos_drm_plane *plane); 1528c2ecf20Sopenharmony_ci void (*atomic_flush)(struct exynos_drm_crtc *crtc); 1538c2ecf20Sopenharmony_ci void (*te_handler)(struct exynos_drm_crtc *crtc); 1548c2ecf20Sopenharmony_ci}; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistruct exynos_drm_clk { 1578c2ecf20Sopenharmony_ci void (*enable)(struct exynos_drm_clk *clk, bool enable); 1588c2ecf20Sopenharmony_ci}; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci/* 1618c2ecf20Sopenharmony_ci * Exynos specific crtc structure. 1628c2ecf20Sopenharmony_ci * 1638c2ecf20Sopenharmony_ci * @base: crtc object. 1648c2ecf20Sopenharmony_ci * @type: one of EXYNOS_DISPLAY_TYPE_LCD and HDMI. 1658c2ecf20Sopenharmony_ci * @ops: pointer to callbacks for exynos drm specific functionality 1668c2ecf20Sopenharmony_ci * @ctx: A pointer to the crtc's implementation specific context 1678c2ecf20Sopenharmony_ci * @pipe_clk: A pointer to the crtc's pipeline clock. 1688c2ecf20Sopenharmony_ci */ 1698c2ecf20Sopenharmony_cistruct exynos_drm_crtc { 1708c2ecf20Sopenharmony_ci struct drm_crtc base; 1718c2ecf20Sopenharmony_ci enum exynos_drm_output_type type; 1728c2ecf20Sopenharmony_ci const struct exynos_drm_crtc_ops *ops; 1738c2ecf20Sopenharmony_ci void *ctx; 1748c2ecf20Sopenharmony_ci struct exynos_drm_clk *pipe_clk; 1758c2ecf20Sopenharmony_ci bool i80_mode : 1; 1768c2ecf20Sopenharmony_ci}; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_cistatic inline void exynos_drm_pipe_clk_enable(struct exynos_drm_crtc *crtc, 1798c2ecf20Sopenharmony_ci bool enable) 1808c2ecf20Sopenharmony_ci{ 1818c2ecf20Sopenharmony_ci if (crtc->pipe_clk) 1828c2ecf20Sopenharmony_ci crtc->pipe_clk->enable(crtc->pipe_clk, enable); 1838c2ecf20Sopenharmony_ci} 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_cistruct drm_exynos_file_private { 1868c2ecf20Sopenharmony_ci /* for g2d api */ 1878c2ecf20Sopenharmony_ci struct list_head inuse_cmdlist; 1888c2ecf20Sopenharmony_ci struct list_head event_list; 1898c2ecf20Sopenharmony_ci struct list_head userptr_list; 1908c2ecf20Sopenharmony_ci}; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* 1938c2ecf20Sopenharmony_ci * Exynos drm private structure. 1948c2ecf20Sopenharmony_ci * 1958c2ecf20Sopenharmony_ci * @pending: the crtcs that have pending updates to finish 1968c2ecf20Sopenharmony_ci * @lock: protect access to @pending 1978c2ecf20Sopenharmony_ci * @wait: wait an atomic commit to finish 1988c2ecf20Sopenharmony_ci */ 1998c2ecf20Sopenharmony_cistruct exynos_drm_private { 2008c2ecf20Sopenharmony_ci struct drm_fb_helper *fb_helper; 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci struct device *g2d_dev; 2038c2ecf20Sopenharmony_ci struct device *dma_dev; 2048c2ecf20Sopenharmony_ci void *mapping; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci /* for atomic commit */ 2078c2ecf20Sopenharmony_ci u32 pending; 2088c2ecf20Sopenharmony_ci spinlock_t lock; 2098c2ecf20Sopenharmony_ci wait_queue_head_t wait; 2108c2ecf20Sopenharmony_ci}; 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistatic inline struct device *to_dma_dev(struct drm_device *dev) 2138c2ecf20Sopenharmony_ci{ 2148c2ecf20Sopenharmony_ci struct exynos_drm_private *priv = dev->dev_private; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci return priv->dma_dev; 2178c2ecf20Sopenharmony_ci} 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_cistatic inline bool is_drm_iommu_supported(struct drm_device *drm_dev) 2208c2ecf20Sopenharmony_ci{ 2218c2ecf20Sopenharmony_ci struct exynos_drm_private *priv = drm_dev->dev_private; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci return priv->mapping ? true : false; 2248c2ecf20Sopenharmony_ci} 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ciint exynos_drm_register_dma(struct drm_device *drm, struct device *dev, 2278c2ecf20Sopenharmony_ci void **dma_priv); 2288c2ecf20Sopenharmony_civoid exynos_drm_unregister_dma(struct drm_device *drm, struct device *dev, 2298c2ecf20Sopenharmony_ci void **dma_priv); 2308c2ecf20Sopenharmony_civoid exynos_drm_cleanup_dma(struct drm_device *drm); 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci#ifdef CONFIG_DRM_EXYNOS_DPI 2338c2ecf20Sopenharmony_cistruct drm_encoder *exynos_dpi_probe(struct device *dev); 2348c2ecf20Sopenharmony_ciint exynos_dpi_remove(struct drm_encoder *encoder); 2358c2ecf20Sopenharmony_ciint exynos_dpi_bind(struct drm_device *dev, struct drm_encoder *encoder); 2368c2ecf20Sopenharmony_ci#else 2378c2ecf20Sopenharmony_cistatic inline struct drm_encoder * 2388c2ecf20Sopenharmony_ciexynos_dpi_probe(struct device *dev) { return NULL; } 2398c2ecf20Sopenharmony_cistatic inline int exynos_dpi_remove(struct drm_encoder *encoder) 2408c2ecf20Sopenharmony_ci{ 2418c2ecf20Sopenharmony_ci return 0; 2428c2ecf20Sopenharmony_ci} 2438c2ecf20Sopenharmony_cistatic inline int exynos_dpi_bind(struct drm_device *dev, 2448c2ecf20Sopenharmony_ci struct drm_encoder *encoder) 2458c2ecf20Sopenharmony_ci{ 2468c2ecf20Sopenharmony_ci return 0; 2478c2ecf20Sopenharmony_ci} 2488c2ecf20Sopenharmony_ci#endif 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci#ifdef CONFIG_DRM_EXYNOS_FIMC 2518c2ecf20Sopenharmony_ciint exynos_drm_check_fimc_device(struct device *dev); 2528c2ecf20Sopenharmony_ci#else 2538c2ecf20Sopenharmony_cistatic inline int exynos_drm_check_fimc_device(struct device *dev) 2548c2ecf20Sopenharmony_ci{ 2558c2ecf20Sopenharmony_ci return 0; 2568c2ecf20Sopenharmony_ci} 2578c2ecf20Sopenharmony_ci#endif 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ciint exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state, 2608c2ecf20Sopenharmony_ci bool nonblock); 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ciextern struct platform_driver fimd_driver; 2648c2ecf20Sopenharmony_ciextern struct platform_driver exynos5433_decon_driver; 2658c2ecf20Sopenharmony_ciextern struct platform_driver decon_driver; 2668c2ecf20Sopenharmony_ciextern struct platform_driver dp_driver; 2678c2ecf20Sopenharmony_ciextern struct platform_driver dsi_driver; 2688c2ecf20Sopenharmony_ciextern struct platform_driver mixer_driver; 2698c2ecf20Sopenharmony_ciextern struct platform_driver hdmi_driver; 2708c2ecf20Sopenharmony_ciextern struct platform_driver vidi_driver; 2718c2ecf20Sopenharmony_ciextern struct platform_driver g2d_driver; 2728c2ecf20Sopenharmony_ciextern struct platform_driver fimc_driver; 2738c2ecf20Sopenharmony_ciextern struct platform_driver rotator_driver; 2748c2ecf20Sopenharmony_ciextern struct platform_driver scaler_driver; 2758c2ecf20Sopenharmony_ciextern struct platform_driver gsc_driver; 2768c2ecf20Sopenharmony_ciextern struct platform_driver mic_driver; 2778c2ecf20Sopenharmony_ci#endif 278