From: Mattijs Korpershoek <mkorpershoek@baylibre.com>
To: Neil Armstrong <neil.armstrong@linaro.org>,
Marek Vasut <marex@denx.de>, Tom Rini <trini@konsulko.com>,
Lukasz Majewski <lukma@denx.de>
Cc: Caleb Connolly <caleb.connolly@linaro.org>,
u-boot-qcom@groups.io, u-boot@lists.denx.de,
Neil Armstrong <neil.armstrong@linaro.org>
Subject: Re: [PATCH 3/3] usb: dwc3: invalidate dcache on buffer used in interrupt handling
Date: Wed, 24 Jul 2024 17:20:47 +0200 [thread overview]
Message-ID: <87le1q4y0g.fsf@baylibre.com> (raw)
In-Reply-To: <20240719-u-boot-dwc3-gadget-dcache-fixup-v1-3-58a5f026ea8e@linaro.org>
Hi Neil,
Thank you for the patch.
On ven., juil. 19, 2024 at 15:56, Neil Armstrong <neil.armstrong@linaro.org> wrote:
> On Qualcomm systems, the setup buffer and even buffers are in
> a bad state at interrupt handling, so invalidate the dcache lines
> for the setup_buf and event buffer to make sure we read correct
> data written by the hardware.
>
> This fixes the following error:
> dwc3-generic-peripheral usb@a600000: UNKNOWN IRQ type -1
> dwc3-generic-peripheral usb@a600000: UNKNOWN IRQ type 4673109
>
> and invalid situation in dwc3_gadget_giveback() because setup_buf content
> is read at 0s and leads to fatal crash fixed by [1].
>
> [1] https://lore.kernel.org/all/20240528-topic-sm8x50-dwc3-gadget-crash-fix-v1-1-58434ab4b3d3@linaro.org/
>
> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
> ---
> drivers/usb/dwc3/ep0.c | 2 ++
> drivers/usb/dwc3/gadget.c | 2 ++
> drivers/usb/dwc3/io.h | 8 ++++++++
> 3 files changed, 12 insertions(+)
>
> diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
> index 0c7e0123368..fc1d5892106 100644
> --- a/drivers/usb/dwc3/ep0.c
> +++ b/drivers/usb/dwc3/ep0.c
> @@ -743,6 +743,8 @@ static void dwc3_ep0_inspect_setup(struct dwc3 *dwc,
> if (!dwc->gadget_driver)
> goto out;
>
> + dwc3_invalidate_cache(ctrl, sizeof(*ctrl));
> +
> len = le16_to_cpu(ctrl->wLength);
> if (!len) {
> dwc->three_stage_setup = false;
> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
> index d41b590afb8..0bc9aee4daa 100644
> --- a/drivers/usb/dwc3/gadget.c
> +++ b/drivers/usb/dwc3/gadget.c
> @@ -2503,6 +2503,8 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3 *dwc, u32 buf)
> while (left > 0) {
> union dwc3_event event;
>
> + dwc3_invalidate_cache((uintptr_t)evt->buf, evt->length);
> +
> event.raw = *(u32 *) (evt->buf + evt->lpos);
>
> dwc3_process_event_entry(dwc, &event);
> diff --git a/drivers/usb/dwc3/io.h b/drivers/usb/dwc3/io.h
> index 1aaf5413c6d..7cf05203b0d 100644
> --- a/drivers/usb/dwc3/io.h
> +++ b/drivers/usb/dwc3/io.h
> @@ -55,4 +55,12 @@ static inline void dwc3_flush_cache(uintptr_t addr, int length)
>
> flush_dcache_range(start_addr, end_addr);
> }
> +
> +static inline void dwc3_invalidate_cache(uintptr_t addr, int length)
> +{
> + uintptr_t start_addr = (uintptr_t)addr & ~(ARCH_DMA_MINALIGN - 1);
> + uintptr_t end_addr = ALIGN((uintptr_t)addr + length, ARCH_DMA_MINALIGN);
> +
> + invalidate_dcache_range(start_addr, end_addr);
> +}
> #endif /* __DRIVERS_USB_DWC3_IO_H */
>
> --
> 2.34.1
prev parent reply other threads:[~2024-07-24 15:20 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-19 13:56 [PATCH 0/3] dwc3: gadget: properly fix cache operations Neil Armstrong
2024-07-19 13:56 ` [PATCH 1/3] usb: dwc3: allocate setup_buf with dma_alloc_coherent() Neil Armstrong
2024-07-24 15:03 ` Mattijs Korpershoek
2024-07-24 15:40 ` Neil Armstrong
2024-07-19 13:56 ` [PATCH 2/3] usb: dwc3: fix dcache flush range calculation Neil Armstrong
2024-07-24 15:19 ` Mattijs Korpershoek
2024-07-19 13:56 ` [PATCH 3/3] usb: dwc3: invalidate dcache on buffer used in interrupt handling Neil Armstrong
2024-07-24 15:20 ` Mattijs Korpershoek [this message]
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=87le1q4y0g.fsf@baylibre.com \
--to=mkorpershoek@baylibre.com \
--cc=caleb.connolly@linaro.org \
--cc=lukma@denx.de \
--cc=marex@denx.de \
--cc=neil.armstrong@linaro.org \
--cc=trini@konsulko.com \
--cc=u-boot-qcom@groups.io \
--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 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.