On 19.7.2017 13:10, York Sun wrote: > >> On Jul 19, 2017, at 19:06, Michal Simek <michal.si...@xilinx.com> wrote: >> >>> On 19.7.2017 12:10, York Sun wrote: >>> >>>>> On Jul 19, 2017, at 17:18, Michal Simek <michal.si...@xilinx.com> wrote: >>>>> >>>>> On 19.7.2017 11:11, York Sun wrote: >>>>> >>>>>>> On Jul 19, 2017, at 16:25, Michal Simek <michal.si...@xilinx.com> wrote: >>>>>>> >>>>>>>> On 19.7.2017 04:18, York Sun wrote: >>>>>>>> On 07/18/2017 10:59 PM, Michal Simek wrote: >>>>>>>> Hi Simon, >>>>>>>> >>>>>>>>> On 18.7.2017 16:50, Simon Glass wrote: >>>>>>>>> Hi Michal, >>>>>>>>> >>>>>>>>>> On 18 July 2017 at 07:23, Michal Simek <michal.si...@xilinx.com> >>>>>>>>>> wrote: >>>>>>>>>> Hi Simon, >>>>>>>>>> >>>>>>>>>>> On 18.7.2017 16:01, Simon Glass wrote: >>>>>>>>>>> Hi Michal, >>>>>>>>>>> >>>>>>>>>>>> On 13 July 2017 at 06:50, Michal Simek <michal.si...@xilinx.com> >>>>>>>>>>>> wrote: >>>>>>>>>>>> From: Siva Durga Prasad Paladugu <siva.durga.palad...@xilinx.com> >>>>>>>>>>>> >>>>>>>>>>>> Make reserve_mmu a weak so that it provides an option >>>>>>>>>>>> to customize this routine as per platform need >>>>>>>>>>> >>>>>>>>>>> Why do you need this? Can we instead have the generic code do the >>>>>>>>>>> right thing? Or can we use reserve_arch() to handle this? >>>>>>>>>> >>>>>>>>>> reserve_mmu is called just for ARM. >>>>>>>>> >>>>>>>>> What arch are you using? >>>>>>>> >>>>>>>> arm64 - a53s >>>>>>>> >>>>>>>>> >>>>>>>>>> What we need to do is support configuration where we have small >>>>>>>>>> memory >>>>>>>>>> OCM and we need to put mmu table to different location (TCM) because >>>>>>>>>> it >>>>>>>>>> is simply big and it can't be placed where it is placed now. >>>>>>>>> >>>>>>>>> What is TCM? Is this the internal SRAM? >>>>>>>> >>>>>>>> It is internal sram which is used mostly by R5s in the system but a53 >>>>>>>> has also access to it. >>>>>>>> >>>>>>>>> >>>>>>>>> I don't understand 'simply big'. Are you saying it is too big to go >>>>>>>>> into main memory? >>>>>>>> >>>>>>>> These configuration can't use DDR. One of that configuration which we >>>>>>>> are using is DDR memory test. It means you run from internal sram >>>>>>>> (256kB >>>>>>>> OCM + 256k TCM). >>>>>>>> Another configuration is for loading stuff to EMMC on different boards. >>>>>>>> It means you don't need to setup DDR for generic emmc programming. >>>>>>>> >>>>>>>> All these configurations are using console over DCC - arm jtag uart. >>>>>>>> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Based on looking at code the key question is if we can call >>>>>>>>>> reserve_mmu >>>>>>>>>> at that time when reserve_arch is called now. >>>>>>>>>> On zynqmp I can't see any issue to allocate tlb on the stack and >>>>>>>>>> call it >>>>>>>>>> from it. The question is if this is valid for all arms. >>>>>>>>>> >>>>>>>>>> This is just a small hack I have created to move it to stack. >>>>>>>>>> >>>>>>>>>> diff --git a/common/board_f.c b/common/board_f.c >>>>>>>>>> index 88e20e0168b2..32386c957962 100644 >>>>>>>>>> --- a/common/board_f.c >>>>>>>>>> +++ b/common/board_f.c >>>>>>>>>> @@ -433,13 +433,13 @@ __weak int reserve_mmu(void) >>>>>>>>>> { >>>>>>>>>> /* reserve TLB table */ >>>>>>>>>> gd->arch.tlb_size = PGTABLE_SIZE; >>>>>>>>>> - gd->relocaddr -= gd->arch.tlb_size; >>>>>>>>>> + gd->start_addr_sp -= gd->arch.tlb_size; >>>>>>>>>> >>>>>>>>>> /* round down to next 64 kB limit */ >>>>>>>>>> - gd->relocaddr &= ~(0x10000 - 1); >>>>>>>>>> + gd->start_addr_sp &= ~(0x10000 - 1); >>>>>>>>>> >>>>>>>>>> - gd->arch.tlb_addr = gd->relocaddr; >>>>>>>>>> - debug("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr, >>>>>>>>>> + gd->arch.tlb_addr = gd->start_addr_sp; >>>>>>>>>> + printf("TLB table from %08lx to %08lx\n", gd->arch.tlb_addr, >>>>>>>>>> gd->arch.tlb_addr + gd->arch.tlb_size); >>>>>>>>>> >>>>>>>>>> #ifdef CONFIG_SYS_MEM_RESERVE_SECURE >>>>>>>>>> @@ -837,7 +837,7 @@ static int initf_dm(void) >>>>>>>>>> /* Architecture-specific memory reservation */ >>>>>>>>>> __weak int reserve_arch(void) >>>>>>>>>> { >>>>>>>>>> - return 0; >>>>>>>>>> + return reserve_mmu(); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> __weak int arch_cpu_init_dm(void) >>>>>>>>>> @@ -998,10 +998,6 @@ static init_fnc_t init_sequence_f[] = { >>>>>>>>>> reserve_pram, >>>>>>>>>> #endif >>>>>>>>>> reserve_round_4k, >>>>>>>>>> -#if !(defined(CONFIG_SYS_ICACHE_OFF) && >>>>>>>>>> defined(CONFIG_SYS_DCACHE_OFF)) && \ >>>>>>>>>> - defined(CONFIG_ARM) >>>>>>>>>> - reserve_mmu, >>>>>>>>>> -#endif >>>>>>>>>> #ifdef CONFIG_DM_VIDEO >>>>>>>>>> reserve_video, >>>>>>>>>> #else >>>>>>>>>> >>>>>>>>>> For us we can't just rewrite tlb addresses as we want to do because >>>>>>>>>> we >>>>>>>>>> can't allow reserve_mmu to allocate 64kB alied PGTABLE_SIZE in >>>>>>>>>> relocation structure. >>>>>>>>> >>>>>>>>> Why not? >>>>>>>> >>>>>>>> Because we need to fit to 256kB of memory also with relocation and also >>>>>>>> space for data. And IIRC MMU table size is 64kB. >>>>>>>> Another option could be to disable relocation. >>>>>>>> >>>>>>> Michal, >>>>>>> >>>>>>> For your reference, we use two stage MMU setup for FSL ARMv8 SoCs. We >>>>>>> setup an early MMU in arch_cpu_init() so we can enable d-cache very >>>>>>> early to speed up execution. >>>>>> >>>>>> How big is this speed up? >>>>> >>>>> Huge improvement (feeling like 10x faster at least), especially on >>>>> emulators. >>>> >>>> ok. It means on real silicon I see that improvement could be till a >>>> second right? >>> >>> It may be several hundreds milliseconds difference on real silicon, depends >>> on core speed and booting device speed and booting method. For example, the >>> NOR flash boot is very slow due to the interface. >> >> Ok. I see. Time to do some measurements and see if makes sense to invest >> our time to do this. Till now I am not aware about any request to speed >> up u-boot boot time. >> Definitely thanks for pointer. >> > It makes sense on emulators because they runs thousands times slower.
Agree but depends on emulators :-). M _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot