1. May 17, 2014
  2. May 15, 2014
  3. May 14, 2014
  4. May 13, 2014
  5. May 09, 2014
  6. May 07, 2014
  7. May 06, 2014
  8. May 03, 2014
  9. Apr 24, 2014
  10. Apr 23, 2014
    • Wenkai Du's avatar
      ASoC: Intel: Fix audio crash due to race condition in stream deletion · d132cb0a
      Wenkai Du authored
      
      
      There is a race between sst_byt_stream_free() and sst_byt_get_stream()
      if sst_byt_get_stream() called from sst_byt_irq_thread() context is
      accessing the byt->stream_list while a stream is deleted from the list.
      
      A stream is added to byt->stream_list in sst_byt_stream_new() and deleted in
      sst_byt_stream_free(). sst_byt_get_stream() is always protected by
      sst->spinlock, but the stream addition and deletion are not protected.
      
      The patch adds spinlock to both stream addition and deletion.
      
      [Jarkko: Same fix added to sst-haswell-ipc.c too]
      
      Signed-off-by: default avatarWenkai Du <wenkai.du@intel.com>
      Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@linaro.org>
      d132cb0a
    • Wenkai Du's avatar
      ASoC: Intel: Fix audio crash due to negative address offset · 95e9ee92
      Wenkai Du authored
      
      
      There were occasional ADSP crash during reboot testing:
      
      [   11.883364] BUG: unable to handle kernel paging request at ffffc90121700000
      [   11.883380] IP: [<ffffffffc024d8bc>] sst_module_insert_fixed_block+0x24f/0x26d [snd_soc_sst_dsp]
      [   11.883397] PGD 7800b067 PUD 0
      [   11.883405] Oops: 0002 [#1] SMP
      [   11.886418] gsmi: Log Shutdown Reason 0x03
      
      The virtual address, ffffc90121700000, was out of range. The virtual
      address is calculated by adding LPE base address with an offset:
      
      sst_memcpy32(dsp->addr.lpe + data->offset, data->data, data->size);
      
      The offset is calculated in sst_byt_parse_module, by subtraction of
      two virtual addresses dsp->addr.fw_ext and dsp->addr.lpe:
      
      block_data.offset = block->ram_offset + (dsp->addr.fw_ext - dsp->addr.lpe);
      
      These virtual addresses are assigned by kernel from ioremap:
      
      sst->addr.lpe = ioremap(pdata->lpe_base, pdata->lpe_size);
      sst->addr.fw_ext = ioremap(pdata->fw_base, pdata->fw_size);
      
      In current driver code, offset is defined as unsigned int32:
      
      struct sst_module_data {
      ...
      	u32 offset;		/* offset in FW file */
      };
      
      Most of the time kernel assigned virtual addresses with addr.fw_ext
      greater than addr.lpe. But sometimes it was the other way round.
      
      Fix the problem by declaring offset as signed int32_t.
      
      Signed-off-by: default avatarWenkai Du <wenkai.du@intel.com>
      Signed-off-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@linaro.org>
      95e9ee92
  11. Apr 19, 2014
  12. Apr 15, 2014
  13. Apr 14, 2014