mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
e1fa6640d5
Allow to test whether IOTLB has been invalidated or not. Link: https://lore.kernel.org/r/20240111041015.47920-6-yi.l.liu@intel.com Reviewed-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Yi Liu <yi.l.liu@intel.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
175 lines
3.7 KiB
C
175 lines
3.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES.
|
|
*/
|
|
#ifndef _UAPI_IOMMUFD_TEST_H
|
|
#define _UAPI_IOMMUFD_TEST_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/iommufd.h>
|
|
|
|
enum {
|
|
IOMMU_TEST_OP_ADD_RESERVED = 1,
|
|
IOMMU_TEST_OP_MOCK_DOMAIN,
|
|
IOMMU_TEST_OP_MD_CHECK_MAP,
|
|
IOMMU_TEST_OP_MD_CHECK_REFS,
|
|
IOMMU_TEST_OP_CREATE_ACCESS,
|
|
IOMMU_TEST_OP_DESTROY_ACCESS_PAGES,
|
|
IOMMU_TEST_OP_ACCESS_PAGES,
|
|
IOMMU_TEST_OP_ACCESS_RW,
|
|
IOMMU_TEST_OP_SET_TEMP_MEMORY_LIMIT,
|
|
IOMMU_TEST_OP_MOCK_DOMAIN_REPLACE,
|
|
IOMMU_TEST_OP_ACCESS_REPLACE_IOAS,
|
|
IOMMU_TEST_OP_MOCK_DOMAIN_FLAGS,
|
|
IOMMU_TEST_OP_DIRTY,
|
|
IOMMU_TEST_OP_MD_CHECK_IOTLB,
|
|
};
|
|
|
|
enum {
|
|
MOCK_APERTURE_START = 1UL << 24,
|
|
MOCK_APERTURE_LAST = (1UL << 31) - 1,
|
|
};
|
|
|
|
enum {
|
|
MOCK_FLAGS_ACCESS_WRITE = 1 << 0,
|
|
MOCK_FLAGS_ACCESS_SYZ = 1 << 16,
|
|
};
|
|
|
|
enum {
|
|
MOCK_ACCESS_RW_WRITE = 1 << 0,
|
|
MOCK_ACCESS_RW_SLOW_PATH = 1 << 2,
|
|
};
|
|
|
|
enum {
|
|
MOCK_FLAGS_ACCESS_CREATE_NEEDS_PIN_PAGES = 1 << 0,
|
|
};
|
|
|
|
enum {
|
|
MOCK_FLAGS_DEVICE_NO_DIRTY = 1 << 0,
|
|
};
|
|
|
|
enum {
|
|
MOCK_NESTED_DOMAIN_IOTLB_ID_MAX = 3,
|
|
MOCK_NESTED_DOMAIN_IOTLB_NUM = 4,
|
|
};
|
|
|
|
struct iommu_test_cmd {
|
|
__u32 size;
|
|
__u32 op;
|
|
__u32 id;
|
|
__u32 __reserved;
|
|
union {
|
|
struct {
|
|
__aligned_u64 start;
|
|
__aligned_u64 length;
|
|
} add_reserved;
|
|
struct {
|
|
__u32 out_stdev_id;
|
|
__u32 out_hwpt_id;
|
|
/* out_idev_id is the standard iommufd_bind object */
|
|
__u32 out_idev_id;
|
|
} mock_domain;
|
|
struct {
|
|
__u32 out_stdev_id;
|
|
__u32 out_hwpt_id;
|
|
__u32 out_idev_id;
|
|
/* Expand mock_domain to set mock device flags */
|
|
__u32 dev_flags;
|
|
} mock_domain_flags;
|
|
struct {
|
|
__u32 pt_id;
|
|
} mock_domain_replace;
|
|
struct {
|
|
__aligned_u64 iova;
|
|
__aligned_u64 length;
|
|
__aligned_u64 uptr;
|
|
} check_map;
|
|
struct {
|
|
__aligned_u64 length;
|
|
__aligned_u64 uptr;
|
|
__u32 refs;
|
|
} check_refs;
|
|
struct {
|
|
__u32 out_access_fd;
|
|
__u32 flags;
|
|
} create_access;
|
|
struct {
|
|
__u32 access_pages_id;
|
|
} destroy_access_pages;
|
|
struct {
|
|
__u32 flags;
|
|
__u32 out_access_pages_id;
|
|
__aligned_u64 iova;
|
|
__aligned_u64 length;
|
|
__aligned_u64 uptr;
|
|
} access_pages;
|
|
struct {
|
|
__aligned_u64 iova;
|
|
__aligned_u64 length;
|
|
__aligned_u64 uptr;
|
|
__u32 flags;
|
|
} access_rw;
|
|
struct {
|
|
__u32 limit;
|
|
} memory_limit;
|
|
struct {
|
|
__u32 ioas_id;
|
|
} access_replace_ioas;
|
|
struct {
|
|
__u32 flags;
|
|
__aligned_u64 iova;
|
|
__aligned_u64 length;
|
|
__aligned_u64 page_size;
|
|
__aligned_u64 uptr;
|
|
__aligned_u64 out_nr_dirty;
|
|
} dirty;
|
|
struct {
|
|
__u32 id;
|
|
__u32 iotlb;
|
|
} check_iotlb;
|
|
};
|
|
__u32 last;
|
|
};
|
|
#define IOMMU_TEST_CMD _IO(IOMMUFD_TYPE, IOMMUFD_CMD_BASE + 32)
|
|
|
|
/* Mock structs for IOMMU_DEVICE_GET_HW_INFO ioctl */
|
|
#define IOMMU_HW_INFO_TYPE_SELFTEST 0xfeedbeef
|
|
#define IOMMU_HW_INFO_SELFTEST_REGVAL 0xdeadbeef
|
|
|
|
struct iommu_test_hw_info {
|
|
__u32 flags;
|
|
__u32 test_reg;
|
|
};
|
|
|
|
/* Should not be equal to any defined value in enum iommu_hwpt_data_type */
|
|
#define IOMMU_HWPT_DATA_SELFTEST 0xdead
|
|
#define IOMMU_TEST_IOTLB_DEFAULT 0xbadbeef
|
|
|
|
/**
|
|
* struct iommu_hwpt_selftest
|
|
*
|
|
* @iotlb: default mock iotlb value, IOMMU_TEST_IOTLB_DEFAULT
|
|
*/
|
|
struct iommu_hwpt_selftest {
|
|
__u32 iotlb;
|
|
};
|
|
|
|
/* Should not be equal to any defined value in enum iommu_hwpt_invalidate_data_type */
|
|
#define IOMMU_HWPT_INVALIDATE_DATA_SELFTEST 0xdeadbeef
|
|
#define IOMMU_HWPT_INVALIDATE_DATA_SELFTEST_INVALID 0xdadbeef
|
|
|
|
/**
|
|
* struct iommu_hwpt_invalidate_selftest - Invalidation data for Mock driver
|
|
* (IOMMU_HWPT_INVALIDATE_DATA_SELFTEST)
|
|
* @flags: Invalidate flags
|
|
* @iotlb_id: Invalidate iotlb entry index
|
|
*
|
|
* If IOMMU_TEST_INVALIDATE_ALL is set in @flags, @iotlb_id will be ignored
|
|
*/
|
|
struct iommu_hwpt_invalidate_selftest {
|
|
#define IOMMU_TEST_INVALIDATE_FLAG_ALL (1 << 0)
|
|
__u32 flags;
|
|
__u32 iotlb_id;
|
|
};
|
|
|
|
#endif
|