static int verify_vfe_command_table(struct msm_adsp_module *module, void *cmd_data, size_t cmd_size) { uint32_t cmd_id = ((uint32_t *)cmd_data)[0]; int i; switch (cmd_id) { case VFE_CMD_AXI_IP_CFG: { vfe_cmd_axi_ip_cfg *cmd = (vfe_cmd_axi_ip_cfg *)cmd_data; uint32_t size; if (cmd_size != sizeof(vfe_cmd_axi_ip_cfg)) { printk(KERN_ERR "adsp: module %s: invalid VFE TABLE (VFE_CMD_AXI_IP_CFG) command size %d\n", module->name, cmd_size); return -1; } size = get_size(cmd->ip_cfg_part2); for (i = 0; i < 8; i++) { void **addr = (void **) &cmd->ip_buf_addr[i]; if (*addr && adsp_pmem_fixup(module, addr, size)) return -1; } } case VFE_CMD_AXI_OP_CFG: { vfe_cmd_axi_op_cfg *cmd = (vfe_cmd_axi_op_cfg *)cmd_data; void **addr1_y, **addr2_y, **addr1_cbcr, **addr2_cbcr; if (cmd_size != sizeof(vfe_cmd_axi_op_cfg)) { printk(KERN_ERR "adsp: module %s: invalid VFE TABLE (VFE_CMD_AXI_OP_CFG) command size %d\n", module->name, cmd_size); return -1; } size1_y = get_size(cmd->op1_y_cfg_part2); size1_cbcr = get_size(cmd->op1_cbcr_cfg_part2); size2_y = get_size(cmd->op2_y_cfg_part2); size2_cbcr = get_size(cmd->op2_cbcr_cfg_part2); for (i = 0; i < 8; i++) { addr1_y = (void **)(&cmd->op1_buf1_addr[2*i]); addr1_cbcr = (void **)(&cmd->op1_buf1_addr[2*i+1]); addr2_y = (void **)(&cmd->op2_buf1_addr[2*i]); addr2_cbcr = (void **)(&cmd->op2_buf1_addr[2*i+1]); if ((*addr1_y && adsp_pmem_fixup(module, addr1_y, size1_y)) || (*addr1_cbcr && adsp_pmem_fixup(module, addr1_cbcr, size1_cbcr)) || (*addr2_y && adsp_pmem_fixup(module, addr2_y, size2_y)) || (*addr2_cbcr && adsp_pmem_fixup(module, addr2_cbcr, size2_cbcr))) return -1; } } default: if (cmd_id > 4) { printk(KERN_ERR "adsp: module %s: invalid VFE TABLE command id %d\n", module->name, cmd_id); return -1; } } return 0; }
static inline int verify_cmd_op_ack(struct msm_adsp_module *module, void *cmd_data, size_t cmd_size) { vfe_cmd_op1_ack *cmd = (vfe_cmd_op1_ack *)cmd_data; void **addr_y = (void **)&cmd->op1_buf_y_addr; void **addr_cbcr = (void **)(&cmd->op1_buf_cbcr_addr); if (cmd_size != sizeof(vfe_cmd_op1_ack)) return -1; if ((*addr_y && adsp_pmem_fixup(module, addr_y, size1_y)) || (*addr_cbcr && adsp_pmem_fixup(module, addr_cbcr, size1_cbcr))) return -1; return 0; }
int adsp_lpm_verify_cmd(struct msm_adsp_module *module, unsigned int queue_id, void *cmd_data, size_t cmd_size) { uint32_t cmd_id, col_height, input_row_incr, output_row_incr, input_size, output_size; uint32_t size_mask = 0x0fff; lpm_cmd_start *cmd; if (queue_id != QDSP_lpmCommandQueue) { printk(KERN_ERR "adsp: module %s: wrong queue id %d\n", module->name, queue_id); return -1; } cmd = (lpm_cmd_start *)cmd_data; cmd_id = cmd->cmd_id; if (cmd_id == LPM_CMD_START) { if (cmd_size != sizeof(lpm_cmd_start)) { printk(KERN_ERR "adsp: module %s: wrong size %d, expect %d\n", module->name, cmd_size, sizeof(lpm_cmd_start)); return -1; } col_height = cmd->ip_data_cfg_part1 & size_mask; input_row_incr = cmd->ip_data_cfg_part2 & size_mask; output_row_incr = cmd->op_data_cfg_part1 & size_mask; input_size = col_height * input_row_incr; output_size = col_height * output_row_incr; if ((cmd->ip_data_cfg_part4 && adsp_pmem_fixup(module, (void **)(&cmd->ip_data_cfg_part4), input_size)) || (cmd->op_data_cfg_part3 && adsp_pmem_fixup(module, (void **)(&cmd->op_data_cfg_part3), output_size))) return -1; } else if (cmd_id > 1) { printk(KERN_ERR "adsp: module %s: invalid cmd_id %d\n", module->name, cmd_id); return -1; } return 0; }
static inline int verify_cmd_stats_af_ack(struct msm_adsp_module *module, void *cmd_data, size_t cmd_size) { vfe_cmd_stats_af_ack *cmd = (vfe_cmd_stats_af_ack *)cmd_data; void **addr = (void **)&cmd->af_stats_op_buf; if (cmd_size != sizeof(vfe_cmd_stats_af_ack)) return -1; if (*addr && adsp_pmem_fixup(module, addr, af_size)) return -1; return 0; }
static inline int verify_cmd_stats_wb_exp_cfg(struct msm_adsp_module *module, void *cmd_data, size_t cmd_size) { vfe_cmd_stats_wb_exp_cfg *cmd = (vfe_cmd_stats_wb_exp_cfg *)cmd_data; int i; if (cmd_size != sizeof(vfe_cmd_stats_wb_exp_cfg)) return -1; for (i = 0; i < 3; i++) { void **addr = (void **)(&cmd->wb_exp_stats_op_buf[i]); if (*addr && adsp_pmem_fixup(module, addr, awb_size)) return -1; } return 0; }