9a9541dcfbf9af23bc0aed0fe0ea3f39005a7a93
[lunaix-os.git] / lunaix-os / hal / acpi / parser / mcfg_parser.c
1 #include "lunaix/syslog.h"
2 #include "parser.h"
3 #include <lunaix/mm/valloc.h>
4
5 LOG_MODULE("MCFG")
6
7 void
8 mcfg_parse(acpi_sdthdr_t* mcfg, acpi_context* toc)
9 {
10     size_t alloc_num = (mcfg->length - sizeof(acpi_sdthdr_t) - 8) /
11                        sizeof(struct acpi_mcfg_alloc);
12     struct acpi_mcfg_alloc* allocs =
13       (struct acpi_mcfg_alloc*)((ptr_t)mcfg + (sizeof(acpi_sdthdr_t) + 8));
14
15     toc->mcfg.alloc_num = alloc_num;
16     toc->mcfg.allocations = valloc(sizeof(struct mcfg_alloc_info) * alloc_num);
17
18     for (size_t i = 0; i < alloc_num; i++) {
19         toc->mcfg.allocations[i] = (struct mcfg_alloc_info){
20             .base_addr = allocs[i].base_addr_lo,
21             .pci_bus_start = allocs[i].pci_bus_start,
22             .pci_bus_end = allocs[i].pci_bus_end,
23             .pci_seg_num = allocs[i].pci_seg_num,
24         };
25     }
26 }