Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ocxl: Add get_metadata IOCTL to share OCXL information to userspace

Some required information is not exposed to userspace currently (eg. the
PASID), pass this information back, along with other information which
is currently communicated via sysfs, which saves some parsing effort in
userspace.

Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
Acked-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Acked-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Alastair D'Silva and committed by
Michael Ellerman
07c5ccd7 cd4a6f3a

+44
+27
drivers/misc/ocxl/file.c
··· 102 102 return rc; 103 103 } 104 104 105 + static long afu_ioctl_get_metadata(struct ocxl_context *ctx, 106 + struct ocxl_ioctl_metadata __user *uarg) 107 + { 108 + struct ocxl_ioctl_metadata arg; 109 + 110 + memset(&arg, 0, sizeof(arg)); 111 + 112 + arg.version = 0; 113 + 114 + arg.afu_version_major = ctx->afu->config.version_major; 115 + arg.afu_version_minor = ctx->afu->config.version_minor; 116 + arg.pasid = ctx->pasid; 117 + arg.pp_mmio_size = ctx->afu->config.pp_mmio_stride; 118 + arg.global_mmio_size = ctx->afu->config.global_mmio_size; 119 + 120 + if (copy_to_user(uarg, &arg, sizeof(arg))) 121 + return -EFAULT; 122 + 123 + return 0; 124 + } 125 + 105 126 #define CMD_STR(x) (x == OCXL_IOCTL_ATTACH ? "ATTACH" : \ 106 127 x == OCXL_IOCTL_IRQ_ALLOC ? "IRQ_ALLOC" : \ 107 128 x == OCXL_IOCTL_IRQ_FREE ? "IRQ_FREE" : \ 108 129 x == OCXL_IOCTL_IRQ_SET_FD ? "IRQ_SET_FD" : \ 130 + x == OCXL_IOCTL_GET_METADATA ? "GET_METADATA" : \ 109 131 "UNKNOWN") 110 132 111 133 static long afu_ioctl(struct file *file, unsigned int cmd, ··· 179 157 return -EINVAL; 180 158 rc = ocxl_afu_irq_set_fd(ctx, irq_fd.irq_offset, 181 159 irq_fd.eventfd); 160 + break; 161 + 162 + case OCXL_IOCTL_GET_METADATA: 163 + rc = afu_ioctl_get_metadata(ctx, 164 + (struct ocxl_ioctl_metadata __user *) args); 182 165 break; 183 166 184 167 default:
+17
include/uapi/misc/ocxl.h
··· 32 32 __u64 reserved3; 33 33 }; 34 34 35 + struct ocxl_ioctl_metadata { 36 + __u16 version; // struct version, always backwards compatible 37 + 38 + // Version 0 fields 39 + __u8 afu_version_major; 40 + __u8 afu_version_minor; 41 + __u32 pasid; // PASID assigned to the current context 42 + 43 + __u64 pp_mmio_size; // Per PASID MMIO size 44 + __u64 global_mmio_size; 45 + 46 + // End version 0 fields 47 + 48 + __u64 reserved[13]; // Total of 16*u64 49 + }; 50 + 35 51 struct ocxl_ioctl_irq_fd { 36 52 __u64 irq_offset; 37 53 __s32 eventfd; ··· 61 45 #define OCXL_IOCTL_IRQ_ALLOC _IOR(OCXL_MAGIC, 0x11, __u64) 62 46 #define OCXL_IOCTL_IRQ_FREE _IOW(OCXL_MAGIC, 0x12, __u64) 63 47 #define OCXL_IOCTL_IRQ_SET_FD _IOW(OCXL_MAGIC, 0x13, struct ocxl_ioctl_irq_fd) 48 + #define OCXL_IOCTL_GET_METADATA _IOR(OCXL_MAGIC, 0x14, struct ocxl_ioctl_metadata) 64 49 65 50 #endif /* _UAPI_MISC_OCXL_H */