Re: [PATCH 00/17] Add support for the LAN966x PCI device using a DT overlay

From: Herve Codina
Date: Tue Apr 30 2024 - 12:34:55 EST


Hi Andrew,

On Tue, 30 Apr 2024 15:40:16 +0200
Andrew Lunn <andrew@xxxxxxx> wrote:

> On Tue, Apr 30, 2024 at 10:37:09AM +0200, Herve Codina wrote:
> > Hi,
> >
> > This series adds support for the LAN966x chip when used as a PCI
> > device.
>
> > This patch series for now adds a Device Tree overlay that describes an
> > initial subset of the devices available over PCI in the LAN996x, and
> > follow-up patch series will add support for more once this initial
> > support has landed.
>
> What host systems have you tested with? Are they all native DT, or
> have you tested on an ACPI system? I'm just wondering how well DT
> overlay works if i were to plug a LAN966x device into something like
> an x86 ComExpress board?

I tested on a native DT system (marvell board).

Also I tested on a x86 system (basically a simple PC).
Not all components are available upstream to have it working on a x86 (ACPI)
system. The missing component is not related to the LAN966x PCI driver itself
but in the way DT node are created up to the PCI device.
A DT node at PCI device is needed to have a DT node parent (target) for the
overlay.
The DT node chain is also important because BARs address translations are
done using the 'ranges' property available in each node in the chain.

On a full DT system, the DT looks like (simplified in naming and without the
node properties):
/
soc {
...
pci_root_bridge { <-- Present in base dts
pci_to_pci_bridge { <-- Created at runtime based on PCI enumeration
pci_device { <-- Created at runtime based on PCI enumeration
}
}
pci_device { <-- Created at runtime based on PCI enumeration
};
};
};

On x86:
- A DT root empty node is created.
This is already upstream from a first proposal [1] and then second one [2].
- PCI-to-PCI bridge and device DT nodes are created at runtime.
This is the same on DT base systems and this feature is available upstream
too (last proposal at [3]).

The DT node missing in the chain is the node for the PCI root bridge.
On ACPI, no "base" dts describes this node. The PCI root bridge is described
by ACPI.

I have some draft code that create this DT node when a PCI host bridge is
register if a DT node is not already present and so fill the hole in the DT
node chain.
With that the DT in an ACPI system looks like this:
/
pci_root_bridge { <-- Created at runtime when a PCI host bridge is registered
pci_to_pci_bridge { <-- Created at runtime based on PCI enumeration
pci_device { <-- Created at runtime based on PCI enumeration
}
}
pci_device { <-- Created at runtime based on PCI enumeration
};
};

With this node added, the driver works the same way in both DT and ACPI
systems without any modification.

I plan to send the code creating the PCI host bridge node when this current
series is landed in order to add support for DT overlay over PCI on x86
systems.

Also an other series (under review [4]) is needed to avoid struct device
duplication related to the DT nodes creation.

[1] https://lore.kernel.org/lkml/20230317053415.2254616-1-frowand.list@xxxxxxxxx/#r
[2] https://lore.kernel.org/lkml/20240217010557.2381548-1-sboyd@xxxxxxxxxx/
[3] https://lore.kernel.org/lkml/1692120000-46900-1-git-send-email-lizhi.hou@xxxxxxx/
[4] https://lore.kernel.org/lkml/20240423145703.604489-1-herve.codina@xxxxxxxxxxx/

Best regards,
Hervé