/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2023 Ventana Micro System, Inc. * * Authors: * Himanshu Chauhan */ #ifndef __RISCV_DBTR_H__ #define __RISCV_DBTR_H__ #define RV_MAX_TRIGGERS 32 enum { RISCV_DBTR_TRIG_NONE = 0, RISCV_DBTR_TRIG_LEGACY, RISCV_DBTR_TRIG_MCONTROL, RISCV_DBTR_TRIG_ICOUNT, RISCV_DBTR_TRIG_ITRIGGER, RISCV_DBTR_TRIG_ETRIGGER, RISCV_DBTR_TRIG_MCONTROL6, }; #define RV_DBTR_BIT(_prefix, _name) \ RV_DBTR_##_prefix##_##_name##_BIT #define RV_DBTR_BIT_MASK(_prefix, _name) \ RV_DBTR_##_prefix##_name##_BIT_MASK #define RV_DBTR_DECLARE_BIT(_prefix, _name, _val) \ RV_DBTR_BIT(_prefix, _name) = _val #define RV_DBTR_DECLARE_BIT_MASK(_prefix, _name, _width) \ RV_DBTR_BIT_MASK(_prefix, _name) = \ (((1UL << _width) - 1) << RV_DBTR_BIT(_prefix, _name)) #define CLEAR_DBTR_BIT(_target, _prefix, _bit_name) \ __clear_bit(RV_DBTR_BIT(_prefix, _bit_name), &_target) #define SET_DBTR_BIT(_target, _prefix, _bit_name) \ __set_bit(RV_DBTR_BIT(_prefix, _bit_name), &_target) /* Trigger Data 1 */ enum { RV_DBTR_DECLARE_BIT(TDATA1, DATA, 0), #if __riscv_xlen == 64 RV_DBTR_DECLARE_BIT(TDATA1, DMODE, 59), RV_DBTR_DECLARE_BIT(TDATA1, TYPE, 60), #elif __riscv_xlen == 32 RV_DBTR_DECLARE_BIT(TDATA1, DMODE, 27), RV_DBTR_DECLARE_BIT(TDATA1, TYPE, 28), #else #error "Unknown __riscv_xlen" #endif }; enum { #if __riscv_xlen == 64 RV_DBTR_DECLARE_BIT_MASK(TDATA1, DATA, 59), #elif __riscv_xlen == 32 RV_DBTR_DECLARE_BIT_MASK(TDATA1, DATA, 27), #else #error "Unknown __riscv_xlen" #endif RV_DBTR_DECLARE_BIT_MASK(TDATA1, DMODE, 1), RV_DBTR_DECLARE_BIT_MASK(TDATA1, TYPE, 4), }; /* MC - Match Control Type Register */ enum { RV_DBTR_DECLARE_BIT(MC, LOAD, 0), RV_DBTR_DECLARE_BIT(MC, STORE, 1), RV_DBTR_DECLARE_BIT(MC, EXEC, 2), RV_DBTR_DECLARE_BIT(MC, U, 3), RV_DBTR_DECLARE_BIT(MC, S, 4), RV_DBTR_DECLARE_BIT(MC, RES2, 5), RV_DBTR_DECLARE_BIT(MC, M, 6), RV_DBTR_DECLARE_BIT(MC, MATCH, 7), RV_DBTR_DECLARE_BIT(MC, CHAIN, 11), RV_DBTR_DECLARE_BIT(MC, ACTION, 12), RV_DBTR_DECLARE_BIT(MC, SIZELO, 16), RV_DBTR_DECLARE_BIT(MC, TIMING, 18), RV_DBTR_DECLARE_BIT(MC, SELECT, 19), RV_DBTR_DECLARE_BIT(MC, HIT, 20), #if __riscv_xlen >= 64 RV_DBTR_DECLARE_BIT(MC, SIZEHI, 21), #endif #if __riscv_xlen == 64 RV_DBTR_DECLARE_BIT(MC, MASKMAX, 53), RV_DBTR_DECLARE_BIT(MC, DMODE, 59), RV_DBTR_DECLARE_BIT(MC, TYPE, 60), #elif __riscv_xlen == 32 RV_DBTR_DECLARE_BIT(MC, MASKMAX, 21), RV_DBTR_DECLARE_BIT(MC, DMODE, 27), RV_DBTR_DECLARE_BIT(MC, TYPE, 28), #else #error "Unknown __riscv_xlen" #endif }; enum { RV_DBTR_DECLARE_BIT_MASK(MC, LOAD, 1), RV_DBTR_DECLARE_BIT_MASK(MC, STORE, 1), RV_DBTR_DECLARE_BIT_MASK(MC, EXEC, 1), RV_DBTR_DECLARE_BIT_MASK(MC, U, 1), RV_DBTR_DECLARE_BIT_MASK(MC, S, 1), RV_DBTR_DECLARE_BIT_MASK(MC, RES2, 1), RV_DBTR_DECLARE_BIT_MASK(MC, M, 1), RV_DBTR_DECLARE_BIT_MASK(MC, MATCH, 4), RV_DBTR_DECLARE_BIT_MASK(MC, CHAIN, 1), RV_DBTR_DECLARE_BIT_MASK(MC, ACTION, 4), RV_DBTR_DECLARE_BIT_MASK(MC, SIZELO, 2), RV_DBTR_DECLARE_BIT_MASK(MC, TIMING, 1), RV_DBTR_DECLARE_BIT_MASK(MC, SELECT, 1), RV_DBTR_DECLARE_BIT_MASK(MC, HIT, 1), #if __riscv_xlen >= 64 RV_DBTR_DECLARE_BIT_MASK(MC, SIZEHI, 2), #endif RV_DBTR_DECLARE_BIT_MASK(MC, MASKMAX, 6), RV_DBTR_DECLARE_BIT_MASK(MC, DMODE, 1), RV_DBTR_DECLARE_BIT_MASK(MC, TYPE, 4), }; /* MC6 - Match Control 6 Type Register */ enum { RV_DBTR_DECLARE_BIT(MC6, LOAD, 0), RV_DBTR_DECLARE_BIT(MC6, STORE, 1), RV_DBTR_DECLARE_BIT(MC6, EXEC, 2), RV_DBTR_DECLARE_BIT(MC6, U, 3), RV_DBTR_DECLARE_BIT(MC6, S, 4), RV_DBTR_DECLARE_BIT(MC6, RES2, 5), RV_DBTR_DECLARE_BIT(MC6, M, 6), RV_DBTR_DECLARE_BIT(MC6, MATCH, 7), RV_DBTR_DECLARE_BIT(MC6, CHAIN, 11), RV_DBTR_DECLARE_BIT(MC6, ACTION, 12), RV_DBTR_DECLARE_BIT(MC6, SIZE, 16), RV_DBTR_DECLARE_BIT(MC6, TIMING, 20), RV_DBTR_DECLARE_BIT(MC6, SELECT, 21), RV_DBTR_DECLARE_BIT(MC6, HIT, 22), RV_DBTR_DECLARE_BIT(MC6, VU, 23), RV_DBTR_DECLARE_BIT(MC6, VS, 24), #if __riscv_xlen == 64 RV_DBTR_DECLARE_BIT(MC6, DMODE, 59), RV_DBTR_DECLARE_BIT(MC6, TYPE, 60), #elif __riscv_xlen == 32 RV_DBTR_DECLARE_BIT(MC6, DMODE, 27), RV_DBTR_DECLARE_BIT(MC6, TYPE, 28), #else #error "Unknown __riscv_xlen" #endif }; enum { RV_DBTR_DECLARE_BIT_MASK(MC6, LOAD, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, STORE, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, EXEC, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, U, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, S, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, RES2, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, M, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, MATCH, 4), RV_DBTR_DECLARE_BIT_MASK(MC6, CHAIN, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, ACTION, 4), RV_DBTR_DECLARE_BIT_MASK(MC6, SIZE, 4), RV_DBTR_DECLARE_BIT_MASK(MC6, TIMING, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, SELECT, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, HIT, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, VU, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, VS, 1), #if __riscv_xlen == 64 RV_DBTR_DECLARE_BIT_MASK(MC6, DMODE, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, TYPE, 4), #elif __riscv_xlen == 32 RV_DBTR_DECLARE_BIT_MASK(MC6, DMODE, 1), RV_DBTR_DECLARE_BIT_MASK(MC6, TYPE, 4), #else #error "Unknown __riscv_xlen" #endif }; #define RV_DBTR_SET_TDATA1_TYPE(_t1, _type) \ do { \ _t1 &= ~RV_DBTR_BIT_MASK(TDATA1, TYPE); \ _t1 |= (((unsigned long)_type \ << RV_DBTR_BIT(TDATA1, TYPE)) \ & RV_DBTR_BIT_MASK(TDATA1, TYPE)); \ }while (0); #define RV_DBTR_SET_MC_TYPE(_t1, _type) \ do { \ _t1 &= ~RV_DBTR_BIT_MASK(MC, TYPE); \ _t1 |= (((unsigned long)_type \ << RV_DBTR_BIT(MC, TYPE)) \ & RV_DBTR_BIT_MASK(MC, TYPE)); \ }while (0); #define RV_DBTR_SET_MC6_TYPE(_t1, _type) \ do { \ _t1 &= ~RV_DBTR_BIT_MASK(MC6, TYPE); \ _t1 |= (((unsigned long)_type \ << RV_DBTR_BIT(MC6, TYPE)) \ & RV_DBTR_BIT_MASK(MC6, TYPE)); \ }while (0); #define RV_DBTR_SET_MC_EXEC(_t1) \ SET_DBTR_BIT(_t1, MC, EXEC) #define RV_DBTR_SET_MC_LOAD(_t1) \ SET_DBTR_BIT(_t1, MC, LOAD) #define RV_DBTR_SET_MC_STORE(_t1) \ SET_DBTR_BIT(_t1, MC, STORE) #define RV_DBTR_SET_MC_SIZELO(_t1, _val) \ do { \ _t1 &= ~RV_DBTR_BIT_MASK(MC, SIZELO); \ _t1 |= ((_val << RV_DBTR_BIT(MC, SIZELO)) \ & RV_DBTR_BIT_MASK(MC, SIZELO)); \ } while(0); #define RV_DBTR_SET_MC_SIZEHI(_t1, _val) \ do { \ _t1 &= ~RV_DBTR_BIT_MASK(MC, SIZEHI); \ _t1 |= ((_val << RV_DBTR_BIT(MC, SIZEHI)) \ & RV_DBTR_BIT_MASK(MC, SIZEHI)); \ } while(0); #define RV_DBTR_SET_MC6_EXEC(_t1) \ SET_DBTR_BIT(_t1, MC6, EXEC) #define RV_DBTR_SET_MC6_LOAD(_t1) \ SET_DBTR_BIT(_t1, MC6, LOAD) #define RV_DBTR_SET_MC6_STORE(_t1) \ SET_DBTR_BIT(_t1, MC6, STORE) #define RV_DBTR_SET_MC6_SIZE(_t1, _val) \ do { \ _t1 &= ~RV_DBTR_BIT_MASK(MC6, SIZE); \ _t1 |= ((_val << RV_DBTR_BIT(MC6, SIZE)) \ & RV_DBTR_BIT_MASK(MC6, SIZE)); \ } while(0); typedef unsigned long riscv_dbtr_tdata1_mcontrol_t; typedef unsigned long riscv_dbtr_tdata1_mcontrol6_t; typedef unsigned long riscv_dbtr_tdata1_t; #endif /* __RISCV_DBTR_H__ */