Lines Matching refs:hisi_ptt

27 static bool hisi_ptt_wait_tuning_finish(struct hisi_ptt *hisi_ptt)  in hisi_ptt_wait_tuning_finish()  argument
31 return !readl_poll_timeout(hisi_ptt->iobase + HISI_PTT_TUNING_INT_STAT, in hisi_ptt_wait_tuning_finish()
41 struct hisi_ptt *hisi_ptt = to_hisi_ptt(dev_get_drvdata(dev)); in hisi_ptt_tune_attr_show() local
50 mutex_lock(&hisi_ptt->tune_lock); in hisi_ptt_tune_attr_show()
52 reg = readl(hisi_ptt->iobase + HISI_PTT_TUNING_CTRL); in hisi_ptt_tune_attr_show()
56 writel(reg, hisi_ptt->iobase + HISI_PTT_TUNING_CTRL); in hisi_ptt_tune_attr_show()
59 writel(~0U, hisi_ptt->iobase + HISI_PTT_TUNING_DATA); in hisi_ptt_tune_attr_show()
61 if (!hisi_ptt_wait_tuning_finish(hisi_ptt)) { in hisi_ptt_tune_attr_show()
62 mutex_unlock(&hisi_ptt->tune_lock); in hisi_ptt_tune_attr_show()
66 reg = readl(hisi_ptt->iobase + HISI_PTT_TUNING_DATA); in hisi_ptt_tune_attr_show()
70 mutex_unlock(&hisi_ptt->tune_lock); in hisi_ptt_tune_attr_show()
78 struct hisi_ptt *hisi_ptt = to_hisi_ptt(dev_get_drvdata(dev)); in hisi_ptt_tune_attr_store() local
90 mutex_lock(&hisi_ptt->tune_lock); in hisi_ptt_tune_attr_store()
92 reg = readl(hisi_ptt->iobase + HISI_PTT_TUNING_CTRL); in hisi_ptt_tune_attr_store()
96 writel(reg, hisi_ptt->iobase + HISI_PTT_TUNING_CTRL); in hisi_ptt_tune_attr_store()
98 hisi_ptt->iobase + HISI_PTT_TUNING_DATA); in hisi_ptt_tune_attr_store()
100 if (!hisi_ptt_wait_tuning_finish(hisi_ptt)) { in hisi_ptt_tune_attr_store()
101 mutex_unlock(&hisi_ptt->tune_lock); in hisi_ptt_tune_attr_store()
105 mutex_unlock(&hisi_ptt->tune_lock); in hisi_ptt_tune_attr_store()
164 static bool hisi_ptt_wait_trace_hw_idle(struct hisi_ptt *hisi_ptt) in hisi_ptt_wait_trace_hw_idle() argument
168 return !readl_poll_timeout_atomic(hisi_ptt->iobase + HISI_PTT_TRACE_STS, in hisi_ptt_wait_trace_hw_idle()
174 static void hisi_ptt_wait_dma_reset_done(struct hisi_ptt *hisi_ptt) in hisi_ptt_wait_dma_reset_done() argument
178 readl_poll_timeout_atomic(hisi_ptt->iobase + HISI_PTT_TRACE_WR_STS, in hisi_ptt_wait_dma_reset_done()
183 static void hisi_ptt_trace_end(struct hisi_ptt *hisi_ptt) in hisi_ptt_trace_end() argument
185 writel(0, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); in hisi_ptt_trace_end()
186 hisi_ptt->trace_ctrl.started = false; in hisi_ptt_trace_end()
189 static int hisi_ptt_trace_start(struct hisi_ptt *hisi_ptt) in hisi_ptt_trace_start() argument
191 struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; in hisi_ptt_trace_start()
196 if (!hisi_ptt_wait_trace_hw_idle(hisi_ptt)) { in hisi_ptt_trace_start()
197 pci_err(hisi_ptt->pdev, "Failed to start trace, the device is still busy\n"); in hisi_ptt_trace_start()
204 val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); in hisi_ptt_trace_start()
206 writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); in hisi_ptt_trace_start()
208 hisi_ptt_wait_dma_reset_done(hisi_ptt); in hisi_ptt_trace_start()
210 val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); in hisi_ptt_trace_start()
212 writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); in hisi_ptt_trace_start()
215 hisi_ptt->trace_ctrl.buf_index = 0; in hisi_ptt_trace_start()
222 writel(HISI_PTT_TRACE_INT_STAT_MASK, hisi_ptt->iobase + HISI_PTT_TRACE_INT_STAT); in hisi_ptt_trace_start()
223 writel(0, hisi_ptt->iobase + HISI_PTT_TRACE_INT_MASK); in hisi_ptt_trace_start()
229 val |= FIELD_PREP(HISI_PTT_TRACE_CTRL_TARGET_SEL, hisi_ptt->trace_ctrl.filter); in hisi_ptt_trace_start()
230 if (!hisi_ptt->trace_ctrl.is_port) in hisi_ptt_trace_start()
235 writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); in hisi_ptt_trace_start()
240 static int hisi_ptt_update_aux(struct hisi_ptt *hisi_ptt, int index, bool stop) in hisi_ptt_update_aux() argument
242 struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; in hisi_ptt_update_aux()
263 reg = readl(hisi_ptt->iobase + HISI_PTT_TRACE_WR_STS); in hisi_ptt_update_aux()
298 struct hisi_ptt *hisi_ptt = context; in hisi_ptt_isr() local
301 status = readl(hisi_ptt->iobase + HISI_PTT_TRACE_INT_STAT); in hisi_ptt_isr()
308 writel(status, hisi_ptt->iobase + HISI_PTT_TRACE_INT_STAT); in hisi_ptt_isr()
316 if (hisi_ptt_update_aux(hisi_ptt, buf_idx, false)) in hisi_ptt_isr()
317 hisi_ptt_trace_end(hisi_ptt); in hisi_ptt_isr()
319 hisi_ptt->trace_ctrl.buf_index = (buf_idx + 1) % HISI_PTT_TRACE_BUF_CNT; in hisi_ptt_isr()
329 static int hisi_ptt_register_irq(struct hisi_ptt *hisi_ptt) in hisi_ptt_register_irq() argument
331 struct pci_dev *pdev = hisi_ptt->pdev; in hisi_ptt_register_irq()
347 DRV_NAME, hisi_ptt); in hisi_ptt_register_irq()
361 struct hisi_ptt *hisi_ptt = data; in hisi_ptt_init_filters() local
368 if (port_devid < hisi_ptt->lower_bdf || in hisi_ptt_init_filters()
369 port_devid > hisi_ptt->upper_bdf) in hisi_ptt_init_filters()
379 pci_err(hisi_ptt->pdev, "failed to add filter %s\n", pci_name(pdev)); in hisi_ptt_init_filters()
387 list_add_tail(&filter->list, &hisi_ptt->port_filters); in hisi_ptt_init_filters()
390 hisi_ptt->port_mask |= hisi_ptt_get_filter_val(filter->devid, true); in hisi_ptt_init_filters()
392 list_add_tail(&filter->list, &hisi_ptt->req_filters); in hisi_ptt_init_filters()
401 struct hisi_ptt *hisi_ptt = data; in hisi_ptt_release_filters() local
403 list_for_each_entry_safe(filter, tmp, &hisi_ptt->req_filters, list) { in hisi_ptt_release_filters()
408 list_for_each_entry_safe(filter, tmp, &hisi_ptt->port_filters, list) { in hisi_ptt_release_filters()
414 static int hisi_ptt_config_trace_buf(struct hisi_ptt *hisi_ptt) in hisi_ptt_config_trace_buf() argument
416 struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; in hisi_ptt_config_trace_buf()
417 struct device *dev = &hisi_ptt->pdev->dev; in hisi_ptt_config_trace_buf()
436 hisi_ptt->iobase + HISI_PTT_TRACE_ADDR_BASE_LO_0 + in hisi_ptt_config_trace_buf()
439 hisi_ptt->iobase + HISI_PTT_TRACE_ADDR_BASE_HI_0 + in hisi_ptt_config_trace_buf()
442 writel(HISI_PTT_TRACE_BUF_SIZE, hisi_ptt->iobase + HISI_PTT_TRACE_ADDR_SIZE); in hisi_ptt_config_trace_buf()
447 static int hisi_ptt_init_ctrls(struct hisi_ptt *hisi_ptt) in hisi_ptt_init_ctrls() argument
449 struct pci_dev *pdev = hisi_ptt->pdev; in hisi_ptt_init_ctrls()
454 INIT_LIST_HEAD(&hisi_ptt->port_filters); in hisi_ptt_init_ctrls()
455 INIT_LIST_HEAD(&hisi_ptt->req_filters); in hisi_ptt_init_ctrls()
457 ret = hisi_ptt_config_trace_buf(hisi_ptt); in hisi_ptt_init_ctrls()
470 reg = readl(hisi_ptt->iobase + HISI_PTT_DEVICE_RANGE); in hisi_ptt_init_ctrls()
471 hisi_ptt->upper_bdf = FIELD_GET(HISI_PTT_DEVICE_RANGE_UPPER, reg); in hisi_ptt_init_ctrls()
472 hisi_ptt->lower_bdf = FIELD_GET(HISI_PTT_DEVICE_RANGE_LOWER, reg); in hisi_ptt_init_ctrls()
474 bus = pci_find_bus(pci_domain_nr(pdev->bus), PCI_BUS_NUM(hisi_ptt->upper_bdf)); in hisi_ptt_init_ctrls()
476 pci_walk_bus(bus, hisi_ptt_init_filters, hisi_ptt); in hisi_ptt_init_ctrls()
478 ret = devm_add_action_or_reset(&pdev->dev, hisi_ptt_release_filters, hisi_ptt); in hisi_ptt_init_ctrls()
482 hisi_ptt->trace_ctrl.on_cpu = -1; in hisi_ptt_init_ctrls()
489 struct hisi_ptt *hisi_ptt = to_hisi_ptt(dev_get_drvdata(dev)); in cpumask_show() local
490 const cpumask_t *cpumask = cpumask_of_node(dev_to_node(&hisi_ptt->pdev->dev)); in cpumask_show()
604 static int hisi_ptt_trace_valid_filter(struct hisi_ptt *hisi_ptt, u64 config) in hisi_ptt_trace_valid_filter() argument
606 unsigned long val, port_mask = hisi_ptt->port_mask; in hisi_ptt_trace_valid_filter()
609 hisi_ptt->trace_ctrl.is_port = FIELD_GET(HISI_PTT_PMU_FILTER_IS_PORT, config); in hisi_ptt_trace_valid_filter()
621 if (!hisi_ptt->trace_ctrl.is_port) { in hisi_ptt_trace_valid_filter()
622 list_for_each_entry(filter, &hisi_ptt->req_filters, list) { in hisi_ptt_trace_valid_filter()
633 static void hisi_ptt_pmu_init_configs(struct hisi_ptt *hisi_ptt, struct perf_event *event) in hisi_ptt_pmu_init_configs() argument
635 struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; in hisi_ptt_pmu_init_configs()
639 hisi_ptt->trace_ctrl.filter = val; in hisi_ptt_pmu_init_configs()
653 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_event_init() local
662 if (event->attr.type != hisi_ptt->hisi_ptt_pmu.type) in hisi_ptt_pmu_event_init()
665 ret = hisi_ptt_trace_valid_filter(hisi_ptt, event->attr.config); in hisi_ptt_pmu_event_init()
737 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_start() local
738 struct perf_output_handle *handle = &hisi_ptt->trace_ctrl.handle; in hisi_ptt_pmu_start()
748 spin_lock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_start()
749 if (hisi_ptt->trace_ctrl.started) { in hisi_ptt_pmu_start()
760 ret = irq_set_affinity(pci_irq_vector(hisi_ptt->pdev, HISI_PTT_TRACE_DMA_IRQ), in hisi_ptt_pmu_start()
765 hisi_ptt->trace_ctrl.on_cpu = cpu; in hisi_ptt_pmu_start()
775 hisi_ptt_pmu_init_configs(hisi_ptt, event); in hisi_ptt_pmu_start()
777 ret = hisi_ptt_trace_start(hisi_ptt); in hisi_ptt_pmu_start()
784 spin_unlock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_start()
788 spin_unlock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_start()
793 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_stop() local
799 spin_lock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_stop()
800 if (hisi_ptt->trace_ctrl.started) { in hisi_ptt_pmu_stop()
801 hisi_ptt_trace_end(hisi_ptt); in hisi_ptt_pmu_stop()
803 if (!hisi_ptt_wait_trace_hw_idle(hisi_ptt)) in hisi_ptt_pmu_stop()
806 hisi_ptt_update_aux(hisi_ptt, hisi_ptt->trace_ctrl.buf_index, true); in hisi_ptt_pmu_stop()
808 spin_unlock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_stop()
817 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_add() local
822 if (!cpumask_test_cpu(cpu, cpumask_of_node(dev_to_node(&hisi_ptt->pdev->dev)))) in hisi_ptt_pmu_add()
851 static int hisi_ptt_register_pmu(struct hisi_ptt *hisi_ptt) in hisi_ptt_register_pmu() argument
859 &hisi_ptt->hotplug_node); in hisi_ptt_register_pmu()
863 ret = devm_add_action_or_reset(&hisi_ptt->pdev->dev, in hisi_ptt_register_pmu()
865 &hisi_ptt->hotplug_node); in hisi_ptt_register_pmu()
869 mutex_init(&hisi_ptt->tune_lock); in hisi_ptt_register_pmu()
870 spin_lock_init(&hisi_ptt->pmu_lock); in hisi_ptt_register_pmu()
872 hisi_ptt->hisi_ptt_pmu = (struct pmu) { in hisi_ptt_register_pmu()
886 reg = readl(hisi_ptt->iobase + HISI_PTT_LOCATION); in hisi_ptt_register_pmu()
890 pmu_name = devm_kasprintf(&hisi_ptt->pdev->dev, GFP_KERNEL, "hisi_ptt%u_%u", in hisi_ptt_register_pmu()
895 ret = perf_pmu_register(&hisi_ptt->hisi_ptt_pmu, pmu_name, -1); in hisi_ptt_register_pmu()
899 return devm_add_action_or_reset(&hisi_ptt->pdev->dev, in hisi_ptt_register_pmu()
901 &hisi_ptt->hisi_ptt_pmu); in hisi_ptt_register_pmu()
927 struct hisi_ptt *hisi_ptt; in hisi_ptt_probe() local
936 hisi_ptt = devm_kzalloc(&pdev->dev, sizeof(*hisi_ptt), GFP_KERNEL); in hisi_ptt_probe()
937 if (!hisi_ptt) in hisi_ptt_probe()
940 hisi_ptt->pdev = pdev; in hisi_ptt_probe()
941 pci_set_drvdata(pdev, hisi_ptt); in hisi_ptt_probe()
955 hisi_ptt->iobase = pcim_iomap_table(pdev)[2]; in hisi_ptt_probe()
965 ret = hisi_ptt_register_irq(hisi_ptt); in hisi_ptt_probe()
969 ret = hisi_ptt_init_ctrls(hisi_ptt); in hisi_ptt_probe()
975 ret = hisi_ptt_register_pmu(hisi_ptt); in hisi_ptt_probe()
998 struct hisi_ptt *hisi_ptt; in hisi_ptt_cpu_teardown() local
1002 hisi_ptt = hlist_entry_safe(node, struct hisi_ptt, hotplug_node); in hisi_ptt_cpu_teardown()
1003 src = hisi_ptt->trace_ctrl.on_cpu; in hisi_ptt_cpu_teardown()
1004 dev = hisi_ptt->hisi_ptt_pmu.dev; in hisi_ptt_cpu_teardown()
1006 if (!hisi_ptt->trace_ctrl.started || src != cpu) in hisi_ptt_cpu_teardown()
1009 target = cpumask_any_but(cpumask_of_node(dev_to_node(&hisi_ptt->pdev->dev)), cpu); in hisi_ptt_cpu_teardown()
1015 perf_pmu_migrate_context(&hisi_ptt->hisi_ptt_pmu, src, target); in hisi_ptt_cpu_teardown()
1021 if (irq_set_affinity(pci_irq_vector(hisi_ptt->pdev, HISI_PTT_TRACE_DMA_IRQ), in hisi_ptt_cpu_teardown()
1025 hisi_ptt->trace_ctrl.on_cpu = target; in hisi_ptt_cpu_teardown()