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.ga...@huawei.com>
> ---
>  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

Reply via email to