blob: 68e4b0a73c7b7f1095b2e8f754e090834054b198 [file] [log] [blame]
/*
* 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);