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