soc: mediatek: cmdq: add assign function
authorDennis YC Hsieh <dennis-yc.hsieh@mediatek.com>
Sun, 21 Jun 2020 14:18:26 +0000 (22:18 +0800)
committerMatthias Brugger <matthias.bgg@gmail.com>
Mon, 22 Jun 2020 11:03:05 +0000 (13:03 +0200)
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>
Link: https://lore.kernel.org/r/1592749115-24158-3-git-send-email-dennis-yc.hsieh@mediatek.com
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
drivers/soc/mediatek/mtk-cmdq-helper.c
include/linux/mailbox/mtk-cmdq-mailbox.h
include/linux/soc/mediatek/mtk-cmdq.h

index 87ee9f7..b9e5e4e 100644 (file)
@@ -12,6 +12,7 @@
 #define CMDQ_WRITE_ENABLE_MASK BIT(0)
 #define CMDQ_POLL_ENABLE_MASK  BIT(0)
 #define CMDQ_EOC_IRQ_EN                BIT(0)
+#define CMDQ_REG_TYPE          1
 
 struct cmdq_instruction {
        union {
@@ -21,8 +22,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 src_t:1;
+                       u8 dst_t:1;
+               };
        };
-       u8 subsys;
        u8 op;
 };
 
@@ -278,6 +288,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 = {};
+
+       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_instruction inst = { {0} };
index a4dc45f..70b740a 100644 (file)
@@ -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 {
index a74c1d5..8334021 100644 (file)
@@ -152,6 +152,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