Просмотр исходного кода

[bsp][rk3500] fixup the PCIe INTx IRQ information

Signed-off-by: GuEe-GUI <2991707448@qq.com>
GuEe-GUI 10 часов назад
Родитель
Сommit
76c0f2d08d
1 измененных файлов с 11 добавлено и 1 удалено
  1. 11 1
      bsp/rockchip/dm/pci/pcie-dw-rockchip.c

+ 11 - 1
bsp/rockchip/dm/pci/pcie-dw-rockchip.c

@@ -165,6 +165,7 @@ struct rockchip_pcie
     struct rt_work hot_rst_work;
     struct rt_work hot_rst_work;
 
 
     int intx_irq;
     int intx_irq;
+    int intx_cpu;
     rt_uint32_t intx;
     rt_uint32_t intx;
     struct rt_ofw_node *intx_np;
     struct rt_ofw_node *intx_np;
     struct rt_pic intx_pic;
     struct rt_pic intx_pic;
@@ -225,6 +226,7 @@ static void rockchip_pcie_intx_irq_unmask(struct rt_pic_irq *pirq)
 static int rockchip_pcie_intx_irq_map(struct rt_pic *pic, int hwirq, rt_uint32_t mode)
 static int rockchip_pcie_intx_irq_map(struct rt_pic *pic, int hwirq, rt_uint32_t mode)
 {
 {
     int irq;
     int irq;
+    struct rockchip_pcie *rk_pcie = pic->priv_data;
     struct rt_pic_irq *pirq = rt_pic_find_irq(pic, hwirq);
     struct rt_pic_irq *pirq = rt_pic_find_irq(pic, hwirq);
 
 
     if (pirq)
     if (pirq)
@@ -236,7 +238,8 @@ static int rockchip_pcie_intx_irq_map(struct rt_pic *pic, int hwirq, rt_uint32_t
         else
         else
         {
         {
             irq = rt_pic_config_irq(pic, hwirq, hwirq);
             irq = rt_pic_config_irq(pic, hwirq, hwirq);
-            rt_pic_irq_set_triger_mode(irq, RT_IRQ_MODE_LEVEL_HIGH);
+            pirq->mode = mode;
+            RT_IRQ_AFFINITY_SET(pirq->affinity, rk_pcie->intx_cpu);
         }
         }
     }
     }
     else
     else
@@ -1486,6 +1489,8 @@ static rt_err_t rockchip_pcie_dw_probe(struct rt_platform_device *pdev)
 
 
     if (rk_pcie->intx_irq >= 0)
     if (rk_pcie->intx_irq >= 0)
     {
     {
+        RT_IRQ_AFFINITY_DECLARE(intx_affinity);
+
         /* Legacy (INTx) init */
         /* Legacy (INTx) init */
         if (!(intx_np = rt_ofw_get_child_by_tag(np, "legacy-interrupt-controller")))
         if (!(intx_np = rt_ofw_get_child_by_tag(np, "legacy-interrupt-controller")))
         {
         {
@@ -1505,6 +1510,11 @@ static rt_err_t rockchip_pcie_dw_probe(struct rt_platform_device *pdev)
 
 
         rt_hw_interrupt_install(rk_pcie->intx_irq, rockchip_pcie_legacy_isr, rk_pcie, "rk-pcie-legacy");
         rt_hw_interrupt_install(rk_pcie->intx_irq, rockchip_pcie_legacy_isr, rk_pcie, "rk-pcie-legacy");
         rt_hw_interrupt_umask(rk_pcie->intx_irq);
         rt_hw_interrupt_umask(rk_pcie->intx_irq);
+
+        if (!rt_pic_irq_get_affinity(rk_pcie->intx_irq, intx_affinity))
+        {
+            rk_pcie->intx_cpu = rt_bitmap_next_set_bit(intx_affinity, 0, RT_CPUS_NR);
+        }
     }
     }
     else
     else
     {
     {