Add initial HMR software config

This commit is contained in:
Michael Rogenmoser 2023-01-19 13:23:02 +01:00
parent 7d0dc6a5ab
commit 776c856d63
8 changed files with 317 additions and 0 deletions

17
configs/hmr_pulp.sh Normal file
View file

@ -0,0 +1,17 @@
#!/bin/bash -e
export PULPRT_TARGET=pulp
export PULPRUN_TARGET=pulp
export USE_CV32E40P=1
export ARCHI_HMR=1
if [ -n "${ZSH_VERSION:-}" ]; then
DIR="$(readlink -f -- "${(%):-%x}")"
scriptDir="$(dirname $DIR)"
else
scriptDir="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"
fi
source $scriptDir/common.sh

View file

@ -99,6 +99,7 @@
#define ARCHI_ICACHE_CTRL_OFFSET 0x00001400
#define ARCHI_MCHAN_EXT_OFFSET 0x00001800
#define ARCHI_IDMA_EXT_OFFSET 0x00001800
#define ARCHI_HMR_OFFSET 0x00002000
#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,15 @@
#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_IDMA_EXT_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_IDMA_EXT_OFFSET )
#define ARCHI_HMR_ADDR ( ARCHI_CLUSTER_PERIPHERALS_ADDR + ARCHI_HMR_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 )
#define ARCHI_EU_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_EU_OFFSET )
#define ARCHI_HWCE_GLOBAL_ADDR(cid) ( ARCHI_CLUSTER_PERIPHERALS_GLOBAL_ADDR(cid) + ARCHI_HWCE_OFFSET )
#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 )

View file

@ -51,4 +51,8 @@
#include "archi/udma/uart/udma_uart_v1.h"
#include "archi/udma/udma_v3.h"
#ifdef ARCHI_HMR
#include "archi/hmr/hmr_v1.h"
#endif // ARCHI_HMR
#endif

173
include/archi/hmr/hmr_v1.h Normal file
View file

