Преглед на файлове

msm: vidc: initial hfi packetization changes

Initial HFI packetization changes.

Change-Id: If09b93acf6aef55acc32b03b369989896d59f5e8
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil преди 4 години
родител
ревизия
4b08bf5e4d

+ 151 - 0
driver/vidc/inc/hfi_command.h

@@ -0,0 +1,151 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef __H_HFI_COMMAND_H__
+#define __H_HFI_COMMAND_H__
+
+#define HFI_VIDEO_ARCH_OX               0x1
+
+struct hfi_header {
+	u32 size;
+	u32 session_id;
+	u32 header_id;
+	u32 reserved[4];
+	u32 num_packets;
+};
+
+struct hfi_packet {
+	u32 size;
+	u32 type;
+	u32 flags;
+	u32 payload_info;
+	u32 port;
+	u32 packet_id;
+	u32 reserved[2];
+};
+
+struct hfi_buffer {
+	u32 type;
+	u32 index;
+	u64 base_address;
+	u32 addr_offset;
+	u32 buffer_size;
+	u32 data_offset;
+	u32 data_size;
+	u32 flags;
+	u64 timestamp;
+	u32 reserved[5];
+};
+
+enum hfi_packet_host_flags {
+	HFI_HOST_FLAGS_NONE              = 0,
+	HFI_HOST_FLAGS_INTR_REQUIRED     = BIT(0),
+	HFI_HOST_FLAGS_RESPONSE_REQUIRED = BIT(1),
+	HFI_HOST_FLAGS_NON_DISCARDABLE   = BIT(2),
+	HFI_HOST_FLAGS_GET_PROPERTY      = BIT(3),
+};
+
+enum hfi_packet_firmware_flags {
+	HFI_FW_FLAGS_NONE          = 0,
+	HFI_FW_FLAGS_SUCCESS       = BIT(0),
+	HFI_FW_FLAGS_INFORMATION   = BIT(1),
+	HFI_FW_FLAGS_SESSION_ERROR = BIT(2),
+	HFI_FW_FLAGS_SYSTEM_ERROR  = BIT(3),
+};
+
+enum hfi_packet_payload_info {
+	HFI_PAYLOAD_NONE      = 0x00000000,
+	HFI_PAYLOAD_U32       = 0x00000001,
+	HFI_PAYLOAD_S32       = 0x00000002,
+	HFI_PAYLOAD_U64       = 0x00000003,
+	HFI_PAYLOAD_S64       = 0x00000004,
+	HFI_PAYLOAD_STRUCTURE = 0x00000005,
+	HFI_PAYLOAD_BLOB      = 0x00000006,
+	HFI_PAYLOAD_STRING    = 0x00000007,
+	HFI_PAYLOAD_Q16       = 0x00000008,
+	HFI_PAYLOAD_U32_ENUM  = 0x00000009,
+	HFI_PAYLOAD_32_PACKED = 0x0000000a,
+	HFI_PAYLOAD_U32_ARRAY = 0x0000000b,
+	HFI_PAYLOAD_S32_ARRAY = 0x0000000c,
+};
+
+enum hfi_packet_port_type {
+	HFI_PORT_NONE      = 0,
+	HFI_PORT_BITSTREAM = BIT(0),
+	HFI_PORT_RAW       = BIT(1),
+};
+
+enum hfi_buffer_type {
+	HFI_BUFFER_BITSTREAM  = 0x00000001,
+	HFI_BUFFER_RAW        = 0x00000002,
+	HFI_BUFFER_METADATA   = 0x00000003,
+	HFI_BUFFER_DPB        = 0x00000010,
+	HFI_BUFFER_BIN        = 0x00000011,
+	HFI_BUFFER_LINE       = 0x00000012,
+	HFI_BUFFER_ARP        = 0x00000013,
+	HFI_BUFFER_COMV       = 0x00000014,
+	HFI_BUFFER_NON_COMV   = 0x00000015,
+	HFI_BUFFER_SUBCACHE   = 0x00000020,
+	HFI_BUFFER_SFR        = 0x00000021,
+};
+
+enum hfi_buffer_host_flags {
+	HFI_BUF_HOST_FLAG_NONE           = 0,
+	HFI_BUF_HOST_FLAG_RELEASE        = BIT(0),
+	HFI_BUF_HOST_FLAG_READONLY       = BIT(1),
+	HFI_BUF_HOST_FLAG_CODEC_CONFIG   = BIT(2),
+};
+
+enum hfi_buffer_firmware_flags {
+	HFI_BUF_FW_FLAG_NONE           = 0,
+	HFI_BUF_FW_FLAG_LAST           = BIT(0),
+	HFI_BUF_FW_FLAG_READONLY       = BIT(1),
+	HFI_BUF_FW_FLAG_CODEC_CONFIG   = BIT(2),
+};
+
+enum hfi_metapayload_header_flags {
+	HFI_METADATA_FLAGS_NONE           = 0,
+	HFI_METADATA_FLAGS_TOP_FIELD      = BIT(0),
+	HFI_METADATA_FLAGS_BOTTOM_FIELDS  = BIT(1),
+};
+
+struct metabuf_header {
+	u32 count;
+	u32 size;
+	u32 version;
+	u32 reserved[5];
+};
+
+struct metapayload_header {
+	u32 type;
+	u32 size;
+	u32 version;
+	u32 offset;
+	u32 flags;
+	u32 reserved[3];
+};
+
+enum hfi_property_mode_type {
+	HFI_MODE_NONE = 0,
+	HFI_MODE_PORT_SETTINGS_CHANGE = BIT(0),
+	HFI_MODE_PROPERTY = BIT(1),
+	HFI_MODE_METADATA = BIT(2),
+};
+
+#define HFI_CMD_INIT                                            0x1
+#define HFI_CMD_POWER_COLLAPSE                                  0x2
+#define HFI_CMD_OPEN                                            0x3
+#define HFI_CMD_CLOSE                                           0x4
+#define HFI_CMD_START                                           0x5
+#define HFI_CMD_STOP                                            0x6
+#define HFI_CMD_DRAIN                                           0x7
+#define HFI_CMD_RESUME                                          0x8
+#define HFI_CMD_BUFFER                                          0x9
+#define HFI_CMD_DELIVERY_MODE                                   0xA
+#define HFI_CMD_SUBSCRIBE_MODE                                  0xB
+#define HFI_CMD_SETTINGS_CHANGE                                 0xC
+
+
+#endif //__H_HFI_COMMAND_H__

