From 74b9a607b480124ac0b33c6558d4004e277493d5 Mon Sep 17 00:00:00 2001 From: Yuval Peress Date: Fri, 20 Aug 2021 13:31:33 -0600 Subject: [PATCH] drivers: bbram: Add it8xxx2 BBRAM driver implementation Note that the it8xxx2 does not support a status register so that functionality is omitted. This change also adds driver tests that build both the npcx and it8xxx2 drivers. Signed-off-by: Yuval Peress --- drivers/bbram/CMakeLists.txt | 1 + drivers/bbram/Kconfig | 2 + drivers/bbram/Kconfig.it8xxx2 | 12 ++ drivers/bbram/bbram_it8xxx2.c | 70 ++++++++++ .../memory-controllers/ite,it8xxx2-bbram.yaml | 15 +++ dts/riscv/it8xxx2.dtsi | 8 ++ .../drivers/bbram/boards/qemu_riscv32.overlay | 14 ++ tests/drivers/bbram/emul/CMakeLists.txt | 10 ++ .../{ => emul}/boards/native_posix.overlay | 0 tests/drivers/bbram/{ => emul}/prj.conf | 0 tests/drivers/bbram/emul/src/main.c | 125 ++++++++++++++++++ tests/drivers/bbram/emul/testcase.yaml | 10 ++ tests/drivers/bbram/it8xxx2.conf | 6 + tests/drivers/bbram/npcx.conf | 6 + tests/drivers/bbram/src/main.c | 116 +--------------- tests/drivers/bbram/testcase.yaml | 15 ++- 16 files changed, 289 insertions(+), 121 deletions(-) create mode 100644 drivers/bbram/Kconfig.it8xxx2 create mode 100644 drivers/bbram/bbram_it8xxx2.c create mode 100644 dts/bindings/memory-controllers/ite,it8xxx2-bbram.yaml create mode 100644 tests/drivers/bbram/boards/qemu_riscv32.overlay create mode 100644 tests/drivers/bbram/emul/CMakeLists.txt rename tests/drivers/bbram/{ => emul}/boards/native_posix.overlay (100%) rename tests/drivers/bbram/{ => emul}/prj.conf (100%) create mode 100644 tests/drivers/bbram/emul/src/main.c create mode 100644 tests/drivers/bbram/emul/testcase.yaml create mode 100644 tests/drivers/bbram/it8xxx2.conf create mode 100644 tests/drivers/bbram/npcx.conf diff --git a/drivers/bbram/CMakeLists.txt b/drivers/bbram/CMakeLists.txt index cce72264923..7d9940ef3bf 100644 --- a/drivers/bbram/CMakeLists.txt +++ b/drivers/bbram/CMakeLists.txt @@ -4,4 +4,5 @@ zephyr_library() zephyr_library_sources_ifdef(CONFIG_BBRAM_NPCX bbram_npcx.c) +zephyr_library_sources_ifdef(CONFIG_BBRAM_IT8XXX2 bbram_it8xxx2.c) zephyr_library_sources_ifdef(CONFIG_BBRAM_EMUL bbram_emul.c) diff --git a/drivers/bbram/Kconfig b/drivers/bbram/Kconfig index 5a887f15efe..1a947282f30 100644 --- a/drivers/bbram/Kconfig +++ b/drivers/bbram/Kconfig @@ -20,6 +20,8 @@ config BBRAM_INIT_PRIORITY source "drivers/bbram/Kconfig.npcx" +source "drivers/bbram/Kconfig.it8xxx2" + source "drivers/bbram/Kconfig.bbram_emul" endif # BBRAM diff --git a/drivers/bbram/Kconfig.it8xxx2 b/drivers/bbram/Kconfig.it8xxx2 new file mode 100644 index 00000000000..f421b6e91ca --- /dev/null +++ b/drivers/bbram/Kconfig.it8xxx2 @@ -0,0 +1,12 @@ +# Copyright (c) 2021 Google Inc +# SPDX-License-Identifier: Apache-2.0 + +DT_COMPAT_ST_BBRAM_IT8XXX2 := ite,it8xxx2-bbram + +config BBRAM_IT8XXX2 + bool "ITE IT81202 Battery-backed RAM drivers" + depends on SOC_FAMILY_RISCV_ITE + default $(dt_compat_enabled,${DT_COMPAT_ST_BBRAM_IT8XXX2}) + help + This option enables the BBRAM driver for RISCV_ITE family of + processors. diff --git a/drivers/bbram/bbram_it8xxx2.c b/drivers/bbram/bbram_it8xxx2.c new file mode 100644 index 00000000000..b1b488982fa --- /dev/null +++ b/drivers/bbram/bbram_it8xxx2.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2021 Google Inc + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define DT_DRV_COMPAT ite_it8xxx2_bbram + +#include +#include +#include + +#include +LOG_MODULE_REGISTER(bbram, CONFIG_BBRAM_LOG_LEVEL); + +/** Device config */ +struct bbram_it8xxx2_config { + /** BBRAM base address */ + uintptr_t base_addr; + /** BBRAM size (Unit:bytes) */ + int size; +}; + +static int bbram_it8xxx2_read(const struct device *dev, size_t offset, size_t size, uint8_t *data) +{ + const struct bbram_it8xxx2_config *config = dev->config; + + if (size < 1 || offset + size > config->size) { + return -EFAULT; + } + + bytecpy(data, ((uint8_t *)config->base_addr + offset), size); + return 0; +} + +static int bbram_it8xxx2_write(const struct device *dev, size_t offset, size_t size, + const uint8_t *data) +{ + const struct bbram_it8xxx2_config *config = dev->config; + + if (size < 1 || offset + size > config->size) { + return -EFAULT; + } + + bytecpy(((uint8_t *)config->base_addr + offset), data, size); + return 0; +} + +static const struct bbram_driver_api bbram_it8xxx2_driver_api = { + .read = bbram_it8xxx2_read, + .write = bbram_it8xxx2_write, +}; + +static int bbram_it8xxx2_init(const struct device *dev) +{ + ARG_UNUSED(dev); + + return 0; +} + +#define BBRAM_INIT(inst) \ + static const struct bbram_it8xxx2_config bbram_cfg_##inst = { \ + .base_addr = DT_INST_REG_ADDR(inst), \ + .size = DT_INST_REG_SIZE(inst), \ + }; \ + DEVICE_DT_INST_DEFINE(inst, bbram_it8xxx2_init, NULL, NULL, &bbram_cfg_##inst, \ + PRE_KERNEL_1, CONFIG_BBRAM_INIT_PRIORITY, \ + &bbram_it8xxx2_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(BBRAM_INIT); diff --git a/dts/bindings/memory-controllers/ite,it8xxx2-bbram.yaml b/dts/bindings/memory-controllers/ite,it8xxx2-bbram.yaml new file mode 100644 index 00000000000..0104f892be6 --- /dev/null +++ b/dts/bindings/memory-controllers/ite,it8xxx2-bbram.yaml @@ -0,0 +1,15 @@ +# Copyright (c) 2021 Google Inc. +# SPDX-License-Identifier: Apache-2.0 + +description: ITE, IT8XXX2 Battery Backed RAM node + +compatible: "ite,it8xxx2-bbram" + +include: base.yaml + +properties: + reg: + required: true + + label: + required: true diff --git a/dts/riscv/it8xxx2.dtsi b/dts/riscv/it8xxx2.dtsi index 9037b14a4ee..61c35211fbc 100644 --- a/dts/riscv/it8xxx2.dtsi +++ b/dts/riscv/it8xxx2.dtsi @@ -32,6 +32,14 @@ #size-cells = <1>; ranges; + bbram: bb-ram@f02200 { + #address-cells = <1>; + #size-cells = <1>; + compatible = "ite,it8xxx2-bbram"; + status = "okay"; + reg = <0x00f02200 0xc0>; + label = "BBRAM"; + }; flashctrl: flash-controller@f01000 { compatible = "ite,it8xxx2-flash-controller"; reg = <0x00f01000 0x100>; diff --git a/tests/drivers/bbram/boards/qemu_riscv32.overlay b/tests/drivers/bbram/boards/qemu_riscv32.overlay new file mode 100644 index 00000000000..ef3e74b3992 --- /dev/null +++ b/tests/drivers/bbram/boards/qemu_riscv32.overlay @@ -0,0 +1,14 @@ +/* + * Copyright 2021 Google LLC + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + bbram: bbram@80 { + compatible = "ite,it8xxx2-bbram"; + status = "okay"; + reg = <0x80 0xff>; + label = "BBRAM"; + }; +}; diff --git a/tests/drivers/bbram/emul/CMakeLists.txt b/tests/drivers/bbram/emul/CMakeLists.txt new file mode 100644 index 00000000000..d9ab8b823f2 --- /dev/null +++ b/tests/drivers/bbram/emul/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright 2021 Google LLC +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(bbram) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/tests/drivers/bbram/boards/native_posix.overlay b/tests/drivers/bbram/emul/boards/native_posix.overlay similarity index 100% rename from tests/drivers/bbram/boards/native_posix.overlay rename to tests/drivers/bbram/emul/boards/native_posix.overlay diff --git a/tests/drivers/bbram/prj.conf b/tests/drivers/bbram/emul/prj.conf similarity index 100% rename from tests/drivers/bbram/prj.conf rename to tests/drivers/bbram/emul/prj.conf diff --git a/tests/drivers/bbram/emul/src/main.c b/tests/drivers/bbram/emul/src/main.c new file mode 100644 index 00000000000..06351804231 --- /dev/null +++ b/tests/drivers/bbram/emul/src/main.c @@ -0,0 +1,125 @@ +/* + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +#define BBRAM_NODELABEL DT_NODELABEL(bbram) +#define BBRAM_LABEL DT_LABEL(BBRAM_NODELABEL) +#define BBRAM_SIZE DT_PROP(BBRAM_NODELABEL, size) + +static void test_get_size(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + size_t size; + + zassert_ok(bbram_get_size(dev, &size), NULL); + zassert_equal(size, BBRAM_SIZE, NULL); +} + +static void test_bbram_out_of_bounds(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + uint8_t buffer[BBRAM_SIZE]; + + zassert_not_null(dev, NULL); + zassert_equal(bbram_read(dev, 0, 0, buffer), -EFAULT, NULL); + zassert_equal(bbram_read(dev, 0, BBRAM_SIZE + 1, buffer), -EFAULT, NULL); + zassert_equal(bbram_read(dev, BBRAM_SIZE - 1, 2, buffer), -EFAULT, NULL); + zassert_equal(bbram_write(dev, 0, 0, buffer), -EFAULT, NULL); + zassert_equal(bbram_write(dev, 0, BBRAM_SIZE + 1, buffer), -EFAULT, NULL); + zassert_equal(bbram_write(dev, BBRAM_SIZE - 1, 2, buffer), -EFAULT, NULL); +} + +static void test_read_write(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + uint8_t buffer[BBRAM_SIZE]; + uint8_t expected[BBRAM_SIZE]; + + for (int i = 0; i < BBRAM_SIZE; ++i) { + expected[i] = i; + } + /* Set and verify content. */ + zassert_ok(bbram_write(dev, 0, BBRAM_SIZE, expected), NULL); + zassert_ok(bbram_read(dev, 0, BBRAM_SIZE, buffer), NULL); + zassert_mem_equal(buffer, expected, BBRAM_SIZE, NULL); +} + +static void test_set_invalid(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + + zassert_equal(bbram_check_invalid(dev), 0, NULL); + zassert_ok(bbram_emul_set_invalid(dev, true), NULL); + zassert_equal(bbram_check_invalid(dev), 1, NULL); + zassert_equal(bbram_check_invalid(dev), 0, NULL); +} + +static void test_set_standby(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + + zassert_equal(bbram_check_standby_power(dev), 0, NULL); + zassert_ok(bbram_emul_set_standby_power_state(dev, true), NULL); + zassert_equal(bbram_check_standby_power(dev), 1, NULL); + zassert_equal(bbram_check_standby_power(dev), 0, NULL); +} + +static void test_set_power(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + + zassert_equal(bbram_check_power(dev), 0, NULL); + zassert_ok(bbram_emul_set_power_state(dev, true), NULL); + zassert_equal(bbram_check_power(dev), 1, NULL); + zassert_equal(bbram_check_power(dev), 0, NULL); +} + +static void test_reset_invalid_on_read(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + uint8_t buffer[BBRAM_SIZE]; + + zassert_ok(bbram_emul_set_invalid(dev, true), NULL); + zassert_equal(bbram_read(dev, 0, BBRAM_SIZE, buffer), -EFAULT, NULL); + zassert_equal(bbram_check_invalid(dev), 0, NULL); +} + +static void test_reset_invalid_on_write(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + uint8_t buffer[BBRAM_SIZE]; + + zassert_ok(bbram_emul_set_invalid(dev, true), NULL); + zassert_equal(bbram_write(dev, 0, BBRAM_SIZE, buffer), -EFAULT, NULL); + zassert_equal(bbram_check_invalid(dev), 0, NULL); +} + +static void setup(void) +{ + const struct device *dev = device_get_binding(BBRAM_LABEL); + + bbram_emul_set_invalid(dev, false); + bbram_emul_set_standby_power_state(dev, false); + bbram_emul_set_power_state(dev, false); +} + +void test_main(void) +{ + ztest_test_suite( + bbram, + ztest_unit_test_setup_teardown(test_get_size, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_bbram_out_of_bounds, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_read_write, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_set_invalid, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_set_standby, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_set_power, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_reset_invalid_on_read, setup, unit_test_noop), + ztest_unit_test_setup_teardown(test_reset_invalid_on_write, setup, unit_test_noop)); + ztest_run_test_suite(bbram); +} diff --git a/tests/drivers/bbram/emul/testcase.yaml b/tests/drivers/bbram/emul/testcase.yaml new file mode 100644 index 00000000000..74e40c67528 --- /dev/null +++ b/tests/drivers/bbram/emul/testcase.yaml @@ -0,0 +1,10 @@ +# Copyright 2021 Google LLC +# SPDX-License-Identifier: Apache-2.0 + +tests: + drivers.bbram.emul: + tags: drivers bbram + harness: ztest + platform_allow: native_posix + integration_platforms: + - native_posix diff --git a/tests/drivers/bbram/it8xxx2.conf b/tests/drivers/bbram/it8xxx2.conf new file mode 100644 index 00000000000..7f0aa04e9a1 --- /dev/null +++ b/tests/drivers/bbram/it8xxx2.conf @@ -0,0 +1,6 @@ +# Copyright 2021 Google LLC +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ZTEST=y +CONFIG_BBRAM=y +CONFIG_BBRAM_IT8XXX2=y diff --git a/tests/drivers/bbram/npcx.conf b/tests/drivers/bbram/npcx.conf new file mode 100644 index 00000000000..7af01707b0f --- /dev/null +++ b/tests/drivers/bbram/npcx.conf @@ -0,0 +1,6 @@ +# Copyright 2021 Google LLC +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ZTEST=y +CONFIG_BBRAM=y +CONFIG_BBRAM_NPCX=y diff --git a/tests/drivers/bbram/src/main.c b/tests/drivers/bbram/src/main.c index 06351804231..a01e31fc751 100644 --- a/tests/drivers/bbram/src/main.c +++ b/tests/drivers/bbram/src/main.c @@ -3,123 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -#include -#include -#include #include -#define BBRAM_NODELABEL DT_NODELABEL(bbram) -#define BBRAM_LABEL DT_LABEL(BBRAM_NODELABEL) -#define BBRAM_SIZE DT_PROP(BBRAM_NODELABEL, size) - -static void test_get_size(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - size_t size; - - zassert_ok(bbram_get_size(dev, &size), NULL); - zassert_equal(size, BBRAM_SIZE, NULL); -} - -static void test_bbram_out_of_bounds(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - uint8_t buffer[BBRAM_SIZE]; - - zassert_not_null(dev, NULL); - zassert_equal(bbram_read(dev, 0, 0, buffer), -EFAULT, NULL); - zassert_equal(bbram_read(dev, 0, BBRAM_SIZE + 1, buffer), -EFAULT, NULL); - zassert_equal(bbram_read(dev, BBRAM_SIZE - 1, 2, buffer), -EFAULT, NULL); - zassert_equal(bbram_write(dev, 0, 0, buffer), -EFAULT, NULL); - zassert_equal(bbram_write(dev, 0, BBRAM_SIZE + 1, buffer), -EFAULT, NULL); - zassert_equal(bbram_write(dev, BBRAM_SIZE - 1, 2, buffer), -EFAULT, NULL); -} - -static void test_read_write(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - uint8_t buffer[BBRAM_SIZE]; - uint8_t expected[BBRAM_SIZE]; - - for (int i = 0; i < BBRAM_SIZE; ++i) { - expected[i] = i; - } - /* Set and verify content. */ - zassert_ok(bbram_write(dev, 0, BBRAM_SIZE, expected), NULL); - zassert_ok(bbram_read(dev, 0, BBRAM_SIZE, buffer), NULL); - zassert_mem_equal(buffer, expected, BBRAM_SIZE, NULL); -} - -static void test_set_invalid(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - - zassert_equal(bbram_check_invalid(dev), 0, NULL); - zassert_ok(bbram_emul_set_invalid(dev, true), NULL); - zassert_equal(bbram_check_invalid(dev), 1, NULL); - zassert_equal(bbram_check_invalid(dev), 0, NULL); -} - -static void test_set_standby(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - - zassert_equal(bbram_check_standby_power(dev), 0, NULL); - zassert_ok(bbram_emul_set_standby_power_state(dev, true), NULL); - zassert_equal(bbram_check_standby_power(dev), 1, NULL); - zassert_equal(bbram_check_standby_power(dev), 0, NULL); -} - -static void test_set_power(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - - zassert_equal(bbram_check_power(dev), 0, NULL); - zassert_ok(bbram_emul_set_power_state(dev, true), NULL); - zassert_equal(bbram_check_power(dev), 1, NULL); - zassert_equal(bbram_check_power(dev), 0, NULL); -} - -static void test_reset_invalid_on_read(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - uint8_t buffer[BBRAM_SIZE]; - - zassert_ok(bbram_emul_set_invalid(dev, true), NULL); - zassert_equal(bbram_read(dev, 0, BBRAM_SIZE, buffer), -EFAULT, NULL); - zassert_equal(bbram_check_invalid(dev), 0, NULL); -} - -static void test_reset_invalid_on_write(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - uint8_t buffer[BBRAM_SIZE]; - - zassert_ok(bbram_emul_set_invalid(dev, true), NULL); - zassert_equal(bbram_write(dev, 0, BBRAM_SIZE, buffer), -EFAULT, NULL); - zassert_equal(bbram_check_invalid(dev), 0, NULL); -} - -static void setup(void) -{ - const struct device *dev = device_get_binding(BBRAM_LABEL); - - bbram_emul_set_invalid(dev, false); - bbram_emul_set_standby_power_state(dev, false); - bbram_emul_set_power_state(dev, false); -} - void test_main(void) { - ztest_test_suite( - bbram, - ztest_unit_test_setup_teardown(test_get_size, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_bbram_out_of_bounds, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_read_write, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_set_invalid, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_set_standby, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_set_power, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_reset_invalid_on_read, setup, unit_test_noop), - ztest_unit_test_setup_teardown(test_reset_invalid_on_write, setup, unit_test_noop)); - ztest_run_test_suite(bbram); + /* Build only test, this is a stub. */ } diff --git a/tests/drivers/bbram/testcase.yaml b/tests/drivers/bbram/testcase.yaml index c4ffd17c2db..d3d95d1df81 100644 --- a/tests/drivers/bbram/testcase.yaml +++ b/tests/drivers/bbram/testcase.yaml @@ -1,10 +1,13 @@ # Copyright 2021 Google LLC # SPDX-License-Identifier: Apache-2.0 +common: + tags: drivers bbram + build_only: true + harness: ztest + platform_exclude: native_posix tests: - drivers.bbram: - tags: drivers bbram - harness: ztest - platform_allow: native_posix - integration_platforms: - - native_posix + drivers.bbram.it8xxx2: + extra_args: CONF_FILE="it8xxx2.conf" + drivers.bbram.npcx: + extra_args: CONF_FILE="npcx.conf"