X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fpci.h;h=a2a5a4c71f23cf25fa03928511a2cefec6298320;hb=refs%2Fheads%2Fcoreboot;hp=a214bb1170190d86752a29fe847887790ad5e7a9;hpb=862d5fb01190464711e3a91244a0309a398b0f59;p=seabios.git diff --git a/src/pci.h b/src/pci.h index a214bb1..a2a5a4c 100644 --- a/src/pci.h +++ b/src/pci.h @@ -3,6 +3,9 @@ #include "types.h" // u32 +#define PCI_ROM_SLOT 6 +#define PCI_NUM_REGIONS 7 + static inline u8 pci_bdf_to_bus(u16 bdf) { return bdf >> 8; } @@ -33,8 +36,8 @@ u16 pci_config_readw(u16 bdf, u32 addr); u8 pci_config_readb(u16 bdf, u32 addr); void pci_config_maskw(u16 bdf, u32 addr, u16 off, u16 on); -int pci_find_device(u16 vendid, u16 devid); -int pci_find_class(u16 classid); +struct pci_device *pci_find_device(u16 vendid, u16 devid); +struct pci_device *pci_find_class(u16 classid); struct pci_device { u16 bdf; @@ -48,31 +51,31 @@ struct pci_device { u8 prog_if, revision; u8 header_type; u8 secondary_bus; + struct { + u32 addr; + u32 size; + int is64; + } bars[PCI_NUM_REGIONS]; + + // Local information on device. + int have_driver; }; extern struct pci_device *PCIDevices; extern int MaxPCIBus; -void pci_probe(void); +int pci_probe_host(void); +void pci_probe_devices(void); +static inline u32 pci_classprog(struct pci_device *pci) { + return (pci->class << 8) | pci->prog_if; +} #define foreachpci(PCI) \ for (PCI=PCIDevices; PCI; PCI=PCI->next) -#define PP_ROOT (1<<17) -#define PP_PCIBRIDGE (1<<18) -extern int *PCIpaths; -void pci_path_setup(void); - -int pci_next(int bdf, int *pmax); -#define foreachbdf(BDF, MAX) \ - for (MAX=0x0100, BDF=pci_next(0, &MAX) \ - ; BDF >= 0 \ - ; BDF=pci_next(BDF+1, &MAX)) - -#define foreachbdf_in_bus(BDF, MAX, BUS) \ - for (MAX = pci_bus_devfn_to_bdf(BUS, 0) + 0x0100, \ - BDF = pci_next(pci_bus_devfn_to_bdf(BUS, 0), &MAX) \ - ; BDF >= 0 && BDF < pci_bus_devfn_to_bdf(BUS, 0) + 0x0100 \ - ; MAX = pci_bus_devfn_to_bdf(BUS, 0) + 0x0100, \ - BDF = pci_next(BDF + 1, &MAX)) +int pci_next(int bdf, int bus); +#define foreachbdf(BDF, BUS) \ + for (BDF=pci_next(pci_bus_devfn_to_bdf((BUS), 0)-1, (BUS)) \ + ; BDF >= 0 \ + ; BDF=pci_next(BDF, (BUS))) #define PCI_ANY_ID (~0) struct pci_device_id { @@ -80,7 +83,7 @@ struct pci_device_id { u32 devid; u32 class; u32 class_mask; - void (*func)(u16 bdf, void *arg); + void (*func)(struct pci_device *pci, void *arg); }; #define PCI_DEVICE(vendor_id, device_id, init_func) \ @@ -106,8 +109,10 @@ struct pci_device_id { .vendid = 0, \ } -int pci_init_device(const struct pci_device_id *table, u16 bdf, void *arg); -int pci_find_init_device(const struct pci_device_id *ids, void *arg); +int pci_init_device(const struct pci_device_id *ids + , struct pci_device *pci, void *arg); +struct pci_device *pci_find_init_device(const struct pci_device_id *ids + , void *arg); void pci_reboot(void); // helper functions to access pci mmio bars from real mode