[PATCH 1/3] usb: musb-new: sunxi: do not attempt to access NULL SRAMC

Sam Edwards cfsworks at gmail.com
Wed Jun 7 07:39:24 CEST 2023


Howdy Andre,

On 6/5/23 05:04, Andre Przywara wrote:
> Ah, that's a good find, but I think it goes a bit deeper:
> Just to be clear, "SRAMC" stands for "SRAM controller", not "SRAM memory
> block C" (which other SoCs have, but indeed not the D1/T113s). However
> we (sort of) have an "SRAM controller", although the manual and DT call
> this IP block "syscon" these days. The address currently in ncat2.h is
> just plain wrong, it's actually 0x3000000.

I did understand SRAMC to mean "SRAM controller," but what a funny 
coincidence that NCAT2 does away with SRAM 'C' at around the same time I 
sent in this patch! I did not know it's now the "syscon," I just deduced 
that it wasn't being used for anything important when I couldn't find 
any relevant code relying on it.

> So the code is already wrong, we should not touch SYSCON+0x04 for any
> newer SoCs, based on the compatible. We seem to be just lucky that newer
> syscons don't have any register at offset 0x4.
> And using SUNXI_SRAMC_BASE is somewhat dodgy to begin with, we should use
> the "allwinner,sram" property from the DT, although this is surely more
> complicated.

I spent longer than I thought I would looking into this! :)

Adding a `has_sram` field to the match table data was easy enough, but 
dynamic discovery of the syscon is, for sure, more complicated. The 
biggest problem is that the data model for representing these bits seems 
overengineered for what it is, and most of the logic is just for 
identifying *which bit* needs to be set. Linux's logic for the "syscon 
base" part of it is just: the first allwinner,*-system-control device to 
probe, registers itself globally -- that's it. Surely we could keep the 
"set the 1 bit" part of it hardcoded and just do the same thing (global 
registration) for the syscon, no need to chase the allwinner,sram 
phandle? That should suffice if the goal is to remove the 
SUNXI_SRAMC_BASE define, no?

(By the way, apparently this facility in the SYSCON+0x4 register is only 
1 bit wide -- not 2 as U-Boot believes. It also seems to be for 
switching ownership of SRAM block 'D' between the USB controller and 
CPU, and if so the "config usb fifo, 8kb mode" comment and 
USBC_ConfigFIFO_Base function name are both wrong. I am only judging by 
the Linux implementation of this logic, though.)

> Do you have spare cycles to convert this over to look at the DT for this
> SRAM part? For now you might just change the SRAM address in ncat2.h to
> 0x03000000, to be inline with the other SoCs.

I'll do that latter part locally (can you take care of it in your 
series?) and send in a patch for the `has_sram` change that also 
clarifies the purpose of the syscon poke. The SUNXI_SRAMC_BASE removal I 
just now mentioned could be interesting, but not something I want to 
hold up NCAT2 support on.

Best regards,
Sam


More information about the U-Boot mailing list