All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
@ 2012-07-08  3:08 Marek Vasut
  2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
                   ` (2 more replies)
  0 siblings, 3 replies; 21+ messages in thread
From: Marek Vasut @ 2012-07-08  3:08 UTC (permalink / raw)
  To: u-boot

This is the out-of-function-scope counterpart of
ALLOC_CACHE_ALIGN_BUFFER.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@ti.com>
Cc: Ilya Yanok <ilya.yanok@cogentembedded.com>
---
 include/common.h |   11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/include/common.h b/include/common.h
index 17c64b0..06d278f 100644
--- a/include/common.h
+++ b/include/common.h
@@ -965,6 +965,17 @@ int cpu_release(int nr, int argc, char * const argv[]);
 									\
 	type *name = (type *) ALIGN((uintptr_t)__##name, ARCH_DMA_MINALIGN)
 
+/*
+ * DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER, but it's
+ * purpose is to allow allocating aligned buffers outside of function scope.
+ * Usage of this macro shall be avoided or used with extreme care!
+ */
+#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)			\
+	static char __##name[roundup(size * sizeof(type), ARCH_DMA_MINALIGN)] \
+			__aligned(ARCH_DMA_MINALIGN);			\
+									\
+	static type *name = (type *)__##name;
+
 /* Pull in stuff for the build system */
 #ifdef DO_DEPS_ONLY
 # include <environment.h>
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08  3:08 [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Marek Vasut
@ 2012-07-08  3:08 ` Marek Vasut
  2012-07-08 10:04   ` Ilya Yanok
                     ` (2 more replies)
  2012-07-08 12:23 ` [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Ilya Yanok
  2012-07-20  4:01 ` Mike Frysinger
  2 siblings, 3 replies; 21+ messages in thread
From: Marek Vasut @ 2012-07-08  3:08 UTC (permalink / raw)
  To: u-boot

From: Tom Rini <trini@ti.com>

The USB spec says that 32 bytes is the minimum required alignment.
However on some platforms we have a larger minimum requirement for cache
coherency.  In those cases, use that value rather than the USB spec
minimum.  We add a cpp check to <usb.h> to define USB_DMA_MINALIGN and
make use of it in ehci-hcd.c and musb_core.h.  We cannot use MAX() here
as we are not allowed to have tests inside of align(...).

Signed-off-by: Tom Rini <trini@ti.com>
[ilya.yanok]: fix size alignment, drop (incorrect) rounding
when invalidating the buffer. If we got unaligned buffer from the
upper layer -- that's definetely a bug so it's good to buzz
about it. But we have to align the buffer length -- upper layers
should take care to reserve enough space.
Signed-off-by: Ilya Yanok <ilya.yanok@cogentembedded.com>
[marek.vasut]: introduce some crazy macro voodoo
Signed-off-by: Marek Vasut <marex@denx.de>
---
 drivers/usb/host/ehci-hcd.c  |   81 ++++++++++++++++++++++++------------------
 drivers/usb/musb/musb_core.h |    2 +-
 include/usb.h                |   10 ++++++
 3 files changed, 57 insertions(+), 36 deletions(-)

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 04300be..5199560 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -34,7 +34,10 @@ struct ehci_hccr *hccr;	/* R/O registers, not need for volatile */
 volatile struct ehci_hcor *hcor;
 
 static uint16_t portreset;
