1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  */
5 
6 #include "iris_hfi_common.h"
7 #include "iris_hfi_gen2.h"
8 #include "iris_hfi_gen2_packet.h"
9 
iris_hfi_gen2_get_color_primaries(u32 primaries)10 u32 iris_hfi_gen2_get_color_primaries(u32 primaries)
11 {
12 	switch (primaries) {
13 	case V4L2_COLORSPACE_DEFAULT:
14 		return HFI_PRIMARIES_RESERVED;
15 	case V4L2_COLORSPACE_REC709:
16 		return HFI_PRIMARIES_BT709;
17 	case V4L2_COLORSPACE_470_SYSTEM_M:
18 		return HFI_PRIMARIES_BT470_SYSTEM_M;
19 	case V4L2_COLORSPACE_470_SYSTEM_BG:
20 		return HFI_PRIMARIES_BT470_SYSTEM_BG;
21 	case V4L2_COLORSPACE_SMPTE170M:
22 		return HFI_PRIMARIES_BT601_525;
23 	case V4L2_COLORSPACE_SMPTE240M:
24 		return HFI_PRIMARIES_SMPTE_ST240M;
25 	case V4L2_COLORSPACE_BT2020:
26 		return HFI_PRIMARIES_BT2020;
27 	case V4L2_COLORSPACE_DCI_P3:
28 		return HFI_PRIMARIES_SMPTE_RP431_2;
29 	default:
30 		return HFI_PRIMARIES_RESERVED;
31 	}
32 }
33 
iris_hfi_gen2_get_transfer_char(u32 characterstics)34 u32 iris_hfi_gen2_get_transfer_char(u32 characterstics)
35 {
36 	switch (characterstics) {
37 	case V4L2_XFER_FUNC_DEFAULT:
38 		return HFI_TRANSFER_RESERVED;
39 	case V4L2_XFER_FUNC_709:
40 		return HFI_TRANSFER_BT709;
41 	case V4L2_XFER_FUNC_SMPTE240M:
42 		return HFI_TRANSFER_SMPTE_ST240M;
43 	case V4L2_XFER_FUNC_SRGB:
44 		return HFI_TRANSFER_SRGB_SYCC;
45 	case V4L2_XFER_FUNC_SMPTE2084:
46 		return HFI_TRANSFER_SMPTE_ST2084_PQ;
47 	default:
48 		return HFI_TRANSFER_RESERVED;
49 	}
50 }
51 
iris_hfi_gen2_get_matrix_coefficients(u32 coefficients)52 u32 iris_hfi_gen2_get_matrix_coefficients(u32 coefficients)
53 {
54 	switch (coefficients) {
55 	case V4L2_YCBCR_ENC_DEFAULT:
56 		return HFI_MATRIX_COEFF_RESERVED;
57 	case V4L2_YCBCR_ENC_709:
58 		return HFI_MATRIX_COEFF_BT709;
59 	case V4L2_YCBCR_ENC_XV709:
60 		return HFI_MATRIX_COEFF_BT709;
61 	case V4L2_YCBCR_ENC_XV601:
62 		return HFI_MATRIX_COEFF_BT470_SYS_BG_OR_BT601_625;
63 	case V4L2_YCBCR_ENC_601:
64 		return HFI_MATRIX_COEFF_BT601_525_BT1358_525_OR_625;
65 	case V4L2_YCBCR_ENC_SMPTE240M:
66 		return HFI_MATRIX_COEFF_SMPTE_ST240;
67 	case V4L2_YCBCR_ENC_BT2020:
68 		return HFI_MATRIX_COEFF_BT2020_NON_CONSTANT;
69 	case V4L2_YCBCR_ENC_BT2020_CONST_LUM:
70 		return HFI_MATRIX_COEFF_BT2020_CONSTANT;
71 	default:
72 		return HFI_MATRIX_COEFF_RESERVED;
73 	}
74 }
75 
iris_hfi_gen2_get_color_info(u32 matrix_coeff,u32 transfer_char,u32 primaries,u32 colour_description_present_flag,u32 full_range,u32 video_format,u32 video_signal_type_present_flag)76 u32 iris_hfi_gen2_get_color_info(u32 matrix_coeff, u32 transfer_char, u32 primaries,
77 				 u32 colour_description_present_flag, u32 full_range,
78 				 u32 video_format, u32 video_signal_type_present_flag)
79 {
80 	return (matrix_coeff & 0xFF) |
81 		((transfer_char << 8) & 0xFF00) |
82 		((primaries << 16) & 0xFF0000) |
83 		((colour_description_present_flag << 24) & 0x1000000) |
84 		((full_range << 25) & 0x2000000) |
85 		((video_format << 26) & 0x1C000000) |
86 		((video_signal_type_present_flag << 29) & 0x20000000);
87 }
88 
iris_hfi_gen2_create_header(struct iris_hfi_header * hdr,u32 session_id,u32 header_id)89 static void iris_hfi_gen2_create_header(struct iris_hfi_header *hdr,
90 					u32 session_id, u32 header_id)
91 {
92 	memset(hdr, 0, sizeof(*hdr));
93 
94 	hdr->size = sizeof(*hdr);
95 	hdr->session_id = session_id;
96 	hdr->header_id = header_id;
97 	hdr->num_packets = 0;
98 }
99 
iris_hfi_gen2_create_packet(struct iris_hfi_header * hdr,u32 pkt_type,u32 pkt_flags,u32 payload_type,u32 port,u32 packet_id,void * payload,u32 payload_size)100 static void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 pkt_type,
101 					u32 pkt_flags, u32 payload_type, u32 port,
102 					u32 packet_id, void *payload, u32 payload_size)
103 {
104 	struct iris_hfi_packet *pkt = (struct iris_hfi_packet *)((u8 *)hdr + hdr->size);
105 	u32 pkt_size = sizeof(*pkt) + payload_size;
106 
107 	memset(pkt, 0, pkt_size);
108 	pkt->size = pkt_size;
109 	pkt->type = pkt_type;
110 	pkt->flags = pkt_flags;
111 	pkt->payload_info = payload_type;
112 	pkt->port = port;
113 	pkt->packet_id = packet_id;
114 	if (payload_size)
115 		memcpy(&pkt->payload[0], payload, payload_size);
116 
117 	hdr->num_packets++;
118 	hdr->size += pkt->size;
119 }
120 
iris_hfi_gen2_packet_sys_init(struct iris_core * core,struct iris_hfi_header * hdr)121 void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_header *hdr)
122 {
123 	u32 payload = 0;
124 
125 	iris_hfi_gen2_create_header(hdr, 0, core->header_id++);
126 
127 	payload = HFI_VIDEO_ARCH_LX;
128 	iris_hfi_gen2_create_packet(hdr,
129 				    HFI_CMD_INIT,
130 				    (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
131 				    HFI_HOST_FLAGS_INTR_REQUIRED |
132 				    HFI_HOST_FLAGS_NON_DISCARDABLE),
133 				    HFI_PAYLOAD_U32,
134 				    HFI_PORT_NONE,
135 				    core->packet_id++,
136 				    &payload,
137 				    sizeof(u32));
138 
139 	payload = core->iris_platform_data->ubwc_config->max_channels;
140 	iris_hfi_gen2_create_packet(hdr,
141 				    HFI_PROP_UBWC_MAX_CHANNELS,
142 				    HFI_HOST_FLAGS_NONE,
143 				    HFI_PAYLOAD_U32,
144 				    HFI_PORT_NONE,
145 				    core->packet_id++,
146 				    &payload,
147 				    sizeof(u32));
148 
149 	payload = core->iris_platform_data->ubwc_config->mal_length;
150 	iris_hfi_gen2_create_packet(hdr,
151 				    HFI_PROP_UBWC_MAL_LENGTH,
152 				    HFI_HOST_FLAGS_NONE,
153 				    HFI_PAYLOAD_U32,
154 				    HFI_PORT_NONE,
155 				    core->packet_id++,
156 				    &payload,
157 				    sizeof(u32));
158 
159 	payload = core->iris_platform_data->ubwc_config->highest_bank_bit;
160 	iris_hfi_gen2_create_packet(hdr,
161 				    HFI_PROP_UBWC_HBB,
162 				    HFI_HOST_FLAGS_NONE,
163 				    HFI_PAYLOAD_U32,
164 				    HFI_PORT_NONE,
165 				    core->packet_id++,
166 				    &payload,
167 				    sizeof(u32));
168 
169 	payload = core->iris_platform_data->ubwc_config->bank_swzl_level;
170 	iris_hfi_gen2_create_packet(hdr,
171 				    HFI_PROP_UBWC_BANK_SWZL_LEVEL1,
172 				    HFI_HOST_FLAGS_NONE,
173 				    HFI_PAYLOAD_U32,
174 				    HFI_PORT_NONE,
175 				    core->packet_id++,
176 				    &payload,
177 				    sizeof(u32));
178 
179 	payload = core->iris_platform_data->ubwc_config->bank_swz2_level;
180 	iris_hfi_gen2_create_packet(hdr,
181 				    HFI_PROP_UBWC_BANK_SWZL_LEVEL2,
182 				    HFI_HOST_FLAGS_NONE,
183 				    HFI_PAYLOAD_U32,
184 				    HFI_PORT_NONE,
185 				    core->packet_id++,
186 				    &payload,
187 				    sizeof(u32));
188 
189 	payload = core->iris_platform_data->ubwc_config->bank_swz3_level;
190 	iris_hfi_gen2_create_packet(hdr,
191 				    HFI_PROP_UBWC_BANK_SWZL_LEVEL3,
192 				    HFI_HOST_FLAGS_NONE,
193 				    HFI_PAYLOAD_U32,
194 				    HFI_PORT_NONE,
195 				    core->packet_id++,
196 				    &payload,
197 				    sizeof(u32));
198 
199 	payload = core->iris_platform_data->ubwc_config->bank_spreading;
200 	iris_hfi_gen2_create_packet(hdr,
201 				    HFI_PROP_UBWC_BANK_SPREADING,
202 				    HFI_HOST_FLAGS_NONE,
203 				    HFI_PAYLOAD_U32,
204 				    HFI_PORT_NONE,
205 				    core->packet_id++,
206 				    &payload,
207 				    sizeof(u32));
208 }
209 
iris_hfi_gen2_packet_image_version(struct iris_core * core,struct iris_hfi_header * hdr)210 void iris_hfi_gen2_packet_image_version(struct iris_core *core, struct iris_hfi_header *hdr)
211 {
212 	iris_hfi_gen2_create_header(hdr, 0, core->header_id++);
213 
214 	iris_hfi_gen2_create_packet(hdr,
215 				    HFI_PROP_IMAGE_VERSION,
216 				    (HFI_HOST_FLAGS_RESPONSE_REQUIRED |
217 				    HFI_HOST_FLAGS_INTR_REQUIRED |
218 				    HFI_HOST_FLAGS_GET_PROPERTY),
219 				    HFI_PAYLOAD_NONE,
220 				    HFI_PORT_NONE,
221 				    core->packet_id++,
222 				    NULL, 0);
223 }
224 
iris_hfi_gen2_packet_session_command(struct iris_inst * inst,u32 pkt_type,u32 flags,u32 port,u32 session_id,u32 payload_type,void * payload,u32 payload_size)225 void iris_hfi_gen2_packet_session_command(struct iris_inst *inst, u32 pkt_type,
226 					  u32 flags, u32 port, u32 session_id,
227 					  u32 payload_type, void *payload,
228 					  u32 payload_size)
229 {
230 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
231 	struct iris_core *core = inst->core;
232 
233 	iris_hfi_gen2_create_header(inst_hfi_gen2->packet, session_id, core->header_id++);
234 
235 	iris_hfi_gen2_create_packet(inst_hfi_gen2->packet,
236 				    pkt_type,
237 				    flags,
238 				    payload_type,
239 				    port,
240 				    core->packet_id++,
241 				    payload,
242 				    payload_size);
243 }
244 
iris_hfi_gen2_packet_session_property(struct iris_inst * inst,u32 pkt_type,u32 flags,u32 port,u32 payload_type,void * payload,u32 payload_size)245 void iris_hfi_gen2_packet_session_property(struct iris_inst *inst,
246 					   u32 pkt_type, u32 flags, u32 port,
247 					   u32 payload_type, void *payload, u32 payload_size)
248 {
249 	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
250 	struct iris_core *core = inst->core;
251 
252 	iris_hfi_gen2_create_header(inst_hfi_gen2->packet, inst->session_id, core->header_id++);
253 
254 	iris_hfi_gen2_create_packet(inst_hfi_gen2->packet,
255 				    pkt_type,
256 				    flags,
257 				    payload_type,
258 				    port,
259 				    core->packet_id++,
260 				    payload,
261 				    payload_size);
262 }
263 
iris_hfi_gen2_packet_sys_interframe_powercollapse(struct iris_core * core,struct iris_hfi_header * hdr)264 void iris_hfi_gen2_packet_sys_interframe_powercollapse(struct iris_core *core,
265 						       struct iris_hfi_header *hdr)
266 {
267 	u32 payload = 1; /* HFI_TRUE */
268 
269 	iris_hfi_gen2_create_header(hdr, 0 /*session_id*/, core->header_id++);
270 
271 	iris_hfi_gen2_create_packet(hdr,
272 				    HFI_PROP_INTRA_FRAME_POWER_COLLAPSE,
273 				    HFI_HOST_FLAGS_NONE,
274 				    HFI_PAYLOAD_U32,
275 				    HFI_PORT_NONE,
276 				    core->packet_id++,
277 				    &payload,
278 				    sizeof(u32));
279 }
280 
iris_hfi_gen2_packet_sys_pc_prep(struct iris_core * core,struct iris_hfi_header * hdr)281 void iris_hfi_gen2_packet_sys_pc_prep(struct iris_core *core, struct iris_hfi_header *hdr)
282 {
283 	iris_hfi_gen2_create_header(hdr, 0 /*session_id*/, core->header_id++);
284 
285 	iris_hfi_gen2_create_packet(hdr,
286 				    HFI_CMD_POWER_COLLAPSE,
287 				    HFI_HOST_FLAGS_NONE,
288 				    HFI_PAYLOAD_NONE,
289 				    HFI_PORT_NONE,
290 				    core->packet_id++,
291 				    NULL, 0);
292 }
293