xref: /linux/drivers/gpu/drm/imx/dc/dc-fu.h (revision 260f6f4fda93c8485c8037865c941b42b9cba5d2)
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright 2024 NXP
4  */
5 
6 #ifndef __DC_FETCHUNIT_H__
7 #define __DC_FETCHUNIT_H__
8 
9 #include <linux/bitfield.h>
10 #include <linux/bits.h>
11 #include <linux/regmap.h>
12 #include <linux/types.h>
13 
14 #include <drm/drm_fourcc.h>
15 
16 #include "dc-pe.h"
17 
18 #define FRAC_OFFSET			0x28
19 
20 #define STATICCONTROL			0x8
21 #define BURSTBUFFERMANAGEMENT		0xc
22 
23 /* COLORCOMPONENTBITS */
24 #define R_BITS(x)			FIELD_PREP_CONST(GENMASK(27, 24), (x))
25 #define G_BITS(x)			FIELD_PREP_CONST(GENMASK(19, 16), (x))
26 #define B_BITS(x)			FIELD_PREP_CONST(GENMASK(11, 8), (x))
27 #define A_BITS(x)			FIELD_PREP_CONST(GENMASK(3, 0), (x))
28 
29 /* COLORCOMPONENTSHIFT */
30 #define R_SHIFT(x)			FIELD_PREP_CONST(GENMASK(28, 24), (x))
31 #define G_SHIFT(x)			FIELD_PREP_CONST(GENMASK(20, 16), (x))
32 #define B_SHIFT(x)			FIELD_PREP_CONST(GENMASK(12, 8), (x))
33 #define A_SHIFT(x)			FIELD_PREP_CONST(GENMASK(4, 0), (x))
34 
35 /* LAYERPROPERTY */
36 #define YUVCONVERSIONMODE_MASK		GENMASK(18, 17)
37 #define YUVCONVERSIONMODE(x)		FIELD_PREP(YUVCONVERSIONMODE_MASK, (x))
38 #define SOURCEBUFFERENABLE		BIT(31)
39 
40 /* FRAMEDIMENSIONS */
41 #define FRAMEWIDTH(x)			FIELD_PREP(GENMASK(13, 0), (x))
42 #define FRAMEHEIGHT(x)			FIELD_PREP(GENMASK(29, 16), (x))
43 
44 /* CONTROL */
45 #define INPUTSELECT_MASK		GENMASK(4, 3)
46 #define INPUTSELECT(x)			FIELD_PREP(INPUTSELECT_MASK, (x))
47 #define RASTERMODE_MASK			GENMASK(2, 0)
48 #define RASTERMODE(x)			FIELD_PREP(RASTERMODE_MASK, (x))
49 
50 enum dc_yuvconversionmode {
51 	YUVCONVERSIONMODE_OFF,
52 };
53 
54 enum dc_inputselect {
55 	INPUTSELECT_INACTIVE,
56 };
57 
58 enum dc_rastermode {
59 	RASTERMODE_NORMAL,
60 };
61 
62 enum {
63 	DC_FETCHUNIT_FL0,
64 	DC_FETCHUNIT_FW2,
65 };
66 
67 enum dc_fu_frac {
68 	DC_FETCHUNIT_FRAC0,
69 	DC_FETCHUNIT_FRAC1,
70 	DC_FETCHUNIT_FRAC2,
71 	DC_FETCHUNIT_FRAC3,
72 	DC_FETCHUNIT_FRAC4,
73 	DC_FETCHUNIT_FRAC5,
74 	DC_FETCHUNIT_FRAC6,
75 	DC_FETCHUNIT_FRAC7,
76 	DC_FETCHUNIT_FRAC_NUM
77 };
78 
79 struct dc_fu;
80 struct dc_lb;
81 
82 struct dc_fu_ops {
83 	void (*init)(struct dc_fu *fu);
84 	void (*set_burstlength)(struct dc_fu *fu, dma_addr_t baddr);
85 	void (*set_baseaddress)(struct dc_fu *fu, enum dc_fu_frac frac,
86 				dma_addr_t baddr);
87 	void (*set_src_stride)(struct dc_fu *fu, enum dc_fu_frac frac,
88 			       unsigned int stride);
89 	void (*set_src_buf_dimensions)(struct dc_fu *fu, enum dc_fu_frac frac,
90 				       int w, int h);
91 	void (*set_fmt)(struct dc_fu *fu, enum dc_fu_frac frac,
92 			const struct drm_format_info *format);
93 	void (*enable_src_buf)(struct dc_fu *fu, enum dc_fu_frac frac);
94 	void (*disable_src_buf)(struct dc_fu *fu, enum dc_fu_frac frac);
95 	void (*set_framedimensions)(struct dc_fu *fu, int w, int h);
96 	void (*set_layerblend)(struct dc_fu *fu, struct dc_lb *lb);
97 	enum dc_link_id (*get_link_id)(struct dc_fu *fu);
98 	const char *(*get_name)(struct dc_fu *fu);
99 };
100 
101 struct dc_fu {
102 	struct regmap *reg_pec;
103 	struct regmap *reg_cfg;
104 	char name[21];
105 	u32 reg_baseaddr[DC_FETCHUNIT_FRAC_NUM];
106 	u32 reg_sourcebufferattributes[DC_FETCHUNIT_FRAC_NUM];
107 	u32 reg_sourcebufferdimension[DC_FETCHUNIT_FRAC_NUM];
108 	u32 reg_layeroffset[DC_FETCHUNIT_FRAC_NUM];
109 	u32 reg_clipwindowoffset[DC_FETCHUNIT_FRAC_NUM];
110 	u32 reg_clipwindowdimensions[DC_FETCHUNIT_FRAC_NUM];
111 	u32 reg_constantcolor[DC_FETCHUNIT_FRAC_NUM];
112 	u32 reg_layerproperty[DC_FETCHUNIT_FRAC_NUM];
113 	unsigned int id;
114 	enum dc_link_id link_id;
115 	struct dc_fu_ops ops;
116 	struct dc_lb *lb;
117 };
118 
119 extern const struct dc_fu_ops dc_fu_common_ops;
120 
121 void dc_fu_get_pixel_format_bits(struct dc_fu *fu, u32 format, u32 *bits);
122 void dc_fu_get_pixel_format_shifts(struct dc_fu *fu, u32 format, u32 *shifts);
123 void dc_fu_shdldreq_sticky(struct dc_fu *fu, u8 layer_mask);
124 void dc_fu_set_src_bpp(struct dc_fu *fu, enum dc_fu_frac frac, unsigned int bpp);
125 void dc_fu_common_hw_init(struct dc_fu *fu);
126 
127 const struct dc_fu_ops *dc_fu_get_ops(struct dc_fu *fu);
128 
129 #endif /* __DC_FETCHUNIT_H__ */
130