1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
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.
6 // Copyright(c) 2018-2022 Intel Corporation. All rights reserved.
9 #include <linux/delay.h>
10 #include <linux/device.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/firmware.h>
14 #include <linux/interrupt.h>
16 #include <linux/module.h>
17 #include <linux/pci.h>
18 #include <linux/pm_runtime.h>
19 #include <linux/slab.h>
20 #include <sound/hdaudio_ext.h>
21 #include <sound/sof.h>
22 #include <sound/pcm_params.h>
24 #include "../sof-priv.h"
28 #define HDA_SKL_WAIT_TIMEOUT 500 /* 500 msec */
29 #define HDA_SKL_CLDMA_MAX_BUFFER_SIZE (32 * PAGE_SIZE)
32 #define HDA_CL_SD_CTL_SRST_SHIFT 0
33 #define HDA_CL_SD_CTL_SRST(x) (((x) & 0x1) << \
34 HDA_CL_SD_CTL_SRST_SHIFT)
37 #define HDA_CL_SD_CTL_RUN_SHIFT 1
38 #define HDA_CL_SD_CTL_RUN(x) (((x) & 0x1) << \
39 HDA_CL_SD_CTL_RUN_SHIFT)
41 /* Interrupt On Completion Enable */
42 #define HDA_CL_SD_CTL_IOCE_SHIFT 2
43 #define HDA_CL_SD_CTL_IOCE(x) (((x) & 0x1) << \
44 HDA_CL_SD_CTL_IOCE_SHIFT)
46 /* FIFO Error Interrupt Enable */
47 #define HDA_CL_SD_CTL_FEIE_SHIFT 3
48 #define HDA_CL_SD_CTL_FEIE(x) (((x) & 0x1) << \
49 HDA_CL_SD_CTL_FEIE_SHIFT)
51 /* Descriptor Error Interrupt Enable */
52 #define HDA_CL_SD_CTL_DEIE_SHIFT 4
53 #define HDA_CL_SD_CTL_DEIE(x) (((x) & 0x1) << \
54 HDA_CL_SD_CTL_DEIE_SHIFT)
56 /* FIFO Limit Change */
57 #define HDA_CL_SD_CTL_FIFOLC_SHIFT 5
58 #define HDA_CL_SD_CTL_FIFOLC(x) (((x) & 0x1) << \
59 HDA_CL_SD_CTL_FIFOLC_SHIFT)
62 #define HDA_CL_SD_CTL_STRIPE_SHIFT 16
63 #define HDA_CL_SD_CTL_STRIPE(x) (((x) & 0x3) << \
64 HDA_CL_SD_CTL_STRIPE_SHIFT)
66 /* Traffic Priority */
67 #define HDA_CL_SD_CTL_TP_SHIFT 18
68 #define HDA_CL_SD_CTL_TP(x) (((x) & 0x1) << \
69 HDA_CL_SD_CTL_TP_SHIFT)
71 /* Bidirectional Direction Control */
72 #define HDA_CL_SD_CTL_DIR_SHIFT 19
73 #define HDA_CL_SD_CTL_DIR(x) (((x) & 0x1) << \
74 HDA_CL_SD_CTL_DIR_SHIFT)
77 #define HDA_CL_SD_CTL_STRM_SHIFT 20
78 #define HDA_CL_SD_CTL_STRM(x) (((x) & 0xf) << \
79 HDA_CL_SD_CTL_STRM_SHIFT)
81 #define HDA_CL_SD_CTL_INT(x) \
82 (HDA_CL_SD_CTL_IOCE(x) | \
83 HDA_CL_SD_CTL_FEIE(x) | \
84 HDA_CL_SD_CTL_DEIE(x))
86 #define HDA_CL_SD_CTL_INT_MASK \
87 (HDA_CL_SD_CTL_IOCE(1) | \
88 HDA_CL_SD_CTL_FEIE(1) | \
89 HDA_CL_SD_CTL_DEIE(1))
91 #define DMA_ADDRESS_128_BITS_ALIGNMENT 7
92 #define BDL_ALIGN(x) ((x) >> DMA_ADDRESS_128_BITS_ALIGNMENT)
94 /* Buffer Descriptor List Lower Base Address */
95 #define HDA_CL_SD_BDLPLBA_SHIFT 7
96 #define HDA_CL_SD_BDLPLBA_MASK GENMASK(31, 7)
97 #define HDA_CL_SD_BDLPLBA(x) \
98 ((BDL_ALIGN(lower_32_bits(x)) << HDA_CL_SD_BDLPLBA_SHIFT) & \
99 HDA_CL_SD_BDLPLBA_MASK)
101 /* Buffer Descriptor List Upper Base Address */
102 #define HDA_CL_SD_BDLPUBA(x) \
105 /* Software Position in Buffer Enable */
106 #define HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT 0
107 #define HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK \
108 (1 << HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT)
110 #define HDA_CL_SPBFIFO_SPBFCCTL_SPIBE(x) \
111 (((x) << HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_SHIFT) & \
112 HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK)
114 #define HDA_CL_DMA_SD_INT_COMPLETE 0x4
116 static int cl_skl_cldma_setup_bdle(struct snd_sof_dev *sdev,
117 struct snd_dma_buffer *dmab_data,
118 __le32 **bdlp, int size, int with_ioc)
120 phys_addr_t addr = virt_to_phys(dmab_data->area);
124 * This code is simplified by using one fragment of physical memory and assuming
125 * all the code fits. This could be improved with scatter-gather but the firmware
126 * size is limited by DSP memory anyways
128 bdl[0] = cpu_to_le32(lower_32_bits(addr));
129 bdl[1] = cpu_to_le32(upper_32_bits(addr));
130 bdl[2] = cpu_to_le32(size);
131 bdl[3] = (!with_ioc) ? 0 : cpu_to_le32(0x01);
133 return 1; /* one fragment */
136 static void cl_skl_cldma_stream_run(struct snd_sof_dev *sdev, bool enable)
138 int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
141 u32 run = enable ? 0x1 : 0;
143 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
144 sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
145 HDA_CL_SD_CTL_RUN(1), HDA_CL_SD_CTL_RUN(run));
151 /* waiting for hardware to report the stream Run bit set */
152 val = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
153 sd_offset + SOF_HDA_ADSP_REG_SD_CTL);
154 val &= HDA_CL_SD_CTL_RUN(1);
157 else if (!enable && !val)
162 dev_err(sdev->dev, "%s: failed to set Run bit=%d enable=%d\n",
163 __func__, val, enable);
166 static void cl_skl_cldma_stream_clear(struct snd_sof_dev *sdev)
168 int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
170 /* make sure Run bit is cleared before setting stream register */
171 cl_skl_cldma_stream_run(sdev, 0);
173 /* Disable the Interrupt On Completion, FIFO Error Interrupt,
174 * Descriptor Error Interrupt and set the cldma stream number to 0.
176 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
177 sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
178 HDA_CL_SD_CTL_INT_MASK, HDA_CL_SD_CTL_INT(0));
179 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
180 sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
181 HDA_CL_SD_CTL_STRM(0xf), HDA_CL_SD_CTL_STRM(0));
183 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
184 sd_offset + SOF_HDA_ADSP_REG_SD_BDLPL, HDA_CL_SD_BDLPLBA(0));
185 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
186 sd_offset + SOF_HDA_ADSP_REG_SD_BDLPU, 0);
188 /* Set the Cyclic Buffer Length to 0. */
189 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
190 sd_offset + SOF_HDA_ADSP_REG_SD_CBL, 0);
191 /* Set the Last Valid Index. */
192 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
193 sd_offset + SOF_HDA_ADSP_REG_SD_LVI, 0);
196 static void cl_skl_cldma_setup_spb(struct snd_sof_dev *sdev,
197 unsigned int size, bool enable)
199 int sd_offset = SOF_DSP_REG_CL_SPBFIFO;
202 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
203 sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCCTL,
204 HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK,
205 HDA_CL_SPBFIFO_SPBFCCTL_SPIBE(1));
207 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
208 sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPIB, size);
211 static void cl_skl_cldma_set_intr(struct snd_sof_dev *sdev, bool enable)
213 u32 val = enable ? HDA_DSP_ADSPIC_CL_DMA : 0;
215 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
216 HDA_DSP_ADSPIC_CL_DMA, val);
219 static void cl_skl_cldma_cleanup_spb(struct snd_sof_dev *sdev)
221 int sd_offset = SOF_DSP_REG_CL_SPBFIFO;
223 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
224 sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCCTL,
225 HDA_CL_SPBFIFO_SPBFCCTL_SPIBE_MASK,
226 HDA_CL_SPBFIFO_SPBFCCTL_SPIBE(0));
228 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
229 sd_offset + SOF_HDA_ADSP_REG_CL_SPBFIFO_SPIB, 0);
232 static void cl_skl_cldma_setup_controller(struct snd_sof_dev *sdev,
233 struct snd_dma_buffer *dmab_bdl,
234 unsigned int max_size, u32 count)
236 int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
238 /* Clear the stream first and then set it. */
239 cl_skl_cldma_stream_clear(sdev);
241 /* setting the stream register */
242 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
243 sd_offset + SOF_HDA_ADSP_REG_SD_BDLPL,
244 HDA_CL_SD_BDLPLBA(dmab_bdl->addr));
245 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
246 sd_offset + SOF_HDA_ADSP_REG_SD_BDLPU,
247 HDA_CL_SD_BDLPUBA(dmab_bdl->addr));
249 /* Set the Cyclic Buffer Length. */
250 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
251 sd_offset + SOF_HDA_ADSP_REG_SD_CBL, max_size);
252 /* Set the Last Valid Index. */
253 snd_sof_dsp_write(sdev, HDA_DSP_BAR,
254 sd_offset + SOF_HDA_ADSP_REG_SD_LVI, count - 1);
256 /* Set the Interrupt On Completion, FIFO Error Interrupt,
257 * Descriptor Error Interrupt and the cldma stream number.
259 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
260 sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
261 HDA_CL_SD_CTL_INT_MASK, HDA_CL_SD_CTL_INT(1));
262 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR,
263 sd_offset + SOF_HDA_ADSP_REG_SD_CTL,
264 HDA_CL_SD_CTL_STRM(0xf),
265 HDA_CL_SD_CTL_STRM(1));
268 static int cl_stream_prepare_skl(struct snd_sof_dev *sdev,
269 struct snd_dma_buffer *dmab,
270 struct snd_dma_buffer *dmab_bdl)
273 unsigned int bufsize = HDA_SKL_CLDMA_MAX_BUFFER_SIZE;
278 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, bufsize, dmab);
280 dev_err(sdev->dev, "%s: failed to alloc fw buffer: %x\n", __func__, ret);
284 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, bufsize, dmab_bdl);
286 dev_err(sdev->dev, "%s: failed to alloc blde: %x\n", __func__, ret);
287 snd_dma_free_pages(dmab);
291 bdl = (__le32 *)dmab_bdl->area;
292 frags = cl_skl_cldma_setup_bdle(sdev, dmab, &bdl, bufsize, 1);
293 cl_skl_cldma_setup_controller(sdev, dmab_bdl, bufsize, frags);
298 static void cl_cleanup_skl(struct snd_sof_dev *sdev,
299 struct snd_dma_buffer *dmab,
300 struct snd_dma_buffer *dmab_bdl)
302 cl_skl_cldma_cleanup_spb(sdev);
303 cl_skl_cldma_stream_clear(sdev);
304 snd_dma_free_pages(dmab);
305 snd_dma_free_pages(dmab_bdl);
308 static int cl_dsp_init_skl(struct snd_sof_dev *sdev,
309 struct snd_dma_buffer *dmab,
310 struct snd_dma_buffer *dmab_bdl)
312 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
313 const struct sof_intel_dsp_desc *chip = hda->desc;
318 /* check if the init_core is already enabled, if yes, reset and make it run,
319 * if not, powerdown and enable it again.
321 if (hda_dsp_core_is_enabled(sdev, chip->init_core_mask)) {
322 /* if enabled, reset it, and run the init_core. */
323 ret = hda_dsp_core_stall_reset(sdev, chip->init_core_mask);
327 ret = hda_dsp_core_run(sdev, chip->init_core_mask);
329 dev_err(sdev->dev, "%s: dsp core start failed %d\n", __func__, ret);
333 /* if not enabled, power down it first and then powerup and run
336 ret = hda_dsp_core_reset_power_down(sdev, chip->init_core_mask);
338 dev_err(sdev->dev, "%s: dsp core0 disable fail: %d\n", __func__, ret);
341 ret = hda_dsp_enable_core(sdev, chip->init_core_mask);
343 dev_err(sdev->dev, "%s: dsp core0 enable fail: %d\n", __func__, ret);
348 /* prepare DMA for code loader stream */
349 ret = cl_stream_prepare_skl(sdev, dmab, dmab_bdl);
351 dev_err(sdev->dev, "%s: dma prepare fw loading err: %x\n", __func__, ret);
355 /* enable the interrupt */
356 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPIC,
357 HDA_DSP_ADSPIC_IPC, HDA_DSP_ADSPIC_IPC);
359 /* enable IPC DONE interrupt */
360 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
361 HDA_DSP_REG_HIPCCTL_DONE,
362 HDA_DSP_REG_HIPCCTL_DONE);
364 /* enable IPC BUSY interrupt */
365 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl,
366 HDA_DSP_REG_HIPCCTL_BUSY,
367 HDA_DSP_REG_HIPCCTL_BUSY);
369 /* polling the ROM init status information. */
370 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
371 chip->rom_status_reg, status,
372 (FSR_TO_STATE_CODE(status)
373 == FSR_STATE_INIT_DONE),
374 HDA_DSP_REG_POLL_INTERVAL_US,
375 chip->rom_init_timeout *
383 flags = SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX;
385 snd_sof_dsp_dbg_dump(sdev, "Boot failed\n", flags);
386 cl_cleanup_skl(sdev, dmab, dmab_bdl);
387 hda_dsp_core_reset_power_down(sdev, chip->init_core_mask);
391 static void cl_skl_cldma_fill_buffer(struct snd_sof_dev *sdev,
392 struct snd_dma_buffer *dmab,
393 unsigned int bufsize,
394 unsigned int copysize,
395 const void *curr_pos,
398 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
400 /* copy the image into the buffer with the maximum buffer size. */
401 unsigned int size = (bufsize == copysize) ? bufsize : copysize;
403 memcpy(dmab->area, curr_pos, size);
405 /* Set the wait condition for every load. */
406 hda->code_loading = 1;
408 /* Set the interrupt. */
410 cl_skl_cldma_set_intr(sdev, true);
413 cl_skl_cldma_setup_spb(sdev, size, true);
415 /* Trigger the code loading stream. */
416 cl_skl_cldma_stream_run(sdev, true);
419 static int cl_skl_cldma_wait_interruptible(struct snd_sof_dev *sdev,
422 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
423 const struct sof_intel_dsp_desc *chip = hda->desc;
424 int sd_offset = SOF_HDA_ADSP_LOADER_BASE;
425 u8 cl_dma_intr_status;
428 * Wait for CLDMA interrupt to inform the binary segment transfer is
431 if (!wait_event_timeout(hda->waitq, !hda->code_loading,
432 msecs_to_jiffies(HDA_SKL_WAIT_TIMEOUT))) {
433 dev_err(sdev->dev, "cldma copy timeout\n");
434 dev_err(sdev->dev, "ROM code=%#x: FW status=%#x\n",
435 snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_ROM_ERROR),
436 snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg));
440 /* now check DMA interrupt status */
441 cl_dma_intr_status = snd_sof_dsp_read(sdev, HDA_DSP_BAR,
442 sd_offset + SOF_HDA_ADSP_REG_SD_STS);
444 if (!(cl_dma_intr_status & HDA_CL_DMA_SD_INT_COMPLETE)) {
445 dev_err(sdev->dev, "cldma copy failed\n");
449 dev_dbg(sdev->dev, "cldma buffer copy complete\n");
454 cl_skl_cldma_copy_to_buf(struct snd_sof_dev *sdev,
455 struct snd_dma_buffer *dmab,
457 u32 total_size, u32 bufsize)
459 unsigned int bytes_left = total_size;
460 const void *curr_pos = bin;
466 while (bytes_left > 0) {
467 if (bytes_left > bufsize) {
468 dev_dbg(sdev->dev, "cldma copy %#x bytes\n", bufsize);
470 cl_skl_cldma_fill_buffer(sdev, dmab, bufsize, bufsize, curr_pos, true);
472 ret = cl_skl_cldma_wait_interruptible(sdev, false);
474 dev_err(sdev->dev, "%s: fw failed to load. %#x bytes remaining\n",
475 __func__, bytes_left);
479 bytes_left -= bufsize;
482 dev_dbg(sdev->dev, "cldma copy %#x bytes\n", bytes_left);
484 cl_skl_cldma_set_intr(sdev, false);
485 cl_skl_cldma_fill_buffer(sdev, dmab, bufsize, bytes_left, curr_pos, false);
493 static int cl_copy_fw_skl(struct snd_sof_dev *sdev,
494 struct snd_dma_buffer *dmab)
497 const struct firmware *fw = sdev->basefw.fw;
498 struct firmware stripped_firmware;
499 unsigned int bufsize = HDA_SKL_CLDMA_MAX_BUFFER_SIZE;
502 stripped_firmware.data = fw->data + sdev->basefw.payload_offset;
503 stripped_firmware.size = fw->size - sdev->basefw.payload_offset;
505 dev_dbg(sdev->dev, "firmware size: %#zx buffer size %#x\n", fw->size, bufsize);
507 ret = cl_skl_cldma_copy_to_buf(sdev, dmab, stripped_firmware.data,
508 stripped_firmware.size, bufsize);
510 dev_err(sdev->dev, "%s: fw copy failed %d\n", __func__, ret);
515 int hda_dsp_cl_boot_firmware_skl(struct snd_sof_dev *sdev)
517 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
518 const struct sof_intel_dsp_desc *chip = hda->desc;
519 struct snd_dma_buffer dmab_bdl;
520 struct snd_dma_buffer dmab;
525 ret = cl_dsp_init_skl(sdev, &dmab, &dmab_bdl);
527 /* retry enabling core and ROM load. seemed to help */
529 ret = cl_dsp_init_skl(sdev, &dmab, &dmab_bdl);
531 dev_err(sdev->dev, "Error code=%#x: FW status=%#x\n",
532 snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_SRAM_REG_ROM_ERROR),
533 snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg));
534 dev_err(sdev->dev, "Core En/ROM load fail:%d\n", ret);
539 dev_dbg(sdev->dev, "ROM init successful\n");
541 /* at this point DSP ROM has been initialized and should be ready for
542 * code loading and firmware boot
544 ret = cl_copy_fw_skl(sdev, &dmab);
546 dev_err(sdev->dev, "%s: load firmware failed : %d\n", __func__, ret);
550 ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
551 chip->rom_status_reg, reg,
552 (FSR_TO_STATE_CODE(reg)
553 == FSR_STATE_ROM_BASEFW_ENTERED),
554 HDA_DSP_REG_POLL_INTERVAL_US,
555 HDA_DSP_BASEFW_TIMEOUT_US);
557 dev_dbg(sdev->dev, "Firmware download successful, booting...\n");
559 cl_skl_cldma_stream_run(sdev, false);
560 cl_cleanup_skl(sdev, &dmab, &dmab_bdl);
563 return chip->init_core_mask;
568 flags = SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX;
570 snd_sof_dsp_dbg_dump(sdev, "Boot failed\n", flags);
573 hda_dsp_core_reset_power_down(sdev, chip->init_core_mask);
574 cl_skl_cldma_stream_run(sdev, false);
575 cl_cleanup_skl(sdev, &dmab, &dmab_bdl);
577 dev_err(sdev->dev, "%s: load fw failed err: %d\n", __func__, ret);