
On Wed, 2020-04-22 at 14:01 +0200, Sylwester Nawrocki wrote:
Hi Nicolas,
(fixed Simon's email address, apologies for mistyping it, I will make sure it's correct in next iteration)
On 22.04.2020 10:53, Nicolas Saenz Julienne wrote:
I've been trying to get this working on my own and got stuck with this specific issue. I'm glad you found a solution, it was driving me crazy.
Out of curiosity how did you found the solution?
It took me many days of debugging...given my nearly non existent previous experience in u-boot development.In short, it started with a suggestion to map all memory for CPU as uncached. As in such a case booting was failing I checked where the xhci shared buffer allocation fall and created only a small uncached window to cover those allocations. This was first thing that started working, after fixing the 64-bit pointers setup in XHCI registers. Then I discovered "dcache" command and that was also helpful. It was sufficient to run "dcache off; usb start; dcache on". Then USB worked even after "usb reset" IIRC. But that was with my old development branch based on v2019.10-rc4 tag. Marek tried the same with newer tree and dcache_disable() was not helping, but dcache_flush_all() was.
By moving dcache_disable(), dcache_enable() around I found out that it was sufficient to disable dcache before xhci_start() call and to enable it right afterwards.
Then I just "bisected" the uncached memory region which narrowed it roughly to the scratchpad buffer allocations. By inspecting the code carefully again it turned there is one more cache flush call needed.
Thanks for the in-depth explanation, it's very much appreciated!
Regards, Nicolas