forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/hwtracing/coresight/coresight-tmc-etr.c
....@@ -162,10 +162,11 @@
162162 struct device *dev, enum dma_data_direction dir)
163163 {
164164 int i;
165
+ struct device *real_dev = dev->parent;
165166
166167 for (i = 0; i < tmc_pages->nr_pages; i++) {
167168 if (tmc_pages->daddrs && tmc_pages->daddrs[i])
168
- dma_unmap_page(dev, tmc_pages->daddrs[i],
169
+ dma_unmap_page(real_dev, tmc_pages->daddrs[i],
169170 PAGE_SIZE, dir);
170171 if (tmc_pages->pages && tmc_pages->pages[i])
171172 __free_page(tmc_pages->pages[i]);
....@@ -193,6 +194,7 @@
193194 int i, nr_pages;
194195 dma_addr_t paddr;
195196 struct page *page;
197
+ struct device *real_dev = dev->parent;
196198
197199 nr_pages = tmc_pages->nr_pages;
198200 tmc_pages->daddrs = kcalloc(nr_pages, sizeof(*tmc_pages->daddrs),
....@@ -218,8 +220,8 @@
218220 if (!page)
219221 goto err;
220222 }
221
- paddr = dma_map_page(dev, page, 0, PAGE_SIZE, dir);
222
- if (dma_mapping_error(dev, paddr))
223
+ paddr = dma_map_page(real_dev, page, 0, PAGE_SIZE, dir);
224
+ if (dma_mapping_error(real_dev, paddr))
223225 goto err;
224226 tmc_pages->daddrs[i] = paddr;
225227 tmc_pages->pages[i] = page;
....@@ -255,6 +257,7 @@
255257 tmc_free_table_pages(sg_table);
256258 tmc_free_data_pages(sg_table);
257259 }
260
+EXPORT_SYMBOL_GPL(tmc_free_sg_table);
258261
259262 /*
260263 * Alloc pages for the table. Since this will be used by the device,
....@@ -306,7 +309,7 @@
306309 * and data buffers. TMC writes to the data buffers and reads from the SG
307310 * Table pages.
308311 *
309
- * @dev - Device to which page should be DMA mapped.
312
+ * @dev - Coresight device to which page should be DMA mapped.
310313 * @node - Numa node for mem allocations
311314 * @nr_tpages - Number of pages for the table entries.
312315 * @nr_dpages - Number of pages for Data buffer.
....@@ -340,6 +343,7 @@
340343
341344 return sg_table;
342345 }
346
+EXPORT_SYMBOL_GPL(tmc_alloc_sg_table);
343347
344348 /*
345349 * tmc_sg_table_sync_data_range: Sync the data buffer written
....@@ -350,28 +354,30 @@
350354 {
351355 int i, index, start;
352356 int npages = DIV_ROUND_UP(size, PAGE_SIZE);
353
- struct device *dev = table->dev;
357
+ struct device *real_dev = table->dev->parent;
354358 struct tmc_pages *data = &table->data_pages;
355359
356360 start = offset >> PAGE_SHIFT;
357361 for (i = start; i < (start + npages); i++) {
358362 index = i % data->nr_pages;
359
- dma_sync_single_for_cpu(dev, data->daddrs[index],
363
+ dma_sync_single_for_cpu(real_dev, data->daddrs[index],
360364 PAGE_SIZE, DMA_FROM_DEVICE);
361365 }
362366 }
367
+EXPORT_SYMBOL_GPL(tmc_sg_table_sync_data_range);
363368
364369 /* tmc_sg_sync_table: Sync the page table */
365370 void tmc_sg_table_sync_table(struct tmc_sg_table *sg_table)
366371 {
367372 int i;
368
- struct device *dev = sg_table->dev;
373
+ struct device *real_dev = sg_table->dev->parent;
369374 struct tmc_pages *table_pages = &sg_table->table_pages;
370375
371376 for (i = 0; i < table_pages->nr_pages; i++)
372
- dma_sync_single_for_device(dev, table_pages->daddrs[i],
377
+ dma_sync_single_for_device(real_dev, table_pages->daddrs[i],
373378 PAGE_SIZE, DMA_TO_DEVICE);
374379 }
380
+EXPORT_SYMBOL_GPL(tmc_sg_table_sync_table);
375381
376382 /*
377383 * tmc_sg_table_get_data: Get the buffer pointer for data @offset
....@@ -401,6 +407,7 @@
401407 *bufpp = page_address(data_pages->pages[pg_idx]) + pg_offset;
402408 return len;
403409 }
410
+EXPORT_SYMBOL_GPL(tmc_sg_table_get_data);
404411
405412 #ifdef ETR_SG_DEBUG
406413 /* Map a dma address to virtual address */
....@@ -592,6 +599,7 @@
592599 void **pages)
593600 {
594601 struct etr_flat_buf *flat_buf;
602
+ struct device *real_dev = drvdata->csdev->dev.parent;
595603
596604 /* We cannot reuse existing pages for flat buf */
597605 if (pages)
....@@ -601,15 +609,16 @@
601609 if (!flat_buf)
602610 return -ENOMEM;
603611
604
- flat_buf->vaddr = dma_alloc_coherent(drvdata->dev, etr_buf->size,
605
- &flat_buf->daddr, GFP_KERNEL);
612
+ flat_buf->vaddr = dma_alloc_noncoherent(real_dev, etr_buf->size,
613
+ &flat_buf->daddr,
614
+ DMA_FROM_DEVICE, GFP_KERNEL);
606615 if (!flat_buf->vaddr) {
607616 kfree(flat_buf);
608617 return -ENOMEM;
609618 }
610619
611620 flat_buf->size = etr_buf->size;
612
- flat_buf->dev = drvdata->dev;
621
+ flat_buf->dev = &drvdata->csdev->dev;
613622 etr_buf->hwaddr = flat_buf->daddr;
614623 etr_buf->mode = ETR_MODE_FLAT;
615624 etr_buf->private = flat_buf;
....@@ -620,14 +629,21 @@
620629 {
621630 struct etr_flat_buf *flat_buf = etr_buf->private;
622631
623
- if (flat_buf && flat_buf->daddr)
624
- dma_free_coherent(flat_buf->dev, flat_buf->size,
625
- flat_buf->vaddr, flat_buf->daddr);
632
+ if (flat_buf && flat_buf->daddr) {
633
+ struct device *real_dev = flat_buf->dev->parent;
634
+
635
+ dma_free_noncoherent(real_dev, etr_buf->size,
636
+ flat_buf->vaddr, flat_buf->daddr,
637
+ DMA_FROM_DEVICE);
638
+ }
626639 kfree(flat_buf);
627640 }
628641
629642 static void tmc_etr_sync_flat_buf(struct etr_buf *etr_buf, u64 rrp, u64 rwp)
630643 {
644
+ struct etr_flat_buf *flat_buf = etr_buf->private;
645
+ struct device *real_dev = flat_buf->dev->parent;
646
+
631647 /*
632648 * Adjust the buffer to point to the beginning of the trace data
633649 * and update the available trace data.
....@@ -637,6 +653,19 @@
637653 etr_buf->len = etr_buf->size;
638654 else
639655 etr_buf->len = rwp - rrp;
656
+
657
+ /*
658
+ * The driver always starts tracing at the beginning of the buffer,
659
+ * the only reason why we would get a wrap around is when the buffer
660
+ * is full. Sync the entire buffer in one go for this case.
661
+ */
662
+ if (etr_buf->offset + etr_buf->len > etr_buf->size)
663
+ dma_sync_single_for_cpu(real_dev, flat_buf->daddr,
664
+ etr_buf->size, DMA_FROM_DEVICE);
665
+ else
666
+ dma_sync_single_for_cpu(real_dev,
667
+ flat_buf->daddr + etr_buf->offset,
668
+ etr_buf->len, DMA_FROM_DEVICE);
640669 }
641670
642671 static ssize_t tmc_etr_get_data_flat_buf(struct etr_buf *etr_buf,
....@@ -668,8 +697,9 @@
668697 void **pages)
669698 {
670699 struct etr_sg_table *etr_table;
700
+ struct device *dev = &drvdata->csdev->dev;
671701
672
- etr_table = tmc_init_etr_sg_table(drvdata->dev, node,
702
+ etr_table = tmc_init_etr_sg_table(dev, node,
673703 etr_buf->size, pages);
674704 if (IS_ERR(etr_table))
675705 return -ENOMEM;
....@@ -753,14 +783,15 @@
753783 if (!IS_ENABLED(CONFIG_CORESIGHT_CATU))
754784 return NULL;
755785
756
- for (i = 0; i < etr->nr_outport; i++) {
757
- tmp = etr->conns[i].child_dev;
786
+ for (i = 0; i < etr->pdata->nr_outport; i++) {
787
+ tmp = etr->pdata->conns[i].child_dev;
758788 if (tmp && coresight_is_catu_device(tmp))
759789 return tmp;
760790 }
761791
762792 return NULL;
763793 }
794
+EXPORT_SYMBOL_GPL(tmc_etr_get_catu_device);
764795
765796 static inline int tmc_etr_enable_catu(struct tmc_drvdata *drvdata,
766797 struct etr_buf *etr_buf)
....@@ -783,9 +814,20 @@
783814 static const struct etr_buf_operations *etr_buf_ops[] = {
784815 [ETR_MODE_FLAT] = &etr_flat_buf_ops,
785816 [ETR_MODE_ETR_SG] = &etr_sg_buf_ops,
786
- [ETR_MODE_CATU] = IS_ENABLED(CONFIG_CORESIGHT_CATU)
787
- ? &etr_catu_buf_ops : NULL,
817
+ [ETR_MODE_CATU] = NULL,
788818 };
819
+
820
+void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu)
821
+{
822
+ etr_buf_ops[ETR_MODE_CATU] = catu;
823
+}
824
+EXPORT_SYMBOL_GPL(tmc_etr_set_catu_ops);
825
+
826
+void tmc_etr_remove_catu_ops(void)
827
+{
828
+ etr_buf_ops[ETR_MODE_CATU] = NULL;
829
+}
830
+EXPORT_SYMBOL_GPL(tmc_etr_remove_catu_ops);
789831
790832 static inline int tmc_etr_mode_alloc_buf(int mode,
791833 struct tmc_drvdata *drvdata,
....@@ -825,9 +867,10 @@
825867 bool has_etr_sg, has_iommu;
826868 bool has_sg, has_catu;
827869 struct etr_buf *etr_buf;
870
+ struct device *dev = &drvdata->csdev->dev;
828871
829872 has_etr_sg = tmc_etr_has_cap(drvdata, TMC_ETR_SG);
830
- has_iommu = iommu_get_domain_for_dev(drvdata->dev);
873
+ has_iommu = iommu_get_domain_for_dev(dev->parent);
831874 has_catu = !!tmc_etr_get_catu_device(drvdata);
832875
833876 has_sg = has_catu || has_etr_sg;
....@@ -866,7 +909,7 @@
866909 }
867910
868911 refcount_set(&etr_buf->refcount, 1);
869
- dev_dbg(drvdata->dev, "allocated buffer of size %ldKB in mode %d\n",
912
+ dev_dbg(dev, "allocated buffer of size %ldKB in mode %d\n",
870913 (unsigned long)size >> 10, etr_buf->mode);
871914 return etr_buf;
872915 }
....@@ -1015,7 +1058,7 @@
10151058 rc = tmc_etr_enable_catu(drvdata, etr_buf);
10161059 if (rc)
10171060 return rc;
1018
- rc = coresight_claim_device(drvdata->base);
1061
+ rc = coresight_claim_device(drvdata->csdev);
10191062 if (!rc) {
10201063 drvdata->etr_buf = etr_buf;
10211064 __tmc_etr_enable_hw(drvdata);
....@@ -1104,12 +1147,12 @@
11041147
11051148 }
11061149
1107
-static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
1150
+void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
11081151 {
11091152 __tmc_etr_disable_hw(drvdata);
11101153 /* Disable CATU device if this ETR is connected to one */
11111154 tmc_etr_disable_catu(drvdata);
1112
- coresight_disclaim_device(drvdata->base);
1155
+ coresight_disclaim_device(drvdata->csdev);
11131156 /* Reset the ETR buf used by hardware */
11141157 drvdata->etr_buf = NULL;
11151158 }
....@@ -1181,7 +1224,7 @@
11811224 tmc_etr_free_sysfs_buf(free_buf);
11821225
11831226 if (!ret)
1184
- dev_dbg(drvdata->dev, "TMC-ETR enabled\n");
1227
+ dev_dbg(&csdev->dev, "TMC-ETR enabled\n");
11851228
11861229 return ret;
11871230 }
....@@ -1362,7 +1405,7 @@
13621405 etr_perf = tmc_etr_setup_perf_buf(drvdata, event,
13631406 nr_pages, pages, snapshot);
13641407 if (IS_ERR(etr_perf)) {
1365
- dev_dbg(drvdata->dev, "Unable to allocate ETR buffer\n");
1408
+ dev_dbg(&csdev->dev, "Unable to allocate ETR buffer\n");
13661409 return NULL;
13671410 }
13681411
....@@ -1527,7 +1570,7 @@
15271570
15281571 /* Insert barrier packets at the beginning, if there was an overflow */
15291572 if (lost)
1530
- tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
1573
+ tmc_etr_buf_insert_barrier_packet(etr_buf, offset);
15311574 tmc_etr_sync_perf_buffer(etr_perf, offset, size);
15321575
15331576 /*
....@@ -1538,6 +1581,14 @@
15381581 */
15391582 if (etr_perf->snapshot)
15401583 handle->head += size;
1584
+
1585
+ /*
1586
+ * Ensure that the AUX trace data is visible before the aux_head
1587
+ * is updated via perf_aux_output_end(), as expected by the
1588
+ * perf ring buffer.
1589
+ */
1590
+ smp_wmb();
1591
+
15411592 out:
15421593 /*
15431594 * Don't set the TRUNCATED flag in snapshot mode because 1) the
....@@ -1647,7 +1698,7 @@
16471698
16481699 spin_unlock_irqrestore(&drvdata->spinlock, flags);
16491700
1650
- dev_dbg(drvdata->dev, "TMC-ETR disabled\n");
1701
+ dev_dbg(&csdev->dev, "TMC-ETR disabled\n");
16511702 return 0;
16521703 }
16531704