Orion
Barry Importing existing Orion kernel d41a53c (3 years, 3 months ago)
diff --git a/drivers/pci.c b/drivers/pci.c
new file mode 100644
index 0000000..22db76e
--- /dev/null
+++ b/drivers/pci.c
@@ -0,0 +1,55 @@
+/*
+ * This file contains the routines for accessing the PCI devices. It just wraps
+ * the IO functions necessary to read/write the PCI Configuration Space. It
+ * uses PCI Configuration Space Access Mechanism #1, which is the most supported
+ * access mechanism.
+ */
+
+#include <stdint.h>
+#include "pci.h"
+#include "../io.h"
+
+/* Read PCI config */
+uint8_t
+pci_read_byte(int bus, int dev, int func, int off)
+{
+ outl(0xCF8, (1 << 31) | (bus << 16) | (dev << 11) |
+ (func << 8) | (off & 0xFC));
+ return inb(0xCFC + (off & 3));
+}
+uint16_t
+pci_read_word(int bus, int dev, int func, int off)
+{
+ outl(0xCF8, (1 << 31) | (bus << 16) | (dev << 11) |
+ (func << 8) | (off & 0xFC));
+ return inw(0xCFC + (off & 2));
+}
+uint32_t
+pci_read_dword(int bus, int dev, int func, int off)
+{
+ outl(0xCF8, (1 << 31) | (bus << 16) | (dev << 11) |
+ (func << 8) | (off & 0xFC));
+ return inl(0xCFC);
+}
+/* Write PCI config */
+void
+pci_write_byte(int bus, int dev, int func, int off, uint8_t value)
+{
+ outl(0xCF8, (1 << 31) | (bus << 16) | (dev << 11) |
+ (func << 8) | (off & 0xFC));
+ outb(0xCFC + (off & 3), value);
+}
+void
+pci_write_word(int bus, int dev, int func, int off, uint16_t value)
+{
+ outl(0xCF8, (1 << 31) | (bus << 16) | (dev << 11) |
+ (func << 8) | (off & 0xFC));
+ outw(0xCFC + (off & 2), value);
+}
+void
+pci_write_dword(int bus, int dev, int func, int off, uint32_t value)
+{
+ outl(0xCF8, (1 << 31) | (bus << 16) | (dev << 11) |
+ (func << 8) | (off & 0xFC));
+ outl(0xCFC, value);
+}