/* * Copyright (c) Hisilicon Technologies Co., Ltd. 2019-2020. All rights reserved. * Description: IAPI function file for Huanglong SSM * Author: ssm group * Create: 2019/12/11 */ #include "uapi_ssm.h" #include "mpi_ssm_ext.h" #include "td_type.h" #include "soc_log.h" #include "soc_errno.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ static uapi_ssm_intent ssm_intent_id_drv_to_uapi(ext_ssm_intent ext_intent) { uapi_ssm_intent uapi_intent = UAPI_SSM_INTENT_MAX; switch (ext_intent) { case EXT_SSM_INTENT_WATCH: uapi_intent = UAPI_SSM_INTENT_WATCH; break; case EXT_SSM_INTENT_RECORD: uapi_intent = UAPI_SSM_INTENT_RECORD; break; case EXT_SSM_INTENT_EXPORT: uapi_intent = UAPI_SSM_INTENT_EXPORT; break; case EXT_SSM_INTENT_MAX: uapi_intent = UAPI_SSM_INTENT_MAX; break; default: uapi_intent = UAPI_SSM_INTENT_MAX; } return uapi_intent; } static ext_ssm_intent ssm_intent_id_uapi_to_drv(uapi_ssm_intent uapi_intent) { ext_ssm_intent ext_intent = EXT_SSM_INTENT_MAX; switch (uapi_intent) { case UAPI_SSM_INTENT_WATCH: ext_intent = EXT_SSM_INTENT_WATCH; break; case UAPI_SSM_INTENT_RECORD: ext_intent = EXT_SSM_INTENT_RECORD; break; case UAPI_SSM_INTENT_EXPORT: ext_intent = EXT_SSM_INTENT_EXPORT; break; case UAPI_SSM_INTENT_MAX: ext_intent = EXT_SSM_INTENT_MAX; break; default: ext_intent = EXT_SSM_INTENT_MAX; } return ext_intent; } td_s32 uapi_ssm_init(td_void) { return ext_mpi_ssm_init(); } td_s32 uapi_ssm_deinit(td_void) { return ext_mpi_ssm_deinit(); } td_s32 uapi_ssm_create(const uapi_ssm_attr *session_attr, td_handle *session_handle) { ext_ssm_attr ext_session_attr; ext_session_attr.intent = ssm_intent_id_uapi_to_drv(session_attr->intent); return ext_mpi_ssm_create(session_handle, &ext_session_attr); } td_s32 uapi_ssm_destroy(const td_handle session_handle) { return ext_mpi_ssm_destroy(session_handle); } td_s32 uapi_ssm_add_resource(const td_handle session_handle, const uapi_ssm_module_resource *resource_info) { ext_ssm_module_resource ext_resource_info; ext_resource_info.module_handle = resource_info->module_handle; return ext_mpi_ssm_add_resource(session_handle, &ext_resource_info); } static ext_drv_ssm_buffer_id ssm_vid_buff_drv_to_uapi(uapi_ssm_buffer_id buffer_id) { ext_drv_ssm_buffer_id drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; switch (buffer_id) { case UAPI_SSM_BUFFER_ID_VID_RAWLIST_MCU_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_RAWLIST_MCU_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_SEGLIST_MCU_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_SEGLIST_MCU_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_STDCTX_MCU_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_STDCTX_MCU_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_PICMSG_MCU_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_PICMSG_MCU_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_SLICEMSG_MCU_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_SLICEMSG_MCU_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_METADATA_MCU_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_METADATA_MCU_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_SCDRAW_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_SCDRAW_BUF; break; case UAPI_SSM_BUFFER_ID_VID_SCDSEG_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_SCDSEG_BUF; break; case UAPI_SSM_BUFFER_ID_VID_SCDMSG: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_SCDMSG; break; case UAPI_SSM_BUFFER_ID_VID_VDHPMV_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_VDHPMV_BUF; break; case UAPI_SSM_BUFFER_ID_VID_VDHEXT_BUF_VID_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_VDHEXT_BUF_VID_ONLY; break; case UAPI_SSM_BUFFER_ID_VID_FRMBIN_VDH_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_FRMBIN_VDH_ONLY; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VDEC: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_VDEC; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VENC: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_VENC; break; case UAPI_SSM_BUFFER_ID_DMX_VID_ES_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_DMX_VID_ES_BUF; break; case UAPI_SSM_BUFFER_ID_MCIPHER_VID_ES_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_MCIPHER_VID_ES_BUF; break; case UAPI_SSM_BUFFER_ID_VID_FRM_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VID_FRM_BUF; break; case UAPI_SSM_BUFFER_ID_VIDEO_CAPTURE_ENCODE_OUTPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VIDEO_CAPTURE_ENCODE_OUTPUT_BUF; break; default: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; } return drv_buffer_id; } static ext_drv_ssm_buffer_id ssm_dmx_buff_drv_to_uapi(uapi_ssm_buffer_id buffer_id) { ext_drv_ssm_buffer_id drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; switch (buffer_id) { case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_DMX: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_DMX; break; case UAPI_SSM_BUFFER_ID_DMX_VID_ES_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_DMX_VID_ES_BUF; break; case UAPI_SSM_BUFFER_ID_DMX_AUD_ES_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_DMX_AUD_ES_BUF; break; case UAPI_SSM_BUFFER_ID_MCIPHER_TS_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_MCIPHER_TS_BUF; break; case UAPI_SSM_BUFFER_ID_PVR_RECORD_TS_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_PVR_RECORD_TS_BUF; break; case UAPI_SSM_BUFFER_ID_PVR_PLAYBACK_TS_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_PVR_PLAYBACK_TS_BUF; break; default: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; } return drv_buffer_id; } static ext_drv_ssm_buffer_id ssm_sec_buff_drv_to_uapi(uapi_ssm_buffer_id buffer_id) { ext_drv_ssm_buffer_id drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; switch (buffer_id) { case UAPI_SSM_BUFFER_ID_CIPHER_CENC_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_CIPHER_CENC_BUF; break; case UAPI_SSM_BUFFER_ID_SECURE_INFOR_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_SECURE_INFOR_BUF; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_MCIPHER: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_MCIPHER; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_TSCIPHER: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_TSCIPHER; break; default: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; } return drv_buffer_id; } static ext_drv_ssm_buffer_id ssm_out_buff_drv_to_uapi(uapi_ssm_buffer_id buffer_id) { ext_drv_ssm_buffer_id drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; switch (buffer_id) { case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VPSS: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_VPSS; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VDP: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_VDP; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_GPU: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_GPU; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_HWC: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_HWC; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_JPEG_DEC: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_JPEG_DEC; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_JPEG_ENC: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_JPEG_ENC; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_NPU: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_NPU; break; case UAPI_SSM_BUFFER_ID_VPSS_OUTPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VPSS_OUTPUT_BUF; break; case UAPI_SSM_BUFFER_ID_GRAPHIC_OUPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_GRAPHIC_OUPUT_BUF; break; case UAPI_SSM_BUFFER_ID_NPU_OUTPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_NPU_OUTPUT_BUF; break; case UAPI_SSM_BUFFER_ID_TRANSCODE_ENCODE_OUTPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_TRANSCODE_ENCODE_OUTPUT_BUF; break; case UAPI_SSM_BUFFER_ID_MIRA_ENCODE_OUTPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_MIRA_ENCODE_OUTPUT_BUF; break; case UAPI_SSM_BUFFER_ID_VDP_SD_WRITEBACK_ONLY: drv_buffer_id = EXT_SSM_BUFFER_ID_VDP_SD_WRITEBACK_ONLY; break; case UAPI_SSM_BUFFER_ID_VDP_OUTPUT_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_VDP_OUTPUT_BUF; break; default: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; } return drv_buffer_id; } static ext_drv_ssm_buffer_id ssm_aud_buff_drv_to_uapi(uapi_ssm_buffer_id buffer_id) { ext_drv_ssm_buffer_id drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; switch (buffer_id) { case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_AUDDSP: drv_buffer_id = EXT_SSM_BUFFER_ID_INTERNAL_BUF_AUDDSP; break; case UAPI_SSM_BUFFER_ID_MCIPHER_AUD_ES_BUF: drv_buffer_id = EXT_SSM_BUFFER_ID_MCIPHER_AUD_ES_BUF; break; default: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; } return drv_buffer_id; } static ext_drv_ssm_buffer_id ssm_buf_id_uapi_to_drv(uapi_ssm_buffer_id buffer_id) { ext_drv_ssm_buffer_id drv_buffer_id; switch (buffer_id) { case UAPI_SSM_BUFFER_ID_INVALID: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_DMX: case UAPI_SSM_BUFFER_ID_DMX_VID_ES_BUF: case UAPI_SSM_BUFFER_ID_DMX_AUD_ES_BUF: case UAPI_SSM_BUFFER_ID_MCIPHER_TS_BUF: case UAPI_SSM_BUFFER_ID_PVR_RECORD_TS_BUF: case UAPI_SSM_BUFFER_ID_PVR_PLAYBACK_TS_BUF: drv_buffer_id = ssm_dmx_buff_drv_to_uapi(buffer_id); break; case UAPI_SSM_BUFFER_ID_CIPHER_CENC_BUF: case UAPI_SSM_BUFFER_ID_SECURE_INFOR_BUF: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_MCIPHER: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_TSCIPHER: drv_buffer_id = ssm_sec_buff_drv_to_uapi(buffer_id); break; case UAPI_SSM_BUFFER_ID_VID_RAWLIST_MCU_ONLY: case UAPI_SSM_BUFFER_ID_VID_SEGLIST_MCU_ONLY: case UAPI_SSM_BUFFER_ID_VID_STDCTX_MCU_ONLY: case UAPI_SSM_BUFFER_ID_VID_PICMSG_MCU_ONLY: case UAPI_SSM_BUFFER_ID_VID_SLICEMSG_MCU_ONLY: case UAPI_SSM_BUFFER_ID_VID_METADATA_MCU_ONLY: case UAPI_SSM_BUFFER_ID_VID_SCDRAW_BUF: case UAPI_SSM_BUFFER_ID_VID_SCDSEG_BUF: case UAPI_SSM_BUFFER_ID_VID_SCDMSG: case UAPI_SSM_BUFFER_ID_VID_VDHPMV_BUF: case UAPI_SSM_BUFFER_ID_VID_VDHEXT_BUF_VID_ONLY: case UAPI_SSM_BUFFER_ID_VID_FRMBIN_VDH_ONLY: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VDEC: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VENC: case UAPI_SSM_BUFFER_ID_MCIPHER_VID_ES_BUF: case UAPI_SSM_BUFFER_ID_VID_FRM_BUF: case UAPI_SSM_BUFFER_ID_VIDEO_CAPTURE_ENCODE_OUTPUT_BUF: drv_buffer_id = ssm_vid_buff_drv_to_uapi(buffer_id); break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_AUDDSP: case UAPI_SSM_BUFFER_ID_MCIPHER_AUD_ES_BUF: drv_buffer_id = ssm_aud_buff_drv_to_uapi(buffer_id); break; case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VPSS: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_VDP: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_GPU: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_HWC: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_JPEG_DEC: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_JPEG_ENC: case UAPI_SSM_BUFFER_ID_INTERNAL_BUF_NPU: case UAPI_SSM_BUFFER_ID_VPSS_OUTPUT_BUF: case UAPI_SSM_BUFFER_ID_GRAPHIC_OUPUT_BUF: case UAPI_SSM_BUFFER_ID_NPU_OUTPUT_BUF: case UAPI_SSM_BUFFER_ID_TRANSCODE_ENCODE_OUTPUT_BUF: case UAPI_SSM_BUFFER_ID_MIRA_ENCODE_OUTPUT_BUF: case UAPI_SSM_BUFFER_ID_VDP_SD_WRITEBACK_ONLY: case UAPI_SSM_BUFFER_ID_VDP_OUTPUT_BUF: drv_buffer_id = ssm_out_buff_drv_to_uapi(buffer_id); break; case UAPI_SSM_BUFFER_ID_MAX: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; break; default: drv_buffer_id = EXT_SSM_BUFFER_ID_INVALID; } return drv_buffer_id; } td_s32 uapi_ssm_attach_buffer(const uapi_ssm_buffer_attach_info *buffer_attach_info, td_u64 *secure_info_addr) { ext_ssm_buffer_attach_info ext_buf_attch_info; ext_buf_attch_info.buf_id = ssm_buf_id_uapi_to_drv(buffer_attach_info->buffer_id); ext_buf_attch_info.dma_buf_handle = buffer_attach_info->buffer_handle; ext_buf_attch_info.session_handle = buffer_attach_info->session_handle; ext_buf_attch_info.module_handle = buffer_attach_info->module_handle; return ext_mpi_ssm_attach_buffer(&ext_buf_attch_info, secure_info_addr); } td_s32 uapi_ssm_get_intent(const td_handle session_handle, uapi_ssm_intent *intent) { td_s32 ret; ext_ssm_intent ext_intent; ret = ext_mpi_ssm_get_intent(session_handle, &ext_intent); if (ret != TD_SUCCESS) { soc_log_err("ioctl attach fail\n"); return ret; } *intent = ssm_intent_id_drv_to_uapi(ext_intent); return TD_SUCCESS; } #ifdef __cplusplus } #endif /* __cplusplus */