• Leonardo Bras's avatar
    powerpc/pseries/iommu: Add ddw_property_create() and refactor enable_ddw() · 7ed2ed2d
    Leonardo Bras authored
    Code used to create a ddw property that was previously scattered in
    enable_ddw() is now gathered in ddw_property_create(), which deals with
    allocation and filling the property, letting it ready for
    of_property_add(), which now occurs in sequence.
    
    This created an opportunity to reorganize the second part of enable_ddw():
    
    Without this patch enable_ddw() does, in order:
    kzalloc() property & members, create_ddw(), fill ddwprop inside property,
    ddw_list_new_entry(), do tce_setrange_multi_pSeriesLP_walk in all memory,
    of_add_property(), and list_add().
    
    With this patch enable_ddw() does, in order:
    create_ddw(), ddw_property_create(), of_add_property(),
    ddw_list_new_entry(), do tce_setrange_multi_pSeriesLP_walk in all memory,
    and list_add().
    
    This change requires of_remove_property() in case anything fails after
    of_add_property(), but we get to do tce_setrange_multi_pSeriesLP_walk
    in all memory, which looks the most expensive operation, only if
    everything else succeeds.
    
    Also, the error path got remove_ddw() replaced by a new helper
    __remove_dma_window(), which only removes the new DDW with an rtas-call.
    For this, a new helper clean_dma_window() was needed to clean anything
    that could left if walk_system_ram_range() fails.
    Signed-off-by: default avatarLeonardo Bras <leobras.c@gmail.com>
    Reviewed-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210817063929.38701-7-leobras.c@gmail.com
    7ed2ed2d
iommu.c 43.1 KB