diff --git a/msm/eva/cvp_hfi_api.h b/msm/eva/cvp_hfi_api.h index beaadd5ec7..5fd28f3600 100644 --- a/msm/eva/cvp_hfi_api.h +++ b/msm/eva/cvp_hfi_api.h @@ -245,6 +245,7 @@ struct msm_cvp_hfi_defs { bool checksum_enabled; enum hal_command_response resp; char name[PKT_NAME_LEN]; + bool force_kernel_fence; }; struct cvp_hfi_device { @@ -303,6 +304,7 @@ void cvp_hfi_deinitialize(enum msm_cvp_hfi_type hfi_type, struct cvp_hfi_device *hdev); int get_pkt_index(struct cvp_hal_session_cmd_pkt *hdr); +int get_pkt_fenceoverride(struct cvp_hal_session_cmd_pkt* hdr); int get_pkt_index_from_type(u32 pkt_type); int get_hfi_version(void); unsigned int get_msg_size(struct cvp_hfi_msg_session_hdr *hdr); diff --git a/msm/eva/msm_cvp.c b/msm/eva/msm_cvp.c index 263181233f..d86347edf8 100644 --- a/msm/eva/msm_cvp.c +++ b/msm/eva/msm_cvp.c @@ -603,9 +603,15 @@ static int cvp_populate_fences( struct eva_kmd_hfi_packet *in_pkt, struct cvp_fence_queue *q; enum op_mode mode; struct cvp_buf_type *buf; + bool override; int rc = 0; + override = get_pkt_fenceoverride((struct cvp_hal_session_cmd_pkt*)in_pkt); + + dprintk(CVP_SYNX, "%s:Fence Override is %d\n",__func__, override); + dprintk(CVP_SYNX, "%s:Kernel Fence is %d\n", __func__, cvp_kernel_fence_enabled); + q = &inst->fence_cmd_queue; mutex_lock(&q->lock); @@ -632,24 +638,53 @@ static int cvp_populate_fences( struct eva_kmd_hfi_packet *in_pkt, f->output_index = 0; buf_offset = offset; - if (!cvp_kernel_fence_enabled) { - for (i = 0; i < num; i++) { - buf = (struct cvp_buf_type *)&in_pkt->pkt_data[buf_offset]; - buf_offset += sizeof(*buf) >> 2; - - if (buf->input_handle || buf->output_handle) { - f->num_fences++; - if (buf->input_handle) - f->output_index++; - } + if (cvp_kernel_fence_enabled == 0) + { + goto soc_fence; + } + else if (cvp_kernel_fence_enabled == 1) + { + goto kernel_fence; + } + else if (cvp_kernel_fence_enabled == 2) + { + if (override == true) + goto kernel_fence; + else if (override == false) + goto soc_fence; + else + { + dprintk(CVP_ERR, "%s: invalid params", __func__); + rc = -EINVAL; + goto exit; } - f->signature = 0xB0BABABE; - if (f->num_fences) - goto fence_cmd_queue; - - goto free_exit; + } + else + { + dprintk(CVP_ERR, "%s: invalid params", __func__); + rc = -EINVAL; + goto exit; } +soc_fence: + for (i = 0; i < num; i++) { + buf = (struct cvp_buf_type*)&in_pkt->pkt_data[buf_offset]; + buf_offset += sizeof(*buf) >> 2; + + if (buf->input_handle || buf->output_handle) { + f->num_fences++; + if (buf->input_handle) + f->output_index++; + } + } + f->signature = 0xB0BABABE; + if (f->num_fences) + goto fence_cmd_queue; + + goto free_exit; + + +kernel_fence: /* First pass to find INPUT synx handles */ for (i = 0; i < num; i++) { buf = (struct cvp_buf_type *)&in_pkt->pkt_data[buf_offset]; diff --git a/msm/eva/msm_cvp_debug.c b/msm/eva/msm_cvp_debug.c index 53f2516aa1..e4d18c3fe8 100644 --- a/msm/eva/msm_cvp_debug.c +++ b/msm/eva/msm_cvp_debug.c @@ -36,7 +36,7 @@ bool msm_cvp_mmrm_enabled = !true; #endif bool msm_cvp_dcvs_disable = !true; int msm_cvp_minidump_enable = !1; -bool cvp_kernel_fence_enabled = true; +int cvp_kernel_fence_enabled = 2; #define MAX_DBG_BUF_SIZE 4096 @@ -258,7 +258,7 @@ struct dentry *msm_cvp_debugfs_init_drv(void) &msm_cvp_minidump_enable); debugfs_create_bool("fw_coverage", 0644, dir, &msm_cvp_fw_coverage); debugfs_create_bool("auto_pil", 0644, dir, &msm_cvp_auto_pil); - debugfs_create_bool("kernel_fence", 0644, dir, &cvp_kernel_fence_enabled); + debugfs_create_u32("kernel_fence", 0644, dir, &cvp_kernel_fence_enabled); debugfs_create_bool("disable_thermal_mitigation", 0644, dir, &msm_cvp_thermal_mitigation_disabled); debugfs_create_bool("enable_cacheop", 0644, dir, diff --git a/msm/eva/msm_cvp_debug.h b/msm/eva/msm_cvp_debug.h index ce75d2ded2..25caafac24 100644 --- a/msm/eva/msm_cvp_debug.h +++ b/msm/eva/msm_cvp_debug.h @@ -69,7 +69,7 @@ extern bool msm_cvp_dsp_disable; extern bool msm_cvp_mmrm_enabled; extern bool msm_cvp_dcvs_disable; extern int msm_cvp_minidump_enable; -extern bool cvp_kernel_fence_enabled; +extern int cvp_kernel_fence_enabled; #define dprintk(__level, __fmt, arg...) \ do { \ diff --git a/msm/eva/msm_cvp_platform.c b/msm/eva/msm_cvp_platform.c index e093864a6f..2702460f81 100644 --- a/msm/eva/msm_cvp_platform.c +++ b/msm/eva/msm_cvp_platform.c @@ -359,6 +359,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "DFS_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_SGM_OF_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -375,6 +376,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "SGM_OF_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_WARP_NCC_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -391,6 +393,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "WARP_NCC_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_WARP_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -415,6 +418,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "WARP_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_DMM_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -439,6 +443,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "DMM_FRAME", + .force_kernel_fence = true, }, [HFI_CMD_SESSION_CVP_SET_PERSIST_BUFFERS - HFI_CMD_SESSION_CVP_START] = { @@ -487,6 +492,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "TME_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_CV_ODT_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -535,6 +541,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "NCC_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_ICA_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -551,6 +558,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "ICA_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_HCD_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -567,6 +575,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "HCD_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_DC_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -583,6 +592,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "DC_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_DCM_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -599,6 +609,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "DCM_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_PYS_HCD_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -615,6 +626,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "PYS_HCD_FRAME", + .force_kernel_fence = true, }, [HFI_CMD_SESSION_CVP_SET_MODEL_BUFFERS - HFI_CMD_SESSION_CVP_START] = { @@ -711,6 +723,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "XRA_PATCH_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_XRA_PATCH_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -727,6 +740,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "XRA_MATCH_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_CVP_XRA_MATCH_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -743,6 +757,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "RGE_FRAME", + .force_kernel_fence = true, }, [HFI_CMD_SESSION_CVP_RGE_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -759,6 +774,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "ITOF_FRAME", + .force_kernel_fence = true, }, [HFI_CMD_SESSION_EVA_ITOF_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -791,6 +807,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "DLFL_FRAME", + .force_kernel_fence = false, }, [HFI_CMD_SESSION_EVA_DLFL_CONFIG - HFI_CMD_SESSION_CVP_START] = { @@ -823,6 +840,7 @@ const struct msm_cvp_hfi_defs cvp_hfi_defs[MAX_PKT_IDX] = { .is_config_pkt = false, .resp = HAL_NO_RESP, .name = "DME_FRAME", + .force_kernel_fence = true, }, }; @@ -839,6 +857,13 @@ int get_pkt_index(struct cvp_hal_session_cmd_pkt *hdr) return -EINVAL; } +int get_pkt_fenceoverride(struct cvp_hal_session_cmd_pkt* hdr) +{ + return cvp_hfi_defs[hdr->packet_type - HFI_CMD_SESSION_CVP_START].force_kernel_fence; +} + + + int get_pkt_index_from_type(u32 pkt_type) { if ((pkt_type < HFI_CMD_SESSION_CVP_START) ||