| /* | |
| * A test device for IOMMU | |
| * | |
| * Copyright (c) 2026 Phytium Technology | |
| * | |
| * Author: | |
| * Tao Tang <tangtao1634@phytium.com.cn> | |
| * | |
| * SPDX-License-Identifier: GPL-2.0-or-later | |
| */ | |
| #ifndef HW_MISC_IOMMU_TESTDEV_H | |
| #define HW_MISC_IOMMU_TESTDEV_H | |
| #include "hw/pci/pci.h" | |
| #define IOMMU_TESTDEV_VENDOR_ID PCI_VENDOR_ID_REDHAT | |
| #define IOMMU_TESTDEV_DEVICE_ID PCI_DEVICE_ID_REDHAT_TEST | |
| /* DMA_ATTRS register bit definitions which shadow some fields in MemTxAttrs */ | |
| #define ITD_ATTRS_SECURE_SHIFT 0 | |
| #define ITD_ATTRS_SECURE_MASK 0x1 | |
| #define ITD_ATTRS_SPACE_SHIFT 1 | |
| #define ITD_ATTRS_SPACE_MASK 0x3 | |
| #define ITD_ATTRS_SPACE_VALID_SHIFT 3 | |
| #define ITD_ATTRS_SPACE_VALID_MASK 0x1 | |
| #define ITD_ATTRS_SPACE_SECURE 0 | |
| #define ITD_ATTRS_SPACE_NONSECURE 1 | |
| /* Helper macros for setting fields */ | |
| #define ITD_ATTRS_SET_SECURE(attrs, val) \ | |
| (((attrs) & ~(ITD_ATTRS_SECURE_MASK << ITD_ATTRS_SECURE_SHIFT)) | \ | |
| (((val) & ITD_ATTRS_SECURE_MASK) << ITD_ATTRS_SECURE_SHIFT)) | |
| #define ITD_ATTRS_SET_SPACE(attrs, val) \ | |
| (((attrs) & ~(ITD_ATTRS_SPACE_MASK << ITD_ATTRS_SPACE_SHIFT)) | \ | |
| (((val) & ITD_ATTRS_SPACE_MASK) << ITD_ATTRS_SPACE_SHIFT)) | |
| #define ITD_ATTRS_SET_SPACE_VALID(attrs, val) \ | |
| (((attrs) & ~(ITD_ATTRS_SPACE_VALID_MASK << \ | |
| ITD_ATTRS_SPACE_VALID_SHIFT)) | \ | |
| (((val) & ITD_ATTRS_SPACE_VALID_MASK) << \ | |
| ITD_ATTRS_SPACE_VALID_SHIFT)) | |
| /* Helper macros for getting fields */ | |
| #define ITD_ATTRS_GET_SECURE(attrs) \ | |
| (((attrs) >> ITD_ATTRS_SECURE_SHIFT) & ITD_ATTRS_SECURE_MASK) | |
| #define ITD_ATTRS_GET_SPACE(attrs) \ | |
| (((attrs) >> ITD_ATTRS_SPACE_SHIFT) & ITD_ATTRS_SPACE_MASK) | |
| #define ITD_ATTRS_GET_SPACE_VALID(attrs) \ | |
| (((attrs) >> ITD_ATTRS_SPACE_VALID_SHIFT) & \ | |
| ITD_ATTRS_SPACE_VALID_MASK) | |
| /* DMA result/status values shared with tests */ | |
| #define ITD_DMA_RESULT_IDLE 0xffffffffu | |
| #define ITD_DMA_RESULT_BUSY 0xfffffffeu | |
| #define ITD_DMA_ERR_BAD_LEN 0xdead0001u | |
| #define ITD_DMA_ERR_TX_FAIL 0xdead0002u | |
| #define ITD_DMA_ERR_RD_FAIL 0xdead0003u | |
| #define ITD_DMA_ERR_MISMATCH 0xdead0004u | |
| #define ITD_DMA_ERR_NOT_ARMED 0xdead0005u | |
| #define ITD_DMA_ERR_BAD_ATTRS 0xdead0006u | |
| #define ITD_DMA_WRITE_VAL 0x12345678u | |
| /* DMA doorbell bits */ | |
| #define ITD_DMA_DBELL_ARM 0x1u | |
| /* BAR0 layout of iommu-testdev */ | |
| enum { | |
| ITD_REG_DMA_TRIGGERING = 0x00, | |
| ITD_REG_DMA_GVA_LO = 0x04, | |
| ITD_REG_DMA_GVA_HI = 0x08, | |
| ITD_REG_DMA_LEN = 0x0c, | |
| ITD_REG_DMA_RESULT = 0x10, | |
| ITD_REG_DMA_DBELL = 0x14, | |
| /* [0] secure,[2:1] ArmSecuritySpace,[3] space_valid */ | |
| ITD_REG_DMA_ATTRS = 0x18, | |
| ITD_REG_DMA_GPA_LO = 0x1c, | |
| ITD_REG_DMA_GPA_HI = 0x20, | |
| BAR0_SIZE = 0x1000, | |
| }; | |
| #endif /* HW_MISC_IOMMU_TESTDEV_H */ |