Skip to content

Commit d1b22e4

Browse files
committed
Merge branch 'cxgb4-next'
Hariprasad Shenai says: ==================== add meminfo, bist status and misc. fixes This patch series adds the following. Add support to dump memory address range of various hw modules Add support to dump edc bist status during ecc error Read correct bits of who am i register for T6 adapter and update T6 register range This patch series has been created against net-next tree and includes patches on cxgb4 and cxgb4vf driver. We have included all the maintainers of respective drivers. Kindly review the change and let us know in case of any review comments. V2: PATCH 3/4 ("cxgb4/cxgb4vf: read the correct bits of PL Who Am I register") Fix switch statement in get_chip_type() and some more style fixes based on review comment by Sergei Shtylyov <[email protected]> ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents a6affd2 + f109ff1 commit d1b22e4

File tree

5 files changed

+506
-20
lines changed

5 files changed

+506
-20
lines changed

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

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2275,6 +2275,290 @@ static const struct file_operations blocked_fl_fops = {
22752275
.llseek = generic_file_llseek,
22762276
};
22772277

2278+
struct mem_desc {
2279+
unsigned int base;
2280+
unsigned int limit;
2281+
unsigned int idx;
2282+
};
2283+
2284+
static int mem_desc_cmp(const void *a, const void *b)
2285+
{
2286+
return ((const struct mem_desc *)a)->base -
2287+
((const struct mem_desc *)b)->base;
2288+
}
2289+
2290+
static void mem_region_show(struct seq_file *seq, const char *name,
2291+
unsigned int from, unsigned int to)
2292+
{
2293+
char buf[40];
2294+
2295+
string_get_size((u64)to - from + 1, 1, STRING_UNITS_2, buf,
2296+
sizeof(buf));
2297+
seq_printf(seq, "%-15s %#x-%#x [%s]\n", name, from, to, buf);
2298+
}
2299+
2300+
static int meminfo_show(struct seq_file *seq, void *v)
2301+
{
2302+
static const char * const memory[] = { "EDC0:", "EDC1:", "MC:",
2303+
"MC0:", "MC1:"};
2304+
static const char * const region[] = {
2305+
"DBQ contexts:", "IMSG contexts:", "FLM cache:", "TCBs:",
2306+
"Pstructs:", "Timers:", "Rx FL:", "Tx FL:", "Pstruct FL:",
2307+
"Tx payload:", "Rx payload:", "LE hash:", "iSCSI region:",
2308+
"TDDP region:", "TPT region:", "STAG region:", "RQ region:",
2309+
"RQUDP region:", "PBL region:", "TXPBL region:",
2310+
"DBVFIFO region:", "ULPRX state:", "ULPTX state:",
2311+
"On-chip queues:"
2312+
};
2313+
2314+
int i, n;
2315+
u32 lo, hi, used, alloc;
2316+
struct mem_desc avail[4];
2317+
struct mem_desc mem[ARRAY_SIZE(region) + 3]; /* up to 3 holes */
2318+
struct mem_desc *md = mem;
2319+
struct adapter *adap = seq->private;
2320+
2321+
for (i = 0; i < ARRAY_SIZE(mem); i++) {
2322+
mem[i].limit = 0;
2323+
mem[i].idx = i;
2324+
}
2325+
2326+
/* Find and sort the populated memory ranges */
2327+
i = 0;
2328+
lo = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A);
2329+
if (lo & EDRAM0_ENABLE_F) {
2330+
hi = t4_read_reg(adap, MA_EDRAM0_BAR_A);
2331+
avail[i].base = EDRAM0_BASE_G(hi) << 20;
2332+
avail[i].limit = avail[i].base + (EDRAM0_SIZE_G(hi) << 20);
2333+
avail[i].idx = 0;
2334+
i++;
2335+
}
2336+
if (lo & EDRAM1_ENABLE_F) {
2337+
hi = t4_read_reg(adap, MA_EDRAM1_BAR_A);
2338+
avail[i].base = EDRAM1_BASE_G(hi) << 20;
2339+
avail[i].limit = avail[i].base + (EDRAM1_SIZE_G(hi) << 20);
2340+
avail[i].idx = 1;
2341+
i++;
2342+
}
2343+
2344+
if (is_t5(adap->params.chip)) {
2345+
if (lo & EXT_MEM0_ENABLE_F) {
2346+
hi = t4_read_reg(adap, MA_EXT_MEMORY0_BAR_A);
2347+
avail[i].base = EXT_MEM0_BASE_G(hi) << 20;
2348+
avail[i].limit =
2349+
avail[i].base + (EXT_MEM0_SIZE_G(hi) << 20);
2350+
avail[i].idx = 3;
2351+
i++;
2352+
}
2353+
if (lo & EXT_MEM1_ENABLE_F) {
2354+
hi = t4_read_reg(adap, MA_EXT_MEMORY1_BAR_A);
2355+
avail[i].base = EXT_MEM1_BASE_G(hi) << 20;
2356+
avail[i].limit =
2357+
avail[i].base + (EXT_MEM1_SIZE_G(hi) << 20);
2358+
avail[i].idx = 4;
2359+
i++;
2360+
}
2361+
} else {
2362+
if (lo & EXT_MEM_ENABLE_F) {
2363+
hi = t4_read_reg(adap, MA_EXT_MEMORY_BAR_A);
2364+
avail[i].base = EXT_MEM_BASE_G(hi) << 20;
2365+
avail[i].limit =
2366+
avail[i].base + (EXT_MEM_SIZE_G(hi) << 20);
2367+
avail[i].idx = 2;
2368+
i++;
2369+
}
2370+
}
2371+
if (!i) /* no memory available */
2372+
return 0;
2373+
sort(avail, i, sizeof(struct mem_desc), mem_desc_cmp, NULL);
2374+
2375+
(md++)->base = t4_read_reg(adap, SGE_DBQ_CTXT_BADDR_A);
2376+
(md++)->base = t4_read_reg(adap, SGE_IMSG_CTXT_BADDR_A);
2377+
(md++)->base = t4_read_reg(adap, SGE_FLM_CACHE_BADDR_A);
2378+
(md++)->base = t4_read_reg(adap, TP_CMM_TCB_BASE_A);
2379+
(md++)->base = t4_read_reg(adap, TP_CMM_MM_BASE_A);
2380+
(md++)->base = t4_read_reg(adap, TP_CMM_TIMER_BASE_A);
2381+
(md++)->base = t4_read_reg(adap, TP_CMM_MM_RX_FLST_BASE_A);
2382+
(md++)->base = t4_read_reg(adap, TP_CMM_MM_TX_FLST_BASE_A);
2383+
(md++)->base = t4_read_reg(adap, TP_CMM_MM_PS_FLST_BASE_A);
2384+
2385+
/* the next few have explicit upper bounds */
2386+
md->base = t4_read_reg(adap, TP_PMM_TX_BASE_A);
2387+
md->limit = md->base - 1 +
2388+
t4_read_reg(adap, TP_PMM_TX_PAGE_SIZE_A) *
2389+
PMTXMAXPAGE_G(t4_read_reg(adap, TP_PMM_TX_MAX_PAGE_A));
2390+
md++;
2391+
2392+
md->base = t4_read_reg(adap, TP_PMM_RX_BASE_A);
2393+
md->limit = md->base - 1 +
2394+
t4_read_reg(adap, TP_PMM_RX_PAGE_SIZE_A) *
2395+
PMRXMAXPAGE_G(t4_read_reg(adap, TP_PMM_RX_MAX_PAGE_A));
2396+
md++;
2397+
2398+
if (t4_read_reg(adap, LE_DB_CONFIG_A) & HASHEN_F) {
2399+
if (CHELSIO_CHIP_VERSION(adap->params.chip) <= CHELSIO_T5) {
2400+
hi = t4_read_reg(adap, LE_DB_TID_HASHBASE_A) / 4;
2401+
md->base = t4_read_reg(adap, LE_DB_HASH_TID_BASE_A);
2402+
} else {
2403+
hi = t4_read_reg(adap, LE_DB_HASH_TID_BASE_A);
2404+
md->base = t4_read_reg(adap,
2405+
LE_DB_HASH_TBL_BASE_ADDR_A);
2406+
}
2407+
md->limit = 0;
2408+
} else {
2409+
md->base = 0;
2410+
md->idx = ARRAY_SIZE(region); /* hide it */
2411+
}
2412+
md++;
2413+
2414+
#define ulp_region(reg) do { \
2415+
md->base = t4_read_reg(adap, ULP_ ## reg ## _LLIMIT_A);\
2416+
(md++)->limit = t4_read_reg(adap, ULP_ ## reg ## _ULIMIT_A); \
2417+
} while (0)
2418+
2419+
ulp_region(RX_ISCSI);
2420+
ulp_region(RX_TDDP);
2421+
ulp_region(TX_TPT);
2422+
ulp_region(RX_STAG);
2423+
ulp_region(RX_RQ);
2424+
ulp_region(RX_RQUDP);
2425+
ulp_region(RX_PBL);
2426+
ulp_region(TX_PBL);
2427+
#undef ulp_region
2428+
md->base = 0;
2429+
md->idx = ARRAY_SIZE(region);
2430+
if (!is_t4(adap->params.chip)) {
2431+
u32 size = 0;
2432+
u32 sge_ctrl = t4_read_reg(adap, SGE_CONTROL2_A);
2433+
u32 fifo_size = t4_read_reg(adap, SGE_DBVFIFO_SIZE_A);
2434+
2435+
if (is_t5(adap->params.chip)) {
2436+
if (sge_ctrl & VFIFO_ENABLE_F)
2437+
size = DBVFIFO_SIZE_G(fifo_size);
2438+
} else {
2439+
size = T6_DBVFIFO_SIZE_G(fifo_size);
2440+
}
2441+
2442+
if (size) {
2443+
md->base = BASEADDR_G(t4_read_reg(adap,
2444+
SGE_DBVFIFO_BADDR_A));
2445+
md->limit = md->base + (size << 2) - 1;
2446+
}
2447+
}
2448+
2449+
md++;
2450+
2451+
md->base = t4_read_reg(adap, ULP_RX_CTX_BASE_A);
2452+
md->limit = 0;
2453+
md++;
2454+
md->base = t4_read_reg(adap, ULP_TX_ERR_TABLE_BASE_A);
2455+
md->limit = 0;
2456+
md++;
2457+
2458+
md->base = adap->vres.ocq.start;
2459+
if (adap->vres.ocq.size)
2460+
md->limit = md->base + adap->vres.ocq.size - 1;
2461+
else
2462+
md->idx = ARRAY_SIZE(region); /* hide it */
2463+
md++;
2464+
2465+
/* add any address-space holes, there can be up to 3 */
2466+
for (n = 0; n < i - 1; n++)
2467+
if (avail[n].limit < avail[n + 1].base)
2468+
(md++)->base = avail[n].limit;
2469+
if (avail[n].limit)
2470+
(md++)->base = avail[n].limit;
2471+
2472+
n = md - mem;
2473+
sort(mem, n, sizeof(struct mem_desc), mem_desc_cmp, NULL);
2474+
2475+
for (lo = 0; lo < i; lo++)
2476+
mem_region_show(seq, memory[avail[lo].idx], avail[lo].base,
2477+
avail[lo].limit - 1);
2478+
2479+
seq_putc(seq, '\n');
2480+
for (i = 0; i < n; i++) {
2481+
if (mem[i].idx >= ARRAY_SIZE(region))
2482+
continue; /* skip holes */
2483+
if (!mem[i].limit)
2484+
mem[i].limit = i < n - 1 ? mem[i + 1].base - 1 : ~0;
2485+
mem_region_show(seq, region[mem[i].idx], mem[i].base,
2486+
mem[i].limit);
2487+
}
2488+
2489+
seq_putc(seq, '\n');
2490+
lo = t4_read_reg(adap, CIM_SDRAM_BASE_ADDR_A);
2491+
hi = t4_read_reg(adap, CIM_SDRAM_ADDR_SIZE_A) + lo - 1;
2492+
mem_region_show(seq, "uP RAM:", lo, hi);
2493+
2494+
lo = t4_read_reg(adap, CIM_EXTMEM2_BASE_ADDR_A);
2495+
hi = t4_read_reg(adap, CIM_EXTMEM2_ADDR_SIZE_A) + lo - 1;
2496+
mem_region_show(seq, "uP Extmem2:", lo, hi);
2497+
2498+
lo = t4_read_reg(adap, TP_PMM_RX_MAX_PAGE_A);
2499+
seq_printf(seq, "\n%u Rx pages of size %uKiB for %u channels\n",
2500+
PMRXMAXPAGE_G(lo),
2501+
t4_read_reg(adap, TP_PMM_RX_PAGE_SIZE_A) >> 10,
2502+
(lo & PMRXNUMCHN_F) ? 2 : 1);
2503+
2504+
lo = t4_read_reg(adap, TP_PMM_TX_MAX_PAGE_A);
2505+
hi = t4_read_reg(adap, TP_PMM_TX_PAGE_SIZE_A);
2506+
seq_printf(seq, "%u Tx pages of size %u%ciB for %u channels\n",
2507+
PMTXMAXPAGE_G(lo),
2508+
hi >= (1 << 20) ? (hi >> 20) : (hi >> 10),
2509+
hi >= (1 << 20) ? 'M' : 'K', 1 << PMTXNUMCHN_G(lo));
2510+
seq_printf(seq, "%u p-structs\n\n",
2511+
t4_read_reg(adap, TP_CMM_MM_MAX_PSTRUCT_A));
2512+
2513+
for (i = 0; i < 4; i++) {
2514+
if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5)
2515+
lo = t4_read_reg(adap, MPS_RX_MAC_BG_PG_CNT0_A + i * 4);
2516+
else
2517+
lo = t4_read_reg(adap, MPS_RX_PG_RSV0_A + i * 4);
2518+
if (is_t5(adap->params.chip)) {
2519+
used = T5_USED_G(lo);
2520+
alloc = T5_ALLOC_G(lo);
2521+
} else {
2522+
used = USED_G(lo);
2523+
alloc = ALLOC_G(lo);
2524+
}
2525+
/* For T6 these are MAC buffer groups */
2526+
seq_printf(seq, "Port %d using %u pages out of %u allocated\n",
2527+
i, used, alloc);
2528+
}
2529+
for (i = 0; i < adap->params.arch.nchan; i++) {
2530+
if (CHELSIO_CHIP_VERSION(adap->params.chip) > CHELSIO_T5)
2531+
lo = t4_read_reg(adap,
2532+
MPS_RX_LPBK_BG_PG_CNT0_A + i * 4);
2533+
else
2534+
lo = t4_read_reg(adap, MPS_RX_PG_RSV4_A + i * 4);
2535+
if (is_t5(adap->params.chip)) {
2536+
used = T5_USED_G(lo);
2537+
alloc = T5_ALLOC_G(lo);
2538+
} else {
2539+
used = USED_G(lo);
2540+
alloc = ALLOC_G(lo);
2541+
}
2542+
/* For T6 these are MAC buffer groups */
2543+
seq_printf(seq,
2544+
"Loopback %d using %u pages out of %u allocated\n",
2545+
i, used, alloc);
2546+
}
2547+
return 0;
2548+
}
2549+
2550+
static int meminfo_open(struct inode *inode, struct file *file)
2551+
{
2552+
return single_open(file, meminfo_show, inode->i_private);
2553+
}
2554+
2555+
static const struct file_operations meminfo_fops = {
2556+
.owner = THIS_MODULE,
2557+
.open = meminfo_open,
2558+
.read = seq_read,
2559+
.llseek = seq_lseek,
2560+
.release = single_release,
2561+
};
22782562
/* Add an array of Debug FS files.
22792563
*/
22802564
void add_debugfs_files(struct adapter *adap,
@@ -2342,6 +2626,7 @@ int t4_setup_debugfs(struct adapter *adap)
23422626
{ "clip_tbl", &clip_tbl_debugfs_fops, S_IRUSR, 0 },
23432627
#endif
23442628
{ "blocked_fl", &blocked_fl_fops, S_IRUSR | S_IWUSR, 0 },
2629+
{ "meminfo", &meminfo_fops, S_IRUSR, 0 },
23452630
};
23462631