-static struct QH qh_list __attribute__((aligned(32)));
+DEFINE_CACHE_ALIGN_BUFFER(struct QH, qh_list, 1);
+
+#define ALIGN_END_ADDR(type, ptr, size)			\
+	((uint32_t)(ptr) + roundup((size) * sizeof(type), USB_DMA_MINALIGN))
 
 static struct descriptor {
 	struct usb_hub_descriptor hub;
@@ -172,13 +175,13 @@ static int ehci_td_buffer(struct qTD *td, void *buf, size_t sz)
 {
 	uint32_t delta, next;
 	uint32_t addr = (uint32_t)buf;
-	size_t rsz = roundup(sz, 32);
+	size_t rsz = roundup(sz, USB_DMA_MINALIGN);
 	int idx;
 
 	if (sz != rsz)
 		debug("EHCI-HCD: Misaligned buffer size (%08x)\n", sz);
 
-	if (addr & 31)
+	if (addr != ALIGN(addr, USB_DMA_MINALIGN))
 		debug("EHCI-HCD: Misaligned buffer address (%p)\n", buf);
 
 	idx = 0;
@@ -207,8 +210,8 @@ static int
 ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 		   int length, struct devrequest *req)
 {
-	static struct QH qh __attribute__((aligned(32)));
-	static struct qTD qtd[3] __attribute__((aligned (32)));
+	ALLOC_CACHE_ALIGN_BUFFER(struct QH, qh, 1);
+	ALLOC_CACHE_ALIGN_BUFFER(struct qTD, qtd, 3);
 	int qtd_counter = 0;
 
 	volatile struct qTD *vtd;
@@ -229,8 +232,8 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 		      le16_to_cpu(req->value), le16_to_cpu(req->value),
 		      le16_to_cpu(req->index));
 
-	memset(&qh, 0, sizeof(struct QH));
-	memset(qtd, 0, sizeof(qtd));
+	memset(qh, 0, sizeof(struct QH));
+	memset(qtd, 0, 3 * sizeof(*qtd));
 
 	toggle = usb_gettoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
 
@@ -244,7 +247,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 	 *   qh_overlay.qt_next ...... 13-10 H
 	 * - qh_overlay.qt_altnext
 	 */
-	qh.qh_link = cpu_to_hc32((uint32_t)&qh_list | QH_LINK_TYPE_QH);
+	qh->qh_link = cpu_to_hc32((uint32_t)qh_list | QH_LINK_TYPE_QH);
 	c = (usb_pipespeed(pipe) != USB_SPEED_HIGH &&
 	     usb_pipeendpoint(pipe) == 0) ? 1 : 0;
 	endpt = (8 << 28) |
@@ -255,14 +258,14 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 	    (usb_pipespeed(pipe) << 12) |
 	    (usb_pipeendpoint(pipe) << 8) |
 	    (0 << 7) | (usb_pipedevice(pipe) << 0);
-	qh.qh_endpt1 = cpu_to_hc32(endpt);
+	qh->qh_endpt1 = cpu_to_hc32(endpt);
 	endpt = (1 << 30) |
 	    (dev->portnr << 23) |
 	    (dev->parent->devnum << 16) | (0 << 8) | (0 << 0);
-	qh.qh_endpt2 = cpu_to_hc32(endpt);
-	qh.qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
+	qh->qh_endpt2 = cpu_to_hc32(endpt);
+	qh->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
 
-	tdp = &qh.qh_overlay.qt_next;
+	tdp = &qh->qh_overlay.qt_next;
 
 	if (req != NULL) {
 		/*
@@ -340,13 +343,13 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 		tdp = &qtd[qtd_counter++].qt_next;
 	}
 
-	qh_list.qh_link = cpu_to_hc32((uint32_t)&qh | QH_LINK_TYPE_QH);
+	qh_list->qh_link = cpu_to_hc32((uint32_t)qh | QH_LINK_TYPE_QH);
 
 	/* Flush dcache */
-	flush_dcache_range((uint32_t)&qh_list,
-		(uint32_t)&qh_list + sizeof(struct QH));
-	flush_dcache_range((uint32_t)&qh, (uint32_t)&qh + sizeof(struct QH));
-	flush_dcache_range((uint32_t)qtd, (uint32_t)qtd + sizeof(qtd));
+	flush_dcache_range((uint32_t)qh_list,
+		ALIGN_END_ADDR(struct QH, qh_list, 1));
+	flush_dcache_range((uint32_t)qh, ALIGN_END_ADDR(struct QH, qh, 1));
+	flush_dcache_range((uint32_t)qtd, ALIGN_END_ADDR(struct qTD, qtd, 3));
 
 	usbsts = ehci_readl(&hcor->or_usbsts);
 	ehci_writel(&hcor->or_usbsts, (usbsts & 0x3f));
@@ -369,12 +372,12 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 	timeout = USB_TIMEOUT_MS(pipe);
 	do {
 		/* Invalidate dcache */
-		invalidate_dcache_range((uint32_t)&qh_list,
-			(uint32_t)&qh_list + sizeof(struct QH));
-		invalidate_dcache_range((uint32_t)&qh,
-			(uint32_t)&qh + sizeof(struct QH));
+		invalidate_dcache_range((uint32_t)qh_list,
+			ALIGN_END_ADDR(struct QH, qh_list, 1));
+		invalidate_dcache_range((uint32_t)qh,
+			ALIGN_END_ADDR(struct QH, qh, 1));
 		invalidate_dcache_range((uint32_t)qtd,
-			(uint32_t)qtd + sizeof(qtd));
+			ALIGN_END_ADDR(struct qTD, qtd, 3));
 
 		token = hc32_to_cpu(vtd->qt_token);
 		if (!(token & 0x80))
@@ -382,9 +385,17 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 		WATCHDOG_RESET();
 	} while (get_timer(ts) < timeout);
 
-	/* Invalidate the memory area occupied by buffer */
-	invalidate_dcache_range(((uint32_t)buffer & ~31),
-		((uint32_t)buffer & ~31) + roundup(length, 32));
+	/*
+	 * Invalidate the memory area occupied by buffer
+	 * Don't try to fix the buffer alignment, if it isn't properly
+	 * aligned it's upper layer's fault so let invalidate_dcache_range()
+	 * vow about it. But we have to fix the length as it's actual
+	 * transfer length and can be unaligned. This is potentially
+	 * dangerous operation, it's responsibility of the calling
+	 * code to make sure enough space is reserved.
+	 */
+	invalidate_dcache_range((uint32_t)buffer,
+		ALIGN_END_ADDR(u8, buffer, length));
 
 	/* Check that the TD processing happened */
 	if (token & 0x80) {
@@ -403,9 +414,9 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
 		goto fail;
 	}
 
-	qh_list.qh_link = cpu_to_hc32((uint32_t)&qh_list | QH_LINK_TYPE_QH);
+	qh_list->qh_link = cpu_to_hc32((uint32_t)qh_list | QH_LINK_TYPE_QH);
 
-	token = hc32_to_cpu(qh.qh_overlay.qt_token);
+	token = hc32_to_cpu(qh->qh_overlay.qt_token);
 	if (!(token & 0x80)) {
 		debug("TOKEN=%#x\n", token);
 		switch (token & 0xfc) {
@@ -733,16 +744,16 @@ int usb_lowlevel_init(void)
 #endif
 
 	/* Set head of reclaim list */
-	memset(&qh_list, 0, sizeof(qh_list));
-	qh_list.qh_link = cpu_to_hc32((uint32_t)&qh_list | QH_LINK_TYPE_QH);
-	qh_list.qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12));
-	qh_list.qh_curtd = cpu_to_hc32(QT_NEXT_TERMINATE);
-	qh_list.qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
-	qh_list.qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
-	qh_list.qh_overlay.qt_token = cpu_to_hc32(0x40);
+	memset(qh_list, 0, sizeof(*qh_list));
+	qh_list->qh_link = cpu_to_hc32((uint32_t)qh_list | QH_LINK_TYPE_QH);
+	qh_list->qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12));
+	qh_list->qh_curtd = cpu_to_hc32(QT_NEXT_TERMINATE);
+	qh_list->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
+	qh_list->qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
+	qh_list->qh_overlay.qt_token = cpu_to_hc32(0x40);
 
 	/* Set async. queue head pointer. */
