summaryrefslogtreecommitdiff
path: root/tools/pkg/1/liborange/include/pci.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/pkg/1/liborange/include/pci.h')
-rw-r--r--tools/pkg/1/liborange/include/pci.h185
1 files changed, 0 insertions, 185 deletions
diff --git a/tools/pkg/1/liborange/include/pci.h b/tools/pkg/1/liborange/include/pci.h
deleted file mode 100644
index 305c9fe..0000000
--- a/tools/pkg/1/liborange/include/pci.h
+++ /dev/null
@@ -1,185 +0,0 @@
-#include <stdint.h>
-#include <orange/io.h>
-
-#include <stdio.h>
-
-#ifndef LIBORANGE_PCI_H
-#define LIBORANGE_PCI_H
-
-typedef struct {
- uint16_t vendorID;
- uint16_t deviceID;
- uint16_t command;
- uint16_t status;
- uint8_t revisionID;
- uint8_t progIF;
- uint8_t subclass;
- uint8_t _class;
- uint8_t cacheLineSize;
- uint8_t latencyTimer;
- uint8_t headerType;
- uint8_t bist;
- uint32_t bar0;
- uint32_t bar1;
- uint32_t bar2;
- uint32_t bar3;
- uint32_t bar4;
- uint32_t bar5;
- uint32_t cardbusCISPointer;
- uint16_t subsystemVendorID;
- uint16_t subsystemID;
- uint32_t expansionROMBaseAddress;
- uint8_t capabilitiesPointer;
- uint8_t reserved0;
- uint16_t reserved1;
- uint32_t reserved2;
- uint8_t irq;
- uint8_t interruptPIN;
- uint8_t minGrant;
- uint8_t maxLatency;
-} __attribute__((packed)) pci_t;
-
-typedef struct pci_cap {
- uint8_t id;
- uint8_t off;
- uint8_t bus;
- uint8_t num;
- uint8_t func;
- uint16_t venID;
- uint16_t devID;
- uint8_t data[32];
- struct pci_cap* next;
-} __attribute__((packed)) pci_cap_t;
-
-typedef struct {
- int used;
- uint8_t _class;
- uint8_t subclass;
- void (*pcidrv)(pci_t, uint8_t, uint8_t, uint8_t);
-} __attribute__((packed)) pci_driver_t;
-
-#define PCI_BAR_MASK ((1 << 0) | (1 << 1))
-
-uint32_t pci_read_config32(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset) {
- uint32_t address = (1 << 31) | (bus << 16) | (num << 11) | (function << 8) | (offset);
- outd(0xCF8, address);
- return ind(0xCFC);
-}
-
-uint16_t pci_read_config16(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset) {
- uint32_t address = (1 << 31) | (bus << 16) | (num << 11) | (function << 8) | (offset & 0xfc);
- outd(0xCF8, address);
- return(uint16_t)((ind(0xCFC) >> ((offset & 2) * 8)) & 0xffff);
-}
-
-uint8_t pci_read_config8(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset) {
- uint32_t address = (1 << 31) | (bus << 16) | (num << 11) | (function << 8) | (offset);
- outd(0xCF8, address);
- return (uint8_t)((ind(0xCFC) >> ((offset & 3) * 8)) & 0xff);
-}
-
-void pci_write_config32(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset, uint32_t value) {
- uint32_t address = (1 << 31) | (bus << 16) | (num << 11) | (function << 8) | (offset);
- outd(0xCF8, address);
- outd(0xCFC, value);
-}
-
-void pci_write_config16(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset, uint32_t value) {
- uint32_t address = (1 << 31) | (bus << 16) | (num << 11) | (function << 8) | (offset & 0xfc);
- outd(0xCF8, address);
- outd(0xCFC,(ind(0xCFC) & ~(0xffff << ((offset & 2) * 8))) | (value << ((offset & 2) * 8)));
-}
-
-void pci_write_config8(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset, uint8_t value) {
- uint32_t address = (1 << 31) | (bus << 16) | (num << 11) | (function << 8) | (offset & 0xfc);
- outd(0xCF8, address);
- outd(0xCFC, ((ind(0xCFC) & ~(0xFF << (offset & 3))) | (value << ((offset & 3) * 8))));
-}
-
-uint32_t pci_in(int8_t bus, uint8_t num, uint8_t function, uint8_t offset, uint8_t bytewidth) {
- uint32_t value = 0;
- switch(bytewidth) {
- case 1:
- value = pci_read_config8(bus,num,function,offset);
- break;
- case 2:
- value = pci_read_config16(bus,num,function,offset);
- break;
- case 4:
- value = pci_read_config32(bus,num,function,offset);
- break;
- default:
- break;
- }
-
- return value;
-
-}
-
-void pci_out(uint8_t bus, uint8_t num, uint8_t function, uint8_t offset, uint32_t value, uint8_t bytewidth) {
- switch(bytewidth) {
- case 1:
- pci_write_config8(bus,num,function,offset,(uint8_t)value);
- break;
- case 2:
- pci_write_config16(bus,num,function,offset,(uint16_t)value);
- break;
- case 4:
- pci_write_config32(bus,num,function,offset,(uint32_t)value);
- break;
- default:
- break;
- }
-}
-
-pci_t __pci_load(uint8_t bus, uint8_t num, uint8_t function) {
- pci_t pciData;
- uint16_t *p = (uint16_t *)&pciData;
- for (uint8_t i = 0; i < 32; i++) {
- p[i] = pci_read_config16(bus, num, function, i * 2);
- }
- return pciData;
-}
-
-void pci_reg(pci_driver_t* pci_drivers,void (*pcidrv)(pci_t, uint8_t, uint8_t, uint8_t), uint8_t _class, uint8_t subclass) {
- for (uint16_t i = 0; i < 256; i++) {
- if (!pci_drivers[i].used) {
- pci_drivers[i].used = true;
- pci_drivers[i]._class = _class;
- pci_drivers[i].subclass = subclass;
- pci_drivers[i].pcidrv = pcidrv;
- }
- }
-}
-
-void __pci_launch(pci_driver_t* pci_drivers,pci_t pci, uint8_t bus, uint8_t device, uint8_t function) {
- for (uint16_t i = 0; i < 256; i++) {
- if (pci_drivers[i].used && pci_drivers[i]._class == pci._class && pci_drivers[i].subclass == pci.subclass) {
- pci_drivers[i].pcidrv(pci, bus, device, function);
- return;
- }
- }
-}
-
-void pci_initworkspace(pci_driver_t* pci_drivers) {
- pci_t c_pci;
- for (uint16_t bus = 0; bus < 256; bus++) {
- c_pci = __pci_load(bus, 0, 0);
- if (c_pci.vendorID != 0xFFFF) {
- for (uint8_t device = 0; device < 32; device++) {
- c_pci = __pci_load(bus, device, 0);
- if (c_pci.vendorID != 0xFFFF) {
- __pci_launch(pci_drivers,c_pci, bus, device, 0);
- for (uint8_t function = 1; function < 8; function++) {
- pci_t pci = __pci_load(bus, device, function);
- if (pci.vendorID != 0xFFFF) {
- __pci_launch(pci_drivers,pci, bus, device, function);
- }
- }
- }
- }
- }
- }
-}
-
-#endif \ No newline at end of file