[PATCH 03/15] ARM: tegra: use fixed PCI i/o mapping

Nicolas Pitre nico at fluxnic.net
Sun Jul 8 22:53:52 EDT 2012


On Sun, 8 Jul 2012, Rob Herring wrote:

> On 07/08/2012 11:35 AM, Arnd Bergmann wrote:
> > On Sunday 08 July 2012, Rob Herring wrote:
> >>> I'm not very familiar with the inner workings of the iotable and the
> >>> mappings initialized by it, but I wonder if this can be done dynamically
> >>> at a later stage. The way this is currently done in this patch, the I/O
> >>> region is statically mapped from a fixed offset within the PCIe address
> >>> range. Part of the patches to add DT support is to allow this region to
> >>> be defined by the DT, so that will obviously also create problems.
> >>
> >> Is the i/o address something you could extract from DT earlier? This can
> >> be done separately if it doesn't require information from the driver.
> >>
> >> I'm sure exactly how to do a fixed virtual mapping other than the
> >> io_table mappings. There was some discussion of use fixmap region
> >> previously, but doing so will be a bit more complex. I'll look into this
> >> some.
> > 
> > I think you can call ioremap_page_range() to do this.
> 
> Thanks for the pointer. But this has to be in 2 steps. First reserve the
> virtual space and then map it. For the first part I think something like
> this function will work:
> 
> void __init pci_reserve_io(void)
> {
> 	struct vm_struct *vm;
> 
> 	vm = early_alloc_aligned(sizeof(*vm), __alignof__(*vm));
> 
> 	vm->addr = (void *)PCI_IO_VIRT_BASE;
> 	vm->size = SZ_1M;
> 	vm->phys_addr = 0;
> 	vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING;
> 	vm->flags |= VM_ARM_MTYPE(MT_DEVICE);
> 	vm->caller = pci_reserve_io;
> 	vm_area_add_early(vm++);
> }
> 
> There's a big fat warning on vm_area_add_early from Nico to not use
> unless you know what you're doing. I'll pretend I do...

:-)

This warning was inherited from vm_area_register_early() which used to 
make the core of what vm_area_add_early() is today.

Your usage of vm_area_add_early() should be fine as long as it is done 
before vmalloc_init(() is called.


Nicolas



More information about the linux-arm-kernel mailing list