blob: acfe3cd87fb8860e0a4165053c4480d70dcef4d7 [file]
/*!
* \file itm_test_gen.h
* \brief OpenCSD : Test code for ITM decoder
*
* \copyright Copyright (c) 2024, ARM Limited. All Rights Reserved.
*/
/*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ARM_ITM_TEST_GEN_H_INCLUDED
#define ARM_ITM_TEST_GEN_H_INCLUDED
/* generator macros and key values for ITM test data */
/* ITM SWIT / DWT size field values */
#define ITM_SWIT_SZ_8_BIT 0x1
#define ITM_SWIT_SZ_16_BIT 0x2
#define ITM_SWIT_SZ_32_BIT 0x3
/* LTS TC values */
#define ITM_LTS_TC_TS_SYNC_FLAG 0x0
#define ITM_LTS_TC_TS_DELAY_FLAG 0x1
#define ITM_LTS_TC_PKT_DELAY_FLAG 0x2
#define ITM_LTS_TC_TS_AND_PKT_DELAY_FLAG 0x3
/* DWT data comparator number values */
#define ITM_DWT_CMPN_0 0x0
#define ITM_DWT_CMPN_1 0x1
#define ITM_DWT_CMPN_2 0x2
#define ITM_DWT_CMPN_3 0x3
/* Helper macros for generating test data */
// generate the SWIT channel and size header byte
#define SWIT_CHAN(chan, size) ((((uint8_t)chan & 0x1F) << 3) | (size & 0x3))
// hardware DWT packet header - takes discriminator id value and size
#define DWT_HEADER(disc_id, size) ((((uint8_t)disc_id & 0x1F) << 3) | 0x04 | (size & 0x3))
#define DWT_EXCEP_FN_ENTER 0x1
#define DWT_EXCEP_FN_EXIT 0x2
#define DWT_EXCEP_FN_RETURN 0x3
// generate discriminator ID values for DWT data trace
#define DWT_DT_DISC_ID_PC(cmpn) ((((uint8_t)(cmpn) & 0x3) << 1) | 0x4)
#define DWT_DT_DISC_ID_ADDR(cmpn) ((((uint8_t)(cmpn) & 0x3) << 1) | 0x5)
#define DWT_DT_DISC_ID_DATA_R(cmpn) ((((uint8_t)(cmpn) & 0x3) << 1) | 0x10)
#define DWT_DT_DISC_ID_DATA_W(cmpn) ((((uint8_t)(cmpn) & 0x3) << 1) | 0x11)
// convert values into 1, 2 or 4 comma separated values
#define VAL_8_BIT(val) (((uint8_t)(val)) & 0xFF)
#define VAL_16_BIT(val) VAL_8_BIT(val), VAL_8_BIT(val >> 8)
#define VAL_32_BIT(val) VAL_16_BIT(val), VAL_16_BIT(val >> 16)
// Local timestamp header and value bytes
#define TS_CONT 0x80
#define TS_TC_BIT 0x40
#define TS_HDR_TC(flag) ((((uint8_t)(flag) & 0x3) << 4) | TS_CONT | TS_TC_BIT)
#define TS_HDR_TS(val) (((uint8_t)(val) & 0x7) << 4)
#define TS_7_BITS(val) ((uint8_t)(val) & 0x7F)
#define TS_7_BITS_CONT(val) (TS_7_BITS(val) | TS_CONT)
// global timestamp values
#define GTS1_HEADER() 0x94
#define GTS2_HEADER() 0xB4
#define GTS1_BYTE3(time, wrap, clk_ch) (((time >> 21) & 0x1F) | ((wrap & 0x1) << 6) | ((clk_ch & 0x1) << 5))
/*** macros to generate static ITM test data
- GEN_ generators expand to comma separated 8 bit values
- all generators end in a ',' to allow them to be concatenated to
build a test data array.
*/
/*! GEN_ASYNC(): generate the async packet
*/
#define GEN_ASYNC() 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
/*! GEN_OVERFLOW(): generate an overflow packet
*/
#define GEN_OVERFLOW() 0x70,
/*! GEN_SWIT_<n>_BYTE(chan, val): set of generators to create 1, 2 and 4 byte SWT packets.
* chan - the channel number / bits 6:2 of the stimulus write address.
* val - value to encode into the packet
*/
#define GEN_SWIT_1_BYTE(chan, val) SWIT_CHAN(chan, ITM_SWIT_SZ_8_BIT), VAL_8_BIT(val),
#define GEN_SWIT_2_BYTE(chan, val) SWIT_CHAN(chan, ITM_SWIT_SZ_16_BIT), VAL_16_BIT(val),
#define GEN_SWIT_4_BYTE(chan, val) SWIT_CHAN(chan, ITM_SWIT_SZ_32_BIT), VAL_32_BIT(val),
/* DWT packet generators - split into packet types determined by disciminators */
/*! GEN_DWT_EVENT_CNT() - generate the DWT event count packet - flag bits indicate event
*/
#define GEN_DWT_EVENT_CNT(flags) DWT_HEADER(0, ITM_SWIT_SZ_8_BIT), (VAL_8_BIT(flags) & 0x3F),
#define GEN_DWT_EXCEP_TRC(excep_num, excep_fn) DWT_HEADER(1, ITM_SWIT_SZ_16_BIT), VAL_8_BIT(excep_num), \
((VAL_8_BIT(excep_num >> 8) & 0x1) | (((uint8_t)(excep_fn) & 0x3) << 4)),
#define GEN_DWT_PC_SAMPLE(pc_val) DWT_HEADER(2, ITM_SWIT_SZ_32_BIT), VAL_32_BIT(pc_val),
#define GEN_DWT_PC_SLEEP() DWT_HEADER(2, ITM_SWIT_SZ_8_BIT), VAL_8_BIT(0),
#define GEN_DWT_DT_PC_VAL(cmpn, pc_val) DWT_HEADER(DWT_DT_DISC_ID_PC(cmpn), ITM_SWIT_SZ_32_BIT), VAL_32_BIT(pc_val),
#define GEN_DWT_DT_ADDR(cmpn, addr_val) DWT_HEADER(DWT_DT_DISC_ID_ADDR(cmpn), ITM_SWIT_SZ_16_BIT), VAL_16_BIT(addr_val),
#define GEN_DWT_DT_DATA_R_8(cmpn, data_val) DWT_HEADER(DWT_DT_DISC_ID_DATA_R(cmpn), ITM_SWIT_SZ_8_BIT), VAL_8_BIT(data_val),
#define GEN_DWT_DT_DATA_R_16(cmpn, data_val) DWT_HEADER(DWT_DT_DISC_ID_DATA_R(cmpn), ITM_SWIT_SZ_16_BIT), VAL_16_BIT(data_val),
#define GEN_DWT_DT_DATA_R_32(cmpn, data_val) DWT_HEADER(DWT_DT_DISC_ID_DATA_R(cmpn), ITM_SWIT_SZ_32_BIT), VAL_32_BIT(data_val),
#define GEN_DWT_DT_DATA_W_8(cmpn, data_val) DWT_HEADER(DWT_DT_DISC_ID_DATA_W(cmpn), ITM_SWIT_SZ_8_BIT), VAL_8_BIT(data_val),
#define GEN_DWT_DT_DATA_W_16(cmpn, data_val) DWT_HEADER(DWT_DT_DISC_ID_DATA_W(cmpn), ITM_SWIT_SZ_16_BIT), VAL_16_BIT(data_val),
#define GEN_DWT_DT_DATA_W_32(cmpn, data_val) DWT_HEADER(DWT_DT_DISC_ID_DATA_W(cmpn), ITM_SWIT_SZ_32_BIT), VAL_32_BIT(data_val),
/*! GEN_LTS_ (): generators for Local TS packets
*/
#define GEN_LTS_HDR_2_0_BITS_SYNC(val) TS_HDR_TS(val),
#define GEN_LTS_6_0_BITS(val, tc) TS_HDR_TC(tc), TS_7_BITS(val),
#define GEN_LTS_13_0_BITS(val, tc) TS_HDR_TC(tc), TS_7_BITS_CONT(val), TS_7_BITS(val >> 7),
#define GEN_LTS_20_0_BITS(val, tc) TS_HDR_TC(tc), TS_7_BITS_CONT(val), \
TS_7_BITS_CONT(val >> 7), TS_7_BITS(val >> 14),
#define GEN_LTS_27_0_BITS(val, tc) TS_HDR_TC(tc), TS_7_BITS_CONT(val), \
TS_7_BITS_CONT(val >> 7), TS_7_BITS_CONT(val >> 14), \
TS_7_BITS(val >> 21),
#define GEN_GTS1_6_0_BITS(time) GTS1_HEADER(), TS_7_BITS(time),
#define GEN_GTS1_13_0_BITS(time) GTS1_HEADER(), TS_7_BITS_CONT(time), TS_7_BITS(time >> 7),
#define GEN_GTS1_20_0_BITS(time) GTS1_HEADER(), TS_7_BITS_CONT(time), \
TS_7_BITS_CONT(time >> 7), TS_7_BITS(time >> 14),
#define GEN_GTS1_25_0_BITS_FLAGS(time, wrap, clk_change) \
GTS1_HEADER(), TS_7_BITS_CONT(time), \
TS_7_BITS_CONT(time >> 7), TS_7_BITS_CONT(time >> 14), \
GTS1_BYTE3(time, wrap, clk_change),
#define GEN_GTS1_25_0_BITS(time) GEN_GTS1_25_0_BITS_FLAGS(time, 0, 0)
#define GEN_GTS2_48_BIT(time) GTS2_HEADER(), TS_7_BITS_CONT(time >> 26), TS_7_BITS_CONT(time >> 33), \
TS_7_BITS_CONT(time >> 40), (TS_7_BITS(time >> 47) & 0x1),
#define GEN_GTS2_64_BIT(time) GTS2_HEADER(), TS_7_BITS_CONT(time >> 26), TS_7_BITS_CONT(time >> 33), \
TS_7_BITS_CONT(time >> 40), TS_7_BITS_CONT(time >> 47), \
TS_7_BITS_CONT(time >> 54), (TS_7_BITS(time >> 61) & 0x7),
#define GEN_EXT_SWIT_PAGE(page) ((((uint8_t)(page) & 0x7) << 4) | 0x8),
#endif // ARM_ITM_TEST_GEN_H_INCLUDED