linux/arch/powerpc/kernel/paca.c
<<
>>
Prefs
   1/*
   2 * c 2001 PPC 64 Team, IBM Corp
   3 *
   4 *      This program is free software; you can redistribute it and/or
   5 *      modify it under the terms of the GNU General Public License
   6 *      as published by the Free Software Foundation; either version
   7 *      2 of the License, or (at your option) any later version.
   8 */
   9
  10#include <linux/threads.h>
  11#include <linux/module.h>
  12#include <linux/memblock.h>
  13
  14#include <asm/firmware.h>
  15#include <asm/lppaca.h>
  16#include <asm/paca.h>
  17#include <asm/sections.h>
  18#include <asm/pgtable.h>
  19#include <asm/iseries/lpar_map.h>
  20#include <asm/iseries/hv_types.h>
  21#include <asm/kexec.h>
  22
  23/* This symbol is provided by the linker - let it fill in the paca
  24 * field correctly */
  25extern unsigned long __toc_start;
  26
  27#ifdef CONFIG_PPC_BOOK3S
  28
  29/*
  30 * The structure which the hypervisor knows about - this structure
  31 * should not cross a page boundary.  The vpa_init/register_vpa call
  32 * is now known to fail if the lppaca structure crosses a page
  33 * boundary.  The lppaca is also used on legacy iSeries and POWER5
  34 * pSeries boxes.  The lppaca is 640 bytes long, and cannot readily
  35 * change since the hypervisor knows its layout, so a 1kB alignment
  36 * will suffice to ensure that it doesn't cross a page boundary.
  37 */
  38struct lppaca lppaca[] = {
  39        [0 ... (NR_LPPACAS-1)] = {
  40                .desc = 0xd397d781,     /* "LpPa" */
  41                .size = sizeof(struct lppaca),
  42                .dyn_proc_status = 2,
  43                .decr_val = 0x00ff0000,
  44                .fpregs_in_use = 1,
  45                .end_of_quantum = 0xfffffffffffffffful,
  46                .slb_count = 64,
  47                .vmxregs_in_use = 0,
  48                .page_ins = 0,
  49        },
  50};
  51
  52static struct lppaca *extra_lppacas;
  53static long __initdata lppaca_size;
  54
  55static void allocate_lppacas(int nr_cpus, unsigned long limit)
  56{
  57        if (nr_cpus <= NR_LPPACAS)
  58                return;
  59
  60        lppaca_size = PAGE_ALIGN(sizeof(struct lppaca) *
  61                                 (nr_cpus - NR_LPPACAS));
  62        extra_lppacas = __va(memblock_alloc_base(lppaca_size,
  63                                                 PAGE_SIZE, limit));
  64}
  65
  66static struct lppaca *new_lppaca(int cpu)
  67{
  68        struct lppaca *lp;
  69
  70        if (cpu < NR_LPPACAS)
  71                return &lppaca[cpu];
  72
  73        lp = extra_lppacas + (cpu - NR_LPPACAS);
  74        *lp = lppaca[0];
  75
  76        return lp;
  77}
  78
  79static void free_lppacas(void)
  80{
  81        long new_size = 0, nr;
  82
  83        if (!lppaca_size)
  84                return;
  85        nr = num_possible_cpus() - NR_LPPACAS;
  86        if (nr > 0)
  87                new_size = PAGE_ALIGN(nr * sizeof(struct lppaca));
  88        if (new_size >= lppaca_size)
  89                return;
  90
  91        memblock_free(__pa(extra_lppacas) + new_size, lppaca_size - new_size);
  92        lppaca_size = new_size;
  93}
  94
  95#else
  96
  97static inline void allocate_lppacas(int nr_cpus, unsigned long limit) { }
  98static inline void free_lppacas(void) { }
  99
 100#endif /* CONFIG_PPC_BOOK3S */
 101
 102#ifdef CONFIG_PPC_STD_MMU_64
 103
 104/*
 105 * 3 persistent SLBs are registered here.  The buffer will be zero
 106 * initially, hence will all be invaild until we actually write them.
 107 */
 108struct slb_shadow slb_shadow[] __cacheline_aligned = {
 109        [0 ... (NR_CPUS-1)] = {
 110                .persistent = SLB_NUM_BOLTED,
 111                .buffer_length = sizeof(struct slb_shadow),
 112        },
 113};
 114
 115#endif /* CONFIG_PPC_STD_MMU_64 */
 116
 117/* The Paca is an array with one entry per processor.  Each contains an
 118 * lppaca, which contains the information shared between the
 119 * hypervisor and Linux.
 120 * On systems with hardware multi-threading, there are two threads
 121 * per processor.  The Paca array must contain an entry for each thread.
 122 * The VPD Areas will give a max logical processors = 2 * max physical
 123 * processors.  The processor VPD array needs one entry per physical
 124 * processor (not thread).
 125 */
 126struct paca_struct *paca;
 127EXPORT_SYMBOL(paca);
 128
 129struct paca_struct boot_paca;
 130
 131void __init initialise_paca(struct paca_struct *new_paca, int cpu)
 132{
 133       /* The TOC register (GPR2) points 32kB into the TOC, so that 64kB
 134        * of the TOC can be addressed using a single machine instruction.
 135        */
 136        unsigned long kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL;
 137
 138#ifdef CONFIG_PPC_BOOK3S
 139        new_paca->lppaca_ptr = new_lppaca(cpu);
 140#else
 141        new_paca->kernel_pgd = swapper_pg_dir;
 142#endif
 143        new_paca->lock_token = 0x8000;
 144        new_paca->paca_index = cpu;
 145        new_paca->kernel_toc = kernel_toc;
 146        new_paca->kernelbase = (unsigned long) _stext;
 147        new_paca->kernel_msr = MSR_KERNEL;
 148        new_paca->hw_cpu_id = 0xffff;
 149        new_paca->kexec_state = KEXEC_STATE_NONE;
 150        new_paca->__current = &init_task;
 151#ifdef CONFIG_PPC_STD_MMU_64
 152        new_paca->slb_shadow_ptr = &slb_shadow[cpu];
 153#endif /* CONFIG_PPC_STD_MMU_64 */
 154}
 155
 156/* Put the paca pointer into r13 and SPRG_PACA */
 157void setup_paca(struct paca_struct *new_paca)
 158{
 159        local_paca = new_paca;
 160        mtspr(SPRN_SPRG_PACA, local_paca);
 161#ifdef CONFIG_PPC_BOOK3E
 162        mtspr(SPRN_SPRG_TLB_EXFRAME, local_paca->extlb);
 163#endif
 164}
 165
 166static int __initdata paca_size;
 167
 168void __init allocate_pacas(void)
 169{
 170        int nr_cpus, cpu, limit;
 171
 172        /*
 173         * We can't take SLB misses on the paca, and we want to access them
 174         * in real mode, so allocate them within the RMA and also within
 175         * the first segment. On iSeries they must be within the area mapped
 176         * by the HV, which is HvPagesToMap * HVPAGESIZE bytes.
 177         */
 178        limit = min(0x10000000ULL, ppc64_rma_size);
 179        if (firmware_has_feature(FW_FEATURE_ISERIES))
 180                limit = min(limit, HvPagesToMap * HVPAGESIZE);
 181
 182        nr_cpus = NR_CPUS;
 183        /* On iSeries we know we can never have more than 64 cpus */
 184        if (firmware_has_feature(FW_FEATURE_ISERIES))
 185                nr_cpus = min(64, nr_cpus);
 186
 187        paca_size = PAGE_ALIGN(sizeof(struct paca_struct) * nr_cpus);
 188
 189        paca = __va(memblock_alloc_base(paca_size, PAGE_SIZE, limit));
 190        memset(paca, 0, paca_size);
 191
 192        printk(KERN_DEBUG "Allocated %u bytes for %d pacas at %p\n",
 193                paca_size, nr_cpus, paca);
 194
 195        allocate_lppacas(nr_cpus, limit);
 196
 197        /* Can't use for_each_*_cpu, as they aren't functional yet */
 198        for (cpu = 0; cpu < nr_cpus; cpu++)
 199                initialise_paca(&paca[cpu], cpu);
 200}
 201
 202void __init free_unused_pacas(void)
 203{
 204        int new_size;
 205
 206        new_size = PAGE_ALIGN(sizeof(struct paca_struct) * num_possible_cpus());
 207
 208        if (new_size >= paca_size)
 209                return;
 210
 211        memblock_free(__pa(paca) + new_size, paca_size - new_size);
 212
 213        printk(KERN_DEBUG "Freed %u bytes for unused pacas\n",
 214                paca_size - new_size);
 215
 216        paca_size = new_size;
 217
 218        free_lppacas();
 219}
 220