1. 11 Mar, 2019 5 commits
    • KaiChieh Chuang's avatar
      ASoC: dpcm: prevent snd_soc_dpcm use after free · a9764869
      KaiChieh Chuang authored
      The dpcm get from fe_clients/be_clients
      may be free before use
      
      Add a spin lock at snd_soc_card level,
      to protect the dpcm instance.
      The lock may be used in atomic context, so use spin lock.
      
      Use irq spin lock version,
      since the lock may be used in interrupts.
      
      possible race condition between
      void dpcm_be_disconnect(
      	...
      	list_del(&dpcm->list_be);
      	list_del(&dpcm->list_fe);
      	kfree(dpcm);
      	...
      
      and
      	for_each_dpcm_fe()
      	for_each_dpcm_be*()
      
      race condition example
      Thread 1:
          snd_soc_dapm_mixer_update_power()
              -> soc_dpcm_runtime_update()
                  -> dpcm_be_disconnect()
                      -> kfree(dpcm);
      Thread 2:
          dpcm_fe_dai_trigger()
              -> dpcm_be_dai_trigger()
                  -> snd_soc_dpcm_can_be_free_stop()
                      -> if (dpcm->fe == fe)
      
      Excpetion Scenario:
      	two FE link to same BE
      	FE1 -> BE
      	FE2 ->
      
      	Thread 1: switch of mixer between FE2 -> BE
      	Thread 2: pcm_stop FE1
      
      Exception:
      
      Unable to handle kernel paging request at virtual address dead0000000000e0
      
      pc=<> [<ffffff8960e2cd10>] dpcm_be_dai_trigger+0x29c/0x47c
      	sound/soc/soc-pcm.c:3226
      		if (dpcm->fe == fe)
      lr=<> [<ffffff8960e2f694>] dpcm_fe_dai_do_trigger+0x94/0x26c
      
      Backtrace:
      [<ffffff89602dba80>] notify_die+0x68/0xb8
      [<ffffff896028c7dc>] die+0x118/0x2a8
      [<ffffff89602a2f84>] __do_kernel_fault+0x13c/0x14c
      [<ffffff89602a27f4>] do_translation_fault+0x64/0xa0
      [<ffffff8960280cf8>] do_mem_abort+0x4c/0xd0
      [<ffffff8960282ad0>] el1_da+0x24/0x40
      [<ffffff8960e2cd10>] dpcm_be_dai_trigger+0x29c/0x47c
      [<ffffff8960e2f694>] dpcm_fe_dai_do_trigger+0x94/0x26c
      [<ffffff8960e2edec>] dpcm_fe_dai_trigger+0x3c/0x44
      [<ffffff8960de5588>] snd_pcm_do_stop+0x50/0x5c
      [<ffffff8960dded24>] snd_pcm_action+0xb4/0x13c
      [<ffffff8960ddfdb4>] snd_pcm_drop+0xa0/0x128
      [<ffffff8960de69bc>] snd_pcm_common_ioctl+0x9d8/0x30f0
      [<ffffff8960de1cac>] snd_pcm_ioctl_compat+0x29c/0x2f14
      [<ffffff89604c9d60>] compat_SyS_ioctl+0x128/0x244
      [<ffffff8960283740>] el0_svc_naked+0x34/0x38
      [<ffffffffffffffff>] 0xffffffffffffffff
      Signed-off-by: default avatarKaiChieh Chuang <kaichieh.chuang@mediatek.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      a9764869
    • Rander Wang's avatar
      ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform · c899df3e
      Rander Wang authored
      If playback and capture are enabled concurrently, when the capture stops
      the output becomes inaudile. The playback application will become stuck
      and underrun after a timeout.
      
      This is caused by mistaken use of the stream_id, which should only be
      set for playback and not for capture
      
      Tested on Apollolake and Kabylake with SST driver.
      Signed-off-by: default avatarRander Wang <rander.wang@linux.intel.com>
      Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      c899df3e
    • Rander Wang's avatar
      ASoC:hdac_hda:use correct format to setup hda codec · 03d0aa4d
      Rander Wang authored
      The current implementation of the hdac_hda codec results in zero-valued
      samples on capture and noise with headset playback when SOF is used on
      platforms with an on-board HDaudio codec. This is root-caused to SOF
      using be_hw_params_fixup, and the prepare() call using invalid runtime
      fields to determine the format.
      
      This patch moves the format handling to the hw_params() callback, as
      done already for hdac_hdmi, to make sure the fixed-up information is
      taken into account but keeps the codec initialization in prepare() as
      the stream_tag is only available at that time. Moving everything in the
      prepare() callback is possible but the code is less elegant so this
      two-step solution was chosen.
      
      The solution was tested with the SST driver with no regressions, and all
      the issues with SOF playback and capture are solved.
      Signed-off-by: default avatarRander Wang <rander.wang@linux.intel.com>
      Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      03d0aa4d
    • Rander Wang's avatar
      ASoC:soc-pcm:fix a codec fixup issue in TDM case · 570f18b6
      Rander Wang authored
      On HDaudio platforms, if playback is started when capture is working,
      there is no audible output.
      
      This can be root-caused to the use of the rx|tx_mask to store an HDaudio
      stream tag.
      
      If capture is stared before playback, rx_mask would be non-zero on HDaudio
      platform, then the channel number of playback, which is in the same codec
      dai with the capture, would be changed by soc_pcm_codec_params_fixup based
      on the tx_mask at first, then overwritten by this function based on rx_mask
      at last.
      
      According to the author of tx|rx_mask, tx_mask is for playback and rx_mask
      is for capture. And stream direction is checked at all other references of
      tx|rx_mask in ASoC, so here should be an error. This patch checks stream
      direction for tx|rx_mask for fixup function.
      
      This issue would affect not only HDaudio+ASoC, but also I2S codecs if the
      channel number based on rx_mask is not equal to the one for tx_mask. It could
      be rarely reproduecd because most drivers in kernel set the same channel number
      to tx|rx_mask or rx_mask is zero.
      
      Tested on all platforms using stream_tag & HDaudio and intel I2S platforms.
      Signed-off-by: default avatarRander Wang <rander.wang@linux.intel.com>
      Acked-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      570f18b6
    • Sylwester Nawrocki's avatar
      ASoC: samsung: i2s: Fix DAPM routes for capture stream · 42e4cedd
      Sylwester Nawrocki authored
      This patch sets missing stream_name of capture part of the DAI driver
      so we can define DAPM routing properly also for the capture stream.
      
      While at it "Playback" suffix is added to the playback stream names
      to clearly identify playback/capture.
      
      Together with related dts patch this fixes NULL pointer dereference
      when opening ALSA device for recording on Odroid XU3.
      
      Fixes: 64aba9bc ("ASoC: samsung: i2s: Add widgets and routes for DPCM support")
      Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      42e4cedd
  2. 04 Mar, 2019 3 commits
  3. 03 Mar, 2019 7 commits
  4. 28 Feb, 2019 2 commits
  5. 26 Feb, 2019 11 commits
  6. 22 Feb, 2019 6 commits
  7. 21 Feb, 2019 1 commit
  8. 20 Feb, 2019 5 commits