-	ehci_writel(&hcor->or_asynclistaddr, (uint32_t)&qh_list);
+	ehci_writel(&hcor->or_asynclistaddr, (uint32_t)qh_list);
 
 	reg = ehci_readl(&hccr->cr_hcsparams);
 	descriptor.hub.bNbrPorts = HCS_N_PORTS(reg);
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index a8adcce..e914369 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -145,7 +145,7 @@ struct musb_regs {
 		struct musb_epN_regs epN;
 	} ep[16];
 
-} __attribute__((packed, aligned(32)));
+} __attribute__((packed, aligned(USB_DMA_MINALIGN)));
 #endif
 
 /*
diff --git a/include/usb.h b/include/usb.h
index 6da91e7..ba3d169 100644
--- a/include/usb.h
+++ b/include/usb.h
@@ -29,6 +29,16 @@
 #include <usb_defs.h>
 #include <usbdescriptors.h>
 
+/*
+ * The EHCI spec says that we must align to at least 32 bytes.  However,
+ * some platforms require larger alignment.
+ */
+#if ARCH_DMA_MINALIGN > 32
+#define USB_DMA_MINALIGN	ARCH_DMA_MINALIGN
+#else
+#define USB_DMA_MINALIGN	32
+#endif
+
 /* Everything is aribtrary */
 #define USB_ALTSETTINGALLOC		4
 #define USB_MAXALTSETTING		128	/* Hard limit */
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
@ 2012-07-08 10:04   ` Ilya Yanok
  2012-07-08 18:51     ` Marek Vasut
  2012-07-09 18:37   ` Ilya Yanok
  2012-07-14 22:08   ` Ilya Yanok
  2 siblings, 1 reply; 21+ messages in thread
From: Ilya Yanok @ 2012-07-08 10:04 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:

[...]

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index 04300be..5199560 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -34,7 +34,10 @@ struct ehci_hccr *hccr;      /* R/O registers, not need
> for volatile */
>  volatile struct ehci_hcor *hcor;
>
>  static uint16_t portreset;
> -static struct QH qh_list __attribute__((aligned(32)));
> +DEFINE_CACHE_ALIGN_BUFFER(struct QH, qh_list, 1);
>

This will align on ARCH_DMA_MINALIGN, not USB_DMA_MINALIGN. In case of
ARCH_DMA_MINALIGN < 32 we will loose the 32-byte alignment required by USB
spec.

The same with other buffers. Otherwise looks great.

Regards, Ilya.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-08  3:08 [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Marek Vasut
  2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
@ 2012-07-08 12:23 ` Ilya Yanok
  2012-07-08 18:55   ` Marek Vasut
  2012-07-20  4:01 ` Mike Frysinger
  2 siblings, 1 reply; 21+ messages in thread
From: Ilya Yanok @ 2012-07-08 12:23 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:

> This is the out-of-function-scope counterpart of
> ALLOC_CACHE_ALIGN_BUFFER.
> +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)                    \
> +       static char __##name[roundup(size * sizeof(type),
> ARCH_DMA_MINALIGN)] \
> +                       __aligned(ARCH_DMA_MINALIGN);                   \
>

We need linux/compiler.h (not included from common.h) for __aligned.

Regards, Ilya.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08 10:04   ` Ilya Yanok
@ 2012-07-08 18:51     ` Marek Vasut
  2012-07-08 20:52       ` Tom Rini
  0 siblings, 1 reply; 21+ messages in thread
From: Marek Vasut @ 2012-07-08 18:51 UTC (permalink / raw)
  To: u-boot

Dear Ilya Yanok,

> Hi Marek,
> 
> On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:
> 
> [...]
> 
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> 
> > index 04300be..5199560 100644
> > --- a/drivers/usb/host/ehci-hcd.c
> > +++ b/drivers/usb/host/ehci-hcd.c
> > @@ -34,7 +34,10 @@ struct ehci_hccr *hccr;      /* R/O registers, not
> > need for volatile */
> > 
> >  volatile struct ehci_hcor *hcor;
> >  
> >  static uint16_t portreset;
> > 
> > -static struct QH qh_list __attribute__((aligned(32)));
> > +DEFINE_CACHE_ALIGN_BUFFER(struct QH, qh_list, 1);
> 
> This will align on ARCH_DMA_MINALIGN, not USB_DMA_MINALIGN. In case of
> ARCH_DMA_MINALIGN < 32 we will loose the 32-byte alignment required by USB
> spec.

That's true -- maybe we should create ALLOC_ALIGN_BUFFER() and 
ALLOC_CACHE_ALIGN_BUFFER() to be a special case of it ?

> The same with other buffers. Otherwise looks great.
> 
> Regards, Ilya.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-08 12:23 ` [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Ilya Yanok
@ 2012-07-08 18:55   ` Marek Vasut
  0 siblings, 0 replies; 21+ messages in thread
From: Marek Vasut @ 2012-07-08 18:55 UTC (permalink / raw)
  To: u-boot

Dear Ilya Yanok,

> Hi Marek,
> 
> On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:
> > This is the out-of-function-scope counterpart of
> > ALLOC_CACHE_ALIGN_BUFFER.
> > +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)                    \
> > +       static char __##name[roundup(size * sizeof(type),
> > ARCH_DMA_MINALIGN)] \
> > +                       __aligned(ARCH_DMA_MINALIGN);                   \
> 
> We need linux/compiler.h (not included from common.h) for __aligned.

