diff --git a/Platforms/ARM/Juno/AcpiTables/AcpiSsdtRootPci.asl b/Platforms/ARM/Juno/AcpiTables/AcpiSsdtRootPci.asl
index 800d2cb..55b76d6 100644
--- a/Platforms/ARM/Juno/AcpiTables/AcpiSsdtRootPci.asl
+++ b/Platforms/ARM/Juno/AcpiTables/AcpiSsdtRootPci.asl
@@ -15,20 +15,43 @@
 #include "ArmPlatform.h"
 
 /*
-  See Reference [1] 6.2.12
-  "There are two ways that _PRT can be used. ...
-  In the second model, the PCI interrupts are hardwired to specific interrupt
-  inputs on the interrupt controller and are not configurable. In this case,
-  the Source field in _PRT does not reference a device, but instead contains
-  the value zero, and the Source Index field contains the global system
-  interrupt to which the PCI interrupt is hardwired."
+  See ACPI 6.1 Section 6.2.13
+
+  There are two ways that _PRT can be used. ...
+
+  In the first model, a PCI Link device is used to provide additional
+  configuration information such as whether the interrupt is Level or
+  Edge triggered, it is active High or Low, Shared or Exclusive, etc.
+
+  In the second model, the PCI interrupts are hardwired to specific
+  interrupt inputs on the interrupt controller and are not
+  configurable. In this case, the Source field in _PRT does not
+  reference a device, but instead contains the value zero, and the
+  Source Index field contains the global system interrupt to which the
+  PCI interrupt is hardwired.
+
+  We use the first model with link indirection to set the correct
+  interrupt type as PCI defaults (Level Triggered, Active Low) are not
+  compatible with GICv2.
 */
-#define PRT_ENTRY(Address, Pin, Interrupt)                                                       \
-          Package (4) {                                                                           \
+#define LNK_DEVICE(Unique_Id, Link_Name, irq)							\
+	Device(Link_Name) {									\
+	    Name(_HID, EISAID("PNP0C0F"))							\
+	    Name(_UID, Unique_Id)								\
+	    Name(_PRS, ResourceTemplate() {							\
+	        Interrupt(ResourceProducer, Level, ActiveHigh, Exclusive) { irq }		\
+	    })											\
+	    Method (_CRS, 0) { Return (_PRS) }							\
+	    Method (_SRS, 1) { }								\
+	    Method (_DIS) { }									\
+	}
+
+#define PRT_ENTRY(Address, Pin, Link)								  \
+        Package (4) {                                                                             \
             Address,    /* uses the same format as _ADR */                                        \
             Pin,        /* The PCI pin number of the device (0-INTA, 1-INTB, 2-INTC, 3-INTD). */  \
-            Zero,       /* allocated from the global interrupt pool. */                           \
-            Interrupt   /* global system interrupt number */                                      \
+            Link,       /* Interrupt allocated via Link device. */   	     	     	      	  \
+            Zero        /* global system interrupt number (no used) */				  \
           }
 
 /*
@@ -36,7 +59,7 @@
   "High word–Device #, Low word–Function #. (for example, device 3, function 2 is
    0x00030002). To refer to all the functions on a device #, use a function number of FFFF)."
 */
-#define ROOT_PRT_ENTRY(Pin, Interrupt)   PRT_ENTRY(0x0000FFFF, Pin, Interrupt)
+#define ROOT_PRT_ENTRY(Pin, Link)   PRT_ENTRY(0x0000FFFF, Pin, Link)
                                                     // Device 0 for Bridge.
 
 
@@ -45,6 +68,11 @@ DefinitionBlock("SsdtPci.aml", "SSDT", 1, "ARMLTD", "ARM-JUNO", EFI_ACPI_ARM_OEM
 	//
 	// PCI Root Complex
 	//
+	LNK_DEVICE(1, LNKA, 168)
+	LNK_DEVICE(2, LNKB, 169)
+	LNK_DEVICE(3, LNKC, 170)
+	LNK_DEVICE(4, LNKD, 171)
+
 	Device(PCI0)
     {
   		Name(_HID, EISAID("PNP0A08")) // PCI Express Root Bridge
@@ -60,10 +88,10 @@ DefinitionBlock("SsdtPci.aml", "SSDT", 1, "ARMLTD", "ARM-JUNO", EFI_ACPI_ARM_OEM
 
 		// PCI Routing Table
 		Name(_PRT, Package() {
-			ROOT_PRT_ENTRY(0, 168),   // INTA
-			ROOT_PRT_ENTRY(1, 169),   // INTB
-			ROOT_PRT_ENTRY(2, 170),   // INTC
-			ROOT_PRT_ENTRY(3, 171),   // INTD
+			ROOT_PRT_ENTRY(0, LNKA),   // INTA
+			ROOT_PRT_ENTRY(1, LNKB),   // INTB
+			ROOT_PRT_ENTRY(2, LNKC),   // INTC
+			ROOT_PRT_ENTRY(3, LNKD),   // INTD
 		})
         // Root complex resources
 		Method (_CRS, 0, Serialized) {
