Rework PCI ata and serial drivers, program according to the progif byte
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
#include <stddef.h>
|
||||
#include "pci/pci.h"
|
||||
#include "pci/ata/ata.h"
|
||||
#include "pci/qemu_pci_serial/qemu_pci_serial.h"
|
||||
#include "pci/serial/serial.h"
|
||||
#include "io/io.h"
|
||||
#include "std/string.h"
|
||||
#include "util/util.h"
|
||||
@@ -55,6 +55,37 @@ void pci_write8(PciDev dev, uint32_t field, uint8_t v) {
|
||||
io_out8(PCI_CFG_DATA, v);
|
||||
}
|
||||
|
||||
void pci_readbar(PciDev dev, uint32_t bar, uint32_t *addr, uint32_t *mask) {
|
||||
*addr = pci_read32(dev, bar);
|
||||
pci_write32(dev, bar, 0xffffffff);
|
||||
*mask = pci_read32(dev, bar);
|
||||
pci_write32(dev, bar, *addr);
|
||||
}
|
||||
|
||||
void pci_getbar(PciDev dev, PciBar *bar, uint32_t barid) {
|
||||
uint32_t addrlo;
|
||||
uint32_t masklo;
|
||||
pci_readbar(dev, barid, &addrlo, &masklo);
|
||||
|
||||
if (addrlo & PCI_BAR_IO) {
|
||||
bar->x.io.iobase = (uint16_t)(addrlo & ~0x3);
|
||||
bar->size = (uint16_t)(~(masklo & ~0x3) + 1);
|
||||
bar->flags = (addrlo & 0x3);
|
||||
} else if (addrlo & PCI_BAR_MEM32) {
|
||||
bar->x.mem.addr = (uint64_t)(addrlo & ~0xF);
|
||||
bar->size = ~(masklo & ~0xF) + 1;
|
||||
bar->flags = (addrlo & 0xF);
|
||||
} else if (addrlo & PCI_BAR_MEM64) {
|
||||
uint32_t addrhi;
|
||||
uint32_t maskhi;
|
||||
pci_readbar(dev, barid+4, &addrhi, &maskhi);
|
||||
|
||||
bar->x.mem.addr = (uint64_t)(((uint64_t)addrhi << 32) | (addrlo & ~0xF));
|
||||
bar->size = ~(((uint64_t)maskhi << 32) | (masklo & ~0xF)) + 1;
|
||||
bar->flags = (addrlo & 0xF);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t pci_devtype(PciDev dev) {
|
||||
uint32_t a = pci_read8(dev, PCI_CLASS) << 8;
|
||||
uint32_t b = pci_read8(dev, PCI_SUBCLASS);
|
||||
@@ -162,7 +193,7 @@ PciDev pci_getdev(uint16_t vendorid, uint16_t deviceid, int devtype) {
|
||||
|
||||
PciInitFn PCI_INIT_ARRAY[PCI_INIT_ARRAY_MAX] = {
|
||||
&pci_ata_init,
|
||||
&pci_qemu_pci_serial_init,
|
||||
&pci_serial_init,
|
||||
};
|
||||
|
||||
void pci_init_devs(void) {
|
||||
|
||||
Reference in New Issue
Block a user