| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Copyright (c) 2023, The Linux Foundation. All rights reserved. |
| */ |
| |
| #ifndef _DPU_HW_CDM_H |
| #define _DPU_HW_CDM_H |
| |
| #include "dpu_hw_mdss.h" |
| #include "dpu_hw_top.h" |
| |
| struct dpu_hw_cdm; |
| |
| /** |
| * struct dpu_hw_cdm_cfg : current configuration of CDM block |
| * |
| * @output_width: output ROI width of CDM block |
| * @output_height: output ROI height of CDM block |
| * @output_bit_depth: output bit-depth of CDM block |
| * @h_cdwn_type: downsample type used for horizontal pixels |
| * @v_cdwn_type: downsample type used for vertical pixels |
| * @output_fmt: handle to msm_format of CDM block |
| * @csc_cfg: handle to CSC matrix programmed for CDM block |
| * @output_type: interface to which CDM is paired (HDMI/WB) |
| * @pp_id: ping-pong block to which CDM is bound to |
| */ |
| struct dpu_hw_cdm_cfg { |
| u32 output_width; |
| u32 output_height; |
| u32 output_bit_depth; |
| u32 h_cdwn_type; |
| u32 v_cdwn_type; |
| const struct msm_format *output_fmt; |
| const struct dpu_csc_cfg *csc_cfg; |
| u32 output_type; |
| int pp_id; |
| }; |
| |
| /* |
| * These values are used indicate which type of downsample is used |
| * in the horizontal/vertical direction for the CDM block. |
| */ |
| enum dpu_hw_cdwn_type { |
| CDM_CDWN_DISABLE, |
| CDM_CDWN_PIXEL_DROP, |
| CDM_CDWN_AVG, |
| CDM_CDWN_COSITE, |
| CDM_CDWN_OFFSITE, |
| }; |
| |
| /* |
| * CDM block can be paired with WB or HDMI block. These values match |
| * the input with which the CDM block is paired. |
| */ |
| enum dpu_hw_cdwn_output_type { |
| CDM_CDWN_OUTPUT_HDMI, |
| CDM_CDWN_OUTPUT_WB, |
| }; |
| |
| /* |
| * CDM block can give an 8-bit or 10-bit output. These values |
| * are used to indicate the output bit depth of CDM block |
| */ |
| enum dpu_hw_cdwn_output_bit_depth { |
| CDM_CDWN_OUTPUT_8BIT, |
| CDM_CDWN_OUTPUT_10BIT, |
| }; |
| |
| /* |
| * CDM block can downsample using different methods. These values |
| * are used to indicate the downsample method which can be used |
| * either in the horizontal or vertical direction. |
| */ |
| enum dpu_hw_cdwn_op_mode_method_h_v { |
| CDM_CDWN2_METHOD_PIXEL_DROP, |
| CDM_CDWN2_METHOD_AVG, |
| CDM_CDWN2_METHOD_COSITE, |
| CDM_CDWN2_METHOD_OFFSITE |
| }; |
| |
| /** |
| * struct dpu_hw_cdm_ops : Interface to the chroma down Hw driver functions |
| * Assumption is these functions will be called after |
| * clocks are enabled |
| * @enable: Enables the output to interface and programs the |
| * output packer |
| * @bind_pingpong_blk: enable/disable the connection with pingpong which |
| * will feed pixels to this cdm |
| */ |
| struct dpu_hw_cdm_ops { |
| /** |
| * Enable the CDM module |
| * @cdm Pointer to chroma down context |
| */ |
| int (*enable)(struct dpu_hw_cdm *cdm, struct dpu_hw_cdm_cfg *cfg); |
| |
| /** |
| * Enable/disable the connection with pingpong |
| * @cdm Pointer to chroma down context |
| * @pp pingpong block id. |
| */ |
| void (*bind_pingpong_blk)(struct dpu_hw_cdm *cdm, const enum dpu_pingpong pp); |
| }; |
| |
| /** |
| * struct dpu_hw_cdm - cdm description |
| * @base: Hardware block base structure |
| * @hw: Block hardware details |
| * @idx: CDM index |
| * @caps: Pointer to cdm_cfg |
| * @ops: handle to operations possible for this CDM |
| */ |
| struct dpu_hw_cdm { |
| struct dpu_hw_blk base; |
| struct dpu_hw_blk_reg_map hw; |
| |
| /* chroma down */ |
| const struct dpu_cdm_cfg *caps; |
| enum dpu_cdm idx; |
| |
| /* ops */ |
| struct dpu_hw_cdm_ops ops; |
| }; |
| |
| /** |
| * dpu_hw_cdm_init - initializes the cdm hw driver object. |
| * should be called once before accessing every cdm. |
| * @dev: DRM device handle |
| * @cdm: CDM catalog entry for which driver object is required |
| * @addr : mapped register io address of MDSS |
| * @mdss_rev: mdss hw core revision |
| */ |
| struct dpu_hw_cdm *dpu_hw_cdm_init(struct drm_device *dev, |
| const struct dpu_cdm_cfg *cdm, void __iomem *addr, |
| const struct dpu_mdss_version *mdss_rev); |
| |
| static inline struct dpu_hw_cdm *to_dpu_hw_cdm(struct dpu_hw_blk *hw) |
| { |
| return container_of(hw, struct dpu_hw_cdm, base); |
| } |
| |
| #endif /*_DPU_HW_CDM_H */ |