igb can use this function to change its behavior depending on the number of virtual functions currently enabled. Signed-off-by: Gal Hammer <gal.hammer@sap.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Jason Wang <jasowang@redhat.com>
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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"
 | 
						|
 | 
						|
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 */
 | 
						|
};
 | 
						|
 | 
						|
struct PCIESriovVF {
 | 
						|
    PCIDevice *pf;      /* Pointer back to owner physical function */
 | 
						|
    uint16_t vf_number; /* Logical VF number of this function */
 | 
						|
};
 | 
						|
 | 
						|
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 VF Enable bit to unregister all VFs */
 | 
						|
void pcie_sriov_pf_disable_vfs(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 */
 |