13 Jan, 2006

1 commit

  • This patch consolidates the variety of macros used for loading 32 or
    64-bit constants in assembler (LOADADDR, LOADBASE, SET_REG_TO_*). The
    idea is to make the set of macros consistent across 32 and 64 bit and
    to make it more obvious which is the appropriate one to use in a given
    situation. The new macros and their semantics are described in the
    comments in ppc_asm.h.

    In the process, we change several places that were unnecessarily using
    immediate loads on ppc64 to use the GOT/TOC. Likewise we cleanup a
    couple of places where we were clumsily subtracting PAGE_OFFSET with
    asm instructions to use assemble-time arithmetic or the toreal() macro
    instead.

    Signed-off-by: David Gibson
    Signed-off-by: Paul Mackerras

    David Gibson
     

09 Jan, 2006

1 commit

  • This patch merges, to some extent, the PPC32 and PPC64 kexec implementations.

    We adopt the PPC32 approach of having ppc_md callbacks for the kexec functions.
    The current PPC64 implementation becomes the "default" implementation for PPC64
    which platforms can select if they need no special treatment.

    I've added these default callbacks to pseries/maple/cell/powermac, this means
    iSeries no longer supports kexec - but it never worked anyway.

    I've renamed PPC32's machine_kexec_simple to default_machine_kexec, inline with
    PPC64. Judging by the comments it might be better named machine_kexec_non_of,
    or something, but at the moment it's the only implementation for PPC32 so it's
    the "default".

    Kexec requires machine_shutdown(), which is in machine_kexec.c on PPC32, but we
    already have in setup-common.c on powerpc. All this does is call
    ppc_md.nvram_sync, which only powermac implements, so instead make
    machine_shutdown a ppc_md member and have it call core99_nvram_sync directly
    on powermac.

    I've also stuck relocate_kernel.S into misc_32.S for powerpc.

    Built for ARCH=ppc, and 32 & 64 bit ARCH=powerpc, with KEXEC=y/n. Booted on
    P5 LPAR and successfully kexec'ed.

    Should apply on top of 493f25ef4087395891c99fcfe2c72e62e293e89f.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Paul Mackerras

    Michael Ellerman
     

18 Nov, 2005

1 commit

  • My earlier merge of delay.h introduced a timebase-based udelay for
    32-bit machines but also broke the 601, which doesn't have the
    timebase register. This fixes it by using the 601's RTC register on
    the 601, and also moves __delay() and udelay() to be out-of-line in
    arch/powerpc/kernel/time.c. These functions aren't really performance
    critical, after all.

    Signed-off-by: Paul Mackerras

    Paul Mackerras
     

10 Nov, 2005

1 commit

  • The ppc32 and ppc64 versions of cacheflush.h were almost identical.
    The two versions of cache.h are fairly similar, except for a bunch of
    register definitions in the ppc32 version which probably belong better
    elsewhere. This patch, therefore, merges both headers. Notable
    points:
    - there are several functions in cacheflush.h which exist only
    on ppc32 or only on ppc64. These are handled by #ifdef for now, but
    these should probably be consolidated, along with the actual code
    behind them later.
    - Confusingly, both ppc32 and ppc64 have a
    flush_dcache_range(), but they're subtly different: it uses dcbf on
    ppc32 and dcbst on ppc64, ppc64 has a flush_inval_dcache_range() which
    uses dcbf. These too should be merged and consolidated later.
    - Also flush_dcache_range() was defined in cacheflush.h on
    ppc64, and in cache.h on ppc32. In the merged version it's in
    cacheflush.h
    - On ppc32 flush_icache_range() is a normal function from
    misc.S. On ppc64, it was wrapper, testing a feature bit before
    calling __flush_icache_range() which does the actual flush. This
    patch takes the ppc64 approach, which amounts to no change on ppc32,
    since CPU_FTR_COHERENT_ICACHE will never be set there, but does mean
    renaming flush_icache_range() to __flush_icache_range() in
    arch/ppc/kernel/misc.S and arch/powerpc/kernel/misc_32.S
    - The PReP register info from asm-ppc/cache.h has moved to
    arch/ppc/platforms/prep_setup.c
    - The 8xx register info from asm-ppc/cache.h has moved to a
    new asm-powerpc/reg_8xx.h, included from reg.h
    - flush_dcache_all() was defined on ppc32 (only), but was
    never called (although it was exported). Thus this patch removes it
    from cacheflush.h and from ARCH=powerpc (misc_32.S) entirely. It's
    left in ARCH=ppc for now, with the prototype moved to ppc_ksyms.c.

    Built for Walnut (ARCH=ppc), 32-bit multiplatform (pmac, CHRP and PReP
    ARCH=ppc, pmac and CHRP ARCH=powerpc). Built and booted on POWER5
    LPAR (ARCH=powerpc and ARCH=ppc64).

    Built for 32-bit powermac (ARCH=ppc and ARCH=powerpc). Built and
    booted on POWER5 LPAR (ARCH=powerpc and ARCH=ppc64). Built and booted
    on G5 (ARCH=powerpc)

    Signed-off-by: David Gibson
    Signed-off-by: Paul Mackerras

    David Gibson
     

27 Oct, 2005

1 commit

  • The recent merge of fpu.S broken the handling of fpscr for
    ARCH=powerpc and CONFIG_PPC64=y. FP registers could be corrupted,
    leading to strange random application crashes.

    The confusion arises, because the thread_struct has (and requires) a
    64-bit area to save the fpscr, because we use load/store double
    instructions to get it in to/out of the FPU. However, only the low
    32-bits are actually used, so we want to treat it as a 32-bit quantity
    when manipulating its bits to avoid extra load/stores on 32-bit. This
    patch replaces the current definition with a structure of two 32-bit
    quantities (pad and val), to clarify things as much as is possible.
    The 'val' field is used when manipulating bits, the structure itself
    is used when obtaining the address for loading/unloading the value
    from the FPU.

    While we're at it, consolidate the 4 (!) almost identical versions of
    cvt_fd() and cvt_df() (arch/ppc/kernel/misc.S,
    arch/ppc64/kernel/misc.S, arch/powerpc/kernel/misc_32.S,
    arch/powerpc/kernel/misc_64.S) into a single version in fpu.S. The
    new version takes a pointer to thread_struct and applies the correct
    offset itself, rather than a pointer to the fpscr field itself, again
    to avoid confusion as to which is the correct field to use.

    Finally, this patch makes ARCH=ppc64 also use the consolidated fpu.S
    code, which it previously did not.

    Built for G5 (ARCH=ppc64 and ARCH=powerpc), 32-bit powermac (ARCH=ppc
    and ARCH=powerpc) and Walnut (ARCH=ppc, CONFIG_MATH_EMULATION=y).
    Booted on G5 (ARCH=powerpc) and things which previously fell over no
    longer do.

    Signed-off-by: David Gibson
    Signed-off-by: Paul Mackerras

    David Gibson
     

20 Oct, 2005

1 commit

  • We now use the merged time.c for both 32-bit and 64-bit compilation
    with ARCH=powerpc, and for ARCH=ppc64, but not for ARCH=ppc32.
    This removes setup_default_decr (folds its function into time_init)
    and moves wakeup_decrementer into time.c. This also makes an
    asm-powerpc/rtc.h.

    Signed-off-by: Paul Mackerras

    Paul Mackerras
     

17 Oct, 2005

1 commit


13 Oct, 2005

1 commit


10 Oct, 2005

1 commit