Skip to content

Commit 74b3092

Browse files
Hariprasad Shenaidavem330
authored andcommitted
cxgb4: Add support for cim_qcfg entry in debugfs
Adds debug log to get cim queue config Signed-off-by: Hariprasad Shenai <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent f1ff24a commit 74b3092

File tree

5 files changed

+164
-0
lines changed

5 files changed

+164
-0
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,7 @@ int t4_cim_read(struct adapter *adap, unsigned int addr, unsigned int n,
10411041
int t4_cim_write(struct adapter *adap, unsigned int addr, unsigned int n,
10421042
const unsigned int *valp);
10431043
int t4_cim_read_la(struct adapter *adap, u32 *la_buf, unsigned int *wrptr);
1044+
void t4_read_cimq_cfg(struct adapter *adap, u16 *base, u16 *size, u16 *thres);
10441045
const char *t4_get_port_type_description(enum fw_port_type port_type);
10451046
void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p);
10461047
void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log);

drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,75 @@ static const struct file_operations cim_la_fops = {
168168
.release = seq_release_private
169169
};
170170

171+
static int cim_qcfg_show(struct seq_file *seq, void *v)
172+
{
173+
static const char * const qname[] = {
174+
"TP0", "TP1", "ULP", "SGE0", "SGE1", "NC-SI",
175+
"ULP0", "ULP1", "ULP2", "ULP3", "SGE", "NC-SI",
176+
"SGE0-RX", "SGE1-RX"
177+
};
178+
179+
int i;
180+
struct adapter *adap = seq->private;
181+
u16 base[CIM_NUM_IBQ + CIM_NUM_OBQ_T5];
182+
u16 size[CIM_NUM_IBQ + CIM_NUM_OBQ_T5];
183+
u32 stat[(4 * (CIM_NUM_IBQ + CIM_NUM_OBQ_T5))];
184+
u16 thres[CIM_NUM_IBQ];
185+
u32 obq_wr_t4[2 * CIM_NUM_OBQ], *wr;
186+
u32 obq_wr_t5[2 * CIM_NUM_OBQ_T5];
187+
u32 *p = stat;
188+
int cim_num_obq = is_t4(adap->params.chip) ?
189+
CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
190+
191+
i = t4_cim_read(adap, is_t4(adap->params.chip) ? UP_IBQ_0_RDADDR_A :
192+
UP_IBQ_0_SHADOW_RDADDR_A,
193+
ARRAY_SIZE(stat), stat);
194+
if (!i) {
195+
if (is_t4(adap->params.chip)) {
196+
i = t4_cim_read(adap, UP_OBQ_0_REALADDR_A,
197+
ARRAY_SIZE(obq_wr_t4), obq_wr_t4);
198+
wr = obq_wr_t4;
199+
} else {
200+
i = t4_cim_read(adap, UP_OBQ_0_SHADOW_REALADDR_A,
201+
ARRAY_SIZE(obq_wr_t5), obq_wr_t5);
202+
wr = obq_wr_t5;
203+
}
204+
}
205+
if (i)
206+
return i;
207+
208+
t4_read_cimq_cfg(adap, base, size, thres);
209+
210+
seq_printf(seq,
211+
" Queue Base Size Thres RdPtr WrPtr SOP EOP Avail\n");
212+
for (i = 0; i < CIM_NUM_IBQ; i++, p += 4)
213+
seq_printf(seq, "%7s %5x %5u %5u %6x %4x %4u %4u %5u\n",
214+
qname[i], base[i], size[i], thres[i],
215+
IBQRDADDR_G(p[0]), IBQWRADDR_G(p[1]),
216+
QUESOPCNT_G(p[3]), QUEEOPCNT_G(p[3]),
217+
QUEREMFLITS_G(p[2]) * 16);
218+
for ( ; i < CIM_NUM_IBQ + cim_num_obq; i++, p += 4, wr += 2)
219+
seq_printf(seq, "%7s %5x %5u %12x %4x %4u %4u %5u\n",
220+
qname[i], base[i], size[i],
221+
QUERDADDR_G(p[0]) & 0x3fff, wr[0] - base[i],
222+
QUESOPCNT_G(p[3]), QUEEOPCNT_G(p[3]),
223+
QUEREMFLITS_G(p[2]) * 16);
224+
return 0;
225+
}
226+
227+
static int cim_qcfg_open(struct inode *inode, struct file *file)
228+
{
229+
return single_open(file, cim_qcfg_show, inode->i_private);
230+
}
231+
232+
static const struct file_operations cim_qcfg_fops = {
233+
.owner = THIS_MODULE,
234+
.open = cim_qcfg_open,
235+
.read = seq_read,
236+
.llseek = seq_lseek,
237+
.release = single_release,
238+
};
239+
171240
/* Firmware Device Log dump. */
172241
static const char * const devlog_level_strings[] = {
173242
[FW_DEVLOG_LEVEL_EMERG] = "EMERG",
@@ -443,6 +512,7 @@ int t4_setup_debugfs(struct adapter *adap)
443512

444513
static struct t4_debugfs_entry t4_debugfs_files[] = {
445514
{ "cim_la", &cim_la_fops, S_IRUSR, 0 },
515+
{ "cim_qcfg", &cim_qcfg_fops, S_IRUSR, 0 },
446516
{ "devlog", &devlog_fops, S_IRUSR, 0 },
447517
{ "l2t", &t4_l2t_fops, S_IRUSR, 0},
448518
};

drivers/net/ethernet/chelsio/cxgb4/t4_hw.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4325,6 +4325,41 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
43254325
return 0;
43264326
}
43274327

