1/** 2 * \file PCI bus 3 * 4 * Virtual PCI bus implementation. 5 */ 6 7/* 8 * Copyright (c) 2009, ETH Zurich. 9 * All rights reserved. 10 * 11 * This file is distributed under the terms in the attached LICENSE file. 12 * If you do not find this file, copies can be found by writing to: 13 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group. 14 */ 15 16#ifndef _PCI_H 17#define _PCI_H 18 19#include "lpc.h" 20 21union pci_config_address_word { 22 uint32_t raw; 23 struct { 24 uint32_t mbz : 2; 25 uint32_t doubleword : 6; 26 uint32_t fnct_nr : 3; 27 uint32_t dev_nr : 5; 28 uint32_t bus_nr : 8; 29 uint32_t res : 7; 30 uint32_t enable_conf_space_mapping : 1; 31 } __attribute__ ((packed)) d; 32} __attribute__ ((packed)) ; 33 34struct pci_device; 35 36typedef void (*pci_device_confspace_write)(struct pci_device *dev, 37 union pci_config_address_word addr, 38 enum opsize size, uint32_t val); 39 40typedef void (*pci_device_confspace_read)(struct pci_device *dev, 41 union pci_config_address_word addr, 42 enum opsize size, uint32_t *val); 43 44typedef void (*pci_device_mem_write)(struct pci_device *dev, 45 uint32_t addr, int bar, uint32_t val); 46 47typedef void (*pci_device_mem_read)(struct pci_device *dev, 48 uint32_t addr, 49 int bar, uint32_t *val); 50 51struct bar_info { 52 void *vaddr; // assigned by the device driver when calling map_device() 53 genpaddr_t paddr; // physical base address of device 54 size_t bytes; //size of the bar 55}; 56 57struct pci_device { 58 pci_device_confspace_write confspace_write; 59 pci_device_confspace_read confspace_read; 60 pci_device_mem_read mem_read; 61 pci_device_mem_write mem_write; 62 struct bar_info bars[6]; 63 uint8_t irq; 64 struct lpc *lpc; 65 void *state; 66}; 67 68struct pci_bus { 69 struct pci_device *device[32]; 70}; 71 72struct pci { 73 union pci_config_address_word address; 74 struct pci_bus *bus[256]; 75}; 76 77struct pci *pci_new(void); 78int pci_handle_pio_write(struct pci *pci, uint16_t port, enum opsize size, 79 uint32_t val); 80int pci_handle_pio_read(struct pci *pci, uint16_t port, enum opsize size, 81 uint32_t *val); 82 83int pci_attach_device(struct pci *pci, uint8_t busnr, uint8_t devnr, 84 struct pci_device *device); 85 86#endif 87