xref: /openbmc/linux/sound/soc/sof/intel/hda-stream.c (revision f5ad1c74)
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 Intel Corporation. All rights reserved.
7 //
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>
12 //
13 
14 /*
15  * Hardware interface for generic Intel audio DSP HDA IP
16  */
17 
18 #include <linux/pm_runtime.h>
19 #include <sound/hdaudio_ext.h>
20 #include <sound/hda_register.h>
21 #include <sound/sof.h>
22 #include "../ops.h"
23 #include "../sof-audio.h"
24 #include "hda.h"
25 
26 #define HDA_LTRP_GB_VALUE_US	95
27 
28 /*
29  * set up one of BDL entries for a stream
30  */
31 static int hda_setup_bdle(struct snd_sof_dev *sdev,
32 			  struct snd_dma_buffer *dmab,
33 			  struct hdac_stream *stream,
34 			  struct sof_intel_dsp_bdl **bdlp,
35 			  int offset, int size, int ioc)
36 {
37 	struct hdac_bus *bus = sof_to_bus(sdev);
38 	struct sof_intel_dsp_bdl *bdl = *bdlp;
39 
40 	while (size > 0) {
41 		dma_addr_t addr;
42 		int chunk;
43 
44 		if (stream->frags >= HDA_DSP_MAX_BDL_ENTRIES) {
45 			dev_err(sdev->dev, "error: stream frags exceeded\n");
46 			return -EINVAL;
47 		}
48 
49 		addr = snd_sgbuf_get_addr(dmab, offset);
50 		/* program BDL addr */
51 		bdl->addr_l = cpu_to_le32(lower_32_bits(addr));
52 		bdl->addr_h = cpu_to_le32(upper_32_bits(addr));
53 		/* program BDL size */
54 		chunk = snd_sgbuf_get_chunk_size(dmab, offset, size);
55 		/* one BDLE should not cross 4K boundary */
56 		if (bus->align_bdle_4k) {
57 			u32 remain = 0x1000 - (offset & 0xfff);
58 
59 			if (chunk > remain)
60 				chunk = remain;
61 		}
62 		bdl->size = cpu_to_le32(chunk);
63 		/* only program IOC when the whole segment is processed */
64 		size -= chunk;
65 		bdl->ioc = (size || !ioc) ? 0 : cpu_to_le32(0x01);
66 		bdl++;
67 		stream->frags++;
68 		offset += chunk;
69 
70 		dev_vdbg(sdev->dev, "bdl, frags:%d, chunk size:0x%x;\n",
71 			 stream->frags, chunk);
72 	}
73 
74 	*bdlp = bdl;
75 	return offset;
76 }
77 
78 /*
79  * set up Buffer Descriptor List (BDL) for host memory transfer
80  * BDL describes the location of the individual buffers and is little endian.
81  */
82 int hda_dsp_stream_setup_bdl(struct snd_sof_dev *sdev,
83 			     struct snd_dma_buffer *dmab,
84 			     struct hdac_stream *stream)
85 {
86 	struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
87 	struct sof_intel_dsp_bdl *bdl;
88 	int i, offset, period_bytes, periods;
89 	int remain, ioc;
90 
91 	period_bytes = stream->period_bytes;
92 	dev_dbg(sdev->dev, "period_bytes:0x%x\n", period_bytes);
93 	if (!period_bytes)
94 		period_bytes = stream->bufsize;
95 
96 	periods = stream->bufsize / period_bytes;
97 
98 	dev_dbg(sdev->dev, "periods:%d\n", periods);
99 
100 	remain = stream->bufsize % period_bytes;
101 	if (remain)
102 		periods++;
103 
104 	/* program the initial BDL entries */
105 	bdl = (struct sof_intel_dsp_bdl *)stream->bdl.area;
106 	offset = 0;
107 	stream->frags = 0;
108 
109 	/*
110 	 * set IOC if don't use position IPC
111 	 * and period_wakeup needed.
112 	 */
113 	ioc = hda->no_ipc_position ?
114 	      !stream->no_period_wakeup : 0;
115 
116 	for (i = 0; i < periods; i++) {
117 		if (i == (periods - 1) && remain)
118 			/* set the last small entry */
119 			offset = hda_setup_bdle(sdev, dmab,
120 						stream, &bdl, offset,
121 						remain, 0);
122 		else
123 			offset = hda_setup_bdle(sdev, dmab,
124 						stream, &bdl, offset,
125 						period_bytes, ioc);
126 	}
127 
128 	return offset;
129 }
130 
131 int hda_dsp_stream_spib_config(struct snd_sof_dev *sdev,
132 			       struct hdac_ext_stream *stream,
133 			       int enable, u32 size)
134 {
135 	struct hdac_stream *hstream = &stream->hstream;
136 	u32 mask;
137 
138 	if (!sdev->bar[HDA_DSP_SPIB_BAR]) {
139 		dev_err(sdev->dev, "error: address of spib capability is NULL\n");
140 		return -EINVAL;
141 	}
142 
143 	mask = (1 << hstream->index);
144 
145 	/* enable/disable SPIB for the stream */
146 	snd_sof_dsp_update_bits(sdev, HDA_DSP_SPIB_BAR,
147 				SOF_HDA_ADSP_REG_CL_SPBFIFO_SPBFCCTL, mask,
148 				enable << hstream->index);
149 
150 	/* set the SPIB value */
151 	sof_io_write(sdev, stream->spib_addr, size);
152 
153 	return 0;
154 }
155 
156 /* get next unused stream */
157 struct hdac_ext_stream *
158 hda_dsp_stream_get(struct snd_sof_dev *sdev, int direction)
159 {
160 	struct hdac_bus *bus = sof_to_bus(sdev);
161 	struct sof_intel_hda_stream *hda_stream;
162 	struct hdac_ext_stream *stream = NULL;
163 	struct hdac_stream *s;
164 
165 	spin_lock_irq(&bus->reg_lock);
166 
167 	/* get an unused stream */
168 	list_for_each_entry(s, &bus->stream_list, list) {
169 		if (s->direction == direction && !s->opened) {
170 			stream = stream_to_hdac_ext_stream(s);
171 			hda_stream = container_of(stream,
172 						  struct sof_intel_hda_stream,
173 						  hda_stream);
174 			/* check if the host DMA channel is reserved */
175 			if (hda_stream->host_reserved)
176 				continue;
177 
178 			s->opened = true;
179 			break;
180 		}
181 	}
182 
183 	spin_unlock_irq(&bus->reg_lock);
184 
185 	/* stream found ? */
186 	if (!stream)
187 		dev_err(sdev->dev, "error: no free %s streams\n",
188 			direction == SNDRV_PCM_STREAM_PLAYBACK ?
189 			"playback" : "capture");
190 
191 	/*
192 	 * Disable DMI Link L1 entry when capture stream is opened.
193 	 * Workaround to address a known issue with host DMA that results
194 	 * in xruns during pause/release in capture scenarios.
195 	 */
196 	if (!IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1))
197 		if (stream && direction == SNDRV_PCM_STREAM_CAPTURE)
198 			snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
199 						HDA_VS_INTEL_EM2,
200 						HDA_VS_INTEL_EM2_L1SEN, 0);
201 
202 	return stream;
203 }
204 
205 /* free a stream */
206 int hda_dsp_stream_put(struct snd_sof_dev *sdev, int direction, int stream_tag)
207 {
208 	struct hdac_bus *bus = sof_to_bus(sdev);
209 	struct hdac_stream *s;
210 	bool active_capture_stream = false;
211 	bool found = false;
212 
213 	spin_lock_irq(&bus->reg_lock);
214 
215 	/*
216 	 * close stream matching the stream tag
217 	 * and check if there are any open capture streams.
218 	 */
219 	list_for_each_entry(s, &bus->stream_list, list) {
220 		if (!s->opened)
221 			continue;
222 
223 		if (s->direction == direction && s->stream_tag == stream_tag) {
224 			s->opened = false;
225 			found = true;
226 		} else if (s->direction == SNDRV_PCM_STREAM_CAPTURE) {
227 			active_capture_stream = true;
228 		}
229 	}
230 
231 	spin_unlock_irq(&bus->reg_lock);
232 
233 	/* Enable DMI L1 entry if there are no capture streams open */
234 	if (!IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1))
235 		if (!active_capture_stream)
236 			snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
237 						HDA_VS_INTEL_EM2,
238 						HDA_VS_INTEL_EM2_L1SEN,
239 						HDA_VS_INTEL_EM2_L1SEN);
240 
241 	if (!found) {
242 		dev_dbg(sdev->dev, "stream_tag %d not opened!\n", stream_tag);
243 		return -ENODEV;
244 	}
245 
246 	return 0;
247 }
248 
249 int hda_dsp_stream_trigger(struct snd_sof_dev *sdev,
250 			   struct hdac_ext_stream *stream, int cmd)
251 {
252 	struct hdac_stream *hstream = &stream->hstream;
253 	int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
254 	u32 dma_start = SOF_HDA_SD_CTL_DMA_START;
255 	int ret;
256 	u32 run;
257 
258 	/* cmd must be for audio stream */
259 	switch (cmd) {
260 	case SNDRV_PCM_TRIGGER_RESUME:
261 	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
262 	case SNDRV_PCM_TRIGGER_START:
263 		snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL,
264 					1 << hstream->index,
265 					1 << hstream->index);
266 
267 		snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
268 					sd_offset,
269 					SOF_HDA_SD_CTL_DMA_START |
270 					SOF_HDA_CL_DMA_SD_INT_MASK,
271 					SOF_HDA_SD_CTL_DMA_START |
272 					SOF_HDA_CL_DMA_SD_INT_MASK);
273 
274 		ret = snd_sof_dsp_read_poll_timeout(sdev,
275 					HDA_DSP_HDA_BAR,
276 					sd_offset, run,
277 					((run &	dma_start) == dma_start),
278 					HDA_DSP_REG_POLL_INTERVAL_US,
279 					HDA_DSP_STREAM_RUN_TIMEOUT);
280 
281 		if (ret < 0) {
282 			dev_err(sdev->dev,
283 				"error: %s: cmd %d: timeout on STREAM_SD_OFFSET read\n",
284 				__func__, cmd);
285 			return ret;
286 		}
287 
288 		hstream->running = true;
289 		break;
290 	case SNDRV_PCM_TRIGGER_SUSPEND:
291 	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
292 	case SNDRV_PCM_TRIGGER_STOP:
293 		snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
294 					sd_offset,
295 					SOF_HDA_SD_CTL_DMA_START |
296 					SOF_HDA_CL_DMA_SD_INT_MASK, 0x0);
297 
298 		ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_HDA_BAR,
299 						sd_offset, run,
300 						!(run &	dma_start),
301 						HDA_DSP_REG_POLL_INTERVAL_US,
302 						HDA_DSP_STREAM_RUN_TIMEOUT);
303 
304 		if (ret < 0) {
305 			dev_err(sdev->dev,
306 				"error: %s: cmd %d: timeout on STREAM_SD_OFFSET read\n",
307 				__func__, cmd);
308 			return ret;
309 		}
310 
311 		snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR, sd_offset +
312 				  SOF_HDA_ADSP_REG_CL_SD_STS,
313 				  SOF_HDA_CL_DMA_SD_INT_MASK);
314 
315 		hstream->running = false;
316 		snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, SOF_HDA_INTCTL,
317 					1 << hstream->index, 0x0);
318 		break;
319 	default:
320 		dev_err(sdev->dev, "error: unknown command: %d\n", cmd);
321 		return -EINVAL;
322 	}
323 
324 	return 0;
325 }
326 
327 /* minimal recommended programming for ICCMAX stream */
328 int hda_dsp_iccmax_stream_hw_params(struct snd_sof_dev *sdev, struct hdac_ext_stream *stream,
329 				    struct snd_dma_buffer *dmab,
330 				    struct snd_pcm_hw_params *params)
331 {
332 	struct hdac_bus *bus = sof_to_bus(sdev);
333 	struct hdac_stream *hstream = &stream->hstream;
334 	int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
335 	int ret;
336 	u32 mask = 0x1 << hstream->index;
337 
338 	if (!stream) {
339 		dev_err(sdev->dev, "error: no stream available\n");
340 		return -ENODEV;
341 	}
342 
343 	if (hstream->posbuf)
344 		*hstream->posbuf = 0;
345 
346 	/* reset BDL address */
347 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
348 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPL,
349 			  0x0);
350 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
351 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPU,
352 			  0x0);
353 
354 	hstream->frags = 0;
355 
356 	ret = hda_dsp_stream_setup_bdl(sdev, dmab, hstream);
357 	if (ret < 0) {
358 		dev_err(sdev->dev, "error: set up of BDL failed\n");
359 		return ret;
360 	}
361 
362 	/* program BDL address */
363 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
364 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPL,
365 			  (u32)hstream->bdl.addr);
366 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
367 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPU,
368 			  upper_32_bits(hstream->bdl.addr));
369 
370 	/* program cyclic buffer length */
371 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
372 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_CBL,
373 			  hstream->bufsize);
374 
375 	/* program last valid index */
376 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
377 				sd_offset + SOF_HDA_ADSP_REG_CL_SD_LVI,
378 				0xffff, (hstream->frags - 1));
379 
380 	/* decouple host and link DMA, enable DSP features */
381 	snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
382 				mask, mask);
383 
384 	/* Follow HW recommendation to set the guardband value to 95us during FW boot */
385 	snd_hdac_chip_updateb(bus, VS_LTRP, HDA_VS_INTEL_LTRP_GB_MASK, HDA_LTRP_GB_VALUE_US);
386 
387 	/* start DMA */
388 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset,
389 				SOF_HDA_SD_CTL_DMA_START, SOF_HDA_SD_CTL_DMA_START);
390 
391 	return 0;
392 }
393 
394 /*
395  * prepare for common hdac registers settings, for both code loader
396  * and normal stream.
397  */
398 int hda_dsp_stream_hw_params(struct snd_sof_dev *sdev,
399 			     struct hdac_ext_stream *stream,
400 			     struct snd_dma_buffer *dmab,
401 			     struct snd_pcm_hw_params *params)
402 {
403 	struct hdac_bus *bus = sof_to_bus(sdev);
404 	struct hdac_stream *hstream = &stream->hstream;
405 	int sd_offset = SOF_STREAM_SD_OFFSET(hstream);
406 	int ret, timeout = HDA_DSP_STREAM_RESET_TIMEOUT;
407 	u32 dma_start = SOF_HDA_SD_CTL_DMA_START;
408 	u32 val, mask;
409 	u32 run;
410 
411 	if (!stream) {
412 		dev_err(sdev->dev, "error: no stream available\n");
413 		return -ENODEV;
414 	}
415 
416 	/* decouple host and link DMA */
417 	mask = 0x1 << hstream->index;
418 	snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
419 				mask, mask);
420 
421 	if (!dmab) {
422 		dev_err(sdev->dev, "error: no dma buffer allocated!\n");
423 		return -ENODEV;
424 	}
425 
426 	/* clear stream status */
427 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset,
428 				SOF_HDA_CL_DMA_SD_INT_MASK |
429 				SOF_HDA_SD_CTL_DMA_START, 0);
430 
431 	ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_HDA_BAR,
432 					    sd_offset, run,
433 					    !(run & dma_start),
434 					    HDA_DSP_REG_POLL_INTERVAL_US,
435 					    HDA_DSP_STREAM_RUN_TIMEOUT);
436 
437 	if (ret < 0) {
438 		dev_err(sdev->dev,
439 			"error: %s: timeout on STREAM_SD_OFFSET read1\n",
440 			__func__);
441 		return ret;
442 	}
443 
444 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
445 				sd_offset + SOF_HDA_ADSP_REG_CL_SD_STS,
446 				SOF_HDA_CL_DMA_SD_INT_MASK,
447 				SOF_HDA_CL_DMA_SD_INT_MASK);
448 
449 	/* stream reset */
450 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset, 0x1,
451 				0x1);
452 	udelay(3);
453 	do {
454 		val = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR,
455 				       sd_offset);
456 		if (val & 0x1)
457 			break;
458 	} while (--timeout);
459 	if (timeout == 0) {
460 		dev_err(sdev->dev, "error: stream reset failed\n");
461 		return -ETIMEDOUT;
462 	}
463 
464 	timeout = HDA_DSP_STREAM_RESET_TIMEOUT;
465 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset, 0x1,
466 				0x0);
467 
468 	/* wait for hardware to report that stream is out of reset */
469 	udelay(3);
470 	do {
471 		val = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR,
472 				       sd_offset);
473 		if ((val & 0x1) == 0)
474 			break;
475 	} while (--timeout);
476 	if (timeout == 0) {
477 		dev_err(sdev->dev, "error: timeout waiting for stream reset\n");
478 		return -ETIMEDOUT;
479 	}
480 
481 	if (hstream->posbuf)
482 		*hstream->posbuf = 0;
483 
484 	/* reset BDL address */
485 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
486 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPL,
487 			  0x0);
488 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
489 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPU,
490 			  0x0);
491 
492 	/* clear stream status */
493 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset,
494 				SOF_HDA_CL_DMA_SD_INT_MASK |
495 				SOF_HDA_SD_CTL_DMA_START, 0);
496 
497 	ret = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_HDA_BAR,
498 					    sd_offset, run,
499 					    !(run & dma_start),
500 					    HDA_DSP_REG_POLL_INTERVAL_US,
501 					    HDA_DSP_STREAM_RUN_TIMEOUT);
502 
503 	if (ret < 0) {
504 		dev_err(sdev->dev,
505 			"error: %s: timeout on STREAM_SD_OFFSET read2\n",
506 			__func__);
507 		return ret;
508 	}
509 
510 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
511 				sd_offset + SOF_HDA_ADSP_REG_CL_SD_STS,
512 				SOF_HDA_CL_DMA_SD_INT_MASK,
513 				SOF_HDA_CL_DMA_SD_INT_MASK);
514 
515 	hstream->frags = 0;
516 
517 	ret = hda_dsp_stream_setup_bdl(sdev, dmab, hstream);
518 	if (ret < 0) {
519 		dev_err(sdev->dev, "error: set up of BDL failed\n");
520 		return ret;
521 	}
522 
523 	/* program stream tag to set up stream descriptor for DMA */
524 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset,
525 				SOF_HDA_CL_SD_CTL_STREAM_TAG_MASK,
526 				hstream->stream_tag <<
527 				SOF_HDA_CL_SD_CTL_STREAM_TAG_SHIFT);
528 
529 	/* program cyclic buffer length */
530 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
531 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_CBL,
532 			  hstream->bufsize);
533 
534 	/*
535 	 * Recommended hardware programming sequence for HDAudio DMA format
536 	 *
537 	 * 1. Put DMA into coupled mode by clearing PPCTL.PROCEN bit
538 	 *    for corresponding stream index before the time of writing
539 	 *    format to SDxFMT register.
540 	 * 2. Write SDxFMT
541 	 * 3. Set PPCTL.PROCEN bit for corresponding stream index to
542 	 *    enable decoupled mode
543 	 */
544 
545 	/* couple host and link DMA, disable DSP features */
546 	snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
547 				mask, 0);
548 
549 	/* program stream format */
550 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
551 				sd_offset +
552 				SOF_HDA_ADSP_REG_CL_SD_FORMAT,
553 				0xffff, hstream->format_val);
554 
555 	/* decouple host and link DMA, enable DSP features */
556 	snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR, SOF_HDA_REG_PP_PPCTL,
557 				mask, mask);
558 
559 	/* program last valid index */
560 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR,
561 				sd_offset + SOF_HDA_ADSP_REG_CL_SD_LVI,
562 				0xffff, (hstream->frags - 1));
563 
564 	/* program BDL address */
565 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
566 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPL,
567 			  (u32)hstream->bdl.addr);
568 	snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR,
569 			  sd_offset + SOF_HDA_ADSP_REG_CL_SD_BDLPU,
570 			  upper_32_bits(hstream->bdl.addr));
571 
572 	/* enable position buffer */
573 	if (!(snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, SOF_HDA_ADSP_DPLBASE)
574 				& SOF_HDA_ADSP_DPLBASE_ENABLE)) {
575 		snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR, SOF_HDA_ADSP_DPUBASE,
576 				  upper_32_bits(bus->posbuf.addr));
577 		snd_sof_dsp_write(sdev, HDA_DSP_HDA_BAR, SOF_HDA_ADSP_DPLBASE,
578 				  (u32)bus->posbuf.addr |
579 				  SOF_HDA_ADSP_DPLBASE_ENABLE);
580 	}
581 
582 	/* set interrupt enable bits */
583 	snd_sof_dsp_update_bits(sdev, HDA_DSP_HDA_BAR, sd_offset,
584 				SOF_HDA_CL_DMA_SD_INT_MASK,
585 				SOF_HDA_CL_DMA_SD_INT_MASK);
586 
587 	/* read FIFO size */
588 	if (hstream->direction == SNDRV_PCM_STREAM_PLAYBACK) {
589 		hstream->fifo_size =
590 			snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR,
591 					 sd_offset +
592 					 SOF_HDA_ADSP_REG_CL_SD_FIFOSIZE);
593 		hstream->fifo_size &= 0xffff;
594 		hstream->fifo_size += 1;
595 	} else {
596 		hstream->fifo_size = 0;
597 	}
598 
599 	return ret;
600 }
601 
602 int hda_dsp_stream_hw_free(struct snd_sof_dev *sdev,
603 			   struct snd_pcm_substream *substream)
604 {
605 	struct hdac_stream *stream = substream->runtime->private_data;
606 	struct hdac_ext_stream *link_dev = container_of(stream,
607 							struct hdac_ext_stream,
608 							hstream);
609 	struct hdac_bus *bus = sof_to_bus(sdev);
610 	u32 mask = 0x1 << stream->index;
611 
612 	spin_lock_irq(&bus->reg_lock);
613 	/* couple host and link DMA if link DMA channel is idle */
614 	if (!link_dev->link_locked)
615 		snd_sof_dsp_update_bits(sdev, HDA_DSP_PP_BAR,
616 					SOF_HDA_REG_PP_PPCTL, mask, 0);
617 	spin_unlock_irq(&bus->reg_lock);
618 
619 	stream->substream = NULL;
620 
621 	return 0;
622 }
623 
624 bool hda_dsp_check_stream_irq(struct snd_sof_dev *sdev)
625 {
626 	struct hdac_bus *bus = sof_to_bus(sdev);
627 	bool ret = false;
628 	u32 status;
629 
630 	/* The function can be called at irq thread, so use spin_lock_irq */
631 	spin_lock_irq(&bus->reg_lock);
632 
633 	status = snd_hdac_chip_readl(bus, INTSTS);
634 	dev_vdbg(bus->dev, "stream irq, INTSTS status: 0x%x\n", status);
635 
636 	/* if Register inaccessible, ignore it.*/
637 	if (status != 0xffffffff)
638 		ret = true;
639 
640 	spin_unlock_irq(&bus->reg_lock);
641 
642 	return ret;
643 }
644 
645 static void
646 hda_dsp_set_bytes_transferred(struct hdac_stream *hstream, u64 buffer_size)
647 {
648 	u64 prev_pos, pos, num_bytes;
649 
650 	div64_u64_rem(hstream->curr_pos, buffer_size, &prev_pos);
651 	pos = snd_hdac_stream_get_pos_posbuf(hstream);
652 
653 	if (pos < prev_pos)
654 		num_bytes = (buffer_size - prev_pos) +  pos;
655 	else
656 		num_bytes = pos - prev_pos;
657 
658 	hstream->curr_pos += num_bytes;
659 }
660 
661 static bool hda_dsp_stream_check(struct hdac_bus *bus, u32 status)
662 {
663 	struct sof_intel_hda_dev *sof_hda = bus_to_sof_hda(bus);
664 	struct hdac_stream *s;
665 	bool active = false;
666 	u32 sd_status;
667 
668 	list_for_each_entry(s, &bus->stream_list, list) {
669 		if (status & BIT(s->index) && s->opened) {
670 			sd_status = snd_hdac_stream_readb(s, SD_STS);
671 
672 			dev_vdbg(bus->dev, "stream %d status 0x%x\n",
673 				 s->index, sd_status);
674 
675 			snd_hdac_stream_writeb(s, SD_STS, sd_status);
676 
677 			active = true;
678 			if ((!s->substream && !s->cstream) ||
679 			    !s->running ||
680 			    (sd_status & SOF_HDA_CL_DMA_SD_INT_COMPLETE) == 0)
681 				continue;
682 
683 			/* Inform ALSA only in case not do that with IPC */
684 			if (s->substream && sof_hda->no_ipc_position) {
685 				snd_sof_pcm_period_elapsed(s->substream);
686 			} else if (s->cstream) {
687 				hda_dsp_set_bytes_transferred(s,
688 					s->cstream->runtime->buffer_size);
689 				snd_compr_fragment_elapsed(s->cstream);
690 			}
691 		}
692 	}
693 
694 	return active;
695 }
696 
697 irqreturn_t hda_dsp_stream_threaded_handler(int irq, void *context)
698 {
699 	struct snd_sof_dev *sdev = context;
700 	struct hdac_bus *bus = sof_to_bus(sdev);
701 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
702 	u32 rirb_status;
703 #endif
704 	bool active;
705 	u32 status;
706 	int i;
707 
708 	/*
709 	 * Loop 10 times to handle missed interrupts caused by
710 	 * unsolicited responses from the codec
711 	 */
712 	for (i = 0, active = true; i < 10 && active; i++) {
713 		spin_lock_irq(&bus->reg_lock);
714 
715 		status = snd_hdac_chip_readl(bus, INTSTS);
716 
717 		/* check streams */
718 		active = hda_dsp_stream_check(bus, status);
719 
720 		/* check and clear RIRB interrupt */
721 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
722 		if (status & AZX_INT_CTRL_EN) {
723 			rirb_status = snd_hdac_chip_readb(bus, RIRBSTS);
724 			if (rirb_status & RIRB_INT_MASK) {
725 				/*
726 				 * Clearing the interrupt status here ensures
727 				 * that no interrupt gets masked after the RIRB
728 				 * wp is read in snd_hdac_bus_update_rirb.
729 				 */
730 				snd_hdac_chip_writeb(bus, RIRBSTS,
731 						     RIRB_INT_MASK);
732 				active = true;
733 				if (rirb_status & RIRB_INT_RESPONSE)
734 					snd_hdac_bus_update_rirb(bus);
735 			}
736 		}
737 #endif
738 		spin_unlock_irq(&bus->reg_lock);
739 	}
740 
741 	return IRQ_HANDLED;
742 }
743 
744 int hda_dsp_stream_init(struct snd_sof_dev *sdev)
745 {
746 	struct hdac_bus *bus = sof_to_bus(sdev);
747 	struct hdac_ext_stream *stream;
748 	struct hdac_stream *hstream;
749 	struct pci_dev *pci = to_pci_dev(sdev->dev);
750 	struct sof_intel_hda_dev *sof_hda = bus_to_sof_hda(bus);
751 	int sd_offset;
752 	int i, num_playback, num_capture, num_total, ret;
753 	u32 gcap;
754 
755 	gcap = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, SOF_HDA_GCAP);
756 	dev_dbg(sdev->dev, "hda global caps = 0x%x\n", gcap);
757 
758 	/* get stream count from GCAP */
759 	num_capture = (gcap >> 8) & 0x0f;
760 	num_playback = (gcap >> 12) & 0x0f;
761 	num_total = num_playback + num_capture;
762 
763 	dev_dbg(sdev->dev, "detected %d playback and %d capture streams\n",
764 		num_playback, num_capture);
765 
766 	if (num_playback >= SOF_HDA_PLAYBACK_STREAMS) {
767 		dev_err(sdev->dev, "error: too many playback streams %d\n",
768 			num_playback);
769 		return -EINVAL;
770 	}
771 
772 	if (num_capture >= SOF_HDA_CAPTURE_STREAMS) {
773 		dev_err(sdev->dev, "error: too many capture streams %d\n",
774 			num_playback);
775 		return -EINVAL;
776 	}
777 
778 	/*
779 	 * mem alloc for the position buffer
780 	 * TODO: check position buffer update
781 	 */
782 	ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
783 				  SOF_HDA_DPIB_ENTRY_SIZE * num_total,
784 				  &bus->posbuf);
785 	if (ret < 0) {
786 		dev_err(sdev->dev, "error: posbuffer dma alloc failed\n");
787 		return -ENOMEM;
788 	}
789 
790 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
791 	/* mem alloc for the CORB/RIRB ringbuffers */
792 	ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
793 				  PAGE_SIZE, &bus->rb);
794 	if (ret < 0) {
795 		dev_err(sdev->dev, "error: RB alloc failed\n");
796 		return -ENOMEM;
797 	}
798 #endif
799 
800 	/* create capture streams */
801 	for (i = 0; i < num_capture; i++) {
802 		struct sof_intel_hda_stream *hda_stream;
803 
804 		hda_stream = devm_kzalloc(sdev->dev, sizeof(*hda_stream),
805 					  GFP_KERNEL);
806 		if (!hda_stream)
807 			return -ENOMEM;
808 
809 		hda_stream->sdev = sdev;
810 
811 		stream = &hda_stream->hda_stream;
812 
813 		stream->pphc_addr = sdev->bar[HDA_DSP_PP_BAR] +
814 			SOF_HDA_PPHC_BASE + SOF_HDA_PPHC_INTERVAL * i;
815 
816 		stream->pplc_addr = sdev->bar[HDA_DSP_PP_BAR] +
817 			SOF_HDA_PPLC_BASE + SOF_HDA_PPLC_MULTI * num_total +
818 			SOF_HDA_PPLC_INTERVAL * i;
819 
820 		/* do we support SPIB */
821 		if (sdev->bar[HDA_DSP_SPIB_BAR]) {
822 			stream->spib_addr = sdev->bar[HDA_DSP_SPIB_BAR] +
823 				SOF_HDA_SPIB_BASE + SOF_HDA_SPIB_INTERVAL * i +
824 				SOF_HDA_SPIB_SPIB;
825 
826 			stream->fifo_addr = sdev->bar[HDA_DSP_SPIB_BAR] +
827 				SOF_HDA_SPIB_BASE + SOF_HDA_SPIB_INTERVAL * i +
828 				SOF_HDA_SPIB_MAXFIFO;
829 		}
830 
831 		hstream = &stream->hstream;
832 		hstream->bus = bus;
833 		hstream->sd_int_sta_mask = 1 << i;
834 		hstream->index = i;
835 		sd_offset = SOF_STREAM_SD_OFFSET(hstream);
836 		hstream->sd_addr = sdev->bar[HDA_DSP_HDA_BAR] + sd_offset;
837 		hstream->stream_tag = i + 1;
838 		hstream->opened = false;
839 		hstream->running = false;
840 		hstream->direction = SNDRV_PCM_STREAM_CAPTURE;
841 
842 		/* memory alloc for stream BDL */
843 		ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
844 					  HDA_DSP_BDL_SIZE, &hstream->bdl);
845 		if (ret < 0) {
846 			dev_err(sdev->dev, "error: stream bdl dma alloc failed\n");
847 			return -ENOMEM;
848 		}
849 		hstream->posbuf = (__le32 *)(bus->posbuf.area +
850 			(hstream->index) * 8);
851 
852 		list_add_tail(&hstream->list, &bus->stream_list);
853 	}
854 
855 	/* create playback streams */
856 	for (i = num_capture; i < num_total; i++) {
857 		struct sof_intel_hda_stream *hda_stream;
858 
859 		hda_stream = devm_kzalloc(sdev->dev, sizeof(*hda_stream),
860 					  GFP_KERNEL);
861 		if (!hda_stream)
862 			return -ENOMEM;
863 
864 		hda_stream->sdev = sdev;
865 
866 		stream = &hda_stream->hda_stream;
867 
868 		/* we always have DSP support */
869 		stream->pphc_addr = sdev->bar[HDA_DSP_PP_BAR] +
870 			SOF_HDA_PPHC_BASE + SOF_HDA_PPHC_INTERVAL * i;
871 
872 		stream->pplc_addr = sdev->bar[HDA_DSP_PP_BAR] +
873 			SOF_HDA_PPLC_BASE + SOF_HDA_PPLC_MULTI * num_total +
874 			SOF_HDA_PPLC_INTERVAL * i;
875 
876 		/* do we support SPIB */
877 		if (sdev->bar[HDA_DSP_SPIB_BAR]) {
878 			stream->spib_addr = sdev->bar[HDA_DSP_SPIB_BAR] +
879 				SOF_HDA_SPIB_BASE + SOF_HDA_SPIB_INTERVAL * i +
880 				SOF_HDA_SPIB_SPIB;
881 
882 			stream->fifo_addr = sdev->bar[HDA_DSP_SPIB_BAR] +
883 				SOF_HDA_SPIB_BASE + SOF_HDA_SPIB_INTERVAL * i +
884 				SOF_HDA_SPIB_MAXFIFO;
885 		}
886 
887 		hstream = &stream->hstream;
888 		hstream->bus = bus;
889 		hstream->sd_int_sta_mask = 1 << i;
890 		hstream->index = i;
891 		sd_offset = SOF_STREAM_SD_OFFSET(hstream);
892 		hstream->sd_addr = sdev->bar[HDA_DSP_HDA_BAR] + sd_offset;
893 		hstream->stream_tag = i - num_capture + 1;
894 		hstream->opened = false;
895 		hstream->running = false;
896 		hstream->direction = SNDRV_PCM_STREAM_PLAYBACK;
897 
898 		/* mem alloc for stream BDL */
899 		ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
900 					  HDA_DSP_BDL_SIZE, &hstream->bdl);
901 		if (ret < 0) {
902 			dev_err(sdev->dev, "error: stream bdl dma alloc failed\n");
903 			return -ENOMEM;
904 		}
905 
906 		hstream->posbuf = (__le32 *)(bus->posbuf.area +
907 			(hstream->index) * 8);
908 
909 		list_add_tail(&hstream->list, &bus->stream_list);
910 	}
911 
912 	/* store total stream count (playback + capture) from GCAP */
913 	sof_hda->stream_max = num_total;
914 
915 	return 0;
916 }
917 
918 void hda_dsp_stream_free(struct snd_sof_dev *sdev)
919 {
920 	struct hdac_bus *bus = sof_to_bus(sdev);
921 	struct hdac_stream *s, *_s;
922 	struct hdac_ext_stream *stream;
923 	struct sof_intel_hda_stream *hda_stream;
924 
925 	/* free position buffer */
926 	if (bus->posbuf.area)
927 		snd_dma_free_pages(&bus->posbuf);
928 
929 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
930 	/* free position buffer */
931 	if (bus->rb.area)
932 		snd_dma_free_pages(&bus->rb);
933 #endif
934 
935 	list_for_each_entry_safe(s, _s, &bus->stream_list, list) {
936 		/* TODO: decouple */
937 
938 		/* free bdl buffer */
939 		if (s->bdl.area)
940 			snd_dma_free_pages(&s->bdl);
941 		list_del(&s->list);
942 		stream = stream_to_hdac_ext_stream(s);
943 		hda_stream = container_of(stream, struct sof_intel_hda_stream,
944 					  hda_stream);
945 		devm_kfree(sdev->dev, hda_stream);
946 	}
947 }
948