forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f70575805708cabdedea7498aaa3f710fde4d920
kernel/drivers/hwtracing/coresight/coresight-tmc-etr.c
....@@ -47,7 +47,8 @@
4747 };
4848
4949 /* Convert the perf index to an offset within the ETR buffer */
50
-#define PERF_IDX2OFF(idx, buf) ((idx) % ((buf)->nr_pages << PAGE_SHIFT))
50
+#define PERF_IDX2OFF(idx, buf) \
51
+ ((idx) % ((unsigned long)(buf)->nr_pages << PAGE_SHIFT))
5152
5253 /* Lower limit for ETR hardware buffer */
5354 #define TMC_ETR_PERF_MIN_BUF_SIZE SZ_1M
....@@ -162,10 +163,11 @@
162163 struct device *dev, enum dma_data_direction dir)
163164 {
164165 int i;
166
+ struct device *real_dev = dev->parent;
165167
166168 for (i = 0; i < tmc_pages->nr_pages; i++) {
167169 if (tmc_pages->daddrs && tmc_pages->daddrs[i])
168
- dma_unmap_page(dev, tmc_pages->daddrs[i],
170
+ dma_unmap_page(real_dev, tmc_pages->daddrs[i],
169171 PAGE_SIZE, dir);
170172 if (tmc_pages->pages && tmc_pages->pages[i])
171173 __free_page(tmc_pages->pages[i]);
....@@ -193,6 +195,7 @@
193195 int i, nr_pages;
194196 dma_addr_t paddr;
195197 struct page *page;
198
+ struct device *real_dev = dev->parent;
196199
197200 nr_pages = tmc_pages->nr_pages;
198201 tmc_pages->daddrs = kcalloc(nr_pages, sizeof(*tmc_pages->daddrs),
....@@ -218,8 +221,8 @@
218221 if (!page)
219222 goto err;
220223 }
221
- paddr = dma_map_page(dev, page, 0, PAGE_SIZE, dir);
222
- if (dma_mapping_error(dev, paddr))
224
+ paddr = dma_map_page(real_dev, page, 0, PAGE_SIZE, dir);
225
+ if (dma_mapping_error(real_dev, paddr))
223226 goto err;
224227 tmc_pages->daddrs[i] = paddr;
225228 tmc_pages->pages[i] = page;
....@@ -255,6 +258,7 @@
255258 tmc_free_table_pages(sg_table);
256259 tmc_free_data_pages(sg_table);
257260 }
261
+EXPORT_SYMBOL_GPL(tmc_free_sg_table);
258262
259263 /*
260264 * Alloc pages for the table. Since this will be used by the device,
....@@ -306,7 +310,7 @@
306310 * and data buffers. TMC writes to the data buffers and reads from the SG
307311 * Table pages.
308312 *
309
- * @dev - Device to which page should be DMA mapped.
313
+ * @dev - Coresight device to which page should be DMA mapped.
310314 * @node - Numa node for mem allocations
311315 * @nr_tpages - Number of pages for the table entries.
312316 * @nr_dpages - Number of pages for Data buffer.
....@@ -340,6 +344,7 @@
340344
341345 return sg_table;
342346 }
347
+EXPORT_SYMBOL_GPL(tmc_alloc_sg_table);
343348
344349 /*
345350 * tmc_sg_table_sync_data_range: Sync the data buffer written
....@@ -350,28 +355,30 @@
350355 {
351356 int i, index, start;
352357 int npages = DIV_ROUND_UP(size, PAGE_SIZE);
353
- struct device *dev = table->dev;
358
+ struct device *real_dev = table->dev->parent;
354359 struct tmc_pages *data = &table->data_pages;
355360
356361 start = offset >> PAGE_SHIFT;
357362 for (i = start; i < (start + npages); i++) {
358363 index = i % data->nr_pages;
359
- dma_sync_single_for_cpu(dev, data->daddrs[index],
364
+ dma_sync_single_for_cpu(real_dev, data->daddrs[index],
360365 PAGE_SIZE, DMA_FROM_DEVICE);
361366 }
362367 }
368
+EXPORT_SYMBOL_GPL(tmc_sg_table_sync_data_range);
363369
364370 /* tmc_sg_sync_table: Sync the page table */
365371 void tmc_sg_table_sync_table(struct tmc_sg_table *sg_table)
366372 {
367373 int i;
368
- struct device *dev = sg_table->dev;
374
+ struct device *real_dev = sg_table->dev->parent;
369375 struct tmc_pages *table_pages = &sg_table->table_pages;
370376
371377 for (i = 0; i < table_pages->nr_pages; i++)
372
- dma_sync_single_for_device(dev, table_pages->daddrs[i],
378
+ dma_sync_single_for_device(real_dev, table_pages->daddrs[i],
373379 PAGE_SIZE, DMA_TO_DEVICE);
374380 }
381
+EXPORT_SYMBOL_GPL(tmc_sg_table_sync_table);
375382
376383 /*
377384 * tmc_sg_table_get_data: Get the buffer pointer for data @offset
....@@ -401,6 +408,7 @@
401408 *bufpp = page_address(data_pages->pages[pg_idx]) + pg_offset;
402409 return len;
403410 }
411
+EXPORT_SYMBOL_GPL(tmc_sg_table_get_data);
404412
405413 #ifdef ETR_SG_DEBUG
406414 /* Map a dma address to virtual address */
....@@ -592,6 +600,7 @@
592600 void **pages)
593601 {
594602 struct etr_flat_buf *flat_buf;
603
+ struct device *real_dev = drvdata->csdev->dev.parent;
595604
596605 /* We cannot reuse existing pages for flat buf */
597606 if (pages)
....@@ -601,15 +610,16 @@
601610 if (!flat_buf)
602611 return -ENOMEM;
603612
604
- flat_buf->vaddr = dma_alloc_coherent(drvdata->dev, etr_buf->size,
605
- &flat_buf->daddr, GFP_KERNEL);
613
+ flat_buf->vaddr = dma_alloc_noncoherent(real_dev, etr_buf->size,
614
+ &flat_buf->daddr,
615
+ DMA_FROM_DEVICE, GFP_KERNEL);
606616 if (!flat_buf->vaddr) {
607617 kfree(flat_buf);
608618 return -ENOMEM;
609619 }
610620
611621 flat_buf->size = etr_buf->size;
612
- flat_buf->dev = drvdata->dev;
622
+ flat_buf->dev = &drvdata->csdev->dev;
613623 etr_buf->hwaddr = flat_buf->daddr;
614624 etr_buf->mode = ETR_MODE_FLAT;
615625 etr_buf->private = flat_buf;
....@@ -620,14 +630,21 @@
620630 {
621631 struct etr_flat_buf *flat_buf = etr_buf->private;
622632
623
- if (flat_buf && flat_buf->daddr)
624
- dma_free_coherent(flat_buf->dev, flat_buf->size,
625
- flat_buf->vaddr, flat_buf->daddr);
633
+ if (flat_buf && flat_buf->daddr) {
634
+ struct device *real_dev = flat_buf->dev->parent;
635
+
636
+ dma_free_noncoherent(real_dev, etr_buf->size,
637
+ flat_buf->vaddr, flat_buf->daddr,
638
+ DMA_FROM_DEVICE);
639
+ }
626640 kfree(flat_buf);
627641 }
628642
629643 static void tmc_etr_sync_flat_buf(struct etr_buf *etr_buf, u64 rrp, u64 rwp)
630644 {
645
+ struct etr_flat_buf *flat_buf = etr_buf->private;
646
+ struct device *real_dev = flat_buf->dev->parent;
647
+
631648 /*
632649 * Adjust the buffer to point to the beginning of the trace data
633650 * and update the available trace data.
....@@ -637,6 +654,19 @@
637654 etr_buf->len = etr_buf->size;
638655 else
639656 etr_buf->len = rwp - rrp;
657
+
658
+ /*
659
+ * The driver always starts tracing at the beginning of the buffer,
660
+ * the only reason why we would get a wrap around is when the buffer
661
+ * is full. Sync the entire buffer in one go for this case.
662
+ */
663
+ if (etr_buf->offset + etr_buf->len > etr_buf->size)
664
+ dma_sync_single_for_cpu(real_dev, flat_buf->daddr,
665
+ etr_buf->size, DMA_FROM_DEVICE);
666
+ else
667
+ dma_sync_single_for_cpu(real_dev,
668
+ flat_buf->daddr + etr_buf->offset,
669
+ etr_buf->len, DMA_FROM_DEVICE);
640670 }
641671
642672 static ssize_t tmc_etr_get_data_flat_buf(struct etr_buf *etr_buf,
....@@ -668,8 +698,9 @@
668698 void **pages)
669699 {
670700 struct etr_sg_table *etr_table;
701
+ struct device *dev = &drvdata->csdev->dev;
671702
672
- etr_table = tmc_init_etr_sg_table(drvdata->dev, node,
703
+ etr_table = tmc_init_etr_sg_table(dev, node,
673704 etr_buf->size, pages);
674705 if (IS_ERR(etr_table))
675706 return -ENOMEM;
....@@ -753,14 +784,15 @@
753784 if (!IS_ENABLED(CONFIG_CORESIGHT_CATU))
754785 return NULL;
755786
756
- for (i = 0; i < etr->nr_outport; i++) {
757
- tmp = etr->conns[i].child_dev;
787
+ for (i = 0; i < etr->pdata->nr_outport; i++) {
788
+ tmp = etr->pdata->conns[i].child_dev;
758789 if (tmp && coresight_is_catu_device(tmp))
759790 return tmp;
760791 }
761792
762793 return NULL;
763794 }
795
+EXPORT_SYMBOL_GPL(tmc_etr_get_catu_device);
764796
765797 static inline int tmc_etr_enable_catu(struct tmc_drvdata *drvdata,
766798 struct etr_buf *etr_buf)
....@@ -783,9 +815,20 @@
783815 static const struct etr_buf_operations *etr_buf_ops[] = {
784816 [ETR_MODE_FLAT] = &etr_flat_buf_ops,
785817 [ETR_MODE_ETR_SG] = &etr_sg_buf_ops,
786
- [ETR_MODE_CATU] = IS_ENABLED(CONFIG_CORESIGHT_CATU)
787
- ? &etr_catu_buf_ops : NULL,
818
+ [ETR_MODE_CATU] = NULL,
788819 };
820
+
821
+void tmc_etr_set_catu_ops(const struct etr_buf_operations *catu)
822
+{
823
+ etr_buf_ops[ETR_MODE_CATU] = catu;
824
+}
825
+EXPORT_SYMBOL_GPL(tmc_etr_set_catu_ops);
826
+
827
+void tmc_etr_remove_catu_ops(void)
828
+{
829
+ etr_buf_ops[ETR_MODE_CATU] = NULL;
830
+}
831
+EXPORT_SYMBOL_GPL(tmc_etr_remove_catu_ops);
789832
790833 static inline int tmc_etr_mode_alloc_buf(int mode,
791834 struct tmc_drvdata *drvdata,
....@@ -825,9 +868,10 @@
825868 bool has_etr_sg, has_iommu;
826869 bool has_sg, has_catu;
827870 struct etr_buf *etr_buf;
871
+ struct device *dev = &drvdata->csdev->dev;
828872
829873 has_etr_sg = tmc_etr_has_cap(drvdata, TMC_ETR_SG);
830
- has_iommu = iommu_get_domain_for_dev(drvdata->dev);
874
+ has_iommu = iommu_get_domain_for_dev(dev->parent);
831875 has_catu = !!tmc_etr_get_catu_device(drvdata);
832876
833877 has_sg = has_catu || has_etr_sg;
....@@ -866,7 +910,7 @@
866910 }
867911
868912 refcount_set(&etr_buf->refcount, 1);
869
- dev_dbg(drvdata->dev, "allocated buffer of size %ldKB in mode %d\n",
913
+ dev_dbg(dev, "allocated buffer of size %ldKB in mode %d\n",
870914 (unsigned long)size >> 10, etr_buf->mode);
871915 return etr_buf;
872916 }
....@@ -901,7 +945,7 @@
901945
902946 len = tmc_etr_buf_get_data(etr_buf, offset,
903947 CORESIGHT_BARRIER_PKT_SIZE, &bufp);
904
- if (WARN_ON(len < CORESIGHT_BARRIER_PKT_SIZE))
948
+ if (WARN_ON(len < 0 || len < CORESIGHT_BARRIER_PKT_SIZE))
905949 return -EINVAL;
906950 coresight_insert_barrier_packet(bufp);
907951 return offset + CORESIGHT_BARRIER_PKT_SIZE;
....@@ -1015,7 +1059,7 @@
10151059 rc = tmc_etr_enable_catu(drvdata, etr_buf);
10161060 if (rc)
10171061 return rc;
1018
- rc = coresight_claim_device(drvdata->base);
1062
+ rc = coresight_claim_device(drvdata->csdev);
10191063 if (!rc) {
10201064 drvdata->etr_buf = etr_buf;
10211065 __tmc_etr_enable_hw(drvdata);
....@@ -1104,12 +1148,12 @@
11041148
11051149 }
11061150
1107
-static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
1151
+void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
11081152 {
11091153 __tmc_etr_disable_hw(drvdata);
11101154 /* Disable CATU device if this ETR is connected to one */
11111155 tmc_etr_disable_catu(drvdata);
1112
- coresight_disclaim_device(drvdata->base);
1156
+ coresight_disclaim_device(drvdata->csdev);
11131157 /* Reset the ETR buf used by hardware */
11141158 drvdata->etr_buf = NULL;
11151159 }
....@@ -1181,7 +1225,7 @@
11811225 tmc_etr_free_sysfs_buf(free_buf);
11821226
11831227 if (!ret)
1184
- dev_dbg(drvdata->dev, "TMC-ETR enabled\n");
1228
+ dev_dbg(&csdev->dev, "TMC-ETR enabled\n");
11851229
11861230 return ret;
11871231 }
....@@ -1207,7 +1251,7 @@
12071251 * than the size requested via sysfs.
12081252 */
12091253 if ((nr_pages << PAGE_SHIFT) > drvdata->size) {
1210
- etr_buf = tmc_alloc_etr_buf(drvdata, (nr_pages << PAGE_SHIFT),
1254
+ etr_buf = tmc_alloc_etr_buf(drvdata, ((ssize_t)nr_pages << PAGE_SHIFT),
12111255 0, node, NULL);
12121256 if (!IS_ERR(etr_buf))
12131257 goto done;
....@@ -1362,7 +1406,7 @@
13621406 etr_perf = tmc_etr_setup_perf_buf(drvdata, event,
13631407 nr_pages, pages, snapshot);
13641408 if (IS_ERR(etr_perf)) {
1365
- dev_dbg(drvdata->dev, "Unable to allocate ETR buffer\n");
1409
+ dev_dbg(&csdev->dev, "Unable to allocate ETR buffer\n");
13661410 return NULL;
13671411 }
13681412
....@@ -1527,7 +1571,7 @@
15271571
15281572 /* Insert barrier packets at the beginning, if there was an overflow */
15291573 if (lost)
1530
- tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
1574
+ tmc_etr_buf_insert_barrier_packet(etr_buf, offset);
15311575 tmc_etr_sync_perf_buffer(etr_perf, offset, size);
15321576
15331577 /*
....@@ -1538,6 +1582,14 @@
15381582 */
15391583 if (etr_perf->snapshot)
15401584 handle->head += size;
1585
+
1586
+ /*
1587
+ * Ensure that the AUX trace data is visible before the aux_head
1588
+ * is updated via perf_aux_output_end(), as expected by the
1589
+ * perf ring buffer.
1590
+ */
1591
+ smp_wmb();
1592
+
15411593 out:
15421594 /*
15431595 * Don't set the TRUNCATED flag in snapshot mode because 1) the
....@@ -1647,7 +1699,7 @@
16471699
16481700 spin_unlock_irqrestore(&drvdata->spinlock, flags);
16491701
1650
- dev_dbg(drvdata->dev, "TMC-ETR disabled\n");
1702
+ dev_dbg(&csdev->dev, "TMC-ETR disabled\n");
16511703 return 0;
16521704 }
16531705