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 Intel Corporation. All rights reserved.
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>
15 * Hardware interface for HDA DSP code loader
18 #include <linux/firmware.h>
19 #include <sound/hdaudio_ext.h>
20 #include <sound/hda_register.h>
21 #include <sound/sof.h>
22 #include "ext_manifest.h"
26 #define HDA_FW_BOOT_ATTEMPTS 3
27 #define HDA_CL_STREAM_FORMAT 0x40
29 static struct hdac_ext_stream
*cl_stream_prepare(struct snd_sof_dev
*sdev
, unsigned int format
,
30 unsigned int size
, struct snd_dma_buffer
*dmab
,
33 struct hdac_ext_stream
*dsp_stream
;
34 struct hdac_stream
*hstream
;
35 struct pci_dev
*pci
= to_pci_dev(sdev
->dev
);
38 dsp_stream
= hda_dsp_stream_get(sdev
, direction
);
41 dev_err(sdev
->dev
, "error: no stream available\n");
42 return ERR_PTR(-ENODEV
);
44 hstream
= &dsp_stream
->hstream
;
45 hstream
->substream
= NULL
;
47 /* allocate DMA buffer */
48 ret
= snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG
, &pci
->dev
, size
, dmab
);
50 dev_err(sdev
->dev
, "error: memory alloc failed: %x\n", ret
);
54 hstream
->period_bytes
= 0;/* initialize period_bytes */
55 hstream
->format_val
= format
;
56 hstream
->bufsize
= size
;
58 if (direction
== SNDRV_PCM_STREAM_CAPTURE
) {
59 ret
= hda_dsp_iccmax_stream_hw_params(sdev
, dsp_stream
, dmab
, NULL
);
61 dev_err(sdev
->dev
, "error: iccmax stream prepare failed: %x\n", ret
);
65 ret
= hda_dsp_stream_hw_params(sdev
, dsp_stream
, dmab
, NULL
);
67 dev_err(sdev
->dev
, "error: hdac prepare failed: %x\n", ret
);
70 hda_dsp_stream_spib_config(sdev
, dsp_stream
, HDA_DSP_SPIB_ENABLE
, size
);
76 hda_dsp_stream_put(sdev
, direction
, hstream
->stream_tag
);
77 snd_dma_free_pages(dmab
);
82 * first boot sequence has some extra steps. core 0 waits for power
83 * status on core 1, so power up core 1 also momentarily, keep it in
84 * reset/stall and then turn it off
86 static int cl_dsp_init(struct snd_sof_dev
*sdev
, int stream_tag
)
88 struct sof_intel_hda_dev
*hda
= sdev
->pdata
->hw_pdata
;
89 const struct sof_intel_dsp_desc
*chip
= hda
->desc
;
95 /* step 1: power up corex */
96 ret
= hda_dsp_core_power_up(sdev
, chip
->host_managed_cores_mask
);
98 if (hda
->boot_iteration
== HDA_FW_BOOT_ATTEMPTS
)
99 dev_err(sdev
->dev
, "error: dsp core 0/1 power up failed\n");
103 /* DSP is powered up, set all SSPs to slave mode */
104 for (i
= 0; i
< chip
->ssp_count
; i
++) {
105 snd_sof_dsp_update_bits_unlocked(sdev
, HDA_DSP_BAR
,
106 chip
->ssp_base_offset
107 + i
* SSP_DEV_MEM_SIZE
113 /* step 2: purge FW request */
114 snd_sof_dsp_write(sdev
, HDA_DSP_BAR
, chip
->ipc_req
,
115 chip
->ipc_req_mask
| (HDA_DSP_IPC_PURGE_FW
|
116 ((stream_tag
- 1) << 9)));
118 /* step 3: unset core 0 reset state & unstall/run core 0 */
119 ret
= hda_dsp_core_run(sdev
, BIT(0));
121 if (hda
->boot_iteration
== HDA_FW_BOOT_ATTEMPTS
)
123 "error: dsp core start failed %d\n", ret
);
128 /* step 4: wait for IPC DONE bit from ROM */
129 ret
= snd_sof_dsp_read_poll_timeout(sdev
, HDA_DSP_BAR
,
130 chip
->ipc_ack
, status
,
131 ((status
& chip
->ipc_ack_mask
)
132 == chip
->ipc_ack_mask
),
133 HDA_DSP_REG_POLL_INTERVAL_US
,
134 HDA_DSP_INIT_TIMEOUT_US
);
137 if (hda
->boot_iteration
== HDA_FW_BOOT_ATTEMPTS
)
139 "error: %s: timeout for HIPCIE done\n",
144 /* set DONE bit to clear the reply IPC message */
145 snd_sof_dsp_update_bits_forced(sdev
, HDA_DSP_BAR
,
150 /* step 5: power down corex */
151 ret
= hda_dsp_core_power_down(sdev
, chip
->host_managed_cores_mask
& ~(BIT(0)));
153 if (hda
->boot_iteration
== HDA_FW_BOOT_ATTEMPTS
)
155 "error: dsp core x power down failed\n");
159 /* step 6: enable IPC interrupts */
160 hda_dsp_ipc_int_enable(sdev
);
162 /* step 7: wait for ROM init */
163 ret
= snd_sof_dsp_read_poll_timeout(sdev
, HDA_DSP_BAR
,
164 HDA_DSP_SRAM_REG_ROM_STATUS
, status
,
165 ((status
& HDA_DSP_ROM_STS_MASK
)
166 == HDA_DSP_ROM_INIT
),
167 HDA_DSP_REG_POLL_INTERVAL_US
,
168 chip
->rom_init_timeout
*
173 if (hda
->boot_iteration
== HDA_FW_BOOT_ATTEMPTS
)
175 "error: %s: timeout HDA_DSP_SRAM_REG_ROM_STATUS read\n",
179 flags
= SOF_DBG_DUMP_REGS
| SOF_DBG_DUMP_PCI
| SOF_DBG_DUMP_MBOX
;
181 /* force error log level after max boot attempts */
182 if (hda
->boot_iteration
== HDA_FW_BOOT_ATTEMPTS
)
183 flags
|= SOF_DBG_DUMP_FORCE_ERR_LEVEL
;
185 hda_dsp_dump(sdev
, flags
);
186 hda_dsp_core_reset_power_down(sdev
, chip
->host_managed_cores_mask
);
191 static int cl_trigger(struct snd_sof_dev
*sdev
,
192 struct hdac_ext_stream
*stream
, int cmd
)
194 struct hdac_stream
*hstream
= &stream
->hstream
;
195 int sd_offset
= SOF_STREAM_SD_OFFSET(hstream
);
197 /* code loader is special case that reuses stream ops */
199 case SNDRV_PCM_TRIGGER_START
:
200 snd_sof_dsp_update_bits(sdev
, HDA_DSP_HDA_BAR
, SOF_HDA_INTCTL
,
202 1 << hstream
->index
);
204 snd_sof_dsp_update_bits(sdev
, HDA_DSP_HDA_BAR
,
206 SOF_HDA_SD_CTL_DMA_START
|
207 SOF_HDA_CL_DMA_SD_INT_MASK
,
208 SOF_HDA_SD_CTL_DMA_START
|
209 SOF_HDA_CL_DMA_SD_INT_MASK
);
211 hstream
->running
= true;
214 return hda_dsp_stream_trigger(sdev
, stream
, cmd
);
218 static int cl_cleanup(struct snd_sof_dev
*sdev
, struct snd_dma_buffer
*dmab
,
219 struct hdac_ext_stream
*stream
)
221 struct hdac_stream
*hstream
= &stream
->hstream
;
222 int sd_offset
= SOF_STREAM_SD_OFFSET(hstream
);
225 if (hstream
->direction
== SNDRV_PCM_STREAM_PLAYBACK
)
226 ret
= hda_dsp_stream_spib_config(sdev
, stream
, HDA_DSP_SPIB_DISABLE
, 0);
228 snd_sof_dsp_update_bits(sdev
, HDA_DSP_HDA_BAR
, sd_offset
,
229 SOF_HDA_SD_CTL_DMA_START
, 0);
231 hda_dsp_stream_put(sdev
, hstream
->direction
, hstream
->stream_tag
);
232 hstream
->running
= 0;
233 hstream
->substream
= NULL
;
235 /* reset BDL address */
236 snd_sof_dsp_write(sdev
, HDA_DSP_HDA_BAR
,
237 sd_offset
+ SOF_HDA_ADSP_REG_CL_SD_BDLPL
, 0);
238 snd_sof_dsp_write(sdev
, HDA_DSP_HDA_BAR
,
239 sd_offset
+ SOF_HDA_ADSP_REG_CL_SD_BDLPU
, 0);
241 snd_sof_dsp_write(sdev
, HDA_DSP_HDA_BAR
, sd_offset
, 0);
242 snd_dma_free_pages(dmab
);
244 hstream
->bufsize
= 0;
245 hstream
->format_val
= 0;
250 static int cl_copy_fw(struct snd_sof_dev
*sdev
, struct hdac_ext_stream
*stream
)
255 ret
= cl_trigger(sdev
, stream
, SNDRV_PCM_TRIGGER_START
);
257 dev_err(sdev
->dev
, "error: DMA trigger start failed\n");
261 status
= snd_sof_dsp_read_poll_timeout(sdev
, HDA_DSP_BAR
,
262 HDA_DSP_SRAM_REG_ROM_STATUS
, reg
,
263 ((reg
& HDA_DSP_ROM_STS_MASK
)
264 == HDA_DSP_ROM_FW_ENTERED
),
265 HDA_DSP_REG_POLL_INTERVAL_US
,
266 HDA_DSP_BASEFW_TIMEOUT_US
);
269 * even in case of errors we still need to stop the DMAs,
270 * but we return the initial error should the DMA stop also fail
275 "error: %s: timeout HDA_DSP_SRAM_REG_ROM_STATUS read\n",
279 ret
= cl_trigger(sdev
, stream
, SNDRV_PCM_TRIGGER_STOP
);
281 dev_err(sdev
->dev
, "error: DMA trigger stop failed\n");
289 int hda_dsp_cl_boot_firmware_iccmax(struct snd_sof_dev
*sdev
)
291 struct snd_sof_pdata
*plat_data
= sdev
->pdata
;
292 struct hdac_ext_stream
*iccmax_stream
;
293 struct hdac_bus
*bus
= sof_to_bus(sdev
);
294 struct firmware stripped_firmware
;
298 /* save the original LTRP guardband value */
299 original_gb
= snd_hdac_chip_readb(bus
, VS_LTRP
) & HDA_VS_INTEL_LTRP_GB_MASK
;
301 if (plat_data
->fw
->size
<= plat_data
->fw_offset
) {
302 dev_err(sdev
->dev
, "error: firmware size must be greater than firmware offset\n");
306 stripped_firmware
.size
= plat_data
->fw
->size
- plat_data
->fw_offset
;
308 /* prepare capture stream for ICCMAX */
309 iccmax_stream
= cl_stream_prepare(sdev
, HDA_CL_STREAM_FORMAT
, stripped_firmware
.size
,
310 &sdev
->dmab_bdl
, SNDRV_PCM_STREAM_CAPTURE
);
311 if (IS_ERR(iccmax_stream
)) {
312 dev_err(sdev
->dev
, "error: dma prepare for ICCMAX stream failed\n");
313 return PTR_ERR(iccmax_stream
);
316 ret
= hda_dsp_cl_boot_firmware(sdev
);
319 * Perform iccmax stream cleanup. This should be done even if firmware loading fails.
320 * If the cleanup also fails, we return the initial error
322 ret1
= cl_cleanup(sdev
, &sdev
->dmab_bdl
, iccmax_stream
);
324 dev_err(sdev
->dev
, "error: ICCMAX stream cleanup failed\n");
326 /* set return value to indicate cleanup failure */
331 /* restore the original guardband value after FW boot */
332 snd_hdac_chip_updateb(bus
, VS_LTRP
, HDA_VS_INTEL_LTRP_GB_MASK
, original_gb
);
337 int hda_dsp_cl_boot_firmware(struct snd_sof_dev
*sdev
)
339 struct sof_intel_hda_dev
*hda
= sdev
->pdata
->hw_pdata
;
340 struct snd_sof_pdata
*plat_data
= sdev
->pdata
;
341 const struct sof_dev_desc
*desc
= plat_data
->desc
;
342 const struct sof_intel_dsp_desc
*chip_info
;
343 struct hdac_ext_stream
*stream
;
344 struct firmware stripped_firmware
;
347 chip_info
= desc
->chip_info
;
349 if (plat_data
->fw
->size
<= plat_data
->fw_offset
) {
350 dev_err(sdev
->dev
, "error: firmware size must be greater than firmware offset\n");
354 stripped_firmware
.data
= plat_data
->fw
->data
+ plat_data
->fw_offset
;
355 stripped_firmware
.size
= plat_data
->fw
->size
- plat_data
->fw_offset
;
357 /* init for booting wait */
358 init_waitqueue_head(&sdev
->boot_wait
);
360 /* prepare DMA for code loader stream */
361 stream
= cl_stream_prepare(sdev
, HDA_CL_STREAM_FORMAT
, stripped_firmware
.size
,
362 &sdev
->dmab
, SNDRV_PCM_STREAM_PLAYBACK
);
363 if (IS_ERR(stream
)) {
364 dev_err(sdev
->dev
, "error: dma prepare for fw loading failed\n");
365 return PTR_ERR(stream
);
368 memcpy(sdev
->dmab
.area
, stripped_firmware
.data
,
369 stripped_firmware
.size
);
371 /* try ROM init a few times before giving up */
372 for (i
= 0; i
< HDA_FW_BOOT_ATTEMPTS
; i
++) {
374 "Attempting iteration %d of Core En/ROM load...\n", i
);
376 hda
->boot_iteration
= i
+ 1;
377 ret
= cl_dsp_init(sdev
, stream
->hstream
.stream_tag
);
379 /* don't retry anymore if successful */
384 if (i
== HDA_FW_BOOT_ATTEMPTS
) {
385 dev_err(sdev
->dev
, "error: dsp init failed after %d attempts with err: %d\n",
387 dev_err(sdev
->dev
, "ROM error=0x%x: FW status=0x%x\n",
388 snd_sof_dsp_read(sdev
, HDA_DSP_BAR
,
389 HDA_DSP_SRAM_REG_ROM_ERROR
),
390 snd_sof_dsp_read(sdev
, HDA_DSP_BAR
,
391 HDA_DSP_SRAM_REG_ROM_STATUS
));
396 * When a SoundWire link is in clock stop state, a Slave
397 * device may trigger in-band wakes for events such as jack
398 * insertion or acoustic event detection. This event will lead
399 * to a WAKEEN interrupt, handled by the PCI device and routed
400 * to PME if the PCI device is in D3. The resume function in
401 * audio PCI driver will be invoked by ACPI for PME event and
402 * initialize the device and process WAKEEN interrupt.
404 * The WAKEEN interrupt should be processed ASAP to prevent an
405 * interrupt flood, otherwise other interrupts, such IPC,
406 * cannot work normally. The WAKEEN is handled after the ROM
407 * is initialized successfully, which ensures power rails are
408 * enabled before accessing the SoundWire SHIM registers
410 if (!sdev
->first_boot
)
411 hda_sdw_process_wakeen(sdev
);
414 * at this point DSP ROM has been initialized and
415 * should be ready for code loading and firmware boot
417 ret
= cl_copy_fw(sdev
, stream
);
419 dev_dbg(sdev
->dev
, "Firmware download successful, booting...\n");
421 hda_dsp_dump(sdev
, SOF_DBG_DUMP_REGS
| SOF_DBG_DUMP_PCI
| SOF_DBG_DUMP_MBOX
|
422 SOF_DBG_DUMP_FORCE_ERR_LEVEL
);
423 dev_err(sdev
->dev
, "error: load fw failed ret: %d\n", ret
);
428 * Perform codeloader stream cleanup.
429 * This should be done even if firmware loading fails.
430 * If the cleanup also fails, we return the initial error
432 ret1
= cl_cleanup(sdev
, &sdev
->dmab
, stream
);
434 dev_err(sdev
->dev
, "error: Code loader DSP cleanup failed\n");
436 /* set return value to indicate cleanup failure */
442 * return primary core id if both fw copy
443 * and stream clean up are successful
446 return chip_info
->init_core_mask
;
449 snd_sof_dsp_update_bits(sdev
, HDA_DSP_PP_BAR
,
450 SOF_HDA_REG_PP_PPCTL
,
451 SOF_HDA_PPCTL_GPROCEN
, 0);
455 /* pre fw run operations */
456 int hda_dsp_pre_fw_run(struct snd_sof_dev
*sdev
)
458 /* disable clock gating and power gating */
459 return hda_dsp_ctrl_clock_power_gating(sdev
, false);
462 /* post fw run operations */
463 int hda_dsp_post_fw_run(struct snd_sof_dev
*sdev
)
467 if (sdev
->first_boot
) {
468 ret
= hda_sdw_startup(sdev
);
471 "error: could not startup SoundWire links\n");
476 hda_sdw_int_enable(sdev
, true);
478 /* re-enable clock gating and power gating */
479 return hda_dsp_ctrl_clock_power_gating(sdev
, true);
483 * post fw run operations for ICL,
484 * Core 3 will be powered up and in stall when HPRO is enabled
486 int hda_dsp_post_fw_run_icl(struct snd_sof_dev
*sdev
)
488 struct sof_intel_hda_dev
*hda
= sdev
->pdata
->hw_pdata
;
491 if (sdev
->first_boot
) {
492 ret
= hda_sdw_startup(sdev
);
495 "error: could not startup SoundWire links\n");
500 hda_sdw_int_enable(sdev
, true);
503 * The recommended HW programming sequence for ICL is to
504 * power up core 3 and keep it in stall if HPRO is enabled.
505 * Major difference between ICL and TGL, on ICL core 3 is managed by
506 * the host whereas on TGL it is handled by the firmware.
508 if (!hda
->clk_config_lpro
) {
509 ret
= snd_sof_dsp_core_power_up(sdev
, BIT(3));
511 dev_err(sdev
->dev
, "error: dsp core power up failed on core 3\n");
515 snd_sof_dsp_stall(sdev
, BIT(3));
518 /* re-enable clock gating and power gating */
519 return hda_dsp_ctrl_clock_power_gating(sdev
, true);
522 int hda_dsp_ext_man_get_cavs_config_data(struct snd_sof_dev
*sdev
,
523 const struct sof_ext_man_elem_header
*hdr
)
525 const struct sof_ext_man_cavs_config_data
*config_data
=
526 container_of(hdr
, struct sof_ext_man_cavs_config_data
, hdr
);
527 struct sof_intel_hda_dev
*hda
= sdev
->pdata
->hw_pdata
;
530 /* calculate total number of config data elements */
531 elem_num
= (hdr
->size
- sizeof(struct sof_ext_man_elem_header
))
532 / sizeof(struct sof_config_elem
);
534 dev_err(sdev
->dev
, "cavs config data is inconsistent: %d\n", elem_num
);
538 for (i
= 0; i
< elem_num
; i
++)
539 switch (config_data
->elems
[i
].token
) {
540 case SOF_EXT_MAN_CAVS_CONFIG_EMPTY
:
541 /* skip empty token */
543 case SOF_EXT_MAN_CAVS_CONFIG_CAVS_LPRO
:
544 hda
->clk_config_lpro
= config_data
->elems
[i
].value
;
545 dev_dbg(sdev
->dev
, "FW clock config: %s\n",
546 hda
->clk_config_lpro
? "LPRO" : "HPRO");
548 case SOF_EXT_MAN_CAVS_CONFIG_OUTBOX_SIZE
:
549 case SOF_EXT_MAN_CAVS_CONFIG_INBOX_SIZE
:
550 /* These elements are defined but not being used yet. No warn is required */
553 dev_info(sdev
->dev
, "unsupported token type: %d\n",
554 config_data
->elems
[i
].token
);
560 int hda_dsp_core_stall_icl(struct snd_sof_dev
*sdev
, unsigned int core_mask
)
562 struct sof_intel_hda_dev
*hda
= sdev
->pdata
->hw_pdata
;
563 const struct sof_intel_dsp_desc
*chip
= hda
->desc
;
565 /* make sure core_mask in host managed cores */
566 core_mask
&= chip
->host_managed_cores_mask
;
568 dev_err(sdev
->dev
, "error: core_mask is not in host managed cores\n");
573 snd_sof_dsp_update_bits_unlocked(sdev
, HDA_DSP_BAR
,
575 HDA_DSP_ADSPCS_CSTALL_MASK(core_mask
),
576 HDA_DSP_ADSPCS_CSTALL_MASK(core_mask
));