hda-loader-skl.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  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-2022 Intel Corporation
  7. //
  8. #include <linux/delay.h>
  9. #include <linux/device.h>
  10. #include <linux/dma-mapping.h>
  11. #include <linux/firmware.h>
  12. #include <linux/fs.h>
  13. #include <linux/interrupt.h>
  14. #include <linux/mm.h>
  15. #include <linux/module.h>
  16. #include <linux/pci.h>
  17. #include <linux/slab.h>
  18. #include <sound/hdaudio_ext.h>
  19. #include <sound/sof.h>
  20. #include <sound/pcm_params.h>
  21. #include "../sof-priv.h"
  22. #include "../ops.h"
  23. #include "hda.h"
  24. #define HDA_SKL_WAIT_TIMEOUT 500 /* 500 msec */
  25. #define HDA_SKL_CLDMA_MAX_BUFFER_SIZE (32 * PAGE_SIZE)
  26. /* Stream Reset */
  27. #define HDA_CL_SD_CTL_SRST_SHIFT 0
  28. #define HDA_CL_SD_CTL_SRST(x) (((x) & 0x1) << \
  29. HDA_CL_SD_CTL_SRST_SHIFT)
  30. /* Stream Run */
  31. #define HDA_CL_SD_CTL_RUN_SHIFT 1
  32. #define HDA_CL_SD_CTL_RUN(x) (((x) & 0x1) << \
  33. HDA_CL_SD_CTL_RUN_SHIFT)
  34. /* Interrupt On Completion Enable */
  35. #define HDA_CL_SD_CTL_IOCE_SHIFT 2
  36. #define HDA_CL_SD_CTL_IOCE(x) (((x) & 0x1) << \
  37. HDA_CL_SD_CTL_IOCE_SHIFT)
  38. /* FIFO Error Interrupt Enable */
  39. #define HDA_CL_SD_CTL_FEIE_SHIFT 3
  40. #define HDA_CL_SD_CTL_FEIE(x) (((x) & 0x1) << \
  41. HDA_CL_SD_CTL_FEIE_SHIFT)
  42. /* Descriptor Error Interrupt Enable */
  43. #define HDA_CL_SD_CTL_DEIE_SHIFT 4
  44. #define HDA_CL_SD_CTL_DEIE(x) (((x) & 0x1) << \
  45. HDA_CL_SD_CTL_DEIE_SHIFT)
  46. /* FIFO Limit Change */
  47. #define HDA_CL_SD_CTL_FIFOLC_SHIFT 5
  48. #define HDA_CL_SD_CTL_FIFOLC(x) (((x) & 0x1) << \
  49. HDA_CL_SD_CTL_FIFOLC_SHIFT)
  50. /* Stripe Control */
  51. #define HDA_CL_SD_CTL_STRIPE_SHIFT 16
  52. #define HDA_CL_SD_CTL_STRIPE(x) (((x) & 0x3) << \
  53. HDA_CL_SD_CTL_STRIPE_SHIFT)
  54. /* Traffic Priority */
  55. #define HDA_CL_SD_CTL_TP_SHIFT 18
  56. #define HDA_CL_SD_CTL_TP(x) (((x) & 0x1) << \
  57. HDA_CL_SD_CTL_TP_SHIFT)
  58. /* Bidirectional Direction Control */
  59. #define HDA_CL_SD_CTL_DIR_SHIFT 19
  60. #define HDA_CL_SD_CTL_DIR(x) (((x) & 0x1) << \
  61. HDA_CL_SD_CTL_DIR_SHIFT)
  62. /* Stream Number */
  63. #define HDA_CL_SD_CTL_STRM_SHIFT 20
  64. #define HDA_CL_SD_CTL_STRM(x) (((x) & 0xf) << \
  65. HDA_CL_SD_CTL_STRM_SHIFT)
  66. #define HDA_CL_SD_CTL_INT(x) \
  67. (HDA_CL_SD_CTL_IOCE(x) | \
  68. HDA_CL_SD_CTL_FEIE(x) | \
  69. HDA_CL_SD_CTL_DEIE(x))
  70. #define HDA_CL_SD_CTL_INT_MASK \
  71. (HDA_CL_SD_CTL_IOCE(1) | \
  72. HDA_CL_SD_CTL_FEIE(1) | \
  73. HDA_CL_SD_CTL_DEIE(1))
  74. #define DMA_ADDRESS_128_BITS_ALIGNMENT 7
  75. #define BDL_ALIGN(x) ((x) >> DMA_ADDRESS_128_BITS_ALIGNMENT)
  76. /* Buffer Descriptor List Lower Base Address */
  77. #define HDA_CL_SD_BDLPLBA_SHIFT 7
  78. #define HDA_CL_SD_BDLPLBA_MASK GENMASK(31, 7)
  79. #define HDA_CL_SD_BDLPLBA(x) \
  80. ((BDL_ALIGN(lower_32_bits(x)) << HDA_CL_SD_BDLPLBA_SHIFT) & \
  81. HDA_CL_SD_BDLPLBA_MASK)
  82. /* Buffer Descriptor List Upper Base Address */
  83. #define HDA_CL_SD_BDLPUBA(x) \
  84. (upper_32_bits(x))
  85. /* Software Position in Buffer Enable */
  86. #define HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT 0
  87. #define HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK \
  88. (1 << HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT)
  89. #define HDA_CL_SPBFIFO_SPBFCCTL_SPIBE(x) \
  90. (((x) << HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT) & \
  91. HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK)
  92. #define HDA_CL_DMA_SD_INT_COMPLETE 0x4
  93. static int cl_skl_cldma_setup_bdle(struct snd_sof_dev *sdev,
  94. struct snd_dma_buffer *dmab_data,
  95. __le32 **bdlp, int size, int with_ioc)
  96. {
  97. phys_addr_t addr = virt_to_phys(dmab_data->area);
  98. __le32 *bdl = *bdlp;
  99. /*
  100. * This code is simplified by using one fragment of physical memory and assuming
  101. * all the code fits. This could be improved with scatter-gather but the firmware
  102. * size is limited by DSP memory anyways
  103. */
  104. bdl[0] = cpu_to_le32(lower_32_bits(addr));
  105. bdl[1] = cpu_to_le32(upper_32_bits(addr));
  106. bdl[2] = cpu_to_le32(size);
  107. bdl[3] = (!with_ioc) ? 0 : cpu_to_le32(0x01);
  108. return 1; /* one fragment */
  109. }
  110. static void cl_skl_cldma_stream_run(struct snd_sof_dev *sdev, bool enable)
  111. {
  112. int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
  113. unsigned char val;
  114. int retries;
  115. u32 run = enable ? 0x1 : 0;
  116. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  117. sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
  118. HDA_CL_SD_CTL_RUN(1), HDA_CL_SD_CTL_RUN(run));
  119. retries = 300;
  120. do {
  121. udelay(3);
  122. /* waiting for hardware to report the stream Run bit set */
  123. val = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
  124. sd_offset + SOF_HDA_ADSP_REG_SD_CTL);
  125. val &= HDA_CL_SD_CTL_RUN(1);
  126. if (enable && val)
  127. break;
  128. else if (!enable && !val)
  129. break;
  130. } while (--retries);
  131. if (retries == 0)
  132. dev_err(sdev->dev, "%s: failed to set Run bit=%d enable=%d\n",
  133. __func__, val, enable);
  134. }
  135. static void cl_skl_cldma_stream_clear(struct snd_sof_dev *sdev)
  136. {
  137. int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
  138. /* make sure Run bit is cleared before setting stream register */
  139. cl_skl_cldma_stream_run(sdev, 0);
  140. /* Disable the Interrupt On Completion, FIFO Error Interrupt,
  141. * Descriptor Error Interrupt and set the cldma stream number to 0.
  142. */
  143. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  144. sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
  145. HDA_CL_SD_CTL_INT_MASK, HDA_CL_SD_CTL_INT(0));
  146. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  147. sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
  148. HDA_CL_SD_CTL_STRM(0xf), HDA_CL_SD_CTL_STRM(0));
  149. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  150. sd_offset + SOF_HDA_ADSP_REG_SD_BDLPL, HDA_CL_SD_BDLPLBA(0));
  151. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  152. sd_offset + SOF_HDA_ADSP_REG_SD_BDLPU, 0);
  153. /* Set the Cyclic Buffer Length to 0. */
  154. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  155. sd_offset + SOF_HDA_ADSP_REG_SD_CBL, 0);
  156. /* Set the Last Valid Index. */
  157. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  158. sd_offset + SOF_HDA_ADSP_REG_SD_LVI, 0);
  159. }
  160. static void cl_skl_cldma_setup_spb(struct snd_sof_dev *sdev,
  161. unsigned int size, bool enable)
  162. {
  163. int sd_offset = SOF_DSP_REG_CL_SPBFIFO;
  164. if (enable)
  165. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  166. sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCCTL,
  167. HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK,
  168. HDA_CL_SPBFIFO_SPBFCCTL_SPIBE(1));
  169. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  170. sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPIB, size);
  171. }
  172. static void cl_skl_cldma_set_intr(struct snd_sof_dev *sdev, bool enable)
  173. {
  174. u32 val = enable ? HDA_DSP_ADSPIC_CL_DMA : 0;
  175. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
  176. HDA_DSP_ADSPIC_CL_DMA, val);
  177. }
  178. static void cl_skl_cldma_cleanup_spb(struct snd_sof_dev *sdev)
  179. {
  180. int sd_offset = SOF_DSP_REG_CL_SPBFIFO;
  181. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  182. sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCCTL,
  183. HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK,
  184. HDA_CL_SPBFIFO_SPBFCCTL_SPIBE(0));
  185. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  186. sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPIB, 0);
  187. }
  188. static void cl_skl_cldma_setup_controller(struct snd_sof_dev *sdev,
  189. struct snd_dma_buffer *dmab_bdl,
  190. unsigned int max_size, u32 count)
  191. {
  192. int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
  193. /* Clear the stream first and then set it. */
  194. cl_skl_cldma_stream_clear(sdev);
  195. /* setting the stream register */
  196. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  197. sd_offset + SOF_HDA_ADSP_REG_SD_BDLPL,
  198. HDA_CL_SD_BDLPLBA(dmab_bdl->addr));
  199. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  200. sd_offset + SOF_HDA_ADSP_REG_SD_BDLPU,
  201. HDA_CL_SD_BDLPUBA(dmab_bdl->addr));
  202. /* Set the Cyclic Buffer Length. */
  203. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  204. sd_offset + SOF_HDA_ADSP_REG_SD_CBL, max_size);
  205. /* Set the Last Valid Index. */
  206. snd_sof_dsp_write(sdev, HDA_DSP_BAR,
  207. sd_offset + SOF_HDA_ADSP_REG_SD_LVI, count - 1);
  208. /* Set the Interrupt On Completion, FIFO Error Interrupt,
  209. * Descriptor Error Interrupt and the cldma stream number.
  210. */
  211. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  212. sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
  213. HDA_CL_SD_CTL_INT_MASK, HDA_CL_SD_CTL_INT(1));
  214. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
  215. sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
  216. HDA_CL_SD_CTL_STRM(0xf),
  217. HDA_CL_SD_CTL_STRM(1));
  218. }
  219. static int cl_stream_prepare_skl(struct snd_sof_dev *sdev,
  220. struct snd_dma_buffer *dmab,
  221. struct snd_dma_buffer *dmab_bdl)
  222. {
  223. unsigned int bufsize = HDA_SKL_CLDMA_MAX_BUFFER_SIZE;
  224. __le32 *bdl;
  225. int frags;
  226. int ret;
  227. ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, bufsize, dmab);
  228. if (ret < 0) {
  229. dev_err(sdev->dev, "%s: failed to alloc fw buffer: %x\n", __func__, ret);
  230. return ret;
  231. }
  232. ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, bufsize, dmab_bdl);
  233. if (ret < 0) {
  234. dev_err(sdev->dev, "%s: failed to alloc blde: %x\n", __func__, ret);
  235. snd_dma_free_pages(dmab);
  236. return ret;
  237. }
  238. bdl = (__le32 *)dmab_bdl->area;
  239. frags = cl_skl_cldma_setup_bdle(sdev, dmab, &bdl, bufsize, 1);
  240. cl_skl_cldma_setup_controller(sdev, dmab_bdl, bufsize, frags);
  241. return ret;
  242. }
  243. static void cl_cleanup_skl(struct snd_sof_dev *sdev,
  244. struct snd_dma_buffer *dmab,
  245. struct snd_dma_buffer *dmab_bdl)
  246. {
  247. cl_skl_cldma_cleanup_spb(sdev);
  248. cl_skl_cldma_stream_clear(sdev);
  249. snd_dma_free_pages(dmab);
  250. snd_dma_free_pages(dmab_bdl);
  251. }
  252. static int cl_dsp_init_skl(struct snd_sof_dev *sdev,
  253. struct snd_dma_buffer *dmab,
  254. struct snd_dma_buffer *dmab_bdl)
  255. {
  256. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  257. const struct sof_intel_dsp_desc *chip = hda->desc;
  258. unsigned int status;
  259. u32 flags;
  260. int ret;
  261. /* check if the init_core is already enabled, if yes, reset and make it run,
  262. * if not, powerdown and enable it again.
  263. */
  264. if (hda_dsp_core_is_enabled(sdev, chip->init_core_mask)) {
  265. /* if enabled, reset it, and run the init_core. */
  266. ret = hda_dsp_core_stall_reset(sdev, chip->init_core_mask);
  267. if (ret < 0)
  268. goto err;
  269. ret = hda_dsp_core_run(sdev, chip->init_core_mask);
  270. if (ret < 0) {
  271. dev_err(sdev->dev, "%s: dsp core start failed %d\n", __func__, ret);
  272. goto err;
  273. }
  274. } else {
  275. /* if not enabled, power down it first and then powerup and run
  276. * the init_core.
  277. */
  278. ret = hda_dsp_core_reset_power_down(sdev, chip->init_core_mask);
  279. if (ret < 0) {
  280. dev_err(sdev->dev, "%s: dsp core0 disable fail: %d\n", __func__, ret);
  281. goto err;
  282. }
  283. ret = hda_dsp_enable_core(sdev, chip->init_core_mask);
  284. if (ret < 0) {
  285. dev_err(sdev->dev, "%s: dsp core0 enable fail: %d\n", __func__, ret);
  286. goto err;
  287. }
  288. }
  289. /* prepare DMA for code loader stream */
  290. ret = cl_stream_prepare_skl(sdev, dmab, dmab_bdl);
  291. if (ret < 0) {
  292. dev_err(sdev->dev, "%s: dma prepare fw loading err: %x\n", __func__, ret);
  293. return ret;
  294. }
  295. /* enable the interrupt */
  296. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
  297. HDA_DSP_ADSPIC_IPC, HDA_DSP_ADSPIC_IPC);
  298. /* enable IPC DONE interrupt */
  299. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
  300. HDA_DSP_REG_HIPCCTL_DONE,
  301. HDA_DSP_REG_HIPCCTL_DONE);
  302. /* enable IPC BUSY interrupt */
  303. snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
  304. HDA_DSP_REG_HIPCCTL_BUSY,
  305. HDA_DSP_REG_HIPCCTL_BUSY);
  306. /* polling the ROM init status information. */
  307. ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
  308. chip->rom_status_reg, status,
  309. (FSR_TO_STATE_CODE(status)
  310. == FSR_STATE_INIT_DONE),
  311. HDA_DSP_REG_POLL_INTERVAL_US,
  312. chip->rom_init_timeout *
  313. USEC_PER_MSEC);
  314. if (ret < 0)
  315. goto err;
  316. return ret;
  317. err:
  318. flags = SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX;
  319. snd_sof_dsp_dbg_dump(sdev, "Boot failed\n", flags);
  320. cl_cleanup_skl(sdev, dmab, dmab_bdl);
  321. hda_dsp_core_reset_power_down(sdev, chip->init_core_mask);
  322. return ret;
  323. }
  324. static void cl_skl_cldma_fill_buffer(struct snd_sof_dev *sdev,
  325. struct snd_dma_buffer *dmab,
  326. unsigned int bufsize,
  327. unsigned int copysize,
  328. const void *curr_pos,
  329. bool intr_enable)
  330. {
  331. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  332. /* copy the image into the buffer with the maximum buffer size. */
  333. unsigned int size = (bufsize == copysize) ? bufsize : copysize;
  334. memcpy(dmab->area, curr_pos, size);
  335. /* Set the wait condition for every load. */
  336. hda->code_loading = 1;
  337. /* Set the interrupt. */
  338. if (intr_enable)
  339. cl_skl_cldma_set_intr(sdev, true);
  340. /* Set the SPB. */
  341. cl_skl_cldma_setup_spb(sdev, size, true);
  342. /* Trigger the code loading stream. */
  343. cl_skl_cldma_stream_run(sdev, true);
  344. }
  345. static int cl_skl_cldma_wait_interruptible(struct snd_sof_dev *sdev,
  346. bool intr_wait)
  347. {
  348. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  349. const struct sof_intel_dsp_desc *chip = hda->desc;
  350. int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
  351. u8 cl_dma_intr_status;
  352. /*
  353. * Wait for CLDMA interrupt to inform the binary segment transfer is
  354. * complete.
  355. */
  356. if (!wait_event_timeout(hda->waitq, !hda->code_loading,
  357. msecs_to_jiffies(HDA_SKL_WAIT_TIMEOUT))) {
  358. dev_err(sdev->dev, "cldma copy timeout\n");
  359. dev_err(sdev->dev, "ROM code=%#x: FW status=%#x\n",
  360. snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_ROM_ERROR),
  361. snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg));
  362. return -EIO;
  363. }
  364. /* now check DMA interrupt status */
  365. cl_dma_intr_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
  366. sd_offset + SOF_HDA_ADSP_REG_SD_STS);
  367. if (!(cl_dma_intr_status & HDA_CL_DMA_SD_INT_COMPLETE)) {
  368. dev_err(sdev->dev, "cldma copy failed\n");
  369. return -EIO;
  370. }
  371. dev_dbg(sdev->dev, "cldma buffer copy complete\n");
  372. return 0;
  373. }
  374. static int
  375. cl_skl_cldma_copy_to_buf(struct snd_sof_dev *sdev,
  376. struct snd_dma_buffer *dmab,
  377. const void *bin,
  378. u32 total_size, u32 bufsize)
  379. {
  380. unsigned int bytes_left = total_size;
  381. const void *curr_pos = bin;
  382. int ret;
  383. if (total_size <= 0)
  384. return -EINVAL;
  385. while (bytes_left > 0) {
  386. if (bytes_left > bufsize) {
  387. dev_dbg(sdev->dev, "cldma copy %#x bytes\n", bufsize);
  388. cl_skl_cldma_fill_buffer(sdev, dmab, bufsize, bufsize, curr_pos, true);
  389. ret = cl_skl_cldma_wait_interruptible(sdev, false);
  390. if (ret < 0) {
  391. dev_err(sdev->dev, "%s: fw failed to load. %#x bytes remaining\n",
  392. __func__, bytes_left);
  393. return ret;
  394. }
  395. bytes_left -= bufsize;
  396. curr_pos += bufsize;
  397. } else {
  398. dev_dbg(sdev->dev, "cldma copy %#x bytes\n", bytes_left);
  399. cl_skl_cldma_set_intr(sdev, false);
  400. cl_skl_cldma_fill_buffer(sdev, dmab, bufsize, bytes_left, curr_pos, false);
  401. return 0;
  402. }
  403. }
  404. return bytes_left;
  405. }
  406. static int cl_copy_fw_skl(struct snd_sof_dev *sdev,
  407. struct snd_dma_buffer *dmab)
  408. {
  409. const struct firmware *fw = sdev->basefw.fw;
  410. struct firmware stripped_firmware;
  411. unsigned int bufsize = HDA_SKL_CLDMA_MAX_BUFFER_SIZE;
  412. int ret;
  413. stripped_firmware.data = fw->data + sdev->basefw.payload_offset;
  414. stripped_firmware.size = fw->size - sdev->basefw.payload_offset;
  415. dev_dbg(sdev->dev, "firmware size: %#zx buffer size %#x\n", fw->size, bufsize);
  416. ret = cl_skl_cldma_copy_to_buf(sdev, dmab, stripped_firmware.data,
  417. stripped_firmware.size, bufsize);
  418. if (ret < 0)
  419. dev_err(sdev->dev, "%s: fw copy failed %d\n", __func__, ret);
  420. return ret;
  421. }
  422. int hda_dsp_cl_boot_firmware_skl(struct snd_sof_dev *sdev)
  423. {
  424. struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
  425. const struct sof_intel_dsp_desc *chip = hda->desc;
  426. struct snd_dma_buffer dmab_bdl;
  427. struct snd_dma_buffer dmab;
  428. unsigned int reg;
  429. u32 flags;
  430. int ret;
  431. ret = cl_dsp_init_skl(sdev, &dmab, &dmab_bdl);
  432. /* retry enabling core and ROM load. seemed to help */
  433. if (ret < 0) {
  434. ret = cl_dsp_init_skl(sdev, &dmab, &dmab_bdl);
  435. if (ret < 0) {
  436. dev_err(sdev->dev, "Error code=%#x: FW status=%#x\n",
  437. snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_ROM_ERROR),
  438. snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg));
  439. dev_err(sdev->dev, "Core En/ROM load fail:%d\n", ret);
  440. return ret;
  441. }
  442. }
  443. dev_dbg(sdev->dev, "ROM init successful\n");
  444. /* at this point DSP ROM has been initialized and should be ready for
  445. * code loading and firmware boot
  446. */
  447. ret = cl_copy_fw_skl(sdev, &dmab);
  448. if (ret < 0) {
  449. dev_err(sdev->dev, "%s: load firmware failed : %d\n", __func__, ret);
  450. goto err;
  451. }
  452. ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
  453. chip->rom_status_reg, reg,
  454. (FSR_TO_STATE_CODE(reg)
  455. == FSR_STATE_ROM_BASEFW_ENTERED),
  456. HDA_DSP_REG_POLL_INTERVAL_US,
  457. HDA_DSP_BASEFW_TIMEOUT_US);
  458. dev_dbg(sdev->dev, "Firmware download successful, booting...\n");
  459. cl_skl_cldma_stream_run(sdev, false);
  460. cl_cleanup_skl(sdev, &dmab, &dmab_bdl);
  461. if (!ret)
  462. return chip->init_core_mask;
  463. return ret;
  464. err:
  465. flags = SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX;
  466. snd_sof_dsp_dbg_dump(sdev, "Boot failed\n", flags);
  467. /* power down DSP */
  468. hda_dsp_core_reset_power_down(sdev, chip->init_core_mask);
  469. cl_skl_cldma_stream_run(sdev, false);
  470. cl_cleanup_skl(sdev, &dmab, &dmab_bdl);
  471. dev_err(sdev->dev, "%s: load fw failed err: %d\n", __func__, ret);
  472. return ret;
  473. }