Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.19 292 lines 8.3 kB view raw
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}