feat: initial locking etc.
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user