Re: [PATCH v4 09/11] powerpc/pseries/iommu: Find existing DDW with given property name

Alexey Kardashevskiy
2021-05-11T07:57:48Z

On 01/05/2021 02:31, Leonardo Bras wrote:
> At the moment pseries stores information about created directly mapped
> DDW window in DIRECT64_PROPNAME.
>
> With the objective of implementing indirect DMA mapping with DDW, it's
> necessary to have another propriety name to make sure kexec'ing into older
> kernels does not break, as it would if we reuse DIRECT64_PROPNAME.
>
> In order to have this, find_existing_ddw_windows() needs to be able to
> look for different property names.
>
> Extract find_existing_ddw_windows() into find_existing_ddw_windows_named()
> and calls it with current property name.
>
> Signed-off-by: Leonardo Bras <leobras.c@gmail.com>
> ---
> arch/powerpc/platforms/pseries/iommu.c | 25 +++++++++++++++----------
> 1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
> index f8922fcf34b6..de54ddd9decd 100644
> --- a/arch/powerpc/platforms/pseries/iommu.c
> +++ b/arch/powerpc/platforms/pseries/iommu.c
> @@ -888,24 +888,21 @@ static struct direct_window *ddw_list_new_entry(struct device_node *pdn,
> return window;
> }
>
> -static int find_existing_ddw_windows(void)
> +static void find_existing_ddw_windows_named(const char *name)

I'd suggest find_existing_ddw_windows_by_name() but this is nitpicking.

Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>

> {
> int len;
> struct device_node *pdn;
> struct direct_window *window;
> - const struct dynamic_dma_window_prop *direct64;
> -
> - if (!firmware_has_feature(FW_FEATURE_LPAR))
> - return 0;
> + const struct dynamic_dma_window_prop *dma64;
>
> - for_each_node_with_property(pdn, DIRECT64_PROPNAME) {
> - direct64 = of_get_property(pdn, DIRECT64_PROPNAME, &len);
> - if (!direct64 || len < sizeof(*direct64)) {
> - remove_ddw(pdn, true, DIRECT64_PROPNAME);
> + for_each_node_with_property(pdn, name) {
> + dma64 = of_get_property(pdn, name, &len);
> + if (!dma64 || len < sizeof(*dma64)) {
> + remove_ddw(pdn, true, name);
> continue;
> }
>
> - window = ddw_list_new_entry(pdn, direct64);
> + window = ddw_list_new_entry(pdn, dma64);
> if (!window)
> break;
>
> @@ -913,6 +910,14 @@ static int find_existing_ddw_windows(void)
> list_add(&window->list, &direct_window_list);
> spin_unlock(&direct_window_list_lock);
> }
> +}
> +
> +static int find_existing_ddw_windows(void)
> +{
> + if (!firmware_has_feature(FW_FEATURE_LPAR))
> + return 0;
> +
> + find_existing_ddw_windows_named(DIRECT64_PROPNAME);
>
> return 0;
> }
>

--
Alexey