2023-08-09 15:14:33

by Asmaa Mnebhi

[permalink] [raw]
Subject: [PATCH v1 2/2] mlxbf-bootctl: Support setting the ARM boot state to "OS up"

The BlueField has internal registers to store the ARM boot states.
Support setting the BlueField ARM boot state to "OS up".

Signed-off-by: Asmaa Mnebhi <[email protected]>
---
drivers/platform/mellanox/mlxbf-bootctl.c | 25 +++++++++++++++++++++++
drivers/platform/mellanox/mlxbf-bootctl.h | 5 +++++
2 files changed, 30 insertions(+)

diff --git a/drivers/platform/mellanox/mlxbf-bootctl.c b/drivers/platform/mellanox/mlxbf-bootctl.c
index 3ea11250b681..7a67fcc6dd98 100644
--- a/drivers/platform/mellanox/mlxbf-bootctl.c
+++ b/drivers/platform/mellanox/mlxbf-bootctl.c
@@ -80,6 +80,7 @@ static const char * const mlxbf_rsh_log_level[] = {
"INFO", "WARN", "ERR", "ASSERT"};

static DEFINE_MUTEX(icm_ops_lock);
+static DEFINE_MUTEX(os_up_lock);

/* ARM SMC call which is atomic and no need for lock. */
static int mlxbf_bootctl_smc(unsigned int smc_op, int smc_arg)
@@ -431,6 +432,28 @@ static ssize_t large_icm_store(struct device *dev,
return res.a0 ? -EPERM : count;
}

+static ssize_t os_up_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct arm_smccc_res res;
+ unsigned long val;
+ int err;
+
+ err = kstrtoul(buf, 10, &val);
+ if (err)
+ return err;
+
+ if (val != 1)
+ return -EINVAL;
+
+ mutex_lock(&os_up_lock);
+ arm_smccc_smc(MLNX_HANDLE_OS_UP, 0, 0, 0, 0, 0, 0, 0, &res);
+ mutex_unlock(&os_up_lock);
+
+ return count;
+}
+
static DEVICE_ATTR_RW(post_reset_wdog);
static DEVICE_ATTR_RW(reset_action);
static DEVICE_ATTR_RW(second_reset_action);
@@ -439,6 +462,7 @@ static DEVICE_ATTR_RO(secure_boot_fuse_state);
static DEVICE_ATTR_WO(fw_reset);
static DEVICE_ATTR_WO(rsh_log);
static DEVICE_ATTR_RW(large_icm);
+static DEVICE_ATTR_WO(os_up);

