From: Saeed Mahameed <saeed@kernel.org>
To: Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Leon Romanovsky <leonro@nvidia.com>,
Jason Gunthorpe <jgg@nvidia.com>, Jiri Pirko <jiri@nvidia.com>,
Leonid Bloch <lbloch@nvidia.com>,
Itay Avraham <itayavr@nvidia.com>,
Jakub Kicinski <kuba@kernel.org>,
Saeed Mahameed <saeedm@nvidia.com>,
David Ahern <dsahern@kernel.org>,
Aron Silverton <aron.silverton@oracle.com>,
Christoph Hellwig <hch@infradead.org>,
andrew.gospodarek@broadcom.com, linux-kernel@vger.kernel.org
Subject: [PATCH V4 4/5] misc: mlx5ctl: Add command rpc ioctl
Date: Tue, 6 Feb 2024 23:24:34 -0800 [thread overview]
Message-ID: <20240207072435.14182-5-saeed@kernel.org> (raw)
In-Reply-To: <20240207072435.14182-1-saeed@kernel.org>
From: Saeed Mahameed <saeedm@nvidia.com>
Add new IOCTL to allow user space to send device debug rpcs and
attach the user's uctx UID to each rpc.
In the mlx5 architecture the FW RPC commands are of the format of
inbox and outbox buffers. The inbox buffer contains the command
rpc layout as described in the ConnectX Programmers Reference Manual
(PRM) document and as defined in include/linux/mlx5/mlx5_ifc.h.
On success the user outbox buffer will be filled with the device's rpc
response.
For example to query device capabilities:
a user fills out an inbox buffer with the inbox layout:
struct mlx5_ifc_query_hca_cap_in_bits
and expects an outbox buffer with the layout:
struct mlx5_ifc_cmd_hca_cap_bits
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
---
drivers/misc/mlx5ctl/main.c | 98 +++++++++++++++++++++++++++++++++++++
include/uapi/misc/mlx5ctl.h | 12 +++++
2 files changed, 110 insertions(+)
diff --git a/drivers/misc/mlx5ctl/main.c b/drivers/misc/mlx5ctl/main.c
index e4e70359dbe8..c02b80efffc1 100644
--- a/drivers/misc/mlx5ctl/main.c
+++ b/drivers/misc/mlx5ctl/main.c
@@ -245,6 +245,94 @@ static int mlx5ctl_info_ioctl(struct file *file,
return err;
}
+struct mlx5_ifc_mbox_in_hdr_bits {
+ u8 opcode[0x10];
+ u8 uid[0x10];
+
+ u8 reserved_at_20[0x10];
+ u8 op_mod[0x10];
+
+ u8 reserved_at_40[0x40];
+};
+
+struct mlx5_ifc_mbox_out_hdr_bits {
+ u8 status[0x8];
+ u8 reserved_at_8[0x18];
+
+ u8 syndrome[0x20];
+
+ u8 reserved_at_40[0x40];
+};
+
+static int mlx5ctl_cmdrpc_ioctl(struct file *file,
+ struct mlx5ctl_cmdrpc __user *arg,
+ size_t usize)
+{
+ size_t ksize = sizeof(struct mlx5ctl_cmdrpc);
+ struct mlx5ctl_fd *mfd = file->private_data;
+ struct mlx5ctl_dev *mcdev = mfd->mcdev;
+ struct mlx5ctl_cmdrpc *rpc = NULL;
+ void *in = NULL, *out = NULL;
+ int err;
+
+ if (usize < ksize)
+ return -EINVAL;
+
+ rpc = kzalloc(ksize, GFP_KERNEL);
+ if (!rpc)
+ return -ENOMEM;
+
+ err = copy_from_user(rpc, arg, usize);
+ if (err)
+ goto out;
+
+ mlx5ctl_dbg(mcdev, "[UID %d] cmdrpc: inlen %d outlen %d\n",
+ mfd->uctx_uid, rpc->inlen, rpc->outlen);
+
+ if (rpc->inlen < MLX5_ST_SZ_BYTES(mbox_in_hdr) ||
+ rpc->outlen < MLX5_ST_SZ_BYTES(mbox_out_hdr) ||
+ rpc->inlen > MLX5CTL_MAX_RPC_SIZE ||
+ rpc->outlen > MLX5CTL_MAX_RPC_SIZE) {
+ err = -EINVAL;
+ goto out;
+ }
+
+ in = memdup_user(u64_to_user_ptr(rpc->in), rpc->inlen);
+ if (IS_ERR(in)) {
+ err = PTR_ERR(in);
+ goto out;
+ }
+
+ out = kvzalloc(rpc->outlen, GFP_KERNEL);
+ if (!out) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ mlx5ctl_dbg(mcdev, "[UID %d] cmdif: opcode 0x%x inlen %d outlen %d\n",
+ mfd->uctx_uid,
+ MLX5_GET(mbox_in_hdr, in, opcode), rpc->inlen, rpc->outlen);
+
+ MLX5_SET(mbox_in_hdr, in, uid, mfd->uctx_uid);
+ err = mlx5_cmd_do(mcdev->mdev, in, rpc->inlen, out, rpc->outlen);
+ mlx5ctl_dbg(mcdev, "[UID %d] cmdif: opcode 0x%x retval %d\n",
+ mfd->uctx_uid,
+ MLX5_GET(mbox_in_hdr, in, opcode), err);
+
+ /* -EREMOTEIO means outbox is valid, but out.status is not */
+ if (!err || err == -EREMOTEIO) {
+ err = 0;
+ if (copy_to_user(u64_to_user_ptr(rpc->out), out, rpc->outlen))
+ err = -EFAULT;
+ }
+
+out:
+ kvfree(out);
+ kfree(in);
+ kfree(rpc);
+ return err;
+}
+
static long mlx5ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct mlx5ctl_fd *mfd = file->private_data;
@@ -270,6 +358,10 @@ static long mlx5ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg
err = mlx5ctl_info_ioctl(file, argp, size);
break;
+ case MLX5CTL_IOCTL_CMDRPC:
+ err = mlx5ctl_cmdrpc_ioctl(file, argp, size);
+ break;
+
default:
mlx5ctl_dbg(mcdev, "Unknown ioctl %x\n", cmd);
err = -ENOTTY;
@@ -328,6 +420,11 @@ static int mlx5ctl_probe(struct auxiliary_device *adev,
goto abort;
}
+ err = sysfs_create_link_nowarn(&mcdev->miscdev.this_device->kobj,
+ &mdev->device->kobj, "mdev");
+ if (err)
+ mlx5ctl_dbg(mcdev, "mlx5ctl: failed to create sysfs link err %d\n", err);
+
mlx5ctl_dbg(mcdev, "probe mdev@%s %s\n",
dev_driver_string(mdev->device),
dev_name(mdev->device));
@@ -348,6 +445,7 @@ static void mlx5ctl_remove(struct auxiliary_device *adev)
struct mlx5_core_dev *mdev = mcdev->mdev;
struct mlx5ctl_fd *mfd, *n;
+ sysfs_remove_link(&mcdev->miscdev.this_device->kobj, "mdev");
misc_deregister(&mcdev->miscdev);
down_write(&mcdev->rw_lock);
diff --git a/include/uapi/misc/mlx5ctl.h b/include/uapi/misc/mlx5ctl.h
index 9be944128025..1e4622c5979f 100644
--- a/include/uapi/misc/mlx5ctl.h
+++ b/include/uapi/misc/mlx5ctl.h
@@ -12,9 +12,21 @@ struct mlx5ctl_info {
__u32 ucap; /* process user capability */
};
+struct mlx5ctl_cmdrpc {
+ __aligned_u64 in; /* RPC inbox buffer user address */
+ __aligned_u64 out; /* RPC outbox buffer user address */
+ __u32 inlen; /* inbox buffer length */
+ __u32 outlen; /* outbox buffer length */
+};
+
+#define MLX5CTL_MAX_RPC_SIZE (512 * 512) /* max FW RPC buffer size 512 blocks of 512 bytes */
+
#define MLX5CTL_IOCTL_MAGIC 0x5c
#define MLX5CTL_IOCTL_INFO \
_IOR(MLX5CTL_IOCTL_MAGIC, 0x0, struct mlx5ctl_info)
+#define MLX5CTL_IOCTL_CMDRPC \
+ _IOWR(MLX5CTL_IOCTL_MAGIC, 0x1, struct mlx5ctl_cmdrpc)
+
#endif /* __MLX5CTL_IOCTL_H__ */
--
2.43.0
next prev parent reply other threads:[~2024-02-07 7:28 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-07 7:24 [PATCH V4 0/5] mlx5 ConnectX control misc driver Saeed Mahameed
2024-02-07 7:24 ` [PATCH V4 1/5] mlx5: Add aux dev for ctl interface Saeed Mahameed
2024-02-07 7:24 ` [PATCH V4 2/5] misc: mlx5ctl: Add mlx5ctl misc driver Saeed Mahameed
2024-02-29 11:44 ` Vegard Nossum
2024-03-02 8:04 ` Saeed Mahameed
2024-02-07 7:24 ` [PATCH V4 3/5] misc: mlx5ctl: Add info ioctl Saeed Mahameed
2024-02-29 11:47 ` Vegard Nossum
2024-03-02 8:03 ` Saeed Mahameed
2024-02-07 7:24 ` Saeed Mahameed [this message]
2024-02-29 11:49 ` [PATCH V4 4/5] misc: mlx5ctl: Add command rpc ioctl Vegard Nossum
2024-03-02 7:48 ` Saeed Mahameed
2024-02-07 7:24 ` [PATCH V4 5/5] misc: mlx5ctl: Add umem reg/unreg ioctl Saeed Mahameed
2024-02-29 11:51 ` Vegard Nossum
2024-02-07 15:03 ` [PATCH V4 0/5] mlx5 ConnectX control misc driver Jakub Kicinski
2024-02-08 5:03 ` Saeed Mahameed
2024-02-09 2:15 ` Jakub Kicinski
2024-02-09 6:55 ` Jiri Pirko
2024-02-09 22:42 ` David Ahern
2024-02-09 22:58 ` Jakub Kicinski
2024-02-10 5:01 ` David Ahern
2024-02-11 11:03 ` Greg Kroah-Hartman
2024-02-11 17:01 ` David Ahern
2024-02-14 20:31 ` David Ahern
2024-02-15 0:46 ` Jason Gunthorpe
2024-02-10 1:01 ` Jason Gunthorpe
2024-02-11 16:59 ` David Ahern
2024-02-14 8:29 ` Christoph Hellwig
2024-02-14 15:48 ` Jakub Kicinski
2024-02-15 7:00 ` Christoph Hellwig
2024-02-15 12:08 ` Jiri Pirko
2024-02-16 1:00 ` Jakub Kicinski
2024-02-16 15:05 ` Jason Gunthorpe
2024-02-15 13:21 ` Jason Gunthorpe
2024-02-16 1:10 ` Jakub Kicinski
2024-02-16 4:20 ` David Ahern
2024-02-16 19:04 ` Jason Gunthorpe
2024-02-14 16:17 ` Andy Gospodarek
2024-02-14 17:57 ` Jason Gunthorpe
2024-02-14 18:11 ` Jakub Kicinski
2024-02-14 18:37 ` Jason Gunthorpe
2024-02-16 1:40 ` Jakub Kicinski
2024-02-16 14:27 ` Jason Gunthorpe
2024-03-04 16:02 ` Jason Gunthorpe
2024-03-22 3:23 ` David Ahern
2024-03-22 7:32 ` Greg Kroah-Hartman
2024-03-22 15:24 ` David Ahern
2024-03-22 15:46 ` Andy Gospodarek
2024-03-22 20:58 ` Jakub Kicinski
2024-03-22 21:18 ` David Ahern
2024-03-22 22:40 ` Jakub Kicinski
2024-03-26 14:57 ` David Ahern
2024-04-01 12:30 ` Leon Romanovsky
2024-04-01 14:50 ` Jakub Kicinski
2024-04-01 18:10 ` Leon Romanovsky
2024-04-01 19:04 ` Jakub Kicinski
2024-04-02 19:20 ` Leon Romanovsky
2024-04-02 18:45 ` Jason Gunthorpe
2024-04-02 21:36 ` Jakub Kicinski
2024-04-02 22:46 ` Jason Gunthorpe
2024-04-02 23:21 ` Jakub Kicinski
2024-04-03 0:15 ` Jakub Kicinski
2024-04-03 6:57 ` Leon Romanovsky
2024-04-02 16:32 ` Edward Cree
2024-04-02 18:40 ` Jason Gunthorpe
2024-04-03 19:28 ` David Ahern
2024-04-04 17:35 ` Edward Cree
2024-04-04 18:33 ` Jason Gunthorpe
2024-04-04 19:31 ` Edward Cree
2024-04-05 11:21 ` Jason Gunthorpe
2024-04-04 19:53 ` Jakub Kicinski
2024-04-04 20:44 ` Jason Gunthorpe
2024-04-04 21:34 ` Jakub Kicinski
2024-04-05 11:13 ` Jason Gunthorpe
2024-04-05 15:38 ` Jakub Kicinski
2024-04-05 17:48 ` Jakub Kicinski
2024-04-08 16:45 ` Jason Gunthorpe
2024-04-08 16:41 ` Jason Gunthorpe
2024-04-04 18:44 ` Andrew Lunn
2024-04-04 20:25 ` Jason Gunthorpe
2024-04-04 20:53 ` Edward Cree
2024-04-05 11:00 ` Jason Gunthorpe
2024-04-02 18:48 ` Leon Romanovsky
2024-04-03 12:26 ` Edward Cree
2024-04-03 19:00 ` Leon Romanovsky
2024-04-03 19:31 ` David Ahern
2024-04-04 0:01 ` Jakub Kicinski
2024-04-04 3:57 ` David Ahern
2024-04-04 12:23 ` Jason Gunthorpe
2024-04-04 14:48 ` Jakub Kicinski
2024-04-04 17:47 ` Jason Gunthorpe
2024-04-04 18:06 ` Edward Cree
2024-04-04 18:35 ` Leon Romanovsky
2024-04-04 19:46 ` Edward Cree
2024-04-05 10:41 ` Leon Romanovsky
2024-04-08 8:02 ` Przemek Kitszel
2024-03-22 21:44 ` Jason Gunthorpe
2024-03-22 22:29 ` Jakub Kicinski
2024-03-23 1:27 ` Saeed Mahameed
2024-03-23 1:33 ` Jason Gunthorpe
2024-03-22 14:53 ` Aron Silverton
2024-04-30 1:36 ` David Ahern
2024-04-30 7:09 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240207072435.14182-5-saeed@kernel.org \
--to=saeed@kernel.org \
--cc=andrew.gospodarek@broadcom.com \
--cc=arnd@arndb.de \
--cc=aron.silverton@oracle.com \
--cc=dsahern@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=hch@infradead.org \
--cc=itayavr@nvidia.com \
--cc=jgg@nvidia.com \
--cc=jiri@nvidia.com \
--cc=kuba@kernel.org \
--cc=lbloch@nvidia.com \
--cc=leonro@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=saeedm@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.