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()
344 hisi_ptt->trace_irq = pci_irq_vector(pdev, HISI_PTT_TRACE_DMA_IRQ); in hisi_ptt_register_irq()
345 ret = devm_request_irq(&pdev->dev, hisi_ptt->trace_irq, hisi_ptt_isr, in hisi_ptt_register_irq()
347 hisi_ptt); in hisi_ptt_register_irq()
350 hisi_ptt->trace_irq, ret); in hisi_ptt_register_irq()
357 static void hisi_ptt_del_free_filter(struct hisi_ptt *hisi_ptt, in hisi_ptt_del_free_filter() argument
361 hisi_ptt->port_mask &= ~hisi_ptt_get_filter_val(filter->devid, true); in hisi_ptt_del_free_filter()
369 hisi_ptt_alloc_add_filter(struct hisi_ptt *hisi_ptt, u16 devid, bool is_port) in hisi_ptt_alloc_add_filter() argument
375 filter_name = kasprintf(GFP_KERNEL, "%04x:%02x:%02x.%d", pci_domain_nr(hisi_ptt->pdev->bus), in hisi_ptt_alloc_add_filter()
378 pci_err(hisi_ptt->pdev, "failed to allocate name for filter %04x:%02x:%02x.%d\n", in hisi_ptt_alloc_add_filter()
379 pci_domain_nr(hisi_ptt->pdev->bus), PCI_BUS_NUM(devid), in hisi_ptt_alloc_add_filter()
386 pci_err(hisi_ptt->pdev, "failed to add filter for %s\n", in hisi_ptt_alloc_add_filter()
397 list_add_tail(&filter->list, &hisi_ptt->port_filters); in hisi_ptt_alloc_add_filter()
400 hisi_ptt->port_mask |= hisi_ptt_get_filter_val(filter->devid, true); in hisi_ptt_alloc_add_filter()
402 list_add_tail(&filter->list, &hisi_ptt->req_filters); in hisi_ptt_alloc_add_filter()
421 static int hisi_ptt_create_rp_filter_attr(struct hisi_ptt *hisi_ptt, in hisi_ptt_create_rp_filter_attr() argument
424 struct kobject *kobj = &hisi_ptt->hisi_ptt_pmu.dev->kobj; in hisi_ptt_create_rp_filter_attr()
435 static void hisi_ptt_remove_rp_filter_attr(struct hisi_ptt *hisi_ptt, in hisi_ptt_remove_rp_filter_attr() argument
438 struct kobject *kobj = &hisi_ptt->hisi_ptt_pmu.dev->kobj; in hisi_ptt_remove_rp_filter_attr()
444 static int hisi_ptt_create_req_filter_attr(struct hisi_ptt *hisi_ptt, in hisi_ptt_create_req_filter_attr() argument
447 struct kobject *kobj = &hisi_ptt->hisi_ptt_pmu.dev->kobj; in hisi_ptt_create_req_filter_attr()
458 static void hisi_ptt_remove_req_filter_attr(struct hisi_ptt *hisi_ptt, in hisi_ptt_remove_req_filter_attr() argument
461 struct kobject *kobj = &hisi_ptt->hisi_ptt_pmu.dev->kobj; in hisi_ptt_remove_req_filter_attr()
467 static int hisi_ptt_create_filter_attr(struct hisi_ptt *hisi_ptt, in hisi_ptt_create_filter_attr() argument
473 ret = hisi_ptt_create_rp_filter_attr(hisi_ptt, filter); in hisi_ptt_create_filter_attr()
475 ret = hisi_ptt_create_req_filter_attr(hisi_ptt, filter); in hisi_ptt_create_filter_attr()
478 pci_err(hisi_ptt->pdev, "failed to create sysfs attribute for filter %s\n", in hisi_ptt_create_filter_attr()
484 static void hisi_ptt_remove_filter_attr(struct hisi_ptt *hisi_ptt, in hisi_ptt_remove_filter_attr() argument
488 hisi_ptt_remove_rp_filter_attr(hisi_ptt, filter); in hisi_ptt_remove_filter_attr()
490 hisi_ptt_remove_req_filter_attr(hisi_ptt, filter); in hisi_ptt_remove_filter_attr()
496 struct hisi_ptt *hisi_ptt = data; in hisi_ptt_remove_all_filter_attributes() local
498 mutex_lock(&hisi_ptt->filter_lock); in hisi_ptt_remove_all_filter_attributes()
500 list_for_each_entry(filter, &hisi_ptt->req_filters, list) in hisi_ptt_remove_all_filter_attributes()
501 hisi_ptt_remove_filter_attr(hisi_ptt, filter); in hisi_ptt_remove_all_filter_attributes()
503 list_for_each_entry(filter, &hisi_ptt->port_filters, list) in hisi_ptt_remove_all_filter_attributes()
504 hisi_ptt_remove_filter_attr(hisi_ptt, filter); in hisi_ptt_remove_all_filter_attributes()
506 hisi_ptt->sysfs_inited = false; in hisi_ptt_remove_all_filter_attributes()
507 mutex_unlock(&hisi_ptt->filter_lock); in hisi_ptt_remove_all_filter_attributes()
510 static int hisi_ptt_init_filter_attributes(struct hisi_ptt *hisi_ptt) in hisi_ptt_init_filter_attributes() argument
515 mutex_lock(&hisi_ptt->filter_lock); in hisi_ptt_init_filter_attributes()
522 ret = devm_add_action(&hisi_ptt->pdev->dev, in hisi_ptt_init_filter_attributes()
524 hisi_ptt); in hisi_ptt_init_filter_attributes()
528 list_for_each_entry(filter, &hisi_ptt->port_filters, list) { in hisi_ptt_init_filter_attributes()
529 ret = hisi_ptt_create_filter_attr(hisi_ptt, filter); in hisi_ptt_init_filter_attributes()
534 list_for_each_entry(filter, &hisi_ptt->req_filters, list) { in hisi_ptt_init_filter_attributes()
535 ret = hisi_ptt_create_filter_attr(hisi_ptt, filter); in hisi_ptt_init_filter_attributes()
540 hisi_ptt->sysfs_inited = true; in hisi_ptt_init_filter_attributes()
542 mutex_unlock(&hisi_ptt->filter_lock); in hisi_ptt_init_filter_attributes()
551 struct hisi_ptt *hisi_ptt; in hisi_ptt_update_filters() local
553 hisi_ptt = container_of(delayed_work, struct hisi_ptt, work); in hisi_ptt_update_filters()
555 if (!mutex_trylock(&hisi_ptt->filter_lock)) { in hisi_ptt_update_filters()
556 schedule_delayed_work(&hisi_ptt->work, HISI_PTT_WORK_DELAY_MS); in hisi_ptt_update_filters()
560 while (kfifo_get(&hisi_ptt->filter_update_kfifo, &info)) { in hisi_ptt_update_filters()
567 filter = hisi_ptt_alloc_add_filter(hisi_ptt, info.devid, info.is_port); in hisi_ptt_update_filters()
577 if (hisi_ptt->sysfs_inited && in hisi_ptt_update_filters()
578 hisi_ptt_create_filter_attr(hisi_ptt, filter)) { in hisi_ptt_update_filters()
579 hisi_ptt_del_free_filter(hisi_ptt, filter); in hisi_ptt_update_filters()
586 target_list = info.is_port ? &hisi_ptt->port_filters : in hisi_ptt_update_filters()
587 &hisi_ptt->req_filters; in hisi_ptt_update_filters()
591 if (hisi_ptt->sysfs_inited) in hisi_ptt_update_filters()
592 hisi_ptt_remove_filter_attr(hisi_ptt, filter); in hisi_ptt_update_filters()
594 hisi_ptt_del_free_filter(hisi_ptt, filter); in hisi_ptt_update_filters()
600 mutex_unlock(&hisi_ptt->filter_lock); in hisi_ptt_update_filters()
610 struct hisi_ptt *hisi_ptt = container_of(nb, struct hisi_ptt, hisi_ptt_nb); in hisi_ptt_notifier_call() local
622 if (port_devid < hisi_ptt->lower_bdf || in hisi_ptt_notifier_call()
623 port_devid > hisi_ptt->upper_bdf) in hisi_ptt_notifier_call()
646 if (kfifo_in_spinlocked(&hisi_ptt->filter_update_kfifo, &info, 1, in hisi_ptt_notifier_call()
647 &hisi_ptt->filter_update_lock)) in hisi_ptt_notifier_call()
648 schedule_delayed_work(&hisi_ptt->work, 0); in hisi_ptt_notifier_call()
650 pci_warn(hisi_ptt->pdev, in hisi_ptt_notifier_call()
661 struct hisi_ptt *hisi_ptt = data; in hisi_ptt_init_filters() local
668 if (port_devid < hisi_ptt->lower_bdf || in hisi_ptt_init_filters()
669 port_devid > hisi_ptt->upper_bdf) in hisi_ptt_init_filters()
677 filter = hisi_ptt_alloc_add_filter(hisi_ptt, pci_dev_id(pdev), in hisi_ptt_init_filters()
688 struct hisi_ptt *hisi_ptt = data; in hisi_ptt_release_filters() local
690 list_for_each_entry_safe(filter, tmp, &hisi_ptt->req_filters, list) in hisi_ptt_release_filters()
691 hisi_ptt_del_free_filter(hisi_ptt, filter); in hisi_ptt_release_filters()
693 list_for_each_entry_safe(filter, tmp, &hisi_ptt->port_filters, list) in hisi_ptt_release_filters()
694 hisi_ptt_del_free_filter(hisi_ptt, filter); in hisi_ptt_release_filters()
697 static int hisi_ptt_config_trace_buf(struct hisi_ptt *hisi_ptt) in hisi_ptt_config_trace_buf() argument
699 struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; in hisi_ptt_config_trace_buf()
700 struct device *dev = &hisi_ptt->pdev->dev; in hisi_ptt_config_trace_buf()
719 hisi_ptt->iobase + HISI_PTT_TRACE_ADDR_BASE_LO_0 + in hisi_ptt_config_trace_buf()
722 hisi_ptt->iobase + HISI_PTT_TRACE_ADDR_BASE_HI_0 + in hisi_ptt_config_trace_buf()
725 writel(HISI_PTT_TRACE_BUF_SIZE, hisi_ptt->iobase + HISI_PTT_TRACE_ADDR_SIZE); in hisi_ptt_config_trace_buf()
730 static int hisi_ptt_init_ctrls(struct hisi_ptt *hisi_ptt) in hisi_ptt_init_ctrls() argument
732 struct pci_dev *pdev = hisi_ptt->pdev; in hisi_ptt_init_ctrls()
737 INIT_DELAYED_WORK(&hisi_ptt->work, hisi_ptt_update_filters); in hisi_ptt_init_ctrls()
738 INIT_KFIFO(hisi_ptt->filter_update_kfifo); in hisi_ptt_init_ctrls()
739 spin_lock_init(&hisi_ptt->filter_update_lock); in hisi_ptt_init_ctrls()
741 INIT_LIST_HEAD(&hisi_ptt->port_filters); in hisi_ptt_init_ctrls()
742 INIT_LIST_HEAD(&hisi_ptt->req_filters); in hisi_ptt_init_ctrls()
743 mutex_init(&hisi_ptt->filter_lock); in hisi_ptt_init_ctrls()
745 ret = hisi_ptt_config_trace_buf(hisi_ptt); in hisi_ptt_init_ctrls()
758 reg = readl(hisi_ptt->iobase + HISI_PTT_DEVICE_RANGE); in hisi_ptt_init_ctrls()
759 hisi_ptt->upper_bdf = FIELD_GET(HISI_PTT_DEVICE_RANGE_UPPER, reg); in hisi_ptt_init_ctrls()
760 hisi_ptt->lower_bdf = FIELD_GET(HISI_PTT_DEVICE_RANGE_LOWER, reg); in hisi_ptt_init_ctrls()
762 bus = pci_find_bus(pci_domain_nr(pdev->bus), PCI_BUS_NUM(hisi_ptt->upper_bdf)); in hisi_ptt_init_ctrls()
764 pci_walk_bus(bus, hisi_ptt_init_filters, hisi_ptt); in hisi_ptt_init_ctrls()
766 ret = devm_add_action_or_reset(&pdev->dev, hisi_ptt_release_filters, hisi_ptt); in hisi_ptt_init_ctrls()
770 hisi_ptt->trace_ctrl.on_cpu = -1; in hisi_ptt_init_ctrls()
777 struct hisi_ptt *hisi_ptt = to_hisi_ptt(dev_get_drvdata(dev)); in cpumask_show() local
778 const cpumask_t *cpumask = cpumask_of_node(dev_to_node(&hisi_ptt->pdev->dev)); in cpumask_show()
940 static int hisi_ptt_trace_valid_filter(struct hisi_ptt *hisi_ptt, u64 config) in hisi_ptt_trace_valid_filter() argument
942 unsigned long val, port_mask = hisi_ptt->port_mask; in hisi_ptt_trace_valid_filter()
946 hisi_ptt->trace_ctrl.is_port = FIELD_GET(HISI_PTT_PMU_FILTER_IS_PORT, config); in hisi_ptt_trace_valid_filter()
958 mutex_lock(&hisi_ptt->filter_lock); in hisi_ptt_trace_valid_filter()
959 if (!hisi_ptt->trace_ctrl.is_port) { in hisi_ptt_trace_valid_filter()
960 list_for_each_entry(filter, &hisi_ptt->req_filters, list) { in hisi_ptt_trace_valid_filter()
970 mutex_unlock(&hisi_ptt->filter_lock); in hisi_ptt_trace_valid_filter()
974 static void hisi_ptt_pmu_init_configs(struct hisi_ptt *hisi_ptt, struct perf_event *event) in hisi_ptt_pmu_init_configs() argument
976 struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; in hisi_ptt_pmu_init_configs()
980 hisi_ptt->trace_ctrl.filter = val; in hisi_ptt_pmu_init_configs()
994 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_event_init() local
998 if (event->attr.type != hisi_ptt->hisi_ptt_pmu.type) in hisi_ptt_pmu_event_init()
1009 ret = hisi_ptt_trace_valid_filter(hisi_ptt, event->attr.config); in hisi_ptt_pmu_event_init()
1081 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_start() local
1082 struct perf_output_handle *handle = &hisi_ptt->trace_ctrl.handle; in hisi_ptt_pmu_start()
1092 spin_lock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_start()
1093 if (hisi_ptt->trace_ctrl.started) { in hisi_ptt_pmu_start()
1104 ret = irq_set_affinity(hisi_ptt->trace_irq, cpumask_of(cpu)); in hisi_ptt_pmu_start()
1108 hisi_ptt->trace_ctrl.on_cpu = cpu; in hisi_ptt_pmu_start()
1118 hisi_ptt_pmu_init_configs(hisi_ptt, event); in hisi_ptt_pmu_start()
1120 ret = hisi_ptt_trace_start(hisi_ptt); in hisi_ptt_pmu_start()
1127 spin_unlock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_start()
1131 spin_unlock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_start()
1136 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_stop() local
1142 spin_lock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_stop()
1143 if (hisi_ptt->trace_ctrl.started) { in hisi_ptt_pmu_stop()
1144 hisi_ptt_trace_end(hisi_ptt); in hisi_ptt_pmu_stop()
1146 if (!hisi_ptt_wait_trace_hw_idle(hisi_ptt)) in hisi_ptt_pmu_stop()
1149 hisi_ptt_update_aux(hisi_ptt, hisi_ptt->trace_ctrl.buf_index, true); in hisi_ptt_pmu_stop()
1151 spin_unlock(&hisi_ptt->pmu_lock); in hisi_ptt_pmu_stop()
1160 struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); in hisi_ptt_pmu_add() local
1165 if (!cpumask_test_cpu(cpu, cpumask_of_node(dev_to_node(&hisi_ptt->pdev->dev)))) in hisi_ptt_pmu_add()
1198 static int hisi_ptt_register_pmu(struct hisi_ptt *hisi_ptt) in hisi_ptt_register_pmu() argument
1206 &hisi_ptt->hotplug_node); in hisi_ptt_register_pmu()
1210 ret = devm_add_action_or_reset(&hisi_ptt->pdev->dev, in hisi_ptt_register_pmu()
1212 &hisi_ptt->hotplug_node); in hisi_ptt_register_pmu()
1216 mutex_init(&hisi_ptt->tune_lock); in hisi_ptt_register_pmu()
1217 spin_lock_init(&hisi_ptt->pmu_lock); in hisi_ptt_register_pmu()
1219 hisi_ptt->hisi_ptt_pmu = (struct pmu) { in hisi_ptt_register_pmu()
1234 reg = readl(hisi_ptt->iobase + HISI_PTT_LOCATION); in hisi_ptt_register_pmu()
1238 pmu_name = devm_kasprintf(&hisi_ptt->pdev->dev, GFP_KERNEL, "hisi_ptt%u_%u", in hisi_ptt_register_pmu()
1243 ret = perf_pmu_register(&hisi_ptt->hisi_ptt_pmu, pmu_name, -1); in hisi_ptt_register_pmu()
1247 return devm_add_action_or_reset(&hisi_ptt->pdev->dev, in hisi_ptt_register_pmu()
1249 &hisi_ptt->hisi_ptt_pmu); in hisi_ptt_register_pmu()
1254 struct hisi_ptt *hisi_ptt = data; in hisi_ptt_unregister_filter_update_notifier() local
1256 bus_unregister_notifier(&pci_bus_type, &hisi_ptt->hisi_ptt_nb); in hisi_ptt_unregister_filter_update_notifier()
1259 cancel_delayed_work_sync(&hisi_ptt->work); in hisi_ptt_unregister_filter_update_notifier()
1263 static int hisi_ptt_register_filter_update_notifier(struct hisi_ptt *hisi_ptt) in hisi_ptt_register_filter_update_notifier() argument
1267 hisi_ptt->hisi_ptt_nb.notifier_call = hisi_ptt_notifier_call; in hisi_ptt_register_filter_update_notifier()
1268 ret = bus_register_notifier(&pci_bus_type, &hisi_ptt->hisi_ptt_nb); in hisi_ptt_register_filter_update_notifier()
1272 return devm_add_action_or_reset(&hisi_ptt->pdev->dev, in hisi_ptt_register_filter_update_notifier()
1274 hisi_ptt); in hisi_ptt_register_filter_update_notifier()
1300 struct hisi_ptt *hisi_ptt; in hisi_ptt_probe() local
1309 hisi_ptt = devm_kzalloc(&pdev->dev, sizeof(*hisi_ptt), GFP_KERNEL); in hisi_ptt_probe()
1310 if (!hisi_ptt) in hisi_ptt_probe()
1313 hisi_ptt->pdev = pdev; in hisi_ptt_probe()
1314 pci_set_drvdata(pdev, hisi_ptt); in hisi_ptt_probe()
1328 hisi_ptt->iobase = pcim_iomap_table(pdev)[2]; in hisi_ptt_probe()
1338 ret = hisi_ptt_register_irq(hisi_ptt); in hisi_ptt_probe()
1342 ret = hisi_ptt_init_ctrls(hisi_ptt); in hisi_ptt_probe()
1348 ret = hisi_ptt_register_filter_update_notifier(hisi_ptt); in hisi_ptt_probe()
1352 ret = hisi_ptt_register_pmu(hisi_ptt); in hisi_ptt_probe()
1358 ret = hisi_ptt_init_filter_attributes(hisi_ptt); in hisi_ptt_probe()
1381 struct hisi_ptt *hisi_ptt; in hisi_ptt_cpu_teardown() local
1385 hisi_ptt = hlist_entry_safe(node, struct hisi_ptt, hotplug_node); in hisi_ptt_cpu_teardown()
1386 src = hisi_ptt->trace_ctrl.on_cpu; in hisi_ptt_cpu_teardown()
1387 dev = hisi_ptt->hisi_ptt_pmu.dev; in hisi_ptt_cpu_teardown()
1389 if (!hisi_ptt->trace_ctrl.started || src != cpu) in hisi_ptt_cpu_teardown()
1392 target = cpumask_any_but(cpumask_of_node(dev_to_node(&hisi_ptt->pdev->dev)), cpu); in hisi_ptt_cpu_teardown()
1398 perf_pmu_migrate_context(&hisi_ptt->hisi_ptt_pmu, src, target); in hisi_ptt_cpu_teardown()
1404 if (irq_set_affinity(hisi_ptt->trace_irq, cpumask_of(target))) in hisi_ptt_cpu_teardown()
1407 hisi_ptt->trace_ctrl.on_cpu = target; in hisi_ptt_cpu_teardown()