+ 30 - 0
driver/vidc/inc/hfi_definition.h

@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef __H_HFI_DEFINITION_H__
+#define __H_HFI_DEFINITION_H__
+
+typedef u8 HFI_U8;
+typedef s8 HFI_S8;
+typedef u16 HFI_U16;
+typedef s16 HFI_S16;
+typedef u32 HFI_U32;
+typedef s32 HFI_S32;
+typedef u64 HFI_U64;
+
+typedef HFI_U32 HFI_BOOL;
+#define  HFI_FALSE      0
+#define  HFI_TRUE       (!HFI_FALSE)
+
+typedef HFI_U32 HFI_STATUS;
+#define  HFI_FAIL       0
+#define  HFI_SUCCESS    1
+
+#define HFI_ALIGN(a, b) (((b) & ((b) - 1)) ? \
+	(((a) + (b) - 1) / (b) * (b)) : \
+	(((a) + (b) - 1) & (~((b) - 1))))
+
+#endif // __H_HFI_DEFINITION_H__
+

+ 22 - 39
driver/vidc/inc/hfi_packet.h

@@ -9,48 +9,31 @@
 #include "msm_vidc_internal.h"
 #include "msm_vidc_inst.h"
 #include "msm_vidc_core.h"
+#include "hfi_command.h"
+#include "hfi_property.h"
+#include "hfi_definition.h"
 
-struct hfi_header {
-	u32 size;
-	u32 session_id;
-	u32 header_id;
-	u32 reserved[4];
-	u32 num_packets;
-};
-
-struct hfi_packet {
-	u32 size;
-	u32 type;
-	u32 flags;
-	u32 payload_info;
-	u32 port;
-	u32 packet_id;
-	u32 reserved[2];
-};
-
-struct hfi_buffer {
-	u32 type;
-	u32 index;
-	u64 base_address;
-	u32 addr_offset;
-	u32 buffer_size;
-	u32 data_offset;
-	u32 data_size;
-	u32 flags;
-	u64 timestamp;
-	u32 reserved[5];
-};
+int hfi_create_header(u8 *pkt, u32 session_id,
+	u32 header_id, u32 num_packets, u32 total_size);
+int hfi_create_packet(u8 *packet, u32 packet_size, u32 *offset,
+	u32 pkt_type, u32 pkt_flags, u32 payload_type, u32 port,
+	u32 packet_id, void *payload, u32 payload_size);
+int hfi_create_buffer(u8 *packet, u32 packet_size, u32 *offset,
+	enum msm_vidc_domain_type domain, struct msm_vidc_buffer *data);
 
 int hfi_packet_sys_init(struct msm_vidc_core *core,
-		void *packet, u32 packet_size);
+	u8 *pkt, u32 pkt_size);
 int hfi_packet_image_version(struct msm_vidc_core *core,
-		void *packet, u32 packet_size);
-int hfi_packet_sys_debug_config(struct msm_vidc_core *core,
-		void *packet, u32 packet_size, u32 mode);
+	u8 *pkt, u32 pkt_size);
 int hfi_packet_sys_pc_prep(struct msm_vidc_core *core,
-		void *packet, u32 packet_size);
-int hfi_packet_session_open(struct msm_vidc_inst *inst,
-		void *packet, u32 pkt_size);
-int hfi_packet_session_close(struct msm_vidc_inst *inst,
-		void *packet, u32 pkt_size);
+	u8 *pkt, u32 pkt_size);
+int hfi_packet_sys_debug_config(struct msm_vidc_core *core,
+	u8 *pkt, u32 pkt_size, u32 debug_config);
+int hfi_packet_session_command(struct msm_vidc_inst *inst,
+	u32 pkt_type, u32 flags, u32 port, u32 session_id,
+	u32 payload_type, void *payload, u32 payload_size);
+int hfi_packet_create_property(struct msm_vidc_inst *inst,
+	void *pkt, u32 pkt_size, u32 pkt_type, u32 flags,
+	u32 port, u32 payload, u32 payload_type, u32 payload_size);
 #endif // _HFI_PACKET_H_
+

+ 477 - 0
driver/vidc/inc/hfi_property.h

