• Peter Geis's avatar
    ALSA: hda/tegra: fix tegra-hda on tegra30 soc · 615d4354
    Peter Geis authored
    Currently hda on tegra30 fails to open a stream with an input/output error.
    
    For example:
    speaker-test -Dhw:0,3 -c 2
    
    speaker-test 1.2.2
    
    Playback device is hw:0,3
    Stream parameters are 48000Hz, S16_LE, 2 channels
    Using 16 octaves of pink noise
    Rate set to 48000Hz (requested 48000Hz)
    Buffer size range from 64 to 16384
    Period size range from 32 to 8192
    Using max buffer size 16384
    Periods = 4
    was set period_size = 4096
    was set buffer_size = 16384
     0 - Front Left
    Write error: -5,Input/output error
    xrun_recovery failed: -5,Input/output error
    Transfer failed: Input/output error
    
    The tegra-hda device was introduced in tegra30 but only utilized in
    tegra124 until recent chips. Tegra210/186 work only due to a hardware
    change. For this reason it is unknown when this issue first manifested.
    Discussions with the hardware team show this applies to all current tegra
    chips. It has been resolved in the tegra234, which does not have hda
    support at this time.
    
    The explanation from the hardware team is this:
    Below is the striping formula referenced from HD audio spec.
       { ((num_channels * bits_per_sample) / number of SDOs) >= 8 }
    
    The current issue is seen because Tegra HW has a problem with boundary
    condition (= 8) for striping. The reason why it is not seen on
    Tegra210/Tegra186 is because it uses max 2SDO lines. Max SDO lines is
    read from GCAP register.
    
    For the given stream (channels = 2, bps = 16);
    ratio = (channels * bps) / NSDO = 32 / NSDO;
    
    On Tegra30,      ratio = 32/4 = 8  (FAIL)
    On Tegra210/186, ratio = 32/2 = 16 (PASS)
    On Tegra194,     ratio = 32/4 = 8  (FAIL) ==> Earlier workaround was
    applied for it
    
    If Tegra210/186 is forced to use 4SDO, it fails there as well. So the
    behavior is consistent across all these chips.
    
    Applying the fix in [1] universally resolves this issue on tegra30-hda.
    Tested on the Ouya game console and the tf201 tablet.
    
    [1] commit 60019d8c ("ALSA: hda/tegra: workaround playback failure on
    Tegra194")
    Reviewed-by: default avatarJon Hunter <jonathanh@nvidia.com>
    Tested-by: default avatarIon Agorria <ion@agorria.com>
    Reviewed-by: default avatarSameer Pujar <spujar@nvidia.com>
    Acked-by: default avatarThierry Reding <treding@nvidia.com>
    Signed-off-by: default avatarPeter Geis <pgwipeout@gmail.com>
    Link: https://lore.kernel.org/r/20210108135913.2421585-3-pgwipeout@gmail.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    615d4354
hda_tegra.c 14.2 KB