Lines Matching +full:rom +full:- +full:19 +full:h

1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
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>
13 #include <linux/fs.h>
14 #include <linux/interrupt.h>
15 #include <linux/mm.h>
16 #include <linux/module.h>
17 #include <linux/pci.h>
18 #include <linux/slab.h>
19 #include <sound/hdaudio_ext.h>
20 #include <sound/sof.h>
21 #include <sound/pcm_params.h>
23 #include "../sof-priv.h"
24 #include "../ops.h"
25 #include "hda.h"
71 #define HDA_CL_SD_CTL_DIR_SHIFT 19
119 phys_addr_t addr = virt_to_phys(dmab_data->area); in cl_skl_cldma_setup_bdle()
124 * all the code fits. This could be improved with scatter-gather but the firmware in cl_skl_cldma_setup_bdle()
158 } while (--retries); in cl_skl_cldma_stream_run()
161 dev_err(sdev->dev, "%s: failed to set Run bit=%d enable=%d\n", in cl_skl_cldma_stream_run()
243 HDA_CL_SD_BDLPLBA(dmab_bdl->addr)); in cl_skl_cldma_setup_controller()
246 HDA_CL_SD_BDLPUBA(dmab_bdl->addr)); in cl_skl_cldma_setup_controller()
253 sd_offset + SOF_HDA_ADSP_REG_SD_LVI, count - 1); in cl_skl_cldma_setup_controller()
277 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, bufsize, dmab); in cl_stream_prepare_skl()
279 dev_err(sdev->dev, "%s: failed to alloc fw buffer: %x\n", __func__, ret); in cl_stream_prepare_skl()
283 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, sdev->dev, bufsize, dmab_bdl); in cl_stream_prepare_skl()
285 dev_err(sdev->dev, "%s: failed to alloc blde: %x\n", __func__, ret); in cl_stream_prepare_skl()
290 bdl = (__le32 *)dmab_bdl->area; in cl_stream_prepare_skl()
311 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in cl_dsp_init_skl()
312 const struct sof_intel_dsp_desc *chip = hda->desc; in cl_dsp_init_skl()
320 if (hda_dsp_core_is_enabled(sdev, chip->init_core_mask)) { in cl_dsp_init_skl()
322 ret = hda_dsp_core_stall_reset(sdev, chip->init_core_mask); in cl_dsp_init_skl()
326 ret = hda_dsp_core_run(sdev, chip->init_core_mask); in cl_dsp_init_skl()
328 dev_err(sdev->dev, "%s: dsp core start failed %d\n", __func__, ret); in cl_dsp_init_skl()
335 ret = hda_dsp_core_reset_power_down(sdev, chip->init_core_mask); in cl_dsp_init_skl()
337 dev_err(sdev->dev, "%s: dsp core0 disable fail: %d\n", __func__, ret); in cl_dsp_init_skl()
340 ret = hda_dsp_enable_core(sdev, chip->init_core_mask); in cl_dsp_init_skl()
342 dev_err(sdev->dev, "%s: dsp core0 enable fail: %d\n", __func__, ret); in cl_dsp_init_skl()
350 dev_err(sdev->dev, "%s: dma prepare fw loading err: %x\n", __func__, ret); in cl_dsp_init_skl()
359 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in cl_dsp_init_skl()
364 snd_sof_dsp_update_bits(sdev, HDA_DSP_BAR, chip->ipc_ctl, in cl_dsp_init_skl()
368 /* polling the ROM init status information. */ in cl_dsp_init_skl()
370 chip->rom_status_reg, status, in cl_dsp_init_skl()
374 chip->rom_init_timeout * in cl_dsp_init_skl()
386 hda_dsp_core_reset_power_down(sdev, chip->init_core_mask); in cl_dsp_init_skl()
397 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in cl_skl_cldma_fill_buffer()
402 memcpy(dmab->area, curr_pos, size); in cl_skl_cldma_fill_buffer()
405 hda->code_loading = 1; in cl_skl_cldma_fill_buffer()
421 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in cl_skl_cldma_wait_interruptible()
422 const struct sof_intel_dsp_desc *chip = hda->desc; in cl_skl_cldma_wait_interruptible()
430 if (!wait_event_timeout(hda->waitq, !hda->code_loading, in cl_skl_cldma_wait_interruptible()
432 dev_err(sdev->dev, "cldma copy timeout\n"); in cl_skl_cldma_wait_interruptible()
433 dev_err(sdev->dev, "ROM code=%#x: FW status=%#x\n", in cl_skl_cldma_wait_interruptible()
435 snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg)); in cl_skl_cldma_wait_interruptible()
436 return -EIO; in cl_skl_cldma_wait_interruptible()
444 dev_err(sdev->dev, "cldma copy failed\n"); in cl_skl_cldma_wait_interruptible()
445 return -EIO; in cl_skl_cldma_wait_interruptible()
448 dev_dbg(sdev->dev, "cldma buffer copy complete\n"); in cl_skl_cldma_wait_interruptible()
463 return -EINVAL; in cl_skl_cldma_copy_to_buf()
467 dev_dbg(sdev->dev, "cldma copy %#x bytes\n", bufsize); in cl_skl_cldma_copy_to_buf()
473 dev_err(sdev->dev, "%s: fw failed to load. %#x bytes remaining\n", in cl_skl_cldma_copy_to_buf()
478 bytes_left -= bufsize; in cl_skl_cldma_copy_to_buf()
481 dev_dbg(sdev->dev, "cldma copy %#x bytes\n", bytes_left); in cl_skl_cldma_copy_to_buf()
496 const struct firmware *fw = sdev->basefw.fw; in cl_copy_fw_skl()
501 stripped_firmware.data = fw->data + sdev->basefw.payload_offset; in cl_copy_fw_skl()
502 stripped_firmware.size = fw->size - sdev->basefw.payload_offset; in cl_copy_fw_skl()
504 dev_dbg(sdev->dev, "firmware size: %#zx buffer size %#x\n", fw->size, bufsize); in cl_copy_fw_skl()
509 dev_err(sdev->dev, "%s: fw copy failed %d\n", __func__, ret); in cl_copy_fw_skl()
516 struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; in hda_dsp_cl_boot_firmware_skl()
517 const struct sof_intel_dsp_desc *chip = hda->desc; in hda_dsp_cl_boot_firmware_skl()
526 /* retry enabling core and ROM load. seemed to help */ in hda_dsp_cl_boot_firmware_skl()
530 dev_err(sdev->dev, "Error code=%#x: FW status=%#x\n", in hda_dsp_cl_boot_firmware_skl()
532 snd_sof_dsp_read(sdev, HDA_DSP_BAR, chip->rom_status_reg)); in hda_dsp_cl_boot_firmware_skl()
533 dev_err(sdev->dev, "Core En/ROM load fail:%d\n", ret); in hda_dsp_cl_boot_firmware_skl()
538 dev_dbg(sdev->dev, "ROM init successful\n"); in hda_dsp_cl_boot_firmware_skl()
540 /* at this point DSP ROM has been initialized and should be ready for in hda_dsp_cl_boot_firmware_skl()
545 dev_err(sdev->dev, "%s: load firmware failed : %d\n", __func__, ret); in hda_dsp_cl_boot_firmware_skl()
550 chip->rom_status_reg, reg, in hda_dsp_cl_boot_firmware_skl()
556 dev_dbg(sdev->dev, "Firmware download successful, booting...\n"); in hda_dsp_cl_boot_firmware_skl()
562 return chip->init_core_mask; in hda_dsp_cl_boot_firmware_skl()
572 hda_dsp_core_reset_power_down(sdev, chip->init_core_mask); in hda_dsp_cl_boot_firmware_skl()
576 dev_err(sdev->dev, "%s: load fw failed err: %d\n", __func__, ret); in hda_dsp_cl_boot_firmware_skl()