19 Dec, 2011

1 commit

  • sched_clock() is yet another blocker on the road to the single
    image. This patch implements an idea by Russell King:

    http://www.spinics.net/lists/linux-omap/msg49561.html

    Instead of asking the platform to implement both sched_clock()
    itself and the rollover callback, simply register a read()
    function, and let the ARM code care about sched_clock() itself,
    the conversion to ns and the rollover. sched_clock() uses
    this read() function as an indirection to the platform code.
    If the platform doesn't provide a read(), the code falls back
    to the jiffy counter (just like the default sched_clock).

    This allow some simplifications and possibly some footprint gain
    when multiple platforms are compiled in. Among the drawbacks,
    the removal of the *_fixed_sched_clock optimization which could
    negatively impact some platforms (sa1100, tegra, versatile
    and omap).

    Tested on 11MPCore, OMAP4 and Tegra.

    Cc: Imre Kaloz
    Cc: Eric Miao
    Cc: Colin Cross
    Cc: Erik Gilling
    Cc: Olof Johansson
    Cc: Sascha Hauer
    Cc: Alessandro Rubini
    Cc: STEricsson
    Cc: Lennert Buytenhek
    Cc: Ben Dooks
    Tested-by: Jamie Iles
    Tested-by: Tony Lindgren
    Tested-by: Kyungmin Park
    Acked-by: Linus Walleij
    Acked-by: Nicolas Pitre
    Acked-by: Krzysztof Halasa
    Acked-by: Kukjin Kim
    Signed-off-by: Marc Zyngier
    Signed-off-by: Russell King

    Marc Zyngier
     

13 Dec, 2011

4 commits

  • Now that there is a common way to reset the machine, let's use it
    instead of reinventing the wheel in the kexec backend.

    Signed-off-by: Will Deacon

    Will Deacon
     
  • Sending IPI_CPU_STOP to a CPU causes it to execute a busy cpu_relax
    loop forever. This makes it impossible to kexec successfully on an SMP
    system since the secondary CPUs do not reset.

    This patch adds a callback to platform_cpu_kill, defined when
    CONFIG_HOTPLUG_CPU=y, from the ipi_cpu_stop handling code. This function
    currently just returns 1 on all platforms that define it but allows them
    to do something more sophisticated in the future.

    Signed-off-by: Will Deacon

    Will Deacon
     
  • Tools such as kexec and CPU hotplug require a way to reset the processor
    and branch to some code in physical space. This requires various bits of
    jiggery pokery with the caches and MMU which, when it goes wrong, tends
    to lock up the system.

    This patch fleshes out the soft_restart implementation so that it
    branches to the reset code using the identity mapping. This requires us
    to change to a temporary stack, held within the kernel image as a static
    array, to avoid conflicting with the new view of memory.

    Signed-off-by: Will Deacon

    Will Deacon
     
  • When disabling the MMU, it is necessary to take out a 1:1 identity map
    of the reset code so that it can safely be executed with and without
    the MMU active. To avoid the situation where the physical address of the
    reset code aliases with the virtual address of the active stack (which
    cannot be included in the 1:1 mapping), it is desirable to change to a
    new stack at a location which is less likely to alias.

    This code adds a new lib function, call_with_stack:

    void call_with_stack(void (*fn)(void *), void *arg, void *sp);

    which changes the stack to point at the sp parameter, before invoking
    fn(arg) with the new stack selected.

    Reviewed-by: Nicolas Pitre
    Reviewed-by: Catalin Marinas
    Signed-off-by: Dave Martin
    Signed-off-by: Will Deacon

    Will Deacon
     

11 Dec, 2011

1 commit


09 Dec, 2011

1 commit


08 Dec, 2011

