summaryrefslogtreecommitdiff
path: root/kernel/src/devices/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/devices/pci.c')
-rw-r--r--kernel/src/devices/pci.c67
1 files changed, 37 insertions, 30 deletions
diff --git a/kernel/src/devices/pci.c b/kernel/src/devices/pci.c
index 9862dee..ea6c80e 100644
--- a/kernel/src/devices/pci.c
+++ b/kernel/src/devices/pci.c
@@ -9,7 +9,9 @@
#include <pci.h>
#include <pci_info.h>
-inline void pci_print_dev(pci_dev *pci_func)
+pci_dev_list_t pci_dev_list;
+
+inline void pci_print_dev(pci_dev_t *pci_func)
{
const char *vendor_str = get_vendor(pci_func->vendor_id);
const char *class_str = get_class(pci_func->class_);
@@ -54,18 +56,20 @@ void enumerate_function(uint64_t dev_addr, uint64_t function)
uint64_t func_addr = dev_addr + (function << 12);
map_addr(func_addr, func_addr, FLAG_PRESENT);
- pci_dev *pci_func = (pci_dev *)kalloc(sizeof(pci_dev));
- memcpy(pci_func, (uint64_t *)func_addr, sizeof(pci_dev));
+ pci_dev0_t *pci_func = (pci_dev0_t *)kalloc(sizeof(pci_dev0_t));
+ memcpy(pci_func, (uint64_t *)func_addr, sizeof(pci_dev0_t));
- if (pci_func->device_id == 0)
- goto error;
- if (pci_func->device_id == 0xFFFF)
- goto error;
+ int id = pci_func->pci_dev.device_id;
+ if (id == 0 || id == 0xFFFF) {
+ kfree(pci_func);
+ return;
+ }
- pci_print_dev(pci_func);
+ pci_dev_list_t *dev_list = kalloc(sizeof(pci_dev_list_t));
+ dev_list->dev = pci_func;
-error:
- kfree(pci_func);
+ add_to_list(&dev_list->list, &pci_dev_list.list,
+ pci_dev_list.list.next);
}
void enumerate_device(uint64_t bus_addr, uint64_t device)
@@ -73,21 +77,18 @@ void enumerate_device(uint64_t bus_addr, uint64_t device)
uint64_t dev_addr = bus_addr + (device << 15);
map_addr(dev_addr, dev_addr, FLAG_PRESENT);
- pci_dev *pci_device = (pci_dev *)kalloc(sizeof(pci_dev));
- memcpy(pci_device, (uint64_t *)bus_addr, sizeof(pci_dev));
+ pci_dev_t *pci_device = (pci_dev_t *)kalloc(sizeof(pci_dev_t));
+ memcpy(pci_device, (uint64_t *)bus_addr, sizeof(pci_dev_t));
- if (pci_device->device_id == 0)
- goto error;
- if (pci_device->device_id == 0xFFFF)
- goto error;
+ if (pci_device->device_id == 0 || pci_device->device_id == 0xFFFF) {
+ kfree(pci_device);
+ return;
+ }
size_t func;
for (func = 0; func < 8; func++) {
enumerate_function(dev_addr, func);
}
-
-error:
- kfree(pci_device);
}
void enumerate_bus(uint64_t base_addr, uint64_t bus)
@@ -95,31 +96,39 @@ void enumerate_bus(uint64_t base_addr, uint64_t bus)
uint64_t bus_addr = base_addr + (bus << 20);
map_addr(bus_addr, bus_addr, FLAG_PRESENT);
- pci_dev *pci_device = (pci_dev *)kalloc(sizeof(pci_dev));
- memcpy(pci_device, (uint64_t *)bus_addr, sizeof(pci_dev));
+ pci_dev_t *pci_device = (pci_dev_t *)kalloc(sizeof(pci_dev_t));
+ memcpy(pci_device, (uint64_t *)bus_addr, sizeof(pci_dev_t));
- if (pci_device->device_id == 0)
- goto error;
- if (pci_device->device_id == 0xFFFF)
- goto error;
+ if (pci_device->device_id == 0 || pci_device->device_id == 0xFFFF) {
+ kfree(pci_device);
+ return;
+ }
size_t dev;
for (dev = 0; dev < 32; dev++) {
enumerate_device(bus_addr, dev);
}
-
-error:
- kfree(pci_device);
}
void enumerate_cfg_space(config_space_mcfgt *cfg_space)
{
+ INIT_LIST(pci_dev_list.list);
+
size_t i;
for (i = cfg_space->start_bus; i < cfg_space->end_bus; i++) {
enumerate_bus(cfg_space->base_addr, i);
}
}
+void pci_print_all()
+{
+ pci_dev_list_t *curr;
+ list_for_each_entry(curr, (&pci_dev_list.list), list) {
+ pci_print_dev(&curr->dev->pci_dev);
+ }
+ printf("\n");
+}
+
void read_mcfgt()
{
uint64_t *mcfgt_addr = find_sys_table_addr("MCFG");
@@ -145,9 +154,7 @@ void read_mcfgt()
for (i = 0; i < len; i++) {
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_bus, cfg_space->end_bus); */
enumerate_cfg_space(cfg_space);
}
- printf("\n");
kfree(cfg_space);
}