IRQ: Instantiate pci link controller earlier
authorLukas Humbel <lukas.humbel@inf.ethz.ch>
Wed, 10 Aug 2016 14:33:27 +0000 (16:33 +0200)
committerLukas Humbel <lukas.humbel@inf.ethz.ch>
Wed, 10 Aug 2016 14:33:27 +0000 (16:33 +0200)
On machines with non-trivial pci hierarchies, the pci link
controllers got instantiated too early, before every prt
entry was added to the skb. Now we instantiate the controller
as soon as the discovery is done.

Signed-off-by: Lukas Humbel <lukas.humbel@inf.ethz.ch>

usr/acpi/acpi.c
usr/skb/programs/irq_routing_new.pl

index cf0c1a4..4ddbc50 100644 (file)
@@ -431,6 +431,12 @@ static void get_irq_routing(ACPI_HANDLE handle, uint8_t bus)
             }
         }
 
+        errval_t err;
+        err = skb_execute_query("add_pcilnk_controller_by_name(\"%s\", Lbl), "
+                "writeln(Lbl).", esource);
+        if(err_is_fail(err)){
+            DEBUG_SKB_ERR(err, "add_pcilnk_controller_by_name");
+        }
         free(esource);
     }
 }
index e34de40..ecc092e 100644 (file)
@@ -427,16 +427,20 @@ add_x86_controllers :-
         get_min_range(CpuPorts, MinCpu),
         get_unused_range(16, PicInRange),
         assert_controller(pic_a, pic, PicInRange, [MinCpu])
-    ) ; true),
+    ) ; true).
 
     % PIR to pcilnk controllers
-    findall(Name, pir(Name, _),Li),
-    sort(Li,LiUnique),
-    (foreach(Name,LiUnique) do (
-        findall(Gsi, pir(Name, Gsi), GSIListT),
-        sort(GSIListT,GSIList),
-        add_pcilnk_controller(GSIList, Name, _)
-    )).
+    % This is now added on the fly when all pir facts
+    % become available. ACPI calls
+    % add_pcilnk_controller_by_name(Name, Lbl)
+    % after adding all relevant PIR facts.
+    %findall(Name, pir(Name, _),Li),
+    %sort(Li,LiUnique),
+    %(foreach(Name,LiUnique) do (
+    %    findall(Gsi, pir(Name, Gsi), GSIListT),
+    %    sort(GSIListT,GSIList),
+    %    add_pcilnk_controller(GSIList, Name, _)
+    %)).
 
 
 
@@ -577,6 +581,14 @@ add_pcilnk_controller(GSIList, Name, Lbl) :-
     assert(pcilnk_index(Name, Lbl)),
     assert_controller(Lbl, pcilnk, InRange, OutRange).
 
+% For a given (ACPI) pci link controller name, this looks
+% up all the GSI from the pir(..) facts and instantiates the controller
+add_pcilnk_controller_by_name(Name, Lbl) :-
+    findall(Gsi, pir(Name, Gsi), GSIListT),
+    sort(GSIListT,GSIList),
+    add_pcilnk_controller(GSIList, Name, Lbl).
+
+
 
 add_ioapic_controller(Lbl, IoApicId, GSIBase) :-
     ((