@@ -0,0 +1,477 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef __H_HFI_PROPERTY_H__
+#define __H_HFI_PROPERTY_H__
+
+#define HFI_PROP_BEGIN                                          0x03000000
+#define HFI_PROP_IMAGE_VERSION                                  0x03000001
+#define HFI_PROP_INTRA_FRAME_POWER_COLLAPSE                     0x03000002
+#define HFI_PROP_UBWC_MAX_CHANNELS                              0x03000003
+#define HFI_PROP_UBWC_MAL_LENGTH                                0x03000004
+#define HFI_PROP_UBWC_HBB                                       0x03000005
+#define HFI_PROP_UBWC_BANK_SWZL_LEVEL1                          0x03000006
+#define HFI_PROP_UBWC_BANK_SWZL_LEVEL2                          0x03000007
+#define HFI_PROP_UBWC_BANK_SWZL_LEVEL3                          0x03000008
+#define HFI_PROP_UBWC_BANK_SPREADING                            0x03000009
+
+enum hfi_debug_config {
+    HFI_DEBUG_CONFIG_DEFAULT    = 0,
+    HFI_DEBUG_CONFIG_CLRDBGQ    = BIT(0),
+    HFI_DEBUG_CONFIG_WFI        = BIT(1),
+    HFI_DEBUG_CONFIG_ARM9WD     = BIT(2),
+};
+#define HFI_PROP_DEBUG_CONFIG                                   0x0300000a
+
+enum hfi_debug_log_level {
+    HFI_DEBUG_LOG_NONE      = 0,
+    HFI_DEBUG_LOG_ERROR     = BIT(0),
+    HFI_DEBUG_LOG_FATAL     = BIT(1),
+    HFI_DEBUG_LOG_PERF      = BIT(2),
+    HFI_DEBUG_LOG_HIGH      = BIT(3),
+    HFI_DEBUG_LOG_MEDIUM    = BIT(4),
+    HFI_DEBUG_LOG_LOW       = BIT(5),
+};
+#define HFI_PROP_DEBUG_LOG_LEVEL                                0x0300000b
+
+enum hfi_codec_type {
+    HFI_CODEC_DECODE_AVC   = 1,
+    HFI_CODEC_ENCODE_AVC   = 2,
+    HFI_CODEC_DECODE_HEVC  = 3,
+    HFI_CODEC_ENCODE_HEVC  = 4,
+    HFI_CODEC_DECODE_VP9   = 5,
+    HFI_CODEC_DECODE_MPEG2 = 6,
+};
+#define HFI_PROP_CODEC                                          0x03000100
+
+enum hfi_color_format {
+    HFI_COLOR_FMT_OPAQUE        = 0,
+    HFI_COLOR_FMT_NV12          = 1,
+    HFI_COLOR_FMT_NV12_UBWC     = 2,
+    HFI_COLOR_FMT_P010          = 3,
+    HFI_COLOR_FMT_TP10_UBWC     = 4,
+    HFI_COLOR_FMT_RGBA8888      = 5,
+    HFI_COLOR_FMT_RGBA8888_UBWC = 6,
+    HFI_COLOR_FMT_NV21          = 7,
+};
+#define HFI_PROP_COLOR_FORMAT                                   0x03000101
+
+#define HFI_PROP_SECURE                                         0x03000102
+
+#define HFI_BITMASK_ALIGN_WIDTH      0xffff0000
+#define HFI_BITMASK_ALIGN_HEIGHT     0x0000ffff
+#define HFI_PROP_ALIGN_RESOLUTION                               0x03000103
+
+#define HFI_BITMASK_CROP_WIDTH       0xffff0000
+#define HFI_BITMASK_CROP_HEIGHT      0x0000ffff
+#define HFI_PROP_CROP_RESOLUTION                                0x03000104
+
+#define HFI_BITMASK_FRAME_COORDINATE_TOP   0xffff0000
+#define HFI_BITMASK_FRAME_COORDINATE_LEFT  0x0000ffff
+#define HFI_PROP_CROP_COORDINATE_TOP_LEFT                       0x03000105
+
+#define HFI_PROP_REALTIME                                       0x03000106
+
+enum hfi_avc_profile_type {
+    HFI_AVC_PROFILE_BASELINE             = 0,
+    HFI_AVC_PROFILE_CONSTRAINED_BASELINE = 1,
+    HFI_AVC_PROFILE_MAIN                 = 2,
+    HFI_AVC_PROFILE_HIGH                 = 4,
+    HFI_AVC_PROFILE_CONSTRAINED_HIGH     = 17
+};
+
+enum hfi_hevc_profile_type {
+    HFI_HEVC_HEVC_PROFILE_MAIN          = 0,
+    HFI_HEVC_PROFILE_MAIN_STILL_PICTURE = 1,
+    HFI_HEVC_PROFILE_MAIN_10            = 2,
+};
+
+enum hfi_vp9_profile_type {
+    HFI_VP9_PROFILE_0 = 0,
+    HFI_VP9_PROFILE_1 = 1,
+    HFI_VP9_PROFILE_2 = 2,
+    HFI_VP9_PROFILE_3 = 3,
+};
+
+enum hfi_mpeg2_profile_type {
+    HFI_MPEG2_PROFILE_SIMPLE = 0,
+    HFI_MPEG2_PROFILE_MAIN   = 1,
+};
+
+#define HFI_PROP_PROFILE                                        0x03000107
+
+enum hfi_avc_level_type {
+    HFI_AVC_LEVEL_1_0 = 0,
+    HFI_AVC_LEVEL_1B  = 1,
+    HFI_AVC_LEVEL_1_1 = 2,
+    HFI_AVC_LEVEL_1_2 = 3,
+    HFI_AVC_LEVEL_1_3 = 4,
+    HFI_AVC_LEVEL_2_0 = 5,
+    HFI_AVC_LEVEL_2_1 = 6,
+    HFI_AVC_LEVEL_2_2 = 7,
+    HFI_AVC_LEVEL_3_0 = 8,
+    HFI_AVC_LEVEL_3_1 = 9,
+    HFI_AVC_LEVEL_3_2 = 10,
+    HFI_AVC_LEVEL_4_0 = 11,
+    HFI_AVC_LEVEL_4_1 = 12,
+    HFI_AVC_LEVEL_4_2 = 13,
+    HFI_AVC_LEVEL_5_0 = 14,
+    HFI_AVC_LEVEL_5_1 = 15,
+    HFI_AVC_LEVEL_5_2 = 16,
+    HFI_AVC_LEVEL_6_0 = 17,
+    HFI_AVC_LEVEL_6_1 = 18,
+    HFI_AVC_LEVEL_6_2 = 19,
+};
+
+enum hfi_hevc_level_type {
+    HFI_HEVC_LEVEL_1   = 0,
+    HFI_HEVC_LEVEL_2   = 1,
+    HFI_HEVC_LEVEL_2_1 = 2,
+    HFI_HEVC_LEVEL_3   = 3,
+    HFI_HEVC_LEVEL_3_1 = 4,
+    HFI_HEVC_LEVEL_4   = 5,
+    HFI_HEVC_LEVEL_4_1 = 6,
+    HFI_HEVC_LEVEL_5   = 7,
+    HFI_HEVC_LEVEL_5_1 = 8,
+    HFI_HEVC_LEVEL_5_2 = 9,
+    HFI_HEVC_LEVEL_6   = 10,
+    HFI_HEVC_LEVEL_6_1 = 11,
+    HFI_HEVC_LEVEL_6_2 = 12,
+};
+
+enum hfi_vp9_level_type {
+    HFI_VP9_LEVEL_1  = 0,
+    HFI_VP9_LEVEL_11 = 1,
+    HFI_VP9_LEVEL_2  = 2,
+    HFI_VP9_LEVEL_21 = 3,
+    HFI_VP9_LEVEL_3  = 4,
+    HFI_VP9_LEVEL_31 = 5,
+    HFI_VP9_LEVEL_4  = 6,
+    HFI_VP9_LEVEL_41 = 7,
+    HFI_VP9_LEVEL_5  = 8,
+    HFI_VP9_LEVEL_51 = 9,
+    HFI_VP9_LEVEL_6  = 10,
+    HFI_VP9_LEVEL_61 = 11,
+};
+
+enum hfi_mpeg2_level_type {
+    HFI_MPEG2_LEVEL_LOW       = 0,
+    HFI_MPEG2_LEVEL_MAIN      = 1,
+    HFI_MPEG2_LEVEL_HIGH_1440 = 2,
+    HFI_MPEG2_LEVEL_HIGH      = 3,
+};
+
+enum hfi_codec_level_type {
+    HFI_LEVEL_UNKNOWN = 0xFFFFFFFF,
+};
+
+#define HFI_PROP_LEVEL                                          0x03000108
+
+
+enum hfi_hevc_tier_type {
+    HFI_HEVC_TIER_MAIN = 0,
+    HFI_HEVC_TIER_HIGH = 1,
+};
+#define HFI_PROP_TIER                                           0x03000109
+
+#define HFI_PROP_STAGE                                          0x0300010a
+
+#define HFI_PROP_PIPE                                           0x0300010b
+
+#define HFI_PROP_FRAME_RATE                                     0x0300010c
+
+#define HFI_BITMASK_CONCEAL_LUMA       0x000003ff
+#define HFI_BITMASK_CONCEAL_CB         0x000ffC00
+#define HFI_BITMASK_CONCEAL_CR         0x3ff00000
+#define HFI_PROP_CONCEAL_COLOR_8BIT                             0x0300010d
+
+#define HFI_BITMASK_CONCEAL_LUMA       0x000003ff
+#define HFI_BITMASK_CONCEAL_CB         0x000ffC00
+#define HFI_BITMASK_CONCEAL_CR         0x3ff00000
+#define HFI_PROP_CONCEAL_COLOR_10BIT                            0x0300010e
+
+#define HFI_BITMASK_LUMA_BIT_DEPTH     0xffff0000
+#define HFI_BITMASK_CHROMA_BIT_DEPTH   0x0000ffff
+#define HFI_PROP_LUMA_CHROMA_BIT_DEPTH                          0x0300010f
+
+#define HFI_BITMASK_FRAME_MBS_ONLY_FLAG           0x00000001
+#define HFI_BITMASK_MB_ADAPTIVE_FRAME_FIELD_FLAG  0x00000002
+#define HFI_PROP_CODED_FRAMES                                   0x03000120
+
+#define HFI_PROP_CABAC_SESSION                                  0x03000121
+
+#define HFI_PROP_8X8_TRANSFORM                                  0x03000122
+
+#define HFI_PROP_BUFFER_HOST_MAX_COUNT                          0x03000123
+
+#define HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT                     0x03000124
+
+#define HFI_PROP_BUFFER_MAXDPB_COUNT                            0x03000125
+
+#define HFI_PROP_BUFFER_MAX_NUM_REFERENCE                       0x03000126
+
+#define HFI_PROP_BUFFER_VUI_RESTRICTION                         0x03000127
+
+#define HFI_PROP_PIC_ORDER_CNT_TYPE                             0x03000128
+
+enum hfi_deblock_mode {
+    HFI_DB_MODE_DISABLE             = 0,
+    HFI_DB_MODE_SKIP_SLICE_BOUNDARY = BIT(0),
+    HFI_DB_MODE_ALL_BOUNDARY        = BIT(1),
+};
+#define HFI_PROP_DEBLOCKING_MODE                                0x03000129
+
+enum hfi_rate_control {
+    HFI_RC_OFF      = 0x00000000,
+    HFI_RC_VBR_CFR  = 0x00000001,
+    HFI_RC_CBR_CFR  = 0x00000002,
+    HFI_RC_CBR_VFR  = 0x00000003,
+    HFI_RC_CQ       = 0x00000004,
+    HFI_RC_LOSSLESS = 0x00000005,
+};
+#define HFI_PROP_RATE_CONTROL                                   0x0300012a
+
+#define HFI_PROP_FRAMERATE_BASED_RATE_CONTROL                   0x0300012b
+
+#define HFI_PROP_CONTENT_ADAPTIVE_CODING                        0x0300012c
+
+#define HFI_PROP_CONST_QUALITY_BITRATE_BOOST                    0x0300012d
+
+#define HFI_BITMASK_QP_I          0x000000ff
+#define HFI_BITMASK_QP_P          0x0000ff00
+#define HFI_BITMASK_QP_B          0x00ff0000
+#define HFI_BITMASK_QP_ENABLE     0x0f000000
+#define HFI_BITMASK_QP_LAYERS     0xf0000000
+#define HFI_PROP_QP_PACKED                                      0x0300012e
+
+#define HFI_PROP_MIN_QP_PACKED                                  0x0300012f
+
+#define HFI_PROP_MAX_QP_PACKED                                  0x03000130
+
+#define HFI_PROP_IR_RANDOM_PERIOD                               0x03000131
+
+#define HFI_PROP_MULTI_SLICE_MB_COUNT                           0x03000132
+
+#define HFI_PROP_MULTI_SLICE_BYTES_COUNT                        0x03000133
+
+#define HFI_PROP_LTR_COUNT                                      0x03000134
+
+#define HFI_PROP_LTR_MARK                                       0x03000135
+
+#define HFI_PROP_LTR_USE                                        0x03000136
+
+#define HFI_PROP_LTR_MARK_USE_DETAILS                           0x03000137
+
+enum hfi_layer_encoding_type {
+    HFI_HIER_P_SLIDING_WINDOW = 0x1,
+    HFI_HIER_P_HYBRID_LTR     = 0x2,
+    HFI_HIER_B                = 0x4,
+};
+#define HFI_PROP_LAYER_ENCODING_TYPE                            0x03000138
+
+#define HFI_PROP_LAYER_COUNT                                    0x03000139
+
+#define HFI_BITMASK_CHROMA_CB_OFFSET     0x0000ffff
+#define HFI_BITMASK_CHROMA_CR_OFFSET     0xffff0000
+#define HFI_PROP_CHROMA_QP_OFFSET                               0x0300013a
+
+#define HFI_PROP_TOTAL_BITRATE                                  0x0300013b
+
+#define HFI_PROP_BITRATE_LAYER1                                 0x0300013c
+
+#define HFI_PROP_BITRATE_LAYER2                                 0x0300013d
+
+#define HFI_PROP_BITRATE_LAYER3                                 0x0300013e
+
+#define HFI_PROP_BITRATE_LAYER4                                 0x0300013f
+
+#define HFI_PROP_BITRATE_LAYER5                                 0x03000140
+
+#define HFI_PROP_BITRATE_LAYER6                                 0x03000141
+
+#define HFI_PROP_BASELAYER_PRIORITYID                           0x03000142
+
+#define HFI_PROP_CONSTANT_QUALITY                               0x03000143
+
+#define HFI_PROP_HEIC_GRID_ENABLE                               0x03000144
+
+#define HFI_PROP_REQUEST_SYNC_FRAME                             0x03000145
+
+#define HFI_PROP_MAX_GOP_FRAMES                                 0x03000146
+
+#define HFI_PROP_MAX_B_FRAMES                                   0x03000147
+
+enum hfi_quality_mode {
+    HFI_MODE_MAX_QUALITY = BIT(0),
+    HFI_MODE_POWER_SAVE  = BIT(1),
+};
+#define HFI_PROP_QUALITY_MODE                                   0x03000148
+
+enum hfi_seq_header_mode {
+    HFI_SEQ_HEADER_SEPERATE_FRAME          = BIT(0),
+    HFI_SEQ_HEADER_JOINED_WITH_1ST_FRAME   = BIT(1),
+    HFI_SEQ_HEADER_PREFIX_WITH_SYNC_FRAME  = BIT(2),
+    HFI_SEQ_HEADER_METADATA                = BIT(3),
+};
+#define HFI_PROP_SEQ_HEADER_MODE                                0x03000149
+
+#define HFI_PROP_METADATA_SEQ_HEADER_NAL                        0x0300014a
+
+enum hfi_rotation {
+    HFI_ROTATION_NONE = 0x00000000,
+    HFI_ROTATION_90   = 0x00000001,
+    HFI_ROTATION_180  = 0x00000002,
+    HFI_ROTATION_270  = 0x00000003,
+};
+#define HFI_PROP_ROTATION                                       0x0300014b
+
+enum hfi_flip {
+    HFI_FLIP_NONE       = 0,
+    HFI_FLIP_HORIZONTAL = BIT(0),
+    HFI_FLIP_VERTICAL   = BIT(1),
+};
+#define HFI_PROP_FLIP                                           0x0300014c
+
+#define HFI_PROP_SCALAR                                         0x0300014d
+
+enum hfi_blur_types {
+    HFI_BLUR_NONE     = 0,
+    HFI_BLUR_EXTERNAL = BIT(0),
+    HFI_BLUR_ADAPTIVE = BIT(1),
+};
+#define HFI_PROP_BLUR_TYPES                                     0x0300014e
+
+#define HFI_BITMASK_BLUR_WIDTH        0xffff0000
+#define HFI_BITMASK_BLUR_HEIGHT       0x0000ffff
+#define HFI_PROP_BLUR_RESOLUTION                                0x0300014f
+
+#define HFI_BITMASK_SPS_ID            0x000000ff
+#define HFI_BITMASK_PPS_ID            0x0000ff00
+#define HFI_BITMASK_VPS_ID            0x00ff0000
+#define HFI_PROP_SEQUENCE_HEADER_IDS                            0x03000150
+
+#define HFI_PROP_AUD                                            0x03000151
+
+#define HFI_PROP_VUI_TIMING_INFO                                0x03000152
+
+#define HFI_PROP_DPB_LUMA_CHROMA_MISR                           0x03000153
+
+#define HFI_PROP_OPB_LUMA_CHROMA_MISR                           0x03000154
+
+#define HFI_BITMASK_QP_I               0x000000ff
+#define HFI_BITMASK_QP_P               0x0000ff00
+#define HFI_BITMASK_QP_B               0x00ff0000
+#define HFI_BITMASK_QP_ENABLE          0x0f000000
+#define HFI_BITMASK_QP_LAYERS          0xf0000000
+#define HFI_PROP_SIGNAL_COLOR_INFO                              0x03000155
+
+enum hfi_interlace_info {
+    HFI_INTERLACE_INFO_NONE                 = 0,
+    HFI_FRAME_PROGRESSIVE                   = BIT(0),
+    HFI_FRAME_MBAFF                         = BIT(1),
+    HFI_FRAME_INTERLEAVE_TOPFIELD_FIRST     = BIT(2),
+    HFI_FRAME_INTERLEAVE_BOTTOMFIELD_FIRST  = BIT(3),
+    HFI_FRAME_INTERLACE_TOPFIELD_FIRST      = BIT(4),
+    HFI_FRAME_INTERLACE_BOTTOMFIELD_FIRST   = BIT(5),
+};
+#define HFI_PROP_INTERLACE_INFO                                 0x03000156
+
+#define HFI_PROP_CSC                                            0x03000157
+
+#define HFI_PROP_CSC_MATRIX                                     0x03000158
+
+#define HFI_PROP_CSC_BIAS                                       0x03000159
+
+#define HFI_PROP_CSC_LIMIT                                      0x0300015a
+
+#define HFI_PROP_DECODE_ORDER_OUTPUT                            0x0300015b
+
+#define HFI_PROP_TIMESTAMP                                      0x0300015c
+
+#define HFI_PROP_FRAMERATE_FROM_BITSTREAM                       0x0300015d
+
+#define HFI_PROP_SEI_RECOVERY_POINT                             0x0300015e
+
+#define HFI_PROP_CONEALED_MB_COUNT                              0x0300015f
+
+#define HFI_BITMASK_SAR_WIDTH        0xffff0000
+#define HFI_BITMASK_SAR_HEIGHT       0x0000ffff
+#define HFI_PROP_SAR_RESOLUTION                                 0x03000160
+
+#define HFI_PROP_HISTOGRAM_INFO                                 0x03000161
+
+enum hfi_picture_type {
+    HFI_PICTURE_TYPE_IDR = BIT(0),
+    HFI_PICTURE_TYPE_P   = BIT(1),
+    HFI_PICTURE_TYPE_B   = BIT(2),
+    HFI_PICTURE_TYPE_I   = BIT(3),
+    HFI_PICTURE_TYPE_CRA = BIT(4),
+    HFI_PICTURE_TYPE_BLA = BIT(5),
+};
+#define HFI_PROP_PICTURE_TYPE                                   0x03000162
+
+#define HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR                   0x03000163
+
+#define HFI_PROP_SEI_CONTENT_LIGHT_LEVEL                        0x03000164
+
+#define HFI_PROP_SEI_HDR10PLUS_USERDATA                         0x03000165
+
+#define HFI_PROP_SEI_STREAM_USERDATA                            0x03000166
+
+#define HFI_PROP_CVP_STAT_INFO                                  0x03000167
+
+#define HFI_PROP_DEC_DEFAULT_HEADER                             0x03000168
+
+#define HFI_PROP_DEC_START_FROM_RAP_FRAME                       0x03000169
+
+#define HFI_PROP_TAG_NOT_PROPAGATED_TO_OUTPUT                   0x0300016a
+
+#define HFI_PROP_BUFFER_TAG                                     0x0300016b
+
+#define HFI_PROP_BUFFER_MARK                                    0x0300016c
+
+#define HFI_PROP_SUBFRAME_OUTPUT                                0x0300016d
+
+#define HFI_PROP_ENC_QP_METADATA                                0x0300016e
+
+#define HFI_PROP_DEC_QP_METADATA                                0x0300016f
+
+#define HFI_PROP_SEI_FRAME_PACKING_ARRANGEMENT                  0x03000170
+
+#define HFI_PROP_SEI_PAN_SCAN_RECT                              0x03000171
+
+#define HFI_PROP_THUMBNAIL_MODE                                 0x03000172
+
+#define HFI_PROP_ROI_INFO                                       0x03000173
+
+#define HFI_PROP_END                                            0x03FFFFFF
+
+#define HFI_SESSION_ERROR_BEGIN                                 0x04000000
+
+#define HFI_ERROR_UNKNOWN_SESSION                               0x04000001
+
+#define HFI_ERROR_MAX_SESSIONS                                  0x04000002
+
+#define HFI_ERROR_UNSUPPORTED                                   0x04000003
+
+#define HFI_SESSION_ERROR_END                                   0x04FFFFFF
+
+#define HFI_SYSTEM_ERROR_BEGIN                                  0x05000000
+
+#define HFI_SYS_ERROR_WD_TIMEOUT                                0x05000001
+
+#define HFI_SYS_ERROR_NOC                                       0x05000002
+
+#define HFI_SYSTEM_ERROR_END                                    0x05FFFFFF
+
+#define HFI_INFORMATION_BEGIN                                   0x06000000
+
+#define HFI_INFO_UNSUPPORTED                                    0x06000001
+
+#define HFI_INFO_BITSTREAM_CORRUPT                              0x06000002
+
+#define HFI_INFORMATION_END                                     0x06FFFFFF
+
+#endif //__H_HFI_PROPERTY_H__

