All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] Query the RSU SPT table offset to determine RSU page size
@ 2023-07-17  1:49 kah.jing.lee
  2023-07-17  1:49 ` [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command kah.jing.lee
  2023-07-17  1:50 ` [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses kah.jing.lee
  0 siblings, 2 replies; 7+ messages in thread
From: kah.jing.lee @ 2023-07-17  1:49 UTC (permalink / raw)
  To: dinguyen; +Cc: linux-kernel, radu.bacrau, tien.sung.ang, Kah Jing Lee

From: Kah Jing Lee <kah.jing.lee@intel.com>

Hi,
This patchset is to add the generic mailbox command in the svc driver
to enable the rsu driver to query spt address.
SPT0 address - lower range & SPT1 address - upper range address will be
queried in order to determine the page size of RSU, whether it is
32kB or 64kB that is supported.

Thanks,
KJ

changelog v2:
- Update the comment on svc COMMAND_MBOX_SEND_CMD
- Update the rsu mailbox cmd ret_val to use already defined ret

changelog v3:
- Check for IS_ERR on stratix10_svc_allocate_memory return

Radu Bacrau (1):
  firmware: stratix10-rsu: query spt addresses

Teh Wen Ping (1):
  firmware: stratix10-svc: Generic Mailbox Command

 drivers/firmware/stratix10-rsu.c              | 100 +++++++++++++++++-
 drivers/firmware/stratix10-svc.c              |  18 ++++
 include/linux/firmware/intel/stratix10-smc.h  |  25 +++++
 .../firmware/intel/stratix10-svc-client.h     |   5 +
 4 files changed, 147 insertions(+), 1 deletion(-)


base-commit: 5133c9e51de41bfa902153888e11add3342ede18
-- 
2.25.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command
  2023-07-17  1:49 [PATCH v3 0/2] Query the RSU SPT table offset to determine RSU page size kah.jing.lee
@ 2023-07-17  1:49 ` kah.jing.lee
  2023-07-21  2:33   ` Lee, Kah Jing
  2023-07-17  1:50 ` [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses kah.jing.lee
  1 sibling, 1 reply; 7+ messages in thread
From: kah.jing.lee @ 2023-07-17  1:49 UTC (permalink / raw)
  To: dinguyen
  Cc: linux-kernel, radu.bacrau, tien.sung.ang, Teh Wen Ping, Kah Jing Lee

From: Teh Wen Ping <wen.ping.teh@intel.com>

Add generic mailbox command that can support SDM command. User can use this
command to send SDM mailbox command. User have to specified an input file
which contain the command data and an output file for SDM response to be
copied over.

Signed-off-by: Teh Wen Ping <wen.ping.teh@intel.com>
Signed-off-by: Kah Jing Lee <kah.jing.lee@intel.com>
---
 drivers/firmware/stratix10-svc.c              | 18 +++++++++++++
 include/linux/firmware/intel/stratix10-smc.h  | 25 +++++++++++++++++++
 .../firmware/intel/stratix10-svc-client.h     |  5 ++++
 3 files changed, 48 insertions(+)

diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c
index 2d674126160f..260695a8a9e6 100644
--- a/drivers/firmware/stratix10-svc.c
+++ b/drivers/firmware/stratix10-svc.c
@@ -37,6 +37,7 @@
 #define SVC_NUM_CHANNEL				3
 #define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS	200
 #define FPGA_CONFIG_STATUS_TIMEOUT_SEC		30
+#define BYTE_TO_WORD_SIZE              4
 
 /* stratix10 service layer clients */
 #define STRATIX10_RSU				"stratix10-rsu"
@@ -361,6 +362,13 @@ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data,
 		cb_data->kaddr2 = svc_pa_to_va(res.a2);
 		cb_data->kaddr3 = &res.a3;
 		break;
+	case COMMAND_MBOX_SEND_CMD:
+		cb_data->status = BIT(SVC_STATUS_OK);
+		cb_data->kaddr1 = &res.a1;
+		/* SDM return size in u8. Convert size to u32 word */
+		res.a2 = res.a2 * BYTE_TO_WORD_SIZE;
+		cb_data->kaddr2 = &res.a2;
+		break;
 	default:
 		pr_warn("it shouldn't happen\n");
 		break;
@@ -534,6 +542,15 @@ static int svc_normal_to_secure_thread(void *data)
 			a1 = 0;
 			a2 = 0;
 			break;
+		case COMMAND_MBOX_SEND_CMD:
+			a0 = INTEL_SIP_SMC_MBOX_SEND_CMD;
+			a1 = pdata->arg[0];
+			a2 = (unsigned long)pdata->paddr;
+			a3 = (unsigned long)pdata->size / BYTE_TO_WORD_SIZE;
+			a4 = pdata->arg[1];
+			a5 = (unsigned long)pdata->paddr_output;
+			a6 = (unsigned long)pdata->size_output / BYTE_TO_WORD_SIZE;
+			break;
 		default:
 			pr_warn("it shouldn't happen\n");
 			break;
@@ -597,6 +614,7 @@ static int svc_normal_to_secure_thread(void *data)
 			case COMMAND_FCS_DATA_ENCRYPTION:
 			case COMMAND_FCS_DATA_DECRYPTION:
 			case COMMAND_FCS_RANDOM_NUMBER_GEN:
+			case COMMAND_MBOX_SEND_CMD:
 				cbdata->status = BIT(SVC_STATUS_INVALID_PARAM);
 				cbdata->kaddr1 = NULL;
 				cbdata->kaddr2 = NULL;
diff --git a/include/linux/firmware/intel/stratix10-smc.h b/include/linux/firmware/intel/stratix10-smc.h
index a718f853d457..ee80ca4bb0d0 100644
--- a/include/linux/firmware/intel/stratix10-smc.h
+++ b/include/linux/firmware/intel/stratix10-smc.h
@@ -466,6 +466,31 @@ INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
 #define INTEL_SIP_SMC_FIRMWARE_VERSION \
         INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FIRMWARE_VERSION)
 
+/**
+ * SMC call protocol for Mailbox, starting FUNCID from 60
+ *
+ * Call register usage:
+ * a0 INTEL_SIP_SMC_MBOX_SEND_CMD
+ * a1 mailbox command code
+ * a2 physical address that contain mailbox command data (not include header)
+ * a3 mailbox command data size in word
+ * a4 set to 0 for CASUAL, set to 1 for URGENT
+ * a5 physical address for secure firmware to put response data
+ *    (not include header)
+ * a6 maximum size in word of physical address to store response data
+ * a7 not used
+ *
+ * Return status
+ * a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_REJECTED or
+ *    INTEL_SIP_SMC_STATUS_ERROR
+ * a1 mailbox error code
+ * a2 response data length in word
+ * a3 not used
+ */
+#define INTEL_SIP_SMC_FUNCID_MBOX_SEND_CMD 60
+	#define INTEL_SIP_SMC_MBOX_SEND_CMD \
+	INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_MBOX_SEND_CMD)
+
 /**
  * Request INTEL_SIP_SMC_SVC_VERSION
  *
diff --git a/include/linux/firmware/intel/stratix10-svc-client.h b/include/linux/firmware/intel/stratix10-svc-client.h
index 0c16037fd08d..60ed82112680 100644
--- a/include/linux/firmware/intel/stratix10-svc-client.h
+++ b/include/linux/firmware/intel/stratix10-svc-client.h
@@ -118,6 +118,9 @@ struct stratix10_svc_chan;
  * @COMMAND_SMC_SVC_VERSION: Non-mailbox SMC SVC API Version,
  * return status is SVC_STATUS_OK
  *
+ * @COMMAND_MBOX_SEND_CMD: send generic mailbox command, return status is
+ * SVC_STATUS_OK or SVC_STATUS_ERROR
+ *
  * @COMMAND_RSU_DCMF_STATUS: query firmware for the DCMF status
  * return status is SVC_STATUS_OK or SVC_STATUS_ERROR
  *
@@ -164,6 +167,8 @@ enum stratix10_svc_command_code {
 	COMMAND_FCS_RANDOM_NUMBER_GEN,
 	/* for general status poll */
 	COMMAND_POLL_SERVICE_STATUS = 40,
+	/* for generic mailbox send command */
+	COMMAND_MBOX_SEND_CMD = 100,
 	/* Non-mailbox SMC Call */
 	COMMAND_SMC_SVC_VERSION = 200,
 };
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses
  2023-07-17  1:49 [PATCH v3 0/2] Query the RSU SPT table offset to determine RSU page size kah.jing.lee
  2023-07-17  1:49 ` [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command kah.jing.lee
@ 2023-07-17  1:50 ` kah.jing.lee
  2023-07-21  2:34   ` Lee, Kah Jing
  1 sibling, 1 reply; 7+ messages in thread
From: kah.jing.lee @ 2023-07-17  1:50 UTC (permalink / raw)
  To: dinguyen; +Cc: linux-kernel, radu.bacrau, tien.sung.ang, Kah Jing Lee

From: Radu Bacrau <radu.bacrau@intel.com>

Extend Intel Remote System Update (RSU) driver to get SPT
(Sub-Partition Table) addresses. The query SPT address can be used
to determine if the RSU QSPI layout is 32kB or 64kB aligned.
The alignment can be determined by minus the upper with the lower of
the SPT addresses.

This patch depends on patch:
firmware: stratix10-svc: Generic Mailbox Command

Signed-off-by: Radu Bacrau <radu.bacrau@intel.com>
Signed-off-by: Kah Jing Lee <kah.jing.lee@intel.com>
---
 drivers/firmware/stratix10-rsu.c | 100 ++++++++++++++++++++++++++++++-
 1 file changed, 99 insertions(+), 1 deletion(-)

diff --git a/drivers/firmware/stratix10-rsu.c b/drivers/firmware/stratix10-rsu.c
index e51c95f8d445..af71f921be5f 100644
--- a/drivers/firmware/stratix10-rsu.c
+++ b/drivers/firmware/stratix10-rsu.c
@@ -34,6 +34,10 @@
 #define INVALID_RETRY_COUNTER		0xFF
 #define INVALID_DCMF_VERSION		0xFF
 #define INVALID_DCMF_STATUS		0xFFFFFFFF
+#define INVALID_SPT_ADDRESS		0x0
+
+#define RSU_GET_SPT_CMD			0x5A
+#define RSU_GET_SPT_RESP_LEN		(4 * sizeof(unsigned int))
 
 typedef void (*rsu_callback)(struct stratix10_svc_client *client,
 			     struct stratix10_svc_cb_data *data);
@@ -59,6 +63,9 @@ typedef void (*rsu_callback)(struct stratix10_svc_client *client,
  * @dcmf_status.dcmf3: dcmf3 status
  * @retry_counter: the current image's retry counter
  * @max_retry: the preset max retry value
+ * @spt0_address: address of spt0
+ * @spt1_address: address of spt1
+ * @get_spt_response_buf: response from sdm for get_spt command
  */
 struct stratix10_rsu_priv {
 	struct stratix10_svc_chan *chan;
@@ -90,6 +97,11 @@ struct stratix10_rsu_priv {
 
 	unsigned int retry_counter;
 	unsigned int max_retry;
+
+	unsigned long spt0_address;
+	unsigned long spt1_address;
+
+	unsigned int *get_spt_response_buf;
 };
 
 /**
@@ -259,6 +271,36 @@ static void rsu_dcmf_status_callback(struct stratix10_svc_client *client,
 	complete(&priv->completion);
 }
 
+static void rsu_get_spt_callback(struct stratix10_svc_client *client,
+				     struct stratix10_svc_cb_data *data)
+{
+	struct stratix10_rsu_priv *priv = client->priv;
+	unsigned long *mbox_err = (unsigned long *)data->kaddr1;
+	unsigned long *resp_len = (unsigned long *)data->kaddr2;
+
+	if ((data->status != BIT(SVC_STATUS_OK)) || (*mbox_err) ||
+	    (*resp_len != RSU_GET_SPT_RESP_LEN))
+		goto error;
+
+	priv->spt0_address = priv->get_spt_response_buf[0];
+	priv->spt0_address <<= 32;
+	priv->spt0_address |= priv->get_spt_response_buf[1];
+
+	priv->spt1_address = priv->get_spt_response_buf[2];
+	priv->spt1_address <<= 32;
+	priv->spt1_address |= priv->get_spt_response_buf[3];
+
+	goto complete;
+
+error:
+	dev_err(client->dev, "failed to get SPTs\n");
+
+complete:
+	stratix10_svc_free_memory(priv->chan, priv->get_spt_response_buf);
+	priv->get_spt_response_buf = NULL;
+	complete(&priv->completion);
+}
+
 /**
  * rsu_send_msg() - send a message to Intel service layer
  * @priv: pointer to rsu private data
@@ -288,6 +330,14 @@ static int rsu_send_msg(struct stratix10_rsu_priv *priv,
 	if (arg)
 		msg.arg[0] = arg;
 
+	if (command == COMMAND_MBOX_SEND_CMD) {
+		msg.arg[1] = 0;
+		msg.payload = NULL;
+		msg.payload_length = 0;
+		msg.payload_output = priv->get_spt_response_buf;
+		msg.payload_length_output = RSU_GET_SPT_RESP_LEN;
+	}
+
 	ret = stratix10_svc_send(priv->chan, &msg);
 	if (ret < 0)
 		goto status_done;
@@ -572,6 +622,34 @@ static ssize_t notify_store(struct device *dev,
 	return count;
 }
 
+static ssize_t spt0_address_show(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	struct stratix10_rsu_priv *priv = dev_get_drvdata(dev);
+
+	if (!priv)
+		return -ENODEV;
+
+	if (priv->spt0_address == INVALID_SPT_ADDRESS)
+		return -EIO;
+
+	return scnprintf(buf, PAGE_SIZE, "0x%08lx\n", priv->spt0_address);
+}
+
+static ssize_t spt1_address_show(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	struct stratix10_rsu_priv *priv = dev_get_drvdata(dev);
+
+	if (!priv)
+		return -ENODEV;
+
+	if (priv->spt1_address == INVALID_SPT_ADDRESS)
+		return -EIO;
+
+	return scnprintf(buf, PAGE_SIZE, "0x%08lx\n", priv->spt1_address);
+}
+
 static DEVICE_ATTR_RO(current_image);
 static DEVICE_ATTR_RO(fail_image);
 static DEVICE_ATTR_RO(state);
@@ -590,6 +668,8 @@ static DEVICE_ATTR_RO(dcmf2_status);
 static DEVICE_ATTR_RO(dcmf3_status);
 static DEVICE_ATTR_WO(reboot_image);
 static DEVICE_ATTR_WO(notify);
+static DEVICE_ATTR_RO(spt0_address);
+static DEVICE_ATTR_RO(spt1_address);
 
 static struct attribute *rsu_attrs[] = {
 	&dev_attr_current_image.attr,
@@ -610,6 +690,8 @@ static struct attribute *rsu_attrs[] = {
 	&dev_attr_dcmf3_status.attr,
 	&dev_attr_reboot_image.attr,
 	&dev_attr_notify.attr,
+	&dev_attr_spt0_address.attr,
+	&dev_attr_spt1_address.attr,
 	NULL
 };
 
@@ -639,11 +721,13 @@ static int stratix10_rsu_probe(struct platform_device *pdev)
 	priv->dcmf_version.dcmf1 = INVALID_DCMF_VERSION;
 	priv->dcmf_version.dcmf2 = INVALID_DCMF_VERSION;
 	priv->dcmf_version.dcmf3 = INVALID_DCMF_VERSION;
-	priv->max_retry = INVALID_RETRY_COUNTER;
 	priv->dcmf_status.dcmf0 = INVALID_DCMF_STATUS;
 	priv->dcmf_status.dcmf1 = INVALID_DCMF_STATUS;
 	priv->dcmf_status.dcmf2 = INVALID_DCMF_STATUS;
 	priv->dcmf_status.dcmf3 = INVALID_DCMF_STATUS;
+	priv->max_retry = INVALID_RETRY_COUNTER;
+	priv->spt0_address = INVALID_SPT_ADDRESS;
+	priv->spt1_address = INVALID_SPT_ADDRESS;
 
 	mutex_init(&priv->lock);
 	priv->chan = stratix10_svc_request_channel_byname(&priv->client,
@@ -693,6 +777,20 @@ static int stratix10_rsu_probe(struct platform_device *pdev)
 		stratix10_svc_free_channel(priv->chan);
 	}
 
+	priv->get_spt_response_buf =
+		stratix10_svc_allocate_memory(priv->chan, RSU_GET_SPT_RESP_LEN);
+
+	if (IS_ERR(priv->get_spt_response_buf)) {
+		dev_err(dev, "failed to allocate get spt buffer\n");
+	} else {
+		ret = rsu_send_msg(priv, COMMAND_MBOX_SEND_CMD,
+				RSU_GET_SPT_CMD, rsu_get_spt_callback);
+		if (ret) {
+			dev_err(dev, "Error, getting SPT table %i\n", ret);
+			stratix10_svc_free_channel(priv->chan);
+		}
+	}
+
 	return ret;
 }
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* RE: [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command
  2023-07-17  1:49 ` [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command kah.jing.lee
@ 2023-07-21  2:33   ` Lee, Kah Jing
  0 siblings, 0 replies; 7+ messages in thread
From: Lee, Kah Jing @ 2023-07-21  2:33 UTC (permalink / raw)
  To: dinguyen; +Cc: linux-kernel, Bacrau, Radu, Ang, Tien Sung, Teh Wen Ping

Hi Dinh, 

Any feedback on this patch ? 

Thanks. 

Regards, 
Lee, Kah Jing
> -----Original Message-----
> From: Lee, Kah Jing <kah.jing.lee@intel.com>
> Sent: Monday, 17 July, 2023 9:50 AM
> To: dinguyen@kernel.org
> Cc: linux-kernel@vger.kernel.org; Bacrau, Radu <radu.bacrau@intel.com>;
> Ang, Tien Sung <tien.sung.ang@intel.com>; Teh Wen Ping
> <wen.ping.teh@intel.com>; Lee, Kah Jing <kah.jing.lee@intel.com>
> Subject: [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command
> 
> From: Teh Wen Ping <wen.ping.teh@intel.com>
> 
> Add generic mailbox command that can support SDM command. User can
> use this command to send SDM mailbox command. User have to specified an
> input file which contain the command data and an output file for SDM
> response to be copied over.
> 
> Signed-off-by: Teh Wen Ping <wen.ping.teh@intel.com>
> Signed-off-by: Kah Jing Lee <kah.jing.lee@intel.com>
> ---
>  drivers/firmware/stratix10-svc.c              | 18 +++++++++++++
>  include/linux/firmware/intel/stratix10-smc.h  | 25 +++++++++++++++++++
>  .../firmware/intel/stratix10-svc-client.h     |  5 ++++
>  3 files changed, 48 insertions(+)
> 
> diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-
> svc.c
> index 2d674126160f..260695a8a9e6 100644
> --- a/drivers/firmware/stratix10-svc.c
> +++ b/drivers/firmware/stratix10-svc.c
> @@ -37,6 +37,7 @@
>  #define SVC_NUM_CHANNEL				3
>  #define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS	200
>  #define FPGA_CONFIG_STATUS_TIMEOUT_SEC		30
> +#define BYTE_TO_WORD_SIZE              4
> 
>  /* stratix10 service layer clients */
>  #define STRATIX10_RSU				"stratix10-rsu"
> @@ -361,6 +362,13 @@ static void svc_thread_recv_status_ok(struct
> stratix10_svc_data *p_data,
>  		cb_data->kaddr2 = svc_pa_to_va(res.a2);
>  		cb_data->kaddr3 = &res.a3;
>  		break;
> +	case COMMAND_MBOX_SEND_CMD:
> +		cb_data->status = BIT(SVC_STATUS_OK);
> +		cb_data->kaddr1 = &res.a1;
> +		/* SDM return size in u8. Convert size to u32 word */
> +		res.a2 = res.a2 * BYTE_TO_WORD_SIZE;
> +		cb_data->kaddr2 = &res.a2;
> +		break;
>  	default:
>  		pr_warn("it shouldn't happen\n");
>  		break;
> @@ -534,6 +542,15 @@ static int svc_normal_to_secure_thread(void *data)
>  			a1 = 0;
>  			a2 = 0;
>  			break;
> +		case COMMAND_MBOX_SEND_CMD:
> +			a0 = INTEL_SIP_SMC_MBOX_SEND_CMD;
> +			a1 = pdata->arg[0];
> +			a2 = (unsigned long)pdata->paddr;
> +			a3 = (unsigned long)pdata->size /
> BYTE_TO_WORD_SIZE;
> +			a4 = pdata->arg[1];
> +			a5 = (unsigned long)pdata->paddr_output;
> +			a6 = (unsigned long)pdata->size_output /
> BYTE_TO_WORD_SIZE;
> +			break;
>  		default:
>  			pr_warn("it shouldn't happen\n");
>  			break;
> @@ -597,6 +614,7 @@ static int svc_normal_to_secure_thread(void *data)
>  			case COMMAND_FCS_DATA_ENCRYPTION:
>  			case COMMAND_FCS_DATA_DECRYPTION:
>  			case COMMAND_FCS_RANDOM_NUMBER_GEN:
> +			case COMMAND_MBOX_SEND_CMD:
>  				cbdata->status =
> BIT(SVC_STATUS_INVALID_PARAM);
>  				cbdata->kaddr1 = NULL;
>  				cbdata->kaddr2 = NULL;
> diff --git a/include/linux/firmware/intel/stratix10-smc.h
> b/include/linux/firmware/intel/stratix10-smc.h
> index a718f853d457..ee80ca4bb0d0 100644
> --- a/include/linux/firmware/intel/stratix10-smc.h
> +++ b/include/linux/firmware/intel/stratix10-smc.h
> @@ -466,6 +466,31 @@
> INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_
> COMPLETED_WRITE)
>  #define INTEL_SIP_SMC_FIRMWARE_VERSION \
> 
> INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FIRMWARE_VE
> RSION)
> 
> +/**
> + * SMC call protocol for Mailbox, starting FUNCID from 60
> + *
> + * Call register usage:
> + * a0 INTEL_SIP_SMC_MBOX_SEND_CMD
> + * a1 mailbox command code
> + * a2 physical address that contain mailbox command data (not include
> +header)
> + * a3 mailbox command data size in word
> + * a4 set to 0 for CASUAL, set to 1 for URGENT
> + * a5 physical address for secure firmware to put response data
> + *    (not include header)
> + * a6 maximum size in word of physical address to store response data
> + * a7 not used
> + *
> + * Return status
> + * a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_REJECTED or
> + *    INTEL_SIP_SMC_STATUS_ERROR
> + * a1 mailbox error code
> + * a2 response data length in word
> + * a3 not used
> + */
> +#define INTEL_SIP_SMC_FUNCID_MBOX_SEND_CMD 60
> +	#define INTEL_SIP_SMC_MBOX_SEND_CMD \
> +
> 	INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_MBOX_
> SEND_CMD)
> +
>  /**
>   * Request INTEL_SIP_SMC_SVC_VERSION
>   *
> diff --git a/include/linux/firmware/intel/stratix10-svc-client.h
> b/include/linux/firmware/intel/stratix10-svc-client.h
> index 0c16037fd08d..60ed82112680 100644
> --- a/include/linux/firmware/intel/stratix10-svc-client.h
> +++ b/include/linux/firmware/intel/stratix10-svc-client.h
> @@ -118,6 +118,9 @@ struct stratix10_svc_chan;
>   * @COMMAND_SMC_SVC_VERSION: Non-mailbox SMC SVC API Version,
>   * return status is SVC_STATUS_OK
>   *
> + * @COMMAND_MBOX_SEND_CMD: send generic mailbox command,
> return status
> + is
> + * SVC_STATUS_OK or SVC_STATUS_ERROR
> + *
>   * @COMMAND_RSU_DCMF_STATUS: query firmware for the DCMF status
>   * return status is SVC_STATUS_OK or SVC_STATUS_ERROR
>   *
> @@ -164,6 +167,8 @@ enum stratix10_svc_command_code {
>  	COMMAND_FCS_RANDOM_NUMBER_GEN,
>  	/* for general status poll */
>  	COMMAND_POLL_SERVICE_STATUS = 40,
> +	/* for generic mailbox send command */
> +	COMMAND_MBOX_SEND_CMD = 100,
>  	/* Non-mailbox SMC Call */
>  	COMMAND_SMC_SVC_VERSION = 200,
>  };
> --
> 2.25.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses
  2023-07-17  1:50 ` [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses kah.jing.lee
@ 2023-07-21  2:34   ` Lee, Kah Jing
  2023-07-24 14:39     ` Dinh Nguyen
  0 siblings, 1 reply; 7+ messages in thread
From: Lee, Kah Jing @ 2023-07-21  2:34 UTC (permalink / raw)
  To: dinguyen; +Cc: linux-kernel, Bacrau, Radu, Ang, Tien Sung

Hi Dinh, 

Any feedback on this patch ? 

Thanks. 

Regards, 
Lee, Kah Jing
> -----Original Message-----
> From: Lee, Kah Jing <kah.jing.lee@intel.com>
> Sent: Monday, 17 July, 2023 9:50 AM
> To: dinguyen@kernel.org
> Cc: linux-kernel@vger.kernel.org; Bacrau, Radu <radu.bacrau@intel.com>;
> Ang, Tien Sung <tien.sung.ang@intel.com>; Lee, Kah Jing
> <kah.jing.lee@intel.com>
> Subject: [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses
> 
> From: Radu Bacrau <radu.bacrau@intel.com>
> 
> Extend Intel Remote System Update (RSU) driver to get SPT (Sub-Partition
> Table) addresses. The query SPT address can be used to determine if the
> RSU QSPI layout is 32kB or 64kB aligned.
> The alignment can be determined by minus the upper with the lower of the
> SPT addresses.
> 
> This patch depends on patch:
> firmware: stratix10-svc: Generic Mailbox Command
> 
> Signed-off-by: Radu Bacrau <radu.bacrau@intel.com>
> Signed-off-by: Kah Jing Lee <kah.jing.lee@intel.com>
> ---
>  drivers/firmware/stratix10-rsu.c | 100
> ++++++++++++++++++++++++++++++-
>  1 file changed, 99 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/firmware/stratix10-rsu.c b/drivers/firmware/stratix10-
> rsu.c
> index e51c95f8d445..af71f921be5f 100644
> --- a/drivers/firmware/stratix10-rsu.c
> +++ b/drivers/firmware/stratix10-rsu.c
> @@ -34,6 +34,10 @@
>  #define INVALID_RETRY_COUNTER		0xFF
>  #define INVALID_DCMF_VERSION		0xFF
>  #define INVALID_DCMF_STATUS		0xFFFFFFFF
> +#define INVALID_SPT_ADDRESS		0x0
> +
> +#define RSU_GET_SPT_CMD			0x5A
> +#define RSU_GET_SPT_RESP_LEN		(4 * sizeof(unsigned int))
> 
>  typedef void (*rsu_callback)(struct stratix10_svc_client *client,
>  			     struct stratix10_svc_cb_data *data); @@ -59,6
> +63,9 @@ typedef void (*rsu_callback)(struct stratix10_svc_client *client,
>   * @dcmf_status.dcmf3: dcmf3 status
>   * @retry_counter: the current image's retry counter
>   * @max_retry: the preset max retry value
> + * @spt0_address: address of spt0
> + * @spt1_address: address of spt1
> + * @get_spt_response_buf: response from sdm for get_spt command
>   */
>  struct stratix10_rsu_priv {
>  	struct stratix10_svc_chan *chan;
> @@ -90,6 +97,11 @@ struct stratix10_rsu_priv {
> 
>  	unsigned int retry_counter;
>  	unsigned int max_retry;
> +
> +	unsigned long spt0_address;
> +	unsigned long spt1_address;
> +
> +	unsigned int *get_spt_response_buf;
>  };
> 
>  /**
> @@ -259,6 +271,36 @@ static void rsu_dcmf_status_callback(struct
> stratix10_svc_client *client,
>  	complete(&priv->completion);
>  }
> 
> +static void rsu_get_spt_callback(struct stratix10_svc_client *client,
> +				     struct stratix10_svc_cb_data *data) {
> +	struct stratix10_rsu_priv *priv = client->priv;
> +	unsigned long *mbox_err = (unsigned long *)data->kaddr1;
> +	unsigned long *resp_len = (unsigned long *)data->kaddr2;
> +
> +	if ((data->status != BIT(SVC_STATUS_OK)) || (*mbox_err) ||
> +	    (*resp_len != RSU_GET_SPT_RESP_LEN))
> +		goto error;
> +
> +	priv->spt0_address = priv->get_spt_response_buf[0];
> +	priv->spt0_address <<= 32;
> +	priv->spt0_address |= priv->get_spt_response_buf[1];
> +
> +	priv->spt1_address = priv->get_spt_response_buf[2];
> +	priv->spt1_address <<= 32;
> +	priv->spt1_address |= priv->get_spt_response_buf[3];
> +
> +	goto complete;
> +
> +error:
> +	dev_err(client->dev, "failed to get SPTs\n");
> +
> +complete:
> +	stratix10_svc_free_memory(priv->chan, priv-
> >get_spt_response_buf);
> +	priv->get_spt_response_buf = NULL;
> +	complete(&priv->completion);
> +}
> +
>  /**
>   * rsu_send_msg() - send a message to Intel service layer
>   * @priv: pointer to rsu private data
> @@ -288,6 +330,14 @@ static int rsu_send_msg(struct stratix10_rsu_priv
> *priv,
>  	if (arg)
>  		msg.arg[0] = arg;
> 
> +	if (command == COMMAND_MBOX_SEND_CMD) {
> +		msg.arg[1] = 0;
> +		msg.payload = NULL;
> +		msg.payload_length = 0;
> +		msg.payload_output = priv->get_spt_response_buf;
> +		msg.payload_length_output = RSU_GET_SPT_RESP_LEN;
> +	}
> +
>  	ret = stratix10_svc_send(priv->chan, &msg);
>  	if (ret < 0)
>  		goto status_done;
> @@ -572,6 +622,34 @@ static ssize_t notify_store(struct device *dev,
>  	return count;
>  }
> 
> +static ssize_t spt0_address_show(struct device *dev,
> +				  struct device_attribute *attr, char *buf) {
> +	struct stratix10_rsu_priv *priv = dev_get_drvdata(dev);
> +
> +	if (!priv)
> +		return -ENODEV;
> +
> +	if (priv->spt0_address == INVALID_SPT_ADDRESS)
> +		return -EIO;
> +
> +	return scnprintf(buf, PAGE_SIZE, "0x%08lx\n", priv->spt0_address); }
> +
> +static ssize_t spt1_address_show(struct device *dev,
> +				  struct device_attribute *attr, char *buf) {
> +	struct stratix10_rsu_priv *priv = dev_get_drvdata(dev);
> +
> +	if (!priv)
> +		return -ENODEV;
> +
> +	if (priv->spt1_address == INVALID_SPT_ADDRESS)
> +		return -EIO;
> +
> +	return scnprintf(buf, PAGE_SIZE, "0x%08lx\n", priv->spt1_address); }
> +
>  static DEVICE_ATTR_RO(current_image);
>  static DEVICE_ATTR_RO(fail_image);
>  static DEVICE_ATTR_RO(state);
> @@ -590,6 +668,8 @@ static DEVICE_ATTR_RO(dcmf2_status);  static
> DEVICE_ATTR_RO(dcmf3_status);  static DEVICE_ATTR_WO(reboot_image);
> static DEVICE_ATTR_WO(notify);
> +static DEVICE_ATTR_RO(spt0_address);
> +static DEVICE_ATTR_RO(spt1_address);
> 
>  static struct attribute *rsu_attrs[] = {
>  	&dev_attr_current_image.attr,
> @@ -610,6 +690,8 @@ static struct attribute *rsu_attrs[] = {
>  	&dev_attr_dcmf3_status.attr,
>  	&dev_attr_reboot_image.attr,
>  	&dev_attr_notify.attr,
> +	&dev_attr_spt0_address.attr,
> +	&dev_attr_spt1_address.attr,
>  	NULL
>  };
> 
> @@ -639,11 +721,13 @@ static int stratix10_rsu_probe(struct
> platform_device *pdev)
>  	priv->dcmf_version.dcmf1 = INVALID_DCMF_VERSION;
>  	priv->dcmf_version.dcmf2 = INVALID_DCMF_VERSION;
>  	priv->dcmf_version.dcmf3 = INVALID_DCMF_VERSION;
> -	priv->max_retry = INVALID_RETRY_COUNTER;
>  	priv->dcmf_status.dcmf0 = INVALID_DCMF_STATUS;
>  	priv->dcmf_status.dcmf1 = INVALID_DCMF_STATUS;
>  	priv->dcmf_status.dcmf2 = INVALID_DCMF_STATUS;
>  	priv->dcmf_status.dcmf3 = INVALID_DCMF_STATUS;
> +	priv->max_retry = INVALID_RETRY_COUNTER;
> +	priv->spt0_address = INVALID_SPT_ADDRESS;
> +	priv->spt1_address = INVALID_SPT_ADDRESS;
> 
>  	mutex_init(&priv->lock);
>  	priv->chan = stratix10_svc_request_channel_byname(&priv->client,
> @@ -693,6 +777,20 @@ static int stratix10_rsu_probe(struct platform_device
> *pdev)
>  		stratix10_svc_free_channel(priv->chan);
>  	}
> 
> +	priv->get_spt_response_buf =
> +		stratix10_svc_allocate_memory(priv->chan,
> RSU_GET_SPT_RESP_LEN);
> +
> +	if (IS_ERR(priv->get_spt_response_buf)) {
> +		dev_err(dev, "failed to allocate get spt buffer\n");
> +	} else {
> +		ret = rsu_send_msg(priv, COMMAND_MBOX_SEND_CMD,
> +				RSU_GET_SPT_CMD, rsu_get_spt_callback);
> +		if (ret) {
> +			dev_err(dev, "Error, getting SPT table %i\n", ret);
> +			stratix10_svc_free_channel(priv->chan);
> +		}
> +	}
> +
>  	return ret;
>  }
> 
> --
> 2.25.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses
  2023-07-21  2:34   ` Lee, Kah Jing
@ 2023-07-24 14:39     ` Dinh Nguyen
  2023-07-25  8:51       ` Lee, Kah Jing
  0 siblings, 1 reply; 7+ messages in thread
From: Dinh Nguyen @ 2023-07-24 14:39 UTC (permalink / raw)
  To: Lee, Kah Jing; +Cc: linux-kernel, Bacrau, Radu, Ang, Tien Sung



On 7/20/23 21:34, Lee, Kah Jing wrote:
> Hi Dinh,
> 
> Any feedback on this patch ?
> 

Please fix these checkpatch warnings:

CHECK: Alignment should match open parenthesis
#64: FILE: drivers/firmware/stratix10-rsu.c:275:
+static void rsu_get_spt_callback(struct stratix10_svc_client *client,
+                                    struct stratix10_svc_cb_data *data)

CHECK: Unnecessary parentheses around 'data->status != BIT(SVC_STATUS_OK)'
#70: FILE: drivers/firmware/stratix10-rsu.c:281:
+       if ((data->status != BIT(SVC_STATUS_OK)) || (*mbox_err) ||
+           (*resp_len != RSU_GET_SPT_RESP_LEN))

CHECK: Alignment should match open parenthesis
#116: FILE: drivers/firmware/stratix10-rsu.c:626:
+static ssize_t spt0_address_show(struct device *dev,
+                                 struct device_attribute *attr, char *buf)

CHECK: Alignment should match open parenthesis
#130: FILE: drivers/firmware/stratix10-rsu.c:640:
+static ssize_t spt1_address_show(struct device *dev,
+                                 struct device_attribute *attr, char *buf)

CHECK: Alignment should match open parenthesis
#190: FILE: drivers/firmware/stratix10-rsu.c:787:
+               ret = rsu_send_msg(priv, COMMAND_MBOX_SEND_CMD,
+                               RSU_GET_SPT_CMD, rsu_get_spt_callback);


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses
  2023-07-24 14:39     ` Dinh Nguyen
@ 2023-07-25  8:51       ` Lee, Kah Jing
  0 siblings, 0 replies; 7+ messages in thread
From: Lee, Kah Jing @ 2023-07-25  8:51 UTC (permalink / raw)
  To: Dinh Nguyen; +Cc: linux-kernel, Bacrau, Radu, Ang, Tien Sung

> On 7/20/23 21:34, Lee, Kah Jing wrote:
> > Hi Dinh,
> >
> > Any feedback on this patch ?
> >
> 
> Please fix these checkpatch warnings:
> 
> CHECK: Alignment should match open parenthesis
Let me fix for those alignment issues and send for v4. 

> #64: FILE: drivers/firmware/stratix10-rsu.c:275:
> +static void rsu_get_spt_callback(struct stratix10_svc_client *client,
> +                                    struct stratix10_svc_cb_data *data)
> 
> CHECK: Unnecessary parentheses around 'data->status !=
> BIT(SVC_STATUS_OK)'
> #70: FILE: drivers/firmware/stratix10-rsu.c:281:
> +       if ((data->status != BIT(SVC_STATUS_OK)) || (*mbox_err) ||
> +           (*resp_len != RSU_GET_SPT_RESP_LEN))
> 
> CHECK: Alignment should match open parenthesis
> #116: FILE: drivers/firmware/stratix10-rsu.c:626:
> +static ssize_t spt0_address_show(struct device *dev,
> +                                 struct device_attribute *attr, char *buf)
> 
> CHECK: Alignment should match open parenthesis
> #130: FILE: drivers/firmware/stratix10-rsu.c:640:
> +static ssize_t spt1_address_show(struct device *dev,
> +                                 struct device_attribute *attr, char *buf)
> 
> CHECK: Alignment should match open parenthesis
> #190: FILE: drivers/firmware/stratix10-rsu.c:787:
> +               ret = rsu_send_msg(priv, COMMAND_MBOX_SEND_CMD,
> +                               RSU_GET_SPT_CMD, rsu_get_spt_callback);

Thanks. 

Regards, 
Lee, Kah Jing

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-07-25  8:54 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-07-17  1:49 [PATCH v3 0/2] Query the RSU SPT table offset to determine RSU page size kah.jing.lee
2023-07-17  1:49 ` [PATCH v3 1/2] firmware: stratix10-svc: Generic Mailbox Command kah.jing.lee
2023-07-21  2:33   ` Lee, Kah Jing
2023-07-17  1:50 ` [PATCH v3 2/2] firmware: stratix10-rsu: query spt addresses kah.jing.lee
2023-07-21  2:34   ` Lee, Kah Jing
2023-07-24 14:39     ` Dinh Nguyen
2023-07-25  8:51       ` Lee, Kah Jing

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.