forked from luck/tmp_suning_uos_patched
ALSA: hda: Refactor Intel NHLT init
NHLT fetch based on _DSM prevents ACPI table override mechanism from being utilized. Make use of acpi_get_table to enable it and get rid of redundant code. In consequence, NHLT can be overridden just like any other ACPI table, e.g.: DSDT or SSDT. Change has been verified on all Intel AVS architecture platforms, RVP and production laptops both. Change possible due to addition of NHLT signature to the list of standard ACPI tables: https://patchwork.kernel.org/patch/11463235/ Override helps not only with debug purposes but also allows user for table adjustment when one found on their production hardware is invalid. Shared official NHLT spec is now available to community at: https://01.org/blogs/intel-smart-sound-technology-audio-dsp NHLT support for iASL is still ongoing subject but should be available in nearest future. Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://lore.kernel.org/r/20200423160310.28019-1-cezary.rojewski@intel.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
ae83d0b416
commit
0d283287a4
|
@ -4,58 +4,25 @@
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <sound/intel-nhlt.h>
|
#include <sound/intel-nhlt.h>
|
||||||
|
|
||||||
#define NHLT_ACPI_HEADER_SIG "NHLT"
|
|
||||||
|
|
||||||
/* Unique identification for getting NHLT blobs */
|
|
||||||
static const guid_t osc_guid =
|
|
||||||
GUID_INIT(0xA69F886E, 0x6CEB, 0x4594,
|
|
||||||
0xA4, 0x1F, 0x7B, 0x5D, 0xCE, 0x24, 0xC5, 0x53);
|
|
||||||
|
|
||||||
struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)
|
struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)
|
||||||
{
|
{
|
||||||
acpi_handle handle;
|
struct nhlt_acpi_table *nhlt;
|
||||||
union acpi_object *obj;
|
acpi_status status;
|
||||||
struct nhlt_resource_desc *nhlt_ptr;
|
|
||||||
struct nhlt_acpi_table *nhlt_table = NULL;
|
|
||||||
|
|
||||||
handle = ACPI_HANDLE(dev);
|
status = acpi_get_table(ACPI_SIG_NHLT, 0,
|
||||||
if (!handle) {
|
(struct acpi_table_header **)&nhlt);
|
||||||
dev_err(dev, "Didn't find ACPI_HANDLE\n");
|
if (ACPI_FAILURE(status)) {
|
||||||
|
dev_warn(dev, "NHLT table not found\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
obj = acpi_evaluate_dsm(handle, &osc_guid, 1, 1, NULL);
|
return nhlt;
|
||||||
|
|
||||||
if (!obj)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (obj->type != ACPI_TYPE_BUFFER) {
|
|
||||||
dev_dbg(dev, "No NHLT table found\n");
|
|
||||||
ACPI_FREE(obj);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
nhlt_ptr = (struct nhlt_resource_desc *)obj->buffer.pointer;
|
|
||||||
if (nhlt_ptr->length)
|
|
||||||
nhlt_table = (struct nhlt_acpi_table *)
|
|
||||||
memremap(nhlt_ptr->min_addr, nhlt_ptr->length,
|
|
||||||
MEMREMAP_WB);
|
|
||||||
ACPI_FREE(obj);
|
|
||||||
if (nhlt_table &&
|
|
||||||
(strncmp(nhlt_table->header.signature,
|
|
||||||
NHLT_ACPI_HEADER_SIG,
|
|
||||||
strlen(NHLT_ACPI_HEADER_SIG)) != 0)) {
|
|
||||||
memunmap(nhlt_table);
|
|
||||||
dev_err(dev, "NHLT ACPI header signature incorrect\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return nhlt_table;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(intel_nhlt_init);
|
EXPORT_SYMBOL_GPL(intel_nhlt_init);
|
||||||
|
|
||||||
void intel_nhlt_free(struct nhlt_acpi_table *nhlt)
|
void intel_nhlt_free(struct nhlt_acpi_table *nhlt)
|
||||||
{
|
{
|
||||||
memunmap((void *)nhlt);
|
acpi_put_table((struct acpi_table_header *)nhlt);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(intel_nhlt_free);
|
EXPORT_SYMBOL_GPL(intel_nhlt_free);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user