diff options
author | Li-Ta Lo <ollie@lanl.gov> | 2004-07-08 17:18:27 +0000 |
---|---|---|
committer | Li-Ta Lo <ollie@lanl.gov> | 2004-07-08 17:18:27 +0000 |
commit | 815212652994a43d3e05dc864343b722b70a129d (patch) | |
tree | c4f0d5c97b4c175f40889e126b816a5d7036151d /util/vgabios/pci-userspace.c | |
parent | 4c5060dc2bf8f944c54361f7913d20d02fff65a0 (diff) |
added testbios for V2
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1624 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/vgabios/pci-userspace.c')
-rw-r--r-- | util/vgabios/pci-userspace.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/util/vgabios/pci-userspace.c b/util/vgabios/pci-userspace.c new file mode 100644 index 0000000000..aea3f6983d --- /dev/null +++ b/util/vgabios/pci-userspace.c @@ -0,0 +1,130 @@ +#include <stdio.h> +#include <pci/pci.h> +#include "pci.h" + +#define PCITAG struct pci_filter * + +#define DEBUG_PCI 1 + +struct pci_access *pacc; +struct pci_dev *dev; + +struct pci_filter ltag; + + +int pciNumBuses = 0; + +int pciInit(void) +{ + pacc = pci_alloc(); + + pci_init(pacc); + pci_scan_bus(pacc); + for (dev = pacc->devices; dev; dev = dev->next) { + pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES); + } + return 0; +} + +int pciExit(void) +{ + pci_cleanup(pacc); + return 0; +} + +PCITAG findPci(unsigned short bx) +{ + PCITAG tag = <ag; + + int bus = (bx >> 8) & 0xFF; + int slot = (bx >> 3) & 0x1F; + int func = bx & 0x7; + + tag->bus = bus; + tag->slot = slot; + tag->func = func; + + if (pci_get_dev(pacc, bus, slot, func)) + return tag; + + return NULL; +} + +u32 pciSlotBX(PCITAG tag) +{ + return (tag->bus << 8) | (tag->slot << 3) | (tag->func); +} + +u8 pciReadByte(PCITAG tag, u32 idx) +{ + struct pci_dev *d; + if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func))) + return pci_read_byte(d, idx); +#ifdef DEBUG_PCI + printf("PCI: device not found while read byte (%x:%x.%x)\n", + tag->bus, tag->slot, tag->func); +#endif + return 0; +} + +u16 pciReadWord(PCITAG tag, u32 idx) +{ + struct pci_dev *d; + if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func))) + return pci_read_word(d, idx); +#ifdef DEBUG_PCI + printf("PCI: device not found while read word (%x:%x.%x)\n", + tag->bus, tag->slot, tag->func); +#endif + return 0; +} + +u32 pciReadLong(PCITAG tag, u32 idx) +{ + struct pci_dev *d; + if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func))) + return pci_read_long(d, idx); +#ifdef DEBUG_PCI + printf("PCI: device not found while read long (%x:%x.%x)\n", + tag->bus, tag->slot, tag->func); +#endif + return 0; +} + + +void pciWriteLong(PCITAG tag, u32 idx, u32 data) +{ + struct pci_dev *d; + if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func))) + pci_write_long(d, idx, data); +#ifdef DEBUG_PCI + else + printf("PCI: device not found while write long (%x:%x.%x)\n", + tag->bus, tag->slot, tag->func); +#endif +} + +void pciWriteWord(PCITAG tag, u32 idx, u16 data) +{ + struct pci_dev *d; + if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func))) + pci_write_word(d, idx, data); +#ifdef DEBUG_PCI + else + printf("PCI: device not found while write word (%x:%x.%x)\n", + tag->bus, tag->slot, tag->func); +#endif + +} + +void pciWriteByte(PCITAG tag, u32 idx, u8 data) +{ + struct pci_dev *d; + if ((d = pci_get_dev(pacc, tag->bus, tag->slot, tag->func))) + pci_write_long(d, idx, data); +#ifdef DEBUG_PCI + else + printf("PCI: device not found while write long (%x:%x.%x)\n", + tag->bus, tag->slot, tag->func); +#endif +} |