summaryrefslogtreecommitdiff
path: root/kernel/src/devices
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/devices')
-rw-r--r--kernel/src/devices/pci.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/kernel/src/devices/pci.c b/kernel/src/devices/pci.c
new file mode 100644
index 0000000..85c7b69
--- /dev/null
+++ b/kernel/src/devices/pci.c
@@ -0,0 +1,40 @@
+#include <types.h>
+#include <rsdp.h>
+#include <libk/stdio.h>
+#include <mcfg.h>
+#include <heap.h>
+#include <paging.h>
+#include <libk/string.h>
+
+void read_mcfgt()
+{
+ uint64_t *mcfgt_addr = find_sys_table_addr("MCFG");
+ uint64_t mcfgt_cfg_addr;
+ size_t len;
+ size_t i;
+
+ if (mcfgt_addr == NULL) {
+ printf("MCFG not found\n");
+ return;
+ }
+
+ mcfgt_cfg_addr = (uint64_t)((uint8_t *)mcfgt_addr + sizeof(MCFGT));
+ map_addr((uint64_t)mcfgt_addr, (uint64_t)mcfgt_addr, sizeof(MCFGT));
+ MCFGT *mcfgt = (MCFGT *)kalloc(sizeof(MCFGT));
+ memcpy(mcfgt, mcfgt_addr, sizeof(MCFGT));
+ len = (mcfgt->length - sizeof(MCFGT)) / 16;
+ kfree(mcfgt);
+
+ config_space_mcfgt *cfg_space =
+ (config_space_mcfgt *)kalloc(sizeof(config_space_mcfgt));
+ for (i = 0; i < len; i++) {
+ map_addr(mcfgt_cfg_addr, mcfgt_cfg_addr,
+ sizeof(config_space_mcfgt));
+ memcpy(cfg_space, (uint64_t *)mcfgt_cfg_addr,
+ sizeof(config_space_mcfgt));
+ printf("addr: 0x%x, group: %d, start: %d, stop: %d\n",
+ cfg_space->base_addr, cfg_space->pci_seg_group,
+ cfg_space->start_pci_bus, cfg_space->end_pci_bus);
+ }
+ kfree(cfg_space);
+}