+ 2 - 0
driver/vidc/inc/msm_vidc_core.h

@@ -101,6 +101,8 @@ struct msm_vidc_core {
 	struct msm_vidc_venus_ops             *venus_ops;
 	struct msm_vidc_session_ops           *session_ops;
 	struct msm_vidc_memory_ops            *mem_ops;
+	u32                                    header_id;
+	u32                                    packet_id;
 };
 
 #endif // _MSM_VIDC_CORE_H_

+ 4 - 0
driver/vidc/inc/msm_vidc_platform.h

@@ -45,6 +45,8 @@ struct msm_vidc_ubwc_config_data {
 		u32 mal_length_override : 1;
 		u32 hb_override : 1;
 		u32 bank_swzl_level_override : 1;
+		u32 bank_swz2_level_override : 1;
+		u32 bank_swz3_level_override : 1;
 		u32 bank_spreading_override : 1;
 		u32 reserved : 27;
 	} override_bit_info;
@@ -53,6 +55,8 @@ struct msm_vidc_ubwc_config_data {
 	u32 mal_length;
 	u32 highest_bank_bit;
 	u32 bank_swzl_level;
+	u32 bank_swz2_level;
+	u32 bank_swz3_level;
 	u32 bank_spreading;
 };
 

+ 487 - 20
driver/vidc/src/hfi_packet.c

