All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
To: Dave Jiang <dave.jiang@intel.com>
Cc: <linux-cxl@vger.kernel.org>, <dan.j.williams@intel.com>,
	<ira.weiny@intel.com>, <vishal.l.verma@intel.com>,
	<alison.schofield@intel.com>, <dave@stgolabs.net>,
	<jgg@nvidia.com>, <shiju.jose@huawei.com>
Subject: Re: [RFC PATCH v2 15/20] fwctl/cxl: Add support for fwctl RPC command to enable CXL feature commands
Date: Fri, 22 Nov 2024 14:49:23 +0000	[thread overview]
Message-ID: <20241122144923.00007b88@huawei.com> (raw)
In-Reply-To: <20241115212745.869552-16-dave.jiang@intel.com>

On Fri, 15 Nov 2024 14:25:48 -0700
Dave Jiang <dave.jiang@intel.com> wrote:

> fwctl provides a fwctl_ops->fw_rpc() callback in order to issue ioctls
> to a device. The cxl fwctl driver will start by supporting the CXL
> feature commands: Get Supported Features, Get Feature, and Set Feature.
> 
> The fw_rpc() callback provides 'enum fwctl_rpc_scope' parameter where
> it indicates the security scope of the call. The Get Supported Features
> and Get Feature calls can be executed with the scope of
> FWCTL_RPC_DEBUG_READ_ONLY. The Set Feature call is gated by the effects
> of the feature reported by Get Supported Features call for the specific
> feature.
> 
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>

A few comments inline

Jonathan


>  
> -int cxl_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_send_command __user *s)
> +static int cxl_send_cmd(struct cxl_mailbox *cxl_mbox, struct cxl_send_command *send,
> +			struct cxl_mbox_cmd *mbox_cmd)
> +{
> +	int rc;
> +
> +	rc = cxl_validate_cmd_from_user(mbox_cmd, cxl_mbox, send);
> +	if (rc)
> +		return rc;
> +
> +	rc = handle_mailbox_cmd_from_user(cxl_mbox, mbox_cmd, send->out.payload,
> +					  &send->out.size, &send->retval);
> +	if (rc)
> +		return rc;

return handle_mailbox_cmd_from_user()

> +
> +	return 0;
> +}
> +
> +/**
> + * handle_mailbox_cmd_from_fwctl() - Dispatch a mailbox command for userspace.
> + * @cxl_mbox: The mailbox context for the operation.
> + * @mbox_cmd: The validated mailbox command.
> + *
> + * Return:
> + *  * %0	- Mailbox transaction succeeded. This implies the mailbox
> + *		  protocol completed successfully not that the operation itself
> + *		  was successful.
> + *  * %-ENOMEM  - Couldn't allocate a bounce buffer.
> + *  * %-EINTR	- Mailbox acquisition interrupted.
> + *  * %-EXXX	- Transaction level failures.
> + *
> + * Dispatches a mailbox command on behalf of a userspace request.
> + * The output payload is copied to userspace by fwctl.
> + *
> + * See cxl_send_cmd().
> + */
> +static int handle_mailbox_cmd_from_fwctl(struct cxl_mailbox *cxl_mbox,
> +					 struct cxl_mbox_cmd *mbox_cmd)
> +{
> +	struct device *dev = cxl_mbox->host;
Not sure I'd bother for one use.

> +	struct fwctl_rpc_cxl_out *orig_out;
> +	int rc;
> +
> +	/*
> +	 * Save the payload_out pointer and move it to where hardware output
> +	 * can be copied to.
> +	 */
> +	orig_out = mbox_cmd->payload_out;
> +	mbox_cmd->payload_out = (void *)orig_out + sizeof(*orig_out);
Messing around with void * seems awkward.
Isn't this just
	mbox_cmd->payload_out = orig_out + 1;

or (I prefer the above)
	mbox_cmd->payload_out += sizeof(*orig_out);

> +
> +	dev_dbg(dev,
> +		"Submitting %s command for user\n"
> +		"\topcode: %x\n"
> +		"\tsize: %zx\n",
> +		cxl_mem_opcode_to_name(mbox_cmd->opcode),
> +		mbox_cmd->opcode, mbox_cmd->size_in);
> +
> +	rc = cxl_mbox->mbox_send(cxl_mbox, mbox_cmd);
> +	if (rc)
> +		return rc;
> +
> +	orig_out->retval = mbox_cmd->return_code;
> +	mbox_cmd->payload_out = (void *)orig_out;

No need to cast a pointer to void *

> +
> +	return 0;
> +}
> +
> +int cxl_mbox_send_cmd(struct cxl_mailbox *cxl_mbox,
> +		      struct fwctl_rpc_cxl *rpc_in,
> +		      struct cxl_mbox_cmd *mbox_cmd, size_t *out_len)
> +{
> +	struct cxl_send_command send_cmd = {
> +		.id = rpc_in->id,
> +		.flags = rpc_in->flags,
> +		.in.size = rpc_in->op_size,
> +		.in.payload = rpc_in->in_payload,
> +		.out.size = *out_len,
> +	};
> +	struct cxl_mem_command *cmd;
> +	int rc;
> +
> +	cmd = cxl_mem_find_command_by_id(rpc_in->id);
> +	if (!cmd)
> +		return -EINVAL;
> +	send_cmd.raw.opcode = cmd->opcode;
> +
> +	rc = cxl_validate_cmd_from_fwctl(mbox_cmd, cxl_mbox, &send_cmd);

I'd not really expect to see fwctl specific code in a function called
simply cxl_mbox_send_cmd().  Perhaps a rename is appropriate?

> +	if (rc)
> +		return rc;
> +
> +	rc = handle_mailbox_cmd_from_fwctl(cxl_mbox, mbox_cmd);
> +	if (rc)
> +		return rc;
> +
> +	guard(rwsem_read)(&cxl_memdev_rwsem);
> +	rc = cxl_mbox->mbox_send(cxl_mbox, mbox_cmd);
> +	if (rc)
> +		return rc;
> +
> +	*out_len = mbox_cmd->size_out;
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_NS_GPL(cxl_mbox_send_cmd, CXL);

> diff --git a/drivers/fwctl/cxl/cxl.c b/drivers/fwctl/cxl/cxl.c
> index ce8960a9beaa..164f6774a2c1 100644
> --- a/drivers/fwctl/cxl/cxl.c
> +++ b/drivers/fwctl/cxl/cxl.c
> @@ -77,11 +77,106 @@ static void *cxlctl_hw_info(struct fwctl_uctx *uctx, int commands, size_t *out_l
>  	return_ptr(out);
>  }
>  
> +static bool cxlctl_validate_set_features(struct cxl_mailbox *cxl_mbox,
> +					 const struct fwctl_rpc_cxl *rpc_in,
> +					 enum fwctl_rpc_scope scope)
> +{
> +	struct cxl_feat_entry *feat;
> +	bool found = false;
> +	uuid_t uuid;
> +	u16 effects, mask;

Pick an order. Reverse xmas tree maybe.


> +
> +static bool cxlctl_validate_hw_cmds(struct cxl_mailbox *cxl_mbox,
> +				    const struct fwctl_rpc_cxl *rpc_in,
> +				    enum fwctl_rpc_scope scope)
> +{
> +	struct cxl_mem_command *cmd;
> +
> +	/*
> +	 * Only supporting feature commands for now.
> +	 */
> +	if (!cxl_mbox->num_features)
> +		return false;
> +
> +	cmd = cxl_get_mem_command_for_fwctl(cxl_mbox, rpc_in->id);
> +	if (!cmd)
> +		return false;
> +
> +	switch (cmd->opcode) {
> +	case CXL_MBOX_OP_GET_SUPPORTED_FEATURES:
> +		if (scope >= FWCTL_RPC_CONFIGURATION)
> +			return true;
> +		return false;

		return scope >= FWCTL_RFC_CONFIGURATION;

> +	case CXL_MBOX_OP_GET_FEATURE:
> +		if (scope >= FWCTL_RPC_DEBUG_READ_ONLY)
> +			return true;
> +		return false;
		return scope >= FWCTL_RPC_DEBUG_READ_ONLY;

> +	case CXL_MBOX_OP_SET_FEATURE:
> +		return cxlctl_validate_set_features(cxl_mbox, rpc_in, scope);
> +	default:
> +		return false;
> +	}
> +}
> +

>  static const struct fwctl_ops cxlctl_ops = {
> diff --git a/include/cxl/mailbox.h b/include/cxl/mailbox.h
> index e753d5d1d708..3e5e9c9362f5 100644
> --- a/include/cxl/mailbox.h
> +++ b/include/cxl/mailbox.h
> @@ -193,5 +193,11 @@ int cxl_mailbox_init(struct cxl_mailbox *cxl_mbox, struct device *host);
>  int cxl_mailbox_user_commands_supported(struct cxl_mailbox *cxl_mbox);
>  int cxl_mailbox_user_commands_info_get(struct cxl_mailbox *cxl_mbox, int nr_cmds,
>  				       void *outbuf, size_t *out_len);
> +struct cxl_mem_command *cxl_get_mem_command(u32 id);
> +struct cxl_mem_command *
> +cxl_get_mem_command_for_fwctl(struct cxl_mailbox *cxl_mbox, u32 id);
> +int cxl_mbox_send_cmd(struct cxl_mailbox *cxl_mbox,
> +		      struct fwctl_rpc_cxl *rpc_in,
> +		      struct cxl_mbox_cmd *mbox_cmd, size_t *out_len);
>  
>  #endif
> diff --git a/include/uapi/fwctl/cxl.h b/include/uapi/fwctl/cxl.h
> index a32c4c752db6..99804fc72f28 100644
> --- a/include/uapi/fwctl/cxl.h
> +++ b/include/uapi/fwctl/cxl.h


> +/**
> + * struct fwctl_rpc_cxl_out - ioctl9FWCTL_RPC) output for CXL
(FWCTL_RPC)  9/(

> + * @size: Size of the output payload
> + * @retval: Return value from device
> + * @payload: Return data from device
> + */
> +struct fwctl_rpc_cxl_out {
> +	__u32 size;
> +	__u32 retval;
> +	__u8 payload[];
Can we add counted_by to uapi headers?

Seems there are some existing examples so I guess that is fine.

> +};
> +
>  #endif
> diff --git a/include/uapi/linux/cxl_mem.h b/include/uapi/linux/cxl_mem.h
> index 9dd37849c450..4e7c8c03cfe8 100644
> --- a/include/uapi/linux/cxl_mem.h
> +++ b/include/uapi/linux/cxl_mem.h
> @@ -234,4 +234,16 @@ struct cxl_send_command {
>  	} out;
>  };
>  
> +/*
> + * CXL spec r3.1 Table 8-101 Set Feature Input Payload
> + */
> +struct cxl_set_feature_input {
> +	__u8 uuid[16];
> +	__u32 flags;
> +	__u16 offset;
> +	__u8 version;
> +	__u8 reserved[9];

This first bit matches with cxl_mbox_set_feat_hdr.
Good avoid the duplication.


> +	__u8 data[];
> +} __packed;
> +
>  #endif


  parent reply	other threads:[~2024-11-22 14:49 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-15 21:25 [RFC PATCH v2 0/20] fwctl/cxl: Add CXL feature commands support via fwctl Dave Jiang
2024-11-15 21:25 ` [RFC PATCH v2 01/20] cxl: Refactor user ioctl command path from mds to mailbox Dave Jiang
2024-11-21 17:33   ` Jonathan Cameron
2024-12-06  0:00   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 02/20] cxl: Add Get Supported Features command for kernel usage Dave Jiang
2024-11-21 17:42   ` Jonathan Cameron
2024-12-06  0:33   ` Dan Williams
2024-12-09 12:20     ` Shiju Jose
2024-11-15 21:25 ` [RFC PATCH v2 03/20] cxl/test: Add Get Supported Features mailbox command support Dave Jiang
2024-11-21 17:45   ` Jonathan Cameron
2024-12-06  0:36   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 04/20] cxl/mbox: Add GET_FEATURE mailbox command Dave Jiang
2024-12-06  0:44   ` Dan Williams
2024-12-09 12:20     ` Shiju Jose
2024-11-15 21:25 ` [RFC PATCH v2 05/20] cxl: Add Get Feature command support for user submission Dave Jiang
2024-11-21 17:47   ` Jonathan Cameron
2024-11-22 20:14     ` Dave Jiang
2024-11-25 20:14       ` Shiju Jose
2024-12-06  0:45   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 06/20] cxl/mbox: Add SET_FEATURE mailbox command Dave Jiang
2024-12-06  0:48   ` Dan Williams
2024-12-09 12:20     ` Shiju Jose
2024-11-15 21:25 ` [RFC PATCH v2 07/20] cxl: Add Set Feature command support for user submission Dave Jiang
2024-11-21 17:49   ` Jonathan Cameron
2024-11-21 18:08     ` Dave Jiang
2024-11-22 14:17       ` Jonathan Cameron
2024-12-06  0:53   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 08/20] cxl: Move cxl_driver related bits to be usable by external drivers Dave Jiang
2024-11-21 17:55   ` Jonathan Cameron
2024-11-15 21:25 ` [RFC PATCH v2 09/20] fwctl/cxl: Add driver for CXL mailbox for handling CXL features commands Dave Jiang
2024-11-20 18:01   ` Jason Gunthorpe
2024-11-20 18:35     ` Dave Jiang
2024-11-21 18:02   ` Jonathan Cameron
2024-12-06  1:21   ` Dan Williams
2024-12-09 13:30     ` Jason Gunthorpe
2024-12-09 20:35       ` Dan Williams
2024-12-10 13:40         ` Jason Gunthorpe
2024-11-15 21:25 ` [RFC PATCH v2 10/20] fwctl/cxl: Add support for get driver information Dave Jiang
2024-11-20 18:05   ` Jason Gunthorpe
2024-11-21 18:11   ` Jonathan Cameron
2024-11-22 23:22     ` Dave Jiang
2024-11-25 18:06       ` Jonathan Cameron
2024-12-06  5:15   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 11/20] fwctl: FWCTL_HW_INFO to return hardware information Dave Jiang
2024-11-20 18:53   ` Jason Gunthorpe
2024-11-21 18:20   ` Jonathan Cameron
2024-11-22 22:42     ` Dave Jiang
2024-12-06  5:32   ` Dan Williams
2024-12-06 18:39     ` Dave Jiang
2024-12-09 13:32       ` Jason Gunthorpe
2024-11-15 21:25 ` [RFC PATCH v2 12/20] cxl: Save Command Effects Log (CEL) effects for enabled commands Dave Jiang
2024-11-21 18:22   ` Jonathan Cameron
2024-11-15 21:25 ` [RFC PATCH v2 13/20] fwctl/cxl: Add hw_info callback Dave Jiang
2024-11-21 18:26   ` Jonathan Cameron
2024-12-06  5:40   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 14/20] cxl: Move defines and error codes from cxlmem.h to cxl/mailbox.h Dave Jiang
2024-11-21 18:31   ` Jonathan Cameron
2024-12-06  5:50   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 15/20] fwctl/cxl: Add support for fwctl RPC command to enable CXL feature commands Dave Jiang
2024-11-20 18:42   ` Jason Gunthorpe
2024-11-22 14:49   ` Jonathan Cameron [this message]
2024-12-06  6:13   ` Dan Williams
2024-11-15 21:25 ` [RFC PATCH v2 16/20] fwctl/cxl: Add support to filter exclusive features Dave Jiang
2024-11-22 15:05   ` Jonathan Cameron
2024-12-03 18:06     ` Dave Jiang
2024-11-15 21:25 ` [RFC PATCH v2 17/20] cxl/test: Add Get Feature support to cxl_test Dave Jiang
2024-11-22 15:19   ` Jonathan Cameron
2024-11-15 21:25 ` [RFC PATCH v2 18/20] cxl/test: Add Set " Dave Jiang
2024-11-22 15:20   ` Jonathan Cameron
2024-11-15 21:25 ` [RFC PATCH v2 19/20] fwctl: Move fwctl documentation to its own directory Dave Jiang
2024-11-20 17:52   ` Jason Gunthorpe
2024-11-15 21:25 ` [RFC PATCH v2 20/20] fwctl/cxl: Add documentation to FWCTL CXL Dave Jiang
2024-11-22 15:26   ` Jonathan Cameron
2024-12-03 21:07     ` Dave Jiang
2024-12-06 21:10       ` Dan Williams
2024-11-20 18:57 ` [RFC PATCH v2 0/20] fwctl/cxl: Add CXL feature commands support via fwctl Jason Gunthorpe
2024-11-21 18:38   ` Jonathan Cameron
2025-01-21 20:30 ` Jason Gunthorpe
2025-01-21 20:34   ` Dave Jiang

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=20241122144923.00007b88@huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=alison.schofield@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.jiang@intel.com \
    --cc=dave@stgolabs.net \
    --cc=ira.weiny@intel.com \
    --cc=jgg@nvidia.com \
    --cc=linux-cxl@vger.kernel.org \
    --cc=shiju.jose@huawei.com \
    --cc=vishal.l.verma@intel.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.