ASoC: Intel: avs: Read HW capabilities when possible
Starting with LunarLake (LNL) and onward, some hardware capabilities are visible to the sound driver directly. At the same time, these may no longer be visible to the AudioDSP firmware. Update resource allocation function to rely on the registers when possible. Reviewed-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Acked-by: Liam Girdwood <liam.r.girdwood@linux.intel.com> Link: https://patch.msgid.link/20250407112352.3720779-4-cezary.rojewski@intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
acd2563f30
commit
b9a3ec6049
|
@ -99,6 +99,7 @@ struct hdac_ext_link {
|
|||
u32 lcaps; /* link capablities */
|
||||
u16 lsdiid; /* link sdi identifier */
|
||||
u32 id;
|
||||
u8 slcount;
|
||||
|
||||
int ref_count;
|
||||
|
||||
|
|
|
@ -98,6 +98,7 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus)
|
|||
(AZX_ML_INTERVAL * idx);
|
||||
hlink->lcaps = readl(hlink->ml_addr + AZX_REG_ML_LCAP);
|
||||
hlink->lsdiid = readw(hlink->ml_addr + AZX_REG_ML_LSDIID);
|
||||
hlink->slcount = FIELD_GET(AZX_ML_HDA_LCAP_SLCOUNT, hlink->lcaps) + 1;
|
||||
|
||||
if (hdac_ext_link_alt(hlink)) {
|
||||
leptr = readl(hlink->ml_addr + AZX_REG_ML_LEPTR);
|
||||
|
|
|
@ -73,6 +73,7 @@ extern const struct avs_dsp_ops avs_tgl_dsp_ops;
|
|||
#define AVS_PLATATTR_CLDMA BIT_ULL(0)
|
||||
#define AVS_PLATATTR_IMR BIT_ULL(1)
|
||||
#define AVS_PLATATTR_ACE BIT_ULL(2)
|
||||
#define AVS_PLATATTR_ALTHDA BIT_ULL(3)
|
||||
|
||||
#define avs_platattr_test(adev, attr) \
|
||||
((adev)->spec->attributes & AVS_PLATATTR_##attr)
|
||||
|
|
|
@ -683,6 +683,7 @@ int avs_dsp_boot_firmware(struct avs_dev *adev, bool purge)
|
|||
|
||||
static int avs_dsp_alloc_resources(struct avs_dev *adev)
|
||||
{
|
||||
struct hdac_ext_link *link;
|
||||
int ret, i;
|
||||
|
||||
ret = avs_ipc_get_hw_config(adev, &adev->hw_cfg);
|
||||
|
@ -693,6 +694,14 @@ static int avs_dsp_alloc_resources(struct avs_dev *adev)
|
|||
if (ret)
|
||||
return AVS_IPC_RET(ret);
|
||||
|
||||
/* If hw allows, read capabilities directly from it. */
|
||||
if (avs_platattr_test(adev, ALTHDA)) {
|
||||
link = snd_hdac_ext_bus_get_hlink_by_id(&adev->base.core,
|
||||
AZX_REG_ML_LEPTR_ID_INTEL_SSP);
|
||||
if (link)
|
||||
adev->hw_cfg.i2s_caps.ctrl_count = link->slcount;
|
||||
}
|
||||
|
||||
adev->core_refs = devm_kcalloc(adev->dev, adev->hw_cfg.dsp_cores,
|
||||
sizeof(*adev->core_refs), GFP_KERNEL);
|
||||
adev->lib_names = devm_kcalloc(adev->dev, adev->fw_cfg.max_libs_count,
|
||||
|
|
Loading…
Reference in New Issue