@@ -7,45 +7,512 @@
 #include "msm_vidc_core.h"
 #include "msm_vidc_inst.h"
 #include "msm_vidc_debug.h"
+#include "msm_vidc_platform.h"
 
-int hfi_packet_sys_init(struct msm_vidc_core *core,
-		void *packet, u32 pkt_size)
+static u32 get_hfi_buffer_type(enum msm_vidc_domain_type domain,
+	enum msm_vidc_buffer_type buf_type)
+{
+	switch (buf_type) {
+	case MSM_VIDC_QUEUE:
+		return 0; /* TODO */
+	case MSM_VIDC_INPUT:
+		if (domain == MSM_VIDC_DECODER)
+			return HFI_PORT_BITSTREAM;
+		else
+			return HFI_PORT_RAW;
+	case MSM_VIDC_OUTPUT:
+		if (domain == MSM_VIDC_DECODER)
+			return HFI_PORT_RAW;
+		else
+			return HFI_PORT_BITSTREAM;
+	case MSM_VIDC_INPUT_META:
+	case MSM_VIDC_OUTPUT_META:
+		return HFI_BUFFER_METADATA;
+	case MSM_VIDC_DPB:
+		return HFI_BUFFER_DPB;
+	case MSM_VIDC_ARP:
+		return HFI_BUFFER_ARP;
+	case MSM_VIDC_LINE:
+		return HFI_BUFFER_LINE;
+	case MSM_VIDC_BIN:
+		return HFI_BUFFER_BIN;
+	default:
+		d_vpr_e("%s: Invalid buffer type %d\n",
+			__func__, buf_type);
+		return 0;
+	}
+}
+
+static u32 get_hfi_buffer_flags(enum msm_vidc_buffer_attributes attr)
+{
+	switch (attr) {
+	case MSM_VIDC_DEFERRED_SUBMISSION:
+		return 0; /*not sure what it should be mapped to??*/
+	case MSM_VIDC_READ_ONLY:
+		return HFI_BUF_HOST_FLAG_READONLY;
+	case MSM_VIDC_PENDING_RELEASE:
+		return HFI_BUF_HOST_FLAG_RELEASE;
+	default:
+		d_vpr_e("%s: Invalid buffer attribute %d\n",
+			__func__, attr);
+		return 0;
+	}
+}
+
+int hfi_create_header(u8 *pkt, u32 session_id,
+	u32 header_id, u32 num_packets, u32 total_size)
 {
-	d_vpr_h("%s()\n", __func__);
+	struct hfi_header *hdr = (struct hfi_header *)pkt;
+
+	memset(hdr, 0, sizeof(struct hfi_header));
+
+	hdr->size = total_size;
+	hdr->session_id = session_id;
+	hdr->header_id = header_id;
+	hdr->num_packets = num_packets;
 	return 0;
 }
 
