Commit 51a0885e authored by Paul Mackerras's avatar Paul Mackerras

Merge refs/heads/devtree from rsync://oak/kernels/iseries/work/.git

parents 14cf11af 3d8a66cc
...@@ -357,7 +357,6 @@ config HOTPLUG_CPU ...@@ -357,7 +357,6 @@ config HOTPLUG_CPU
config PROC_DEVICETREE config PROC_DEVICETREE
bool "Support for Open Firmware device tree in /proc" bool "Support for Open Firmware device tree in /proc"
depends on !PPC_ISERIES
help help
This option adds a device-tree directory under /proc which contains This option adds a device-tree directory under /proc which contains
an image of the device tree that the kernel copies from Open an image of the device tree that the kernel copies from Open
......
...@@ -11,7 +11,7 @@ obj-y := setup.o entry.o traps.o irq.o idle.o dma.o \ ...@@ -11,7 +11,7 @@ obj-y := setup.o entry.o traps.o irq.o idle.o dma.o \
udbg.o binfmt_elf32.o sys_ppc32.o ioctl32.o \ udbg.o binfmt_elf32.o sys_ppc32.o ioctl32.o \
ptrace32.o signal32.o rtc.o init_task.o \ ptrace32.o signal32.o rtc.o init_task.o \
lmb.o cputable.o cpu_setup_power4.o idle_power4.o \ lmb.o cputable.o cpu_setup_power4.o idle_power4.o \
iommu.o sysfs.o vdso.o pmc.o firmware.o iommu.o sysfs.o vdso.o pmc.o firmware.o prom.o
obj-y += vdso32/ vdso64/ obj-y += vdso32/ vdso64/
obj-$(CONFIG_PPC_OF) += of_device.o obj-$(CONFIG_PPC_OF) += of_device.o
...@@ -27,7 +27,7 @@ obj-$(CONFIG_PPC_ISERIES) += HvCall.o HvLpConfig.o LparData.o \ ...@@ -27,7 +27,7 @@ obj-$(CONFIG_PPC_ISERIES) += HvCall.o HvLpConfig.o LparData.o \
mf.o HvLpEvent.o iSeries_proc.o iSeries_htab.o \ mf.o HvLpEvent.o iSeries_proc.o iSeries_htab.o \
iSeries_iommu.o iSeries_iommu.o
obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o i8259.o prom_init.o prom.o obj-$(CONFIG_PPC_MULTIPLATFORM) += nvram.o i8259.o prom_init.o
obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \ obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \
pSeries_nvram.o rtasd.o ras.o pSeries_reconfig.o \ pSeries_nvram.o rtasd.o ras.o pSeries_reconfig.o \
......
...@@ -1364,6 +1364,7 @@ _STATIC(__start_initialization_iSeries) ...@@ -1364,6 +1364,7 @@ _STATIC(__start_initialization_iSeries)
addi r2,r2,0x4000 addi r2,r2,0x4000
bl .iSeries_early_setup bl .iSeries_early_setup
bl .early_setup
/* relocation is on at this point */ /* relocation is on at this point */
...@@ -1970,20 +1971,22 @@ _GLOBAL(hmt_start_secondary) ...@@ -1970,20 +1971,22 @@ _GLOBAL(hmt_start_secondary)
blr blr
#endif #endif
#if defined(CONFIG_KEXEC) || (defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES)) #if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
_GLOBAL(smp_release_cpus) _GLOBAL(smp_release_cpus)
/* All secondary cpus are spinning on a common /* All secondary cpus are spinning on a common
* spinloop, release them all now so they can start * spinloop, release them all now so they can start
* to spin on their individual paca spinloops. * to spin on their individual paca spinloops.
* For non SMP kernels, the secondary cpus never * For non SMP kernels, the secondary cpus never
* get out of the common spinloop. * get out of the common spinloop.
* XXX This does nothing useful on iSeries, secondaries are
* already waiting on their paca.
*/ */
li r3,1 li r3,1
LOADADDR(r5,__secondary_hold_spinloop) LOADADDR(r5,__secondary_hold_spinloop)
std r3,0(r5) std r3,0(r5)
sync sync
blr blr
#endif /* CONFIG_SMP && !CONFIG_PPC_ISERIES */ #endif /* CONFIG_SMP */
/* /*
......
...@@ -84,6 +84,25 @@ static long iSeries_hpte_insert(unsigned long hpte_group, unsigned long va, ...@@ -84,6 +84,25 @@ static long iSeries_hpte_insert(unsigned long hpte_group, unsigned long va,
return (secondary << 3) | (slot & 7); return (secondary << 3) | (slot & 7);
} }
long iSeries_hpte_bolt_or_insert(unsigned long hpte_group,
unsigned long va, unsigned long prpn, unsigned long vflags,
unsigned long rflags)
{
long slot;
hpte_t lhpte;
slot = HvCallHpt_findValid(&lhpte, va >> PAGE_SHIFT);
if (lhpte.v & HPTE_V_VALID) {
/* Bolt the existing HPTE */
HvCallHpt_setSwBits(slot, 0x10, 0);
HvCallHpt_setPp(slot, PP_RWXX);
return 0;
}
return iSeries_hpte_insert(hpte_group, va, prpn, vflags, rflags);
}
static unsigned long iSeries_hpte_getword0(unsigned long slot) static unsigned long iSeries_hpte_getword0(unsigned long slot)
{ {
hpte_t hpte; hpte_t hpte;
......
...@@ -351,3 +351,16 @@ int __init iSeries_allocate_IRQ(HvBusNumber busNumber, ...@@ -351,3 +351,16 @@ int __init iSeries_allocate_IRQ(HvBusNumber busNumber,
irq_desc[virtirq].handler = &iSeries_IRQ_handler; irq_desc[virtirq].handler = &iSeries_IRQ_handler;
return virtirq; return virtirq;
} }
int virt_irq_create_mapping(unsigned int real_irq)
{
BUG(); /* Don't call this on iSeries, yet */
return 0;
}
void virt_irq_init(void)
{
return;
}
This diff is collapsed.
...@@ -82,35 +82,9 @@ static void smp_iSeries_message_pass(int target, int msg) ...@@ -82,35 +82,9 @@ static void smp_iSeries_message_pass(int target, int msg)
} }
} }
static int smp_iSeries_numProcs(void)
{
unsigned np, i;
np = 0;
for (i=0; i < NR_CPUS; ++i) {
if (paca[i].lppaca.dyn_proc_status < 2) {
cpu_set(i, cpu_possible_map);
cpu_set(i, cpu_present_map);
cpu_set(i, cpu_sibling_map[i]);
++np;
}
}
return np;
}
static int smp_iSeries_probe(void) static int smp_iSeries_probe(void)
{ {
unsigned i; return cpus_weight(cpu_possible_map);
unsigned np = 0;
for (i=0; i < NR_CPUS; ++i) {
if (paca[i].lppaca.dyn_proc_status < 2) {
/*paca[i].active = 1;*/
++np;
}
}
return np;
} }
static void smp_iSeries_kick_cpu(int nr) static void smp_iSeries_kick_cpu(int nr)
...@@ -144,6 +118,4 @@ static struct smp_ops_t iSeries_smp_ops = { ...@@ -144,6 +118,4 @@ static struct smp_ops_t iSeries_smp_ops = {
void __init smp_init_iSeries(void) void __init smp_init_iSeries(void)
{ {
smp_ops = &iSeries_smp_ops; smp_ops = &iSeries_smp_ops;
systemcfg->processorCount = smp_iSeries_numProcs();
} }
...@@ -58,6 +58,7 @@ ...@@ -58,6 +58,7 @@
#include <asm/mmu.h> #include <asm/mmu.h>
#include <asm/lmb.h> #include <asm/lmb.h>
#include <asm/iSeries/ItLpNaca.h> #include <asm/iSeries/ItLpNaca.h>
#include <asm/firmware.h>
#ifdef DEBUG #ifdef DEBUG
#define DBG(fmt...) udbg_printf(fmt) #define DBG(fmt...) udbg_printf(fmt)
...@@ -153,7 +154,7 @@ struct screen_info screen_info = { ...@@ -153,7 +154,7 @@ struct screen_info screen_info = {
.orig_video_points = 16 .orig_video_points = 16
}; };
#if defined(CONFIG_PPC_MULTIPLATFORM) && defined(CONFIG_SMP) #ifdef CONFIG_SMP
static int smt_enabled_cmdline; static int smt_enabled_cmdline;
...@@ -306,15 +307,13 @@ static void __init setup_cpu_maps(void) ...@@ -306,15 +307,13 @@ static void __init setup_cpu_maps(void)
systemcfg->processorCount = num_present_cpus(); systemcfg->processorCount = num_present_cpus();
} }
#endif /* defined(CONFIG_PPC_MULTIPLATFORM) && defined(CONFIG_SMP) */ #endif /* CONFIG_SMP */
#ifdef CONFIG_PPC_MULTIPLATFORM
extern struct machdep_calls pSeries_md; extern struct machdep_calls pSeries_md;
extern struct machdep_calls pmac_md; extern struct machdep_calls pmac_md;
extern struct machdep_calls maple_md; extern struct machdep_calls maple_md;
extern struct machdep_calls bpa_md; extern struct machdep_calls bpa_md;
extern struct machdep_calls iseries_md;
/* Ultimately, stuff them in an elf section like initcalls... */ /* Ultimately, stuff them in an elf section like initcalls... */
static struct machdep_calls __initdata *machines[] = { static struct machdep_calls __initdata *machines[] = {
...@@ -329,6 +328,9 @@ static struct machdep_calls __initdata *machines[] = { ...@@ -329,6 +328,9 @@ static struct machdep_calls __initdata *machines[] = {
#endif /* CONFIG_PPC_MAPLE */ #endif /* CONFIG_PPC_MAPLE */
#ifdef CONFIG_PPC_BPA #ifdef CONFIG_PPC_BPA
&bpa_md, &bpa_md,
#endif
#ifdef CONFIG_PPC_ISERIES
&iseries_md,
#endif #endif
NULL NULL
}; };
...@@ -401,7 +403,8 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -401,7 +403,8 @@ void __init early_setup(unsigned long dt_ptr)
/* /*
* Initialize stab / SLB management * Initialize stab / SLB management
*/ */
stab_initialize(lpaca->stab_real); if (!firmware_has_feature(FW_FEATURE_ISERIES))
stab_initialize(lpaca->stab_real);
/* /*
* Initialize the MMU Hash table and create the linear mapping * Initialize the MMU Hash table and create the linear mapping
...@@ -532,8 +535,6 @@ static void __init check_for_initrd(void) ...@@ -532,8 +535,6 @@ static void __init check_for_initrd(void)
#endif /* CONFIG_BLK_DEV_INITRD */ #endif /* CONFIG_BLK_DEV_INITRD */
} }
#endif /* CONFIG_PPC_MULTIPLATFORM */
/* /*
* Do some initial setup of the system. The parameters are those which * Do some initial setup of the system. The parameters are those which
* were passed in from the bootloader. * were passed in from the bootloader.
...@@ -542,14 +543,6 @@ void __init setup_system(void) ...@@ -542,14 +543,6 @@ void __init setup_system(void)
{ {
DBG(" -> setup_system()\n"); DBG(" -> setup_system()\n");
#ifdef CONFIG_PPC_ISERIES
/* pSeries systems are identified in prom.c via OF. */
if (itLpNaca.xLparInstalled == 1)
systemcfg->platform = PLATFORM_ISERIES_LPAR;
ppc_md.init_early();
#else /* CONFIG_PPC_ISERIES */
/* /*
* Unflatten the device-tree passed by prom_init or kexec * Unflatten the device-tree passed by prom_init or kexec
*/ */
...@@ -607,9 +600,8 @@ void __init setup_system(void) ...@@ -607,9 +600,8 @@ void __init setup_system(void)
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
parse_early_param(); parse_early_param();
#endif /* !CONFIG_PPC_ISERIES */
#if defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES) #ifdef CONFIG_SMP
/* /*
* iSeries has already initialized the cpu maps at this point. * iSeries has already initialized the cpu maps at this point.
*/ */
...@@ -619,7 +611,7 @@ void __init setup_system(void) ...@@ -619,7 +611,7 @@ void __init setup_system(void)
* we can map physical -> logical CPU ids * we can map physical -> logical CPU ids
*/ */
smp_release_cpus(); smp_release_cpus();
#endif /* defined(CONFIG_SMP) && !defined(CONFIG_PPC_ISERIES) */ #endif
printk("Starting Linux PPC64 %s\n", system_utsname.version); printk("Starting Linux PPC64 %s\n", system_utsname.version);
......
...@@ -465,7 +465,7 @@ int do_settimeofday(struct timespec *tv) ...@@ -465,7 +465,7 @@ int do_settimeofday(struct timespec *tv)
EXPORT_SYMBOL(do_settimeofday); EXPORT_SYMBOL(do_settimeofday);
#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_MAPLE) || defined(CONFIG_PPC_BPA) #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_MAPLE) || defined(CONFIG_PPC_BPA) || defined(CONFIG_PPC_ISERIES)
void __init generic_calibrate_decr(void) void __init generic_calibrate_decr(void)
{ {
struct device_node *cpu; struct device_node *cpu;
......
...@@ -90,7 +90,6 @@ static inline void loop_forever(void) ...@@ -90,7 +90,6 @@ static inline void loop_forever(void)
; ;
} }
#ifdef CONFIG_PPC_MULTIPLATFORM
static inline void create_pte_mapping(unsigned long start, unsigned long end, static inline void create_pte_mapping(unsigned long start, unsigned long end,
unsigned long mode, int large) unsigned long mode, int large)
{ {
...@@ -111,7 +110,7 @@ static inline void create_pte_mapping(unsigned long start, unsigned long end, ...@@ -111,7 +110,7 @@ static inline void create_pte_mapping(unsigned long start, unsigned long end,
unsigned long vpn, hash, hpteg; unsigned long vpn, hash, hpteg;
unsigned long vsid = get_kernel_vsid(addr); unsigned long vsid = get_kernel_vsid(addr);
unsigned long va = (vsid << 28) | (addr & 0xfffffff); unsigned long va = (vsid << 28) | (addr & 0xfffffff);
int ret; int ret = -1;
if (large) if (large)
vpn = va >> HPAGE_SHIFT; vpn = va >> HPAGE_SHIFT;
...@@ -129,16 +128,25 @@ static inline void create_pte_mapping(unsigned long start, unsigned long end, ...@@ -129,16 +128,25 @@ static inline void create_pte_mapping(unsigned long start, unsigned long end,
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
#ifdef CONFIG_PPC_ISERIES
if (systemcfg->platform & PLATFORM_ISERIES_LPAR)
ret = iSeries_hpte_bolt_or_insert(hpteg, va,
virt_to_abs(addr) >> PAGE_SHIFT,
vflags, tmp_mode);
else
#endif
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
if (systemcfg->platform & PLATFORM_LPAR) if (systemcfg->platform & PLATFORM_LPAR)
ret = pSeries_lpar_hpte_insert(hpteg, va, ret = pSeries_lpar_hpte_insert(hpteg, va,
virt_to_abs(addr) >> PAGE_SHIFT, virt_to_abs(addr) >> PAGE_SHIFT,
vflags, tmp_mode); vflags, tmp_mode);
else else
#endif /* CONFIG_PPC_PSERIES */ #endif
#ifdef CONFIG_PPC_MULTIPLATFORM
ret = native_hpte_insert(hpteg, va, ret = native_hpte_insert(hpteg, va,
virt_to_abs(addr) >> PAGE_SHIFT, virt_to_abs(addr) >> PAGE_SHIFT,
vflags, tmp_mode); vflags, tmp_mode);
#endif
if (ret == -1) { if (ret == -1) {
ppc64_terminate_msg(0x20, "create_pte_mapping"); ppc64_terminate_msg(0x20, "create_pte_mapping");
...@@ -261,7 +269,6 @@ void __init htab_initialize(void) ...@@ -261,7 +269,6 @@ void __init htab_initialize(void)
} }
#undef KB #undef KB
#undef MB #undef MB
#endif /* CONFIG_PPC_MULTIPLATFORM */
/* /*
* Called by asm hashtable.S for doing lazy icache flush * Called by asm hashtable.S for doing lazy icache flush
......
...@@ -206,6 +206,10 @@ extern long native_hpte_insert(unsigned long hpte_group, unsigned long va, ...@@ -206,6 +206,10 @@ extern long native_hpte_insert(unsigned long hpte_group, unsigned long va,
unsigned long prpn, unsigned long prpn,
unsigned long vflags, unsigned long rflags); unsigned long vflags, unsigned long rflags);
extern long iSeries_hpte_bolt_or_insert(unsigned long hpte_group,
unsigned long va, unsigned long prpn,
unsigned long vflags, unsigned long rflags);
extern void stabs_alloc(void); extern void stabs_alloc(void);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -291,6 +291,7 @@ ...@@ -291,6 +291,7 @@
#define IC_OPEN_PIC 1 #define IC_OPEN_PIC 1
#define IC_PPC_XIC 2 #define IC_PPC_XIC 2
#define IC_BPA_IIC 3 #define IC_BPA_IIC 3
#define IC_ISERIES 4
#define XGLUE(a,b) a##b #define XGLUE(a,b) a##b
#define GLUE(a,b) XGLUE(a,b) #define GLUE(a,b) XGLUE(a,b)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment