• Kai Vehmanen's avatar
    ASoC: hdac: make SOF HDA codec driver probe deterministic · 163cd105
    Kai Vehmanen authored
    To provide backward compatibility to older systems, the SOF HDA driver
    allows user to specify which HDMI codec driver to use at runtime via
    kernel parameter. This mechanism has a subtle flaw in that it assumes
    the codec drivers not to be loaded when the SOF PCI driver is loaded.
    
    The problem is rooted in use of the hdev->type field.
    snd_hdac_ext_bus_device_init() initializes this field to HDA_DEV_ASOC.
    This signals the HDA core that ASoC drivers should be considered in
    driver matching (hda_bus_match()). The SOF and SST drivers continue by
    overriding this field to HDA_DEV_LEGACY and proceeding to load driver
    modules with request_module(). Correct drivers will get loaded and
    attached.
    
    If however the codec drivers are already loaded when
    snd_hdac_ext_bus_device_init() is called, the matching will not work as
    expected as device type is still set to HDA_DEV_ASOC. Specifically if
    hdac-hdmi is attached when machine driver is configured to use hdac-hda,
    this leads to out-of-bounds memory access in
    hda_dsp_hdmi_build_controls().
    
    Fix the issue by adding codec type as a parameter to
    snd_hdac_ext_bus_device_init() and ensuring type is set correctly from
    the start.
    
    Fixes: 139c7feb ("ASoC: SOF: Intel: add support for snd-hda-codec-hdmi")
    Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
    Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
    Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Link: https://lore.kernel.org/r/20200921100841.2882662-1-kai.vehmanen@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    163cd105
hda-codec.c 6.78 KB