Message ID | 5080088C.9090607@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Oct 18, 2012 at 08:47:56AM -0500, Rob Herring wrote: > Here is what I mentioned previously. This removes the static mapping from > the platforms. This is untested and probably breaks on different DEBUG_LL > options. For now, platforms call debug_ll_io_init, but once all platforms > are converted, this can be called from devicemaps_init. There's a problem with this approach. What if the platform specifically sets the debug addresses to be within one of it's existing mappings (which is definitely what you'd want to do with 8250-based UARTs attached to a PCI bus.) This isn't going to work in that case unless we split the debug mapping from the PCI IO space mapping.
On 10/18/2012 08:54 AM, Russell King - ARM Linux wrote: > On Thu, Oct 18, 2012 at 08:47:56AM -0500, Rob Herring wrote: >> Here is what I mentioned previously. This removes the static mapping from >> the platforms. This is untested and probably breaks on different DEBUG_LL >> options. For now, platforms call debug_ll_io_init, but once all platforms >> are converted, this can be called from devicemaps_init. > > There's a problem with this approach. What if the platform specifically > sets the debug addresses to be within one of it's existing mappings (which > is definitely what you'd want to do with 8250-based UARTs attached to a > PCI bus.) > > This isn't going to work in that case unless we split the debug mapping > from the PCI IO space mapping. It is opt-in, so we may never get to the last step. We're still better off than now. Is there a platform that is doing this? If so, I didn't move any DEBUG_LL users to the fixed i/o space so they would still be using their old i/o space address. Having 2 mappings would work, right? You use the debug mapping initially and when PCI bus and the real console driver are up, you switch to the fixed i/o space. This isn't just a PCI issue. You could also have a mapping that covers a block of SOC peripherals including the uart and you don't want a separate mapping. Rob
On 10/18/2012 07:47 AM, Rob Herring wrote: ... > Here is what I mentioned previously. This removes the static mapping from > the platforms. This is untested and probably breaks on different DEBUG_LL > options. For now, platforms call debug_ll_io_init, but once all platforms > are converted, this can be called from devicemaps_init. > diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c > +void __init debug_ll_io_init(void) > +{ > + struct map_desc map; > + > + if (!IS_ENABLED(CONFIG_DEBUG_LL)) > + return; > + > + debug_ll_addr(&map.pfn, &map.virtual); > + map.pfn = __phys_to_pfn(map.pfn); > + map.length = PAGE_SIZE; > + map.type = MT_DEVICE; > + create_mapping(&map); > +} OK, so I just call this new function from Tegra's tegra_map_common_io(). That looks pretty neat. I'll give it a try.
diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index 195ac2f..2ece92c 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h @@ -40,6 +40,9 @@ extern void iotable_init(struct map_desc *, int); extern void vm_reserve_area_early(unsigned long addr, unsigned long size, void *caller); +extern void debug_ll_addr(unsigned long *paddr, unsigned long *vaddr); +extern void debug_ll_io_init(void); + struct mem_type; extern const struct mem_type *get_mem_type(unsigned int type); /* diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S index 66f711b..93883ed 100644 --- a/arch/arm/kernel/debug.S +++ b/arch/arm/kernel/debug.S @@ -100,6 +100,13 @@ ENTRY(printch) b 1b ENDPROC(printch) +ENTRY(debug_ll_addr) + addruart r2, r3, ip + str r2, [r0] + str r3, [r1] + mov pc, lr +ENDPROC(debug_ll_addr) + #else ENTRY(printascii) diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 941dfb9..1c8c7be 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -876,6 +876,20 @@ static void __init pci_reserve_io(void) #define pci_reserve_io() do { } while (0) #endif +void __init debug_ll_io_init(void) +{ + struct map_desc map; + + if (!IS_ENABLED(CONFIG_DEBUG_LL)) + return; + + debug_ll_addr(&map.pfn, &map.virtual); + map.pfn = __phys_to_pfn(map.pfn); + map.length = PAGE_SIZE; + map.type = MT_DEVICE; + create_mapping(&map); +} + static void * __initdata vmalloc_min = (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);