1*083cfadbSKun Lu /* 2*083cfadbSKun Lu * Copyright (c) 2025, Mediatek Inc. All rights reserved. 3*083cfadbSKun Lu * 4*083cfadbSKun Lu * SPDX-License-Identifier: BSD-3-Clause 5*083cfadbSKun Lu */ 6*083cfadbSKun Lu 7*083cfadbSKun Lu #ifndef MT_SPM_TRACE_H 8*083cfadbSKun Lu #define MT_SPM_TRACE_H 9*083cfadbSKun Lu 10*083cfadbSKun Lu #include <lib/mmio.h> 11*083cfadbSKun Lu 12*083cfadbSKun Lu #include <platform_def.h> 13*083cfadbSKun Lu 14*083cfadbSKun Lu enum mt_spm_sysram_type { 15*083cfadbSKun Lu MT_SPM_SYSRAM_COMMON, 16*083cfadbSKun Lu MT_SPM_SYSRAM_SUSPEND, 17*083cfadbSKun Lu MT_SPM_SYSRAM_LP, 18*083cfadbSKun Lu }; 19*083cfadbSKun Lu 20*083cfadbSKun Lu /* SPM trace common type */ 21*083cfadbSKun Lu enum mt_spm_trace_common_type { 22*083cfadbSKun Lu MT_SPM_TRACE_COMM_HAED, 23*083cfadbSKun Lu MT_SPM_TRACE_COMM_FP, 24*083cfadbSKun Lu MT_SPM_TRACE_COMM_RC_LAST_TIME_H, 25*083cfadbSKun Lu MT_SPM_TRACE_COMM_RC_LAST_TIME_L, 26*083cfadbSKun Lu MT_SPM_TRACE_COMM_RC_INFO, 27*083cfadbSKun Lu MT_SPM_TRACE_COMM_RC_FP, 28*083cfadbSKun Lu MT_SPM_TRACE_COMM_RC_VALID, 29*083cfadbSKun Lu }; 30*083cfadbSKun Lu 31*083cfadbSKun Lu /* SPM trace suspend type */ 32*083cfadbSKun Lu enum mt_spm_trace_suspend_type { 33*083cfadbSKun Lu MT_SPM_TRACE_SUSPEND_WAKE_SRC, 34*083cfadbSKun Lu }; 35*083cfadbSKun Lu 36*083cfadbSKun Lu /* 37*083cfadbSKun Lu * SPM sram usage with mcdi sram 38*083cfadbSKun Lu * start offset : 0x500 39*083cfadbSKun Lu */ 40*083cfadbSKun Lu #define MT_SPM_SYSRAM_BASE (MTK_LPM_SRAM_BASE + 0x500) 41*083cfadbSKun Lu #define MT_SPM_SYSRAM_COMM_BASE MT_SPM_SYSRAM_BASE 42*083cfadbSKun Lu #define MT_SPM_SYSRAM_COMM_SZ 0x20 43*083cfadbSKun Lu 44*083cfadbSKun Lu #define MT_SPM_SYSRAM_SUSPEND_BASE (MT_SPM_SYSRAM_BASE + MT_SPM_SYSRAM_COMM_SZ) 45*083cfadbSKun Lu #define MT_SPM_SYSRAM_SUSPEND_SZ 0xe0 46*083cfadbSKun Lu 47*083cfadbSKun Lu #define MT_SPM_SYSRAM_LP_BASE \ 48*083cfadbSKun Lu (MT_SPM_SYSRAM_SUSPEND_BASE + MT_SPM_SYSRAM_SUSPEND_SZ) 49*083cfadbSKun Lu 50*083cfadbSKun Lu #define MT_SPM_SYSRAM_SLOT(slot) ((slot) << 2u) 51*083cfadbSKun Lu 52*083cfadbSKun Lu #ifndef MTK_PLAT_SPM_TRACE_UNSUPPORT 53*083cfadbSKun Lu 54*083cfadbSKun Lu #define MT_SPM_SYSRAM_W(_s, type, val, _sz) \ 55*083cfadbSKun Lu mt_spm_sysram_write(_s, type, val, _sz) 56*083cfadbSKun Lu 57*083cfadbSKun Lu #define MT_SPM_SYSRAM_R_U32(addr, val) \ 58*083cfadbSKun Lu ({ \ 59*083cfadbSKun Lu unsigned int *r_val = (unsigned int *)val; \ 60*083cfadbSKun Lu if (r_val) \ 61*083cfadbSKun Lu *r_val = mmio_read_32(addr); \ 62*083cfadbSKun Lu }) 63*083cfadbSKun Lu 64*083cfadbSKun Lu #define MT_SPM_SYSRAM_R(_s, type, val) mt_spm_sysram_read(_s, type, val) 65*083cfadbSKun Lu 66*083cfadbSKun Lu /* SPM trace common */ 67*083cfadbSKun Lu #define MT_SPM_TRACE_INIT(_magic) ({ mt_spm_sysram_init(_magic); }) 68*083cfadbSKun Lu 69*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_U32_WR(_type, _val) \ 70*083cfadbSKun Lu ({ \ 71*083cfadbSKun Lu mmio_write_32( \ 72*083cfadbSKun Lu (MT_SPM_SYSRAM_COMM_BASE + MT_SPM_SYSRAM_SLOT(_type)), \ 73*083cfadbSKun Lu _val); \ 74*083cfadbSKun Lu }) 75*083cfadbSKun Lu 76*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_WR(_type, val, _sz) \ 77*083cfadbSKun Lu ({ \ 78*083cfadbSKun Lu int ret = MT_SPM_SYSRAM_W(MT_SPM_SYSRAM_COMMON, _type, val, \ 79*083cfadbSKun Lu _sz); \ 80*083cfadbSKun Lu ret; \ 81*083cfadbSKun Lu }) 82*083cfadbSKun Lu 83*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_U32_RD(_type, _val) \ 84*083cfadbSKun Lu ({ \ 85*083cfadbSKun Lu MT_SPM_SYSRAM_R_U32( \ 86*083cfadbSKun Lu (MT_SPM_SYSRAM_COMM_BASE + MT_SPM_SYSRAM_SLOT(_type)), \ 87*083cfadbSKun Lu _val); \ 88*083cfadbSKun Lu }) 89*083cfadbSKun Lu 90*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_RD(_type, _val) \ 91*083cfadbSKun Lu ({ \ 92*083cfadbSKun Lu int ret = MT_SPM_SYSRAM_R(MT_SPM_SYSRAM_COMMON, _type, _val); \ 93*083cfadbSKun Lu ret; \ 94*083cfadbSKun Lu }) 95*083cfadbSKun Lu 96*083cfadbSKun Lu /* SPM trace suspend */ 97*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_U32_WR(_type, _val) \ 98*083cfadbSKun Lu ({ \ 99*083cfadbSKun Lu mmio_write_32((MT_SPM_SYSRAM_SUSPEND_BASE + \ 100*083cfadbSKun Lu MT_SPM_SYSRAM_SLOT(_type)), \ 101*083cfadbSKun Lu _val); \ 102*083cfadbSKun Lu }) 103*083cfadbSKun Lu 104*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_WR(_type, _val, _sz) \ 105*083cfadbSKun Lu ({ \ 106*083cfadbSKun Lu int ret = MT_SPM_SYSRAM_W(MT_SPM_SYSRAM_SUSPEND, _type, _val, \ 107*083cfadbSKun Lu _sz); \ 108*083cfadbSKun Lu ret; \ 109*083cfadbSKun Lu }) 110*083cfadbSKun Lu 111*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_U32_RD(_type, _val) \ 112*083cfadbSKun Lu ({ \ 113*083cfadbSKun Lu MT_SPM_SYSRAM_R_U32((MT_SPM_SYSRAM_SUSPEND_BASE + \ 114*083cfadbSKun Lu MT_SPM_SYSRAM_SLOT(_type)), \ 115*083cfadbSKun Lu _val); \ 116*083cfadbSKun Lu }) 117*083cfadbSKun Lu 118*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_RD(_type, _val) \ 119*083cfadbSKun Lu ({ \ 120*083cfadbSKun Lu int ret = MT_SPM_SYSRAM_R(MT_SPM_SYSRAM_SUSPEND, _type, _val); \ 121*083cfadbSKun Lu ret; \ 122*083cfadbSKun Lu }) 123*083cfadbSKun Lu 124*083cfadbSKun Lu /* SPM trace low power */ 125*083cfadbSKun Lu #define MT_SPM_TRACE_LP_U32_WR(_type, _val) \ 126*083cfadbSKun Lu ({ \ 127*083cfadbSKun Lu mmio_write_32( \ 128*083cfadbSKun Lu (MT_SPM_SYSRAM_LP_BASE + MT_SPM_SYSRAM_SLOT(_type)), \ 129*083cfadbSKun Lu _val); \ 130*083cfadbSKun Lu }) 131*083cfadbSKun Lu 132*083cfadbSKun Lu #define MT_SPM_TRACE_LP_WR(_type, _val, _sz) \ 133*083cfadbSKun Lu ({ \ 134*083cfadbSKun Lu int ret = MT_SPM_SYSRAM_W(MT_SPM_SYSRAM_LP, _type, _val, _sz); \ 135*083cfadbSKun Lu ret; \ 136*083cfadbSKun Lu }) 137*083cfadbSKun Lu 138*083cfadbSKun Lu #define MT_SPM_TRACE_LP_U32_RD(_type, _val) \ 139*083cfadbSKun Lu ({ \ 140*083cfadbSKun Lu MT_SPM_SYSRAM_R_U32( \ 141*083cfadbSKun Lu (MT_SPM_SYSRAM_LP_BASE + MT_SPM_SYSRAM_SLOT(_type)), \ 142*083cfadbSKun Lu _val); \ 143*083cfadbSKun Lu }) 144*083cfadbSKun Lu 145*083cfadbSKun Lu #define MT_SPM_TRACE_LP_RD(_type, _val) \ 146*083cfadbSKun Lu ({ \ 147*083cfadbSKun Lu int ret = MT_SPM_SYSRAM_R(MT_SPM_SYSRAM_LP, _type, _val); \ 148*083cfadbSKun Lu ret; \ 149*083cfadbSKun Lu }) 150*083cfadbSKun Lu 151*083cfadbSKun Lu #define MT_SPM_TRACE_LP_RINGBUF(_pval, _sz) \ 152*083cfadbSKun Lu ({ \ 153*083cfadbSKun Lu int ret = mt_spm_sysram_lp_ringbuf_add(_pval, _sz); \ 154*083cfadbSKun Lu ret; \ 155*083cfadbSKun Lu }) 156*083cfadbSKun Lu 157*083cfadbSKun Lu int mt_spm_sysram_lp_ringbuf_add(const void *val, unsigned int sz); 158*083cfadbSKun Lu 159*083cfadbSKun Lu int mt_spm_sysram_write(int section, int type, const void *val, 160*083cfadbSKun Lu unsigned int sz); 161*083cfadbSKun Lu int mt_spm_sysram_read(int section, int type, void *val); 162*083cfadbSKun Lu 163*083cfadbSKun Lu int mt_spm_sysram_init(unsigned int magic); 164*083cfadbSKun Lu #else 165*083cfadbSKun Lu /* SPM trace common */ 166*083cfadbSKun Lu #define MT_SPM_TRACE_INIT(_magic) 167*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_U32_WR(type, val) 168*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_WR(val) 169*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_U32_RD(type, val) 170*083cfadbSKun Lu #define MT_SPM_TRACE_COMMON_RD(val) 171*083cfadbSKun Lu 172*083cfadbSKun Lu /* SPM trace suspend */ 173*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_U32_WR(type, val) 174*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_WR(val) 175*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_U32_RD(type, val) 176*083cfadbSKun Lu #define MT_SPM_TRACE_SUSPEND_RD(val) 177*083cfadbSKun Lu 178*083cfadbSKun Lu /* SPM trace low power */ 179*083cfadbSKun Lu #define MT_SPM_TRACE_LP_U32_WR(type, val) 180*083cfadbSKun Lu #define MT_SPM_TRACE_LP_WR(val) 181*083cfadbSKun Lu #define MT_SPM_TRACE_LP_U32_RD(type, val) 182*083cfadbSKun Lu #define MT_SPM_TRACE_LP_RD(val) 183*083cfadbSKun Lu #define MT_SPM_TRACE_LP_RINGBUF(pval, sz) 184*083cfadbSKun Lu 185*083cfadbSKun Lu #define mt_spm_sysram_lp_ringbuf_add(_val, _sz) 186*083cfadbSKun Lu #define mt_spm_sysram_write(_s, _type, _val, _sz) 187*083cfadbSKun Lu #define mt_spm_sysram_read(_s, _type, _val) 188*083cfadbSKun Lu #define mt_spm_sysram_init(_magic) 189*083cfadbSKun Lu #endif 190*083cfadbSKun Lu 191*083cfadbSKun Lu #endif /* MT_SPM_TRACE_H */ 192