23472632
/* Debug FS nodes common to all T5 and later adapters.

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4551,13 +4551,41 @@ static void free_some_resources(struct adapter *adapter)
45514551
NETIF_F_IPV6_CSUM | NETIF_F_HIGHDMA)
45524552
#define SEGMENT_SIZE 128
45534553

4554+
static int get_chip_type(struct pci_dev *pdev, u32 pl_rev)
4555+
{
4556+
int ver, chip;
4557+
u16 device_id;
4558+
4559+
/* Retrieve adapter's device ID */
4560+
pci_read_config_word(pdev, PCI_DEVICE_ID, &device_id);
4561+
ver = device_id >> 12;
4562+
switch (ver) {
4563+
case CHELSIO_T4:
4564+
chip |= CHELSIO_CHIP_CODE(CHELSIO_T4, pl_rev);
4565+
break;
4566+
case CHELSIO_T5:
4567+
chip |= CHELSIO_CHIP_CODE(CHELSIO_T5, pl_rev);
4568+
break;
4569+
case CHELSIO_T6:
4570+
chip |= CHELSIO_CHIP_CODE(CHELSIO_T6, pl_rev);
4571+
break;
4572+
default:
4573+
dev_err(&pdev->dev, "Device %d is not supported\n",
4574+
device_id);
4575+
return -EINVAL;
4576+
}
4577+
return chip;
4578+
}
4579+
45544580
static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
45554581
{
45564582
int func, i, err, s_qpp, qpp, num_seg;
45574583
struct port_info *pi;
45584584
bool highdma = false;
45594585
struct adapter *adapter = NULL;
45604586
void __iomem *regs;
4587+
u32 whoami, pl_rev;
4588+
enum chip_type chip;
45614589

45624590
printk_once(KERN_INFO "%s - version %s\n", DRV_DESC, DRV_VERSION);
45634591

@@ -4586,7 +4614,11 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
45864614
goto out_unmap_bar0;
45874615

45884616
/* We control everything through one PF */
4589-
func = SOURCEPF_G(readl(regs + PL_WHOAMI_A));
4617+
whoami = readl(regs + PL_WHOAMI_A);
4618+
pl_rev = REV_G(readl(regs + PL_REV_A));
4619+
chip = get_chip_type(pdev, pl_rev);
4620+
func = CHELSIO_CHIP_VERSION(chip) <= CHELSIO_T5 ?
4621+
SOURCEPF_G(whoami) : T6_SOURCEPF_G(whoami);
45904622
if (func != ent->driver_data) {
45914623
iounmap(regs);
45924624
pci_disable_device(pdev);

0 commit comments

Comments
 (0)