Lines Matching refs:drvdata
54 static void etm_os_unlock(struct etm_drvdata *drvdata) in etm_os_unlock() argument
57 etm_writel(drvdata, 0x0, ETMOSLAR); in etm_os_unlock()
58 drvdata->os_unlock = true; in etm_os_unlock()
62 static void etm_set_pwrdwn(struct etm_drvdata *drvdata) in etm_set_pwrdwn() argument
69 etmcr = etm_readl(drvdata, ETMCR); in etm_set_pwrdwn()
71 etm_writel(drvdata, etmcr, ETMCR); in etm_set_pwrdwn()
74 static void etm_clr_pwrdwn(struct etm_drvdata *drvdata) in etm_clr_pwrdwn() argument
78 etmcr = etm_readl(drvdata, ETMCR); in etm_clr_pwrdwn()
80 etm_writel(drvdata, etmcr, ETMCR); in etm_clr_pwrdwn()
86 static void etm_set_pwrup(struct etm_drvdata *drvdata) in etm_set_pwrup() argument
90 etmpdcr = readl_relaxed(drvdata->base + ETMPDCR); in etm_set_pwrup()
92 writel_relaxed(etmpdcr, drvdata->base + ETMPDCR); in etm_set_pwrup()
98 static void etm_clr_pwrup(struct etm_drvdata *drvdata) in etm_clr_pwrup() argument
105 etmpdcr = readl_relaxed(drvdata->base + ETMPDCR); in etm_clr_pwrup()
107 writel_relaxed(etmpdcr, drvdata->base + ETMPDCR); in etm_clr_pwrup()
124 static int coresight_timeout_etm(struct etm_drvdata *drvdata, u32 offset, in coresight_timeout_etm() argument
131 val = etm_readl(drvdata, offset); in coresight_timeout_etm()
155 static void etm_set_prog(struct etm_drvdata *drvdata) in etm_set_prog() argument
159 etmcr = etm_readl(drvdata, ETMCR); in etm_set_prog()
161 etm_writel(drvdata, etmcr, ETMCR); in etm_set_prog()
167 if (coresight_timeout_etm(drvdata, ETMSR, ETMSR_PROG_BIT, 1)) { in etm_set_prog()
168 dev_err(drvdata->dev, in etm_set_prog()
174 static void etm_clr_prog(struct etm_drvdata *drvdata) in etm_clr_prog() argument
178 etmcr = etm_readl(drvdata, ETMCR); in etm_clr_prog()
180 etm_writel(drvdata, etmcr, ETMCR); in etm_clr_prog()
186 if (coresight_timeout_etm(drvdata, ETMSR, ETMSR_PROG_BIT, 0)) { in etm_clr_prog()
187 dev_err(drvdata->dev, in etm_clr_prog()
308 static int etm_parse_event_config(struct etm_drvdata *drvdata, in etm_parse_event_config() argument
311 struct etm_config *config = &drvdata->config; in etm_parse_event_config()
352 !(drvdata->etmccer & ETMCCER_RETSTACK)) in etm_parse_event_config()
362 struct etm_drvdata *drvdata = info; in etm_enable_hw() local
363 struct etm_config *config = &drvdata->config; in etm_enable_hw()
365 CS_UNLOCK(drvdata->base); in etm_enable_hw()
368 etm_clr_pwrdwn(drvdata); in etm_enable_hw()
370 etm_set_pwrup(drvdata); in etm_enable_hw()
372 etm_os_unlock(drvdata); in etm_enable_hw()
374 etm_set_prog(drvdata); in etm_enable_hw()
376 etmcr = etm_readl(drvdata, ETMCR); in etm_enable_hw()
379 etmcr |= drvdata->port_size; in etm_enable_hw()
381 etm_writel(drvdata, config->ctrl | etmcr, ETMCR); in etm_enable_hw()
382 etm_writel(drvdata, config->trigger_event, ETMTRIGGER); in etm_enable_hw()
383 etm_writel(drvdata, config->startstop_ctrl, ETMTSSCR); in etm_enable_hw()
384 etm_writel(drvdata, config->enable_event, ETMTEEVR); in etm_enable_hw()
385 etm_writel(drvdata, config->enable_ctrl1, ETMTECR1); in etm_enable_hw()
386 etm_writel(drvdata, config->fifofull_level, ETMFFLR); in etm_enable_hw()
387 for (i = 0; i < drvdata->nr_addr_cmp; i++) { in etm_enable_hw()
388 etm_writel(drvdata, config->addr_val[i], ETMACVRn(i)); in etm_enable_hw()
389 etm_writel(drvdata, config->addr_acctype[i], ETMACTRn(i)); in etm_enable_hw()
391 for (i = 0; i < drvdata->nr_cntr; i++) { in etm_enable_hw()
392 etm_writel(drvdata, config->cntr_rld_val[i], ETMCNTRLDVRn(i)); in etm_enable_hw()
393 etm_writel(drvdata, config->cntr_event[i], ETMCNTENRn(i)); in etm_enable_hw()
394 etm_writel(drvdata, config->cntr_rld_event[i], in etm_enable_hw()
396 etm_writel(drvdata, config->cntr_val[i], ETMCNTVRn(i)); in etm_enable_hw()
398 etm_writel(drvdata, config->seq_12_event, ETMSQ12EVR); in etm_enable_hw()
399 etm_writel(drvdata, config->seq_21_event, ETMSQ21EVR); in etm_enable_hw()
400 etm_writel(drvdata, config->seq_23_event, ETMSQ23EVR); in etm_enable_hw()
401 etm_writel(drvdata, config->seq_31_event, ETMSQ31EVR); in etm_enable_hw()
402 etm_writel(drvdata, config->seq_32_event, ETMSQ32EVR); in etm_enable_hw()
403 etm_writel(drvdata, config->seq_13_event, ETMSQ13EVR); in etm_enable_hw()
404 etm_writel(drvdata, config->seq_curr_state, ETMSQR); in etm_enable_hw()
405 for (i = 0; i < drvdata->nr_ext_out; i++) in etm_enable_hw()
406 etm_writel(drvdata, ETM_DEFAULT_EVENT_VAL, ETMEXTOUTEVRn(i)); in etm_enable_hw()
407 for (i = 0; i < drvdata->nr_ctxid_cmp; i++) in etm_enable_hw()
408 etm_writel(drvdata, config->ctxid_pid[i], ETMCIDCVRn(i)); in etm_enable_hw()
409 etm_writel(drvdata, config->ctxid_mask, ETMCIDCMR); in etm_enable_hw()
410 etm_writel(drvdata, config->sync_freq, ETMSYNCFR); in etm_enable_hw()
412 etm_writel(drvdata, 0x0, ETMEXTINSELR); in etm_enable_hw()
413 etm_writel(drvdata, config->timestamp_event, ETMTSEVR); in etm_enable_hw()
415 etm_writel(drvdata, 0x0, ETMAUXCR); in etm_enable_hw()
416 etm_writel(drvdata, drvdata->traceid, ETMTRACEIDR); in etm_enable_hw()
418 etm_writel(drvdata, 0x0, ETMVMIDCVR); in etm_enable_hw()
420 etm_clr_prog(drvdata); in etm_enable_hw()
421 CS_LOCK(drvdata->base); in etm_enable_hw()
423 dev_dbg(drvdata->dev, "cpu: %d enable smp call done\n", drvdata->cpu); in etm_enable_hw()
428 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_cpu_id() local
430 return drvdata->cpu; in etm_cpu_id()
433 int etm_get_trace_id(struct etm_drvdata *drvdata) in etm_get_trace_id() argument
438 if (!drvdata) in etm_get_trace_id()
441 if (!local_read(&drvdata->mode)) in etm_get_trace_id()
442 return drvdata->traceid; in etm_get_trace_id()
444 pm_runtime_get_sync(drvdata->dev); in etm_get_trace_id()
446 spin_lock_irqsave(&drvdata->spinlock, flags); in etm_get_trace_id()
448 CS_UNLOCK(drvdata->base); in etm_get_trace_id()
449 trace_id = (etm_readl(drvdata, ETMTRACEIDR) & ETM_TRACEID_MASK); in etm_get_trace_id()
450 CS_LOCK(drvdata->base); in etm_get_trace_id()
452 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etm_get_trace_id()
453 pm_runtime_put(drvdata->dev); in etm_get_trace_id()
462 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_trace_id() local
464 return etm_get_trace_id(drvdata); in etm_trace_id()
470 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_enable_perf() local
472 if (WARN_ON_ONCE(drvdata->cpu != smp_processor_id())) in etm_enable_perf()
476 etm_parse_event_config(drvdata, event); in etm_enable_perf()
478 etm_enable_hw(drvdata); in etm_enable_perf()
485 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_enable_sysfs() local
488 spin_lock(&drvdata->spinlock); in etm_enable_sysfs()
494 if (cpu_online(drvdata->cpu)) { in etm_enable_sysfs()
495 ret = smp_call_function_single(drvdata->cpu, in etm_enable_sysfs()
496 etm_enable_hw, drvdata, 1); in etm_enable_sysfs()
501 drvdata->sticky_enable = true; in etm_enable_sysfs()
502 spin_unlock(&drvdata->spinlock); in etm_enable_sysfs()
504 dev_info(drvdata->dev, "ETM tracing enabled\n"); in etm_enable_sysfs()
508 spin_unlock(&drvdata->spinlock); in etm_enable_sysfs()
517 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_enable() local
519 val = local_cmpxchg(&drvdata->mode, CS_MODE_DISABLED, mode); in etm_enable()
538 local_set(&drvdata->mode, CS_MODE_DISABLED); in etm_enable()
546 struct etm_drvdata *drvdata = info; in etm_disable_hw() local
547 struct etm_config *config = &drvdata->config; in etm_disable_hw()
549 CS_UNLOCK(drvdata->base); in etm_disable_hw()
550 etm_set_prog(drvdata); in etm_disable_hw()
553 config->seq_curr_state = (etm_readl(drvdata, ETMSQR) & ETM_SQR_MASK); in etm_disable_hw()
555 for (i = 0; i < drvdata->nr_cntr; i++) in etm_disable_hw()
556 config->cntr_val[i] = etm_readl(drvdata, ETMCNTVRn(i)); in etm_disable_hw()
558 etm_set_pwrdwn(drvdata); in etm_disable_hw()
559 CS_LOCK(drvdata->base); in etm_disable_hw()
561 dev_dbg(drvdata->dev, "cpu: %d disable smp call done\n", drvdata->cpu); in etm_disable_hw()
566 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_disable_perf() local
568 if (WARN_ON_ONCE(drvdata->cpu != smp_processor_id())) in etm_disable_perf()
571 CS_UNLOCK(drvdata->base); in etm_disable_perf()
574 etm_set_prog(drvdata); in etm_disable_perf()
580 etm_set_pwrdwn(drvdata); in etm_disable_perf()
582 CS_LOCK(drvdata->base); in etm_disable_perf()
587 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_disable_sysfs() local
596 spin_lock(&drvdata->spinlock); in etm_disable_sysfs()
602 smp_call_function_single(drvdata->cpu, etm_disable_hw, drvdata, 1); in etm_disable_sysfs()
604 spin_unlock(&drvdata->spinlock); in etm_disable_sysfs()
607 dev_info(drvdata->dev, "ETM tracing disabled\n"); in etm_disable_sysfs()
614 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_disable() local
621 mode = local_read(&drvdata->mode); in etm_disable()
638 local_set(&drvdata->mode, CS_MODE_DISABLED); in etm_disable()
712 struct etm_drvdata *drvdata = info; in etm_init_arch_data() local
715 etm_os_unlock(drvdata); in etm_init_arch_data()
717 CS_UNLOCK(drvdata->base); in etm_init_arch_data()
720 (void)etm_readl(drvdata, ETMPDSR); in etm_init_arch_data()
722 etm_set_pwrup(drvdata); in etm_init_arch_data()
727 etm_clr_pwrdwn(drvdata); in etm_init_arch_data()
732 etm_set_prog(drvdata); in etm_init_arch_data()
735 etmidr = etm_readl(drvdata, ETMIDR); in etm_init_arch_data()
736 drvdata->arch = BMVAL(etmidr, 4, 11); in etm_init_arch_data()
737 drvdata->port_size = etm_readl(drvdata, ETMCR) & PORT_SIZE_MASK; in etm_init_arch_data()
739 drvdata->etmccer = etm_readl(drvdata, ETMCCER); in etm_init_arch_data()
740 etmccr = etm_readl(drvdata, ETMCCR); in etm_init_arch_data()
741 drvdata->etmccr = etmccr; in etm_init_arch_data()
742 drvdata->nr_addr_cmp = BMVAL(etmccr, 0, 3) * 2; in etm_init_arch_data()
743 drvdata->nr_cntr = BMVAL(etmccr, 13, 15); in etm_init_arch_data()
744 drvdata->nr_ext_inp = BMVAL(etmccr, 17, 19); in etm_init_arch_data()
745 drvdata->nr_ext_out = BMVAL(etmccr, 20, 22); in etm_init_arch_data()
746 drvdata->nr_ctxid_cmp = BMVAL(etmccr, 24, 25); in etm_init_arch_data()
748 etm_set_pwrdwn(drvdata); in etm_init_arch_data()
749 etm_clr_pwrup(drvdata); in etm_init_arch_data()
750 CS_LOCK(drvdata->base); in etm_init_arch_data()
753 static void etm_init_trace_id(struct etm_drvdata *drvdata) in etm_init_trace_id() argument
755 drvdata->traceid = coresight_get_trace_id(drvdata->cpu); in etm_init_trace_id()
764 struct etm_drvdata *drvdata; in etm_probe() local
769 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in etm_probe()
770 if (!drvdata) in etm_probe()
779 drvdata->use_cp14 = of_property_read_bool(np, "arm,cp14"); in etm_probe()
782 drvdata->dev = &adev->dev; in etm_probe()
783 dev_set_drvdata(dev, drvdata); in etm_probe()
790 drvdata->base = base; in etm_probe()
792 spin_lock_init(&drvdata->spinlock); in etm_probe()
794 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in etm_probe()
795 if (!IS_ERR(drvdata->atclk)) { in etm_probe()
796 ret = clk_prepare_enable(drvdata->atclk); in etm_probe()
801 drvdata->cpu = pdata ? pdata->cpu : 0; in etm_probe()
804 etmdrvdata[drvdata->cpu] = drvdata; in etm_probe()
806 if (smp_call_function_single(drvdata->cpu, in etm_probe()
807 etm_init_arch_data, drvdata, 1)) in etm_probe()
823 if (etm_arch_supported(drvdata->arch) == false) { in etm_probe()
828 etm_init_trace_id(drvdata); in etm_probe()
829 etm_set_default(&drvdata->config); in etm_probe()
837 drvdata->csdev = coresight_register(&desc); in etm_probe()
838 if (IS_ERR(drvdata->csdev)) { in etm_probe()
839 ret = PTR_ERR(drvdata->csdev); in etm_probe()
843 ret = etm_perf_symlink(drvdata->csdev, true); in etm_probe()
845 coresight_unregister(drvdata->csdev); in etm_probe()
852 coresight_enable(drvdata->csdev); in etm_probe()
853 drvdata->boot_enable = true; in etm_probe()
870 struct etm_drvdata *drvdata = dev_get_drvdata(dev); in etm_runtime_suspend() local
872 if (drvdata && !IS_ERR(drvdata->atclk)) in etm_runtime_suspend()
873 clk_disable_unprepare(drvdata->atclk); in etm_runtime_suspend()
880 struct etm_drvdata *drvdata = dev_get_drvdata(dev); in etm_runtime_resume() local
882 if (drvdata && !IS_ERR(drvdata->atclk)) in etm_runtime_resume()
883 clk_prepare_enable(drvdata->atclk); in etm_runtime_resume()