linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] support gce on mt6779 platform
@ 2019-11-27  1:58 Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 00/14] " Dennis YC Hsieh
                   ` (14 more replies)
  0 siblings, 15 replies; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel

Support gce on mt6779 platform.

These patches depend on patch:
support gce on mt8183 platform
(https://patchwork.kernel.org/cover/11255147/)

Support gce function on mt6779 platform.
	dt-binding: gce: add gce header file for mt6779
	mailbox: cmdq: variablize address shift in platform
	mailbox: cmdq: support mt6779 gce platform definition
	arm64: dts: add gce node for mt6779

Refine driver to support stop hardware with safe callback.
	mailbox: mediatek: cmdq: clear task in channel before shutdown


Dennis YC Hsieh (14):
  dt-binding: gce: add gce header file for mt6779
  mailbox: cmdq: variablize address shift in platform
  mailbox: cmdq: support mt6779 gce platform definition
  mailbox: mediatek: cmdq: clear task in channel before shutdown
  arm64: dts: add gce node for mt6779
  soc: mediatek: cmdq: return send msg error code
  soc: mediatek: cmdq: add assign function
  soc: mediatek: cmdq: add write_s function
  soc: mediatek: cmdq: add read_s function
  soc: mediatek: cmdq: add write_s value function
  soc: mediatek: cmdq: export finalize function
  soc: mediatek: cmdq: add loop function
  soc: mediatek: cmdq: add wait no clear event function
  soc: mediatek: cmdq: add set event function

 .../devicetree/bindings/mailbox/mtk-gce.txt   |   8 +-
 arch/arm64/boot/dts/mediatek/mt6779.dtsi      |  10 +
 drivers/mailbox/mtk-cmdq-mailbox.c            |  85 ++++++-
 drivers/soc/mediatek/mtk-cmdq-helper.c        | 181 +++++++++++++-
 include/dt-bindings/gce/mt6779-gce.h          | 222 ++++++++++++++++++
 include/linux/mailbox/mtk-cmdq-mailbox.h      |   7 +
 include/linux/soc/mediatek/mtk-cmdq.h         |  87 +++++++
 7 files changed, 575 insertions(+), 25 deletions(-)
 create mode 100644 include/dt-bindings/gce/mt6779-gce.h

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PATCH v2 00/14] support gce on mt6779 platform
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 01/14] dt-binding: gce: add gce header file for mt6779 Dennis YC Hsieh
                   ` (13 subsequent siblings)
  14 siblings, 0 replies; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

*** BLURB HERE ***

Dennis YC Hsieh (14):
  dt-binding: gce: add gce header file for mt6779
  mailbox: cmdq: variablize address shift in platform
  mailbox: cmdq: support mt6779 gce platform definition
  mailbox: mediatek: cmdq: clear task in channel before shutdown
  arm64: dts: add gce node for mt6779
  soc: mediatek: cmdq: return send msg error code
  soc: mediatek: cmdq: add assign function
  soc: mediatek: cmdq: add write_s function
  soc: mediatek: cmdq: add read_s function
  soc: mediatek: cmdq: add write_s value function
  soc: mediatek: cmdq: export finalize function
  soc: mediatek: cmdq: add loop function
  soc: mediatek: cmdq: add wait no clear event function
  soc: mediatek: cmdq: add set event function

 .../devicetree/bindings/mailbox/mtk-gce.txt   |   8 +-
 arch/arm64/boot/dts/mediatek/mt6779.dtsi      |  10 +
 drivers/mailbox/mtk-cmdq-mailbox.c            |  85 ++++++-
 drivers/soc/mediatek/mtk-cmdq-helper.c        | 181 +++++++++++++-
 include/dt-bindings/gce/mt6779-gce.h          | 222 ++++++++++++++++++
 include/linux/mailbox/mtk-cmdq-mailbox.h      |   7 +
 include/linux/soc/mediatek/mtk-cmdq.h         |  87 +++++++
 7 files changed, 575 insertions(+), 25 deletions(-)
 create mode 100644 include/dt-bindings/gce/mt6779-gce.h

-- 
2.18.0

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [PATCH v2 01/14] dt-binding: gce: add gce header file for mt6779
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 00/14] " Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-05 20:37   ` Rob Herring
  2019-11-27  1:58 ` [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform Dennis YC Hsieh
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add documentation for the mt6779 gce.

Add gce header file defined the gce hardware event,
subsys number and constant for mt6779.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 .../devicetree/bindings/mailbox/mtk-gce.txt   |   8 +-
 include/dt-bindings/gce/mt6779-gce.h          | 222 ++++++++++++++++++
 2 files changed, 227 insertions(+), 3 deletions(-)
 create mode 100644 include/dt-bindings/gce/mt6779-gce.h

diff --git a/Documentation/devicetree/bindings/mailbox/mtk-gce.txt b/Documentation/devicetree/bindings/mailbox/mtk-gce.txt
index 7b13787ab13d..82c0a83fed09 100644
--- a/Documentation/devicetree/bindings/mailbox/mtk-gce.txt
+++ b/Documentation/devicetree/bindings/mailbox/mtk-gce.txt
@@ -9,7 +9,8 @@ CMDQ driver uses mailbox framework for communication. Please refer to
 mailbox.txt for generic information about mailbox device-tree bindings.
 
 Required properties:
-- compatible: can be "mediatek,mt8173-gce" or "mediatek,mt8183-gce"
+- compatible: can be "mediatek,mt8173-gce", "mediatek,mt8183-gce" or
+  "mediatek,mt6779-gce".
 - reg: Address range of the GCE unit
 - interrupts: The interrupt signal from the GCE block
 - clock: Clocks according to the common clock binding
@@ -36,8 +37,9 @@ Optional properties for a client device:
   start_offset: the start offset of register address that GCE can access.
   size: the total size of register address that GCE can access.
 
-Some vaules of properties are defined in 'dt-bindings/gce/mt8173-gce.h'
-or 'dt-binding/gce/mt8183-gce.h'. Such as sub-system ids, thread priority, event ids.
+Some vaules of properties are defined in 'dt-bindings/gce/mt8173-gce.h',
+'dt-binding/gce/mt8183-gce.h' or 'dt-bindings/gce/mt6779-gce.h'. Such as
+sub-system ids, thread priority, event ids.
 
 Example:
 
diff --git a/include/dt-bindings/gce/mt6779-gce.h b/include/dt-bindings/gce/mt6779-gce.h
new file mode 100644
index 000000000000..06101316ace4
--- /dev/null
+++ b/include/dt-bindings/gce/mt6779-gce.h
@@ -0,0 +1,222 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2019 MediaTek Inc.
+ * Author: Dennis-YC Hsieh <dennis-yc.hsieh@mediatek.com>
+ */
+
+#ifndef _DT_BINDINGS_GCE_MT6779_H
+#define _DT_BINDINGS_GCE_MT6779_H
+
+#define CMDQ_NO_TIMEOUT		0xffffffff
+
+/* GCE HW thread priority */
+#define CMDQ_THR_PRIO_LOWEST	0
+#define CMDQ_THR_PRIO_1		1
+#define CMDQ_THR_PRIO_2		2
+#define CMDQ_THR_PRIO_3		3
+#define CMDQ_THR_PRIO_4		4
+#define CMDQ_THR_PRIO_5		5
+#define CMDQ_THR_PRIO_6		6
+#define CMDQ_THR_PRIO_HIGHEST	7
+
+/* GCE subsys table */
+#define SUBSYS_1300XXXX		0
+#define SUBSYS_1400XXXX		1
+#define SUBSYS_1401XXXX		2
+#define SUBSYS_1402XXXX		3
+#define SUBSYS_1502XXXX		4
+#define SUBSYS_1880XXXX		5
+#define SUBSYS_1881XXXX		6
+#define SUBSYS_1882XXXX		7
+#define SUBSYS_1883XXXX		8
+#define SUBSYS_1884XXXX		9
+#define SUBSYS_1000XXXX		10
+#define SUBSYS_1001XXXX		11
+#define SUBSYS_1002XXXX		12
+#define SUBSYS_1003XXXX		13
+#define SUBSYS_1004XXXX		14
+#define SUBSYS_1005XXXX		15
+#define SUBSYS_1020XXXX		16
+#define SUBSYS_1028XXXX		17
+#define SUBSYS_1700XXXX		18
+#define SUBSYS_1701XXXX		19
+#define SUBSYS_1702XXXX		20
+#define SUBSYS_1703XXXX		21
+#define SUBSYS_1800XXXX		22
+#define SUBSYS_1801XXXX		23
+#define SUBSYS_1802XXXX		24
+#define SUBSYS_1804XXXX		25
+#define SUBSYS_1805XXXX		26
+#define SUBSYS_1808XXXX		27
+#define SUBSYS_180aXXXX		28
+#define SUBSYS_180bXXXX		29
+#define CMDQ_SUBSYS_OFF		32
+
+/* GCE hardware events */
+#define CMDQ_EVENT_DISP_RDMA0_SOF		0
+#define CMDQ_EVENT_DISP_RDMA1_SOF		1
+#define CMDQ_EVENT_MDP_RDMA0_SOF		2
+#define CMDQ_EVENT_MDP_RDMA1_SOF		3
+#define CMDQ_EVENT_MDP_RSZ0_SOF			4
+#define CMDQ_EVENT_MDP_RSZ1_SOF			5
+#define CMDQ_EVENT_MDP_TDSHP_SOF		6
+#define CMDQ_EVENT_MDP_WROT0_SOF		7
+#define CMDQ_EVENT_MDP_WROT1_SOF		8
+#define CMDQ_EVENT_DISP_OVL0_SOF		9
+#define CMDQ_EVENT_DISP_2L_OVL0_SOF		10
+#define CMDQ_EVENT_DISP_2L_OVL1_SOF		11
+#define CMDQ_EVENT_DISP_WDMA0_SOF		12
+#define CMDQ_EVENT_DISP_COLOR0_SOF		13
+#define CMDQ_EVENT_DISP_CCORR0_SOF		14
+#define CMDQ_EVENT_DISP_AAL0_SOF		15
+#define CMDQ_EVENT_DISP_GAMMA0_SOF		16
+#define CMDQ_EVENT_DISP_DITHER0_SOF		17
+#define CMDQ_EVENT_DISP_PWM0_SOF		18
+#define CMDQ_EVENT_DISP_DSI0_SOF		19
+#define CMDQ_EVENT_DISP_DPI0_SOF		20
+#define CMDQ_EVENT_DISP_POSTMASK0_SOF		21
+#define CMDQ_EVENT_DISP_RSZ0_SOF		22
+#define CMDQ_EVENT_MDP_AAL_SOF			23
+#define CMDQ_EVENT_MDP_CCORR_SOF		24
+#define CMDQ_EVENT_DISP_DBI0_SOF		25
+#define CMDQ_EVENT_ISP_RELAY_SOF		26
+#define CMDQ_EVENT_IPU_RELAY_SOF		27
+#define CMDQ_EVENT_DISP_RDMA0_EOF		28
+#define CMDQ_EVENT_DISP_RDMA1_EOF		29
+#define CMDQ_EVENT_MDP_RDMA0_EOF		30
+#define CMDQ_EVENT_MDP_RDMA1_EOF		31
+#define CMDQ_EVENT_MDP_RSZ0_EOF			32
+#define CMDQ_EVENT_MDP_RSZ1_EOF			33
+#define CMDQ_EVENT_MDP_TDSHP_EOF		34
+#define CMDQ_EVENT_MDP_WROT0_W_EOF		35
+#define CMDQ_EVENT_MDP_WROT1_W_EOF		36
+#define CMDQ_EVENT_DISP_OVL0_EOF		37
+#define CMDQ_EVENT_DISP_2L_OVL0_EOF		38
+#define CMDQ_EVENT_DISP_2L_OVL1_EOF		39
+#define CMDQ_EVENT_DISP_WDMA0_EOF		40
+#define CMDQ_EVENT_DISP_COLOR0_EOF		41
+#define CMDQ_EVENT_DISP_CCORR0_EOF		42
+#define CMDQ_EVENT_DISP_AAL0_EOF		43
+#define CMDQ_EVENT_DISP_GAMMA0_EOF		44
+#define CMDQ_EVENT_DISP_DITHER0_EOF		45
+#define CMDQ_EVENT_DISP_DSI0_EOF		46
+#define CMDQ_EVENT_DISP_DPI0_EOF		47
+#define CMDQ_EVENT_DISP_RSZ0_EOF		49
+#define CMDQ_EVENT_MDP_AAL_FRAME_DONE		50
+#define CMDQ_EVENT_MDP_CCORR_FRAME_DONE		51
+#define CMDQ_EVENT_DISP_POSTMASK0_FRAME_DONE	52
+#define CMDQ_EVENT_MUTEX0_STREAM_EOF		130
+#define CMDQ_EVENT_MUTEX1_STREAM_EOF		131
+#define CMDQ_EVENT_MUTEX2_STREAM_EOF		132
+#define CMDQ_EVENT_MUTEX3_STREAM_EOF		133
+#define CMDQ_EVENT_MUTEX4_STREAM_EOF		134
+#define CMDQ_EVENT_MUTEX5_STREAM_EOF		135
+#define CMDQ_EVENT_MUTEX6_STREAM_EOF		136
+#define CMDQ_EVENT_MUTEX7_STREAM_EOF		137
+#define CMDQ_EVENT_MUTEX8_STREAM_EOF		138
+#define CMDQ_EVENT_MUTEX9_STREAM_EOF		139
+#define CMDQ_EVENT_MUTEX10_STREAM_EOF		140
+#define CMDQ_EVENT_MUTEX11_STREAM_EOF		141
+#define CMDQ_EVENT_DISP_RDMA0_UNDERRUN		142
+#define CMDQ_EVENT_DISP_RDMA1_UNDERRUN		143
+#define CMDQ_EVENT_DISP_RDMA2_UNDERRUN		144
+#define CMDQ_EVENT_DISP_RDMA3_UNDERRUN		145
+#define CMDQ_EVENT_DSI0_TE			146
+#define CMDQ_EVENT_DSI0_IRQ_EVENT		147
+#define CMDQ_EVENT_DSI0_DONE_EVENT		148
+#define CMDQ_EVENT_DISP_POSTMASK0_RST_DONE	150
+#define CMDQ_EVENT_DISP_WDMA0_RST_DONE		151
+#define CMDQ_EVENT_MDP_WROT0_RST_DONE		153
+#define CMDQ_EVENT_MDP_RDMA0_RST_DONE		154
+#define CMDQ_EVENT_DISP_OVL0_RST_DONE		155
+#define CMDQ_EVENT_DISP_OVL0_2L_RST_DONE	156
+#define CMDQ_EVENT_DISP_OVL1_2L_RST_DONE	157
+#define CMDQ_EVENT_DIP_CQ_THREAD0_EOF		257
+#define CMDQ_EVENT_DIP_CQ_THREAD1_EOF		258
+#define CMDQ_EVENT_DIP_CQ_THREAD2_EOF		259
+#define CMDQ_EVENT_DIP_CQ_THREAD3_EOF		260
+#define CMDQ_EVENT_DIP_CQ_THREAD4_EOF		261
+#define CMDQ_EVENT_DIP_CQ_THREAD5_EOF		262
+#define CMDQ_EVENT_DIP_CQ_THREAD6_EOF		263
+#define CMDQ_EVENT_DIP_CQ_THREAD7_EOF		264
+#define CMDQ_EVENT_DIP_CQ_THREAD8_EOF		265
+#define CMDQ_EVENT_DIP_CQ_THREAD9_EOF		266
+#define CMDQ_EVENT_DIP_CQ_THREAD10_EOF		267
+#define CMDQ_EVENT_DIP_CQ_THREAD11_EOF		268
+#define CMDQ_EVENT_DIP_CQ_THREAD12_EOF		269
+#define CMDQ_EVENT_DIP_CQ_THREAD13_EOF		270
+#define CMDQ_EVENT_DIP_CQ_THREAD14_EOF		271
+#define CMDQ_EVENT_DIP_CQ_THREAD15_EOF		272
+#define CMDQ_EVENT_DIP_CQ_THREAD16_EOF		273
+#define CMDQ_EVENT_DIP_CQ_THREAD17_EOF		274
+#define CMDQ_EVENT_DIP_CQ_THREAD18_EOF		275
+#define CMDQ_EVENT_DIP_DMA_ERR_EVENT		276
+#define CMDQ_EVENT_AMD_FRAME_DONE		277
+#define CMDQ_EVENT_MFB_DONE			278
+#define CMDQ_EVENT_WPE_A_EOF			279
+#define CMDQ_EVENT_VENC_EOF			289
+#define CMDQ_EVENT_VENC_CMDQ_PAUSE_DONE		290
+#define CMDQ_EVENT_JPEG_ENC_EOF			291
+#define CMDQ_EVENT_VENC_MB_DONE			292
+#define CMDQ_EVENT_VENC_128BYTE_CNT_DONE	293
+#define CMDQ_EVENT_ISP_FRAME_DONE_A		321
+#define CMDQ_EVENT_ISP_FRAME_DONE_B		322
+#define CMDQ_EVENT_ISP_FRAME_DONE_C		323
+#define CMDQ_EVENT_ISP_CAMSV_0_PASS1_DONE	324
+#define CMDQ_EVENT_ISP_CAMSV_0_2_PASS1_DONE	325
+#define CMDQ_EVENT_ISP_CAMSV_1_PASS1_DONE	326
+#define CMDQ_EVENT_ISP_CAMSV_2_PASS1_DONE	327
+#define CMDQ_EVENT_ISP_CAMSV_3_PASS1_DONE	328
+#define CMDQ_EVENT_ISP_TSF_DONE			329
+#define CMDQ_EVENT_SENINF_0_FIFO_FULL		330
+#define CMDQ_EVENT_SENINF_1_FIFO_FULL		331
+#define CMDQ_EVENT_SENINF_2_FIFO_FULL		332
+#define CMDQ_EVENT_SENINF_3_FIFO_FULL		333
+#define CMDQ_EVENT_SENINF_4_FIFO_FULL		334
+#define CMDQ_EVENT_SENINF_5_FIFO_FULL		335
+#define CMDQ_EVENT_SENINF_6_FIFO_FULL		336
+#define CMDQ_EVENT_SENINF_7_FIFO_FULL		337
+#define CMDQ_EVENT_TG_OVRUN_A_INT_DLY		338
+#define CMDQ_EVENT_TG_OVRUN_B_INT_DLY		339
+#define CMDQ_EVENT_TG_OVRUN_C_INT		340
+#define CMDQ_EVENT_TG_GRABERR_A_INT_DLY		341
+#define CMDQ_EVENT_TG_GRABERR_B_INT_DLY		342
+#define CMDQ_EVENT_TG_GRABERR_C_INT		343
+#define CMDQ_EVENT_CQ_VR_SNAP_A_INT_DLY		344
+#define CMDQ_EVENT_CQ_VR_SNAP_B_INT_DLY		345
+#define CMDQ_EVENT_CQ_VR_SNAP_C_INT		346
+#define CMDQ_EVENT_DMA_R1_ERROR_A_INT_DLY	347
+#define CMDQ_EVENT_DMA_R1_ERROR_B_INT_DLY	348
+#define CMDQ_EVENT_DMA_R1_ERROR_C_INT		349
+#define CMDQ_EVENT_APU_GCE_CORE0_EVENT_0	353
+#define CMDQ_EVENT_APU_GCE_CORE0_EVENT_1	354
+#define CMDQ_EVENT_APU_GCE_CORE0_EVENT_2	355
+#define CMDQ_EVENT_APU_GCE_CORE0_EVENT_3	356
+#define CMDQ_EVENT_APU_GCE_CORE1_EVENT_0	385
+#define CMDQ_EVENT_APU_GCE_CORE1_EVENT_1	386
+#define CMDQ_EVENT_APU_GCE_CORE1_EVENT_2	387
+#define CMDQ_EVENT_APU_GCE_CORE1_EVENT_3	388
+#define CMDQ_EVENT_VDEC_EVENT_0			416
+#define CMDQ_EVENT_VDEC_EVENT_1			417
+#define CMDQ_EVENT_VDEC_EVENT_2			418
+#define CMDQ_EVENT_VDEC_EVENT_3			419
+#define CMDQ_EVENT_VDEC_EVENT_4			420
+#define CMDQ_EVENT_VDEC_EVENT_5			421
+#define CMDQ_EVENT_VDEC_EVENT_6			422
+#define CMDQ_EVENT_VDEC_EVENT_7			423
+#define CMDQ_EVENT_VDEC_EVENT_8			424
+#define CMDQ_EVENT_VDEC_EVENT_9			425
+#define CMDQ_EVENT_VDEC_EVENT_10		426
+#define CMDQ_EVENT_VDEC_EVENT_11		427
+#define CMDQ_EVENT_VDEC_EVENT_12		428
+#define CMDQ_EVENT_VDEC_EVENT_13		429
+#define CMDQ_EVENT_VDEC_EVENT_14		430
+#define CMDQ_EVENT_VDEC_EVENT_15		431
+#define CMDQ_EVENT_FDVT_DONE			449
+#define CMDQ_EVENT_FE_DONE			450
+#define CMDQ_EVENT_RSC_EOF			451
+#define CMDQ_EVENT_DVS_DONE_ASYNC_SHOT		452
+#define CMDQ_EVENT_DVP_DONE_ASYNC_SHOT		453
+#define CMDQ_EVENT_DSI0_TE_INFRA		898
+
+#endif
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 00/14] " Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 01/14] dt-binding: gce: add gce header file for mt6779 Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  1:55   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 03/14] mailbox: cmdq: support mt6779 gce platform definition Dennis YC Hsieh
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Some gce hardware shift pc and end address in register to support
large dram addressing.
Implement gce address shift when write or read pc and end register.
And add shift bit in platform definition.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/mailbox/mtk-cmdq-mailbox.c       | 57 ++++++++++++++++++------
 drivers/soc/mediatek/mtk-cmdq-helper.c   |  3 +-
 include/linux/mailbox/mtk-cmdq-mailbox.h |  2 +
 3 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
index 9a6ce9f5a7db..d5536563fce1 100644
--- a/drivers/mailbox/mtk-cmdq-mailbox.c
+++ b/drivers/mailbox/mtk-cmdq-mailbox.c
@@ -76,8 +76,21 @@ struct cmdq {
 	struct cmdq_thread	*thread;
 	struct clk		*clock;
 	bool			suspended;
+	u8			shift_pa;
 };
 
+struct gce_plat {
+	u32 thread_nr;
+	u8 shift;
+};
+
+u8 cmdq_mbox_shift(struct mbox_chan *chan)
+{
+	struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox);
+
+	return cmdq->shift_pa;
+}
+
 static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread)
 {
 	u32 status;
@@ -176,6 +189,7 @@ static void cmdq_task_remove_wfe(struct cmdq_task *task)
 {
 	struct device *dev = task->cmdq->mbox.dev;
 	u64 *base = task->pkt->va_base;
+	struct cmdq *cmdq = task->cmdq;
 	int i;
 
 	dma_sync_single_for_cpu(dev, task->pa_base, task->pkt->cmd_buf_size,
@@ -183,7 +197,7 @@ static void cmdq_task_remove_wfe(struct cmdq_task *task)
 	for (i = 0; i < CMDQ_NUM_CMD(task->pkt); i++)
 		if (cmdq_command_is_wfe(base[i]))
 			base[i] = (u64)CMDQ_JUMP_BY_OFFSET << 32 |
-				  CMDQ_JUMP_PASS;
+				  CMDQ_JUMP_PASS >> cmdq->shift_pa;
 	dma_sync_single_for_device(dev, task->pa_base, task->pkt->cmd_buf_size,
 				   DMA_TO_DEVICE);
 }
@@ -221,13 +235,15 @@ static void cmdq_task_handle_error(struct cmdq_task *task)
 {
 	struct cmdq_thread *thread = task->thread;
 	struct cmdq_task *next_task;
+	struct cmdq *cmdq = task->cmdq;
 
 	dev_err(task->cmdq->mbox.dev, "task 0x%p error\n", task);
 	WARN_ON(cmdq_thread_suspend(task->cmdq, thread) < 0);
 	next_task = list_first_entry_or_null(&thread->task_busy_list,
 			struct cmdq_task, list_entry);
 	if (next_task)
-		writel(next_task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
+		writel(next_task->pa_base >> cmdq->shift_pa,
+		       thread->base + CMDQ_THR_CURR_ADDR);
 	cmdq_thread_resume(thread);
 }
 
@@ -257,7 +273,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
 	else
 		return;
 
-	curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR);
+	curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) << cmdq->shift_pa;
 
 	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
 				 list_entry) {
@@ -373,16 +389,20 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
 		WARN_ON(clk_enable(cmdq->clock) < 0);
 		WARN_ON(cmdq_thread_reset(cmdq, thread) < 0);
 
-		writel(task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
-		writel(task->pa_base + pkt->cmd_buf_size,
+		writel(task->pa_base >> cmdq->shift_pa,
+		       thread->base + CMDQ_THR_CURR_ADDR);
+		writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa,
 		       thread->base + CMDQ_THR_END_ADDR);
+
 		writel(thread->priority, thread->base + CMDQ_THR_PRIORITY);
 		writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE);
 		writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK);
 	} else {
 		WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
-		curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR);
-		end_pa = readl(thread->base + CMDQ_THR_END_ADDR);
+		curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) <<
+			cmdq->shift_pa;
+		end_pa = readl(thread->base + CMDQ_THR_END_ADDR) <<
+			cmdq->shift_pa;
 
 		/*
 		 * Atomic execution should remove the following wfe, i.e. only
@@ -395,7 +415,7 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
 				cmdq_thread_wait_end(thread, end_pa);
 				WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
 				/* set to this task directly */
-				writel(task->pa_base,
+				writel(task->pa_base >> cmdq->shift_pa,
 				       thread->base + CMDQ_THR_CURR_ADDR);
 			} else {
 				cmdq_task_insert_into_thread(task);
@@ -407,14 +427,14 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
 			if (curr_pa == end_pa - CMDQ_INST_SIZE ||
 			    curr_pa == end_pa) {
 				/* set to this task directly */
-				writel(task->pa_base,
+				writel(task->pa_base >> cmdq->shift_pa,
 				       thread->base + CMDQ_THR_CURR_ADDR);
 			} else {
 				cmdq_task_insert_into_thread(task);
 				smp_mb(); /* modify jump before enable thread */
 			}
 		}
-		writel(task->pa_base + pkt->cmd_buf_size,
+		writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa,
 		       thread->base + CMDQ_THR_END_ADDR);
 		cmdq_thread_resume(thread);
 	}
@@ -461,6 +481,7 @@ static int cmdq_probe(struct platform_device *pdev)
 	struct resource *res;
 	struct cmdq *cmdq;
 	int err, i;
+	struct gce_plat *plat_data;
 
 	cmdq = devm_kzalloc(dev, sizeof(*cmdq), GFP_KERNEL);
 	if (!cmdq)
@@ -479,7 +500,14 @@ static int cmdq_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
-	cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev);
+	plat_data = (struct gce_plat *)of_device_get_match_data(dev);
+	if (!plat_data) {
+		dev_err(dev, "failed to get match data\n");
+		return -EINVAL;
+	}
+
+	cmdq->thread_nr = plat_data->thread_nr;
+	cmdq->shift_pa = plat_data->shift;
 	cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0);
 	err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED,
 			       "mtk_cmdq", cmdq);
@@ -542,9 +570,12 @@ static const struct dev_pm_ops cmdq_pm_ops = {
 	.resume = cmdq_resume,
 };
 
+static const struct gce_plat gce_plat_v2 = {.thread_nr = 16, .shift = 0};
+static const struct gce_plat gce_plat_v3 = {.thread_nr = 24, .shift = 0};
+
 static const struct of_device_id cmdq_of_ids[] = {
-	{.compatible = "mediatek,mt8173-gce", .data = (void *)16},
-	{.compatible = "mediatek,mt8183-gce", .data = (void *)24},
+	{.compatible = "mediatek,mt8173-gce", .data = (void *)&gce_plat_v2},
+	{.compatible = "mediatek,mt8183-gce", .data = (void *)&gce_plat_v3},
 	{}
 };
 
diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 9add0fd5fa6c..274f6f311d05 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -281,6 +281,7 @@ EXPORT_SYMBOL(cmdq_pkt_poll_mask);
 
 static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 {
+	struct cmdq_client *cl = pkt->cl;
 	struct cmdq_instruction inst = { {0} };
 	int err;
 
@@ -293,7 +294,7 @@ static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 
 	/* JUMP to end */
 	inst.op = CMDQ_CODE_JUMP;
-	inst.value = CMDQ_JUMP_PASS;
+	inst.value = CMDQ_JUMP_PASS >> cmdq_mbox_shift(cl->chan);
 	err = cmdq_pkt_append_command(pkt, inst);
 
 	return err;
diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
index a4dc45fbec0a..dfe5b2eb85cc 100644
--- a/include/linux/mailbox/mtk-cmdq-mailbox.h
+++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
@@ -88,4 +88,6 @@ struct cmdq_pkt {
 	void			*cl;
 };
 
+u8 cmdq_mbox_shift(struct mbox_chan *chan);
+
 #endif /* __MTK_CMDQ_MAILBOX_H__ */
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 03/14] mailbox: cmdq: support mt6779 gce platform definition
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (2 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  2:04   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown Dennis YC Hsieh
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add gce v4 hardware support with different thread number and shift.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/mailbox/mtk-cmdq-mailbox.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
index d5536563fce1..fd519b6f518b 100644
--- a/drivers/mailbox/mtk-cmdq-mailbox.c
+++ b/drivers/mailbox/mtk-cmdq-mailbox.c
@@ -572,10 +572,12 @@ static const struct dev_pm_ops cmdq_pm_ops = {
 
 static const struct gce_plat gce_plat_v2 = {.thread_nr = 16, .shift = 0};
 static const struct gce_plat gce_plat_v3 = {.thread_nr = 24, .shift = 0};
+static const struct gce_plat gce_plat_v4 = {.thread_nr = 24, .shift = 3};
 
 static const struct of_device_id cmdq_of_ids[] = {
 	{.compatible = "mediatek,mt8173-gce", .data = (void *)&gce_plat_v2},
 	{.compatible = "mediatek,mt8183-gce", .data = (void *)&gce_plat_v3},
+	{.compatible = "mediatek,mt6779-gce", .data = (void *)&gce_plat_v4},
 	{}
 };
 
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (3 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 03/14] mailbox: cmdq: support mt6779 gce platform definition Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  2:49   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 05/14] arm64: dts: add gce node for mt6779 Dennis YC Hsieh
                   ` (9 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Do success callback in channel when shutdown. For those task not finish,
callback with error code thus client has chance to cleanup or reset.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
index fd519b6f518b..c12a768d1175 100644
--- a/drivers/mailbox/mtk-cmdq-mailbox.c
+++ b/drivers/mailbox/mtk-cmdq-mailbox.c
@@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
 
 static void cmdq_mbox_shutdown(struct mbox_chan *chan)
 {
+	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
+	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
+	struct cmdq_task *task, *tmp;
+	unsigned long flags;
+
+	spin_lock_irqsave(&thread->chan->lock, flags);
+	if (list_empty(&thread->task_busy_list))
+		goto done;
+
+	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
+
+	/* make sure executed tasks have success callback */
+	cmdq_thread_irq_handler(cmdq, thread);
+	if (list_empty(&thread->task_busy_list))
+		goto done;
+
+	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
+				 list_entry) {
+		cmdq_task_exec_done(task, -ECONNABORTED);
+		kfree(task);
+	}
+
+	cmdq_thread_disable(cmdq, thread);
+	clk_disable(cmdq->clock);
+done:
+	spin_unlock_irqrestore(&thread->chan->lock, flags);
 }
 
 static const struct mbox_chan_ops cmdq_mbox_chan_ops = {
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 05/14] arm64: dts: add gce node for mt6779
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (4 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-06  4:05   ` Bibby Hsieh
  2019-11-27  1:58 ` [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code Dennis YC Hsieh
                   ` (8 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

add gce device node for mt6779

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 arch/arm64/boot/dts/mediatek/mt6779.dtsi | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt6779.dtsi b/arch/arm64/boot/dts/mediatek/mt6779.dtsi
index daa25b75788f..10d59385f4a1 100644
--- a/arch/arm64/boot/dts/mediatek/mt6779.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt6779.dtsi
@@ -8,6 +8,7 @@
 #include <dt-bindings/clock/mt6779-clk.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/gce/mt6779-gce.h>
 
 / {
 	compatible = "mediatek,mt6779";
@@ -159,6 +160,15 @@
 			#clock-cells = <1>;
 		};
 
+		gce: mailbox@10228000 {
+			compatible = "mediatek,mt6779-gce";
+			reg = <0 0x10228000 0 0x4000>;
+			interrupts = <GIC_SPI 185 IRQ_TYPE_LEVEL_LOW>;
+			#mbox-cells = <3>;
+			clocks = <&infracfg_ao CLK_INFRA_GCE>;
+			clock-names = "gce";
+		};
+
 		uart0: serial@11002000 {
 			compatible = "mediatek,mt6779-uart",
 				     "mediatek,mt6577-uart";
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (5 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 05/14] arm64: dts: add gce node for mt6779 Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-06  4:02   ` Bibby Hsieh
  2019-11-27  1:58 ` [PATCH v2 07/14] soc: mediatek: cmdq: add assign function Dennis YC Hsieh
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Return error code to client if send message fail,
so that client has chance to error handling.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 274f6f311d05..8421b4090304 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -353,11 +353,11 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
 		spin_unlock_irqrestore(&client->lock, flags);
 	}
 
-	mbox_send_message(client->chan, pkt);
+	err = mbox_send_message(client->chan, pkt);
 	/* We can send next packet immediately, so just call txdone. */
 	mbox_client_txdone(client->chan, 0);
 
-	return 0;
+	return err;
 }
 EXPORT_SYMBOL(cmdq_pkt_flush_async);
 
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 07/14] soc: mediatek: cmdq: add assign function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (6 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  3:24   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function Dennis YC Hsieh
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add assign function in cmdq helper which assign constant value into
internal register by index.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c   | 24 +++++++++++++++++++++++-
 include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
 include/linux/soc/mediatek/mtk-cmdq.h    | 18 ++++++++++++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 8421b4090304..9cc234f08ec5 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -14,6 +14,7 @@
 #define CMDQ_EOC_IRQ_EN		BIT(0)
 #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
 				<< 32 | CMDQ_EOC_IRQ_EN)
+#define CMDQ_REG_TYPE		1
 
 struct cmdq_instruction {
 	union {
@@ -23,8 +24,17 @@ struct cmdq_instruction {
 	union {
 		u16 offset;
 		u16 event;
+		u16 reg_dst;
+	};
+	union {
+		u8 subsys;
+		struct {
+			u8 sop:5;
+			u8 arg_c_t:1;
+			u8 arg_b_t:1;
+			u8 dst_t:1;
+		};
 	};
-	u8 subsys;
 	u8 op;
 };
 
@@ -279,6 +289,18 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
 }
 EXPORT_SYMBOL(cmdq_pkt_poll_mask);
 
+int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
+{
+	struct cmdq_instruction inst = { {0} };
+
+	inst.op = CMDQ_CODE_LOGIC;
+	inst.dst_t = CMDQ_REG_TYPE;
+	inst.reg_dst = reg_idx;
+	inst.value = value;
+	return cmdq_pkt_append_command(pkt, inst);
+}
+EXPORT_SYMBOL(cmdq_pkt_assign);
+
 static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 {
 	struct cmdq_client *cl = pkt->cl;
diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
index dfe5b2eb85cc..121c3bb6d3de 100644
--- a/include/linux/mailbox/mtk-cmdq-mailbox.h
+++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
@@ -59,6 +59,7 @@ enum cmdq_code {
 	CMDQ_CODE_JUMP = 0x10,
 	CMDQ_CODE_WFE = 0x20,
 	CMDQ_CODE_EOC = 0x40,
+	CMDQ_CODE_LOGIC = 0xa0,
 };
 
 enum cmdq_cb_status {
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index a74c1d5acdf3..c66b3a0da2a2 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -12,6 +12,10 @@
 #include <linux/timer.h>
 
 #define CMDQ_NO_TIMEOUT		0xffffffffu
+#define CMDQ_SPR_TEMP		0
+#define CMDQ_SPR1		1
+#define CMDQ_SPR2		2
+#define CMDQ_SPR3		3
 
 struct cmdq_pkt;
 
@@ -152,6 +156,20 @@ int cmdq_pkt_poll(struct cmdq_pkt *pkt, u8 subsys,
  */
 int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
 		       u16 offset, u32 value, u32 mask);
+
+/**
+ * cmdq_pkt_assign() - Append logic assign command to the CMDQ packet, ask GCE
+ *		       to execute an instruction that set a constant value into
+ *		       internal register and use as value, mask or address in
+ *		       read/write instruction.
+ * @pkt:	the CMDQ packet
+ * @reg_idx:	the CMDQ internal register ID
+ * @value:	the specified value
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
+
 /**
  * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
  *                          packet and call back at the end of done packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (7 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 07/14] soc: mediatek: cmdq: add assign function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  5:18   ` CK Hu
  2019-12-10  7:35   ` Bibby Hsieh
  2019-11-27  1:58 ` [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function Dennis YC Hsieh
                   ` (5 subsequent siblings)
  14 siblings, 2 replies; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

add write_s function in cmdq helper functions which
writes value contains in internal register to address
with large dma access support.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c   | 40 ++++++++++++++++++++++++
 include/linux/mailbox/mtk-cmdq-mailbox.h |  2 ++
 include/linux/soc/mediatek/mtk-cmdq.h    | 12 +++++++
 3 files changed, 54 insertions(+)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 9cc234f08ec5..2edbc0954d97 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -15,11 +15,18 @@
 #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
 				<< 32 | CMDQ_EOC_IRQ_EN)
 #define CMDQ_REG_TYPE		1
+#define CMDQ_ADDR_HIGH(addr)	((u32)(((addr) >> 16) & GENMASK(31, 0)))
+#define CMDQ_ADDR_LOW_BIT	BIT(1)
+#define CMDQ_ADDR_LOW(addr)	((u16)(addr) | CMDQ_ADDR_LOW_BIT)
 
 struct cmdq_instruction {
 	union {
 		u32 value;
 		u32 mask;
+		struct {
+			u16 arg_c;
+			u16 arg_b;
+		};
 	};
 	union {
 		u16 offset;
@@ -224,6 +231,39 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
 }
 EXPORT_SYMBOL(cmdq_pkt_write_mask);
 
+int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
+		     u32 mask)
+{
+	struct cmdq_instruction inst = { {0} };
+	const u16 dst_reg_idx = CMDQ_SPR_TEMP;
+	int err;
+
+	if (mask != U32_MAX) {
+		inst.op = CMDQ_CODE_MASK;
+		inst.mask = ~mask;
+		err = cmdq_pkt_append_command(pkt, inst);
+		if (err < 0)
+			return err;
+
+		inst.mask = 0;
+		inst.op = CMDQ_CODE_WRITE_S_MASK;
+	} else {
+		inst.op = CMDQ_CODE_WRITE_S;
+	}
+
+	err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(addr));
+	if (err < 0)
+		return err;
+
+	inst.arg_b_t = CMDQ_REG_TYPE;
+	inst.sop = dst_reg_idx;
+	inst.offset = CMDQ_ADDR_LOW(addr);
+	inst.arg_b = reg_idx;
+
+	return cmdq_pkt_append_command(pkt, inst);
+}
+EXPORT_SYMBOL(cmdq_pkt_write_s);
+
 int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
 {
 	struct cmdq_instruction inst = { {0} };
diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
index 121c3bb6d3de..8ef87e1bd03b 100644
--- a/include/linux/mailbox/mtk-cmdq-mailbox.h
+++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
@@ -59,6 +59,8 @@ enum cmdq_code {
 	CMDQ_CODE_JUMP = 0x10,
 	CMDQ_CODE_WFE = 0x20,
 	CMDQ_CODE_EOC = 0x40,
+	CMDQ_CODE_WRITE_S = 0x90,
+	CMDQ_CODE_WRITE_S_MASK = 0x91,
 	CMDQ_CODE_LOGIC = 0xa0,
 };
 
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index c66b3a0da2a2..56ff1970197c 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -106,6 +106,18 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
 int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
 			u16 offset, u32 value, u32 mask);
 
+/**
+ * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
+ * @pkt:	the CMDQ packet
+ * @addr:	the physical address of register or dma
+ * @reg_idx:	the CMDQ internal register ID which cache source value
+ * @mask:	the specified target register mask
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
+		     u32 mask);
+
 /**
  * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
  * @pkt:	the CMDQ packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (8 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  7:55   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 10/14] soc: mediatek: cmdq: add write_s value function Dennis YC Hsieh
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add read_s function in cmdq helper functions which support read value from
register or dma physical address into gce internal register.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c   | 20 ++++++++++++++++++++
 include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
 include/linux/soc/mediatek/mtk-cmdq.h    | 10 ++++++++++
 3 files changed, 31 insertions(+)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 2edbc0954d97..2cd693e34980 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -231,6 +231,26 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
 }
 EXPORT_SYMBOL(cmdq_pkt_write_mask);
 
+int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx)
+{
+	struct cmdq_instruction inst = { {0} };
+	int err;
+	const u16 src_reg_idx = CMDQ_SPR_TEMP;
+
+	err = cmdq_pkt_assign(pkt, src_reg_idx, CMDQ_ADDR_HIGH(addr));
+	if (err < 0)
+		return err;
+
+	inst.op = CMDQ_CODE_READ_S;
+	inst.dst_t = CMDQ_REG_TYPE;
+	inst.sop = src_reg_idx;
+	inst.reg_dst = reg_idx;
+	inst.arg_b = CMDQ_ADDR_LOW(addr);
+
+	return cmdq_pkt_append_command(pkt, inst);
+}
+EXPORT_SYMBOL(cmdq_pkt_read_s);
+
 int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
 		     u32 mask)
 {
diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
index 8ef87e1bd03b..3f6bc0dfd5da 100644
--- a/include/linux/mailbox/mtk-cmdq-mailbox.h
+++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
@@ -59,6 +59,7 @@ enum cmdq_code {
 	CMDQ_CODE_JUMP = 0x10,
 	CMDQ_CODE_WFE = 0x20,
 	CMDQ_CODE_EOC = 0x40,
+	CMDQ_CODE_READ_S = 0x80,
 	CMDQ_CODE_WRITE_S = 0x90,
 	CMDQ_CODE_WRITE_S_MASK = 0x91,
 	CMDQ_CODE_LOGIC = 0xa0,
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 56ff1970197c..bc28a41d7780 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -106,6 +106,16 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
 int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
 			u16 offset, u32 value, u32 mask);
 
+/**
+ * cmdq_pkt_read_s() - append read_s command to the CMDQ packet
+ * @pkt:	the CMDQ packet
+ * @addr:	the physical address of register or dma to read
+ * @reg_idx:	the CMDQ internal register ID to cache read data
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx);
+
 /**
  * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
  * @pkt:	the CMDQ packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 10/14] soc: mediatek: cmdq: add write_s value function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (9 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 11/14] soc: mediatek: cmdq: export finalize function Dennis YC Hsieh
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

add write_s function in cmdq helper functions which
writes a constant value to address with large dma
access support.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 31 ++++++++++++++++++++++++++
 include/linux/soc/mediatek/mtk-cmdq.h  | 12 ++++++++++
 2 files changed, 43 insertions(+)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 2cd693e34980..244b8528eb16 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -284,6 +284,37 @@ int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
 }
 EXPORT_SYMBOL(cmdq_pkt_write_s);
 
+int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, dma_addr_t addr,
+			   u32 value, u32 mask)
+{
+	struct cmdq_instruction inst = { {0} };
+	int err;
+	const u16 dst_reg_idx = CMDQ_SPR_TEMP;
+
+	err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(addr));
+	if (err < 0)
+		return err;
+
+	if (mask != U32_MAX) {
+		inst.op = CMDQ_CODE_MASK;
+		inst.mask = ~mask;
+		err = cmdq_pkt_append_command(pkt, inst);
+		if (err < 0)
+			return err;
+
+		inst.op = CMDQ_CODE_WRITE_S_MASK;
+	} else {
+		inst.op = CMDQ_CODE_WRITE_S;
+	}
+
+	inst.sop = dst_reg_idx;
+	inst.offset = CMDQ_ADDR_LOW(addr);
+	inst.value = value;
+
+	return cmdq_pkt_append_command(pkt, inst);
+}
+EXPORT_SYMBOL(cmdq_pkt_write_s_value);
+
 int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
 {
 	struct cmdq_instruction inst = { {0} };
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index bc28a41d7780..4bce240dbb56 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -128,6 +128,18 @@ int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx);
 int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
 		     u32 mask);
 
+/**
+ * cmdq_pkt_write_s() - append write_s command with mask to the CMDQ packet
+ * @pkt:	the CMDQ packet
+ * @addr:	the physical address of register or dma
+ * @value:	the specified target value
+ * @mask:	the specified target mask
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, dma_addr_t addr,
+			   u32 value, u32 mask);
+
 /**
  * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
  * @pkt:	the CMDQ packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 11/14] soc: mediatek: cmdq: export finalize function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (10 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 10/14] soc: mediatek: cmdq: add write_s value function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-10  7:50   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 12/14] soc: mediatek: cmdq: add loop function Dennis YC Hsieh
                   ` (2 subsequent siblings)
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Export finalize function to client which helps append eoc and jump
command to pkt.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 7 ++-----
 include/linux/soc/mediatek/mtk-cmdq.h  | 8 ++++++++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 244b8528eb16..38e0c13e1922 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -392,7 +392,7 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
 }
 EXPORT_SYMBOL(cmdq_pkt_assign);
 
-static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
+int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 {
 	struct cmdq_client *cl = pkt->cl;
 	struct cmdq_instruction inst = { {0} };
@@ -412,6 +412,7 @@ static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 
 	return err;
 }
+EXPORT_SYMBOL(cmdq_pkt_finalize);
 
 static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data)
 {
@@ -446,10 +447,6 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
 	unsigned long flags = 0;
 	struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
 
-	err = cmdq_pkt_finalize(pkt);
-	if (err < 0)
-		return err;
-
 	pkt->cb.cb = cb;
 	pkt->cb.data = data;
 	pkt->async_cb.cb = cmdq_pkt_flush_async_cb;
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 4bce240dbb56..998bc90f9da9 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -204,6 +204,14 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
  */
 int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
 
+/**
+ * cmdq_pkt_finalize() - Append EOC and jump command to pkt.
+ * @pkt:	the CMDQ packet
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
+
 /**
  * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
  *                          packet and call back at the end of done packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 12/14] soc: mediatek: cmdq: add loop function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (11 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 11/14] soc: mediatek: cmdq: export finalize function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-11  1:48   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function Dennis YC Hsieh
  2019-11-27  1:58 ` [PATCH v2 14/14] soc: mediatek: cmdq: add set " Dennis YC Hsieh
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add finalize loop function in cmdq helper functions which loop whole pkt
in gce hardware thread without cpu operation.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 22 ++++++++++++++++++++++
 include/linux/soc/mediatek/mtk-cmdq.h  |  8 ++++++++
 2 files changed, 30 insertions(+)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 38e0c13e1922..10a9b4481e58 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -414,6 +414,28 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
 }
 EXPORT_SYMBOL(cmdq_pkt_finalize);
 
+int cmdq_pkt_finalize_loop(struct cmdq_pkt *pkt)
+{
+	struct cmdq_client *cl = pkt->cl;
+	struct cmdq_instruction inst = { {0} };
+	int err;
+
+	/* insert EOC and generate IRQ for each command iteration */
+	inst.op = CMDQ_CODE_EOC;
+	err = cmdq_pkt_append_command(pkt, inst);
+	if (err < 0)
+		return err;
+
+	/* JUMP abaolute to begin */
+	inst.op = CMDQ_CODE_JUMP;
+	inst.offset = 1;
+	inst.value = pkt->pa_base >> cmdq_mbox_shift(cl->chan);
+	err = cmdq_pkt_append_command(pkt, inst);
+
+	return err;
+}
+EXPORT_SYMBOL(cmdq_pkt_finalize_loop);
+
 static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data)
 {
 	struct cmdq_pkt *pkt = (struct cmdq_pkt *)data.data;
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 998bc90f9da9..d15d8c941992 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -212,6 +212,14 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
  */
 int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
 
+/**
+ * cmdq_pkt_finalize_loop() - Append EOC and jump command to loop pkt.
+ * @pkt:	the CMDQ packet
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_finalize_loop(struct cmdq_pkt *pkt);
+
 /**
  * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
  *                          packet and call back at the end of done packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (12 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 12/14] soc: mediatek: cmdq: add loop function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  2019-12-11  2:04   ` CK Hu
  2019-11-27  1:58 ` [PATCH v2 14/14] soc: mediatek: cmdq: add set " Dennis YC Hsieh
  14 siblings, 1 reply; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add wait no clear event function in cmdq helper functions to wait specific
event without clear to 0 after receive it.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c | 15 +++++++++++++++
 include/linux/soc/mediatek/mtk-cmdq.h  | 10 ++++++++++
 2 files changed, 25 insertions(+)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 10a9b4481e58..6f270fadfb50 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -330,6 +330,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
 }
 EXPORT_SYMBOL(cmdq_pkt_wfe);
 
+int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event)
+{
+	struct cmdq_instruction inst = { {0} };
+
+	if (event >= CMDQ_MAX_EVENT)
+		return -EINVAL;
+
+	inst.op = CMDQ_CODE_WFE;
+	inst.value = CMDQ_WFE_WAIT | CMDQ_WFE_WAIT_VALUE;
+	inst.event = event;
+
+	return cmdq_pkt_append_command(pkt, inst);
+}
+EXPORT_SYMBOL(cmdq_pkt_wait_no_clear);
+
 int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
 {
 	struct cmdq_instruction inst = { {0} };
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index d15d8c941992..40bc61ad8d31 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -149,6 +149,16 @@ int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, dma_addr_t addr,
  */
 int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event);
 
