public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Lukasz Majewski <l.majewski@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [u-boot PATCH v2 30/40] dwc3: flush the buffers before using it
Date: Mon, 23 Feb 2015 16:30:46 +0100	[thread overview]
Message-ID: <20150223163046.2fe7e33e@amdc2363> (raw)
In-Reply-To: <1424697023-26696-31-git-send-email-kishon@ti.com>

Hi Kishon,

> In the linux kernel, non cacheable buffers are used. However in uboot
> since there are no APIs to allocate non cacheable memory, all
> the buffers should be flushed before using it.
> 
> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
> ---
>  drivers/usb/dwc3/core.c   |   11 +++++++++--
>  drivers/usb/dwc3/ep0.c    |    6 ++++++
>  drivers/usb/dwc3/gadget.c |    8 +++++++-
>  drivers/usb/dwc3/io.h     |    5 +++++
>  4 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index 5a8d5ea..78fce1b 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -157,8 +157,8 @@ static int dwc3_alloc_event_buffers(struct dwc3
> *dwc, unsigned length) num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
>  	dwc->num_event_buffers = num;
>  
> -	dwc->ev_buffs = devm_kzalloc(dwc->dev,
> sizeof(*dwc->ev_buffs) * num,
> -			GFP_KERNEL);
> +	dwc->ev_buffs = memalign(CONFIG_SYS_CACHELINE_SIZE,
> +				 sizeof(*dwc->ev_buffs) * num);
>  	if (!dwc->ev_buffs)
>  		return -ENOMEM;
>  
> @@ -769,11 +769,18 @@ void dwc3_uboot_exit(int index)
>  void dwc3_uboot_handle_interrupt(int index)
>  {
>  	struct dwc3 *dwc = NULL;
> +	int i;
> +	struct dwc3_event_buffer *evt;
>  
>  	list_for_each_entry(dwc, &dwc3_list, list) {
>  		if (dwc->index != index)
>  			continue;
>  
> +		for (i = 0; i < dwc->num_event_buffers; i++) {
> +			evt = dwc->ev_buffs[i];
> +			dwc3_flush_cache((int)evt->buf, evt->length);
> +		}
> +
>  		dwc3_gadget_uboot_handle_interrupt(dwc);
>  		break;
>  	}
> diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
> index 803ba51..977d6d4 100644
> --- a/drivers/usb/dwc3/ep0.c
> +++ b/drivers/usb/dwc3/ep0.c
> @@ -74,6 +74,9 @@ static int dwc3_ep0_start_trans(struct dwc3 *dwc,
> u8 epnum, dma_addr_t buf_dma, | DWC3_TRB_CTRL_IOC
>  			| DWC3_TRB_CTRL_ISP_IMI);
>  
> +	dwc3_flush_cache((int)buf_dma, len);
> +	dwc3_flush_cache((int)trb, sizeof(*trb));
> +
>  	memset(&params, 0, sizeof(params));
>  	params.param0 = upper_32_bits(dwc->ep0_trb_addr);
>  	params.param1 = lower_32_bits(dwc->ep0_trb_addr);
> @@ -774,6 +777,8 @@ static void dwc3_ep0_complete_data(struct dwc3
> *dwc, if (!r)
>  		return;
>  
> +	dwc3_flush_cache((int)trb, sizeof(*trb));
> +
>  	status = DWC3_TRB_SIZE_TRBSTS(trb->size);
>  	if (status == DWC3_TRBSTS_SETUP_PENDING) {
>  		dev_dbg(dwc->dev, "Setup Pending received");
> @@ -795,6 +800,7 @@ static void dwc3_ep0_complete_data(struct dwc3
> *dwc, transfer_size += (maxp - (transfer_size % maxp));
>  		transferred = min_t(u32, ur->length,
>  				transfer_size - length);
> +		dwc3_flush_cache((int)dwc->ep0_bounce,
> DWC3_EP0_BOUNCE_SIZE); memcpy(ur->buf, dwc->ep0_bounce, transferred);
>  	} else {
>  		transferred = ur->length - length;
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index 1f97729..8560b88 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -244,6 +244,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep,
> struct dwc3_request *req, 
>  	list_del(&req->list);
>  	req->trb = NULL;
> +	dwc3_flush_cache((int)req->request.dma, req->request.length);
>  
>  	if (req->request.status == -EINPROGRESS)
>  		req->request.status = status;
> @@ -769,6 +770,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep
> *dep, trb->ctrl |= DWC3_TRB_CTRL_SID_SOFN(req->request.stream_id);
>  
>  	trb->ctrl |= DWC3_TRB_CTRL_HWO;
> +
> +	dwc3_flush_cache((int)dma, length);
> +	dwc3_flush_cache((int)trb, sizeof(*trb));

My only concern is with sizeof(*trb), which is 16B.

On Exynos cache line size is 32B.
With this particular case we would flush one extra TRB struct to main
memory.

Since we have per EP trb_pools aligned with memalign calls (and
capable of storing up to 32 TRB requests) and perform one TRB
transmission at a time, we can leave this code as it is.

Hence, 

Acked-by: Lukasz Majewski <l.majewski@samsung.com>

>  }
>  
>  /*
> @@ -1770,6 +1774,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3
> *dwc, struct dwc3_ep *dep, slot %= DWC3_TRB_NUM;
>  		trb = &dep->trb_pool[slot];
>  
> +		dwc3_flush_cache((int)trb, sizeof(*trb));
>  		ret = __dwc3_cleanup_done_trbs(dwc, dep, req, trb,
>  				event, status);
>  		if (ret)
> @@ -2583,7 +2588,8 @@ int dwc3_gadget_init(struct dwc3 *dwc)
>  		goto err1;
>  	}
>  
> -	dwc->setup_buf = kzalloc(DWC3_EP0_BOUNCE_SIZE, GFP_KERNEL);
> +	dwc->setup_buf = memalign(CONFIG_SYS_CACHELINE_SIZE,
> +				  DWC3_EP0_BOUNCE_SIZE);
>  	if (!dwc->setup_buf) {
>  		ret = -ENOMEM;
>  		goto err2;
> diff --git a/drivers/usb/dwc3/io.h b/drivers/usb/dwc3/io.h
> index b6da135..5042a24 100644
> --- a/drivers/usb/dwc3/io.h
> +++ b/drivers/usb/dwc3/io.h
> @@ -20,6 +20,7 @@
>  
>  #include <asm/io.h>
>  
> +#define	CACHELINE_SIZE
> CONFIG_SYS_CACHELINE_SIZE static inline u32 dwc3_readl(void __iomem
> *base, u32 offset) {
>  	u32 offs = offset - DWC3_GLOBALS_REGS_START;
> @@ -47,4 +48,8 @@ static inline void dwc3_writel(void __iomem *base,
> u32 offset, u32 value) writel(value, base + offs);
>  }
>  
> +static inline void dwc3_flush_cache(int addr, int length)
> +{
> +	flush_dcache_range(addr, addr + ROUND(length,
> CACHELINE_SIZE)); +}
>  #endif /* __DRIVERS_USB_DWC3_IO_H */



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

  reply	other threads:[~2015-02-23 15:30 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-23 13:09 [U-Boot] [u-boot PATCH v2 00/40] dra7xx: am43xx: add dwc3 gadget driver support and enable dfu Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 01/40] ARM: DRA7: Enable clocks for USB OTGSS and USB PHY Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 02/40] ARM: AM43xx: " Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 03/40] usb: gadget: udc: add udc-core from linux kernel to u-boot Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 04/40] include: usb: modify gadget.h to include udc support Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 05/40] usb: gadget: udc: make udc-core compile in u-boot build Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 06/40] include: asm: dma-mapping: get rid of the compilation warning in udc-core Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 07/40] usb: dwc3: add dwc3 folder from linux kernel to u-boot Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 08/40] usb: dwc3: remove un-used files from dwc3 folder Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 09/40] usb: dwc3: Modify the file headers to u-boot format Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 10/40] usb: dwc3: remove trace_* APIs from dwc3 driver Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 11/40] usb: dwc3: fix dwc3 header files Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 12/40] usb: dwc3: remove pm related operations from dwc3 driver Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 13/40] arm: asm: dma-mapping: added dma_free_coherent API Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 14/40] usb: dwc3: linux-compat: Add header for dwc3 linux compatibiltiy Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 15/40] usb: dwc3: gadget: make dwc3 gadget build in uboot Kishon Vijay Abraham I
2015-02-23 13:09 ` [U-Boot] [u-boot PATCH v2 16/40] include: asm: types: add resource_size_t type Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 17/40] usb: dwc3: ep0: make dwc3 ep0 build in uboot Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 18/40] include: usb: composite: add USB_GADGET_DELAYED_STATUS to avoid compilation error Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 19/40] usb: dwc3: core: make dwc3 core build in uboot Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 20/40] include: dwc3-uboot: add a structure for populating platform data Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 21/40] dwc3: core: change probe and remove to uboot init and uboot exit code Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 22/40] dwc3: core: add support for multiple dwc3 controllers Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 23/40] dwc3: core: added an API to invoke irq handlers Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 24/40] usb: dwc3: dwc3-omap: make dwc3-omap build in uboot Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 25/40] include: dwc3-omap-uboot: add a structure for populating dwc3-omap platform data Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 26/40] usb: dwc3: dwc3-omap: change probe and remove to uboot init and uboot exit code Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 27/40] dwc3: dwc3-omap: add support for multiple dwc3-omap controllers Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 28/40] usb: dwc3: dwc3-omap: add interrupt status API to check for interrupts Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 29/40] usb: dwc3: TI PHY: PHY driver for dwc3 in TI platforms Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 30/40] dwc3: flush the buffers before using it Kishon Vijay Abraham I
2015-02-23 15:30   ` Lukasz Majewski [this message]
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 31/40] usb: dwc3: ep0: preparation for implementing chained TRB Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 32/40] usb: dwc3: Add chained TRB support for ep0 Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 33/40] usb: dwc3: Makefile: Make dwc3 driver compile in u-boot Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 34/40] usb: gadget: defer setting maxpacket till ->setup() Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 35/40] common: cmd_dfu: invoke board_usb_cleanup() for cleaning up Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 36/40] board: ti: DRA7: added USB initializtion code Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 37/40] include: configs: Enable DWC3 and DFU in DRA7xx Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 38/40] board: ti: AM43xx: added USB initializtion code Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 39/40] include: configs: Enable DWC3 and DFU in AM43xx Kishon Vijay Abraham I
2015-02-23 13:10 ` [U-Boot] [u-boot PATCH v2 40/40] usb: modify usb_gadget_handle_interrupts to take controller index Kishon Vijay Abraham I

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150223163046.2fe7e33e@amdc2363 \
    --to=l.majewski@samsung.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox