Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b5b6e583 authored by Mao Jinlong's avatar Mao Jinlong Committed by Gerrit - the friendly Code Review server
Browse files

coresight-tmc: Use sysfs_buf for byte-cntr and sw usb cases



Etr_buf will be NULL when disable etr hw. It is before stopping byte-cntr
and sw usb data transfer which may cause null pointer issue. Use sysfs_buf
to avoid this issue.

Change-Id: I5967fd4183a9f36fca22059bb08fd8d357c8e5af
Signed-off-by: default avatarMao Jinlong <jinlmao@codeaurora.org>
parent 5648b38c
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ static struct tmc_drvdata *tmcdrvdata;
static void tmc_etr_read_bytes(struct byte_cntr *byte_cntr_data, loff_t *ppos,
			       size_t bytes, size_t *len, char **bufp)
{
	struct etr_buf *etr_buf = tmcdrvdata->etr_buf;
	struct etr_buf *etr_buf = tmcdrvdata->sysfs_buf;
	size_t actual;

	if (*len >= bytes)
@@ -60,7 +60,7 @@ static irqreturn_t etr_handler(int irq, void *data)
static void tmc_etr_flush_bytes(loff_t *ppos, size_t bytes, size_t *len)
{
	uint32_t rwp = 0;
	dma_addr_t paddr = tmcdrvdata->etr_buf->hwaddr;
	dma_addr_t paddr = tmcdrvdata->sysfs_buf->hwaddr;

	rwp = readl_relaxed(tmcdrvdata->base + TMC_RWP);

@@ -321,7 +321,7 @@ static int usb_transfer_small_packet(struct qdss_request *usb_req,
			struct byte_cntr *drvdata, size_t *small_size)
{
	int ret = 0;
	struct etr_buf *etr_buf = tmcdrvdata->etr_buf;
	struct etr_buf *etr_buf = tmcdrvdata->sysfs_buf;
	size_t req_size, actual;
	long w_offset;

@@ -347,7 +347,7 @@ static int usb_transfer_small_packet(struct qdss_request *usb_req,
		req_size -= actual;

		if ((drvdata->offset + actual) >=
				tmcdrvdata->etr_buf->size)
				tmcdrvdata->sysfs_buf->size)
			drvdata->offset = 0;
		else
			drvdata->offset += actual;
@@ -384,7 +384,7 @@ static void usb_read_work_fn(struct work_struct *work)
{
	int ret, i, seq = 0;
	struct qdss_request *usb_req = NULL;
	struct etr_buf *etr_buf = tmcdrvdata->etr_buf;
	struct etr_buf *etr_buf = tmcdrvdata->sysfs_buf;
	size_t actual, req_size, req_sg_num, small_size = 0;
	size_t actual_total = 0;
	char *buf;
@@ -458,7 +458,7 @@ static void usb_read_work_fn(struct work_struct *work)
					sg_mark_end(&usb_req->sg[i]);

				if ((drvdata->offset + actual) >=
					tmcdrvdata->etr_buf->size)
					tmcdrvdata->sysfs_buf->size)
					drvdata->offset = 0;
				else
					drvdata->offset += actual;
+12 −20
Original line number Diff line number Diff line
@@ -1527,7 +1527,10 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
			dev_err(&csdev->dev, "usb_qdss_open failed\n");
			drvdata->enable = false;
			drvdata->mode = CS_MODE_DISABLED;
			if (drvdata->byte_cntr->sw_usb)
				tmc_etr_disable_hw(drvdata);
			ret = -ENODEV;
			goto out;
		}
	}

@@ -2042,29 +2045,18 @@ static int _tmc_disable_etr_sink(struct coresight_device *csdev,

	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB
		&& drvdata->byte_cntr->sw_usb) {
	if ((drvdata->out_mode == TMC_ETR_OUT_MODE_USB
		&& drvdata->byte_cntr->sw_usb)
		|| drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) {
		if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM)
			tmc_etr_byte_cntr_stop(drvdata->byte_cntr);
		else {
			usb_bypass_stop(drvdata->byte_cntr);
			flush_workqueue(drvdata->byte_cntr->usb_wq);
			drvdata->usbch = NULL;
		coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0);
		coresight_cti_unmap_trigout(drvdata->cti_flush, 3, 0);
		/* Free memory outside the spinlock if need be */
		if (drvdata->etr_buf) {
			tmc_etr_free_sysfs_buf(drvdata->etr_buf);
			drvdata->etr_buf = NULL;
		}
	}

	if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) {
		tmc_etr_byte_cntr_stop(drvdata->byte_cntr);
		coresight_cti_unmap_trigin(drvdata->cti_reset, 2, 0);
		coresight_cti_unmap_trigout(drvdata->cti_flush, 3, 0);
		/* Free memory outside the spinlock if need be */
		if (drvdata->etr_buf) {
			tmc_etr_free_sysfs_buf(drvdata->etr_buf);
			drvdata->etr_buf = NULL;
		}
	}
out:
	dev_info(drvdata->dev, "TMC-ETR disabled\n");