+/**
+ * cmdq_pkt_wait_no_clear() - Append wait for event command to the CMDQ packet,
+ *			      without update event to 0 after receive it.
+ * @pkt:	the CMDQ packet
+ * @event:	the desired event type to wait
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event);
+
 /**
  * cmdq_pkt_clear_event() - append clear event command to the CMDQ packet
  * @pkt:	the CMDQ packet
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [PATCH v2 14/14] soc: mediatek: cmdq: add set event function
  2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
                   ` (13 preceding siblings ...)
  2019-11-27  1:58 ` [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function Dennis YC Hsieh
@ 2019-11-27  1:58 ` Dennis YC Hsieh
  14 siblings, 0 replies; 43+ messages in thread
From: Dennis YC Hsieh @ 2019-11-27  1:58 UTC (permalink / raw)
  To: Rob Herring, Matthias Brugger, Jassi Brar
  Cc: linux-kernel, linux-mediatek, devicetree, wsd_upstream,
	Bibby Hsieh, CK Hu, Houlong Wei, linux-arm-kernel,
	Dennis YC Hsieh

Add set event function in cmdq helper functions to set specific event.

Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
---
 drivers/soc/mediatek/mtk-cmdq-helper.c   | 15 +++++++++++++++
 include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
 include/linux/soc/mediatek/mtk-cmdq.h    |  9 +++++++++
 3 files changed, 25 insertions(+)

diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 6f270fadfb50..07c6ecc75bdd 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -360,6 +360,21 @@ int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
 }
 EXPORT_SYMBOL(cmdq_pkt_clear_event);
 
+int cmdq_pkt_set_event(struct cmdq_pkt *pkt, u16 event)
+{
+	struct cmdq_instruction inst = { {0} };
+
+	if (event >= CMDQ_MAX_EVENT)
+		return -EINVAL;
+
+	inst.op = CMDQ_CODE_WFE;
+	inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE;
+	inst.event = event;
+
+	return cmdq_pkt_append_command(pkt, inst);
+}
+EXPORT_SYMBOL(cmdq_pkt_set_event);
+
 int cmdq_pkt_poll(struct cmdq_pkt *pkt, u8 subsys,
 		  u16 offset, u32 value)
 {
diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
index 3f6bc0dfd5da..dbedda6cfa91 100644
--- a/include/linux/mailbox/mtk-cmdq-mailbox.h
+++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
@@ -17,6 +17,7 @@
 #define CMDQ_JUMP_PASS			CMDQ_INST_SIZE
 
 #define CMDQ_WFE_UPDATE			BIT(31)
+#define CMDQ_WFE_UPDATE_VALUE		BIT(16)
 #define CMDQ_WFE_WAIT			BIT(15)
 #define CMDQ_WFE_WAIT_VALUE		0x1
 
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 40bc61ad8d31..f1144faab582 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -168,6 +168,15 @@ int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event);
  */
 int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event);
 
