From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Warren Date: Thu, 08 Mar 2012 14:43:49 -0700 Subject: [U-Boot] ns16550: tegra: Specify debugging serial port at boot. In-Reply-To: <20120308212957.DE1CC202D69@gemini.denx.de> References: <1325890269-5613-1-git-send-email-swarren@nvidia.com> <4F58F5B8.6070402@wwwdotorg.org> <20120308183903.4575B202D69@gemini.denx.de> <4F590B25.8090503@wwwdotorg.org> <20120308212957.DE1CC202D69@gemini.denx.de> Message-ID: <4F592815.9000006@wwwdotorg.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 03/08/2012 02:29 PM, Wolfgang Denk wrote: > Dear Stephen, > > In message <4F590B25.8090503@wwwdotorg.org> you wrote: >> >>> I don't like to see such highly architecture specific stuff in common >>> code, especially if it's such a dirty hack like this. >> >> Are there any hooks where we can do the same thing in SoC-specific code? > > Not without additional trickery, but I think this is actually a good > thing. > > The method implemented here is but a dirty hack, and should not be > used. > >> The point of this information is to enable the kernel's earlyprintk >> support, which runs well before the device tree, or other mechanisms, >> are available. > > Sorry, but I don't buy that this is the only possible way to do that. > Or how comes only tegra2 would need that, while all other SoCs and > architectures can do without it? First, OMAP does something very similar; the kernel low-level debug code looks at UART1's scratch pad register, and derives which UART to use based on the value stored there. If none of the expected values is found, it appears to default to UART1. On Tegra, the UART registers can't be read unless the UART is clocked and not in reset. So, the Tegra code looks at each UART in the system, and finds one that's in that state. To cater for the scenario where multiple UARTs are clocked-and-not-reset, the code also checks whether the UART scratch register contains 'D' ("D"ebug) so it's sure it picked the correct one. So, at leasst OMAP has set precedent here. There may be others; I didn't check. Some other SoCs may have only 1 UART and not need to auto-select. Some other SoCs with multiple UARTs may designate a single specific UART as the debug port rather than the board designer apparently randomly picking which one to use. In either of those cases, the kernel's low-level debug code can simply hard-code the UART address and do without the hand-shaking.