summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWealian Liao <whliao@nuvoton.corp-partner.google.com>2021-07-08 17:16:48 +0800
committerCommit Bot <commit-bot@chromium.org>2021-08-04 18:11:55 +0000
commit05f0f8bdc779e26b661cd6460309e3c3a8acefa0 (patch)
tree923cecab68190e0aad5ff01bf55bfe19864107a6
parent9b779dd2ce02e7b43b5bf835c09aff4f3ea3a21f (diff)
downloadchrome-ec-05f0f8bdc779e26b661cd6460309e3c3a8acefa0.tar.gz
zephyr: Move BBRAM access functions to common system.c
NPCX & IT8xxx2 series are both use BBRAM for scratchpad/reset_flags access. cros_bbram API already handles the chip-specific code. This CL moves scratchpad/reset_flags access functions to the common system.c to avoid duplicate those functions. BUG=none BRANCH=none TEST=zmake testall TEST=check reset cause on lazor & npcx_evb Signed-off-by: Wealian Liao <whliao@nuvoton.corp-partner.google.com> Change-Id: I0a394e5fbf784ec2e3caea77f194c88ae9d5542e Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3067156 Reviewed-by: Yuval Peress <peress@chromium.org> Commit-Queue: Yuval Peress <peress@chromium.org>
-rw-r--r--zephyr/shim/chip/it8xxx2/system.c79
-rw-r--r--zephyr/shim/chip/npcx/system.c49
-rw-r--r--zephyr/shim/src/system.c85
-rw-r--r--zephyr/shim/src/ztest_system.c9
-rw-r--r--zephyr/test/system/overlay.dts8
5 files changed, 82 insertions, 148 deletions
diff --git a/zephyr/shim/chip/it8xxx2/system.c b/zephyr/shim/chip/it8xxx2/system.c
index e40c49d137..d9dcd7ccfb 100644
--- a/zephyr/shim/chip/it8xxx2/system.c
+++ b/zephyr/shim/chip/it8xxx2/system.c
@@ -3,87 +3,8 @@
* found in the LICENSE file.
*/
-#include <drivers/cros_bbram.h>
-#include <logging/log.h>
-
#include "system.h"
-#define GET_BBRAM_OFFSET(node) \
- DT_PROP(DT_PATH(named_bbram_regions, node), offset)
-#define GET_BBRAM_SIZE(node) DT_PROP(DT_PATH(named_bbram_regions, node), size)
-
-LOG_MODULE_REGISTER(shim_ite_system, LOG_LEVEL_ERR);
-
-const struct device *bbram_dev;
-
-void chip_save_reset_flags(uint32_t flags)
-{
- if (bbram_dev == NULL) {
- LOG_ERR("bbram_dev doesn't have a binding");
- return;
- }
-
- cros_bbram_write(bbram_dev, GET_BBRAM_OFFSET(saved_reset_flags),
- GET_BBRAM_SIZE(saved_reset_flags), (uint8_t *)&flags);
-}
-
-uint32_t chip_read_reset_flags(void)
-{
- uint32_t flags = 0;
-
- if (bbram_dev == NULL) {
- LOG_ERR("bbram_dev doesn't have a binding");
- return 0;
- }
-
- cros_bbram_read(bbram_dev, GET_BBRAM_OFFSET(saved_reset_flags),
- GET_BBRAM_SIZE(saved_reset_flags), (uint8_t *)&flags);
-
- return flags;
-}
-
-int system_set_scratchpad(uint32_t value)
-{
- if (bbram_dev == NULL) {
- LOG_ERR("bbram_dev doesn't have a binding");
- return 0;
- }
-
- cros_bbram_write(bbram_dev, GET_BBRAM_OFFSET(scratchpad),
- GET_BBRAM_SIZE(scratchpad), (uint8_t *)&value);
-
- return EC_SUCCESS;
-}
-
-uint32_t system_get_scratchpad(void)
-{
- uint32_t value = 0;
-
- if (bbram_dev == NULL) {
- LOG_ERR("bbram_dev doesn't have a binding");
- return 0;
- }
-
- cros_bbram_read(bbram_dev, GET_BBRAM_OFFSET(scratchpad),
- GET_BBRAM_SIZE(scratchpad), (uint8_t *)&value);
-
- return value;
-}
-
-static int chip_system_init(const struct device *unused)
-{
- ARG_UNUSED(unused);
-
- bbram_dev = DEVICE_DT_GET(DT_NODELABEL(bbram));
- if (!device_is_ready(bbram_dev)) {
- LOG_ERR("Error: device %s is not ready", bbram_dev->name);
- return -1;
- }
-
- return 0;
-}
-SYS_INIT(chip_system_init, PRE_KERNEL_1, 15);
-
uintptr_t system_get_fw_reset_vector(uintptr_t base)
{
/*
diff --git a/zephyr/shim/chip/npcx/system.c b/zephyr/shim/chip/npcx/system.c
index 2e1e8c5168..0a1f50844e 100644
--- a/zephyr/shim/chip/npcx/system.c
+++ b/zephyr/shim/chip/npcx/system.c
@@ -9,44 +9,15 @@
#include "system.h"
#include "system_chip.h"
-#define GET_BBRAM_OFFSET(node) \
- DT_PROP(DT_PATH(named_bbram_regions, node), offset)
-#define GET_BBRAM_SIZE(node) DT_PROP(DT_PATH(named_bbram_regions, node), size)
-
LOG_MODULE_REGISTER(shim_npcx_system, LOG_LEVEL_ERR);
-const static struct device *bbram_dev;
-
-void chip_save_reset_flags(uint32_t flags)
-{
- if (bbram_dev == NULL) {
- LOG_ERR("bbram_dev doesn't binding");
- return;
- }
-
- cros_bbram_write(bbram_dev, GET_BBRAM_OFFSET(saved_reset_flags),
- GET_BBRAM_SIZE(saved_reset_flags), (uint8_t *)&flags);
-}
-
-uint32_t chip_read_reset_flags(void)
-{
- uint32_t flags;
-
- if (bbram_dev == NULL) {
- LOG_ERR("bbram_dev doesn't binding");
- return 0;
- }
-
- cros_bbram_read(bbram_dev, GET_BBRAM_OFFSET(saved_reset_flags),
- GET_BBRAM_SIZE(saved_reset_flags), (uint8_t *)&flags);
-
- return flags;
-}
-
void chip_bbram_status_check(void)
{
- if (!bbram_dev) {
- LOG_DBG("bbram_dev doesn't binding");
+ const struct device *bbram_dev;
+
+ bbram_dev = DEVICE_DT_GET(DT_NODELABEL(bbram));
+ if (!device_is_ready(bbram_dev)) {
+ LOG_ERR("Error: device %s is not ready", bbram_dev->name);
return;
}
@@ -107,16 +78,8 @@ static int chip_system_init(const struct device *unused)
ARG_UNUSED(unused);
/*
- * NPCX chip uses BBRAM to save the reset flag. Binding & check BBRAM
- * here.
+ * Check BBRAM power status.
*/
- bbram_dev = DEVICE_DT_GET(DT_NODELABEL(bbram));
- if (!device_is_ready(bbram_dev)) {
- LOG_ERR("Error: device %s is not ready", bbram_dev->name);
- return -1;
- }
-
- /* check the BBRAM status */
chip_bbram_status_check();
system_mpu_config();
diff --git a/zephyr/shim/src/system.c b/zephyr/shim/src/system.c
index 55fe5183b8..5a9612fa26 100644
--- a/zephyr/shim/src/system.c
+++ b/zephyr/shim/src/system.c
@@ -20,28 +20,15 @@
#define BBRAM_REGION_PD2 DT_PATH(named_bbram_regions, pd2)
#define BBRAM_REGION_TRY_SLOT DT_PATH(named_bbram_regions, try_slot)
+#define GET_BBRAM_OFFSET(node) \
+ DT_PROP(DT_PATH(named_bbram_regions, node), offset)
+#define GET_BBRAM_SIZE(node) DT_PROP(DT_PATH(named_bbram_regions, node), size)
+
LOG_MODULE_REGISTER(shim_system, LOG_LEVEL_ERR);
STATIC_IF_NOT(CONFIG_ZTEST) const struct device *bbram_dev;
static const struct device *sys_dev;
-#if DT_NODE_EXISTS(DT_NODELABEL(bbram))
-static int system_init(const struct device *unused)
-{
- ARG_UNUSED(unused);
-
- bbram_dev = DEVICE_DT_GET(DT_NODELABEL(bbram));
- if (!device_is_ready(bbram_dev)) {
- LOG_ERR("Error: device %s is not ready", bbram_dev->name);
- return -1;
- }
-
- return 0;
-}
-
-SYS_INIT(system_init, PRE_KERNEL_1, 50);
-#endif
-
/* Map idx to a bbram offset/size, or return -1 on invalid idx */
static int bbram_lookup(enum system_bbram_idx idx, int *offset_out,
int *size_out)
@@ -85,6 +72,62 @@ int system_get_bbram(enum system_bbram_idx idx, uint8_t *value)
return rc ? EC_ERROR_INVAL : EC_SUCCESS;
}
+void chip_save_reset_flags(uint32_t flags)
+{
+ if (bbram_dev == NULL) {
+ LOG_ERR("bbram_dev doesn't binding");
+ return;
+ }
+
+ cros_bbram_write(bbram_dev, GET_BBRAM_OFFSET(saved_reset_flags),
+ GET_BBRAM_SIZE(saved_reset_flags), (uint8_t *)&flags);
+}
+
+uint32_t chip_read_reset_flags(void)
+{
+ uint32_t flags;
+
+ if (bbram_dev == NULL) {
+ LOG_ERR("bbram_dev doesn't binding");
+ return 0;
+ }
+
+ cros_bbram_read(bbram_dev, GET_BBRAM_OFFSET(saved_reset_flags),
+ GET_BBRAM_SIZE(saved_reset_flags), (uint8_t *)&flags);
+
+ return flags;
+}
+
+int system_set_scratchpad(uint32_t value)
+{
+ if (bbram_dev == NULL) {
+ LOG_ERR("bbram_dev doesn't binding");
+ return -EC_ERROR_INVAL;
+ }
+
+ return cros_bbram_write(bbram_dev, GET_BBRAM_OFFSET(scratchpad),
+ GET_BBRAM_SIZE(scratchpad), (uint8_t *)&value);
+}
+
+uint32_t system_get_scratchpad(void)
+{
+ uint32_t value;
+
+ if (bbram_dev == NULL) {
+ LOG_ERR("bbram_dev doesn't binding");
+ /*
+ * TODO(b/195481980): Seperate the scratchpad value & API
+ * status.
+ */
+ return 0;
+ }
+
+ cros_bbram_read(bbram_dev, GET_BBRAM_OFFSET(scratchpad),
+ GET_BBRAM_SIZE(scratchpad), (uint8_t *)&value);
+
+ return value;
+}
+
void system_hibernate(uint32_t seconds, uint32_t microseconds)
{
const struct device *sys_dev = device_get_binding("CROS_SYSTEM");
@@ -282,6 +325,14 @@ static int system_preinitialize(const struct device *unused)
{
ARG_UNUSED(unused);
+#if DT_NODE_EXISTS(DT_NODELABEL(bbram))
+ bbram_dev = DEVICE_DT_GET(DT_NODELABEL(bbram));
+ if (!device_is_ready(bbram_dev)) {
+ LOG_ERR("Error: device %s is not ready", bbram_dev->name);
+ return -1;
+ }
+#endif
+
sys_dev = device_get_binding("CROS_SYSTEM");
if (!sys_dev) {
/*
diff --git a/zephyr/shim/src/ztest_system.c b/zephyr/shim/src/ztest_system.c
index 02fdf6c4cc..4b30270692 100644
--- a/zephyr/shim/src/ztest_system.c
+++ b/zephyr/shim/src/ztest_system.c
@@ -53,15 +53,6 @@ void system_print_banner(void)
printk("Image: %s\n", build_info);
}
-uint32_t chip_read_reset_flags(void)
-{
- return 0;
-}
-
-void chip_save_reset_flags(uint32_t flags)
-{
-}
-
void system_set_reset_flags(uint32_t flags)
{
}
diff --git a/zephyr/test/system/overlay.dts b/zephyr/test/system/overlay.dts
index 49698a7553..37bac97680 100644
--- a/zephyr/test/system/overlay.dts
+++ b/zephyr/test/system/overlay.dts
@@ -22,5 +22,13 @@
offset = <0x07>;
size = <0x05>;
};
+ scratchpad {
+ offset = <0x0c>;
+ size = <0x04>;
+ };
+ saved-reset-flags {
+ offset = <0x10>;
+ size = <0x04>;
+ };
};
};