1/* arch/arm/mach-msm/qdsp5/adsp_6225.h 2 * 3 * Copyright (c) 2008 QUALCOMM Incorporated. 4 * 5 * This software is licensed under the terms of the GNU General Public 6 * License version 2, as published by the Free Software Foundation, and 7 * may be copied, distributed, and modified under those terms. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 */ 15 16#include "adsp.h" 17 18/* Firmware modules */ 19typedef enum { 20 QDSP_MODULE_KERNEL, 21 QDSP_MODULE_AFETASK, 22 QDSP_MODULE_AUDPLAY0TASK, 23 QDSP_MODULE_AUDPLAY1TASK, 24 QDSP_MODULE_AUDPPTASK, 25 QDSP_MODULE_VIDEOTASK, 26 QDSP_MODULE_VIDEO_AAC_VOC, 27 QDSP_MODULE_PCM_DEC, 28 QDSP_MODULE_AUDIO_DEC_MP3, 29 QDSP_MODULE_AUDIO_DEC_AAC, 30 QDSP_MODULE_AUDIO_DEC_WMA, 31 QDSP_MODULE_HOSTPCM, 32 QDSP_MODULE_DTMF, 33 QDSP_MODULE_AUDRECTASK, 34 QDSP_MODULE_AUDPREPROCTASK, 35 QDSP_MODULE_SBC_ENC, 36 QDSP_MODULE_VOC_UMTS, 37 QDSP_MODULE_VOC_CDMA, 38 QDSP_MODULE_VOC_PCM, 39 QDSP_MODULE_VOCENCTASK, 40 QDSP_MODULE_VOCDECTASK, 41 QDSP_MODULE_VOICEPROCTASK, 42 QDSP_MODULE_VIDEOENCTASK, 43 QDSP_MODULE_VFETASK, 44 QDSP_MODULE_WAV_ENC, 45 QDSP_MODULE_AACLC_ENC, 46 QDSP_MODULE_VIDEO_AMR, 47 QDSP_MODULE_VOC_AMR, 48 QDSP_MODULE_VOC_EVRC, 49 QDSP_MODULE_VOC_13K, 50 QDSP_MODULE_VOC_FGV, 51 QDSP_MODULE_DIAGTASK, 52 QDSP_MODULE_JPEGTASK, 53 QDSP_MODULE_LPMTASK, 54 QDSP_MODULE_QCAMTASK, 55 QDSP_MODULE_MODMATHTASK, 56 QDSP_MODULE_AUDPLAY2TASK, 57 QDSP_MODULE_AUDPLAY3TASK, 58 QDSP_MODULE_AUDPLAY4TASK, 59 QDSP_MODULE_GRAPHICSTASK, 60 QDSP_MODULE_MIDI, 61 QDSP_MODULE_GAUDIO, 62 QDSP_MODULE_VDEC_LP_MODE, 63 QDSP_MODULE_MAX, 64} qdsp_module_type; 65 66#define QDSP_RTOS_MAX_TASK_ID 30U 67 68/* Table of modules indexed by task ID for the GAUDIO image */ 69static qdsp_module_type qdsp_gaudio_task_to_module_table[] = { 70 QDSP_MODULE_KERNEL, 71 QDSP_MODULE_AFETASK, 72 QDSP_MODULE_MAX, 73 QDSP_MODULE_MAX, 74 QDSP_MODULE_MAX, 75 QDSP_MODULE_MAX, 76 QDSP_MODULE_MAX, 77 QDSP_MODULE_MAX, 78 QDSP_MODULE_MAX, 79 QDSP_MODULE_AUDPPTASK, 80 QDSP_MODULE_AUDPLAY0TASK, 81 QDSP_MODULE_AUDPLAY1TASK, 82 QDSP_MODULE_AUDPLAY2TASK, 83 QDSP_MODULE_AUDPLAY3TASK, 84 QDSP_MODULE_AUDPLAY4TASK, 85 QDSP_MODULE_MAX, 86 QDSP_MODULE_AUDRECTASK, 87 QDSP_MODULE_AUDPREPROCTASK, 88 QDSP_MODULE_MAX, 89 QDSP_MODULE_GRAPHICSTASK, 90 QDSP_MODULE_MAX, 91 QDSP_MODULE_MAX, 92 QDSP_MODULE_MAX, 93 QDSP_MODULE_MAX, 94 QDSP_MODULE_MAX, 95 QDSP_MODULE_MAX, 96 QDSP_MODULE_MAX, 97 QDSP_MODULE_MAX, 98 QDSP_MODULE_MAX, 99 QDSP_MODULE_MAX, 100 QDSP_MODULE_MAX, 101 QDSP_MODULE_MAX, 102}; 103 104/* Queue offset table indexed by queue ID for the GAUDIO image */ 105static uint32_t qdsp_gaudio_queue_offset_table[] = { 106 QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ 107 0x3f0, /* QDSP_mpuAfeQueue */ 108 0x420, /* QDSP_mpuGraphicsCmdQueue */ 109 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ 110 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecCmdQueue */ 111 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVDecPktQueue */ 112 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ 113 QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ 114 QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ 115 QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ 116 0x3f4, /* QDSP_uPAudPPCmd1Queue */ 117 0x3f8, /* QDSP_uPAudPPCmd2Queue */ 118 0x3fc, /* QDSP_uPAudPPCmd3Queue */ 119 0x40c, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ 120 0x410, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ 121 0x414, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ 122 0x418, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ 123 0x41c, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ 124 0x400, /* QDSP_uPAudPreProcCmdQueue */ 125 0x408, /* QDSP_uPAudRecBitStreamQueue */ 126 0x404, /* QDSP_uPAudRecCmdQueue */ 127 QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ 128 QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ 129 QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ 130 QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ 131 QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ 132 QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandTableQueue */ 133 QDSP_RTOS_NO_QUEUE, /* QDSP_uPDiagQueue */ 134}; 135 136/* Table of modules indexed by task ID for the COMBO image */ 137static qdsp_module_type qdsp_combo_task_to_module_table[] = { 138 QDSP_MODULE_KERNEL, 139 QDSP_MODULE_AFETASK, 140 QDSP_MODULE_VOCDECTASK, 141 QDSP_MODULE_VOCENCTASK, 142 QDSP_MODULE_VIDEOTASK, 143 QDSP_MODULE_VIDEOENCTASK, 144 QDSP_MODULE_VOICEPROCTASK, 145 QDSP_MODULE_VFETASK, 146 QDSP_MODULE_JPEGTASK, 147 QDSP_MODULE_AUDPPTASK, 148 QDSP_MODULE_AUDPLAY0TASK, 149 QDSP_MODULE_AUDPLAY1TASK, 150 QDSP_MODULE_MAX, 151 QDSP_MODULE_MAX, 152 QDSP_MODULE_MAX, 153 QDSP_MODULE_LPMTASK, 154 QDSP_MODULE_AUDRECTASK, 155 QDSP_MODULE_AUDPREPROCTASK, 156 QDSP_MODULE_MODMATHTASK, 157 QDSP_MODULE_MAX, 158 QDSP_MODULE_MAX, 159 QDSP_MODULE_MAX, 160 QDSP_MODULE_MAX, 161 QDSP_MODULE_MAX, 162 QDSP_MODULE_MAX, 163 QDSP_MODULE_MAX, 164 QDSP_MODULE_MAX, 165 QDSP_MODULE_MAX, 166 QDSP_MODULE_MAX, 167 QDSP_MODULE_MAX, 168 QDSP_MODULE_DIAGTASK, 169 QDSP_MODULE_MAX, 170}; 171 172/* Queue offset table indexed by queue ID for the COMBO image */ 173static uint32_t qdsp_combo_queue_offset_table[] = { 174 0x714, /* QDSP_lpmCommandQueue */ 175 0x6bc, /* QDSP_mpuAfeQueue */ 176 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ 177 0x6d0, /* QDSP_mpuModmathCmdQueue */ 178 0x6e8, /* QDSP_mpuVDecCmdQueue */ 179 0x6ec, /* QDSP_mpuVDecPktQueue */ 180 0x6e4, /* QDSP_mpuVEncCmdQueue */ 181 0x6c4, /* QDSP_rxMpuDecCmdQueue */ 182 0x6c8, /* QDSP_rxMpuDecPktQueue */ 183 0x6cc, /* QDSP_txMpuEncQueue */ 184 0x6f0, /* QDSP_uPAudPPCmd1Queue */ 185 0x6f4, /* QDSP_uPAudPPCmd2Queue */ 186 0x6f8, /* QDSP_uPAudPPCmd3Queue */ 187 0x708, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ 188 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ 189 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ 190 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ 191 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ 192 0x6fc, /* QDSP_uPAudPreProcCmdQueue */ 193 0x704, /* QDSP_uPAudRecBitStreamQueue */ 194 0x700, /* QDSP_uPAudRecCmdQueue */ 195 0x710, /* QDSP_uPJpegActionCmdQueue */ 196 0x70c, /* QDSP_uPJpegCfgCmdQueue */ 197 0x6c0, /* QDSP_uPVocProcQueue */ 198 0x6d8, /* QDSP_vfeCommandQueue */ 199 0x6e0, /* QDSP_vfeCommandScaleQueue */ 200 0x6dc, /* QDSP_vfeCommandTableQueue */ 201 0x6d4, /* QDSP_uPDiagQueue */ 202}; 203 204/* Table of modules indexed by task ID for the QTV_LP image */ 205static qdsp_module_type qdsp_qtv_lp_task_to_module_table[] = { 206 QDSP_MODULE_KERNEL, 207 QDSP_MODULE_AFETASK, 208 QDSP_MODULE_MAX, 209 QDSP_MODULE_MAX, 210 QDSP_MODULE_VIDEOTASK, 211 QDSP_MODULE_MAX, 212 QDSP_MODULE_MAX, 213 QDSP_MODULE_MAX, 214 QDSP_MODULE_MAX, 215 QDSP_MODULE_AUDPPTASK, 216 QDSP_MODULE_AUDPLAY0TASK, 217 QDSP_MODULE_MAX, 218 QDSP_MODULE_MAX, 219 QDSP_MODULE_MAX, 220 QDSP_MODULE_MAX, 221 QDSP_MODULE_MAX, 222 QDSP_MODULE_AUDRECTASK, 223 QDSP_MODULE_AUDPREPROCTASK, 224 QDSP_MODULE_MAX, 225 QDSP_MODULE_MAX, 226 QDSP_MODULE_MAX, 227 QDSP_MODULE_MAX, 228 QDSP_MODULE_MAX, 229 QDSP_MODULE_MAX, 230 QDSP_MODULE_MAX, 231 QDSP_MODULE_MAX, 232 QDSP_MODULE_MAX, 233 QDSP_MODULE_MAX, 234 QDSP_MODULE_MAX, 235 QDSP_MODULE_MAX, 236 QDSP_MODULE_MAX, 237 QDSP_MODULE_MAX, 238}; 239 240/* Queue offset table indexed by queue ID for the QTV_LP image */ 241static uint32_t qdsp_qtv_lp_queue_offset_table[] = { 242 QDSP_RTOS_NO_QUEUE, /* QDSP_lpmCommandQueue */ 243 0x3fe, /* QDSP_mpuAfeQueue */ 244 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuGraphicsCmdQueue */ 245 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuModmathCmdQueue */ 246 0x402, /* QDSP_mpuVDecCmdQueue */ 247 0x406, /* QDSP_mpuVDecPktQueue */ 248 QDSP_RTOS_NO_QUEUE, /* QDSP_mpuVEncCmdQueue */ 249 QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecCmdQueue */ 250 QDSP_RTOS_NO_QUEUE, /* QDSP_rxMpuDecPktQueue */ 251 QDSP_RTOS_NO_QUEUE, /* QDSP_txMpuEncQueue */ 252 0x40e, /* QDSP_uPAudPPCmd1Queue */ 253 0x412, /* QDSP_uPAudPPCmd2Queue */ 254 0x416, /* QDSP_uPAudPPCmd3Queue */ 255 0x422, /* QDSP_uPAudPlay0BitStreamCtrlQueue */ 256 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay1BitStreamCtrlQueue */ 257 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay2BitStreamCtrlQueue */ 258 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay3BitStreamCtrlQueue */ 259 QDSP_RTOS_NO_QUEUE, /* QDSP_uPAudPlay4BitStreamCtrlQueue */ 260 0x40a, /* QDSP_uPAudPreProcCmdQueue */ 261 0x41e, /* QDSP_uPAudRecBitStreamQueue */ 262 0x41a, /* QDSP_uPAudRecCmdQueue */ 263 QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegActionCmdQueue */ 264 QDSP_RTOS_NO_QUEUE, /* QDSP_uPJpegCfgCmdQueue */ 265 QDSP_RTOS_NO_QUEUE, /* QDSP_uPVocProcQueue */ 266 QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandQueue */ 267 QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandScaleQueue */ 268 QDSP_RTOS_NO_QUEUE, /* QDSP_vfeCommandTableQueue */ 269 QDSP_RTOS_NO_QUEUE, /* QDSP_uPDiagQueue */ 270}; 271 272/* Tables to convert tasks to modules */ 273static qdsp_module_type *qdsp_task_to_module[] = { 274 qdsp_combo_task_to_module_table, 275 qdsp_gaudio_task_to_module_table, 276 qdsp_qtv_lp_task_to_module_table, 277}; 278 279/* Tables to retrieve queue offsets */ 280static uint32_t *qdsp_queue_offset_table[] = { 281 qdsp_combo_queue_offset_table, 282 qdsp_gaudio_queue_offset_table, 283 qdsp_qtv_lp_queue_offset_table, 284}; 285 286#define QDSP_MODULE(n, clkname, clkrate, verify_cmd_func, patch_event_func) \ 287 { .name = #n, .pdev_name = "adsp_" #n, .id = QDSP_MODULE_##n, \ 288 .clk_name = clkname, .clk_rate = clkrate, \ 289 .verify_cmd = verify_cmd_func, .patch_event = patch_event_func } 290 291static struct adsp_module_info module_info[] = { 292 QDSP_MODULE(AUDPLAY0TASK, NULL, 0, NULL, NULL), 293 QDSP_MODULE(AUDPPTASK, NULL, 0, NULL, NULL), 294 QDSP_MODULE(AUDRECTASK, NULL, 0, NULL, NULL), 295 QDSP_MODULE(AUDPREPROCTASK, NULL, 0, NULL, NULL), 296 QDSP_MODULE(VFETASK, "vfe_clk", 0, adsp_vfe_verify_cmd, 297 adsp_vfe_patch_event), 298 QDSP_MODULE(QCAMTASK, NULL, 0, NULL, NULL), 299 QDSP_MODULE(LPMTASK, NULL, 0, adsp_lpm_verify_cmd, NULL), 300 QDSP_MODULE(JPEGTASK, "vdc_clk", 0, adsp_jpeg_verify_cmd, 301 adsp_jpeg_patch_event), 302 QDSP_MODULE(VIDEOTASK, "vdc_clk", 96000000, 303 adsp_video_verify_cmd, NULL), 304 QDSP_MODULE(VDEC_LP_MODE, NULL, 0, NULL, NULL), 305 QDSP_MODULE(VIDEOENCTASK, "vdc_clk", 96000000, 306 adsp_videoenc_verify_cmd, NULL), 307}; 308 309int adsp_init_info(struct adsp_info *info) 310{ 311 info->send_irq = 0x00c00200; 312 info->read_ctrl = 0x00400038; 313 info->write_ctrl = 0x00400034; 314 315 info->max_msg16_size = 193; 316 info->max_msg32_size = 8; 317 318 info->max_task_id = 16; 319 info->max_module_id = QDSP_MODULE_MAX - 1; 320 info->max_queue_id = QDSP_QUEUE_MAX; 321 info->max_image_id = 2; 322 info->queue_offset = qdsp_queue_offset_table; 323 info->task_to_module = qdsp_task_to_module; 324 325 info->module_count = ARRAY_SIZE(module_info); 326 info->module = module_info; 327 return 0; 328} 329