hda-dsp.c 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631
  1. // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
  2. //
  3. // This file is provided under a dual BSD/GPLv2 license. When using or
  4. // redistributing this file, you may do so under either license.
  5. //
  6. // Copyright(c) 2018 Intel Corporation
  7. //
  8. // Authors: Liam Girdwood <liam.r.girdwood@linux.intel.com>
  9. // Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
  10. // Rander Wang <rander.wang@intel.com>
  11. // Keyon Jie <yang.jie@linux.intel.com>
  12. //
  13. /*
  14. * Hardware interface for generic Intel audio DSP HDA IP
  15. */
  16. #include <linux/module.h>
  17. #include <sound/hdaudio_ext.h>
  18. #include <sound/hda_register.h>
  19. #include <sound/hda-mlink.h>
  20. #include <trace/events/sof_intel.h>
  21. #include <sound/sof/xtensa.h>
  22. #include "../sof-audio.h"
  23. #include "../ops.h"
  24. #include "hda.h"
  25. #include "mtl.h"
  26. #include "hda-ipc.h"
  27. #define EXCEPT_MAX_HDR_SIZE 0x400
  28. #define HDA_EXT_ROM_STATUS_SIZE 8
  29. struct hda_dsp_msg_code {
  30. u32 code;
  31. const char *text;
  32. };
  33. static bool hda_enable_trace_D0I3_S0;
  34. #if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG)
  35. module_param_named(enable_trace_D0I3_S0, hda_enable_trace_D0I3_S0, bool, 0444);
  36. MODULE_PARM_DESC(enable_trace_D0I3_S0,
  37. "SOF HDA enable trace when the DSP is in D0I3 in S0");
  38. #endif
  39. static void hda_get_interfaces(struct snd_sof_dev *sdev, u32 *interface_mask)
  40. {
  41. const struct sof_intel_dsp_desc *chip;
  42. chip = get_chip_info(sdev->pdata);
  43. switch (chip->hw_ip_version) {
  44. case SOF_INTEL_TANGIER:
  45. case SOF_INTEL_BAYTRAIL:
  46. case SOF_INTEL_BROADWELL:
  47. interface_mask[SOF_DAI_DSP_ACCESS] = BIT(SOF_DAI_INTEL_SSP);
  48. break;
  49. case SOF_INTEL_CAVS_1_5:
  50. case SOF_INTEL_CAVS_1_5_PLUS:
  51. interface_mask[SOF_DAI_DSP_ACCESS] =
  52. BIT(SOF_DAI_INTEL_SSP) | BIT(SOF_DAI_INTEL_DMIC) | BIT(SOF_DAI_INTEL_HDA);
  53. interface_mask[SOF_DAI_HOST_ACCESS] = BIT(SOF_DAI_INTEL_HDA);
  54. break;
  55. case SOF_INTEL_CAVS_1_8:
  56. case SOF_INTEL_CAVS_2_0:
  57. case SOF_INTEL_CAVS_2_5:
  58. case SOF_INTEL_ACE_1_0:
  59. interface_mask[SOF_DAI_DSP_ACCESS] =
  60. BIT(SOF_DAI_INTEL_SSP) | BIT(SOF_DAI_INTEL_DMIC) |
  61. BIT(SOF_DAI_INTEL_HDA) | BIT(SOF_DAI_INTEL_ALH);
  62. interface_mask[SOF_DAI_HOST_ACCESS] = BIT(SOF_DAI_INTEL_HDA);
  63. break;
  64. case SOF_INTEL_ACE_2_0:
  65. case SOF_INTEL_ACE_3_0:
  66. interface_mask[SOF_DAI_DSP_ACCESS] =
  67. BIT(SOF_DAI_INTEL_SSP) | BIT(SOF_DAI_INTEL_DMIC) |
  68. BIT(SOF_DAI_INTEL_HDA) | BIT(SOF_DAI_INTEL_ALH);
  69. /* all interfaces accessible without DSP */
  70. interface_mask[SOF_DAI_HOST_ACCESS] =
  71. interface_mask[SOF_DAI_DSP_ACCESS];
  72. break;
  73. default:
  74. break;
  75. }
  76. }
  77. u32 hda_get_interface_mask(struct snd_sof_dev *sdev)
  78. {
  79. u32 interface_mask[SOF_DAI_ACCESS_NUM] = { 0 };
  80. hda_get_interfaces(sdev, interface_mask);
  81. return interface_mask[sdev->dspless_mode_selected];
  82. }
  83. EXPORT_SYMBOL_NS(hda_get_interface_mask, SND_SOC_SOF_INTEL_HDA_COMMON);
  84. bool hda_is_chain_dma_supported(struct snd_sof_dev *sdev, u32 dai_type)
  85. {
  86. u32 interface_mask[SOF_DAI_ACCESS_NUM] = { 0 };
  87. const struct sof_intel_dsp_desc *chip;
  88. if (sdev->dspless_mode_selected)
  89. return false;
  90. hda_get_interfaces(sdev, interface_mask);
  91. if (!(interface_mask[SOF_DAI_DSP_ACCESS] & BIT(dai_type)))
  92. return false;
  93. if (dai_type == SOF_DAI_INTEL_HDA)
  94. return true;
  95. switch (dai_type) {
  96. case SOF_DAI_INTEL_SSP:
  97. case SOF_DAI_INTEL_DMIC:
  98. case SOF_DAI_INTEL_ALH:
  99. chip = get_chip_info(sdev->pdata);
  100. if (chip->hw_ip_version < SOF_INTEL_ACE_2_0)
  101. return false;
  102. return true;
  103. default:
  104. return false;
  105. }
  106. }
  107. EXPORT_SYMBOL_NS(hda_is_chain_dma_supported, SND_SOC_SOF_INTEL_HDA_COMMON);
  108. /*
  109. * DSP Core control.
  110. */
  111. static int hda_dsp_core_reset_enter(struct snd_sof_dev *sdev, unsigned int core_mask)
  112. {
  113. u32 adspcs;
  114. u32 reset;
  115. int ret;
  116. /* set reset bits for cores */
  117. reset = HDA_DSP_ADSPCS_CRST_MASK(core_mask);
  118. snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
  119. HDA_DSP_REG_ADSPCS,
  120. reset, reset);
  121. /* poll with timeout to check if operation successful */
  122. ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
  123. HDA_DSP_REG_ADSPCS, adspcs,
  124. ((adspcs & reset) == reset),
  125. HDA_DSP_REG_POLL_INTERVAL_US,
  126. HDA_DSP_RESET_TIMEOUT_US);
  127. if (ret < 0) {
  128. dev_err(sdev->dev,
  129. "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
  130. __func__);
  131. return ret;
  132. }
  133. /* has core entered reset ? */
  134. adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
  135. HDA_DSP_REG_ADSPCS);
  136. if ((adspcs & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) !=
  137. HDA_DSP_ADSPCS_CRST_MASK(core_mask)) {
  138. dev_err(sdev->dev,
  139. "error: reset enter failed: core_mask %x adspcs 0x%x\n",
  140. core_mask, adspcs);
  141. ret = -EIO;
  142. }
  143. return ret;
  144. }
  145. static int hda_dsp_core_reset_leave(struct snd_sof_dev *sdev, unsigned int core_mask)
  146. {
  147. unsigned int crst;
  148. u32 adspcs;
  149. int ret;
  150. /* clear reset bits for cores */
  151. snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
  152. HDA_DSP_REG_ADSPCS,
  153. HDA_DSP_ADSPCS_CRST_MASK(core_mask),
  154. 0);
  155. /* poll with timeout to check if operation successful */
  156. crst = HDA_DSP_ADSPCS_CRST_MASK(core_mask);
  157. ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
  158. HDA_DSP_REG_ADSPCS, adspcs,
  159. !(adspcs & crst),
  160. HDA_DSP_REG_POLL_INTERVAL_US,
  161. HDA_DSP_RESET_TIMEOUT_US);
  162. if (ret < 0) {
  163. dev_err(sdev->dev,
  164. "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
  165. __func__);
  166. return ret;
  167. }
  168. /* has core left reset ? */
  169. adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
  170. HDA_DSP_REG_ADSPCS);
  171. if ((adspcs & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) != 0) {
  172. dev_err(sdev->dev,
  173. "error: reset leave failed: core_mask %x adspcs 0x%x\n",
  174. core_mask, adspcs);
  175. ret = -EIO;
  176. }
  177. return ret;
  178. }
  179. int hda_dsp_core_stall_reset(struct snd_sof_dev *sdev, unsigned int core_mask)
  180. {
  181. /* stall core */
  182. snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
  183. HDA_DSP_REG_ADSPCS,
  184. HDA_DSP_ADSPCS_CSTALL_MASK(core_mask),
  185. HDA_DSP_ADSPCS_CSTALL_MASK(core_mask));
  186. /* set reset state */
  187. return hda_dsp_core_reset_enter(sdev, core_mask);
  188. }
  189. EXPORT_SYMBOL_NS(hda_dsp_core_stall_reset, SND_SOC_SOF_INTEL_HDA_COMMON);
  190. bool hda_dsp_core_is_enabled(struct snd_sof_dev *sdev, unsigned int core_mask)
  191. {
  192. int val;
  193. bool is_enable;
  194. val = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPCS);
  195. #define MASK_IS_EQUAL(v, m, field) ({ \
  196. u32 _m = field(m); \
  197. ((v) & _m) == _m; \
  198. })
  199. is_enable = MASK_IS_EQUAL(val, core_mask, HDA_DSP_ADSPCS_CPA_MASK) &&
  200. MASK_IS_EQUAL(val, core_mask, HDA_DSP_ADSPCS_SPA_MASK) &&
  201. !(val & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) &&
  202. !(val & HDA_DSP_ADSPCS_CSTALL_MASK(core_mask));
  203. #undef MASK_IS_EQUAL
  204. dev_dbg(sdev->dev, "DSP core(s) enabled? %d : core_mask %x\n",
  205. is_enable, core_mask);
  206. return is_enable;
  207. }
  208. EXPORT_SYMBOL_NS(hda_dsp_core_is_enabled, SND_SOC_SOF_INTEL_HDA_COMMON);
  209. int hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask)
  210. {
  211. int ret;
  212. /* leave reset state */
  213. ret = hda_dsp_core_reset_leave(sdev, core_mask);
  214. if (ret < 0)
  215. return ret;
  216. /* run core */
  217. dev_dbg(sdev->dev, "unstall/run core: core_mask = %x\n", core_mask);
  218. snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
  219. HDA_DSP_REG_ADSPCS,
  220. HDA_DSP_ADSPCS_CSTALL_MASK(core_mask),
  221. 0);
  222. /* is core now running ? */
  223. if (!hda_dsp_core_is_enabled(sdev, core_mask)) {
  224. hda_dsp_core_stall_reset(sdev, core_mask);
  225. dev_err(sdev->dev, "error: DSP start core failed: core_mask %x\n",
  226. core_mask);
  227. ret = -EIO;
  228. }
  229. return ret;
  230. }
  231. EXPORT_SYMBOL_NS(hda_dsp_core_run, SND_SOC_SOF_INTEL_HDA_COMMON);
  232. /*
  233. * Power Management.
  234. */
  235. int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask)
  236. {
  237. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  238. const struct sof_intel_dsp_desc *chip = hda->desc;
  239. unsigned int cpa;
  240. u32 adspcs;
  241. int ret;
  242. /* restrict core_mask to host managed cores mask */
  243. core_mask &= chip->host_managed_cores_mask;
  244. /* return if core_mask is not valid */
  245. if (!core_mask)
  246. return 0;
  247. /* update bits */
  248. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPCS,
  249. HDA_DSP_ADSPCS_SPA_MASK(core_mask),
  250. HDA_DSP_ADSPCS_SPA_MASK(core_mask));
  251. /* poll with timeout to check if operation successful */
  252. cpa = HDA_DSP_ADSPCS_CPA_MASK(core_mask);
  253. ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
  254. HDA_DSP_REG_ADSPCS, adspcs,
  255. (adspcs & cpa) == cpa,
  256. HDA_DSP_REG_POLL_INTERVAL_US,
  257. HDA_DSP_RESET_TIMEOUT_US);
  258. if (ret < 0) {
  259. dev_err(sdev->dev,
  260. "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
  261. __func__);
  262. return ret;
  263. }
  264. /* did core power up ? */
  265. adspcs = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
  266. HDA_DSP_REG_ADSPCS);
  267. if ((adspcs & HDA_DSP_ADSPCS_CPA_MASK(core_mask)) !=
  268. HDA_DSP_ADSPCS_CPA_MASK(core_mask)) {
  269. dev_err(sdev->dev,
  270. "error: power up core failed core_mask %xadspcs 0x%x\n",
  271. core_mask, adspcs);
  272. ret = -EIO;
  273. }
  274. return ret;
  275. }
  276. EXPORT_SYMBOL_NS(hda_dsp_core_power_up, SND_SOC_SOF_INTEL_HDA_COMMON);
  277. static int hda_dsp_core_power_down(struct snd_sof_dev *sdev, unsigned int core_mask)
  278. {
  279. u32 adspcs;
  280. int ret;
  281. /* update bits */
  282. snd_sof_dsp_update_bits_unlocked(sdev, HDA_DSP_BAR,
  283. HDA_DSP_REG_ADSPCS,
  284. HDA_DSP_ADSPCS_SPA_MASK(core_mask), 0);
  285. ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
  286. HDA_DSP_REG_ADSPCS, adspcs,
  287. !(adspcs & HDA_DSP_ADSPCS_CPA_MASK(core_mask)),
  288. HDA_DSP_REG_POLL_INTERVAL_US,
  289. HDA_DSP_PD_TIMEOUT * USEC_PER_MSEC);
  290. if (ret < 0)
  291. dev_err(sdev->dev,
  292. "error: %s: timeout on HDA_DSP_REG_ADSPCS read\n",
  293. __func__);
  294. return ret;
  295. }
  296. int hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask)
  297. {
  298. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  299. const struct sof_intel_dsp_desc *chip = hda->desc;
  300. int ret;
  301. /* restrict core_mask to host managed cores mask */
  302. core_mask &= chip->host_managed_cores_mask;
  303. /* return if core_mask is not valid or cores are already enabled */
  304. if (!core_mask || hda_dsp_core_is_enabled(sdev, core_mask))
  305. return 0;
  306. /* power up */
  307. ret = hda_dsp_core_power_up(sdev, core_mask);
  308. if (ret < 0) {
  309. dev_err(sdev->dev, "error: dsp core power up failed: core_mask %x\n",
  310. core_mask);
  311. return ret;
  312. }
  313. return hda_dsp_core_run(sdev, core_mask);
  314. }
  315. EXPORT_SYMBOL_NS(hda_dsp_enable_core, SND_SOC_SOF_INTEL_HDA_COMMON);
  316. int hda_dsp_core_reset_power_down(struct snd_sof_dev *sdev,
  317. unsigned int core_mask)
  318. {
  319. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  320. const struct sof_intel_dsp_desc *chip = hda->desc;
  321. int ret;
  322. /* restrict core_mask to host managed cores mask */
  323. core_mask &= chip->host_managed_cores_mask;
  324. /* return if core_mask is not valid */
  325. if (!core_mask)
  326. return 0;
  327. /* place core in reset prior to power down */
  328. ret = hda_dsp_core_stall_reset(sdev, core_mask);
  329. if (ret < 0) {
  330. dev_err(sdev->dev, "error: dsp core reset failed: core_mask %x\n",
  331. core_mask);
  332. return ret;
  333. }
  334. /* power down core */
  335. ret = hda_dsp_core_power_down(sdev, core_mask);
  336. if (ret < 0) {
  337. dev_err(sdev->dev, "error: dsp core power down fail mask %x: %d\n",
  338. core_mask, ret);
  339. return ret;
  340. }
  341. /* make sure we are in OFF state */
  342. if (hda_dsp_core_is_enabled(sdev, core_mask)) {
  343. dev_err(sdev->dev, "error: dsp core disable fail mask %x: %d\n",
  344. core_mask, ret);
  345. ret = -EIO;
  346. }
  347. return ret;
  348. }
  349. EXPORT_SYMBOL_NS(hda_dsp_core_reset_power_down, SND_SOC_SOF_INTEL_HDA_COMMON);
  350. void hda_dsp_ipc_int_enable(struct snd_sof_dev *sdev)
  351. {
  352. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  353. const struct sof_intel_dsp_desc *chip = hda->desc;
  354. if (sdev->dspless_mode_selected)
  355. return;
  356. /* enable IPC DONE and BUSY interrupts */
  357. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
  358. HDA_DSP_REG_HIPCCTL_DONE | HDA_DSP_REG_HIPCCTL_BUSY,
  359. HDA_DSP_REG_HIPCCTL_DONE | HDA_DSP_REG_HIPCCTL_BUSY);
  360. /* enable IPC interrupt */
  361. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
  362. HDA_DSP_ADSPIC_IPC, HDA_DSP_ADSPIC_IPC);
  363. }
  364. EXPORT_SYMBOL_NS(hda_dsp_ipc_int_enable, SND_SOC_SOF_INTEL_HDA_COMMON);
  365. void hda_dsp_ipc_int_disable(struct snd_sof_dev *sdev)
  366. {
  367. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  368. const struct sof_intel_dsp_desc *chip = hda->desc;
  369. if (sdev->dspless_mode_selected)
  370. return;
  371. /* disable IPC interrupt */
  372. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
  373. HDA_DSP_ADSPIC_IPC, 0);
  374. /* disable IPC BUSY and DONE interrupt */
  375. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
  376. HDA_DSP_REG_HIPCCTL_BUSY | HDA_DSP_REG_HIPCCTL_DONE, 0);
  377. }
  378. EXPORT_SYMBOL_NS(hda_dsp_ipc_int_disable, SND_SOC_SOF_INTEL_HDA_COMMON);
  379. static int hda_dsp_wait_d0i3c_done(struct snd_sof_dev *sdev)
  380. {
  381. int retry = HDA_DSP_REG_POLL_RETRY_COUNT;
  382. struct snd_sof_pdata *pdata = sdev->pdata;
  383. const struct sof_intel_dsp_desc *chip;
  384. chip = get_chip_info(pdata);
  385. while (snd_sof_dsp_read8(sdev, HDA_DSP_HDA_BAR, chip->d0i3_offset) &
  386. SOF_HDA_VS_D0I3C_CIP) {
  387. if (!retry--)
  388. return -ETIMEDOUT;
  389. usleep_range(10, 15);
  390. }
  391. return 0;
  392. }
  393. static int hda_dsp_send_pm_gate_ipc(struct snd_sof_dev *sdev, u32 flags)
  394. {
  395. const struct sof_ipc_pm_ops *pm_ops = sof_ipc_get_ops(sdev, pm);
  396. if (pm_ops && pm_ops->set_pm_gate)
  397. return pm_ops->set_pm_gate(sdev, flags);
  398. return 0;
  399. }
  400. static int hda_dsp_update_d0i3c_register(struct snd_sof_dev *sdev, u8 value)
  401. {
  402. struct snd_sof_pdata *pdata = sdev->pdata;
  403. const struct sof_intel_dsp_desc *chip;
  404. int ret;
  405. u8 reg;
  406. chip = get_chip_info(pdata);
  407. /* Write to D0I3C after Command-In-Progress bit is cleared */
  408. ret = hda_dsp_wait_d0i3c_done(sdev);
  409. if (ret < 0) {
  410. dev_err(sdev->dev, "CIP timeout before D0I3C update!\n");
  411. return ret;
  412. }
  413. /* Update D0I3C register */
  414. snd_sof_dsp_update8(sdev, HDA_DSP_HDA_BAR, chip->d0i3_offset,
  415. SOF_HDA_VS_D0I3C_I3, value);
  416. /*
  417. * The value written to the D0I3C::I3 bit may not be taken into account immediately.
  418. * A delay is recommended before checking if D0I3C::CIP is cleared
  419. */
  420. usleep_range(30, 40);
  421. /* Wait for cmd in progress to be cleared before exiting the function */
  422. ret = hda_dsp_wait_d0i3c_done(sdev);
  423. if (ret < 0) {
  424. dev_err(sdev->dev, "CIP timeout after D0I3C update!\n");
  425. return ret;
  426. }
  427. reg = snd_sof_dsp_read8(sdev, HDA_DSP_HDA_BAR, chip->d0i3_offset);
  428. /* Confirm d0i3 state changed with paranoia check */
  429. if ((reg ^ value) & SOF_HDA_VS_D0I3C_I3) {
  430. dev_err(sdev->dev, "failed to update D0I3C!\n");
  431. return -EIO;
  432. }
  433. trace_sof_intel_D0I3C_updated(sdev, reg);
  434. return 0;
  435. }
  436. /*
  437. * d0i3 streaming is enabled if all the active streams can
  438. * work in d0i3 state and playback is enabled
  439. */
  440. static bool hda_dsp_d0i3_streaming_applicable(struct snd_sof_dev *sdev)
  441. {
  442. struct snd_pcm_substream *substream;
  443. struct snd_sof_pcm *spcm;
  444. bool playback_active = false;
  445. int dir;
  446. list_for_each_entry(spcm, &sdev->pcm_list, list) {
  447. for_each_pcm_streams(dir) {
  448. substream = spcm->stream[dir].substream;
  449. if (!substream || !substream->runtime)
  450. continue;
  451. if (!spcm->stream[dir].d0i3_compatible)
  452. return false;
  453. if (dir == SNDRV_PCM_STREAM_PLAYBACK)
  454. playback_active = true;
  455. }
  456. }
  457. return playback_active;
  458. }
  459. static int hda_dsp_set_D0_state(struct snd_sof_dev *sdev,
  460. const struct sof_dsp_power_state *target_state)
  461. {
  462. u32 flags = 0;
  463. int ret;
  464. u8 value = 0;
  465. /*
  466. * Sanity check for illegal state transitions
  467. * The only allowed transitions are:
  468. * 1. D3 -> D0I0
  469. * 2. D0I0 -> D0I3
  470. * 3. D0I3 -> D0I0
  471. */
  472. switch (sdev->dsp_power_state.state) {
  473. case SOF_DSP_PM_D0:
  474. /* Follow the sequence below for D0 substate transitions */
  475. break;
  476. case SOF_DSP_PM_D3:
  477. /* Follow regular flow for D3 -> D0 transition */
  478. return 0;
  479. default:
  480. dev_err(sdev->dev, "error: transition from %d to %d not allowed\n",
  481. sdev->dsp_power_state.state, target_state->state);
  482. return -EINVAL;
  483. }
  484. /* Set flags and register value for D0 target substate */
  485. if (target_state->substate == SOF_HDA_DSP_PM_D0I3) {
  486. value = SOF_HDA_VS_D0I3C_I3;
  487. /*
  488. * Trace DMA need to be disabled when the DSP enters
  489. * D0I3 for S0Ix suspend, but it can be kept enabled
  490. * when the DSP enters D0I3 while the system is in S0
  491. * for debug purpose.
  492. */
  493. if (!sdev->fw_trace_is_supported ||
  494. !hda_enable_trace_D0I3_S0 ||
  495. sdev->system_suspend_target != SOF_SUSPEND_NONE)
  496. flags = HDA_PM_NO_DMA_TRACE;
  497. if (hda_dsp_d0i3_streaming_applicable(sdev))
  498. flags |= HDA_PM_PG_STREAMING;
  499. } else {
  500. /* prevent power gating in D0I0 */
  501. flags = HDA_PM_PPG;
  502. }
  503. /* update D0I3C register */
  504. ret = hda_dsp_update_d0i3c_register(sdev, value);
  505. if (ret < 0)
  506. return ret;
  507. /*
  508. * Notify the DSP of the state change.
  509. * If this IPC fails, revert the D0I3C register update in order
  510. * to prevent partial state change.
  511. */
  512. ret = hda_dsp_send_pm_gate_ipc(sdev, flags);
  513. if (ret < 0) {
  514. dev_err(sdev->dev,
  515. "error: PM_GATE ipc error %d\n", ret);
  516. goto revert;
  517. }
  518. return ret;
  519. revert:
  520. /* fallback to the previous register value */
  521. value = value ? 0 : SOF_HDA_VS_D0I3C_I3;
  522. /*
  523. * This can fail but return the IPC error to signal that
  524. * the state change failed.
  525. */
  526. hda_dsp_update_d0i3c_register(sdev, value);
  527. return ret;
  528. }
  529. /* helper to log DSP state */
  530. static void hda_dsp_state_log(struct snd_sof_dev *sdev)
  531. {
  532. switch (sdev->dsp_power_state.state) {
  533. case SOF_DSP_PM_D0:
  534. switch (sdev->dsp_power_state.substate) {
  535. case SOF_HDA_DSP_PM_D0I0:
  536. dev_dbg(sdev->dev, "Current DSP power state: D0I0\n");
  537. break;
  538. case SOF_HDA_DSP_PM_D0I3:
  539. dev_dbg(sdev->dev, "Current DSP power state: D0I3\n");
  540. break;
  541. default:
  542. dev_dbg(sdev->dev, "Unknown DSP D0 substate: %d\n",
  543. sdev->dsp_power_state.substate);
  544. break;
  545. }
  546. break;
  547. case SOF_DSP_PM_D1:
  548. dev_dbg(sdev->dev, "Current DSP power state: D1\n");
  549. break;
  550. case SOF_DSP_PM_D2:
  551. dev_dbg(sdev->dev, "Current DSP power state: D2\n");
  552. break;
  553. case SOF_DSP_PM_D3:
  554. dev_dbg(sdev->dev, "Current DSP power state: D3\n");
  555. break;
  556. default:
  557. dev_dbg(sdev->dev, "Unknown DSP power state: %d\n",
  558. sdev->dsp_power_state.state);
  559. break;
  560. }
  561. }
  562. /*
  563. * All DSP power state transitions are initiated by the driver.
  564. * If the requested state change fails, the error is simply returned.
  565. * Further state transitions are attempted only when the set_power_save() op
  566. * is called again either because of a new IPC sent to the DSP or
  567. * during system suspend/resume.
  568. */
  569. static int hda_dsp_set_power_state(struct snd_sof_dev *sdev,
  570. const struct sof_dsp_power_state *target_state)
  571. {
  572. int ret = 0;
  573. switch (target_state->state) {
  574. case SOF_DSP_PM_D0:
  575. ret = hda_dsp_set_D0_state(sdev, target_state);
  576. break;
  577. case SOF_DSP_PM_D3:
  578. /* The only allowed transition is: D0I0 -> D3 */
  579. if (sdev->dsp_power_state.state == SOF_DSP_PM_D0 &&
  580. sdev->dsp_power_state.substate == SOF_HDA_DSP_PM_D0I0)
  581. break;
  582. dev_err(sdev->dev,
  583. "error: transition from %d to %d not allowed\n",
  584. sdev->dsp_power_state.state, target_state->state);
  585. return -EINVAL;
  586. default:
  587. dev_err(sdev->dev, "error: target state unsupported %d\n",
  588. target_state->state);
  589. return -EINVAL;
  590. }
  591. if (ret < 0) {
  592. dev_err(sdev->dev,
  593. "failed to set requested target DSP state %d substate %d\n",
  594. target_state->state, target_state->substate);
  595. return ret;
  596. }
  597. sdev->dsp_power_state = *target_state;
  598. hda_dsp_state_log(sdev);
  599. return ret;
  600. }
  601. int hda_dsp_set_power_state_ipc3(struct snd_sof_dev *sdev,
  602. const struct sof_dsp_power_state *target_state)
  603. {
  604. /*
  605. * When the DSP is already in D0I3 and the target state is D0I3,
  606. * it could be the case that the DSP is in D0I3 during S0
  607. * and the system is suspending to S0Ix. Therefore,
  608. * hda_dsp_set_D0_state() must be called to disable trace DMA
  609. * by sending the PM_GATE IPC to the FW.
  610. */
  611. if (target_state->substate == SOF_HDA_DSP_PM_D0I3 &&
  612. sdev->system_suspend_target == SOF_SUSPEND_S0IX)
  613. return hda_dsp_set_power_state(sdev, target_state);
  614. /*
  615. * For all other cases, return without doing anything if
  616. * the DSP is already in the target state.
  617. */
  618. if (target_state->state == sdev->dsp_power_state.state &&
  619. target_state->substate == sdev->dsp_power_state.substate)
  620. return 0;
  621. return hda_dsp_set_power_state(sdev, target_state);
  622. }
  623. EXPORT_SYMBOL_NS(hda_dsp_set_power_state_ipc3, SND_SOC_SOF_INTEL_HDA_COMMON);
  624. int hda_dsp_set_power_state_ipc4(struct snd_sof_dev *sdev,
  625. const struct sof_dsp_power_state *target_state)
  626. {
  627. /* Return without doing anything if the DSP is already in the target state */
  628. if (target_state->state == sdev->dsp_power_state.state &&
  629. target_state->substate == sdev->dsp_power_state.substate)
  630. return 0;
  631. return hda_dsp_set_power_state(sdev, target_state);
  632. }
  633. EXPORT_SYMBOL_NS(hda_dsp_set_power_state_ipc4, SND_SOC_SOF_INTEL_HDA_COMMON);
  634. /*
  635. * Audio DSP states may transform as below:-
  636. *
  637. * Opportunistic D0I3 in S0
  638. * Runtime +---------------------+ Delayed D0i3 work timeout
  639. * suspend | +--------------------+
  640. * +------------+ D0I0(active) | |
  641. * | | <---------------+ |
  642. * | +--------> | New IPC | |
  643. * | |Runtime +--^--+---------^--+--+ (via mailbox) | |
  644. * | |resume | | | | | |
  645. * | | | | | | | |
  646. * | | System| | | | | |
  647. * | | resume| | S3/S0IX | | | |
  648. * | | | | suspend | | S0IX | |
  649. * | | | | | |suspend | |
  650. * | | | | | | | |
  651. * | | | | | | | |
  652. * +-v---+-----------+--v-------+ | | +------+----v----+
  653. * | | | +-----------> |
  654. * | D3 (suspended) | | | D0I3 |
  655. * | | +--------------+ |
  656. * | | System resume | |
  657. * +----------------------------+ +----------------+
  658. *
  659. * S0IX suspend: The DSP is in D0I3 if any D0I3-compatible streams
  660. * ignored the suspend trigger. Otherwise the DSP
  661. * is in D3.
  662. */
  663. static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
  664. {
  665. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  666. const struct sof_intel_dsp_desc *chip = hda->desc;
  667. struct hdac_bus *bus = sof_to_bus(sdev);
  668. bool imr_lost = false;
  669. int ret, j;
  670. /*
  671. * The memory used for IMR boot loses its content in deeper than S3
  672. * state on CAVS platforms.
  673. * On ACE platforms due to the system architecture the IMR content is
  674. * lost at S3 state already, they are tailored for s2idle use.
  675. * We must not try IMR boot on next power up in these cases as it will
  676. * fail.
  677. */
  678. if (sdev->system_suspend_target > SOF_SUSPEND_S3 ||
  679. (chip->hw_ip_version >= SOF_INTEL_ACE_1_0 &&
  680. sdev->system_suspend_target == SOF_SUSPEND_S3))
  681. imr_lost = true;
  682. /*
  683. * In case of firmware crash or boot failure set the skip_imr_boot to true
  684. * as well in order to try to re-load the firmware to do a 'cold' boot.
  685. */
  686. if (imr_lost || sdev->fw_state == SOF_FW_CRASHED ||
  687. sdev->fw_state == SOF_FW_BOOT_FAILED)
  688. hda->skip_imr_boot = true;
  689. ret = chip->disable_interrupts(sdev);
  690. if (ret < 0)
  691. return ret;
  692. /* make sure that no irq handler is pending before shutdown */
  693. synchronize_irq(sdev->ipc_irq);
  694. hda_codec_jack_wake_enable(sdev, runtime_suspend);
  695. /* power down all hda links */
  696. hda_bus_ml_suspend(bus);
  697. if (sdev->dspless_mode_selected)
  698. goto skip_dsp;
  699. ret = chip->power_down_dsp(sdev);
  700. if (ret < 0) {
  701. dev_err(sdev->dev, "failed to power down DSP during suspend\n");
  702. return ret;
  703. }
  704. /* reset ref counts for all cores */
  705. for (j = 0; j < chip->cores_num; j++)
  706. sdev->dsp_core_ref_count[j] = 0;
  707. /* disable ppcap interrupt */
  708. hda_dsp_ctrl_ppcap_enable(sdev, false);
  709. hda_dsp_ctrl_ppcap_int_enable(sdev, false);
  710. skip_dsp:
  711. /* disable hda bus irq and streams */
  712. hda_dsp_ctrl_stop_chip(sdev);
  713. /* disable LP retention mode */
  714. snd_sof_pci_update_bits(sdev, PCI_PGCTL,
  715. PCI_PGCTL_LSRMD_MASK, PCI_PGCTL_LSRMD_MASK);
  716. /* reset controller */
  717. ret = hda_dsp_ctrl_link_reset(sdev, true);
  718. if (ret < 0) {
  719. dev_err(sdev->dev,
  720. "error: failed to reset controller during suspend\n");
  721. return ret;
  722. }
  723. /* display codec can powered off after link reset */
  724. hda_codec_i915_display_power(sdev, false);
  725. return 0;
  726. }
  727. static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume)
  728. {
  729. const struct sof_intel_dsp_desc *chip;
  730. int ret;
  731. /* display codec must be powered before link reset */
  732. hda_codec_i915_display_power(sdev, true);
  733. /*
  734. * clear TCSEL to clear playback on some HD Audio
  735. * codecs. PCI TCSEL is defined in the Intel manuals.
  736. */
  737. snd_sof_pci_update_bits(sdev, PCI_TCSEL, 0x07, 0);
  738. /* reset and start hda controller */
  739. ret = hda_dsp_ctrl_init_chip(sdev);
  740. if (ret < 0) {
  741. dev_err(sdev->dev,
  742. "error: failed to start controller after resume\n");
  743. goto cleanup;
  744. }
  745. /* check jack status */
  746. if (runtime_resume) {
  747. hda_codec_jack_wake_enable(sdev, false);
  748. if (sdev->system_suspend_target == SOF_SUSPEND_NONE)
  749. hda_codec_jack_check(sdev);
  750. }
  751. if (!sdev->dspless_mode_selected) {
  752. /* enable ppcap interrupt */
  753. hda_dsp_ctrl_ppcap_enable(sdev, true);
  754. hda_dsp_ctrl_ppcap_int_enable(sdev, true);
  755. }
  756. chip = get_chip_info(sdev->pdata);
  757. if (chip && chip->hw_ip_version >= SOF_INTEL_ACE_2_0)
  758. hda_sdw_int_enable(sdev, true);
  759. cleanup:
  760. /* display codec can powered off after controller init */
  761. hda_codec_i915_display_power(sdev, false);
  762. return 0;
  763. }
  764. int hda_dsp_resume(struct snd_sof_dev *sdev)
  765. {
  766. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  767. struct hdac_bus *bus = sof_to_bus(sdev);
  768. struct pci_dev *pci = to_pci_dev(sdev->dev);
  769. const struct sof_dsp_power_state target_state = {
  770. .state = SOF_DSP_PM_D0,
  771. .substate = SOF_HDA_DSP_PM_D0I0,
  772. };
  773. int ret;
  774. /* resume from D0I3 */
  775. if (sdev->dsp_power_state.state == SOF_DSP_PM_D0) {
  776. ret = hda_bus_ml_resume(bus);
  777. if (ret < 0) {
  778. dev_err(sdev->dev,
  779. "error %d in %s: failed to power up links",
  780. ret, __func__);
  781. return ret;
  782. }
  783. /* set up CORB/RIRB buffers if was on before suspend */
  784. hda_codec_resume_cmd_io(sdev);
  785. /* Set DSP power state */
  786. ret = snd_sof_dsp_set_power_state(sdev, &target_state);
  787. if (ret < 0) {
  788. dev_err(sdev->dev, "error: setting dsp state %d substate %d\n",
  789. target_state.state, target_state.substate);
  790. return ret;
  791. }
  792. /* restore L1SEN bit */
  793. if (hda->l1_disabled)
  794. snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
  795. HDA_VS_INTEL_EM2,
  796. HDA_VS_INTEL_EM2_L1SEN, 0);
  797. /* restore and disable the system wakeup */
  798. pci_restore_state(pci);
  799. disable_irq_wake(pci->irq);
  800. return 0;
  801. }
  802. /* init hda controller. DSP cores will be powered up during fw boot */
  803. ret = hda_resume(sdev, false);
  804. if (ret < 0)
  805. return ret;
  806. return snd_sof_dsp_set_power_state(sdev, &target_state);
  807. }
  808. EXPORT_SYMBOL_NS(hda_dsp_resume, SND_SOC_SOF_INTEL_HDA_COMMON);
  809. int hda_dsp_runtime_resume(struct snd_sof_dev *sdev)
  810. {
  811. const struct sof_dsp_power_state target_state = {
  812. .state = SOF_DSP_PM_D0,
  813. };
  814. int ret;
  815. /* init hda controller. DSP cores will be powered up during fw boot */
  816. ret = hda_resume(sdev, true);
  817. if (ret < 0)
  818. return ret;
  819. return snd_sof_dsp_set_power_state(sdev, &target_state);
  820. }
  821. EXPORT_SYMBOL_NS(hda_dsp_runtime_resume, SND_SOC_SOF_INTEL_HDA_COMMON);
  822. int hda_dsp_runtime_idle(struct snd_sof_dev *sdev)
  823. {
  824. struct hdac_bus *hbus = sof_to_bus(sdev);
  825. if (hbus->codec_powered) {
  826. dev_dbg(sdev->dev, "some codecs still powered (%08X), not idle\n",
  827. (unsigned int)hbus->codec_powered);
  828. return -EBUSY;
  829. }
  830. return 0;
  831. }
  832. EXPORT_SYMBOL_NS(hda_dsp_runtime_idle, SND_SOC_SOF_INTEL_HDA_COMMON);
  833. int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev)
  834. {
  835. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  836. const struct sof_dsp_power_state target_state = {
  837. .state = SOF_DSP_PM_D3,
  838. };
  839. int ret;
  840. if (!sdev->dspless_mode_selected) {
  841. /* cancel any attempt for DSP D0I3 */
  842. cancel_delayed_work_sync(&hda->d0i3_work);
  843. }
  844. /* stop hda controller and power dsp off */
  845. ret = hda_suspend(sdev, true);
  846. if (ret < 0)
  847. return ret;
  848. return snd_sof_dsp_set_power_state(sdev, &target_state);
  849. }
  850. EXPORT_SYMBOL_NS(hda_dsp_runtime_suspend, SND_SOC_SOF_INTEL_HDA_COMMON);
  851. int hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
  852. {
  853. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  854. struct hdac_bus *bus = sof_to_bus(sdev);
  855. struct pci_dev *pci = to_pci_dev(sdev->dev);
  856. const struct sof_dsp_power_state target_dsp_state = {
  857. .state = target_state,
  858. .substate = target_state == SOF_DSP_PM_D0 ?
  859. SOF_HDA_DSP_PM_D0I3 : 0,
  860. };
  861. int ret;
  862. if (!sdev->dspless_mode_selected) {
  863. /* cancel any attempt for DSP D0I3 */
  864. cancel_delayed_work_sync(&hda->d0i3_work);
  865. }
  866. if (target_state == SOF_DSP_PM_D0) {
  867. /* Set DSP power state */
  868. ret = snd_sof_dsp_set_power_state(sdev, &target_dsp_state);
  869. if (ret < 0) {
  870. dev_err(sdev->dev, "error: setting dsp state %d substate %d\n",
  871. target_dsp_state.state,
  872. target_dsp_state.substate);
  873. return ret;
  874. }
  875. /* enable L1SEN to make sure the system can enter S0Ix */
  876. if (hda->l1_disabled)
  877. snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, HDA_VS_INTEL_EM2,
  878. HDA_VS_INTEL_EM2_L1SEN, HDA_VS_INTEL_EM2_L1SEN);
  879. /* stop the CORB/RIRB DMA if it is On */
  880. hda_codec_suspend_cmd_io(sdev);
  881. /* no link can be powered in s0ix state */
  882. ret = hda_bus_ml_suspend(bus);
  883. if (ret < 0) {
  884. dev_err(sdev->dev,
  885. "error %d in %s: failed to power down links",
  886. ret, __func__);
  887. return ret;
  888. }
  889. /* enable the system waking up via IPC IRQ */
  890. enable_irq_wake(pci->irq);
  891. pci_save_state(pci);
  892. return 0;
  893. }
  894. /* stop hda controller and power dsp off */
  895. ret = hda_suspend(sdev, false);
  896. if (ret < 0) {
  897. dev_err(bus->dev, "error: suspending dsp\n");
  898. return ret;
  899. }
  900. return snd_sof_dsp_set_power_state(sdev, &target_dsp_state);
  901. }
  902. EXPORT_SYMBOL_NS(hda_dsp_suspend, SND_SOC_SOF_INTEL_HDA_COMMON);
  903. static unsigned int hda_dsp_check_for_dma_streams(struct snd_sof_dev *sdev)
  904. {
  905. struct hdac_bus *bus = sof_to_bus(sdev);
  906. struct hdac_stream *s;
  907. unsigned int active_streams = 0;
  908. int sd_offset;
  909. u32 val;
  910. list_for_each_entry(s, &bus->stream_list, list) {
  911. sd_offset = SOF_STREAM_SD_OFFSET(s);
  912. val = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR,
  913. sd_offset);
  914. if (val & SOF_HDA_SD_CTL_DMA_START)
  915. active_streams |= BIT(s->index);
  916. }
  917. return active_streams;
  918. }
  919. static int hda_dsp_s5_quirk(struct snd_sof_dev *sdev)
  920. {
  921. int ret;
  922. /*
  923. * Do not assume a certain timing between the prior
  924. * suspend flow, and running of this quirk function.
  925. * This is needed if the controller was just put
  926. * to reset before calling this function.
  927. */
  928. usleep_range(500, 1000);
  929. /*
  930. * Take controller out of reset to flush DMA
  931. * transactions.
  932. */
  933. ret = hda_dsp_ctrl_link_reset(sdev, false);
  934. if (ret < 0)
  935. return ret;
  936. usleep_range(500, 1000);
  937. /* Restore state for shutdown, back to reset */
  938. ret = hda_dsp_ctrl_link_reset(sdev, true);
  939. if (ret < 0)
  940. return ret;
  941. return ret;
  942. }
  943. int hda_dsp_shutdown_dma_flush(struct snd_sof_dev *sdev)
  944. {
  945. unsigned int active_streams;
  946. int ret, ret2;
  947. /* check if DMA cleanup has been successful */
  948. active_streams = hda_dsp_check_for_dma_streams(sdev);
  949. sdev->system_suspend_target = SOF_SUSPEND_S3;
  950. ret = snd_sof_suspend(sdev->dev);
  951. if (active_streams) {
  952. dev_warn(sdev->dev,
  953. "There were active DSP streams (%#x) at shutdown, trying to recover\n",
  954. active_streams);
  955. ret2 = hda_dsp_s5_quirk(sdev);
  956. if (ret2 < 0)
  957. dev_err(sdev->dev, "shutdown recovery failed (%d)\n", ret2);
  958. }
  959. return ret;
  960. }
  961. EXPORT_SYMBOL_NS(hda_dsp_shutdown_dma_flush, SND_SOC_SOF_INTEL_HDA_COMMON);
  962. int hda_dsp_shutdown(struct snd_sof_dev *sdev)
  963. {
  964. sdev->system_suspend_target = SOF_SUSPEND_S3;
  965. return snd_sof_suspend(sdev->dev);
  966. }
  967. EXPORT_SYMBOL_NS(hda_dsp_shutdown, SND_SOC_SOF_INTEL_HDA_COMMON);
  968. int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
  969. {
  970. int ret;
  971. /* make sure all DAI resources are freed */
  972. ret = hda_dsp_dais_suspend(sdev);
  973. if (ret < 0)
  974. dev_warn(sdev->dev, "%s: failure in hda_dsp_dais_suspend\n", __func__);
  975. return ret;
  976. }
  977. EXPORT_SYMBOL_NS(hda_dsp_set_hw_params_upon_resume, SND_SOC_SOF_INTEL_HDA_COMMON);
  978. void hda_dsp_d0i3_work(struct work_struct *work)
  979. {
  980. struct sof_intel_hda_dev *hdev = container_of(work,
  981. struct sof_intel_hda_dev,
  982. d0i3_work.work);
  983. struct hdac_bus *bus = &hdev->hbus.core;
  984. struct snd_sof_dev *sdev = dev_get_drvdata(bus->dev);
  985. struct sof_dsp_power_state target_state = {
  986. .state = SOF_DSP_PM_D0,
  987. .substate = SOF_HDA_DSP_PM_D0I3,
  988. };
  989. int ret;
  990. /* DSP can enter D0I3 iff only D0I3-compatible streams are active */
  991. if (!snd_sof_dsp_only_d0i3_compatible_stream_active(sdev))
  992. /* remain in D0I0 */
  993. return;
  994. /* This can fail but error cannot be propagated */
  995. ret = snd_sof_dsp_set_power_state(sdev, &target_state);
  996. if (ret < 0)
  997. dev_err_ratelimited(sdev->dev,
  998. "error: failed to set DSP state %d substate %d\n",
  999. target_state.state, target_state.substate);
  1000. }
  1001. EXPORT_SYMBOL_NS(hda_dsp_d0i3_work, SND_SOC_SOF_INTEL_HDA_COMMON);
  1002. int hda_dsp_core_get(struct snd_sof_dev *sdev, int core)
  1003. {
  1004. const struct sof_ipc_pm_ops *pm_ops = sdev->ipc->ops->pm;
  1005. int ret, ret1;
  1006. /* power up core */
  1007. ret = hda_dsp_enable_core(sdev, BIT(core));
  1008. if (ret < 0) {
  1009. dev_err(sdev->dev, "failed to power up core %d with err: %d\n",
  1010. core, ret);
  1011. return ret;
  1012. }
  1013. /* No need to send IPC for primary core or if FW boot is not complete */
  1014. if (sdev->fw_state != SOF_FW_BOOT_COMPLETE || core == SOF_DSP_PRIMARY_CORE)
  1015. return 0;
  1016. /* No need to continue the set_core_state ops is not available */
  1017. if (!pm_ops->set_core_state)
  1018. return 0;
  1019. /* Now notify DSP for secondary cores */
  1020. ret = pm_ops->set_core_state(sdev, core, true);
  1021. if (ret < 0) {
  1022. dev_err(sdev->dev, "failed to enable secondary core '%d' failed with %d\n",
  1023. core, ret);
  1024. goto power_down;
  1025. }
  1026. return ret;
  1027. power_down:
  1028. /* power down core if it is host managed and return the original error if this fails too */
  1029. ret1 = hda_dsp_core_reset_power_down(sdev, BIT(core));
  1030. if (ret1 < 0)
  1031. dev_err(sdev->dev, "failed to power down core: %d with err: %d\n", core, ret1);
  1032. return ret;
  1033. }
  1034. EXPORT_SYMBOL_NS(hda_dsp_core_get, SND_SOC_SOF_INTEL_HDA_COMMON);
  1035. #if IS_ENABLED(CONFIG_SND_SOC_SOF_INTEL_SOUNDWIRE)
  1036. void hda_common_enable_sdw_irq(struct snd_sof_dev *sdev, bool enable)
  1037. {
  1038. struct sof_intel_hda_dev *hdev;
  1039. hdev = sdev->pdata->hw_pdata;
  1040. if (!hdev->sdw)
  1041. return;
  1042. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC2,
  1043. HDA_DSP_REG_ADSPIC2_SNDW,
  1044. enable ? HDA_DSP_REG_ADSPIC2_SNDW : 0);
  1045. }
  1046. EXPORT_SYMBOL_NS(hda_common_enable_sdw_irq, SND_SOC_SOF_INTEL_HDA_COMMON);
  1047. void hda_sdw_int_enable(struct snd_sof_dev *sdev, bool enable)
  1048. {
  1049. u32 interface_mask = hda_get_interface_mask(sdev);
  1050. const struct sof_intel_dsp_desc *chip;
  1051. if (!(interface_mask & BIT(SOF_DAI_INTEL_ALH)))
  1052. return;
  1053. chip = get_chip_info(sdev->pdata);
  1054. if (chip && chip->enable_sdw_irq)
  1055. chip->enable_sdw_irq(sdev, enable);
  1056. }
  1057. EXPORT_SYMBOL_NS(hda_sdw_int_enable, SND_SOC_SOF_INTEL_HDA_COMMON);
  1058. int hda_sdw_check_lcount_common(struct snd_sof_dev *sdev)
  1059. {
  1060. struct sof_intel_hda_dev *hdev;
  1061. struct sdw_intel_ctx *ctx;
  1062. u32 caps;
  1063. hdev = sdev->pdata->hw_pdata;
  1064. ctx = hdev->sdw;
  1065. caps = snd_sof_dsp_read(sdev, HDA_DSP_BAR, ctx->shim_base + SDW_SHIM_LCAP);
  1066. caps &= SDW_SHIM_LCAP_LCOUNT_MASK;
  1067. /* Check HW supported vs property value */
  1068. if (caps < ctx->count) {
  1069. dev_err(sdev->dev,
  1070. "%s: BIOS master count %d is larger than hardware capabilities %d\n",
  1071. __func__, ctx->count, caps);
  1072. return -EINVAL;
  1073. }
  1074. return 0;
  1075. }
  1076. EXPORT_SYMBOL_NS(hda_sdw_check_lcount_common, SND_SOC_SOF_INTEL_HDA_COMMON);
  1077. int hda_sdw_check_lcount_ext(struct snd_sof_dev *sdev)
  1078. {
  1079. struct sof_intel_hda_dev *hdev;
  1080. struct sdw_intel_ctx *ctx;
  1081. struct hdac_bus *bus;
  1082. u32 slcount;
  1083. bus = sof_to_bus(sdev);
  1084. hdev = sdev->pdata->hw_pdata;
  1085. ctx = hdev->sdw;
  1086. slcount = hdac_bus_eml_get_count(bus, true, AZX_REG_ML_LEPTR_ID_SDW);
  1087. /* Check HW supported vs property value */
  1088. if (slcount < ctx->count) {
  1089. dev_err(sdev->dev,
  1090. "%s: BIOS master count %d is larger than hardware capabilities %d\n",
  1091. __func__, ctx->count, slcount);
  1092. return -EINVAL;
  1093. }
  1094. return 0;
  1095. }
  1096. EXPORT_SYMBOL_NS(hda_sdw_check_lcount_ext, SND_SOC_SOF_INTEL_HDA_COMMON);
  1097. int hda_sdw_check_lcount(struct snd_sof_dev *sdev)
  1098. {
  1099. const struct sof_intel_dsp_desc *chip;
  1100. chip = get_chip_info(sdev->pdata);
  1101. if (chip && chip->read_sdw_lcount)
  1102. return chip->read_sdw_lcount(sdev);
  1103. return 0;
  1104. }
  1105. EXPORT_SYMBOL_NS(hda_sdw_check_lcount, SND_SOC_SOF_INTEL_HDA_COMMON);
  1106. void hda_sdw_process_wakeen(struct snd_sof_dev *sdev)
  1107. {
  1108. u32 interface_mask = hda_get_interface_mask(sdev);
  1109. const struct sof_intel_dsp_desc *chip;
  1110. if (!(interface_mask & BIT(SOF_DAI_INTEL_ALH)))
  1111. return;
  1112. chip = get_chip_info(sdev->pdata);
  1113. if (chip && chip->sdw_process_wakeen)
  1114. chip->sdw_process_wakeen(sdev);
  1115. }
  1116. EXPORT_SYMBOL_NS(hda_sdw_process_wakeen, SND_SOC_SOF_INTEL_HDA_COMMON);
  1117. #endif
  1118. int hda_dsp_disable_interrupts(struct snd_sof_dev *sdev)
  1119. {
  1120. hda_sdw_int_enable(sdev, false);
  1121. hda_dsp_ipc_int_disable(sdev);
  1122. return 0;
  1123. }
  1124. EXPORT_SYMBOL_NS(hda_dsp_disable_interrupts, SND_SOC_SOF_INTEL_HDA_COMMON);
  1125. static const struct hda_dsp_msg_code hda_dsp_rom_fw_error_texts[] = {
  1126. {HDA_DSP_ROM_CSE_ERROR, "error: cse error"},
  1127. {HDA_DSP_ROM_CSE_WRONG_RESPONSE, "error: cse wrong response"},
  1128. {HDA_DSP_ROM_IMR_TO_SMALL, "error: IMR too small"},
  1129. {HDA_DSP_ROM_BASE_FW_NOT_FOUND, "error: base fw not found"},
  1130. {HDA_DSP_ROM_CSE_VALIDATION_FAILED, "error: signature verification failed"},
  1131. {HDA_DSP_ROM_IPC_FATAL_ERROR, "error: ipc fatal error"},
  1132. {HDA_DSP_ROM_L2_CACHE_ERROR, "error: L2 cache error"},
  1133. {HDA_DSP_ROM_LOAD_OFFSET_TO_SMALL, "error: load offset too small"},
  1134. {HDA_DSP_ROM_API_PTR_INVALID, "error: API ptr invalid"},
  1135. {HDA_DSP_ROM_BASEFW_INCOMPAT, "error: base fw incompatible"},
  1136. {HDA_DSP_ROM_UNHANDLED_INTERRUPT, "error: unhandled interrupt"},
  1137. {HDA_DSP_ROM_MEMORY_HOLE_ECC, "error: ECC memory hole"},
  1138. {HDA_DSP_ROM_KERNEL_EXCEPTION, "error: kernel exception"},
  1139. {HDA_DSP_ROM_USER_EXCEPTION, "error: user exception"},
  1140. {HDA_DSP_ROM_UNEXPECTED_RESET, "error: unexpected reset"},
  1141. {HDA_DSP_ROM_NULL_FW_ENTRY, "error: null FW entry point"},
  1142. };
  1143. #define FSR_ROM_STATE_ENTRY(state) {FSR_STATE_ROM_##state, #state}
  1144. static const struct hda_dsp_msg_code cavs_fsr_rom_state_names[] = {
  1145. FSR_ROM_STATE_ENTRY(INIT),
  1146. FSR_ROM_STATE_ENTRY(INIT_DONE),
  1147. FSR_ROM_STATE_ENTRY(CSE_MANIFEST_LOADED),
  1148. FSR_ROM_STATE_ENTRY(FW_MANIFEST_LOADED),
  1149. FSR_ROM_STATE_ENTRY(FW_FW_LOADED),
  1150. FSR_ROM_STATE_ENTRY(FW_ENTERED),
  1151. FSR_ROM_STATE_ENTRY(VERIFY_FEATURE_MASK),
  1152. FSR_ROM_STATE_ENTRY(GET_LOAD_OFFSET),
  1153. FSR_ROM_STATE_ENTRY(FETCH_ROM_EXT),
  1154. FSR_ROM_STATE_ENTRY(FETCH_ROM_EXT_DONE),
  1155. /* CSE states */
  1156. FSR_ROM_STATE_ENTRY(CSE_IMR_REQUEST),
  1157. FSR_ROM_STATE_ENTRY(CSE_IMR_GRANTED),
  1158. FSR_ROM_STATE_ENTRY(CSE_VALIDATE_IMAGE_REQUEST),
  1159. FSR_ROM_STATE_ENTRY(CSE_IMAGE_VALIDATED),
  1160. FSR_ROM_STATE_ENTRY(CSE_IPC_IFACE_INIT),
  1161. FSR_ROM_STATE_ENTRY(CSE_IPC_RESET_PHASE_1),
  1162. FSR_ROM_STATE_ENTRY(CSE_IPC_OPERATIONAL_ENTRY),
  1163. FSR_ROM_STATE_ENTRY(CSE_IPC_OPERATIONAL),
  1164. FSR_ROM_STATE_ENTRY(CSE_IPC_DOWN),
  1165. };
  1166. static const struct hda_dsp_msg_code ace_fsr_rom_state_names[] = {
  1167. FSR_ROM_STATE_ENTRY(INIT),
  1168. FSR_ROM_STATE_ENTRY(INIT_DONE),
  1169. FSR_ROM_STATE_ENTRY(CSE_MANIFEST_LOADED),
  1170. FSR_ROM_STATE_ENTRY(FW_MANIFEST_LOADED),
  1171. FSR_ROM_STATE_ENTRY(FW_FW_LOADED),
  1172. FSR_ROM_STATE_ENTRY(FW_ENTERED),
  1173. FSR_ROM_STATE_ENTRY(VERIFY_FEATURE_MASK),
  1174. FSR_ROM_STATE_ENTRY(GET_LOAD_OFFSET),
  1175. FSR_ROM_STATE_ENTRY(RESET_VECTOR_DONE),
  1176. FSR_ROM_STATE_ENTRY(PURGE_BOOT),
  1177. FSR_ROM_STATE_ENTRY(RESTORE_BOOT),
  1178. FSR_ROM_STATE_ENTRY(FW_ENTRY_POINT),
  1179. FSR_ROM_STATE_ENTRY(VALIDATE_PUB_KEY),
  1180. FSR_ROM_STATE_ENTRY(POWER_DOWN_HPSRAM),
  1181. FSR_ROM_STATE_ENTRY(POWER_DOWN_ULPSRAM),
  1182. FSR_ROM_STATE_ENTRY(POWER_UP_ULPSRAM_STACK),
  1183. FSR_ROM_STATE_ENTRY(POWER_UP_HPSRAM_DMA),
  1184. FSR_ROM_STATE_ENTRY(BEFORE_EP_POINTER_READ),
  1185. FSR_ROM_STATE_ENTRY(VALIDATE_MANIFEST),
  1186. FSR_ROM_STATE_ENTRY(VALIDATE_FW_MODULE),
  1187. FSR_ROM_STATE_ENTRY(PROTECT_IMR_REGION),
  1188. FSR_ROM_STATE_ENTRY(PUSH_MODEL_ROUTINE),
  1189. FSR_ROM_STATE_ENTRY(PULL_MODEL_ROUTINE),
  1190. FSR_ROM_STATE_ENTRY(VALIDATE_PKG_DIR),
  1191. FSR_ROM_STATE_ENTRY(VALIDATE_CPD),
  1192. FSR_ROM_STATE_ENTRY(VALIDATE_CSS_MAN_HEADER),
  1193. FSR_ROM_STATE_ENTRY(VALIDATE_BLOB_SVN),
  1194. FSR_ROM_STATE_ENTRY(VERIFY_IFWI_PARTITION),
  1195. FSR_ROM_STATE_ENTRY(REMOVE_ACCESS_CONTROL),
  1196. FSR_ROM_STATE_ENTRY(AUTH_BYPASS),
  1197. FSR_ROM_STATE_ENTRY(AUTH_ENABLED),
  1198. FSR_ROM_STATE_ENTRY(INIT_DMA),
  1199. FSR_ROM_STATE_ENTRY(PURGE_FW_ENTRY),
  1200. FSR_ROM_STATE_ENTRY(PURGE_FW_END),
  1201. FSR_ROM_STATE_ENTRY(CLEAN_UP_BSS_DONE),
  1202. FSR_ROM_STATE_ENTRY(IMR_RESTORE_ENTRY),
  1203. FSR_ROM_STATE_ENTRY(IMR_RESTORE_END),
  1204. FSR_ROM_STATE_ENTRY(FW_MANIFEST_IN_DMA_BUFF),
  1205. FSR_ROM_STATE_ENTRY(LOAD_CSE_MAN_TO_IMR),
  1206. FSR_ROM_STATE_ENTRY(LOAD_FW_MAN_TO_IMR),
  1207. FSR_ROM_STATE_ENTRY(LOAD_FW_CODE_TO_IMR),
  1208. FSR_ROM_STATE_ENTRY(FW_LOADING_DONE),
  1209. FSR_ROM_STATE_ENTRY(FW_CODE_LOADED),
  1210. FSR_ROM_STATE_ENTRY(VERIFY_IMAGE_TYPE),
  1211. FSR_ROM_STATE_ENTRY(AUTH_API_INIT),
  1212. FSR_ROM_STATE_ENTRY(AUTH_API_PROC),
  1213. FSR_ROM_STATE_ENTRY(AUTH_API_FIRST_BUSY),
  1214. FSR_ROM_STATE_ENTRY(AUTH_API_FIRST_RESULT),
  1215. FSR_ROM_STATE_ENTRY(AUTH_API_CLEANUP),
  1216. };
  1217. #define FSR_BRINGUP_STATE_ENTRY(state) {FSR_STATE_BRINGUP_##state, #state}
  1218. static const struct hda_dsp_msg_code fsr_bringup_state_names[] = {
  1219. FSR_BRINGUP_STATE_ENTRY(INIT),
  1220. FSR_BRINGUP_STATE_ENTRY(INIT_DONE),
  1221. FSR_BRINGUP_STATE_ENTRY(HPSRAM_LOAD),
  1222. FSR_BRINGUP_STATE_ENTRY(UNPACK_START),
  1223. FSR_BRINGUP_STATE_ENTRY(IMR_RESTORE),
  1224. FSR_BRINGUP_STATE_ENTRY(FW_ENTERED),
  1225. };
  1226. #define FSR_WAIT_STATE_ENTRY(state) {FSR_WAIT_FOR_##state, #state}
  1227. static const struct hda_dsp_msg_code fsr_wait_state_names[] = {
  1228. FSR_WAIT_STATE_ENTRY(IPC_BUSY),
  1229. FSR_WAIT_STATE_ENTRY(IPC_DONE),
  1230. FSR_WAIT_STATE_ENTRY(CACHE_INVALIDATION),
  1231. FSR_WAIT_STATE_ENTRY(LP_SRAM_OFF),
  1232. FSR_WAIT_STATE_ENTRY(DMA_BUFFER_FULL),
  1233. FSR_WAIT_STATE_ENTRY(CSE_CSR),
  1234. };
  1235. #define FSR_MODULE_NAME_ENTRY(mod) [FSR_MOD_##mod] = #mod
  1236. static const char * const fsr_module_names[] = {
  1237. FSR_MODULE_NAME_ENTRY(ROM),
  1238. FSR_MODULE_NAME_ENTRY(ROM_BYP),
  1239. FSR_MODULE_NAME_ENTRY(BASE_FW),
  1240. FSR_MODULE_NAME_ENTRY(LP_BOOT),
  1241. FSR_MODULE_NAME_ENTRY(BRNGUP),
  1242. FSR_MODULE_NAME_ENTRY(ROM_EXT),
  1243. };
  1244. static const char *
  1245. hda_dsp_get_state_text(u32 code, const struct hda_dsp_msg_code *msg_code,
  1246. size_t array_size)
  1247. {
  1248. int i;
  1249. for (i = 0; i < array_size; i++) {
  1250. if (code == msg_code[i].code)
  1251. return msg_code[i].text;
  1252. }
  1253. return NULL;
  1254. }
  1255. void hda_dsp_get_state(struct snd_sof_dev *sdev, const char *level)
  1256. {
  1257. const struct sof_intel_dsp_desc *chip = get_chip_info(sdev->pdata);
  1258. const char *state_text, *error_text, *module_text;
  1259. u32 fsr, state, wait_state, module, error_code;
  1260. fsr = snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg);
  1261. state = FSR_TO_STATE_CODE(fsr);
  1262. wait_state = FSR_TO_WAIT_STATE_CODE(fsr);
  1263. module = FSR_TO_MODULE_CODE(fsr);
  1264. if (module > FSR_MOD_ROM_EXT)
  1265. module_text = "unknown";
  1266. else
  1267. module_text = fsr_module_names[module];
  1268. if (module == FSR_MOD_BRNGUP) {
  1269. state_text = hda_dsp_get_state_text(state, fsr_bringup_state_names,
  1270. ARRAY_SIZE(fsr_bringup_state_names));
  1271. } else {
  1272. if (chip->hw_ip_version < SOF_INTEL_ACE_1_0)
  1273. state_text = hda_dsp_get_state_text(state,
  1274. cavs_fsr_rom_state_names,
  1275. ARRAY_SIZE(cavs_fsr_rom_state_names));
  1276. else
  1277. state_text = hda_dsp_get_state_text(state,
  1278. ace_fsr_rom_state_names,
  1279. ARRAY_SIZE(ace_fsr_rom_state_names));
  1280. }
  1281. /* not for us, must be generic sof message */
  1282. if (!state_text) {
  1283. dev_printk(level, sdev->dev, "%#010x: unknown ROM status value\n", fsr);
  1284. return;
  1285. }
  1286. if (wait_state) {
  1287. const char *wait_state_text;
  1288. wait_state_text = hda_dsp_get_state_text(wait_state, fsr_wait_state_names,
  1289. ARRAY_SIZE(fsr_wait_state_names));
  1290. if (!wait_state_text)
  1291. wait_state_text = "unknown";
  1292. dev_printk(level, sdev->dev,
  1293. "%#010x: module: %s, state: %s, waiting for: %s, %s\n",
  1294. fsr, module_text, state_text, wait_state_text,
  1295. fsr & FSR_HALTED ? "not running" : "running");
  1296. } else {
  1297. dev_printk(level, sdev->dev, "%#010x: module: %s, state: %s, %s\n",
  1298. fsr, module_text, state_text,
  1299. fsr & FSR_HALTED ? "not running" : "running");
  1300. }
  1301. error_code = snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg + 4);
  1302. if (!error_code)
  1303. return;
  1304. error_text = hda_dsp_get_state_text(error_code, hda_dsp_rom_fw_error_texts,
  1305. ARRAY_SIZE(hda_dsp_rom_fw_error_texts));
  1306. if (!error_text)
  1307. error_text = "unknown";
  1308. if (state == FSR_STATE_FW_ENTERED)
  1309. dev_printk(level, sdev->dev, "status code: %#x (%s)\n", error_code,
  1310. error_text);
  1311. else
  1312. dev_printk(level, sdev->dev, "error code: %#x (%s)\n", error_code,
  1313. error_text);
  1314. }
  1315. EXPORT_SYMBOL_NS(hda_dsp_get_state, SND_SOC_SOF_INTEL_HDA_COMMON);
  1316. static void hda_dsp_get_registers(struct snd_sof_dev *sdev,
  1317. struct sof_ipc_dsp_oops_xtensa *xoops,
  1318. struct sof_ipc_panic_info *panic_info,
  1319. u32 *stack, size_t stack_words)
  1320. {
  1321. u32 offset = sdev->dsp_oops_offset;
  1322. /* first read registers */
  1323. sof_mailbox_read(sdev, offset, xoops, sizeof(*xoops));
  1324. /* note: variable AR register array is not read */
  1325. /* then get panic info */
  1326. if (xoops->arch_hdr.totalsize > EXCEPT_MAX_HDR_SIZE) {
  1327. dev_err(sdev->dev, "invalid header size 0x%x. FW oops is bogus\n",
  1328. xoops->arch_hdr.totalsize);
  1329. return;
  1330. }
  1331. offset += xoops->arch_hdr.totalsize;
  1332. sof_block_read(sdev, sdev->mmio_bar, offset,
  1333. panic_info, sizeof(*panic_info));
  1334. /* then get the stack */
  1335. offset += sizeof(*panic_info);
  1336. sof_block_read(sdev, sdev->mmio_bar, offset, stack,
  1337. stack_words * sizeof(u32));
  1338. }
  1339. /* dump the first 8 dwords representing the extended ROM status */
  1340. void hda_dsp_dump_ext_rom_status(struct snd_sof_dev *sdev, const char *level,
  1341. u32 flags)
  1342. {
  1343. const struct sof_intel_dsp_desc *chip;
  1344. char msg[128];
  1345. int len = 0;
  1346. u32 value;
  1347. int i;
  1348. chip = get_chip_info(sdev->pdata);
  1349. for (i = 0; i < HDA_EXT_ROM_STATUS_SIZE; i++) {
  1350. value = snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg + i * 0x4);
  1351. len += scnprintf(msg + len, sizeof(msg) - len, " 0x%x", value);
  1352. }
  1353. dev_printk(level, sdev->dev, "extended rom status: %s", msg);
  1354. }
  1355. void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags)
  1356. {
  1357. char *level = (flags & SOF_DBG_DUMP_OPTIONAL) ? KERN_DEBUG : KERN_ERR;
  1358. struct sof_ipc_dsp_oops_xtensa xoops;
  1359. struct sof_ipc_panic_info panic_info;
  1360. u32 stack[HDA_DSP_STACK_DUMP_SIZE];
  1361. /* print ROM/FW status */
  1362. hda_dsp_get_state(sdev, level);
  1363. /* The firmware register dump only available with IPC3 */
  1364. if (flags & SOF_DBG_DUMP_REGS && sdev->pdata->ipc_type == SOF_IPC_TYPE_3) {
  1365. u32 status = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_FW_STATUS);
  1366. u32 panic = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_FW_TRACEP);
  1367. hda_dsp_get_registers(sdev, &xoops, &panic_info, stack,
  1368. HDA_DSP_STACK_DUMP_SIZE);
  1369. sof_print_oops_and_stack(sdev, level, status, panic, &xoops,
  1370. &panic_info, stack, HDA_DSP_STACK_DUMP_SIZE);
  1371. } else {
  1372. hda_dsp_dump_ext_rom_status(sdev, level, flags);
  1373. }
  1374. }
  1375. EXPORT_SYMBOL_NS(hda_dsp_dump, SND_SOC_SOF_INTEL_HDA_COMMON);