| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. |
| */ |
| |
| #include "iris_hfi_common.h" |
| #include "iris_hfi_gen2.h" |
| #include "iris_hfi_gen2_packet.h" |
| |
| u32 iris_hfi_gen2_get_color_primaries(u32 primaries) |
| { |
| switch (primaries) { |
| case V4L2_COLORSPACE_DEFAULT: |
| return HFI_PRIMARIES_RESERVED; |
| case V4L2_COLORSPACE_REC709: |
| return HFI_PRIMARIES_BT709; |
| case V4L2_COLORSPACE_470_SYSTEM_M: |
| return HFI_PRIMARIES_BT470_SYSTEM_M; |
| case V4L2_COLORSPACE_470_SYSTEM_BG: |
| return HFI_PRIMARIES_BT470_SYSTEM_BG; |
| case V4L2_COLORSPACE_SMPTE170M: |
| return HFI_PRIMARIES_BT601_525; |
| case V4L2_COLORSPACE_SMPTE240M: |
| return HFI_PRIMARIES_SMPTE_ST240M; |
| case V4L2_COLORSPACE_BT2020: |
| return HFI_PRIMARIES_BT2020; |
| case V4L2_COLORSPACE_DCI_P3: |
| return HFI_PRIMARIES_SMPTE_RP431_2; |
| default: |
| return HFI_PRIMARIES_RESERVED; |
| } |
| } |
| |
| u32 iris_hfi_gen2_get_transfer_char(u32 characterstics) |
| { |
| switch (characterstics) { |
| case V4L2_XFER_FUNC_DEFAULT: |
| return HFI_TRANSFER_RESERVED; |
| case V4L2_XFER_FUNC_709: |
| return HFI_TRANSFER_BT709; |
| case V4L2_XFER_FUNC_SMPTE240M: |
| return HFI_TRANSFER_SMPTE_ST240M; |
| case V4L2_XFER_FUNC_SRGB: |
| return HFI_TRANSFER_SRGB_SYCC; |
| case V4L2_XFER_FUNC_SMPTE2084: |
| return HFI_TRANSFER_SMPTE_ST2084_PQ; |
| default: |
| return HFI_TRANSFER_RESERVED; |
| } |
| } |
| |
| u32 iris_hfi_gen2_get_matrix_coefficients(u32 coefficients) |
| { |
| switch (coefficients) { |
| case V4L2_YCBCR_ENC_DEFAULT: |
| return HFI_MATRIX_COEFF_RESERVED; |
| case V4L2_YCBCR_ENC_709: |
| return HFI_MATRIX_COEFF_BT709; |
| case V4L2_YCBCR_ENC_XV709: |
| return HFI_MATRIX_COEFF_BT709; |
| case V4L2_YCBCR_ENC_XV601: |
| return HFI_MATRIX_COEFF_BT470_SYS_BG_OR_BT601_625; |
| case V4L2_YCBCR_ENC_601: |
| return HFI_MATRIX_COEFF_BT601_525_BT1358_525_OR_625; |
| case V4L2_YCBCR_ENC_SMPTE240M: |
| return HFI_MATRIX_COEFF_SMPTE_ST240; |
| case V4L2_YCBCR_ENC_BT2020: |
| return HFI_MATRIX_COEFF_BT2020_NON_CONSTANT; |
| case V4L2_YCBCR_ENC_BT2020_CONST_LUM: |
| return HFI_MATRIX_COEFF_BT2020_CONSTANT; |
| default: |
| return HFI_MATRIX_COEFF_RESERVED; |
| } |
| } |
| |
| u32 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) |
| { |
| return (matrix_coeff & 0xFF) | |
| ((transfer_char << 8) & 0xFF00) | |
| ((primaries << 16) & 0xFF0000) | |
| ((colour_description_present_flag << 24) & 0x1000000) | |
| ((full_range << 25) & 0x2000000) | |
| ((video_format << 26) & 0x1C000000) | |
| ((video_signal_type_present_flag << 29) & 0x20000000); |
| } |
| |
| static void iris_hfi_gen2_create_header(struct iris_hfi_header *hdr, |
| u32 session_id, u32 header_id) |
| { |
| memset(hdr, 0, sizeof(*hdr)); |
| |
| hdr->size = sizeof(*hdr); |
| hdr->session_id = session_id; |
| hdr->header_id = header_id; |
| hdr->num_packets = 0; |
| } |
| |
| static void 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) |
| { |
| struct iris_hfi_packet *pkt = (struct iris_hfi_packet *)((u8 *)hdr + hdr->size); |
| u32 pkt_size = sizeof(*pkt) + payload_size; |
| |
| memset(pkt, 0, pkt_size); |
| pkt->size = pkt_size; |
| pkt->type = pkt_type; |
| pkt->flags = pkt_flags; |
| pkt->payload_info = payload_type; |
| pkt->port = port; |
| pkt->packet_id = packet_id; |
| if (payload_size) |
| memcpy(&pkt->payload[0], payload, payload_size); |
| |
| hdr->num_packets++; |
| hdr->size += pkt->size; |
| } |
| |
| void iris_hfi_gen2_packet_sys_init(struct iris_core *core, struct iris_hfi_header *hdr) |
| { |
| u32 payload = 0; |
| |
| iris_hfi_gen2_create_header(hdr, 0, core->header_id++); |
| |
| payload = HFI_VIDEO_ARCH_LX; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_CMD_INIT, |
| (HFI_HOST_FLAGS_RESPONSE_REQUIRED | |
| HFI_HOST_FLAGS_INTR_REQUIRED | |
| HFI_HOST_FLAGS_NON_DISCARDABLE), |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->max_channels; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_MAX_CHANNELS, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->mal_length; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_MAL_LENGTH, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->highest_bank_bit; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_HBB, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->bank_swzl_level; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_BANK_SWZL_LEVEL1, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->bank_swz2_level; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_BANK_SWZL_LEVEL2, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->bank_swz3_level; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_BANK_SWZL_LEVEL3, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| |
| payload = core->iris_platform_data->ubwc_config->bank_spreading; |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_UBWC_BANK_SPREADING, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| } |
| |
| void iris_hfi_gen2_packet_image_version(struct iris_core *core, struct iris_hfi_header *hdr) |
| { |
| iris_hfi_gen2_create_header(hdr, 0, core->header_id++); |
| |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_IMAGE_VERSION, |
| (HFI_HOST_FLAGS_RESPONSE_REQUIRED | |
| HFI_HOST_FLAGS_INTR_REQUIRED | |
| HFI_HOST_FLAGS_GET_PROPERTY), |
| HFI_PAYLOAD_NONE, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| NULL, 0); |
| } |
| |
| void 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) |
| { |
| struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst); |
| struct iris_core *core = inst->core; |
| |
| iris_hfi_gen2_create_header(inst_hfi_gen2->packet, session_id, core->header_id++); |
| |
| iris_hfi_gen2_create_packet(inst_hfi_gen2->packet, |
| pkt_type, |
| flags, |
| payload_type, |
| port, |
| core->packet_id++, |
| payload, |
| payload_size); |
| } |
| |
| void 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) |
| { |
| struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst); |
| struct iris_core *core = inst->core; |
| |
| iris_hfi_gen2_create_header(inst_hfi_gen2->packet, inst->session_id, core->header_id++); |
| |
| iris_hfi_gen2_create_packet(inst_hfi_gen2->packet, |
| pkt_type, |
| flags, |
| payload_type, |
| port, |
| core->packet_id++, |
| payload, |
| payload_size); |
| } |
| |
| void iris_hfi_gen2_packet_sys_interframe_powercollapse(struct iris_core *core, |
| struct iris_hfi_header *hdr) |
| { |
| u32 payload = 1; /* HFI_TRUE */ |
| |
| iris_hfi_gen2_create_header(hdr, 0 /*session_id*/, core->header_id++); |
| |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_PROP_INTRA_FRAME_POWER_COLLAPSE, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_U32, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| &payload, |
| sizeof(u32)); |
| } |
| |
| void iris_hfi_gen2_packet_sys_pc_prep(struct iris_core *core, struct iris_hfi_header *hdr) |
| { |
| iris_hfi_gen2_create_header(hdr, 0 /*session_id*/, core->header_id++); |
| |
| iris_hfi_gen2_create_packet(hdr, |
| HFI_CMD_POWER_COLLAPSE, |
| HFI_HOST_FLAGS_NONE, |
| HFI_PAYLOAD_NONE, |
| HFI_PORT_NONE, |
| core->packet_id++, |
| NULL, 0); |
| } |