1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   *  Digital Audio (PCM) abstract layer
4   *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5   *                   Abramo Bagnara <abramo@alsa-project.org>
6   */
7  
8  #include <linux/slab.h>
9  #include <linux/sched/signal.h>
10  #include <linux/time.h>
11  #include <linux/math64.h>
12  #include <linux/export.h>
13  #include <sound/core.h>
14  #include <sound/control.h>
15  #include <sound/tlv.h>
16  #include <sound/info.h>
17  #include <sound/pcm.h>
18  #include <sound/pcm_params.h>
19  #include <sound/timer.h>
20  
21  #include "pcm_local.h"
22  
23  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
24  #define CREATE_TRACE_POINTS
25  #include "pcm_trace.h"
26  #else
27  #define trace_hwptr(substream, pos, in_interrupt)
28  #define trace_xrun(substream)
29  #define trace_hw_ptr_error(substream, reason)
30  #define trace_applptr(substream, prev, curr)
31  #endif
32  
33  static int fill_silence_frames(struct snd_pcm_substream *substream,
34  			       snd_pcm_uframes_t off, snd_pcm_uframes_t frames);
35  
36  
update_silence_vars(struct snd_pcm_runtime * runtime,snd_pcm_uframes_t ptr,snd_pcm_uframes_t new_ptr)37  static inline void update_silence_vars(struct snd_pcm_runtime *runtime,
38  				       snd_pcm_uframes_t ptr,
39  				       snd_pcm_uframes_t new_ptr)
40  {
41  	snd_pcm_sframes_t delta;
42  
43  	delta = new_ptr - ptr;
44  	if (delta == 0)
45  		return;
46  	if (delta < 0)
47  		delta += runtime->boundary;
48  	if ((snd_pcm_uframes_t)delta < runtime->silence_filled)
49  		runtime->silence_filled -= delta;
50  	else
51  		runtime->silence_filled = 0;
52  	runtime->silence_start = new_ptr;
53  }
54  
55  /*
56   * fill ring buffer with silence
57   * runtime->silence_start: starting pointer to silence area
58   * runtime->silence_filled: size filled with silence
59   * runtime->silence_threshold: threshold from application
60   * runtime->silence_size: maximal size from application
61   *
62   * when runtime->silence_size >= runtime->boundary - fill processed area with silence immediately
63   */
snd_pcm_playback_silence(struct snd_pcm_substream * substream,snd_pcm_uframes_t new_hw_ptr)64  void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_uframes_t new_hw_ptr)
65  {
66  	struct snd_pcm_runtime *runtime = substream->runtime;
67  	snd_pcm_uframes_t frames, ofs, transfer;
68  	int err;
69  
70  	if (runtime->silence_size < runtime->boundary) {
71  		snd_pcm_sframes_t noise_dist;
72  		snd_pcm_uframes_t appl_ptr = READ_ONCE(runtime->control->appl_ptr);
73  		update_silence_vars(runtime, runtime->silence_start, appl_ptr);
74  		/* initialization outside pointer updates */
75  		if (new_hw_ptr == ULONG_MAX)
76  			new_hw_ptr = runtime->status->hw_ptr;
77  		/* get hw_avail with the boundary crossing */
78  		noise_dist = appl_ptr - new_hw_ptr;
79  		if (noise_dist < 0)
80  			noise_dist += runtime->boundary;
81  		/* total noise distance */
82  		noise_dist += runtime->silence_filled;
83  		if (noise_dist >= (snd_pcm_sframes_t) runtime->silence_threshold)
84  			return;
85  		frames = runtime->silence_threshold - noise_dist;
86  		if (frames > runtime->silence_size)
87  			frames = runtime->silence_size;
88  	} else {
89  		/*
90  		 * This filling mode aims at free-running mode (used for example by dmix),
91  		 * which doesn't update the application pointer.
92  		 */
93  		snd_pcm_uframes_t hw_ptr = runtime->status->hw_ptr;
94  		if (new_hw_ptr == ULONG_MAX) {
95  			/*
96  			 * Initialization, fill the whole unused buffer with silence.
97  			 *
98  			 * Usually, this is entered while stopped, before data is queued,
99  			 * so both pointers are expected to be zero.
100  			 */
101  			snd_pcm_sframes_t avail = runtime->control->appl_ptr - hw_ptr;
102  			if (avail < 0)
103  				avail += runtime->boundary;
104  			/*
105  			 * In free-running mode, appl_ptr will be zero even while running,
106  			 * so we end up with a huge number. There is no useful way to
107  			 * handle this, so we just clear the whole buffer.
108  			 */
109  			runtime->silence_filled = avail > runtime->buffer_size ? 0 : avail;
110  			runtime->silence_start = hw_ptr;
111  		} else {
112  			/* Silence the just played area immediately */
113  			update_silence_vars(runtime, hw_ptr, new_hw_ptr);
114  		}
115  		/*
116  		 * In this mode, silence_filled actually includes the valid
117  		 * sample data from the user.
118  		 */
119  		frames = runtime->buffer_size - runtime->silence_filled;
120  	}
121  	if (snd_BUG_ON(frames > runtime->buffer_size))
122  		return;
123  	if (frames == 0)
124  		return;
125  	ofs = (runtime->silence_start + runtime->silence_filled) % runtime->buffer_size;
126  	do {
127  		transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames;
128  		err = fill_silence_frames(substream, ofs, transfer);
129  		snd_BUG_ON(err < 0);
130  		runtime->silence_filled += transfer;
131  		frames -= transfer;
132  		ofs = 0;
133  	} while (frames > 0);
134  	snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_DEVICE);
135  }
136  
137  #ifdef CONFIG_SND_DEBUG
snd_pcm_debug_name(struct snd_pcm_substream * substream,char * name,size_t len)138  void snd_pcm_debug_name(struct snd_pcm_substream *substream,
139  			   char *name, size_t len)
140  {
141  	snprintf(name, len, "pcmC%dD%d%c:%d",
142  		 substream->pcm->card->number,
143  		 substream->pcm->device,
144  		 substream->stream ? 'c' : 'p',
145  		 substream->number);
146  }
147  EXPORT_SYMBOL(snd_pcm_debug_name);
148  #endif
149  
150  #define XRUN_DEBUG_BASIC	(1<<0)
151  #define XRUN_DEBUG_STACK	(1<<1)	/* dump also stack */
152  #define XRUN_DEBUG_JIFFIESCHECK	(1<<2)	/* do jiffies check */
153  
154  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
155  
156  #define xrun_debug(substream, mask) \
157  			((substream)->pstr->xrun_debug & (mask))
158  #else
159  #define xrun_debug(substream, mask)	0
160  #endif
161  
162  #define dump_stack_on_xrun(substream) do {			\
163  		if (xrun_debug(substream, XRUN_DEBUG_STACK))	\
164  			dump_stack();				\
165  	} while (0)
166  
167  /* call with stream lock held */
__snd_pcm_xrun(struct snd_pcm_substream * substream)168  void __snd_pcm_xrun(struct snd_pcm_substream *substream)
169  {
170  	struct snd_pcm_runtime *runtime = substream->runtime;
171  
172  	trace_xrun(substream);
173  	if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
174  		struct timespec64 tstamp;
175  
176  		snd_pcm_gettime(runtime, &tstamp);
177  		runtime->status->tstamp.tv_sec = tstamp.tv_sec;
178  		runtime->status->tstamp.tv_nsec = tstamp.tv_nsec;
179  	}
180  	snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
181  	if (xrun_debug(substream, XRUN_DEBUG_BASIC)) {
182  		char name[16];
183  		snd_pcm_debug_name(substream, name, sizeof(name));
184  		pcm_warn(substream->pcm, "XRUN: %s\n", name);
185  		dump_stack_on_xrun(substream);
186  	}
187  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
188  	substream->xrun_counter++;
189  #endif
190  }
191  
192  #ifdef CONFIG_SND_PCM_XRUN_DEBUG
193  #define hw_ptr_error(substream, in_interrupt, reason, fmt, args...)	\
194  	do {								\
195  		trace_hw_ptr_error(substream, reason);	\
196  		if (xrun_debug(substream, XRUN_DEBUG_BASIC)) {		\
197  			pr_err_ratelimited("ALSA: PCM: [%c] " reason ": " fmt, \
198  					   (in_interrupt) ? 'Q' : 'P', ##args);	\
199  			dump_stack_on_xrun(substream);			\
200  		}							\
201  	} while (0)
202  
203  #else /* ! CONFIG_SND_PCM_XRUN_DEBUG */
204  
205  #define hw_ptr_error(substream, fmt, args...) do { } while (0)
206  
207  #endif
208  
snd_pcm_update_state(struct snd_pcm_substream * substream,struct snd_pcm_runtime * runtime)209  int snd_pcm_update_state(struct snd_pcm_substream *substream,
210  			 struct snd_pcm_runtime *runtime)
211  {
212  	snd_pcm_uframes_t avail;
213  
214  	avail = snd_pcm_avail(substream);
215  	if (avail > runtime->avail_max)
216  		runtime->avail_max = avail;
217  	if (runtime->state == SNDRV_PCM_STATE_DRAINING) {
218  		if (avail >= runtime->buffer_size) {
219  			snd_pcm_drain_done(substream);
220  			return -EPIPE;
221  		}
222  	} else {
223  		if (avail >= runtime->stop_threshold) {
224  			__snd_pcm_xrun(substream);
225  			return -EPIPE;
226  		}
227  	}
228  	if (runtime->twake) {
229  		if (avail >= runtime->twake)
230  			wake_up(&runtime->tsleep);
231  	} else if (avail >= runtime->control->avail_min)
232  		wake_up(&runtime->sleep);
233  	return 0;
234  }
235  
update_audio_tstamp(struct snd_pcm_substream * substream,struct timespec64 * curr_tstamp,struct timespec64 * audio_tstamp)236  static void update_audio_tstamp(struct snd_pcm_substream *substream,
237  				struct timespec64 *curr_tstamp,
238  				struct timespec64 *audio_tstamp)
239  {
240  	struct snd_pcm_runtime *runtime = substream->runtime;
241  	u64 audio_frames, audio_nsecs;
242  	struct timespec64 driver_tstamp;
243  
244  	if (runtime->tstamp_mode != SNDRV_PCM_TSTAMP_ENABLE)
245  		return;
246  
247  	if (!(substream->ops->get_time_info) ||
248  		(runtime->audio_tstamp_report.actual_type ==
249  			SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) {
250  
251  		/*
252  		 * provide audio timestamp derived from pointer position
253  		 * add delay only if requested
254  		 */
255  
256  		audio_frames = runtime->hw_ptr_wrap + runtime->status->hw_ptr;
257  
258  		if (runtime->audio_tstamp_config.report_delay) {
259  			if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
260  				audio_frames -=  runtime->delay;
261  			else
262  				audio_frames +=  runtime->delay;
263  		}
264  		audio_nsecs = div_u64(audio_frames * 1000000000LL,
265  				runtime->rate);
266  		*audio_tstamp = ns_to_timespec64(audio_nsecs);
267  	}
268  
269  	if (runtime->status->audio_tstamp.tv_sec != audio_tstamp->tv_sec ||
270  	    runtime->status->audio_tstamp.tv_nsec != audio_tstamp->tv_nsec) {
271  		runtime->status->audio_tstamp.tv_sec = audio_tstamp->tv_sec;
272  		runtime->status->audio_tstamp.tv_nsec = audio_tstamp->tv_nsec;
273  		runtime->status->tstamp.tv_sec = curr_tstamp->tv_sec;
274  		runtime->status->tstamp.tv_nsec = curr_tstamp->tv_nsec;
275  	}
276  
277  
278  	/*
279  	 * re-take a driver timestamp to let apps detect if the reference tstamp
280  	 * read by low-level hardware was provided with a delay
281  	 */
282  	snd_pcm_gettime(substream->runtime, &driver_tstamp);
283  	runtime->driver_tstamp = driver_tstamp;
284  }
285  
snd_pcm_update_hw_ptr0(struct snd_pcm_substream * substream,unsigned int in_interrupt)286  static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
287  				  unsigned int in_interrupt)
288  {
289  	struct snd_pcm_runtime *runtime = substream->runtime;
290  	snd_pcm_uframes_t pos;
291  	snd_pcm_uframes_t old_hw_ptr, new_hw_ptr, hw_base;
292  	snd_pcm_sframes_t hdelta, delta;
293  	unsigned long jdelta;
294  	unsigned long curr_jiffies;
295  	struct timespec64 curr_tstamp;
296  	struct timespec64 audio_tstamp;
297  	int crossed_boundary = 0;
298  
299  	old_hw_ptr = runtime->status->hw_ptr;
300  
301  	/*
302  	 * group pointer, time and jiffies reads to allow for more
303  	 * accurate correlations/corrections.
304  	 * The values are stored at the end of this routine after
305  	 * corrections for hw_ptr position
306  	 */
307  	pos = substream->ops->pointer(substream);
308  	curr_jiffies = jiffies;
309  	if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) {
310  		if ((substream->ops->get_time_info) &&
311  			(runtime->audio_tstamp_config.type_requested != SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) {
312  			substream->ops->get_time_info(substream, &curr_tstamp,
313  						&audio_tstamp,
314  						&runtime->audio_tstamp_config,
315  						&runtime->audio_tstamp_report);
316  
317  			/* re-test in case tstamp type is not supported in hardware and was demoted to DEFAULT */
318  			if (runtime->audio_tstamp_report.actual_type == SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)
319  				snd_pcm_gettime(runtime, &curr_tstamp);
320  		} else
321  			snd_pcm_gettime(runtime, &curr_tstamp);
322  	}
323  
324  	if (pos == SNDRV_PCM_POS_XRUN) {
325  		__snd_pcm_xrun(substream);
326  		return -EPIPE;
327  	}
328  	if (pos >= runtime->buffer_size) {
329  		if (printk_ratelimit()) {
330  			char name[16];
331  			snd_pcm_debug_name(substream, name, sizeof(name));
332  			pcm_err(substream->pcm,
333  				"invalid position: %s, pos = %ld, buffer size = %ld, period size = %ld\n",
334  				name, pos, runtime->buffer_size,
335  				runtime->period_size);
336  		}
337  		pos = 0;
338  	}
339  	pos -= pos % runtime->min_align;
340  	trace_hwptr(substream, pos, in_interrupt);
341  	hw_base = runtime->hw_ptr_base;
342  	new_hw_ptr = hw_base + pos;
343  	if (in_interrupt) {
344  		/* we know that one period was processed */
345  		/* delta = "expected next hw_ptr" for in_interrupt != 0 */
346  		delta = runtime->hw_ptr_interrupt + runtime->period_size;
347  		if (delta > new_hw_ptr) {
348  			/* check for double acknowledged interrupts */
349  			hdelta = curr_jiffies - runtime->hw_ptr_jiffies;
350  			if (hdelta > runtime->hw_ptr_buffer_jiffies/2 + 1) {
351  				hw_base += runtime->buffer_size;
352  				if (hw_base >= runtime->boundary) {
353  					hw_base = 0;
354  					crossed_boundary++;
355  				}
356  				new_hw_ptr = hw_base + pos;
357  				goto __delta;
358  			}
359  		}
360  	}
361  	/* new_hw_ptr might be lower than old_hw_ptr in case when */
362  	/* pointer crosses the end of the ring buffer */
363  	if (new_hw_ptr < old_hw_ptr) {
364  		hw_base += runtime->buffer_size;
365  		if (hw_base >= runtime->boundary) {
366  			hw_base = 0;
367  			crossed_boundary++;
368  		}
369  		new_hw_ptr = hw_base + pos;
370  	}
371        __delta:
372  	delta = new_hw_ptr - old_hw_ptr;
373  	if (delta < 0)
374  		delta += runtime->boundary;
375  
376  	if (runtime->no_period_wakeup) {
377  		snd_pcm_sframes_t xrun_threshold;
378  		/*
379  		 * Without regular period interrupts, we have to check
380  		 * the elapsed time to detect xruns.
381  		 */
382  		jdelta = curr_jiffies - runtime->hw_ptr_jiffies;
383  		if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
384  			goto no_delta_check;
385  		hdelta = jdelta - delta * HZ / runtime->rate;
386  		xrun_threshold = runtime->hw_ptr_buffer_jiffies / 2 + 1;
387  		while (hdelta > xrun_threshold) {
388  			delta += runtime->buffer_size;
389  			hw_base += runtime->buffer_size;
390  			if (hw_base >= runtime->boundary) {
391  				hw_base = 0;
392  				crossed_boundary++;
393  			}
394  			new_hw_ptr = hw_base + pos;
395  			hdelta -= runtime->hw_ptr_buffer_jiffies;
396  		}
397  		goto no_delta_check;
398  	}
399  
400  	/* something must be really wrong */
401  	if (delta >= runtime->buffer_size + runtime->period_size) {
402  		hw_ptr_error(substream, in_interrupt, "Unexpected hw_ptr",
403  			     "(stream=%i, pos=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n",
404  			     substream->stream, (long)pos,
405  			     (long)new_hw_ptr, (long)old_hw_ptr);
406  		return 0;
407  	}
408  
409  	/* Do jiffies check only in xrun_debug mode */
410  	if (!xrun_debug(substream, XRUN_DEBUG_JIFFIESCHECK))
411  		goto no_jiffies_check;
412  
413  	/* Skip the jiffies check for hardwares with BATCH flag.
414  	 * Such hardware usually just increases the position at each IRQ,
415  	 * thus it can't give any strange position.
416  	 */
417  	if (runtime->hw.info & SNDRV_PCM_INFO_BATCH)
418  		goto no_jiffies_check;
419  	hdelta = delta;
420  	if (hdelta < runtime->delay)
421  		goto no_jiffies_check;
422  	hdelta -= runtime->delay;
423  	jdelta = curr_jiffies - runtime->hw_ptr_jiffies;
424  	if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
425  		delta = jdelta /
426  			(((runtime->period_size * HZ) / runtime->rate)
427  								+ HZ/100);
428  		/* move new_hw_ptr according jiffies not pos variable */
429  		new_hw_ptr = old_hw_ptr;
430  		hw_base = delta;
431  		/* use loop to avoid checks for delta overflows */
432  		/* the delta value is small or zero in most cases */
433  		while (delta > 0) {
434  			new_hw_ptr += runtime->period_size;
435  			if (new_hw_ptr >= runtime->boundary) {
436  				new_hw_ptr -= runtime->boundary;
437  				crossed_boundary--;
438  			}
439  			delta--;
440  		}
441  		/* align hw_base to buffer_size */
442  		hw_ptr_error(substream, in_interrupt, "hw_ptr skipping",
443  			     "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu/%lu, hw_ptr=%ld/%ld)\n",
444  			     (long)pos, (long)hdelta,
445  			     (long)runtime->period_size, jdelta,
446  			     ((hdelta * HZ) / runtime->rate), hw_base,
447  			     (unsigned long)old_hw_ptr,
448  			     (unsigned long)new_hw_ptr);
449  		/* reset values to proper state */
450  		delta = 0;
451  		hw_base = new_hw_ptr - (new_hw_ptr % runtime->buffer_size);
452  	}
453   no_jiffies_check:
454  	if (delta > runtime->period_size + runtime->period_size / 2) {
455  		hw_ptr_error(substream, in_interrupt,
456  			     "Lost interrupts?",
457  			     "(stream=%i, delta=%ld, new_hw_ptr=%ld, old_hw_ptr=%ld)\n",
458  			     substream->stream, (long)delta,
459  			     (long)new_hw_ptr,
460  			     (long)old_hw_ptr);
461  	}
462  
463   no_delta_check:
464  	if (runtime->status->hw_ptr == new_hw_ptr) {
465  		runtime->hw_ptr_jiffies = curr_jiffies;
466  		update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
467  		return 0;
468  	}
469  
470  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
471  	    runtime->silence_size > 0)
472  		snd_pcm_playback_silence(substream, new_hw_ptr);
473  
474  	if (in_interrupt) {
475  		delta = new_hw_ptr - runtime->hw_ptr_interrupt;
476  		if (delta < 0)
477  			delta += runtime->boundary;
478  		delta -= (snd_pcm_uframes_t)delta % runtime->period_size;
479  		runtime->hw_ptr_interrupt += delta;
480  		if (runtime->hw_ptr_interrupt >= runtime->boundary)
481  			runtime->hw_ptr_interrupt -= runtime->boundary;
482  	}
483  	runtime->hw_ptr_base = hw_base;
484  	runtime->status->hw_ptr = new_hw_ptr;
485  	runtime->hw_ptr_jiffies = curr_jiffies;
486  	if (crossed_boundary) {
487  		snd_BUG_ON(crossed_boundary != 1);
488  		runtime->hw_ptr_wrap += runtime->boundary;
489  	}
490  
491  	update_audio_tstamp(substream, &curr_tstamp, &audio_tstamp);
492  
493  	return snd_pcm_update_state(substream, runtime);
494  }
495  
496  /* CAUTION: call it with irq disabled */
snd_pcm_update_hw_ptr(struct snd_pcm_substream * substream)497  int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
498  {
499  	return snd_pcm_update_hw_ptr0(substream, 0);
500  }
501  
502  /**
503   * snd_pcm_set_ops - set the PCM operators
504   * @pcm: the pcm instance
505   * @direction: stream direction, SNDRV_PCM_STREAM_XXX
506   * @ops: the operator table
507   *
508   * Sets the given PCM operators to the pcm instance.
509   */
snd_pcm_set_ops(struct snd_pcm * pcm,int direction,const struct snd_pcm_ops * ops)510  void snd_pcm_set_ops(struct snd_pcm *pcm, int direction,
511  		     const struct snd_pcm_ops *ops)
512  {
513  	struct snd_pcm_str *stream = &pcm->streams[direction];
514  	struct snd_pcm_substream *substream;
515  
516  	for (substream = stream->substream; substream != NULL; substream = substream->next)
517  		substream->ops = ops;
518  }
519  EXPORT_SYMBOL(snd_pcm_set_ops);
520  
521  /**
522   * snd_pcm_set_sync_per_card - set the PCM sync id with card number
523   * @substream: the pcm substream
524   * @params: modified hardware parameters
525   * @id: identifier (max 12 bytes)
526   * @len: identifier length (max 12 bytes)
527   *
528   * Sets the PCM sync identifier for the card with zero padding.
529   *
530   * User space or any user should use this 16-byte identifier for a comparison only
531   * to check if two IDs are similar or different. Special case is the identifier
532   * containing only zeros. Interpretation for this combination is - empty (not set).
533   * The contents of the identifier should not be interpreted in any other way.
534   *
535   * The synchronization ID must be unique per clock source (usually one sound card,
536   * but multiple soundcard may use one PCM word clock source which means that they
537   * are fully synchronized).
538   *
539   * This routine composes this ID using card number in first four bytes and
540   * 12-byte additional ID. When other ID composition is used (e.g. for multiple
541   * sound cards), make sure that the composition does not clash with this
542   * composition scheme.
543   */
snd_pcm_set_sync_per_card(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,const unsigned char * id,unsigned int len)544  void snd_pcm_set_sync_per_card(struct snd_pcm_substream *substream,
545  			       struct snd_pcm_hw_params *params,
546  			       const unsigned char *id, unsigned int len)
547  {
548  	*(__u32 *)params->sync = cpu_to_le32(substream->pcm->card->number);
549  	len = min(12, len);
550  	memcpy(params->sync + 4, id, len);
551  	memset(params->sync + 4 + len, 0, 12 - len);
552  }
553  EXPORT_SYMBOL_GPL(snd_pcm_set_sync_per_card);
554  
555  /*
556   *  Standard ioctl routine
557   */
558  
div32(unsigned int a,unsigned int b,unsigned int * r)559  static inline unsigned int div32(unsigned int a, unsigned int b,
560  				 unsigned int *r)
561  {
562  	if (b == 0) {
563  		*r = 0;
564  		return UINT_MAX;
565  	}
566  	*r = a % b;
567  	return a / b;
568  }
569  
div_down(unsigned int a,unsigned int b)570  static inline unsigned int div_down(unsigned int a, unsigned int b)
571  {
572  	if (b == 0)
573  		return UINT_MAX;
574  	return a / b;
575  }
576  
div_up(unsigned int a,unsigned int b)577  static inline unsigned int div_up(unsigned int a, unsigned int b)
578  {
579  	unsigned int r;
580  	unsigned int q;
581  	if (b == 0)
582  		return UINT_MAX;
583  	q = div32(a, b, &r);
584  	if (r)
585  		++q;
586  	return q;
587  }
588  
mul(unsigned int a,unsigned int b)589  static inline unsigned int mul(unsigned int a, unsigned int b)
590  {
591  	if (a == 0)
592  		return 0;
593  	if (div_down(UINT_MAX, a) < b)
594  		return UINT_MAX;
595  	return a * b;
596  }
597  
muldiv32(unsigned int a,unsigned int b,unsigned int c,unsigned int * r)598  static inline unsigned int muldiv32(unsigned int a, unsigned int b,
599  				    unsigned int c, unsigned int *r)
600  {
601  	u_int64_t n = (u_int64_t) a * b;
602  	if (c == 0) {
603  		*r = 0;
604  		return UINT_MAX;
605  	}
606  	n = div_u64_rem(n, c, r);
607  	if (n >= UINT_MAX) {
608  		*r = 0;
609  		return UINT_MAX;
610  	}
611  	return n;
612  }
613  
614  /**
615   * snd_interval_refine - refine the interval value of configurator
616   * @i: the interval value to refine
617   * @v: the interval value to refer to
618   *
619   * Refines the interval value with the reference value.
620   * The interval is changed to the range satisfying both intervals.
621   * The interval status (min, max, integer, etc.) are evaluated.
622   *
623   * Return: Positive if the value is changed, zero if it's not changed, or a
624   * negative error code.
625   */
snd_interval_refine(struct snd_interval * i,const struct snd_interval * v)626  int snd_interval_refine(struct snd_interval *i, const struct snd_interval *v)
627  {
628  	int changed = 0;
629  	if (snd_BUG_ON(snd_interval_empty(i)))
630  		return -EINVAL;
631  	if (i->min < v->min) {
632  		i->min = v->min;
633  		i->openmin = v->openmin;
634  		changed = 1;
635  	} else if (i->min == v->min && !i->openmin && v->openmin) {
636  		i->openmin = 1;
637  		changed = 1;
638  	}
639  	if (i->max > v->max) {
640  		i->max = v->max;
641  		i->openmax = v->openmax;
642  		changed = 1;
643  	} else if (i->max == v->max && !i->openmax && v->openmax) {
644  		i->openmax = 1;
645  		changed = 1;
646  	}
647  	if (!i->integer && v->integer) {
648  		i->integer = 1;
649  		changed = 1;
650  	}
651  	if (i->integer) {
652  		if (i->openmin) {
653  			i->min++;
654  			i->openmin = 0;
655  		}
656  		if (i->openmax) {
657  			i->max--;
658  			i->openmax = 0;
659  		}
660  	} else if (!i->openmin && !i->openmax && i->min == i->max)
661  		i->integer = 1;
662  	if (snd_interval_checkempty(i)) {
663  		snd_interval_none(i);
664  		return -EINVAL;
665  	}
666  	return changed;
667  }
668  EXPORT_SYMBOL(snd_interval_refine);
669  
snd_interval_refine_first(struct snd_interval * i)670  static int snd_interval_refine_first(struct snd_interval *i)
671  {
672  	const unsigned int last_max = i->max;
673  
674  	if (snd_BUG_ON(snd_interval_empty(i)))
675  		return -EINVAL;
676  	if (snd_interval_single(i))
677  		return 0;
678  	i->max = i->min;
679  	if (i->openmin)
680  		i->max++;
681  	/* only exclude max value if also excluded before refine */
682  	i->openmax = (i->openmax && i->max >= last_max);
683  	return 1;
684  }
685  
snd_interval_refine_last(struct snd_interval * i)686  static int snd_interval_refine_last(struct snd_interval *i)
687  {
688  	const unsigned int last_min = i->min;
689  
690  	if (snd_BUG_ON(snd_interval_empty(i)))
691  		return -EINVAL;
692  	if (snd_interval_single(i))
693  		return 0;
694  	i->min = i->max;
695  	if (i->openmax)
696  		i->min--;
697  	/* only exclude min value if also excluded before refine */
698  	i->openmin = (i->openmin && i->min <= last_min);
699  	return 1;
700  }
701  
snd_interval_mul(const struct snd_interval * a,const struct snd_interval * b,struct snd_interval * c)702  void snd_interval_mul(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c)
703  {
704  	if (a->empty || b->empty) {
705  		snd_interval_none(c);
706  		return;
707  	}
708  	c->empty = 0;
709  	c->min = mul(a->min, b->min);
710  	c->openmin = (a->openmin || b->openmin);
711  	c->max = mul(a->max,  b->max);
712  	c->openmax = (a->openmax || b->openmax);
713  	c->integer = (a->integer && b->integer);
714  }
715  
716  /**
717   * snd_interval_div - refine the interval value with division
718   * @a: dividend
719   * @b: divisor
720   * @c: quotient
721   *
722   * c = a / b
723   *
724   * Returns non-zero if the value is changed, zero if not changed.
725   */
snd_interval_div(const struct snd_interval * a,const struct snd_interval * b,struct snd_interval * c)726  void snd_interval_div(const struct snd_interval *a, const struct snd_interval *b, struct snd_interval *c)
727  {
728  	unsigned int r;
729  	if (a->empty || b->empty) {
730  		snd_interval_none(c);
731  		return;
732  	}
733  	c->empty = 0;
734  	c->min = div32(a->min, b->max, &r);
735  	c->openmin = (r || a->openmin || b->openmax);
736  	if (b->min > 0) {
737  		c->max = div32(a->max, b->min, &r);
738  		if (r) {
739  			c->max++;
740  			c->openmax = 1;
741  		} else
742  			c->openmax = (a->openmax || b->openmin);
743  	} else {
744  		c->max = UINT_MAX;
745  		c->openmax = 0;
746  	}
747  	c->integer = 0;
748  }
749  
750  /**
751   * snd_interval_muldivk - refine the interval value
752   * @a: dividend 1
753   * @b: dividend 2
754   * @k: divisor (as integer)
755   * @c: result
756    *
757   * c = a * b / k
758   *
759   * Returns non-zero if the value is changed, zero if not changed.
760   */
snd_interval_muldivk(const struct snd_interval * a,const struct snd_interval * b,unsigned int k,struct snd_interval * c)761  void snd_interval_muldivk(const struct snd_interval *a, const struct snd_interval *b,
762  		      unsigned int k, struct snd_interval *c)
763  {
764  	unsigned int r;
765  	if (a->empty || b->empty) {
766  		snd_interval_none(c);
767  		return;
768  	}
769  	c->empty = 0;
770  	c->min = muldiv32(a->min, b->min, k, &r);
771  	c->openmin = (r || a->openmin || b->openmin);
772  	c->max = muldiv32(a->max, b->max, k, &r);
773  	if (r) {
774  		c->max++;
775  		c->openmax = 1;
776  	} else
777  		c->openmax = (a->openmax || b->openmax);
778  	c->integer = 0;
779  }
780  
781  /**
782   * snd_interval_mulkdiv - refine the interval value
783   * @a: dividend 1
784   * @k: dividend 2 (as integer)
785   * @b: divisor
786   * @c: result
787   *
788   * c = a * k / b
789   *
790   * Returns non-zero if the value is changed, zero if not changed.
791   */
snd_interval_mulkdiv(const struct snd_interval * a,unsigned int k,const struct snd_interval * b,struct snd_interval * c)792  void snd_interval_mulkdiv(const struct snd_interval *a, unsigned int k,
793  		      const struct snd_interval *b, struct snd_interval *c)
794  {
795  	unsigned int r;
796  	if (a->empty || b->empty) {
797  		snd_interval_none(c);
798  		return;
799  	}
800  	c->empty = 0;
801  	c->min = muldiv32(a->min, k, b->max, &r);
802  	c->openmin = (r || a->openmin || b->openmax);
803  	if (b->min > 0) {
804  		c->max = muldiv32(a->max, k, b->min, &r);
805  		if (r) {
806  			c->max++;
807  			c->openmax = 1;
808  		} else
809  			c->openmax = (a->openmax || b->openmin);
810  	} else {
811  		c->max = UINT_MAX;
812  		c->openmax = 0;
813  	}
814  	c->integer = 0;
815  }
816  
817  /* ---- */
818  
819  
820  /**
821   * snd_interval_ratnum - refine the interval value
822   * @i: interval to refine
823   * @rats_count: number of ratnum_t
824   * @rats: ratnum_t array
825   * @nump: pointer to store the resultant numerator
826   * @denp: pointer to store the resultant denominator
827   *
828   * Return: Positive if the value is changed, zero if it's not changed, or a
829   * negative error code.
830   */
snd_interval_ratnum(struct snd_interval * i,unsigned int rats_count,const struct snd_ratnum * rats,unsigned int * nump,unsigned int * denp)831  int snd_interval_ratnum(struct snd_interval *i,
832  			unsigned int rats_count, const struct snd_ratnum *rats,
833  			unsigned int *nump, unsigned int *denp)
834  {
835  	unsigned int best_num, best_den;
836  	int best_diff;
837  	unsigned int k;
838  	struct snd_interval t;
839  	int err;
840  	unsigned int result_num, result_den;
841  	int result_diff;
842  
843  	best_num = best_den = best_diff = 0;
844  	for (k = 0; k < rats_count; ++k) {
845  		unsigned int num = rats[k].num;
846  		unsigned int den;
847  		unsigned int q = i->min;
848  		int diff;
849  		if (q == 0)
850  			q = 1;
851  		den = div_up(num, q);
852  		if (den < rats[k].den_min)
853  			continue;
854  		if (den > rats[k].den_max)
855  			den = rats[k].den_max;
856  		else {
857  			unsigned int r;
858  			r = (den - rats[k].den_min) % rats[k].den_step;
859  			if (r != 0)
860  				den -= r;
861  		}
862  		diff = num - q * den;
863  		if (diff < 0)
864  			diff = -diff;
865  		if (best_num == 0 ||
866  		    diff * best_den < best_diff * den) {
867  			best_diff = diff;
868  			best_den = den;
869  			best_num = num;
870  		}
871  	}
872  	if (best_den == 0) {
873  		i->empty = 1;
874  		return -EINVAL;
875  	}
876  	t.min = div_down(best_num, best_den);
877  	t.openmin = !!(best_num % best_den);
878  
879  	result_num = best_num;
880  	result_diff = best_diff;
881  	result_den = best_den;
882  	best_num = best_den = best_diff = 0;
883  	for (k = 0; k < rats_count; ++k) {
884  		unsigned int num = rats[k].num;
885  		unsigned int den;
886  		unsigned int q = i->max;
887  		int diff;
888  		if (q == 0) {
889  			i->empty = 1;
890  			return -EINVAL;
891  		}
892  		den = div_down(num, q);
893  		if (den > rats[k].den_max)
894  			continue;
895  		if (den < rats[k].den_min)
896  			den = rats[k].den_min;
897  		else {
898  			unsigned int r;
899  			r = (den - rats[k].den_min) % rats[k].den_step;
900  			if (r != 0)
901  				den += rats[k].den_step - r;
902  		}
903  		diff = q * den - num;
904  		if (diff < 0)
905  			diff = -diff;
906  		if (best_num == 0 ||
907  		    diff * best_den < best_diff * den) {
908  			best_diff = diff;
909  			best_den = den;
910  			best_num = num;
911  		}
912  	}
913  	if (best_den == 0) {
914  		i->empty = 1;
915  		return -EINVAL;
916  	}
917  	t.max = div_up(best_num, best_den);
918  	t.openmax = !!(best_num % best_den);
919  	t.integer = 0;
920  	err = snd_interval_refine(i, &t);
921  	if (err < 0)
922  		return err;
923  
924  	if (snd_interval_single(i)) {
925  		if (best_diff * result_den < result_diff * best_den) {
926  			result_num = best_num;
927  			result_den = best_den;
928  		}
929  		if (nump)
930  			*nump = result_num;
931  		if (denp)
932  			*denp = result_den;
933  	}
934  	return err;
935  }
936  EXPORT_SYMBOL(snd_interval_ratnum);
937  
938  /**
939   * snd_interval_ratden - refine the interval value
940   * @i: interval to refine
941   * @rats_count: number of struct ratden
942   * @rats: struct ratden array
943   * @nump: pointer to store the resultant numerator
944   * @denp: pointer to store the resultant denominator
945   *
946   * Return: Positive if the value is changed, zero if it's not changed, or a
947   * negative error code.
948   */
snd_interval_ratden(struct snd_interval * i,unsigned int rats_count,const struct snd_ratden * rats,unsigned int * nump,unsigned int * denp)949  static int snd_interval_ratden(struct snd_interval *i,
950  			       unsigned int rats_count,
951  			       const struct snd_ratden *rats,
952  			       unsigned int *nump, unsigned int *denp)
953  {
954  	unsigned int best_num, best_diff, best_den;
955  	unsigned int k;
956  	struct snd_interval t;
957  	int err;
958  
959  	best_num = best_den = best_diff = 0;
960  	for (k = 0; k < rats_count; ++k) {
961  		unsigned int num;
962  		unsigned int den = rats[k].den;
963  		unsigned int q = i->min;
964  		int diff;
965  		num = mul(q, den);
966  		if (num > rats[k].num_max)
967  			continue;
968  		if (num < rats[k].num_min)
969  			num = rats[k].num_max;
970  		else {
971  			unsigned int r;
972  			r = (num - rats[k].num_min) % rats[k].num_step;
973  			if (r != 0)
974  				num += rats[k].num_step - r;
975  		}
976  		diff = num - q * den;
977  		if (best_num == 0 ||
978  		    diff * best_den < best_diff * den) {
979  			best_diff = diff;
980  			best_den = den;
981  			best_num = num;
982  		}
983  	}
984  	if (best_den == 0) {
985  		i->empty = 1;
986  		return -EINVAL;
987  	}
988  	t.min = div_down(best_num, best_den);
989  	t.openmin = !!(best_num % best_den);
990  
991  	best_num = best_den = best_diff = 0;
992  	for (k = 0; k < rats_count; ++k) {
993  		unsigned int num;
994  		unsigned int den = rats[k].den;
995  		unsigned int q = i->max;
996  		int diff;
997  		num = mul(q, den);
998  		if (num < rats[k].num_min)
999  			continue;
1000  		if (num > rats[k].num_max)
1001  			num = rats[k].num_max;
1002  		else {
1003  			unsigned int r;
1004  			r = (num - rats[k].num_min) % rats[k].num_step;
1005  			if (r != 0)
1006  				num -= r;
1007  		}
1008  		diff = q * den - num;
1009  		if (best_num == 0 ||
1010  		    diff * best_den < best_diff * den) {
1011  			best_diff = diff;
1012  			best_den = den;
1013  			best_num = num;
1014  		}
1015  	}
1016  	if (best_den == 0) {
1017  		i->empty = 1;
1018  		return -EINVAL;
1019  	}
1020  	t.max = div_up(best_num, best_den);
1021  	t.openmax = !!(best_num % best_den);
1022  	t.integer = 0;
1023  	err = snd_interval_refine(i, &t);
1024  	if (err < 0)
1025  		return err;
1026  
1027  	if (snd_interval_single(i)) {
1028  		if (nump)
1029  			*nump = best_num;
1030  		if (denp)
1031  			*denp = best_den;
1032  	}
1033  	return err;
1034  }
1035  
1036  /**
1037   * snd_interval_list - refine the interval value from the list
1038   * @i: the interval value to refine
1039   * @count: the number of elements in the list
1040   * @list: the value list
1041   * @mask: the bit-mask to evaluate
1042   *
1043   * Refines the interval value from the list.
1044   * When mask is non-zero, only the elements corresponding to bit 1 are
1045   * evaluated.
1046   *
1047   * Return: Positive if the value is changed, zero if it's not changed, or a
1048   * negative error code.
1049   */
snd_interval_list(struct snd_interval * i,unsigned int count,const unsigned int * list,unsigned int mask)1050  int snd_interval_list(struct snd_interval *i, unsigned int count,
1051  		      const unsigned int *list, unsigned int mask)
1052  {
1053          unsigned int k;
1054  	struct snd_interval list_range;
1055  
1056  	if (!count) {
1057  		i->empty = 1;
1058  		return -EINVAL;
1059  	}
1060  	snd_interval_any(&list_range);
1061  	list_range.min = UINT_MAX;
1062  	list_range.max = 0;
1063          for (k = 0; k < count; k++) {
1064  		if (mask && !(mask & (1 << k)))
1065  			continue;
1066  		if (!snd_interval_test(i, list[k]))
1067  			continue;
1068  		list_range.min = min(list_range.min, list[k]);
1069  		list_range.max = max(list_range.max, list[k]);
1070          }
1071  	return snd_interval_refine(i, &list_range);
1072  }
1073  EXPORT_SYMBOL(snd_interval_list);
1074  
1075  /**
1076   * snd_interval_ranges - refine the interval value from the list of ranges
1077   * @i: the interval value to refine
1078   * @count: the number of elements in the list of ranges
1079   * @ranges: the ranges list
1080   * @mask: the bit-mask to evaluate
1081   *
1082   * Refines the interval value from the list of ranges.
1083   * When mask is non-zero, only the elements corresponding to bit 1 are
1084   * evaluated.
1085   *
1086   * Return: Positive if the value is changed, zero if it's not changed, or a
1087   * negative error code.
1088   */
snd_interval_ranges(struct snd_interval * i,unsigned int count,const struct snd_interval * ranges,unsigned int mask)1089  int snd_interval_ranges(struct snd_interval *i, unsigned int count,
1090  			const struct snd_interval *ranges, unsigned int mask)
1091  {
1092  	unsigned int k;
1093  	struct snd_interval range_union;
1094  	struct snd_interval range;
1095  
1096  	if (!count) {
1097  		snd_interval_none(i);
1098  		return -EINVAL;
1099  	}
1100  	snd_interval_any(&range_union);
1101  	range_union.min = UINT_MAX;
1102  	range_union.max = 0;
1103  	for (k = 0; k < count; k++) {
1104  		if (mask && !(mask & (1 << k)))
1105  			continue;
1106  		snd_interval_copy(&range, &ranges[k]);
1107  		if (snd_interval_refine(&range, i) < 0)
1108  			continue;
1109  		if (snd_interval_empty(&range))
1110  			continue;
1111  
1112  		if (range.min < range_union.min) {
1113  			range_union.min = range.min;
1114  			range_union.openmin = 1;
1115  		}
1116  		if (range.min == range_union.min && !range.openmin)
1117  			range_union.openmin = 0;
1118  		if (range.max > range_union.max) {
1119  			range_union.max = range.max;
1120  			range_union.openmax = 1;
1121  		}
1122  		if (range.max == range_union.max && !range.openmax)
1123  			range_union.openmax = 0;
1124  	}
1125  	return snd_interval_refine(i, &range_union);
1126  }
1127  EXPORT_SYMBOL(snd_interval_ranges);
1128  
snd_interval_step(struct snd_interval * i,unsigned int step)1129  static int snd_interval_step(struct snd_interval *i, unsigned int step)
1130  {
1131  	unsigned int n;
1132  	int changed = 0;
1133  	n = i->min % step;
1134  	if (n != 0 || i->openmin) {
1135  		i->min += step - n;
1136  		i->openmin = 0;
1137  		changed = 1;
1138  	}
1139  	n = i->max % step;
1140  	if (n != 0 || i->openmax) {
1141  		i->max -= n;
1142  		i->openmax = 0;
1143  		changed = 1;
1144  	}
1145  	if (snd_interval_checkempty(i)) {
1146  		i->empty = 1;
1147  		return -EINVAL;
1148  	}
1149  	return changed;
1150  }
1151  
1152  /* Info constraints helpers */
1153  
1154  /**
1155   * snd_pcm_hw_rule_add - add the hw-constraint rule
1156   * @runtime: the pcm runtime instance
1157   * @cond: condition bits
1158   * @var: the variable to evaluate
1159   * @func: the evaluation function
1160   * @private: the private data pointer passed to function
1161   * @dep: the dependent variables
1162   *
1163   * Return: Zero if successful, or a negative error code on failure.
1164   */
snd_pcm_hw_rule_add(struct snd_pcm_runtime * runtime,unsigned int cond,int var,snd_pcm_hw_rule_func_t func,void * private,int dep,...)1165  int snd_pcm_hw_rule_add(struct snd_pcm_runtime *runtime, unsigned int cond,
1166  			int var,
1167  			snd_pcm_hw_rule_func_t func, void *private,
1168  			int dep, ...)
1169  {
1170  	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1171  	struct snd_pcm_hw_rule *c;
1172  	unsigned int k;
1173  	va_list args;
1174  	va_start(args, dep);
1175  	if (constrs->rules_num >= constrs->rules_all) {
1176  		struct snd_pcm_hw_rule *new;
1177  		unsigned int new_rules = constrs->rules_all + 16;
1178  		new = krealloc_array(constrs->rules, new_rules,
1179  				     sizeof(*c), GFP_KERNEL);
1180  		if (!new) {
1181  			va_end(args);
1182  			return -ENOMEM;
1183  		}
1184  		constrs->rules = new;
1185  		constrs->rules_all = new_rules;
1186  	}
1187  	c = &constrs->rules[constrs->rules_num];
1188  	c->cond = cond;
1189  	c->func = func;
1190  	c->var = var;
1191  	c->private = private;
1192  	k = 0;
1193  	while (1) {
1194  		if (snd_BUG_ON(k >= ARRAY_SIZE(c->deps))) {
1195  			va_end(args);
1196  			return -EINVAL;
1197  		}
1198  		c->deps[k++] = dep;
1199  		if (dep < 0)
1200  			break;
1201  		dep = va_arg(args, int);
1202  	}
1203  	constrs->rules_num++;
1204  	va_end(args);
1205  	return 0;
1206  }
1207  EXPORT_SYMBOL(snd_pcm_hw_rule_add);
1208  
1209  /**
1210   * snd_pcm_hw_constraint_mask - apply the given bitmap mask constraint
1211   * @runtime: PCM runtime instance
1212   * @var: hw_params variable to apply the mask
1213   * @mask: the bitmap mask
1214   *
1215   * Apply the constraint of the given bitmap mask to a 32-bit mask parameter.
1216   *
1217   * Return: Zero if successful, or a negative error code on failure.
1218   */
snd_pcm_hw_constraint_mask(struct snd_pcm_runtime * runtime,snd_pcm_hw_param_t var,u_int32_t mask)1219  int snd_pcm_hw_constraint_mask(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1220  			       u_int32_t mask)
1221  {
1222  	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1223  	struct snd_mask *maskp = constrs_mask(constrs, var);
1224  	*maskp->bits &= mask;
1225  	memset(maskp->bits + 1, 0, (SNDRV_MASK_MAX-32) / 8); /* clear rest */
1226  	if (*maskp->bits == 0)
1227  		return -EINVAL;
1228  	return 0;
1229  }
1230  
1231  /**
1232   * snd_pcm_hw_constraint_mask64 - apply the given bitmap mask constraint
1233   * @runtime: PCM runtime instance
1234   * @var: hw_params variable to apply the mask
1235   * @mask: the 64bit bitmap mask
1236   *
1237   * Apply the constraint of the given bitmap mask to a 64-bit mask parameter.
1238   *
1239   * Return: Zero if successful, or a negative error code on failure.
1240   */
snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime * runtime,snd_pcm_hw_param_t var,u_int64_t mask)1241  int snd_pcm_hw_constraint_mask64(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1242  				 u_int64_t mask)
1243  {
1244  	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1245  	struct snd_mask *maskp = constrs_mask(constrs, var);
1246  	maskp->bits[0] &= (u_int32_t)mask;
1247  	maskp->bits[1] &= (u_int32_t)(mask >> 32);
1248  	memset(maskp->bits + 2, 0, (SNDRV_MASK_MAX-64) / 8); /* clear rest */
1249  	if (! maskp->bits[0] && ! maskp->bits[1])
1250  		return -EINVAL;
1251  	return 0;
1252  }
1253  EXPORT_SYMBOL(snd_pcm_hw_constraint_mask64);
1254  
1255  /**
1256   * snd_pcm_hw_constraint_integer - apply an integer constraint to an interval
1257   * @runtime: PCM runtime instance
1258   * @var: hw_params variable to apply the integer constraint
1259   *
1260   * Apply the constraint of integer to an interval parameter.
1261   *
1262   * Return: Positive if the value is changed, zero if it's not changed, or a
1263   * negative error code.
1264   */
snd_pcm_hw_constraint_integer(struct snd_pcm_runtime * runtime,snd_pcm_hw_param_t var)1265  int snd_pcm_hw_constraint_integer(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var)
1266  {
1267  	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1268  	return snd_interval_setinteger(constrs_interval(constrs, var));
1269  }
1270  EXPORT_SYMBOL(snd_pcm_hw_constraint_integer);
1271  
1272  /**
1273   * snd_pcm_hw_constraint_minmax - apply a min/max range constraint to an interval
1274   * @runtime: PCM runtime instance
1275   * @var: hw_params variable to apply the range
1276   * @min: the minimal value
1277   * @max: the maximal value
1278   *
1279   * Apply the min/max range constraint to an interval parameter.
1280   *
1281   * Return: Positive if the value is changed, zero if it's not changed, or a
1282   * negative error code.
1283   */
snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime * runtime,snd_pcm_hw_param_t var,unsigned int min,unsigned int max)1284  int snd_pcm_hw_constraint_minmax(struct snd_pcm_runtime *runtime, snd_pcm_hw_param_t var,
1285  				 unsigned int min, unsigned int max)
1286  {
1287  	struct snd_pcm_hw_constraints *constrs = &runtime->hw_constraints;
1288  	struct snd_interval t;
1289  	t.min = min;
1290  	t.max = max;
1291  	t.openmin = t.openmax = 0;
1292  	t.integer = 0;
1293  	return snd_interval_refine(constrs_interval(constrs, var), &t);
1294  }
1295  EXPORT_SYMBOL(snd_pcm_hw_constraint_minmax);
1296  
snd_pcm_hw_rule_list(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1297  static int snd_pcm_hw_rule_list(struct snd_pcm_hw_params *params,
1298  				struct snd_pcm_hw_rule *rule)
1299  {
1300  	struct snd_pcm_hw_constraint_list *list = rule->private;
1301  	return snd_interval_list(hw_param_interval(params, rule->var), list->count, list->list, list->mask);
1302  }
1303  
1304  
1305  /**
1306   * snd_pcm_hw_constraint_list - apply a list of constraints to a parameter
1307   * @runtime: PCM runtime instance
1308   * @cond: condition bits
1309   * @var: hw_params variable to apply the list constraint
1310   * @l: list
1311   *
1312   * Apply the list of constraints to an interval parameter.
1313   *
1314   * Return: Zero if successful, or a negative error code on failure.
1315   */
snd_pcm_hw_constraint_list(struct snd_pcm_runtime * runtime,unsigned int cond,snd_pcm_hw_param_t var,const struct snd_pcm_hw_constraint_list * l)1316  int snd_pcm_hw_constraint_list(struct snd_pcm_runtime *runtime,
1317  			       unsigned int cond,
1318  			       snd_pcm_hw_param_t var,
1319  			       const struct snd_pcm_hw_constraint_list *l)
1320  {
1321  	return snd_pcm_hw_rule_add(runtime, cond, var,
1322  				   snd_pcm_hw_rule_list, (void *)l,
1323  				   var, -1);
1324  }
1325  EXPORT_SYMBOL(snd_pcm_hw_constraint_list);
1326  
snd_pcm_hw_rule_ranges(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1327  static int snd_pcm_hw_rule_ranges(struct snd_pcm_hw_params *params,
1328  				  struct snd_pcm_hw_rule *rule)
1329  {
1330  	struct snd_pcm_hw_constraint_ranges *r = rule->private;
1331  	return snd_interval_ranges(hw_param_interval(params, rule->var),
1332  				   r->count, r->ranges, r->mask);
1333  }
1334  
1335  
1336  /**
1337   * snd_pcm_hw_constraint_ranges - apply list of range constraints to a parameter
1338   * @runtime: PCM runtime instance
1339   * @cond: condition bits
1340   * @var: hw_params variable to apply the list of range constraints
1341   * @r: ranges
1342   *
1343   * Apply the list of range constraints to an interval parameter.
1344   *
1345   * Return: Zero if successful, or a negative error code on failure.
1346   */
snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime * runtime,unsigned int cond,snd_pcm_hw_param_t var,const struct snd_pcm_hw_constraint_ranges * r)1347  int snd_pcm_hw_constraint_ranges(struct snd_pcm_runtime *runtime,
1348  				 unsigned int cond,
1349  				 snd_pcm_hw_param_t var,
1350  				 const struct snd_pcm_hw_constraint_ranges *r)
1351  {
1352  	return snd_pcm_hw_rule_add(runtime, cond, var,
1353  				   snd_pcm_hw_rule_ranges, (void *)r,
1354  				   var, -1);
1355  }
1356  EXPORT_SYMBOL(snd_pcm_hw_constraint_ranges);
1357  
snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1358  static int snd_pcm_hw_rule_ratnums(struct snd_pcm_hw_params *params,
1359  				   struct snd_pcm_hw_rule *rule)
1360  {
1361  	const struct snd_pcm_hw_constraint_ratnums *r = rule->private;
1362  	unsigned int num = 0, den = 0;
1363  	int err;
1364  	err = snd_interval_ratnum(hw_param_interval(params, rule->var),
1365  				  r->nrats, r->rats, &num, &den);
1366  	if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
1367  		params->rate_num = num;
1368  		params->rate_den = den;
1369  	}
1370  	return err;
1371  }
1372  
1373  /**
1374   * snd_pcm_hw_constraint_ratnums - apply ratnums constraint to a parameter
1375   * @runtime: PCM runtime instance
1376   * @cond: condition bits
1377   * @var: hw_params variable to apply the ratnums constraint
1378   * @r: struct snd_ratnums constriants
1379   *
1380   * Return: Zero if successful, or a negative error code on failure.
1381   */
snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime * runtime,unsigned int cond,snd_pcm_hw_param_t var,const struct snd_pcm_hw_constraint_ratnums * r)1382  int snd_pcm_hw_constraint_ratnums(struct snd_pcm_runtime *runtime,
1383  				  unsigned int cond,
1384  				  snd_pcm_hw_param_t var,
1385  				  const struct snd_pcm_hw_constraint_ratnums *r)
1386  {
1387  	return snd_pcm_hw_rule_add(runtime, cond, var,
1388  				   snd_pcm_hw_rule_ratnums, (void *)r,
1389  				   var, -1);
1390  }
1391  EXPORT_SYMBOL(snd_pcm_hw_constraint_ratnums);
1392  
snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1393  static int snd_pcm_hw_rule_ratdens(struct snd_pcm_hw_params *params,
1394  				   struct snd_pcm_hw_rule *rule)
1395  {
1396  	const struct snd_pcm_hw_constraint_ratdens *r = rule->private;
1397  	unsigned int num = 0, den = 0;
1398  	int err = snd_interval_ratden(hw_param_interval(params, rule->var),
1399  				  r->nrats, r->rats, &num, &den);
1400  	if (err >= 0 && den && rule->var == SNDRV_PCM_HW_PARAM_RATE) {
1401  		params->rate_num = num;
1402  		params->rate_den = den;
1403  	}
1404  	return err;
1405  }
1406  
1407  /**
1408   * snd_pcm_hw_constraint_ratdens - apply ratdens constraint to a parameter
1409   * @runtime: PCM runtime instance
1410   * @cond: condition bits
1411   * @var: hw_params variable to apply the ratdens constraint
1412   * @r: struct snd_ratdens constriants
1413   *
1414   * Return: Zero if successful, or a negative error code on failure.
1415   */
snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime * runtime,unsigned int cond,snd_pcm_hw_param_t var,const struct snd_pcm_hw_constraint_ratdens * r)1416  int snd_pcm_hw_constraint_ratdens(struct snd_pcm_runtime *runtime,
1417  				  unsigned int cond,
1418  				  snd_pcm_hw_param_t var,
1419  				  const struct snd_pcm_hw_constraint_ratdens *r)
1420  {
1421  	return snd_pcm_hw_rule_add(runtime, cond, var,
1422  				   snd_pcm_hw_rule_ratdens, (void *)r,
1423  				   var, -1);
1424  }
1425  EXPORT_SYMBOL(snd_pcm_hw_constraint_ratdens);
1426  
snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1427  static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params,
1428  				  struct snd_pcm_hw_rule *rule)
1429  {
1430  	unsigned int l = (unsigned long) rule->private;
1431  	int width = l & 0xffff;
1432  	unsigned int msbits = l >> 16;
1433  	const struct snd_interval *i =
1434  		hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
1435  
1436  	if (!snd_interval_single(i))
1437  		return 0;
1438  
1439  	if ((snd_interval_value(i) == width) ||
1440  	    (width == 0 && snd_interval_value(i) > msbits))
1441  		params->msbits = min_not_zero(params->msbits, msbits);
1442  
1443  	return 0;
1444  }
1445  
1446  /**
1447   * snd_pcm_hw_constraint_msbits - add a hw constraint msbits rule
1448   * @runtime: PCM runtime instance
1449   * @cond: condition bits
1450   * @width: sample bits width
1451   * @msbits: msbits width
1452   *
1453   * This constraint will set the number of most significant bits (msbits) if a
1454   * sample format with the specified width has been select. If width is set to 0
1455   * the msbits will be set for any sample format with a width larger than the
1456   * specified msbits.
1457   *
1458   * Return: Zero if successful, or a negative error code on failure.
1459   */
snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime * runtime,unsigned int cond,unsigned int width,unsigned int msbits)1460  int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,
1461  				 unsigned int cond,
1462  				 unsigned int width,
1463  				 unsigned int msbits)
1464  {
1465  	unsigned long l = (msbits << 16) | width;
1466  	return snd_pcm_hw_rule_add(runtime, cond, -1,
1467  				    snd_pcm_hw_rule_msbits,
1468  				    (void*) l,
1469  				    SNDRV_PCM_HW_PARAM_SAMPLE_BITS, -1);
1470  }
1471  EXPORT_SYMBOL(snd_pcm_hw_constraint_msbits);
1472  
snd_pcm_hw_rule_step(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1473  static int snd_pcm_hw_rule_step(struct snd_pcm_hw_params *params,
1474  				struct snd_pcm_hw_rule *rule)
1475  {
1476  	unsigned long step = (unsigned long) rule->private;
1477  	return snd_interval_step(hw_param_interval(params, rule->var), step);
1478  }
1479  
1480  /**
1481   * snd_pcm_hw_constraint_step - add a hw constraint step rule
1482   * @runtime: PCM runtime instance
1483   * @cond: condition bits
1484   * @var: hw_params variable to apply the step constraint
1485   * @step: step size
1486   *
1487   * Return: Zero if successful, or a negative error code on failure.
1488   */
snd_pcm_hw_constraint_step(struct snd_pcm_runtime * runtime,unsigned int cond,snd_pcm_hw_param_t var,unsigned long step)1489  int snd_pcm_hw_constraint_step(struct snd_pcm_runtime *runtime,
1490  			       unsigned int cond,
1491  			       snd_pcm_hw_param_t var,
1492  			       unsigned long step)
1493  {
1494  	return snd_pcm_hw_rule_add(runtime, cond, var,
1495  				   snd_pcm_hw_rule_step, (void *) step,
1496  				   var, -1);
1497  }
1498  EXPORT_SYMBOL(snd_pcm_hw_constraint_step);
1499  
snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1500  static int snd_pcm_hw_rule_pow2(struct snd_pcm_hw_params *params, struct snd_pcm_hw_rule *rule)
1501  {
1502  	static const unsigned int pow2_sizes[] = {
1503  		1<<0, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7,
1504  		1<<8, 1<<9, 1<<10, 1<<11, 1<<12, 1<<13, 1<<14, 1<<15,
1505  		1<<16, 1<<17, 1<<18, 1<<19, 1<<20, 1<<21, 1<<22, 1<<23,
1506  		1<<24, 1<<25, 1<<26, 1<<27, 1<<28, 1<<29, 1<<30
1507  	};
1508  	return snd_interval_list(hw_param_interval(params, rule->var),
1509  				 ARRAY_SIZE(pow2_sizes), pow2_sizes, 0);
1510  }
1511  
1512  /**
1513   * snd_pcm_hw_constraint_pow2 - add a hw constraint power-of-2 rule
1514   * @runtime: PCM runtime instance
1515   * @cond: condition bits
1516   * @var: hw_params variable to apply the power-of-2 constraint
1517   *
1518   * Return: Zero if successful, or a negative error code on failure.
1519   */
snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime * runtime,unsigned int cond,snd_pcm_hw_param_t var)1520  int snd_pcm_hw_constraint_pow2(struct snd_pcm_runtime *runtime,
1521  			       unsigned int cond,
1522  			       snd_pcm_hw_param_t var)
1523  {
1524  	return snd_pcm_hw_rule_add(runtime, cond, var,
1525  				   snd_pcm_hw_rule_pow2, NULL,
1526  				   var, -1);
1527  }
1528  EXPORT_SYMBOL(snd_pcm_hw_constraint_pow2);
1529  
snd_pcm_hw_rule_noresample_func(struct snd_pcm_hw_params * params,struct snd_pcm_hw_rule * rule)1530  static int snd_pcm_hw_rule_noresample_func(struct snd_pcm_hw_params *params,
1531  					   struct snd_pcm_hw_rule *rule)
1532  {
1533  	unsigned int base_rate = (unsigned int)(uintptr_t)rule->private;
1534  	struct snd_interval *rate;
1535  
1536  	rate = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
1537  	return snd_interval_list(rate, 1, &base_rate, 0);
1538  }
1539  
1540  /**
1541   * snd_pcm_hw_rule_noresample - add a rule to allow disabling hw resampling
1542   * @runtime: PCM runtime instance
1543   * @base_rate: the rate at which the hardware does not resample
1544   *
1545   * Return: Zero if successful, or a negative error code on failure.
1546   */
snd_pcm_hw_rule_noresample(struct snd_pcm_runtime * runtime,unsigned int base_rate)1547  int snd_pcm_hw_rule_noresample(struct snd_pcm_runtime *runtime,
1548  			       unsigned int base_rate)
1549  {
1550  	return snd_pcm_hw_rule_add(runtime, SNDRV_PCM_HW_PARAMS_NORESAMPLE,
1551  				   SNDRV_PCM_HW_PARAM_RATE,
1552  				   snd_pcm_hw_rule_noresample_func,
1553  				   (void *)(uintptr_t)base_rate,
1554  				   SNDRV_PCM_HW_PARAM_RATE, -1);
1555  }
1556  EXPORT_SYMBOL(snd_pcm_hw_rule_noresample);
1557  
_snd_pcm_hw_param_any(struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var)1558  static void _snd_pcm_hw_param_any(struct snd_pcm_hw_params *params,
1559  				  snd_pcm_hw_param_t var)
1560  {
1561  	if (hw_is_mask(var)) {
1562  		snd_mask_any(hw_param_mask(params, var));
1563  		params->cmask |= 1 << var;
1564  		params->rmask |= 1 << var;
1565  		return;
1566  	}
1567  	if (hw_is_interval(var)) {
1568  		snd_interval_any(hw_param_interval(params, var));
1569  		params->cmask |= 1 << var;
1570  		params->rmask |= 1 << var;
1571  		return;
1572  	}
1573  	snd_BUG();
1574  }
1575  
_snd_pcm_hw_params_any(struct snd_pcm_hw_params * params)1576  void _snd_pcm_hw_params_any(struct snd_pcm_hw_params *params)
1577  {
1578  	unsigned int k;
1579  	memset(params, 0, sizeof(*params));
1580  	for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++)
1581  		_snd_pcm_hw_param_any(params, k);
1582  	for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++)
1583  		_snd_pcm_hw_param_any(params, k);
1584  	params->info = ~0U;
1585  }
1586  EXPORT_SYMBOL(_snd_pcm_hw_params_any);
1587  
1588  /**
1589   * snd_pcm_hw_param_value - return @params field @var value
1590   * @params: the hw_params instance
1591   * @var: parameter to retrieve
1592   * @dir: pointer to the direction (-1,0,1) or %NULL
1593   *
1594   * Return: The value for field @var if it's fixed in configuration space
1595   * defined by @params. -%EINVAL otherwise.
1596   */
snd_pcm_hw_param_value(const struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var,int * dir)1597  int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params,
1598  			   snd_pcm_hw_param_t var, int *dir)
1599  {
1600  	if (hw_is_mask(var)) {
1601  		const struct snd_mask *mask = hw_param_mask_c(params, var);
1602  		if (!snd_mask_single(mask))
1603  			return -EINVAL;
1604  		if (dir)
1605  			*dir = 0;
1606  		return snd_mask_value(mask);
1607  	}
1608  	if (hw_is_interval(var)) {
1609  		const struct snd_interval *i = hw_param_interval_c(params, var);
1610  		if (!snd_interval_single(i))
1611  			return -EINVAL;
1612  		if (dir)
1613  			*dir = i->openmin;
1614  		return snd_interval_value(i);
1615  	}
1616  	return -EINVAL;
1617  }
1618  EXPORT_SYMBOL(snd_pcm_hw_param_value);
1619  
_snd_pcm_hw_param_setempty(struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var)1620  void _snd_pcm_hw_param_setempty(struct snd_pcm_hw_params *params,
1621  				snd_pcm_hw_param_t var)
1622  {
1623  	if (hw_is_mask(var)) {
1624  		snd_mask_none(hw_param_mask(params, var));
1625  		params->cmask |= 1 << var;
1626  		params->rmask |= 1 << var;
1627  	} else if (hw_is_interval(var)) {
1628  		snd_interval_none(hw_param_interval(params, var));
1629  		params->cmask |= 1 << var;
1630  		params->rmask |= 1 << var;
1631  	} else {
1632  		snd_BUG();
1633  	}
1634  }
1635  EXPORT_SYMBOL(_snd_pcm_hw_param_setempty);
1636  
_snd_pcm_hw_param_first(struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var)1637  static int _snd_pcm_hw_param_first(struct snd_pcm_hw_params *params,
1638  				   snd_pcm_hw_param_t var)
1639  {
1640  	int changed;
1641  	if (hw_is_mask(var))
1642  		changed = snd_mask_refine_first(hw_param_mask(params, var));
1643  	else if (hw_is_interval(var))
1644  		changed = snd_interval_refine_first(hw_param_interval(params, var));
1645  	else
1646  		return -EINVAL;
1647  	if (changed > 0) {
1648  		params->cmask |= 1 << var;
1649  		params->rmask |= 1 << var;
1650  	}
1651  	return changed;
1652  }
1653  
1654  
1655  /**
1656   * snd_pcm_hw_param_first - refine config space and return minimum value
1657   * @pcm: PCM instance
1658   * @params: the hw_params instance
1659   * @var: parameter to retrieve
1660   * @dir: pointer to the direction (-1,0,1) or %NULL
1661   *
1662   * Inside configuration space defined by @params remove from @var all
1663   * values > minimum. Reduce configuration space accordingly.
1664   *
1665   * Return: The minimum, or a negative error code on failure.
1666   */
snd_pcm_hw_param_first(struct snd_pcm_substream * pcm,struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var,int * dir)1667  int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,
1668  			   struct snd_pcm_hw_params *params,
1669  			   snd_pcm_hw_param_t var, int *dir)
1670  {
1671  	int changed = _snd_pcm_hw_param_first(params, var);
1672  	if (changed < 0)
1673  		return changed;
1674  	if (params->rmask) {
1675  		int err = snd_pcm_hw_refine(pcm, params);
1676  		if (err < 0)
1677  			return err;
1678  	}
1679  	return snd_pcm_hw_param_value(params, var, dir);
1680  }
1681  EXPORT_SYMBOL(snd_pcm_hw_param_first);
1682  
_snd_pcm_hw_param_last(struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var)1683  static int _snd_pcm_hw_param_last(struct snd_pcm_hw_params *params,
1684  				  snd_pcm_hw_param_t var)
1685  {
1686  	int changed;
1687  	if (hw_is_mask(var))
1688  		changed = snd_mask_refine_last(hw_param_mask(params, var));
1689  	else if (hw_is_interval(var))
1690  		changed = snd_interval_refine_last(hw_param_interval(params, var));
1691  	else
1692  		return -EINVAL;
1693  	if (changed > 0) {
1694  		params->cmask |= 1 << var;
1695  		params->rmask |= 1 << var;
1696  	}
1697  	return changed;
1698  }
1699  
1700  
1701  /**
1702   * snd_pcm_hw_param_last - refine config space and return maximum value
1703   * @pcm: PCM instance
1704   * @params: the hw_params instance
1705   * @var: parameter to retrieve
1706   * @dir: pointer to the direction (-1,0,1) or %NULL
1707   *
1708   * Inside configuration space defined by @params remove from @var all
1709   * values < maximum. Reduce configuration space accordingly.
1710   *
1711   * Return: The maximum, or a negative error code on failure.
1712   */
snd_pcm_hw_param_last(struct snd_pcm_substream * pcm,struct snd_pcm_hw_params * params,snd_pcm_hw_param_t var,int * dir)1713  int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm,
1714  			  struct snd_pcm_hw_params *params,
1715  			  snd_pcm_hw_param_t var, int *dir)
1716  {
1717  	int changed = _snd_pcm_hw_param_last(params, var);
1718  	if (changed < 0)
1719  		return changed;
1720  	if (params->rmask) {
1721  		int err = snd_pcm_hw_refine(pcm, params);
1722  		if (err < 0)
1723  			return err;
1724  	}
1725  	return snd_pcm_hw_param_value(params, var, dir);
1726  }
1727  EXPORT_SYMBOL(snd_pcm_hw_param_last);
1728  
1729  /**
1730   * snd_pcm_hw_params_bits - Get the number of bits per the sample.
1731   * @p: hardware parameters
1732   *
1733   * Return: The number of bits per sample based on the format,
1734   * subformat and msbits the specified hw params has.
1735   */
snd_pcm_hw_params_bits(const struct snd_pcm_hw_params * p)1736  int snd_pcm_hw_params_bits(const struct snd_pcm_hw_params *p)
1737  {
1738  	snd_pcm_subformat_t subformat = params_subformat(p);
1739  	snd_pcm_format_t format = params_format(p);
1740  
1741  	switch (format) {
1742  	case SNDRV_PCM_FORMAT_S32_LE:
1743  	case SNDRV_PCM_FORMAT_U32_LE:
1744  	case SNDRV_PCM_FORMAT_S32_BE:
1745  	case SNDRV_PCM_FORMAT_U32_BE:
1746  		switch (subformat) {
1747  		case SNDRV_PCM_SUBFORMAT_MSBITS_20:
1748  			return 20;
1749  		case SNDRV_PCM_SUBFORMAT_MSBITS_24:
1750  			return 24;
1751  		case SNDRV_PCM_SUBFORMAT_MSBITS_MAX:
1752  		case SNDRV_PCM_SUBFORMAT_STD:
1753  		default:
1754  			break;
1755  		}
1756  		fallthrough;
1757  	default:
1758  		return snd_pcm_format_width(format);
1759  	}
1760  }
1761  EXPORT_SYMBOL(snd_pcm_hw_params_bits);
1762  
snd_pcm_lib_ioctl_reset(struct snd_pcm_substream * substream,void * arg)1763  static int snd_pcm_lib_ioctl_reset(struct snd_pcm_substream *substream,
1764  				   void *arg)
1765  {
1766  	struct snd_pcm_runtime *runtime = substream->runtime;
1767  
1768  	guard(pcm_stream_lock_irqsave)(substream);
1769  	if (snd_pcm_running(substream) &&
1770  	    snd_pcm_update_hw_ptr(substream) >= 0)
1771  		runtime->status->hw_ptr %= runtime->buffer_size;
1772  	else {
1773  		runtime->status->hw_ptr = 0;
1774  		runtime->hw_ptr_wrap = 0;
1775  	}
1776  	return 0;
1777  }
1778  
snd_pcm_lib_ioctl_channel_info(struct snd_pcm_substream * substream,void * arg)1779  static int snd_pcm_lib_ioctl_channel_info(struct snd_pcm_substream *substream,
1780  					  void *arg)
1781  {
1782  	struct snd_pcm_channel_info *info = arg;
1783  	struct snd_pcm_runtime *runtime = substream->runtime;
1784  	int width;
1785  	if (!(runtime->info & SNDRV_PCM_INFO_MMAP)) {
1786  		info->offset = -1;
1787  		return 0;
1788  	}
1789  	width = snd_pcm_format_physical_width(runtime->format);
1790  	if (width < 0)
1791  		return width;
1792  	info->offset = 0;
1793  	switch (runtime->access) {
1794  	case SNDRV_PCM_ACCESS_MMAP_INTERLEAVED:
1795  	case SNDRV_PCM_ACCESS_RW_INTERLEAVED:
1796  		info->first = info->channel * width;
1797  		info->step = runtime->channels * width;
1798  		break;
1799  	case SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED:
1800  	case SNDRV_PCM_ACCESS_RW_NONINTERLEAVED:
1801  	{
1802  		size_t size = runtime->dma_bytes / runtime->channels;
1803  		info->first = info->channel * size * 8;
1804  		info->step = width;
1805  		break;
1806  	}
1807  	default:
1808  		snd_BUG();
1809  		break;
1810  	}
1811  	return 0;
1812  }
1813  
snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream * substream,void * arg)1814  static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream,
1815  				       void *arg)
1816  {
1817  	struct snd_pcm_hw_params *params = arg;
1818  	snd_pcm_format_t format;
1819  	int channels;
1820  	ssize_t frame_size;
1821  
1822  	params->fifo_size = substream->runtime->hw.fifo_size;
1823  	if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) {
1824  		format = params_format(params);
1825  		channels = params_channels(params);
1826  		frame_size = snd_pcm_format_size(format, channels);
1827  		if (frame_size > 0)
1828  			params->fifo_size /= frame_size;
1829  	}
1830  	return 0;
1831  }
1832  
snd_pcm_lib_ioctl_sync_id(struct snd_pcm_substream * substream,void * arg)1833  static int snd_pcm_lib_ioctl_sync_id(struct snd_pcm_substream *substream,
1834  				     void *arg)
1835  {
1836  	static const unsigned char id[12] = { 0xff, 0xff, 0xff, 0xff,
1837  					      0xff, 0xff, 0xff, 0xff,
1838  					      0xff, 0xff, 0xff, 0xff };
1839  
1840  	if (substream->runtime->std_sync_id)
1841  		snd_pcm_set_sync_per_card(substream, arg, id, sizeof(id));
1842  	return 0;
1843  }
1844  
1845  /**
1846   * snd_pcm_lib_ioctl - a generic PCM ioctl callback
1847   * @substream: the pcm substream instance
1848   * @cmd: ioctl command
1849   * @arg: ioctl argument
1850   *
1851   * Processes the generic ioctl commands for PCM.
1852   * Can be passed as the ioctl callback for PCM ops.
1853   *
1854   * Return: Zero if successful, or a negative error code on failure.
1855   */
snd_pcm_lib_ioctl(struct snd_pcm_substream * substream,unsigned int cmd,void * arg)1856  int snd_pcm_lib_ioctl(struct snd_pcm_substream *substream,
1857  		      unsigned int cmd, void *arg)
1858  {
1859  	switch (cmd) {
1860  	case SNDRV_PCM_IOCTL1_RESET:
1861  		return snd_pcm_lib_ioctl_reset(substream, arg);
1862  	case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
1863  		return snd_pcm_lib_ioctl_channel_info(substream, arg);
1864  	case SNDRV_PCM_IOCTL1_FIFO_SIZE:
1865  		return snd_pcm_lib_ioctl_fifo_size(substream, arg);
1866  	case SNDRV_PCM_IOCTL1_SYNC_ID:
1867  		return snd_pcm_lib_ioctl_sync_id(substream, arg);
1868  	}
1869  	return -ENXIO;
1870  }
1871  EXPORT_SYMBOL(snd_pcm_lib_ioctl);
1872  
1873  /**
1874   * snd_pcm_period_elapsed_under_stream_lock() - update the status of runtime for the next period
1875   *						under acquired lock of PCM substream.
1876   * @substream: the instance of pcm substream.
1877   *
1878   * This function is called when the batch of audio data frames as the same size as the period of
1879   * buffer is already processed in audio data transmission.
1880   *
1881   * The call of function updates the status of runtime with the latest position of audio data
1882   * transmission, checks overrun and underrun over buffer, awaken user processes from waiting for
1883   * available audio data frames, sampling audio timestamp, and performs stop or drain the PCM
1884   * substream according to configured threshold.
1885   *
1886   * The function is intended to use for the case that PCM driver operates audio data frames under
1887   * acquired lock of PCM substream; e.g. in callback of any operation of &snd_pcm_ops in process
1888   * context. In any interrupt context, it's preferrable to use ``snd_pcm_period_elapsed()`` instead
1889   * since lock of PCM substream should be acquired in advance.
1890   *
1891   * Developer should pay enough attention that some callbacks in &snd_pcm_ops are done by the call of
1892   * function:
1893   *
1894   * - .pointer - to retrieve current position of audio data transmission by frame count or XRUN state.
1895   * - .trigger - with SNDRV_PCM_TRIGGER_STOP at XRUN or DRAINING state.
1896   * - .get_time_info - to retrieve audio time stamp if needed.
1897   *
1898   * Even if more than one periods have elapsed since the last call, you have to call this only once.
1899   */
snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream * substream)1900  void snd_pcm_period_elapsed_under_stream_lock(struct snd_pcm_substream *substream)
1901  {
1902  	struct snd_pcm_runtime *runtime;
1903  
1904  	if (PCM_RUNTIME_CHECK(substream))
1905  		return;
1906  	runtime = substream->runtime;
1907  
1908  	if (!snd_pcm_running(substream) ||
1909  	    snd_pcm_update_hw_ptr0(substream, 1) < 0)
1910  		goto _end;
1911  
1912  #ifdef CONFIG_SND_PCM_TIMER
1913  	if (substream->timer_running)
1914  		snd_timer_interrupt(substream->timer, 1);
1915  #endif
1916   _end:
1917  	snd_kill_fasync(runtime->fasync, SIGIO, POLL_IN);
1918  }
1919  EXPORT_SYMBOL(snd_pcm_period_elapsed_under_stream_lock);
1920  
1921  /**
1922   * snd_pcm_period_elapsed() - update the status of runtime for the next period by acquiring lock of
1923   *			      PCM substream.
1924   * @substream: the instance of PCM substream.
1925   *
1926   * This function is mostly similar to ``snd_pcm_period_elapsed_under_stream_lock()`` except for
1927   * acquiring lock of PCM substream voluntarily.
1928   *
1929   * It's typically called by any type of IRQ handler when hardware IRQ occurs to notify event that
1930   * the batch of audio data frames as the same size as the period of buffer is already processed in
1931   * audio data transmission.
1932   */
snd_pcm_period_elapsed(struct snd_pcm_substream * substream)1933  void snd_pcm_period_elapsed(struct snd_pcm_substream *substream)
1934  {
1935  	if (snd_BUG_ON(!substream))
1936  		return;
1937  
1938  	guard(pcm_stream_lock_irqsave)(substream);
1939  	snd_pcm_period_elapsed_under_stream_lock(substream);
1940  }
1941  EXPORT_SYMBOL(snd_pcm_period_elapsed);
1942  
1943  /*
1944   * Wait until avail_min data becomes available
1945   * Returns a negative error code if any error occurs during operation.
1946   * The available space is stored on availp.  When err = 0 and avail = 0
1947   * on the capture stream, it indicates the stream is in DRAINING state.
1948   */
wait_for_avail(struct snd_pcm_substream * substream,snd_pcm_uframes_t * availp)1949  static int wait_for_avail(struct snd_pcm_substream *substream,
1950  			      snd_pcm_uframes_t *availp)
1951  {
1952  	struct snd_pcm_runtime *runtime = substream->runtime;
1953  	int is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
1954  	wait_queue_entry_t wait;
1955  	int err = 0;
1956  	snd_pcm_uframes_t avail = 0;
1957  	long wait_time, tout;
1958  
1959  	init_waitqueue_entry(&wait, current);
1960  	set_current_state(TASK_INTERRUPTIBLE);
1961  	add_wait_queue(&runtime->tsleep, &wait);
1962  
1963  	if (runtime->no_period_wakeup)
1964  		wait_time = MAX_SCHEDULE_TIMEOUT;
1965  	else {
1966  		/* use wait time from substream if available */
1967  		if (substream->wait_time) {
1968  			wait_time = substream->wait_time;
1969  		} else {
1970  			wait_time = 100;
1971  
1972  			if (runtime->rate) {
1973  				long t = runtime->buffer_size * 1100 / runtime->rate;
1974  				wait_time = max(t, wait_time);
1975  			}
1976  		}
1977  		wait_time = msecs_to_jiffies(wait_time);
1978  	}
1979  
1980  	for (;;) {
1981  		if (signal_pending(current)) {
1982  			err = -ERESTARTSYS;
1983  			break;
1984  		}
1985  
1986  		/*
1987  		 * We need to check if space became available already
1988  		 * (and thus the wakeup happened already) first to close
1989  		 * the race of space already having become available.
1990  		 * This check must happen after been added to the waitqueue
1991  		 * and having current state be INTERRUPTIBLE.
1992  		 */
1993  		avail = snd_pcm_avail(substream);
1994  		if (avail >= runtime->twake)
1995  			break;
1996  		snd_pcm_stream_unlock_irq(substream);
1997  
1998  		tout = schedule_timeout(wait_time);
1999  
2000  		snd_pcm_stream_lock_irq(substream);
2001  		set_current_state(TASK_INTERRUPTIBLE);
2002  		switch (runtime->state) {
2003  		case SNDRV_PCM_STATE_SUSPENDED:
2004  			err = -ESTRPIPE;
2005  			goto _endloop;
2006  		case SNDRV_PCM_STATE_XRUN:
2007  			err = -EPIPE;
2008  			goto _endloop;
2009  		case SNDRV_PCM_STATE_DRAINING:
2010  			if (is_playback)
2011  				err = -EPIPE;
2012  			else
2013  				avail = 0; /* indicate draining */
2014  			goto _endloop;
2015  		case SNDRV_PCM_STATE_OPEN:
2016  		case SNDRV_PCM_STATE_SETUP:
2017  		case SNDRV_PCM_STATE_DISCONNECTED:
2018  			err = -EBADFD;
2019  			goto _endloop;
2020  		case SNDRV_PCM_STATE_PAUSED:
2021  			continue;
2022  		}
2023  		if (!tout) {
2024  			pcm_dbg(substream->pcm,
2025  				"%s timeout (DMA or IRQ trouble?)\n",
2026  				is_playback ? "playback write" : "capture read");
2027  			err = -EIO;
2028  			break;
2029  		}
2030  	}
2031   _endloop:
2032  	set_current_state(TASK_RUNNING);
2033  	remove_wait_queue(&runtime->tsleep, &wait);
2034  	*availp = avail;
2035  	return err;
2036  }
2037  
2038  typedef int (*pcm_transfer_f)(struct snd_pcm_substream *substream,
2039  			      int channel, unsigned long hwoff,
2040  			      struct iov_iter *iter, unsigned long bytes);
2041  
2042  typedef int (*pcm_copy_f)(struct snd_pcm_substream *, snd_pcm_uframes_t, void *,
2043  			  snd_pcm_uframes_t, snd_pcm_uframes_t, pcm_transfer_f,
2044  			  bool);
2045  
2046  /* calculate the target DMA-buffer position to be written/read */
get_dma_ptr(struct snd_pcm_runtime * runtime,int channel,unsigned long hwoff)2047  static void *get_dma_ptr(struct snd_pcm_runtime *runtime,
2048  			   int channel, unsigned long hwoff)
2049  {
2050  	return runtime->dma_area + hwoff +
2051  		channel * (runtime->dma_bytes / runtime->channels);
2052  }
2053  
2054  /* default copy ops for write; used for both interleaved and non- modes */
default_write_copy(struct snd_pcm_substream * substream,int channel,unsigned long hwoff,struct iov_iter * iter,unsigned long bytes)2055  static int default_write_copy(struct snd_pcm_substream *substream,
2056  			      int channel, unsigned long hwoff,
2057  			      struct iov_iter *iter, unsigned long bytes)
2058  {
2059  	if (copy_from_iter(get_dma_ptr(substream->runtime, channel, hwoff),
2060  			   bytes, iter) != bytes)
2061  		return -EFAULT;
2062  	return 0;
2063  }
2064  
2065  /* fill silence instead of copy data; called as a transfer helper
2066   * from __snd_pcm_lib_write() or directly from noninterleaved_copy() when
2067   * a NULL buffer is passed
2068   */
fill_silence(struct snd_pcm_substream * substream,int channel,unsigned long hwoff,struct iov_iter * iter,unsigned long bytes)2069  static int fill_silence(struct snd_pcm_substream *substream, int channel,
2070  			unsigned long hwoff, struct iov_iter *iter,
2071  			unsigned long bytes)
2072  {
2073  	struct snd_pcm_runtime *runtime = substream->runtime;
2074  
2075  	if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
2076  		return 0;
2077  	if (substream->ops->fill_silence)
2078  		return substream->ops->fill_silence(substream, channel,
2079  						    hwoff, bytes);
2080  
2081  	snd_pcm_format_set_silence(runtime->format,
2082  				   get_dma_ptr(runtime, channel, hwoff),
2083  				   bytes_to_samples(runtime, bytes));
2084  	return 0;
2085  }
2086  
2087  /* default copy ops for read; used for both interleaved and non- modes */
default_read_copy(struct snd_pcm_substream * substream,int channel,unsigned long hwoff,struct iov_iter * iter,unsigned long bytes)2088  static int default_read_copy(struct snd_pcm_substream *substream,
2089  			     int channel, unsigned long hwoff,
2090  			     struct iov_iter *iter, unsigned long bytes)
2091  {
2092  	if (copy_to_iter(get_dma_ptr(substream->runtime, channel, hwoff),
2093  			 bytes, iter) != bytes)
2094  		return -EFAULT;
2095  	return 0;
2096  }
2097  
2098  /* call transfer with the filled iov_iter */
do_transfer(struct snd_pcm_substream * substream,int c,unsigned long hwoff,void * data,unsigned long bytes,pcm_transfer_f transfer,bool in_kernel)2099  static int do_transfer(struct snd_pcm_substream *substream, int c,
2100  		       unsigned long hwoff, void *data, unsigned long bytes,
2101  		       pcm_transfer_f transfer, bool in_kernel)
2102  {
2103  	struct iov_iter iter;
2104  	int err, type;
2105  
2106  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
2107  		type = ITER_SOURCE;
2108  	else
2109  		type = ITER_DEST;
2110  
2111  	if (in_kernel) {
2112  		struct kvec kvec = { data, bytes };
2113  
2114  		iov_iter_kvec(&iter, type, &kvec, 1, bytes);
2115  		return transfer(substream, c, hwoff, &iter, bytes);
2116  	}
2117  
2118  	err = import_ubuf(type, (__force void __user *)data, bytes, &iter);
2119  	if (err)
2120  		return err;
2121  	return transfer(substream, c, hwoff, &iter, bytes);
2122  }
2123  
2124  /* call transfer function with the converted pointers and sizes;
2125   * for interleaved mode, it's one shot for all samples
2126   */
interleaved_copy(struct snd_pcm_substream * substream,snd_pcm_uframes_t hwoff,void * data,snd_pcm_uframes_t off,snd_pcm_uframes_t frames,pcm_transfer_f transfer,bool in_kernel)2127  static int interleaved_copy(struct snd_pcm_substream *substream,
2128  			    snd_pcm_uframes_t hwoff, void *data,
2129  			    snd_pcm_uframes_t off,
2130  			    snd_pcm_uframes_t frames,
2131  			    pcm_transfer_f transfer,
2132  			    bool in_kernel)
2133  {
2134  	struct snd_pcm_runtime *runtime = substream->runtime;
2135  
2136  	/* convert to bytes */
2137  	hwoff = frames_to_bytes(runtime, hwoff);
2138  	off = frames_to_bytes(runtime, off);
2139  	frames = frames_to_bytes(runtime, frames);
2140  
2141  	return do_transfer(substream, 0, hwoff, data + off, frames, transfer,
2142  			   in_kernel);
2143  }
2144  
2145  /* call transfer function with the converted pointers and sizes for each
2146   * non-interleaved channel; when buffer is NULL, silencing instead of copying
2147   */
noninterleaved_copy(struct snd_pcm_substream * substream,snd_pcm_uframes_t hwoff,void * data,snd_pcm_uframes_t off,snd_pcm_uframes_t frames,pcm_transfer_f transfer,bool in_kernel)2148  static int noninterleaved_copy(struct snd_pcm_substream *substream,
2149  			       snd_pcm_uframes_t hwoff, void *data,
2150  			       snd_pcm_uframes_t off,
2151  			       snd_pcm_uframes_t frames,
2152  			       pcm_transfer_f transfer,
2153  			       bool in_kernel)
2154  {
2155  	struct snd_pcm_runtime *runtime = substream->runtime;
2156  	int channels = runtime->channels;
2157  	void **bufs = data;
2158  	int c, err;
2159  
2160  	/* convert to bytes; note that it's not frames_to_bytes() here.
2161  	 * in non-interleaved mode, we copy for each channel, thus
2162  	 * each copy is n_samples bytes x channels = whole frames.
2163  	 */
2164  	off = samples_to_bytes(runtime, off);
2165  	frames = samples_to_bytes(runtime, frames);
2166  	hwoff = samples_to_bytes(runtime, hwoff);
2167  	for (c = 0; c < channels; ++c, ++bufs) {
2168  		if (!data || !*bufs)
2169  			err = fill_silence(substream, c, hwoff, NULL, frames);
2170  		else
2171  			err = do_transfer(substream, c, hwoff, *bufs + off,
2172  					  frames, transfer, in_kernel);
2173  		if (err < 0)
2174  			return err;
2175  	}
2176  	return 0;
2177  }
2178  
2179  /* fill silence on the given buffer position;
2180   * called from snd_pcm_playback_silence()
2181   */
fill_silence_frames(struct snd_pcm_substream * substream,snd_pcm_uframes_t off,snd_pcm_uframes_t frames)2182  static int fill_silence_frames(struct snd_pcm_substream *substream,
2183  			       snd_pcm_uframes_t off, snd_pcm_uframes_t frames)
2184  {
2185  	if (substream->runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED ||
2186  	    substream->runtime->access == SNDRV_PCM_ACCESS_MMAP_INTERLEAVED)
2187  		return interleaved_copy(substream, off, NULL, 0, frames,
2188  					fill_silence, true);
2189  	else
2190  		return noninterleaved_copy(substream, off, NULL, 0, frames,
2191  					   fill_silence, true);
2192  }
2193  
2194  /* sanity-check for read/write methods */
pcm_sanity_check(struct snd_pcm_substream * substream)2195  static int pcm_sanity_check(struct snd_pcm_substream *substream)
2196  {
2197  	struct snd_pcm_runtime *runtime;
2198  	if (PCM_RUNTIME_CHECK(substream))
2199  		return -ENXIO;
2200  	runtime = substream->runtime;
2201  	if (snd_BUG_ON(!substream->ops->copy && !runtime->dma_area))
2202  		return -EINVAL;
2203  	if (runtime->state == SNDRV_PCM_STATE_OPEN)
2204  		return -EBADFD;
2205  	return 0;
2206  }
2207  
pcm_accessible_state(struct snd_pcm_runtime * runtime)2208  static int pcm_accessible_state(struct snd_pcm_runtime *runtime)
2209  {
2210  	switch (runtime->state) {
2211  	case SNDRV_PCM_STATE_PREPARED:
2212  	case SNDRV_PCM_STATE_RUNNING:
2213  	case SNDRV_PCM_STATE_PAUSED:
2214  		return 0;
2215  	case SNDRV_PCM_STATE_XRUN:
2216  		return -EPIPE;
2217  	case SNDRV_PCM_STATE_SUSPENDED:
2218  		return -ESTRPIPE;
2219  	default:
2220  		return -EBADFD;
2221  	}
2222  }
2223  
2224  /* update to the given appl_ptr and call ack callback if needed;
2225   * when an error is returned, take back to the original value
2226   */
pcm_lib_apply_appl_ptr(struct snd_pcm_substream * substream,snd_pcm_uframes_t appl_ptr)2227  int pcm_lib_apply_appl_ptr(struct snd_pcm_substream *substream,
2228  			   snd_pcm_uframes_t appl_ptr)
2229  {
2230  	struct snd_pcm_runtime *runtime = substream->runtime;
2231  	snd_pcm_uframes_t old_appl_ptr = runtime->control->appl_ptr;
2232  	snd_pcm_sframes_t diff;
2233  	int ret;
2234  
2235  	if (old_appl_ptr == appl_ptr)
2236  		return 0;
2237  
2238  	if (appl_ptr >= runtime->boundary)
2239  		return -EINVAL;
2240  	/*
2241  	 * check if a rewind is requested by the application
2242  	 */
2243  	if (substream->runtime->info & SNDRV_PCM_INFO_NO_REWINDS) {
2244  		diff = appl_ptr - old_appl_ptr;
2245  		if (diff >= 0) {
2246  			if (diff > runtime->buffer_size)
2247  				return -EINVAL;
2248  		} else {
2249  			if (runtime->boundary + diff > runtime->buffer_size)
2250  				return -EINVAL;
2251  		}
2252  	}
2253  
2254  	runtime->control->appl_ptr = appl_ptr;
2255  	if (substream->ops->ack) {
2256  		ret = substream->ops->ack(substream);
2257  		if (ret < 0) {
2258  			runtime->control->appl_ptr = old_appl_ptr;
2259  			if (ret == -EPIPE)
2260  				__snd_pcm_xrun(substream);
2261  			return ret;
2262  		}
2263  	}
2264  
2265  	trace_applptr(substream, old_appl_ptr, appl_ptr);
2266  
2267  	return 0;
2268  }
2269  
2270  /* the common loop for read/write data */
__snd_pcm_lib_xfer(struct snd_pcm_substream * substream,void * data,bool interleaved,snd_pcm_uframes_t size,bool in_kernel)2271  snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
2272  				     void *data, bool interleaved,
2273  				     snd_pcm_uframes_t size, bool in_kernel)
2274  {
2275  	struct snd_pcm_runtime *runtime = substream->runtime;
2276  	snd_pcm_uframes_t xfer = 0;
2277  	snd_pcm_uframes_t offset = 0;
2278  	snd_pcm_uframes_t avail;
2279  	pcm_copy_f writer;
2280  	pcm_transfer_f transfer;
2281  	bool nonblock;
2282  	bool is_playback;
2283  	int err;
2284  
2285  	err = pcm_sanity_check(substream);
2286  	if (err < 0)
2287  		return err;
2288  
2289  	is_playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
2290  	if (interleaved) {
2291  		if (runtime->access != SNDRV_PCM_ACCESS_RW_INTERLEAVED &&
2292  		    runtime->channels > 1)
2293  			return -EINVAL;
2294  		writer = interleaved_copy;
2295  	} else {
2296  		if (runtime->access != SNDRV_PCM_ACCESS_RW_NONINTERLEAVED)
2297  			return -EINVAL;
2298  		writer = noninterleaved_copy;
2299  	}
2300  
2301  	if (!data) {
2302  		if (is_playback)
2303  			transfer = fill_silence;
2304  		else
2305  			return -EINVAL;
2306  	} else {
2307  		if (substream->ops->copy)
2308  			transfer = substream->ops->copy;
2309  		else
2310  			transfer = is_playback ?
2311  				default_write_copy : default_read_copy;
2312  	}
2313  
2314  	if (size == 0)
2315  		return 0;
2316  
2317  	nonblock = !!(substream->f_flags & O_NONBLOCK);
2318  
2319  	snd_pcm_stream_lock_irq(substream);
2320  	err = pcm_accessible_state(runtime);
2321  	if (err < 0)
2322  		goto _end_unlock;
2323  
2324  	runtime->twake = runtime->control->avail_min ? : 1;
2325  	if (runtime->state == SNDRV_PCM_STATE_RUNNING)
2326  		snd_pcm_update_hw_ptr(substream);
2327  
2328  	/*
2329  	 * If size < start_threshold, wait indefinitely. Another
2330  	 * thread may start capture
2331  	 */
2332  	if (!is_playback &&
2333  	    runtime->state == SNDRV_PCM_STATE_PREPARED &&
2334  	    size >= runtime->start_threshold) {
2335  		err = snd_pcm_start(substream);
2336  		if (err < 0)
2337  			goto _end_unlock;
2338  	}
2339  
2340  	avail = snd_pcm_avail(substream);
2341  
2342  	while (size > 0) {
2343  		snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
2344  		snd_pcm_uframes_t cont;
2345  		if (!avail) {
2346  			if (!is_playback &&
2347  			    runtime->state == SNDRV_PCM_STATE_DRAINING) {
2348  				snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP);
2349  				goto _end_unlock;
2350  			}
2351  			if (nonblock) {
2352  				err = -EAGAIN;
2353  				goto _end_unlock;
2354  			}
2355  			runtime->twake = min_t(snd_pcm_uframes_t, size,
2356  					runtime->control->avail_min ? : 1);
2357  			err = wait_for_avail(substream, &avail);
2358  			if (err < 0)
2359  				goto _end_unlock;
2360  			if (!avail)
2361  				continue; /* draining */
2362  		}
2363  		frames = size > avail ? avail : size;
2364  		appl_ptr = READ_ONCE(runtime->control->appl_ptr);
2365  		appl_ofs = appl_ptr % runtime->buffer_size;
2366  		cont = runtime->buffer_size - appl_ofs;
2367  		if (frames > cont)
2368  			frames = cont;
2369  		if (snd_BUG_ON(!frames)) {
2370  			err = -EINVAL;
2371  			goto _end_unlock;
2372  		}
2373  		if (!atomic_inc_unless_negative(&runtime->buffer_accessing)) {
2374  			err = -EBUSY;
2375  			goto _end_unlock;
2376  		}
2377  		snd_pcm_stream_unlock_irq(substream);
2378  		if (!is_playback)
2379  			snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_CPU);
2380  		err = writer(substream, appl_ofs, data, offset, frames,
2381  			     transfer, in_kernel);
2382  		if (is_playback)
2383  			snd_pcm_dma_buffer_sync(substream, SNDRV_DMA_SYNC_DEVICE);
2384  		snd_pcm_stream_lock_irq(substream);
2385  		atomic_dec(&runtime->buffer_accessing);
2386  		if (err < 0)
2387  			goto _end_unlock;
2388  		err = pcm_accessible_state(runtime);
2389  		if (err < 0)
2390  			goto _end_unlock;
2391  		appl_ptr += frames;
2392  		if (appl_ptr >= runtime->boundary)
2393  			appl_ptr -= runtime->boundary;
2394  		err = pcm_lib_apply_appl_ptr(substream, appl_ptr);
2395  		if (err < 0)
2396  			goto _end_unlock;
2397  
2398  		offset += frames;
2399  		size -= frames;
2400  		xfer += frames;
2401  		avail -= frames;
2402  		if (is_playback &&
2403  		    runtime->state == SNDRV_PCM_STATE_PREPARED &&
2404  		    snd_pcm_playback_hw_avail(runtime) >= (snd_pcm_sframes_t)runtime->start_threshold) {
2405  			err = snd_pcm_start(substream);
2406  			if (err < 0)
2407  				goto _end_unlock;
2408  		}
2409  	}
2410   _end_unlock:
2411  	runtime->twake = 0;
2412  	if (xfer > 0 && err >= 0)
2413  		snd_pcm_update_state(substream, runtime);
2414  	snd_pcm_stream_unlock_irq(substream);
2415  	return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
2416  }
2417  EXPORT_SYMBOL(__snd_pcm_lib_xfer);
2418  
2419  /*
2420   * standard channel mapping helpers
2421   */
2422  
2423  /* default channel maps for multi-channel playbacks, up to 8 channels */
2424  const struct snd_pcm_chmap_elem snd_pcm_std_chmaps[] = {
2425  	{ .channels = 1,
2426  	  .map = { SNDRV_CHMAP_MONO } },
2427  	{ .channels = 2,
2428  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
2429  	{ .channels = 4,
2430  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2431  		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2432  	{ .channels = 6,
2433  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2434  		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2435  		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE } },
2436  	{ .channels = 8,
2437  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2438  		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2439  		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2440  		   SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
2441  	{ }
2442  };
2443  EXPORT_SYMBOL_GPL(snd_pcm_std_chmaps);
2444  
2445  /* alternative channel maps with CLFE <-> surround swapped for 6/8 channels */
2446  const struct snd_pcm_chmap_elem snd_pcm_alt_chmaps[] = {
2447  	{ .channels = 1,
2448  	  .map = { SNDRV_CHMAP_MONO } },
2449  	{ .channels = 2,
2450  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
2451  	{ .channels = 4,
2452  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2453  		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2454  	{ .channels = 6,
2455  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2456  		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2457  		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
2458  	{ .channels = 8,
2459  	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
2460  		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
2461  		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR,
2462  		   SNDRV_CHMAP_SL, SNDRV_CHMAP_SR } },
2463  	{ }
2464  };
2465  EXPORT_SYMBOL_GPL(snd_pcm_alt_chmaps);
2466  
valid_chmap_channels(const struct snd_pcm_chmap * info,int ch)2467  static bool valid_chmap_channels(const struct snd_pcm_chmap *info, int ch)
2468  {
2469  	if (ch > info->max_channels)
2470  		return false;
2471  	return !info->channel_mask || (info->channel_mask & (1U << ch));
2472  }
2473  
pcm_chmap_ctl_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)2474  static int pcm_chmap_ctl_info(struct snd_kcontrol *kcontrol,
2475  			      struct snd_ctl_elem_info *uinfo)
2476  {
2477  	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2478  
2479  	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
2480  	uinfo->count = info->max_channels;
2481  	uinfo->value.integer.min = 0;
2482  	uinfo->value.integer.max = SNDRV_CHMAP_LAST;
2483  	return 0;
2484  }
2485  
2486  /* get callback for channel map ctl element
2487   * stores the channel position firstly matching with the current channels
2488   */
pcm_chmap_ctl_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)2489  static int pcm_chmap_ctl_get(struct snd_kcontrol *kcontrol,
2490  			     struct snd_ctl_elem_value *ucontrol)
2491  {
2492  	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2493  	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2494  	struct snd_pcm_substream *substream;
2495  	const struct snd_pcm_chmap_elem *map;
2496  
2497  	if (!info->chmap)
2498  		return -EINVAL;
2499  	substream = snd_pcm_chmap_substream(info, idx);
2500  	if (!substream)
2501  		return -ENODEV;
2502  	memset(ucontrol->value.integer.value, 0,
2503  	       sizeof(long) * info->max_channels);
2504  	if (!substream->runtime)
2505  		return 0; /* no channels set */
2506  	for (map = info->chmap; map->channels; map++) {
2507  		int i;
2508  		if (map->channels == substream->runtime->channels &&
2509  		    valid_chmap_channels(info, map->channels)) {
2510  			for (i = 0; i < map->channels; i++)
2511  				ucontrol->value.integer.value[i] = map->map[i];
2512  			return 0;
2513  		}
2514  	}
2515  	return -EINVAL;
2516  }
2517  
2518  /* tlv callback for channel map ctl element
2519   * expands the pre-defined channel maps in a form of TLV
2520   */
pcm_chmap_ctl_tlv(struct snd_kcontrol * kcontrol,int op_flag,unsigned int size,unsigned int __user * tlv)2521  static int pcm_chmap_ctl_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2522  			     unsigned int size, unsigned int __user *tlv)
2523  {
2524  	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2525  	const struct snd_pcm_chmap_elem *map;
2526  	unsigned int __user *dst;
2527  	int c, count = 0;
2528  
2529  	if (!info->chmap)
2530  		return -EINVAL;
2531  	if (size < 8)
2532  		return -ENOMEM;
2533  	if (put_user(SNDRV_CTL_TLVT_CONTAINER, tlv))
2534  		return -EFAULT;
2535  	size -= 8;
2536  	dst = tlv + 2;
2537  	for (map = info->chmap; map->channels; map++) {
2538  		int chs_bytes = map->channels * 4;
2539  		if (!valid_chmap_channels(info, map->channels))
2540  			continue;
2541  		if (size < 8)
2542  			return -ENOMEM;
2543  		if (put_user(SNDRV_CTL_TLVT_CHMAP_FIXED, dst) ||
2544  		    put_user(chs_bytes, dst + 1))
2545  			return -EFAULT;
2546  		dst += 2;
2547  		size -= 8;
2548  		count += 8;
2549  		if (size < chs_bytes)
2550  			return -ENOMEM;
2551  		size -= chs_bytes;
2552  		count += chs_bytes;
2553  		for (c = 0; c < map->channels; c++) {
2554  			if (put_user(map->map[c], dst))
2555  				return -EFAULT;
2556  			dst++;
2557  		}
2558  	}
2559  	if (put_user(count, tlv + 1))
2560  		return -EFAULT;
2561  	return 0;
2562  }
2563  
pcm_chmap_ctl_private_free(struct snd_kcontrol * kcontrol)2564  static void pcm_chmap_ctl_private_free(struct snd_kcontrol *kcontrol)
2565  {
2566  	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
2567  	info->pcm->streams[info->stream].chmap_kctl = NULL;
2568  	kfree(info);
2569  }
2570  
2571  /**
2572   * snd_pcm_add_chmap_ctls - create channel-mapping control elements
2573   * @pcm: the assigned PCM instance
2574   * @stream: stream direction
2575   * @chmap: channel map elements (for query)
2576   * @max_channels: the max number of channels for the stream
2577   * @private_value: the value passed to each kcontrol's private_value field
2578   * @info_ret: store struct snd_pcm_chmap instance if non-NULL
2579   *
2580   * Create channel-mapping control elements assigned to the given PCM stream(s).
2581   * Return: Zero if successful, or a negative error value.
2582   */
snd_pcm_add_chmap_ctls(struct snd_pcm * pcm,int stream,const struct snd_pcm_chmap_elem * chmap,int max_channels,unsigned long private_value,struct snd_pcm_chmap ** info_ret)2583  int snd_pcm_add_chmap_ctls(struct snd_pcm *pcm, int stream,
2584  			   const struct snd_pcm_chmap_elem *chmap,
2585  			   int max_channels,
2586  			   unsigned long private_value,
2587  			   struct snd_pcm_chmap **info_ret)
2588  {
2589  	struct snd_pcm_chmap *info;
2590  	struct snd_kcontrol_new knew = {
2591  		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
2592  		.access = SNDRV_CTL_ELEM_ACCESS_READ |
2593  			SNDRV_CTL_ELEM_ACCESS_VOLATILE |
2594  			SNDRV_CTL_ELEM_ACCESS_TLV_READ |
2595  			SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,
2596  		.info = pcm_chmap_ctl_info,
2597  		.get = pcm_chmap_ctl_get,
2598  		.tlv.c = pcm_chmap_ctl_tlv,
2599  	};
2600  	int err;
2601  
2602  	if (WARN_ON(pcm->streams[stream].chmap_kctl))
2603  		return -EBUSY;
2604  	info = kzalloc(sizeof(*info), GFP_KERNEL);
2605  	if (!info)
2606  		return -ENOMEM;
2607  	info->pcm = pcm;
2608  	info->stream = stream;
2609  	info->chmap = chmap;
2610  	info->max_channels = max_channels;
2611  	if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2612  		knew.name = "Playback Channel Map";
2613  	else
2614  		knew.name = "Capture Channel Map";
2615  	knew.device = pcm->device;
2616  	knew.count = pcm->streams[stream].substream_count;
2617  	knew.private_value = private_value;
2618  	info->kctl = snd_ctl_new1(&knew, info);
2619  	if (!info->kctl) {
2620  		kfree(info);
2621  		return -ENOMEM;
2622  	}
2623  	info->kctl->private_free = pcm_chmap_ctl_private_free;
2624  	err = snd_ctl_add(pcm->card, info->kctl);
2625  	if (err < 0)
2626  		return err;
2627  	pcm->streams[stream].chmap_kctl = info->kctl;
2628  	if (info_ret)
2629  		*info_ret = info;
2630  	return 0;
2631  }
2632  EXPORT_SYMBOL_GPL(snd_pcm_add_chmap_ctls);
2633