rtac.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/fs.h>
  6. #include <linux/module.h>
  7. #include <linux/miscdevice.h>
  8. #include <linux/slab.h>
  9. #include <linux/uaccess.h>
  10. #include <linux/mutex.h>
  11. #include <linux/sched.h>
  12. #include <linux/msm_audio_calibration.h>
  13. #include <linux/atomic.h>
  14. #include <linux/compat.h>
  15. #include <dsp/msm_audio_ion.h>
  16. #include <dsp/rtac.h>
  17. #include <dsp/q6asm-v2.h>
  18. #include <dsp/q6afe-v2.h>
  19. #include <dsp/q6adm-v2.h>
  20. #include <dsp/apr_audio-v2.h>
  21. #include <dsp/q6common.h>
  22. #include <dsp/q6voice.h>
  23. #include "adsp_err.h"
  24. /* Max size of payload (buf size - apr header) */
  25. #define MAX_PAYLOAD_SIZE 4076
  26. #define RTAC_MAX_ACTIVE_VOICE_COMBOS 2
  27. #define RTAC_MAX_ACTIVE_POPP 8
  28. #define RTAC_BUF_SIZE 163840
  29. #define TIMEOUT_MS 1000
  30. struct rtac_cal_block_data rtac_cal[MAX_RTAC_BLOCKS] = {
  31. /* ADM_RTAC_CAL */
  32. {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} },
  33. /* ASM_RTAC_CAL */
  34. {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} },
  35. /* VOICE_RTAC_CAL */
  36. {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} },
  37. /* AFE_RTAC_CAL */
  38. {{RTAC_BUF_SIZE, 0, 0}, {0, 0, 0} }
  39. };
  40. struct rtac_common_data {
  41. atomic_t usage_count;
  42. atomic_t apr_err_code;
  43. struct mutex rtac_fops_mutex;
  44. };
  45. static struct rtac_common_data rtac_common;
  46. /* APR data */
  47. struct rtac_apr_data {
  48. void *apr_handle;
  49. atomic_t cmd_state;
  50. wait_queue_head_t cmd_wait;
  51. };
  52. static struct rtac_apr_data rtac_adm_apr_data;
  53. static struct rtac_apr_data rtac_asm_apr_data[ASM_ACTIVE_STREAMS_ALLOWED + 1];
  54. static struct rtac_apr_data rtac_afe_apr_data;
  55. static struct rtac_apr_data rtac_voice_apr_data[RTAC_VOICE_MODES];
  56. /* ADM info & APR */
  57. static struct rtac_adm rtac_adm_data;
  58. static u32 *rtac_adm_buffer;
  59. /* ASM APR */
  60. static u32 *rtac_asm_buffer;
  61. static u32 *rtac_afe_buffer;
  62. /* Voice info & APR */
  63. struct rtac_voice_data_t {
  64. uint32_t tx_topology_id;
  65. uint32_t rx_topology_id;
  66. uint32_t tx_afe_topology;
  67. uint32_t rx_afe_topology;
  68. uint32_t tx_afe_port;
  69. uint32_t rx_afe_port;
  70. uint16_t cvs_handle;
  71. uint16_t cvp_handle;
  72. uint32_t tx_acdb_id;
  73. uint32_t rx_acdb_id;
  74. };
  75. struct rtac_voice {
  76. uint32_t num_of_voice_combos;
  77. struct rtac_voice_data_t voice[RTAC_MAX_ACTIVE_VOICE_COMBOS];
  78. };
  79. struct rtac_afe_user_data {
  80. uint32_t buf_size;
  81. uint32_t cmd_size;
  82. uint32_t port_id;
  83. union {
  84. struct afe_rtac_user_data_set_v2 v2_set;
  85. struct afe_rtac_user_data_set_v3 v3_set;
  86. struct afe_rtac_user_data_get_v2 v2_get;
  87. struct afe_rtac_user_data_get_v3 v3_get;
  88. };
  89. } __packed;
  90. static struct rtac_voice rtac_voice_data;
  91. static u32 *rtac_voice_buffer;
  92. static u32 voice_session_id[RTAC_MAX_ACTIVE_VOICE_COMBOS];
  93. struct mutex rtac_adm_mutex;
  94. struct mutex rtac_adm_apr_mutex;
  95. struct mutex rtac_asm_apr_mutex;
  96. struct mutex rtac_voice_mutex;
  97. struct mutex rtac_voice_apr_mutex;
  98. struct mutex rtac_afe_apr_mutex;
  99. int rtac_clear_mapping(uint32_t cal_type)
  100. {
  101. int result = 0;
  102. pr_debug("%s\n", __func__);
  103. if (cal_type >= MAX_RTAC_BLOCKS) {
  104. pr_debug("%s: invalid cal type %d\n", __func__, cal_type);
  105. result = -EINVAL;
  106. goto done;
  107. }
  108. rtac_cal[cal_type].map_data.map_handle = 0;
  109. done:
  110. return result;
  111. }
  112. int rtac_allocate_cal_buffer(uint32_t cal_type)
  113. {
  114. int result = 0;
  115. size_t len;
  116. pr_debug("%s\n", __func__);
  117. if (cal_type >= MAX_RTAC_BLOCKS) {
  118. pr_err("%s: cal_type %d is invalid!\n",
  119. __func__, cal_type);
  120. result = -EINVAL;
  121. goto done;
  122. }
  123. if (rtac_cal[cal_type].cal_data.paddr != 0) {
  124. pr_err("%s: memory already allocated! cal_type %d, paddr 0x%pK\n",
  125. __func__, cal_type, &rtac_cal[cal_type].cal_data.paddr);
  126. result = -EPERM;
  127. goto done;
  128. }
  129. result = msm_audio_ion_alloc(&rtac_cal[cal_type].map_data.dma_buf,
  130. rtac_cal[cal_type].map_data.map_size,
  131. &rtac_cal[cal_type].cal_data.paddr,
  132. &len,
  133. &rtac_cal[cal_type].cal_data.kvaddr);
  134. if (result < 0) {
  135. pr_err("%s: ION create client for RTAC failed\n",
  136. __func__);
  137. goto done;
  138. }
  139. pr_debug("%s: cal_type %d, paddr 0x%pK, kvaddr 0x%pK, map_size 0x%x\n",
  140. __func__, cal_type,
  141. &rtac_cal[cal_type].cal_data.paddr,
  142. rtac_cal[cal_type].cal_data.kvaddr,
  143. rtac_cal[cal_type].map_data.map_size);
  144. done:
  145. return result;
  146. }
  147. int rtac_free_cal_buffer(uint32_t cal_type)
  148. {
  149. int result = 0;
  150. pr_debug("%s\n", __func__);
  151. if (cal_type >= MAX_RTAC_BLOCKS) {
  152. pr_err("%s: cal_type %d is invalid!\n",
  153. __func__, cal_type);
  154. result = -EINVAL;
  155. goto done;
  156. }
  157. if (rtac_cal[cal_type].map_data.dma_buf == NULL) {
  158. pr_debug("%s: cal_type %d not allocated!\n",
  159. __func__, cal_type);
  160. goto done;
  161. }
  162. result = msm_audio_ion_free(rtac_cal[cal_type].map_data.dma_buf);
  163. if (result < 0) {
  164. pr_err("%s: ION free for RTAC failed! cal_type %d, paddr 0x%pK\n",
  165. __func__, cal_type, &rtac_cal[cal_type].cal_data.paddr);
  166. goto done;
  167. }
  168. rtac_cal[cal_type].map_data.map_handle = 0;
  169. rtac_cal[cal_type].map_data.dma_buf = NULL;
  170. rtac_cal[cal_type].cal_data.size = 0;
  171. rtac_cal[cal_type].cal_data.kvaddr = 0;
  172. rtac_cal[cal_type].cal_data.paddr = 0;
  173. done:
  174. return result;
  175. }
  176. int rtac_map_cal_buffer(uint32_t cal_type)
  177. {
  178. int result = 0;
  179. pr_debug("%s\n", __func__);
  180. if (cal_type >= MAX_RTAC_BLOCKS) {
  181. pr_err("%s: cal_type %d is invalid!\n",
  182. __func__, cal_type);
  183. result = -EINVAL;
  184. goto done;
  185. }
  186. if (rtac_cal[cal_type].map_data.map_handle != 0) {
  187. pr_err("%s: already mapped cal_type %d\n",
  188. __func__, cal_type);
  189. result = -EPERM;
  190. goto done;
  191. }
  192. if (rtac_cal[cal_type].cal_data.paddr == 0) {
  193. pr_err("%s: physical address is NULL cal_type %d\n",
  194. __func__, cal_type);
  195. result = -EPERM;
  196. goto done;
  197. }
  198. switch (cal_type) {
  199. case ADM_RTAC_CAL:
  200. result = adm_map_rtac_block(&rtac_cal[cal_type]);
  201. break;
  202. case ASM_RTAC_CAL:
  203. result = q6asm_map_rtac_block(&rtac_cal[cal_type]);
  204. break;
  205. case VOICE_RTAC_CAL:
  206. result = voc_map_rtac_block(&rtac_cal[cal_type]);
  207. break;
  208. case AFE_RTAC_CAL:
  209. result = afe_map_rtac_block(&rtac_cal[cal_type]);
  210. break;
  211. }
  212. if (result < 0) {
  213. pr_err("%s: map RTAC failed! cal_type %d\n",
  214. __func__, cal_type);
  215. goto done;
  216. }
  217. done:
  218. return result;
  219. }
  220. int rtac_unmap_cal_buffer(uint32_t cal_type)
  221. {
  222. int result = 0;
  223. pr_debug("%s\n", __func__);
  224. if (cal_type >= MAX_RTAC_BLOCKS) {
  225. pr_err("%s: cal_type %d is invalid!\n",
  226. __func__, cal_type);
  227. result = -EINVAL;
  228. goto done;
  229. }
  230. if (rtac_cal[cal_type].map_data.map_handle == 0) {
  231. pr_debug("%s: nothing to unmap cal_type %d\n",
  232. __func__, cal_type);
  233. goto done;
  234. }
  235. switch (cal_type) {
  236. case ADM_RTAC_CAL:
  237. result = adm_unmap_rtac_block(
  238. &rtac_cal[cal_type].map_data.map_handle);
  239. break;
  240. case ASM_RTAC_CAL:
  241. result = q6asm_unmap_rtac_block(
  242. &rtac_cal[cal_type].map_data.map_handle);
  243. break;
  244. case VOICE_RTAC_CAL:
  245. result = voc_unmap_rtac_block(
  246. &rtac_cal[cal_type].map_data.map_handle);
  247. break;
  248. case AFE_RTAC_CAL:
  249. result = afe_unmap_rtac_block(
  250. &rtac_cal[cal_type].map_data.map_handle);
  251. break;
  252. }
  253. if (result < 0) {
  254. pr_err("%s: unmap RTAC failed! cal_type %d\n",
  255. __func__, cal_type);
  256. goto done;
  257. }
  258. done:
  259. return result;
  260. }
  261. static int rtac_open(struct inode *inode, struct file *f)
  262. {
  263. int result = 0;
  264. pr_debug("%s\n", __func__);
  265. mutex_lock(&rtac_common.rtac_fops_mutex);
  266. atomic_inc(&rtac_common.usage_count);
  267. mutex_unlock(&rtac_common.rtac_fops_mutex);
  268. return result;
  269. }
  270. static int rtac_release(struct inode *inode, struct file *f)
  271. {
  272. int result = 0;
  273. int result2 = 0;
  274. int i;
  275. pr_debug("%s\n", __func__);
  276. mutex_lock(&rtac_common.rtac_fops_mutex);
  277. atomic_dec(&rtac_common.usage_count);
  278. pr_debug("%s: ref count %d!\n", __func__,
  279. atomic_read(&rtac_common.usage_count));
  280. if (atomic_read(&rtac_common.usage_count) > 0) {
  281. mutex_unlock(&rtac_common.rtac_fops_mutex);
  282. goto done;
  283. }
  284. for (i = 0; i < MAX_RTAC_BLOCKS; i++) {
  285. result2 = rtac_unmap_cal_buffer(i);
  286. if (result2 < 0) {
  287. pr_err("%s: unmap buffer failed! error %d!\n",
  288. __func__, result2);
  289. result = result2;
  290. }
  291. result2 = rtac_free_cal_buffer(i);
  292. if (result2 < 0) {
  293. pr_err("%s: free buffer failed! error %d!\n",
  294. __func__, result2);
  295. result = result2;
  296. }
  297. }
  298. mutex_unlock(&rtac_common.rtac_fops_mutex);
  299. done:
  300. return result;
  301. }
  302. /* ADM Info */
  303. void add_popp(u32 dev_idx, u32 port_id, u32 popp_id)
  304. {
  305. u32 i = 0;
  306. for (; i < rtac_adm_data.device[dev_idx].num_of_popp; i++)
  307. if (rtac_adm_data.device[dev_idx].popp[i].popp == popp_id)
  308. goto done;
  309. if (rtac_adm_data.device[dev_idx].num_of_popp ==
  310. RTAC_MAX_ACTIVE_POPP) {
  311. pr_err("%s, Max POPP!\n", __func__);
  312. goto done;
  313. }
  314. rtac_adm_data.device[dev_idx].popp[
  315. rtac_adm_data.device[dev_idx].num_of_popp].popp = popp_id;
  316. rtac_adm_data.device[dev_idx].popp[
  317. rtac_adm_data.device[dev_idx].num_of_popp].popp_topology =
  318. q6asm_get_asm_topology(popp_id);
  319. rtac_adm_data.device[dev_idx].popp[
  320. rtac_adm_data.device[dev_idx].num_of_popp++].app_type =
  321. q6asm_get_asm_app_type(popp_id);
  322. pr_debug("%s: popp_id = %d, popp topology = 0x%x, popp app type = 0x%x\n",
  323. __func__,
  324. rtac_adm_data.device[dev_idx].popp[
  325. rtac_adm_data.device[dev_idx].num_of_popp - 1].popp,
  326. rtac_adm_data.device[dev_idx].popp[
  327. rtac_adm_data.device[dev_idx].num_of_popp - 1].popp_topology,
  328. rtac_adm_data.device[dev_idx].popp[
  329. rtac_adm_data.device[dev_idx].num_of_popp - 1].app_type);
  330. done:
  331. return;
  332. }
  333. void rtac_update_afe_topology(u32 port_id)
  334. {
  335. u32 i = 0;
  336. mutex_lock(&rtac_adm_mutex);
  337. for (i = 0; i < rtac_adm_data.num_of_dev; i++) {
  338. if (rtac_adm_data.device[i].afe_port == port_id) {
  339. rtac_adm_data.device[i].afe_topology =
  340. afe_get_topology(port_id);
  341. pr_debug("%s: port_id = 0x%x topology_id = 0x%x copp_id = %d\n",
  342. __func__, port_id,
  343. rtac_adm_data.device[i].afe_topology,
  344. rtac_adm_data.device[i].copp);
  345. }
  346. }
  347. mutex_unlock(&rtac_adm_mutex);
  348. }
  349. void rtac_add_adm_device(u32 port_id, u32 copp_id, u32 path_id, u32 popp_id,
  350. u32 app_type, u32 acdb_id)
  351. {
  352. u32 i = 0;
  353. pr_debug("%s: num rtac devices %d port_id = %d, copp_id = %d\n",
  354. __func__, rtac_adm_data.num_of_dev, port_id, copp_id);
  355. mutex_lock(&rtac_adm_mutex);
  356. if (rtac_adm_data.num_of_dev == RTAC_MAX_ACTIVE_DEVICES) {
  357. pr_err("%s, Can't add anymore RTAC devices!\n", __func__);
  358. goto done;
  359. }
  360. /* Check if device already added */
  361. if (rtac_adm_data.num_of_dev != 0) {
  362. for (; i < rtac_adm_data.num_of_dev; i++) {
  363. if (rtac_adm_data.device[i].afe_port == port_id &&
  364. rtac_adm_data.device[i].copp == copp_id) {
  365. add_popp(i, port_id, popp_id);
  366. goto done;
  367. }
  368. if (rtac_adm_data.device[i].num_of_popp ==
  369. RTAC_MAX_ACTIVE_POPP) {
  370. pr_err("%s, Max POPP!\n", __func__);
  371. goto done;
  372. }
  373. }
  374. }
  375. /* Add device */
  376. rtac_adm_data.num_of_dev++;
  377. rtac_adm_data.device[i].topology_id =
  378. adm_get_topology_for_port_from_copp_id(port_id, copp_id);
  379. rtac_adm_data.device[i].afe_topology =
  380. afe_get_topology(port_id);
  381. rtac_adm_data.device[i].afe_port = port_id;
  382. rtac_adm_data.device[i].copp = copp_id;
  383. rtac_adm_data.device[i].app_type = app_type;
  384. rtac_adm_data.device[i].acdb_dev_id = acdb_id;
  385. rtac_adm_data.device[i].popp[
  386. rtac_adm_data.device[i].num_of_popp].popp = popp_id;
  387. rtac_adm_data.device[i].popp[
  388. rtac_adm_data.device[i].num_of_popp].popp_topology =
  389. q6asm_get_asm_topology(popp_id);
  390. rtac_adm_data.device[i].popp[
  391. rtac_adm_data.device[i].num_of_popp++].app_type =
  392. q6asm_get_asm_app_type(popp_id);
  393. pr_debug("%s: topology = 0x%x, afe_topology = 0x%x, port_id = %d, copp_id = %d, app id = 0x%x, acdb id = %d, popp_id = %d, popp topology = 0x%x, popp app type = 0x%x\n",
  394. __func__,
  395. rtac_adm_data.device[i].topology_id,
  396. rtac_adm_data.device[i].afe_topology,
  397. rtac_adm_data.device[i].afe_port,
  398. rtac_adm_data.device[i].copp,
  399. rtac_adm_data.device[i].app_type,
  400. rtac_adm_data.device[i].acdb_dev_id,
  401. rtac_adm_data.device[i].popp[
  402. rtac_adm_data.device[i].num_of_popp - 1].popp,
  403. rtac_adm_data.device[i].popp[
  404. rtac_adm_data.device[i].num_of_popp - 1].popp_topology,
  405. rtac_adm_data.device[i].popp[
  406. rtac_adm_data.device[i].num_of_popp - 1].app_type);
  407. done:
  408. mutex_unlock(&rtac_adm_mutex);
  409. }
  410. static void shift_adm_devices(u32 dev_idx)
  411. {
  412. for (; dev_idx < rtac_adm_data.num_of_dev; dev_idx++) {
  413. memcpy(&rtac_adm_data.device[dev_idx],
  414. &rtac_adm_data.device[dev_idx + 1],
  415. sizeof(rtac_adm_data.device[dev_idx]));
  416. memset(&rtac_adm_data.device[dev_idx + 1], 0,
  417. sizeof(rtac_adm_data.device[dev_idx]));
  418. }
  419. }
  420. static void shift_popp(u32 copp_idx, u32 popp_idx)
  421. {
  422. for (; popp_idx < rtac_adm_data.device[copp_idx].num_of_popp;
  423. popp_idx++) {
  424. memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx].popp,
  425. &rtac_adm_data.device[copp_idx].popp[popp_idx + 1].
  426. popp, sizeof(uint32_t));
  427. memcpy(&rtac_adm_data.device[copp_idx].popp[popp_idx].
  428. popp_topology,
  429. &rtac_adm_data.device[copp_idx].popp[popp_idx + 1].
  430. popp_topology,
  431. sizeof(uint32_t));
  432. memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1].
  433. popp, 0, sizeof(uint32_t));
  434. memset(&rtac_adm_data.device[copp_idx].popp[popp_idx + 1].
  435. popp_topology, 0, sizeof(uint32_t));
  436. }
  437. }
  438. void rtac_remove_adm_device(u32 port_id, u32 copp_id)
  439. {
  440. s32 i;
  441. pr_debug("%s: num rtac devices %d port_id = %d, copp_id = %d\n",
  442. __func__, rtac_adm_data.num_of_dev, port_id, copp_id);
  443. mutex_lock(&rtac_adm_mutex);
  444. /* look for device */
  445. for (i = 0; i < rtac_adm_data.num_of_dev; i++) {
  446. if (rtac_adm_data.device[i].afe_port == port_id &&
  447. rtac_adm_data.device[i].copp == copp_id) {
  448. memset(&rtac_adm_data.device[i], 0,
  449. sizeof(rtac_adm_data.device[i]));
  450. rtac_adm_data.num_of_dev--;
  451. if (rtac_adm_data.num_of_dev >= 1) {
  452. shift_adm_devices(i);
  453. break;
  454. }
  455. }
  456. }
  457. mutex_unlock(&rtac_adm_mutex);
  458. }
  459. void rtac_remove_popp_from_adm_devices(u32 popp_id)
  460. {
  461. s32 i, j;
  462. pr_debug("%s: popp_id = %d\n", __func__, popp_id);
  463. mutex_lock(&rtac_adm_mutex);
  464. for (i = 0; i < rtac_adm_data.num_of_dev; i++) {
  465. for (j = 0; j < rtac_adm_data.device[i].num_of_popp; j++) {
  466. if (rtac_adm_data.device[i].popp[j].popp ==
  467. popp_id) {
  468. rtac_adm_data.device[i].popp[j].popp = 0;
  469. rtac_adm_data.device[i].popp[j].
  470. popp_topology = 0;
  471. rtac_adm_data.device[i].num_of_popp--;
  472. shift_popp(i, j);
  473. }
  474. }
  475. }
  476. mutex_unlock(&rtac_adm_mutex);
  477. }
  478. /* Voice Info */
  479. static void set_rtac_voice_data(int idx, u32 cvs_handle, u32 cvp_handle,
  480. u32 rx_afe_port, u32 tx_afe_port,
  481. u32 rx_acdb_id, u32 tx_acdb_id,
  482. u32 session_id)
  483. {
  484. rtac_voice_data.voice[idx].tx_topology_id =
  485. voice_get_topology(CVP_VOC_TX_TOPOLOGY_CAL);
  486. rtac_voice_data.voice[idx].rx_topology_id =
  487. voice_get_topology(CVP_VOC_RX_TOPOLOGY_CAL);
  488. rtac_voice_data.voice[idx].tx_afe_topology =
  489. afe_get_topology(tx_afe_port);
  490. rtac_voice_data.voice[idx].rx_afe_topology =
  491. afe_get_topology(rx_afe_port);
  492. rtac_voice_data.voice[idx].tx_afe_port = tx_afe_port;
  493. rtac_voice_data.voice[idx].rx_afe_port = rx_afe_port;
  494. rtac_voice_data.voice[idx].tx_acdb_id = tx_acdb_id;
  495. rtac_voice_data.voice[idx].rx_acdb_id = rx_acdb_id;
  496. rtac_voice_data.voice[idx].cvs_handle = cvs_handle;
  497. rtac_voice_data.voice[idx].cvp_handle = cvp_handle;
  498. pr_debug("%s\n%s: %x\n%s: %d %s: %d\n%s: %d %s: %d\n %s: %d\n %s: %d\n%s: %d %s: %d\n%s",
  499. "<---- Voice Data Info ---->", "Session id", session_id,
  500. "cvs_handle", cvs_handle, "cvp_handle", cvp_handle,
  501. "rx_afe_topology", rtac_voice_data.voice[idx].rx_afe_topology,
  502. "tx_afe_topology", rtac_voice_data.voice[idx].tx_afe_topology,
  503. "rx_afe_port", rx_afe_port, "tx_afe_port", tx_afe_port,
  504. "rx_acdb_id", rx_acdb_id, "tx_acdb_id", tx_acdb_id,
  505. "<-----------End----------->");
  506. /* Store session ID for voice RTAC */
  507. voice_session_id[idx] = session_id;
  508. }
  509. void rtac_add_voice(u32 cvs_handle, u32 cvp_handle, u32 rx_afe_port,
  510. u32 tx_afe_port, u32 rx_acdb_id, u32 tx_acdb_id,
  511. u32 session_id)
  512. {
  513. u32 i = 0;
  514. pr_debug("%s\n", __func__);
  515. mutex_lock(&rtac_voice_mutex);
  516. if (rtac_voice_data.num_of_voice_combos ==
  517. RTAC_MAX_ACTIVE_VOICE_COMBOS) {
  518. pr_err("%s, Can't add anymore RTAC devices!\n", __func__);
  519. goto done;
  520. }
  521. /* Check if device already added */
  522. if (rtac_voice_data.num_of_voice_combos != 0) {
  523. for (; i < rtac_voice_data.num_of_voice_combos; i++) {
  524. if (rtac_voice_data.voice[i].cvs_handle ==
  525. cvs_handle) {
  526. set_rtac_voice_data(i, cvs_handle, cvp_handle,
  527. rx_afe_port, tx_afe_port, rx_acdb_id,
  528. tx_acdb_id, session_id);
  529. goto done;
  530. }
  531. }
  532. }
  533. /* Add device */
  534. rtac_voice_data.num_of_voice_combos++;
  535. set_rtac_voice_data(i, cvs_handle, cvp_handle,
  536. rx_afe_port, tx_afe_port,
  537. rx_acdb_id, tx_acdb_id,
  538. session_id);
  539. done:
  540. mutex_unlock(&rtac_voice_mutex);
  541. }
  542. static void shift_voice_devices(u32 idx)
  543. {
  544. for (; idx < rtac_voice_data.num_of_voice_combos - 1; idx++) {
  545. memcpy(&rtac_voice_data.voice[idx],
  546. &rtac_voice_data.voice[idx + 1],
  547. sizeof(rtac_voice_data.voice[idx]));
  548. voice_session_id[idx] = voice_session_id[idx + 1];
  549. }
  550. }
  551. void rtac_remove_voice(u32 cvs_handle)
  552. {
  553. u32 i = 0;
  554. pr_debug("%s\n", __func__);
  555. mutex_lock(&rtac_voice_mutex);
  556. /* look for device */
  557. for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) {
  558. if (rtac_voice_data.voice[i].cvs_handle == cvs_handle) {
  559. shift_voice_devices(i);
  560. rtac_voice_data.num_of_voice_combos--;
  561. memset(&rtac_voice_data.voice[
  562. rtac_voice_data.num_of_voice_combos], 0,
  563. sizeof(rtac_voice_data.voice
  564. [rtac_voice_data.num_of_voice_combos]));
  565. voice_session_id[rtac_voice_data.num_of_voice_combos]
  566. = 0;
  567. break;
  568. }
  569. }
  570. mutex_unlock(&rtac_voice_mutex);
  571. }
  572. static u32 get_voice_session_id_cvs(u32 cvs_handle)
  573. {
  574. u32 i;
  575. for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) {
  576. if (rtac_voice_data.voice[i].cvs_handle == cvs_handle)
  577. return voice_session_id[i];
  578. }
  579. pr_err("%s: No voice index for CVS handle %d found returning 0\n",
  580. __func__, cvs_handle);
  581. return 0;
  582. }
  583. static u32 get_voice_session_id_cvp(u32 cvp_handle)
  584. {
  585. u32 i;
  586. for (i = 0; i < rtac_voice_data.num_of_voice_combos; i++) {
  587. if (rtac_voice_data.voice[i].cvp_handle == cvp_handle)
  588. return voice_session_id[i];
  589. }
  590. pr_err("%s: No voice index for CVP handle %d found returning 0\n",
  591. __func__, cvp_handle);
  592. return 0;
  593. }
  594. static int get_voice_index(u32 mode, u32 handle)
  595. {
  596. if (mode == RTAC_CVP)
  597. return voice_get_idx_for_session(
  598. get_voice_session_id_cvp(handle));
  599. if (mode == RTAC_CVS)
  600. return voice_get_idx_for_session(
  601. get_voice_session_id_cvs(handle));
  602. pr_err("%s: Invalid mode %d, returning 0\n",
  603. __func__, mode);
  604. return 0;
  605. }
  606. /* ADM APR */
  607. void rtac_set_adm_handle(void *handle)
  608. {
  609. pr_debug("%s: handle = %pK\n", __func__, handle);
  610. mutex_lock(&rtac_adm_apr_mutex);
  611. rtac_adm_apr_data.apr_handle = handle;
  612. mutex_unlock(&rtac_adm_apr_mutex);
  613. }
  614. bool rtac_make_adm_callback(uint32_t *payload, u32 payload_size)
  615. {
  616. pr_debug("%s:cmd_state = %d\n", __func__,
  617. atomic_read(&rtac_adm_apr_data.cmd_state));
  618. if (atomic_read(&rtac_adm_apr_data.cmd_state) != 1)
  619. return false;
  620. pr_debug("%s\n", __func__);
  621. if (payload_size == sizeof(uint32_t))
  622. atomic_set(&rtac_common.apr_err_code, payload[0]);
  623. else if (payload_size == (2*sizeof(uint32_t)))
  624. atomic_set(&rtac_common.apr_err_code, payload[1]);
  625. atomic_set(&rtac_adm_apr_data.cmd_state, 0);
  626. wake_up(&rtac_adm_apr_data.cmd_wait);
  627. return true;
  628. }
  629. int send_adm_apr(void *buf, u32 opcode)
  630. {
  631. s32 result;
  632. u32 user_buf_size = 0;
  633. u32 bytes_returned = 0;
  634. u32 copp_id;
  635. u32 payload_size;
  636. u32 data_size = 0;
  637. int copp_idx;
  638. int port_idx;
  639. struct apr_hdr adm_params;
  640. pr_debug("%s\n", __func__);
  641. if (rtac_cal[ADM_RTAC_CAL].map_data.dma_buf == NULL) {
  642. result = rtac_allocate_cal_buffer(ADM_RTAC_CAL);
  643. if (result < 0) {
  644. pr_err("%s: allocate buffer failed!",
  645. __func__);
  646. goto done;
  647. }
  648. }
  649. if (rtac_cal[ADM_RTAC_CAL].map_data.map_handle == 0) {
  650. result = rtac_map_cal_buffer(ADM_RTAC_CAL);
  651. if (result < 0) {
  652. pr_err("%s: map buffer failed!",
  653. __func__);
  654. goto done;
  655. }
  656. }
  657. if (copy_from_user(&user_buf_size, (void *)buf,
  658. sizeof(user_buf_size))) {
  659. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  660. __func__, buf);
  661. goto done;
  662. }
  663. if (user_buf_size <= 0) {
  664. pr_err("%s: Invalid buffer size = %d\n",
  665. __func__, user_buf_size);
  666. goto done;
  667. }
  668. if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) {
  669. pr_err("%s: Could not copy payload size from user buffer\n",
  670. __func__);
  671. goto done;
  672. }
  673. if (copy_from_user(&copp_id, buf + 2 * sizeof(u32), sizeof(u32))) {
  674. pr_err("%s: Could not copy port id from user buffer\n",
  675. __func__);
  676. goto done;
  677. }
  678. if (adm_get_indexes_from_copp_id(copp_id, &copp_idx, &port_idx) != 0) {
  679. pr_err("%s: Copp Id-%d is not active\n", __func__, copp_id);
  680. goto done;
  681. }
  682. mutex_lock(&rtac_adm_apr_mutex);
  683. if (rtac_adm_apr_data.apr_handle == NULL) {
  684. pr_err("%s: APR not initialized\n", __func__);
  685. result = -EINVAL;
  686. goto err;
  687. }
  688. switch (opcode) {
  689. case ADM_CMD_SET_PP_PARAMS_V5:
  690. case ADM_CMD_SET_PP_PARAMS_V6:
  691. /* set payload size to in-band payload */
  692. /* set data size to actual out of band payload size */
  693. data_size = payload_size - 4 * sizeof(u32);
  694. if (data_size > rtac_cal[ADM_RTAC_CAL].map_data.map_size) {
  695. pr_err("%s: Invalid data size = %d\n",
  696. __func__, data_size);
  697. result = -EINVAL;
  698. goto err;
  699. }
  700. payload_size = 4 * sizeof(u32);
  701. /* Copy buffer to out-of-band payload */
  702. if (copy_from_user((void *)
  703. rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr,
  704. buf + 7 * sizeof(u32), data_size)) {
  705. pr_err("%s: Could not copy payload from user buffer\n",
  706. __func__);
  707. result = -EFAULT;
  708. goto err;
  709. }
  710. /* set payload size in packet */
  711. rtac_adm_buffer[8] = data_size;
  712. break;
  713. case ADM_CMD_GET_PP_PARAMS_V5:
  714. case ADM_CMD_GET_PP_PARAMS_V6:
  715. if (payload_size > MAX_PAYLOAD_SIZE) {
  716. pr_err("%s: Invalid payload size = %d\n",
  717. __func__, payload_size);
  718. result = -EINVAL;
  719. goto err;
  720. }
  721. /* Copy buffer to in-band payload */
  722. if (copy_from_user(rtac_adm_buffer +
  723. sizeof(adm_params)/sizeof(u32),
  724. buf + 3 * sizeof(u32), payload_size)) {
  725. pr_err("%s: Could not copy payload from user buffer\n",
  726. __func__);
  727. result = -EFAULT;
  728. goto err;
  729. }
  730. break;
  731. default:
  732. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  733. result = -EINVAL;
  734. goto err;
  735. }
  736. /* Pack header */
  737. adm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  738. APR_HDR_LEN(20), APR_PKT_VER);
  739. adm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
  740. payload_size);
  741. adm_params.src_svc = APR_SVC_ADM;
  742. adm_params.src_domain = APR_DOMAIN_APPS;
  743. adm_params.src_port = copp_id;
  744. adm_params.dest_svc = APR_SVC_ADM;
  745. adm_params.dest_domain = APR_DOMAIN_ADSP;
  746. adm_params.dest_port = copp_id;
  747. adm_params.token = port_idx << 16 | copp_idx;
  748. adm_params.opcode = opcode;
  749. /* fill for out-of-band */
  750. rtac_adm_buffer[5] =
  751. lower_32_bits(rtac_cal[ADM_RTAC_CAL].cal_data.paddr);
  752. rtac_adm_buffer[6] =
  753. msm_audio_populate_upper_32_bits(
  754. rtac_cal[ADM_RTAC_CAL].cal_data.paddr);
  755. rtac_adm_buffer[7] = rtac_cal[ADM_RTAC_CAL].map_data.map_handle;
  756. memcpy(rtac_adm_buffer, &adm_params, sizeof(adm_params));
  757. atomic_set(&rtac_adm_apr_data.cmd_state, 1);
  758. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  759. __func__, opcode,
  760. &rtac_cal[ADM_RTAC_CAL].cal_data.paddr);
  761. result = apr_send_pkt(rtac_adm_apr_data.apr_handle,
  762. (uint32_t *)rtac_adm_buffer);
  763. if (result < 0) {
  764. pr_err("%s: Set params failed copp = %d\n", __func__, copp_id);
  765. goto err;
  766. }
  767. /* Wait for the callback */
  768. result = wait_event_timeout(rtac_adm_apr_data.cmd_wait,
  769. (atomic_read(&rtac_adm_apr_data.cmd_state) == 0),
  770. msecs_to_jiffies(TIMEOUT_MS));
  771. if (!result) {
  772. pr_err("%s: Set params timed out copp = %d\n", __func__,
  773. copp_id);
  774. goto err;
  775. }
  776. if (atomic_read(&rtac_common.apr_err_code)) {
  777. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  778. __func__, adsp_err_get_err_str(atomic_read(
  779. &rtac_common.apr_err_code)),
  780. opcode);
  781. result = adsp_err_get_lnx_err_code(
  782. atomic_read(
  783. &rtac_common.apr_err_code));
  784. goto err;
  785. }
  786. if (opcode == ADM_CMD_GET_PP_PARAMS_V5) {
  787. bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data.
  788. kvaddr)[2] + 3 * sizeof(u32);
  789. } else if (opcode == ADM_CMD_GET_PP_PARAMS_V6) {
  790. bytes_returned =
  791. ((u32 *) rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr)[3] +
  792. 4 * sizeof(u32);
  793. } else {
  794. bytes_returned = data_size;
  795. goto unlock;
  796. }
  797. if (bytes_returned > rtac_cal[ADM_RTAC_CAL].map_data.map_size) {
  798. pr_err("%s: Invalid data size = %d\n", __func__,
  799. bytes_returned);
  800. result = -EINVAL;
  801. goto err;
  802. }
  803. if (bytes_returned > user_buf_size) {
  804. pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
  805. __func__, user_buf_size, bytes_returned);
  806. result = -EINVAL;
  807. goto err;
  808. }
  809. if (copy_to_user((void __user *) buf,
  810. rtac_cal[ADM_RTAC_CAL].cal_data.kvaddr,
  811. bytes_returned)) {
  812. pr_err("%s: Could not copy buffer to user,size = %d\n",
  813. __func__, bytes_returned);
  814. result = -EFAULT;
  815. goto err;
  816. }
  817. unlock:
  818. mutex_unlock(&rtac_adm_apr_mutex);
  819. done:
  820. return bytes_returned;
  821. err:
  822. mutex_unlock(&rtac_adm_apr_mutex);
  823. return result;
  824. }
  825. /* ASM APR */
  826. void rtac_set_asm_handle(u32 session_id, void *handle)
  827. {
  828. pr_debug("%s\n", __func__);
  829. mutex_lock(&rtac_asm_apr_mutex);
  830. rtac_asm_apr_data[session_id].apr_handle = handle;
  831. mutex_unlock(&rtac_asm_apr_mutex);
  832. }
  833. bool rtac_make_asm_callback(u32 session_id, uint32_t *payload,
  834. u32 payload_size)
  835. {
  836. if (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) != 1)
  837. return false;
  838. pr_debug("%s\n", __func__);
  839. if (payload_size == sizeof(uint32_t))
  840. atomic_set(&rtac_common.apr_err_code, payload[0]);
  841. else if (payload_size == (2*sizeof(uint32_t)))
  842. atomic_set(&rtac_common.apr_err_code, payload[1]);
  843. atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 0);
  844. wake_up(&rtac_asm_apr_data[session_id].cmd_wait);
  845. return true;
  846. }
  847. int send_rtac_asm_apr(void *buf, u32 opcode)
  848. {
  849. s32 result;
  850. u32 user_buf_size = 0;
  851. u32 bytes_returned = 0;
  852. u32 session_id = 0;
  853. u32 payload_size;
  854. u32 data_size = 0;
  855. struct apr_hdr asm_params;
  856. pr_debug("%s\n", __func__);
  857. if (rtac_cal[ASM_RTAC_CAL].map_data.dma_buf == NULL) {
  858. result = rtac_allocate_cal_buffer(ASM_RTAC_CAL);
  859. if (result < 0) {
  860. pr_err("%s: allocate buffer failed!",
  861. __func__);
  862. goto done;
  863. }
  864. }
  865. if (rtac_cal[ASM_RTAC_CAL].map_data.map_handle == 0) {
  866. result = rtac_map_cal_buffer(ASM_RTAC_CAL);
  867. if (result < 0) {
  868. pr_err("%s: map buffer failed!",
  869. __func__);
  870. goto done;
  871. }
  872. }
  873. if (copy_from_user(&user_buf_size, (void *)buf,
  874. sizeof(user_buf_size))) {
  875. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  876. __func__, buf);
  877. goto done;
  878. }
  879. if (user_buf_size <= 0) {
  880. pr_err("%s: Invalid buffer size = %d\n",
  881. __func__, user_buf_size);
  882. goto done;
  883. }
  884. if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) {
  885. pr_err("%s: Could not copy payload size from user buffer\n",
  886. __func__);
  887. goto done;
  888. }
  889. if (copy_from_user(&session_id, buf + 2 * sizeof(u32), sizeof(u32))) {
  890. pr_err("%s: Could not copy session id from user buffer\n",
  891. __func__);
  892. goto done;
  893. }
  894. if (session_id >= (ASM_ACTIVE_STREAMS_ALLOWED + 1)) {
  895. pr_err("%s: Invalid Session = %d\n", __func__, session_id);
  896. goto done;
  897. }
  898. mutex_lock(&rtac_asm_apr_mutex);
  899. if (rtac_asm_apr_data[session_id].apr_handle == NULL) {
  900. pr_err("%s: APR not initialized\n", __func__);
  901. result = -EINVAL;
  902. goto err;
  903. }
  904. switch (opcode) {
  905. case ASM_STREAM_CMD_SET_PP_PARAMS_V2:
  906. case ASM_STREAM_CMD_SET_PP_PARAMS_V3:
  907. /* set payload size to in-band payload */
  908. /* set data size to actual out of band payload size */
  909. data_size = payload_size - 4 * sizeof(u32);
  910. if (data_size > rtac_cal[ASM_RTAC_CAL].map_data.map_size) {
  911. pr_err("%s: Invalid data size = %d\n",
  912. __func__, data_size);
  913. result = -EINVAL;
  914. goto err;
  915. }
  916. payload_size = 4 * sizeof(u32);
  917. /* Copy buffer to out-of-band payload */
  918. if (copy_from_user((void *)
  919. rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr,
  920. buf + 7 * sizeof(u32), data_size)) {
  921. pr_err("%s: Could not copy payload from user buffer\n",
  922. __func__);
  923. result = -EFAULT;
  924. goto err;
  925. }
  926. /* set payload size in packet */
  927. rtac_asm_buffer[8] = data_size;
  928. break;
  929. case ASM_STREAM_CMD_GET_PP_PARAMS_V2:
  930. case ASM_STREAM_CMD_GET_PP_PARAMS_V3:
  931. if (payload_size > MAX_PAYLOAD_SIZE) {
  932. pr_err("%s: Invalid payload size = %d\n",
  933. __func__, payload_size);
  934. result = -EINVAL;
  935. goto err;
  936. }
  937. /* Copy buffer to in-band payload */
  938. if (copy_from_user(rtac_asm_buffer +
  939. sizeof(asm_params)/sizeof(u32),
  940. buf + 3 * sizeof(u32), payload_size)) {
  941. pr_err("%s: Could not copy payload from user buffer\n",
  942. __func__);
  943. result = -EFAULT;
  944. goto err;
  945. }
  946. break;
  947. default:
  948. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  949. result = -EINVAL;
  950. goto err;
  951. }
  952. /* Pack header */
  953. asm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  954. APR_HDR_LEN(20), APR_PKT_VER);
  955. asm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
  956. payload_size);
  957. asm_params.src_svc = q6asm_get_apr_service_id(session_id);
  958. asm_params.src_domain = APR_DOMAIN_APPS;
  959. asm_params.src_port = (session_id << 8) | 0x0001;
  960. asm_params.dest_svc = APR_SVC_ASM;
  961. asm_params.dest_domain = APR_DOMAIN_ADSP;
  962. asm_params.dest_port = (session_id << 8) | 0x0001;
  963. asm_params.token = session_id;
  964. asm_params.opcode = opcode;
  965. /* fill for out-of-band */
  966. rtac_asm_buffer[5] =
  967. lower_32_bits(rtac_cal[ASM_RTAC_CAL].cal_data.paddr);
  968. rtac_asm_buffer[6] =
  969. msm_audio_populate_upper_32_bits(
  970. rtac_cal[ASM_RTAC_CAL].cal_data.paddr);
  971. rtac_asm_buffer[7] = rtac_cal[ASM_RTAC_CAL].map_data.map_handle;
  972. memcpy(rtac_asm_buffer, &asm_params, sizeof(asm_params));
  973. atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 1);
  974. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  975. __func__, opcode,
  976. &rtac_cal[ASM_RTAC_CAL].cal_data.paddr);
  977. result = apr_send_pkt(rtac_asm_apr_data[session_id].apr_handle,
  978. (uint32_t *)rtac_asm_buffer);
  979. if (result < 0) {
  980. pr_err("%s: Set params failed session = %d\n",
  981. __func__, session_id);
  982. goto err;
  983. }
  984. /* Wait for the callback */
  985. result = wait_event_timeout(rtac_asm_apr_data[session_id].cmd_wait,
  986. (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) == 0),
  987. msecs_to_jiffies(TIMEOUT_MS));
  988. if (!result) {
  989. pr_err("%s: Set params timed out session = %d\n",
  990. __func__, session_id);
  991. goto err;
  992. }
  993. if (atomic_read(&rtac_common.apr_err_code)) {
  994. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  995. __func__, adsp_err_get_err_str(atomic_read(
  996. &rtac_common.apr_err_code)),
  997. opcode);
  998. result = adsp_err_get_lnx_err_code(
  999. atomic_read(
  1000. &rtac_common.apr_err_code));
  1001. goto err;
  1002. }
  1003. if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V2) {
  1004. bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data.
  1005. kvaddr)[2] + 3 * sizeof(u32);
  1006. } else if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V3) {
  1007. bytes_returned =
  1008. ((u32 *) rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr)[3] +
  1009. 4 * sizeof(u32);
  1010. } else {
  1011. bytes_returned = data_size;
  1012. goto unlock;
  1013. }
  1014. if (bytes_returned > rtac_cal[ASM_RTAC_CAL].map_data.map_size) {
  1015. pr_err("%s: Invalid data size = %d\n", __func__,
  1016. bytes_returned);
  1017. result = -EINVAL;
  1018. goto err;
  1019. }
  1020. if (bytes_returned > user_buf_size) {
  1021. pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
  1022. __func__, user_buf_size, bytes_returned);
  1023. result = -EINVAL;
  1024. goto err;
  1025. }
  1026. if (copy_to_user((void __user *) buf,
  1027. rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr,
  1028. bytes_returned)) {
  1029. pr_err("%s: Could not copy buffer to user,size = %d\n",
  1030. __func__, bytes_returned);
  1031. result = -EFAULT;
  1032. goto err;
  1033. }
  1034. unlock:
  1035. mutex_unlock(&rtac_asm_apr_mutex);
  1036. done:
  1037. return bytes_returned;
  1038. err:
  1039. mutex_unlock(&rtac_asm_apr_mutex);
  1040. return result;
  1041. }
  1042. /* AFE APR */
  1043. void rtac_set_afe_handle(void *handle)
  1044. {
  1045. mutex_lock(&rtac_afe_apr_mutex);
  1046. rtac_afe_apr_data.apr_handle = handle;
  1047. mutex_unlock(&rtac_afe_apr_mutex);
  1048. }
  1049. bool rtac_make_afe_callback(uint32_t *payload, uint32_t payload_size)
  1050. {
  1051. pr_debug("%s:cmd_state = %d\n", __func__,
  1052. atomic_read(&rtac_afe_apr_data.cmd_state));
  1053. if (atomic_read(&rtac_afe_apr_data.cmd_state) != 1)
  1054. return false;
  1055. if (payload_size == sizeof(uint32_t))
  1056. atomic_set(&rtac_common.apr_err_code, payload[0]);
  1057. else if (payload_size == (2*sizeof(uint32_t)))
  1058. atomic_set(&rtac_common.apr_err_code, payload[1]);
  1059. atomic_set(&rtac_afe_apr_data.cmd_state, 0);
  1060. wake_up(&rtac_afe_apr_data.cmd_wait);
  1061. return true;
  1062. }
  1063. static int fill_afe_apr_hdr(struct apr_hdr *apr_hdr, uint32_t port,
  1064. uint32_t opcode, uint32_t apr_msg_size)
  1065. {
  1066. if (apr_hdr == NULL) {
  1067. pr_err("%s: invalid APR pointer", __func__);
  1068. return -EINVAL;
  1069. }
  1070. apr_hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  1071. APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
  1072. apr_hdr->pkt_size = apr_msg_size;
  1073. apr_hdr->src_svc = APR_SVC_AFE;
  1074. apr_hdr->src_domain = APR_DOMAIN_APPS;
  1075. apr_hdr->src_port = 0;
  1076. apr_hdr->dest_svc = APR_SVC_AFE;
  1077. apr_hdr->dest_domain = APR_DOMAIN_ADSP;
  1078. apr_hdr->dest_port = 0;
  1079. apr_hdr->token = port;
  1080. apr_hdr->opcode = opcode;
  1081. return 0;
  1082. }
  1083. static int send_rtac_afe_apr(void __user *buf, uint32_t opcode)
  1084. {
  1085. int32_t result;
  1086. uint32_t bytes_returned = 0;
  1087. uint32_t payload_size = 0;
  1088. uint32_t port_index = 0;
  1089. uint32_t *afe_cmd = NULL;
  1090. uint32_t apr_msg_size = 0;
  1091. struct rtac_afe_user_data user_afe_buf;
  1092. struct mem_mapping_hdr *mem_hdr = NULL;
  1093. struct param_hdr_v1 *get_resp_v2;
  1094. struct param_hdr_v3 *get_resp_v3;
  1095. pr_debug("%s\n", __func__);
  1096. if (rtac_cal[AFE_RTAC_CAL].map_data.dma_buf == NULL) {
  1097. result = rtac_allocate_cal_buffer(AFE_RTAC_CAL);
  1098. if (result < 0) {
  1099. pr_err("%s: allocate buffer failed! ret = %d\n",
  1100. __func__, result);
  1101. goto done;
  1102. }
  1103. }
  1104. if (rtac_cal[AFE_RTAC_CAL].map_data.map_handle == 0) {
  1105. result = rtac_map_cal_buffer(AFE_RTAC_CAL);
  1106. if (result < 0) {
  1107. pr_err("%s: map buffer failed! ret = %d\n",
  1108. __func__, result);
  1109. goto done;
  1110. }
  1111. }
  1112. if (copy_from_user(&user_afe_buf, (void *)buf,
  1113. sizeof(struct rtac_afe_user_data))) {
  1114. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  1115. __func__, buf);
  1116. goto done;
  1117. }
  1118. if (user_afe_buf.buf_size <= 0) {
  1119. pr_err("%s: Invalid buffer size = %d\n",
  1120. __func__, user_afe_buf.buf_size);
  1121. goto done;
  1122. }
  1123. port_index = q6audio_get_port_index(user_afe_buf.port_id);
  1124. if (port_index >= AFE_MAX_PORTS) {
  1125. pr_err("%s: Invalid AFE port = 0x%x\n",
  1126. __func__, user_afe_buf.port_id);
  1127. goto done;
  1128. }
  1129. mutex_lock(&rtac_afe_apr_mutex);
  1130. if (rtac_afe_apr_data.apr_handle == NULL) {
  1131. pr_err("%s: APR not initialized\n", __func__);
  1132. result = -EINVAL;
  1133. goto err;
  1134. }
  1135. afe_cmd =
  1136. (u32 *) rtac_afe_buffer + sizeof(struct apr_hdr) / sizeof(u32);
  1137. switch (opcode) {
  1138. case AFE_PORT_CMD_SET_PARAM_V2:
  1139. apr_msg_size = sizeof(struct afe_port_cmd_set_param_v2);
  1140. payload_size = user_afe_buf.v2_set.payload_size;
  1141. if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) {
  1142. pr_err("%s: Invalid payload size = %d\n", __func__,
  1143. payload_size);
  1144. result = -EINVAL;
  1145. goto err;
  1146. }
  1147. /* Copy the command to the rtac buffer */
  1148. memcpy(afe_cmd, &user_afe_buf.v2_set,
  1149. sizeof(user_afe_buf.v2_set));
  1150. /* Copy the param data to the out-of-band location */
  1151. if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr,
  1152. (void __user *) buf +
  1153. offsetof(struct rtac_afe_user_data,
  1154. v2_set.param_hdr),
  1155. payload_size)) {
  1156. pr_err("%s: Could not copy payload from user buffer\n",
  1157. __func__);
  1158. result = -EFAULT;
  1159. goto err;
  1160. }
  1161. break;
  1162. case AFE_PORT_CMD_SET_PARAM_V3:
  1163. apr_msg_size = sizeof(struct afe_port_cmd_set_param_v3);
  1164. payload_size = user_afe_buf.v3_set.payload_size;
  1165. if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) {
  1166. pr_err("%s: Invalid payload size = %d\n", __func__,
  1167. payload_size);
  1168. result = -EINVAL;
  1169. goto err;
  1170. }
  1171. /* Copy the command to the rtac buffer */
  1172. memcpy(afe_cmd, &user_afe_buf.v3_set,
  1173. sizeof(user_afe_buf.v3_set));
  1174. /* Copy the param data to the out-of-band location */
  1175. if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr,
  1176. (void __user *) buf +
  1177. offsetof(struct rtac_afe_user_data,
  1178. v3_set.param_hdr),
  1179. payload_size)) {
  1180. pr_err("%s: Could not copy payload from user buffer\n",
  1181. __func__);
  1182. result = -EFAULT;
  1183. goto err;
  1184. }
  1185. break;
  1186. case AFE_PORT_CMD_GET_PARAM_V2:
  1187. apr_msg_size = sizeof(struct afe_port_cmd_get_param_v2);
  1188. if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) {
  1189. pr_err("%s: Invalid payload size = %d\n", __func__,
  1190. user_afe_buf.cmd_size);
  1191. result = -EINVAL;
  1192. goto err;
  1193. }
  1194. /* Copy the command and param data in-band */
  1195. if (copy_from_user(afe_cmd,
  1196. (void __user *) buf +
  1197. offsetof(struct rtac_afe_user_data,
  1198. v2_get),
  1199. user_afe_buf.cmd_size)) {
  1200. pr_err("%s: Could not copy payload from user buffer\n",
  1201. __func__);
  1202. result = -EFAULT;
  1203. goto err;
  1204. }
  1205. break;
  1206. case AFE_PORT_CMD_GET_PARAM_V3:
  1207. apr_msg_size = sizeof(struct afe_port_cmd_get_param_v3);
  1208. if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) {
  1209. pr_err("%s: Invalid payload size = %d\n", __func__,
  1210. user_afe_buf.cmd_size);
  1211. result = -EINVAL;
  1212. goto err;
  1213. }
  1214. /* Copy the command and param data in-band */
  1215. if (copy_from_user(afe_cmd,
  1216. (void __user *) buf +
  1217. offsetof(struct rtac_afe_user_data,
  1218. v3_get),
  1219. user_afe_buf.cmd_size)) {
  1220. pr_err("%s: Could not copy payload from user buffer\n",
  1221. __func__);
  1222. result = -EFAULT;
  1223. goto err;
  1224. }
  1225. break;
  1226. default:
  1227. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  1228. result = -EINVAL;
  1229. goto err;
  1230. }
  1231. /*
  1232. * The memory header is in the same location in all commands. Therefore,
  1233. * it doesn't matter what command the buffer is cast into.
  1234. */
  1235. mem_hdr = &((struct afe_port_cmd_set_param_v3 *) rtac_afe_buffer)
  1236. ->mem_hdr;
  1237. mem_hdr->data_payload_addr_lsw =
  1238. lower_32_bits(rtac_cal[AFE_RTAC_CAL].cal_data.paddr);
  1239. mem_hdr->data_payload_addr_msw = msm_audio_populate_upper_32_bits(
  1240. rtac_cal[AFE_RTAC_CAL].cal_data.paddr);
  1241. mem_hdr->mem_map_handle = rtac_cal[AFE_RTAC_CAL].map_data.map_handle;
  1242. /* Fill the APR header at the end so we have the correct message size */
  1243. fill_afe_apr_hdr((struct apr_hdr *) rtac_afe_buffer,
  1244. port_index, opcode, apr_msg_size);
  1245. atomic_set(&rtac_afe_apr_data.cmd_state, 1);
  1246. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  1247. __func__, opcode,
  1248. &rtac_cal[AFE_RTAC_CAL].cal_data.paddr);
  1249. result = apr_send_pkt(rtac_afe_apr_data.apr_handle,
  1250. (uint32_t *)rtac_afe_buffer);
  1251. if (result < 0) {
  1252. pr_err("%s: Set params failed port = 0x%x, ret = %d\n",
  1253. __func__, user_afe_buf.port_id, result);
  1254. goto err;
  1255. }
  1256. /* Wait for the callback */
  1257. result = wait_event_timeout(rtac_afe_apr_data.cmd_wait,
  1258. (atomic_read(&rtac_afe_apr_data.cmd_state) == 0),
  1259. msecs_to_jiffies(TIMEOUT_MS));
  1260. if (!result) {
  1261. pr_err("%s: Set params timed out port = 0x%x, ret = %d\n",
  1262. __func__, user_afe_buf.port_id, result);
  1263. goto err;
  1264. }
  1265. if (atomic_read(&rtac_common.apr_err_code)) {
  1266. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  1267. __func__, adsp_err_get_err_str(atomic_read(
  1268. &rtac_common.apr_err_code)),
  1269. opcode);
  1270. result = adsp_err_get_lnx_err_code(
  1271. atomic_read(
  1272. &rtac_common.apr_err_code));
  1273. goto err;
  1274. }
  1275. if (opcode == AFE_PORT_CMD_GET_PARAM_V2) {
  1276. get_resp_v2 = (struct param_hdr_v1 *) rtac_cal[AFE_RTAC_CAL]
  1277. .cal_data.kvaddr;
  1278. bytes_returned =
  1279. get_resp_v2->param_size + sizeof(struct param_hdr_v1);
  1280. } else if (opcode == AFE_PORT_CMD_GET_PARAM_V3) {
  1281. get_resp_v3 = (struct param_hdr_v3 *) rtac_cal[AFE_RTAC_CAL]
  1282. .cal_data.kvaddr;
  1283. bytes_returned =
  1284. get_resp_v3->param_size + sizeof(struct param_hdr_v3);
  1285. } else {
  1286. bytes_returned = payload_size;
  1287. goto unlock;
  1288. }
  1289. if (bytes_returned > rtac_cal[AFE_RTAC_CAL].map_data.map_size) {
  1290. pr_err("%s: Invalid data size = %d\n", __func__,
  1291. bytes_returned);
  1292. result = -EINVAL;
  1293. goto err;
  1294. }
  1295. if (bytes_returned > user_afe_buf.buf_size) {
  1296. pr_err("%s: user size = 0x%x, returned size = 0x%x\n", __func__,
  1297. user_afe_buf.buf_size, bytes_returned);
  1298. result = -EINVAL;
  1299. goto err;
  1300. }
  1301. if (copy_to_user((void __user *) buf,
  1302. rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr,
  1303. bytes_returned)) {
  1304. pr_err("%s: Could not copy buffer to user,size = %d\n",
  1305. __func__, bytes_returned);
  1306. result = -EFAULT;
  1307. goto err;
  1308. }
  1309. unlock:
  1310. mutex_unlock(&rtac_afe_apr_mutex);
  1311. done:
  1312. return bytes_returned;
  1313. err:
  1314. mutex_unlock(&rtac_afe_apr_mutex);
  1315. return result;
  1316. }
  1317. /* Voice APR */
  1318. void rtac_set_voice_handle(u32 mode, void *handle)
  1319. {
  1320. pr_debug("%s\n", __func__);
  1321. mutex_lock(&rtac_voice_apr_mutex);
  1322. rtac_voice_apr_data[mode].apr_handle = handle;
  1323. mutex_unlock(&rtac_voice_apr_mutex);
  1324. }
  1325. bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size)
  1326. {
  1327. if ((atomic_read(&rtac_voice_apr_data[mode].cmd_state) != 1) ||
  1328. (mode >= RTAC_VOICE_MODES))
  1329. return false;
  1330. pr_debug("%s\n", __func__);
  1331. if (payload_size == sizeof(uint32_t))
  1332. atomic_set(&rtac_common.apr_err_code, payload[0]);
  1333. else if (payload_size == (2*sizeof(uint32_t)))
  1334. atomic_set(&rtac_common.apr_err_code, payload[1]);
  1335. atomic_set(&rtac_voice_apr_data[mode].cmd_state, 0);
  1336. wake_up(&rtac_voice_apr_data[mode].cmd_wait);
  1337. return true;
  1338. }
  1339. int send_voice_apr(u32 mode, void *buf, u32 opcode)
  1340. {
  1341. s32 result;
  1342. u32 user_buf_size = 0;
  1343. u32 bytes_returned = 0;
  1344. u32 payload_size;
  1345. u32 dest_port;
  1346. u32 data_size = 0;
  1347. struct apr_hdr voice_params;
  1348. pr_debug("%s\n", __func__);
  1349. if (rtac_cal[VOICE_RTAC_CAL].map_data.dma_buf == NULL) {
  1350. result = rtac_allocate_cal_buffer(VOICE_RTAC_CAL);
  1351. if (result < 0) {
  1352. pr_err("%s: allocate buffer failed!",
  1353. __func__);
  1354. goto done;
  1355. }
  1356. }
  1357. if (rtac_cal[VOICE_RTAC_CAL].map_data.map_handle == 0) {
  1358. result = rtac_map_cal_buffer(VOICE_RTAC_CAL);
  1359. if (result < 0) {
  1360. pr_err("%s: map buffer failed!",
  1361. __func__);
  1362. goto done;
  1363. }
  1364. }
  1365. if (copy_from_user(&user_buf_size, (void *)buf,
  1366. sizeof(user_buf_size))) {
  1367. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  1368. __func__, buf);
  1369. goto done;
  1370. }
  1371. if (user_buf_size <= 0) {
  1372. pr_err("%s: Invalid buffer size = %d\n",
  1373. __func__, user_buf_size);
  1374. goto done;
  1375. }
  1376. if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) {
  1377. pr_err("%s: Could not copy payload size from user buffer\n",
  1378. __func__);
  1379. goto done;
  1380. }
  1381. if (copy_from_user(&dest_port, buf + 2 * sizeof(u32), sizeof(u32))) {
  1382. pr_err("%s: Could not copy port id from user buffer\n",
  1383. __func__);
  1384. goto done;
  1385. }
  1386. if ((mode != RTAC_CVP) && (mode != RTAC_CVS)) {
  1387. pr_err("%s: Invalid Mode for APR, mode = %d\n",
  1388. __func__, mode);
  1389. goto done;
  1390. }
  1391. mutex_lock(&rtac_voice_apr_mutex);
  1392. if (rtac_voice_apr_data[mode].apr_handle == NULL) {
  1393. pr_err("%s: APR not initialized\n", __func__);
  1394. result = -EINVAL;
  1395. goto err;
  1396. }
  1397. switch (opcode) {
  1398. case VSS_ICOMMON_CMD_SET_PARAM_V2:
  1399. case VSS_ICOMMON_CMD_SET_PARAM_V3:
  1400. /* set payload size to in-band payload */
  1401. /* set data size to actual out of band payload size */
  1402. data_size = payload_size - 4 * sizeof(u32);
  1403. if (data_size > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) {
  1404. pr_err("%s: Invalid data size = %d\n",
  1405. __func__, data_size);
  1406. result = -EINVAL;
  1407. goto err;
  1408. }
  1409. payload_size = 4 * sizeof(u32);
  1410. /* Copy buffer to out-of-band payload */
  1411. if (copy_from_user((void *)
  1412. rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr,
  1413. buf + 7 * sizeof(u32), data_size)) {
  1414. pr_err("%s: Could not copy payload from user buffer\n",
  1415. __func__);
  1416. result = -EFAULT;
  1417. goto err;
  1418. }
  1419. /* set payload size in packet */
  1420. rtac_voice_buffer[8] = data_size;
  1421. /* set token for set param case */
  1422. voice_params.token = VOC_RTAC_SET_PARAM_TOKEN;
  1423. break;
  1424. case VSS_ICOMMON_CMD_GET_PARAM_V2:
  1425. case VSS_ICOMMON_CMD_GET_PARAM_V3:
  1426. if (payload_size > MAX_PAYLOAD_SIZE) {
  1427. pr_err("%s: Invalid payload size = %d\n",
  1428. __func__, payload_size);
  1429. result = -EINVAL;
  1430. goto err;
  1431. }
  1432. /* Copy buffer to in-band payload */
  1433. if (copy_from_user(rtac_voice_buffer +
  1434. sizeof(voice_params)/sizeof(u32),
  1435. buf + 3 * sizeof(u32), payload_size)) {
  1436. pr_err("%s: Could not copy payload from user buffer\n",
  1437. __func__);
  1438. result = -EFAULT;
  1439. goto err;
  1440. }
  1441. /* set token for get param case */
  1442. voice_params.token = 0;
  1443. break;
  1444. default:
  1445. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  1446. result = -EINVAL;
  1447. goto err;
  1448. }
  1449. /* Pack header */
  1450. voice_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  1451. APR_HDR_LEN(20), APR_PKT_VER);
  1452. voice_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
  1453. payload_size);
  1454. voice_params.src_svc = 0;
  1455. voice_params.src_domain = APR_DOMAIN_APPS;
  1456. voice_params.src_port = get_voice_index(mode, dest_port);
  1457. voice_params.dest_svc = 0;
  1458. voice_params.dest_domain = APR_DOMAIN_MODEM;
  1459. voice_params.dest_port = (u16)dest_port;
  1460. voice_params.opcode = opcode;
  1461. /* fill for out-of-band */
  1462. rtac_voice_buffer[5] = rtac_cal[VOICE_RTAC_CAL].map_data.map_handle;
  1463. rtac_voice_buffer[6] =
  1464. lower_32_bits(rtac_cal[VOICE_RTAC_CAL].cal_data.paddr);
  1465. rtac_voice_buffer[7] = msm_audio_populate_upper_32_bits(
  1466. rtac_cal[VOICE_RTAC_CAL].cal_data.paddr);
  1467. memcpy(rtac_voice_buffer, &voice_params, sizeof(voice_params));
  1468. atomic_set(&rtac_voice_apr_data[mode].cmd_state, 1);
  1469. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  1470. __func__, opcode,
  1471. &rtac_cal[VOICE_RTAC_CAL].cal_data.paddr);
  1472. result = apr_send_pkt(rtac_voice_apr_data[mode].apr_handle,
  1473. (uint32_t *)rtac_voice_buffer);
  1474. if (result < 0) {
  1475. pr_err("%s: apr_send_pkt failed opcode = %x\n",
  1476. __func__, opcode);
  1477. goto err;
  1478. }
  1479. /* Wait for the callback */
  1480. result = wait_event_timeout(rtac_voice_apr_data[mode].cmd_wait,
  1481. (atomic_read(&rtac_voice_apr_data[mode].cmd_state) == 0),
  1482. msecs_to_jiffies(TIMEOUT_MS));
  1483. if (!result) {
  1484. pr_err("%s: apr_send_pkt timed out opcode = %x\n",
  1485. __func__, opcode);
  1486. goto err;
  1487. }
  1488. if (atomic_read(&rtac_common.apr_err_code)) {
  1489. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  1490. __func__, adsp_err_get_err_str(atomic_read(
  1491. &rtac_common.apr_err_code)),
  1492. opcode);
  1493. result = adsp_err_get_lnx_err_code(
  1494. atomic_read(
  1495. &rtac_common.apr_err_code));
  1496. goto err;
  1497. }
  1498. if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V2) {
  1499. bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data.
  1500. kvaddr)[2] + 3 * sizeof(u32);
  1501. } else if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V3) {
  1502. bytes_returned =
  1503. ((u32 *) rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr)[3] +
  1504. 4 * sizeof(u32);
  1505. } else {
  1506. bytes_returned = data_size;
  1507. goto unlock;
  1508. }
  1509. if (bytes_returned > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) {
  1510. pr_err("%s: Invalid data size = %d\n", __func__,
  1511. bytes_returned);
  1512. result = -EINVAL;
  1513. goto err;
  1514. }
  1515. if (bytes_returned > user_buf_size) {
  1516. pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
  1517. __func__, user_buf_size, bytes_returned);
  1518. result = -EINVAL;
  1519. goto err;
  1520. }
  1521. if (copy_to_user((void __user *) buf,
  1522. rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr,
  1523. bytes_returned)) {
  1524. pr_err("%s: Could not copy buffer to user, size = %d\n",
  1525. __func__, bytes_returned);
  1526. result = -EFAULT;
  1527. goto err;
  1528. }
  1529. unlock:
  1530. mutex_unlock(&rtac_voice_apr_mutex);
  1531. done:
  1532. return bytes_returned;
  1533. err:
  1534. mutex_unlock(&rtac_voice_apr_mutex);
  1535. return result;
  1536. }
  1537. void get_rtac_adm_data(struct rtac_adm *adm_data)
  1538. {
  1539. mutex_lock(&rtac_adm_mutex);
  1540. memcpy(adm_data, &rtac_adm_data, sizeof(struct rtac_adm));
  1541. mutex_unlock(&rtac_adm_mutex);
  1542. }
  1543. static long rtac_ioctl_shared(struct file *f,
  1544. unsigned int cmd, void *arg)
  1545. {
  1546. u32 opcode;
  1547. int result = 0;
  1548. if (!arg) {
  1549. pr_err("%s: No data sent to driver!\n", __func__);
  1550. result = -EFAULT;
  1551. goto done;
  1552. }
  1553. switch (cmd) {
  1554. case AUDIO_GET_RTAC_ADM_INFO: {
  1555. mutex_lock(&rtac_adm_mutex);
  1556. if (copy_to_user((void *)arg, &rtac_adm_data,
  1557. sizeof(rtac_adm_data))) {
  1558. pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_ADM_INFO\n",
  1559. __func__);
  1560. mutex_unlock(&rtac_adm_mutex);
  1561. return -EFAULT;
  1562. }
  1563. result = sizeof(rtac_adm_data);
  1564. mutex_unlock(&rtac_adm_mutex);
  1565. break;
  1566. }
  1567. case AUDIO_GET_RTAC_VOICE_INFO: {
  1568. mutex_lock(&rtac_voice_mutex);
  1569. if (copy_to_user((void *)arg, &rtac_voice_data,
  1570. sizeof(rtac_voice_data))) {
  1571. pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_VOICE_INFO\n",
  1572. __func__);
  1573. mutex_unlock(&rtac_voice_mutex);
  1574. return -EFAULT;
  1575. }
  1576. result = sizeof(rtac_voice_data);
  1577. mutex_unlock(&rtac_voice_mutex);
  1578. break;
  1579. }
  1580. case AUDIO_GET_RTAC_ADM_CAL:
  1581. opcode = q6common_is_instance_id_supported() ?
  1582. ADM_CMD_GET_PP_PARAMS_V6 :
  1583. ADM_CMD_GET_PP_PARAMS_V5;
  1584. result = send_adm_apr((void *) arg, opcode);
  1585. break;
  1586. case AUDIO_SET_RTAC_ADM_CAL:
  1587. opcode = q6common_is_instance_id_supported() ?
  1588. ADM_CMD_SET_PP_PARAMS_V6 :
  1589. ADM_CMD_SET_PP_PARAMS_V5;
  1590. result = send_adm_apr((void *) arg, opcode);
  1591. break;
  1592. case AUDIO_GET_RTAC_ASM_CAL:
  1593. opcode = q6common_is_instance_id_supported() ?
  1594. ASM_STREAM_CMD_GET_PP_PARAMS_V3 :
  1595. ASM_STREAM_CMD_GET_PP_PARAMS_V2;
  1596. result = send_rtac_asm_apr((void *) arg, opcode);
  1597. break;
  1598. case AUDIO_SET_RTAC_ASM_CAL:
  1599. opcode = q6common_is_instance_id_supported() ?
  1600. ASM_STREAM_CMD_SET_PP_PARAMS_V3 :
  1601. ASM_STREAM_CMD_SET_PP_PARAMS_V2;
  1602. result = send_rtac_asm_apr((void *) arg, opcode);
  1603. break;
  1604. case AUDIO_GET_RTAC_CVS_CAL:
  1605. opcode = q6common_is_instance_id_supported() ?
  1606. VSS_ICOMMON_CMD_GET_PARAM_V3 :
  1607. VSS_ICOMMON_CMD_GET_PARAM_V2;
  1608. result = send_voice_apr(RTAC_CVS, (void *) arg, opcode);
  1609. break;
  1610. case AUDIO_SET_RTAC_CVS_CAL:
  1611. opcode = q6common_is_instance_id_supported() ?
  1612. VSS_ICOMMON_CMD_SET_PARAM_V3 :
  1613. VSS_ICOMMON_CMD_SET_PARAM_V2;
  1614. result = send_voice_apr(RTAC_CVS, (void *) arg, opcode);
  1615. break;
  1616. case AUDIO_GET_RTAC_CVP_CAL:
  1617. opcode = q6common_is_instance_id_supported() ?
  1618. VSS_ICOMMON_CMD_GET_PARAM_V3 :
  1619. VSS_ICOMMON_CMD_GET_PARAM_V2;
  1620. result = send_voice_apr(RTAC_CVP, (void *) arg, opcode);
  1621. break;
  1622. case AUDIO_SET_RTAC_CVP_CAL:
  1623. opcode = q6common_is_instance_id_supported() ?
  1624. VSS_ICOMMON_CMD_SET_PARAM_V3 :
  1625. VSS_ICOMMON_CMD_SET_PARAM_V2;
  1626. result = send_voice_apr(RTAC_CVP, (void *) arg, opcode);
  1627. break;
  1628. case AUDIO_GET_RTAC_AFE_CAL:
  1629. opcode = q6common_is_instance_id_supported() ?
  1630. AFE_PORT_CMD_GET_PARAM_V3 :
  1631. AFE_PORT_CMD_GET_PARAM_V2;
  1632. result = send_rtac_afe_apr((void __user *) arg, opcode);
  1633. break;
  1634. case AUDIO_SET_RTAC_AFE_CAL:
  1635. opcode = q6common_is_instance_id_supported() ?
  1636. AFE_PORT_CMD_SET_PARAM_V3 :
  1637. AFE_PORT_CMD_SET_PARAM_V2;
  1638. result = send_rtac_afe_apr((void __user *) arg, opcode);
  1639. break;
  1640. default:
  1641. pr_err("%s: Invalid IOCTL, command = %d!\n",
  1642. __func__, cmd);
  1643. result = -EINVAL;
  1644. }
  1645. done:
  1646. return result;
  1647. }
  1648. static long rtac_ioctl(struct file *f,
  1649. unsigned int cmd, unsigned long arg)
  1650. {
  1651. int result = 0;
  1652. mutex_lock(&rtac_common.rtac_fops_mutex);
  1653. if (!arg) {
  1654. pr_err("%s: No data sent to driver!\n", __func__);
  1655. result = -EFAULT;
  1656. } else {
  1657. result = rtac_ioctl_shared(f, cmd, (void __user *)arg);
  1658. }
  1659. mutex_unlock(&rtac_common.rtac_fops_mutex);
  1660. return result;
  1661. }
  1662. #ifdef CONFIG_COMPAT
  1663. #define AUDIO_GET_RTAC_ADM_INFO_32 _IOR(CAL_IOCTL_MAGIC, 207, compat_uptr_t)
  1664. #define AUDIO_GET_RTAC_VOICE_INFO_32 _IOR(CAL_IOCTL_MAGIC, 208, compat_uptr_t)
  1665. #define AUDIO_GET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 209, compat_uptr_t)
  1666. #define AUDIO_SET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 210, compat_uptr_t)
  1667. #define AUDIO_GET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 211, compat_uptr_t)
  1668. #define AUDIO_SET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 212, compat_uptr_t)
  1669. #define AUDIO_GET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 213, compat_uptr_t)
  1670. #define AUDIO_SET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 214, compat_uptr_t)
  1671. #define AUDIO_GET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 215, compat_uptr_t)
  1672. #define AUDIO_SET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 216, compat_uptr_t)
  1673. #define AUDIO_GET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 217, compat_uptr_t)
  1674. #define AUDIO_SET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 218, compat_uptr_t)
  1675. static long rtac_compat_ioctl(struct file *f,
  1676. unsigned int cmd, unsigned long arg)
  1677. {
  1678. int result = 0;
  1679. mutex_lock(&rtac_common.rtac_fops_mutex);
  1680. if (!arg) {
  1681. pr_err("%s: No data sent to driver!\n", __func__);
  1682. result = -EINVAL;
  1683. goto done;
  1684. }
  1685. switch (cmd) {
  1686. case AUDIO_GET_RTAC_ADM_INFO_32:
  1687. cmd = AUDIO_GET_RTAC_ADM_INFO;
  1688. goto process;
  1689. case AUDIO_GET_RTAC_VOICE_INFO_32:
  1690. cmd = AUDIO_GET_RTAC_VOICE_INFO;
  1691. goto process;
  1692. case AUDIO_GET_RTAC_AFE_CAL_32:
  1693. cmd = AUDIO_GET_RTAC_AFE_CAL;
  1694. goto process;
  1695. case AUDIO_SET_RTAC_AFE_CAL_32:
  1696. cmd = AUDIO_SET_RTAC_AFE_CAL;
  1697. goto process;
  1698. case AUDIO_GET_RTAC_ADM_CAL_32:
  1699. cmd = AUDIO_GET_RTAC_ADM_CAL;
  1700. goto process;
  1701. case AUDIO_SET_RTAC_ADM_CAL_32:
  1702. cmd = AUDIO_SET_RTAC_ADM_CAL;
  1703. goto process;
  1704. case AUDIO_GET_RTAC_ASM_CAL_32:
  1705. cmd = AUDIO_GET_RTAC_ASM_CAL;
  1706. goto process;
  1707. case AUDIO_SET_RTAC_ASM_CAL_32:
  1708. cmd = AUDIO_SET_RTAC_ASM_CAL;
  1709. goto process;
  1710. case AUDIO_GET_RTAC_CVS_CAL_32:
  1711. cmd = AUDIO_GET_RTAC_CVS_CAL;
  1712. goto process;
  1713. case AUDIO_SET_RTAC_CVS_CAL_32:
  1714. cmd = AUDIO_SET_RTAC_CVS_CAL;
  1715. goto process;
  1716. case AUDIO_GET_RTAC_CVP_CAL_32:
  1717. cmd = AUDIO_GET_RTAC_CVP_CAL;
  1718. goto process;
  1719. case AUDIO_SET_RTAC_CVP_CAL_32:
  1720. cmd = AUDIO_SET_RTAC_CVP_CAL;
  1721. process:
  1722. result = rtac_ioctl_shared(f, cmd, compat_ptr(arg));
  1723. break;
  1724. default:
  1725. result = -EINVAL;
  1726. pr_err("%s: Invalid IOCTL, command = %d!\n",
  1727. __func__, cmd);
  1728. break;
  1729. }
  1730. done:
  1731. mutex_unlock(&rtac_common.rtac_fops_mutex);
  1732. return result;
  1733. }
  1734. #else
  1735. #define rtac_compat_ioctl NULL
  1736. #endif
  1737. static const struct file_operations rtac_fops = {
  1738. .owner = THIS_MODULE,
  1739. .open = rtac_open,
  1740. .release = rtac_release,
  1741. .unlocked_ioctl = rtac_ioctl,
  1742. .compat_ioctl = rtac_compat_ioctl,
  1743. };
  1744. struct miscdevice rtac_misc = {
  1745. .minor = MISC_DYNAMIC_MINOR,
  1746. .name = "msm_rtac",
  1747. .fops = &rtac_fops,
  1748. };
  1749. int __init rtac_init(void)
  1750. {
  1751. int i = 0;
  1752. /* Driver */
  1753. atomic_set(&rtac_common.usage_count, 0);
  1754. atomic_set(&rtac_common.apr_err_code, 0);
  1755. mutex_init(&rtac_common.rtac_fops_mutex);
  1756. /* ADM */
  1757. memset(&rtac_adm_data, 0, sizeof(rtac_adm_data));
  1758. rtac_adm_apr_data.apr_handle = NULL;
  1759. atomic_set(&rtac_adm_apr_data.cmd_state, 0);
  1760. init_waitqueue_head(&rtac_adm_apr_data.cmd_wait);
  1761. mutex_init(&rtac_adm_mutex);
  1762. mutex_init(&rtac_adm_apr_mutex);
  1763. rtac_adm_buffer = kzalloc(
  1764. rtac_cal[ADM_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1765. if (rtac_adm_buffer == NULL)
  1766. goto nomem;
  1767. /* ASM */
  1768. for (i = 0; i < ASM_ACTIVE_STREAMS_ALLOWED+1; i++) {
  1769. rtac_asm_apr_data[i].apr_handle = NULL;
  1770. atomic_set(&rtac_asm_apr_data[i].cmd_state, 0);
  1771. init_waitqueue_head(&rtac_asm_apr_data[i].cmd_wait);
  1772. }
  1773. mutex_init(&rtac_asm_apr_mutex);
  1774. rtac_asm_buffer = kzalloc(
  1775. rtac_cal[ASM_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1776. if (rtac_asm_buffer == NULL) {
  1777. kzfree(rtac_adm_buffer);
  1778. goto nomem;
  1779. }
  1780. /* AFE */
  1781. rtac_afe_apr_data.apr_handle = NULL;
  1782. atomic_set(&rtac_afe_apr_data.cmd_state, 0);
  1783. init_waitqueue_head(&rtac_afe_apr_data.cmd_wait);
  1784. mutex_init(&rtac_afe_apr_mutex);
  1785. rtac_afe_buffer = kzalloc(
  1786. rtac_cal[AFE_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1787. if (rtac_afe_buffer == NULL) {
  1788. kzfree(rtac_adm_buffer);
  1789. kzfree(rtac_asm_buffer);
  1790. goto nomem;
  1791. }
  1792. /* Voice */
  1793. memset(&rtac_voice_data, 0, sizeof(rtac_voice_data));
  1794. for (i = 0; i < RTAC_VOICE_MODES; i++) {
  1795. rtac_voice_apr_data[i].apr_handle = NULL;
  1796. atomic_set(&rtac_voice_apr_data[i].cmd_state, 0);
  1797. init_waitqueue_head(&rtac_voice_apr_data[i].cmd_wait);
  1798. }
  1799. mutex_init(&rtac_voice_mutex);
  1800. mutex_init(&rtac_voice_apr_mutex);
  1801. rtac_voice_buffer = kzalloc(
  1802. rtac_cal[VOICE_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1803. if (rtac_voice_buffer == NULL) {
  1804. kzfree(rtac_adm_buffer);
  1805. kzfree(rtac_asm_buffer);
  1806. kzfree(rtac_afe_buffer);
  1807. goto nomem;
  1808. }
  1809. if (misc_register(&rtac_misc) != 0) {
  1810. kzfree(rtac_adm_buffer);
  1811. kzfree(rtac_asm_buffer);
  1812. kzfree(rtac_afe_buffer);
  1813. kzfree(rtac_voice_buffer);
  1814. goto nomem;
  1815. }
  1816. return 0;
  1817. nomem:
  1818. return -ENOMEM;
  1819. }
  1820. void rtac_exit(void)
  1821. {
  1822. misc_deregister(&rtac_misc);
  1823. kzfree(rtac_adm_buffer);
  1824. kzfree(rtac_asm_buffer);
  1825. kzfree(rtac_afe_buffer);
  1826. kzfree(rtac_voice_buffer);
  1827. }
  1828. MODULE_DESCRIPTION("SoC QDSP6v2 Real-Time Audio Calibration driver");
  1829. MODULE_LICENSE("GPL v2");