File Index
Files and directories
Sign in
FILE

iris_hfi_gen2_packet.c

File preview with syntax highlighting.

linux-6.19.14/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c C
  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
 10u32 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
 34u32 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
 52u32 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
 76u32 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
 89static 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
100static 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
121void 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
210void 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
225void 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
245void 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
264void 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
281void 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}
~/ Read-only file preview.