diff options
Diffstat (limited to 'src/arch/ppc/lib/pci_dev.c')
-rw-r--r-- | src/arch/ppc/lib/pci_dev.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/arch/ppc/lib/pci_dev.c b/src/arch/ppc/lib/pci_dev.c new file mode 100644 index 0000000000..adb047e3fe --- /dev/null +++ b/src/arch/ppc/lib/pci_dev.c @@ -0,0 +1,54 @@ +#include <arch/io.h> +#include <arch/pciconf.h> + +/* + * Direct access to PCI hardware... + */ + +uint8_t pci_ppc_read_config8(unsigned char bus, int devfn, int where) +{ + uint8_t res; + + out_le32((unsigned *)PCIC0_CFGADDR, CONFIG_CMD(bus, devfn, where)); + res = in_8((unsigned char *)PCIC0_CFGDATA + (where & 3)); + return res; +} + +uint16_t pci_ppc_read_config16(unsigned char bus, int devfn, int where) +{ + uint16_t res; + + out_le32((unsigned *)PCIC0_CFGADDR, CONFIG_CMD(bus, devfn, where)); + res = in_le16((unsigned short *)PCIC0_CFGDATA + (where & 2)); + return res; +} + +uint32_t pci_ppc_read_config32(unsigned char bus, int devfn, int where) +{ + uint32_t res; + + out_le32((unsigned *)PCIC0_CFGADDR, CONFIG_CMD(bus, devfn, where)); + res = in_le32((unsigned *)PCIC0_CFGDATA); + return res; +} + +int pci_ppc_write_config8(unsigned char bus, int devfn, int where, uint8_t data) +{ + out_le32((unsigned *)PCIC0_CFGADDR, CONFIG_CMD(bus, devfn, where)); + out_8((unsigned char *)PCIC0_CFGDATA + (where & 3), data); + return 0; +} + +int pci_ppc_write_config16(unsigned char bus, int devfn, int where, uint16_t data) +{ + out_le32((unsigned *)PCIC0_CFGADDR, CONFIG_CMD(bus, devfn, where)); + out_le16((unsigned short *)PCIC0_CFGDATA + (where & 2), data); + return 0; +} + +int pci_ppc_write_config32(unsigned char bus, int devfn, int where, uint32_t data) +{ + out_le32((unsigned *)PCIC0_CFGADDR, CONFIG_CMD(bus, devfn, where)); + out_le32((unsigned *)PCIC0_CFGDATA, data); + return 0; +} |