Correct, but is it a good idea to include it in common.h ?
Ilya, can you re-do this patchset and repost?

> Regards, Ilya.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08 18:51     ` Marek Vasut
@ 2012-07-08 20:52       ` Tom Rini
  2012-07-08 21:36         ` Marek Vasut
  0 siblings, 1 reply; 21+ messages in thread
From: Tom Rini @ 2012-07-08 20:52 UTC (permalink / raw)
  To: u-boot

On Sun, Jul 8, 2012 at 11:51 AM, Marek Vasut <marex@denx.de> wrote:
> Dear Ilya Yanok,
>
>> Hi Marek,
>>
>> On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:
>>
>> [...]
>>
>> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
>>
>> > index 04300be..5199560 100644
>> > --- a/drivers/usb/host/ehci-hcd.c
>> > +++ b/drivers/usb/host/ehci-hcd.c
>> > @@ -34,7 +34,10 @@ struct ehci_hccr *hccr;      /* R/O registers, not
>> > need for volatile */
>> >
>> >  volatile struct ehci_hcor *hcor;
>> >
>> >  static uint16_t portreset;
>> >
>> > -static struct QH qh_list __attribute__((aligned(32)));
>> > +DEFINE_CACHE_ALIGN_BUFFER(struct QH, qh_list, 1);
>>
>> This will align on ARCH_DMA_MINALIGN, not USB_DMA_MINALIGN. In case of
>> ARCH_DMA_MINALIGN < 32 we will loose the 32-byte alignment required by USB
>> spec.
>
> That's true -- maybe we should create ALLOC_ALIGN_BUFFER() and
> ALLOC_CACHE_ALIGN_BUFFER() to be a special case of it ?

Lets think.  USB says "32byte min".  Do we have other buses today that
apply similar constraints?  If so, we should probably go about
abstracting into a __ALIGN_FOO(size, what) and do a general one and a
USB one that does 32 or cachline.  If it's just USB that might be
overkill however...

-- 
Tom

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08 20:52       ` Tom Rini
@ 2012-07-08 21:36         ` Marek Vasut
  0 siblings, 0 replies; 21+ messages in thread
From: Marek Vasut @ 2012-07-08 21:36 UTC (permalink / raw)
  To: u-boot

Dear Tom Rini,

> On Sun, Jul 8, 2012 at 11:51 AM, Marek Vasut <marex@denx.de> wrote:
> > Dear Ilya Yanok,
> > 
> >> Hi Marek,
> >> 
> >> On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:
> >> 
> >> [...]
> >> 
> >> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> >> 
> >> > index 04300be..5199560 100644
> >> > --- a/drivers/usb/host/ehci-hcd.c
> >> > +++ b/drivers/usb/host/ehci-hcd.c
> >> > @@ -34,7 +34,10 @@ struct ehci_hccr *hccr;      /* R/O registers, not
> >> > need for volatile */
> >> > 
> >> >  volatile struct ehci_hcor *hcor;
> >> >  
> >> >  static uint16_t portreset;
> >> > 
> >> > -static struct QH qh_list __attribute__((aligned(32)));
> >> > +DEFINE_CACHE_ALIGN_BUFFER(struct QH, qh_list, 1);
> >> 
> >> This will align on ARCH_DMA_MINALIGN, not USB_DMA_MINALIGN. In case of
> >> ARCH_DMA_MINALIGN < 32 we will loose the 32-byte alignment required by
> >> USB spec.
> > 
> > That's true -- maybe we should create ALLOC_ALIGN_BUFFER() and
> > ALLOC_CACHE_ALIGN_BUFFER() to be a special case of it ?
> 
> Lets think.  USB says "32byte min".  Do we have other buses today that
> apply similar constraints?  If so, we should probably go about
> abstracting into a __ALIGN_FOO(size, what) and do a general one and a
> USB one that does 32 or cachline.  If it's just USB that might be
> overkill however...

Let's do this, we dunno what craziness can befall us in the future. And having 
the macro handy won't hurt anyway.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
  2012-07-08 10:04   ` Ilya Yanok
@ 2012-07-09 18:37   ` Ilya Yanok
  2012-07-10  1:55     ` Marek Vasut
  2012-07-14 22:08   ` Ilya Yanok
  2 siblings, 1 reply; 21+ messages in thread
From: Ilya Yanok @ 2012-07-09 18:37 UTC (permalink / raw)
  To: u-boot

Hi Marek,

On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:

> -       /* Invalidate the memory area occupied by buffer */
> -       invalidate_dcache_range(((uint32_t)buffer & ~31),
> -               ((uint32_t)buffer & ~31) + roundup(length, 32));
> +       /*
> +        * Invalidate the memory area occupied by buffer
> +        * Don't try to fix the buffer alignment, if it isn't properly
> +        * aligned it's upper layer's fault so let
> invalidate_dcache_range()
> +        * vow about it. But we have to fix the length as it's actual
> +        * transfer length and can be unaligned. This is potentially
> +        * dangerous operation, it's responsibility of the calling
> +        * code to make sure enough space is reserved.
> +        */
> +       invalidate_dcache_range((uint32_t)buffer,
> +               ALIGN_END_ADDR(u8, buffer, length));
>

We shouldn't use ALIGN_END_ADDR here. This can lead to strange results on
systems with ARCH_DMA_MINALIGN < 32.

Regards, Ilya.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-09 18:37   ` Ilya Yanok
@ 2012-07-10  1:55     ` Marek Vasut
  2012-07-14 22:11       ` Ilya Yanok
  0 siblings, 1 reply; 21+ messages in thread