static struct attribute *mlxbf_bootctl_attrs[] = {
&dev_attr_post_reset_wdog.attr,
@@ -449,6 +473,7 @@ static struct attribute *mlxbf_bootctl_attrs[] = {
&dev_attr_fw_reset.attr,
&dev_attr_rsh_log.attr,
&dev_attr_large_icm.attr,
+ &dev_attr_os_up.attr,
NULL
};

diff --git a/drivers/platform/mellanox/mlxbf-bootctl.h b/drivers/platform/mellanox/mlxbf-bootctl.h
index 75d59ade92be..19142cc71312 100644
--- a/drivers/platform/mellanox/mlxbf-bootctl.h
+++ b/drivers/platform/mellanox/mlxbf-bootctl.h
@@ -90,6 +90,11 @@

#define MAX_ICM_BUFFER_SIZE 10

+/*
+ * SMC function ID to set the ARM boot state to up
+ */
+#define MLNX_HANDLE_OS_UP 0x82000014
+
/* SMC function IDs for SiP Service queries */
#define MLXBF_BOOTCTL_SIP_SVC_CALL_COUNT 0x8200ff00
#define MLXBF_BOOTCTL_SIP_SVC_UID 0x8200ff01
--
2.30.1



2023-08-09 15:29:48

by Vadim Pasternak

[permalink] [raw]
Subject: RE: [PATCH v1 2/2] mlxbf-bootctl: Support setting the ARM boot state to "OS up"



> -----Original Message-----
> From: Asmaa Mnebhi <[email protected]>
> Sent: Wednesday, 9 August 2023 17:15
> To: [email protected]; Vadim Pasternak <[email protected]>;
> [email protected]; [email protected]
> Cc: Asmaa Mnebhi <[email protected]>
> Subject: [PATCH v1 2/2] mlxbf-bootctl: Support setting the ARM boot state to
> "OS up"
>
> The BlueField has internal registers to store the ARM boot states.
> Support setting the BlueField ARM boot state to "OS up".
>
> Signed-off-by: Asmaa Mnebhi <[email protected]>

Reviewed-by: Vadim Pasternak <[email protected]>

> ---
> drivers/platform/mellanox/mlxbf-bootctl.c | 25 +++++++++++++++++++++++
> drivers/platform/mellanox/mlxbf-bootctl.h | 5 +++++
> 2 files changed, 30 insertions(+)
>
> diff --git a/drivers/platform/mellanox/mlxbf-bootctl.c
> b/drivers/platform/mellanox/mlxbf-bootctl.c
> index 3ea11250b681..7a67fcc6dd98 100644
> --- a/drivers/platform/mellanox/mlxbf-bootctl.c
> +++ b/drivers/platform/mellanox/mlxbf-bootctl.c
> @@ -80,6 +80,7 @@ static const char * const mlxbf_rsh_log_level[] = {
> "INFO", "WARN", "ERR", "ASSERT"};
>
> static DEFINE_MUTEX(icm_ops_lock);
> +static DEFINE_MUTEX(os_up_lock);
>
> /* ARM SMC call which is atomic and no need for lock. */ static int
> mlxbf_bootctl_smc(unsigned int smc_op, int smc_arg) @@ -431,6 +432,28
> @@ static ssize_t large_icm_store(struct device *dev,
> return res.a0 ? -EPERM : count;
> }
>
> +static ssize_t os_up_store(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + struct arm_smccc_res res;
> + unsigned long val;
> + int err;
> +
> + err = kstrtoul(buf, 10, &val);
> + if (err)
> + return err;
> +
> + if (val != 1)
> + return -EINVAL;
> +
> + mutex_lock(&os_up_lock);
> + arm_smccc_smc(MLNX_HANDLE_OS_UP, 0, 0, 0, 0, 0, 0, 0, &res);
> + mutex_unlock(&os_up_lock);
> +
> + return count;
> +}
> +
> static DEVICE_ATTR_RW(post_reset_wdog); static
> DEVICE_ATTR_RW(reset_action); static
> DEVICE_ATTR_RW(second_reset_action);
> @@ -439,6 +462,7 @@ static DEVICE_ATTR_RO(secure_boot_fuse_state);
> static DEVICE_ATTR_WO(fw_reset);
> static DEVICE_ATTR_WO(rsh_log);
> static DEVICE_ATTR_RW(large_icm);
> +static DEVICE_ATTR_WO(os_up);
>
> static struct attribute *mlxbf_bootctl_attrs[] = {
> &dev_attr_post_reset_wdog.attr,
> @@ -449,6 +473,7 @@ static struct attribute *mlxbf_bootctl_attrs[] = {
> &dev_attr_fw_reset.attr,
> &dev_attr_rsh_log.attr,
> &dev_attr_large_icm.attr,
> + &dev_attr_os_up.attr,
> NULL
> };
>
> diff --git a/drivers/platform/mellanox/mlxbf-bootctl.h
> b/drivers/platform/mellanox/mlxbf-bootctl.h
> index 75d59ade92be..19142cc71312 100644
> --- a/drivers/platform/mellanox/mlxbf-bootctl.h
> +++ b/drivers/platform/mellanox/mlxbf-bootctl.h
> @@ -90,6 +90,11 @@
>
> #define MAX_ICM_BUFFER_SIZE 10
>
> +/*
> + * SMC function ID to set the ARM boot state to up */
> +#define MLNX_HANDLE_OS_UP 0x82000014
> +
> /* SMC function IDs for SiP Service queries */
> #define MLXBF_BOOTCTL_SIP_SVC_CALL_COUNT 0x8200ff00
> #define MLXBF_BOOTCTL_SIP_SVC_UID 0x8200ff01
> --
> 2.30.1