Re: [RFC PATCH 1/6] ACPI/IORT: Set PMCG device parent

From: Hanjun Guo
Date: Mon Oct 14 2019 - 22:36:00 EST


Hi John,

On 2019/9/30 22:33, John Garry wrote:
> In the IORT, a PMCG node includes a node reference to its associated
> device.
>
> Set the PMCG platform device parent device for future referencing.
>
> For now, we only consider setting for when the associated component is an
> SMMUv3.
>
> Signed-off-by: John Garry <john.garry@xxxxxxxxxx>
> ---
> drivers/acpi/arm64/iort.c | 34 ++++++++++++++++++++++++++++++++--
> 1 file changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
> index 8569b79e8b58..0b687520c3e7 100644
> --- a/drivers/acpi/arm64/iort.c
> +++ b/drivers/acpi/arm64/iort.c
> @@ -1455,7 +1455,7 @@ static __init const struct iort_dev_config *iort_get_dev_cfg(
> * Returns: 0 on success, <0 failure

...

> */
> static int __init iort_add_platform_device(struct acpi_iort_node *node,
> - const struct iort_dev_config *ops)
> + const struct iort_dev_config *ops, struct device *parent)

Since you added a input for this function, could you please update
the comments of this function as well?

> {
> struct fwnode_handle *fwnode;
> struct platform_device *pdev;
> @@ -1466,6 +1466,8 @@ static int __init iort_add_platform_device(struct acpi_iort_node *node,
> if (!pdev)
> return -ENOMEM;
>
> + pdev->dev.parent = parent;
> +
> if (ops->dev_set_proximity) {
> ret = ops->dev_set_proximity(&pdev->dev, node);
> if (ret)
> @@ -1573,6 +1575,11 @@ static void __init iort_enable_acs(struct acpi_iort_node *iort_node)
> static inline void iort_enable_acs(struct acpi_iort_node *iort_node) { }
> #endif
>
> +static int iort_fwnode_match(struct device *dev, const void *fwnode)
> +{
> + return dev->fwnode == fwnode;
> +}
> +
> static void __init iort_init_platform_devices(void)
> {
> struct acpi_iort_node *iort_node, *iort_end;
> @@ -1594,11 +1601,34 @@ static void __init iort_init_platform_devices(void)
> iort_table->length);
>
> for (i = 0; i < iort->node_count; i++) {
> + struct device *parent = NULL;
> +
> if (iort_node >= iort_end) {
> pr_err("iort node pointer overflows, bad table\n");
> return;
> }
>
> + /* Fixme: handle parent declared in IORT after PMCG */
> + if (iort_node->type == ACPI_IORT_NODE_PMCG) {
> + struct acpi_iort_node *iort_assoc_node;
> + struct acpi_iort_pmcg *pmcg;
> + u32 node_reference;
> +
> + pmcg = (struct acpi_iort_pmcg *)iort_node->node_data;
> +
> + node_reference = pmcg->node_reference;
> + iort_assoc_node = ACPI_ADD_PTR(struct acpi_iort_node, iort,
> + node_reference);
> +
> + if (iort_assoc_node->type == ACPI_IORT_NODE_SMMU_V3) {
> + struct fwnode_handle *assoc_fwnode;
> +
> + assoc_fwnode = iort_get_fwnode(iort_assoc_node);
> +
> + parent = bus_find_device(&platform_bus_type, NULL,
> + assoc_fwnode, iort_fwnode_match);
> + }
> + }

How about using a function to include those new added code to make this
function (iort_init_platform_devices()) a bit cleaner?

> iort_enable_acs(iort_node);
>
> ops = iort_get_dev_cfg(iort_node);
> @@ -1609,7 +1639,7 @@ static void __init iort_init_platform_devices(void)
>
> iort_set_fwnode(iort_node, fwnode);
>
> - ret = iort_add_platform_device(iort_node, ops);
> + ret = iort_add_platform_device(iort_node, ops, parent);

This function is called if ops is valid, so retrieve the parent
can be done before this function I think.

Thanks
Hanjun