From: Marek Vasut @ 2012-07-10  1:55 UTC (permalink / raw)
  To: u-boot

Dear Ilya Yanok,

> Hi Marek,
> 
> On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:
> > -       /* Invalidate the memory area occupied by buffer */
> > -       invalidate_dcache_range(((uint32_t)buffer & ~31),
> > -               ((uint32_t)buffer & ~31) + roundup(length, 32));
> > +       /*
> > +        * Invalidate the memory area occupied by buffer
> > +        * Don't try to fix the buffer alignment, if it isn't properly
> > +        * aligned it's upper layer's fault so let
> > invalidate_dcache_range()
> > +        * vow about it. But we have to fix the length as it's actual
> > +        * transfer length and can be unaligned. This is potentially
> > +        * dangerous operation, it's responsibility of the calling
> > +        * code to make sure enough space is reserved.
> > +        */
> > +       invalidate_dcache_range((uint32_t)buffer,
> > +               ALIGN_END_ADDR(u8, buffer, length));
> 
> We shouldn't use ALIGN_END_ADDR here. This can lead to strange results on
> systems with ARCH_DMA_MINALIGN < 32.

Good point, ALIGN_END_ADDR should align it to max(32, length) ?

> Regards, Ilya.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
  2012-07-08 10:04   ` Ilya Yanok
  2012-07-09 18:37   ` Ilya Yanok
@ 2012-07-14 22:08   ` Ilya Yanok
  2012-07-15  8:07     ` Marek Vasut
  2 siblings, 1 reply; 21+ messages in thread
From: Ilya Yanok @ 2012-07-14 22:08 UTC (permalink / raw)
  To: u-boot

Hi,

On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:

