Skip to content

Commit d41a4cb

Browse files
fix pci_enable_msi/pci_enable_msix, so now ahci uses msi
1 parent 8dbe7bc commit d41a4cb

File tree

3 files changed

+62
-44
lines changed

3 files changed

+62
-44
lines changed

build-usb.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
const VOL_LABEL = 'RETROROCKET';
1616
const HEADROOM_MB = 64;
1717

18-
chdir(LIMINE_DIR);
19-
run('env -u MAKEFLAGS -u MFLAGS -u MAKELEVEL make -j1 CC="/usr/bin/gcc -B/usr/bin/" >/dev/null');
20-
chdir(BUILD_DIR);
18+
2119

2220
if (!is_file(LIMINE_BIN) || !is_executable(LIMINE_BIN)) {
23-
throw new RuntimeException("limine build failed: missing or non-executable '" . LIMINE_BIN . "'");
21+
chdir(LIMINE_DIR);
22+
run('env -u MAKEFLAGS -u MFLAGS -u MAKELEVEL make -j1 CC="/usr/bin/gcc -B/usr/bin/" >/dev/null');
23+
chdir(BUILD_DIR);
24+
if (!is_file(LIMINE_BIN) || !is_executable(LIMINE_BIN)) {
25+
throw new RuntimeException("limine build failed: missing or non-executable '" . LIMINE_BIN . "'");
26+
}
2427
}
2528
function run(string $cmd, array $env = []): void {
2629
$proc = proc_open($cmd, [1=>['pipe','w'], 2=>['pipe','w']], $pipes, null, $env + $_ENV);

include/pci.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,7 @@ extern pci_dev_t dev_zero;
8383

8484
#define PCI_CAPABILITY_MSI 0x05
8585
#define PCI_MSI_64BIT (1 << 7)
86-
#define PCI_MSI_DEASSERT (1 << 14)
87-
#define PCI_MSI_EDGETRIGGER (1 << 15)
88-
#define PCI_MSI_ENABLE (1 << 16)
86+
#define PCI_MSI_ENABLE (1 << 0)
8987

9088
#define PCI_CAPABILITY_MSIX 0x11
9189

src/pci.c

Lines changed: 54 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,29 @@ void pci_display_device_list()
414414
// Don't list bridges
415415
continue;
416416
}
417+
bool msi = false, msix = false;
418+
/* Check for MSI/MSI-X capability */
419+
uint16_t status = pci_read16(list[n], PCI_STATUS);
420+
if (status & PCI_STATUS_CAPABILITIES_LIST) {
421+
uint8_t cap = pci_read8(list[n], PCI_CAPABILITY_POINTER);
422+
while (cap) {
423+
uint8_t id = pci_read8(list[n], cap + 0x00);
424+
uint8_t next = pci_read8(list[n], cap + 0x01);
425+
if (id == PCI_CAPABILITY_MSI) {
426+
msi = true;
427+
} else if (id == PCI_CAPABILITY_MSIX) {
428+
msix = true;
429+
}
430+
cap = next;
431+
}
432+
}
417433
dprintf(
418-
"%02x:%02x:%02x: %s (%04x:%04x) [%02x:%02x:%02x]\n",
434+
"%02x:%02x:%02x: %s (%04x:%04x) [%02x:%02x:%02x] %s%s\n",
419435
list[n].bus_num, list[n].device_num, list[n].function_num,
420436
device_description,
421437
pci_read(list[n], PCI_VENDOR_ID), pci_read(list[n], PCI_DEVICE_ID),
422-
class, subclass, progif
438+
class, subclass, progif,
439+
msi ? "MSI" : "", msix ? "MSI-X" : ""
423440
);
424441
}
425442
}
@@ -820,52 +837,52 @@ uint64_t get_bar_size(pci_dev_t dev, int bar_index) {
820837
}
821838

822839
bool pci_disable_bus_master(pci_dev_t device) {
823-
uint32_t cmd = pci_read(device, PCI_COMMAND);
824-
if ((cmd & PCI_COMMAND_BUS_MASTER) != 0) {
825-
cmd &= ~PCI_COMMAND_BUS_MASTER;
826-
pci_write(device, PCI_COMMAND, cmd);
827-
cmd = pci_read(device, PCI_COMMAND);
828-
}
829-
return (cmd & PCI_COMMAND_BUS_MASTER) == 0;
840+
uint32_t cmd = pci_read(device, PCI_COMMAND);
841+
if ((cmd & PCI_COMMAND_BUS_MASTER) != 0) {
842+
cmd &= ~PCI_COMMAND_BUS_MASTER;
843+
pci_write(device, PCI_COMMAND, cmd);
844+
cmd = pci_read(device, PCI_COMMAND);
845+
}
846+
return (cmd & PCI_COMMAND_BUS_MASTER) == 0;
830847
}
831848

832849
bool pci_enable_iospace(pci_dev_t device) {
833-
uint32_t cmd = pci_read(device, PCI_COMMAND);
834-
if ((cmd & PCI_COMMAND_IOSPACE) == 0) {
835-
cmd |= PCI_COMMAND_IOSPACE;
836-
pci_write(device, PCI_COMMAND, cmd);
837-
cmd = pci_read(device, PCI_COMMAND);
838-
}
839-
return (cmd & PCI_COMMAND_IOSPACE) != 0;
850+
uint32_t cmd = pci_read(device, PCI_COMMAND);
851+
if ((cmd & PCI_COMMAND_IOSPACE) == 0) {
852+
cmd |= PCI_COMMAND_IOSPACE;
853+
pci_write(device, PCI_COMMAND, cmd);
854+
cmd = pci_read(device, PCI_COMMAND);
855+
}
856+
return (cmd & PCI_COMMAND_IOSPACE) != 0;
840857
}
841858

842859
bool pci_enable_memspace(pci_dev_t device) {
843-
uint32_t cmd = pci_read(device, PCI_COMMAND);
844-
if ((cmd & PCI_COMMAND_MEMSPACE) == 0) {
845-
cmd |= PCI_COMMAND_MEMSPACE;
846-
pci_write(device, PCI_COMMAND, cmd);
847-
cmd = pci_read(device, PCI_COMMAND);
848-
}
849-
return (cmd & PCI_COMMAND_MEMSPACE) != 0;
860+
uint32_t cmd = pci_read(device, PCI_COMMAND);
861+
if ((cmd & PCI_COMMAND_MEMSPACE) == 0) {
862+
cmd |= PCI_COMMAND_MEMSPACE;
863+
pci_write(device, PCI_COMMAND, cmd);
864+
cmd = pci_read(device, PCI_COMMAND);
865+
}
866+
return (cmd & PCI_COMMAND_MEMSPACE) != 0;
850867
}
851868

852869
bool pci_disable_iospace(pci_dev_t device) {
853-
uint32_t cmd = pci_read(device, PCI_COMMAND);
854-
if ((cmd & PCI_COMMAND_IOSPACE) != 0) {
855-
cmd &= ~PCI_COMMAND_IOSPACE;
856-
pci_write(device, PCI_COMMAND, cmd);
857-
cmd = pci_read(device, PCI_COMMAND);
858-
}
859-
return (cmd & PCI_COMMAND_IOSPACE) == 0;
870+
uint32_t cmd = pci_read(device, PCI_COMMAND);
871+
if ((cmd & PCI_COMMAND_IOSPACE) != 0) {
872+
cmd &= ~PCI_COMMAND_IOSPACE;
873+
pci_write(device, PCI_COMMAND, cmd);
874+
cmd = pci_read(device, PCI_COMMAND);
875+
}
876+
return (cmd & PCI_COMMAND_IOSPACE) == 0;
860877
}
861878

862879
bool pci_disable_memspace(pci_dev_t device) {
863-
uint32_t cmd = pci_read(device, PCI_COMMAND);
864-
if ((cmd & PCI_COMMAND_MEMSPACE) != 0) {
865-
cmd &= ~PCI_COMMAND_MEMSPACE;
866-
pci_write(device, PCI_COMMAND, cmd);
867-
cmd = pci_read(device, PCI_COMMAND);
868-
}
869-
return (cmd & PCI_COMMAND_MEMSPACE) == 0;
880+
uint32_t cmd = pci_read(device, PCI_COMMAND);
881+
if ((cmd & PCI_COMMAND_MEMSPACE) != 0) {
882+
cmd &= ~PCI_COMMAND_MEMSPACE;
883+
pci_write(device, PCI_COMMAND, cmd);
884+
cmd = pci_read(device, PCI_COMMAND);
885+
}
886+
return (cmd & PCI_COMMAND_MEMSPACE) == 0;
870887
}
871888

0 commit comments

Comments
 (0)