From 1cbf59cba81b02c989a55844f6958fc13e1e6c73 Mon Sep 17 00:00:00 2001 From: Yvan Tortorella Date: Tue, 27 Feb 2024 19:31:55 +0100 Subject: [PATCH] Add APIs for TCDM scrubber. --- .../archi/chips/carfield-cluster/memory_map.h | 3 ++ include/archi/chips/carfield-cluster/pulp.h | 1 + include/archi/tcdm_scrubber/tcdm_scrubber.h | 54 +++++++++++++++++++ include/hal/chips/carfield-cluster/pulp.h | 1 + include/hal/tcdm_scrubber/tcdm_scrubber.h | 43 +++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 include/archi/tcdm_scrubber/tcdm_scrubber.h create mode 100644 include/hal/tcdm_scrubber/tcdm_scrubber.h diff --git a/include/archi/chips/carfield-cluster/memory_map.h b/include/archi/chips/carfield-cluster/memory_map.h index f2fad10f..729021ed 100644 --- a/include/archi/chips/carfield-cluster/memory_map.h +++ b/include/archi/chips/carfield-cluster/memory_map.h @@ -99,6 +99,7 @@ #define ARCHI_ICACHE_CTRL_OFFSET 0x00001400 #define ARCHI_MCHAN_EXT_OFFSET 0x00001800 #define ARCHI_HMR_OFFSET 0x00002000 +#define ARCHI_TCDM_SCRUBBER_OFFSET 0x00002400 #define ARCHI_CLUSTER_PERIPHERALS_ADDR ( ARCHI_CLUSTER_ADDR + ARCHI_CLUSTER_PERIPHERALS_OFFSET ) #define ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_GLOBAL_ADDR(cid) + ARCHI_CLUSTER_PERIPHERALS_OFFSET ) @@ -109,6 +110,7 @@ #define ARCHI_HWCE_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_HWCE_OFFSET ) #define ARCHI_MCHAN_EXT_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_MCHAN_EXT_OFFSET ) #define ARCHI_HMR_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_HMR_OFFSET ) +#define ARCHI_TCDM_SCRUBBER_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_TCDM_SCRUBBER_OFFSET ) #define ARCHI_CLUSTER_CTRL_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_CLUSTER_CTRL_OFFSET ) #define ARCHI_ICACHE_CTRL_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_ICACHE_CTRL_OFFSET ) @@ -117,6 +119,7 @@ #define ARCHI_MCHAN_EXT_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_MCHAN_EXT_OFFSET ) #define ARCHI_IDMA_EXT_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_IDMA_EXT_OFFSET ) #define ARCHI_HMR_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_HMR_OFFSET ) +#define ARCHI_TCDM_SCRUBBER_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_TCDM_SCRUBBER_OFFSET ) /* diff --git a/include/archi/chips/carfield-cluster/pulp.h b/include/archi/chips/carfield-cluster/pulp.h index f8102d98..83ba2a6e 100644 --- a/include/archi/chips/carfield-cluster/pulp.h +++ b/include/archi/chips/carfield-cluster/pulp.h @@ -46,5 +46,6 @@ #include "archi/udma/uart/udma_uart_v1.h" #include "archi/udma/udma_v3.h" #include "archi/hmr/hmr_v1.h" +#include "archi/tcdm_scrubber/tcdm_scrubber.h" #endif diff --git a/include/archi/tcdm_scrubber/tcdm_scrubber.h b/include/archi/tcdm_scrubber/tcdm_scrubber.h new file mode 100644 index 00000000..b364deb6 --- /dev/null +++ b/include/archi/tcdm_scrubber/tcdm_scrubber.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2023 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _TCDM_SCRUBBER_REG_DEFS_ +#define _TCDM_SCRUBBER_REG_DEFS_ + +#define REGISTER_OFFSET 0x20 + +#ifdef __cplusplus +extern "C" { +#endif +// Register width +#define ECC_MANAGER_PARAM_REG_WIDTH 32 + +// Correctable mismatches caught by ecc on access +#define ECC_MANAGER_MISMATCH_COUNT_REG_OFFSET 0x0 + +// Interval between scrubs +#define ECC_MANAGER_SCRUB_INTERVAL_REG_OFFSET 0x4 + +// Correctable mismatches caught by ecc on scrub +#define ECC_MANAGER_SCRUB_FIX_COUNT_REG_OFFSET 0x8 + +// Uncorrectable mismatches caught by ecc on scrub +#define ECC_MANAGER_SCRUB_UNCORRECTABLE_COUNT_REG_OFFSET 0xc + +// Testing: Inverted write mask for data bits +#define ECC_MANAGER_WRITE_MASK_DATA_N_REG_OFFSET 0x10 + +// Testing: Inverted write mask for ECC bits +#define ECC_MANAGER_WRITE_MASK_ECC_N_REG_OFFSET 0x14 +#define ECC_MANAGER_WRITE_MASK_ECC_N_WRITE_MASK_ECC_N_MASK 0x7f +#define ECC_MANAGER_WRITE_MASK_ECC_N_WRITE_MASK_ECC_N_OFFSET 0 +#define ECC_MANAGER_WRITE_MASK_ECC_N_WRITE_MASK_ECC_N_FIELD \ + ((bitfield_field32_t) { .mask = ECC_MANAGER_WRITE_MASK_ECC_N_WRITE_MASK_ECC_N_MASK, .index = ECC_MANAGER_WRITE_MASK_ECC_N_WRITE_MASK_ECC_N_OFFSET }) + +#ifdef __cplusplus +} // extern "C" +#endif +#endif // _TCDM_SCRUBBER_REG_DEFS_ +// End generated register defines for ECC_manager diff --git a/include/hal/chips/carfield-cluster/pulp.h b/include/hal/chips/carfield-cluster/pulp.h index 30ed9ce8..1cf1d49a 100644 --- a/include/hal/chips/carfield-cluster/pulp.h +++ b/include/hal/chips/carfield-cluster/pulp.h @@ -42,5 +42,6 @@ #include "hal/udma/spim/udma_spim_v3.h" #include "hal/udma/uart/udma_uart_v1.h" #include "hal/hmr/hmr_v1.h" +#include "hal/tcdm_scrubber/tcdm_scrubber.h" #endif diff --git a/include/hal/tcdm_scrubber/tcdm_scrubber.h b/include/hal/tcdm_scrubber/tcdm_scrubber.h new file mode 100644 index 00000000..72317ad0 --- /dev/null +++ b/include/hal/tcdm_scrubber/tcdm_scrubber.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 ETH Zurich and University of Bologna + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __HAL_TCDM_SCRUBBER_H__ +#define __HAL_TCDM_SCRUBBER_H__ + +#include "archi/tcdm_scrubber/tcdm_scrubber.h" +#include "archi/pulp.h" + +// Get the number of correctable mismatches detected by the ECC decoders during access +static inline unsigned int tcdm_scrubber_get_mismatch_count(unsigned int cid, unsigned int bank_id) { + return pulp_read32(ARCHI_TCDM_SCRUBBER_GLOBAL_ADDR(cid) + ECC_MANAGER_MISMATCH_COUNT_REG_OFFSET + bank_id*REGISTER_OFFSET); +} + +// Set the interval between each access scrubber access to memory banks +static inline void tcdm_scrubber_set_interval(unsigned int cid, unsigned int bank_id, unsigned int value) { + pulp_write32(ARCHI_TCDM_SCRUBBER_GLOBAL_ADDR(cid) + ECC_MANAGER_SCRUB_INTERVAL_REG_OFFSET + bank_id*REGISTER_OFFSET, value); +} + +// Get the number of correctable mismatches detected by the ECC decoders while scrubbing +static inline unsigned int tcdm_scrubber_get_fix_count(unsigned int cid, unsigned int bank_id) { + return pulp_read32(ARCHI_TCDM_SCRUBBER_GLOBAL_ADDR(cid) + ECC_MANAGER_SCRUB_FIX_COUNT_REG_OFFSET + bank_id*REGISTER_OFFSET); +} + +// Set the number of uncorrectable mismatches detected by the ECC decoders while scrubbing +static inline unsigned int tcdm_scrubber_get_uncorrectable_count(unsigned int cid, unsigned int bank_id) { + return pulp_read32(ARCHI_TCDM_SCRUBBER_GLOBAL_ADDR(cid) + ECC_MANAGER_SCRUB_FIX_COUNT_REG_OFFSET + bank_id*REGISTER_OFFSET); +} + +#endif // __HAL_TCDM_SCRUBBER_H__