> @@ -207,8 +210,8 @@ static int
>  ehci_submit_async(struct usb_device *dev, unsigned long pipe, void
> *buffer,
>                    int length, struct devrequest *req)
>  {
> -       static struct QH qh __attribute__((aligned(32)));
> -       static struct qTD qtd[3] __attribute__((aligned (32)));
> +       ALLOC_CACHE_ALIGN_BUFFER(struct QH, qh, 1);
>

Somehow this doesn't work being allocated on stack... I assumed that this
was declared as static just to use __attribute__((aligned))... but it seems
that current code doesn't like qh address being changed (I'm getting "Timed
out on TD" messages). Any ideas? Changing it to DEFINE_... seems to help
but it looks like hiding another bug.

Regards, Ilya.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-10  1:55     ` Marek Vasut
@ 2012-07-14 22:11       ` Ilya Yanok
  0 siblings, 0 replies; 21+ messages in thread
From: Ilya Yanok @ 2012-07-14 22:11 UTC (permalink / raw)
  To: u-boot

Dear Marek,

On Tue, Jul 10, 2012 at 5:55 AM, Marek Vasut <marex@denx.de> wrote:

>
> > > +       invalidate_dcache_range((uint32_t)buffer,
> > > +               ALIGN_END_ADDR(u8, buffer, length));
> >
> > We shouldn't use ALIGN_END_ADDR here. This can lead to strange results on
> > systems with ARCH_DMA_MINALIGN < 32.
>
>
> Good point, ALIGN_END_ADDR should align it to max(32, length) ?
>
> Hm.. no, actually we should align buffer length to ARCH_DMA_MINALIGN.

Regards, Ilya.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-14 22:08   ` Ilya Yanok
@ 2012-07-15  8:07     ` Marek Vasut
  2012-07-15  8:55       ` Ilya Yanok
  0 siblings, 1 reply; 21+ messages in thread
From: Marek Vasut @ 2012-07-15  8:07 UTC (permalink / raw)
  To: u-boot

Dear Ilya Yanok,

> Hi,
> 
> On Sun, Jul 8, 2012 at 7:08 AM, Marek Vasut <marex@denx.de> wrote:
> > @@ -207,8 +210,8 @@ static int
> > 
> >  ehci_submit_async(struct usb_device *dev, unsigned long pipe, void
> > 
> > *buffer,
> > 
> >                    int length, struct devrequest *req)
> >  
> >  {
> > 
> > -       static struct QH qh __attribute__((aligned(32)));
> > -       static struct qTD qtd[3] __attribute__((aligned (32)));
> > +       ALLOC_CACHE_ALIGN_BUFFER(struct QH, qh, 1);
> 
> Somehow this doesn't work being allocated on stack... I assumed that this
> was declared as static just to use __attribute__((aligned))...

Not really ... but then, we have indeed a problem here. It was probably declared 
static to preserve the contents of these variables across the the calls of this 
function. Sigh, the USB code is really bloody :-/

Ilya, can you try pulling these out of the function?

> but it seems
> that current code doesn't like qh address being changed (I'm getting "Timed
> out on TD" messages). Any ideas? Changing it to DEFINE_... seems to help
> but it looks like hiding another bug.
> 
> Regards, Ilya.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-15  8:07     ` Marek Vasut
@ 2012-07-15  8:55       ` Ilya Yanok
  2012-07-15  9:42         ` Marek Vasut
  0 siblings, 1 reply; 21+ messages in thread
From: Ilya Yanok @ 2012-07-15  8:55 UTC (permalink / raw)
  To: u-boot

Dear Marek,

On Sun, Jul 15, 2012 at 12:07 PM, Marek Vasut <marex@denx.de> wrote:

> > > @@ -207,8 +210,8 @@ static int
> > >
> > >  ehci_submit_async(struct usb_device *dev, unsigned long pipe, void
> > >
> > > *buffer,
> > >
> > >                    int length, struct devrequest *req)
> > >
> > >  {
> > >
> > > -       static struct QH qh __attribute__((aligned(32)));
> > > -       static struct qTD qtd[3] __attribute__((aligned (32)));
> > > +       ALLOC_CACHE_ALIGN_BUFFER(struct QH, qh, 1);
> >
> > Somehow this doesn't work being allocated on stack... I assumed that this
> > was declared as static just to use __attribute__((aligned))...
>
> Not really ... but then, we have indeed a problem here. It was probably
> declared
> static to preserve the contents of these variables across the the calls of
> this
> function. Sigh, the USB code is really bloody :-/
>

Hm.. no, I don't think it's about contents... Look, there are memset()
calls straight in the beginning of the function. It looks like it's about
qh address: I tried debugging it a bit and it seems to work until qh has
the same address and break when the address eventually changes.


> Ilya, can you try pulling these out of the function?
>

I can but what for? Are there any differences (except for scope) declaring
statics inside or outside function? As I said declaring qh static (with
DEFINE_CACHE_ALIGN_BUFFER) works but...

Regards, Ilya.

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment
  2012-07-15  8:55       ` Ilya Yanok
@ 2012-07-15  9:42         ` Marek Vasut
  0 siblings, 0 replies; 21+ messages in thread
From: Marek Vasut @ 2012-07-15  9:42 UTC (permalink / raw)
  To: u-boot

Dear Ilya Yanok,

> Dear Marek,
> 
> On Sun, Jul 15, 2012 at 12:07 PM, Marek Vasut <marex@denx.de> wrote:
> > > > @@ -207,8 +210,8 @@ static int
> > > > 
> > > >  ehci_submit_async(struct usb_device *dev, unsigned long pipe, void
> > > > 
> > > > *buffer,
> > > > 
> > > >                    int length, struct devrequest *req)
> > > >  
> > > >  {
> > > > 
> > > > -       static struct QH qh __attribute__((aligned(32)));
> > > > -       static struct qTD qtd[3] __attribute__((aligned (32)));
> > > > +       ALLOC_CACHE_ALIGN_BUFFER(struct QH, qh, 1);
> > > 
> > > Somehow this doesn't work being allocated on stack... I assumed that
> > > this was declared as static just to use __attribute__((aligned))...
> > 
> > Not really ... but then, we have indeed a problem here. It was probably
> > declared
> > static to preserve the contents of these variables across the the calls
> > of this
> > function. Sigh, the USB code is really bloody :-/
> 
> Hm.. no, I don't think it's about contents... Look, there are memset()
> calls straight in the beginning of the function. It looks like it's about
> qh address: I tried debugging it a bit and it seems to work until qh has
> the same address and break when the address eventually changes.

I see, stupid me. So it's only the address? And I take it the controller doesn't 
use those after it leaves the function, right (maybe that might be it) ?

> > Ilya, can you try pulling these out of the function?
> 
> I can but what for? Are there any differences (except for scope) declaring
> statics inside or outside function? As I said declaring qh static (with
> DEFINE_CACHE_ALIGN_BUFFER) works but...
> 
> Regards, Ilya.

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-08  3:08 [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Marek Vasut
  2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
  2012-07-08 12:23 ` [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Ilya Yanok
@ 2012-07-20  4:01 ` Mike Frysinger
  2012-07-20 11:31   ` Marek Vasut
  2 siblings, 1 reply; 21+ messages in thread
From: Mike Frysinger @ 2012-07-20  4:01 UTC (permalink / raw)
  To: u-boot

On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
> +/*
> + * DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER, but it's
> + * purpose is to allow allocating aligned buffers outside of function scope.
> + * Usage of this macro shall be avoided or used with extreme care!
> + */
> +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)			\
> +	static char __##name[roundup(size * sizeof(type), ARCH_DMA_MINALIGN)] \
> +			__aligned(ARCH_DMA_MINALIGN);			\
> +									\
> +	static type *name = (type *)__##name;

how is this any different from doing:
	static __u8 foo[1234] __aligned(ARCH_DMA_MINALIGN);
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120720/017e9eec/attachment.pgp>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-20  4:01 ` Mike Frysinger
@ 2012-07-20 11:31   ` Marek Vasut
  2012-07-20 21:47     ` Mike Frysinger
  0 siblings, 1 reply; 21+ messages in thread
From: Marek Vasut @ 2012-07-20 11:31 UTC (permalink / raw)
  To: u-boot

Dear Mike Frysinger,

> On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
> > +/*
> > + * DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER,
> > but it's + * purpose is to allow allocating aligned buffers outside of
> > function scope. + * Usage of this macro shall be avoided or used with
> > extreme care! + */
> > +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)			
\
> > +	static char __##name[roundup(size * sizeof(type), ARCH_DMA_MINALIGN)] \
> > +			__aligned(ARCH_DMA_MINALIGN);			\
> > +									\
> > +	static type *name = (type *)__##name;
> 
> how is this any different from doing:
> 	static __u8 foo[1234] __aligned(ARCH_DMA_MINALIGN);
> -mike

Does __aligned() align both start of the buffer downwards and end of it upwards 
?

Best regards,
Marek Vasut

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-20 11:31   ` Marek Vasut
@ 2012-07-20 21:47     ` Mike Frysinger
  2012-07-20 21:50       ` Tom Rini
  0 siblings, 1 reply; 21+ messages in thread
From: Mike Frysinger @ 2012-07-20 21:47 UTC (permalink / raw)
  To: u-boot

On Friday 20 July 2012 07:31:47 Marek Vasut wrote:
> Dear Mike Frysinger,
> > On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
> > > +/*
> > > DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER,
> > > but it's purpose is to allow allocating aligned buffers outside of
> > > function scope.  Usage of this macro shall be avoided or used with
> > > extreme care! */
> > > +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)
> > > +	static char __##name[roundup(size * sizeof(type), ARCH_DMA_MINALIGN)]
> > > +			__aligned(ARCH_DMA_MINALIGN);
> > > +	static type *name = (type *)__##name;
> > 
> > how is this any different from doing:
> > 	static __u8 foo[1234] __aligned(ARCH_DMA_MINALIGN);
> 
> Does __aligned() align both start of the buffer downwards and end of it
> upwards ?

it guarantees the start is aligned.  i don't believe it does any tail padding.

that said, you've added just 1 consumer, but it uses in function scope, so i 
don't see why you had to define a new helper in the first place.  the existing 
one would work fine shouldn't it ?

you should probably add a const to the 2nd part so gcc is more likely to 
optimize away the storage:
	static type * const name = (type *)__##name;
otherwise older gcc versions will create a pointer to go through rather than 
having things directly access the buffer.

w/out const:
$ readelf -s a.out  | grep foo
    11: 00000000004005d0     8 OBJECT  LOCAL  DEFAULT   13 foo.1592
    12: 0000000000402080    96 OBJECT  LOCAL  DEFAULT   25 __foo.1591
w/const:
$ readelf -s a.out  | grep foo
    11: 0000000000402080    96 OBJECT  LOCAL  DEFAULT   25 __foo.1591
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120720/83b5b67c/attachment.pgp>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-20 21:47     ` Mike Frysinger
@ 2012-07-20 21:50       ` Tom Rini
  2012-07-21 17:22         ` Mike Frysinger
  0 siblings, 1 reply; 21+ messages in thread
From: Tom Rini @ 2012-07-20 21:50 UTC (permalink / raw)
  To: u-boot

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 07/20/2012 02:47 PM, Mike Frysinger wrote:
> On Friday 20 July 2012 07:31:47 Marek Vasut wrote:
>> Dear Mike Frysinger,
>>> On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
>>>> +/* DEFINE_CACHE_ALIGN_BUFFER() is similar to
>>>> ALLOC_CACHE_ALIGN_BUFFER, but it's purpose is to allow
>>>> allocating aligned buffers outside of function scope.  Usage
>>>> of this macro shall be avoided or used with extreme care! */ 
>>>> +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size) +	static
>>>> char __##name[roundup(size * sizeof(type),
>>>> ARCH_DMA_MINALIGN)] +			__aligned(ARCH_DMA_MINALIGN); +
>>>> static type *name = (type *)__##name;
>>> 
>>> how is this any different from doing: static __u8 foo[1234]
>>> __aligned(ARCH_DMA_MINALIGN);
>> 
>> Does __aligned() align both start of the buffer downwards and end
>> of it upwards ?
> 
> it guarantees the start is aligned.  i don't believe it does any
> tail padding.
> 
> that said, you've added just 1 consumer, but it uses in function
> scope, so i don't see why you had to define a new helper in the
> first place.  the existing one would work fine shouldn't it ?

