b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 1) /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 2) /*
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 3) * This is a module to test the HMM (Heterogeneous Memory Management) API
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 4) * of the kernel. It allows a userspace program to expose its entire address
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 5) * space through the HMM test module device file.
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 6) */
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 7) #ifndef _LIB_TEST_HMM_UAPI_H
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 8) #define _LIB_TEST_HMM_UAPI_H
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 9)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 10) #include <linux/types.h>
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 11) #include <linux/ioctl.h>
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 12)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 13) /*
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 14) * Structure to pass to the HMM test driver to mimic a device accessing
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 15) * system memory and ZONE_DEVICE private memory through device page tables.
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 16) *
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 17) * @addr: (in) user address the device will read/write
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 18) * @ptr: (in) user address where device data is copied to/from
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 19) * @npages: (in) number of pages to read/write
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 20) * @cpages: (out) number of pages copied
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 21) * @faults: (out) number of device page faults seen
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 22) */
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 23) struct hmm_dmirror_cmd {
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 24) __u64 addr;
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 25) __u64 ptr;
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 26) __u64 npages;
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 27) __u64 cpages;
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 28) __u64 faults;
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 29) };
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 30)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 31) /* Expose the address space of the calling process through hmm device file */
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 32) #define HMM_DMIRROR_READ _IOWR('H', 0x00, struct hmm_dmirror_cmd)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 33) #define HMM_DMIRROR_WRITE _IOWR('H', 0x01, struct hmm_dmirror_cmd)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 34) #define HMM_DMIRROR_MIGRATE _IOWR('H', 0x02, struct hmm_dmirror_cmd)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 35) #define HMM_DMIRROR_SNAPSHOT _IOWR('H', 0x03, struct hmm_dmirror_cmd)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 36)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 37) /*
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 38) * Values returned in hmm_dmirror_cmd.ptr for HMM_DMIRROR_SNAPSHOT.
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 39) * HMM_DMIRROR_PROT_ERROR: no valid mirror PTE for this page
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 40) * HMM_DMIRROR_PROT_NONE: unpopulated PTE or PTE with no access
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 41) * HMM_DMIRROR_PROT_READ: read-only PTE
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 42) * HMM_DMIRROR_PROT_WRITE: read/write PTE
e478425bec930 (Ralph Campbell 2020-07-01 15:53:52 -0700 43) * HMM_DMIRROR_PROT_PMD: PMD sized page is fully mapped by same permissions
e478425bec930 (Ralph Campbell 2020-07-01 15:53:52 -0700 44) * HMM_DMIRROR_PROT_PUD: PUD sized page is fully mapped by same permissions
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 45) * HMM_DMIRROR_PROT_ZERO: special read-only zero page
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 46) * HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL: Migrated device private page on the
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 47) * device the ioctl() is made
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 48) * HMM_DMIRROR_PROT_DEV_PRIVATE_REMOTE: Migrated device private page on some
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 49) * other device
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 50) */
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 51) enum {
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 52) HMM_DMIRROR_PROT_ERROR = 0xFF,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 53) HMM_DMIRROR_PROT_NONE = 0x00,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 54) HMM_DMIRROR_PROT_READ = 0x01,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 55) HMM_DMIRROR_PROT_WRITE = 0x02,
e478425bec930 (Ralph Campbell 2020-07-01 15:53:52 -0700 56) HMM_DMIRROR_PROT_PMD = 0x04,
e478425bec930 (Ralph Campbell 2020-07-01 15:53:52 -0700 57) HMM_DMIRROR_PROT_PUD = 0x08,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 58) HMM_DMIRROR_PROT_ZERO = 0x10,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 59) HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL = 0x20,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 60) HMM_DMIRROR_PROT_DEV_PRIVATE_REMOTE = 0x30,
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 61) };
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 62)
b2ef9f5a5cb37 (Ralph Campbell 2020-04-22 12:50:26 -0700 63) #endif /* _LIB_TEST_HMM_UAPI_H */