|
@@ -10,9 +10,11 @@
|
|
|
*/
|
|
|
|
|
|
#include <common.h>
|
|
|
+#include <dm.h>
|
|
|
#include <errno.h>
|
|
|
#include <malloc.h>
|
|
|
#include <pci.h>
|
|
|
+#include <asm/io.h>
|
|
|
#include <asm/pci.h>
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
@@ -111,3 +113,41 @@ void x86_pci_write_config32(pci_dev_t dev, unsigned where, unsigned value)
|
|
|
{
|
|
|
pci_hose_write_config_dword(get_hose(), dev, where, value);
|
|
|
}
|
|
|
+
|
|
|
+int pci_x86_read_config(struct udevice *bus, pci_dev_t bdf, uint offset,
|
|
|
+ ulong *valuep, enum pci_size_t size)
|
|
|
+{
|
|
|
+ outl(bdf | (offset & 0xfc) | PCI_CFG_EN, PCI_REG_ADDR);
|
|
|
+ switch (size) {
|
|
|
+ case PCI_SIZE_8:
|
|
|
+ *valuep = inb(PCI_REG_DATA + (offset & 3));
|
|
|
+ break;
|
|
|
+ case PCI_SIZE_16:
|
|
|
+ *valuep = inw(PCI_REG_DATA + (offset & 2));
|
|
|
+ break;
|
|
|
+ case PCI_SIZE_32:
|
|
|
+ *valuep = inl(PCI_REG_DATA);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int pci_x86_write_config(struct udevice *bus, pci_dev_t bdf, uint offset,
|
|
|
+ ulong value, enum pci_size_t size)
|
|
|
+{
|
|
|
+ outl(bdf | (offset & 0xfc) | PCI_CFG_EN, PCI_REG_ADDR);
|
|
|
+ switch (size) {
|
|
|
+ case PCI_SIZE_8:
|
|
|
+ outb(value, PCI_REG_DATA + (offset & 3));
|
|
|
+ break;
|
|
|
+ case PCI_SIZE_16:
|
|
|
+ outw(value, PCI_REG_DATA + (offset & 2));
|
|
|
+ break;
|
|
|
+ case PCI_SIZE_32:
|
|
|
+ outl(value, PCI_REG_DATA);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|