@ -0,0 +1,173 @@
/*
* 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 __ARCHI_HMR_HMR_V1_H__
#define __ARCHI_HMR_HMR_V1_H__
#define HMR_IN_INTERLEAVED 1
#define HMR_TOP_OFFSET 0x000
#define HMR_CORE_OFFSET 0x100
#define HMR_DMR_OFFSET 0x200
#define HMR_TMR_OFFSET 0x300
#define HMR_CORE_INCREMENT 0x008
#define HMR_TMR_INCREMENT 0x010
// Generated register defines for HMR_registers
#ifndef _HMR_REGISTERS_REG_DEFS_
#define _HMR_REGISTERS_REG_DEFS_
#ifdef __cplusplus
extern "C" {
#endif
#define HMR_REGISTERS_PARAM_NUM_CORES 12
#define HMR_REGISTERS_PARAM_NUM_D_M_R_GROUPS 6
#define HMR_REGISTERS_PARAM_NUM_T_M_R_GROUPS 4
// Register width
#define HMR_REGISTERS_PARAM_REG_WIDTH 32
// Available Configurations from implemented hardware.
#define HMR_REGISTERS_AVAIL_CONFIG_REG_OFFSET 0x0
#define HMR_REGISTERS_AVAIL_CONFIG_INDEPENDENT_BIT 0
#define HMR_REGISTERS_AVAIL_CONFIG_DUAL_BIT 1
#define HMR_REGISTERS_AVAIL_CONFIG_TRIPLE_BIT 2
// Enabled cores, based on the configuration. Can be used for barriers.
#define HMR_REGISTERS_CORES_EN_REG_OFFSET 0x4
#define HMR_REGISTERS_CORES_EN_CORES_EN_MASK 0xfff
#define HMR_REGISTERS_CORES_EN_CORES_EN_OFFSET 0
#define HMR_REGISTERS_CORES_EN_CORES_EN_FIELD \
((bitfield_field32_t) { .mask = HMR_REGISTERS_CORES_EN_CORES_EN_MASK, .index = HMR_REGISTERS_CORES_EN_CORES_EN_OFFSET })
// DMR configuration enable, on bit per DMR group.
#define HMR_REGISTERS_DMR_ENABLE_REG_OFFSET 0x8
#define HMR_REGISTERS_DMR_ENABLE_DMR_ENABLE_MASK 0x3f
#define HMR_REGISTERS_DMR_ENABLE_DMR_ENABLE_OFFSET 0
#define HMR_REGISTERS_DMR_ENABLE_DMR_ENABLE_FIELD \
((bitfield_field32_t) { .mask = HMR_REGISTERS_DMR_ENABLE_DMR_ENABLE_MASK, .index = HMR_REGISTERS_DMR_ENABLE_DMR_ENABLE_OFFSET })
// TMR configuration enable, one bit per TMR group.
#define HMR_REGISTERS_TMR_ENABLE_REG_OFFSET 0xc
#define HMR_REGISTERS_TMR_ENABLE_TMR_ENABLE_MASK 0xf
#define HMR_REGISTERS_TMR_ENABLE_TMR_ENABLE_OFFSET 0
#define HMR_REGISTERS_TMR_ENABLE_TMR_ENABLE_FIELD \
((bitfield_field32_t) { .mask = HMR_REGISTERS_TMR_ENABLE_TMR_ENABLE_MASK, .index = HMR_REGISTERS_TMR_ENABLE_TMR_ENABLE_OFFSET })
// TMR configuration bits.
#define HMR_REGISTERS_TMR_CONFIG_REG_OFFSET 0x10
#define HMR_REGISTERS_TMR_CONFIG_DELAY_RESYNCH_BIT 0
#define HMR_REGISTERS_TMR_CONFIG_SETBACK_BIT 1
#define HMR_REGISTERS_TMR_CONFIG_RELOAD_SETBACK_BIT 2
#define HMR_REGISTERS_TMR_CONFIG_FORCE_RESYNCH_BIT 3
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _HMR_REGISTERS_REG_DEFS_
// End generated register defines for HMR_registers
// Generated register defines for HMR_core_regs
#ifndef _HMR_CORE_REGS_REG_DEFS_
#define _HMR_CORE_REGS_REG_DEFS_
#ifdef __cplusplus
extern "C" {
#endif
// Register width
#define HMR_CORE_REGS_PARAM_REG_WIDTH 32
// Value to determine wich redundancy mode the core with that ID is in.
#define HMR_CORE_REGS_CURRENT_MODE_REG_OFFSET 0x0
#define HMR_CORE_REGS_CURRENT_MODE_INDEPENDENT_BIT 0
#define HMR_CORE_REGS_CURRENT_MODE_DUAL_BIT 1
#define HMR_CORE_REGS_CURRENT_MODE_TRIPLE_BIT 2
// Mismatches of the core
#define HMR_CORE_REGS_MISMATCHES_REG_OFFSET 0x4
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _HMR_CORE_REGS_REG_DEFS_
// End generated register defines for HMR_core_regs
// Generated register defines for HMR_dmr_regs
#ifndef _HMR_DMR_REGS_REG_DEFS_
#define _HMR_DMR_REGS_REG_DEFS_
#ifdef __cplusplus
extern "C" {
#endif
// Register width
#define HMR_DMR_REGS_PARAM_REG_WIDTH 32
// DMR configuration enable.
#define HMR_DMR_REGS_DMR_ENABLE_REG_OFFSET 0x0
#define HMR_DMR_REGS_DMR_ENABLE_TMR_ENABLE_BIT 0
// DMR configuration bits.
#define HMR_DMR_REGS_DMR_CONFIG_REG_OFFSET 0x4
#define HMR_DMR_REGS_DMR_CONFIG_TODO_BIT 0
// Address for the last checkpoint.
#define HMR_DMR_REGS_CHECKPOINT_ADDR_REG_OFFSET 0x8
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _HMR_DMR_REGS_REG_DEFS_
// End generated register defines for HMR_dmr_regs
// Generated register defines for HMR_tmr_regs
#ifndef _HMR_TMR_REGS_REG_DEFS_
#define _HMR_TMR_REGS_REG_DEFS_
#ifdef __cplusplus
extern "C" {
#endif
// Register width
#define HMR_TMR_REGS_PARAM_REG_WIDTH 32
// TMR configuration enable.
#define HMR_TMR_REGS_TMR_ENABLE_REG_OFFSET 0x0
#define HMR_TMR_REGS_TMR_ENABLE_TMR_ENABLE_BIT 0
// TMR configuration bits.
#define HMR_TMR_REGS_TMR_CONFIG_REG_OFFSET 0x4
#define HMR_TMR_REGS_TMR_CONFIG_DELAY_RESYNCH_BIT 0
#define HMR_TMR_REGS_TMR_CONFIG_SETBACK_BIT 1
#define HMR_TMR_REGS_TMR_CONFIG_RELOAD_SETBACK_BIT 2
#define HMR_TMR_REGS_TMR_CONFIG_FORCE_RESYNCH_BIT 3
// Stack Pointer storage register
#define HMR_TMR_REGS_SP_STORE_REG_OFFSET 0x8
#ifdef __cplusplus
} // extern "C"
#endif
#endif // _HMR_TMR_REGS_REG_DEFS_
// End generated register defines for HMR_tmr_regs
#endif // __ARCHI_HMR_HMR_V1_H__

View file

@ -47,4 +47,8 @@
#include "hal/udma/spim/udma_spim_v3.h"
#include "hal/udma/uart/udma_uart_v1.h"
#ifdef ARCHI_HMR
#include "hal/hmr/hmr_v1.h"
#endif // ARCHI_HMR
#endif

101
include/hal/hmr/hmr_v1.h Normal file
View file

@ -0,0 +1,101 @@
/*
* 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_HMR_HMR_V1_H__
#define __HAL_HMR_HMR_V1_H__
#include "archi/hmr/hmr_v1.h"
#include "archi/pulp.h"
#define NUM_TMR_GROUPS (ARCHI_CLUSTER_NB_PE/3)
#define NUM_TMR_CORES (ARCHI_CLUSTER_NB_PE-(ARCHI_CLUSTER_NB_PE%3))
#define NUM_DMR_GROUPS (ARCHI_CLUSTER_NB_PE/2)
#define NUM_DMR_CORES (ARCHI_CLUSTER_NB_PE-(ARCHI_CLUSTER_NB_PE%2))
// Interleaved cores
#define TMR_IS_CORE(core_id) (core_id<NUM_TMR_CORES)
#if HMR_IN_INTERLEAVED
#define TMR_GROUP_ID(core_id) (core_id % NUM_TMR_GROUPS)
#define TMR_CORE_ID(group_id, offset) (group_id + (offset * NUM_TMR_GROUPS))
#define TMR_BARRIER_ID(group_id) (1+group_id)
#define TMR_BARRIER_SETUP(group_id) (1<<group_id | 1<<(group_id+NUM_TMR_GROUPS) | 1<<(group_id+2*NUM_TMR_GROUPS))
#else
#define TMR_GROUP_ID(core_id) (core_id/3)
#define TMR_CORE_ID(group_id, offset) ((group_id * 3) + core_offset)
#define TMR_BARRIER_ID(group_id) (1+group_id+(group_id/2))
#define TMR_BARRIER_SETUP(group_id) (1<<(3*group_id) | 1<<(3*group_id + 1) | 1<<(3*group_id+2))
#endif
#define TMR_IS_MAIN_CORE(core_id) (TMR_IS_CORE(core_id) && (TMR_CORE_ID(TMR_GROUP_ID(core_id), 0) == core_id))
static inline unsigned int hmr_get_available_config(unsigned int cid) {
return pulp_read32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TOP_OFFSET + HMR_REGISTERS_AVAIL_CONFIG_REG_OFFSET);
}
static inline unsigned int hmr_get_active_cores(unsigned int cid) {
return pulp_read32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TOP_OFFSET + HMR_REGISTERS_CORES_EN_REG_OFFSET);
}
static inline unsigned int hmr_get_core_status(unsigned int cid, unsigned int core_id) {
return pulp_read32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_CORE_OFFSET + (core_id * HMR_CORE_INCREMENT) + HMR_CORE_REGS_CURRENT_MODE_REG_OFFSET);
}
static inline unsigned int hmr_get_core_mismatches(unsigned int cid, unsigned int core_id) {
return pulp_read32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_CORE_OFFSET + (core_id * HMR_CORE_INCREMENT) + HMR_CORE_REGS_MISMATCHES_REG_OFFSET);
}
static inline unsigned int hmr_reset_core_mismatches(unsigned int cid, unsigned int core_id) {
return pulp_write32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_CORE_OFFSET + (core_id * HMR_CORE_INCREMENT) + HMR_CORE_REGS_MISMATCHES_REG_OFFSET, 0);
}
static inline unsigned int hmr_get_dmr_status_all(unsigned int cid) {
return pulp_read32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TOP_OFFSET + HMR_REGISTERS_DMR_ENABLE_REG_OFFSET);
}
static inline void hmr_set_dmr_status_all(unsigned int cid, unsigned int status) {
pulp_write32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TOP_OFFSET + HMR_REGISTERS_DMR_ENABLE_REG_OFFSET, status);
}
static inline void hmr_enable_all_dmr(unsigned int cid) {
hmr_set_dmr_status_all(cid, (1<<NUM_TMR_GROUPS)-1);
}
static inline void hmr_disable_all_dmr(unsigned int cid) {
hmr_set_dmr_status_all(cid, 0);
}
static inline unsigned int hmr_get_tmr_status_all(unsigned int cid) {
return pulp_read32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TOP_OFFSET + HMR_REGISTERS_TMR_ENABLE_REG_OFFSET);
}
static inline void hmr_set_tmr_status_all(unsigned int cid, unsigned int status) {
pulp_write32(ARCHI_HMR_GLOBAL_ADDR(cid) + HMR_TOP_OFFSET + HMR_REGISTERS_TMR_ENABLE_REG_OFFSET, status);
}
static inline void hmr_enable_all_tmr(unsigned int cid) {
hmr_set_tmr_status_all(cid, (1<<NUM_TMR_GROUPS)-1);
}
static inline void hmr_disable_all_tmr(unsigned int cid) {
hmr_set_tmr_status_all(cid, 0);
}
static void hmr_tmr_barrier_setup_all() {
for (int i = 0; i < NUM_TMR_GROUPS; i++) {
eu_bar_setup(eu_bar_addr(TMR_BARRIER_ID(i)), TMR_BARRIER_SETUP(i));
}
}
#endif // __HAL_HMR_HMR_V1_H__

View file

@ -40,7 +40,11 @@ static void cluster_core_init()
{
eu_evt_maskSet((1<<PULP_DISPATCH_EVENT) | (1<<PULP_MUTEX_EVENT) | (1<<PULP_HW_BAR_EVENT));
#ifdef ARCHI_HMR
eu_bar_setup(eu_bar_addr(0), hmr_get_active_cores(0));
#else
eu_bar_setup(eu_bar_addr(0), (1<<ARCHI_CLUSTER_NB_PE) - 1);
#endif
}
void cluster_entry_stub()

View file

@ -18,6 +18,10 @@ PULP_ARCH_LDFLAGS ?= -march=rv32imcxgap9
PULP_ARCH_OBJDFLAGS ?= -Mmarch=rv32imcxgap9
endif
ifdef ARCHI_HMR
PULP_CFLAGS += -DARCHI_HMR
endif
PULP_CFLAGS += -fdata-sections -ffunction-sections -include chips/pulp/config.h -I$(PULPRT_HOME)/include/chips/pulp
PULP_OMP_CFLAGS += -fopenmp -mnativeomp
PULP_LDFLAGS += -nostartfiles -nostdlib -Wl,--gc-sections -L$(PULPRT_HOME)/kernel -Tchips/pulp/link.ld -lgcc