lkml.org 
[lkml]   [2021]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 09/11] powerpc/pseries/iommu: Find existing DDW with given property name
    Date
    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)
    {
    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;
    }
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-04-30 18:33    [W:2.400 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site