summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_cdm.h
blob: 348424df87c66a351b9e02bc7a9dd07086396431 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/* 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 dpu_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 dpu_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 */