u32 ddl_reset_hw(u32 mode) { struct ddl_context *ddl_context; struct ddl_client_context *ddl; int i_client_num; VIDC_LOG_STRING("ddl_reset_hw:called"); ddl_context = ddl_get_context(); ddl_move_command_state(ddl_context, DDL_CMD_INVALID); DDL_BUSY(ddl_context); if (ddl_context->core_virtual_base_addr) vidc_720p_do_sw_reset(); ddl_context->device_state = DDL_DEVICE_NOTINIT; for (i_client_num = 0; i_client_num < VCD_MAX_NO_CLIENT; ++i_client_num) { ddl = ddl_context->ddl_clients[i_client_num]; ddl_context->ddl_clients[i_client_num] = NULL; if (ddl) { ddl_release_client_internal_buffers(ddl); ddl_client_transact(DDL_FREE_CLIENT, &ddl); } } ddl_release_context_buffers(ddl_context); DDL_MEMSET(ddl_context, 0, sizeof(struct ddl_context)); return true; }
u32 ddl_reset_hw(u32 n_mode) { struct ddl_context_type *p_ddl_context; struct ddl_client_context_type *p_ddl; int i_client_num; VIDC_LOG_STRING("ddl_reset_hw:called"); p_ddl_context = ddl_get_context(); ddl_move_command_state(p_ddl_context, DDL_CMD_INVALID); DDL_BUSY(p_ddl_context); if (NULL != p_ddl_context->p_core_virtual_base_addr) vidc_720p_do_sw_reset(); p_ddl_context->n_device_state = DDL_DEVICE_NOTINIT; for (i_client_num = 0; i_client_num < VCD_MAX_NO_CLIENT; ++i_client_num) { p_ddl = p_ddl_context->a_ddl_clients[i_client_num]; p_ddl_context->a_ddl_clients[i_client_num] = NULL; if (p_ddl) { ddl_release_client_internal_buffers(p_ddl); ddl_client_transact(DDL_FREE_CLIENT, &p_ddl); } } ddl_release_context_buffers(p_ddl_context); DDL_MEMSET(p_ddl_context, 0, sizeof(struct ddl_context_type)); VIDC_LOG_BUFFER_INIT; return TRUE; }
u32 ddl_client_transact(u32 operation, struct ddl_client_context_type **pddl_client) { u32 ret_status = VCD_ERR_FAIL; u32 n_counter; struct ddl_context_type *p_ddl_context; p_ddl_context = ddl_get_context(); switch (operation) { case DDL_FREE_CLIENT: { if (pddl_client && *pddl_client) { u32 n_channel_id; n_channel_id = (*pddl_client)->n_channel_id; if (n_channel_id < VCD_MAX_NO_CLIENT) { p_ddl_context-> a_ddl_clients[n_channel_id] = NULL; } else { VIDC_LOG_STRING("CHID_CORRUPTION"); } DDL_FREE(*pddl_client); ret_status = VCD_S_SUCCESS; } break; } case DDL_GET_CLIENT: { ret_status = VCD_ERR_MAX_CLIENT; for (n_counter = 0; n_counter < VCD_MAX_NO_CLIENT && ret_status == VCD_ERR_MAX_CLIENT; ++n_counter) { if (!p_ddl_context->a_ddl_clients[n_counter]) { *pddl_client = (struct ddl_client_context_type *) DDL_MALLOC(sizeof (struct ddl_client_context_type) ); if (!*pddl_client) { ret_status = VCD_ERR_ALLOC_FAIL; } else { DDL_MEMSET(*pddl_client, 0, sizeof(struct ddl_client_context_type)); p_ddl_context-> a_ddl_clients[n_counter] = *pddl_client; (*pddl_client)->n_channel_id = n_counter; (*pddl_client)->p_ddl_context = p_ddl_context; ret_status = VCD_S_SUCCESS; } } } break; } case DDL_INIT_CLIENTS: { for (n_counter = 0; n_counter < VCD_MAX_NO_CLIENT; ++n_counter) { p_ddl_context->a_ddl_clients[n_counter] = NULL; } ret_status = VCD_S_SUCCESS; break; } case DDL_ACTIVE_CLIENT: { for (n_counter = 0; n_counter < VCD_MAX_NO_CLIENT; ++n_counter) { if (p_ddl_context->a_ddl_clients[n_counter]) { ret_status = VCD_S_SUCCESS; break; } } break; } default: { ret_status = VCD_ERR_ILLEGAL_PARM; break; } } return ret_status; }
u32 ddl_device_init(struct ddl_init_config *ddl_init_config, void *client_data) { struct ddl_context *ddl_context; u32 status = VCD_S_SUCCESS; if ((!ddl_init_config) || (!ddl_init_config->ddl_callback) || (!ddl_init_config->core_virtual_base_addr) ) { VIDC_LOGERR_STRING("ddl_dev_init:Bad_argument"); return VCD_ERR_ILLEGAL_PARM; } ddl_context = ddl_get_context(); if (DDL_IS_INITIALIZED(ddl_context)) { VIDC_LOGERR_STRING("ddl_dev_init:Multiple_init"); return VCD_ERR_ILLEGAL_OP; } if (DDL_IS_BUSY(ddl_context)) { VIDC_LOGERR_STRING("ddl_dev_init:Ddl_busy"); return VCD_ERR_BUSY; } DDL_MEMSET(ddl_context, 0, sizeof(struct ddl_context)); DDL_BUSY(ddl_context); ddl_context->ddl_callback = ddl_init_config->ddl_callback; ddl_context->interrupt_clr = ddl_init_config->interrupt_clr; ddl_context->core_virtual_base_addr = ddl_init_config->core_virtual_base_addr; ddl_context->client_data = client_data; vidc_720p_set_device_virtual_base(ddl_context-> core_virtual_base_addr); ddl_context->current_ddl = NULL; ddl_move_command_state(ddl_context, DDL_CMD_INVALID); ddl_client_transact(DDL_INIT_CLIENTS, NULL); ddl_pmem_alloc(&ddl_context->context_buf_addr, DDL_CONTEXT_MEMORY, DDL_LINEAR_BUFFER_ALIGN_BYTES); if (!ddl_context->context_buf_addr.virtual_base_addr) { VIDC_LOGERR_STRING("ddl_dev_init:Context_alloc_fail"); status = VCD_ERR_ALLOC_FAIL; } if (!status) { ddl_pmem_alloc(&ddl_context->db_line_buffer, DDL_DB_LINE_BUF_SIZE, DDL_TILE_BUFFER_ALIGN_BYTES); if (!ddl_context->db_line_buffer.virtual_base_addr) { VIDC_LOGERR_STRING("ddl_dev_init:Line_buf_alloc_fail"); status = VCD_ERR_ALLOC_FAIL; } } if (!status) { ddl_pmem_alloc(&ddl_context->data_partition_tempbuf, DDL_MPEG4_DATA_PARTITION_BUF_SIZE, DDL_TILE_BUFFER_ALIGN_BYTES); if (ddl_context->data_partition_tempbuf.virtual_base_addr \ == NULL) { VIDC_LOGERR_STRING ("ddl_dev_init:Data_partition_buf_alloc_fail"); status = VCD_ERR_ALLOC_FAIL; } } if (!status) { ddl_pmem_alloc(&ddl_context->metadata_shared_input, DDL_METADATA_TOTAL_INPUTBUFSIZE, DDL_LINEAR_BUFFER_ALIGN_BYTES); if (!ddl_context->metadata_shared_input.virtual_base_addr) { VIDC_LOGERR_STRING ("ddl_dev_init:metadata_shared_input_alloc_fail"); status = VCD_ERR_ALLOC_FAIL; } } if (!status) { ddl_pmem_alloc(&ddl_context->dbg_core_dump, \ DDL_DBG_CORE_DUMP_SIZE, \ DDL_LINEAR_BUFFER_ALIGN_BYTES); if (!ddl_context->dbg_core_dump.virtual_base_addr) { VIDC_LOGERR_STRING ("ddl_dev_init:dbg_core_dump_alloc_failed"); status = VCD_ERR_ALLOC_FAIL; } ddl_context->enable_dbg_core_dump = 0; } if (!status && !vcd_fw_init()) { VIDC_LOGERR_STRING("ddl_dev_init:fw_init_failed"); status = VCD_ERR_ALLOC_FAIL; } if (status) { ddl_release_context_buffers(ddl_context); DDL_IDLE(ddl_context); return status; } ddl_move_command_state(ddl_context, DDL_CMD_DMA_INIT); ddl_core_init(ddl_context); return status; }