From 923fdb37c54598391b54355de0fcd6ac35e5a221 Mon Sep 17 00:00:00 2001 From: Saman Sahebi Date: Wed, 19 Jul 2023 21:58:37 -0400 Subject: added offsets for lce mapping in nvdebug.h and code to read lce for each pce in nvdebug_entry.c --- nvdebug.h | 2 ++ nvdebug_entry.c | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/nvdebug.h b/nvdebug.h index b79ede1..6aa0f11 100644 --- a/nvdebug.h +++ b/nvdebug.h @@ -687,6 +687,8 @@ typedef union { Also see dev_ce.ref.txt of NVIDIA's open-gpu-doc for info. */ #define NV_PTOP_SCAL_NUM_CES 0x00022444 +//defined LCE->PCE mapping offset from nvgpu (same as ce_pce2lce_config_r(i) in nvgpu) +#define NV_LCE_FOR_PCE(i)(0x00104040+(i)*4) /* Physical Copy Engine (PCE) information On Pascal GPUs or newer, this register complements the above information by diff --git a/nvdebug_entry.c b/nvdebug_entry.c index 0abe658..84e8a6a 100644 --- a/nvdebug_entry.c +++ b/nvdebug_entry.c @@ -203,7 +203,7 @@ int create_tpc_mask_files(int device_id, struct proc_dir_entry *dir) { int __init nvdebug_init(void) { struct proc_dir_entry *dir, *preempt_entry, *disable_channel_entry, *enable_channel_entry, *switch_to_tsg_entry, *device_info_entry, - *num_gpcs_entry; + *num_gpcs_entry, *lce_for_pce_entry; int rl_create_err, tpc_masks_create_err; // Check that an NVIDIA GPU is present and initialize g_nvdebug_state int res = probe_and_cache_device(); @@ -261,8 +261,23 @@ int __init nvdebug_init(void) { (void*)NV_FUSE_GPC); // In both nouveau and nvgpu, the PCE_MAP register is only available on Volta+ if (g_nvdebug_state[res].chip_id >= NV_CHIP_ID_VOLTA) { + + //create a pce mask for iteration + u32 ce_pce_map = nvdebug_readl(&g_nvdebug_state[device_id], NV_CE_PCE_MAP); + u32 num_pce = U32(hweight32(ce_pce_map)); + u32 disabled_pce_mask = ~ce_pce_map; + char file_name[20]; + for (int pce_id = 0; pce_id < num_pce; pce_id++){ + //if pce is disabled, do nothing + if ((1 << pce_id) & disabled_pce_mask) + continue; + snprintf(file_name, 20, "lce_for_pce%d",pce_id); + lce_for_pce_entry = proc_create_data( + file_name, 0444, dir, compat_ops(&nvdebug_read_reg32_file_ops), + (void*)NV_LCE_FOR_PCE(pce_id)); + } + // TODO: Redo to num_pces - // Create file `/proc/gpu#/pce_map`, world readable num_gpcs_entry = proc_create_data( "pce_map", 0444, dir, compat_ops(&nvdebug_read_reg32_file_ops), (void*)NV_CE_PCE_MAP); -- cgit v1.2.2