diff options
Diffstat (limited to 'kernel/src/devices/pci.c')
| -rw-r--r-- | kernel/src/devices/pci.c | 67 |
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); } |