-int hfi_packet_sys_pc_prep(struct msm_vidc_core *core,
-		void *packet, u32 pkt_size)
+int hfi_create_packet(u8 *packet, u32 packet_size, u32 *offset,
+	u32 pkt_type, u32 pkt_flags, u32 payload_type, u32 port,
+	u32 packet_id, void *payload, u32 payload_size)
 {
-	d_vpr_h("%s()\n", __func__);
+	u32 available_size = packet_size - *offset;
+	u32 pkt_size = sizeof(struct hfi_packet) + payload_size;
+	struct hfi_packet *pkt = (struct hfi_packet *)(packet + *offset);
+
+	if (available_size < pkt_size) {
+		d_vpr_e("%s: Bad packet Size for packet type %d\n",
+			__func__, pkt_type);
+		return -EINVAL;
+	}
+
+	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((u8 *)pkt + sizeof(struct hfi_packet),
+			payload, payload_size);
+	*offset = *offset + pkt->size;
 	return 0;
 }
 
-int hfi_packet_sys_debug_config(struct msm_vidc_core *core,
-		void *packet, u32 pkt_size, u32 config)
+int hfi_create_buffer(u8 *packet, u32 packet_size, u32 *offset,
+	enum msm_vidc_domain_type domain, struct msm_vidc_buffer *data)
 {
-	d_vpr_h("%s()\n", __func__);
+	u32 available_size = packet_size - *offset;
+	u32 buf_size = sizeof(struct hfi_buffer);
+	struct hfi_buffer *buf = (struct hfi_buffer *)packet;
+
+	if (available_size < sizeof(struct hfi_buffer)) {
+		d_vpr_e("%s: Bad buffer Size for buffer type %d\n",
+			__func__, data->type);
+		return -EINVAL;
+	}
+
+	memset(buf, 0, buf_size);
+
+	buf->type = get_hfi_buffer_type(domain, data->type);
+	buf->index = data->index;
+	buf->base_address = data->device_addr;
+	buf->addr_offset = 0;
+	buf->buffer_size = data->buffer_size;
+	buf->data_offset = data->data_offset;
+	buf->data_size = data->data_size;
+	buf->flags = get_hfi_buffer_flags(data->attr);
+	buf->timestamp = data->timestamp;
+	*offset = *offset + buf_size;
 	return 0;
 }
 
