/*
 * pcie_sriov.h:
 *
 * Implementation of SR/IOV emulation support.
 *
 * Copyright (c) 2015 Knut Omang <knut.omang@oracle.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 *
 */

#ifndef QEMU_PCIE_SRIOV_H
#define QEMU_PCIE_SRIOV_H

#include "hw/pci/pci.h"

typedef struct PCIESriovPF {
    uint16_t num_vfs;   /* Number of virtual functions created */
    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
    const char *vfname; /* Reference to the device type used for the VFs */
    PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
} PCIESriovPF;

typedef struct PCIESriovVF {
    PCIDevice *pf;      /* Pointer back to owner physical function */
    uint16_t vf_number; /* Logical VF number of this function */
} PCIESriovVF;

void pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset,
                        const char *vfname, uint16_t vf_dev_id,
                        uint16_t init_vfs, uint16_t total_vfs,
                        uint16_t vf_offset, uint16_t vf_stride);
void pcie_sriov_pf_exit(PCIDevice *dev);

/* Set up a VF bar in the SR/IOV bar area */
void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
                               uint8_t type, dma_addr_t size);

/* Instantiate a bar for a VF */
void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num,
                                MemoryRegion *memory);

/*
 * Default (minimal) page size support values
 * as required by the SR/IOV standard:
 * 0x553 << 12 = 0x553000 = 4K + 8K + 64K + 256K + 1M + 4M
 */
#define SRIOV_SUP_PGSIZE_MINREQ 0x553

/*
 * Optionally add supported page sizes to the mask of supported page sizes
 * Page size values are interpreted as opt_sup_pgsize << 12.
 */
void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize);

/* SR/IOV capability config write handler */
void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
                             uint32_t val, int len);

/* Reset SR/IOV */
void pcie_sriov_pf_reset(PCIDevice *dev);

/* Get logical VF number of a VF - only valid for VFs */
uint16_t pcie_sriov_vf_number(PCIDevice *dev);

/*
 * Get the physical function that owns this VF.
 * Returns NULL if dev is not a virtual function
 */
PCIDevice *pcie_sriov_get_pf(PCIDevice *dev);

/*
 * Get the n-th VF of this physical function - only valid for PF.
 * Returns NULL if index is invalid
 */
PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n);

/* Returns the current number of virtual functions. */
uint16_t pcie_sriov_num_vfs(PCIDevice *dev);

#endif /* QEMU_PCIE_SRIOV_H */
