Re: [PATCH v0] ASoC: rsnd: core: Check convert rate in rsnd_hw_params

From: kernel test robot
Date: Wed Dec 02 2020 - 08:49:29 EST


Hi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on asoc/for-next]
[also build test WARNING on v5.10-rc6 next-20201201]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/mdurnev-gmail-com/ASoC-rsnd-core-Check-convert-rate-in-rsnd_hw_params/20201202-191131
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
config: riscv-allyesconfig (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/2ffb6c8ec578fd78d5962f7bc7c38eeb5c6a4bd1
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review mdurnev-gmail-com/ASoC-rsnd-core-Check-convert-rate-in-rsnd_hw_params/20201202-191131
git checkout 2ffb6c8ec578fd78d5962f7bc7c38eeb5c6a4bd1
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=riscv

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

All warnings (new ones prefixed by >>):

sound/soc/sh/rcar/core.c: In function 'rsnd_hw_params':
>> sound/soc/sh/rcar/core.c:1442:4: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
1442 | int k_up = 6;
| ^~~
sound/soc/sh/rcar/core.c:1447:56: error: 'fe_channel' undeclared (first use in this function); did you mean 'channel'?
1447 | channel = io->converted_chan ? io->converted_chan : fe_channel;
| ^~~~~~~~~~
| channel
sound/soc/sh/rcar/core.c:1447:56: note: each undeclared identifier is reported only once for each function it appears in
>> sound/soc/sh/rcar/core.c:1460:8: warning: this statement may fall through [-Wimplicit-fallthrough=]
1460 | if (channel > 4) {
| ^
sound/soc/sh/rcar/core.c:1464:4: note: here
1464 | case 0:
| ^~~~

vim +1442 sound/soc/sh/rcar/core.c

1391
1392 /*
1393 * pcm ops
1394 */
1395 static int rsnd_hw_params(struct snd_soc_component *component,
1396 struct snd_pcm_substream *substream,
1397 struct snd_pcm_hw_params *hw_params)
1398 {
1399 struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
1400 struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
1401 struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
1402 struct snd_soc_pcm_runtime *fe = asoc_substream_to_rtd(substream);
1403
1404 /*
1405 * rsnd assumes that it might be used under DPCM if user want to use
1406 * channel / rate convert. Then, rsnd should be FE.
1407 * And then, this function will be called *after* BE settings.
1408 * this means, each BE already has fixuped hw_params.
1409 * see
1410 * dpcm_fe_dai_hw_params()
1411 * dpcm_be_dai_hw_params()
1412 */
1413 io->converted_rate = 0;
1414 io->converted_chan = 0;
1415 if (fe->dai_link->dynamic) {
1416 struct rsnd_priv *priv = rsnd_io_to_priv(io);
1417 struct device *dev = rsnd_priv_to_dev(priv);
1418 struct snd_soc_dpcm *dpcm;
1419 struct snd_pcm_hw_params *be_params;
1420 int stream = substream->stream;
1421
1422 for_each_dpcm_be(fe, stream, dpcm) {
1423 be_params = &dpcm->hw_params;
1424 if (params_channels(hw_params) != params_channels(be_params))
1425 io->converted_chan = params_channels(be_params);
1426 if (params_rate(hw_params) != params_rate(be_params))
1427 io->converted_rate = params_rate(be_params);
1428 }
1429 if (io->converted_chan)
1430 dev_dbg(dev, "convert channels = %d\n", io->converted_chan);
1431 if (io->converted_rate) {
1432 dev_dbg(dev, "convert rate = %d\n", io->converted_rate);
1433
1434 /*
1435 * SRC supports convert rates from params_rate(hw_params)/k_down
1436 * to params_rate(hw_params)*k_up, where k_up is always 6, and
1437 * k_down depends on number of channels and SRC unit.
1438 * So all SRC units can upsample audio up to 6 times regardless
1439 * its number of channels. And all SRC units can downsample
1440 * 2 channel audio up to 6 times too.
1441 */
> 1442 int k_up = 6;
1443 int k_down = 6;
1444 int channel;
1445 struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
1446
1447 channel = io->converted_chan ? io->converted_chan : fe_channel;
1448
1449 switch (rsnd_mod_id(src_mod)) {
1450 /*
1451 * SRC0 can downsample 4, 6 and 8 channel audio up to 4 times.
1452 * SRC1, SRC3 and SRC4 can downsample 4 channel audio
1453 * up to 4 times.
1454 * SRC1, SRC3 and SRC4 can downsample 6 and 8 channel audio
1455 * no more than twice.
1456 */
1457 case 1:
1458 case 3:
1459 case 4:
> 1460 if (channel > 4) {
1461 k_down = 2;
1462 break;
1463 }
1464 case 0:
1465 if (channel > 2)
1466 k_down = 4;
1467 break;
1468
1469 /* Other SRC units do not support more than 2 channels */
1470 default:
1471 if (channel > 2)
1472 return -EINVAL;
1473 }
1474
1475 if (params_rate(hw_params) > io->converted_rate * k_down) {
1476 hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->min =
1477 io->converted_rate * k_down;
1478 hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->max =
1479 io->converted_rate * k_down;
1480 hw_params->cmask |= SNDRV_PCM_HW_PARAM_RATE;
1481 } else if (params_rate(hw_params) * k_up < io->converted_rate) {
1482 hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->min =
1483 (io->converted_rate + k_up - 1) / k_up;
1484 hw_param_interval(hw_params, SNDRV_PCM_HW_PARAM_RATE)->max =
1485 (io->converted_rate + k_up - 1) / k_up;
1486 hw_params->cmask |= SNDRV_PCM_HW_PARAM_RATE;
1487 }
1488
1489 /*
1490 * TBD: Max SRC input and output rates also depend on number
1491 * of channels and SRC unit:
1492 * SRC1, SRC3 and SRC4 do not support more than 128kHz
1493 * for 6 channel and 96kHz for 8 channel audio.
1494 * Perhaps this function should return EINVAL if the input or
1495 * the output rate exceeds the limitation.
1496 */
1497 }
1498 }
1499
1500 return rsnd_dai_call(hw_params, io, substream, hw_params);
1501 }
1502

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip