diff --git a/inc/drivers/pci.h b/inc/drivers/pci.h index 23052f6..334dd42 100644 --- a/inc/drivers/pci.h +++ b/inc/drivers/pci.h @@ -230,8 +230,25 @@ typedef struct { uint8_t max_latency; } __attribute__((packed)) pci_header_0_T; -void pci_init (); -string_t pci_get_subclass_string (pci_class_E class, uint8_t subclass); -string_t pci_get_vendor_string (uint16_t vendor_id); +typedef struct pci_device_T pci_device_T; +struct pci_device_T { + pci_device_header_T* header; + pci_device_T* prev; + pci_device_T* next; +}; + +typedef struct { + pci_device_T* devices; +} pci_manager_T; + +void pci_init (); + +void pci_manager_add_device (pci_device_header_T* header); +void pci_manager_remove_device (pci_device_T* device); +pci_device_T* pci_manager_find_device (pci_class_E class, uint8_t subclass, uint8_t progif); +void pci_manager_dump_devices (); + +string_t pci_get_subclass_string (pci_class_E class, uint8_t subclass); +string_t pci_get_vendor_string (uint16_t vendor_id); #endif // NOXOS_PCI_H diff --git a/src/boot/kmain.c b/src/boot/kmain.c index c1b8af7..b8cee57 100644 --- a/src/boot/kmain.c +++ b/src/boot/kmain.c @@ -60,20 +60,7 @@ void kmain(boot_info_T boot_info) { log(LOG_INFO, "!=====[ Kernel Initialized ]=====!\n"); - - vfs_node_T* node = vfs_resolve_path(&g_root_fs, "/initrd/test.elf"); - void* buffer = memory_allocate(node->size); - vfs_file_read(node, 0, node->size, buffer); - - elf_executable_T* exec = elf_executable_create(buffer); - - pid_t process = process_spawn(PROCESS_KERNEL, "test 1", exec, buffer); - void* func = (void*)symbol_resolve_from_name(scheduler_get_process(process)->executable->symbols, - scheduler_get_process(process)->executable->num_symbols, - "_start")->address + MEM_REGION_PROCESS_EXEC; - thread_start(thread_spawn(process, func)); - - scheduler_dump_info(scheduler_get_process(PROCESS_KERNEL), 0); + pci_device_T* ahci_controller = pci_manager_find_device(PCI_CLASS_MASS_STORAGE_CONTROLLER, PCI_SUBCLASS_SERIAL_ATA_CONTROLLER, 1); CORE_HALT_FOREVER } diff --git a/src/drivers/pci.c b/src/drivers/pci.c index 7f86372..e05c644 100644 --- a/src/drivers/pci.c +++ b/src/drivers/pci.c @@ -5,6 +5,9 @@ #include "drivers/acpi/mcfg.h" #include "mm/page_map.h" #include "utils/logger.h" +#include "utils/memory.h" + +pci_manager_T* g_pci_manager; string_t pci_get_subclass_string(pci_class_E class, uint8_t subclass) { switch (class) { @@ -248,8 +251,7 @@ void pci_enumerate_function(void* device_address, uint8_t function) { pci_device_header_T* device_header = (pci_device_header_T*)function_address; if (device_header->device_id == 0 || device_header->device_id == 0xFFFF) return; - log(LOG_DEBUG, " Found %s - %s - %xw:%xw", pci_get_subclass_string(device_header->main_class, device_header->subclass), - pci_get_vendor_string(device_header->vendor_id), device_header->vendor_id, device_header->device_id); + pci_manager_add_device(device_header); } void pci_enumerate_device(void* bus_address, uint8_t device) { @@ -277,6 +279,11 @@ void pci_enumerate_bus(void* base, uint8_t bus) { } void pci_init() { + + g_pci_manager = memory_allocate(sizeof(pci_manager_T)); + g_pci_manager->devices = NULL; + + // enumerate devices uint32_t num_configs = (g_acpi_table_mcfg->header.length - sizeof(acpi_mcfg_T)) / sizeof(acpi_mcfg_device_config_T); acpi_mcfg_device_config_T* configs = (acpi_mcfg_device_config_T*)(&g_acpi_table_mcfg[1]); @@ -287,4 +294,58 @@ void pci_init() { pci_enumerate_bus((void*)config->base, bus); } } + + pci_manager_dump_devices(); +} + +void pci_manager_add_device(pci_device_header_T* header) { + pci_device_T* device = memory_allocate(sizeof(pci_device_T)); + + device->header = header; + + // link in front of list + device->prev = NULL; + device->next = g_pci_manager->devices; + g_pci_manager->devices = device; + if (device->next != NULL) { + device->next->prev = device; + } +} + +void pci_manager_remove_device(pci_device_T* device) { + if (device->prev != NULL) { + device->prev->next = device->next; + } + if (device->next != NULL) { + device->next->prev = device->prev; + } + + memory_free(device); +} + +pci_device_T* pci_manager_find_device(pci_class_E class, uint8_t subclass, uint8_t progif) { + pci_device_T* device = g_pci_manager->devices; + while (device != NULL) { + if (device->header->main_class != class || device->header->subclass != subclass || device->header->progif != progif) { + device = device->next; + continue; + } + + return device; + } + + log(LOG_WARNING, " %s with progif 0x%xb not found!", pci_get_subclass_string(class, subclass), progif); + + return NULL; +} + +void pci_manager_dump_devices() { + log(LOG_DEBUG, " Devices:"); + pci_device_T* device = g_pci_manager->devices; + while (device != NULL) { + log(LOG_DEBUG, " %s - %s - %xw:%xw", + pci_get_subclass_string(device->header->main_class, device->header->subclass), + pci_get_vendor_string(device->header->vendor_id), device->header->vendor_id, device->header->device_id); + device = device->next; + } } \ No newline at end of file