History

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.

Alastair D'Silva committed 8 years ago

Commit 07c5ccd1 parent cd4a6f32 files · +44 −0Browse files

Unified · Split

2 files
  1. drivers/misc/ocxl/file.c +27 −0
  2. include/uapi/misc/ocxl.h +17 −0
drivers/misc/ocxl/file.c+27−0
@@ -102,10 +102,32 @@ static long afu_ioctl_attach(struct ocxl_context *ctx, · 101 unmodified lines
102102 return rc;
103103 }
104104
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+
105126 #define CMD_STR(x) (x == OCXL_IOCTL_ATTACH ? "ATTACH" : \
106127 x == OCXL_IOCTL_IRQ_ALLOC ? "IRQ_ALLOC" : \
107128 x == OCXL_IOCTL_IRQ_FREE ? "IRQ_FREE" : \
108129 x == OCXL_IOCTL_IRQ_SET_FD ? "IRQ_SET_FD" : \
130+ x == OCXL_IOCTL_GET_METADATA ? "GET_METADATA" : \
109131 "UNKNOWN")
110132
111133 static long afu_ioctl(struct file *file, unsigned int cmd,
@@ -159,6 +181,11 @@ static long afu_ioctl(struct file *file, unsigned int cmd, · 47 unmodified lines
159181 irq_fd.eventfd);
160182 break;
161183
184+ case OCXL_IOCTL_GET_METADATA:
185+ rc = afu_ioctl_get_metadata(ctx,
186+ (struct ocxl_ioctl_metadata __user *) args);
187+ break;
188+
162189 default:
163190 rc = -EINVAL;
164191 }
include/uapi/misc/ocxl.h+17−0
@@ -32,6 +32,22 @@ struct ocxl_ioctl_attach { · 31 unmodified lines
3232 __u64 reserved3;
3333 };
3434
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+
3551 struct ocxl_ioctl_irq_fd {
3652 __u64 irq_offset;
3753 __s32 eventfd;
@@ -45,5 +61,6 @@ struct ocxl_ioctl_irq_fd { · 7 unmodified lines
4561 #define OCXL_IOCTL_IRQ_ALLOC _IOR(OCXL_MAGIC, 0x11, __u64)
4662 #define OCXL_IOCTL_IRQ_FREE _IOW(OCXL_MAGIC, 0x12, __u64)
4763 #define OCXL_IOCTL_IRQ_SET_FD _IOW(OCXL_MAGIC, 0x13, struct ocxl_ioctl_irq_fd)
64+#define OCXL_IOCTL_GET_METADATA _IOR(OCXL_MAGIC, 0x14, struct ocxl_ioctl_metadata)
4865
4966 #endif /* _UAPI_MISC_OCXL_H */