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