* [PATCH] powerpc/iommu: remove default window before creating larger window
@ 2011-10-26 22:43 Nishanth Aravamudan
2011-10-31 22:47 ` Nishanth Aravamudan
0 siblings, 1 reply; 2+ messages in thread
From: Nishanth Aravamudan @ 2011-10-26 22:43 UTC (permalink / raw)
To: benh; +Cc: miltonm, paulus, linuxppc-dev
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 <nacc@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 <nacc@us.ibm.com>
IBM Linux Technology Center
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] powerpc/iommu: remove default window before creating larger window
2011-10-26 22:43 [PATCH] powerpc/iommu: remove default window before creating larger window Nishanth Aravamudan
@ 2011-10-31 22:47 ` Nishanth Aravamudan
0 siblings, 0 replies; 2+ messages in thread
From: Nishanth Aravamudan @ 2011-10-31 22:47 UTC (permalink / raw)
To: benh; +Cc: miltonm, paulus, linuxppc-dev
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 <nacc@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 <nacc@us.ibm.com>
> IBM Linux Technology Center
--
Nishanth Aravamudan <nacc@us.ibm.com>
IBM Linux Technology Center
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-10-31 22:48 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-26 22:43 [PATCH] powerpc/iommu: remove default window before creating larger window Nishanth Aravamudan
2011-10-31 22:47 ` Nishanth Aravamudan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).