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