162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (c) 2021-2022, NVIDIA CORPORATION & AFFILIATES. 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci#ifndef _UAPI_IOMMUFD_TEST_H 562306a36Sopenharmony_ci#define _UAPI_IOMMUFD_TEST_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/types.h> 862306a36Sopenharmony_ci#include <linux/iommufd.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cienum { 1162306a36Sopenharmony_ci IOMMU_TEST_OP_ADD_RESERVED = 1, 1262306a36Sopenharmony_ci IOMMU_TEST_OP_MOCK_DOMAIN, 1362306a36Sopenharmony_ci IOMMU_TEST_OP_MD_CHECK_MAP, 1462306a36Sopenharmony_ci IOMMU_TEST_OP_MD_CHECK_REFS, 1562306a36Sopenharmony_ci IOMMU_TEST_OP_CREATE_ACCESS, 1662306a36Sopenharmony_ci IOMMU_TEST_OP_DESTROY_ACCESS_PAGES, 1762306a36Sopenharmony_ci IOMMU_TEST_OP_ACCESS_PAGES, 1862306a36Sopenharmony_ci IOMMU_TEST_OP_ACCESS_RW, 1962306a36Sopenharmony_ci IOMMU_TEST_OP_SET_TEMP_MEMORY_LIMIT, 2062306a36Sopenharmony_ci IOMMU_TEST_OP_MOCK_DOMAIN_REPLACE, 2162306a36Sopenharmony_ci IOMMU_TEST_OP_ACCESS_REPLACE_IOAS, 2262306a36Sopenharmony_ci}; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cienum { 2562306a36Sopenharmony_ci MOCK_APERTURE_START = 1UL << 24, 2662306a36Sopenharmony_ci MOCK_APERTURE_LAST = (1UL << 31) - 1, 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cienum { 3062306a36Sopenharmony_ci MOCK_FLAGS_ACCESS_WRITE = 1 << 0, 3162306a36Sopenharmony_ci MOCK_FLAGS_ACCESS_SYZ = 1 << 16, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cienum { 3562306a36Sopenharmony_ci MOCK_ACCESS_RW_WRITE = 1 << 0, 3662306a36Sopenharmony_ci MOCK_ACCESS_RW_SLOW_PATH = 1 << 2, 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cienum { 4062306a36Sopenharmony_ci MOCK_FLAGS_ACCESS_CREATE_NEEDS_PIN_PAGES = 1 << 0, 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct iommu_test_cmd { 4462306a36Sopenharmony_ci __u32 size; 4562306a36Sopenharmony_ci __u32 op; 4662306a36Sopenharmony_ci __u32 id; 4762306a36Sopenharmony_ci __u32 __reserved; 4862306a36Sopenharmony_ci union { 4962306a36Sopenharmony_ci struct { 5062306a36Sopenharmony_ci __aligned_u64 start; 5162306a36Sopenharmony_ci __aligned_u64 length; 5262306a36Sopenharmony_ci } add_reserved; 5362306a36Sopenharmony_ci struct { 5462306a36Sopenharmony_ci __u32 out_stdev_id; 5562306a36Sopenharmony_ci __u32 out_hwpt_id; 5662306a36Sopenharmony_ci /* out_idev_id is the standard iommufd_bind object */ 5762306a36Sopenharmony_ci __u32 out_idev_id; 5862306a36Sopenharmony_ci } mock_domain; 5962306a36Sopenharmony_ci struct { 6062306a36Sopenharmony_ci __u32 pt_id; 6162306a36Sopenharmony_ci } mock_domain_replace; 6262306a36Sopenharmony_ci struct { 6362306a36Sopenharmony_ci __aligned_u64 iova; 6462306a36Sopenharmony_ci __aligned_u64 length; 6562306a36Sopenharmony_ci __aligned_u64 uptr; 6662306a36Sopenharmony_ci } check_map; 6762306a36Sopenharmony_ci struct { 6862306a36Sopenharmony_ci __aligned_u64 length; 6962306a36Sopenharmony_ci __aligned_u64 uptr; 7062306a36Sopenharmony_ci __u32 refs; 7162306a36Sopenharmony_ci } check_refs; 7262306a36Sopenharmony_ci struct { 7362306a36Sopenharmony_ci __u32 out_access_fd; 7462306a36Sopenharmony_ci __u32 flags; 7562306a36Sopenharmony_ci } create_access; 7662306a36Sopenharmony_ci struct { 7762306a36Sopenharmony_ci __u32 access_pages_id; 7862306a36Sopenharmony_ci } destroy_access_pages; 7962306a36Sopenharmony_ci struct { 8062306a36Sopenharmony_ci __u32 flags; 8162306a36Sopenharmony_ci __u32 out_access_pages_id; 8262306a36Sopenharmony_ci __aligned_u64 iova; 8362306a36Sopenharmony_ci __aligned_u64 length; 8462306a36Sopenharmony_ci __aligned_u64 uptr; 8562306a36Sopenharmony_ci } access_pages; 8662306a36Sopenharmony_ci struct { 8762306a36Sopenharmony_ci __aligned_u64 iova; 8862306a36Sopenharmony_ci __aligned_u64 length; 8962306a36Sopenharmony_ci __aligned_u64 uptr; 9062306a36Sopenharmony_ci __u32 flags; 9162306a36Sopenharmony_ci } access_rw; 9262306a36Sopenharmony_ci struct { 9362306a36Sopenharmony_ci __u32 limit; 9462306a36Sopenharmony_ci } memory_limit; 9562306a36Sopenharmony_ci struct { 9662306a36Sopenharmony_ci __u32 ioas_id; 9762306a36Sopenharmony_ci } access_replace_ioas; 9862306a36Sopenharmony_ci }; 9962306a36Sopenharmony_ci __u32 last; 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci#define IOMMU_TEST_CMD _IO(IOMMUFD_TYPE, IOMMUFD_CMD_BASE + 32) 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/* Mock structs for IOMMU_DEVICE_GET_HW_INFO ioctl */ 10462306a36Sopenharmony_ci#define IOMMU_HW_INFO_TYPE_SELFTEST 0xfeedbeef 10562306a36Sopenharmony_ci#define IOMMU_HW_INFO_SELFTEST_REGVAL 0xdeadbeef 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct iommu_test_hw_info { 10862306a36Sopenharmony_ci __u32 flags; 10962306a36Sopenharmony_ci __u32 test_reg; 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#endif 113