Re: [U-Boot] [RESEND] drivers/usb/ehci: Use platform-specific accessors

2017-10-31 Thread Vladimir Boroda
Alexey,
I tested the patch on PowerPC.  Seems to work fine, but you have to make sure 
to set the proper order of arguments for when the EHCI registers are big 
endian:  __raw_writel(cpu_to_be32(b), a)
To test this patch I had to verify that __raw_ functions are supported for 
PowerPC, so I created another patch, more in line with your original intent.  
Here it is:--diff --git 
a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 7c39bec..aeb9745 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -101,11 +101,15 @@ struct usb_linux_config_descriptor {
 } __attribute__ ((packed));

 #if defined CONFIG_EHCI_DESC_BIG_ENDIAN
-#define ehci_readl(x)  cpu_to_be32(readl(x))
-#define ehci_writel(a, b)  writel(cpu_to_be32(b), a)
+/*
+ * On big-endian platforms readl() and writel() perform automatic conversion
+ * from and to little endian.
+ */
+#define ehci_readl(x)  be32_to_cpu(__raw_readl(x))
+#define ehci_writel(a, b)  __raw_writel(cpu_to_be32(b), a)
 #else
-#define ehci_readl(x)  cpu_to_le32(readl(x))
-#define ehci_writel(a, b)  writel(cpu_to_le32(b), a)
+#define ehci_readl(x)  le32_to_cpu(__raw_readl(x))
+#define ehci_writel(a, b)  __raw_writel(cpu_to_le32(b), a)
 #endif

 #if defined CONFIG_EHCI_MMIO_BIG_ENDIAN
--Thanks,Vladimir
 

On Monday, October 30, 2017, 7:49:02 AM EDT, Alexey Brodkin 
 wrote:  
 
 Hi Marek, Vladimir,

On Sun, 2017-10-29 at 11:00 +0100, Marek Vasut wrote:
> On 10/27/2017 02:42 PM, Vladimir Boroda wrote:
> > 
> > Alexey/Marek,
> > 
> > It appears that the "drivers/usb/ehci: Use platform-specific accessors"
> > patch that was submitted in June (and currently adopted in U-Boot
> > releases) kills USB EHCI functionality on PowerPC and likely all other
> > big-endian platforms.  The readl() and writel() accessors already
> > perform endian port to cpu conversion, so no extra conversion was
> > necessary.  The double conversion caused incorrect reading of USB EHCI
> > registers.
> 
> Give Alexey a few days, I've met him at a conference a few days ago so
> he's probably still traveling.

Yep indeed I was recovering after the last trip.

> > I can propose a patch to fix this issue, currently not sure how to
> > submit it for U-Boot approval.  Or you may want to pull the previous
> > patch (or replace the readl() and writel() with some endian-agnostic
> > register reading functions).

Indeed I do see a problem with existing implementation of ehci_{readl|writel}.
Could you please try the following fix which I believe is right now:
->8--
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 7c39becd247e..7080ae8bded2 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -101,11 +101,11 @@ struct usb_linux_config_descriptor {
 } __attribute__ ((packed));
 
 #if defined CONFIG_EHCI_DESC_BIG_ENDIAN
-#define ehci_readl(x)  cpu_to_be32(readl(x))
-#define ehci_writel(a, b)  writel(cpu_to_be32(b), a)
+#define ehci_readl(x)  be32_to_cpu(__raw_readl(x))
+#define ehci_writel(a, b)  __raw_writel(cpu_to_be32(a), b)
 #else
-#define ehci_readl(x)  cpu_to_le32(readl(x))
-#define ehci_writel(a, b)  writel(cpu_to_le32(b), a)
+#define ehci_readl(x)  readl(x)
+#define ehci_writel(a, b)  writel(b, a)
 #endif
 
 #if defined CONFIG_EHCI_MMIO_BIG_ENDIAN
->8--

I don't have BE platform handy now so your "Tested-by" will be very
nice to have. On LE platform the change above doesn't cause any problems
[as expected] :)

-Alexey
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RESEND] drivers/usb/ehci: Use platform-specific accessors

2017-10-30 Thread Alexey Brodkin
Hi Marek, Vladimir,

On Sun, 2017-10-29 at 11:00 +0100, Marek Vasut wrote:
> On 10/27/2017 02:42 PM, Vladimir Boroda wrote:
> > 
> > Alexey/Marek,
> > 
> > It appears that the "drivers/usb/ehci: Use platform-specific accessors"
> > patch that was submitted in June (and currently adopted in U-Boot
> > releases) kills USB EHCI functionality on PowerPC and likely all other
> > big-endian platforms.  The readl() and writel() accessors already
> > perform endian port to cpu conversion, so no extra conversion was
> > necessary.  The double conversion caused incorrect reading of USB EHCI
> > registers.
> 
> Give Alexey a few days, I've met him at a conference a few days ago so
> he's probably still traveling.

