/* 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;
};
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 */
Messung V0.5 in Prozent C=91 H=100 G=95
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-10-05)
¤
*© Formatika GbR, Deutschland