Lines Matching +full:tmc +full:- +full:etr

1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/dma-mapping.h>
17 #include "coresight-catu.h"
18 #include "coresight-priv.h"
19 #include "coresight-tmc.h"
22 dev_get_drvdata(csdev->dev.parent)
43 * ------------------------------------
44 * | Address [63-12] | SBZ | V|
45 * ------------------------------------
55 * SLADDR ===> x------------------x x--> x-----------------x
56 * INADDR ->| Page 0 | V | | | Page 256 | V | <- INADDR+1M
57 * |------------------| | |-----------------|
58 * INADDR+4K ->| Page 1 | V | | | |
59 * |------------------| | |-----------------|
61 * |------------------| | |-----------------|
63 * |------------------| | |-----------------|
65 * SLADDR+2K==>|------------------| | |-----------------|
67 * |------------------| | | |
69 * |------------------| | | |
71 * |------------------| | |-----------------|
73 * |------------------| | |-----------------|
74 * | Table Page 1| 1 |--x | IGNORED | 0 |
75 * x------------------x x-----------------x
78 * The base input address (used by the ETR, programmed in INADDR_{LO,HI})
93 #define CATU_LINK_PREV ((CATU_PAGE_SIZE / sizeof(cate_t)) - 2)
94 #define CATU_LINK_NEXT ((CATU_PAGE_SIZE / sizeof(cate_t)) - 1)
97 #define CATU_ADDR_MASK ~(((cate_t)1 << CATU_ADDR_SHIFT) - 1)
120 struct tmc_pages *table_pages = &catu_table->table_pages; in catu_get_table()
135 *daddrp = table_pages->daddrs[pg_idx] + pg_offset; in catu_get_table()
136 ptr = page_address(table_pages->pages[pg_idx]); in catu_get_table()
148 dev_dbg(catu_table->dev, in catu_dump_table()
150 catu_table, catu_table->table_daddr); in catu_dump_table()
157 dev_dbg(catu_table->dev, "%d: %llx\n", i, table[i]); in catu_dump_table()
158 dev_dbg(catu_table->dev, "Prev : %llx, Next: %llx\n", in catu_dump_table()
160 dev_dbg(catu_table->dev, "== End of sub-table ==="); in catu_dump_table()
162 dev_dbg(catu_table->dev, "== End of Table ==="); in catu_dump_table()
214 data_daddr = catu_table->data_pages.daddrs[sys_pidx] + in catu_populate_table()
216 catu_dbg(catu_table->dev, in catu_populate_table()
233 sizeof(cate_t) * (CATU_PTRS_PER_PAGE - i)); in catu_populate_table()
243 catu_dbg(catu_table->dev, in catu_populate_table()
245 (offset >> 20) - 1, cur_taddr, prev_taddr, next_taddr); in catu_populate_table()
288 if (!etr_buf || etr_buf->mode != ETR_MODE_CATU || !etr_buf->private) in catu_free_etr_buf()
291 catu_buf = etr_buf->private; in catu_free_etr_buf()
292 tmc_free_sg_table(catu_buf->catu_table); in catu_free_etr_buf()
299 struct catu_etr_buf *catu_buf = etr_buf->private; in catu_get_data_etr_buf()
301 return tmc_sg_table_get_data(catu_buf->catu_table, offset, len, bufpp); in catu_get_data_etr_buf()
306 struct catu_etr_buf *catu_buf = etr_buf->private; in catu_sync_etr_buf()
307 struct tmc_sg_table *catu_table = catu_buf->catu_table; in catu_sync_etr_buf()
311 * ETR started off at etr_buf->hwaddr. Convert the RRP/RWP to in catu_sync_etr_buf()
314 r_offset = rrp - etr_buf->hwaddr; in catu_sync_etr_buf()
315 w_offset = rwp - etr_buf->hwaddr; in catu_sync_etr_buf()
317 if (!etr_buf->full) { in catu_sync_etr_buf()
318 etr_buf->len = w_offset - r_offset; in catu_sync_etr_buf()
320 etr_buf->len += etr_buf->size; in catu_sync_etr_buf()
322 etr_buf->len = etr_buf->size; in catu_sync_etr_buf()
325 etr_buf->offset = r_offset; in catu_sync_etr_buf()
326 tmc_sg_table_sync_data_range(catu_table, r_offset, etr_buf->len); in catu_sync_etr_buf()
338 return -ENODEV; in catu_alloc_etr_buf()
341 return -ENOMEM; in catu_alloc_etr_buf()
343 catu_table = catu_init_sg_table(&csdev->dev, node, in catu_alloc_etr_buf()
344 etr_buf->size, pages); in catu_alloc_etr_buf()
350 etr_buf->mode = ETR_MODE_CATU; in catu_alloc_etr_buf()
351 etr_buf->private = catu_buf; in catu_alloc_etr_buf()
352 etr_buf->hwaddr = CATU_DEFAULT_INADDR; in catu_alloc_etr_buf()
354 catu_buf->catu_table = catu_table; in catu_alloc_etr_buf()
356 catu_buf->sladdr = catu_table->table_daddr; in catu_alloc_etr_buf()
393 struct csdev_access *csa = &drvdata->csdev->access; in catu_wait_for_ready()
404 struct device *dev = &drvdata->csdev->dev; in catu_enable_hw()
405 struct coresight_device *csdev = drvdata->csdev; in catu_enable_hw()
417 return -EBUSY; in catu_enable_hw()
425 csdev->pdata, CORESIGHT_DEV_TYPE_SINK, etr_subtype); in catu_enable_hw()
433 if (etr_buf && etr_buf->mode == ETR_MODE_CATU) { in catu_enable_hw()
434 struct catu_etr_buf *catu_buf = etr_buf->private; in catu_enable_hw()
438 catu_write_sladdr(drvdata, catu_buf->sladdr); in catu_enable_hw()
462 CS_UNLOCK(catu_drvdata->base); in catu_enable()
464 CS_LOCK(catu_drvdata->base); in catu_enable()
471 struct device *dev = &drvdata->csdev->dev; in catu_disable_hw()
472 struct coresight_device *csdev = drvdata->csdev; in catu_disable_hw()
478 rc = -EAGAIN; in catu_disable_hw()
490 CS_UNLOCK(catu_drvdata->base); in catu_disable()
492 CS_LOCK(catu_drvdata->base); in catu_disable()
512 struct device *dev = &adev->dev; in catu_probe()
517 return -ENOMEM; in catu_probe()
521 ret = -ENOMEM; in catu_probe()
526 base = devm_ioremap_resource(dev, &adev->res); in catu_probe()
544 /* Default to the 40bits as supported by TMC-ETR */ in catu_probe()
556 dev->platform_data = pdata; in catu_probe()
558 drvdata->base = base; in catu_probe()
567 drvdata->csdev = coresight_register(&catu_desc); in catu_probe()
568 if (IS_ERR(drvdata->csdev)) in catu_probe()
569 ret = PTR_ERR(drvdata->csdev); in catu_probe()
571 pm_runtime_put(&adev->dev); in catu_probe()
578 struct catu_drvdata *drvdata = dev_get_drvdata(&adev->dev); in catu_remove()
580 coresight_unregister(drvdata->csdev); in catu_remove()
592 .name = "coresight-catu",