Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/xe: Runtime PM wake on every debugfs call

Let's ensure our PCI device is awaken on every debugfs call.
Let's increase the runtime_pm protection and start moving
that to the outer bounds.

Also let's remove the mem_access_{get,put} from where they are
not needed anymore.

Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240222163937.138342-7-rodrigo.vivi@intel.com

+66 -16
+6 -4
drivers/gpu/drm/xe/xe_debugfs.c
··· 12 12 #include "xe_bo.h" 13 13 #include "xe_device.h" 14 14 #include "xe_gt_debugfs.h" 15 + #include "xe_pm.h" 15 16 #include "xe_step.h" 16 17 17 18 #ifdef CONFIG_DRM_XE_DEBUG ··· 37 36 struct drm_printer p = drm_seq_file_printer(m); 38 37 struct xe_gt *gt; 39 38 u8 id; 39 + 40 + xe_pm_runtime_get(xe); 40 41 41 42 drm_printf(&p, "graphics_verx100 %d\n", xe->info.graphics_verx100); 42 43 drm_printf(&p, "media_verx100 %d\n", xe->info.media_verx100); ··· 66 63 gt->info.engine_mask); 67 64 } 68 65 66 + xe_pm_runtime_put(xe); 69 67 return 0; 70 68 } 71 69 ··· 80 76 struct xe_gt *gt; 81 77 u8 id; 82 78 83 - xe_device_mem_access_get(xe); 84 - 79 + xe_pm_runtime_get(xe); 85 80 for_each_gt(gt, xe, id) 86 81 XE_WARN_ON(xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL)); 87 82 ··· 95 92 96 93 for_each_gt(gt, xe, id) 97 94 XE_WARN_ON(xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL)); 98 - 99 - xe_device_mem_access_put(xe); 95 + xe_pm_runtime_put(xe); 100 96 101 97 return 0; 102 98 }
+48 -5
drivers/gpu/drm/xe/xe_gt_debugfs.c
··· 18 18 #include "xe_lrc.h" 19 19 #include "xe_macros.h" 20 20 #include "xe_pat.h" 21 + #include "xe_pm.h" 21 22 #include "xe_reg_sr.h" 22 23 #include "xe_reg_whitelist.h" 23 24 #include "xe_uc_debugfs.h" ··· 38 37 enum xe_hw_engine_id id; 39 38 int err; 40 39 41 - xe_device_mem_access_get(xe); 40 + xe_pm_runtime_get(xe); 42 41 err = xe_force_wake_get(gt_to_fw(gt), XE_FORCEWAKE_ALL); 43 42 if (err) { 44 - xe_device_mem_access_put(xe); 43 + xe_pm_runtime_put(xe); 45 44 return err; 46 45 } 47 46 ··· 49 48 xe_hw_engine_print(hwe, &p); 50 49 51 50 err = xe_force_wake_put(gt_to_fw(gt), XE_FORCEWAKE_ALL); 52 - xe_device_mem_access_put(xe); 51 + xe_pm_runtime_put(xe); 53 52 if (err) 54 53 return err; 55 54 ··· 60 59 { 61 60 struct xe_gt *gt = node_to_gt(m->private); 62 61 62 + xe_pm_runtime_get(gt_to_xe(gt)); 63 63 xe_gt_reset_async(gt); 64 + xe_pm_runtime_put(gt_to_xe(gt)); 64 65 65 66 return 0; 66 67 } 67 68 68 69 static int sa_info(struct seq_file *m, void *data) 69 70 { 70 - struct xe_tile *tile = gt_to_tile(node_to_gt(m->private)); 71 + struct xe_gt *gt = node_to_gt(m->private); 72 + struct xe_tile *tile = gt_to_tile(gt); 71 73 struct drm_printer p = drm_seq_file_printer(m); 72 74 75 + xe_pm_runtime_get(gt_to_xe(gt)); 73 76 drm_suballoc_dump_debug_info(&tile->mem.kernel_bb_pool->base, &p, 74 77 tile->mem.kernel_bb_pool->gpu_addr); 78 + xe_pm_runtime_put(gt_to_xe(gt)); 75 79 76 80 return 0; 77 81 } ··· 86 80 struct xe_gt *gt = node_to_gt(m->private); 87 81 struct drm_printer p = drm_seq_file_printer(m); 88 82 83 + xe_pm_runtime_get(gt_to_xe(gt)); 89 84 xe_gt_topology_dump(gt, &p); 85 + xe_pm_runtime_put(gt_to_xe(gt)); 90 86 91 87 return 0; 92 88 } ··· 98 90 struct xe_gt *gt = node_to_gt(m->private); 99 91 struct drm_printer p = drm_seq_file_printer(m); 100 92 93 + xe_pm_runtime_get(gt_to_xe(gt)); 101 94 xe_gt_mcr_steering_dump(gt, &p); 95 + xe_pm_runtime_put(gt_to_xe(gt)); 102 96 103 97 return 0; 104 98 } ··· 109 99 { 110 100 struct xe_gt *gt = node_to_gt(m->private); 111 101 struct drm_printer p = drm_seq_file_printer(m); 102 + int ret; 112 103 113 - return xe_ggtt_dump(gt_to_tile(gt)->mem.ggtt, &p); 104 + xe_pm_runtime_get(gt_to_xe(gt)); 105 + ret = xe_ggtt_dump(gt_to_tile(gt)->mem.ggtt, &p); 106 + xe_pm_runtime_put(gt_to_xe(gt)); 107 + 108 + return ret; 114 109 } 115 110 116 111 static int register_save_restore(struct seq_file *m, void *data) ··· 124 109 struct drm_printer p = drm_seq_file_printer(m); 125 110 struct xe_hw_engine *hwe; 126 111 enum xe_hw_engine_id id; 112 + 113 + xe_pm_runtime_get(gt_to_xe(gt)); 127 114 128 115 xe_reg_sr_dump(&gt->reg_sr, &p); 129 116 drm_printf(&p, "\n"); ··· 144 127 for_each_hw_engine(hwe, gt, id) 145 128 xe_reg_whitelist_dump(&hwe->reg_whitelist, &p); 146 129 130 + xe_pm_runtime_put(gt_to_xe(gt)); 131 + 147 132 return 0; 148 133 } 149 134 ··· 154 135 struct xe_gt *gt = node_to_gt(m->private); 155 136 struct drm_printer p = drm_seq_file_printer(m); 156 137 138 + xe_pm_runtime_get(gt_to_xe(gt)); 157 139 xe_wa_dump(gt, &p); 140 + xe_pm_runtime_put(gt_to_xe(gt)); 158 141 159 142 return 0; 160 143 } ··· 166 145 struct xe_gt *gt = node_to_gt(m->private); 167 146 struct drm_printer p = drm_seq_file_printer(m); 168 147 148 + xe_pm_runtime_get(gt_to_xe(gt)); 169 149 xe_pat_dump(gt, &p); 150 + xe_pm_runtime_put(gt_to_xe(gt)); 170 151 171 152 return 0; 172 153 } 173 154 174 155 static int rcs_default_lrc(struct seq_file *m, void *data) 175 156 { 157 + struct xe_gt *gt = node_to_gt(m->private); 176 158 struct drm_printer p = drm_seq_file_printer(m); 177 159 160 + xe_pm_runtime_get(gt_to_xe(gt)); 178 161 xe_lrc_dump_default(&p, node_to_gt(m->private), XE_ENGINE_CLASS_RENDER); 162 + xe_pm_runtime_put(gt_to_xe(gt)); 163 + 179 164 return 0; 180 165 } 181 166 182 167 static int ccs_default_lrc(struct seq_file *m, void *data) 183 168 { 169 + struct xe_gt *gt = node_to_gt(m->private); 184 170 struct drm_printer p = drm_seq_file_printer(m); 185 171 172 + xe_pm_runtime_get(gt_to_xe(gt)); 186 173 xe_lrc_dump_default(&p, node_to_gt(m->private), XE_ENGINE_CLASS_COMPUTE); 174 + xe_pm_runtime_put(gt_to_xe(gt)); 175 + 187 176 return 0; 188 177 } 189 178 190 179 static int bcs_default_lrc(struct seq_file *m, void *data) 191 180 { 181 + struct xe_gt *gt = node_to_gt(m->private); 192 182 struct drm_printer p = drm_seq_file_printer(m); 193 183 184 + xe_pm_runtime_get(gt_to_xe(gt)); 194 185 xe_lrc_dump_default(&p, node_to_gt(m->private), XE_ENGINE_CLASS_COPY); 186 + xe_pm_runtime_put(gt_to_xe(gt)); 187 + 195 188 return 0; 196 189 } 197 190 198 191 static int vcs_default_lrc(struct seq_file *m, void *data) 199 192 { 193 + struct xe_gt *gt = node_to_gt(m->private); 200 194 struct drm_printer p = drm_seq_file_printer(m); 201 195 196 + xe_pm_runtime_get(gt_to_xe(gt)); 202 197 xe_lrc_dump_default(&p, node_to_gt(m->private), XE_ENGINE_CLASS_VIDEO_DECODE); 198 + xe_pm_runtime_put(gt_to_xe(gt)); 199 + 203 200 return 0; 204 201 } 205 202 206 203 static int vecs_default_lrc(struct seq_file *m, void *data) 207 204 { 205 + struct xe_gt *gt = node_to_gt(m->private); 208 206 struct drm_printer p = drm_seq_file_printer(m); 209 207 208 + xe_pm_runtime_get(gt_to_xe(gt)); 210 209 xe_lrc_dump_default(&p, node_to_gt(m->private), XE_ENGINE_CLASS_VIDEO_ENHANCE); 210 + xe_pm_runtime_put(gt_to_xe(gt)); 211 + 211 212 return 0; 212 213 } 213 214
+5 -4
drivers/gpu/drm/xe/xe_guc_debugfs.c
··· 14 14 #include "xe_guc_ct.h" 15 15 #include "xe_guc_log.h" 16 16 #include "xe_macros.h" 17 + #include "xe_pm.h" 17 18 18 19 static struct xe_guc *node_to_guc(struct drm_info_node *node) 19 20 { ··· 27 26 struct xe_device *xe = guc_to_xe(guc); 28 27 struct drm_printer p = drm_seq_file_printer(m); 29 28 30 - xe_device_mem_access_get(xe); 29 + xe_pm_runtime_get(xe); 31 30 xe_guc_print_info(guc, &p); 32 - xe_device_mem_access_put(xe); 31 + xe_pm_runtime_put(xe); 33 32 34 33 return 0; 35 34 } ··· 40 39 struct xe_device *xe = guc_to_xe(guc); 41 40 struct drm_printer p = drm_seq_file_printer(m); 42 41 43 - xe_device_mem_access_get(xe); 42 + xe_pm_runtime_get(xe); 44 43 xe_guc_log_print(&guc->log, &p); 45 - xe_device_mem_access_put(xe); 44 + xe_pm_runtime_put(xe); 46 45 47 46 return 0; 48 47 }
+3 -2
drivers/gpu/drm/xe/xe_huc_debugfs.c
··· 12 12 #include "xe_gt.h" 13 13 #include "xe_huc.h" 14 14 #include "xe_macros.h" 15 + #include "xe_pm.h" 15 16 16 17 static struct xe_gt * 17 18 huc_to_gt(struct xe_huc *huc) ··· 37 36 struct xe_device *xe = huc_to_xe(huc); 38 37 struct drm_printer p = drm_seq_file_printer(m); 39 38 40 - xe_device_mem_access_get(xe); 39 + xe_pm_runtime_get(xe); 41 40 xe_huc_print_info(huc, &p); 42 - xe_device_mem_access_put(xe); 41 + xe_pm_runtime_put(xe); 43 42 44 43 return 0; 45 44 }
+4 -1
drivers/gpu/drm/xe/xe_ttm_sys_mgr.c
··· 73 73 static void xe_ttm_sys_mgr_debug(struct ttm_resource_manager *man, 74 74 struct drm_printer *printer) 75 75 { 76 - 76 + /* 77 + * This function is called by debugfs entry and would require 78 + * pm_runtime_{get,put} wrappers around any operation. 79 + */ 77 80 } 78 81 79 82 static const struct ttm_resource_manager_func xe_ttm_sys_mgr_func = {