Commit d4eef752 authored by David Thompson's avatar David Thompson Committed by Ilpo Järvinen

mlxbf-bootctl: correctly identify secure boot with development keys

The secure boot state of the BlueField SoC is represented by two bits:
                0 = production state
                1 = secure boot enabled
                2 = non-secure (secure boot disabled)
                3 = RMA state
There is also a single bit to indicate whether production keys or
development keys are being used when secure boot is enabled.
This single bit (specified by MLXBF_BOOTCTL_SB_DEV_MASK) only has
meaning if secure boot state equals 1 (secure boot enabled).

The secure boot states are as follows:
- “GA secured” is when secure boot is enabled with official production keys.
- “Secured (development)” is when secure boot is enabled with development keys.

Without this fix “GA Secured” is displayed on development cards which is
misleading. This patch updates the logic in "lifecycle_state_show()" to
handle the case where the SoC is configured for secure boot and is using
development keys.

Fixes: 79e29cb8 ("platform/mellanox: Add bootctl driver for Mellanox BlueField Soc")
Reviewed-by: default avatarKhalil Blaiech <kblaiech@nvidia.com>
Signed-off-by: default avatarDavid Thompson <davthompson@nvidia.com>
Link: https://lore.kernel.org/r/20231130183515.17214-1-davthompson@nvidia.comReviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent cbf54f37
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#define MLXBF_BOOTCTL_SB_SECURE_MASK 0x03 #define MLXBF_BOOTCTL_SB_SECURE_MASK 0x03
#define MLXBF_BOOTCTL_SB_TEST_MASK 0x0c #define MLXBF_BOOTCTL_SB_TEST_MASK 0x0c
#define MLXBF_BOOTCTL_SB_DEV_MASK BIT(4)
#define MLXBF_SB_KEY_NUM 4 #define MLXBF_SB_KEY_NUM 4
...@@ -40,11 +41,18 @@ static struct mlxbf_bootctl_name boot_names[] = { ...@@ -40,11 +41,18 @@ static struct mlxbf_bootctl_name boot_names[] = {
{ MLXBF_BOOTCTL_NONE, "none" }, { MLXBF_BOOTCTL_NONE, "none" },
}; };
enum {
MLXBF_BOOTCTL_SB_LIFECYCLE_PRODUCTION = 0,
MLXBF_BOOTCTL_SB_LIFECYCLE_GA_SECURE = 1,
MLXBF_BOOTCTL_SB_LIFECYCLE_GA_NON_SECURE = 2,
MLXBF_BOOTCTL_SB_LIFECYCLE_RMA = 3
};
static const char * const mlxbf_bootctl_lifecycle_states[] = { static const char * const mlxbf_bootctl_lifecycle_states[] = {
[0] = "Production", [MLXBF_BOOTCTL_SB_LIFECYCLE_PRODUCTION] = "Production",
[1] = "GA Secured", [MLXBF_BOOTCTL_SB_LIFECYCLE_GA_SECURE] = "GA Secured",
[2] = "GA Non-Secured", [MLXBF_BOOTCTL_SB_LIFECYCLE_GA_NON_SECURE] = "GA Non-Secured",
[3] = "RMA", [MLXBF_BOOTCTL_SB_LIFECYCLE_RMA] = "RMA",
}; };
/* Log header format. */ /* Log header format. */
...@@ -247,25 +255,30 @@ static ssize_t second_reset_action_store(struct device *dev, ...@@ -247,25 +255,30 @@ static ssize_t second_reset_action_store(struct device *dev,
static ssize_t lifecycle_state_show(struct device *dev, static ssize_t lifecycle_state_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
int status_bits;
int use_dev_key;
int test_state;
int lc_state; int lc_state;
lc_state = mlxbf_bootctl_smc(MLXBF_BOOTCTL_GET_TBB_FUSE_STATUS, status_bits = mlxbf_bootctl_smc(MLXBF_BOOTCTL_GET_TBB_FUSE_STATUS,
MLXBF_BOOTCTL_FUSE_STATUS_LIFECYCLE); MLXBF_BOOTCTL_FUSE_STATUS_LIFECYCLE);
if (lc_state < 0) if (status_bits < 0)
return lc_state; return status_bits;
lc_state &= use_dev_key = status_bits & MLXBF_BOOTCTL_SB_DEV_MASK;
MLXBF_BOOTCTL_SB_TEST_MASK | MLXBF_BOOTCTL_SB_SECURE_MASK; test_state = status_bits & MLXBF_BOOTCTL_SB_TEST_MASK;
lc_state = status_bits & MLXBF_BOOTCTL_SB_SECURE_MASK;
/* /*
* If the test bits are set, we specify that the current state may be * If the test bits are set, we specify that the current state may be
* due to using the test bits. * due to using the test bits.
*/ */
if (lc_state & MLXBF_BOOTCTL_SB_TEST_MASK) { if (test_state) {
lc_state &= MLXBF_BOOTCTL_SB_SECURE_MASK;
return sprintf(buf, "%s(test)\n", return sprintf(buf, "%s(test)\n",
mlxbf_bootctl_lifecycle_states[lc_state]); mlxbf_bootctl_lifecycle_states[lc_state]);
} else if (use_dev_key &&
(lc_state == MLXBF_BOOTCTL_SB_LIFECYCLE_GA_SECURE)) {
return sprintf(buf, "Secured (development)\n");
} }
return sprintf(buf, "%s\n", mlxbf_bootctl_lifecycle_states[lc_state]); return sprintf(buf, "%s\n", mlxbf_bootctl_lifecycle_states[lc_state]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment