18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2013 Red Hat 48c2ecf20Sopenharmony_ci * Author: Rob Clark <robdclark@gmail.com> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#ifndef __MDP_KMS_H__ 88c2ecf20Sopenharmony_ci#define __MDP_KMS_H__ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/clk.h> 118c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 128c2ecf20Sopenharmony_ci#include <linux/regulator/consumer.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include "msm_drv.h" 158c2ecf20Sopenharmony_ci#include "msm_kms.h" 168c2ecf20Sopenharmony_ci#include "mdp_common.xml.h" 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistruct mdp_kms; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistruct mdp_kms_funcs { 218c2ecf20Sopenharmony_ci struct msm_kms_funcs base; 228c2ecf20Sopenharmony_ci void (*set_irqmask)(struct mdp_kms *mdp_kms, uint32_t irqmask, 238c2ecf20Sopenharmony_ci uint32_t old_irqmask); 248c2ecf20Sopenharmony_ci}; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_cistruct mdp_kms { 278c2ecf20Sopenharmony_ci struct msm_kms base; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci const struct mdp_kms_funcs *funcs; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci /* irq handling: */ 328c2ecf20Sopenharmony_ci bool in_irq; 338c2ecf20Sopenharmony_ci struct list_head irq_list; /* list of mdp4_irq */ 348c2ecf20Sopenharmony_ci uint32_t vblank_mask; /* irq bits set for userspace vblank */ 358c2ecf20Sopenharmony_ci uint32_t cur_irq_mask; /* current irq mask */ 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci#define to_mdp_kms(x) container_of(x, struct mdp_kms, base) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic inline void mdp_kms_init(struct mdp_kms *mdp_kms, 408c2ecf20Sopenharmony_ci const struct mdp_kms_funcs *funcs) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci mdp_kms->funcs = funcs; 438c2ecf20Sopenharmony_ci INIT_LIST_HEAD(&mdp_kms->irq_list); 448c2ecf20Sopenharmony_ci msm_kms_init(&mdp_kms->base, &funcs->base); 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* 488c2ecf20Sopenharmony_ci * irq helpers: 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/* For transiently registering for different MDP irqs that various parts 528c2ecf20Sopenharmony_ci * of the KMS code need during setup/configuration. These are not 538c2ecf20Sopenharmony_ci * necessarily the same as what drm_vblank_get/put() are requesting, and 548c2ecf20Sopenharmony_ci * the hysteresis in drm_vblank_put() is not necessarily desirable for 558c2ecf20Sopenharmony_ci * internal housekeeping related irq usage. 568c2ecf20Sopenharmony_ci */ 578c2ecf20Sopenharmony_cistruct mdp_irq { 588c2ecf20Sopenharmony_ci struct list_head node; 598c2ecf20Sopenharmony_ci uint32_t irqmask; 608c2ecf20Sopenharmony_ci bool registered; 618c2ecf20Sopenharmony_ci void (*irq)(struct mdp_irq *irq, uint32_t irqstatus); 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_civoid mdp_dispatch_irqs(struct mdp_kms *mdp_kms, uint32_t status); 658c2ecf20Sopenharmony_civoid mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable); 668c2ecf20Sopenharmony_civoid mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); 678c2ecf20Sopenharmony_civoid mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); 688c2ecf20Sopenharmony_civoid mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); 698c2ecf20Sopenharmony_civoid mdp_irq_update(struct mdp_kms *mdp_kms); 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci/* 728c2ecf20Sopenharmony_ci * pixel format helpers: 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cistruct mdp_format { 768c2ecf20Sopenharmony_ci struct msm_format base; 778c2ecf20Sopenharmony_ci enum mdp_bpc bpc_r, bpc_g, bpc_b; 788c2ecf20Sopenharmony_ci enum mdp_bpc_alpha bpc_a; 798c2ecf20Sopenharmony_ci uint8_t unpack[4]; 808c2ecf20Sopenharmony_ci bool alpha_enable, unpack_tight; 818c2ecf20Sopenharmony_ci uint8_t cpp, unpack_count; 828c2ecf20Sopenharmony_ci enum mdp_fetch_type fetch_type; 838c2ecf20Sopenharmony_ci enum mdp_chroma_samp_type chroma_sample; 848c2ecf20Sopenharmony_ci bool is_yuv; 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci#define to_mdp_format(x) container_of(x, struct mdp_format, base) 878c2ecf20Sopenharmony_ci#define MDP_FORMAT_IS_YUV(mdp_format) ((mdp_format)->is_yuv) 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ciuint32_t mdp_get_formats(uint32_t *formats, uint32_t max_formats, bool rgb_only); 908c2ecf20Sopenharmony_ciconst struct msm_format *mdp_get_format(struct msm_kms *kms, uint32_t format, uint64_t modifier); 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci/* MDP capabilities */ 938c2ecf20Sopenharmony_ci#define MDP_CAP_SMP BIT(0) /* Shared Memory Pool */ 948c2ecf20Sopenharmony_ci#define MDP_CAP_DSC BIT(1) /* VESA Display Stream Compression */ 958c2ecf20Sopenharmony_ci#define MDP_CAP_CDM BIT(2) /* Chroma Down Module (HDMI 2.0 YUV) */ 968c2ecf20Sopenharmony_ci#define MDP_CAP_SRC_SPLIT BIT(3) /* Source Split of SSPPs */ 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/* MDP pipe capabilities */ 998c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_HFLIP BIT(0) 1008c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_VFLIP BIT(1) 1018c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_SCALE BIT(2) 1028c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_CSC BIT(3) 1038c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_DECIMATION BIT(4) 1048c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_SW_PIX_EXT BIT(5) 1058c2ecf20Sopenharmony_ci#define MDP_PIPE_CAP_CURSOR BIT(6) 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci/* MDP layer mixer caps */ 1088c2ecf20Sopenharmony_ci#define MDP_LM_CAP_DISPLAY BIT(0) 1098c2ecf20Sopenharmony_ci#define MDP_LM_CAP_WB BIT(1) 1108c2ecf20Sopenharmony_ci#define MDP_LM_CAP_PAIR BIT(2) 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_cistatic inline bool pipe_supports_yuv(uint32_t pipe_caps) 1138c2ecf20Sopenharmony_ci{ 1148c2ecf20Sopenharmony_ci return (pipe_caps & MDP_PIPE_CAP_SCALE) && 1158c2ecf20Sopenharmony_ci (pipe_caps & MDP_PIPE_CAP_CSC); 1168c2ecf20Sopenharmony_ci} 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cienum csc_type { 1198c2ecf20Sopenharmony_ci CSC_RGB2RGB = 0, 1208c2ecf20Sopenharmony_ci CSC_YUV2RGB, 1218c2ecf20Sopenharmony_ci CSC_RGB2YUV, 1228c2ecf20Sopenharmony_ci CSC_YUV2YUV, 1238c2ecf20Sopenharmony_ci CSC_MAX 1248c2ecf20Sopenharmony_ci}; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistruct csc_cfg { 1278c2ecf20Sopenharmony_ci enum csc_type type; 1288c2ecf20Sopenharmony_ci uint32_t matrix[9]; 1298c2ecf20Sopenharmony_ci uint32_t pre_bias[3]; 1308c2ecf20Sopenharmony_ci uint32_t post_bias[3]; 1318c2ecf20Sopenharmony_ci uint32_t pre_clamp[6]; 1328c2ecf20Sopenharmony_ci uint32_t post_clamp[6]; 1338c2ecf20Sopenharmony_ci}; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_cistruct csc_cfg *mdp_get_default_csc_cfg(enum csc_type); 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci#endif /* __MDP_KMS_H__ */ 138