rtac.c 55 KB

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