• 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
sst-dsp-priv.h 8.09 KB