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