Ensure FMODE_NONOTIFY is not set by userspace
[pandora-kernel.git] / drivers / staging / dream / qdsp5 / adsp_lpm_verify_cmd.c
1 /* arch/arm/mach-msm/qdsp5/adsp_lpm_verify_cmd.c
2  *
3  * Verificion code for aDSP LPM packets from userspace.
4  *
5  * Copyright (c) 2008 QUALCOMM Incorporated
6  * Copyright (C) 2008 Google, Inc.
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  */
18
19 #include <mach/qdsp5/qdsp5lpmcmdi.h>
20 #include "adsp.h"
21
22 int adsp_lpm_verify_cmd(struct msm_adsp_module *module,
23                          unsigned int queue_id, void *cmd_data,
24                          size_t cmd_size)
25 {
26         uint32_t cmd_id, col_height, input_row_incr, output_row_incr,
27                 input_size, output_size;
28         uint32_t size_mask = 0x0fff;
29         lpm_cmd_start *cmd;
30
31         if (queue_id != QDSP_lpmCommandQueue) {
32                 printk(KERN_ERR "adsp: module %s: wrong queue id %d\n",
33                         module->name, queue_id);
34                 return -1;
35         }
36
37         cmd = (lpm_cmd_start *)cmd_data;
38         cmd_id = cmd->cmd_id;
39
40         if (cmd_id == LPM_CMD_START) {
41                 if (cmd_size != sizeof(lpm_cmd_start)) {
42                         printk(KERN_ERR "adsp: module %s: wrong size %d, expect %d\n",
43                                 module->name, cmd_size, sizeof(lpm_cmd_start));
44                         return -1;
45                 }
46                 col_height = cmd->ip_data_cfg_part1 & size_mask;
47                 input_row_incr = cmd->ip_data_cfg_part2 & size_mask;
48                 output_row_incr = cmd->op_data_cfg_part1 & size_mask;
49                 input_size = col_height * input_row_incr;
50                 output_size = col_height * output_row_incr;
51                 if ((cmd->ip_data_cfg_part4 && adsp_pmem_fixup(module,
52                                     (void **)(&cmd->ip_data_cfg_part4),
53                                     input_size)) ||
54                    (cmd->op_data_cfg_part3 && adsp_pmem_fixup(module,
55                                     (void **)(&cmd->op_data_cfg_part3),
56                                     output_size)))
57                         return -1;
58         } else if (cmd_id > 1) {
59                 printk(KERN_ERR "adsp: module %s: invalid cmd_id %d\n",
60                         module->name, cmd_id);
61                 return -1;
62         }
63         return 0;
64 }
65