This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6442:在 Linux 上启用和接收 IEP0 比较事件中断

Guru**** 2416110 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1532393/am6442-enabling-and-receiving-iep0-compare-event-interrupts-on-linux

器件型号:AM6442

工具/软件:

您好、

我正在启用 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 寄存器查看此设置)。

问题:

  1. 我的方法有什么明显的错误吗?
  2. 是否需要对 PRU 的 INTC 进行任何修改才能将 IEP0 比较中断正确路由到 GIC?

非常感谢您的帮助、

- Jared

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的中断触发类型在 DTS 中设置不正确。 触发类型最初设置为 IRQ_TYPE_LEVEL_HIGH、这是不正确的;正确的触发类型是 IRQ_TYPE_EDGE_RISING。 在我的 DTS 中进行此更改解决了问题。