Thread (35 messages) 35 messages, 8 authors, 2020-10-16

Re: [PATCH v3 7/8] arm64: mm: Set ZONE_DMA size based on early IORT scan

From: Ard Biesheuvel <ardb@kernel.org>
Date: 2020-10-16 06:56:28
Also in: linux-acpi, linux-devicetree, linux-iommu, lkml

On Thu, 15 Oct 2020 at 12:31, Lorenzo Pieralisi
[off-list ref] wrote:
On Wed, Oct 14, 2020 at 09:12:09PM +0200, Nicolas Saenz Julienne wrote:

[...]
quoted
+unsigned int __init acpi_iort_get_zone_dma_size(void)
+{
+     struct acpi_table_iort *iort;
+     struct acpi_iort_node *node, *end;
+     acpi_status status;
+     u8 limit = 32;
+     int i;
+
+     if (acpi_disabled)
+             return limit;
+
+     status = acpi_get_table(ACPI_SIG_IORT, 0,
+                             (struct acpi_table_header **)&iort);
+     if (ACPI_FAILURE(status))
+             return limit;
+
+     node = ACPI_ADD_PTR(struct acpi_iort_node, iort, iort->node_offset);
+     end = ACPI_ADD_PTR(struct acpi_iort_node, iort, iort->header.length);
+
+     for (i = 0; i < iort->node_count; i++) {
+             if (node >= end)
+                     break;
+
+             switch (node->type) {
+                     struct acpi_iort_named_component *ncomp;
+                     struct acpi_iort_root_complex *rc;
+
+             case ACPI_IORT_NODE_NAMED_COMPONENT:
+                     ncomp = (struct acpi_iort_named_component *)node->node_data;
+                     if (ncomp->memory_address_limit)
+                             limit = min(limit, ncomp->memory_address_limit);
+                     break;
+
+             case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
+                     rc = (struct acpi_iort_root_complex *)node->node_data;
+                     if (rc->memory_address_limit)
You need to add a node revision check here, see rc_dma_get_range() in
drivers/acpi/arm64/iort.c, otherwise we may be reading junk data
in older IORT tables - acpica structures are always referring to the
latest specs.
Indeed - apologies for not mentioning that when handing over the patch.

Also, we could use min_not_zero() here instead of the if ()

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help