|
@@ -197,6 +197,35 @@ static int __init slit_valid(struct acpi_table_slit *slit)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+#if defined(CONFIG_X86) || defined(CONFIG_ARM64)
|
|
|
+/*
|
|
|
+ * Callback for SLIT parsing. pxm_to_node() returns NUMA_NO_NODE for
|
|
|
+ * I/O localities since SRAT does not list them. I/O localities are
|
|
|
+ * not supported at this point.
|
|
|
+ */
|
|
|
+void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
|
|
|
+{
|
|
|
+ int i, j;
|
|
|
+
|
|
|
+ for (i = 0; i < slit->locality_count; i++) {
|
|
|
+ const int from_node = pxm_to_node(i);
|
|
|
+
|
|
|
+ if (from_node == NUMA_NO_NODE)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ for (j = 0; j < slit->locality_count; j++) {
|
|
|
+ const int to_node = pxm_to_node(j);
|
|
|
+
|
|
|
+ if (to_node == NUMA_NO_NODE)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ numa_set_distance(from_node, to_node,
|
|
|
+ slit->entry[slit->locality_count * i + j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif /* defined(CONFIG_X86) || defined (CONFIG_ARM64) */
|
|
|
+
|
|
|
static int __init acpi_parse_slit(struct acpi_table_header *table)
|
|
|
{
|
|
|
struct acpi_table_slit *slit = (struct acpi_table_slit *)table;
|