Skip to content

Commit dc12273

Browse files
hcodinarobherring
authored andcommitted
PCI: of_property: Add interrupt-controller property in PCI device nodes
PCI devices and bridges DT nodes created during the PCI scan are created with the interrupt-map property set to handle interrupts. In order to set this interrupt-map property at a specific level, a phandle to the parent interrupt controller is needed. On systems that are not fully described by a device-tree, the parent interrupt controller may be unavailable (i.e. not described by the device-tree). As mentioned in the [1], avoiding the use of the interrupt-map property and considering a PCI device as an interrupt controller itself avoid the use of a parent interrupt phandle. In that case, the PCI device itself as an interrupt controller is responsible for routing the interrupts described in the device-tree world (DT overlay) to the PCI interrupts. Add the 'interrupt-controller' property in the PCI device DT node. [1]: https://lore.kernel.org/lkml/CAL_Jsq+je7+9ATR=B6jXHjEJHjn24vQFs4Tvi9=vhDeK9n42Aw@mail.gmail.com/ Signed-off-by: Herve Codina <[email protected]> Acked-by: Bjorn Helgaas <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Rob Herring (Arm) <[email protected]>
1 parent 1e43683 commit dc12273

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

drivers/pci/of_property.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,26 @@ static int of_pci_prop_interrupts(struct pci_dev *pdev,
183183
return of_changeset_add_prop_u32(ocs, np, "interrupts", (u32)pin);
184184
}
185185

186+
static int of_pci_prop_intr_ctrl(struct pci_dev *pdev, struct of_changeset *ocs,
187+
struct device_node *np)
188+
{
189+
int ret;
190+
u8 pin;
191+
192+
ret = pci_read_config_byte(pdev, PCI_INTERRUPT_PIN, &pin);
193+
if (ret != 0)
194+
return ret;
195+
196+
if (!pin)
197+
return 0;
198+
199+
ret = of_changeset_add_prop_u32(ocs, np, "#interrupt-cells", 1);
200+
if (ret)
201+
return ret;
202+
203+
return of_changeset_add_prop_bool(ocs, np, "interrupt-controller");
204+
}
205+
186206
static int of_pci_prop_intr_map(struct pci_dev *pdev, struct of_changeset *ocs,
187207
struct device_node *np)
188208
{
@@ -336,6 +356,10 @@ int of_pci_add_properties(struct pci_dev *pdev, struct of_changeset *ocs,
336356
ret = of_pci_prop_intr_map(pdev, ocs, np);
337357
if (ret)
338358
return ret;
359+
} else {
360+
ret = of_pci_prop_intr_ctrl(pdev, ocs, np);
361+
if (ret)
362+
return ret;
339363
}
340364

341365
ret = of_pci_prop_ranges(pdev, ocs, np);

0 commit comments

Comments
 (0)