• Home
  • Raw
  • Download

Lines Matching refs:drvdata

52 static void etm_os_unlock(struct etm_drvdata *drvdata)  in etm_os_unlock()  argument
55 etm_writel(drvdata, 0x0, ETMOSLAR); in etm_os_unlock()
56 drvdata->os_unlock = true; in etm_os_unlock()
60 static void etm_set_pwrdwn(struct etm_drvdata *drvdata) in etm_set_pwrdwn() argument
67 etmcr = etm_readl(drvdata, ETMCR); in etm_set_pwrdwn()
69 etm_writel(drvdata, etmcr, ETMCR); in etm_set_pwrdwn()
72 static void etm_clr_pwrdwn(struct etm_drvdata *drvdata) in etm_clr_pwrdwn() argument
76 etmcr = etm_readl(drvdata, ETMCR); in etm_clr_pwrdwn()
78 etm_writel(drvdata, etmcr, ETMCR); in etm_clr_pwrdwn()
84 static void etm_set_pwrup(struct etm_drvdata *drvdata) in etm_set_pwrup() argument
88 etmpdcr = readl_relaxed(drvdata->base + ETMPDCR); in etm_set_pwrup()
90 writel_relaxed(etmpdcr, drvdata->base + ETMPDCR); in etm_set_pwrup()
96 static void etm_clr_pwrup(struct etm_drvdata *drvdata) in etm_clr_pwrup() argument
103 etmpdcr = readl_relaxed(drvdata->base + ETMPDCR); in etm_clr_pwrup()
105 writel_relaxed(etmpdcr, drvdata->base + ETMPDCR); in etm_clr_pwrup()
122 static int coresight_timeout_etm(struct etm_drvdata *drvdata, u32 offset, in coresight_timeout_etm() argument
129 val = etm_readl(drvdata, offset); in coresight_timeout_etm()
153 static void etm_set_prog(struct etm_drvdata *drvdata) in etm_set_prog() argument
157 etmcr = etm_readl(drvdata, ETMCR); in etm_set_prog()
159 etm_writel(drvdata, etmcr, ETMCR); in etm_set_prog()
165 if (coresight_timeout_etm(drvdata, ETMSR, ETMSR_PROG_BIT, 1)) { in etm_set_prog()
166 dev_err(&drvdata->csdev->dev, in etm_set_prog()
172 static void etm_clr_prog(struct etm_drvdata *drvdata) in etm_clr_prog() argument
176 etmcr = etm_readl(drvdata, ETMCR); in etm_clr_prog()
178 etm_writel(drvdata, etmcr, ETMCR); in etm_clr_prog()
184 if (coresight_timeout_etm(drvdata, ETMSR, ETMSR_PROG_BIT, 0)) { in etm_clr_prog()
185 dev_err(&drvdata->csdev->dev, in etm_clr_prog()
306 static int etm_parse_event_config(struct etm_drvdata *drvdata, in etm_parse_event_config() argument
309 struct etm_config *config = &drvdata->config; in etm_parse_event_config()
350 !(drvdata->etmccer & ETMCCER_RETSTACK)) in etm_parse_event_config()
356 static int etm_enable_hw(struct etm_drvdata *drvdata) in etm_enable_hw() argument
360 struct etm_config *config = &drvdata->config; in etm_enable_hw()
361 struct coresight_device *csdev = drvdata->csdev; in etm_enable_hw()
363 CS_UNLOCK(drvdata->base); in etm_enable_hw()
370 etm_clr_pwrdwn(drvdata); in etm_enable_hw()
372 etm_set_pwrup(drvdata); in etm_enable_hw()
374 etm_os_unlock(drvdata); in etm_enable_hw()
376 etm_set_prog(drvdata); in etm_enable_hw()
378 etmcr = etm_readl(drvdata, ETMCR); in etm_enable_hw()
381 etmcr |= drvdata->port_size; in etm_enable_hw()
383 etm_writel(drvdata, config->ctrl | etmcr, ETMCR); in etm_enable_hw()
384 etm_writel(drvdata, config->trigger_event, ETMTRIGGER); in etm_enable_hw()
385 etm_writel(drvdata, config->startstop_ctrl, ETMTSSCR); in etm_enable_hw()
386 etm_writel(drvdata, config->enable_event, ETMTEEVR); in etm_enable_hw()
387 etm_writel(drvdata, config->enable_ctrl1, ETMTECR1); in etm_enable_hw()
388 etm_writel(drvdata, config->fifofull_level, ETMFFLR); in etm_enable_hw()
389 for (i = 0; i < drvdata->nr_addr_cmp; i++) { in etm_enable_hw()
390 etm_writel(drvdata, config->addr_val[i], ETMACVRn(i)); in etm_enable_hw()
391 etm_writel(drvdata, config->addr_acctype[i], ETMACTRn(i)); in etm_enable_hw()
393 for (i = 0; i < drvdata->nr_cntr; i++) { in etm_enable_hw()
394 etm_writel(drvdata, config->cntr_rld_val[i], ETMCNTRLDVRn(i)); in etm_enable_hw()
395 etm_writel(drvdata, config->cntr_event[i], ETMCNTENRn(i)); in etm_enable_hw()
396 etm_writel(drvdata, config->cntr_rld_event[i], in etm_enable_hw()
398 etm_writel(drvdata, config->cntr_val[i], ETMCNTVRn(i)); in etm_enable_hw()
400 etm_writel(drvdata, config->seq_12_event, ETMSQ12EVR); in etm_enable_hw()
401 etm_writel(drvdata, config->seq_21_event, ETMSQ21EVR); in etm_enable_hw()
402 etm_writel(drvdata, config->seq_23_event, ETMSQ23EVR); in etm_enable_hw()
403 etm_writel(drvdata, config->seq_31_event, ETMSQ31EVR); in etm_enable_hw()
404 etm_writel(drvdata, config->seq_32_event, ETMSQ32EVR); in etm_enable_hw()
405 etm_writel(drvdata, config->seq_13_event, ETMSQ13EVR); in etm_enable_hw()
406 etm_writel(drvdata, config->seq_curr_state, ETMSQR); in etm_enable_hw()
407 for (i = 0; i < drvdata->nr_ext_out; i++) in etm_enable_hw()
408 etm_writel(drvdata, ETM_DEFAULT_EVENT_VAL, ETMEXTOUTEVRn(i)); in etm_enable_hw()
409 for (i = 0; i < drvdata->nr_ctxid_cmp; i++) in etm_enable_hw()
410 etm_writel(drvdata, config->ctxid_pid[i], ETMCIDCVRn(i)); in etm_enable_hw()
411 etm_writel(drvdata, config->ctxid_mask, ETMCIDCMR); in etm_enable_hw()
412 etm_writel(drvdata, config->sync_freq, ETMSYNCFR); in etm_enable_hw()
414 etm_writel(drvdata, 0x0, ETMEXTINSELR); in etm_enable_hw()
415 etm_writel(drvdata, config->timestamp_event, ETMTSEVR); in etm_enable_hw()
417 etm_writel(drvdata, 0x0, ETMAUXCR); in etm_enable_hw()
418 etm_writel(drvdata, drvdata->traceid, ETMTRACEIDR); in etm_enable_hw()
420 etm_writel(drvdata, 0x0, ETMVMIDCVR); in etm_enable_hw()
422 etm_clr_prog(drvdata); in etm_enable_hw()
425 CS_LOCK(drvdata->base); in etm_enable_hw()
427 dev_dbg(&drvdata->csdev->dev, "cpu: %d enable smp call done: %d\n", in etm_enable_hw()
428 drvdata->cpu, rc); in etm_enable_hw()
433 struct etm_drvdata *drvdata; member
443 arg->rc = etm_enable_hw(arg->drvdata); in etm_enable_hw_smp_call()
448 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_cpu_id() local
450 return drvdata->cpu; in etm_cpu_id()
453 int etm_get_trace_id(struct etm_drvdata *drvdata) in etm_get_trace_id() argument
459 if (!drvdata) in etm_get_trace_id()
462 etm_dev = drvdata->csdev->dev.parent; in etm_get_trace_id()
463 if (!local_read(&drvdata->mode)) in etm_get_trace_id()
464 return drvdata->traceid; in etm_get_trace_id()
468 spin_lock_irqsave(&drvdata->spinlock, flags); in etm_get_trace_id()
470 CS_UNLOCK(drvdata->base); in etm_get_trace_id()
471 trace_id = (etm_readl(drvdata, ETMTRACEIDR) & ETM_TRACEID_MASK); in etm_get_trace_id()
472 CS_LOCK(drvdata->base); in etm_get_trace_id()
474 spin_unlock_irqrestore(&drvdata->spinlock, flags); in etm_get_trace_id()
484 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_trace_id() local
486 return etm_get_trace_id(drvdata); in etm_trace_id()
492 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_enable_perf() local
494 if (WARN_ON_ONCE(drvdata->cpu != smp_processor_id())) in etm_enable_perf()
498 etm_parse_event_config(drvdata, event); in etm_enable_perf()
500 return etm_enable_hw(drvdata); in etm_enable_perf()
505 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_enable_sysfs() local
509 spin_lock(&drvdata->spinlock); in etm_enable_sysfs()
515 if (cpu_online(drvdata->cpu)) { in etm_enable_sysfs()
516 arg.drvdata = drvdata; in etm_enable_sysfs()
517 ret = smp_call_function_single(drvdata->cpu, in etm_enable_sysfs()
522 drvdata->sticky_enable = true; in etm_enable_sysfs()
527 spin_unlock(&drvdata->spinlock); in etm_enable_sysfs()
539 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_enable() local
541 val = local_cmpxchg(&drvdata->mode, CS_MODE_DISABLED, mode); in etm_enable()
560 local_set(&drvdata->mode, CS_MODE_DISABLED); in etm_enable()
568 struct etm_drvdata *drvdata = info; in etm_disable_hw() local
569 struct etm_config *config = &drvdata->config; in etm_disable_hw()
570 struct coresight_device *csdev = drvdata->csdev; in etm_disable_hw()
572 CS_UNLOCK(drvdata->base); in etm_disable_hw()
573 etm_set_prog(drvdata); in etm_disable_hw()
576 config->seq_curr_state = (etm_readl(drvdata, ETMSQR) & ETM_SQR_MASK); in etm_disable_hw()
578 for (i = 0; i < drvdata->nr_cntr; i++) in etm_disable_hw()
579 config->cntr_val[i] = etm_readl(drvdata, ETMCNTVRn(i)); in etm_disable_hw()
581 etm_set_pwrdwn(drvdata); in etm_disable_hw()
584 CS_LOCK(drvdata->base); in etm_disable_hw()
586 dev_dbg(&drvdata->csdev->dev, in etm_disable_hw()
587 "cpu: %d disable smp call done\n", drvdata->cpu); in etm_disable_hw()
592 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_disable_perf() local
594 if (WARN_ON_ONCE(drvdata->cpu != smp_processor_id())) in etm_disable_perf()
597 CS_UNLOCK(drvdata->base); in etm_disable_perf()
600 etm_set_prog(drvdata); in etm_disable_perf()
606 etm_set_pwrdwn(drvdata); in etm_disable_perf()
609 CS_LOCK(drvdata->base); in etm_disable_perf()
614 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_disable_sysfs() local
623 spin_lock(&drvdata->spinlock); in etm_disable_sysfs()
629 smp_call_function_single(drvdata->cpu, etm_disable_hw, drvdata, 1); in etm_disable_sysfs()
631 spin_unlock(&drvdata->spinlock); in etm_disable_sysfs()
641 struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); in etm_disable() local
648 mode = local_read(&drvdata->mode); in etm_disable()
665 local_set(&drvdata->mode, CS_MODE_DISABLED); in etm_disable()
739 struct etm_drvdata *drvdata = info; in etm_init_arch_data() local
742 etm_os_unlock(drvdata); in etm_init_arch_data()
744 CS_UNLOCK(drvdata->base); in etm_init_arch_data()
747 (void)etm_readl(drvdata, ETMPDSR); in etm_init_arch_data()
749 etm_set_pwrup(drvdata); in etm_init_arch_data()
754 etm_clr_pwrdwn(drvdata); in etm_init_arch_data()
759 etm_set_prog(drvdata); in etm_init_arch_data()
762 etmidr = etm_readl(drvdata, ETMIDR); in etm_init_arch_data()
763 drvdata->arch = BMVAL(etmidr, 4, 11); in etm_init_arch_data()
764 drvdata->port_size = etm_readl(drvdata, ETMCR) & PORT_SIZE_MASK; in etm_init_arch_data()
766 drvdata->etmccer = etm_readl(drvdata, ETMCCER); in etm_init_arch_data()
767 etmccr = etm_readl(drvdata, ETMCCR); in etm_init_arch_data()
768 drvdata->etmccr = etmccr; in etm_init_arch_data()
769 drvdata->nr_addr_cmp = BMVAL(etmccr, 0, 3) * 2; in etm_init_arch_data()
770 drvdata->nr_cntr = BMVAL(etmccr, 13, 15); in etm_init_arch_data()
771 drvdata->nr_ext_inp = BMVAL(etmccr, 17, 19); in etm_init_arch_data()
772 drvdata->nr_ext_out = BMVAL(etmccr, 20, 22); in etm_init_arch_data()
773 drvdata->nr_ctxid_cmp = BMVAL(etmccr, 24, 25); in etm_init_arch_data()
775 etm_set_pwrdwn(drvdata); in etm_init_arch_data()
776 etm_clr_pwrup(drvdata); in etm_init_arch_data()
777 CS_LOCK(drvdata->base); in etm_init_arch_data()
780 static void etm_init_trace_id(struct etm_drvdata *drvdata) in etm_init_trace_id() argument
782 drvdata->traceid = coresight_get_trace_id(drvdata->cpu); in etm_init_trace_id()
827 struct etm_drvdata *drvdata; in etm_probe() local
831 drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); in etm_probe()
832 if (!drvdata) in etm_probe()
835 drvdata->use_cp14 = fwnode_property_read_bool(dev->fwnode, "arm,cp14"); in etm_probe()
836 dev_set_drvdata(dev, drvdata); in etm_probe()
843 drvdata->base = base; in etm_probe()
846 spin_lock_init(&drvdata->spinlock); in etm_probe()
848 drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */ in etm_probe()
849 if (!IS_ERR(drvdata->atclk)) { in etm_probe()
850 ret = clk_prepare_enable(drvdata->atclk); in etm_probe()
855 drvdata->cpu = coresight_get_cpu(dev); in etm_probe()
856 if (drvdata->cpu < 0) in etm_probe()
857 return drvdata->cpu; in etm_probe()
859 desc.name = devm_kasprintf(dev, GFP_KERNEL, "etm%d", drvdata->cpu); in etm_probe()
863 if (smp_call_function_single(drvdata->cpu, in etm_probe()
864 etm_init_arch_data, drvdata, 1)) in etm_probe()
867 if (etm_arch_supported(drvdata->arch) == false) in etm_probe()
870 etm_init_trace_id(drvdata); in etm_probe()
871 etm_set_default(&drvdata->config); in etm_probe()
885 drvdata->csdev = coresight_register(&desc); in etm_probe()
886 if (IS_ERR(drvdata->csdev)) in etm_probe()
887 return PTR_ERR(drvdata->csdev); in etm_probe()
889 ret = etm_perf_symlink(drvdata->csdev, true); in etm_probe()
891 coresight_unregister(drvdata->csdev); in etm_probe()
895 etmdrvdata[drvdata->cpu] = drvdata; in etm_probe()
898 dev_info(&drvdata->csdev->dev, in etm_probe()
901 coresight_enable(drvdata->csdev); in etm_probe()
902 drvdata->boot_enable = true; in etm_probe()
917 struct etm_drvdata *drvdata = dev_get_drvdata(&adev->dev); in etm_remove() local
919 etm_perf_symlink(drvdata->csdev, false); in etm_remove()
932 if (smp_call_function_single(drvdata->cpu, clear_etmdrvdata, &drvdata->cpu, 1)) in etm_remove()
933 etmdrvdata[drvdata->cpu] = NULL; in etm_remove()
937 coresight_unregister(drvdata->csdev); in etm_remove()
943 struct etm_drvdata *drvdata = dev_get_drvdata(dev); in etm_runtime_suspend() local
945 if (drvdata && !IS_ERR(drvdata->atclk)) in etm_runtime_suspend()
946 clk_disable_unprepare(drvdata->atclk); in etm_runtime_suspend()
953 struct etm_drvdata *drvdata = dev_get_drvdata(dev); in etm_runtime_resume() local
955 if (drvdata && !IS_ERR(drvdata->atclk)) in etm_runtime_resume()
956 clk_prepare_enable(drvdata->atclk); in etm_runtime_resume()