Lines Matching +full:self +full:- +full:powered

1 // SPDX-License-Identifier: GPL-2.0
26 #include "coresight-priv.h"
66 * 0b0000 - Sample offset applies based on the instruction state, we
68 * 0b0001 - No offset applies.
69 * 0b0010 - No offset applies, but do not use in AArch32 mode
114 writel_relaxed(0x0, drvdata->base + EDOSLAR); in debug_os_unlock()
126 * - CPU power domain is powered off;
127 * - The OS Double Lock is locked;
133 /* CPU is powered off */ in debug_access_permitted()
134 if (!(drvdata->edprsr & EDPRSR_PU)) in debug_access_permitted()
138 if (drvdata->edprsr & EDPRSR_DLK) in debug_access_permitted()
156 edprcr = readl_relaxed(drvdata->base + EDPRCR); in debug_force_cpu_powered_up()
158 writel_relaxed(edprcr, drvdata->base + EDPRCR); in debug_force_cpu_powered_up()
160 /* Wait for CPU to be powered up (timeout~=32ms) */ in debug_force_cpu_powered_up()
161 if (readx_poll_timeout_atomic(readl_relaxed, drvdata->base + EDPRSR, in debug_force_cpu_powered_up()
162 drvdata->edprsr, (drvdata->edprsr & EDPRSR_PU), in debug_force_cpu_powered_up()
165 * Unfortunately the CPU cannot be powered up, so return in debug_force_cpu_powered_up()
170 dev_err(drvdata->dev, "%s: power up request for CPU%d failed\n", in debug_force_cpu_powered_up()
171 __func__, drvdata->cpu); in debug_force_cpu_powered_up()
176 * At this point the CPU is powered up, so set the no powerdown in debug_force_cpu_powered_up()
179 edprcr = readl_relaxed(drvdata->base + EDPRCR); in debug_force_cpu_powered_up()
181 writel_relaxed(edprcr, drvdata->base + EDPRCR); in debug_force_cpu_powered_up()
183 drvdata->edprsr = readl_relaxed(drvdata->base + EDPRSR); in debug_force_cpu_powered_up()
186 if (unlikely(!(drvdata->edprsr & EDPRSR_PU))) in debug_force_cpu_powered_up()
194 CS_UNLOCK(drvdata->base); in debug_read_regs()
200 save_edprcr = readl_relaxed(drvdata->base + EDPRCR); in debug_read_regs()
211 drvdata->edpcsr = readl_relaxed(drvdata->base + EDPCSR); in debug_read_regs()
215 * element (PE) is in debug state, or sample-based in debug_read_regs()
220 if (drvdata->edpcsr == EDPCSR_PROHIBITED) in debug_read_regs()
224 * A read of the EDPCSR normally has the side-effect of in debug_read_regs()
229 drvdata->edpcsr_hi = readl_relaxed(drvdata->base + EDPCSR_HI); in debug_read_regs()
231 if (drvdata->edcidsr_present) in debug_read_regs()
232 drvdata->edcidsr = readl_relaxed(drvdata->base + EDCIDSR); in debug_read_regs()
234 if (drvdata->edvidsr_present) in debug_read_regs()
235 drvdata->edvidsr = readl_relaxed(drvdata->base + EDVIDSR); in debug_read_regs()
239 writel_relaxed(save_edprcr, drvdata->base + EDPRCR); in debug_read_regs()
241 CS_LOCK(drvdata->base); in debug_read_regs()
247 return (unsigned long)drvdata->edpcsr_hi << 32 | in debug_adjust_pc()
248 (unsigned long)drvdata->edpcsr; in debug_adjust_pc()
256 pc = (unsigned long)drvdata->edpcsr; in debug_adjust_pc()
258 if (drvdata->pc_has_offset) { in debug_adjust_pc()
265 pc = (pc & EDPCSR_THUMB_INST_MASK) - thumb_inst_offset; in debug_adjust_pc()
276 dev_emerg(drvdata->dev, in debug_adjust_pc()
279 pc = (pc & EDPCSR_ARM_INST_MASK) - arm_inst_offset; in debug_adjust_pc()
287 struct device *dev = drvdata->dev; in debug_dump_regs()
291 drvdata->edprsr, in debug_dump_regs()
292 drvdata->edprsr & EDPRSR_PU ? "On" : "Off", in debug_dump_regs()
293 drvdata->edprsr & EDPRSR_DLK ? "Lock" : "Unlock"); in debug_dump_regs()
300 if (drvdata->edpcsr == EDPCSR_PROHIBITED) { in debug_dump_regs()
308 if (drvdata->edcidsr_present) in debug_dump_regs()
309 dev_emerg(dev, " EDCIDSR: %08x\n", drvdata->edcidsr); in debug_dump_regs()
311 if (drvdata->edvidsr_present) in debug_dump_regs()
313 drvdata->edvidsr, in debug_dump_regs()
314 drvdata->edvidsr & EDVIDSR_NS ? in debug_dump_regs()
315 "Non-secure" : "Secure", in debug_dump_regs()
316 drvdata->edvidsr & EDVIDSR_E3 ? "EL3" : in debug_dump_regs()
317 (drvdata->edvidsr & EDVIDSR_E2 ? in debug_dump_regs()
319 drvdata->edvidsr & EDVIDSR_HV ? 64 : 32, in debug_dump_regs()
320 drvdata->edvidsr & (u32)EDVIDSR_VMID); in debug_dump_regs()
329 CS_UNLOCK(drvdata->base); in debug_init_arch_data()
332 eddevid = readl_relaxed(drvdata->base + EDDEVID); in debug_init_arch_data()
333 eddevid1 = readl_relaxed(drvdata->base + EDDEVID1); in debug_init_arch_data()
335 CS_LOCK(drvdata->base); in debug_init_arch_data()
341 drvdata->edpcsr_present = false; in debug_init_arch_data()
342 drvdata->edcidsr_present = false; in debug_init_arch_data()
343 drvdata->edvidsr_present = false; in debug_init_arch_data()
344 drvdata->pc_has_offset = false; in debug_init_arch_data()
348 drvdata->edvidsr_present = true; in debug_init_arch_data()
351 drvdata->edcidsr_present = true; in debug_init_arch_data()
361 drvdata->edpcsr_present = in debug_init_arch_data()
365 drvdata->pc_has_offset = in debug_init_arch_data()
376 static int debug_notifier_call(struct notifier_block *self, in debug_notifier_call() argument
395 dev_emerg(drvdata->dev, "CPU[%d]:\n", drvdata->cpu); in debug_notifier_call()
418 * been powered on and use it to handle failure case. in debug_enable_func()
427 ret = pm_runtime_get_sync(drvdata->dev); in debug_enable_func()
443 pm_runtime_put_noidle(drvdata->dev); in debug_enable_func()
464 ret = pm_runtime_put(drvdata->dev); in debug_disable_func()
561 struct device *dev = &adev->dev; in debug_probe()
563 struct resource *res = &adev->res; in debug_probe()
568 return -ENOMEM; in debug_probe()
570 drvdata->cpu = coresight_get_cpu(dev); in debug_probe()
571 if (drvdata->cpu < 0) in debug_probe()
572 return drvdata->cpu; in debug_probe()
574 if (per_cpu(debug_drvdata, drvdata->cpu)) { in debug_probe()
576 drvdata->cpu); in debug_probe()
577 return -EBUSY; in debug_probe()
580 drvdata->dev = &adev->dev; in debug_probe()
588 drvdata->base = base; in debug_probe()
591 per_cpu(debug_drvdata, drvdata->cpu) = drvdata; in debug_probe()
592 ret = smp_call_function_single(drvdata->cpu, debug_init_arch_data, in debug_probe()
597 dev_err(dev, "CPU%d debug arch init failed\n", drvdata->cpu); in debug_probe()
601 if (!drvdata->edpcsr_present) { in debug_probe()
602 dev_err(dev, "CPU%d sample-based profiling isn't implemented\n", in debug_probe()
603 drvdata->cpu); in debug_probe()
604 ret = -ENXIO; in debug_probe()
620 dev_info(dev, "Coresight debug-CPU%d initialized\n", drvdata->cpu); in debug_probe()
624 debug_count--; in debug_probe()
626 per_cpu(debug_drvdata, drvdata->cpu) = NULL; in debug_probe()
632 struct device *dev = &adev->dev; in debug_remove()
635 per_cpu(debug_drvdata, drvdata->cpu) = NULL; in debug_remove()
643 if (!--debug_count) in debug_remove()
659 CS_AMBA_ID(0x000bbd03), /* Cortex-A53 */
660 CS_AMBA_ID(0x000bbd07), /* Cortex-A57 */
661 CS_AMBA_ID(0x000bbd08), /* Cortex-A72 */
662 CS_AMBA_ID(0x000bbd09), /* Cortex-A73 */
672 .name = "coresight-cpu-debug",