rtac.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2020, 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 <audio/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. if (session_id >= (ASM_ACTIVE_STREAMS_ALLOWED + 1)) {
  830. pr_err_ratelimited("%s: Invalid Session = %d\n",
  831. __func__, session_id);
  832. return;
  833. }
  834. mutex_lock(&rtac_asm_apr_mutex);
  835. rtac_asm_apr_data[session_id].apr_handle = handle;
  836. mutex_unlock(&rtac_asm_apr_mutex);
  837. }
  838. bool rtac_make_asm_callback(u32 session_id, uint32_t *payload,
  839. u32 payload_size)
  840. {
  841. if (session_id >= (ASM_ACTIVE_STREAMS_ALLOWED + 1)) {
  842. pr_err_ratelimited("%s: Invalid Session = %d\n",
  843. __func__, session_id);
  844. return false;
  845. }
  846. if (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) != 1)
  847. return false;
  848. pr_debug("%s\n", __func__);
  849. if (payload_size == sizeof(uint32_t))
  850. atomic_set(&rtac_common.apr_err_code, payload[0]);
  851. else if (payload_size == (2*sizeof(uint32_t)))
  852. atomic_set(&rtac_common.apr_err_code, payload[1]);
  853. atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 0);
  854. wake_up(&rtac_asm_apr_data[session_id].cmd_wait);
  855. return true;
  856. }
  857. int send_rtac_asm_apr(void *buf, u32 opcode)
  858. {
  859. s32 result;
  860. u32 user_buf_size = 0;
  861. u32 bytes_returned = 0;
  862. u32 session_id = 0;
  863. u8 stream_id = 0;
  864. u32 payload_size;
  865. u32 data_size = 0;
  866. struct apr_hdr asm_params;
  867. pr_debug("%s\n", __func__);
  868. if (rtac_cal[ASM_RTAC_CAL].map_data.dma_buf == NULL) {
  869. result = rtac_allocate_cal_buffer(ASM_RTAC_CAL);
  870. if (result < 0) {
  871. pr_err("%s: allocate buffer failed!",
  872. __func__);
  873. goto done;
  874. }
  875. }
  876. if (rtac_cal[ASM_RTAC_CAL].map_data.map_handle == 0) {
  877. result = rtac_map_cal_buffer(ASM_RTAC_CAL);
  878. if (result < 0) {
  879. pr_err("%s: map buffer failed!",
  880. __func__);
  881. goto done;
  882. }
  883. }
  884. if (copy_from_user(&user_buf_size, (void *)buf,
  885. sizeof(user_buf_size))) {
  886. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  887. __func__, buf);
  888. goto done;
  889. }
  890. if (user_buf_size <= 0) {
  891. pr_err("%s: Invalid buffer size = %d\n",
  892. __func__, user_buf_size);
  893. goto done;
  894. }
  895. if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) {
  896. pr_err("%s: Could not copy payload size from user buffer\n",
  897. __func__);
  898. goto done;
  899. }
  900. if (copy_from_user(&session_id, buf + 2 * sizeof(u32), sizeof(u32))) {
  901. pr_err("%s: Could not copy session id from user buffer\n",
  902. __func__);
  903. goto done;
  904. }
  905. if (session_id >= (ASM_ACTIVE_STREAMS_ALLOWED + 1)) {
  906. pr_err("%s: Invalid Session = %d\n", __func__, session_id);
  907. goto done;
  908. }
  909. mutex_lock(&rtac_asm_apr_mutex);
  910. if (rtac_asm_apr_data[session_id].apr_handle == NULL) {
  911. pr_err("%s: APR not initialized\n", __func__);
  912. result = -EINVAL;
  913. goto err;
  914. }
  915. stream_id = q6asm_get_asm_stream_id(session_id);
  916. if ((stream_id != 1) && (stream_id != 2)) {
  917. pr_err("%s: Invalid stream id %u\n", __func__, stream_id);
  918. result = -EINVAL;
  919. goto err;
  920. }
  921. switch (opcode) {
  922. case ASM_STREAM_CMD_SET_PP_PARAMS_V2:
  923. case ASM_STREAM_CMD_SET_PP_PARAMS_V3:
  924. /* set payload size to in-band payload */
  925. /* set data size to actual out of band payload size */
  926. data_size = payload_size - 4 * sizeof(u32);
  927. if (data_size > rtac_cal[ASM_RTAC_CAL].map_data.map_size) {
  928. pr_err("%s: Invalid data size = %d\n",
  929. __func__, data_size);
  930. result = -EINVAL;
  931. goto err;
  932. }
  933. payload_size = 4 * sizeof(u32);
  934. /* Copy buffer to out-of-band payload */
  935. if (copy_from_user((void *)
  936. rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr,
  937. buf + 7 * sizeof(u32), data_size)) {
  938. pr_err("%s: Could not copy payload from user buffer\n",
  939. __func__);
  940. result = -EFAULT;
  941. goto err;
  942. }
  943. /* set payload size in packet */
  944. rtac_asm_buffer[8] = data_size;
  945. break;
  946. case ASM_STREAM_CMD_GET_PP_PARAMS_V2:
  947. case ASM_STREAM_CMD_GET_PP_PARAMS_V3:
  948. if (payload_size > MAX_PAYLOAD_SIZE) {
  949. pr_err("%s: Invalid payload size = %d\n",
  950. __func__, payload_size);
  951. result = -EINVAL;
  952. goto err;
  953. }
  954. /* Copy buffer to in-band payload */
  955. if (copy_from_user(rtac_asm_buffer +
  956. sizeof(asm_params)/sizeof(u32),
  957. buf + 3 * sizeof(u32), payload_size)) {
  958. pr_err("%s: Could not copy payload from user buffer\n",
  959. __func__);
  960. result = -EFAULT;
  961. goto err;
  962. }
  963. break;
  964. default:
  965. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  966. result = -EINVAL;
  967. goto err;
  968. }
  969. /* Pack header */
  970. asm_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  971. APR_HDR_LEN(20), APR_PKT_VER);
  972. asm_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
  973. payload_size);
  974. asm_params.src_svc = q6asm_get_apr_service_id(session_id);
  975. asm_params.src_domain = APR_DOMAIN_APPS;
  976. asm_params.src_port = (session_id << 8) | stream_id;
  977. asm_params.dest_svc = APR_SVC_ASM;
  978. asm_params.dest_domain = APR_DOMAIN_ADSP;
  979. asm_params.dest_port = (session_id << 8) | stream_id;
  980. asm_params.token = session_id;
  981. asm_params.opcode = opcode;
  982. /* fill for out-of-band */
  983. rtac_asm_buffer[5] =
  984. lower_32_bits(rtac_cal[ASM_RTAC_CAL].cal_data.paddr);
  985. rtac_asm_buffer[6] =
  986. msm_audio_populate_upper_32_bits(
  987. rtac_cal[ASM_RTAC_CAL].cal_data.paddr);
  988. rtac_asm_buffer[7] = rtac_cal[ASM_RTAC_CAL].map_data.map_handle;
  989. memcpy(rtac_asm_buffer, &asm_params, sizeof(asm_params));
  990. atomic_set(&rtac_asm_apr_data[session_id].cmd_state, 1);
  991. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  992. __func__, opcode,
  993. &rtac_cal[ASM_RTAC_CAL].cal_data.paddr);
  994. result = apr_send_pkt(rtac_asm_apr_data[session_id].apr_handle,
  995. (uint32_t *)rtac_asm_buffer);
  996. if (result < 0) {
  997. pr_err("%s: Set params failed session = %d\n",
  998. __func__, session_id);
  999. goto err;
  1000. }
  1001. /* Wait for the callback */
  1002. result = wait_event_timeout(rtac_asm_apr_data[session_id].cmd_wait,
  1003. (atomic_read(&rtac_asm_apr_data[session_id].cmd_state) == 0),
  1004. msecs_to_jiffies(TIMEOUT_MS));
  1005. if (!result) {
  1006. pr_err("%s: Set params timed out session = %d\n",
  1007. __func__, session_id);
  1008. goto err;
  1009. }
  1010. if (atomic_read(&rtac_common.apr_err_code)) {
  1011. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  1012. __func__, adsp_err_get_err_str(atomic_read(
  1013. &rtac_common.apr_err_code)),
  1014. opcode);
  1015. result = adsp_err_get_lnx_err_code(
  1016. atomic_read(
  1017. &rtac_common.apr_err_code));
  1018. goto err;
  1019. }
  1020. if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V2) {
  1021. bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data.
  1022. kvaddr)[2] + 3 * sizeof(u32);
  1023. } else if (opcode == ASM_STREAM_CMD_GET_PP_PARAMS_V3) {
  1024. bytes_returned =
  1025. ((u32 *) rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr)[3] +
  1026. 4 * sizeof(u32);
  1027. } else {
  1028. bytes_returned = data_size;
  1029. goto unlock;
  1030. }
  1031. if (bytes_returned > rtac_cal[ASM_RTAC_CAL].map_data.map_size) {
  1032. pr_err("%s: Invalid data size = %d\n", __func__,
  1033. bytes_returned);
  1034. result = -EINVAL;
  1035. goto err;
  1036. }
  1037. if (bytes_returned > user_buf_size) {
  1038. pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
  1039. __func__, user_buf_size, bytes_returned);
  1040. result = -EINVAL;
  1041. goto err;
  1042. }
  1043. if (copy_to_user((void __user *) buf,
  1044. rtac_cal[ASM_RTAC_CAL].cal_data.kvaddr,
  1045. bytes_returned)) {
  1046. pr_err("%s: Could not copy buffer to user,size = %d\n",
  1047. __func__, bytes_returned);
  1048. result = -EFAULT;
  1049. goto err;
  1050. }
  1051. unlock:
  1052. mutex_unlock(&rtac_asm_apr_mutex);
  1053. done:
  1054. return bytes_returned;
  1055. err:
  1056. mutex_unlock(&rtac_asm_apr_mutex);
  1057. return result;
  1058. }
  1059. /* AFE APR */
  1060. void rtac_set_afe_handle(void *handle)
  1061. {
  1062. mutex_lock(&rtac_afe_apr_mutex);
  1063. rtac_afe_apr_data.apr_handle = handle;
  1064. mutex_unlock(&rtac_afe_apr_mutex);
  1065. }
  1066. bool rtac_make_afe_callback(uint32_t *payload, uint32_t payload_size)
  1067. {
  1068. pr_debug("%s:cmd_state = %d\n", __func__,
  1069. atomic_read(&rtac_afe_apr_data.cmd_state));
  1070. if (atomic_read(&rtac_afe_apr_data.cmd_state) != 1)
  1071. return false;
  1072. if (payload_size == sizeof(uint32_t))
  1073. atomic_set(&rtac_common.apr_err_code, payload[0]);
  1074. else if (payload_size == (2*sizeof(uint32_t)))
  1075. atomic_set(&rtac_common.apr_err_code, payload[1]);
  1076. atomic_set(&rtac_afe_apr_data.cmd_state, 0);
  1077. wake_up(&rtac_afe_apr_data.cmd_wait);
  1078. return true;
  1079. }
  1080. static int fill_afe_apr_hdr(struct apr_hdr *apr_hdr, uint32_t port,
  1081. uint32_t opcode, uint32_t apr_msg_size)
  1082. {
  1083. if (apr_hdr == NULL) {
  1084. pr_err("%s: invalid APR pointer", __func__);
  1085. return -EINVAL;
  1086. }
  1087. apr_hdr->hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  1088. APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
  1089. apr_hdr->pkt_size = apr_msg_size;
  1090. apr_hdr->src_svc = APR_SVC_AFE;
  1091. apr_hdr->src_domain = APR_DOMAIN_APPS;
  1092. apr_hdr->src_port = 0;
  1093. apr_hdr->dest_svc = APR_SVC_AFE;
  1094. apr_hdr->dest_domain = APR_DOMAIN_ADSP;
  1095. apr_hdr->dest_port = 0;
  1096. apr_hdr->token = port;
  1097. apr_hdr->opcode = opcode;
  1098. return 0;
  1099. }
  1100. static int send_rtac_afe_apr(void __user *buf, uint32_t opcode)
  1101. {
  1102. int32_t result;
  1103. uint32_t bytes_returned = 0;
  1104. uint32_t payload_size = 0;
  1105. uint32_t port_index = 0;
  1106. uint32_t *afe_cmd = NULL;
  1107. uint32_t apr_msg_size = 0;
  1108. struct rtac_afe_user_data user_afe_buf;
  1109. struct mem_mapping_hdr *mem_hdr = NULL;
  1110. struct param_hdr_v1 *get_resp_v2;
  1111. struct param_hdr_v3 *get_resp_v3;
  1112. pr_debug("%s\n", __func__);
  1113. if (rtac_cal[AFE_RTAC_CAL].map_data.dma_buf == NULL) {
  1114. result = rtac_allocate_cal_buffer(AFE_RTAC_CAL);
  1115. if (result < 0) {
  1116. pr_err("%s: allocate buffer failed! ret = %d\n",
  1117. __func__, result);
  1118. goto done;
  1119. }
  1120. }
  1121. if (rtac_cal[AFE_RTAC_CAL].map_data.map_handle == 0) {
  1122. result = rtac_map_cal_buffer(AFE_RTAC_CAL);
  1123. if (result < 0) {
  1124. pr_err("%s: map buffer failed! ret = %d\n",
  1125. __func__, result);
  1126. goto done;
  1127. }
  1128. }
  1129. if (copy_from_user(&user_afe_buf, (void *)buf,
  1130. sizeof(struct rtac_afe_user_data))) {
  1131. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  1132. __func__, buf);
  1133. goto done;
  1134. }
  1135. if (user_afe_buf.buf_size <= 0) {
  1136. pr_err("%s: Invalid buffer size = %d\n",
  1137. __func__, user_afe_buf.buf_size);
  1138. goto done;
  1139. }
  1140. port_index = q6audio_get_port_index(user_afe_buf.port_id);
  1141. if (port_index >= AFE_MAX_PORTS) {
  1142. pr_err("%s: Invalid AFE port = 0x%x\n",
  1143. __func__, user_afe_buf.port_id);
  1144. goto done;
  1145. }
  1146. mutex_lock(&rtac_afe_apr_mutex);
  1147. if (rtac_afe_apr_data.apr_handle == NULL) {
  1148. pr_err("%s: APR not initialized\n", __func__);
  1149. result = -EINVAL;
  1150. goto err;
  1151. }
  1152. afe_cmd =
  1153. (u32 *) rtac_afe_buffer + sizeof(struct apr_hdr) / sizeof(u32);
  1154. switch (opcode) {
  1155. case AFE_PORT_CMD_SET_PARAM_V2:
  1156. apr_msg_size = sizeof(struct afe_port_cmd_set_param_v2);
  1157. payload_size = user_afe_buf.v2_set.payload_size;
  1158. if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) {
  1159. pr_err("%s: Invalid payload size = %d\n", __func__,
  1160. payload_size);
  1161. result = -EINVAL;
  1162. goto err;
  1163. }
  1164. /* Copy the command to the rtac buffer */
  1165. memcpy(afe_cmd, &user_afe_buf.v2_set,
  1166. sizeof(user_afe_buf.v2_set));
  1167. /* Copy the param data to the out-of-band location */
  1168. if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr,
  1169. (void __user *) buf +
  1170. offsetof(struct rtac_afe_user_data,
  1171. v2_set.param_hdr),
  1172. payload_size)) {
  1173. pr_err("%s: Could not copy payload from user buffer\n",
  1174. __func__);
  1175. result = -EFAULT;
  1176. goto err;
  1177. }
  1178. break;
  1179. case AFE_PORT_CMD_SET_PARAM_V3:
  1180. apr_msg_size = sizeof(struct afe_port_cmd_set_param_v3);
  1181. payload_size = user_afe_buf.v3_set.payload_size;
  1182. if (payload_size > rtac_cal[AFE_RTAC_CAL].map_data.map_size) {
  1183. pr_err("%s: Invalid payload size = %d\n", __func__,
  1184. payload_size);
  1185. result = -EINVAL;
  1186. goto err;
  1187. }
  1188. /* Copy the command to the rtac buffer */
  1189. memcpy(afe_cmd, &user_afe_buf.v3_set,
  1190. sizeof(user_afe_buf.v3_set));
  1191. /* Copy the param data to the out-of-band location */
  1192. if (copy_from_user(rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr,
  1193. (void __user *) buf +
  1194. offsetof(struct rtac_afe_user_data,
  1195. v3_set.param_hdr),
  1196. payload_size)) {
  1197. pr_err("%s: Could not copy payload from user buffer\n",
  1198. __func__);
  1199. result = -EFAULT;
  1200. goto err;
  1201. }
  1202. break;
  1203. case AFE_PORT_CMD_GET_PARAM_V2:
  1204. apr_msg_size = sizeof(struct afe_port_cmd_get_param_v2);
  1205. if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) {
  1206. pr_err("%s: Invalid payload size = %d\n", __func__,
  1207. user_afe_buf.cmd_size);
  1208. result = -EINVAL;
  1209. goto err;
  1210. }
  1211. /* Copy the command and param data in-band */
  1212. if (copy_from_user(afe_cmd,
  1213. (void __user *) buf +
  1214. offsetof(struct rtac_afe_user_data,
  1215. v2_get),
  1216. user_afe_buf.cmd_size)) {
  1217. pr_err("%s: Could not copy payload from user buffer\n",
  1218. __func__);
  1219. result = -EFAULT;
  1220. goto err;
  1221. }
  1222. break;
  1223. case AFE_PORT_CMD_GET_PARAM_V3:
  1224. apr_msg_size = sizeof(struct afe_port_cmd_get_param_v3);
  1225. if (user_afe_buf.cmd_size > MAX_PAYLOAD_SIZE) {
  1226. pr_err("%s: Invalid payload size = %d\n", __func__,
  1227. user_afe_buf.cmd_size);
  1228. result = -EINVAL;
  1229. goto err;
  1230. }
  1231. /* Copy the command and param data in-band */
  1232. if (copy_from_user(afe_cmd,
  1233. (void __user *) buf +
  1234. offsetof(struct rtac_afe_user_data,
  1235. v3_get),
  1236. user_afe_buf.cmd_size)) {
  1237. pr_err("%s: Could not copy payload from user buffer\n",
  1238. __func__);
  1239. result = -EFAULT;
  1240. goto err;
  1241. }
  1242. break;
  1243. default:
  1244. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  1245. result = -EINVAL;
  1246. goto err;
  1247. }
  1248. /*
  1249. * The memory header is in the same location in all commands. Therefore,
  1250. * it doesn't matter what command the buffer is cast into.
  1251. */
  1252. mem_hdr = &((struct afe_port_cmd_set_param_v3 *) rtac_afe_buffer)
  1253. ->mem_hdr;
  1254. mem_hdr->data_payload_addr_lsw =
  1255. lower_32_bits(rtac_cal[AFE_RTAC_CAL].cal_data.paddr);
  1256. mem_hdr->data_payload_addr_msw = msm_audio_populate_upper_32_bits(
  1257. rtac_cal[AFE_RTAC_CAL].cal_data.paddr);
  1258. mem_hdr->mem_map_handle = rtac_cal[AFE_RTAC_CAL].map_data.map_handle;
  1259. /* Fill the APR header at the end so we have the correct message size */
  1260. fill_afe_apr_hdr((struct apr_hdr *) rtac_afe_buffer,
  1261. port_index, opcode, apr_msg_size);
  1262. atomic_set(&rtac_afe_apr_data.cmd_state, 1);
  1263. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  1264. __func__, opcode,
  1265. &rtac_cal[AFE_RTAC_CAL].cal_data.paddr);
  1266. result = apr_send_pkt(rtac_afe_apr_data.apr_handle,
  1267. (uint32_t *)rtac_afe_buffer);
  1268. if (result < 0) {
  1269. pr_err("%s: Set params failed port = 0x%x, ret = %d\n",
  1270. __func__, user_afe_buf.port_id, result);
  1271. goto err;
  1272. }
  1273. /* Wait for the callback */
  1274. result = wait_event_timeout(rtac_afe_apr_data.cmd_wait,
  1275. (atomic_read(&rtac_afe_apr_data.cmd_state) == 0),
  1276. msecs_to_jiffies(TIMEOUT_MS));
  1277. if (!result) {
  1278. pr_err("%s: Set params timed out port = 0x%x, ret = %d\n",
  1279. __func__, user_afe_buf.port_id, result);
  1280. goto err;
  1281. }
  1282. if (atomic_read(&rtac_common.apr_err_code)) {
  1283. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  1284. __func__, adsp_err_get_err_str(atomic_read(
  1285. &rtac_common.apr_err_code)),
  1286. opcode);
  1287. result = adsp_err_get_lnx_err_code(
  1288. atomic_read(
  1289. &rtac_common.apr_err_code));
  1290. goto err;
  1291. }
  1292. if (opcode == AFE_PORT_CMD_GET_PARAM_V2) {
  1293. get_resp_v2 = (struct param_hdr_v1 *) rtac_cal[AFE_RTAC_CAL]
  1294. .cal_data.kvaddr;
  1295. bytes_returned =
  1296. get_resp_v2->param_size + sizeof(struct param_hdr_v1);
  1297. } else if (opcode == AFE_PORT_CMD_GET_PARAM_V3) {
  1298. get_resp_v3 = (struct param_hdr_v3 *) rtac_cal[AFE_RTAC_CAL]
  1299. .cal_data.kvaddr;
  1300. bytes_returned =
  1301. get_resp_v3->param_size + sizeof(struct param_hdr_v3);
  1302. } else {
  1303. bytes_returned = payload_size;
  1304. goto unlock;
  1305. }
  1306. if (bytes_returned > rtac_cal[AFE_RTAC_CAL].map_data.map_size) {
  1307. pr_err("%s: Invalid data size = %d\n", __func__,
  1308. bytes_returned);
  1309. result = -EINVAL;
  1310. goto err;
  1311. }
  1312. if (bytes_returned > user_afe_buf.buf_size) {
  1313. pr_err("%s: user size = 0x%x, returned size = 0x%x\n", __func__,
  1314. user_afe_buf.buf_size, bytes_returned);
  1315. result = -EINVAL;
  1316. goto err;
  1317. }
  1318. if (copy_to_user((void __user *) buf,
  1319. rtac_cal[AFE_RTAC_CAL].cal_data.kvaddr,
  1320. bytes_returned)) {
  1321. pr_err("%s: Could not copy buffer to user,size = %d\n",
  1322. __func__, bytes_returned);
  1323. result = -EFAULT;
  1324. goto err;
  1325. }
  1326. unlock:
  1327. mutex_unlock(&rtac_afe_apr_mutex);
  1328. done:
  1329. return bytes_returned;
  1330. err:
  1331. mutex_unlock(&rtac_afe_apr_mutex);
  1332. return result;
  1333. }
  1334. /* Voice APR */
  1335. void rtac_set_voice_handle(u32 mode, void *handle)
  1336. {
  1337. pr_debug("%s\n", __func__);
  1338. mutex_lock(&rtac_voice_apr_mutex);
  1339. rtac_voice_apr_data[mode].apr_handle = handle;
  1340. mutex_unlock(&rtac_voice_apr_mutex);
  1341. }
  1342. bool rtac_make_voice_callback(u32 mode, uint32_t *payload, u32 payload_size)
  1343. {
  1344. if ((atomic_read(&rtac_voice_apr_data[mode].cmd_state) != 1) ||
  1345. (mode >= RTAC_VOICE_MODES))
  1346. return false;
  1347. pr_debug("%s\n", __func__);
  1348. if (payload_size == sizeof(uint32_t))
  1349. atomic_set(&rtac_common.apr_err_code, payload[0]);
  1350. else if (payload_size == (2*sizeof(uint32_t)))
  1351. atomic_set(&rtac_common.apr_err_code, payload[1]);
  1352. atomic_set(&rtac_voice_apr_data[mode].cmd_state, 0);
  1353. wake_up(&rtac_voice_apr_data[mode].cmd_wait);
  1354. return true;
  1355. }
  1356. int send_voice_apr(u32 mode, void *buf, u32 opcode)
  1357. {
  1358. s32 result;
  1359. u32 user_buf_size = 0;
  1360. u32 bytes_returned = 0;
  1361. u32 payload_size;
  1362. u32 dest_port;
  1363. u32 data_size = 0;
  1364. struct apr_hdr voice_params;
  1365. pr_debug("%s\n", __func__);
  1366. if (rtac_cal[VOICE_RTAC_CAL].map_data.dma_buf == NULL) {
  1367. result = rtac_allocate_cal_buffer(VOICE_RTAC_CAL);
  1368. if (result < 0) {
  1369. pr_err("%s: allocate buffer failed!",
  1370. __func__);
  1371. goto done;
  1372. }
  1373. }
  1374. if (rtac_cal[VOICE_RTAC_CAL].map_data.map_handle == 0) {
  1375. result = rtac_map_cal_buffer(VOICE_RTAC_CAL);
  1376. if (result < 0) {
  1377. pr_err("%s: map buffer failed!",
  1378. __func__);
  1379. goto done;
  1380. }
  1381. }
  1382. if (copy_from_user(&user_buf_size, (void *)buf,
  1383. sizeof(user_buf_size))) {
  1384. pr_err("%s: Copy from user failed! buf = 0x%pK\n",
  1385. __func__, buf);
  1386. goto done;
  1387. }
  1388. if (user_buf_size <= 0) {
  1389. pr_err("%s: Invalid buffer size = %d\n",
  1390. __func__, user_buf_size);
  1391. goto done;
  1392. }
  1393. if (copy_from_user(&payload_size, buf + sizeof(u32), sizeof(u32))) {
  1394. pr_err("%s: Could not copy payload size from user buffer\n",
  1395. __func__);
  1396. goto done;
  1397. }
  1398. if (copy_from_user(&dest_port, buf + 2 * sizeof(u32), sizeof(u32))) {
  1399. pr_err("%s: Could not copy port id from user buffer\n",
  1400. __func__);
  1401. goto done;
  1402. }
  1403. if ((mode != RTAC_CVP) && (mode != RTAC_CVS)) {
  1404. pr_err("%s: Invalid Mode for APR, mode = %d\n",
  1405. __func__, mode);
  1406. goto done;
  1407. }
  1408. mutex_lock(&rtac_voice_apr_mutex);
  1409. if (rtac_voice_apr_data[mode].apr_handle == NULL) {
  1410. pr_err("%s: APR not initialized\n", __func__);
  1411. result = -EINVAL;
  1412. goto err;
  1413. }
  1414. switch (opcode) {
  1415. case VSS_ICOMMON_CMD_SET_PARAM_V2:
  1416. case VSS_ICOMMON_CMD_SET_PARAM_V3:
  1417. /* set payload size to in-band payload */
  1418. /* set data size to actual out of band payload size */
  1419. data_size = payload_size - 4 * sizeof(u32);
  1420. if (data_size > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) {
  1421. pr_err("%s: Invalid data size = %d\n",
  1422. __func__, data_size);
  1423. result = -EINVAL;
  1424. goto err;
  1425. }
  1426. payload_size = 4 * sizeof(u32);
  1427. /* Copy buffer to out-of-band payload */
  1428. if (copy_from_user((void *)
  1429. rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr,
  1430. buf + 7 * sizeof(u32), data_size)) {
  1431. pr_err("%s: Could not copy payload from user buffer\n",
  1432. __func__);
  1433. result = -EFAULT;
  1434. goto err;
  1435. }
  1436. /* set payload size in packet */
  1437. rtac_voice_buffer[8] = data_size;
  1438. /* set token for set param case */
  1439. voice_params.token = VOC_RTAC_SET_PARAM_TOKEN;
  1440. break;
  1441. case VSS_ICOMMON_CMD_GET_PARAM_V2:
  1442. case VSS_ICOMMON_CMD_GET_PARAM_V3:
  1443. if (payload_size > MAX_PAYLOAD_SIZE) {
  1444. pr_err("%s: Invalid payload size = %d\n",
  1445. __func__, payload_size);
  1446. result = -EINVAL;
  1447. goto err;
  1448. }
  1449. /* Copy buffer to in-band payload */
  1450. if (copy_from_user(rtac_voice_buffer +
  1451. sizeof(voice_params)/sizeof(u32),
  1452. buf + 3 * sizeof(u32), payload_size)) {
  1453. pr_err("%s: Could not copy payload from user buffer\n",
  1454. __func__);
  1455. result = -EFAULT;
  1456. goto err;
  1457. }
  1458. /* set token for get param case */
  1459. voice_params.token = 0;
  1460. break;
  1461. default:
  1462. pr_err("%s: Invalid opcode %d\n", __func__, opcode);
  1463. result = -EINVAL;
  1464. goto err;
  1465. }
  1466. /* Pack header */
  1467. voice_params.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
  1468. APR_HDR_LEN(20), APR_PKT_VER);
  1469. voice_params.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
  1470. payload_size);
  1471. voice_params.src_svc = 0;
  1472. voice_params.src_domain = APR_DOMAIN_APPS;
  1473. voice_params.src_port = get_voice_index(mode, dest_port);
  1474. voice_params.dest_svc = 0;
  1475. voice_params.dest_domain = APR_DOMAIN_MODEM;
  1476. voice_params.dest_port = (u16)dest_port;
  1477. voice_params.opcode = opcode;
  1478. /* fill for out-of-band */
  1479. rtac_voice_buffer[5] = rtac_cal[VOICE_RTAC_CAL].map_data.map_handle;
  1480. rtac_voice_buffer[6] =
  1481. lower_32_bits(rtac_cal[VOICE_RTAC_CAL].cal_data.paddr);
  1482. rtac_voice_buffer[7] = msm_audio_populate_upper_32_bits(
  1483. rtac_cal[VOICE_RTAC_CAL].cal_data.paddr);
  1484. memcpy(rtac_voice_buffer, &voice_params, sizeof(voice_params));
  1485. atomic_set(&rtac_voice_apr_data[mode].cmd_state, 1);
  1486. pr_debug("%s: Sending RTAC command ioctl 0x%x, paddr 0x%pK\n",
  1487. __func__, opcode,
  1488. &rtac_cal[VOICE_RTAC_CAL].cal_data.paddr);
  1489. result = apr_send_pkt(rtac_voice_apr_data[mode].apr_handle,
  1490. (uint32_t *)rtac_voice_buffer);
  1491. if (result < 0) {
  1492. pr_err("%s: apr_send_pkt failed opcode = %x\n",
  1493. __func__, opcode);
  1494. goto err;
  1495. }
  1496. /* Wait for the callback */
  1497. result = wait_event_timeout(rtac_voice_apr_data[mode].cmd_wait,
  1498. (atomic_read(&rtac_voice_apr_data[mode].cmd_state) == 0),
  1499. msecs_to_jiffies(TIMEOUT_MS));
  1500. if (!result) {
  1501. pr_err("%s: apr_send_pkt timed out opcode = %x\n",
  1502. __func__, opcode);
  1503. goto err;
  1504. }
  1505. if (atomic_read(&rtac_common.apr_err_code)) {
  1506. pr_err("%s: DSP returned error code = [%s], opcode = 0x%x\n",
  1507. __func__, adsp_err_get_err_str(atomic_read(
  1508. &rtac_common.apr_err_code)),
  1509. opcode);
  1510. result = adsp_err_get_lnx_err_code(
  1511. atomic_read(
  1512. &rtac_common.apr_err_code));
  1513. goto err;
  1514. }
  1515. if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V2) {
  1516. bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data.
  1517. kvaddr)[2] + 3 * sizeof(u32);
  1518. } else if (opcode == VSS_ICOMMON_CMD_GET_PARAM_V3) {
  1519. bytes_returned =
  1520. ((u32 *) rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr)[3] +
  1521. 4 * sizeof(u32);
  1522. } else {
  1523. bytes_returned = data_size;
  1524. goto unlock;
  1525. }
  1526. if (bytes_returned > rtac_cal[VOICE_RTAC_CAL].map_data.map_size) {
  1527. pr_err("%s: Invalid data size = %d\n", __func__,
  1528. bytes_returned);
  1529. result = -EINVAL;
  1530. goto err;
  1531. }
  1532. if (bytes_returned > user_buf_size) {
  1533. pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n",
  1534. __func__, user_buf_size, bytes_returned);
  1535. result = -EINVAL;
  1536. goto err;
  1537. }
  1538. if (copy_to_user((void __user *) buf,
  1539. rtac_cal[VOICE_RTAC_CAL].cal_data.kvaddr,
  1540. bytes_returned)) {
  1541. pr_err("%s: Could not copy buffer to user, size = %d\n",
  1542. __func__, bytes_returned);
  1543. result = -EFAULT;
  1544. goto err;
  1545. }
  1546. unlock:
  1547. mutex_unlock(&rtac_voice_apr_mutex);
  1548. done:
  1549. return bytes_returned;
  1550. err:
  1551. mutex_unlock(&rtac_voice_apr_mutex);
  1552. return result;
  1553. }
  1554. void get_rtac_adm_data(struct rtac_adm *adm_data)
  1555. {
  1556. mutex_lock(&rtac_adm_mutex);
  1557. memcpy(adm_data, &rtac_adm_data, sizeof(struct rtac_adm));
  1558. mutex_unlock(&rtac_adm_mutex);
  1559. }
  1560. static long rtac_ioctl_shared(struct file *f,
  1561. unsigned int cmd, void *arg)
  1562. {
  1563. u32 opcode;
  1564. int result = 0;
  1565. if (!arg) {
  1566. pr_err("%s: No data sent to driver!\n", __func__);
  1567. result = -EFAULT;
  1568. goto done;
  1569. }
  1570. switch (cmd) {
  1571. case AUDIO_GET_RTAC_ADM_INFO: {
  1572. mutex_lock(&rtac_adm_mutex);
  1573. if (copy_to_user((void *)arg, &rtac_adm_data,
  1574. sizeof(rtac_adm_data))) {
  1575. pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_ADM_INFO\n",
  1576. __func__);
  1577. mutex_unlock(&rtac_adm_mutex);
  1578. return -EFAULT;
  1579. }
  1580. result = sizeof(rtac_adm_data);
  1581. mutex_unlock(&rtac_adm_mutex);
  1582. break;
  1583. }
  1584. case AUDIO_GET_RTAC_VOICE_INFO: {
  1585. mutex_lock(&rtac_voice_mutex);
  1586. if (copy_to_user((void *)arg, &rtac_voice_data,
  1587. sizeof(rtac_voice_data))) {
  1588. pr_err("%s: copy_to_user failed for AUDIO_GET_RTAC_VOICE_INFO\n",
  1589. __func__);
  1590. mutex_unlock(&rtac_voice_mutex);
  1591. return -EFAULT;
  1592. }
  1593. result = sizeof(rtac_voice_data);
  1594. mutex_unlock(&rtac_voice_mutex);
  1595. break;
  1596. }
  1597. case AUDIO_GET_RTAC_ADM_CAL:
  1598. opcode = q6common_is_instance_id_supported() ?
  1599. ADM_CMD_GET_PP_PARAMS_V6 :
  1600. ADM_CMD_GET_PP_PARAMS_V5;
  1601. result = send_adm_apr((void *) arg, opcode);
  1602. break;
  1603. case AUDIO_SET_RTAC_ADM_CAL:
  1604. opcode = q6common_is_instance_id_supported() ?
  1605. ADM_CMD_SET_PP_PARAMS_V6 :
  1606. ADM_CMD_SET_PP_PARAMS_V5;
  1607. result = send_adm_apr((void *) arg, opcode);
  1608. break;
  1609. case AUDIO_GET_RTAC_ASM_CAL:
  1610. opcode = q6common_is_instance_id_supported() ?
  1611. ASM_STREAM_CMD_GET_PP_PARAMS_V3 :
  1612. ASM_STREAM_CMD_GET_PP_PARAMS_V2;
  1613. result = send_rtac_asm_apr((void *) arg, opcode);
  1614. break;
  1615. case AUDIO_SET_RTAC_ASM_CAL:
  1616. opcode = q6common_is_instance_id_supported() ?
  1617. ASM_STREAM_CMD_SET_PP_PARAMS_V3 :
  1618. ASM_STREAM_CMD_SET_PP_PARAMS_V2;
  1619. result = send_rtac_asm_apr((void *) arg, opcode);
  1620. break;
  1621. case AUDIO_GET_RTAC_CVS_CAL:
  1622. opcode = q6common_is_instance_id_supported() ?
  1623. VSS_ICOMMON_CMD_GET_PARAM_V3 :
  1624. VSS_ICOMMON_CMD_GET_PARAM_V2;
  1625. result = send_voice_apr(RTAC_CVS, (void *) arg, opcode);
  1626. break;
  1627. case AUDIO_SET_RTAC_CVS_CAL:
  1628. opcode = q6common_is_instance_id_supported() ?
  1629. VSS_ICOMMON_CMD_SET_PARAM_V3 :
  1630. VSS_ICOMMON_CMD_SET_PARAM_V2;
  1631. result = send_voice_apr(RTAC_CVS, (void *) arg, opcode);
  1632. break;
  1633. case AUDIO_GET_RTAC_CVP_CAL:
  1634. opcode = q6common_is_instance_id_supported() ?
  1635. VSS_ICOMMON_CMD_GET_PARAM_V3 :
  1636. VSS_ICOMMON_CMD_GET_PARAM_V2;
  1637. result = send_voice_apr(RTAC_CVP, (void *) arg, opcode);
  1638. break;
  1639. case AUDIO_SET_RTAC_CVP_CAL:
  1640. opcode = q6common_is_instance_id_supported() ?
  1641. VSS_ICOMMON_CMD_SET_PARAM_V3 :
  1642. VSS_ICOMMON_CMD_SET_PARAM_V2;
  1643. result = send_voice_apr(RTAC_CVP, (void *) arg, opcode);
  1644. break;
  1645. case AUDIO_GET_RTAC_AFE_CAL:
  1646. opcode = q6common_is_instance_id_supported() ?
  1647. AFE_PORT_CMD_GET_PARAM_V3 :
  1648. AFE_PORT_CMD_GET_PARAM_V2;
  1649. result = send_rtac_afe_apr((void __user *) arg, opcode);
  1650. break;
  1651. case AUDIO_SET_RTAC_AFE_CAL:
  1652. opcode = q6common_is_instance_id_supported() ?
  1653. AFE_PORT_CMD_SET_PARAM_V3 :
  1654. AFE_PORT_CMD_SET_PARAM_V2;
  1655. result = send_rtac_afe_apr((void __user *) arg, opcode);
  1656. break;
  1657. default:
  1658. pr_err("%s: Invalid IOCTL, command = %d!\n",
  1659. __func__, cmd);
  1660. result = -EINVAL;
  1661. }
  1662. done:
  1663. return result;
  1664. }
  1665. static long rtac_ioctl(struct file *f,
  1666. unsigned int cmd, unsigned long arg)
  1667. {
  1668. int result = 0;
  1669. mutex_lock(&rtac_common.rtac_fops_mutex);
  1670. if (!arg) {
  1671. pr_err("%s: No data sent to driver!\n", __func__);
  1672. result = -EFAULT;
  1673. } else {
  1674. result = rtac_ioctl_shared(f, cmd, (void __user *)arg);
  1675. }
  1676. mutex_unlock(&rtac_common.rtac_fops_mutex);
  1677. return result;
  1678. }
  1679. #ifdef CONFIG_COMPAT
  1680. #define AUDIO_GET_RTAC_ADM_INFO_32 _IOR(CAL_IOCTL_MAGIC, 207, compat_uptr_t)
  1681. #define AUDIO_GET_RTAC_VOICE_INFO_32 _IOR(CAL_IOCTL_MAGIC, 208, compat_uptr_t)
  1682. #define AUDIO_GET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 209, compat_uptr_t)
  1683. #define AUDIO_SET_RTAC_ADM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 210, compat_uptr_t)
  1684. #define AUDIO_GET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 211, compat_uptr_t)
  1685. #define AUDIO_SET_RTAC_ASM_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 212, compat_uptr_t)
  1686. #define AUDIO_GET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 213, compat_uptr_t)
  1687. #define AUDIO_SET_RTAC_CVS_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 214, compat_uptr_t)
  1688. #define AUDIO_GET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 215, compat_uptr_t)
  1689. #define AUDIO_SET_RTAC_CVP_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 216, compat_uptr_t)
  1690. #define AUDIO_GET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 217, compat_uptr_t)
  1691. #define AUDIO_SET_RTAC_AFE_CAL_32 _IOWR(CAL_IOCTL_MAGIC, 218, compat_uptr_t)
  1692. static long rtac_compat_ioctl(struct file *f,
  1693. unsigned int cmd, unsigned long arg)
  1694. {
  1695. int result = 0;
  1696. mutex_lock(&rtac_common.rtac_fops_mutex);
  1697. if (!arg) {
  1698. pr_err("%s: No data sent to driver!\n", __func__);
  1699. result = -EINVAL;
  1700. goto done;
  1701. }
  1702. switch (cmd) {
  1703. case AUDIO_GET_RTAC_ADM_INFO_32:
  1704. cmd = AUDIO_GET_RTAC_ADM_INFO;
  1705. goto process;
  1706. case AUDIO_GET_RTAC_VOICE_INFO_32:
  1707. cmd = AUDIO_GET_RTAC_VOICE_INFO;
  1708. goto process;
  1709. case AUDIO_GET_RTAC_AFE_CAL_32:
  1710. cmd = AUDIO_GET_RTAC_AFE_CAL;
  1711. goto process;
  1712. case AUDIO_SET_RTAC_AFE_CAL_32:
  1713. cmd = AUDIO_SET_RTAC_AFE_CAL;
  1714. goto process;
  1715. case AUDIO_GET_RTAC_ADM_CAL_32:
  1716. cmd = AUDIO_GET_RTAC_ADM_CAL;
  1717. goto process;
  1718. case AUDIO_SET_RTAC_ADM_CAL_32:
  1719. cmd = AUDIO_SET_RTAC_ADM_CAL;
  1720. goto process;
  1721. case AUDIO_GET_RTAC_ASM_CAL_32:
  1722. cmd = AUDIO_GET_RTAC_ASM_CAL;
  1723. goto process;
  1724. case AUDIO_SET_RTAC_ASM_CAL_32:
  1725. cmd = AUDIO_SET_RTAC_ASM_CAL;
  1726. goto process;
  1727. case AUDIO_GET_RTAC_CVS_CAL_32:
  1728. cmd = AUDIO_GET_RTAC_CVS_CAL;
  1729. goto process;
  1730. case AUDIO_SET_RTAC_CVS_CAL_32:
  1731. cmd = AUDIO_SET_RTAC_CVS_CAL;
  1732. goto process;
  1733. case AUDIO_GET_RTAC_CVP_CAL_32:
  1734. cmd = AUDIO_GET_RTAC_CVP_CAL;
  1735. goto process;
  1736. case AUDIO_SET_RTAC_CVP_CAL_32:
  1737. cmd = AUDIO_SET_RTAC_CVP_CAL;
  1738. process:
  1739. result = rtac_ioctl_shared(f, cmd, compat_ptr(arg));
  1740. break;
  1741. default:
  1742. result = -EINVAL;
  1743. pr_err("%s: Invalid IOCTL, command = %d!\n",
  1744. __func__, cmd);
  1745. break;
  1746. }
  1747. done:
  1748. mutex_unlock(&rtac_common.rtac_fops_mutex);
  1749. return result;
  1750. }
  1751. #else
  1752. #define rtac_compat_ioctl NULL
  1753. #endif
  1754. static const struct file_operations rtac_fops = {
  1755. .owner = THIS_MODULE,
  1756. .open = rtac_open,
  1757. .release = rtac_release,
  1758. .unlocked_ioctl = rtac_ioctl,
  1759. .compat_ioctl = rtac_compat_ioctl,
  1760. };
  1761. struct miscdevice rtac_misc = {
  1762. .minor = MISC_DYNAMIC_MINOR,
  1763. .name = "msm_rtac",
  1764. .fops = &rtac_fops,
  1765. };
  1766. int __init rtac_init(void)
  1767. {
  1768. int i = 0;
  1769. /* Driver */
  1770. atomic_set(&rtac_common.usage_count, 0);
  1771. atomic_set(&rtac_common.apr_err_code, 0);
  1772. mutex_init(&rtac_common.rtac_fops_mutex);
  1773. /* ADM */
  1774. memset(&rtac_adm_data, 0, sizeof(rtac_adm_data));
  1775. rtac_adm_apr_data.apr_handle = NULL;
  1776. atomic_set(&rtac_adm_apr_data.cmd_state, 0);
  1777. init_waitqueue_head(&rtac_adm_apr_data.cmd_wait);
  1778. mutex_init(&rtac_adm_mutex);
  1779. mutex_init(&rtac_adm_apr_mutex);
  1780. rtac_adm_buffer = kzalloc(
  1781. rtac_cal[ADM_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1782. if (rtac_adm_buffer == NULL)
  1783. goto nomem;
  1784. /* ASM */
  1785. for (i = 0; i < ASM_ACTIVE_STREAMS_ALLOWED+1; i++) {
  1786. rtac_asm_apr_data[i].apr_handle = NULL;
  1787. atomic_set(&rtac_asm_apr_data[i].cmd_state, 0);
  1788. init_waitqueue_head(&rtac_asm_apr_data[i].cmd_wait);
  1789. }
  1790. mutex_init(&rtac_asm_apr_mutex);
  1791. rtac_asm_buffer = kzalloc(
  1792. rtac_cal[ASM_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1793. if (rtac_asm_buffer == NULL) {
  1794. kzfree(rtac_adm_buffer);
  1795. goto nomem;
  1796. }
  1797. /* AFE */
  1798. rtac_afe_apr_data.apr_handle = NULL;
  1799. atomic_set(&rtac_afe_apr_data.cmd_state, 0);
  1800. init_waitqueue_head(&rtac_afe_apr_data.cmd_wait);
  1801. mutex_init(&rtac_afe_apr_mutex);
  1802. rtac_afe_buffer = kzalloc(
  1803. rtac_cal[AFE_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1804. if (rtac_afe_buffer == NULL) {
  1805. kzfree(rtac_adm_buffer);
  1806. kzfree(rtac_asm_buffer);
  1807. goto nomem;
  1808. }
  1809. /* Voice */
  1810. memset(&rtac_voice_data, 0, sizeof(rtac_voice_data));
  1811. for (i = 0; i < RTAC_VOICE_MODES; i++) {
  1812. rtac_voice_apr_data[i].apr_handle = NULL;
  1813. atomic_set(&rtac_voice_apr_data[i].cmd_state, 0);
  1814. init_waitqueue_head(&rtac_voice_apr_data[i].cmd_wait);
  1815. }
  1816. mutex_init(&rtac_voice_mutex);
  1817. mutex_init(&rtac_voice_apr_mutex);
  1818. rtac_voice_buffer = kzalloc(
  1819. rtac_cal[VOICE_RTAC_CAL].map_data.map_size, GFP_KERNEL);
  1820. if (rtac_voice_buffer == NULL) {
  1821. kzfree(rtac_adm_buffer);
  1822. kzfree(rtac_asm_buffer);
  1823. kzfree(rtac_afe_buffer);
  1824. goto nomem;
  1825. }
  1826. if (misc_register(&rtac_misc) != 0) {
  1827. kzfree(rtac_adm_buffer);
  1828. kzfree(rtac_asm_buffer);
  1829. kzfree(rtac_afe_buffer);
  1830. kzfree(rtac_voice_buffer);
  1831. goto nomem;
  1832. }
  1833. return 0;
  1834. nomem:
  1835. return -ENOMEM;
  1836. }
  1837. void rtac_exit(void)
  1838. {
  1839. misc_deregister(&rtac_misc);
  1840. kzfree(rtac_adm_buffer);
  1841. kzfree(rtac_asm_buffer);
  1842. kzfree(rtac_afe_buffer);
  1843. kzfree(rtac_voice_buffer);
  1844. }
  1845. MODULE_DESCRIPTION("SoC QDSP6v2 Real-Time Audio Calibration driver");
  1846. MODULE_LICENSE("GPL v2");