* [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug @ 2012-05-30 22:40 Domenico Andreoli 2012-05-30 22:40 ` [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor Domenico Andreoli ` (5 more replies) 0 siblings, 6 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel Hi, Earlycon is a thin I/O layer used in the early stage of the kernel loading, before the kernel is decompressed. It provides basic functionality to output characters one by one and flush a queue/buffer. Such abstraction allows the management of multiple drivers and the runtime selection of the one to be used (ex. "earlyprintk=amba-pl011,0xc1000" on the cmdline). If no suitable driver is found, fallback ops are used. Mainline implementation of low-level debugging functionality is currently left to the machine specific uncompress.h header file, which greatly limits the usage of the kernel on multiple machines. Hence the need to remove any driver implementation detail from the said headers. The idea is to collect/refactor the various implementations into separate drivers which can coexist in the same kernel image. In the case of debug UARTs, the natural place for such drivers is the respective kernel serial driver. Some linker magics is used later to inject them into the decompressor. Here is a minimal (and very commmon) driver example: static void __earlyconinit minimal_earlycon_putc(struct earlycon_drv *drv, int ch) { while (STATUS_REG(drv->base) & BUSY_MASK) barrier(); DATA_REG(drv->base) = ch; } EARLYCON_START("minimal-uart") .putc = minimal_earlycon_putc, EARLYCON_END The EARLYCON_START's argument ("minimal-uart") is the name used to select this driver during the early boot process. The __earlyconinit and EARLYCON_START specifiers are defined to put all the related driver stuff into the sections designated to be injected. Besides some restrictions, the Earlycon driver is quite straightforward to code. Some effort has been spent also to lay down an easy migration path for the various platforms, each one independently from the others. The backward compatibility is granted by the fallback logics, which is controller by two pre-processor knobs: CONFIG_DEBUG_LL_EARLYCON and EARLYCON_STATIC_SETUP. The fallback logics is used when no suitable Earlycon driver is found or none is searched. In case neither CONFIG_DEBUG_LL_EARLYCON nor EARLYCON_STATIC_SETUP are defined, the fallback ops actually invoke the legacy putc/flush otherwise they don't do anything. CONFIG_DEBUG_LL_EARLYCON is a configuration option that says "whatever legacy putc/flush stuff is coming from uncompress.h, don't use it, use only the available Earlycom drivers". It's a global setting, it should help to simulate a world without uncompress.h. Actually it really removes the dependency on uncompress.h at the cost of breaking stuff depending on arch_decomp_setup(). EARLYCON_STATIC_SETUP instead is local, it's defined in the uncompress.h header itself. It is used by the driver writer to quickly go back and forth the "world without uncompress.h" and find his/her way out of the blank console. It also helps to identify the uncompress.h headers substantially ready to be removed. I'm surely missing something but I hope you'll spot it reading/testing the code, which is based on mainline commit f2fde3a. Thank you for reading so far. cheers, Domenico ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli @ 2012-05-30 22:40 ` Domenico Andreoli 2012-06-04 8:47 ` Russell King - ARM Linux 2012-05-30 22:40 ` [RFC 2/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Add Earlycon support to " Domenico Andreoli ` (4 subsequent siblings) 5 siblings, 1 reply; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel An embedded and charset-unspecified text was scrubbed... Name: earlycon-linker-magic.patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120531/706bc051/attachment.ksh> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor 2012-05-30 22:40 ` [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor Domenico Andreoli @ 2012-06-04 8:47 ` Russell King - ARM Linux 2012-06-04 23:34 ` Domenico Andreoli 0 siblings, 1 reply; 9+ messages in thread From: Russell King - ARM Linux @ 2012-06-04 8:47 UTC (permalink / raw) To: linux-arm-kernel On Thu, May 31, 2012 at 12:40:44AM +0200, Domenico Andreoli wrote: > This linker voodoo clones the Earlycon drivers from the kernel into > the decompressor, selecting everything in the designated ELF sections > (.text.earlycon.info and .init.earlycon.info). No, the debug stuff in the main kernel and the decompressor stuff can (and is in some cases) different. There's a reason we have the two implementations separate. Moreover, these two things operate in two different address spaces; the debug stuff in the kernel has to cope with the MMU being either on or off, and use the kernel v:p mappings when the MMU is on. The decompressor on the other hand has a 1:1 v:p mapping when the MMU is on - so it would not be able to tell the difference if you just cloned the exact same code. One example of this would be RiscPC, where the decompressor writes to the framebuffer, but the debug stuff writes to the serial port. The preference is for the decompressor to write to the normal user visible interface when possible, and the debug stuff to a serial port. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor 2012-06-04 8:47 ` Russell King - ARM Linux @ 2012-06-04 23:34 ` Domenico Andreoli 0 siblings, 0 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-06-04 23:34 UTC (permalink / raw) To: linux-arm-kernel On Mon, Jun 04, 2012 at 09:47:46AM +0100, Russell King - ARM Linux wrote: > On Thu, May 31, 2012 at 12:40:44AM +0200, Domenico Andreoli wrote: > > This linker voodoo clones the Earlycon drivers from the kernel into > > the decompressor, selecting everything in the designated ELF sections > > (.text.earlycon.info and .init.earlycon.info). > > No, the debug stuff in the main kernel and the decompressor stuff can > (and is in some cases) different. There's a reason we have the two > implementations separate. Not to mention the discomfort to discover another debug i/o in head.S used for a totally different purpose which, incidentally, includes the same debug-macro.S of the main kernel early console. I realized that something was wrong as soon as the code to parse earlyprintk started to work, effectively enabling also the main kernel early console, something I didn't truly want. So yes, I got the point, they have different use cases and effectively cannot use right the same bianry code. This is not the intent of the patch though. The usage of the section cloning is not to keep and later reuse the Earlycon built in the main kernel image. It's only to let that (source) code live in a single place and not being replicated in those many haders. Probably a similar result could be achieved shipping Earlycon as ordinary library to the decompressor but it would loose the initial idea of fiddling with the sections, which is where everything started from ;) Plus some more Makefile paperwork to build the library for the decompressor, which would pick all and only the wanted drivers (platform specific, common, etc...) sticking the usual list somewhere/somehow in an old fashioned way (yes, boring). > Moreover, these two things operate in two different address spaces; the > debug stuff in the kernel has to cope with the MMU being either on or > off, and use the kernel v:p mappings when the MMU is on. The decompressor > on the other hand has a 1:1 v:p mapping when the MMU is on - so it > would not be able to tell the difference if you just cloned the exact > same code. I think all this is not applicable to Earlycon because it is to be used only by the the decompressor in whichever configuration the MMU is in that instant. It must be clear to the earlycon driver that nothing fancy should be done there. So if something is going to be broken because wrongs assumptions are done on the MMU status, yes... sorry, you should be fiddling with a couple of registers or a buffer and live with the base address you received and stop there. > One example of this would be RiscPC, where the decompressor writes to > the framebuffer, but the debug stuff writes to the serial port. Yes, clear. I never wanted to make this impossible. > The preference is for the decompressor to write to the normal user visible > interface when possible, and the debug stuff to a serial port. So earlyprintk= is the wrong one, actually the decompressor/Earlycon should use the same console= used by the kernel. How to map a console=ttyAMA0 to to an amba-pl011 on board A and amba-pl010 on board B? Now, putting aside this code (which I would be very happy could somehow end in the kernel) which I made for fun, is this "Decompressing Linux..." so worthy? BTW there is a similar (possibly critical) problem with arch_decomp_setup(), often used to initialize the watchdog. We need to build many of them and select the right one using the machid (or DT, how?) at boot. Would you consider a patch approaching the problem in in the same fashion? thanks, Domenico ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 2/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Add Earlycon support to the decompressor 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli 2012-05-30 22:40 ` [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor Domenico Andreoli @ 2012-05-30 22:40 ` Domenico Andreoli 2012-05-30 22:40 ` [RFC 3/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL010 UARTs Domenico Andreoli ` (3 subsequent siblings) 5 siblings, 0 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel An embedded and charset-unspecified text was scrubbed... Name: earlycon-decompressor.patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120531/12ef202a/attachment.ksh> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 3/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL010 UARTs 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli 2012-05-30 22:40 ` [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor Domenico Andreoli 2012-05-30 22:40 ` [RFC 2/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Add Earlycon support to " Domenico Andreoli @ 2012-05-30 22:40 ` Domenico Andreoli 2012-05-30 22:40 ` [RFC 4/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL011 UARTs Domenico Andreoli ` (2 subsequent siblings) 5 siblings, 0 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel An embedded and charset-unspecified text was scrubbed... Name: earlycon-uart-amba-pl010.patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120531/341356b0/attachment.ksh> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 4/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL011 UARTs 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli ` (2 preceding siblings ...) 2012-05-30 22:40 ` [RFC 3/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL010 UARTs Domenico Andreoli @ 2012-05-30 22:40 ` Domenico Andreoli 2012-05-30 22:40 ` [RFC 5/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for Samsung UARTs Domenico Andreoli 2012-05-30 22:40 ` [RFC 6/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for OMAP UARTs Domenico Andreoli 5 siblings, 0 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel An embedded and charset-unspecified text was scrubbed... Name: earlycon-uart-amba-pl011.patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120531/a77d5ea6/attachment.ksh> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 5/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for Samsung UARTs 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli ` (3 preceding siblings ...) 2012-05-30 22:40 ` [RFC 4/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL011 UARTs Domenico Andreoli @ 2012-05-30 22:40 ` Domenico Andreoli 2012-05-30 22:40 ` [RFC 6/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for OMAP UARTs Domenico Andreoli 5 siblings, 0 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel An embedded and charset-unspecified text was scrubbed... Name: earlycon-uart-samsung.patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120531/ae0767ed/attachment.ksh> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [RFC 6/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for OMAP UARTs 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli ` (4 preceding siblings ...) 2012-05-30 22:40 ` [RFC 5/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for Samsung UARTs Domenico Andreoli @ 2012-05-30 22:40 ` Domenico Andreoli 5 siblings, 0 replies; 9+ messages in thread From: Domenico Andreoli @ 2012-05-30 22:40 UTC (permalink / raw) To: linux-arm-kernel An embedded and charset-unspecified text was scrubbed... Name: earlycon-uart-omap.patch URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120531/ae26bc89/attachment.ksh> ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-06-04 23:34 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-05-30 22:40 [RFC 0/6] RFC: ARM: Disintegrating mach/uncompress.h: low-level debug Domenico Andreoli 2012-05-30 22:40 ` [RFC 1/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Inject the Earlycon drivers into the decompressor Domenico Andreoli 2012-06-04 8:47 ` Russell King - ARM Linux 2012-06-04 23:34 ` Domenico Andreoli 2012-05-30 22:40 ` [RFC 2/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Add Earlycon support to " Domenico Andreoli 2012-05-30 22:40 ` [RFC 3/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL010 UARTs Domenico Andreoli 2012-05-30 22:40 ` [RFC 4/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for AMBA PL011 UARTs Domenico Andreoli 2012-05-30 22:40 ` [RFC 5/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for Samsung UARTs Domenico Andreoli 2012-05-30 22:40 ` [RFC 6/6] From: Domenico Andreoli <domenico.andreoli@linux.com> ARM: Earlycon support for OMAP UARTs Domenico Andreoli
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).