1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* Copyright (c) 2020-2022, Linaro Limited */ 3 4 #ifndef _DPU_HW_DSC_H 5 #define _DPU_HW_DSC_H 6 7 #include <drm/display/drm_dsc.h> 8 9 #define DSC_MODE_SPLIT_PANEL BIT(0) 10 #define DSC_MODE_MULTIPLEX BIT(1) 11 #define DSC_MODE_VIDEO BIT(2) 12 13 struct dpu_hw_dsc; 14 15 /** 16 * struct dpu_hw_dsc_ops - interface to the dsc hardware driver functions 17 * Assumption is these functions will be called after clocks are enabled 18 */ 19 struct dpu_hw_dsc_ops { 20 /** 21 * dsc_disable - disable dsc 22 * @hw_dsc: Pointer to dsc context 23 */ 24 void (*dsc_disable)(struct dpu_hw_dsc *hw_dsc); 25 26 /** 27 * dsc_config - configures dsc encoder 28 * @hw_dsc: Pointer to dsc context 29 * @dsc: panel dsc parameters 30 * @mode: dsc topology mode to be set 31 * @initial_lines: amount of initial lines to be used 32 */ 33 void (*dsc_config)(struct dpu_hw_dsc *hw_dsc, 34 struct drm_dsc_config *dsc, 35 u32 mode, 36 u32 initial_lines); 37 38 /** 39 * dsc_config_thresh - programs panel thresholds 40 * @hw_dsc: Pointer to dsc context 41 * @dsc: panel dsc parameters 42 */ 43 void (*dsc_config_thresh)(struct dpu_hw_dsc *hw_dsc, 44 struct drm_dsc_config *dsc); 45 46 void (*dsc_bind_pingpong_blk)(struct dpu_hw_dsc *hw_dsc, 47 bool enable, 48 enum dpu_pingpong pp); 49 }; 50 51 struct dpu_hw_dsc { 52 struct dpu_hw_blk base; 53 struct dpu_hw_blk_reg_map hw; 54 55 /* dsc */ 56 enum dpu_dsc idx; 57 const struct dpu_dsc_cfg *caps; 58 59 /* ops */ 60 struct dpu_hw_dsc_ops ops; 61 }; 62 63 /** 64 * dpu_hw_dsc_init - initializes the dsc block for the passed dsc idx. 65 * @idx: DSC index for which driver object is required 66 * @addr: Mapped register io address of MDP 67 * @m: Pointer to mdss catalog data 68 * Returns: Error code or allocated dpu_hw_dsc context 69 */ 70 struct dpu_hw_dsc *dpu_hw_dsc_init(enum dpu_dsc idx, void __iomem *addr, 71 const struct dpu_mdss_cfg *m); 72 73 /** 74 * dpu_hw_dsc_destroy - destroys dsc driver context 75 * @dsc: Pointer to dsc driver context returned by dpu_hw_dsc_init 76 */ 77 void dpu_hw_dsc_destroy(struct dpu_hw_dsc *dsc); 78 79 static inline struct dpu_hw_dsc *to_dpu_hw_dsc(struct dpu_hw_blk *hw) 80 { 81 return container_of(hw, struct dpu_hw_dsc, base); 82 } 83 84 #endif /* _DPU_HW_DSC_H */ 85