media: venus: hfi: Add 6xx interrupt support
authorDikshita Agarwal <dikshita@codeaurora.org>
Fri, 2 Apr 2021 10:06:36 +0000 (12:06 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 6 Apr 2021 13:47:19 +0000 (15:47 +0200)
This commit adds 6xx specific interrupt support, some register offsets and
bitmasks differ from 4xx, which we account for in this commit.

[bod: Added commit log. Moved register definition into commit]

Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
Co-developed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/qcom/venus/hfi_venus.c

index 5f9c8aa..09fc81d 100644 (file)
@@ -359,8 +359,14 @@ static void venus_set_registers(struct venus_hfi_device *hdev)
 static void venus_soft_int(struct venus_hfi_device *hdev)
 {
        void __iomem *cpu_ic_base = hdev->core->cpu_ic_base;
+       u32 clear_bit;
 
-       writel(BIT(CPU_IC_SOFTINT_H2A_SHIFT), cpu_ic_base + CPU_IC_SOFTINT);
+       if (IS_V6(hdev->core))
+               clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT_V6);
+       else
+               clear_bit = BIT(CPU_IC_SOFTINT_H2A_SHIFT);
+
+       writel(clear_bit, cpu_ic_base + CPU_IC_SOFTINT);
 }
 
 static int venus_iface_cmdq_write_nolock(struct venus_hfi_device *hdev,
@@ -474,8 +480,10 @@ static int venus_boot_core(struct venus_hfi_device *hdev)
        if (count >= max_tries)
                ret = -ETIMEDOUT;
 
-       if (IS_V6(hdev->core))
+       if (IS_V6(hdev->core)) {
+               writel(0x1, cpu_cs_base + CPU_CS_H2XSOFTINTEN_V6);
                writel(0x0, cpu_cs_base + CPU_CS_X2RPMH_V6);
+       }
 
        return ret;
 }
@@ -1061,14 +1069,20 @@ static irqreturn_t venus_isr(struct venus_core *core)
                return IRQ_NONE;
 
        status = readl(wrapper_base + WRAPPER_INTR_STATUS);
-
-       if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
-           status & WRAPPER_INTR_STATUS_A2HWD_MASK ||
-           status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
-               hdev->irq_status = status;
-
+       if (IS_V6(core)) {
+               if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
+                   status & WRAPPER_INTR_STATUS_A2HWD_MASK_V6 ||
+                   status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
+                       hdev->irq_status = status;
+       } else {
+               if (status & WRAPPER_INTR_STATUS_A2H_MASK ||
+                   status & WRAPPER_INTR_STATUS_A2HWD_MASK ||
+                   status & CPU_CS_SCIACMDARG0_INIT_IDLE_MSG_MASK)
+                       hdev->irq_status = status;
+       }
        writel(1, cpu_cs_base + CPU_CS_A2HSOFTINTCLR);
-       writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
+       if (!IS_V6(core))
+               writel(status, wrapper_base + WRAPPER_INTR_CLEAR);
 
        return IRQ_WAKE_THREAD;
 }