Re: [PATCH v1 1/2] hw/misc: add ibex lifecycle controller

2022-10-09 Thread Alistair Francis
On Wed, Sep 28, 2022 at 3:11 PM Wilfred Mallawa
 wrote:
>
> From: Wilfred Mallawa 
>
> Device model for the OpenTitan lifecycle controller as per [1].
>
> Addition of this model is the first of many steps to adding `boot_rom`
> support for OpenTitan. The OpenTitan `boot_rom` needs to access the
> lifecycle controller during the init/test sequence before it jumps to
> flash. With this model, we can get past the lifecycle controller stages
> in boot.
>
> Currently the supported functionality is limited.
>
> [1] https://docs.opentitan.org/hw/ip/lc_ctrl/doc/
>
> Signed-off-by: Wilfred Mallawa 
> ---
>  hw/misc/ibex_lc_ctrl.c | 287 +
>  hw/misc/meson.build|   3 +
>  hw/misc/trace-events   |   5 +
>  include/hw/misc/ibex_lc_ctrl.h | 121 ++
>  4 files changed, 416 insertions(+)
>  create mode 100644 hw/misc/ibex_lc_ctrl.c
>  create mode 100644 include/hw/misc/ibex_lc_ctrl.h
>
> diff --git a/hw/misc/ibex_lc_ctrl.c b/hw/misc/ibex_lc_ctrl.c
> new file mode 100644
> index 00..f034a92a9c
> --- /dev/null
> +++ b/hw/misc/ibex_lc_ctrl.c
> @@ -0,0 +1,287 @@
> +/*
> + * QEMU model of the Ibex Life Cycle Controller
> + * SPEC Reference: https://docs.opentitan.org/hw/ip/lc_ctrl/doc/
> + *
> + * Copyright (C) 2022 Western Digital
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a 
> copy
> + * of this software and associated documentation files (the "Software"), to 
> deal
> + * in the Software without restriction, including without limitation the 
> rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
> FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/log.h"
> +#include "qemu/module.h"
> +#include "hw/misc/ibex_lc_ctrl.h"
> +#include "hw/irq.h"
> +#include "hw/qdev-properties.h"
> +#include "hw/qdev-properties-system.h"
> +#include "migration/vmstate.h"
> +#include "trace.h"
> +
> +REG32(ALERT_TEST, 0x00)
> +FIELD(ALERT_TEST, FETAL_PROG_ERR, 0, 1)
> +FIELD(ALERT_TEST, FETAL_STATE_ERR, 1, 1)
> +FIELD(ALERT_TEST, FETAL_BUS_INTEG_ERR, 2, 1)
> +REG32(CTRL_STATUS, 0x04)
> +FIELD(CTRL_STATUS, READY, 0, 1)
> +FIELD(CTRL_STATUS, TRANSITION_SUCCESSFUL, 0, 1)
> +FIELD(CTRL_STATUS, TRANSITION_COUNT_ERROR, 1, 1)
> +FIELD(CTRL_STATUS, TRANSITION_ERROR, 2, 1)
> +FIELD(CTRL_STATUS, TOKEN_ERROR, 3, 1)
> +FIELD(CTRL_STATUS, FLASH_RMA_ERROR, 4, 1)
> +FIELD(CTRL_STATUS, OTP_ERROR, 5, 1)
> +FIELD(CTRL_STATUS, STATE_ERROR, 6, 1)
> +FIELD(CTRL_STATUS, BUS_INTEG_ERROR, 7, 1)
> +FIELD(CTRL_STATUS, OTP_PARTITION_ERROR, 8, 1)
> +REG32(CLAIM_TRANSITION_IF, 0x08)
> + FIELD(CLAIM_TRANSITION_IF, MUTEX, 0, 8)
> +REG32(TRANSITION_REGWEN , 0x0C)
> + FIELD(TRANSITION_REGWEN , TRANSITION_REGWEN, 0, 1)
> +REG32(TRANSITION_CMD , 0x10)
> + FIELD(TRANSITION_CMD , START, 0, 1)
> +REG32(TRANSITION_CTRL , 0x14)
> + FIELD(TRANSITION_CTRL , EXT_CLOCK_EN, 0, 1)
> +REG32(TRANSITION_TOKEN_0 , 0x18)
> + FIELD(TRANSITION_TOKEN_0 , TRANSITION_TOKEN_0, 0, 32)
> +REG32(TRANSITION_TOKEN_1 , 0x1C)
> + FIELD(TRANSITION_TOKEN_1 , TRANSITION_TOKEN_1, 0, 32)
> +REG32(TRANSITION_TOKEN_2 , 0x20)
> + FIELD(TRANSITION_TOKEN_2 , TRANSITION_TOKEN_2, 0, 32)
> +REG32(TRANSITION_TOKEN_3 , 0x24)
> + FIELD(TRANSITION_TOKEN_3 , TRANSITION_TOKEN_3, 0, 32)
> +REG32(TRANSITION_TARGET , 0x28)
> + FIELD(TRANSITION_TARGET , STATE, 0, 30)
> +REG32(OTP_VENDOR_TEST_CTRL , 0x2C)
> + FIELD(OTP_VENDOR_TEST_CTRL , OTP_VENDOR_TEST_CTRL, 0, 32)
> +REG32(OTP_VENDOR_TEST_STATUS , 0x30)
> + FIELD(OTP_VENDOR_TEST_STATUS , OTP_VENDOR_TEST_STATUS, 0, 32)
> +REG32(LC_STATE , 0x34)
> + FIELD(LC_STATE , STATE, 0, 30)
> +REG32(LC_TRANSITION_CNT , 0x38)
> + FIELD(LC_TRANSITION_CNT , CNT, 0, 5)
> +REG32(LC_ID_STATE , 0x3C)
> + FIELD(LC_ID_STATE , STATE, 0, 32)
> +REG32(HW_REV , 0x40)
> + FIELD(HW_REV , CHIP_REV, 0, 16)
> + FIELD(HW_REV , CHIP_GEN, 16, 16)
> +REG32(DEVICE_ID_0 , 0x44)
> + FIELD(DEVICE_ID_0 , DEVICE_ID_0, 0, 32)
> +REG32(DEVICE_ID_1 , 0x48)
> + FIELD(DEVICE_ID_1 , DEVICE_ID_2, 0, 32)
> +REG32(DEVICE_ID_2 , 0x4C)
> + FIELD(DEVICE_ID_2 , DEVICE_ID_2, 

[PATCH v1 1/2] hw/misc: add ibex lifecycle controller

2022-09-27 Thread Wilfred Mallawa
From: Wilfred Mallawa 

Device model for the OpenTitan lifecycle controller as per [1].

Addition of this model is the first of many steps to adding `boot_rom`
support for OpenTitan. The OpenTitan `boot_rom` needs to access the
lifecycle controller during the init/test sequence before it jumps to
flash. With this model, we can get past the lifecycle controller stages
in boot.

Currently the supported functionality is limited.

[1] https://docs.opentitan.org/hw/ip/lc_ctrl/doc/

Signed-off-by: Wilfred Mallawa 
---
 hw/misc/ibex_lc_ctrl.c | 287 +
 hw/misc/meson.build|   3 +
 hw/misc/trace-events   |   5 +
 include/hw/misc/ibex_lc_ctrl.h | 121 ++
 4 files changed, 416 insertions(+)
 create mode 100644 hw/misc/ibex_lc_ctrl.c
 create mode 100644 include/hw/misc/ibex_lc_ctrl.h

diff --git a/hw/misc/ibex_lc_ctrl.c b/hw/misc/ibex_lc_ctrl.c
new file mode 100644
index 00..f034a92a9c
--- /dev/null
+++ b/hw/misc/ibex_lc_ctrl.c
@@ -0,0 +1,287 @@
+/*
+ * QEMU model of the Ibex Life Cycle Controller
+ * SPEC Reference: https://docs.opentitan.org/hw/ip/lc_ctrl/doc/
+ *
+ * Copyright (C) 2022 Western Digital
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to 
deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/log.h"
+#include "qemu/module.h"
+#include "hw/misc/ibex_lc_ctrl.h"
+#include "hw/irq.h"
+#include "hw/qdev-properties.h"
+#include "hw/qdev-properties-system.h"
+#include "migration/vmstate.h"
+#include "trace.h"
+
+REG32(ALERT_TEST, 0x00)
+FIELD(ALERT_TEST, FETAL_PROG_ERR, 0, 1)
+FIELD(ALERT_TEST, FETAL_STATE_ERR, 1, 1)
+FIELD(ALERT_TEST, FETAL_BUS_INTEG_ERR, 2, 1)
+REG32(CTRL_STATUS, 0x04)
+FIELD(CTRL_STATUS, READY, 0, 1)
+FIELD(CTRL_STATUS, TRANSITION_SUCCESSFUL, 0, 1)
+FIELD(CTRL_STATUS, TRANSITION_COUNT_ERROR, 1, 1)
+FIELD(CTRL_STATUS, TRANSITION_ERROR, 2, 1)
+FIELD(CTRL_STATUS, TOKEN_ERROR, 3, 1)
+FIELD(CTRL_STATUS, FLASH_RMA_ERROR, 4, 1)
+FIELD(CTRL_STATUS, OTP_ERROR, 5, 1)
+FIELD(CTRL_STATUS, STATE_ERROR, 6, 1)
+FIELD(CTRL_STATUS, BUS_INTEG_ERROR, 7, 1)
+FIELD(CTRL_STATUS, OTP_PARTITION_ERROR, 8, 1)
+REG32(CLAIM_TRANSITION_IF, 0x08)
+ FIELD(CLAIM_TRANSITION_IF, MUTEX, 0, 8)
+REG32(TRANSITION_REGWEN , 0x0C)
+ FIELD(TRANSITION_REGWEN , TRANSITION_REGWEN, 0, 1)
+REG32(TRANSITION_CMD , 0x10)
+ FIELD(TRANSITION_CMD , START, 0, 1)
+REG32(TRANSITION_CTRL , 0x14)
+ FIELD(TRANSITION_CTRL , EXT_CLOCK_EN, 0, 1)
+REG32(TRANSITION_TOKEN_0 , 0x18)
+ FIELD(TRANSITION_TOKEN_0 , TRANSITION_TOKEN_0, 0, 32)
+REG32(TRANSITION_TOKEN_1 , 0x1C)
+ FIELD(TRANSITION_TOKEN_1 , TRANSITION_TOKEN_1, 0, 32)
+REG32(TRANSITION_TOKEN_2 , 0x20)
+ FIELD(TRANSITION_TOKEN_2 , TRANSITION_TOKEN_2, 0, 32)
+REG32(TRANSITION_TOKEN_3 , 0x24)
+ FIELD(TRANSITION_TOKEN_3 , TRANSITION_TOKEN_3, 0, 32)
+REG32(TRANSITION_TARGET , 0x28)
+ FIELD(TRANSITION_TARGET , STATE, 0, 30)
+REG32(OTP_VENDOR_TEST_CTRL , 0x2C)
+ FIELD(OTP_VENDOR_TEST_CTRL , OTP_VENDOR_TEST_CTRL, 0, 32)
+REG32(OTP_VENDOR_TEST_STATUS , 0x30)
+ FIELD(OTP_VENDOR_TEST_STATUS , OTP_VENDOR_TEST_STATUS, 0, 32)
+REG32(LC_STATE , 0x34)
+ FIELD(LC_STATE , STATE, 0, 30)
+REG32(LC_TRANSITION_CNT , 0x38)
+ FIELD(LC_TRANSITION_CNT , CNT, 0, 5)
+REG32(LC_ID_STATE , 0x3C)
+ FIELD(LC_ID_STATE , STATE, 0, 32)
+REG32(HW_REV , 0x40)
+ FIELD(HW_REV , CHIP_REV, 0, 16)
+ FIELD(HW_REV , CHIP_GEN, 16, 16)
+REG32(DEVICE_ID_0 , 0x44)
+ FIELD(DEVICE_ID_0 , DEVICE_ID_0, 0, 32)
+REG32(DEVICE_ID_1 , 0x48)
+ FIELD(DEVICE_ID_1 , DEVICE_ID_2, 0, 32)
+REG32(DEVICE_ID_2 , 0x4C)
+ FIELD(DEVICE_ID_2 , DEVICE_ID_2, 0, 32)
+REG32(DEVICE_ID_3 , 0x50)
+ FIELD(DEVICE_ID_3 , DEVICE_ID_3, 0, 32)
+REG32(DEVICE_ID_4 , 0x54)
+ FIELD(DEVICE_ID_4 , DEVICE_ID_4, 0, 32)
+REG32(DEVICE_ID_5 , 0x58)
+ FIELD(DEVICE_ID_5 , DEVICE_ID_5, 0, 32)
+REG32(DEVICE_ID_6 , 0x5C)
+ FIELD(DEVICE_ID_6 , DEVICE_ID_6, 0,