blob: 97207fa4c5738ba0a5122c5d74557a8c95033a50 [file] [log] [blame]
/*
* Copyright 2017, Data61
* Commonwealth Scientific and Industrial Research Organisation (CSIRO)
* ABN 41 687 119 230.
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(DATA61_BSD)
*/
#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);