mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
3f84b96c97
We copied the virtio_iommu_config from the virtio-iommu specification, which declares the fields using little-endian annotations (for example le32). Unfortunately this causes sparse to warn about comparison between little- and cpu-endian, because of the typecheck() in virtio_cread(): drivers/iommu/virtio-iommu.c:1024:9: sparse: sparse: incompatible types in comparison expression (different base types): drivers/iommu/virtio-iommu.c:1024:9: sparse: restricted __le64 * drivers/iommu/virtio-iommu.c:1024:9: sparse: unsigned long long * drivers/iommu/virtio-iommu.c:1036:9: sparse: sparse: incompatible types in comparison expression (different base types): drivers/iommu/virtio-iommu.c:1036:9: sparse: restricted __le64 * drivers/iommu/virtio-iommu.c:1036:9: sparse: unsigned long long * drivers/iommu/virtio-iommu.c:1040:9: sparse: sparse: incompatible types in comparison expression (different base types): drivers/iommu/virtio-iommu.c:1040:9: sparse: restricted __le64 * drivers/iommu/virtio-iommu.c:1040:9: sparse: unsigned long long * drivers/iommu/virtio-iommu.c:1044:9: sparse: sparse: incompatible types in comparison expression (different base types): drivers/iommu/virtio-iommu.c:1044:9: sparse: restricted __le32 * drivers/iommu/virtio-iommu.c:1044:9: sparse: unsigned int * drivers/iommu/virtio-iommu.c:1048:9: sparse: sparse: incompatible types in comparison expression (different base types): drivers/iommu/virtio-iommu.c:1048:9: sparse: restricted __le32 * drivers/iommu/virtio-iommu.c:1048:9: sparse: unsigned int * drivers/iommu/virtio-iommu.c:1052:9: sparse: sparse: incompatible types in comparison expression (different base types): drivers/iommu/virtio-iommu.c:1052:9: sparse: restricted __le32 * drivers/iommu/virtio-iommu.c:1052:9: sparse: unsigned int * Although virtio_cread() does convert virtio-endian (in our case little-endian) to cpu-endian, the typecheck() needs the two arguments to have the same endianness. Do as UAPI headers of other virtio devices do, and remove the endian annotation from the device config. Even though we change the UAPI this shouldn't cause any regression since QEMU, the existing implementation of virtio-iommu that uses this header, already removes the annotations when importing headers. Reported-by: kbuild test robot <lkp@intel.com> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org> Link: https://lore.kernel.org/r/20200326093558.2641019-2-jean-philippe@linaro.org Signed-off-by: Joerg Roedel <jroedel@suse.de>
166 lines
3.7 KiB
C
166 lines
3.7 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause */
|
|
/*
|
|
* Virtio-iommu definition v0.12
|
|
*
|
|
* Copyright (C) 2019 Arm Ltd.
|
|
*/
|
|
#ifndef _UAPI_LINUX_VIRTIO_IOMMU_H
|
|
#define _UAPI_LINUX_VIRTIO_IOMMU_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
/* Feature bits */
|
|
#define VIRTIO_IOMMU_F_INPUT_RANGE 0
|
|
#define VIRTIO_IOMMU_F_DOMAIN_RANGE 1
|
|
#define VIRTIO_IOMMU_F_MAP_UNMAP 2
|
|
#define VIRTIO_IOMMU_F_BYPASS 3
|
|
#define VIRTIO_IOMMU_F_PROBE 4
|
|
#define VIRTIO_IOMMU_F_MMIO 5
|
|
|
|
struct virtio_iommu_range_64 {
|
|
__u64 start;
|
|
__u64 end;
|
|
};
|
|
|
|
struct virtio_iommu_range_32 {
|
|
__u32 start;
|
|
__u32 end;
|
|
};
|
|
|
|
struct virtio_iommu_config {
|
|
/* Supported page sizes */
|
|
__u64 page_size_mask;
|
|
/* Supported IOVA range */
|
|
struct virtio_iommu_range_64 input_range;
|
|
/* Max domain ID size */
|
|
struct virtio_iommu_range_32 domain_range;
|
|
/* Probe buffer size */
|
|
__u32 probe_size;
|
|
};
|
|
|
|
/* Request types */
|
|
#define VIRTIO_IOMMU_T_ATTACH 0x01
|
|
#define VIRTIO_IOMMU_T_DETACH 0x02
|
|
#define VIRTIO_IOMMU_T_MAP 0x03
|
|
#define VIRTIO_IOMMU_T_UNMAP 0x04
|
|
#define VIRTIO_IOMMU_T_PROBE 0x05
|
|
|
|
/* Status types */
|
|
#define VIRTIO_IOMMU_S_OK 0x00
|
|
#define VIRTIO_IOMMU_S_IOERR 0x01
|
|
#define VIRTIO_IOMMU_S_UNSUPP 0x02
|
|
#define VIRTIO_IOMMU_S_DEVERR 0x03
|
|
#define VIRTIO_IOMMU_S_INVAL 0x04
|
|
#define VIRTIO_IOMMU_S_RANGE 0x05
|
|
#define VIRTIO_IOMMU_S_NOENT 0x06
|
|
#define VIRTIO_IOMMU_S_FAULT 0x07
|
|
#define VIRTIO_IOMMU_S_NOMEM 0x08
|
|
|
|
struct virtio_iommu_req_head {
|
|
__u8 type;
|
|
__u8 reserved[3];
|
|
};
|
|
|
|
struct virtio_iommu_req_tail {
|
|
__u8 status;
|
|
__u8 reserved[3];
|
|
};
|
|
|
|
struct virtio_iommu_req_attach {
|
|
struct virtio_iommu_req_head head;
|
|
__le32 domain;
|
|
__le32 endpoint;
|
|
__u8 reserved[8];
|
|
struct virtio_iommu_req_tail tail;
|
|
};
|
|
|
|
struct virtio_iommu_req_detach {
|
|
struct virtio_iommu_req_head head;
|
|
__le32 domain;
|
|
__le32 endpoint;
|
|
__u8 reserved[8];
|
|
struct virtio_iommu_req_tail tail;
|
|
};
|
|
|
|
#define VIRTIO_IOMMU_MAP_F_READ (1 << 0)
|
|
#define VIRTIO_IOMMU_MAP_F_WRITE (1 << 1)
|
|
#define VIRTIO_IOMMU_MAP_F_MMIO (1 << 2)
|
|
|
|
#define VIRTIO_IOMMU_MAP_F_MASK (VIRTIO_IOMMU_MAP_F_READ | \
|
|
VIRTIO_IOMMU_MAP_F_WRITE | \
|
|
VIRTIO_IOMMU_MAP_F_MMIO)
|
|
|
|
struct virtio_iommu_req_map {
|
|
struct virtio_iommu_req_head head;
|
|
__le32 domain;
|
|
__le64 virt_start;
|
|
__le64 virt_end;
|
|
__le64 phys_start;
|
|
__le32 flags;
|
|
struct virtio_iommu_req_tail tail;
|
|
};
|
|
|
|
struct virtio_iommu_req_unmap {
|
|
struct virtio_iommu_req_head head;
|
|
__le32 domain;
|
|
__le64 virt_start;
|
|
__le64 virt_end;
|
|
__u8 reserved[4];
|
|
struct virtio_iommu_req_tail tail;
|
|
};
|
|
|
|
#define VIRTIO_IOMMU_PROBE_T_NONE 0
|
|
#define VIRTIO_IOMMU_PROBE_T_RESV_MEM 1
|
|
|
|
#define VIRTIO_IOMMU_PROBE_T_MASK 0xfff
|
|
|
|
struct virtio_iommu_probe_property {
|
|
__le16 type;
|
|
__le16 length;
|
|
};
|
|
|
|
#define VIRTIO_IOMMU_RESV_MEM_T_RESERVED 0
|
|
#define VIRTIO_IOMMU_RESV_MEM_T_MSI 1
|
|
|
|
struct virtio_iommu_probe_resv_mem {
|
|
struct virtio_iommu_probe_property head;
|
|
__u8 subtype;
|
|
__u8 reserved[3];
|
|
__le64 start;
|
|
__le64 end;
|
|
};
|
|
|
|
struct virtio_iommu_req_probe {
|
|
struct virtio_iommu_req_head head;
|
|
__le32 endpoint;
|
|
__u8 reserved[64];
|
|
|
|
__u8 properties[];
|
|
|
|
/*
|
|
* Tail follows the variable-length properties array. No padding,
|
|
* property lengths are all aligned on 8 bytes.
|
|
*/
|
|
};
|
|
|
|
/* Fault types */
|
|
#define VIRTIO_IOMMU_FAULT_R_UNKNOWN 0
|
|
#define VIRTIO_IOMMU_FAULT_R_DOMAIN 1
|
|
#define VIRTIO_IOMMU_FAULT_R_MAPPING 2
|
|
|
|
#define VIRTIO_IOMMU_FAULT_F_READ (1 << 0)
|
|
#define VIRTIO_IOMMU_FAULT_F_WRITE (1 << 1)
|
|
#define VIRTIO_IOMMU_FAULT_F_EXEC (1 << 2)
|
|
#define VIRTIO_IOMMU_FAULT_F_ADDRESS (1 << 8)
|
|
|
|
struct virtio_iommu_fault {
|
|
__u8 reason;
|
|
__u8 reserved[3];
|
|
__le32 flags;
|
|
__le32 endpoint;
|
|
__u8 reserved2[4];
|
|
__le64 address;
|
|
};
|
|
|
|
#endif
|