+/**
+ * cmdq_pkt_set_event() - append set event command to the CMDQ packet
+ * @pkt:	the CMDQ packet
+ * @event:	the desired event to be set
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_set_event(struct cmdq_pkt *pkt, u16 event);
+
 /**
  * cmdq_pkt_poll() - Append polling command to the CMDQ packet, ask GCE to
  *		     execute an instruction that wait for a specified
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 01/14] dt-binding: gce: add gce header file for mt6779
  2019-11-27  1:58 ` [PATCH v2 01/14] dt-binding: gce: add gce header file for mt6779 Dennis YC Hsieh
@ 2019-12-05 20:37   ` Rob Herring
  0 siblings, 0 replies; 43+ messages in thread
From: Rob Herring @ 2019-12-05 20:37 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Matthias Brugger, Jassi Brar, linux-kernel, linux-mediatek,
	devicetree, wsd_upstream, Bibby Hsieh, CK Hu, Houlong Wei,
	linux-arm-kernel, Dennis YC Hsieh

On Wed, 27 Nov 2019 09:58:44 +0800, Dennis YC Hsieh wrote:
> Add documentation for the mt6779 gce.
> 
> Add gce header file defined the gce hardware event,
> subsys number and constant for mt6779.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  .../devicetree/bindings/mailbox/mtk-gce.txt   |   8 +-
>  include/dt-bindings/gce/mt6779-gce.h          | 222 ++++++++++++++++++
>  2 files changed, 227 insertions(+), 3 deletions(-)
>  create mode 100644 include/dt-bindings/gce/mt6779-gce.h
> 

Reviewed-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code
  2019-11-27  1:58 ` [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code Dennis YC Hsieh
@ 2019-12-06  4:02   ` Bibby Hsieh
  2019-12-18  8:00     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: Bibby Hsieh @ 2019-12-06  4:02 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, CK Hu, Houlong Wei,
	linux-arm-kernel

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Return error code to client if send message fail,
> so that client has chance to error handling.
> 
This patches seems like a fix patch.
Please add fixes, thanks.

Bibby
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 274f6f311d05..8421b4090304 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -353,11 +353,11 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
>  		spin_unlock_irqrestore(&client->lock, flags);
>  	}
>  
> -	mbox_send_message(client->chan, pkt);
> +	err = mbox_send_message(client->chan, pkt);
>  	/* We can send next packet immediately, so just call txdone. */
>  	mbox_client_txdone(client->chan, 0);
>  
> -	return 0;
> +	return err;
>  }
>  EXPORT_SYMBOL(cmdq_pkt_flush_async);
>  


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 05/14] arm64: dts: add gce node for mt6779
  2019-11-27  1:58 ` [PATCH v2 05/14] arm64: dts: add gce node for mt6779 Dennis YC Hsieh
@ 2019-12-06  4:05   ` Bibby Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Bibby Hsieh @ 2019-12-06  4:05 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, CK Hu, Houlong Wei,
	linux-arm-kernel

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> add gce device node for mt6779
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>

Reviewed-by: Bibby Hsieh <bibby.hsieh@mediatek.com>
> ---
>  arch/arm64/boot/dts/mediatek/mt6779.dtsi | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/mediatek/mt6779.dtsi b/arch/arm64/boot/dts/mediatek/mt6779.dtsi
> index daa25b75788f..10d59385f4a1 100644
> --- a/arch/arm64/boot/dts/mediatek/mt6779.dtsi
> +++ b/arch/arm64/boot/dts/mediatek/mt6779.dtsi
> @@ -8,6 +8,7 @@
>  #include <dt-bindings/clock/mt6779-clk.h>
>  #include <dt-bindings/interrupt-controller/irq.h>
>  #include <dt-bindings/interrupt-controller/arm-gic.h>
> +#include <dt-bindings/gce/mt6779-gce.h>
>  
>  / {
>  	compatible = "mediatek,mt6779";
> @@ -159,6 +160,15 @@
>  			#clock-cells = <1>;
>  		};
>  
> +		gce: mailbox@10228000 {
> +			compatible = "mediatek,mt6779-gce";
> +			reg = <0 0x10228000 0 0x4000>;
> +			interrupts = <GIC_SPI 185 IRQ_TYPE_LEVEL_LOW>;
> +			#mbox-cells = <3>;
> +			clocks = <&infracfg_ao CLK_INFRA_GCE>;
> +			clock-names = "gce";
> +		};
> +
>  		uart0: serial@11002000 {
>  			compatible = "mediatek,mt6779-uart",
>  				     "mediatek,mt6577-uart";


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform
  2019-11-27  1:58 ` [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform Dennis YC Hsieh
@ 2019-12-10  1:55   ` CK Hu
  2019-12-12  1:03     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-10  1:55 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Some gce hardware shift pc and end address in register to support
> large dram addressing.
> Implement gce address shift when write or read pc and end register.
> And add shift bit in platform definition.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/mailbox/mtk-cmdq-mailbox.c       | 57 ++++++++++++++++++------
>  drivers/soc/mediatek/mtk-cmdq-helper.c   |  3 +-
>  include/linux/mailbox/mtk-cmdq-mailbox.h |  2 +
>  3 files changed, 48 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> index 9a6ce9f5a7db..d5536563fce1 100644
> --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> @@ -76,8 +76,21 @@ struct cmdq {
>  	struct cmdq_thread	*thread;
>  	struct clk		*clock;
>  	bool			suspended;
> +	u8			shift_pa;
>  };
>  
> +struct gce_plat {
> +	u32 thread_nr;
> +	u8 shift;
> +};
> +
> +u8 cmdq_mbox_shift(struct mbox_chan *chan)
> +{
> +	struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox);
> +
> +	return cmdq->shift_pa;
> +}

EXPORT_SYMBOL(cmdq_mbox_shift);

> +
>  static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread)
>  {
>  	u32 status;
> @@ -176,6 +189,7 @@ static void cmdq_task_remove_wfe(struct cmdq_task *task)
>  {
>  	struct device *dev = task->cmdq->mbox.dev;
>  	u64 *base = task->pkt->va_base;
> +	struct cmdq *cmdq = task->cmdq;
>  	int i;
>  
>  	dma_sync_single_for_cpu(dev, task->pa_base, task->pkt->cmd_buf_size,
> @@ -183,7 +197,7 @@ static void cmdq_task_remove_wfe(struct cmdq_task *task)
>  	for (i = 0; i < CMDQ_NUM_CMD(task->pkt); i++)
>  		if (cmdq_command_is_wfe(base[i]))
>  			base[i] = (u64)CMDQ_JUMP_BY_OFFSET << 32 |
> -				  CMDQ_JUMP_PASS;
> +				  CMDQ_JUMP_PASS >> cmdq->shift_pa;

cmdq is only used here, so I would like

CMDQ_JUMP_PASS >> task->cmdq->shift_pa;

>  	dma_sync_single_for_device(dev, task->pa_base, task->pkt->cmd_buf_size,
>  				   DMA_TO_DEVICE);
>  }
> @@ -221,13 +235,15 @@ static void cmdq_task_handle_error(struct cmdq_task *task)
>  {
>  	struct cmdq_thread *thread = task->thread;
>  	struct cmdq_task *next_task;
> +	struct cmdq *cmdq = task->cmdq;
>  
>  	dev_err(task->cmdq->mbox.dev, "task 0x%p error\n", task);
>  	WARN_ON(cmdq_thread_suspend(task->cmdq, thread) < 0);
>  	next_task = list_first_entry_or_null(&thread->task_busy_list,
>  			struct cmdq_task, list_entry);
>  	if (next_task)
> -		writel(next_task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
> +		writel(next_task->pa_base >> cmdq->shift_pa,
> +		       thread->base + CMDQ_THR_CURR_ADDR);
>  	cmdq_thread_resume(thread);
>  }
>  
> @@ -257,7 +273,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
>  	else
>  		return;
>  
> -	curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR);
> +	curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) << cmdq->shift_pa;
>  
>  	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
>  				 list_entry) {
> @@ -373,16 +389,20 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
>  		WARN_ON(clk_enable(cmdq->clock) < 0);
>  		WARN_ON(cmdq_thread_reset(cmdq, thread) < 0);
>  
> -		writel(task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
> -		writel(task->pa_base + pkt->cmd_buf_size,
> +		writel(task->pa_base >> cmdq->shift_pa,
> +		       thread->base + CMDQ_THR_CURR_ADDR);
> +		writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa,
>  		       thread->base + CMDQ_THR_END_ADDR);
> +
>  		writel(thread->priority, thread->base + CMDQ_THR_PRIORITY);
>  		writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE);
>  		writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK);
>  	} else {
>  		WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> -		curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR);
> -		end_pa = readl(thread->base + CMDQ_THR_END_ADDR);
> +		curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) <<
> +			cmdq->shift_pa;
> +		end_pa = readl(thread->base + CMDQ_THR_END_ADDR) <<
> +			cmdq->shift_pa;
>  
>  		/*
>  		 * Atomic execution should remove the following wfe, i.e. only
> @@ -395,7 +415,7 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
>  				cmdq_thread_wait_end(thread, end_pa);
>  				WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
>  				/* set to this task directly */
> -				writel(task->pa_base,
> +				writel(task->pa_base >> cmdq->shift_pa,
>  				       thread->base + CMDQ_THR_CURR_ADDR);
>  			} else {
>  				cmdq_task_insert_into_thread(task);
> @@ -407,14 +427,14 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
>  			if (curr_pa == end_pa - CMDQ_INST_SIZE ||
>  			    curr_pa == end_pa) {
>  				/* set to this task directly */
> -				writel(task->pa_base,
> +				writel(task->pa_base >> cmdq->shift_pa,
>  				       thread->base + CMDQ_THR_CURR_ADDR);
>  			} else {
>  				cmdq_task_insert_into_thread(task);
>  				smp_mb(); /* modify jump before enable thread */
>  			}
>  		}
> -		writel(task->pa_base + pkt->cmd_buf_size,
> +		writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa,
>  		       thread->base + CMDQ_THR_END_ADDR);
>  		cmdq_thread_resume(thread);
>  	}
> @@ -461,6 +481,7 @@ static int cmdq_probe(struct platform_device *pdev)
>  	struct resource *res;
>  	struct cmdq *cmdq;
>  	int err, i;
> +	struct gce_plat *plat_data;
>  
>  	cmdq = devm_kzalloc(dev, sizeof(*cmdq), GFP_KERNEL);
>  	if (!cmdq)
> @@ -479,7 +500,14 @@ static int cmdq_probe(struct platform_device *pdev)
>  		return -EINVAL;
>  	}
>  
> -	cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev);
> +	plat_data = (struct gce_plat *)of_device_get_match_data(dev);
> +	if (!plat_data) {
> +		dev_err(dev, "failed to get match data\n");
> +		return -EINVAL;
> +	}
> +
> +	cmdq->thread_nr = plat_data->thread_nr;
> +	cmdq->shift_pa = plat_data->shift;
>  	cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0);
>  	err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED,
>  			       "mtk_cmdq", cmdq);
> @@ -542,9 +570,12 @@ static const struct dev_pm_ops cmdq_pm_ops = {
>  	.resume = cmdq_resume,
>  };
>  
> +static const struct gce_plat gce_plat_v2 = {.thread_nr = 16, .shift = 0};
> +static const struct gce_plat gce_plat_v3 = {.thread_nr = 24, .shift = 0};

For global variable, you need not to initialize it to zero.

> +
>  static const struct of_device_id cmdq_of_ids[] = {
> -	{.compatible = "mediatek,mt8173-gce", .data = (void *)16},
> -	{.compatible = "mediatek,mt8183-gce", .data = (void *)24},
> +	{.compatible = "mediatek,mt8173-gce", .data = (void *)&gce_plat_v2},
> +	{.compatible = "mediatek,mt8183-gce", .data = (void *)&gce_plat_v3},
>  	{}
>  };
>  
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 9add0fd5fa6c..274f6f311d05 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -281,6 +281,7 @@ EXPORT_SYMBOL(cmdq_pkt_poll_mask);
>  
>  static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
>  {
> +	struct cmdq_client *cl = pkt->cl;
>  	struct cmdq_instruction inst = { {0} };
>  	int err;
>  
> @@ -293,7 +294,7 @@ static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
>  
>  	/* JUMP to end */
>  	inst.op = CMDQ_CODE_JUMP;
> -	inst.value = CMDQ_JUMP_PASS;
> +	inst.value = CMDQ_JUMP_PASS >> cmdq_mbox_shift(cl->chan);

cl is used only here, so I would like

cmdq_mbox_shift(pkt->cl->chan);

Regards,
CK

>  	err = cmdq_pkt_append_command(pkt, inst);
>  
>  	return err;
> diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> index a4dc45fbec0a..dfe5b2eb85cc 100644
> --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> @@ -88,4 +88,6 @@ struct cmdq_pkt {
>  	void			*cl;
>  };
>  
> +u8 cmdq_mbox_shift(struct mbox_chan *chan);
> +
>  #endif /* __MTK_CMDQ_MAILBOX_H__ */


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 03/14] mailbox: cmdq: support mt6779 gce platform definition
  2019-11-27  1:58 ` [PATCH v2 03/14] mailbox: cmdq: support mt6779 gce platform definition Dennis YC Hsieh
@ 2019-12-10  2:04   ` CK Hu
  0 siblings, 0 replies; 43+ messages in thread
From: CK Hu @ 2019-12-10  2:04 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Add gce v4 hardware support with different thread number and shift.
> 

Reviewed-by: CK Hu <ck.hu@mediatek.com>

> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/mailbox/mtk-cmdq-mailbox.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> index d5536563fce1..fd519b6f518b 100644
> --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> @@ -572,10 +572,12 @@ static const struct dev_pm_ops cmdq_pm_ops = {
>  
>  static const struct gce_plat gce_plat_v2 = {.thread_nr = 16, .shift = 0};
>  static const struct gce_plat gce_plat_v3 = {.thread_nr = 24, .shift = 0};
> +static const struct gce_plat gce_plat_v4 = {.thread_nr = 24, .shift = 3};
>  
>  static const struct of_device_id cmdq_of_ids[] = {
>  	{.compatible = "mediatek,mt8173-gce", .data = (void *)&gce_plat_v2},
>  	{.compatible = "mediatek,mt8183-gce", .data = (void *)&gce_plat_v3},
> +	{.compatible = "mediatek,mt6779-gce", .data = (void *)&gce_plat_v4},
>  	{}
>  };
>  


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-11-27  1:58 ` [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown Dennis YC Hsieh
@ 2019-12-10  2:49   ` CK Hu
  2019-12-12  1:13     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-10  2:49 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Do success callback in channel when shutdown. For those task not finish,
> callback with error code thus client has chance to cleanup or reset.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> index fd519b6f518b..c12a768d1175 100644
> --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> @@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
>  
>  static void cmdq_mbox_shutdown(struct mbox_chan *chan)
>  {
> +	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
> +	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
> +	struct cmdq_task *task, *tmp;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&thread->chan->lock, flags);
> +	if (list_empty(&thread->task_busy_list))
> +		goto done;
> +
> +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> +
> +	/* make sure executed tasks have success callback */
> +	cmdq_thread_irq_handler(cmdq, thread);
> +	if (list_empty(&thread->task_busy_list))
> +		goto done;
> +
> +	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> +				 list_entry) {
> +		cmdq_task_exec_done(task, -ECONNABORTED);
> +		kfree(task);
> +	}
> +
> +	cmdq_thread_disable(cmdq, thread);
> +	clk_disable(cmdq->clock);
> +done:

cmdq_thread_resume(thread);

Regards,
CK

> +	spin_unlock_irqrestore(&thread->chan->lock, flags);
>  }
>  
>  static const struct mbox_chan_ops cmdq_mbox_chan_ops = {


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 07/14] soc: mediatek: cmdq: add assign function
  2019-11-27  1:58 ` [PATCH v2 07/14] soc: mediatek: cmdq: add assign function Dennis YC Hsieh
@ 2019-12-10  3:24   ` CK Hu
  2019-12-12  1:15     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-10  3:24 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Add assign function in cmdq helper which assign constant value into
