Loading drivers/media/platform/msm/cvp/cvp_hfi.h +0 −2 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ #define HFI_CMD_SYS_OX_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_CMD_START_OFFSET + 0x0000) #define HFI_CMD_SYS_SESSION_ABORT (HFI_CMD_SYS_OX_START + 0x001) #define HFI_CMD_SYS_PING (HFI_CMD_SYS_OX_START + 0x002) #define HFI_CMD_SESSION_OX_START \ Loading Loading @@ -149,7 +148,6 @@ #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_SESSION_ABORT_DONE (HFI_MSG_SYS_OX_START + 0x4) #define HFI_MSG_SESSION_OX_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_MSG_START_OFFSET + 0x1000) Loading drivers/media/platform/msm/cvp/cvp_hfi_helper.h +2 −0 Original line number Diff line number Diff line Loading @@ -413,6 +413,7 @@ struct cvp_hfi_resource_syscache_info_type { #define HFI_CMD_SYS_SESSION_INIT (HFI_CMD_SYS_COMMON_START + 0x007) #define HFI_CMD_SYS_SESSION_END (HFI_CMD_SYS_COMMON_START + 0x008) #define HFI_CMD_SYS_SET_BUFFERS (HFI_CMD_SYS_COMMON_START + 0x009) #define HFI_CMD_SYS_SESSION_ABORT (HFI_CMD_SYS_COMMON_START + 0x00A) #define HFI_CMD_SYS_TEST_START (HFI_CMD_SYS_COMMON_START + 0x100) #define HFI_CMD_SESSION_COMMON_START \ Loading @@ -437,6 +438,7 @@ struct cvp_hfi_resource_syscache_info_type { #define HFI_MSG_SYS_IDLE (HFI_MSG_SYS_COMMON_START + 0x8) #define HFI_MSG_SYS_COV (HFI_MSG_SYS_COMMON_START + 0x9) #define HFI_MSG_SYS_PROPERTY_INFO (HFI_MSG_SYS_COMMON_START + 0xA) #define HFI_MSG_SYS_SESSION_ABORT_DONE (HFI_MSG_SYS_COMMON_START + 0xC) #define HFI_MSG_SESSION_SYNC_DONE (HFI_MSG_SESSION_OX_START + 0xD) #define HFI_MSG_SESSION_COMMON_START \ Loading drivers/media/platform/msm/cvp/cvp_hfi_io.h +26 −13 Original line number Diff line number Diff line Loading @@ -189,19 +189,32 @@ #define CVP_NOC_ERR_ERRLOG3_HIGH_OFFS (CVP_NOC_BASE_OFFS + 0xBC) #define CVP_NOC_CORE_BASE_OFFS 0x00010000 #define CVP_NOC_CORE_ERR_SWID_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x80) #define CVP_NOC_CORE_ERR_SWID_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x84) #define CVP_NOC_CORE_ERR_MAINCTL_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x88) #define CVP_NOC_CORE_ERR_ERRVLD_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x90) #define CVP_NOC_CORE_ERR_ERRCLR_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x98) #define CVP_NOC_CORE_ERR_ERRLOG0_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xA0) #define CVP_NOC_CORE_ERR_ERRLOG0_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xA4) #define CVP_NOC_CORE_ERR_ERRLOG1_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xA8) #define CVP_NOC_CORE_ERR_ERRLOG1_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xAC) #define CVP_NOC_CORE_ERR_ERRLOG2_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xB0) #define CVP_NOC_CORE_ERR_ERRLOG2_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xB4) #define CVP_NOC_CORE_ERR_ERRLOG3_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xB8) #define CVP_NOC_CORE_ERR_ERRLOG3_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xBC) #define CVP_NOC_CORE_ERR_SWID_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1200) #define CVP_NOC_CORE_ERR_SWID_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1204) #define CVP_NOC_CORE_ERR_MAINCTL_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1208) #define CVP_NOC_CORE_ERR_ERRVLD_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1210) #define CVP_NOC_CORE_ERR_ERRCLR_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1218) #define CVP_NOC_CORE_ERR_ERRLOG0_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1220) #define CVP_NOC_CORE_ERR_ERRLOG0_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1224) #define CVP_NOC_CORE_ERR_ERRLOG1_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1228) #define CVP_NOC_CORE_ERR_ERRLOG1_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x122C) #define CVP_NOC_CORE_ERR_ERRLOG2_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1230) #define CVP_NOC_CORE_ERR_ERRLOG2_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1234) #define CVP_NOC_CORE_ERR_ERRLOG3_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1238) #define CVP_NOC_CORE_ERR_ERRLOG3_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x123C) #define CVP_AON_WRAPPER_MVP_NOC_LPI_CONTROL (CVP_AON_BASE_OFFS) Loading drivers/media/platform/msm/cvp/hfi_packetization.c +7 −6 Original line number Diff line number Diff line Loading @@ -201,18 +201,19 @@ inline int cvp_create_pkt_cmd_sys_session_init( struct cvp_hal_session *session) { int rc = 0; struct msm_cvp_inst *inst = session->session_id; if (!pkt) if (!pkt || !inst) return -EINVAL; pkt->size = sizeof(struct cvp_hfi_cmd_sys_session_init_packet); pkt->packet_type = HFI_CMD_SYS_SESSION_INIT; pkt->session_id = hash32_ptr(session); pkt->session_kmask = 0xFFFFFFFF; pkt->session_type = HFI_SESSION_CV; pkt->session_prio = 0; pkt->is_secure = 0; pkt->dsp_ac_mask = 0; pkt->session_type = inst->prop.type; pkt->session_kmask = inst->prop.kernel_mask; pkt->session_prio = inst->prop.priority; pkt->is_secure = inst->prop.is_secure; pkt->dsp_ac_mask = inst->prop.dsp_mask; return rc; } Loading drivers/media/platform/msm/cvp/msm_cvp.c +167 −16 Original line number Diff line number Diff line Loading @@ -16,15 +16,6 @@ #define MAX_CVP_ISE_CYCLES (MSM_CVP_NOMINAL_CYCLES - \ MSM_CVP_UHD60E_ISE_CYCLES) struct msm_cvp_fence_thread_data { struct msm_cvp_inst *inst; unsigned int device_id; struct cvp_kmd_hfi_fence_packet in_fence_pkt; unsigned int arg_type; }; static struct msm_cvp_fence_thread_data fence_thread_data; void print_cvp_internal_buffer(u32 tag, const char *str, struct msm_cvp_inst *inst, struct msm_cvp_internal_buffer *cbuf) { Loading Loading @@ -614,7 +605,7 @@ static int msm_cvp_thread_fence_run(void *data) if (!inst) { dprintk(CVP_ERR, "%s Wrong inst %pK\n", __func__, inst); rc = -EINVAL; goto exit; return rc; } in_fence_pkt = (struct cvp_kmd_hfi_fence_packet *) &fence_thread_data->in_fence_pkt; Loading Loading @@ -823,6 +814,7 @@ static int msm_cvp_thread_fence_run(void *data) } exit: kmem_cache_free(inst->fence_data_cache, fence_thread_data); cvp_put_inst(inst); do_exit(rc); } Loading @@ -839,6 +831,7 @@ static int msm_cvp_session_process_hfi_fence( struct cvp_kmd_hfi_packet *in_pkt; unsigned int signal, offset, buf_num, in_offset, in_buf_num; struct msm_cvp_inst *s; struct msm_cvp_fence_thread_data *fence_thread_data; dprintk(CVP_DBG, "%s: Enter inst = %#x", __func__, inst); Loading @@ -851,6 +844,14 @@ static int msm_cvp_session_process_hfi_fence( if (!s) return -ECONNRESET; fence_thread_data = kmem_cache_alloc(inst->fence_data_cache, GFP_KERNEL); if (!fence_thread_data) { dprintk(CVP_ERR, "%s: fence_thread_data alloc failed\n", __func__); return -ENOMEM; } in_offset = arg->buf_offset; in_buf_num = arg->buf_num; in_pkt = (struct cvp_kmd_hfi_packet *)&arg->data.hfi_pkt; Loading Loading @@ -878,15 +879,17 @@ static int msm_cvp_session_process_hfi_fence( goto exit; thread_num = thread_num + 1; fence_thread_data.inst = inst; fence_thread_data.device_id = (unsigned int)inst->core->id; memcpy(&fence_thread_data.in_fence_pkt, &arg->data.hfi_fence_pkt, fence_thread_data->inst = inst; fence_thread_data->device_id = (unsigned int)inst->core->id; memcpy(&fence_thread_data->in_fence_pkt, &arg->data.hfi_fence_pkt, sizeof(struct cvp_kmd_hfi_fence_packet)); fence_thread_data.arg_type = arg->type; fence_thread_data->arg_type = arg->type; snprintf(thread_fence_name, sizeof(thread_fence_name), "thread_fence_%d", thread_num); thread = kthread_run(msm_cvp_thread_fence_run, &fence_thread_data, thread_fence_name); fence_thread_data, thread_fence_name); if (!thread) kmem_cache_free(inst->fence_data_cache, fence_thread_data); exit: cvp_put_inst(s); Loading Loading @@ -1145,6 +1148,49 @@ static int msm_cvp_unregister_buffer(struct msm_cvp_inst *inst, return rc; } static int msm_cvp_session_create(struct msm_cvp_inst *inst) { int rc = 0; if (!inst || !inst->core) return -EINVAL; if (inst->state != MSM_CVP_CORE_INIT_DONE || inst->state > MSM_CVP_OPEN_DONE) { dprintk(CVP_ERR, "not ready create instance %d\n", inst->state); return -EINVAL; } rc = msm_cvp_comm_try_state(inst, MSM_CVP_OPEN_DONE); if (rc) { dprintk(CVP_ERR, "Failed to move instance to open done state\n"); goto fail_init; } rc = cvp_comm_set_arp_buffers(inst); if (rc) { dprintk(CVP_ERR, "Failed to set ARP buffers\n"); goto fail_init; } fail_init: return rc; } static int session_state_check_init(struct msm_cvp_inst *inst) { mutex_lock(&inst->lock); if (inst->state >= MSM_CVP_OPEN && inst->state < MSM_CVP_STOP) { mutex_unlock(&inst->lock); return 0; } mutex_unlock(&inst->lock); return msm_cvp_session_create(inst); } static int msm_cvp_session_start(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { Loading Loading @@ -1210,7 +1256,9 @@ static int msm_cvp_session_ctrl(struct msm_cvp_inst *inst, rc = msm_cvp_session_start(inst, arg); break; case SESSION_CREATE: rc = msm_cvp_session_create(inst); case SESSION_DELETE: break; case SESSION_INFO: default: dprintk(CVP_ERR, "%s Unsupported session ctrl%d\n", Loading @@ -1237,7 +1285,7 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst, hfi = hdev->hfi_device_data; switch (props->prop_data.prop_type) { case CVP_HFI_VERSION: case CVP_KMD_PROP_HFI_VERSION: { props->prop_data.data = hfi->version; break; Loading @@ -1250,6 +1298,49 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst, return rc; } static int msm_cvp_set_sysprop(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { struct cvp_kmd_sys_properties *props = &arg->data.sys_properties; struct cvp_kmd_sys_property *prop_array; struct cvp_session_prop *session_prop; int i, rc = 0; if (!inst) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } prop_array = &arg->data.sys_properties.prop_data; session_prop = &inst->prop; for (i = 0; i < props->prop_num; i++) { switch (prop_array[i].prop_type) { case CVP_KMD_PROP_SESSION_TYPE: session_prop->type = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_KERNELMASK: session_prop->kernel_mask = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_PRIORITY: session_prop->priority = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_SECURITY: session_prop->is_secure = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_DSPMASK: session_prop->dsp_mask = prop_array[i].data; break; default: dprintk(CVP_ERR, "unrecognized sys property to set %d\n", prop_array[i].prop_type); rc = -EFAULT; } } return rc; } int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { int rc = 0; Loading @@ -1260,6 +1351,18 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) } dprintk(CVP_DBG, "%s: arg->type = %x", __func__, arg->type); if (arg->type != CVP_KMD_SESSION_CONTROL && arg->type != CVP_KMD_SET_SYS_PROPERTY && arg->type != CVP_KMD_GET_SYS_PROPERTY) { rc = session_state_check_init(inst); if (rc) { dprintk(CVP_ERR, "session not ready for commands %d", arg->type); return rc; } } switch (arg->type) { case CVP_KMD_GET_SESSION_INFO: { Loading Loading @@ -1358,6 +1461,9 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) case CVP_KMD_GET_SYS_PROPERTY: rc = msm_cvp_get_sysprop(inst, arg); break; case CVP_KMD_SET_SYS_PROPERTY: rc = msm_cvp_set_sysprop(inst, arg); break; default: dprintk(CVP_DBG, "%s: unknown arg type %#x\n", __func__, arg->type); Loading @@ -1371,6 +1477,8 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) int msm_cvp_session_deinit(struct msm_cvp_inst *inst) { int rc = 0; struct cvp_hal_session *session; struct msm_cvp_internal_buffer *cbuf, *dummy; if (!inst || !inst->core) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); Loading @@ -1379,6 +1487,12 @@ int msm_cvp_session_deinit(struct msm_cvp_inst *inst) dprintk(CVP_DBG, "%s: inst %pK (%#x)\n", __func__, inst, hash32_ptr(inst->session)); session = (struct cvp_hal_session *)inst->session; if (!session) { dprintk(CVP_ERR, "%s: invalid session\n", __func__); return -EINVAL; } rc = msm_cvp_comm_try_state(inst, MSM_CVP_CLOSE_DONE); if (rc) dprintk(CVP_ERR, "%s: close failed\n", __func__); Loading @@ -1391,6 +1505,37 @@ int msm_cvp_session_deinit(struct msm_cvp_inst *inst) dprintk(CVP_ERR, "%s: failed to scale_clocks_and_bus\n", __func__); mutex_lock(&inst->cvpcpubufs.lock); list_for_each_entry_safe(cbuf, dummy, &inst->cvpcpubufs.list, list) { print_client_buffer(CVP_DBG, "remove from cvpcpubufs", inst, &cbuf->buf); msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem); list_del(&cbuf->list); } mutex_unlock(&inst->cvpcpubufs.lock); mutex_lock(&inst->cvpdspbufs.lock); list_for_each_entry_safe(cbuf, dummy, &inst->cvpdspbufs.list, list) { print_client_buffer(CVP_DBG, "remove from cvpdspbufs", inst, &cbuf->buf); rc = cvp_dsp_deregister_buffer( (uint32_t)cbuf->smem.device_addr, cbuf->buf.index, cbuf->buf.size, hash32_ptr(session)); if (rc) dprintk(CVP_ERR, "%s: failed dsp deregistration fd=%d rc=%d", __func__, cbuf->buf.fd, rc); msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem); list_del(&cbuf->list); } mutex_unlock(&inst->cvpdspbufs.lock); msm_cvp_comm_free_freq_table(inst); return rc; } Loading @@ -1412,5 +1557,11 @@ int msm_cvp_session_init(struct msm_cvp_inst *inst) inst->clk_data.ddr_bw = 1000; inst->clk_data.sys_cache_bw = 1000; inst->prop.type = HFI_SESSION_CV; inst->prop.kernel_mask = 0xFFFFFFFF; inst->prop.priority = 0; inst->prop.is_secure = 0; inst->prop.dsp_mask = 0; return rc; } Loading
drivers/media/platform/msm/cvp/cvp_hfi.h +0 −2 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ #define HFI_CMD_SYS_OX_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_CMD_START_OFFSET + 0x0000) #define HFI_CMD_SYS_SESSION_ABORT (HFI_CMD_SYS_OX_START + 0x001) #define HFI_CMD_SYS_PING (HFI_CMD_SYS_OX_START + 0x002) #define HFI_CMD_SESSION_OX_START \ Loading Loading @@ -149,7 +148,6 @@ #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_SESSION_ABORT_DONE (HFI_MSG_SYS_OX_START + 0x4) #define HFI_MSG_SESSION_OX_START \ (HFI_DOMAIN_BASE_COMMON + HFI_ARCH_OX_OFFSET + HFI_MSG_START_OFFSET + 0x1000) Loading
drivers/media/platform/msm/cvp/cvp_hfi_helper.h +2 −0 Original line number Diff line number Diff line Loading @@ -413,6 +413,7 @@ struct cvp_hfi_resource_syscache_info_type { #define HFI_CMD_SYS_SESSION_INIT (HFI_CMD_SYS_COMMON_START + 0x007) #define HFI_CMD_SYS_SESSION_END (HFI_CMD_SYS_COMMON_START + 0x008) #define HFI_CMD_SYS_SET_BUFFERS (HFI_CMD_SYS_COMMON_START + 0x009) #define HFI_CMD_SYS_SESSION_ABORT (HFI_CMD_SYS_COMMON_START + 0x00A) #define HFI_CMD_SYS_TEST_START (HFI_CMD_SYS_COMMON_START + 0x100) #define HFI_CMD_SESSION_COMMON_START \ Loading @@ -437,6 +438,7 @@ struct cvp_hfi_resource_syscache_info_type { #define HFI_MSG_SYS_IDLE (HFI_MSG_SYS_COMMON_START + 0x8) #define HFI_MSG_SYS_COV (HFI_MSG_SYS_COMMON_START + 0x9) #define HFI_MSG_SYS_PROPERTY_INFO (HFI_MSG_SYS_COMMON_START + 0xA) #define HFI_MSG_SYS_SESSION_ABORT_DONE (HFI_MSG_SYS_COMMON_START + 0xC) #define HFI_MSG_SESSION_SYNC_DONE (HFI_MSG_SESSION_OX_START + 0xD) #define HFI_MSG_SESSION_COMMON_START \ Loading
drivers/media/platform/msm/cvp/cvp_hfi_io.h +26 −13 Original line number Diff line number Diff line Loading @@ -189,19 +189,32 @@ #define CVP_NOC_ERR_ERRLOG3_HIGH_OFFS (CVP_NOC_BASE_OFFS + 0xBC) #define CVP_NOC_CORE_BASE_OFFS 0x00010000 #define CVP_NOC_CORE_ERR_SWID_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x80) #define CVP_NOC_CORE_ERR_SWID_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x84) #define CVP_NOC_CORE_ERR_MAINCTL_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x88) #define CVP_NOC_CORE_ERR_ERRVLD_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x90) #define CVP_NOC_CORE_ERR_ERRCLR_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0x98) #define CVP_NOC_CORE_ERR_ERRLOG0_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xA0) #define CVP_NOC_CORE_ERR_ERRLOG0_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xA4) #define CVP_NOC_CORE_ERR_ERRLOG1_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xA8) #define CVP_NOC_CORE_ERR_ERRLOG1_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xAC) #define CVP_NOC_CORE_ERR_ERRLOG2_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xB0) #define CVP_NOC_CORE_ERR_ERRLOG2_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xB4) #define CVP_NOC_CORE_ERR_ERRLOG3_LOW_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xB8) #define CVP_NOC_CORE_ERR_ERRLOG3_HIGH_OFFS (CVP_NOC_CORE_BASE_OFFS + 0xBC) #define CVP_NOC_CORE_ERR_SWID_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1200) #define CVP_NOC_CORE_ERR_SWID_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1204) #define CVP_NOC_CORE_ERR_MAINCTL_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1208) #define CVP_NOC_CORE_ERR_ERRVLD_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1210) #define CVP_NOC_CORE_ERR_ERRCLR_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1218) #define CVP_NOC_CORE_ERR_ERRLOG0_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1220) #define CVP_NOC_CORE_ERR_ERRLOG0_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1224) #define CVP_NOC_CORE_ERR_ERRLOG1_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1228) #define CVP_NOC_CORE_ERR_ERRLOG1_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x122C) #define CVP_NOC_CORE_ERR_ERRLOG2_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1230) #define CVP_NOC_CORE_ERR_ERRLOG2_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1234) #define CVP_NOC_CORE_ERR_ERRLOG3_LOW_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x1238) #define CVP_NOC_CORE_ERR_ERRLOG3_HIGH_OFFS \ (CVP_NOC_CORE_BASE_OFFS + 0x123C) #define CVP_AON_WRAPPER_MVP_NOC_LPI_CONTROL (CVP_AON_BASE_OFFS) Loading
drivers/media/platform/msm/cvp/hfi_packetization.c +7 −6 Original line number Diff line number Diff line Loading @@ -201,18 +201,19 @@ inline int cvp_create_pkt_cmd_sys_session_init( struct cvp_hal_session *session) { int rc = 0; struct msm_cvp_inst *inst = session->session_id; if (!pkt) if (!pkt || !inst) return -EINVAL; pkt->size = sizeof(struct cvp_hfi_cmd_sys_session_init_packet); pkt->packet_type = HFI_CMD_SYS_SESSION_INIT; pkt->session_id = hash32_ptr(session); pkt->session_kmask = 0xFFFFFFFF; pkt->session_type = HFI_SESSION_CV; pkt->session_prio = 0; pkt->is_secure = 0; pkt->dsp_ac_mask = 0; pkt->session_type = inst->prop.type; pkt->session_kmask = inst->prop.kernel_mask; pkt->session_prio = inst->prop.priority; pkt->is_secure = inst->prop.is_secure; pkt->dsp_ac_mask = inst->prop.dsp_mask; return rc; } Loading
drivers/media/platform/msm/cvp/msm_cvp.c +167 −16 Original line number Diff line number Diff line Loading @@ -16,15 +16,6 @@ #define MAX_CVP_ISE_CYCLES (MSM_CVP_NOMINAL_CYCLES - \ MSM_CVP_UHD60E_ISE_CYCLES) struct msm_cvp_fence_thread_data { struct msm_cvp_inst *inst; unsigned int device_id; struct cvp_kmd_hfi_fence_packet in_fence_pkt; unsigned int arg_type; }; static struct msm_cvp_fence_thread_data fence_thread_data; void print_cvp_internal_buffer(u32 tag, const char *str, struct msm_cvp_inst *inst, struct msm_cvp_internal_buffer *cbuf) { Loading Loading @@ -614,7 +605,7 @@ static int msm_cvp_thread_fence_run(void *data) if (!inst) { dprintk(CVP_ERR, "%s Wrong inst %pK\n", __func__, inst); rc = -EINVAL; goto exit; return rc; } in_fence_pkt = (struct cvp_kmd_hfi_fence_packet *) &fence_thread_data->in_fence_pkt; Loading Loading @@ -823,6 +814,7 @@ static int msm_cvp_thread_fence_run(void *data) } exit: kmem_cache_free(inst->fence_data_cache, fence_thread_data); cvp_put_inst(inst); do_exit(rc); } Loading @@ -839,6 +831,7 @@ static int msm_cvp_session_process_hfi_fence( struct cvp_kmd_hfi_packet *in_pkt; unsigned int signal, offset, buf_num, in_offset, in_buf_num; struct msm_cvp_inst *s; struct msm_cvp_fence_thread_data *fence_thread_data; dprintk(CVP_DBG, "%s: Enter inst = %#x", __func__, inst); Loading @@ -851,6 +844,14 @@ static int msm_cvp_session_process_hfi_fence( if (!s) return -ECONNRESET; fence_thread_data = kmem_cache_alloc(inst->fence_data_cache, GFP_KERNEL); if (!fence_thread_data) { dprintk(CVP_ERR, "%s: fence_thread_data alloc failed\n", __func__); return -ENOMEM; } in_offset = arg->buf_offset; in_buf_num = arg->buf_num; in_pkt = (struct cvp_kmd_hfi_packet *)&arg->data.hfi_pkt; Loading Loading @@ -878,15 +879,17 @@ static int msm_cvp_session_process_hfi_fence( goto exit; thread_num = thread_num + 1; fence_thread_data.inst = inst; fence_thread_data.device_id = (unsigned int)inst->core->id; memcpy(&fence_thread_data.in_fence_pkt, &arg->data.hfi_fence_pkt, fence_thread_data->inst = inst; fence_thread_data->device_id = (unsigned int)inst->core->id; memcpy(&fence_thread_data->in_fence_pkt, &arg->data.hfi_fence_pkt, sizeof(struct cvp_kmd_hfi_fence_packet)); fence_thread_data.arg_type = arg->type; fence_thread_data->arg_type = arg->type; snprintf(thread_fence_name, sizeof(thread_fence_name), "thread_fence_%d", thread_num); thread = kthread_run(msm_cvp_thread_fence_run, &fence_thread_data, thread_fence_name); fence_thread_data, thread_fence_name); if (!thread) kmem_cache_free(inst->fence_data_cache, fence_thread_data); exit: cvp_put_inst(s); Loading Loading @@ -1145,6 +1148,49 @@ static int msm_cvp_unregister_buffer(struct msm_cvp_inst *inst, return rc; } static int msm_cvp_session_create(struct msm_cvp_inst *inst) { int rc = 0; if (!inst || !inst->core) return -EINVAL; if (inst->state != MSM_CVP_CORE_INIT_DONE || inst->state > MSM_CVP_OPEN_DONE) { dprintk(CVP_ERR, "not ready create instance %d\n", inst->state); return -EINVAL; } rc = msm_cvp_comm_try_state(inst, MSM_CVP_OPEN_DONE); if (rc) { dprintk(CVP_ERR, "Failed to move instance to open done state\n"); goto fail_init; } rc = cvp_comm_set_arp_buffers(inst); if (rc) { dprintk(CVP_ERR, "Failed to set ARP buffers\n"); goto fail_init; } fail_init: return rc; } static int session_state_check_init(struct msm_cvp_inst *inst) { mutex_lock(&inst->lock); if (inst->state >= MSM_CVP_OPEN && inst->state < MSM_CVP_STOP) { mutex_unlock(&inst->lock); return 0; } mutex_unlock(&inst->lock); return msm_cvp_session_create(inst); } static int msm_cvp_session_start(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { Loading Loading @@ -1210,7 +1256,9 @@ static int msm_cvp_session_ctrl(struct msm_cvp_inst *inst, rc = msm_cvp_session_start(inst, arg); break; case SESSION_CREATE: rc = msm_cvp_session_create(inst); case SESSION_DELETE: break; case SESSION_INFO: default: dprintk(CVP_ERR, "%s Unsupported session ctrl%d\n", Loading @@ -1237,7 +1285,7 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst, hfi = hdev->hfi_device_data; switch (props->prop_data.prop_type) { case CVP_HFI_VERSION: case CVP_KMD_PROP_HFI_VERSION: { props->prop_data.data = hfi->version; break; Loading @@ -1250,6 +1298,49 @@ static int msm_cvp_get_sysprop(struct msm_cvp_inst *inst, return rc; } static int msm_cvp_set_sysprop(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { struct cvp_kmd_sys_properties *props = &arg->data.sys_properties; struct cvp_kmd_sys_property *prop_array; struct cvp_session_prop *session_prop; int i, rc = 0; if (!inst) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } prop_array = &arg->data.sys_properties.prop_data; session_prop = &inst->prop; for (i = 0; i < props->prop_num; i++) { switch (prop_array[i].prop_type) { case CVP_KMD_PROP_SESSION_TYPE: session_prop->type = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_KERNELMASK: session_prop->kernel_mask = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_PRIORITY: session_prop->priority = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_SECURITY: session_prop->is_secure = prop_array[i].data; break; case CVP_KMD_PROP_SESSION_DSPMASK: session_prop->dsp_mask = prop_array[i].data; break; default: dprintk(CVP_ERR, "unrecognized sys property to set %d\n", prop_array[i].prop_type); rc = -EFAULT; } } return rc; } int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) { int rc = 0; Loading @@ -1260,6 +1351,18 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) } dprintk(CVP_DBG, "%s: arg->type = %x", __func__, arg->type); if (arg->type != CVP_KMD_SESSION_CONTROL && arg->type != CVP_KMD_SET_SYS_PROPERTY && arg->type != CVP_KMD_GET_SYS_PROPERTY) { rc = session_state_check_init(inst); if (rc) { dprintk(CVP_ERR, "session not ready for commands %d", arg->type); return rc; } } switch (arg->type) { case CVP_KMD_GET_SESSION_INFO: { Loading Loading @@ -1358,6 +1461,9 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) case CVP_KMD_GET_SYS_PROPERTY: rc = msm_cvp_get_sysprop(inst, arg); break; case CVP_KMD_SET_SYS_PROPERTY: rc = msm_cvp_set_sysprop(inst, arg); break; default: dprintk(CVP_DBG, "%s: unknown arg type %#x\n", __func__, arg->type); Loading @@ -1371,6 +1477,8 @@ int msm_cvp_handle_syscall(struct msm_cvp_inst *inst, struct cvp_kmd_arg *arg) int msm_cvp_session_deinit(struct msm_cvp_inst *inst) { int rc = 0; struct cvp_hal_session *session; struct msm_cvp_internal_buffer *cbuf, *dummy; if (!inst || !inst->core) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); Loading @@ -1379,6 +1487,12 @@ int msm_cvp_session_deinit(struct msm_cvp_inst *inst) dprintk(CVP_DBG, "%s: inst %pK (%#x)\n", __func__, inst, hash32_ptr(inst->session)); session = (struct cvp_hal_session *)inst->session; if (!session) { dprintk(CVP_ERR, "%s: invalid session\n", __func__); return -EINVAL; } rc = msm_cvp_comm_try_state(inst, MSM_CVP_CLOSE_DONE); if (rc) dprintk(CVP_ERR, "%s: close failed\n", __func__); Loading @@ -1391,6 +1505,37 @@ int msm_cvp_session_deinit(struct msm_cvp_inst *inst) dprintk(CVP_ERR, "%s: failed to scale_clocks_and_bus\n", __func__); mutex_lock(&inst->cvpcpubufs.lock); list_for_each_entry_safe(cbuf, dummy, &inst->cvpcpubufs.list, list) { print_client_buffer(CVP_DBG, "remove from cvpcpubufs", inst, &cbuf->buf); msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem); list_del(&cbuf->list); } mutex_unlock(&inst->cvpcpubufs.lock); mutex_lock(&inst->cvpdspbufs.lock); list_for_each_entry_safe(cbuf, dummy, &inst->cvpdspbufs.list, list) { print_client_buffer(CVP_DBG, "remove from cvpdspbufs", inst, &cbuf->buf); rc = cvp_dsp_deregister_buffer( (uint32_t)cbuf->smem.device_addr, cbuf->buf.index, cbuf->buf.size, hash32_ptr(session)); if (rc) dprintk(CVP_ERR, "%s: failed dsp deregistration fd=%d rc=%d", __func__, cbuf->buf.fd, rc); msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem); list_del(&cbuf->list); } mutex_unlock(&inst->cvpdspbufs.lock); msm_cvp_comm_free_freq_table(inst); return rc; } Loading @@ -1412,5 +1557,11 @@ int msm_cvp_session_init(struct msm_cvp_inst *inst) inst->clk_data.ddr_bw = 1000; inst->clk_data.sys_cache_bw = 1000; inst->prop.type = HFI_SESSION_CV; inst->prop.kernel_mask = 0xFFFFFFFF; inst->prop.priority = 0; inst->prop.is_secure = 0; inst->prop.dsp_mask = 0; return rc; }