| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * |
| * SPDX-License-Identifier: BSD-2-Clause |
| */ |
| #pragma once |
| |
| #include <stdint.h> |
| #include <stdbool.h> |
| #include <pci/pci.h> |
| #include <pci/virtual_device.h> |
| |
| #define PCI_HOST_BUS_INVALID 0xFFFF |
| #define PCI_INVALID_READ_VALUE 0xFFFFFFFF |
| #define PCI_MAX_VDEVICES 64 |
| |
| /* A virtual device slot */ |
| typedef struct libpci_virtual_device { |
| uint16_t host_bus; |
| uint8_t host_dev; |
| uint8_t host_fun; |
| } libpci_passthrough_vdevice_t; |
| |
| struct libpci_virtual_pci; |
| typedef struct libpci_virtual_pci libpci_virtual_pci_t; |
| |
| /* A virtual PCI space. */ |
| struct libpci_virtual_pci { |
| libpci_passthrough_vdevice_t allowed_devices[PCI_MAX_VDEVICES]; |
| uint32_t num_allowed_devices; |
| bool override_allow_all_devices; |
| |
| libpci_vdevice_t virtual_devices[PCI_MAX_VDEVICES]; |
| uint32_t num_virtual_devices; |
| uint32_t current_addr; |
| |
| bool (*device_allow) (libpci_virtual_pci_t* self, libpci_device_t *device); |
| bool (*device_allow_id) (libpci_virtual_pci_t* self, uint16_t vendor_id, uint16_t device_id); |
| bool (*device_disallow) (libpci_virtual_pci_t* self, const libpci_device_t *device); |
| bool (*device_check) (libpci_virtual_pci_t* self, uint8_t bus, uint8_t dev, uint8_t fun); |
| |
| libpci_vdevice_t* (*vdevice_assign) (libpci_virtual_pci_t* self); |
| void (*vdevice_resign) (libpci_virtual_pci_t* self, libpci_vdevice_t* vdev); |
| libpci_vdevice_t* (*vdevice_check) (libpci_virtual_pci_t* self, |
| uint8_t bus, uint8_t dev, uint8_t fun); |
| |
| int (*ioread) (libpci_virtual_pci_t* self, uint32_t port_no, uint32_t* val, uint32_t size); |
| int (*iowrite) (libpci_virtual_pci_t* self, uint32_t port_no, uint32_t val, uint32_t size); |
| }; |
| |
| void libpci_virtual_pci_init(libpci_virtual_pci_t* vp); |