Message ID | 20200511100415.12502-1-giraffesnn123@gmail.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Kieran Bingham |
Headers | show |
Series | [v1] ASoC: rsnd: add interrupt support for SSI BUSIF buffer | expand |
On Mon, May 11, 2020 at 06:04:15PM +0800, Yongbo Zhang wrote: > SSI BUSIF buffer is possible to overflow or underflow, especially in a > hypervisor environment. If there is no interrupt support, it will eventually > lead to errors in pcm data. > This patch adds overflow and underflow interrupt support for SSI BUSIF buffer. This introduces loads of build errors on for-5.8 with an x86 allmodconfig: /mnt/kernel/sound/soc/sh/rcar/ssi.c: In function 'rsnd_ssi_quit': /mnt/kernel/sound/soc/sh/rcar/ssi.c:596:12: error: invalid storage class for function 'rsnd_ssi_hw_params' static int rsnd_ssi_hw_params(struct rsnd_mod *mod, ^~~~~~~~~~~~~~~~~~ /mnt/kernel/sound/soc/sh/rcar/ssi.c:596:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] static int rsnd_ssi_hw_params(struct rsnd_mod *mod, ^~~~~~ and so on for ages. Probably just needs a rebase I guess?
On Mon, 11 May 2020 18:04:15 +0800, Yongbo Zhang wrote: > SSI BUSIF buffer is possible to overflow or underflow, especially in a > hypervisor environment. If there is no interrupt support, it will eventually > lead to errors in pcm data. > This patch adds overflow and underflow interrupt support for SSI BUSIF buffer. > > Reported-by: Chen Li <licheng0822@thundersoft.com> > Signed-off-by: Yongbo Zhang <giraffesnn123@gmail.com> > Tested-by: Chen Li <licheng0822@thundersoft.com> > Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > > [...] Applied to local tree spi/for-5.7 Thanks! [1/1] ASoC: rsnd: add interrupt support for SSI BUSIF buffer (no commit info) All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark
On Mon, May 11, 2020 at 06:21:43PM +0100, Mark Brown wrote: > On Mon, 11 May 2020 18:04:15 +0800, Yongbo Zhang wrote: > > SSI BUSIF buffer is possible to overflow or underflow, especially in a > > hypervisor environment. If there is no interrupt support, it will eventually > > lead to errors in pcm data. > > This patch adds overflow and underflow interrupt support for SSI BUSIF buffer. > Applied to > > local tree spi/for-5.7 No, it wasn't - sorry for the noise here.
Hi Yongbo,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on asoc/for-next]
[also build test WARNING on v5.7-rc5 next-20200511]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Yongbo-Zhang/ASoC-rsnd-add-interrupt-support-for-SSI-BUSIF-buffer/20200511-184903
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next
reproduce:
# apt-get install sparse
# sparse version: v0.6.1-191-gc51a0382-dirty
make ARCH=x86_64 allmodconfig
make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'
:::::: branch date: 8 hours ago
:::::: commit date: 8 hours ago
If you fix the issue, kindly add following tag as appropriate
Reported-by: kbuild test robot <lkp@intel.com>
sparse warnings: (new ones prefixed by >>)
sound/soc/sh/rcar/ssi.c:596:1: sparse: sparse: mixing declarations and code
include/sound/pcm_params.h:377:0: sparse: sparse: Expected } at end of function
include/sound/pcm_params.h:377:0: sparse: sparse: got end-of-input
>> sound/soc/sh/rcar/ssi.c:798:56: sparse: sparse: not enough arguments for function rsnd_mod_write
# https://github.com/0day-ci/linux/commit/23aaae15fe2b41fd05caf5e0773d41021bc03e27
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 23aaae15fe2b41fd05caf5e0773d41021bc03e27
vim +798 sound/soc/sh/rcar/ssi.c
615fb6c7b13b7f Kuninori Morimoto 2016-02-18 733
d8d9b9730cd62c Kuninori Morimoto 2017-12-11 734 static bool rsnd_ssi_pio_interrupt(struct rsnd_mod *mod,
d8d9b9730cd62c Kuninori Morimoto 2017-12-11 735 struct rsnd_dai_stream *io);
bfc0cfe6b7acb1 Kuninori Morimoto 2015-06-15 736 static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
bfc0cfe6b7acb1 Kuninori Morimoto 2015-06-15 737 struct rsnd_dai_stream *io)
ae5c322303fff5 Kuninori Morimoto 2013-07-21 738 {
690602fcd85385 Kuninori Morimoto 2015-01-15 739 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
2b62786951ca38 Kuninori Morimoto 2018-02-13 740 struct device *dev = rsnd_priv_to_dev(priv);
765ae7c8dda7d0 Kuninori Morimoto 2015-01-15 741 int is_dma = rsnd_ssi_is_dma_mode(mod);
02299d9875bab5 Kuninori Morimoto 2015-05-21 742 u32 status;
75defee0f1b3fc Kuninori Morimoto 2015-06-15 743 bool elapsed = false;
6a25c8da00284f Kuninori Morimoto 2016-01-26 744 bool stop = false;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 745 int is_tdm, is_tdm_split;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 746
23aaae15fe2b41 Yongbo Zhang 2020-05-11 747 is_tdm = rsnd_runtime_is_tdm(io);
23aaae15fe2b41 Yongbo Zhang 2020-05-11 748 is_tdm_split = rsnd_runtime_is_tdm_split(io);
02299d9875bab5 Kuninori Morimoto 2015-05-21 749
02299d9875bab5 Kuninori Morimoto 2015-05-21 750 spin_lock(&priv->lock);
ae5c322303fff5 Kuninori Morimoto 2013-07-21 751
02299d9875bab5 Kuninori Morimoto 2015-05-21 752 /* ignore all cases if not working */
d5bbe7de563ccc Kuninori Morimoto 2015-06-15 753 if (!rsnd_io_is_working(io))
02299d9875bab5 Kuninori Morimoto 2015-05-21 754 goto rsnd_ssi_interrupt_out;
02299d9875bab5 Kuninori Morimoto 2015-05-21 755
6a25c8da00284f Kuninori Morimoto 2016-01-26 756 status = rsnd_ssi_status_get(mod);
4e7d606cd52aa8 Kuninori Morimoto 2014-11-27 757
4e7d606cd52aa8 Kuninori Morimoto 2014-11-27 758 /* PIO only */
d8d9b9730cd62c Kuninori Morimoto 2017-12-11 759 if (!is_dma && (status & DIRQ))
d8d9b9730cd62c Kuninori Morimoto 2017-12-11 760 elapsed = rsnd_ssi_pio_interrupt(mod, io);
ae5c322303fff5 Kuninori Morimoto 2013-07-21 761
12927a8f802642 Kuninori Morimoto 2015-06-15 762 /* DMA only */
2b62786951ca38 Kuninori Morimoto 2018-02-13 763 if (is_dma && (status & (UIRQ | OIRQ))) {
c0ea089dbad47a Kuninori Morimoto 2018-10-30 764 rsnd_dbg_irq_status(dev, "%s err status : 0x%08x\n",
c0ea089dbad47a Kuninori Morimoto 2018-10-30 765 rsnd_mod_name(mod), status);
2b62786951ca38 Kuninori Morimoto 2018-02-13 766
6a25c8da00284f Kuninori Morimoto 2016-01-26 767 stop = true;
2b62786951ca38 Kuninori Morimoto 2018-02-13 768 }
69e32a58bde674 Kuninori Morimoto 2015-10-26 769
23aaae15fe2b41 Yongbo Zhang 2020-05-11 770 status = 0;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 771
23aaae15fe2b41 Yongbo Zhang 2020-05-11 772 if (is_tdm || is_tdm_split) {
23aaae15fe2b41 Yongbo Zhang 2020-05-11 773 switch (id) {
23aaae15fe2b41 Yongbo Zhang 2020-05-11 774 case 0:
23aaae15fe2b41 Yongbo Zhang 2020-05-11 775 case 1:
23aaae15fe2b41 Yongbo Zhang 2020-05-11 776 case 2:
23aaae15fe2b41 Yongbo Zhang 2020-05-11 777 case 3:
23aaae15fe2b41 Yongbo Zhang 2020-05-11 778 case 4:
23aaae15fe2b41 Yongbo Zhang 2020-05-11 779 for (i = 0; i < 4; i++) {
23aaae15fe2b41 Yongbo Zhang 2020-05-11 780 status = rsnd_mod_read(mod,
23aaae15fe2b41 Yongbo Zhang 2020-05-11 781 SSI_SYS_STATUS(i * 2));
23aaae15fe2b41 Yongbo Zhang 2020-05-11 782 status &= 0xf << (id * 4);
23aaae15fe2b41 Yongbo Zhang 2020-05-11 783
23aaae15fe2b41 Yongbo Zhang 2020-05-11 784 if (status) {
23aaae15fe2b41 Yongbo Zhang 2020-05-11 785 rsnd_dbg_irq_status(dev,
23aaae15fe2b41 Yongbo Zhang 2020-05-11 786 "%s err status : 0x%08x\n",
23aaae15fe2b41 Yongbo Zhang 2020-05-11 787 rsnd_mod_name(mod), status);
23aaae15fe2b41 Yongbo Zhang 2020-05-11 788 rsnd_mod_write(mod,
23aaae15fe2b41 Yongbo Zhang 2020-05-11 789 SSI_SYS_STATUS(i * 2),
23aaae15fe2b41 Yongbo Zhang 2020-05-11 790 0xf << (id * 4));
23aaae15fe2b41 Yongbo Zhang 2020-05-11 791 stop = true;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 792 break;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 793 }
23aaae15fe2b41 Yongbo Zhang 2020-05-11 794 }
23aaae15fe2b41 Yongbo Zhang 2020-05-11 795 break;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 796 case 9:
23aaae15fe2b41 Yongbo Zhang 2020-05-11 797 for (i = 0; i < 4; i++) {
23aaae15fe2b41 Yongbo Zhang 2020-05-11 @798 status = rsnd_mod_write(mod,
23aaae15fe2b41 Yongbo Zhang 2020-05-11 799 SSI_SYS_STATUS((i * 2) + 1));
23aaae15fe2b41 Yongbo Zhang 2020-05-11 800 status &= 0xf << 4;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 801
23aaae15fe2b41 Yongbo Zhang 2020-05-11 802 if (status) {
23aaae15fe2b41 Yongbo Zhang 2020-05-11 803 rsnd_dbg_irq_status(dev,
23aaae15fe2b41 Yongbo Zhang 2020-05-11 804 "%s err status : 0x%08x\n",
23aaae15fe2b41 Yongbo Zhang 2020-05-11 805 rsnd_mod_name(mod), status);
23aaae15fe2b41 Yongbo Zhang 2020-05-11 806 rsnd_mod_write(mod,
23aaae15fe2b41 Yongbo Zhang 2020-05-11 807 SSI_SYS_STATUS((i * 2) + 1),
23aaae15fe2b41 Yongbo Zhang 2020-05-11 808 0xf << 4);
23aaae15fe2b41 Yongbo Zhang 2020-05-11 809 stop = true;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 810 break;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 811 }
23aaae15fe2b41 Yongbo Zhang 2020-05-11 812 }
23aaae15fe2b41 Yongbo Zhang 2020-05-11 813 break;
23aaae15fe2b41 Yongbo Zhang 2020-05-11 814 }
23aaae15fe2b41 Yongbo Zhang 2020-05-11 815 }
23aaae15fe2b41 Yongbo Zhang 2020-05-11 816
5342dff2326393 Kuninori Morimoto 2015-11-26 817 rsnd_ssi_status_clear(mod);
02299d9875bab5 Kuninori Morimoto 2015-05-21 818 rsnd_ssi_interrupt_out:
02299d9875bab5 Kuninori Morimoto 2015-05-21 819 spin_unlock(&priv->lock);
02299d9875bab5 Kuninori Morimoto 2015-05-21 820
75defee0f1b3fc Kuninori Morimoto 2015-06-15 821 if (elapsed)
75defee0f1b3fc Kuninori Morimoto 2015-06-15 822 rsnd_dai_period_elapsed(io);
6a25c8da00284f Kuninori Morimoto 2016-01-26 823
6a25c8da00284f Kuninori Morimoto 2016-01-26 824 if (stop)
6a25c8da00284f Kuninori Morimoto 2016-01-26 825 snd_pcm_stop_xrun(io->substream);
6a25c8da00284f Kuninori Morimoto 2016-01-26 826
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c index af19010b9d88..8bd49c8a9517 100644 --- a/sound/soc/sh/rcar/gen.c +++ b/sound/soc/sh/rcar/gen.c @@ -224,6 +224,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv) RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884), RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888), RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE0, 0x850), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE1, 0x854), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE2, 0x858), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE3, 0x85c), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE4, 0x890), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE5, 0x894), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE6, 0x898), + RSND_GEN_S_REG(SSI_SYS_INT_ENABLE7, 0x89c), RSND_GEN_S_REG(HDMI0_SEL, 0x9e0), RSND_GEN_S_REG(HDMI1_SEL, 0x9e4), diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h index ea6cbaa9743e..d47608ff5fac 100644 --- a/sound/soc/sh/rcar/rsnd.h +++ b/sound/soc/sh/rcar/rsnd.h @@ -189,6 +189,14 @@ enum rsnd_reg { SSI_SYS_STATUS5, SSI_SYS_STATUS6, SSI_SYS_STATUS7, + SSI_SYS_INT_ENABLE0, + SSI_SYS_INT_ENABLE1, + SSI_SYS_INT_ENABLE2, + SSI_SYS_INT_ENABLE3, + SSI_SYS_INT_ENABLE4, + SSI_SYS_INT_ENABLE5, + SSI_SYS_INT_ENABLE6, + SSI_SYS_INT_ENABLE7, HDMI0_SEL, HDMI1_SEL, SSI9_BUSIF0_MODE, @@ -237,6 +245,7 @@ enum rsnd_reg { #define SSI9_BUSIF_ADINR(i) (SSI9_BUSIF0_ADINR + (i)) #define SSI9_BUSIF_DALIGN(i) (SSI9_BUSIF0_DALIGN + (i)) #define SSI_SYS_STATUS(i) (SSI_SYS_STATUS0 + (i)) +#define SSI_SYS_INT_ENABLE(i) (SSI_SYS_INT_ENABLE0 + (i)) struct rsnd_priv; diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 4a7d3413917f..87a2182a4514 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c @@ -372,6 +372,9 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, u32 wsr = ssi->wsr; int width; int is_tdm, is_tdm_split; + int id = rsnd_mod_id(mod); + int i; + u32 sys_int_enable = 0; is_tdm = rsnd_runtime_is_tdm(io); is_tdm_split = rsnd_runtime_is_tdm_split(io); @@ -447,6 +450,38 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod, cr_mode = DIEN; /* PIO : enable Data interrupt */ } + /* enable busif buffer over/under run interrupt. */ + if (is_tdm || is_tdm_split) { + switch (id) { + case 0: + case 1: + case 2: + case 3: + case 4: + for (i = 0; i < 4; i++) { + sys_int_enable = rsnd_mod_read(mod, + SSI_SYS_INT_ENABLE(i * 2)); + sys_int_enable |= 0xf << (id * 4); + rsnd_mod_write(mod, + SSI_SYS_INT_ENABLE(i * 2), + sys_int_enable); + } + + break; + case 9: + for (i = 0; i < 4; i++) { + sys_int_enable = rsnd_mod_read(mod, + SSI_SYS_INT_ENABLE((i * 2) + 1)); + sys_int_enable |= 0xf << 4; + rsnd_mod_write(mod, + SSI_SYS_INT_ENABLE((i * 2) + 1), + sys_int_enable); + } + + break; + } + } + init_end: ssi->cr_own = cr_own; ssi->cr_mode = cr_mode; @@ -496,6 +531,13 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, { struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); struct device *dev = rsnd_priv_to_dev(priv); + int is_tdm, is_tdm_split; + int id = rsnd_mod_id(mod); + int i; + u32 sys_int_enable = 0; + + is_tdm = rsnd_runtime_is_tdm(io); + is_tdm_split = rsnd_runtime_is_tdm_split(io); if (!rsnd_ssi_is_run_mods(mod, io)) return 0; @@ -517,6 +559,37 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod, ssi->wsr = 0; } + /* disable busif buffer over/under run interrupt. */ + if (is_tdm || is_tdm_split) { + switch (id) { + case 0: + case 1: + case 2: + case 3: + case 4: + for (i = 0; i < 4; i++) { + sys_int_enable = rsnd_mod_read(mod, + SSI_SYS_INT_ENABLE(i * 2)); + sys_int_enable &= ~(0xf << (id * 4)); + rsnd_mod_write(mod, + SSI_SYS_INT_ENABLE(i * 2), + sys_int_enable); + } + + break; + case 9: + for (i = 0; i < 4; i++) { + sys_int_enable = rsnd_mod_read(mod, + SSI_SYS_INT_ENABLE((i * 2) + 1)); + sys_int_enable &= ~(0xf << 4); + rsnd_mod_write(mod, + SSI_SYS_INT_ENABLE((i * 2) + 1), + sys_int_enable); + } + + break; + } + return 0; } @@ -622,6 +695,11 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, int enable) { u32 val = 0; + int is_tdm, is_tdm_split; + int id = rsnd_mod_id(mod); + + is_tdm = rsnd_runtime_is_tdm(io); + is_tdm_split = rsnd_runtime_is_tdm_split(io); if (rsnd_is_gen1(priv)) return 0; @@ -635,6 +713,19 @@ static int rsnd_ssi_irq(struct rsnd_mod *mod, if (enable) val = rsnd_ssi_is_dma_mode(mod) ? 0x0e000000 : 0x0f000000; + if (is_tdm || is_tdm_split) { + switch (id) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 9: + val |= 0x0000ff00; + break; + } + } + rsnd_mod_write(mod, SSI_INT_ENABLE, val); return 0; @@ -651,6 +742,10 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, u32 status; bool elapsed = false; bool stop = false; + int is_tdm, is_tdm_split; + + is_tdm = rsnd_runtime_is_tdm(io); + is_tdm_split = rsnd_runtime_is_tdm_split(io); spin_lock(&priv->lock); @@ -672,6 +767,53 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod, stop = true; } + status = 0; + + if (is_tdm || is_tdm_split) { + switch (id) { + case 0: + case 1: + case 2: + case 3: + case 4: + for (i = 0; i < 4; i++) { + status = rsnd_mod_read(mod, + SSI_SYS_STATUS(i * 2)); + status &= 0xf << (id * 4); + + if (status) { + rsnd_dbg_irq_status(dev, + "%s err status : 0x%08x\n", + rsnd_mod_name(mod), status); + rsnd_mod_write(mod, + SSI_SYS_STATUS(i * 2), + 0xf << (id * 4)); + stop = true; + break; + } + } + break; + case 9: + for (i = 0; i < 4; i++) { + status = rsnd_mod_write(mod, + SSI_SYS_STATUS((i * 2) + 1)); + status &= 0xf << 4; + + if (status) { + rsnd_dbg_irq_status(dev, + "%s err status : 0x%08x\n", + rsnd_mod_name(mod), status); + rsnd_mod_write(mod, + SSI_SYS_STATUS((i * 2) + 1), + 0xf << 4); + stop = true; + break; + } + } + break; + } + } + rsnd_ssi_status_clear(mod); rsnd_ssi_interrupt_out: spin_unlock(&priv->lock);