From 8dddeae16cd90519cf2bf18329e3baf20e39109e Mon Sep 17 00:00:00 2001 From: Arun Menon Date: Fri, 5 Jul 2013 12:06:27 -0700 Subject: [PATCH] msm: vidc: write venus firmware version to smem Write venus firmware version info to smem image version table. Change-Id: Ia0e09ad481ecc58d51bc4b7742975f095fa7a808 Signed-off-by: Arun Menon --- .../platform/msm/vidc/hfi_packetization.c | 14 ++++++ .../platform/msm/vidc/hfi_packetization.h | 3 ++ .../platform/msm/vidc/hfi_response_handler.c | 44 +++++++++++++++++++ drivers/media/platform/msm/vidc/venus_hfi.c | 5 +++ drivers/media/platform/msm/vidc/vidc_hfi.h | 1 - .../media/platform/msm/vidc/vidc_hfi_helper.h | 10 +++++ 6 files changed, 76 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c index 6e8c80923af..982e4d4f3e3 100644 --- a/drivers/media/platform/msm/vidc/hfi_packetization.c +++ b/drivers/media/platform/msm/vidc/hfi_packetization.c @@ -1343,3 +1343,17 @@ int create_pkt_ssr_cmd(enum hal_ssr_trigger_type type, pkt->trigger_type = get_hfi_ssr_type(type); return 0; } + +int create_pkt_cmd_sys_image_version( + struct hfi_cmd_sys_get_property_packet *pkt) +{ + if (!pkt) { + dprintk(VIDC_ERR, "%s invalid param :%p\n", __func__, pkt); + return -EINVAL; + } + pkt->size = sizeof(struct hfi_cmd_sys_get_property_packet); + pkt->packet_type = HFI_CMD_SYS_GET_PROPERTY; + pkt->num_properties = 1; + pkt->rg_property_data[0] = HFI_PROPERTY_SYS_IMAGE_VERSION; + return 0; +} diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.h b/drivers/media/platform/msm/vidc/hfi_packetization.h index df93906fb6d..20619c0dea6 100644 --- a/drivers/media/platform/msm/vidc/hfi_packetization.h +++ b/drivers/media/platform/msm/vidc/hfi_packetization.h @@ -89,4 +89,7 @@ int create_pkt_cmd_session_set_property( int create_pkt_ssr_cmd(enum hal_ssr_trigger_type type, struct hfi_cmd_sys_test_ssr_packet *pkt); + +int create_pkt_cmd_sys_image_version( + struct hfi_cmd_sys_get_property_packet *pkt); #endif diff --git a/drivers/media/platform/msm/vidc/hfi_response_handler.c b/drivers/media/platform/msm/vidc/hfi_response_handler.c index 859345f1c29..44105ad948e 100644 --- a/drivers/media/platform/msm/vidc/hfi_response_handler.c +++ b/drivers/media/platform/msm/vidc/hfi_response_handler.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "vidc_hfi_helper.h" #include "vidc_hfi_io.h" #include "msm_vidc_debug.h" @@ -1089,6 +1090,44 @@ static void hfi_process_session_get_seq_hdr_done( callback(SESSION_GET_SEQ_HDR_DONE, &data_done); } +void hfi_process_sys_property_info( + struct hfi_property_sys_image_version_info_type *pkt) +{ + int i = 0; + u32 smem_block_size = 0; + u8 *smem_table_ptr; + char version[256]; + const u32 smem_image_index_venus = 14 * 128; + + if (!pkt || !pkt->string_size) { + dprintk(VIDC_ERR, "%s: invalid param\n", __func__); + return; + } + + if (pkt->string_size < sizeof(version)) { + /* + * The version string returned by firmware includes null + * characters at the start and in between. Replace the null + * characters with space, to print the version info. + */ + for (i = 0; i < pkt->string_size; i++) { + if (pkt->str_image_version[i] != '\0') + version[i] = pkt->str_image_version[i]; + else + version[i] = ' '; + } + version[i] = '\0'; + dprintk(VIDC_INFO, "F/W version: %s\n", version); + } + + smem_table_ptr = smem_get_entry(SMEM_IMAGE_VERSION_TABLE, + &smem_block_size); + if (smem_table_ptr && + ((smem_image_index_venus + 128) <= smem_block_size)) + memcpy(smem_table_ptr + smem_image_index_venus, + (u8 *)pkt->str_image_version, 128); +} + u32 hfi_process_msg_packet( msm_vidc_callback callback, u32 device_id, struct vidc_hal_msg_pkt_hdr *msg_hdr) @@ -1121,6 +1160,11 @@ u32 hfi_process_msg_packet( (struct hfi_msg_sys_session_init_done_packet *) msg_hdr); break; + case HFI_MSG_SYS_PROPERTY_INFO: + hfi_process_sys_property_info( + (struct hfi_property_sys_image_version_info_type *) + msg_hdr); + break; case HFI_MSG_SYS_SESSION_END_DONE: hfi_process_session_end_done(callback, device_id, (struct hfi_msg_sys_session_end_done_packet *) diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c index 28ea41a5ef3..8ee9c327e93 100644 --- a/drivers/media/platform/msm/vidc/venus_hfi.c +++ b/drivers/media/platform/msm/vidc/venus_hfi.c @@ -1030,6 +1030,7 @@ static int venus_hfi_sys_set_idle_message(struct venus_hfi_device *device, static int venus_hfi_core_init(void *device) { struct hfi_cmd_sys_init_packet pkt; + struct hfi_cmd_sys_get_property_packet version_pkt; int rc = 0; struct venus_hfi_device *dev; @@ -1088,6 +1089,10 @@ static int venus_hfi_core_init(void *device) rc = -ENOTEMPTY; goto err_core_init; } + rc = create_pkt_cmd_sys_image_version(&version_pkt); + if (rc || venus_hfi_iface_cmdq_write(dev, &version_pkt)) + dprintk(VIDC_WARN, "Failed to send image version pkt to f/w"); + return rc; err_core_init: disable_irq_nosync(dev->hal_data->irq); diff --git a/drivers/media/platform/msm/vidc/vidc_hfi.h b/drivers/media/platform/msm/vidc/vidc_hfi.h index bb72da7c382..ac6cb02aa60 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi.h @@ -335,7 +335,6 @@ struct hfi_uncompressed_plane_actual_constraints_info { #define HFI_MSG_SYS_OX_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_MSG_START_OFFSET + 0x0000) #define HFI_MSG_SYS_PING_ACK (HFI_MSG_SYS_OX_START + 0x2) -#define HFI_MSG_SYS_PROPERTY_INFO (HFI_MSG_SYS_OX_START + 0x3) #define HFI_MSG_SYS_SESSION_ABORT_DONE (HFI_MSG_SYS_OX_START + 0x4) #define HFI_MSG_SESSION_OX_START \ diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h index 2b6d6bb7cb1..0f1e896e848 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h @@ -197,6 +197,10 @@ struct hfi_buffer_info { (HFI_PROPERTY_SYS_COMMON_START + 0x003) #define HFI_PROPERTY_SYS_IDLE_INDICATOR \ (HFI_PROPERTY_SYS_COMMON_START + 0x004) +#define HFI_PROPERTY_SYS_CODEC_POWER_PLANE_CTRL \ + (HFI_PROPERTY_SYS_COMMON_START + 0x005) +#define HFI_PROPERTY_SYS_IMAGE_VERSION \ + (HFI_PROPERTY_SYS_COMMON_START + 0x006) #define HFI_PROPERTY_PARAM_COMMON_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_COMMON_OFFSET + 0x1000) @@ -615,6 +619,11 @@ struct hfi_resource_ocmem_requirement_info { struct hfi_resource_ocmem_requirement rg_requirements[1]; }; +struct hfi_property_sys_image_version_info_type { + u32 string_size; + u8 str_image_version[1]; +}; + struct hfi_venc_config_advanced { u8 pipe2d; u8 hw_mode; @@ -703,6 +712,7 @@ struct hfi_mvc_buffer_lauout_descp_type { #define HFI_MSG_SYS_SESSION_INIT_DONE (HFI_MSG_SYS_COMMON_START + 0x6) #define HFI_MSG_SYS_SESSION_END_DONE (HFI_MSG_SYS_COMMON_START + 0x7) #define HFI_MSG_SYS_IDLE (HFI_MSG_SYS_COMMON_START + 0x8) +#define HFI_MSG_SYS_PROPERTY_INFO (HFI_MSG_SYS_COMMON_START + 0xA) #define HFI_MSG_SESSION_COMMON_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_COMMON_OFFSET + \