powerpc/pseries/iommu: Move window-removing part of remove_ddw into remove_dma_window
Move the window-removing part of remove_ddw into a new function (remove_dma_window), so it can be used to remove other DMA windows. It's useful for removing DMA windows that don't create DIRECT64_PROPNAME property, like the default DMA window from the device, which uses "ibm,dma-window". Signed-off-by: Leonardo Bras <leobras.c@gmail.com> Tested-by: David Dai <zdai@linux.vnet.ibm.com> Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200805030455.123024-4-leobras.c@gmail.com
This commit is contained in:
parent
80f0251231
commit
74d0b3994e
@ -781,25 +781,14 @@ static int __init disable_ddw_setup(char *str)
|
||||
|
||||
early_param("disable_ddw", disable_ddw_setup);
|
||||
|
||||
static void remove_ddw(struct device_node *np, bool remove_prop)
|
||||
static void remove_dma_window(struct device_node *np, u32 *ddw_avail,
|
||||
struct property *win)
|
||||
{
|
||||
struct dynamic_dma_window_prop *dwp;
|
||||
struct property *win64;
|
||||
u32 ddw_avail[DDW_APPLICABLE_SIZE];
|
||||
u64 liobn;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
ret = of_property_read_u32_array(np, "ibm,ddw-applicable",
|
||||
&ddw_avail[0], DDW_APPLICABLE_SIZE);
|
||||
|
||||
win64 = of_find_property(np, DIRECT64_PROPNAME, NULL);
|
||||
if (!win64)
|
||||
return;
|
||||
|
||||
if (ret || win64->length < sizeof(*dwp))
|
||||
goto delprop;
|
||||
|
||||
dwp = win64->value;
|
||||
dwp = win->value;
|
||||
liobn = (u64)be32_to_cpu(dwp->liobn);
|
||||
|
||||
/* clear the whole window, note the arg is in kernel pages */
|
||||
@ -821,10 +810,30 @@ static void remove_ddw(struct device_node *np, bool remove_prop)
|
||||
pr_debug("%pOF: successfully removed direct window: rtas returned "
|
||||
"%d to ibm,remove-pe-dma-window(%x) %llx\n",
|
||||
np, ret, ddw_avail[DDW_REMOVE_PE_DMA_WIN], liobn);
|
||||
}
|
||||
|
||||
delprop:
|
||||
if (remove_prop)
|
||||
ret = of_remove_property(np, win64);
|
||||
static void remove_ddw(struct device_node *np, bool remove_prop)
|
||||
{
|
||||
struct property *win;
|
||||
u32 ddw_avail[DDW_APPLICABLE_SIZE];
|
||||
int ret = 0;
|
||||
|
||||
ret = of_property_read_u32_array(np, "ibm,ddw-applicable",
|
||||
&ddw_avail[0], DDW_APPLICABLE_SIZE);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
win = of_find_property(np, DIRECT64_PROPNAME, NULL);
|
||||
if (!win)
|
||||
return;
|
||||
|
||||
if (win->length >= sizeof(struct dynamic_dma_window_prop))
|
||||
remove_dma_window(np, ddw_avail, win);
|
||||
|
||||
if (!remove_prop)
|
||||
return;
|
||||
|
||||
ret = of_remove_property(np, win);
|
||||
if (ret)
|
||||
pr_warn("%pOF: failed to remove direct window property: %d\n",
|
||||
np, ret);
|
||||
|
Loading…
Reference in New Issue
Block a user