+int hfi_packet_sys_init(struct msm_vidc_core *core,
+	u8 *pkt, u32 pkt_size)
+{
+	int rc = 0;
+	u32 offset = 0, payload = 0, num_packets = 0;
+
+	if (!core || !pkt) {
+		d_vpr_e("%s: Invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	if (pkt_size < sizeof(struct hfi_header)) {
+		d_vpr_e("%s: Invalid packet size\n", __func__);
+		return -EINVAL;
+	}
+
+	/* HFI_CMD_SYSTEM_INIT */
+	offset = sizeof(struct hfi_header);
+	payload = HFI_VIDEO_ARCH_OX;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   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));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_INTRA_FRAME_POWER_COLLAPSE */
+	payload = 0;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_INTRA_FRAME_POWER_COLLAPSE,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_MAX_CHANNELS */
+	payload = core->platform->data.ubwc_config->max_channels;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_MAX_CHANNELS,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_MAL_LENGTH */
+	payload = core->platform->data.ubwc_config->mal_length;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_MAL_LENGTH,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_HBB */
+	payload = core->platform->data.ubwc_config->highest_bank_bit;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_HBB,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_BANK_SWZL_LEVEL1 */
+	payload = core->platform->data.ubwc_config->bank_swzl_level;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_BANK_SWZL_LEVEL1,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_BANK_SWZL_LEVEL2 */
+	payload = core->platform->data.ubwc_config->bank_swz2_level;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_BANK_SWZL_LEVEL2,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_BANK_SWZL_LEVEL3 */
+	payload = core->platform->data.ubwc_config->bank_swz3_level;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_BANK_SWZL_LEVEL3,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	/* HFI_PROP_UBWC_BANK_SPREADING */
+	payload = core->platform->data.ubwc_config->bank_spreading;
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_UBWC_BANK_SPREADING,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_sys_init;
+	num_packets++;
+
+	rc = hfi_create_header(pkt, 0 /*session_id*/,
+				   core->header_id++,
+				   num_packets,
+				   offset);
+
+	if (rc)
+		goto err_sys_init;
+
+	d_vpr_h("System init packet created\n");
+	return rc;
+
+err_sys_init:
+	d_vpr_e("%s: create packet failed\n", __func__);
+	return rc;
+}
+
 int hfi_packet_image_version(struct msm_vidc_core *core,
-		void *packet, u32 pkt_size)
+	u8 *pkt, u32 pkt_size)
 {
-	d_vpr_h("%s()\n", __func__);
-	return 0;
+	int rc = 0;
+	u32 num_packets = 0, offset = 0;
+
+	if (!core || !pkt) {
+		d_vpr_e("%s: Invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	/* HFI_PROP_IMAGE_VERSION */
+	offset = sizeof(struct hfi_header);
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   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);
+	if (rc)
+		goto err_img_version;
+	num_packets++;
+
+	rc = hfi_create_header(pkt, 0 /*session_id*/,
+				   core->header_id++,
+				   num_packets,
+				   offset);
+
+	if (rc)
+		goto err_img_version;
+
+	d_vpr_h("Image version packet created\n");
+	return rc;
+
+err_img_version:
+	d_vpr_e("%s: create packet failed\n", __func__);
+	return rc;
 }
 
-int hfi_packet_session_open(struct msm_vidc_inst *inst,
-		void *packet, u32 pkt_size)
+int hfi_packet_sys_pc_prep(struct msm_vidc_core *core,
+	u8 *pkt, u32 pkt_size)
 {
-	d_vpr_h("%s()\n", __func__);
-	return 0;
+	int rc = 0;
+	u32 num_packets = 0, offset = 0;
+
+	if (!core || !pkt) {
+		d_vpr_e("%s: Invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	/* HFI_CMD_POWER_COLLAPSE */
+	offset = sizeof(struct hfi_header);
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_CMD_POWER_COLLAPSE,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_NONE,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   NULL, 0);
+	if (rc)
+		goto err_sys_pc;
+	num_packets++;
+
+	rc = hfi_create_header(pkt, 0 /*session_id*/,
+				   core->header_id++,
+				   num_packets,
+				   offset);
+
+	if (rc)
+		goto err_sys_pc;
+
+	d_vpr_h("Power collapse packet created\n");
+	return rc;
+
+err_sys_pc:
+	d_vpr_e("%s: create packet failed\n", __func__);
+	return rc;
 }
 
-int hfi_packet_session_close(struct msm_vidc_inst *inst,
-		void *packet, u32 pkt_size)
+int hfi_packet_sys_debug_config(struct msm_vidc_core *core,
+	u8 *pkt, u32 pkt_size, u32 debug_config)
 {
-	d_vpr_h("%s()\n", __func__);
-	return 0;
+	int rc = 0;
+	u32 num_packets = 0, offset = 0, payload = 0;
+
+	if (!core || !pkt) {
+		d_vpr_e("%s: Invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	/* HFI_PROP_DEBUG_CONFIG */
+	offset = sizeof(struct hfi_header);
+	payload = debug_config; /*TODO:Change later*/
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_DEBUG_CONFIG,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32_ENUM,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_debug;
+	num_packets++;
+
+	/* HFI_PROP_DEBUG_LOG_LEVEL */
+	payload = debug_config; /*TODO:Change later*/
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				   HFI_PROP_DEBUG_LOG_LEVEL,
+				   HFI_HOST_FLAGS_NONE,
+				   HFI_PAYLOAD_U32_ENUM,
+				   HFI_PORT_NONE,
+				   core->packet_id++,
+				   &payload,
+				   sizeof(u32));
+	if (rc)
+		goto err_debug;
+	num_packets++;
+
+	rc = hfi_create_header(pkt, 0 /*session_id*/,
+				   core->header_id++,
+				   num_packets,
+				   offset);
+
+	if (rc)
+		goto err_debug;
+
+	d_vpr_h("Debug packet created\n");
+	return rc;
+
+err_debug:
+	d_vpr_e("%s: create packet failed\n", __func__);
+	return rc;
+}
+
+int hfi_packet_session_command(struct msm_vidc_inst *inst,
+	u32 pkt_type, u32 flags, u32 port, u32 session_id,
+	u32 payload_type, void *payload, u32 payload_size)
+{
+	int rc = 0;
+	u32 num_packets = 0, offset = 0;
+	struct msm_vidc_core *core;
+
+	if (!inst || !inst->core) {
+		d_vpr_e("%s: Invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	core = inst->core;
+	offset = sizeof(struct hfi_header);
+	rc = hfi_create_packet(inst->packet,
+				inst->packet_size,
+				&offset,
+				pkt_type,
+				flags,
+				payload_type,
+				port,
+				core->packet_id++,
+				payload,
+				payload_size);
+	if (rc)
+		goto err_cmd;
+	num_packets++;
+
+	rc = hfi_create_header(inst->packet, session_id,
+				   core->header_id++,
+				   num_packets,
+				   offset);
+
+	if (rc)
+		goto err_cmd;
+
+	d_vpr_h("Command packet 0x%x created\n", pkt_type);
+	return rc;
+
+err_cmd:
+	d_vpr_e("%s: create packet failed\n", __func__);
+	return rc;
+}
+
+int hfi_packet_create_property(struct msm_vidc_inst *inst,
+	void *pkt, u32 pkt_size, u32 pkt_type, u32 flags,
+	u32 port, u32 payload, u32 payload_type, u32 payload_size)
+{
+	int rc = 0;
+	u32 num_packets = 0, offset = 0;
+	struct msm_vidc_core *core;
+
+	if (!inst || !inst->core || !pkt) {
+		d_vpr_e("%s: Invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	core = inst->core;
+	offset = sizeof(struct hfi_header);
+	rc = hfi_create_packet(pkt, pkt_size, &offset,
+				pkt_type,
+				flags,
+				payload_type,
+				port,
+				core->packet_id++,
+				&payload,
+				payload_size);
+	if (rc)
+		goto err_prop;
+	num_packets++;
+
+	rc = hfi_create_header(pkt, inst->session_id,
+				   core->header_id++,
+				   num_packets,
+				   offset);
+
+	if (rc)
+		goto err_prop;
+
+	d_vpr_h("Property packet 0x%x created\n", pkt_type);
+	return rc;
+
+err_prop:
+	d_vpr_e("%s: create packet failed\n", __func__);
+	return rc;
 }

+ 11 - 3
driver/vidc/src/venus_hfi.c

@@ -2339,7 +2339,8 @@ int venus_hfi_suspend(struct msm_vidc_core *core)
 	return rc;
 }
 
-int venus_hfi_session_open(struct msm_vidc_core *core, struct msm_vidc_inst *inst)
+int venus_hfi_session_open(struct msm_vidc_core *core,
+	struct msm_vidc_inst *inst)
 {
 	int rc = 0;
 
@@ -2357,10 +2358,17 @@ int venus_hfi_session_open(struct msm_vidc_core *core, struct msm_vidc_inst *ins
 		d_vpr_e("%s(): inst packet allocation failed\n", __func__);
 		return -ENOMEM;
 	}
-	rc = hfi_packet_session_open(inst, inst->packet, inst->packet_size);
+	rc = hfi_packet_session_command(inst,
+					HFI_CMD_OPEN,
+					(HFI_HOST_FLAGS_RESPONSE_REQUIRED |
+					HFI_HOST_FLAGS_INTR_REQUIRED),
+					HFI_PORT_NONE,
+					0 /* session_id */,
+					HFI_PAYLOAD_U32,
+					&inst->session_id /*payload*/,
+					sizeof(u32));
 	if (rc)
 		return rc;
 
 	return rc;
 }
-