feat: initial locking etc.

This commit is contained in:
2021-03-01 21:07:53 +01:00
parent ebe006a8ba
commit 990b850c43
14 changed files with 427 additions and 14 deletions

View File

@@ -87,6 +87,22 @@ void pci_config_write_byte(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offs
port_byte_out(PORT_PCI_CONFIG_DATA, value);
}
pci_command_register_t pci_get_config(pci_device *device) {
pci_command_register_t status;
status.value = pci_config_read_word(device->bus, device->slot, device->func, PCI_CONFIG_COMMAND);
return status;
}
void pci_set_status(pci_device *device, pci_status_register_t status) {
pci_config_write_word(device->bus, device->slot, device->func, PCI_CONFIG_STATUS, status.value);
}
pci_status_register_t pci_get_status(pci_device *device) {
pci_status_register_t status;
status.value = pci_config_read_word(device->bus, device->slot, device->func, PCI_CONFIG_STATUS);
return status;
}
uint16_t pci_get_vendor_id(uint8_t bus, uint8_t slot, uint8_t func) {
return pci_config_read_word(bus, slot, func, PCI_CONFIG_VENDOR_ID);
}
@@ -193,6 +209,31 @@ void pci_print_info() {
}
}
void pci_dump_caps_internal(pci_device *device) {
if (pci_devices->headerType >= 0x02) {
printf("\tNot supported for PCI-to-CardBus bridge\n");
return;
}
if (!pci_get_status(device).status.capabilities_list) {
printf("\tNo caps\n");
return;
}
uint8_t cap_ptr = pci_config_read_byte(device->bus, device->slot, device->func, PCI_CONFIG_CAP_POINTER);
printf("\t%x\n", cap_ptr);
// todo traverse
}
void pci_dump_caps() {
for (int i = 0; i < last_pci_device_index; ++i) {
printf("PCI BSF: %2x/%2x/%2x, CSI: %2x/%2x/%2x, V/D: %4x/%4x, driver: %s\n",
pci_devices[i].bus, pci_devices[i].slot, pci_devices[i].func,
pci_devices[i].class, pci_devices[i].subclass, pci_devices[i].programInterface,
pci_devices[i].vendorId, pci_devices[i].deviceId,
(pci_devices[i].pci_driver == NULL ? "none" : pci_devices[i].pci_driver->name));
pci_dump_caps_internal(&pci_devices[i]);
}
}
void pci_init_bar(pci_device *device, uint8_t bar_index) {
if (device->headerType != 0x00) {
k_panics("Only header 0x00 supported for now");