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