> internal register by index.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c   | 24 +++++++++++++++++++++++-
>  include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
>  include/linux/soc/mediatek/mtk-cmdq.h    | 18 ++++++++++++++++++
>  3 files changed, 42 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 8421b4090304..9cc234f08ec5 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -14,6 +14,7 @@
>  #define CMDQ_EOC_IRQ_EN		BIT(0)
>  #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
>  				<< 32 | CMDQ_EOC_IRQ_EN)
> +#define CMDQ_REG_TYPE		1
>  
>  struct cmdq_instruction {
>  	union {
> @@ -23,8 +24,17 @@ struct cmdq_instruction {
>  	union {
>  		u16 offset;
>  		u16 event;
> +		u16 reg_dst;
> +	};
> +	union {
> +		u8 subsys;
> +		struct {
> +			u8 sop:5;
> +			u8 arg_c_t:1;
> +			u8 arg_b_t:1;
> +			u8 dst_t:1;
> +		};
>  	};
> -	u8 subsys;
>  	u8 op;
>  };
>  
> @@ -279,6 +289,18 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
>  }
>  EXPORT_SYMBOL(cmdq_pkt_poll_mask);
>  
> +int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
> +{
> +	struct cmdq_instruction inst = { {0} };
> +
> +	inst.op = CMDQ_CODE_LOGIC;
> +	inst.dst_t = CMDQ_REG_TYPE;
> +	inst.reg_dst = reg_idx;
> +	inst.value = value;
> +	return cmdq_pkt_append_command(pkt, inst);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_assign);
> +
>  static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
>  {
>  	struct cmdq_client *cl = pkt->cl;
> diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> index dfe5b2eb85cc..121c3bb6d3de 100644
> --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> @@ -59,6 +59,7 @@ enum cmdq_code {
>  	CMDQ_CODE_JUMP = 0x10,
>  	CMDQ_CODE_WFE = 0x20,
>  	CMDQ_CODE_EOC = 0x40,
> +	CMDQ_CODE_LOGIC = 0xa0,
>  };
>  
>  enum cmdq_cb_status {
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index a74c1d5acdf3..c66b3a0da2a2 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -12,6 +12,10 @@
>  #include <linux/timer.h>
>  
>  #define CMDQ_NO_TIMEOUT		0xffffffffu
> +#define CMDQ_SPR_TEMP		0
> +#define CMDQ_SPR1		1
> +#define CMDQ_SPR2		2
> +#define CMDQ_SPR3		3

These does not relate to assign function, so remove them.

Regards,
CK

>  
>  struct cmdq_pkt;
>  
> @@ -152,6 +156,20 @@ int cmdq_pkt_poll(struct cmdq_pkt *pkt, u8 subsys,
>   */
>  int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
>  		       u16 offset, u32 value, u32 mask);
> +
> +/**
> + * cmdq_pkt_assign() - Append logic assign command to the CMDQ packet, ask GCE
> + *		       to execute an instruction that set a constant value into
> + *		       internal register and use as value, mask or address in
> + *		       read/write instruction.
> + * @pkt:	the CMDQ packet
> + * @reg_idx:	the CMDQ internal register ID
> + * @value:	the specified value
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
> +
>  /**
>   * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
>   *                          packet and call back at the end of done packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function
  2019-11-27  1:58 ` [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function Dennis YC Hsieh
@ 2019-12-10  5:18   ` CK Hu
  2019-12-12  1:31     ` Dennis-YC Hsieh
  2019-12-10  7:35   ` Bibby Hsieh
  1 sibling, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-10  5:18 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> add write_s function in cmdq helper functions which
> writes value contains in internal register to address
> with large dma access support.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c   | 40 ++++++++++++++++++++++++
>  include/linux/mailbox/mtk-cmdq-mailbox.h |  2 ++
>  include/linux/soc/mediatek/mtk-cmdq.h    | 12 +++++++
>  3 files changed, 54 insertions(+)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 9cc234f08ec5..2edbc0954d97 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -15,11 +15,18 @@
>  #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
>  				<< 32 | CMDQ_EOC_IRQ_EN)
>  #define CMDQ_REG_TYPE		1
> +#define CMDQ_ADDR_HIGH(addr)	((u32)(((addr) >> 16) & GENMASK(31, 0)))
> +#define CMDQ_ADDR_LOW_BIT	BIT(1)
> +#define CMDQ_ADDR_LOW(addr)	((u16)(addr) | CMDQ_ADDR_LOW_BIT)
>  
>  struct cmdq_instruction {
>  	union {
>  		u32 value;
>  		u32 mask;
> +		struct {
> +			u16 arg_c;
> +			u16 arg_b;
> +		};
>  	};
>  	union {
>  		u16 offset;
> @@ -224,6 +231,39 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>  }
>  EXPORT_SYMBOL(cmdq_pkt_write_mask);
>  
> +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> +		     u32 mask)
> +{
> +	struct cmdq_instruction inst = { {0} };
> +	const u16 dst_reg_idx = CMDQ_SPR_TEMP;
> +	int err;
> +
> +	if (mask != U32_MAX) {
> +		inst.op = CMDQ_CODE_MASK;
> +		inst.mask = ~mask;
> +		err = cmdq_pkt_append_command(pkt, inst);
> +		if (err < 0)
> +			return err;
> +
> +		inst.mask = 0;
> +		inst.op = CMDQ_CODE_WRITE_S_MASK;
> +	} else {
> +		inst.op = CMDQ_CODE_WRITE_S;
> +	}
> +
> +	err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(addr));

You combine assign and write_s in this function, so you always occupy
register CMDQ_SPR_TEMP for this purpose, client could not use
CMDQ_SPR_TEMP for other purpose. So I would like you just do write_s in
this function. So the code in client would be:

cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(addr));
cmdq_pkt_write_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(addr),
src_reg_idx, mask);

Let client to decide which register for high address.

Another benefit of not combining instruction is that client driver owner
would be more clear about which command is in command buffer and it's
easier for them to debug.

> +	if (err < 0)
> +		return err;
> +
> +	inst.arg_b_t = CMDQ_REG_TYPE;
> +	inst.sop = dst_reg_idx;
> +	inst.offset = CMDQ_ADDR_LOW(addr);
> +	inst.arg_b = reg_idx;

I seems arg_b has a meaningful name.

Regards,
CK

> +
> +	return cmdq_pkt_append_command(pkt, inst);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_write_s);
> +
>  int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
>  {
>  	struct cmdq_instruction inst = { {0} };
> diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> index 121c3bb6d3de..8ef87e1bd03b 100644
> --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> @@ -59,6 +59,8 @@ enum cmdq_code {
>  	CMDQ_CODE_JUMP = 0x10,
>  	CMDQ_CODE_WFE = 0x20,
>  	CMDQ_CODE_EOC = 0x40,
> +	CMDQ_CODE_WRITE_S = 0x90,
> +	CMDQ_CODE_WRITE_S_MASK = 0x91,
>  	CMDQ_CODE_LOGIC = 0xa0,
>  };
>  
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index c66b3a0da2a2..56ff1970197c 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -106,6 +106,18 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
>  int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>  			u16 offset, u32 value, u32 mask);
>  
> +/**
> + * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
> + * @pkt:	the CMDQ packet
> + * @addr:	the physical address of register or dma
> + * @reg_idx:	the CMDQ internal register ID which cache source value
> + * @mask:	the specified target register mask
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> +		     u32 mask);
> +
>  /**
>   * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
>   * @pkt:	the CMDQ packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function
  2019-11-27  1:58 ` [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function Dennis YC Hsieh
  2019-12-10  5:18   ` CK Hu
@ 2019-12-10  7:35   ` Bibby Hsieh
  2019-12-12  1:31     ` Dennis-YC Hsieh
  1 sibling, 1 reply; 43+ messages in thread
From: Bibby Hsieh @ 2019-12-10  7:35 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, CK Hu, Houlong Wei,
	linux-arm-kernel

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> add write_s function in cmdq helper functions which
> writes value contains in internal register to address
> with large dma access support.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c   | 40 ++++++++++++++++++++++++
>  include/linux/mailbox/mtk-cmdq-mailbox.h |  2 ++
>  include/linux/soc/mediatek/mtk-cmdq.h    | 12 +++++++
>  3 files changed, 54 insertions(+)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 9cc234f08ec5..2edbc0954d97 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -15,11 +15,18 @@
>  #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
>  				<< 32 | CMDQ_EOC_IRQ_EN)
>  #define CMDQ_REG_TYPE		1
> +#define CMDQ_ADDR_HIGH(addr)	((u32)(((addr) >> 16) & GENMASK(31, 0)))
> +#define CMDQ_ADDR_LOW_BIT	BIT(1)
> +#define CMDQ_ADDR_LOW(addr)	((u16)(addr) | CMDQ_ADDR_LOW_BIT)
>  
>  struct cmdq_instruction {
>  	union {
>  		u32 value;
>  		u32 mask;
> +		struct {
> +			u16 arg_c;
> +			u16 arg_b;
> +		};
>  	};
>  	union {
>  		u16 offset;
> @@ -224,6 +231,39 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>  }
>  EXPORT_SYMBOL(cmdq_pkt_write_mask);
>  
> +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> +		     u32 mask)
> +{
> +	struct cmdq_instruction inst = { {0} };
> +	const u16 dst_reg_idx = CMDQ_SPR_TEMP;
> +	int err;
> +
> +	if (mask != U32_MAX) {
> +		inst.op = CMDQ_CODE_MASK;
> +		inst.mask = ~mask;
> +		err = cmdq_pkt_append_command(pkt, inst);
> +		if (err < 0)
> +			return err;
> +
> +		inst.mask = 0;
> +		inst.op = CMDQ_CODE_WRITE_S_MASK;
> +	} else {
> +		inst.op = CMDQ_CODE_WRITE_S;
> +	}
> +
> +	err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(addr));
> +	if (err < 0)
> +		return err;
> +
> +	inst.arg_b_t = CMDQ_REG_TYPE;
> +	inst.sop = dst_reg_idx;
> +	inst.offset = CMDQ_ADDR_LOW(addr);
> +	inst.arg_b = reg_idx;
> +
> +	return cmdq_pkt_append_command(pkt, inst);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_write_s);
> +
>  int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
>  {
>  	struct cmdq_instruction inst = { {0} };
> diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> index 121c3bb6d3de..8ef87e1bd03b 100644
> --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> @@ -59,6 +59,8 @@ enum cmdq_code {
>  	CMDQ_CODE_JUMP = 0x10,
>  	CMDQ_CODE_WFE = 0x20,
>  	CMDQ_CODE_EOC = 0x40,
> +	CMDQ_CODE_WRITE_S = 0x90,
> +	CMDQ_CODE_WRITE_S_MASK = 0x91,
>  	CMDQ_CODE_LOGIC = 0xa0,
>  };
>  
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index c66b3a0da2a2..56ff1970197c 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -106,6 +106,18 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
>  int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>  			u16 offset, u32 value, u32 mask);
>  
> +/**
> + * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
I think we need add more descriptions about difference between write.

Bibby
> + * @pkt:	the CMDQ packet
> + * @addr:	the physical address of register or dma
> + * @reg_idx:	the CMDQ internal register ID which cache source value
> + * @mask:	the specified target register mask
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> +		     u32 mask);
> +
>  /**
>   * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
>   * @pkt:	the CMDQ packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 11/14] soc: mediatek: cmdq: export finalize function
  2019-11-27  1:58 ` [PATCH v2 11/14] soc: mediatek: cmdq: export finalize function Dennis YC Hsieh
@ 2019-12-10  7:50   ` CK Hu
  0 siblings, 0 replies; 43+ messages in thread
From: CK Hu @ 2019-12-10  7:50 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Export finalize function to client which helps append eoc and jump
> command to pkt.

Reviewed-by: CK Hu <ck.hu@mediatek.com>

> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c | 7 ++-----
>  include/linux/soc/mediatek/mtk-cmdq.h  | 8 ++++++++
>  2 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 244b8528eb16..38e0c13e1922 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -392,7 +392,7 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
>  }
>  EXPORT_SYMBOL(cmdq_pkt_assign);
>  
> -static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> +int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
>  {
>  	struct cmdq_client *cl = pkt->cl;
>  	struct cmdq_instruction inst = { {0} };
> @@ -412,6 +412,7 @@ static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
>  
>  	return err;
>  }
> +EXPORT_SYMBOL(cmdq_pkt_finalize);
>  
>  static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data)
>  {
> @@ -446,10 +447,6 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
>  	unsigned long flags = 0;
>  	struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
>  
> -	err = cmdq_pkt_finalize(pkt);
> -	if (err < 0)
> -		return err;
> -
>  	pkt->cb.cb = cb;
>  	pkt->cb.data = data;
>  	pkt->async_cb.cb = cmdq_pkt_flush_async_cb;
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index 4bce240dbb56..998bc90f9da9 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -204,6 +204,14 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
>   */
>  int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
>  
> +/**
> + * cmdq_pkt_finalize() - Append EOC and jump command to pkt.
> + * @pkt:	the CMDQ packet
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
> +
>  /**
>   * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
>   *                          packet and call back at the end of done packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function
  2019-11-27  1:58 ` [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function Dennis YC Hsieh
@ 2019-12-10  7:55   ` CK Hu
  2019-12-12  1:33     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-10  7:55 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Add read_s function in cmdq helper functions which support read value from
> register or dma physical address into gce internal register.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c   | 20 ++++++++++++++++++++
>  include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
>  include/linux/soc/mediatek/mtk-cmdq.h    | 10 ++++++++++
>  3 files changed, 31 insertions(+)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 2edbc0954d97..2cd693e34980 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -231,6 +231,26 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>  }
>  EXPORT_SYMBOL(cmdq_pkt_write_mask);
>  
> +int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx)
> +{

Should addr be shifted in mt6779?

Regards,
CK

> +	struct cmdq_instruction inst = { {0} };
> +	int err;
> +	const u16 src_reg_idx = CMDQ_SPR_TEMP;
> +
> +	err = cmdq_pkt_assign(pkt, src_reg_idx, CMDQ_ADDR_HIGH(addr));
> +	if (err < 0)
> +		return err;
> +
> +	inst.op = CMDQ_CODE_READ_S;
> +	inst.dst_t = CMDQ_REG_TYPE;
> +	inst.sop = src_reg_idx;
> +	inst.reg_dst = reg_idx;
> +	inst.arg_b = CMDQ_ADDR_LOW(addr);
> +
> +	return cmdq_pkt_append_command(pkt, inst);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_read_s);
> +
>  int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
>  		     u32 mask)
>  {
> diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> index 8ef87e1bd03b..3f6bc0dfd5da 100644
> --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> @@ -59,6 +59,7 @@ enum cmdq_code {
>  	CMDQ_CODE_JUMP = 0x10,
>  	CMDQ_CODE_WFE = 0x20,
>  	CMDQ_CODE_EOC = 0x40,
> +	CMDQ_CODE_READ_S = 0x80,
>  	CMDQ_CODE_WRITE_S = 0x90,
>  	CMDQ_CODE_WRITE_S_MASK = 0x91,
>  	CMDQ_CODE_LOGIC = 0xa0,
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index 56ff1970197c..bc28a41d7780 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -106,6 +106,16 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
>  int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>  			u16 offset, u32 value, u32 mask);
>  
> +/**
> + * cmdq_pkt_read_s() - append read_s command to the CMDQ packet
> + * @pkt:	the CMDQ packet
> + * @addr:	the physical address of register or dma to read
> + * @reg_idx:	the CMDQ internal register ID to cache read data
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx);
> +
>  /**
>   * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
>   * @pkt:	the CMDQ packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 12/14] soc: mediatek: cmdq: add loop function
  2019-11-27  1:58 ` [PATCH v2 12/14] soc: mediatek: cmdq: add loop function Dennis YC Hsieh
@ 2019-12-11  1:48   ` CK Hu
  2019-12-12  1:37     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-11  1:48 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Add finalize loop function in cmdq helper functions which loop whole pkt
> in gce hardware thread without cpu operation.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c | 22 ++++++++++++++++++++++
>  include/linux/soc/mediatek/mtk-cmdq.h  |  8 ++++++++
>  2 files changed, 30 insertions(+)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 38e0c13e1922..10a9b4481e58 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -414,6 +414,28 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
>  }
>  EXPORT_SYMBOL(cmdq_pkt_finalize);
>  
> +int cmdq_pkt_finalize_loop(struct cmdq_pkt *pkt)
> +{
> +	struct cmdq_client *cl = pkt->cl;
> +	struct cmdq_instruction inst = { {0} };
> +	int err;
> +
> +	/* insert EOC and generate IRQ for each command iteration */
> +	inst.op = CMDQ_CODE_EOC;
> +	err = cmdq_pkt_append_command(pkt, inst);
> +	if (err < 0)
> +		return err;

It looks like you want a pkt execute command repeatedly, but why do you
repeatedly trigger IRQ? This IRQ would do nothing because this pkt would
never finish.

> +
> +	/* JUMP abaolute to begin */
> +	inst.op = CMDQ_CODE_JUMP;
> +	inst.offset = 1;
> +	inst.value = pkt->pa_base >> cmdq_mbox_shift(cl->chan);
> +	err = cmdq_pkt_append_command(pkt, inst);

Why not just export this function as cmdq_pkt_jump()? Let client decide
where to jump would be more flexible.

Regards,
CK

> +
> +	return err;
> +}
> +EXPORT_SYMBOL(cmdq_pkt_finalize_loop);
> +
>  static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data)
>  {
>  	struct cmdq_pkt *pkt = (struct cmdq_pkt *)data.data;
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index 998bc90f9da9..d15d8c941992 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -212,6 +212,14 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
>   */
>  int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
>  
> +/**
> + * cmdq_pkt_finalize_loop() - Append EOC and jump command to loop pkt.
> + * @pkt:	the CMDQ packet
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_finalize_loop(struct cmdq_pkt *pkt);
> +
>  /**
>   * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
>   *                          packet and call back at the end of done packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function
  2019-11-27  1:58 ` [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function Dennis YC Hsieh
@ 2019-12-11  2:04   ` CK Hu
  2019-12-12  1:42     ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-11  2:04 UTC (permalink / raw)
  To: Dennis YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> Add wait no clear event function in cmdq helper functions to wait specific
> event without clear to 0 after receive it.
> 
> Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> ---
>  drivers/soc/mediatek/mtk-cmdq-helper.c | 15 +++++++++++++++
>  include/linux/soc/mediatek/mtk-cmdq.h  | 10 ++++++++++
>  2 files changed, 25 insertions(+)
> 
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 10a9b4481e58..6f270fadfb50 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -330,6 +330,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
>  }
>  EXPORT_SYMBOL(cmdq_pkt_wfe);
>  
> +int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event)
> +{
> +	struct cmdq_instruction inst = { {0} };
> +
> +	if (event >= CMDQ_MAX_EVENT)
> +		return -EINVAL;
> +
> +	inst.op = CMDQ_CODE_WFE;
> +	inst.value = CMDQ_WFE_WAIT | CMDQ_WFE_WAIT_VALUE;
> +	inst.event = event;
> +
> +	return cmdq_pkt_append_command(pkt, inst);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_wait_no_clear);

So the wait command has two version, one is wait and then clear event,
another is wait and not clear event. The name of cmdq_pkt_wfe() is 'wait
for event', so it's trivial that we think it does not clear event. I've
three suggestion for this:

1. Let cmdq_pkt_wfe() wait and not clear event, and
cmdq_pkt_wfe_clear_event() wait and clear event.

or 
2. Let cmdq_pkt_wfe() has a parameter to indicate that clear event or
not after wait.

or
3. Let cmdq_pkt_wfe() wait and not clear event, and not provide wait and
clear event version. For DRM and MDP, I think both just need wait and
not clear event.

Regards,
CK


> +
>  int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
>  {
>  	struct cmdq_instruction inst = { {0} };
> diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> index d15d8c941992..40bc61ad8d31 100644
> --- a/include/linux/soc/mediatek/mtk-cmdq.h
> +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> @@ -149,6 +149,16 @@ int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, dma_addr_t addr,
>   */
>  int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event);
>  
> +/**
> + * cmdq_pkt_wait_no_clear() - Append wait for event command to the CMDQ packet,
> + *			      without update event to 0 after receive it.
> + * @pkt:	the CMDQ packet
> + * @event:	the desired event type to wait
> + *
> + * Return: 0 for success; else the error code is returned
> + */
> +int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event);
> +
>  /**
>   * cmdq_pkt_clear_event() - append clear event command to the CMDQ packet
>   * @pkt:	the CMDQ packet


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform
  2019-12-10  1:55   ` CK Hu
@ 2019-12-12  1:03     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:03 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

Thanks for your comment.

On Tue, 2019-12-10 at 09:55 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Some gce hardware shift pc and end address in register to support
> > large dram addressing.
> > Implement gce address shift when write or read pc and end register.
> > And add shift bit in platform definition.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/mailbox/mtk-cmdq-mailbox.c       | 57 ++++++++++++++++++------
> >  drivers/soc/mediatek/mtk-cmdq-helper.c   |  3 +-
> >  include/linux/mailbox/mtk-cmdq-mailbox.h |  2 +
> >  3 files changed, 48 insertions(+), 14 deletions(-)
> > 
> > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> > index 9a6ce9f5a7db..d5536563fce1 100644
> > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> > @@ -76,8 +76,21 @@ struct cmdq {
> >  	struct cmdq_thread	*thread;
> >  	struct clk		*clock;
> >  	bool			suspended;
> > +	u8			shift_pa;
> >  };
> >  
> > +struct gce_plat {
> > +	u32 thread_nr;
> > +	u8 shift;
> > +};
> > +
> > +u8 cmdq_mbox_shift(struct mbox_chan *chan)
> > +{
> > +	struct cmdq *cmdq = container_of(chan->mbox, struct cmdq, mbox);
> > +
> > +	return cmdq->shift_pa;
> > +}
> 
> EXPORT_SYMBOL(cmdq_mbox_shift);
> 

will do

> > +
> >  static int cmdq_thread_suspend(struct cmdq *cmdq, struct cmdq_thread *thread)
> >  {
> >  	u32 status;
> > @@ -176,6 +189,7 @@ static void cmdq_task_remove_wfe(struct cmdq_task *task)
> >  {
> >  	struct device *dev = task->cmdq->mbox.dev;
> >  	u64 *base = task->pkt->va_base;
> > +	struct cmdq *cmdq = task->cmdq;
> >  	int i;
> >  
> >  	dma_sync_single_for_cpu(dev, task->pa_base, task->pkt->cmd_buf_size,
> > @@ -183,7 +197,7 @@ static void cmdq_task_remove_wfe(struct cmdq_task *task)
> >  	for (i = 0; i < CMDQ_NUM_CMD(task->pkt); i++)
> >  		if (cmdq_command_is_wfe(base[i]))
> >  			base[i] = (u64)CMDQ_JUMP_BY_OFFSET << 32 |
> > -				  CMDQ_JUMP_PASS;
> > +				  CMDQ_JUMP_PASS >> cmdq->shift_pa;
> 
> cmdq is only used here, so I would like
> 
> CMDQ_JUMP_PASS >> task->cmdq->shift_pa;
> 

ok, will fix

> >  	dma_sync_single_for_device(dev, task->pa_base, task->pkt->cmd_buf_size,
> >  				   DMA_TO_DEVICE);
> >  }
> > @@ -221,13 +235,15 @@ static void cmdq_task_handle_error(struct cmdq_task *task)
> >  {
> >  	struct cmdq_thread *thread = task->thread;
> >  	struct cmdq_task *next_task;
> > +	struct cmdq *cmdq = task->cmdq;
> >  
> >  	dev_err(task->cmdq->mbox.dev, "task 0x%p error\n", task);
> >  	WARN_ON(cmdq_thread_suspend(task->cmdq, thread) < 0);
> >  	next_task = list_first_entry_or_null(&thread->task_busy_list,
> >  			struct cmdq_task, list_entry);
> >  	if (next_task)
> > -		writel(next_task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
> > +		writel(next_task->pa_base >> cmdq->shift_pa,
> > +		       thread->base + CMDQ_THR_CURR_ADDR);
> >  	cmdq_thread_resume(thread);
> >  }
> >  
> > @@ -257,7 +273,7 @@ static void cmdq_thread_irq_handler(struct cmdq *cmdq,
> >  	else
> >  		return;
> >  
> > -	curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR);
> > +	curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) << cmdq->shift_pa;
> >  
> >  	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> >  				 list_entry) {
> > @@ -373,16 +389,20 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
> >  		WARN_ON(clk_enable(cmdq->clock) < 0);
> >  		WARN_ON(cmdq_thread_reset(cmdq, thread) < 0);
> >  
> > -		writel(task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
> > -		writel(task->pa_base + pkt->cmd_buf_size,
> > +		writel(task->pa_base >> cmdq->shift_pa,
> > +		       thread->base + CMDQ_THR_CURR_ADDR);
> > +		writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa,
> >  		       thread->base + CMDQ_THR_END_ADDR);
> > +
> >  		writel(thread->priority, thread->base + CMDQ_THR_PRIORITY);
> >  		writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE);
> >  		writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK);
> >  	} else {
> >  		WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > -		curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR);
> > -		end_pa = readl(thread->base + CMDQ_THR_END_ADDR);
> > +		curr_pa = readl(thread->base + CMDQ_THR_CURR_ADDR) <<
> > +			cmdq->shift_pa;
> > +		end_pa = readl(thread->base + CMDQ_THR_END_ADDR) <<
> > +			cmdq->shift_pa;
> >  
> >  		/*
> >  		 * Atomic execution should remove the following wfe, i.e. only
> > @@ -395,7 +415,7 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
> >  				cmdq_thread_wait_end(thread, end_pa);
> >  				WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> >  				/* set to this task directly */
> > -				writel(task->pa_base,
> > +				writel(task->pa_base >> cmdq->shift_pa,
> >  				       thread->base + CMDQ_THR_CURR_ADDR);
> >  			} else {
> >  				cmdq_task_insert_into_thread(task);
> > @@ -407,14 +427,14 @@ static int cmdq_mbox_send_data(struct mbox_chan *chan, void *data)
> >  			if (curr_pa == end_pa - CMDQ_INST_SIZE ||
> >  			    curr_pa == end_pa) {
> >  				/* set to this task directly */
> > -				writel(task->pa_base,
> > +				writel(task->pa_base >> cmdq->shift_pa,
> >  				       thread->base + CMDQ_THR_CURR_ADDR);
> >  			} else {
> >  				cmdq_task_insert_into_thread(task);
> >  				smp_mb(); /* modify jump before enable thread */
> >  			}
> >  		}
> > -		writel(task->pa_base + pkt->cmd_buf_size,
> > +		writel((task->pa_base + pkt->cmd_buf_size) >> cmdq->shift_pa,
> >  		       thread->base + CMDQ_THR_END_ADDR);
> >  		cmdq_thread_resume(thread);
> >  	}
> > @@ -461,6 +481,7 @@ static int cmdq_probe(struct platform_device *pdev)
> >  	struct resource *res;
> >  	struct cmdq *cmdq;
> >  	int err, i;
> > +	struct gce_plat *plat_data;
> >  
> >  	cmdq = devm_kzalloc(dev, sizeof(*cmdq), GFP_KERNEL);
> >  	if (!cmdq)
> > @@ -479,7 +500,14 @@ static int cmdq_probe(struct platform_device *pdev)
> >  		return -EINVAL;
> >  	}
> >  
> > -	cmdq->thread_nr = (u32)(unsigned long)of_device_get_match_data(dev);
> > +	plat_data = (struct gce_plat *)of_device_get_match_data(dev);
> > +	if (!plat_data) {
> > +		dev_err(dev, "failed to get match data\n");
> > +		return -EINVAL;
> > +	}
> > +
> > +	cmdq->thread_nr = plat_data->thread_nr;
> > +	cmdq->shift_pa = plat_data->shift;
> >  	cmdq->irq_mask = GENMASK(cmdq->thread_nr - 1, 0);
> >  	err = devm_request_irq(dev, cmdq->irq, cmdq_irq_handler, IRQF_SHARED,
> >  			       "mtk_cmdq", cmdq);
> > @@ -542,9 +570,12 @@ static const struct dev_pm_ops cmdq_pm_ops = {
> >  	.resume = cmdq_resume,
> >  };
> >  
> > +static const struct gce_plat gce_plat_v2 = {.thread_nr = 16, .shift = 0};
> > +static const struct gce_plat gce_plat_v3 = {.thread_nr = 24, .shift = 0};
> 
> For global variable, you need not to initialize it to zero.
> 

will fix

> > +
> >  static const struct of_device_id cmdq_of_ids[] = {
> > -	{.compatible = "mediatek,mt8173-gce", .data = (void *)16},
> > -	{.compatible = "mediatek,mt8183-gce", .data = (void *)24},
> > +	{.compatible = "mediatek,mt8173-gce", .data = (void *)&gce_plat_v2},
> > +	{.compatible = "mediatek,mt8183-gce", .data = (void *)&gce_plat_v3},
> >  	{}
> >  };
> >  
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 9add0fd5fa6c..274f6f311d05 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -281,6 +281,7 @@ EXPORT_SYMBOL(cmdq_pkt_poll_mask);
> >  
> >  static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> >  {
> > +	struct cmdq_client *cl = pkt->cl;
> >  	struct cmdq_instruction inst = { {0} };
> >  	int err;
> >  
> > @@ -293,7 +294,7 @@ static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> >  
> >  	/* JUMP to end */
> >  	inst.op = CMDQ_CODE_JUMP;
> > -	inst.value = CMDQ_JUMP_PASS;
> > +	inst.value = CMDQ_JUMP_PASS >> cmdq_mbox_shift(cl->chan);
> 
> cl is used only here, so I would like
> 
> cmdq_mbox_shift(pkt->cl->chan);
> 
> Regards,
> CK
> 

will fix


Regards,
Dennis

> >  	err = cmdq_pkt_append_command(pkt, inst);
> >  
> >  	return err;
> > diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > index a4dc45fbec0a..dfe5b2eb85cc 100644
> > --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> > +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > @@ -88,4 +88,6 @@ struct cmdq_pkt {
> >  	void			*cl;
> >  };
> >  
> > +u8 cmdq_mbox_shift(struct mbox_chan *chan);
> > +
> >  #endif /* __MTK_CMDQ_MAILBOX_H__ */
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-12-10  2:49   ` CK Hu
@ 2019-12-12  1:13     ` Dennis-YC Hsieh
  2019-12-12  1:31       ` CK Hu
  0 siblings, 1 reply; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:13 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Tue, 2019-12-10 at 10:49 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Do success callback in channel when shutdown. For those task not finish,
> > callback with error code thus client has chance to cleanup or reset.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> > 
> > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> > index fd519b6f518b..c12a768d1175 100644
> > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> > @@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
> >  
> >  static void cmdq_mbox_shutdown(struct mbox_chan *chan)
> >  {
> > +	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
> > +	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
> > +	struct cmdq_task *task, *tmp;
> > +	unsigned long flags;
> > +
> > +	spin_lock_irqsave(&thread->chan->lock, flags);
> > +	if (list_empty(&thread->task_busy_list))
> > +		goto done;
> > +
> > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > +
> > +	/* make sure executed tasks have success callback */
> > +	cmdq_thread_irq_handler(cmdq, thread);
> > +	if (list_empty(&thread->task_busy_list))
> > +		goto done;
> > +
> > +	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> > +				 list_entry) {
> > +		cmdq_task_exec_done(task, -ECONNABORTED);
> > +		kfree(task);
> > +	}
> > +
> > +	cmdq_thread_disable(cmdq, thread);
> > +	clk_disable(cmdq->clock);
> > +done:
> 
> cmdq_thread_resume(thread);
> 
> Regards,
> CK
> 

Call resume here will cause violation. The thread->task_busy_list empty
means no task work in gce and thread state should already disable
without clock, which is what we want since client try to shut down this
mbox channel. So I think we don't need resume here.


Regards,
Dennis

> > +	spin_unlock_irqrestore(&thread->chan->lock, flags);
> >  }
> >  
> >  static const struct mbox_chan_ops cmdq_mbox_chan_ops = {
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 07/14] soc: mediatek: cmdq: add assign function
  2019-12-10  3:24   ` CK Hu
@ 2019-12-12  1:15     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:15 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Tue, 2019-12-10 at 11:24 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Add assign function in cmdq helper which assign constant value into
> > internal register by index.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c   | 24 +++++++++++++++++++++++-
> >  include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
> >  include/linux/soc/mediatek/mtk-cmdq.h    | 18 ++++++++++++++++++
> >  3 files changed, 42 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 8421b4090304..9cc234f08ec5 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -14,6 +14,7 @@
> >  #define CMDQ_EOC_IRQ_EN		BIT(0)
> >  #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
> >  				<< 32 | CMDQ_EOC_IRQ_EN)
> > +#define CMDQ_REG_TYPE		1
> >  
> >  struct cmdq_instruction {
> >  	union {
> > @@ -23,8 +24,17 @@ struct cmdq_instruction {
> >  	union {
> >  		u16 offset;
> >  		u16 event;
> > +		u16 reg_dst;
> > +	};
> > +	union {
> > +		u8 subsys;
> > +		struct {
> > +			u8 sop:5;
> > +			u8 arg_c_t:1;
> > +			u8 arg_b_t:1;
> > +			u8 dst_t:1;
> > +		};
> >  	};
> > -	u8 subsys;
> >  	u8 op;
> >  };
> >  
> > @@ -279,6 +289,18 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_poll_mask);
> >  
> > +int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
> > +{
> > +	struct cmdq_instruction inst = { {0} };
> > +
> > +	inst.op = CMDQ_CODE_LOGIC;
> > +	inst.dst_t = CMDQ_REG_TYPE;
> > +	inst.reg_dst = reg_idx;
> > +	inst.value = value;
> > +	return cmdq_pkt_append_command(pkt, inst);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_assign);
> > +
> >  static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> >  {
> >  	struct cmdq_client *cl = pkt->cl;
> > diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > index dfe5b2eb85cc..121c3bb6d3de 100644
> > --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> > +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > @@ -59,6 +59,7 @@ enum cmdq_code {
> >  	CMDQ_CODE_JUMP = 0x10,
> >  	CMDQ_CODE_WFE = 0x20,
> >  	CMDQ_CODE_EOC = 0x40,
> > +	CMDQ_CODE_LOGIC = 0xa0,
> >  };
> >  
> >  enum cmdq_cb_status {
> > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> > index a74c1d5acdf3..c66b3a0da2a2 100644
> > --- a/include/linux/soc/mediatek/mtk-cmdq.h
> > +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> > @@ -12,6 +12,10 @@
> >  #include <linux/timer.h>
> >  
> >  #define CMDQ_NO_TIMEOUT		0xffffffffu
> > +#define CMDQ_SPR_TEMP		0
> > +#define CMDQ_SPR1		1
> > +#define CMDQ_SPR2		2
> > +#define CMDQ_SPR3		3
> 
> These does not relate to assign function, so remove them.
> 
> Regards,
> CK
> 

will remove


Regards,
Dennis

> >  
> >  struct cmdq_pkt;
> >  
> > @@ -152,6 +156,20 @@ int cmdq_pkt_poll(struct cmdq_pkt *pkt, u8 subsys,
> >   */
> >  int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  		       u16 offset, u32 value, u32 mask);
> > +
> > +/**
> > + * cmdq_pkt_assign() - Append logic assign command to the CMDQ packet, ask GCE
> > + *		       to execute an instruction that set a constant value into
> > + *		       internal register and use as value, mask or address in
> > + *		       read/write instruction.
> > + * @pkt:	the CMDQ packet
> > + * @reg_idx:	the CMDQ internal register ID
> > + * @value:	the specified value
> > + *
> > + * Return: 0 for success; else the error code is returned
> > + */
> > +int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
> > +
> >  /**
> >   * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
> >   *                          packet and call back at the end of done packet
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function
  2019-12-10  5:18   ` CK Hu
@ 2019-12-12  1:31     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:31 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Tue, 2019-12-10 at 13:18 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > add write_s function in cmdq helper functions which
> > writes value contains in internal register to address
> > with large dma access support.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c   | 40 ++++++++++++++++++++++++
> >  include/linux/mailbox/mtk-cmdq-mailbox.h |  2 ++
> >  include/linux/soc/mediatek/mtk-cmdq.h    | 12 +++++++
> >  3 files changed, 54 insertions(+)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 9cc234f08ec5..2edbc0954d97 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -15,11 +15,18 @@
> >  #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
> >  				<< 32 | CMDQ_EOC_IRQ_EN)
> >  #define CMDQ_REG_TYPE		1
> > +#define CMDQ_ADDR_HIGH(addr)	((u32)(((addr) >> 16) & GENMASK(31, 0)))
> > +#define CMDQ_ADDR_LOW_BIT	BIT(1)
> > +#define CMDQ_ADDR_LOW(addr)	((u16)(addr) | CMDQ_ADDR_LOW_BIT)
> >  
> >  struct cmdq_instruction {
> >  	union {
> >  		u32 value;
> >  		u32 mask;
> > +		struct {
> > +			u16 arg_c;
> > +			u16 arg_b;
> > +		};
> >  	};
> >  	union {
> >  		u16 offset;
> > @@ -224,6 +231,39 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_write_mask);
> >  
> > +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> > +		     u32 mask)
> > +{
> > +	struct cmdq_instruction inst = { {0} };
> > +	const u16 dst_reg_idx = CMDQ_SPR_TEMP;
> > +	int err;
> > +
> > +	if (mask != U32_MAX) {
> > +		inst.op = CMDQ_CODE_MASK;
> > +		inst.mask = ~mask;
> > +		err = cmdq_pkt_append_command(pkt, inst);
> > +		if (err < 0)
> > +			return err;
> > +
> > +		inst.mask = 0;
> > +		inst.op = CMDQ_CODE_WRITE_S_MASK;
> > +	} else {
> > +		inst.op = CMDQ_CODE_WRITE_S;
> > +	}
> > +
> > +	err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(addr));
> 
> You combine assign and write_s in this function, so you always occupy
> register CMDQ_SPR_TEMP for this purpose, client could not use
> CMDQ_SPR_TEMP for other purpose. So I would like you just do write_s in
> this function. So the code in client would be:
> 
> cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(addr));
> cmdq_pkt_write_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(addr),
> src_reg_idx, mask);
> 
> Let client to decide which register for high address.
> 
> Another benefit of not combining instruction is that client driver owner
> would be more clear about which command is in command buffer and it's
> easier for them to debug.
> 

ok, i will expose reg idx as parameter

> > +	if (err < 0)
> > +		return err;
> > +
> > +	inst.arg_b_t = CMDQ_REG_TYPE;
> > +	inst.sop = dst_reg_idx;
> > +	inst.offset = CMDQ_ADDR_LOW(addr);
> > +	inst.arg_b = reg_idx;
> 
> I seems arg_b has a meaningful name.
> 
> Regards,
> CK
> 

ok, will change name


Regards,
Dennis

> > +
> > +	return cmdq_pkt_append_command(pkt, inst);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_write_s);
> > +
> >  int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
> >  {
> >  	struct cmdq_instruction inst = { {0} };
> > diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > index 121c3bb6d3de..8ef87e1bd03b 100644
> > --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> > +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > @@ -59,6 +59,8 @@ enum cmdq_code {
> >  	CMDQ_CODE_JUMP = 0x10,
> >  	CMDQ_CODE_WFE = 0x20,
> >  	CMDQ_CODE_EOC = 0x40,
> > +	CMDQ_CODE_WRITE_S = 0x90,
> > +	CMDQ_CODE_WRITE_S_MASK = 0x91,
> >  	CMDQ_CODE_LOGIC = 0xa0,
> >  };
> >  
> > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> > index c66b3a0da2a2..56ff1970197c 100644
> > --- a/include/linux/soc/mediatek/mtk-cmdq.h
> > +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> > @@ -106,6 +106,18 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
> >  int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  			u16 offset, u32 value, u32 mask);
> >  
> > +/**
> > + * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
> > + * @pkt:	the CMDQ packet
> > + * @addr:	the physical address of register or dma
> > + * @reg_idx:	the CMDQ internal register ID which cache source value
> > + * @mask:	the specified target register mask
> > + *
> > + * Return: 0 for success; else the error code is returned
> > + */
> > +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> > +		     u32 mask);
> > +
> >  /**
> >   * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
> >   * @pkt:	the CMDQ packet
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-12-12  1:13     ` Dennis-YC Hsieh
@ 2019-12-12  1:31       ` CK Hu
  2019-12-12  1:51         ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-12  1:31 UTC (permalink / raw)
  To: Dennis-YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Thu, 2019-12-12 at 09:13 +0800, Dennis-YC Hsieh wrote:
> Hi CK,
> 
> On Tue, 2019-12-10 at 10:49 +0800, CK Hu wrote:
> > Hi, Dennis:
> > 
> > On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > > Do success callback in channel when shutdown. For those task not finish,
> > > callback with error code thus client has chance to cleanup or reset.
> > > 
> > > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > > ---
> > >  drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
> > >  1 file changed, 26 insertions(+)
> > > 
> > > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > index fd519b6f518b..c12a768d1175 100644
> > > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> > > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > @@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
> > >  
> > >  static void cmdq_mbox_shutdown(struct mbox_chan *chan)
> > >  {
> > > +	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
> > > +	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
> > > +	struct cmdq_task *task, *tmp;
> > > +	unsigned long flags;
> > > +
> > > +	spin_lock_irqsave(&thread->chan->lock, flags);
> > > +	if (list_empty(&thread->task_busy_list))
> > > +		goto done;
> > > +
> > > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > > +
> > > +	/* make sure executed tasks have success callback */
> > > +	cmdq_thread_irq_handler(cmdq, thread);
> > > +	if (list_empty(&thread->task_busy_list))
> > > +		goto done;
> > > +
> > > +	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> > > +				 list_entry) {
> > > +		cmdq_task_exec_done(task, -ECONNABORTED);
> > > +		kfree(task);
> > > +	}
> > > +
> > > +	cmdq_thread_disable(cmdq, thread);
> > > +	clk_disable(cmdq->clock);
> > > +done:
> > 
> > cmdq_thread_resume(thread);
> > 
> > Regards,
> > CK
> > 
> 
> Call resume here will cause violation. The thread->task_busy_list empty
> means no task work in gce and thread state should already disable
> without clock, which is what we want since client try to shut down this
> mbox channel. So I think we don't need resume here.
> 

OK. When client free channel, thread is suspended. Then client request
channel, where do you resume thread?

Regards,
CK

> 
> Regards,
> Dennis
> 
> > > +	spin_unlock_irqrestore(&thread->chan->lock, flags);
> > >  }
> > >  
> > >  static const struct mbox_chan_ops cmdq_mbox_chan_ops = {
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function
  2019-12-10  7:35   ` Bibby Hsieh
@ 2019-12-12  1:31     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:31 UTC (permalink / raw)
  To: Bibby Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, CK Hu, Houlong Wei,
	linux-arm-kernel

Hi Bibby,

thanks for your comment

On Tue, 2019-12-10 at 15:35 +0800, Bibby Hsieh wrote:
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > add write_s function in cmdq helper functions which
> > writes value contains in internal register to address
> > with large dma access support.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c   | 40 ++++++++++++++++++++++++
> >  include/linux/mailbox/mtk-cmdq-mailbox.h |  2 ++
> >  include/linux/soc/mediatek/mtk-cmdq.h    | 12 +++++++
> >  3 files changed, 54 insertions(+)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 9cc234f08ec5..2edbc0954d97 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -15,11 +15,18 @@
> >  #define CMDQ_EOC_CMD		((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
> >  				<< 32 | CMDQ_EOC_IRQ_EN)
> >  #define CMDQ_REG_TYPE		1
> > +#define CMDQ_ADDR_HIGH(addr)	((u32)(((addr) >> 16) & GENMASK(31, 0)))
> > +#define CMDQ_ADDR_LOW_BIT	BIT(1)
> > +#define CMDQ_ADDR_LOW(addr)	((u16)(addr) | CMDQ_ADDR_LOW_BIT)
> >  
> >  struct cmdq_instruction {
> >  	union {
> >  		u32 value;
> >  		u32 mask;
> > +		struct {
> > +			u16 arg_c;
> > +			u16 arg_b;
> > +		};
> >  	};
> >  	union {
> >  		u16 offset;
> > @@ -224,6 +231,39 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_write_mask);
> >  
> > +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> > +		     u32 mask)
> > +{
> > +	struct cmdq_instruction inst = { {0} };
> > +	const u16 dst_reg_idx = CMDQ_SPR_TEMP;
> > +	int err;
> > +
> > +	if (mask != U32_MAX) {
> > +		inst.op = CMDQ_CODE_MASK;
> > +		inst.mask = ~mask;
> > +		err = cmdq_pkt_append_command(pkt, inst);
> > +		if (err < 0)
> > +			return err;
> > +
> > +		inst.mask = 0;
> > +		inst.op = CMDQ_CODE_WRITE_S_MASK;
> > +	} else {
> > +		inst.op = CMDQ_CODE_WRITE_S;
> > +	}
> > +
> > +	err = cmdq_pkt_assign(pkt, dst_reg_idx, CMDQ_ADDR_HIGH(addr));
> > +	if (err < 0)
> > +		return err;
> > +
> > +	inst.arg_b_t = CMDQ_REG_TYPE;
> > +	inst.sop = dst_reg_idx;
> > +	inst.offset = CMDQ_ADDR_LOW(addr);
> > +	inst.arg_b = reg_idx;
> > +
> > +	return cmdq_pkt_append_command(pkt, inst);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_write_s);
> > +
> >  int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
> >  {
> >  	struct cmdq_instruction inst = { {0} };
> > diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > index 121c3bb6d3de..8ef87e1bd03b 100644
> > --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> > +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > @@ -59,6 +59,8 @@ enum cmdq_code {
> >  	CMDQ_CODE_JUMP = 0x10,
> >  	CMDQ_CODE_WFE = 0x20,
> >  	CMDQ_CODE_EOC = 0x40,
> > +	CMDQ_CODE_WRITE_S = 0x90,
> > +	CMDQ_CODE_WRITE_S_MASK = 0x91,
> >  	CMDQ_CODE_LOGIC = 0xa0,
> >  };
> >  
> > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> > index c66b3a0da2a2..56ff1970197c 100644
> > --- a/include/linux/soc/mediatek/mtk-cmdq.h
> > +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> > @@ -106,6 +106,18 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
> >  int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  			u16 offset, u32 value, u32 mask);
> >  
> > +/**
> > + * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
> I think we need add more descriptions about difference between write.
> 
> Bibby

ok, will change


Regards,
Dennis

> > + * @pkt:	the CMDQ packet
> > + * @addr:	the physical address of register or dma
> > + * @reg_idx:	the CMDQ internal register ID which cache source value
> > + * @mask:	the specified target register mask
> > + *
> > + * Return: 0 for success; else the error code is returned
> > + */
> > +int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> > +		     u32 mask);
> > +
> >  /**
> >   * cmdq_pkt_wfe() - append wait for event command to the CMDQ packet
> >   * @pkt:	the CMDQ packet
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function
  2019-12-10  7:55   ` CK Hu
@ 2019-12-12  1:33     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:33 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Tue, 2019-12-10 at 15:55 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Add read_s function in cmdq helper functions which support read value from
> > register or dma physical address into gce internal register.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c   | 20 ++++++++++++++++++++
> >  include/linux/mailbox/mtk-cmdq-mailbox.h |  1 +
> >  include/linux/soc/mediatek/mtk-cmdq.h    | 10 ++++++++++
> >  3 files changed, 31 insertions(+)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 2edbc0954d97..2cd693e34980 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -231,6 +231,26 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_write_mask);
> >  
> > +int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx)
> > +{
> 
> Should addr be shifted in mt6779?
> 
> Regards,
> CK
> 

no, only pc and end register shift address
no need to shift in instruction


Regards,
Dennis

> > +	struct cmdq_instruction inst = { {0} };
> > +	int err;
> > +	const u16 src_reg_idx = CMDQ_SPR_TEMP;
> > +
> > +	err = cmdq_pkt_assign(pkt, src_reg_idx, CMDQ_ADDR_HIGH(addr));
> > +	if (err < 0)
> > +		return err;
> > +
> > +	inst.op = CMDQ_CODE_READ_S;
> > +	inst.dst_t = CMDQ_REG_TYPE;
> > +	inst.sop = src_reg_idx;
> > +	inst.reg_dst = reg_idx;
> > +	inst.arg_b = CMDQ_ADDR_LOW(addr);
> > +
> > +	return cmdq_pkt_append_command(pkt, inst);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_read_s);
> > +
> >  int cmdq_pkt_write_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx,
> >  		     u32 mask)
> >  {
> > diff --git a/include/linux/mailbox/mtk-cmdq-mailbox.h b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > index 8ef87e1bd03b..3f6bc0dfd5da 100644
> > --- a/include/linux/mailbox/mtk-cmdq-mailbox.h
> > +++ b/include/linux/mailbox/mtk-cmdq-mailbox.h
> > @@ -59,6 +59,7 @@ enum cmdq_code {
> >  	CMDQ_CODE_JUMP = 0x10,
> >  	CMDQ_CODE_WFE = 0x20,
> >  	CMDQ_CODE_EOC = 0x40,
> > +	CMDQ_CODE_READ_S = 0x80,
> >  	CMDQ_CODE_WRITE_S = 0x90,
> >  	CMDQ_CODE_WRITE_S_MASK = 0x91,
> >  	CMDQ_CODE_LOGIC = 0xa0,
> > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> > index 56ff1970197c..bc28a41d7780 100644
> > --- a/include/linux/soc/mediatek/mtk-cmdq.h
> > +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> > @@ -106,6 +106,16 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
> >  int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> >  			u16 offset, u32 value, u32 mask);
> >  
> > +/**
> > + * cmdq_pkt_read_s() - append read_s command to the CMDQ packet
> > + * @pkt:	the CMDQ packet
> > + * @addr:	the physical address of register or dma to read
> > + * @reg_idx:	the CMDQ internal register ID to cache read data
> > + *
> > + * Return: 0 for success; else the error code is returned
> > + */
> > +int cmdq_pkt_read_s(struct cmdq_pkt *pkt, phys_addr_t addr, u16 reg_idx);
> > +
> >  /**
> >   * cmdq_pkt_write_s_mask() - append write_s command to the CMDQ packet
> >   * @pkt:	the CMDQ packet
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 12/14] soc: mediatek: cmdq: add loop function
  2019-12-11  1:48   ` CK Hu
@ 2019-12-12  1:37     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:37 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Wed, 2019-12-11 at 09:48 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Add finalize loop function in cmdq helper functions which loop whole pkt
> > in gce hardware thread without cpu operation.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c | 22 ++++++++++++++++++++++
> >  include/linux/soc/mediatek/mtk-cmdq.h  |  8 ++++++++
> >  2 files changed, 30 insertions(+)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 38e0c13e1922..10a9b4481e58 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -414,6 +414,28 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_finalize);
> >  
> > +int cmdq_pkt_finalize_loop(struct cmdq_pkt *pkt)
> > +{
> > +	struct cmdq_client *cl = pkt->cl;
> > +	struct cmdq_instruction inst = { {0} };
> > +	int err;
> > +
> > +	/* insert EOC and generate IRQ for each command iteration */
> > +	inst.op = CMDQ_CODE_EOC;
> > +	err = cmdq_pkt_append_command(pkt, inst);
> > +	if (err < 0)
> > +		return err;
> 
> It looks like you want a pkt execute command repeatedly, but why do you
> repeatedly trigger IRQ? This IRQ would do nothing because this pkt would
> never finish.
> 

see following section

> > +
> > +	/* JUMP abaolute to begin */
> > +	inst.op = CMDQ_CODE_JUMP;
> > +	inst.offset = 1;
> > +	inst.value = pkt->pa_base >> cmdq_mbox_shift(cl->chan);
> > +	err = cmdq_pkt_append_command(pkt, inst);
> 
> Why not just export this function as cmdq_pkt_jump()? Let client decide
> where to jump would be more flexible.
> 
> Regards,
> CK
> 

ok, I will remove this part and expose cmdq_pkt_jump()


Regards,
Dennis

> > +
> > +	return err;
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_finalize_loop);
> > +
> >  static void cmdq_pkt_flush_async_cb(struct cmdq_cb_data data)
> >  {
> >  	struct cmdq_pkt *pkt = (struct cmdq_pkt *)data.data;
> > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> > index 998bc90f9da9..d15d8c941992 100644
> > --- a/include/linux/soc/mediatek/mtk-cmdq.h
> > +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> > @@ -212,6 +212,14 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value);
> >   */
> >  int cmdq_pkt_finalize(struct cmdq_pkt *pkt);
> >  
> > +/**
> > + * cmdq_pkt_finalize_loop() - Append EOC and jump command to loop pkt.
> > + * @pkt:	the CMDQ packet
> > + *
> > + * Return: 0 for success; else the error code is returned
> > + */
> > +int cmdq_pkt_finalize_loop(struct cmdq_pkt *pkt);
> > +
> >  /**
> >   * cmdq_pkt_flush_async() - trigger CMDQ to asynchronously execute the CMDQ
> >   *                          packet and call back at the end of done packet
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function
  2019-12-11  2:04   ` CK Hu
@ 2019-12-12  1:42     ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:42 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

On Wed, 2019-12-11 at 10:04 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Add wait no clear event function in cmdq helper functions to wait specific
> > event without clear to 0 after receive it.
> > 
> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c | 15 +++++++++++++++
> >  include/linux/soc/mediatek/mtk-cmdq.h  | 10 ++++++++++
> >  2 files changed, 25 insertions(+)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 10a9b4481e58..6f270fadfb50 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -330,6 +330,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_wfe);
> >  
> > +int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event)
> > +{
> > +	struct cmdq_instruction inst = { {0} };
> > +
> > +	if (event >= CMDQ_MAX_EVENT)
> > +		return -EINVAL;
> > +
> > +	inst.op = CMDQ_CODE_WFE;
> > +	inst.value = CMDQ_WFE_WAIT | CMDQ_WFE_WAIT_VALUE;
> > +	inst.event = event;
> > +
> > +	return cmdq_pkt_append_command(pkt, inst);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_wait_no_clear);
> 
> So the wait command has two version, one is wait and then clear event,
> another is wait and not clear event. The name of cmdq_pkt_wfe() is 'wait
> for event', so it's trivial that we think it does not clear event. I've
> three suggestion for this:
> 
> 1. Let cmdq_pkt_wfe() wait and not clear event, and
> cmdq_pkt_wfe_clear_event() wait and clear event.
> 
> or 
> 2. Let cmdq_pkt_wfe() has a parameter to indicate that clear event or
> not after wait.
> 
> or
> 3. Let cmdq_pkt_wfe() wait and not clear event, and not provide wait and
> clear event version. For DRM and MDP, I think both just need wait and
> not clear event.
> 
> Regards,
> CK
> 

ok, I will change cmdq_pkt_wfe wait and not clear, and expose another
cmdq_pkt_wfe_clear_event() api


Regards,
Dennis

> 
> > +
> >  int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
> >  {
> >  	struct cmdq_instruction inst = { {0} };
> > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
> > index d15d8c941992..40bc61ad8d31 100644
> > --- a/include/linux/soc/mediatek/mtk-cmdq.h
> > +++ b/include/linux/soc/mediatek/mtk-cmdq.h
> > @@ -149,6 +149,16 @@ int cmdq_pkt_write_s_value(struct cmdq_pkt *pkt, dma_addr_t addr,
> >   */
> >  int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event);
> >  
> > +/**
> > + * cmdq_pkt_wait_no_clear() - Append wait for event command to the CMDQ packet,
> > + *			      without update event to 0 after receive it.
> > + * @pkt:	the CMDQ packet
> > + * @event:	the desired event type to wait
> > + *
> > + * Return: 0 for success; else the error code is returned
> > + */
> > +int cmdq_pkt_wait_no_clear(struct cmdq_pkt *pkt, u16 event);
> > +
> >  /**
> >   * cmdq_pkt_clear_event() - append clear event command to the CMDQ packet
> >   * @pkt:	the CMDQ packet
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-12-12  1:31       ` CK Hu
@ 2019-12-12  1:51         ` Dennis-YC Hsieh
  2019-12-12  2:03           ` CK Hu
  0 siblings, 1 reply; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  1:51 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Thu, 2019-12-12 at 09:31 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Thu, 2019-12-12 at 09:13 +0800, Dennis-YC Hsieh wrote:
> > Hi CK,
> > 
> > On Tue, 2019-12-10 at 10:49 +0800, CK Hu wrote:
> > > Hi, Dennis:
> > > 
> > > On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > > > Do success callback in channel when shutdown. For those task not finish,
> > > > callback with error code thus client has chance to cleanup or reset.
> > > > 
> > > > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > > > ---
> > > >  drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
> > > >  1 file changed, 26 insertions(+)
> > > > 
> > > > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > index fd519b6f518b..c12a768d1175 100644
> > > > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > @@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
> > > >  
> > > >  static void cmdq_mbox_shutdown(struct mbox_chan *chan)
> > > >  {
> > > > +	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
> > > > +	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
> > > > +	struct cmdq_task *task, *tmp;
> > > > +	unsigned long flags;
> > > > +
> > > > +	spin_lock_irqsave(&thread->chan->lock, flags);
> > > > +	if (list_empty(&thread->task_busy_list))
> > > > +		goto done;
> > > > +
> > > > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > > > +
> > > > +	/* make sure executed tasks have success callback */
> > > > +	cmdq_thread_irq_handler(cmdq, thread);
> > > > +	if (list_empty(&thread->task_busy_list))
> > > > +		goto done;
> > > > +
> > > > +	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> > > > +				 list_entry) {
> > > > +		cmdq_task_exec_done(task, -ECONNABORTED);
> > > > +		kfree(task);
> > > > +	}
> > > > +
> > > > +	cmdq_thread_disable(cmdq, thread);
> > > > +	clk_disable(cmdq->clock);
> > > > +done:
> > > 
> > > cmdq_thread_resume(thread);
> > > 
> > > Regards,
> > > CK
> > > 
> > 
> > Call resume here will cause violation. The thread->task_busy_list empty
> > means no task work in gce and thread state should already disable
> > without clock, which is what we want since client try to shut down this
> > mbox channel. So I think we don't need resume here.
> > 
> 
> OK. When client free channel, thread is suspended. Then client request
> channel, where do you resume thread?
> 

when client send new pkt to new channel, cmdq_mbox_send_data() will
enable thread.


Regards,
Dennis

> Regards,
> CK
> 
> > 
> > Regards,
> > Dennis
> > 
> > > > +	spin_unlock_irqrestore(&thread->chan->lock, flags);
> > > >  }
> > > >  
> > > >  static const struct mbox_chan_ops cmdq_mbox_chan_ops = {
> > > 
> > > 
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-12-12  1:51         ` Dennis-YC Hsieh
@ 2019-12-12  2:03           ` CK Hu
  2019-12-12  2:20             ` Dennis-YC Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: CK Hu @ 2019-12-12  2:03 UTC (permalink / raw)
  To: Dennis-YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi, Dennis:

On Thu, 2019-12-12 at 09:51 +0800, Dennis-YC Hsieh wrote:
> Hi CK,
> 
> On Thu, 2019-12-12 at 09:31 +0800, CK Hu wrote:
> > Hi, Dennis:
> > 
> > On Thu, 2019-12-12 at 09:13 +0800, Dennis-YC Hsieh wrote:
> > > Hi CK,
> > > 
> > > On Tue, 2019-12-10 at 10:49 +0800, CK Hu wrote:
> > > > Hi, Dennis:
> > > > 
> > > > On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > > > > Do success callback in channel when shutdown. For those task not finish,
> > > > > callback with error code thus client has chance to cleanup or reset.
> > > > > 
> > > > > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > > > > ---
> > > > >  drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
> > > > >  1 file changed, 26 insertions(+)
> > > > > 
> > > > > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > > index fd519b6f518b..c12a768d1175 100644
> > > > > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > > @@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
> > > > >  
> > > > >  static void cmdq_mbox_shutdown(struct mbox_chan *chan)
> > > > >  {
> > > > > +	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
> > > > > +	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
> > > > > +	struct cmdq_task *task, *tmp;
> > > > > +	unsigned long flags;
> > > > > +
> > > > > +	spin_lock_irqsave(&thread->chan->lock, flags);
> > > > > +	if (list_empty(&thread->task_busy_list))
> > > > > +		goto done;
> > > > > +
> > > > > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > > > > +
> > > > > +	/* make sure executed tasks have success callback */
> > > > > +	cmdq_thread_irq_handler(cmdq, thread);
> > > > > +	if (list_empty(&thread->task_busy_list))
> > > > > +		goto done;
> > > > > +
> > > > > +	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> > > > > +				 list_entry) {
> > > > > +		cmdq_task_exec_done(task, -ECONNABORTED);
> > > > > +		kfree(task);
> > > > > +	}
> > > > > +
> > > > > +	cmdq_thread_disable(cmdq, thread);
> > > > > +	clk_disable(cmdq->clock);
> > > > > +done:
> > > > 
> > > > cmdq_thread_resume(thread);
> > > > 
> > > > Regards,
> > > > CK
> > > > 
> > > 
> > > Call resume here will cause violation. The thread->task_busy_list empty
> > > means no task work in gce and thread state should already disable
> > > without clock, which is what we want since client try to shut down this
> > > mbox channel. So I think we don't need resume here.
> > > 
> > 
> > OK. When client free channel, thread is suspended. Then client request
> > channel, where do you resume thread?
> > 
> 
> when client send new pkt to new channel, cmdq_mbox_send_data() will
> enable thread.

in cmdq_mbox_send_data(), it would run below command:

WARN_ON(clk_enable(cmdq->clock) < 0);
WARN_ON(cmdq_thread_reset(cmdq, thread) < 0);

writel(task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
writel(task->pa_base + pkt->cmd_buf_size,
       thread->base + CMDQ_THR_END_ADDR);
writel(thread->priority, thread->base + CMDQ_THR_PRIORITY);
writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE);
writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK);

Do you mean CMDQ_THR_ENABLE_TASK is set to CMDQ_THR_ENABLED, then
CMDQ_THR_SUSPEND_TASK would be automatically set to CMDQ_THR_RESUME? If
this hardware work in so special behavior, please add comment for this.

Regards,
CK

> 
> 
> Regards,
> Dennis
> 
> > Regards,
> > CK
> > 
> > > 
> > > Regards,
> > > Dennis
> > > 
> > > > > +	spin_unlock_irqrestore(&thread->chan->lock, flags);
> > > > >  }
> > > > >  
> > > > >  static const struct mbox_chan_ops cmdq_mbox_chan_ops = {
> > > > 
> > > > 
> > > 
> > > 
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown
  2019-12-12  2:03           ` CK Hu
@ 2019-12-12  2:20             ` Dennis-YC Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-12  2:20 UTC (permalink / raw)
  To: CK Hu
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, Bibby Hsieh,
	Houlong Wei, linux-arm-kernel

Hi CK,

On Thu, 2019-12-12 at 10:03 +0800, CK Hu wrote:
> Hi, Dennis:
> 
> On Thu, 2019-12-12 at 09:51 +0800, Dennis-YC Hsieh wrote:
> > Hi CK,
> > 
> > On Thu, 2019-12-12 at 09:31 +0800, CK Hu wrote:
> > > Hi, Dennis:
> > > 
> > > On Thu, 2019-12-12 at 09:13 +0800, Dennis-YC Hsieh wrote:
> > > > Hi CK,
> > > > 
> > > > On Tue, 2019-12-10 at 10:49 +0800, CK Hu wrote:
> > > > > Hi, Dennis:
> > > > > 
> > > > > On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > > > > > Do success callback in channel when shutdown. For those task not finish,
> > > > > > callback with error code thus client has chance to cleanup or reset.
> > > > > > 
> > > > > > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > > > > > ---
> > > > > >  drivers/mailbox/mtk-cmdq-mailbox.c | 26 ++++++++++++++++++++++++++
> > > > > >  1 file changed, 26 insertions(+)
> > > > > > 
> > > > > > diff --git a/drivers/mailbox/mtk-cmdq-mailbox.c b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > > > index fd519b6f518b..c12a768d1175 100644
> > > > > > --- a/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > > > +++ b/drivers/mailbox/mtk-cmdq-mailbox.c
> > > > > > @@ -450,6 +450,32 @@ static int cmdq_mbox_startup(struct mbox_chan *chan)
> > > > > >  
> > > > > >  static void cmdq_mbox_shutdown(struct mbox_chan *chan)
> > > > > >  {
> > > > > > +	struct cmdq_thread *thread = (struct cmdq_thread *)chan->con_priv;
> > > > > > +	struct cmdq *cmdq = dev_get_drvdata(chan->mbox->dev);
> > > > > > +	struct cmdq_task *task, *tmp;
> > > > > > +	unsigned long flags;
> > > > > > +
> > > > > > +	spin_lock_irqsave(&thread->chan->lock, flags);
> > > > > > +	if (list_empty(&thread->task_busy_list))
> > > > > > +		goto done;
> > > > > > +
> > > > > > +	WARN_ON(cmdq_thread_suspend(cmdq, thread) < 0);
> > > > > > +
> > > > > > +	/* make sure executed tasks have success callback */
> > > > > > +	cmdq_thread_irq_handler(cmdq, thread);
> > > > > > +	if (list_empty(&thread->task_busy_list))
> > > > > > +		goto done;
> > > > > > +
> > > > > > +	list_for_each_entry_safe(task, tmp, &thread->task_busy_list,
> > > > > > +				 list_entry) {
> > > > > > +		cmdq_task_exec_done(task, -ECONNABORTED);
> > > > > > +		kfree(task);
> > > > > > +	}
> > > > > > +
> > > > > > +	cmdq_thread_disable(cmdq, thread);
> > > > > > +	clk_disable(cmdq->clock);
> > > > > > +done:
> > > > > 
> > > > > cmdq_thread_resume(thread);
> > > > > 
> > > > > Regards,
> > > > > CK
> > > > > 
> > > > 
> > > > Call resume here will cause violation. The thread->task_busy_list empty
> > > > means no task work in gce and thread state should already disable
> > > > without clock, which is what we want since client try to shut down this
> > > > mbox channel. So I think we don't need resume here.
> > > > 
> > > 
> > > OK. When client free channel, thread is suspended. Then client request
> > > channel, where do you resume thread?
> > > 
> > 
> > when client send new pkt to new channel, cmdq_mbox_send_data() will
> > enable thread.
> 
> in cmdq_mbox_send_data(), it would run below command:
> 
> WARN_ON(clk_enable(cmdq->clock) < 0);
> WARN_ON(cmdq_thread_reset(cmdq, thread) < 0);
> 
> writel(task->pa_base, thread->base + CMDQ_THR_CURR_ADDR);
> writel(task->pa_base + pkt->cmd_buf_size,
>        thread->base + CMDQ_THR_END_ADDR);
> writel(thread->priority, thread->base + CMDQ_THR_PRIORITY);
> writel(CMDQ_THR_IRQ_EN, thread->base + CMDQ_THR_IRQ_ENABLE);
> writel(CMDQ_THR_ENABLED, thread->base + CMDQ_THR_ENABLE_TASK);
> 
> Do you mean CMDQ_THR_ENABLE_TASK is set to CMDQ_THR_ENABLED, then
> CMDQ_THR_SUSPEND_TASK would be automatically set to CMDQ_THR_RESUME? If
> this hardware work in so special behavior, please add comment for this.
> 
> Regards,
> CK
> 

sorry for not clearly explain before

call to cmdq_thread_reset() will reset thread status, which include
suspend state. the CMDQ_THR_SUSPEND_TASK will be clear after reset, thus
we can simply set CMDQ_THR_ENABLE_TASK to CMDQ_THR_ENABLED and then
thread running again.

I will add comment in both cmdq_mbox_send_data() and
cmdq_mbox_shutdown() to clarify this hardware behavior.


Regards,
Dennis

> > 
> > 
> > Regards,
> > Dennis
> > 
> > > Regards,
> > > CK
> > > 
> > > > 
> > > > Regards,
> > > > Dennis
> > > > 
> > > > > > +	spin_unlock_irqrestore(&thread->chan->lock, flags);
> > > > > >  }
> > > > > >  
> > > > > >  static const struct mbox_chan_ops cmdq_mbox_chan_ops = {
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code
  2019-12-06  4:02   ` Bibby Hsieh
@ 2019-12-18  8:00     ` Dennis-YC Hsieh
  2019-12-18  8:14       ` Bibby Hsieh
  0 siblings, 1 reply; 43+ messages in thread
From: Dennis-YC Hsieh @ 2019-12-18  8:00 UTC (permalink / raw)
  To: Bibby Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, CK Hu, Houlong Wei,
	linux-arm-kernel

Hi Bibby,

On Fri, 2019-12-06 at 12:02 +0800, Bibby Hsieh wrote:
> On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > Return error code to client if send message fail,
> > so that client has chance to error handling.
> > 
> This patches seems like a fix patch.
> Please add fixes, thanks.
> 
> Bibby

Do you mean add *fixes* in title?
How about *fixes flush async function return error when send fail* ?


Regards,
Dennis

> > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > ---
> >  drivers/soc/mediatek/mtk-cmdq-helper.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 274f6f311d05..8421b4090304 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -353,11 +353,11 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
> >  		spin_unlock_irqrestore(&client->lock, flags);
> >  	}
> >  
> > -	mbox_send_message(client->chan, pkt);
> > +	err = mbox_send_message(client->chan, pkt);
> >  	/* We can send next packet immediately, so just call txdone. */
> >  	mbox_client_txdone(client->chan, 0);
> >  
> > -	return 0;
> > +	return err;
> >  }
> >  EXPORT_SYMBOL(cmdq_pkt_flush_async);
> >  
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code
  2019-12-18  8:00     ` Dennis-YC Hsieh
@ 2019-12-18  8:14       ` Bibby Hsieh
  0 siblings, 0 replies; 43+ messages in thread
