Hi Ben,

Please don't take this patch :)

While, it does work around some issues I'm tracking down, it can lead
to worse ones if we are unable to configure the larger DMA window, or if
some functions in a PE don't use 64-bit DMA masks.

Thanks,
Nish

On 26.10.2011 [15:43:23 -0700], Nishanth Aravamudan wrote:
> The DDW feature relies on there being sufficient TCE space to allocate
> for the requested DMA window size. The default window uses up some of
> that space, though, and it is recommended to first remove the default
> window and then allocate the larger window advertised by firmware. Do
> this by abstracting out parts of remove_ddw into a function that does
> not assume an existing larger window has been created.
> 
> Signed-off-by: Nishanth Aravamudan <n...@us.ibm.com>
> ---
>  arch/powerpc/platforms/pseries/iommu.c |   35 +++++++++++++++++++++++--------
>  1 files changed, 26 insertions(+), 9 deletions(-)
> 
> Is there a better way to get the default window's LIOBN than to call
> of_parse_dma_window?
> 
> diff --git a/arch/powerpc/platforms/pseries/iommu.c 
> b/arch/powerpc/platforms/pseries/iommu.c
> index 01faab9..afcc04c 100644
> --- a/arch/powerpc/platforms/pseries/iommu.c
> +++ b/arch/powerpc/platforms/pseries/iommu.c
> @@ -655,6 +655,21 @@ static int __init disable_ddw_setup(char *str)
>  
>  early_param("disable_ddw", disable_ddw_setup);
>  
> +static void __remove_ddw(struct device_node *np, const u32 *ddw_avail, u64 
> liobn)
> +{
> +     int ret;
> +
> +     ret = rtas_call(ddw_avail[2], 1, 1, NULL, liobn);
> +     if (ret)
> +             pr_warning("%s: failed to remove direct window: rtas returned "
> +                     "%d to ibm,remove-pe-dma-window(%x) %llx\n",
> +                     np->full_name, ret, ddw_avail[2], liobn);
> +     else
> +             pr_debug("%s: successfully removed direct window: rtas returned 
> "
> +                     "%d to ibm,remove-pe-dma-window(%x) %llx\n",
> +                     np->full_name, ret, ddw_avail[2], liobn);
> +}
> +
>  static void remove_ddw(struct device_node *np)
>  {
>       struct dynamic_dma_window_prop *dwp;
> @@ -684,15 +699,7 @@ static void remove_ddw(struct device_node *np)
>               pr_debug("%s successfully cleared tces in window.\n",
>                        np->full_name);
>  
> -     ret = rtas_call(ddw_avail[2], 1, 1, NULL, liobn);
> -     if (ret)
> -             pr_warning("%s: failed to remove direct window: rtas returned "
> -                     "%d to ibm,remove-pe-dma-window(%x) %llx\n",
> -                     np->full_name, ret, ddw_avail[2], liobn);
> -     else
> -             pr_debug("%s: successfully removed direct window: rtas returned 
> "
> -                     "%d to ibm,remove-pe-dma-window(%x) %llx\n",
> -                     np->full_name, ret, ddw_avail[2], liobn);
> +     __remove_ddw(np, ddw_avail, liobn);
>  
>  delprop:
>       ret = prom_remove_property(np, win64);
> @@ -843,6 +850,8 @@ static u64 enable_ddw(struct pci_dev *dev, struct 
> device_node *pdn)
>       struct direct_window *window;
>       struct property *win64;
>       struct dynamic_dma_window_prop *ddwprop;
> +     const void *dma_window = NULL;
> +     unsigned long liobn, offset, size;
>  
>       mutex_lock(&direct_window_init_mutex);
>  
> @@ -918,6 +927,14 @@ static u64 enable_ddw(struct pci_dev *dev, struct 
> device_node *pdn)
>               goto out_free_prop;
>       }
>  
> +     /*
> +      * To maximize the resources available to the create RTAS call,
> +      * delete the existing DMA window
> +      */
> +     dma_window = of_get_property(pdn, "ibm,dma-window", NULL);
> +     of_parse_dma_window(pdn, dma_window, &liobn, &offset, &size);
> +     __remove_ddw(pdn, ddw_avail, liobn);
> +
>       ret = create_ddw(dev, ddw_avail, &create, page_shift, len);
>       if (ret != 0)
>               goto out_free_prop;
> -- 
> 1.7.5.4
> 
> 
> -- 
> Nishanth Aravamudan <n...@us.ibm.com>
> IBM Linux Technology Center

-- 
Nishanth Aravamudan <n...@us.ibm.com>
IBM Linux Technology Center

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to