Yep indeed I was recovering after the last trip.

> > I can propose a patch to fix this issue, currently not sure how to
> > submit it for U-Boot approval.  Or you may want to pull the previous
> > patch (or replace the readl() and writel() with some endian-agnostic
> > register reading functions).

Indeed I do see a problem with existing implementation of ehci_{readl|writel}.
Could you please try the following fix which I believe is right now:
->8--
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 7c39becd247e..7080ae8bded2 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -101,11 +101,11 @@ struct usb_linux_config_descriptor {
 } __attribute__ ((packed));
 
 #if defined CONFIG_EHCI_DESC_BIG_ENDIAN
-#define ehci_readl(x)  cpu_to_be32(readl(x))
-#define ehci_writel(a, b)  writel(cpu_to_be32(b), a)
+#define ehci_readl(x)  be32_to_cpu(__raw_readl(x))
+#define ehci_writel(a, b)  __raw_writel(cpu_to_be32(a), b)
 #else
-#define ehci_readl(x)  cpu_to_le32(readl(x))
-#define ehci_writel(a, b)  writel(cpu_to_le32(b), a)
+#define ehci_readl(x)  readl(x)
+#define ehci_writel(a, b)  writel(b, a)
 #endif
 
 #if defined CONFIG_EHCI_MMIO_BIG_ENDIAN
->8--

I don't have BE platform handy now so your "Tested-by" will be very
nice to have. On LE platform the change above doesn't cause any problems
[as expected] :)

-Alexey
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RESEND] drivers/usb/ehci: Use platform-specific accessors

2017-10-27 Thread Vladimir Boroda

This patch should have been rejected.  It no longer breaks the build, but it 
break the functionality on big-endian systems. The readl() and writel() macros 
already do the endian conversion assuming the port is in little-endian format.  
So after this patch the EHCI registers are now read incorrectly, at least on 
PPC.  

You should remove the le32_to_cpu() macros if using the readl() and writel() 
accessors.  
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [RESEND] drivers/usb/ehci: Use platform-specific accessors

2017-06-05 Thread Alexey Brodkin
From: Alexey Brodkin 

Current implementation doesn't allow utilization of platform-specific
reads and writes.

But some arches or platforms may want to use their accessors that do
some extra work like adding barriers for data serialization etc.

Interesting enough OHCI accessors already do that so just aligning
EHCI to it now.

This is a resend of http://patchwork.ozlabs.org/patch/726714/
Back in the day this patch broke some PPC and Sandbox boards
as they we missing inclusion of "asm/io.h". Those missing items were
fixed with:
 1) http://patchwork.ozlabs.org/patch/751397/
 2) http://patchwork.ozlabs.org/patch/771099/

So now it should be safe to apply this patch.
FWIW TravisCI builds everything with all 3 patches in place,
see https://travis-ci.org/abrodkin/u-boot/builds/239563813

Signed-off-by: Alexey Brodkin 
Cc: Simon Glass 
Cc: Mateusz Kulikowski 
Acked-by: Marek Vasut 
---
 drivers/usb/host/ehci.h | 10 --
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 734d7f036278..2ab830df5155 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -102,13 +102,11 @@ struct usb_linux_config_descriptor {
 } __attribute__ ((packed));
 
 #if defined CONFIG_EHCI_DESC_BIG_ENDIAN
-#define ehci_readl(x)  cpu_to_be32((*((volatile u32 *)(x
-#define ehci_writel(a, b)  (*((volatile u32 *)(a)) = \
-   cpu_to_be32(((volatile u32)b)))
+#define ehci_readl(x)  cpu_to_be32(readl(x))
+#define ehci_writel(a, b)  writel(cpu_to_be32(b), a)
 #else
-#define ehci_readl(x)  cpu_to_le32((*((volatile u32 *)(x
-#define ehci_writel(a, b)  (*((volatile u32 *)(a)) = \
-   cpu_to_le32(((volatile u32)b)))
+#define ehci_readl(x)  cpu_to_le32(readl(x))
+#define ehci_writel(a, b)  writel(cpu_to_le32(b), a)
 #endif
 
 #if defined CONFIG_EHCI_MMIO_BIG_ENDIAN
-- 
2.7.5

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot