Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ACPI/IORT: Fix PMCG node single ID mapping handling

An IORT PMCG node can have no ID mapping if its overflow interrupt is
wire based therefore the code that parses the PMCG node can not assume
the node will always have a single mapping present at index 0.

Fix iort_get_id_mapping_index() by checking for an overflow interrupt
and mapping count.

Fixes: 24e516049360 ("ACPI/IORT: Add support for PMCG")

Signed-off-by: Tuan Phan <tuanphan@os.amperecomputing.com>
Reviewed-by: Hanjun Guo <guoahanjun@huawei.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Link: https://lore.kernel.org/r/1589994787-28637-1-git-send-email-tuanphan@os.amperecomputing.com
Signed-off-by: Will Deacon <will@kernel.org>

authored by

Tuan Phan and committed by
Will Deacon
50c8ab8d 701dafe0

+5
+5
drivers/acpi/arm64/iort.c
··· 388 388 static int iort_get_id_mapping_index(struct acpi_iort_node *node) 389 389 { 390 390 struct acpi_iort_smmu_v3 *smmu; 391 + struct acpi_iort_pmcg *pmcg; 391 392 392 393 switch (node->type) { 393 394 case ACPI_IORT_NODE_SMMU_V3: ··· 416 415 417 416 return smmu->id_mapping_index; 418 417 case ACPI_IORT_NODE_PMCG: 418 + pmcg = (struct acpi_iort_pmcg *)node->node_data; 419 + if (pmcg->overflow_gsiv || node->mapping_count == 0) 420 + return -EINVAL; 421 + 419 422 return 0; 420 423 default: 421 424 return -EINVAL;