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

Configure Feed

Select the types of activity you want to include in your feed.

drm/xe: Include additional info on failed force-wake operation

For debug purposes it might be useful to look at the values of the
force-wake ack registers in case wake/sleep operations failures.

Move xe_gt_notice() from the caller to the helper function, where
we have the latest value of force-wake ack register available.

Signed-off-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240611163537.1944-4-michal.wajdeczko@intel.com

+28 -20
+28 -20
drivers/gpu/drm/xe/xe_force_wake.c
··· 97 97 static int domain_wake_wait(struct xe_gt *gt, 98 98 struct xe_force_wake_domain *domain) 99 99 { 100 - return xe_mmio_wait32(gt, domain->reg_ack, domain->val, domain->val, 101 - XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 102 - NULL, true); 100 + u32 value; 101 + int ret; 102 + 103 + ret = xe_mmio_wait32(gt, domain->reg_ack, domain->val, domain->val, 104 + XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 105 + &value, true); 106 + if (ret) 107 + xe_gt_notice(gt, "Force wake domain %d failed to ack wake (%pe) reg[%#x] = %#x\n", 108 + domain->id, ERR_PTR(ret), domain->reg_ack.addr, value); 109 + 110 + return ret; 103 111 } 104 112 105 113 static void domain_sleep(struct xe_gt *gt, struct xe_force_wake_domain *domain) ··· 118 110 static int domain_sleep_wait(struct xe_gt *gt, 119 111 struct xe_force_wake_domain *domain) 120 112 { 121 - return xe_mmio_wait32(gt, domain->reg_ack, domain->val, 0, 122 - XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 123 - NULL, true); 113 + u32 value; 114 + int ret; 115 + 116 + ret = xe_mmio_wait32(gt, domain->reg_ack, domain->val, 0, 117 + XE_FORCE_WAKE_ACK_TIMEOUT_MS * USEC_PER_MSEC, 118 + &value, true); 119 + if (ret) 120 + xe_gt_notice(gt, "Force wake domain %d failed to ack sleep (%pe) reg[%#x] = %#x\n", 121 + domain->id, ERR_PTR(ret), domain->reg_ack.addr, value); 122 + 123 + return ret; 124 124 } 125 125 126 126 #define for_each_fw_domain_masked(domain__, mask__, fw__, tmp__) \ ··· 144 128 struct xe_force_wake_domain *domain; 145 129 enum xe_force_wake_domains tmp, woken = 0; 146 130 unsigned long flags; 147 - int ret, ret2 = 0; 131 + int ret = 0; 148 132 149 133 spin_lock_irqsave(&fw->lock, flags); 150 134 for_each_fw_domain_masked(domain, domains, fw, tmp) { ··· 154 138 } 155 139 } 156 140 for_each_fw_domain_masked(domain, woken, fw, tmp) { 157 - ret = domain_wake_wait(gt, domain); 158 - ret2 |= ret; 159 - if (ret) 160 - xe_gt_notice(gt, "Force wake domain (%d) failed to ack wake, ret=%d\n", 161 - domain->id, ret); 141 + ret |= domain_wake_wait(gt, domain); 162 142 } 163 143 fw->awake_domains |= woken; 164 144 spin_unlock_irqrestore(&fw->lock, flags); 165 145 166 - return ret2; 146 + return ret; 167 147 } 168 148 169 149 int xe_force_wake_put(struct xe_force_wake *fw, ··· 169 157 struct xe_force_wake_domain *domain; 170 158 enum xe_force_wake_domains tmp, sleep = 0; 171 159 unsigned long flags; 172 - int ret, ret2 = 0; 160 + int ret = 0; 173 161 174 162 spin_lock_irqsave(&fw->lock, flags); 175 163 for_each_fw_domain_masked(domain, domains, fw, tmp) { ··· 179 167 } 180 168 } 181 169 for_each_fw_domain_masked(domain, sleep, fw, tmp) { 182 - ret = domain_sleep_wait(gt, domain); 183 - ret2 |= ret; 184 - if (ret) 185 - xe_gt_notice(gt, "Force wake domain (%d) failed to ack sleep, ret=%d\n", 186 - domain->id, ret); 170 + ret |= domain_sleep_wait(gt, domain); 187 171 } 188 172 fw->awake_domains &= ~sleep; 189 173 spin_unlock_irqrestore(&fw->lock, flags); 190 174 191 - return ret2; 175 + return ret; 192 176 }