hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
 ****************************************************************************************
 *
 * @file rwnx_prof.h
 *
 * Copyright (C) RivieraWaves 2012-2019
 *
 ****************************************************************************************
 */
 
#ifndef _RWNX_PROF_H_
#define _RWNX_PROF_H_
 
#include "reg_access.h"
#include "rwnx_platform.h"
 
static inline void rwnx_prof_set(struct rwnx_hw *rwnx_hw, int val)
{
   struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
   RWNX_REG_WRITE(val, rwnx_plat, RWNX_ADDR_SYSTEM, NXMAC_SW_SET_PROFILING_ADDR);
}
 
static inline void rwnx_prof_clear(struct rwnx_hw *rwnx_hw, int val)
{
   struct rwnx_plat *rwnx_plat = rwnx_hw->plat;
   RWNX_REG_WRITE(val, rwnx_plat, RWNX_ADDR_SYSTEM, NXMAC_SW_CLEAR_PROFILING_ADDR);
}
 
#if 0
/* Defines for SW Profiling registers values */
enum {
   TX_IPC_IRQ,
   TX_IPC_EVT,
   TX_PREP_EVT,
   TX_DMA_IRQ,
   TX_MAC_IRQ,
   TX_PAYL_HDL,
   TX_CFM_EVT,
   TX_IPC_CFM,
   RX_MAC_IRQ,                 // 8
   RX_TRIGGER_EVT,
   RX_DMA_IRQ,
   RX_DMA_EVT,
   RX_IPC_IND,
   RX_MPDU_XFER,
   DBG_PROF_MAX
};
#endif
 
enum {
   SW_PROF_HOSTBUF_IDX = 12,
   /****** IPC IRQs related signals ******/
   /* E2A direction */
   SW_PROF_IRQ_E2A_RXDESC = 16,    // to make sure we let 16 bits available for LMAC FW
   SW_PROF_IRQ_E2A_TXCFM,
   SW_PROF_IRQ_E2A_DBG,
   SW_PROF_IRQ_E2A_MSG,
   SW_PROF_IPC_MSGPUSH,
   SW_PROF_MSGALLOC,
   SW_PROF_MSGIND,
   SW_PROF_DBGIND,
 
   /* A2E direction */
   SW_PROF_IRQ_A2E_TXCFM_BACK,
 
   /****** Driver functions related signals ******/
   SW_PROF_WAIT_QUEUE_STOP,
   SW_PROF_WAIT_QUEUE_WAKEUP,
   SW_PROF_RWNXDATAIND,
   SW_PROF_RWNX_IPC_IRQ_HDLR,
   SW_PROF_RWNX_IPC_THR_IRQ_HDLR,
   SW_PROF_IEEE80211RX,
   SW_PROF_RWNX_PATTERN,
   SW_PROF_MAX
};
 
// [LT]For debug purpose only
#if (0)
#define SW_PROF_CHAN_CTXT_CFM_HDL_BIT       (21)
#define SW_PROF_CHAN_CTXT_CFM_BIT           (22)
#define SW_PROF_CHAN_CTXT_CFM_SWDONE_BIT    (23)
#define SW_PROF_CHAN_CTXT_PUSH_BIT          (24)
#define SW_PROF_CHAN_CTXT_QUEUE_BIT         (25)
#define SW_PROF_CHAN_CTXT_TX_BIT            (26)
#define SW_PROF_CHAN_CTXT_TX_PAUSE_BIT      (27)
#define SW_PROF_CHAN_CTXT_PSWTCH_BIT        (28)
#define SW_PROF_CHAN_CTXT_SWTCH_BIT         (29)
 
// TO DO: update this
 
#define REG_SW_SET_PROFILING_CHAN(env, bit)             \
   rwnx_prof_set((struct rwnx_hw *)env, BIT(bit))
 
#define REG_SW_CLEAR_PROFILING_CHAN(env, bit) \
   rwnx_prof_clear((struct rwnx_hw *)env, BIT(bit))
 
#else
#define SW_PROF_CHAN_CTXT_CFM_HDL_BIT       (0)
#define SW_PROF_CHAN_CTXT_CFM_BIT           (0)
#define SW_PROF_CHAN_CTXT_CFM_SWDONE_BIT    (0)
#define SW_PROF_CHAN_CTXT_PUSH_BIT          (0)
#define SW_PROF_CHAN_CTXT_QUEUE_BIT         (0)
#define SW_PROF_CHAN_CTXT_TX_BIT            (0)
#define SW_PROF_CHAN_CTXT_TX_PAUSE_BIT      (0)
#define SW_PROF_CHAN_CTXT_PSWTCH_BIT        (0)
#define SW_PROF_CHAN_CTXT_SWTCH_BIT         (0)
 
#define REG_SW_SET_PROFILING_CHAN(env, bit)            do {} while (0)
#define REG_SW_CLEAR_PROFILING_CHAN(env, bit)          do {} while (0)
#endif
 
#ifdef CONFIG_RWNX_SW_PROFILING
/* Macros for SW PRofiling registers access */
#define REG_SW_SET_PROFILING(env, bit)                  \
   rwnx_prof_set((struct rwnx_hw *)env, BIT(bit))
 
#define REG_SW_SET_HOSTBUF_IDX_PROFILING(env, val)      \
   rwnx_prof_set((struct rwnx_hw *)env, val << (SW_PROF_HOSTBUF_IDX))
 
#define REG_SW_CLEAR_PROFILING(env, bit)                \
   rwnx_prof_clear((struct rwnx_hw *)env, BIT(bit))
 
#define REG_SW_CLEAR_HOSTBUF_IDX_PROFILING(env)                         \
   rwnx_prof_clear((struct rwnx_hw *)env, 0x0F << (SW_PROF_HOSTBUF_IDX))
 
#else
#define REG_SW_SET_PROFILING(env, value)            do {} while (0)
#define REG_SW_CLEAR_PROFILING(env, value)          do {} while (0)
#define REG_SW_SET_HOSTBUF_IDX_PROFILING(env, val)  do {} while (0)
#define REG_SW_CLEAR_HOSTBUF_IDX_PROFILING(env)     do {} while (0)
#endif
 
#endif /* _RWNX_PROF_H_ */