コード例 #1
0
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;
}
コード例 #2
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;
}
コード例 #3
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;
}
コード例 #4
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;
}
コード例 #5
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;
}