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