1/*
2 * Copyright 2017, Data61
3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
4 * ABN 41 687 119 230.
5 *
6 * This software may be distributed and modified according to the terms of
7 * the BSD 2-Clause license. Note that NO WARRANTY is provided.
8 * See "LICENSE_BSD2.txt" for details.
9 *
10 * @TAG(DATA61_BSD)
11 */
12#pragma once
13
14#include <stdint.h>
15#include <stdbool.h>
16#include <pci/pci.h>
17#include <pci/virtual_device.h>
18
19#define PCI_HOST_BUS_INVALID 0xFFFF
20#define PCI_INVALID_READ_VALUE 0xFFFFFFFF
21#define PCI_MAX_VDEVICES 64
22
23/* A virtual device slot */
24typedef struct libpci_virtual_device {
25    uint16_t host_bus;
26    uint8_t host_dev;
27    uint8_t host_fun;
28} libpci_passthrough_vdevice_t;
29
30struct libpci_virtual_pci;
31typedef struct libpci_virtual_pci libpci_virtual_pci_t;
32
33/* A virtual PCI space. */
34struct libpci_virtual_pci {
35    libpci_passthrough_vdevice_t allowed_devices[PCI_MAX_VDEVICES];
36    uint32_t num_allowed_devices;
37    bool override_allow_all_devices;
38
39    libpci_vdevice_t virtual_devices[PCI_MAX_VDEVICES];
40    uint32_t num_virtual_devices;
41    uint32_t current_addr;
42
43    bool (*device_allow) (libpci_virtual_pci_t* self, libpci_device_t *device);
44    bool (*device_allow_id) (libpci_virtual_pci_t* self, uint16_t vendor_id, uint16_t device_id);
45    bool (*device_disallow) (libpci_virtual_pci_t* self, const libpci_device_t *device);
46    bool (*device_check) (libpci_virtual_pci_t* self, uint8_t bus, uint8_t dev, uint8_t fun);
47
48    libpci_vdevice_t* (*vdevice_assign) (libpci_virtual_pci_t* self);
49    void (*vdevice_resign) (libpci_virtual_pci_t* self, libpci_vdevice_t* vdev);
50    libpci_vdevice_t* (*vdevice_check) (libpci_virtual_pci_t* self,
51            uint8_t bus, uint8_t dev, uint8_t fun);
52
53    int (*ioread) (libpci_virtual_pci_t* self, uint32_t port_no, uint32_t* val, uint32_t size);
54    int (*iowrite) (libpci_virtual_pci_t* self, uint32_t port_no, uint32_t val, uint32_t size);
55};
56
57void libpci_virtual_pci_init(libpci_virtual_pci_t* vp);
58