工具/软件:
您好、
我正在启用 ICSSG1 IEP0 比较事件中断 (PRU_ICSSG1_PR1_IEP0_CMP_INTR_REQ_0) 并将其路由到 A53 计算集群上运行的 Linux。 我认为我已正确设置 IEP0 和比较事件寄存器;但是、Linux 仍然看不到中断(至少/proc/interrupts 指示了这种情况)。
要配置比较中断路由器以将 PRU_ICSSG1_PR1_IEP0_CMP_INTR_REQ_0 路由到 GICSSG0_SPI_IN_48、我已 通过以下 DTS 修改设置了 CMP_INTROUTER0_INTR_MUXCNTL 寄存器:
diff --git a/arch/arm64/boot/dts/ti/k3-am64-main.dtsi b/arch/arm64/boot/dts/ti/k3-am64-main.dtsi
index f585eda7fa16..00ad21cf1049 100644
--- a/arch/arm64/boot/dts/ti/k3-am64-main.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am64-main.dtsi
@@ -754,6 +754,14 @@ main_cpts0: cpts@39000000 {
ti,cpts-ext-ts-inputs = <8>;
};
+ cmp_event_router: cmp-event-router@a30000 {
+ compatible = "pinctrl-single";
+ reg = <0x0 0xa30000 0x0 0x800>;
+ #pinctrl-cells = <1>;
+ pinctrl-single,register-width = <32>;
+ pinctrl-single,function-mask = <0x0001007f>;
+ };
+
timesync_router: pinctrl@a40000 {
compatible = "pinctrl-single";
reg = <0x0 0xa40000 0x0 0x800>;
diff --git a/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi b/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi
index 0e1447b382ee..98de61704abe 100644
--- a/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi
@@ -429,3 +429,17 @@ adc {
ti,adc-channels = <0 1 2 3 4 5 6 7>;
};
};
+
+/*
+ * compare event routing
+ * desc: route CMPEVENT_INTRTR0 PRU_ICSSG1_PR1_IEP0_CMP_INTR_REQ_0 => GIC CMPEVENT_INTROUTER0_OUTP_0
+ * see: AM6442 TRMr2 (Table 9-60, Table 9-71, Table Table 10-133)
+ */
+&cmp_event_router {
+ pinctrl-names = "default";
+ pinctrl-0 = <&pru_iep_interrupt>;
+
+ pru_iep_interrupt: pru-iep-interrupt {
+ pinctrl-single,pins = <0x00000004 0x00010030>;
+ };
+};
diff --git a/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi b/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi
index 98de61704abe..6d9b91bfa6e5 100644
--- a/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am64-phycore-som.dtsi
@@ -134,6 +134,8 @@ jailhouse_mem: jailhouse@dfa00000 {
apc {
compatible = "apc-memory";
memory-region = <&apc_memory_region>;
+ interrupt-parent = <&gic500>;
+ interrupts = <GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>;
};
请注意、比较中断 48 映射到 ICSSG0 IEP0 比较事件 0、GICSS0 SPI 中断 48 映射到比较事件路由器输出 0。 修改器件树似乎可以正常工作、我在内核模块中成功请求了中断。 我在/proc/interrupts 中看到以下内容即可证实这一点:
547: 0 0 GICv3 48 Level apc
我还配置了 ICSS1 IEP0 寄存器以启用和配置比较事件 0。 我非常有信心已经正确配置了此比较事件、因为我可以看到比较事件状态位状态按预期设置和复位(我通过查看 IEP_CMP_STATUS_REG 寄存器查看此设置)。
问题:
- 我的方法有什么明显的错误吗?
- 是否需要对 PRU 的 INTC 进行任何修改才能将 IEP0 比较中断正确路由到 GIC?
非常感谢您的帮助、
- Jared