Re: [RFC] xhci: fix dma mask setup in xhci.c

2013-06-05 Thread Sarah Sharp
Hi Xenia,

I get a checkpatch warning when I attempt to commit this change:

Applying: xhci: fix dma mask setup in xhci.c
WARNING: line over 80 characters
#23: FILE: drivers/usb/host/xhci.c:4686:
+   if (dma_set_mask(hcd->self.controller, 
DMA_BIT_MASK(32)))

Can you fix that up by adding a newline after the comma and resubmit?

Thanks,
Sarah Sharp

On Sun, May 26, 2013 at 01:08:14PM +0300, Xenia Ragiadakou wrote:
> This patch adds a check on whether the host machine
> supports the xHC DMA address mask and sets the DMA
> mask for coherent DMA address allocation via an
> explicit call to dma_set_coherent_mask().
> 
> According to DMA-API-HOWTO, if coherent DMA address
> mask has not been set explicitly via dma_set_coherent_mask(),
> and the driver calls dma_alloc_coherent() or
> dma_pool_create() to allocate consistent DMA memory
> blocks, the consistent DMA mapping interface will
> return by default DMA addresses which are 32-bit
> addressable.
> 
> Hence, if 64-bit DMA mapping is supported, it
> is appropriate to call dma_set_coherent_mask()
> with DMA_BIT_MASK(64) to take advantage of it.
> 
> Also, according to DMA-API-HOWTO, dma_set_coherent_mask()
> is guaranteed to set successfully the same or a smaller
> mask as dma_set_mask().
> 
> Signed-off-by: Xenia Ragiadakou 
> ---
> 
> After this change, (i have a 64-bit machine) the
> consistent_dma_mask_bits entry for xhci controller
> that appears under:
> /sys/devices/pci:00/:00:/
> changed from 32 to 64.
> I did not find another way to test this change.
> 
>  drivers/usb/host/xhci.c |   32 ++--
>  1 file changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index b4aa79d..887db65 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -4662,11 +4662,21 @@ int xhci_gen_setup(struct usb_hcd *hcd, 
> xhci_get_quirks_t get_quirks)
>*/
>   xhci = hcd_to_xhci(hcd);
>   temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params);
> - if (HCC_64BIT_ADDR(temp)) {
> + /*
> +  * Check if host machine supports 64 bit DMA address mask
> +  * and enable it for both streaming and coherent DMA transfers.
> +  * Otherwise, use 32bit DMA mask, if it is supported.
> +  */
> + if (HCC_64BIT_ADDR(temp) &&
> + !dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64))) {
>   xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
> - dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64));
> + dma_set_coherent_mask(hcd->self.controller,
> +   DMA_BIT_MASK(64));
>   } else {
> - dma_set_mask(hcd->self.controller, DMA_BIT_MASK(32));
> + if (dma_set_mask(hcd->self.controller, 
> DMA_BIT_MASK(32)))
> + goto error;
> + dma_set_coherent_mask(hcd->self.controller,
> +   DMA_BIT_MASK(32));
>   }
>   return 0;
>   }
> @@ -4700,11 +4710,21 @@ int xhci_gen_setup(struct usb_hcd *hcd, 
> xhci_get_quirks_t get_quirks)
>   xhci_dbg(xhci, "Reset complete\n");
>  
>   temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params);
> - if (HCC_64BIT_ADDR(temp)) {
> + /*
> +  * Check if host machine supports 64 bit DMA address mask
> +  * and enable it for both streaming and coherent DMA transfers.
> +  * Otherwise, use 32bit DMA mask, if it is supported.
> +  */
> + if (HCC_64BIT_ADDR(temp) &&
> + !dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64))) {
>   xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
> - dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64));
> + dma_set_coherent_mask(hcd->self.controller,
> +   DMA_BIT_MASK(64));
>   } else {
> - dma_set_mask(hcd->self.controller, DMA_BIT_MASK(32));
> + if (dma_set_mask(hcd->self.controller, DMA_BIT_MASK(32)))
> + goto error;
> + dma_set_coherent_mask(hcd->self.controller,
> +   DMA_BIT_MASK(32));
>   }
>  
>   xhci_dbg(xhci, "Calling HCD init\n");
> -- 
> 1.7.10.4
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[RFC] xhci: fix dma mask setup in xhci.c

2013-05-26 Thread Xenia Ragiadakou
This patch adds a check on whether the host machine
supports the xHC DMA address mask and sets the DMA
mask for coherent DMA address allocation via an
explicit call to dma_set_coherent_mask().

According to DMA-API-HOWTO, if coherent DMA address
mask has not been set explicitly via dma_set_coherent_mask(),
and the driver calls dma_alloc_coherent() or
dma_pool_create() to allocate consistent DMA memory
blocks, the consistent DMA mapping interface will
return by default DMA addresses which are 32-bit
addressable.

Hence, if 64-bit DMA mapping is supported, it
is appropriate to call dma_set_coherent_mask()
with DMA_BIT_MASK(64) to take advantage of it.

Also, according to DMA-API-HOWTO, dma_set_coherent_mask()
is guaranteed to set successfully the same or a smaller
mask as dma_set_mask().

Signed-off-by: Xenia Ragiadakou 
---

After this change, (i have a 64-bit machine) the
consistent_dma_mask_bits entry for xhci controller
that appears under:
/sys/devices/pci:00/:00:/
changed from 32 to 64.
I did not find another way to test this change.

 drivers/usb/host/xhci.c |   32 ++--
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
index b4aa79d..887db65 100644
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4662,11 +4662,21 @@ int xhci_gen_setup(struct usb_hcd *hcd, 
xhci_get_quirks_t get_quirks)
 */
xhci = hcd_to_xhci(hcd);
temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params);
-   if (HCC_64BIT_ADDR(temp)) {
+   /*
+* Check if host machine supports 64 bit DMA address mask
+* and enable it for both streaming and coherent DMA transfers.
+* Otherwise, use 32bit DMA mask, if it is supported.
+*/
+   if (HCC_64BIT_ADDR(temp) &&
+   !dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
-   dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64));
+   dma_set_coherent_mask(hcd->self.controller,
+ DMA_BIT_MASK(64));
} else {
-   dma_set_mask(hcd->self.controller, DMA_BIT_MASK(32));
+   if (dma_set_mask(hcd->self.controller, 
DMA_BIT_MASK(32)))
+   goto error;
+   dma_set_coherent_mask(hcd->self.controller,
+ DMA_BIT_MASK(32));
}
return 0;
}
@@ -4700,11 +4710,21 @@ int xhci_gen_setup(struct usb_hcd *hcd, 
xhci_get_quirks_t get_quirks)
xhci_dbg(xhci, "Reset complete\n");
 
temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params);
-   if (HCC_64BIT_ADDR(temp)) {
+   /*
+* Check if host machine supports 64 bit DMA address mask
+* and enable it for both streaming and coherent DMA transfers.
+* Otherwise, use 32bit DMA mask, if it is supported.
+*/
+   if (HCC_64BIT_ADDR(temp) &&
+   !dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
-   dma_set_mask(hcd->self.controller, DMA_BIT_MASK(64));
+   dma_set_coherent_mask(hcd->self.controller,
+ DMA_BIT_MASK(64));
} else {
-   dma_set_mask(hcd->self.controller, DMA_BIT_MASK(32));
+   if (dma_set_mask(hcd->self.controller, DMA_BIT_MASK(32)))
+   goto error;
+   dma_set_coherent_mask(hcd->self.controller,
+ DMA_BIT_MASK(32));
}
 
xhci_dbg(xhci, "Calling HCD init\n");
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html