1 /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License version 2 and 5 * only version 2 as published by the Free Software Foundation. 6 * 7 * This program is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 * GNU General Public License for more details. 11 */ 12 13 #ifndef _DPU_HW_CDM_H 14 #define _DPU_HW_CDM_H 15 16 #include "dpu_hw_mdss.h" 17 #include "dpu_hw_top.h" 18 #include "dpu_hw_blk.h" 19 20 struct dpu_hw_cdm; 21 22 struct dpu_hw_cdm_cfg { 23 u32 output_width; 24 u32 output_height; 25 u32 output_bit_depth; 26 u32 h_cdwn_type; 27 u32 v_cdwn_type; 28 const struct dpu_format *output_fmt; 29 u32 output_type; 30 int flags; 31 }; 32 33 enum dpu_hw_cdwn_type { 34 CDM_CDWN_DISABLE, 35 CDM_CDWN_PIXEL_DROP, 36 CDM_CDWN_AVG, 37 CDM_CDWN_COSITE, 38 CDM_CDWN_OFFSITE, 39 }; 40 41 enum dpu_hw_cdwn_output_type { 42 CDM_CDWN_OUTPUT_HDMI, 43 CDM_CDWN_OUTPUT_WB, 44 }; 45 46 enum dpu_hw_cdwn_output_bit_depth { 47 CDM_CDWN_OUTPUT_8BIT, 48 CDM_CDWN_OUTPUT_10BIT, 49 }; 50 51 /** 52 * struct dpu_hw_cdm_ops : Interface to the chroma down Hw driver functions 53 * Assumption is these functions will be called after 54 * clocks are enabled 55 * @setup_csc: Programs the csc matrix 56 * @setup_cdwn: Sets up the chroma down sub module 57 * @enable: Enables the output to interface and programs the 58 * output packer 59 * @disable: Puts the cdm in bypass mode 60 */ 61 struct dpu_hw_cdm_ops { 62 /** 63 * Programs the CSC matrix for conversion from RGB space to YUV space, 64 * it is optional to call this function as this matrix is automatically 65 * set during initialization, user should call this if it wants 66 * to program a different matrix than default matrix. 67 * @cdm: Pointer to the chroma down context structure 68 * @data Pointer to CSC configuration data 69 * return: 0 if success; error code otherwise 70 */ 71 int (*setup_csc_data)(struct dpu_hw_cdm *cdm, 72 struct dpu_csc_cfg *data); 73 74 /** 75 * Programs the Chroma downsample part. 76 * @cdm Pointer to chroma down context 77 */ 78 int (*setup_cdwn)(struct dpu_hw_cdm *cdm, 79 struct dpu_hw_cdm_cfg *cfg); 80 81 /** 82 * Enable the CDM module 83 * @cdm Pointer to chroma down context 84 */ 85 int (*enable)(struct dpu_hw_cdm *cdm, 86 struct dpu_hw_cdm_cfg *cfg); 87 88 /** 89 * Disable the CDM module 90 * @cdm Pointer to chroma down context 91 */ 92 void (*disable)(struct dpu_hw_cdm *cdm); 93 }; 94 95 struct dpu_hw_cdm { 96 struct dpu_hw_blk base; 97 struct dpu_hw_blk_reg_map hw; 98 99 /* chroma down */ 100 const struct dpu_cdm_cfg *caps; 101 enum dpu_cdm idx; 102 103 /* mdp top hw driver */ 104 struct dpu_hw_mdp *hw_mdp; 105 106 /* ops */ 107 struct dpu_hw_cdm_ops ops; 108 }; 109 110 /** 111 * dpu_hw_cdm - convert base object dpu_hw_base to container 112 * @hw: Pointer to base hardware block 113 * return: Pointer to hardware block container 114 */ 115 static inline struct dpu_hw_cdm *to_dpu_hw_cdm(struct dpu_hw_blk *hw) 116 { 117 return container_of(hw, struct dpu_hw_cdm, base); 118 } 119 120 /** 121 * dpu_hw_cdm_init - initializes the cdm hw driver object. 122 * should be called once before accessing every cdm. 123 * @idx: cdm index for which driver object is required 124 * @addr: mapped register io address of MDP 125 * @m : pointer to mdss catalog data 126 * @hw_mdp: pointer to mdp top hw driver object 127 */ 128 struct dpu_hw_cdm *dpu_hw_cdm_init(enum dpu_cdm idx, 129 void __iomem *addr, 130 struct dpu_mdss_cfg *m, 131 struct dpu_hw_mdp *hw_mdp); 132 133 /** 134 * dpu_hw_cdm_destroy - destroys CDM driver context 135 * @cdm: pointer to CDM driver context 136 */ 137 void dpu_hw_cdm_destroy(struct dpu_hw_cdm *cdm); 138 139 #endif /*_DPU_HW_CDM_H */ 140