4328+
/**
4329+
* t4_read_cimq_cfg - read CIM queue configuration
4330+
* @adap: the adapter
4331+
* @base: holds the queue base addresses in bytes
4332+
* @size: holds the queue sizes in bytes
4333+
* @thres: holds the queue full thresholds in bytes
4334+
*
4335+
* Returns the current configuration of the CIM queues, starting with
4336+
* the IBQs, then the OBQs.
4337+
*/
4338+
void t4_read_cimq_cfg(struct adapter *adap, u16 *base, u16 *size, u16 *thres)
4339+
{
4340+
unsigned int i, v;
4341+
int cim_num_obq = is_t4(adap->params.chip) ?
4342+
CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
4343+
4344+
for (i = 0; i < CIM_NUM_IBQ; i++) {
4345+
t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, IBQSELECT_F |
4346+
QUENUMSELECT_V(i));
4347+
v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
4348+
/* value is in 256-byte units */
4349+
*base++ = CIMQBASE_G(v) * 256;
4350+
*size++ = CIMQSIZE_G(v) * 256;
4351+
*thres++ = QUEFULLTHRSH_G(v) * 8; /* 8-byte unit */
4352+
}
4353+
for (i = 0; i < cim_num_obq; i++) {
4354+
t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F |
4355+
QUENUMSELECT_V(i));
4356+
v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
4357+
/* value is in 256-byte units */
4358+
*base++ = CIMQBASE_G(v) * 256;
4359+
*size++ = CIMQSIZE_G(v) * 256;
4360+
}
4361+
}
4362+
43284363
/**
43294364
* t4_cim_read - read a block from CIM internal address space
43304365
* @adap: the adapter

drivers/net/ethernet/chelsio/cxgb4/t4_hw.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ enum {
5656
};
5757

5858
enum {
59+
CIM_NUM_IBQ = 6, /* # of CIM IBQs */
60+
CIM_NUM_OBQ = 6, /* # of CIM OBQs */
61+
CIM_NUM_OBQ_T5 = 8, /* # of CIM OBQs for T5 adapter */
5962
CIMLA_SIZE = 2048, /* # of 32-bit words in CIM LA */
6063
};
6164

drivers/net/ethernet/chelsio/cxgb4/t4_regs.h

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,4 +2096,59 @@
20962096
#define UPDBGLACAPTPCONLY_V(x) ((x) << UPDBGLACAPTPCONLY_S)
20972097
#define UPDBGLACAPTPCONLY_F UPDBGLACAPTPCONLY_V(1U)
20982098

2099+
#define CIM_QUEUE_CONFIG_REF_A 0x7b48
2100+
#define CIM_QUEUE_CONFIG_CTRL_A 0x7b4c
2101+
2102+
#define CIMQSIZE_S 24
2103+
#define CIMQSIZE_M 0x3fU
2104+
#define CIMQSIZE_G(x) (((x) >> CIMQSIZE_S) & CIMQSIZE_M)
2105+
2106+
#define CIMQBASE_S 16
2107+
#define CIMQBASE_M 0x3fU
2108+
#define CIMQBASE_G(x) (((x) >> CIMQBASE_S) & CIMQBASE_M)
2109+
2110+
#define QUEFULLTHRSH_S 0
2111+
#define QUEFULLTHRSH_M 0x1ffU
2112+
#define QUEFULLTHRSH_G(x) (((x) >> QUEFULLTHRSH_S) & QUEFULLTHRSH_M)
2113+
2114+
#define UP_IBQ_0_RDADDR_A 0x10
2115+
#define UP_IBQ_0_SHADOW_RDADDR_A 0x280
2116+
#define UP_OBQ_0_REALADDR_A 0x104
2117+
#define UP_OBQ_0_SHADOW_REALADDR_A 0x394
2118+
2119+
#define IBQRDADDR_S 0
2120+
#define IBQRDADDR_M 0x1fffU
2121+
#define IBQRDADDR_G(x) (((x) >> IBQRDADDR_S) & IBQRDADDR_M)
2122+
2123+
#define IBQWRADDR_S 0
2124+
#define IBQWRADDR_M 0x1fffU
2125+
#define IBQWRADDR_G(x) (((x) >> IBQWRADDR_S) & IBQWRADDR_M)
2126+
2127+
#define QUERDADDR_S 0
2128+
#define QUERDADDR_M 0x7fffU
2129+
#define QUERDADDR_G(x) (((x) >> QUERDADDR_S) & QUERDADDR_M)
2130+
2131+
#define QUEREMFLITS_S 0
2132+
#define QUEREMFLITS_M 0x7ffU
2133+
#define QUEREMFLITS_G(x) (((x) >> QUEREMFLITS_S) & QUEREMFLITS_M)
2134+
2135+
#define QUEEOPCNT_S 16
2136+
#define QUEEOPCNT_M 0xfffU
2137+
#define QUEEOPCNT_G(x) (((x) >> QUEEOPCNT_S) & QUEEOPCNT_M)
2138+
2139+
#define QUESOPCNT_S 0
2140+
#define QUESOPCNT_M 0xfffU
2141+
#define QUESOPCNT_G(x) (((x) >> QUESOPCNT_S) & QUESOPCNT_M)
2142+
2143+
#define OBQSELECT_S 4
2144+
#define OBQSELECT_V(x) ((x) << OBQSELECT_S)
2145+
#define OBQSELECT_F OBQSELECT_V(1U)
2146+
2147+
#define IBQSELECT_S 3
2148+
#define IBQSELECT_V(x) ((x) << IBQSELECT_S)
2149+
#define IBQSELECT_F IBQSELECT_V(1U)
2150+
2151+
#define QUENUMSELECT_S 0
2152+
#define QUENUMSELECT_V(x) ((x) << QUENUMSELECT_S)
2153+
20992154
#endif /* __T4_REGS_H */

0 commit comments

Comments
 (0)