blob: d77fa29f44fc64e0e69551d7343d3342a1480c5e [file] [log] [blame]
// 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);
}