From e3e12f52b214121840b44c91de5b3e5af5d3eb84 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 06 Nov 2023 03:04:41 +0000
Subject: [PATCH] rk3568 rt init

---
 kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c |  128 +++++++++++-------------------------------
 1 files changed, 35 insertions(+), 93 deletions(-)

diff --git a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
index 79af779..4b0d4d3 100644
--- a/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
+++ b/kernel/drivers/pci/controller/dwc/pcie-dw-dmatest.c
@@ -47,46 +47,16 @@
 module_param(test_dev, uint, 0644);
 MODULE_PARM_DESC(test_dev, "Choose dma_obj device,(default 0)");
 
+static bool is_rc = true;
+module_param_named(is_rc, is_rc, bool, 0644);
+MODULE_PARM_DESC(is_rc, "Test port is rc(default true)");
+
 #define PCIE_DW_MISC_DMATEST_DEV_MAX 5
-
-#define PCIE_DMA_OFFSET			0x380000
-
-#define PCIE_DMA_CTRL_OFF		0x8
-#define PCIE_DMA_WR_ENB			0xc
-#define PCIE_DMA_WR_CTRL_LO		0x200
-#define PCIE_DMA_WR_CTRL_HI		0x204
-#define PCIE_DMA_WR_XFERSIZE		0x208
-#define PCIE_DMA_WR_SAR_PTR_LO		0x20c
-#define PCIE_DMA_WR_SAR_PTR_HI		0x210
-#define PCIE_DMA_WR_DAR_PTR_LO		0x214
-#define PCIE_DMA_WR_DAR_PTR_HI		0x218
-#define PCIE_DMA_WR_WEILO		0x18
-#define PCIE_DMA_WR_WEIHI		0x1c
-#define PCIE_DMA_WR_DOORBELL		0x10
-#define PCIE_DMA_WR_INT_STATUS		0x4c
-#define PCIE_DMA_WR_INT_MASK		0x54
-#define PCIE_DMA_WR_INT_CLEAR		0x58
-
-#define PCIE_DMA_RD_ENB			0x2c
-#define PCIE_DMA_RD_CTRL_LO		0x300
-#define PCIE_DMA_RD_CTRL_HI		0x304
-#define PCIE_DMA_RD_XFERSIZE		0x308
-#define PCIE_DMA_RD_SAR_PTR_LO		0x30c
-#define PCIE_DMA_RD_SAR_PTR_HI		0x310
-#define PCIE_DMA_RD_DAR_PTR_LO		0x314
-#define PCIE_DMA_RD_DAR_PTR_HI		0x318
-#define PCIE_DMA_RD_WEILO		0x38
-#define PCIE_DMA_RD_WEIHI		0x3c
-#define PCIE_DMA_RD_DOORBELL		0x30
-#define PCIE_DMA_RD_INT_STATUS		0xa0
-#define PCIE_DMA_RD_INT_MASK		0xa8
-#define PCIE_DMA_RD_INT_CLEAR		0xac
 
 #define PCIE_DMA_CHANEL_MAX_NUM		2
 
 struct pcie_dw_dmatest_dev {
 	struct dma_trx_obj *obj;
-	struct dw_pcie *pci;
 
 	bool irq_en;
 	struct completion rd_done[PCIE_DMA_CHANEL_MAX_NUM];
@@ -113,66 +83,22 @@
 	dev_info(s_dmatest_dev[test_dev].obj->dev, " is current test_dev\n");
 }
 
-static int rk_pcie_get_dma_status(struct dw_pcie *pci, u8 chn, enum dma_dir dir)
-{
-	union int_status status;
-	union int_clear clears;
-	int ret = 0;
-
-	dev_dbg(pci->dev, "%s %x %x\n", __func__, dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS),
-		dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS));
-
-	if (dir == DMA_TO_BUS) {
-		status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_STATUS);
-		if (status.donesta & BIT(chn)) {
-			clears.doneclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword);
-			ret = 1;
-		}
-
-		if (status.abortsta & BIT(chn)) {
-			dev_err(pci->dev, "%s, write abort\n", __func__);
-			clears.abortclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_WR_INT_CLEAR, clears.asdword);
-			ret = -1;
-		}
-	} else {
-		status.asdword = dw_pcie_readl_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_STATUS);
-
-		if (status.donesta & BIT(chn)) {
-			clears.doneclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword);
-			ret = 1;
-		}
-
-		if (status.abortsta & BIT(chn)) {
-			dev_err(pci->dev, "%s, read abort %x\n", __func__, status.asdword);
-			clears.abortclr = 0x1 << chn;
-			dw_pcie_writel_dbi(pci, PCIE_DMA_OFFSET + PCIE_DMA_RD_INT_CLEAR, clears.asdword);
-			ret = -1;
-		}
-	}
-
-	return ret;
-}
-
-static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dw_pcie *pci, struct dma_table *table)
+static int rk_pcie_dma_wait_for_finised(struct dma_trx_obj *obj, struct dma_table *table)
 {
 	int ret;
 
 	do {
-		ret = rk_pcie_get_dma_status(pci, table->chn, table->dir);
+		ret = obj->get_dma_status(obj, table->chn, table->dir);
 	} while (!ret);
 
 	return ret;
 }
 
-static int rk_pcie_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
-			       u32 local_paddr, u32 bus_paddr, u32 size)
+static int rk_pcie_ep_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				  u32 local_paddr, u32 bus_paddr, u32 size)
 {
 	struct dma_table *table;
 	struct dma_trx_obj *obj = dmatest_dev->obj;
-	struct dw_pcie *pci = dmatest_dev->pci;
 	int ret;
 
 	if (chn >= PCIE_DMA_CHANEL_MAX_NUM)
@@ -202,7 +128,7 @@
 		else if (ret == 0)
 			dev_err(obj->dev, "%s timed out\n", __func__);
 	} else {
-		ret = rk_pcie_dma_wait_for_finised(obj, pci, table);
+		ret = rk_pcie_dma_wait_for_finised(obj, table);
 	}
 	mutex_unlock(&dmatest_dev->rd_lock[chn]);
 
@@ -211,12 +137,11 @@
 	return ret;
 }
 
-static int rk_pcie_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
-			     u32 bus_paddr, u32 local_paddr, u32 size)
+static int rk_pcie_ep_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				u32 bus_paddr, u32 local_paddr, u32 size)
 {
 	struct dma_table *table;
 	struct dma_trx_obj *obj = dmatest_dev->obj;
-	struct dw_pcie *pci = dmatest_dev->pci;
 	int ret;
 
 	if (chn >= PCIE_DMA_CHANEL_MAX_NUM)
@@ -246,13 +171,25 @@
 		else if (ret == 0)
 			dev_err(obj->dev, "%s timed out\n", __func__);
 	} else {
-		ret = rk_pcie_dma_wait_for_finised(obj, pci, table);
+		ret = rk_pcie_dma_wait_for_finised(obj, table);
 	}
 	mutex_unlock(&dmatest_dev->wr_lock[chn]);
 
 	kfree(table);
 
 	return ret;
+}
+
+static int rk_pcie_rc_dma_frombus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				  u32 local_paddr, u32 bus_paddr, u32 size)
+{
+	return rk_pcie_ep_dma_tobus(dmatest_dev, chn, local_paddr, bus_paddr, size);
+}
+
+static int rk_pcie_rc_dma_tobus(struct pcie_dw_dmatest_dev *dmatest_dev, u32 chn,
+				u32 bus_paddr, u32 local_paddr, u32 size)
+{
+	return rk_pcie_ep_dma_frombus(dmatest_dev, chn, bus_paddr, local_paddr, size);
 }
 
 static int rk_pcie_dma_interrupt_handler_call_back(struct dma_trx_obj *obj, u32 chn, enum dma_dir dir)
@@ -270,23 +207,22 @@
 	return 0;
 }
 
-struct dma_trx_obj *pcie_dw_dmatest_register(struct dw_pcie *pci, bool irq_en)
+struct dma_trx_obj *pcie_dw_dmatest_register(struct device *dev, bool irq_en)
 {
 	struct dma_trx_obj *obj;
 	struct pcie_dw_dmatest_dev *dmatest_dev = &s_dmatest_dev[cur_dmatest_dev];
 	int i;
 
-	obj = devm_kzalloc(pci->dev, sizeof(struct dma_trx_obj), GFP_KERNEL);
+	obj = devm_kzalloc(dev, sizeof(struct dma_trx_obj), GFP_KERNEL);
 	if (!obj)
 		return ERR_PTR(-ENOMEM);
 
-	obj->dev = pci->dev;
+	obj->dev = dev;
 	obj->priv = dmatest_dev;
 	obj->cb = rk_pcie_dma_interrupt_handler_call_back;
 
 	/* Save for dmatest */
 	dmatest_dev->obj = obj;
-	dmatest_dev->pci = pci;
 	for (i = 0; i < PCIE_DMA_CHANEL_MAX_NUM; i++) {
 		init_completion(&dmatest_dev->rd_done[i]);
 		init_completion(&dmatest_dev->wr_done[i]);
@@ -323,13 +259,19 @@
 	start_time = ktime_get();
 	for (i = 0; i < loop; i++) {
 		if (rd_en) {
-			rk_pcie_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
+			if (is_rc)
+				rk_pcie_rc_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
+			else
+				rk_pcie_ep_dma_frombus(dmatest_dev, chn, local_paddr, bus_paddr, size);
 			dma_sync_single_for_cpu(obj->dev, local_paddr, size, DMA_FROM_DEVICE);
 		}
 
 		if (wr_en) {
 			dma_sync_single_for_device(obj->dev, local_paddr, size, DMA_TO_DEVICE);
-			rk_pcie_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
+			if (is_rc)
+				rk_pcie_rc_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
+			else
+				rk_pcie_ep_dma_tobus(dmatest_dev, chn, bus_paddr, local_paddr, size);
 		}
 	}
 	end_time = ktime_get();

--
Gitblit v1.6.2