15 commits

  • This patch adds the ARM_LPAE and ARCH_PHYS_ADDR_T_64BIT Kconfig entries
    allowing LPAE support to be compiled into the kernel.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • Memory banks living outside of the 32-bit physical address
    space do not have a 1:1 pa va mapping and therefore the
    __va macro may wrap.

    This patch ensures that such banks are marked as highmem so
    that the Kernel doesn't try to split them up when it sees that
    the wrapped virtual address overlaps the vmalloc space.

    Signed-off-by: Will Deacon
    Signed-off-by: Catalin Marinas
    Acked-by: Nicolas Pitre

    Will Deacon
     
  • With LPAE, the pgd is a separate page table with entries pointing to the
    pmd. The identity_mapping_add() function needs to ensure that the pgd is
    populated before populating the pmd level. The do..while blocks now loop
    over the pmd in order to have the same implementation for the two page
    table formats. The pmd_addr_end() definition has been removed and the
    generic one used instead. The pmd clean-up is done in the pgd_free()
    function.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • With LPAE, TTBRx registers are 64-bit. The ASID is stored in TTBR0
    rather than a separate Context ID register. This patch makes the
    necessary changes to handle context switching on LPAE.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • The DFSR and IFSR register format is different when LPAE is enabled. In
    addition, DFSR and IFSR have similar definitions for the fault type.
    This modifies the fault code to correctly handle the new format.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • Similar to the PTE freeing, this patch introduced __pmd_free_tlb() which
    invalidates the TLB before freeing a PMD page. This is needed because on
    newer processors the entry in the upper page table may be cached by the
    TLB and point to random data after the PMD has been freed.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • This patch adds the MMU initialisation for the LPAE page table format.
    The swapper_pg_dir size with LPAE is 5 rather than 4 pages. A new
    proc-v7-3level.S file contains the TTB initialisation, context switch
    and PTE setting code with the LPAE. The TTBRx split is based on the
    PAGE_OFFSET with TTBR1 used for the kernel mappings. The 36-bit mappings
    (supersections) and a few other memory types in mmu.c are conditionally
    compiled.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • This patch modifies the pgd/pmd/pte manipulation functions to support
    the 3-level page table format. Since there is no need for an 'ext'
    argument to cpu_set_pte_ext(), this patch conditionally defines a
    different prototype for this function when CONFIG_ARM_LPAE.

    The patch also introduces the L_PGD_SWAPPER flag to mark pgd entries
    pointing to pmd tables pre-allocated in the swapper_pg_dir and avoid
    trying to free them at run-time. This flag is 0 with the classic page
    table format.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • This patch introduces the pgtable-3level*.h files with definitions
    specific to the LPAE page table format (3 levels of page tables).

    Each table is 4KB and has 512 64-bit entries. An entry can point to a
    40-bit physical address. The young, write and exec software bits share
    the corresponding hardware bits (negated). Other software bits use spare
    bits in the PTE.

    The patch also changes some variable types from unsigned long or int to
    pteval_t or pgprot_t.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • Before we enable the MMU, we must ensure that the TTBR registers contain
    sane values. After the MMU has been enabled, we jump to the *virtual*
    address of the following function, so we also need to ensure that the
    SCTLR write has taken effect.

    This patch adds ISB instructions around the SCTLR write to ensure the
    visibility of the above.

    Signed-off-by: Will Deacon
    Signed-off-by: Catalin Marinas

    Will Deacon
     
  • This patch modifies the proc-v7.S file so that it only contains code
    shared between classic MMU and LPAE. The non-common code is factored out
    into a separate file.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • The FSR structure is different with LPAE and this patch moves the
    classic MMU specific definition to a separate fsr-2level.c file that is
    included in fault.c. It also moves the fsr_fs and FSR bits to the
    fault.h file.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • The page table maintenance macros need to be duplicated between the
    classic and the LPAE MMU so this patch moves those that are not common
    to the pgtable-2level.h file.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     
  • Nick Piggin noted upon introducing 4level-fixup.h:

    | Add a temporary "fallback" header so architectures can run with
    | the 4level pagetables patch without modification. All architectures
    | should be converted to use the folding headers (include/asm-generic/
    | pgtable-nop?d.h) as soon as possible, and the fallback header removed.

    This makes ARM compliant with this statement.

    Signed-off-by: Russell King
    Signed-off-by: Catalin Marinas

    Russell King
     
  • With the arch/arm code conversion to pgtable-nopud.h, the section and
    supersection (un|re)map code triggers compiler warnings on UP systems.
    This is caused by pmd_offset() being given a pgd_t argument rather than
    a pud_t one. This patch makes the necessary conversion with the
    assumption that the pud is folded into the pgd. The page table setting
    code only loops over the pmd which is enough with the classic page
    tables. This code is not compiled when LPAE is enabled.

    Signed-off-by: Catalin Marinas

    Catalin Marinas
     

07 Dec, 2011

2 commits


06 Dec, 2011

11 commits

  • The ARM SMP booting code allocates a temporary set of page tables
    containing an identity mapping of the kernel image and provides this
    to secondary CPUs for initial booting.

    In reality, we only need to include the __turn_mmu_on function in the
    identity mapping since the rest of the kernel is executing from virtual
    addresses after this point.

    This patch adds __turn_mmu_on to the .idmap.text section, allowing the
    SMP booting code to use the idmap_pgd directly and not have to populate
    its own set of page table.

    As a result of this patch, we can make the identity_mapping_add function
    static (since it is only used within mm/idmap.c) and also remove the
    identity_mapping_del function. The identity map population is moved to
    an early initcall so that it is setup in time for secondary CPU bringup.

    Reviewed-by: Catalin Marinas
    Signed-off-by: Will Deacon

    Will Deacon
     
  • __create_page_tables identity maps the region of memory from
    __enable_mmu to the end of __turn_mmu_on.

    In preparation for including __turn_mmu_on in the .idmap.text section,
    this patch modifies the identity mapping so that it only includes the
    __turn_mmu_on code.

    Reviewed-by: Catalin Marinas
    Signed-off-by: Will Deacon

    Will Deacon
     
  • For soft-rebooting a system, it is necessary to map the MMU-off code
    with an identity mapping so that execution can continue safely once the
    MMU has been switched off.

    Currently, switch_mm_for_reboot takes out a 1:1 mapping from 0x0 to
    TASK_SIZE during reboot in the hope that the reset code lives at a
    physical address corresponding to a userspace virtual address.

    This patch modifies the code so that we switch to the idmap_pgd tables,
    which contain a 1:1 mapping of the cpu_reset code. This has the
    advantage of only remapping the code that we need and also means we
    don't need to worry about allocating a pgd from an atomic context in the
    case that the physical address of the cpu_reset code aliases with the
    virtual space used by the kernel.

    Acked-by: Dave Martin
    Reviewed-by: Catalin Marinas
    Signed-off-by: Will Deacon

    Will Deacon
     
  • The CPU reset functions disable the MMU and therefore must be executed
    with an identity mapping in place.

    This patch places the CPU reset functions into the .idmap.text section,
    causing the idmap code to include them as part of the identity mapping.

    Acked-by: Dave Martin
    Signed-off-by: Will Deacon

    Will Deacon
     
  • The ARM CPU suspend code requires cpu_resume_mmu to be identity mapped
    in order to re-enable the MMU when coming out of suspend. Currently,
    this is accomplished by maintaining a suspend_pgd with the relevant
    mapping put in place at init time.

    This patch replaces the use of suspend_pgd with the new idmap_pgd.
    cpu_resume_mmu is placed in the .idmap.text section so that it is
    included in the identity map.

    Reviewed-by: Catalin Marinas
    Acked-by: Dave Martin
    Tested-by: Lorenzo Pieralisi
    Signed-off-by: Will Deacon

    Will Deacon
     
  • When disabling and re-enabling the MMU, it is necessary to take out an
    identity mapping for the code that manipulates the SCTLR in order to
    avoid it disappearing from under our feet. This is useful when soft
    rebooting and returning from CPU suspend.

    This patch allocates a set of page tables during boot and populates them
    with an identity mapping for the .idmap.text section. This means that
    users of the identity map do not need to manage their own pgd and can
    instead annotate their functions with __idmap or, in the case of assembly
    code, place them in the correct section.

    Acked-by: Dave Martin
    Reviewed-by: Catalin Marinas
    Tested-by: Lorenzo Pieralisi
    Signed-off-by: Will Deacon

    Will Deacon
     
  • Otherwise we get the following error:

    In function 'omap_init_consistent_dma_size':
    error: implicit declaration of function 'init_consistent_dma_size'

    Signed-off-by: Tony Lindgren
    Acked-by: Nicolas Pitre
    Signed-off-by: Russell King

    Tony Lindgren
     
  • Russell King
     
  • Conflicts:
    arch/arm/common/gic.c
    arch/arm/plat-omap/include/plat/common.h

    Russell King
     
  • Fix the below build break by including common.h

    arch/arm/mach-omap2/cpuidle34xx.c: In function 'omap3_enter_idle':
    arch/arm/mach-omap2/cpuidle34xx.c:117: error: implicit declaration of function 'omap_irq_pending'
    make[1]: *** [arch/arm/mach-omap2/cpuidle34xx.o] Error 1
    make: *** [arch/arm/mach-omap2] Error 2

    Signed-off-by: Santosh Shilimkar
    Signed-off-by: Russell King

    Santosh Shilimkar
     
  • Fix the build break by adding the necessary irq functions to
    common header.

    Signed-off-by: Santosh Shilimkar
    Signed-off-by: Russell King

    Santosh Shilimkar
     

03 Dec, 2011

1 commit


02 Dec, 2011

4 commits