1caab277bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 214be3200SRob Clark /* 314be3200SRob Clark * Copyright (C) 2013 Red Hat 414be3200SRob Clark * Author: Rob Clark <robdclark@gmail.com> 514be3200SRob Clark */ 614be3200SRob Clark 714be3200SRob Clark #ifndef __MDP_KMS_H__ 814be3200SRob Clark #define __MDP_KMS_H__ 914be3200SRob Clark 1014be3200SRob Clark #include <linux/clk.h> 1114be3200SRob Clark #include <linux/platform_device.h> 1214be3200SRob Clark #include <linux/regulator/consumer.h> 1314be3200SRob Clark 1414be3200SRob Clark #include "msm_drv.h" 1514be3200SRob Clark #include "msm_kms.h" 1614be3200SRob Clark #include "mdp_common.xml.h" 1714be3200SRob Clark 1814be3200SRob Clark struct mdp_kms; 1914be3200SRob Clark 2014be3200SRob Clark struct mdp_kms_funcs { 2114be3200SRob Clark struct msm_kms_funcs base; 2214be3200SRob Clark void (*set_irqmask)(struct mdp_kms *mdp_kms, uint32_t irqmask, 2314be3200SRob Clark uint32_t old_irqmask); 2414be3200SRob Clark }; 2514be3200SRob Clark 2614be3200SRob Clark struct mdp_kms { 2714be3200SRob Clark struct msm_kms base; 2814be3200SRob Clark 2914be3200SRob Clark const struct mdp_kms_funcs *funcs; 3014be3200SRob Clark 3114be3200SRob Clark /* irq handling: */ 3214be3200SRob Clark bool in_irq; 3314be3200SRob Clark struct list_head irq_list; /* list of mdp4_irq */ 3414be3200SRob Clark uint32_t vblank_mask; /* irq bits set for userspace vblank */ 3514be3200SRob Clark uint32_t cur_irq_mask; /* current irq mask */ 3614be3200SRob Clark }; 3714be3200SRob Clark #define to_mdp_kms(x) container_of(x, struct mdp_kms, base) 3814be3200SRob Clark 3914be3200SRob Clark static inline void mdp_kms_init(struct mdp_kms *mdp_kms, 4014be3200SRob Clark const struct mdp_kms_funcs *funcs) 4114be3200SRob Clark { 4214be3200SRob Clark mdp_kms->funcs = funcs; 4314be3200SRob Clark INIT_LIST_HEAD(&mdp_kms->irq_list); 4414be3200SRob Clark msm_kms_init(&mdp_kms->base, &funcs->base); 4514be3200SRob Clark } 4614be3200SRob Clark 4714be3200SRob Clark /* 4814be3200SRob Clark * irq helpers: 4914be3200SRob Clark */ 5014be3200SRob Clark 5114be3200SRob Clark /* For transiently registering for different MDP irqs that various parts 5214be3200SRob Clark * of the KMS code need during setup/configuration. These are not 5314be3200SRob Clark * necessarily the same as what drm_vblank_get/put() are requesting, and 5414be3200SRob Clark * the hysteresis in drm_vblank_put() is not necessarily desirable for 5514be3200SRob Clark * internal housekeeping related irq usage. 5614be3200SRob Clark */ 5714be3200SRob Clark struct mdp_irq { 5814be3200SRob Clark struct list_head node; 5914be3200SRob Clark uint32_t irqmask; 6014be3200SRob Clark bool registered; 6114be3200SRob Clark void (*irq)(struct mdp_irq *irq, uint32_t irqstatus); 6214be3200SRob Clark }; 6314be3200SRob Clark 6414be3200SRob Clark void mdp_dispatch_irqs(struct mdp_kms *mdp_kms, uint32_t status); 6514be3200SRob Clark void mdp_update_vblank_mask(struct mdp_kms *mdp_kms, uint32_t mask, bool enable); 6614be3200SRob Clark void mdp_irq_wait(struct mdp_kms *mdp_kms, uint32_t irqmask); 6714be3200SRob Clark void mdp_irq_register(struct mdp_kms *mdp_kms, struct mdp_irq *irq); 6814be3200SRob Clark void mdp_irq_unregister(struct mdp_kms *mdp_kms, struct mdp_irq *irq); 6914be3200SRob Clark void mdp_irq_update(struct mdp_kms *mdp_kms); 7014be3200SRob Clark 7114be3200SRob Clark /* 7214be3200SRob Clark * pixel format helpers: 7314be3200SRob Clark */ 7414be3200SRob Clark 7514be3200SRob Clark struct mdp_format { 7614be3200SRob Clark struct msm_format base; 7714be3200SRob Clark enum mdp_bpc bpc_r, bpc_g, bpc_b; 7814be3200SRob Clark enum mdp_bpc_alpha bpc_a; 7914be3200SRob Clark uint8_t unpack[4]; 8014be3200SRob Clark bool alpha_enable, unpack_tight; 8114be3200SRob Clark uint8_t cpp, unpack_count; 8214be3200SRob Clark enum mdp_fetch_type fetch_type; 8314be3200SRob Clark enum mdp_chroma_samp_type chroma_sample; 8414be3200SRob Clark bool is_yuv; 8514be3200SRob Clark }; 8614be3200SRob Clark #define to_mdp_format(x) container_of(x, struct mdp_format, base) 8714be3200SRob Clark #define MDP_FORMAT_IS_YUV(mdp_format) ((mdp_format)->is_yuv) 8814be3200SRob Clark 8914be3200SRob Clark uint32_t mdp_get_formats(uint32_t *formats, uint32_t max_formats, bool rgb_only); 90f2f3df0aSJeykumar Sankaran const struct msm_format *mdp_get_format(struct msm_kms *kms, uint32_t format, uint64_t modifier); 9114be3200SRob Clark 9214be3200SRob Clark /* MDP capabilities */ 9314be3200SRob Clark #define MDP_CAP_SMP BIT(0) /* Shared Memory Pool */ 9414be3200SRob Clark #define MDP_CAP_DSC BIT(1) /* VESA Display Stream Compression */ 9514be3200SRob Clark #define MDP_CAP_CDM BIT(2) /* Chroma Down Module (HDMI 2.0 YUV) */ 9614be3200SRob Clark #define MDP_CAP_SRC_SPLIT BIT(3) /* Source Split of SSPPs */ 9714be3200SRob Clark 9814be3200SRob Clark /* MDP pipe capabilities */ 9914be3200SRob Clark #define MDP_PIPE_CAP_HFLIP BIT(0) 10014be3200SRob Clark #define MDP_PIPE_CAP_VFLIP BIT(1) 10114be3200SRob Clark #define MDP_PIPE_CAP_SCALE BIT(2) 10214be3200SRob Clark #define MDP_PIPE_CAP_CSC BIT(3) 10314be3200SRob Clark #define MDP_PIPE_CAP_DECIMATION BIT(4) 10414be3200SRob Clark #define MDP_PIPE_CAP_SW_PIX_EXT BIT(5) 10514be3200SRob Clark #define MDP_PIPE_CAP_CURSOR BIT(6) 10614be3200SRob Clark 10714be3200SRob Clark /* MDP layer mixer caps */ 10814be3200SRob Clark #define MDP_LM_CAP_DISPLAY BIT(0) 10914be3200SRob Clark #define MDP_LM_CAP_WB BIT(1) 11014be3200SRob Clark #define MDP_LM_CAP_PAIR BIT(2) 11114be3200SRob Clark 11214be3200SRob Clark static inline bool pipe_supports_yuv(uint32_t pipe_caps) 11314be3200SRob Clark { 11414be3200SRob Clark return (pipe_caps & MDP_PIPE_CAP_SCALE) && 11514be3200SRob Clark (pipe_caps & MDP_PIPE_CAP_CSC); 11614be3200SRob Clark } 11714be3200SRob Clark 11814be3200SRob Clark enum csc_type { 11914be3200SRob Clark CSC_RGB2RGB = 0, 12014be3200SRob Clark CSC_YUV2RGB, 12114be3200SRob Clark CSC_RGB2YUV, 12214be3200SRob Clark CSC_YUV2YUV, 12314be3200SRob Clark CSC_MAX 12414be3200SRob Clark }; 12514be3200SRob Clark 12614be3200SRob Clark struct csc_cfg { 12714be3200SRob Clark enum csc_type type; 12814be3200SRob Clark uint32_t matrix[9]; 12914be3200SRob Clark uint32_t pre_bias[3]; 13014be3200SRob Clark uint32_t post_bias[3]; 13114be3200SRob Clark uint32_t pre_clamp[6]; 13214be3200SRob Clark uint32_t post_clamp[6]; 13314be3200SRob Clark }; 13414be3200SRob Clark 13514be3200SRob Clark struct csc_cfg *mdp_get_default_csc_cfg(enum csc_type); 13614be3200SRob Clark 13714be3200SRob Clark #endif /* __MDP_KMS_H__ */ 138