From: Bibby Hsieh @ 2019-12-18  8:14 UTC (permalink / raw)
  To: Dennis-YC Hsieh
  Cc: Rob Herring, Matthias Brugger, Jassi Brar, linux-kernel,
	linux-mediatek, devicetree, wsd_upstream, CK Hu, Houlong Wei,
	linux-arm-kernel

On Wed, 2019-12-18 at 16:00 +0800, Dennis-YC Hsieh wrote:
> Hi Bibby,
> 
> On Fri, 2019-12-06 at 12:02 +0800, Bibby Hsieh wrote:
> > On Wed, 2019-11-27 at 09:58 +0800, Dennis YC Hsieh wrote:
> > > Return error code to client if send message fail,
> > > so that client has chance to error handling.
> > > 
> > This patches seems like a fix patch.
> > Please add fixes, thanks.
> > 
> > Bibby
> 
> Do you mean add *fixes* in title?
> How about *fixes flush async function return error when send fail* ?
> 
> 
Hi, Dennis,

Please refer to
https://www.kernel.org/doc/html/v4.17/process/submitting-patches.html
and find "fixes". 

Thanks :D

Bibby
> Regards,
> Dennis
> 
> > > Signed-off-by: Dennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
> > > ---
> > >  drivers/soc/mediatek/mtk-cmdq-helper.c | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > > index 274f6f311d05..8421b4090304 100644
> > > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > > @@ -353,11 +353,11 @@ int cmdq_pkt_flush_async(struct cmdq_pkt *pkt, cmdq_async_flush_cb cb,
> > >  		spin_unlock_irqrestore(&client->lock, flags);
> > >  	}
> > >  
> > > -	mbox_send_message(client->chan, pkt);
> > > +	err = mbox_send_message(client->chan, pkt);
> > >  	/* We can send next packet immediately, so just call txdone. */
> > >  	mbox_client_txdone(client->chan, 0);
> > >  
> > > -	return 0;
> > > +	return err;
> > >  }
> > >  EXPORT_SYMBOL(cmdq_pkt_flush_async);
> > >  
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2019-12-18  8:14 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-27  1:58 [PATCH v2] support gce on mt6779 platform Dennis YC Hsieh
2019-11-27  1:58 ` [PATCH v2 00/14] " Dennis YC Hsieh
2019-11-27  1:58 ` [PATCH v2 01/14] dt-binding: gce: add gce header file for mt6779 Dennis YC Hsieh
2019-12-05 20:37   ` Rob Herring
2019-11-27  1:58 ` [PATCH v2 02/14] mailbox: cmdq: variablize address shift in platform Dennis YC Hsieh
2019-12-10  1:55   ` CK Hu
2019-12-12  1:03     ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 03/14] mailbox: cmdq: support mt6779 gce platform definition Dennis YC Hsieh
2019-12-10  2:04   ` CK Hu
2019-11-27  1:58 ` [PATCH v2 04/14] mailbox: mediatek: cmdq: clear task in channel before shutdown Dennis YC Hsieh
2019-12-10  2:49   ` CK Hu
2019-12-12  1:13     ` Dennis-YC Hsieh
2019-12-12  1:31       ` CK Hu
2019-12-12  1:51         ` Dennis-YC Hsieh
2019-12-12  2:03           ` CK Hu
2019-12-12  2:20             ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 05/14] arm64: dts: add gce node for mt6779 Dennis YC Hsieh
2019-12-06  4:05   ` Bibby Hsieh
2019-11-27  1:58 ` [PATCH v2 06/14] soc: mediatek: cmdq: return send msg error code Dennis YC Hsieh
2019-12-06  4:02   ` Bibby Hsieh
2019-12-18  8:00     ` Dennis-YC Hsieh
2019-12-18  8:14       ` Bibby Hsieh
2019-11-27  1:58 ` [PATCH v2 07/14] soc: mediatek: cmdq: add assign function Dennis YC Hsieh
2019-12-10  3:24   ` CK Hu
2019-12-12  1:15     ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 08/14] soc: mediatek: cmdq: add write_s function Dennis YC Hsieh
2019-12-10  5:18   ` CK Hu
2019-12-12  1:31     ` Dennis-YC Hsieh
2019-12-10  7:35   ` Bibby Hsieh
2019-12-12  1:31     ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 09/14] soc: mediatek: cmdq: add read_s function Dennis YC Hsieh
2019-12-10  7:55   ` CK Hu
2019-12-12  1:33     ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 10/14] soc: mediatek: cmdq: add write_s value function Dennis YC Hsieh
2019-11-27  1:58 ` [PATCH v2 11/14] soc: mediatek: cmdq: export finalize function Dennis YC Hsieh
2019-12-10  7:50   ` CK Hu
2019-11-27  1:58 ` [PATCH v2 12/14] soc: mediatek: cmdq: add loop function Dennis YC Hsieh
2019-12-11  1:48   ` CK Hu
2019-12-12  1:37     ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 13/14] soc: mediatek: cmdq: add wait no clear event function Dennis YC Hsieh
2019-12-11  2:04   ` CK Hu
2019-12-12  1:42     ` Dennis-YC Hsieh
2019-11-27  1:58 ` [PATCH v2 14/14] soc: mediatek: cmdq: add set " Dennis YC Hsieh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).