@@ -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 */
22802564void 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.
0 commit comments