mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
VFIO update 2020-11-01
* Migration support (Kirti Wankhede) * s390 DMA limiting (Matthew Rosato) * zPCI hardware info (Matthew Rosato) * Lock guard (Amey Narkhede) * Print fixes (Zhengui li) * Warning/build fixes -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) iQIcBAABAgAGBQJfnxyyAAoJECObm247sIsi5lUP/AvsTnmg56sT0vPjFNGpsdpo K6VkClOpT92WEZmY4EjoA2yCJYQXwuokr2m2ZnbwAMq40Z4wfitjJYe8X9VsUJ4p l5fsLtxAbTA3rZH505HhTLHnexy8LloG8Nx101NPCges+oRZP5Wx95GfcuwnB3b/ 68SU4L0e22n38vTvYwdIX7ACCp2akkSfDp22v++V5XrnRdZi8NOySmRYdxjYE2SX V8UpqIi/qJzdVrP6DD8MJXWegJzL6EWOjw1yh3ntbBj9TYkiZlK4AjiWT95ccE8u xUbXFpyTTQUAY/wKnAl7K5KCi7dwyUDv3ZvKTE0ognI/IkYAIuwEOkUwqW8Ypt9o kJV8EQkLNTl63MKvHqtC/CN2Ru2VAacgs3h9b8EezJhuB29f5RMy54KzVXTL/nU/ NOMxG9hvDisUdkMN/b8nVv0T6mSYPoZnILPoMp7HiPW28kG637DUV7PlN4NoM1zi yT8YAFOoUyLoZc4vE67zvTLcVlX6iVgnhRqvWkH+fzoxdaCaQRrrrioolWq0AvAW Lsb8JJSSEbVXQiafuraDgXxyeR/OZ58o8DPq2+eOeNnBCviAcbF40wDkEYGPpJma bXNqPPx5L/hrnH0e80jAxhoBnF3VRkDEyvAYKo9IGEkZLz2baUG0hov6F+Sw47oN TuIsstsLwbRuKlRmznSF =5Xrr -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/awilliam/tags/vfio-update-20201101.0' into staging VFIO update 2020-11-01 * Migration support (Kirti Wankhede) * s390 DMA limiting (Matthew Rosato) * zPCI hardware info (Matthew Rosato) * Lock guard (Amey Narkhede) * Print fixes (Zhengui li) * Warning/build fixes # gpg: Signature made Sun 01 Nov 2020 20:38:10 GMT # gpg: using RSA key 239B9B6E3BB08B22 # gpg: Good signature from "Alex Williamson <alex.williamson@redhat.com>" [full] # gpg: aka "Alex Williamson <alex@shazbot.org>" [full] # gpg: aka "Alex Williamson <alwillia@redhat.com>" [full] # gpg: aka "Alex Williamson <alex.l.williamson@gmail.com>" [full] # Primary key fingerprint: 42F6 C04E 540B D1A9 9E7B 8A90 239B 9B6E 3BB0 8B22 * remotes/awilliam/tags/vfio-update-20201101.0: (32 commits) vfio: fix incorrect print type hw/vfio: Use lock guard macros s390x/pci: get zPCI function info from host vfio: Add routine for finding VFIO_DEVICE_GET_INFO capabilities s390x/pci: use a PCI Function structure s390x/pci: clean up s390 PCI groups s390x/pci: use a PCI Group structure s390x/pci: create a header dedicated to PCI CLP s390x/pci: Honor DMA limits set by vfio s390x/pci: Add routine to get the vfio dma available count vfio: Find DMA available capability vfio: Create shared routine for scanning info capabilities s390x/pci: Move header files to include/hw/s390x linux-headers: update against 5.10-rc1 update-linux-headers: Add vfio_zdev.h qapi: Add VFIO devices migration stats in Migration stats vfio: Make vfio-pci device migration capable vfio: Add ioctl to get dirty pages bitmap during dma unmap vfio: Dirty page tracking when vIOMMU is enabled vfio: Add vfio_listener_log_sync to mark dirty pages ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
2c6605389c
52 changed files with 2482 additions and 218 deletions
394
include/hw/s390x/s390-pci-bus.h
Normal file
394
include/hw/s390x/s390-pci-bus.h
Normal file
|
@ -0,0 +1,394 @@
|
|||
/*
|
||||
* s390 PCI BUS definitions
|
||||
*
|
||||
* Copyright 2014 IBM Corp.
|
||||
* Author(s): Frank Blaschka <frank.blaschka@de.ibm.com>
|
||||
* Hong Bo Li <lihbbj@cn.ibm.com>
|
||||
* Yi Min Zhao <zyimin@cn.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||
* your option) any later version. See the COPYING file in the top-level
|
||||
* directory.
|
||||
*/
|
||||
|
||||
#ifndef HW_S390_PCI_BUS_H
|
||||
#define HW_S390_PCI_BUS_H
|
||||
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pci_host.h"
|
||||
#include "hw/s390x/sclp.h"
|
||||
#include "hw/s390x/s390_flic.h"
|
||||
#include "hw/s390x/css.h"
|
||||
#include "hw/s390x/s390-pci-clp.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define TYPE_S390_PCI_HOST_BRIDGE "s390-pcihost"
|
||||
#define TYPE_S390_PCI_BUS "s390-pcibus"
|
||||
#define TYPE_S390_PCI_DEVICE "zpci"
|
||||
#define TYPE_S390_PCI_IOMMU "s390-pci-iommu"
|
||||
#define TYPE_S390_IOMMU_MEMORY_REGION "s390-iommu-memory-region"
|
||||
#define FH_MASK_ENABLE 0x80000000
|
||||
#define FH_MASK_INSTANCE 0x7f000000
|
||||
#define FH_MASK_SHM 0x00ff0000
|
||||
#define FH_MASK_INDEX 0x0000ffff
|
||||
#define FH_SHM_VFIO 0x00010000
|
||||
#define FH_SHM_EMUL 0x00020000
|
||||
#define ZPCI_MAX_FID 0xffffffff
|
||||
#define ZPCI_MAX_UID 0xffff
|
||||
#define UID_UNDEFINED 0
|
||||
#define UID_CHECKING_ENABLED 0x01
|
||||
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390pciState, S390_PCI_HOST_BRIDGE)
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390PCIBus, S390_PCI_BUS)
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390PCIBusDevice, S390_PCI_DEVICE)
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(S390PCIIOMMU, S390_PCI_IOMMU)
|
||||
|
||||
#define HP_EVENT_TO_CONFIGURED 0x0301
|
||||
#define HP_EVENT_RESERVED_TO_STANDBY 0x0302
|
||||
#define HP_EVENT_DECONFIGURE_REQUEST 0x0303
|
||||
#define HP_EVENT_CONFIGURED_TO_STBRES 0x0304
|
||||
#define HP_EVENT_STANDBY_TO_RESERVED 0x0308
|
||||
|
||||
#define ERR_EVENT_INVALAS 0x1
|
||||
#define ERR_EVENT_OORANGE 0x2
|
||||
#define ERR_EVENT_INVALTF 0x3
|
||||
#define ERR_EVENT_TPROTE 0x4
|
||||
#define ERR_EVENT_APROTE 0x5
|
||||
#define ERR_EVENT_KEYE 0x6
|
||||
#define ERR_EVENT_INVALTE 0x7
|
||||
#define ERR_EVENT_INVALTL 0x8
|
||||
#define ERR_EVENT_TT 0x9
|
||||
#define ERR_EVENT_INVALMS 0xa
|
||||
#define ERR_EVENT_SERR 0xb
|
||||
#define ERR_EVENT_NOMSI 0x10
|
||||
#define ERR_EVENT_INVALBV 0x11
|
||||
#define ERR_EVENT_AIBV 0x12
|
||||
#define ERR_EVENT_AIRERR 0x13
|
||||
#define ERR_EVENT_FMBA 0x2a
|
||||
#define ERR_EVENT_FMBUP 0x2b
|
||||
#define ERR_EVENT_FMBPRO 0x2c
|
||||
#define ERR_EVENT_CCONF 0x30
|
||||
#define ERR_EVENT_SERVAC 0x3a
|
||||
#define ERR_EVENT_PERMERR 0x3b
|
||||
|
||||
#define ERR_EVENT_Q_BIT 0x2
|
||||
#define ERR_EVENT_MVN_OFFSET 16
|
||||
|
||||
#define ZPCI_MSI_VEC_BITS 11
|
||||
#define ZPCI_MSI_VEC_MASK 0x7ff
|
||||
|
||||
#define ZPCI_MSI_ADDR 0xfe00000000000000ULL
|
||||
#define ZPCI_SDMA_ADDR 0x100000000ULL
|
||||
#define ZPCI_EDMA_ADDR 0x1ffffffffffffffULL
|
||||
|
||||
#define PAGE_SHIFT 12
|
||||
#define PAGE_SIZE (1 << PAGE_SHIFT)
|
||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||
#define PAGE_DEFAULT_ACC 0
|
||||
#define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4)
|
||||
|
||||
/* I/O Translation Anchor (IOTA) */
|
||||
enum ZpciIoatDtype {
|
||||
ZPCI_IOTA_STO = 0,
|
||||
ZPCI_IOTA_RTTO = 1,
|
||||
ZPCI_IOTA_RSTO = 2,
|
||||
ZPCI_IOTA_RFTO = 3,
|
||||
ZPCI_IOTA_PFAA = 4,
|
||||
ZPCI_IOTA_IOPFAA = 5,
|
||||
ZPCI_IOTA_IOPTO = 7
|
||||
};
|
||||
|
||||
#define ZPCI_IOTA_IOT_ENABLED 0x800ULL
|
||||
#define ZPCI_IOTA_DT_ST (ZPCI_IOTA_STO << 2)
|
||||
#define ZPCI_IOTA_DT_RT (ZPCI_IOTA_RTTO << 2)
|
||||
#define ZPCI_IOTA_DT_RS (ZPCI_IOTA_RSTO << 2)
|
||||
#define ZPCI_IOTA_DT_RF (ZPCI_IOTA_RFTO << 2)
|
||||
#define ZPCI_IOTA_DT_PF (ZPCI_IOTA_PFAA << 2)
|
||||
#define ZPCI_IOTA_FS_4K 0
|
||||
#define ZPCI_IOTA_FS_1M 1
|
||||
#define ZPCI_IOTA_FS_2G 2
|
||||
#define ZPCI_KEY (PAGE_DEFAULT_KEY << 5)
|
||||
|
||||
#define ZPCI_IOTA_STO_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_ST)
|
||||
#define ZPCI_IOTA_RTTO_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RT)
|
||||
#define ZPCI_IOTA_RSTO_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RS)
|
||||
#define ZPCI_IOTA_RFTO_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY | ZPCI_IOTA_DT_RF)
|
||||
#define ZPCI_IOTA_RFAA_FLAG (ZPCI_IOTA_IOT_ENABLED | ZPCI_KEY |\
|
||||
ZPCI_IOTA_DT_PF | ZPCI_IOTA_FS_2G)
|
||||
|
||||
/* I/O Region and segment tables */
|
||||
#define ZPCI_INDEX_MASK 0x7ffULL
|
||||
|
||||
#define ZPCI_TABLE_TYPE_MASK 0xc
|
||||
#define ZPCI_TABLE_TYPE_RFX 0xc
|
||||
#define ZPCI_TABLE_TYPE_RSX 0x8
|
||||
#define ZPCI_TABLE_TYPE_RTX 0x4
|
||||
#define ZPCI_TABLE_TYPE_SX 0x0
|
||||
|
||||
#define ZPCI_TABLE_LEN_RFX 0x3
|
||||
#define ZPCI_TABLE_LEN_RSX 0x3
|
||||
#define ZPCI_TABLE_LEN_RTX 0x3
|
||||
|
||||
#define ZPCI_TABLE_OFFSET_MASK 0xc0
|
||||
#define ZPCI_TABLE_SIZE 0x4000
|
||||
#define ZPCI_TABLE_ALIGN ZPCI_TABLE_SIZE
|
||||
#define ZPCI_TABLE_ENTRY_SIZE (sizeof(unsigned long))
|
||||
#define ZPCI_TABLE_ENTRIES (ZPCI_TABLE_SIZE / ZPCI_TABLE_ENTRY_SIZE)
|
||||
|
||||
#define ZPCI_TABLE_BITS 11
|
||||
#define ZPCI_PT_BITS 8
|
||||
#define ZPCI_ST_SHIFT (ZPCI_PT_BITS + PAGE_SHIFT)
|
||||
#define ZPCI_RT_SHIFT (ZPCI_ST_SHIFT + ZPCI_TABLE_BITS)
|
||||
|
||||
#define ZPCI_RTE_FLAG_MASK 0x3fffULL
|
||||
#define ZPCI_RTE_ADDR_MASK (~ZPCI_RTE_FLAG_MASK)
|
||||
#define ZPCI_STE_FLAG_MASK 0x7ffULL
|
||||
#define ZPCI_STE_ADDR_MASK (~ZPCI_STE_FLAG_MASK)
|
||||
|
||||
#define ZPCI_SFAA_MASK (~((1ULL << 20) - 1))
|
||||
|
||||
/* I/O Page tables */
|
||||
#define ZPCI_PTE_VALID_MASK 0x400
|
||||
#define ZPCI_PTE_INVALID 0x400
|
||||
#define ZPCI_PTE_VALID 0x000
|
||||
#define ZPCI_PT_SIZE 0x800
|
||||
#define ZPCI_PT_ALIGN ZPCI_PT_SIZE
|
||||
#define ZPCI_PT_ENTRIES (ZPCI_PT_SIZE / ZPCI_TABLE_ENTRY_SIZE)
|
||||
#define ZPCI_PT_MASK (ZPCI_PT_ENTRIES - 1)
|
||||
|
||||
#define ZPCI_PTE_FLAG_MASK 0xfffULL
|
||||
#define ZPCI_PTE_ADDR_MASK (~ZPCI_PTE_FLAG_MASK)
|
||||
|
||||
/* Shared bits */
|
||||
#define ZPCI_TABLE_VALID 0x00
|
||||
#define ZPCI_TABLE_INVALID 0x20
|
||||
#define ZPCI_TABLE_PROTECTED 0x200
|
||||
#define ZPCI_TABLE_UNPROTECTED 0x000
|
||||
#define ZPCI_TABLE_FC 0x400
|
||||
|
||||
#define ZPCI_TABLE_VALID_MASK 0x20
|
||||
#define ZPCI_TABLE_PROT_MASK 0x200
|
||||
|
||||
#define ZPCI_ETT_RT 1
|
||||
#define ZPCI_ETT_ST 0
|
||||
#define ZPCI_ETT_PT -1
|
||||
|
||||
/* PCI Function States
|
||||
*
|
||||
* reserved: default; device has just been plugged or is in progress of being
|
||||
* unplugged
|
||||
* standby: device is present but not configured; transition from any
|
||||
* configured state/to this state via sclp configure/deconfigure
|
||||
*
|
||||
* The following states make up the "configured" meta-state:
|
||||
* disabled: device is configured but not enabled; transition between this
|
||||
* state and enabled via clp enable/disable
|
||||
* enbaled: device is ready for use; transition to disabled via clp disable;
|
||||
* may enter an error state
|
||||
* blocked: ignore all DMA and interrupts; transition back to enabled or from
|
||||
* error state via mpcifc
|
||||
* error: an error occurred; transition back to enabled via mpcifc
|
||||
* permanent error: an unrecoverable error occurred; transition to standby via
|
||||
* sclp deconfigure
|
||||
*/
|
||||
typedef enum {
|
||||
ZPCI_FS_RESERVED,
|
||||
ZPCI_FS_STANDBY,
|
||||
ZPCI_FS_DISABLED,
|
||||
ZPCI_FS_ENABLED,
|
||||
ZPCI_FS_BLOCKED,
|
||||
ZPCI_FS_ERROR,
|
||||
ZPCI_FS_PERMANENT_ERROR,
|
||||
} ZpciState;
|
||||
|
||||
typedef struct SeiContainer {
|
||||
QTAILQ_ENTRY(SeiContainer) link;
|
||||
uint32_t fid;
|
||||
uint32_t fh;
|
||||
uint8_t cc;
|
||||
uint16_t pec;
|
||||
uint64_t faddr;
|
||||
uint32_t e;
|
||||
} SeiContainer;
|
||||
|
||||
typedef struct PciCcdfErr {
|
||||
uint32_t reserved1;
|
||||
uint32_t fh;
|
||||
uint32_t fid;
|
||||
uint32_t e;
|
||||
uint64_t faddr;
|
||||
uint32_t reserved3;
|
||||
uint16_t reserved4;
|
||||
uint16_t pec;
|
||||
} QEMU_PACKED PciCcdfErr;
|
||||
|
||||
typedef struct PciCcdfAvail {
|
||||
uint32_t reserved1;
|
||||
uint32_t fh;
|
||||
uint32_t fid;
|
||||
uint32_t reserved2;
|
||||
uint32_t reserved3;
|
||||
uint32_t reserved4;
|
||||
uint32_t reserved5;
|
||||
uint16_t reserved6;
|
||||
uint16_t pec;
|
||||
} QEMU_PACKED PciCcdfAvail;
|
||||
|
||||
typedef struct ChscSeiNt2Res {
|
||||
uint16_t length;
|
||||
uint16_t code;
|
||||
uint16_t reserved1;
|
||||
uint8_t reserved2;
|
||||
uint8_t nt;
|
||||
uint8_t flags;
|
||||
uint8_t reserved3;
|
||||
uint8_t reserved4;
|
||||
uint8_t cc;
|
||||
uint32_t reserved5[13];
|
||||
uint8_t ccdf[4016];
|
||||
} QEMU_PACKED ChscSeiNt2Res;
|
||||
|
||||
typedef struct S390MsixInfo {
|
||||
uint8_t table_bar;
|
||||
uint8_t pba_bar;
|
||||
uint16_t entries;
|
||||
uint32_t table_offset;
|
||||
uint32_t pba_offset;
|
||||
} S390MsixInfo;
|
||||
|
||||
typedef struct S390IOTLBEntry {
|
||||
uint64_t iova;
|
||||
uint64_t translated_addr;
|
||||
uint64_t len;
|
||||
uint64_t perm;
|
||||
} S390IOTLBEntry;
|
||||
|
||||
typedef struct S390PCIDMACount {
|
||||
int id;
|
||||
int users;
|
||||
uint32_t avail;
|
||||
QTAILQ_ENTRY(S390PCIDMACount) link;
|
||||
} S390PCIDMACount;
|
||||
|
||||
struct S390PCIIOMMU {
|
||||
Object parent_obj;
|
||||
S390PCIBusDevice *pbdev;
|
||||
AddressSpace as;
|
||||
MemoryRegion mr;
|
||||
IOMMUMemoryRegion iommu_mr;
|
||||
bool enabled;
|
||||
uint64_t g_iota;
|
||||
uint64_t pba;
|
||||
uint64_t pal;
|
||||
GHashTable *iotlb;
|
||||
S390PCIDMACount *dma_limit;
|
||||
};
|
||||
|
||||
typedef struct S390PCIIOMMUTable {
|
||||
uint64_t key;
|
||||
S390PCIIOMMU *iommu[PCI_SLOT_MAX];
|
||||
} S390PCIIOMMUTable;
|
||||
|
||||
/* Function Measurement Block */
|
||||
#define DEFAULT_MUI 4000
|
||||
#define UPDATE_U_BIT 0x1ULL
|
||||
#define FMBK_MASK 0xfULL
|
||||
|
||||
typedef struct ZpciFmbFmt0 {
|
||||
uint64_t dma_rbytes;
|
||||
uint64_t dma_wbytes;
|
||||
} ZpciFmbFmt0;
|
||||
|
||||
#define ZPCI_FMB_CNT_LD 0
|
||||
#define ZPCI_FMB_CNT_ST 1
|
||||
#define ZPCI_FMB_CNT_STB 2
|
||||
#define ZPCI_FMB_CNT_RPCIT 3
|
||||
#define ZPCI_FMB_CNT_MAX 4
|
||||
|
||||
#define ZPCI_FMB_FORMAT 0
|
||||
|
||||
typedef struct ZpciFmb {
|
||||
uint32_t format;
|
||||
uint32_t sample;
|
||||
uint64_t last_update;
|
||||
uint64_t counter[ZPCI_FMB_CNT_MAX];
|
||||
ZpciFmbFmt0 fmt0;
|
||||
} ZpciFmb;
|
||||
QEMU_BUILD_BUG_MSG(offsetof(ZpciFmb, fmt0) != 48, "padding in ZpciFmb");
|
||||
|
||||
#define ZPCI_DEFAULT_FN_GRP 0x20
|
||||
typedef struct S390PCIGroup {
|
||||
ClpRspQueryPciGrp zpci_group;
|
||||
int id;
|
||||
QTAILQ_ENTRY(S390PCIGroup) link;
|
||||
} S390PCIGroup;
|
||||
S390PCIGroup *s390_group_create(int id);
|
||||
S390PCIGroup *s390_group_find(int id);
|
||||
|
||||
struct S390PCIBusDevice {
|
||||
DeviceState qdev;
|
||||
PCIDevice *pdev;
|
||||
ZpciState state;
|
||||
char *target;
|
||||
uint16_t uid;
|
||||
uint32_t idx;
|
||||
uint32_t fh;
|
||||
uint32_t fid;
|
||||
bool fid_defined;
|
||||
uint64_t fmb_addr;
|
||||
ZpciFmb fmb;
|
||||
QEMUTimer *fmb_timer;
|
||||
uint8_t isc;
|
||||
uint16_t noi;
|
||||
uint16_t maxstbl;
|
||||
uint8_t sum;
|
||||
S390PCIGroup *pci_group;
|
||||
ClpRspQueryPci zpci_fn;
|
||||
S390MsixInfo msix;
|
||||
AdapterRoutes routes;
|
||||
S390PCIIOMMU *iommu;
|
||||
MemoryRegion msix_notify_mr;
|
||||
IndAddr *summary_ind;
|
||||
IndAddr *indicator;
|
||||
bool pci_unplug_request_processed;
|
||||
bool unplug_requested;
|
||||
QTAILQ_ENTRY(S390PCIBusDevice) link;
|
||||
};
|
||||
|
||||
struct S390PCIBus {
|
||||
BusState qbus;
|
||||
};
|
||||
|
||||
struct S390pciState {
|
||||
PCIHostState parent_obj;
|
||||
uint32_t next_idx;
|
||||
int bus_no;
|
||||
S390PCIBus *bus;
|
||||
GHashTable *iommu_table;
|
||||
GHashTable *zpci_table;
|
||||
QTAILQ_HEAD(, SeiContainer) pending_sei;
|
||||
QTAILQ_HEAD(, S390PCIBusDevice) zpci_devs;
|
||||
QTAILQ_HEAD(, S390PCIDMACount) zpci_dma_limit;
|
||||
QTAILQ_HEAD(, S390PCIGroup) zpci_groups;
|
||||
};
|
||||
|
||||
S390pciState *s390_get_phb(void);
|
||||
int pci_chsc_sei_nt2_get_event(void *res);
|
||||
int pci_chsc_sei_nt2_have_event(void);
|
||||
void s390_pci_sclp_configure(SCCB *sccb);
|
||||
void s390_pci_sclp_deconfigure(SCCB *sccb);
|
||||
void s390_pci_iommu_enable(S390PCIIOMMU *iommu);
|
||||
void s390_pci_iommu_disable(S390PCIIOMMU *iommu);
|
||||
void s390_pci_generate_error_event(uint16_t pec, uint32_t fh, uint32_t fid,
|
||||
uint64_t faddr, uint32_t e);
|
||||
uint16_t s390_guest_io_table_walk(uint64_t g_iota, hwaddr addr,
|
||||
S390IOTLBEntry *entry);
|
||||
S390PCIBusDevice *s390_pci_find_dev_by_idx(S390pciState *s, uint32_t idx);
|
||||
S390PCIBusDevice *s390_pci_find_dev_by_fh(S390pciState *s, uint32_t fh);
|
||||
S390PCIBusDevice *s390_pci_find_dev_by_fid(S390pciState *s, uint32_t fid);
|
||||
S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciState *s,
|
||||
const char *target);
|
||||
S390PCIBusDevice *s390_pci_find_next_avail_dev(S390pciState *s,
|
||||
S390PCIBusDevice *pbdev);
|
||||
|
||||
#endif
|
215
include/hw/s390x/s390-pci-clp.h
Normal file
215
include/hw/s390x/s390-pci-clp.h
Normal file
|
@ -0,0 +1,215 @@
|
|||
/*
|
||||
* s390 CLP instruction definitions
|
||||
*
|
||||
* Copyright 2019 IBM Corp.
|
||||
* Author(s): Pierre Morel <pmorel@de.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||
* your option) any later version. See the COPYING file in the top-level
|
||||
* directory.
|
||||
*/
|
||||
|
||||
#ifndef HW_S390_PCI_CLP
|
||||
#define HW_S390_PCI_CLP
|
||||
|
||||
/* CLP common request & response block size */
|
||||
#define CLP_BLK_SIZE 4096
|
||||
#define PCI_BAR_COUNT 6
|
||||
#define PCI_MAX_FUNCTIONS 4096
|
||||
|
||||
typedef struct ClpReqHdr {
|
||||
uint16_t len;
|
||||
uint16_t cmd;
|
||||
} QEMU_PACKED ClpReqHdr;
|
||||
|
||||
typedef struct ClpRspHdr {
|
||||
uint16_t len;
|
||||
uint16_t rsp;
|
||||
} QEMU_PACKED ClpRspHdr;
|
||||
|
||||
/* CLP Response Codes */
|
||||
#define CLP_RC_OK 0x0010 /* Command request successfully */
|
||||
#define CLP_RC_CMD 0x0020 /* Command code not recognized */
|
||||
#define CLP_RC_PERM 0x0030 /* Command not authorized */
|
||||
#define CLP_RC_FMT 0x0040 /* Invalid command request format */
|
||||
#define CLP_RC_LEN 0x0050 /* Invalid command request length */
|
||||
#define CLP_RC_8K 0x0060 /* Command requires 8K LPCB */
|
||||
#define CLP_RC_RESNOT0 0x0070 /* Reserved field not zero */
|
||||
#define CLP_RC_NODATA 0x0080 /* No data available */
|
||||
#define CLP_RC_FC_UNKNOWN 0x0100 /* Function code not recognized */
|
||||
|
||||
/*
|
||||
* Call Logical Processor - Command Codes
|
||||
*/
|
||||
#define CLP_LIST_PCI 0x0002
|
||||
#define CLP_QUERY_PCI_FN 0x0003
|
||||
#define CLP_QUERY_PCI_FNGRP 0x0004
|
||||
#define CLP_SET_PCI_FN 0x0005
|
||||
|
||||
/* PCI function handle list entry */
|
||||
typedef struct ClpFhListEntry {
|
||||
uint16_t device_id;
|
||||
uint16_t vendor_id;
|
||||
#define CLP_FHLIST_MASK_CONFIG 0x80000000
|
||||
uint32_t config;
|
||||
uint32_t fid;
|
||||
uint32_t fh;
|
||||
} QEMU_PACKED ClpFhListEntry;
|
||||
|
||||
#define CLP_RC_SETPCIFN_FH 0x0101 /* Invalid PCI fn handle */
|
||||
#define CLP_RC_SETPCIFN_FHOP 0x0102 /* Fn handle not valid for op */
|
||||
#define CLP_RC_SETPCIFN_DMAAS 0x0103 /* Invalid DMA addr space */
|
||||
#define CLP_RC_SETPCIFN_RES 0x0104 /* Insufficient resources */
|
||||
#define CLP_RC_SETPCIFN_ALRDY 0x0105 /* Fn already in requested state */
|
||||
#define CLP_RC_SETPCIFN_ERR 0x0106 /* Fn in permanent error state */
|
||||
#define CLP_RC_SETPCIFN_RECPND 0x0107 /* Error recovery pending */
|
||||
#define CLP_RC_SETPCIFN_BUSY 0x0108 /* Fn busy */
|
||||
#define CLP_RC_LISTPCI_BADRT 0x010a /* Resume token not recognized */
|
||||
#define CLP_RC_QUERYPCIFG_PFGID 0x010b /* Unrecognized PFGID */
|
||||
|
||||
/* request or response block header length */
|
||||
#define LIST_PCI_HDR_LEN 32
|
||||
|
||||
/* Number of function handles fitting in response block */
|
||||
#define CLP_FH_LIST_NR_ENTRIES \
|
||||
((CLP_BLK_SIZE - 2 * LIST_PCI_HDR_LEN) \
|
||||
/ sizeof(ClpFhListEntry))
|
||||
|
||||
#define CLP_SET_ENABLE_PCI_FN 0 /* Yes, 0 enables it */
|
||||
#define CLP_SET_DISABLE_PCI_FN 1 /* Yes, 1 disables it */
|
||||
|
||||
#define CLP_UTIL_STR_LEN 64
|
||||
#define CLP_PFIP_NR_SEGMENTS 4
|
||||
|
||||
#define CLP_MASK_FMT 0xf0000000
|
||||
|
||||
/* List PCI functions request */
|
||||
typedef struct ClpReqListPci {
|
||||
ClpReqHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
uint64_t resume_token;
|
||||
uint64_t reserved2;
|
||||
} QEMU_PACKED ClpReqListPci;
|
||||
|
||||
/* List PCI functions response */
|
||||
typedef struct ClpRspListPci {
|
||||
ClpRspHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
uint64_t resume_token;
|
||||
uint32_t mdd;
|
||||
uint16_t max_fn;
|
||||
uint8_t flags;
|
||||
uint8_t entry_size;
|
||||
ClpFhListEntry fh_list[CLP_FH_LIST_NR_ENTRIES];
|
||||
} QEMU_PACKED ClpRspListPci;
|
||||
|
||||
/* Query PCI function request */
|
||||
typedef struct ClpReqQueryPci {
|
||||
ClpReqHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
uint32_t fh; /* function handle */
|
||||
uint32_t reserved2;
|
||||
uint64_t reserved3;
|
||||
} QEMU_PACKED ClpReqQueryPci;
|
||||
|
||||
/* Query PCI function response */
|
||||
typedef struct ClpRspQueryPci {
|
||||
ClpRspHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
uint16_t vfn; /* virtual fn number */
|
||||
#define CLP_RSP_QPCI_MASK_UTIL 0x01
|
||||
uint8_t flags;
|
||||
uint8_t pfgid;
|
||||
uint32_t fid; /* pci function id */
|
||||
uint8_t bar_size[PCI_BAR_COUNT];
|
||||
uint16_t pchid;
|
||||
uint32_t bar[PCI_BAR_COUNT];
|
||||
uint8_t pfip[CLP_PFIP_NR_SEGMENTS];
|
||||
uint16_t reserved2;
|
||||
uint8_t fmbl;
|
||||
uint8_t pft;
|
||||
uint64_t sdma; /* start dma as */
|
||||
uint64_t edma; /* end dma as */
|
||||
uint32_t reserved3[11];
|
||||
uint32_t uid;
|
||||
uint8_t util_str[CLP_UTIL_STR_LEN]; /* utility string */
|
||||
} QEMU_PACKED ClpRspQueryPci;
|
||||
|
||||
/* Query PCI function group request */
|
||||
typedef struct ClpReqQueryPciGrp {
|
||||
ClpReqHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
#define CLP_REQ_QPCIG_MASK_PFGID 0xff
|
||||
uint32_t g;
|
||||
uint32_t reserved2;
|
||||
uint64_t reserved3;
|
||||
} QEMU_PACKED ClpReqQueryPciGrp;
|
||||
|
||||
/* Query PCI function group response */
|
||||
typedef struct ClpRspQueryPciGrp {
|
||||
ClpRspHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
#define CLP_RSP_QPCIG_MASK_NOI 0xfff
|
||||
uint16_t i;
|
||||
uint8_t version;
|
||||
#define CLP_RSP_QPCIG_MASK_FRAME 0x2
|
||||
#define CLP_RSP_QPCIG_MASK_REFRESH 0x1
|
||||
uint8_t fr;
|
||||
uint16_t maxstbl;
|
||||
uint16_t mui;
|
||||
uint64_t reserved3;
|
||||
uint64_t dasm; /* dma address space mask */
|
||||
uint64_t msia; /* MSI address */
|
||||
uint64_t reserved4;
|
||||
uint64_t reserved5;
|
||||
} QEMU_PACKED ClpRspQueryPciGrp;
|
||||
|
||||
/* Set PCI function request */
|
||||
typedef struct ClpReqSetPci {
|
||||
ClpReqHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
uint32_t fh; /* function handle */
|
||||
uint16_t reserved2;
|
||||
uint8_t oc; /* operation controls */
|
||||
uint8_t ndas; /* number of dma spaces */
|
||||
uint64_t reserved3;
|
||||
} QEMU_PACKED ClpReqSetPci;
|
||||
|
||||
/* Set PCI function response */
|
||||
typedef struct ClpRspSetPci {
|
||||
ClpRspHdr hdr;
|
||||
uint32_t fmt;
|
||||
uint64_t reserved1;
|
||||
uint32_t fh; /* function handle */
|
||||
uint32_t reserved3;
|
||||
uint64_t reserved4;
|
||||
} QEMU_PACKED ClpRspSetPci;
|
||||
|
||||
typedef struct ClpReqRspListPci {
|
||||
ClpReqListPci request;
|
||||
ClpRspListPci response;
|
||||
} QEMU_PACKED ClpReqRspListPci;
|
||||
|
||||
typedef struct ClpReqRspSetPci {
|
||||
ClpReqSetPci request;
|
||||
ClpRspSetPci response;
|
||||
} QEMU_PACKED ClpReqRspSetPci;
|
||||
|
||||
typedef struct ClpReqRspQueryPci {
|
||||
ClpReqQueryPci request;
|
||||
ClpRspQueryPci response;
|
||||
} QEMU_PACKED ClpReqRspQueryPci;
|
||||
|
||||
typedef struct ClpReqRspQueryPciGrp {
|
||||
ClpReqQueryPciGrp request;
|
||||
ClpRspQueryPciGrp response;
|
||||
} QEMU_PACKED ClpReqRspQueryPciGrp;
|
||||
|
||||
#endif
|
119
include/hw/s390x/s390-pci-inst.h
Normal file
119
include/hw/s390x/s390-pci-inst.h
Normal file
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* s390 PCI instruction definitions
|
||||
*
|
||||
* Copyright 2014 IBM Corp.
|
||||
* Author(s): Frank Blaschka <frank.blaschka@de.ibm.com>
|
||||
* Hong Bo Li <lihbbj@cn.ibm.com>
|
||||
* Yi Min Zhao <zyimin@cn.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||
* your option) any later version. See the COPYING file in the top-level
|
||||
* directory.
|
||||
*/
|
||||
|
||||
#ifndef HW_S390_PCI_INST_H
|
||||
#define HW_S390_PCI_INST_H
|
||||
|
||||
#include "s390-pci-bus.h"
|
||||
#include "sysemu/dma.h"
|
||||
|
||||
/* Load/Store status codes */
|
||||
#define ZPCI_PCI_ST_FUNC_NOT_ENABLED 4
|
||||
#define ZPCI_PCI_ST_FUNC_IN_ERR 8
|
||||
#define ZPCI_PCI_ST_BLOCKED 12
|
||||
#define ZPCI_PCI_ST_INSUF_RES 16
|
||||
#define ZPCI_PCI_ST_INVAL_AS 20
|
||||
#define ZPCI_PCI_ST_FUNC_ALREADY_ENABLED 24
|
||||
#define ZPCI_PCI_ST_DMA_AS_NOT_ENABLED 28
|
||||
#define ZPCI_PCI_ST_2ND_OP_IN_INV_AS 36
|
||||
#define ZPCI_PCI_ST_FUNC_NOT_AVAIL 40
|
||||
#define ZPCI_PCI_ST_ALREADY_IN_RQ_STATE 44
|
||||
|
||||
/* Load/Store return codes */
|
||||
#define ZPCI_PCI_LS_OK 0
|
||||
#define ZPCI_PCI_LS_ERR 1
|
||||
#define ZPCI_PCI_LS_BUSY 2
|
||||
#define ZPCI_PCI_LS_INVAL_HANDLE 3
|
||||
|
||||
/* Modify PCI status codes */
|
||||
#define ZPCI_MOD_ST_RES_NOT_AVAIL 4
|
||||
#define ZPCI_MOD_ST_INSUF_RES 16
|
||||
#define ZPCI_MOD_ST_SEQUENCE 24
|
||||
#define ZPCI_MOD_ST_DMAAS_INVAL 28
|
||||
#define ZPCI_MOD_ST_FRAME_INVAL 32
|
||||
#define ZPCI_MOD_ST_ERROR_RECOVER 40
|
||||
|
||||
/* Modify PCI Function Controls */
|
||||
#define ZPCI_MOD_FC_REG_INT 2
|
||||
#define ZPCI_MOD_FC_DEREG_INT 3
|
||||
#define ZPCI_MOD_FC_REG_IOAT 4
|
||||
#define ZPCI_MOD_FC_DEREG_IOAT 5
|
||||
#define ZPCI_MOD_FC_REREG_IOAT 6
|
||||
#define ZPCI_MOD_FC_RESET_ERROR 7
|
||||
#define ZPCI_MOD_FC_RESET_BLOCK 9
|
||||
#define ZPCI_MOD_FC_SET_MEASURE 10
|
||||
|
||||
/* Store PCI Function Controls status codes */
|
||||
#define ZPCI_STPCIFC_ST_PERM_ERROR 8
|
||||
#define ZPCI_STPCIFC_ST_INVAL_DMAAS 28
|
||||
#define ZPCI_STPCIFC_ST_ERROR_RECOVER 40
|
||||
|
||||
/* Refresh PCI Translations status codes */
|
||||
#define ZPCI_RPCIT_ST_INSUFF_RES 16
|
||||
|
||||
/* FIB function controls */
|
||||
#define ZPCI_FIB_FC_ENABLED 0x80
|
||||
#define ZPCI_FIB_FC_ERROR 0x40
|
||||
#define ZPCI_FIB_FC_LS_BLOCKED 0x20
|
||||
#define ZPCI_FIB_FC_DMAAS_REG 0x10
|
||||
|
||||
/* FIB function controls */
|
||||
#define ZPCI_FIB_FC_ENABLED 0x80
|
||||
#define ZPCI_FIB_FC_ERROR 0x40
|
||||
#define ZPCI_FIB_FC_LS_BLOCKED 0x20
|
||||
#define ZPCI_FIB_FC_DMAAS_REG 0x10
|
||||
|
||||
/* Function Information Block */
|
||||
typedef struct ZpciFib {
|
||||
uint8_t fmt; /* format */
|
||||
uint8_t reserved1[7];
|
||||
uint8_t fc; /* function controls */
|
||||
uint8_t reserved2;
|
||||
uint16_t reserved3;
|
||||
uint32_t reserved4;
|
||||
uint64_t pba; /* PCI base address */
|
||||
uint64_t pal; /* PCI address limit */
|
||||
uint64_t iota; /* I/O Translation Anchor */
|
||||
#define FIB_DATA_ISC(x) (((x) >> 28) & 0x7)
|
||||
#define FIB_DATA_NOI(x) (((x) >> 16) & 0xfff)
|
||||
#define FIB_DATA_AIBVO(x) (((x) >> 8) & 0x3f)
|
||||
#define FIB_DATA_SUM(x) (((x) >> 7) & 0x1)
|
||||
#define FIB_DATA_AISBO(x) ((x) & 0x3f)
|
||||
uint32_t data;
|
||||
uint32_t reserved5;
|
||||
uint64_t aibv; /* Adapter int bit vector address */
|
||||
uint64_t aisb; /* Adapter int summary bit address */
|
||||
uint64_t fmb_addr; /* Function measurement address and key */
|
||||
uint32_t reserved6;
|
||||
uint32_t gd;
|
||||
} QEMU_PACKED ZpciFib;
|
||||
|
||||
int pci_dereg_irqs(S390PCIBusDevice *pbdev);
|
||||
void pci_dereg_ioat(S390PCIIOMMU *iommu);
|
||||
int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_t ra);
|
||||
int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra);
|
||||
int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra);
|
||||
int rpcit_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2, uintptr_t ra);
|
||||
int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
|
||||
uint8_t ar, uintptr_t ra);
|
||||
int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||
uintptr_t ra);
|
||||
int stpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t ar,
|
||||
uintptr_t ra);
|
||||
void fmb_timer_free(S390PCIBusDevice *pbdev);
|
||||
|
||||
#define ZPCI_IO_BAR_MIN 0
|
||||
#define ZPCI_IO_BAR_MAX 5
|
||||
#define ZPCI_CONFIG_BAR 15
|
||||
|
||||
#endif
|
38
include/hw/s390x/s390-pci-vfio.h
Normal file
38
include/hw/s390x/s390-pci-vfio.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* s390 vfio-pci interfaces
|
||||
*
|
||||
* Copyright 2020 IBM Corp.
|
||||
* Author(s): Matthew Rosato <mjrosato@linux.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
||||
* your option) any later version. See the COPYING file in the top-level
|
||||
* directory.
|
||||
*/
|
||||
|
||||
#ifndef HW_S390_PCI_VFIO_H
|
||||
#define HW_S390_PCI_VFIO_H
|
||||
|
||||
#include "hw/s390x/s390-pci-bus.h"
|
||||
|
||||
#ifdef CONFIG_LINUX
|
||||
bool s390_pci_update_dma_avail(int fd, unsigned int *avail);
|
||||
S390PCIDMACount *s390_pci_start_dma_count(S390pciState *s,
|
||||
S390PCIBusDevice *pbdev);
|
||||
void s390_pci_end_dma_count(S390pciState *s, S390PCIDMACount *cnt);
|
||||
void s390_pci_get_clp_info(S390PCIBusDevice *pbdev);
|
||||
#else
|
||||
static inline bool s390_pci_update_dma_avail(int fd, unsigned int *avail)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline S390PCIDMACount *s390_pci_start_dma_count(S390pciState *s,
|
||||
S390PCIBusDevice *pbdev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void s390_pci_end_dma_count(S390pciState *s,
|
||||
S390PCIDMACount *cnt) { }
|
||||
static inline void s390_pci_get_clp_info(S390PCIBusDevice *pbdev) { }
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -29,6 +29,7 @@
|
|||
#ifdef CONFIG_LINUX
|
||||
#include <linux/vfio.h>
|
||||
#endif
|
||||
#include "sysemu/sysemu.h"
|
||||
|
||||
#define VFIO_MSG_PREFIX "vfio %s: "
|
||||
|
||||
|
@ -57,6 +58,16 @@ typedef struct VFIORegion {
|
|||
uint8_t nr; /* cache the region number for debug */
|
||||
} VFIORegion;
|
||||
|
||||
typedef struct VFIOMigration {
|
||||
struct VFIODevice *vbasedev;
|
||||
VMChangeStateEntry *vm_state;
|
||||
VFIORegion region;
|
||||
uint32_t device_state;
|
||||
int vm_running;
|
||||
Notifier migration_state;
|
||||
uint64_t pending_bytes;
|
||||
} VFIOMigration;
|
||||
|
||||
typedef struct VFIOAddressSpace {
|
||||
AddressSpace *as;
|
||||
QLIST_HEAD(, VFIOContainer) containers;
|
||||
|
@ -73,6 +84,9 @@ typedef struct VFIOContainer {
|
|||
unsigned iommu_type;
|
||||
Error *error;
|
||||
bool initialized;
|
||||
bool dirty_pages_supported;
|
||||
uint64_t dirty_pgsizes;
|
||||
uint64_t max_dirty_bitmap_size;
|
||||
unsigned long pgsizes;
|
||||
QLIST_HEAD(, VFIOGuestIOMMU) giommu_list;
|
||||
QLIST_HEAD(, VFIOHostDMAWindow) hostwin_list;
|
||||
|
@ -113,12 +127,17 @@ typedef struct VFIODevice {
|
|||
unsigned int num_irqs;
|
||||
unsigned int num_regions;
|
||||
unsigned int flags;
|
||||
VFIOMigration *migration;
|
||||
Error *migration_blocker;
|
||||
} VFIODevice;
|
||||
|
||||
struct VFIODeviceOps {
|
||||
void (*vfio_compute_needs_reset)(VFIODevice *vdev);
|
||||
int (*vfio_hot_reset_multi)(VFIODevice *vdev);
|
||||
void (*vfio_eoi)(VFIODevice *vdev);
|
||||
Object *(*vfio_get_object)(VFIODevice *vdev);
|
||||
void (*vfio_save_config)(VFIODevice *vdev, QEMUFile *f);
|
||||
int (*vfio_load_config)(VFIODevice *vdev, QEMUFile *f);
|
||||
};
|
||||
|
||||
typedef struct VFIOGroup {
|
||||
|
@ -171,6 +190,7 @@ int vfio_region_setup(Object *obj, VFIODevice *vbasedev, VFIORegion *region,
|
|||
int index, const char *name);
|
||||
int vfio_region_mmap(VFIORegion *region);
|
||||
void vfio_region_mmaps_set_enabled(VFIORegion *region, bool enabled);
|
||||
void vfio_region_unmap(VFIORegion *region);
|
||||
void vfio_region_exit(VFIORegion *region);
|
||||
void vfio_region_finalize(VFIORegion *region);
|
||||
void vfio_reset_handler(void *opaque);
|
||||
|
@ -183,6 +203,9 @@ extern const MemoryRegionOps vfio_region_ops;
|
|||
typedef QLIST_HEAD(VFIOGroupList, VFIOGroup) VFIOGroupList;
|
||||
extern VFIOGroupList vfio_group_list;
|
||||
|
||||
bool vfio_mig_active(void);
|
||||
int64_t vfio_mig_bytes_transferred(void);
|
||||
|
||||
#ifdef CONFIG_LINUX
|
||||
int vfio_get_region_info(VFIODevice *vbasedev, int index,
|
||||
struct vfio_region_info **info);
|
||||
|
@ -191,6 +214,10 @@ int vfio_get_dev_region_info(VFIODevice *vbasedev, uint32_t type,
|
|||
bool vfio_has_region_cap(VFIODevice *vbasedev, int region, uint16_t cap_type);
|
||||
struct vfio_info_cap_header *
|
||||
vfio_get_region_info_cap(struct vfio_region_info *info, uint16_t id);
|
||||
bool vfio_get_info_dma_avail(struct vfio_iommu_type1_info *info,
|
||||
unsigned int *avail);
|
||||
struct vfio_info_cap_header *
|
||||
vfio_get_device_info_cap(struct vfio_device_info *info, uint16_t id);
|
||||
#endif
|
||||
extern const MemoryListener vfio_prereg_listener;
|
||||
|
||||
|
@ -200,4 +227,7 @@ int vfio_spapr_create_window(VFIOContainer *container,
|
|||
int vfio_spapr_remove_window(VFIOContainer *container,
|
||||
hwaddr offset_within_address_space);
|
||||
|
||||
int vfio_migration_probe(VFIODevice *vbasedev, Error **errp);
|
||||
void vfio_migration_finalize(VFIODevice *vbasedev);
|
||||
|
||||
#endif /* HW_VFIO_VFIO_COMMON_H */
|
||||
|
|
|
@ -176,7 +176,7 @@ struct pvrdma_port_attr {
|
|||
uint8_t subnet_timeout;
|
||||
uint8_t init_type_reply;
|
||||
uint8_t active_width;
|
||||
uint8_t active_speed;
|
||||
uint16_t active_speed;
|
||||
uint8_t phys_state;
|
||||
uint8_t reserved[2];
|
||||
};
|
||||
|
|
|
@ -1617,6 +1617,8 @@ enum ethtool_link_mode_bit_indices {
|
|||
ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87,
|
||||
ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88,
|
||||
ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89,
|
||||
ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90,
|
||||
ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91,
|
||||
/* must be last entry */
|
||||
__ETHTOOL_LINK_MODE_MASK_NBITS
|
||||
};
|
||||
|
|
|
@ -172,6 +172,9 @@
|
|||
* - add FUSE_WRITE_KILL_PRIV flag
|
||||
* - add FUSE_SETUPMAPPING and FUSE_REMOVEMAPPING
|
||||
* - add map_alignment to fuse_init_out, add FUSE_MAP_ALIGNMENT flag
|
||||
*
|
||||
* 7.32
|
||||
* - add flags to fuse_attr, add FUSE_ATTR_SUBMOUNT, add FUSE_SUBMOUNTS
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_FUSE_H
|
||||
|
@ -203,7 +206,7 @@
|
|||
#define FUSE_KERNEL_VERSION 7
|
||||
|
||||
/** Minor version number of this interface */
|
||||
#define FUSE_KERNEL_MINOR_VERSION 31
|
||||
#define FUSE_KERNEL_MINOR_VERSION 32
|
||||
|
||||
/** The node ID of the root inode */
|
||||
#define FUSE_ROOT_ID 1
|
||||
|
@ -227,7 +230,7 @@ struct fuse_attr {
|
|||
uint32_t gid;
|
||||
uint32_t rdev;
|
||||
uint32_t blksize;
|
||||
uint32_t padding;
|
||||
uint32_t flags;
|
||||
};
|
||||
|
||||
struct fuse_kstatfs {
|
||||
|
@ -309,7 +312,10 @@ struct fuse_file_lock {
|
|||
* FUSE_CACHE_SYMLINKS: cache READLINK responses
|
||||
* FUSE_NO_OPENDIR_SUPPORT: kernel supports zero-message opendir
|
||||
* FUSE_EXPLICIT_INVAL_DATA: only invalidate cached pages on explicit request
|
||||
* FUSE_MAP_ALIGNMENT: map_alignment field is valid
|
||||
* FUSE_MAP_ALIGNMENT: init_out.map_alignment contains log2(byte alignment) for
|
||||
* foffset and moffset fields in struct
|
||||
* fuse_setupmapping_out and fuse_removemapping_one.
|
||||
* FUSE_SUBMOUNTS: kernel supports auto-mounting directory submounts
|
||||
*/
|
||||
#define FUSE_ASYNC_READ (1 << 0)
|
||||
#define FUSE_POSIX_LOCKS (1 << 1)
|
||||
|
@ -338,6 +344,7 @@ struct fuse_file_lock {
|
|||
#define FUSE_NO_OPENDIR_SUPPORT (1 << 24)
|
||||
#define FUSE_EXPLICIT_INVAL_DATA (1 << 25)
|
||||
#define FUSE_MAP_ALIGNMENT (1 << 26)
|
||||
#define FUSE_SUBMOUNTS (1 << 27)
|
||||
|
||||
/**
|
||||
* CUSE INIT request/reply flags
|
||||
|
@ -413,6 +420,13 @@ struct fuse_file_lock {
|
|||
*/
|
||||
#define FUSE_FSYNC_FDATASYNC (1 << 0)
|
||||
|
||||
/**
|
||||
* fuse_attr flags
|
||||
*
|
||||
* FUSE_ATTR_SUBMOUNT: Object is a submount root
|
||||
*/
|
||||
#define FUSE_ATTR_SUBMOUNT (1 << 0)
|
||||
|
||||
enum fuse_opcode {
|
||||
FUSE_LOOKUP = 1,
|
||||
FUSE_FORGET = 2, /* no reply */
|
||||
|
@ -888,4 +902,34 @@ struct fuse_copy_file_range_in {
|
|||
uint64_t flags;
|
||||
};
|
||||
|
||||
#define FUSE_SETUPMAPPING_FLAG_WRITE (1ull << 0)
|
||||
#define FUSE_SETUPMAPPING_FLAG_READ (1ull << 1)
|
||||
struct fuse_setupmapping_in {
|
||||
/* An already open handle */
|
||||
uint64_t fh;
|
||||
/* Offset into the file to start the mapping */
|
||||
uint64_t foffset;
|
||||
/* Length of mapping required */
|
||||
uint64_t len;
|
||||
/* Flags, FUSE_SETUPMAPPING_FLAG_* */
|
||||
uint64_t flags;
|
||||
/* Offset in Memory Window */
|
||||
uint64_t moffset;
|
||||
};
|
||||
|
||||
struct fuse_removemapping_in {
|
||||
/* number of fuse_removemapping_one follows */
|
||||
uint32_t count;
|
||||
};
|
||||
|
||||
struct fuse_removemapping_one {
|
||||
/* Offset into the dax window start the unmapping */
|
||||
uint64_t moffset;
|
||||
/* Length of mapping required */
|
||||
uint64_t len;
|
||||
};
|
||||
|
||||
#define FUSE_REMOVEMAPPING_MAX_ENTRY \
|
||||
(PAGE_SIZE / sizeof(struct fuse_removemapping_one))
|
||||
|
||||
#endif /* _LINUX_FUSE_H */
|
||||
|
|
|
@ -515,6 +515,9 @@
|
|||
#define KEY_10CHANNELSUP 0x1b8 /* 10 channels up (10+) */
|
||||
#define KEY_10CHANNELSDOWN 0x1b9 /* 10 channels down (10-) */
|
||||
#define KEY_IMAGES 0x1ba /* AL Image Browser */
|
||||
#define KEY_NOTIFICATION_CENTER 0x1bc /* Show/hide the notification center */
|
||||
#define KEY_PICKUP_PHONE 0x1bd /* Answer incoming call */
|
||||
#define KEY_HANGUP_PHONE 0x1be /* Decline incoming call */
|
||||
|
||||
#define KEY_DEL_EOL 0x1c0
|
||||
#define KEY_DEL_EOS 0x1c1
|
||||
|
@ -542,6 +545,7 @@
|
|||
#define KEY_FN_F 0x1e2
|
||||
#define KEY_FN_S 0x1e3
|
||||
#define KEY_FN_B 0x1e4
|
||||
#define KEY_FN_RIGHT_SHIFT 0x1e5
|
||||
|
||||
#define KEY_BRL_DOT1 0x1f1
|
||||
#define KEY_BRL_DOT2 0x1f2
|
||||
|
|
|
@ -76,6 +76,7 @@
|
|||
#define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */
|
||||
#define PCI_LATENCY_TIMER 0x0d /* 8 bits */
|
||||
#define PCI_HEADER_TYPE 0x0e /* 8 bits */
|
||||
#define PCI_HEADER_TYPE_MASK 0x7f
|
||||
#define PCI_HEADER_TYPE_NORMAL 0
|
||||
#define PCI_HEADER_TYPE_BRIDGE 1
|
||||
#define PCI_HEADER_TYPE_CARDBUS 2
|
||||
|
@ -246,7 +247,7 @@
|
|||
#define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */
|
||||
#define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */
|
||||
#define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */
|
||||
#define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */
|
||||
#define PCI_PM_CAP_PME_D3hot 0x4000 /* PME# from D3 (hot) */
|
||||
#define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */
|
||||
#define PCI_PM_CAP_PME_SHIFT 11 /* Start of the PME Mask in PMC */
|
||||
#define PCI_PM_CTRL 4 /* PM control and status register */
|
||||
|
@ -532,6 +533,8 @@
|
|||
#define PCI_EXP_LNKCAP_SLS_32_0GB 0x00000005 /* LNKCAP2 SLS Vector bit 4 */
|
||||
#define PCI_EXP_LNKCAP_MLW 0x000003f0 /* Maximum Link Width */
|
||||
#define PCI_EXP_LNKCAP_ASPMS 0x00000c00 /* ASPM Support */
|
||||
#define PCI_EXP_LNKCAP_ASPM_L0S 0x00000400 /* ASPM L0s Support */
|
||||
#define PCI_EXP_LNKCAP_ASPM_L1 0x00000800 /* ASPM L1 Support */
|
||||
#define PCI_EXP_LNKCAP_L0SEL 0x00007000 /* L0s Exit Latency */
|
||||
#define PCI_EXP_LNKCAP_L1EL 0x00038000 /* L1 Exit Latency */
|
||||
#define PCI_EXP_LNKCAP_CLKPM 0x00040000 /* Clock Power Management */
|
||||
|
@ -1056,6 +1059,7 @@
|
|||
#define PCI_L1SS_CTL1_PCIPM_L1_1 0x00000002 /* PCI-PM L1.1 Enable */
|
||||
#define PCI_L1SS_CTL1_ASPM_L1_2 0x00000004 /* ASPM L1.2 Enable */
|
||||
#define PCI_L1SS_CTL1_ASPM_L1_1 0x00000008 /* ASPM L1.1 Enable */
|
||||
#define PCI_L1SS_CTL1_L1_2_MASK 0x00000005
|
||||
#define PCI_L1SS_CTL1_L1SS_MASK 0x0000000f
|
||||
#define PCI_L1SS_CTL1_CM_RESTORE_TIME 0x0000ff00 /* Common_Mode_Restore_Time */
|
||||
#define PCI_L1SS_CTL1_LTR_L12_TH_VALUE 0x03ff0000 /* LTR_L1.2_THRESHOLD_Value */
|
||||
|
|
|
@ -16,4 +16,7 @@ struct virtio_fs_config {
|
|||
uint32_t num_request_queues;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* For the id field in virtio_pci_shm_cap */
|
||||
#define VIRTIO_FS_SHMCAP_ID_CACHE 0
|
||||
|
||||
#endif /* _LINUX_VIRTIO_FS_H */
|
||||
|
|
|
@ -50,6 +50,10 @@
|
|||
* VIRTIO_GPU_CMD_GET_EDID
|
||||
*/
|
||||
#define VIRTIO_GPU_F_EDID 1
|
||||
/*
|
||||
* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID
|
||||
*/
|
||||
#define VIRTIO_GPU_F_RESOURCE_UUID 2
|
||||
|
||||
enum virtio_gpu_ctrl_type {
|
||||
VIRTIO_GPU_UNDEFINED = 0,
|
||||
|
@ -66,6 +70,7 @@ enum virtio_gpu_ctrl_type {
|
|||
VIRTIO_GPU_CMD_GET_CAPSET_INFO,
|
||||
VIRTIO_GPU_CMD_GET_CAPSET,
|
||||
VIRTIO_GPU_CMD_GET_EDID,
|
||||
VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID,
|
||||
|
||||
/* 3d commands */
|
||||
VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
|
||||
|
@ -87,6 +92,7 @@ enum virtio_gpu_ctrl_type {
|
|||
VIRTIO_GPU_RESP_OK_CAPSET_INFO,
|
||||
VIRTIO_GPU_RESP_OK_CAPSET,
|
||||
VIRTIO_GPU_RESP_OK_EDID,
|
||||
VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
|
||||
|
||||
/* error responses */
|
||||
VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
|
||||
|
@ -340,4 +346,17 @@ enum virtio_gpu_formats {
|
|||
VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134,
|
||||
};
|
||||
|
||||
/* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */
|
||||
struct virtio_gpu_resource_assign_uuid {
|
||||
struct virtio_gpu_ctrl_hdr hdr;
|
||||
uint32_t resource_id;
|
||||
uint32_t padding;
|
||||
};
|
||||
|
||||
/* VIRTIO_GPU_RESP_OK_RESOURCE_UUID */
|
||||
struct virtio_gpu_resp_resource_uuid {
|
||||
struct virtio_gpu_ctrl_hdr hdr;
|
||||
uint8_t uuid[16];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -122,6 +122,17 @@
|
|||
#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0
|
||||
#define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4
|
||||
|
||||
/* Shared memory region id */
|
||||
#define VIRTIO_MMIO_SHM_SEL 0x0ac
|
||||
|
||||
/* Shared memory region length, 64 bits in two halves */
|
||||
#define VIRTIO_MMIO_SHM_LEN_LOW 0x0b0
|
||||
#define VIRTIO_MMIO_SHM_LEN_HIGH 0x0b4
|
||||
|
||||
/* Shared memory region base address, 64 bits in two halves */
|
||||
#define VIRTIO_MMIO_SHM_BASE_LOW 0x0b8
|
||||
#define VIRTIO_MMIO_SHM_BASE_HIGH 0x0bc
|
||||
|
||||
/* Configuration atomicity value */
|
||||
#define VIRTIO_MMIO_CONFIG_GENERATION 0x0fc
|
||||
|
||||
|
|
|
@ -113,6 +113,8 @@
|
|||
#define VIRTIO_PCI_CAP_DEVICE_CFG 4
|
||||
/* PCI configuration access */
|
||||
#define VIRTIO_PCI_CAP_PCI_CFG 5
|
||||
/* Additional shared memory capability */
|
||||
#define VIRTIO_PCI_CAP_SHARED_MEMORY_CFG 8
|
||||
|
||||
/* This is the PCI capability header: */
|
||||
struct virtio_pci_cap {
|
||||
|
@ -121,11 +123,18 @@ struct virtio_pci_cap {
|
|||
uint8_t cap_len; /* Generic PCI field: capability length */
|
||||
uint8_t cfg_type; /* Identifies the structure. */
|
||||
uint8_t bar; /* Where to find it. */
|
||||
uint8_t padding[3]; /* Pad to full dword. */
|
||||
uint8_t id; /* Multiple capabilities of the same type */
|
||||
uint8_t padding[2]; /* Pad to full dword. */
|
||||
uint32_t offset; /* Offset within bar. */
|
||||
uint32_t length; /* Length of the structure, in bytes. */
|
||||
};
|
||||
|
||||
struct virtio_pci_cap64 {
|
||||
struct virtio_pci_cap cap;
|
||||
uint32_t offset_hi; /* Most sig 32 bits of offset */
|
||||
uint32_t length_hi; /* Most sig 32 bits of length */
|
||||
};
|
||||
|
||||
struct virtio_pci_notify_cap {
|
||||
struct virtio_pci_cap cap;
|
||||
uint32_t notify_off_multiplier; /* Multiplier for queue_notify_off. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue