Given a file descriptor on an afu device, libcxl currently uses the major/minor number obtained from fstat on the fd to construct path to the afu's sysfs directory. However it is possible that rather than using one of the device in /dev/cxl, a kernel driver creates its own device which export generic cxl interface to the userspace. This causes problems with libcxl as it tries to use a wrong major/minor number to construct the sysfs path and fail. So this patch introduces a new ioctl called CXL_IOCTL_GET_AFU_ID on the afu file descriptor to fetch the cxl_afu_id struct that holds the card/offset-id and mode information. These info is then used by libcxl to construct the correct path to the afu sysfs directory. Testing: - Build against pseries be/le configs - Testing with corresponding libcxl changes to verify that it constructs right sysfs path to the afu.
Showing the changes to include/uapi (1 of 3 files). Show all
Unified · Split
| @@ -32,10 +32,32 @@ struct cxl_ioctl_start_work { · 31 unmodified lines | ||
| 32 | 32 | #define CXL_START_WORK_ALL (CXL_START_WORK_AMR |\ |
| 33 | 33 | CXL_START_WORK_NUM_IRQS) |
| 34 | 34 | |
| 35 | + | |
| 36 | +/* Possible modes that an afu can be in */ | |
| 37 | +#define CXL_MODE_DEDICATED 0x1 | |
| 38 | +#define CXL_MODE_DIRECTED 0x2 | |
| 39 | + | |
| 40 | +/* possible flags for the cxl_afu_id flags field */ | |
| 41 | +#define CXL_AFUID_FLAG_SLAVE 0x1 /* In directed-mode afu is in slave mode */ | |
| 42 | + | |
| 43 | +struct cxl_afu_id { | |
| 44 | + __u64 flags; /* One of CXL_AFUID_FLAG_X */ | |
| 45 | + __u32 card_id; | |
| 46 | + __u32 afu_offset; | |
| 47 | + __u32 afu_mode; /* one of the CXL_MODE_X */ | |
| 48 | + __u32 reserved1; | |
| 49 | + __u64 reserved2; | |
| 50 | + __u64 reserved3; | |
| 51 | + __u64 reserved4; | |
| 52 | + __u64 reserved5; | |
| 53 | + __u64 reserved6; | |
| 54 | +}; | |
| 55 | + | |
| 35 | 56 | /* ioctl numbers */ |
| 36 | 57 | #define CXL_MAGIC 0xCA |
| 37 | 58 | #define CXL_IOCTL_START_WORK _IOW(CXL_MAGIC, 0x00, struct cxl_ioctl_start_work) |
| 38 | 59 | #define CXL_IOCTL_GET_PROCESS_ELEMENT _IOR(CXL_MAGIC, 0x01, __u32) |
| 60 | +#define CXL_IOCTL_GET_AFU_ID _IOR(CXL_MAGIC, 0x02, struct cxl_afu_id) | |
| 39 | 61 | |
| 40 | 62 | #define CXL_READ_MIN_SIZE 0x1000 /* 4K */ |
| 41 | 63 | |