The rough outline of the problems are:
- - We need to have buffers that are multiple of cache size, for clearing.
- - Today we know ehci-hcd had a problem.  We also know other drivers /
layers have problems, but they aren't as readily breakable.

That's why we put the macro in <common.h> rather than a USB header.

- -- 
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJQCdKoAAoJENk4IS6UOR1WuzUP/0ndUzaq6U2/8X8E7VIhLqAV
AQ+5rmJy5seJAhhvzRLbNgYv7KrLJRayMd4bj4DT8WAmAyUDo1BPvIcKNuQ8Il3M
un3Kjo9+qXusfyvbs1V2wOaXL1pmwcOSQe4n+/8xKlmJ3Jh9v1AIBoXIJQqXPrcL
zhaN0ilxTcLeblFWVzXSOWPAWo4ufJZ1cd43lGXxtjW890GEUCRTNXod9Bpivi2P
ShycGvEcvo80mR7xGKMjZYl9Zf5OQ5QP0Xcvul7X4rjGepEuOsn941wE0zrP1I+s
zXfruOklqWBckiP+aBprX2lzsaBUE33hHZidfPtvuB9rTFk735snaDcrZsL/5K25
17Bczpqqb6RXP1yb/tpc1hWkzpfCZ+eqpg2pN8bIp0P8XZ5apMTvq7L9IMG90lN2
FPwOC2VH9gnOK34Est/iTkp6QnW15r/ZayD9DMBUoxelhx38VJHR8OVyu56QXk2K
10zb6lwKQ3dE8u24ki2TybycVgPVoOq35vUjMw7TWZwiwXSBwgcfHMRukpTSdHA6
wNzw+VsurehKdkqRBeG5tOeOf0tcFrKfg1tfyDQqlBJUn9E6Usj43IXfF23DOQ11
VMcMeizuHP6oTmBk571XrgOKczCaUej1UIrLhnfpXNmFsQ7YsIi9PlQcndFiMBLC
yo+rfRjqLqrPxJdrP5h4
=alD6
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-20 21:50       ` Tom Rini
@ 2012-07-21 17:22         ` Mike Frysinger
  2012-07-23 15:24           ` Tom Rini
  0 siblings, 1 reply; 21+ messages in thread
From: Mike Frysinger @ 2012-07-21 17:22 UTC (permalink / raw)
  To: u-boot

On Friday 20 July 2012 17:50:33 Tom Rini wrote:
> On 07/20/2012 02:47 PM, Mike Frysinger wrote:
> > On Friday 20 July 2012 07:31:47 Marek Vasut wrote:
> >> Dear Mike Frysinger,
> >> 
> >>> On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
> >>>> +/* DEFINE_CACHE_ALIGN_BUFFER() is similar to
> >>>> ALLOC_CACHE_ALIGN_BUFFER, but it's purpose is to allow
> >>>> allocating aligned buffers outside of function scope.  Usage
> >>>> of this macro shall be avoided or used with extreme care! */
> >>>> +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size) +	static
> >>>> char __##name[roundup(size * sizeof(type),
> >>>> ARCH_DMA_MINALIGN)] +			__aligned(ARCH_DMA_MINALIGN); +
> >>>> static type *name = (type *)__##name;
> >>> 
> >>> how is this any different from doing: static __u8 foo[1234]
> >>> __aligned(ARCH_DMA_MINALIGN);
> >> 
> >> Does __aligned() align both start of the buffer downwards and end
> >> of it upwards ?
> > 
> > it guarantees the start is aligned.  i don't believe it does any
> > tail padding.
> > 
> > that said, you've added just 1 consumer, but it uses in function
> > scope, so i don't see why you had to define a new helper in the
> > first place.  the existing one would work fine shouldn't it ?
> 
> The rough outline of the problems are:
> - We need to have buffers that are multiple of cache size, for clearing.
> - Today we know ehci-hcd had a problem.  We also know other drivers /
> layers have problems, but they aren't as readily breakable.
> 
> That's why we put the macro in <common.h> rather than a USB header.

that wasn't the question.  no one in the tree needs the new macro at all, 
regardless of what header it lives in.  i guess the answer is that some code 
in the future (which hasn't been merged) might use it.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120721/18a27507/attachment.pgp>

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER
  2012-07-21 17:22         ` Mike Frysinger
@ 2012-07-23 15:24           ` Tom Rini
  0 siblings, 0 replies; 21+ messages in thread
From: Tom Rini @ 2012-07-23 15:24 UTC (permalink / raw)
  To: u-boot

On Sat, Jul 21, 2012 at 01:22:40PM -0400, Mike Frysinger wrote:
> On Friday 20 July 2012 17:50:33 Tom Rini wrote:
> > On 07/20/2012 02:47 PM, Mike Frysinger wrote:
> > > On Friday 20 July 2012 07:31:47 Marek Vasut wrote:
> > >> Dear Mike Frysinger,
> > >> 
> > >>> On Saturday 07 July 2012 23:08:14 Marek Vasut wrote:
> > >>>> +/* DEFINE_CACHE_ALIGN_BUFFER() is similar to
> > >>>> ALLOC_CACHE_ALIGN_BUFFER, but it's purpose is to allow
> > >>>> allocating aligned buffers outside of function scope.  Usage
> > >>>> of this macro shall be avoided or used with extreme care! */
> > >>>> +#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size) +	static
> > >>>> char __##name[roundup(size * sizeof(type),
> > >>>> ARCH_DMA_MINALIGN)] +			__aligned(ARCH_DMA_MINALIGN); +
> > >>>> static type *name = (type *)__##name;
> > >>> 
> > >>> how is this any different from doing: static __u8 foo[1234]
> > >>> __aligned(ARCH_DMA_MINALIGN);
> > >> 
> > >> Does __aligned() align both start of the buffer downwards and end
> > >> of it upwards ?
> > > 
> > > it guarantees the start is aligned.  i don't believe it does any
> > > tail padding.
> > > 
> > > that said, you've added just 1 consumer, but it uses in function
> > > scope, so i don't see why you had to define a new helper in the
> > > first place.  the existing one would work fine shouldn't it ?
> > 
> > The rough outline of the problems are:
> > - We need to have buffers that are multiple of cache size, for clearing.
> > - Today we know ehci-hcd had a problem.  We also know other drivers /
> > layers have problems, but they aren't as readily breakable.
> > 
> > That's why we put the macro in <common.h> rather than a USB header.
> 
> that wasn't the question.  no one in the tree needs the new macro at all, 
> regardless of what header it lives in.  i guess the answer is that some code 
> in the future (which hasn't been merged) might use it.

Er, between drivers/usb/host/ehci-hcd.c and drivers/usb/eth/smsc95xx.c
the three new macros are used today.

-- 
Tom

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2012-07-23 15:24 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-08  3:08 [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Marek Vasut
2012-07-08  3:08 ` [U-Boot] [PATCH 2/2] ehci-hcd.c, musb_core, usb.h: Add USB_DMA_MINALIGN define for cache alignment Marek Vasut
2012-07-08 10:04   ` Ilya Yanok
2012-07-08 18:51     ` Marek Vasut
2012-07-08 20:52       ` Tom Rini
2012-07-08 21:36         ` Marek Vasut
2012-07-09 18:37   ` Ilya Yanok
2012-07-10  1:55     ` Marek Vasut
2012-07-14 22:11       ` Ilya Yanok
2012-07-14 22:08   ` Ilya Yanok
2012-07-15  8:07     ` Marek Vasut
2012-07-15  8:55       ` Ilya Yanok
2012-07-15  9:42         ` Marek Vasut
2012-07-08 12:23 ` [U-Boot] [PATCH 1/2] common.h: Introduce DEFINE_CACHE_ALIGN_BUFFER Ilya Yanok
2012-07-08 18:55   ` Marek Vasut
2012-07-20  4:01 ` Mike Frysinger
2012-07-20 11:31   ` Marek Vasut
2012-07-20 21:47     ` Mike Frysinger
2012-07-20 21:50       ` Tom Rini
2012-07-21 17:22         ` Mike Frysinger
2012-07-23 15:24           ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.