1#include <acpi/acpi.h>
2#include <asm.h>
3#include <console/panic.h>
4#include <console/printf.h>
5#include <global.h>
6#include <log.h>
7#include <math/sort.h>
8#include <mem/alloc.h>
9#include <mem/numa.h>
10#include <mem/vmm.h>
11#include <uacpi/tables.h>
12
13#include "uacpi/acpi.h"
14#include "uacpi/status.h"
15
16LOG_HANDLE_DECLARE_DEFAULT(slit);
17
18void slit_init(void) {
19 struct uacpi_table slit_table;
20 if (uacpi_table_find_by_signature(signature: "SLIT", out_table: &slit_table) != UACPI_STATUS_OK) {
21 log_warn_global(LOG_HANDLE(slit),
22 "SLIT table not found, assuming uniform distances");
23 size_t n = global.numa_node_count;
24 for (size_t i = 0; i < n; i++)
25 for (size_t j = 0; j < n; j++)
26 global.numa_nodes[i].distance[j] = (i == j) ? 10 : 20;
27
28 return;
29 }
30
31 struct acpi_slit *slit = slit_table.ptr;
32 size_t n = slit->num_localities;
33
34 if (n != global.numa_node_count) {
35 log_warn_global(LOG_HANDLE(slit),
36 "Mismatch in SLIT nodes vs detected NUMA nodes");
37 }
38
39 uint8_t *entry = slit->matrix;
40
41 for (size_t i = 0; i < n; i++) {
42 struct numa_node *node = &global.numa_nodes[i];
43 for (size_t j = 0; j < n; j++) {
44 node->distance[j] = entry[i * n + j];
45 }
46 }
47
48 for (size_t i = 0; i < global.numa_node_count; i++) {
49 numa_construct_relative_distances(node: &global.numa_nodes[i]);
50 }
51
52 numa_dump();
53}
54