Commit e8c25900 authored by Paul Mackerras's avatar Paul Mackerras

Merge samba.org:/home/paulus/kernel/linux-2.5

into samba.org:/home/paulus/kernel/for-linus-ppc
parents b49863dd d127326d
VERSION = 2 VERSION = 2
PATCHLEVEL = 5 PATCHLEVEL = 5
SUBLEVEL = 53 SUBLEVEL = 54
EXTRAVERSION = EXTRAVERSION =
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -210,7 +210,6 @@ zi:; $(Q)$(MAKE) $(build)=$(boot) zinstall ...@@ -210,7 +210,6 @@ zi:; $(Q)$(MAKE) $(build)=$(boot) zinstall
arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
include/config/MARKER include/config/MARKER
@:
include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s
@echo -n ' Generating $@' @echo -n ' Generating $@'
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
HEAD = head.o HEAD = head.o
OBJS = misc.o OBJS = misc.o
FONTC = drivers/video/font_acorn_8x8.c FONTC = drivers/video/console/font_acorn_8x8.c
# #
# Architecture dependencies # Architecture dependencies
......
...@@ -127,7 +127,8 @@ EXPORT_SYMBOL(enable_irq); ...@@ -127,7 +127,8 @@ EXPORT_SYMBOL(enable_irq);
EXPORT_SYMBOL(disable_irq); EXPORT_SYMBOL(disable_irq);
EXPORT_SYMBOL(probe_irq_mask); EXPORT_SYMBOL(probe_irq_mask);
EXPORT_SYMBOL(set_irq_type); EXPORT_SYMBOL(set_irq_type);
EXPORT_SYMBOL(set_irq_wake); EXPORT_SYMBOL(enable_irq_wake);
EXPORT_SYMBOL(disable_irq_wake);
EXPORT_SYMBOL(pm_idle); EXPORT_SYMBOL(pm_idle);
EXPORT_SYMBOL(pm_power_off); EXPORT_SYMBOL(pm_power_off);
EXPORT_SYMBOL(fp_init); EXPORT_SYMBOL(fp_init);
...@@ -201,7 +202,6 @@ EXPORT_SYMBOL(__arch_clear_user); ...@@ -201,7 +202,6 @@ EXPORT_SYMBOL(__arch_clear_user);
EXPORT_SYMBOL(__arch_strnlen_user); EXPORT_SYMBOL(__arch_strnlen_user);
/* consistent area handling */ /* consistent area handling */
EXPORT_SYMBOL(pci_alloc_consistent);
EXPORT_SYMBOL(consistent_alloc); EXPORT_SYMBOL(consistent_alloc);
EXPORT_SYMBOL(consistent_free); EXPORT_SYMBOL(consistent_free);
EXPORT_SYMBOL(consistent_sync); EXPORT_SYMBOL(consistent_sync);
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <asm/page.h> /* for BUG() */ #include <asm/page.h> /* for BUG() */
#include <asm/io.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#else #else
__syscall_start: __syscall_start:
/* 0 */ .long sys_ni_syscall /* 0 */ .long sys_restart_syscall
.long sys_exit .long sys_exit
.long sys_fork_wrapper .long sys_fork_wrapper
.long sys_read .long sys_read
......
...@@ -129,6 +129,31 @@ void enable_irq(unsigned int irq) ...@@ -129,6 +129,31 @@ void enable_irq(unsigned int irq)
spin_unlock_irqrestore(&irq_controller_lock, flags); spin_unlock_irqrestore(&irq_controller_lock, flags);
} }
/*
* Enable wake on selected irq
*/
void enable_irq_wake(unsigned int irq)
{
struct irqdesc *desc = irq_desc + irq;
unsigned long flags;
spin_lock_irqsave(&irq_controller_lock, flags);
if (desc->chip->wake)
desc->chip->wake(irq, 1);
spin_unlock_irqrestore(&irq_controller_lock, flags);
}
void disable_irq_wake(unsigned int irq)
{
struct irqdesc *desc = irq_desc + irq;
unsigned long flags;
spin_lock_irqsave(&irq_controller_lock, flags);
if (desc->chip->wake)
desc->chip->wake(irq, 0);
spin_unlock_irqrestore(&irq_controller_lock, flags);
}
int show_interrupts(struct seq_file *p, void *v) int show_interrupts(struct seq_file *p, void *v)
{ {
int i; int i;
......
...@@ -67,18 +67,12 @@ void module_free(struct module *module, void *region) ...@@ -67,18 +67,12 @@ void module_free(struct module *module, void *region)
vfree(region); vfree(region);
} }
long int module_frob_arch_sections(const Elf_Ehdr *hdr,
module_core_size(const Elf32_Ehdr *hdr, const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, struct module *module) const char *secstrings,
struct module *mod)
{ {
return module->core_size; return 0;
}
long
module_init_size(const Elf32_Ehdr *hdr, const Elf32_Shdr *sechdrs,
const char *secstrings, struct module *module)
{
return module->init_size;
} }
int int
...@@ -88,7 +82,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -88,7 +82,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
Elf32_Shdr *symsec = sechdrs + symindex; Elf32_Shdr *symsec = sechdrs + symindex;
Elf32_Shdr *relsec = sechdrs + relindex; Elf32_Shdr *relsec = sechdrs + relindex;
Elf32_Shdr *dstsec = sechdrs + relsec->sh_info; Elf32_Shdr *dstsec = sechdrs + relsec->sh_info;
Elf32_Rel *rel = (void *)relsec->sh_offset; Elf32_Rel *rel = (void *)relsec->sh_addr;
unsigned int i; unsigned int i;
for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) { for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) {
...@@ -103,7 +97,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -103,7 +97,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
return -ENOEXEC; return -ENOEXEC;
} }
sym = ((Elf32_Sym *)symsec->sh_offset) + offset; sym = ((Elf32_Sym *)symsec->sh_addr) + offset;
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: unknown symbol %s\n", printk(KERN_WARNING "%s: unknown symbol %s\n",
module->name, strtab + sym->st_name); module->name, strtab + sym->st_name);
...@@ -118,7 +112,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, ...@@ -118,7 +112,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
return -ENOEXEC; return -ENOEXEC;
} }
loc = dstsec->sh_offset + rel->r_offset; loc = dstsec->sh_addr + rel->r_offset;
switch (ELF32_R_TYPE(rel->r_info)) { switch (ELF32_R_TYPE(rel->r_info)) {
case R_ARM_ABS32: case R_ARM_ABS32:
......
...@@ -603,7 +603,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) ...@@ -603,7 +603,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
case SIGQUIT: case SIGILL: case SIGTRAP: case SIGQUIT: case SIGILL: case SIGTRAP:
case SIGABRT: case SIGFPE: case SIGSEGV: case SIGABRT: case SIGFPE: case SIGSEGV:
case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ: case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
if (do_coredump(signr, regs)) if (do_coredump(signr, exit_code, regs))
exit_code |= 0x80; exit_code |= 0x80;
/* FALLTHRU */ /* FALLTHRU */
...@@ -615,7 +615,11 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) ...@@ -615,7 +615,11 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
/* Are we from a system call? */ /* Are we from a system call? */
if (syscall) { if (syscall) {
/* If so, check system call restarting.. */
switch (regs->ARM_r0) { switch (regs->ARM_r0) {
case -ERESTART_RESTARTBLOCK:
current_thread_info()->restart_block.fn =
do_no_restart_syscall;
case -ERESTARTNOHAND: case -ERESTARTNOHAND:
regs->ARM_r0 = -EINTR; regs->ARM_r0 = -EINTR;
break; break;
...@@ -638,12 +642,35 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) ...@@ -638,12 +642,35 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
return 1; return 1;
} }
if (syscall && /*
(regs->ARM_r0 == -ERESTARTNOHAND || * No signal to deliver to the process - restart the syscall.
regs->ARM_r0 == -ERESTARTSYS || */
regs->ARM_r0 == -ERESTARTNOINTR)) { if (syscall) {
regs->ARM_r0 = regs->ARM_ORIG_r0; if (regs->ARM_r0 == -ERESTART_RESTARTBLOCK) {
regs->ARM_pc -= 4; if (thumb_mode(regs)) {
regs->ARM_r7 = __NR_restart_syscall;
regs->ARM_pc -= 2;
} else {
u32 *usp;
regs->ARM_sp -= 12;
usp = (u32 *)regs->ARM_sp;
put_user(regs->ARM_pc, &usp[0]);
/* swi __NR_restart_syscall */
put_user(0xef000000 | __NR_restart_syscall, &usp[1]);
/* ldr pc, [sp], #12 */
put_user(0xe49df00c, &usp[2]);
regs->ARM_pc = regs->ARM_sp + 4;
}
}
if (regs->ARM_r0 == -ERESTARTNOHAND ||
regs->ARM_r0 == -ERESTARTSYS ||
regs->ARM_r0 == -ERESTARTNOINTR) {
regs->ARM_r0 = regs->ARM_ORIG_r0;
regs->ARM_pc -= 4;
}
} }
if (single_stepping) if (single_stepping)
ptrace_set_bpt(current); ptrace_set_bpt(current);
......
...@@ -148,9 +148,11 @@ static int integrator_set_policy(struct cpufreq_policy *policy) ...@@ -148,9 +148,11 @@ static int integrator_set_policy(struct cpufreq_policy *policy)
static struct cpufreq_policy integrator_policy = { static struct cpufreq_policy integrator_policy = {
.cpu = 0, .cpu = 0,
.policy = CPUFREQ_POLICY_POWERSAVE, .policy = CPUFREQ_POLICY_POWERSAVE,
.cpuinfo.max_cpu_freq = 160000, .cpuinfo = {
.cpuinfo.min_cpu_freq = 12000, .max_cpu_freq = 160000,
.cpuinfo.transition_latency = CPUFREQ_ETERNAL, .min_cpu_freq = 12000,
.transition_latency = CPUFREQ_ETERNAL,
},
}; };
static struct cpufreq_driver integrator_driver = { static struct cpufreq_driver integrator_driver = {
......
...@@ -21,8 +21,7 @@ obj-$(CONFIG_SA1100_PT_SYSTEM3) += cpu-sa1110.o ...@@ -21,8 +21,7 @@ obj-$(CONFIG_SA1100_PT_SYSTEM3) += cpu-sa1110.o
endif endif
# Next, the SA1111 stuff. # Next, the SA1111 stuff.
obj-$(CONFIG_SA1111) += sa1111.o obj-$(CONFIG_SA1111) += sa1111.o sa1111-pcibuf.o pcipool.o
obj-$(CONFIG_USB_OHCI_HCD) += sa1111-pcibuf.o pcipool.o
# Specific board support # Specific board support
obj-$(CONFIG_SA1100_ADSBITSY) += adsbitsy.o obj-$(CONFIG_SA1100_ADSBITSY) += adsbitsy.o
......
...@@ -203,9 +203,11 @@ static int sa1100_setspeed(struct cpufreq_policy *policy) ...@@ -203,9 +203,11 @@ static int sa1100_setspeed(struct cpufreq_policy *policy)
static struct cpufreq_policy sa1100_policy = { static struct cpufreq_policy sa1100_policy = {
.cpu = 0, .cpu = 0,
.policy = CPUFREQ_POLICY_POWERSAVE, .policy = CPUFREQ_POLICY_POWERSAVE,
.cpuinfo.max_freq = 287000, .cpuinfo = {
.cpuinfo.min_freq = 59000, .max_freq = 287000,
.cpuinfo.transition_latency = CPUFREQ_ETERNAL, .min_freq = 59000,
.transition_latency = CPUFREQ_ETERNAL,
},
}; };
static struct cpufreq_driver sa1100_driver = { static struct cpufreq_driver sa1100_driver = {
......
...@@ -298,9 +298,11 @@ static int sa1110_setspeed(struct cpufreq_policy *policy) ...@@ -298,9 +298,11 @@ static int sa1110_setspeed(struct cpufreq_policy *policy)
static struct cpufreq_policy sa1110_policy = { static struct cpufreq_policy sa1110_policy = {
.cpu = 0, .cpu = 0,
.policy = CPUFREQ_POLICY_POWERSAVE, .policy = CPUFREQ_POLICY_POWERSAVE,
.cpuinfo.max_freq = 287000, .cpuinfo = {
.cpuinfo.min_freq = 59000, .max_freq = 287000,
.cpuinfo.transition_latency = CPUFREQ_ETERNAL, .min_freq = 59000,
.transition_latency = CPUFREQ_ETERNAL,
},
}; };
static struct cpufreq_driver sa1110_driver = { static struct cpufreq_driver sa1110_driver = {
......
...@@ -92,12 +92,22 @@ static void sa1100_low_gpio_unmask(unsigned int irq) ...@@ -92,12 +92,22 @@ static void sa1100_low_gpio_unmask(unsigned int irq)
ICMR |= 1 << irq; ICMR |= 1 << irq;
} }
static int sa1100_low_gpio_wake(unsigned int irq, unsigned int on)
{
if (on)
PWER |= 1 << irq;
else
PWER &= ~(1 << irq);
return 0;
}
static struct irqchip sa1100_low_gpio_chip = { static struct irqchip sa1100_low_gpio_chip = {
.ack = sa1100_low_gpio_ack, .ack = sa1100_low_gpio_ack,
.mask = sa1100_low_gpio_mask, .mask = sa1100_low_gpio_mask,
.unmask = sa1100_low_gpio_unmask, .unmask = sa1100_low_gpio_unmask,
.rerun = sa1100_manual_rerun, .rerun = sa1100_manual_rerun,
.type = sa1100_gpio_type, .type = sa1100_gpio_type,
.wake = sa1100_low_gpio_wake,
}; };
/* /*
...@@ -166,12 +176,22 @@ static void sa1100_high_gpio_unmask(unsigned int irq) ...@@ -166,12 +176,22 @@ static void sa1100_high_gpio_unmask(unsigned int irq)
GFER = GPIO_IRQ_falling_edge & GPIO_IRQ_mask; GFER = GPIO_IRQ_falling_edge & GPIO_IRQ_mask;
} }
static int sa1100_high_gpio_wake(unsigned int irq, unsigned int on)
{
if (on)
PWER |= GPIO11_27_MASK(irq);
else
PWER &= ~GPIO11_27_MASK(irq);
return 0;
}
static struct irqchip sa1100_high_gpio_chip = { static struct irqchip sa1100_high_gpio_chip = {
.ack = sa1100_high_gpio_ack, .ack = sa1100_high_gpio_ack,
.mask = sa1100_high_gpio_mask, .mask = sa1100_high_gpio_mask,
.unmask = sa1100_high_gpio_unmask, .unmask = sa1100_high_gpio_unmask,
.rerun = sa1100_manual_rerun, .rerun = sa1100_manual_rerun,
.type = sa1100_gpio_type, .type = sa1100_gpio_type,
.wake = sa1100_high_gpio_wake,
}; };
/* /*
...@@ -252,5 +272,5 @@ void __init sa1100_init_irq(void) ...@@ -252,5 +272,5 @@ void __init sa1100_init_irq(void)
* We generally don't want the LCD IRQ being * We generally don't want the LCD IRQ being
* enabled as soon as we request it. * enabled as soon as we request it.
*/ */
set_irq_flags(IRQ_LCD, IRQF_VALID | IRQF_NOAUTOEN); set_irq_flags(IRQ_LCD, IRQF_VALID/* | IRQF_NOAUTOEN*/);
} }
...@@ -6,9 +6,13 @@ ...@@ -6,9 +6,13 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/hardware/sa1111.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -19,33 +23,29 @@ ...@@ -19,33 +23,29 @@
#define JORTUCR_VAL 0x20000400 #define JORTUCR_VAL 0x20000400
#define JORSKCR_INIT 0x00002081 /* Turn off VCO to enable PLL, set Ready En and enable nOE assertion from DC */
#define JORSKCR_RCLK 0x00002083 /* Add turning on RCLK to above */
#define JORSKCR_VAL 0x0000001B /* sets the 1101 control register to on */
static int __init jornada720_init(void) static int __init jornada720_init(void)
{ {
GPDR |= GPIO_GPIO20; int ret = -ENODEV;
TUCR = JORTUCR_VAL; /* set the oscillator out to the SA-1101 */
GPSR = GPIO_GPIO20; if (machine_is_jornada720()) {
udelay(1); GPDR |= GPIO_GPIO20;
GPCR = GPIO_GPIO20; TUCR = JORTUCR_VAL; /* set the oscillator out to the SA-1101 */
udelay(1);
GPSR = GPIO_GPIO20;
udelay(20);
SKCR = JORSKCR_INIT; /* Turn on the PLL, enable Ready and enable nOE assertion from DC */
mdelay(100);
SBI_SKCR = JORSKCR_RCLK;/* turn on the RCLOCK */ GPSR = GPIO_GPIO20;
SBI_SMCR = 0x35; /* initialize the SMC (debug SA-1111 reset */ udelay(1);
PCCR = 0; /* initialize the S2MC (debug SA-1111 reset) */ GPCR = GPIO_GPIO20;
udelay(1);
GPSR = GPIO_GPIO20;
udelay(20);
/* LDD4 is speaker, LDD3 is microphone */ /* LDD4 is speaker, LDD3 is microphone */
PPSR &= ~(PPC_LDD3 | PPC_LDD4); PPSR &= ~(PPC_LDD3 | PPC_LDD4);
PPDR |= PPC_LDD3 | PPC_LDD4; PPDR |= PPC_LDD3 | PPC_LDD4;
return sa1111_init(0x40000000, IRQ_GPIO1); ret = sa1111_init(0x40000000, IRQ_GPIO1);
}
return ret;
} }
arch_initcall(jornada720_init); arch_initcall(jornada720_init);
......
...@@ -87,6 +87,15 @@ static inline void __init neponset_init_irq(void) ...@@ -87,6 +87,15 @@ static inline void __init neponset_init_irq(void)
set_irq_type(IRQ_GPIO25, IRQT_RISING); set_irq_type(IRQ_GPIO25, IRQT_RISING);
set_irq_chained_handler(IRQ_GPIO25, neponset_irq_handler); set_irq_chained_handler(IRQ_GPIO25, neponset_irq_handler);
/*
* We would set IRQ_GPIO25 to be a wake-up IRQ, but
* unfortunately something on the Neponset activates
* this IRQ on sleep (ethernet?)
*/
#if 0
enable_irq_wake(IRQ_GPIO25);
#endif
/* /*
* Setup other Neponset IRQs. SA1111 will be done by the * Setup other Neponset IRQs. SA1111 will be done by the
* generic SA1111 code. * generic SA1111 code.
...@@ -191,7 +200,7 @@ static int neponset_resume(struct device *dev, u32 level) ...@@ -191,7 +200,7 @@ static int neponset_resume(struct device *dev, u32 level)
} }
static struct device_driver neponset_device_driver = { static struct device_driver neponset_device_driver = {
.name = "NEPONSET", .name = "neponset",
.bus = &system_bus_type, .bus = &system_bus_type,
.suspend = neponset_suspend, .suspend = neponset_suspend,
.resume = neponset_resume, .resume = neponset_resume,
......
...@@ -56,7 +56,7 @@ static inline const char *slot_name(const struct pci_pool *pool) ...@@ -56,7 +56,7 @@ static inline const char *slot_name(const struct pci_pool *pool)
if (pdev == 0) if (pdev == 0)
return "[0]"; return "[0]";
else if (dev_is_sa1111(pdev)) else if (pcidev_is_sa1111(pdev))
return "[SA-1111]"; return "[SA-1111]";
else else
return pdev->slot_name; return pdev->slot_name;
......
...@@ -124,7 +124,7 @@ destroy_safe_buffer_pools(void) ...@@ -124,7 +124,7 @@ destroy_safe_buffer_pools(void)
/* allocate a 'safe' buffer and keep track of it */ /* allocate a 'safe' buffer and keep track of it */
static struct safe_buffer * static struct safe_buffer *
alloc_safe_buffer(struct pci_dev *hwdev, void *ptr, size_t size, int direction) alloc_safe_buffer(void *ptr, size_t size, int direction)
{ {
struct safe_buffer *buf; struct safe_buffer *buf;
struct pci_pool *pool; struct pci_pool *pool;
...@@ -254,7 +254,7 @@ static void print_map_stats(void) ...@@ -254,7 +254,7 @@ static void print_map_stats(void)
#endif #endif
static dma_addr_t static dma_addr_t
map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction) map_single(void *ptr, size_t size, int direction)
{ {
dma_addr_t dma_addr; dma_addr_t dma_addr;
...@@ -267,7 +267,7 @@ map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction) ...@@ -267,7 +267,7 @@ map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
DO_STATS ( bounce_count++ ) ; DO_STATS ( bounce_count++ ) ;
buf = alloc_safe_buffer(hwdev, ptr, size, direction); buf = alloc_safe_buffer(ptr, size, direction);
if (buf == 0) { if (buf == 0) {
printk(KERN_ERR printk(KERN_ERR
"%s: unable to map unsafe buffer %p!\n", "%s: unable to map unsafe buffer %p!\n",
...@@ -302,8 +302,7 @@ map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction) ...@@ -302,8 +302,7 @@ map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
} }
static void static void
unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, unmap_single(dma_addr_t dma_addr, size_t size, int direction)
size_t size, int direction)
{ {
struct safe_buffer *buf; struct safe_buffer *buf;
...@@ -332,8 +331,7 @@ unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, ...@@ -332,8 +331,7 @@ unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
} }
static void static void
sync_single(struct pci_dev *hwdev, dma_addr_t dma_addr, sync_single(dma_addr_t dma_addr, size_t size, int direction)
size_t size, int direction)
{ {
struct safe_buffer *buf; struct safe_buffer *buf;
...@@ -381,20 +379,19 @@ sync_single(struct pci_dev *hwdev, dma_addr_t dma_addr, ...@@ -381,20 +379,19 @@ sync_single(struct pci_dev *hwdev, dma_addr_t dma_addr,
* (basically move the buffer from an unsafe area to a safe one) * (basically move the buffer from an unsafe area to a safe one)
*/ */
dma_addr_t dma_addr_t
sa1111_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction) sa1111_map_single(void *ptr, size_t size, int direction)
{ {
unsigned long flags; unsigned long flags;
dma_addr_t dma_addr; dma_addr_t dma_addr;
DPRINTK("%s(hwdev=%p,ptr=%p,size=%d,dir=%x)\n", DPRINTK("%s(ptr=%p,size=%d,dir=%x)\n",
__func__, hwdev, ptr, size, direction); __func__, ptr, size, direction);
BUG_ON(hwdev != SA1111_FAKE_PCIDEV);
BUG_ON(direction == PCI_DMA_NONE); BUG_ON(direction == PCI_DMA_NONE);
local_irq_save(flags); local_irq_save(flags);
dma_addr = map_single(hwdev, ptr, size, direction); dma_addr = map_single(ptr, size, direction);
local_irq_restore(flags); local_irq_restore(flags);
...@@ -409,35 +406,31 @@ sa1111_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction) ...@@ -409,35 +406,31 @@ sa1111_map_single(struct pci_dev *hwdev, void *ptr, size_t size, int direction)
*/ */
void void
sa1111_unmap_single(struct pci_dev *hwdev, dma_addr_t dma_addr, sa1111_unmap_single(dma_addr_t dma_addr, size_t size, int direction)
size_t size, int direction)
{ {
unsigned long flags; unsigned long flags;
DPRINTK("%s(hwdev=%p,ptr=%p,size=%d,dir=%x)\n", DPRINTK("%s(ptr=%p,size=%d,dir=%x)\n",
__func__, hwdev, (void *) dma_addr, size, direction); __func__, (void *) dma_addr, size, direction);
BUG_ON(hwdev != SA1111_FAKE_PCIDEV);
BUG_ON(direction == PCI_DMA_NONE); BUG_ON(direction == PCI_DMA_NONE);
local_irq_save(flags); local_irq_save(flags);
unmap_single(hwdev, dma_addr, size, direction); unmap_single(dma_addr, size, direction);
local_irq_restore(flags); local_irq_restore(flags);
} }
int int
sa1111_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, sa1111_map_sg(struct scatterlist *sg, int nents, int direction)
int nents, int direction)
{ {
unsigned long flags; unsigned long flags;
int i; int i;
DPRINTK("%s(hwdev=%p,sg=%p,nents=%d,dir=%x)\n", DPRINTK("%s(sg=%p,nents=%d,dir=%x)\n",
__func__, hwdev, sg, nents, direction); __func__, sg, nents, direction);
BUG_ON(hwdev != SA1111_FAKE_PCIDEV);
BUG_ON(direction == PCI_DMA_NONE); BUG_ON(direction == PCI_DMA_NONE);
local_irq_save(flags); local_irq_save(flags);
...@@ -449,7 +442,7 @@ sa1111_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, ...@@ -449,7 +442,7 @@ sa1111_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
void *ptr = page_address(page) + offset; void *ptr = page_address(page) + offset;
sg->dma_address = sg->dma_address =
map_single(hwdev, ptr, length, direction); map_single(ptr, length, direction);
} }
local_irq_restore(flags); local_irq_restore(flags);
...@@ -458,16 +451,14 @@ sa1111_map_sg(struct pci_dev *hwdev, struct scatterlist *sg, ...@@ -458,16 +451,14 @@ sa1111_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
} }
void void
sa1111_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, sa1111_unmap_sg(struct scatterlist *sg, int nents, int direction)
int direction)
{ {
unsigned long flags; unsigned long flags;
int i; int i;
DPRINTK("%s(hwdev=%p,sg=%p,nents=%d,dir=%x)\n", DPRINTK("%s(sg=%p,nents=%d,dir=%x)\n",
__func__, hwdev, sg, nents, direction); __func__, sg, nents, direction);
BUG_ON(hwdev != SA1111_FAKE_PCIDEV);
BUG_ON(direction == PCI_DMA_NONE); BUG_ON(direction == PCI_DMA_NONE);
local_irq_save(flags); local_irq_save(flags);
...@@ -476,41 +467,36 @@ sa1111_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents, ...@@ -476,41 +467,36 @@ sa1111_unmap_sg(struct pci_dev *hwdev, struct scatterlist *sg, int nents,
dma_addr_t dma_addr = sg->dma_address; dma_addr_t dma_addr = sg->dma_address;
unsigned int length = sg->length; unsigned int length = sg->length;
unmap_single(hwdev, dma_addr, length, direction); unmap_single(dma_addr, length, direction);
} }
local_irq_restore(flags); local_irq_restore(flags);
} }
void void
sa1111_dma_sync_single(struct pci_dev *hwdev, dma_addr_t dma_addr, sa1111_dma_sync_single(dma_addr_t dma_addr, size_t size, int direction)
size_t size, int direction)
{ {
unsigned long flags; unsigned long flags;
DPRINTK("%s(hwdev=%p,ptr=%p,size=%d,dir=%x)\n", DPRINTK("%s(ptr=%p,size=%d,dir=%x)\n",
__func__, hwdev, (void *) dma_addr, size, direction); __func__, (void *) dma_addr, size, direction);
BUG_ON(hwdev != SA1111_FAKE_PCIDEV);
local_irq_save(flags); local_irq_save(flags);
sync_single(hwdev, dma_addr, size, direction); sync_single(dma_addr, size, direction);
local_irq_restore(flags); local_irq_restore(flags);
} }
void void
sa1111_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg, sa1111_dma_sync_sg(struct scatterlist *sg, int nents, int direction)
int nents, int direction)
{ {
unsigned long flags; unsigned long flags;
int i; int i;
DPRINTK("%s(hwdev=%p,sg=%p,nents=%d,dir=%x)\n", DPRINTK("%s(sg=%p,nents=%d,dir=%x)\n",
__func__, hwdev, sg, nents, direction); __func__, sg, nents, direction);
BUG_ON(hwdev != SA1111_FAKE_PCIDEV);
BUG_ON(direction == PCI_DMA_NONE); BUG_ON(direction == PCI_DMA_NONE);
local_irq_save(flags); local_irq_save(flags);
...@@ -519,7 +505,7 @@ sa1111_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg, ...@@ -519,7 +505,7 @@ sa1111_dma_sync_sg(struct pci_dev *hwdev, struct scatterlist *sg,
dma_addr_t dma_addr = sg->dma_address; dma_addr_t dma_addr = sg->dma_address;
unsigned int length = sg->length; unsigned int length = sg->length;
sync_single(hwdev, dma_addr, length, direction); sync_single(dma_addr, length, direction);
} }
local_irq_restore(flags); local_irq_restore(flags);
......
...@@ -249,6 +249,19 @@ static int sa1111_type_lowirq(unsigned int irq, unsigned int flags) ...@@ -249,6 +249,19 @@ static int sa1111_type_lowirq(unsigned int irq, unsigned int flags)
INTPOL0 &= ~mask; INTPOL0 &= ~mask;
else else
INTPOL0 |= mask; INTPOL0 |= mask;
WAKE_POL0 = INTPOL0;
return 0;
}
static int sa1111_wake_lowirq(unsigned int irq, unsigned int on)
{
unsigned int mask = SA1111_IRQMASK_LO(irq);
if (on)
WAKE_EN0 |= mask;
else
WAKE_EN0 &= ~mask;
return 0; return 0;
} }
...@@ -259,6 +272,7 @@ static struct irqchip sa1111_low_chip = { ...@@ -259,6 +272,7 @@ static struct irqchip sa1111_low_chip = {
.unmask = sa1111_unmask_lowirq, .unmask = sa1111_unmask_lowirq,
.rerun = sa1111_rerun_lowirq, .rerun = sa1111_rerun_lowirq,
.type = sa1111_type_lowirq, .type = sa1111_type_lowirq,
.wake = sa1111_wake_lowirq,
}; };
static void sa1111_mask_highirq(unsigned int irq) static void sa1111_mask_highirq(unsigned int irq)
...@@ -309,6 +323,19 @@ static int sa1111_type_highirq(unsigned int irq, unsigned int flags) ...@@ -309,6 +323,19 @@ static int sa1111_type_highirq(unsigned int irq, unsigned int flags)
INTPOL1 &= ~mask; INTPOL1 &= ~mask;
else else
INTPOL1 |= mask; INTPOL1 |= mask;
WAKE_POL1 = INTPOL1;
return 0;
}
static int sa1111_wake_highirq(unsigned int irq, unsigned int on)
{
unsigned int mask = SA1111_IRQMASK_HI(irq);
if (on)
WAKE_EN1 |= mask;
else
WAKE_EN1 &= ~mask;
return 0; return 0;
} }
...@@ -319,6 +346,7 @@ static struct irqchip sa1111_high_chip = { ...@@ -319,6 +346,7 @@ static struct irqchip sa1111_high_chip = {
.unmask = sa1111_unmask_highirq, .unmask = sa1111_unmask_highirq,
.rerun = sa1111_rerun_highirq, .rerun = sa1111_rerun_highirq,
.type = sa1111_type_highirq, .type = sa1111_type_highirq,
.wake = sa1111_wake_highirq,
}; };
static void __init sa1111_init_irq(struct sa1111_dev *sadev) static void __init sa1111_init_irq(struct sa1111_dev *sadev)
...@@ -854,7 +882,7 @@ static int sa1111_remove(struct device *dev) ...@@ -854,7 +882,7 @@ static int sa1111_remove(struct device *dev)
* PXA250/SA1110 machine classes. * PXA250/SA1110 machine classes.
*/ */
static struct device_driver sa1111_device_driver = { static struct device_driver sa1111_device_driver = {
.name = "SA1111", .name = "sa1111",
.bus = &system_bus_type, .bus = &system_bus_type,
.probe = sa1111_probe, .probe = sa1111_probe,
.remove = sa1111_remove, .remove = sa1111_remove,
......
...@@ -94,17 +94,6 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) ...@@ -94,17 +94,6 @@ void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle)
return NULL; return NULL;
} }
void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, dma_addr_t *handle)
{
int gfp = GFP_KERNEL;
if (hwdev == NULL || dev_is_sa1111(hwdev) ||
hwdev->dma_mask != 0xffffffff)
gfp |= GFP_DMA;
return consistent_alloc(gfp, size, handle);
}
/* /*
* free a page as defined by the above mapping. We expressly forbid * free a page as defined by the above mapping. We expressly forbid
* calling this from interrupt context. * calling this from interrupt context.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# To add an entry into this database, please see Documentation/arm/README, # To add an entry into this database, please see Documentation/arm/README,
# or contact rmk@arm.linux.org.uk # or contact rmk@arm.linux.org.uk
# #
# Last update: Sat Nov 16 15:57:50 2002 # Last update: Mon Dec 23 18:49:04 2002
# #
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
# #
...@@ -154,7 +154,7 @@ piranha ARCH_PIRANHA PIRANHA 142 ...@@ -154,7 +154,7 @@ piranha ARCH_PIRANHA PIRANHA 142
sbcamelot SA1100_SBCAMELOT SBCAMELOT 143 sbcamelot SA1100_SBCAMELOT SBCAMELOT 143
kings SA1100_KINGS KINGS 144 kings SA1100_KINGS KINGS 144
smdk2400 ARCH_SMDK2400 SMDK2400 145 smdk2400 ARCH_SMDK2400 SMDK2400 145
collie ARCH_COLLIE COLLIE 146 collie SA1100_COLLIE COLLIE 146
idr ARCH_IDR IDR 147 idr ARCH_IDR IDR 147
badge4 SA1100_BADGE4 BADGE4 148 badge4 SA1100_BADGE4 BADGE4 148
webnet ARCH_WEBNET WEBNET 149 webnet ARCH_WEBNET WEBNET 149
...@@ -258,3 +258,18 @@ chimp ARCH_CHIMP CHIMP 246 ...@@ -258,3 +258,18 @@ chimp ARCH_CHIMP CHIMP 246
stork_nest ARCH_STORK_NEST STORK_NEST 247 stork_nest ARCH_STORK_NEST STORK_NEST 247
stork_egg ARCH_STORK_EGG STORK_EGG 248 stork_egg ARCH_STORK_EGG STORK_EGG 248
wismo SA1100_WISMO WISMO 249 wismo SA1100_WISMO WISMO 249
ezlinx ARCH_EZLINX EZLINX 250
at91rm9200 ARCH_AT91 AT91 251
orion ARCH_ORION ORION 252
neptune ARCH_NEPTUNE NEPTUNE 253
hackkit SA1100_HACKKIT HACKKIT 254
pxa_wins30 ARCH_PXA_WINS30 PXA_WINS30 255
lavinna SA1100_LAVINNA LAVINNA 256
pxa_uengine ARCH_PXA_UENGINE PXA_UENGINE 257
innokom ARCH_INNOKOM INNOKOM 258
bms ARCH_BMS BMS 259
ixcdp1100 ARCH_IXCDP1100 IXCDP1100 260
prpmc1100 ARCH_PRPMC1100 PRPMC1100 261
at91rm9200dk ARCH_AT91RM9200DK AT91RM9200DK 262
armstick ARCH_ARMSTICK ARMSTICK 263
armonie ARCH_ARMONIE ARMONIE 264
...@@ -26,6 +26,9 @@ SECTIONS ...@@ -26,6 +26,9 @@ SECTIONS
__setup_start = .; __setup_start = .;
*(.init.setup) *(.init.setup)
__setup_end = .; __setup_end = .;
__start___param = .;
*(__param)
__stop___param = .;
__initcall_start = .; __initcall_start = .;
*(.initcall1.init) *(.initcall1.init)
*(.initcall2.init) *(.initcall2.init)
......
...@@ -330,12 +330,6 @@ extern int (*console_blank_hook)(int); ...@@ -330,12 +330,6 @@ extern int (*console_blank_hook)(int);
*/ */
#define DEFAULT_BOUNCE_INTERVAL (3 * HZ) #define DEFAULT_BOUNCE_INTERVAL (3 * HZ)
/*
* Save a segment register away
*/
#define savesegment(seg, where) \
__asm__ __volatile__("movl %%" #seg ",%0" : "=m" (where))
/* /*
* Maximum number of events stored * Maximum number of events stored
*/ */
......
...@@ -45,20 +45,12 @@ void module_free(struct module *mod, void *module_region) ...@@ -45,20 +45,12 @@ void module_free(struct module *mod, void *module_region)
} }
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
...@@ -68,7 +60,7 @@ int apply_relocate(Elf32_Shdr *sechdrs, ...@@ -68,7 +60,7 @@ int apply_relocate(Elf32_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf32_Rel *rel = (void *)sechdrs[relsec].sh_offset; Elf32_Rel *rel = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
uint32_t *location; uint32_t *location;
...@@ -76,10 +68,10 @@ int apply_relocate(Elf32_Shdr *sechdrs, ...@@ -76,10 +68,10 @@ int apply_relocate(Elf32_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf32_Sym *)sechdrs[symindex].sh_offset sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rel[i].r_info); + ELF32_R_SYM(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -274,12 +274,6 @@ void release_thread(struct task_struct *dead_task) ...@@ -274,12 +274,6 @@ void release_thread(struct task_struct *dead_task)
release_x86_irqs(dead_task); release_x86_irqs(dead_task);
} }
/*
* Save a segment.
*/
#define savesegment(seg,value) \
asm volatile("movl %%" #seg ",%0":"=m" (*(int *)&(value)))
int copy_thread(int nr, unsigned long clone_flags, unsigned long esp, int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
unsigned long unused, unsigned long unused,
struct task_struct * p, struct pt_regs * regs) struct task_struct * p, struct pt_regs * regs)
......
...@@ -101,24 +101,31 @@ static unsigned long get_plt_size(const Elf32_Ehdr *hdr, ...@@ -101,24 +101,31 @@ static unsigned long get_plt_size(const Elf32_Ehdr *hdr,
return ret; return ret;
} }
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs, Elf32_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *me)
{ {
module->arch.core_plt_offset = ALIGN(module->core_size, 4); unsigned int i;
return module->arch.core_plt_offset
+ get_plt_size(hdr, sechdrs, secstrings, 0);
}
long module_init_size(const Elf32_Ehdr *hdr, /* Find .plt and .init.plt sections */
const Elf32_Shdr *sechdrs, for (i = 0; i < hdr->e_shnum; i++) {
const char *secstrings, if (strcmp(secstrings + sechdrs[i].sh_name, ".init.plt") == 0)
struct module *module) me->arch.init_plt_section = i;
{ else if (strcmp(secstrings + sechdrs[i].sh_name, ".plt") == 0)
module->arch.init_plt_offset = ALIGN(module->init_size, 4); me->arch.core_plt_section = i;
return module->arch.init_plt_offset }
+ get_plt_size(hdr, sechdrs, secstrings, 1); if (!me->arch.core_plt_section || !me->arch.init_plt_section) {
printk("Module doesn't contain .plt or .init.plt sections.\n");
return -ENOEXEC;
}
/* Override their sizes */
sechdrs[me->arch.core_plt_section].sh_size
= get_plt_size(hdr, sechdrs, secstrings, 0);
sechdrs[me->arch.init_plt_section].sh_size
= get_plt_size(hdr, sechdrs, secstrings, 1);
return 0;
} }
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
...@@ -141,17 +148,20 @@ static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val) ...@@ -141,17 +148,20 @@ static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
} }
/* Set up a trampoline in the PLT to bounce us to the distant function */ /* Set up a trampoline in the PLT to bounce us to the distant function */
static uint32_t do_plt_call(void *location, Elf32_Addr val, struct module *mod) static uint32_t do_plt_call(void *location,
Elf32_Addr val,
Elf32_Shdr *sechdrs,
struct module *mod)
{ {
struct ppc_plt_entry *entry; struct ppc_plt_entry *entry;
DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location); DEBUGP("Doing plt for call to 0x%x at 0x%x\n", val, (unsigned int)location);
/* Init, or core PLT? */ /* Init, or core PLT? */
if (location >= mod->module_core if (location >= mod->module_core
&& location < mod->module_core + mod->arch.core_plt_offset) && location < mod->module_core + mod->core_size)
entry = mod->module_core + mod->arch.core_plt_offset; entry = (void *)sechdrs[mod->arch.core_plt_section].sh_addr;
else else
entry = mod->module_init + mod->arch.init_plt_offset; entry = (void *)sechdrs[mod->arch.init_plt_section].sh_addr;
/* Find this entry, or if that fails, the next avail. entry */ /* Find this entry, or if that fails, the next avail. entry */
while (entry->jump[0]) { while (entry->jump[0]) {
...@@ -176,7 +186,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -176,7 +186,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
struct module *module) struct module *module)
{ {
unsigned int i; unsigned int i;
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_offset; Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
uint32_t *location; uint32_t *location;
uint32_t value; uint32_t value;
...@@ -185,10 +195,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -185,10 +195,10 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rela[i].r_offset; + rela[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf32_Sym *)sechdrs[symindex].sh_offset sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rela[i].r_info); + ELF32_R_SYM(rela[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
...@@ -220,7 +230,8 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -220,7 +230,8 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
case R_PPC_REL24: case R_PPC_REL24:
if ((int)(value - (uint32_t)location) < -0x02000000 if ((int)(value - (uint32_t)location) < -0x02000000
|| (int)(value - (uint32_t)location) >= 0x02000000) || (int)(value - (uint32_t)location) >= 0x02000000)
value = do_plt_call(location, value, module); value = do_plt_call(location, value,
sechdrs, module);
/* Only replace bits 2 through 26 */ /* Only replace bits 2 through 26 */
DEBUGP("REL24 value = %08X. location = %08X\n", DEBUGP("REL24 value = %08X. location = %08X\n",
......
...@@ -13,61 +13,47 @@ ...@@ -13,61 +13,47 @@
# Adjusted for PPC64 by Tom Gall # Adjusted for PPC64 by Tom Gall
# #
KERNELLOAD =0xc000000000000000 KERNELLOAD = 0xc000000000000000
LDFLAGS := -m elf64ppc LDFLAGS := -m elf64ppc
LDFLAGS_vmlinux = -Bstatic \ LDFLAGS_vmlinux = -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
-e $(KERNELLOAD) -Ttext $(KERNELLOAD)
LDFLAGS_BLOB := --format binary --oformat elf64-powerpc LDFLAGS_BLOB := --format binary --oformat elf64-powerpc
CFLAGS := $(CFLAGS) -msoft-float -pipe \ CFLAGS += -msoft-float -pipe \
-Wno-uninitialized -mminimal-toc -mtraceback=full \ -Wno-uninitialized -mminimal-toc -mtraceback=full \
-finline-limit-2000 -mcpu=power4 -finline-limit-2000 -mcpu=power4
CPP = $(CC) -E $(CFLAGS)
HEAD := arch/ppc64/kernel/head.o HEAD := arch/ppc64/kernel/head.o
core-y += arch/ppc64/kernel/ arch/ppc64/mm/ arch/ppc64/lib/ libs-y += arch/ppc64/lib/
core-$(CONFIG_XMON) += arch/ppc64/xmon/ core-y += arch/ppc64/kernel/
core-y += arch/ppc64/mm/
# FIXME: is drivers- right ? core-$(CONFIG_XMON) += arch/ppc64/xmon/
drivers-$(CONFIG_OPROFILE) += arch/ppc64/oprofile/ drivers-$(CONFIG_OPROFILE) += arch/ppc64/oprofile/
makeboot = $(call descend,arch/ppc64/boot,$(1))
ifdef CONFIG_PPC_PSERIES
BOOT_TARGETS = zImage zImage.initrd
endif
ifdef CONFIG_PPC_ISERIES makeboot =$(Q)$(MAKE) -f scripts/Makefile.build obj=arch/ppc64/boot $(1)
BOOT_TARGETS = vmlinux.sminitrd vmlinux.initrd vmlinux.sm
endif
$(BOOT_TARGETS): vmlinux boottarget-$(CONFIG_PPC_PSERIES) := zImage zImage.initrd
@$(call makeboot,arch/ppc64/boot/$@) boottarget-$(CONFIG_PPC_ISERIES) := vmlinux.sminitrd vmlinux.initrd vmlinux.sm
$(boottarget-y): vmlinux
$(call makeboot,arch/ppc64/boot/$@)
%_config: arch/ppc64/configs/%_defconfig %_config: arch/ppc64/configs/%_defconfig
rm -f .config arch/ppc64/defconfig rm -f .config arch/ppc64/defconfig
cp -f arch/ppc64/configs/$(@:config=defconfig) arch/ppc64/defconfig cp -f arch/ppc64/configs/$(@:config=defconfig) arch/ppc64/defconfig
archclean: archclean:
@$(call makeboot,clean) $(Q)$(MAKE) -f scripts/Makefile.clean obj=arch/ppc64/boot
archmrproper: prepare: include/asm-ppc64/offsets.h
arch/ppc64/kernel/asm-offsets.s: include/asm include/linux/version.h \
prepare: include/asm-$(ARCH)/offsets.h
arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
include/config/MARKER include/config/MARKER
include/asm-$(ARCH)/offsets.h.tmp: arch/$(ARCH)/kernel/asm-offsets.s include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.s
@$(generate-asm-offsets.h) < $< > $@
include/asm-$(ARCH)/offsets.h: include/asm-$(ARCH)/offsets.h.tmp
@echo -n ' Generating $@' @echo -n ' Generating $@'
@$(generate-asm-offsets.h) < $< > $@.tmp
@$(update-if-changed) @$(update-if-changed)
CLEAN_FILES += include/asm-$(ARCH)/offsets.h.tmp \ CLEAN_FILES += include/asm-ppc64/offsets.h.tmp \
include/asm-$(ARCH)/offsets.h include/asm-ppc64/offsets.h
...@@ -23,92 +23,88 @@ ...@@ -23,92 +23,88 @@
CROSS32_COMPILE = CROSS32_COMPILE =
#CROSS32_COMPILE = /usr/local/ppc/bin/powerpc-linux- #CROSS32_COMPILE = /usr/local/ppc/bin/powerpc-linux-
BOOTCC = $(CROSS32_COMPILE)gcc BOOTCC := $(CROSS32_COMPILE)gcc
BOOTCFLAGS = $(HOSTCFLAGS) -I$(objtree)/include BOOTCFLAGS := $(HOSTCFLAGS) -Iinclude
BOOTLD = $(CROSS32_COMPILE)ld BOOTLD := $(CROSS32_COMPILE)ld
BOOTAS = $(CROSS32_COMPILE)as BOOTAS := $(CROSS32_COMPILE)as
BOOTAFLAGS = -D__ASSEMBLY__ $(HOSTCFLAGS) BOOTAFLAGS := -D__ASSEMBLY__ $(HOSTCFLAGS)
$(obj)/start.o: $(obj)/start.c CFLAGS := $(CPPFLAGS) -O -fno-builtin -DSTDC_HEADERS
$(BOOTCC) $(BOOTCFLAGS) -c -o $*.o $< LD_ARGS := -Ttext 0x00400000 -e _start
OBJCOPYFLAGS := -S -O binary
$(obj)/main.o: $(obj)/main.c
$(BOOTCC) $(BOOTCFLAGS) -c -o $*.o $< obj-boot := start.o main.o zlib.o imagesize.o no_initrd.o
OBJS := crt0.o start.o main.o zlib.o imagesize.o image.o
$(obj)/zlib.o: $(obj)/zlib.c obj-boot := $(addprefix $(obj)/,$(obj-boot))
$(BOOTCC) $(BOOTCFLAGS) -c -o $*.o $< OBJS := $(addprefix $(obj)/,$(OBJS))
targets += $(obj-boot) $(addprefix $(obj)/,image.c image.o)
$(obj)/imagesize.o: $(obj)/imagesize.c
$(BOOTCC) $(BOOTCFLAGS) -c -o $*.o $< quiet_cmd_bootcc = BOOTCC $@
cmd_bootcc = $(BOOTCC) -Wp,-MD,$(depfile) $(BOOTCFLAGS) -c -o $@ $<
$(obj)/no_initrd.o: $(obj)/no_initrd.c $(obj-boot): %.o: %.c FORCE
$(BOOTCC) $(BOOTCFLAGS) -c -o $*.o $< $(call if_changed_dep,bootcc)
$(obj)/crt0.o: $(obj)/crt0.S quiet_cmd_bootas = BOOTAS $@
$(BOOTCC) $(BOOTAFLAGS) -traditional -c -o $*.o $< cmd_bootas = $(BOOTCC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -traditional \
-c -o $@ $<
CFLAGS = $(CPPFLAGS) -O -fno-builtin -DSTDC_HEADERS $(obj)/crt0.o: %.o: %.S FORCE
LD_ARGS = -Ttext 0x00400000 -e _start $(call if_changed_dep,bootas)
OBJCOPYFLAGS := -S -O binary
host-progs := piggyback addnote addSystemMap addRamDisk
OBJS = $(addprefix $(obj)/,crt0.o start.o main.o zlib.o image.o imagesize.o) HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)
EXTRA_TARGETS += zImage zImage.initrd vmlinux.bin vmlinux.gz \
ifeq ($(CONFIG_PPC_ISERIES),y) vmlinux.sm vmlinux.initrd vmlinux.sminitrd \
sysmap.o initrd.o
boot: vmlinux.sm
quiet_cmd_sysmap = SYSMAP $@
$(obj)/addSystemMap: $(obj)/addSystemMap.c cmd_sysmap = $(obj)/addSystemMap System.map $< $@
$(HOSTCC) $(HOSTCFLAGS) -o $@ $< $(obj)/vmlinux.sm: vmlinux $(obj)/addSystemMap System.map FORCE
$(call if_changed,sysmap)
$(obj)/vmlinux.sm: vmlinux $(obj)/addSystemMap
$(obj)/addSystemMap System.map vmlinux $(obj)/vmlinux.sm quiet_cmd_ramdisk = RAMDISK $@
cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map $< $@
$(obj)/addRamDisk: $(obj)/addRamDisk.c $(obj)/vmlinux.initrd: vmlinux $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map FORCE
$(HOSTCC) $(HOSTCFLAGS) -o $@ $< $(call if_changed,ramdisk)
$(obj)/vmlinux.initrd: vmlinux $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map $(obj)/vmlinux.sminitrd: $(obj)/vmlinux.sm $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE
$(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map vmlinux $(obj)/vmlinux.initrd $(call if_changed,ramdisk)
$(obj)/vmlinux.sminitrd: $(obj)/vmlinux.sm $(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map
$(obj)/addRamDisk $(obj)/ramdisk.image.gz System.map $(obj)/vmlinux.sm $(obj)/vmlinux.sminitrd quiet_cmd_piggy = PIGGY $@
cmd_piggy = $(obj)/piggyback $(@:.o=) < $< | $(BOOTAS) -o $@
else
boot: zImage $(obj)/image.o: $(obj)/vmlinux.gz $(obj)/piggyback FORCE
endif $(call if_changed,piggy)
$(obj)/piggyback: $(obj)/piggyback.c $(obj)/sysmap.o: System.map $(obj)/piggyback FORCE
$(HOSTCC) $(HOSTCFLAGS) -DKERNELBASE=$(KERNELBASE) -o $@ $< $(call if_changed,piggy)
$(obj)/addnote: $(obj)/addnote.c $(obj)/initrd.o: $(obj)/ramdisk.image.gz $(obj)/piggyback FORCE
$(HOSTCC) $(HOSTCFLAGS) -o $@ $< $(call if_changed,piggy)
$(obj)/image.o: $(obj)/piggyback $(obj)/vmlinux.gz quiet_cmd_addnote = ADDNOTE $@
$(obj)/piggyback $(obj)/image < $(obj)/vmlinux.gz | $(BOOTAS) -o $@ cmd_addnote = $(BOOTLD) $(LD_ARGS) -T $(obj)/zImage.lds -o $@ $(OBJS) $<\
&& $(obj)/addnote $@
$(obj)/sysmap.o: $(obj)/piggyback System.map
$(obj)/piggyback $(obj)/sysmap < System.map | $(BOOTAS) -o $(obj)/sysmap.o $(obj)/zImage: $(obj)/no_initrd.o $(OBJS) $(obj)/addnote FORCE
$(call if_changed,addnote)
$(obj)/initrd.o: $(obj)/ramdisk.image.gz $(obj)/piggyback
$(obj)/piggyback $(obj)/initrd < $(obj)/ramdisk.image.gz | $(BOOTAS) -o $(obj)/initrd.o $(obj)/zImage.initrd: $(obj)/initrd.o $(OBJS) $(obj)/addnote FORCE
$(call if_changed,addnote)
$(obj)/zImage: $(OBJS) $(obj)/no_initrd.o $(obj)/addnote
$(BOOTLD) $(LD_ARGS) -T $(obj)/zImage.lds -o $@ $(OBJS) $(obj)/no_initrd.o $(obj)/vmlinux.bin: vmlinux FORCE
$(obj)/addnote $@ $(call if_changed,objcopy)
$(obj)/zImage.initrd: $(OBJS) $(obj)/initrd.o $(obj)/addnote $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
$(BOOTLD) $(LD_ARGS) -T $(obj)/zImage.lds -o $@ $(OBJS) $(obj)/initrd.o $(call if_changed,gzip)
./addnote $@
$(obj)/imagesize.c: vmlinux
$(obj)/vmlinux.gz: vmlinux @echo Generating $@
$(OBJCOPY) $(OBJCOPYFLAGS) vmlinux $(obj)/vmlinux ls -l vmlinux | \
ls -l $(obj)/vmlinux | awk '{printf "/* generated -- do not edit! */\nint uncompressed_size = %d;\n", $$5}' > $(obj)/imagesize.c awk '{printf "/* generated -- do not edit! */\n" \
$(CROSS_COMPILE)nm -n vmlinux | tail -1 | awk '{printf "long vmlinux_end = 0x%s;\n", substr($$1,8)}' >> $(obj)/imagesize.c "int uncompressed_size = %d;\n", $$5}' > $(obj)/imagesize.c
gzip -vf9 $(obj)/vmlinux $(CROSS_COMPILE)nm -n vmlinux | tail -1 | \
awk '{printf "long vmlinux_end = 0x%s;\n", substr($$1,8)}' \
$(obj)/imagesize.c: $(obj)/vmlinux.gz >> $(obj)/imagesize.c
clean: clean-files := $(targets)
@rm -f $(OBJS)
@rm -f $(addprefix $(obj)/,piggyback note addnote zImage \
zImage.initrd vmlinux.gz no_initrd.o imagesize.c addSystemMap \
vmlinux.sm addRamDisk vmlinux.initrd vmlinux.sminitrd)
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#undef DEBUG
void memmove(void *dst, void *im, int len); void memmove(void *dst, void *im, int len);
extern void *finddevice(const char *); extern void *finddevice(const char *);
...@@ -90,7 +92,9 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom) ...@@ -90,7 +92,9 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom)
for(claim_addr = PROG_START; for(claim_addr = PROG_START;
claim_addr <= PROG_START * 8; claim_addr <= PROG_START * 8;
claim_addr += 0x100000) { claim_addr += 0x100000) {
#ifdef DEBUG
printf(" trying: 0x%08lx\n\r", claim_addr); printf(" trying: 0x%08lx\n\r", claim_addr);
#endif
dst = claim(claim_addr, uncompressed_size, 0); dst = claim(claim_addr, uncompressed_size, 0);
if (dst != (void *)-1) break; if (dst != (void *)-1) break;
} }
...@@ -118,6 +122,7 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom) ...@@ -118,6 +122,7 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom)
bi_recs = make_bi_recs((unsigned long)dst + vmlinux_end); bi_recs = make_bi_recs((unsigned long)dst + vmlinux_end);
kernel_entry = (kernel_entry_t)dst; kernel_entry = (kernel_entry_t)dst;
#ifdef DEBUG
printf( "kernel:\n\r" printf( "kernel:\n\r"
" entry addr = 0x%lx\n\r" " entry addr = 0x%lx\n\r"
" a1 = 0x%lx,\n\r" " a1 = 0x%lx,\n\r"
...@@ -126,6 +131,7 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom) ...@@ -126,6 +131,7 @@ chrpboot(unsigned long a1, unsigned long a2, void *prom)
" bi_recs = 0x%lx,\n\r", " bi_recs = 0x%lx,\n\r",
(unsigned long)kernel_entry, a1, a2, (unsigned long)kernel_entry, a1, a2,
(unsigned long)prom, (unsigned long)bi_recs); (unsigned long)prom, (unsigned long)bi_recs);
#endif
kernel_entry( a1, a2, prom, bi_recs ); kernel_entry( a1, a2, prom, bi_recs );
......
...@@ -7,6 +7,8 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y ...@@ -7,6 +7,8 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_ISA_DMA=y
CONFIG_HAVE_DEC_LOCK=y CONFIG_HAVE_DEC_LOCK=y
CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK=y
CONFIG_COMPAT=y
CONFIG_FRAME_POINTER=y
# #
# Code maturity level options # Code maturity level options
...@@ -64,7 +66,7 @@ CONFIG_PROC_DEVICETREE=y ...@@ -64,7 +66,7 @@ CONFIG_PROC_DEVICETREE=y
# CONFIG_PARPORT is not set # CONFIG_PARPORT is not set
# #
# Plug and Play configuration # Plug and Play support
# #
# CONFIG_PNP is not set # CONFIG_PNP is not set
...@@ -118,6 +120,7 @@ CONFIG_CHR_DEV_SG=y ...@@ -118,6 +120,7 @@ CONFIG_CHR_DEV_SG=y
# CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_IN2000 is not set
...@@ -411,6 +414,14 @@ CONFIG_HVC_CONSOLE=y ...@@ -411,6 +414,14 @@ CONFIG_HVC_CONSOLE=y
# #
# CONFIG_I2C is not set # CONFIG_I2C is not set
#
# I2C Hardware Sensors Mainboard support
#
#
# I2C Hardware Sensors Chip support
#
# #
# Mice # Mice
# #
...@@ -563,31 +574,21 @@ CONFIG_NLS_DEFAULT="iso8859-1" ...@@ -563,31 +574,21 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_UTF8 is not set # CONFIG_NLS_UTF8 is not set
# #
# Console drivers # Graphics support
#
#
# Frame-buffer support
# #
CONFIG_FB=y CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
# CONFIG_FB_CLGEN is not set # CONFIG_FB_CLGEN is not set
# CONFIG_FB_PM2 is not set # CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_CT65550 is not set # CONFIG_FB_CT65550 is not set
# CONFIG_FB_IMSTT is not set # CONFIG_FB_IMSTT is not set
# CONFIG_FB_S3TRIO is not set # CONFIG_FB_S3TRIO is not set
# CONFIG_FB_VGA16 is not set # CONFIG_FB_VGA16 is not set
# CONFIG_FB_RIVA is not set # CONFIG_FB_RIVA is not set
CONFIG_FB_MATROX=y # CONFIG_FB_MATROX is not set
CONFIG_FB_MATROX_MILLENIUM=y
CONFIG_FB_MATROX_MYSTIQUE=y
CONFIG_FB_MATROX_G450=y
CONFIG_FB_MATROX_G100=y
CONFIG_FB_MATROX_MULTIHEAD=y
# CONFIG_FB_RADEON is not set # CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_SIS is not set # CONFIG_FB_SIS is not set
# CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_3DFX is not set # CONFIG_FB_3DFX is not set
...@@ -595,19 +596,14 @@ CONFIG_FB_MATROX_MULTIHEAD=y ...@@ -595,19 +596,14 @@ CONFIG_FB_MATROX_MULTIHEAD=y
# CONFIG_FB_TRIDENT is not set # CONFIG_FB_TRIDENT is not set
# CONFIG_FB_PM3 is not set # CONFIG_FB_PM3 is not set
# CONFIG_FB_VIRTUAL is not set # CONFIG_FB_VIRTUAL is not set
# CONFIG_FBCON_ADVANCED is not set
CONFIG_FBCON_CFB8=y #
CONFIG_FBCON_CFB16=y # Console display driver support
CONFIG_FBCON_CFB24=y #
CONFIG_FBCON_CFB32=y # CONFIG_VGA_CONSOLE is not set
CONFIG_FBCON_FONTWIDTH8_ONLY=y # CONFIG_MDA_CONSOLE is not set
# CONFIG_FONT_SUN8x16 is not set CONFIG_DUMMY_CONSOLE=y
CONFIG_FBCON_FONTS=y # CONFIG_FRAMEBUFFER_CONSOLE is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
# CONFIG_FONT_PEARL_8x8 is not set
# CONFIG_FONT_ACORN_8x8 is not set
# CONFIG_FONT_MINI_4x6 is not set
# #
# Sound # Sound
......
# #
# Makefile for the linux kernel. # Makefile for the linux ppc64 kernel.
# #
EXTRA_CFLAGS = -mno-minimal-toc EXTRA_CFLAGS += -mno-minimal-toc
EXTRA_TARGETS := head.o
KHEAD := head.o export-objs := ppc_ksyms.o
EXTRA_TARGETS := $(KHEAD)
export-objs := ppc_ksyms.o
obj-y := ppc_ksyms.o setup.o entry.o traps.o irq.o idle.o \ obj-y := ppc_ksyms.o setup.o entry.o traps.o irq.o idle.o \
time.o process.o signal.o syscalls.o misc.o ptrace.o \ time.o process.o signal.o syscalls.o misc.o ptrace.o \
align.o semaphore.o bitops.o stab.o htab.o pacaData.o \ align.o semaphore.o bitops.o stab.o htab.o pacaData.o \
LparData.o udbg.o binfmt_elf32.o sys_ppc32.o sys32.o \ udbg.o binfmt_elf32.o sys_ppc32.o sys32.o ioctl32.o \
ioctl32.o ptrace32.o signal32.o open_pic.o xics.o \ ptrace32.o signal32.o pmc.o rtc.o init_task.o \
pmc.o mf_proc.o proc_pmc.o iSeries_setup.o \ lmb.o pci.o pci_dn.o pci_dma.o
ItLpQueue.o hvCall.o mf.o HvLpEvent.o ras.o \
iSeries_proc.o HvCall.o HvLpConfig.o \ obj-$(CONFIG_PPC_ISERIES) += iSeries_pci.o iSeries_pci_reset.o \
rtc.o init_task.o pSeries_htab.o iSeries_IoMmTable.o iSeries_irq.o \
iSeries_VpdInfo.o XmPciLpEvent.o \
obj-$(CONFIG_PCI) += pci.o pci_dn.o pci_dma.o HvCall.o HvLpConfig.o LparData.o mf_proc.o \
proc_pmc.o iSeries_setup.o ItLpQueue.o hvCall.o \
ifeq ($(CONFIG_PPC_ISERIES),y) mf.o HvLpEvent.o iSeries_proc.o
obj-$(CONFIG_PCI) += iSeries_pci.o iSeries_pci_reset.o iSeries_IoMmTable.o iSeries_irq.o iSeries_VpdInfo.o XmPciLpEvent.o
endif obj-$(CONFIG_PPC_PSERIES) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o \
ifeq ($(CONFIG_PPC_PSERIES),y) eeh.o rtasd.o nvram.o
obj-$(CONFIG_PCI) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o eeh.o
# Change this to pSeries only once we've got iSeries up to date
obj-y += rtasd.o nvram.o obj-y += open_pic.o xics.o pSeries_htab.o rtas.o \
endif rtas-proc.o chrp_setup.o i8259.o ras.o prom.o
obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_PROFILING) += profile.o
obj-$(CONFIG_PROFILING) += profile.o
obj-y += prom.o lmb.o rtas.o rtas-proc.o chrp_setup.o i8259.o
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
#include "i8259.h" #include "i8259.h"
#include "open_pic.h" #include "open_pic.h"
#include "xics.h" #include <asm/xics.h>
#include <asm/ppcdebug.h> #include <asm/ppcdebug.h>
extern volatile unsigned char *chrp_int_ack_special; extern volatile unsigned char *chrp_int_ack_special;
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
_stext: _stext:
_STATIC(__start) _STATIC(__start)
b .__start_initialization_pSeries b .__start_initialization_pSeries
#ifdef CONFIG_PPC_ISERIES
/* At offset 0x20, there is a pointer to iSeries LPAR data. /* At offset 0x20, there is a pointer to iSeries LPAR data.
* This is required by the hypervisor */ * This is required by the hypervisor */
. = 0x20 . = 0x20
...@@ -90,9 +90,7 @@ _STATIC(__start) ...@@ -90,9 +90,7 @@ _STATIC(__start)
* between physical addresses and absolute addresses) and * between physical addresses and absolute addresses) and
* to the pidhash table (also used by the debugger) */ * to the pidhash table (also used by the debugger) */
.llong msChunks-KERNELBASE .llong msChunks-KERNELBASE
#ifdef CONFIG_PPC_ISERIES
.llong pidhash-KERNELBASE .llong pidhash-KERNELBASE
#endif
/* Offset 0x38 - Pointer to start of embedded System.map */ /* Offset 0x38 - Pointer to start of embedded System.map */
.globl embedded_sysmap_start .globl embedded_sysmap_start
...@@ -102,6 +100,7 @@ embedded_sysmap_start: ...@@ -102,6 +100,7 @@ embedded_sysmap_start:
.globl embedded_sysmap_end .globl embedded_sysmap_end
embedded_sysmap_end: embedded_sysmap_end:
.llong 0 .llong 0
#endif
/* Secondary processors spin on this value until it goes to 1. */ /* Secondary processors spin on this value until it goes to 1. */
.globl __secondary_hold_spinloop .globl __secondary_hold_spinloop
...@@ -365,11 +364,15 @@ __start_interupts: ...@@ -365,11 +364,15 @@ __start_interupts:
* point to itVpdAreas. On pSeries native, this value is not used. * point to itVpdAreas. On pSeries native, this value is not used.
*/ */
. = 0x4000 . = 0x4000
.globl __end_interupts .globl __end_interrupts
.globl __start_naca .globl __start_naca
__end_interupts: __end_interupts:
__start_naca: __start_naca:
#ifdef CONFIG_PPC_ISERIES
.llong itVpdAreas .llong itVpdAreas
#else
.llong 0x0
#endif
.llong 0x0 .llong 0x0
.llong 0x0 .llong 0x0
.llong paca .llong paca
...@@ -390,6 +393,7 @@ __start_stab: ...@@ -390,6 +393,7 @@ __start_stab:
.globl __end_stab .globl __end_stab
__end_stab: __end_stab:
#ifdef CONFIG_PPC_ISERIES
/* /*
* The iSeries LPAR map is at this fixed address * The iSeries LPAR map is at this fixed address
* so that the HvReleaseData structure can address * so that the HvReleaseData structure can address
...@@ -503,7 +507,7 @@ maskable_exception_exit: ...@@ -503,7 +507,7 @@ maskable_exception_exit:
mfspr r21,SPRG1 mfspr r21,SPRG1
mfspr r20,SPRG2 mfspr r20,SPRG2
rfid rfid
#endif
/* /*
* Data area reserved for FWNMI option. * Data area reserved for FWNMI option.
*/ */
...@@ -1217,7 +1221,7 @@ _GLOBAL(pseries_secondary_smp_init) ...@@ -1217,7 +1221,7 @@ _GLOBAL(pseries_secondary_smp_init)
#endif #endif
#endif #endif
b 1b /* Loop until told to go */ b 1b /* Loop until told to go */
#ifdef CONFIG_PPC_ISERIES
_GLOBAL(__start_initialization_iSeries) _GLOBAL(__start_initialization_iSeries)
LOADADDR(r1,init_thread_union) LOADADDR(r1,init_thread_union)
...@@ -1241,6 +1245,7 @@ _GLOBAL(__start_initialization_iSeries) ...@@ -1241,6 +1245,7 @@ _GLOBAL(__start_initialization_iSeries)
bl .iSeries_fixup_klimit bl .iSeries_fixup_klimit
b .start_here_common b .start_here_common
#endif
_GLOBAL(__start_initialization_pSeries) _GLOBAL(__start_initialization_pSeries)
mr r31,r3 /* save parameters */ mr r31,r3 /* save parameters */
...@@ -1248,9 +1253,6 @@ _GLOBAL(__start_initialization_pSeries) ...@@ -1248,9 +1253,6 @@ _GLOBAL(__start_initialization_pSeries)
mr r29,r5 mr r29,r5
mr r28,r6 mr r28,r6
mr r27,r7 mr r27,r7
mr r26,r8 /* YABOOT: debug_print() routine */
mr r25,r9 /* YABOOT: debug_delay() routine */
mr r24,r10 /* YABOOT: debug_prom() routine */
bl .enable_64b_mode bl .enable_64b_mode
...@@ -1295,9 +1297,6 @@ _GLOBAL(__start_initialization_pSeries) ...@@ -1295,9 +1297,6 @@ _GLOBAL(__start_initialization_pSeries)
mr r5,r29 mr r5,r29
mr r6,r28 mr r6,r28
mr r7,r27 mr r7,r27
mr r8,r26
mr r9,r25
mr r10,r24
bl .prom_init bl .prom_init
......
...@@ -13,7 +13,7 @@ struct mm_struct init_mm = INIT_MM(init_mm); ...@@ -13,7 +13,7 @@ struct mm_struct init_mm = INIT_MM(init_mm);
/* /*
* Initial thread structure. * Initial thread structure.
* *
* We need to make sure that this is 8192-byte aligned due to the * We need to make sure that this is 16384-byte aligned due to the
* way process stacks are handled. This is done by having a special * way process stacks are handled. This is done by having a special
* "init_task" linker map entry.. * "init_task" linker map entry..
*/ */
......
...@@ -442,13 +442,13 @@ struct ifreq32 { ...@@ -442,13 +442,13 @@ struct ifreq32 {
struct ifmap32 ifru_map; struct ifmap32 ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */ char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ]; char ifru_newname[IFNAMSIZ];
__kernel_caddr_t32 ifru_data; compat_caddr_t ifru_data;
} ifr_ifru; } ifr_ifru;
}; };
struct ifconf32 { struct ifconf32 {
int ifc_len; /* size of buffer */ int ifc_len; /* size of buffer */
__kernel_caddr_t32 ifcbuf; compat_caddr_t ifcbuf;
}; };
#ifdef CONFIG_NET #ifdef CONFIG_NET
...@@ -884,7 +884,7 @@ struct floppy_struct32 { ...@@ -884,7 +884,7 @@ struct floppy_struct32 {
unsigned char rate; unsigned char rate;
unsigned char spec1; unsigned char spec1;
unsigned char fmt_gap; unsigned char fmt_gap;
const __kernel_caddr_t32 name; const compat_caddr_t name;
}; };
struct floppy_drive_params32 { struct floppy_drive_params32 {
...@@ -923,7 +923,7 @@ struct floppy_drive_struct32 { ...@@ -923,7 +923,7 @@ struct floppy_drive_struct32 {
int fd_ref; int fd_ref;
int fd_device; int fd_device;
int last_checked; int last_checked;
__kernel_caddr_t32 dmabuf; compat_caddr_t dmabuf;
int bufblocks; int bufblocks;
}; };
...@@ -1413,7 +1413,7 @@ static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) ...@@ -1413,7 +1413,7 @@ static int sg_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
} }
struct ppp_option_data32 { struct ppp_option_data32 {
__kernel_caddr_t32 ptr; compat_caddr_t ptr;
__u32 length; __u32 length;
int transmit; int transmit;
}; };
...@@ -1494,8 +1494,8 @@ struct mtget32 { ...@@ -1494,8 +1494,8 @@ struct mtget32 {
__u32 mt_dsreg; __u32 mt_dsreg;
__u32 mt_gstat; __u32 mt_gstat;
__u32 mt_erreg; __u32 mt_erreg;
__kernel_daddr_t32 mt_fileno; compat_daddr_t mt_fileno;
__kernel_daddr_t32 mt_blkno; compat_daddr_t mt_blkno;
}; };
#define MTIOCGET32 _IOR('m', 2, struct mtget32) #define MTIOCGET32 _IOR('m', 2, struct mtget32)
...@@ -1613,7 +1613,7 @@ static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) ...@@ -1613,7 +1613,7 @@ static int mt_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
struct cdrom_read32 { struct cdrom_read32 {
int cdread_lba; int cdread_lba;
__kernel_caddr_t32 cdread_bufaddr; compat_caddr_t cdread_bufaddr;
int cdread_buflen; int cdread_buflen;
}; };
...@@ -1621,16 +1621,16 @@ struct cdrom_read_audio32 { ...@@ -1621,16 +1621,16 @@ struct cdrom_read_audio32 {
union cdrom_addr addr; union cdrom_addr addr;
u_char addr_format; u_char addr_format;
int nframes; int nframes;
__kernel_caddr_t32 buf; compat_caddr_t buf;
}; };
struct cdrom_generic_command32 { struct cdrom_generic_command32 {
unsigned char cmd[CDROM_PACKET_SIZE]; unsigned char cmd[CDROM_PACKET_SIZE];
__kernel_caddr_t32 buffer; compat_caddr_t buffer;
unsigned int buflen; unsigned int buflen;
int stat; int stat;
__kernel_caddr_t32 sense; compat_caddr_t sense;
__kernel_caddr_t32 reserved[3]; compat_caddr_t reserved[3];
}; };
static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg) static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long arg)
...@@ -1639,7 +1639,7 @@ static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long ar ...@@ -1639,7 +1639,7 @@ static int cdrom_ioctl_trans(unsigned int fd, unsigned int cmd, unsigned long ar
struct cdrom_read cdread; struct cdrom_read cdread;
struct cdrom_read_audio cdreadaudio; struct cdrom_read_audio cdreadaudio;
struct cdrom_generic_command cgc; struct cdrom_generic_command cgc;
__kernel_caddr_t32 addr; compat_caddr_t addr;
char *data = 0; char *data = 0;
void *karg; void *karg;
int err = 0; int err = 0;
...@@ -1722,9 +1722,9 @@ out: if (data) ...@@ -1722,9 +1722,9 @@ out: if (data)
struct loop_info32 { struct loop_info32 {
int lo_number; /* ioctl r/o */ int lo_number; /* ioctl r/o */
__kernel_dev_t32 lo_device; /* ioctl r/o */ compat_dev_t lo_device; /* ioctl r/o */
unsigned int lo_inode; /* ioctl r/o */ unsigned int lo_inode; /* ioctl r/o */
__kernel_dev_t32 lo_rdevice; /* ioctl r/o */ compat_dev_t lo_rdevice; /* ioctl r/o */
int lo_offset; int lo_offset;
int lo_encrypt_type; int lo_encrypt_type;
int lo_encrypt_key_size; /* ioctl w/o */ int lo_encrypt_key_size; /* ioctl w/o */
...@@ -2054,7 +2054,7 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long a ...@@ -2054,7 +2054,7 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long a
set_fs(old_fs); set_fs(old_fs);
if (err >= 0) if (err >= 0)
err = put_user(kuid, (__kernel_uid_t32 *)arg); err = put_user(kuid, (compat_uid_t *)arg);
return err; return err;
} }
...@@ -2062,7 +2062,7 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long a ...@@ -2062,7 +2062,7 @@ static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long a
struct ncp_ioctl_request_32 { struct ncp_ioctl_request_32 {
unsigned int function; unsigned int function;
unsigned int size; unsigned int size;
__kernel_caddr_t32 data; compat_caddr_t data;
}; };
struct ncp_fs_info_v2_32 { struct ncp_fs_info_v2_32 {
...@@ -2083,13 +2083,13 @@ struct ncp_objectname_ioctl_32 ...@@ -2083,13 +2083,13 @@ struct ncp_objectname_ioctl_32
{ {
int auth_type; int auth_type;
unsigned int object_name_len; unsigned int object_name_len;
__kernel_caddr_t32 object_name; /* an userspace data, in most cases user name */ compat_caddr_t object_name; /* an userspace data, in most cases user name */
}; };
struct ncp_privatedata_ioctl_32 struct ncp_privatedata_ioctl_32
{ {
unsigned int len; unsigned int len;
__kernel_caddr_t32 data; /* ~1000 for NDS */ compat_caddr_t data; /* ~1000 for NDS */
}; };
#define NCP_IOC_NCPREQUEST_32 _IOR('n', 1, struct ncp_ioctl_request_32) #define NCP_IOC_NCPREQUEST_32 _IOR('n', 1, struct ncp_ioctl_request_32)
...@@ -2362,12 +2362,12 @@ static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned lon ...@@ -2362,12 +2362,12 @@ static int do_ncp_setprivatedata(unsigned int fd, unsigned int cmd, unsigned lon
struct atmif_sioc32 { struct atmif_sioc32 {
int number; int number;
int length; int length;
__kernel_caddr_t32 arg; compat_caddr_t arg;
}; };
struct atm_iobuf32 { struct atm_iobuf32 {
int length; int length;
__kernel_caddr_t32 buffer; compat_caddr_t buffer;
}; };
#define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct atmif_sioc32) #define ATM_GETLINKRATE32 _IOW('a', ATMIOC_ITF+1, struct atmif_sioc32)
...@@ -2428,7 +2428,7 @@ static int do_atm_iobuf(unsigned int fd, unsigned int cmd, unsigned long arg) ...@@ -2428,7 +2428,7 @@ static int do_atm_iobuf(unsigned int fd, unsigned int cmd, unsigned long arg)
iobuf.length = iobuf32.length; iobuf.length = iobuf32.length;
if (iobuf32.buffer == (__kernel_caddr_t32) NULL || iobuf32.length == 0) { if (iobuf32.buffer == (compat_caddr_t) NULL || iobuf32.length == 0) {
iobuf.buffer = (void*)(unsigned long)iobuf32.buffer; iobuf.buffer = (void*)(unsigned long)iobuf32.buffer;
} else { } else {
iobuf.buffer = kmalloc(iobuf.length, GFP_KERNEL); iobuf.buffer = kmalloc(iobuf.length, GFP_KERNEL);
...@@ -2482,7 +2482,7 @@ static int do_atmif_sioc(unsigned int fd, unsigned int cmd, unsigned long arg) ...@@ -2482,7 +2482,7 @@ static int do_atmif_sioc(unsigned int fd, unsigned int cmd, unsigned long arg)
sioc.number = sioc32.number; sioc.number = sioc32.number;
sioc.length = sioc32.length; sioc.length = sioc32.length;
if (sioc32.arg == (__kernel_caddr_t32) NULL || sioc32.length == 0) { if (sioc32.arg == (compat_caddr_t) NULL || sioc32.length == 0) {
sioc.arg = (void*)(unsigned long)sioc32.arg; sioc.arg = (void*)(unsigned long)sioc32.arg;
} else { } else {
sioc.arg = kmalloc(sioc.length, GFP_KERNEL); sioc.arg = kmalloc(sioc.length, GFP_KERNEL);
...@@ -3656,7 +3656,7 @@ struct ioctl_trans { ...@@ -3656,7 +3656,7 @@ struct ioctl_trans {
#define HANDLE_IOCTL(cmd,handler) { cmd, (unsigned long)handler, 0 } #define HANDLE_IOCTL(cmd,handler) { cmd, (unsigned long)handler, 0 }
#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int) #define AUTOFS_IOC_SETTIMEOUT32 _IOWR(0x93,0x64,unsigned int)
#define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, __kernel_uid_t32) #define SMB_IOC_GETMOUNTUID_32 _IOR('u', 1, compat_uid_t)
static struct ioctl_trans ioctl_translations[] = { static struct ioctl_trans ioctl_translations[] = {
/* List here explicitly which ioctl's need translation, /* List here explicitly which ioctl's need translation,
...@@ -3708,11 +3708,6 @@ COMPATIBLE_IOCTL(TIOCSLTC), ...@@ -3708,11 +3708,6 @@ COMPATIBLE_IOCTL(TIOCSLTC),
COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO), COMPATIBLE_IOCTL(FBIOGET_VSCREENINFO),
COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO), COMPATIBLE_IOCTL(FBIOPUT_VSCREENINFO),
COMPATIBLE_IOCTL(FBIOPAN_DISPLAY), COMPATIBLE_IOCTL(FBIOPAN_DISPLAY),
COMPATIBLE_IOCTL(FBIOGET_FCURSORINFO),
COMPATIBLE_IOCTL(FBIOGET_VCURSORINFO),
COMPATIBLE_IOCTL(FBIOPUT_VCURSORINFO),
COMPATIBLE_IOCTL(FBIOGET_CURSORSTATE),
COMPATIBLE_IOCTL(FBIOPUT_CURSORSTATE),
COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP), COMPATIBLE_IOCTL(FBIOGET_CON2FBMAP),
COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP), COMPATIBLE_IOCTL(FBIOPUT_CON2FBMAP),
#if 0 #if 0
...@@ -3763,6 +3758,8 @@ COMPATIBLE_IOCTL(BLKRRPART), ...@@ -3763,6 +3758,8 @@ COMPATIBLE_IOCTL(BLKRRPART),
COMPATIBLE_IOCTL(BLKFLSBUF), COMPATIBLE_IOCTL(BLKFLSBUF),
COMPATIBLE_IOCTL(BLKSECTSET), COMPATIBLE_IOCTL(BLKSECTSET),
COMPATIBLE_IOCTL(BLKSSZGET), COMPATIBLE_IOCTL(BLKSSZGET),
COMPATIBLE_IOCTL(BLKRASET),
COMPATIBLE_IOCTL(BLKFRASET),
/* RAID */ /* RAID */
COMPATIBLE_IOCTL(RAID_VERSION), COMPATIBLE_IOCTL(RAID_VERSION),
COMPATIBLE_IOCTL(GET_ARRAY_INFO), COMPATIBLE_IOCTL(GET_ARRAY_INFO),
...@@ -4350,6 +4347,8 @@ HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp), ...@@ -4350,6 +4347,8 @@ HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp),
HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo), HANDLE_IOCTL(HDIO_GETGEO, hdio_getgeo),
HANDLE_IOCTL(HDIO_GETGEO_BIG_RAW, hdio_getgeo_big), HANDLE_IOCTL(HDIO_GETGEO_BIG_RAW, hdio_getgeo_big),
HANDLE_IOCTL(BLKGETSIZE, w_long), HANDLE_IOCTL(BLKGETSIZE, w_long),
HANDLE_IOCTL(BLKRAGET, w_long),
HANDLE_IOCTL(BLKFRAGET, w_long),
HANDLE_IOCTL(0x1260, broken_blkgetsize), HANDLE_IOCTL(0x1260, broken_blkgetsize),
HANDLE_IOCTL(BLKSECTGET, w_long), HANDLE_IOCTL(BLKSECTGET, w_long),
HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans), HANDLE_IOCTL(BLKPG, blkpg_ioctl_trans),
......
...@@ -395,7 +395,7 @@ handle_irq_event(int irq, struct pt_regs *regs, struct irqaction *action) ...@@ -395,7 +395,7 @@ handle_irq_event(int irq, struct pt_regs *regs, struct irqaction *action)
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
extern unsigned int irq_affinity [NR_IRQS]; extern unsigned long irq_affinity [NR_IRQS];
typedef struct { typedef struct {
unsigned long cpu; unsigned long cpu;
...@@ -409,7 +409,7 @@ static irq_balance_t irq_balance[NR_IRQS] __cacheline_aligned ...@@ -409,7 +409,7 @@ static irq_balance_t irq_balance[NR_IRQS] __cacheline_aligned
(idle_cpu(cpu) && ((now) - irq_stat[(cpu)].idle_timestamp > 1)) (idle_cpu(cpu) && ((now) - irq_stat[(cpu)].idle_timestamp > 1))
#define IRQ_ALLOWED(cpu,allowed_mask) \ #define IRQ_ALLOWED(cpu,allowed_mask) \
((1 << cpu) & (allowed_mask)) ((1UL << cpu) & (allowed_mask))
#define IRQ_BALANCE_INTERVAL (HZ/50) #define IRQ_BALANCE_INTERVAL (HZ/50)
...@@ -461,7 +461,7 @@ static inline void balance_irq(int irq) ...@@ -461,7 +461,7 @@ static inline void balance_irq(int irq)
new_cpu = move(entry->cpu, allowed_mask, now, random_number); new_cpu = move(entry->cpu, allowed_mask, now, random_number);
if (entry->cpu != new_cpu) { if (entry->cpu != new_cpu) {
entry->cpu = new_cpu; entry->cpu = new_cpu;
irq_desc[irq].handler->set_affinity(irq, 1 << new_cpu); irq_desc[irq].handler->set_affinity(irq, 1UL << new_cpu);
} }
} }
} }
...@@ -649,19 +649,19 @@ static struct proc_dir_entry * irq_dir [NR_IRQS]; ...@@ -649,19 +649,19 @@ static struct proc_dir_entry * irq_dir [NR_IRQS];
static struct proc_dir_entry * smp_affinity_entry [NR_IRQS]; static struct proc_dir_entry * smp_affinity_entry [NR_IRQS];
#ifdef CONFIG_IRQ_ALL_CPUS #ifdef CONFIG_IRQ_ALL_CPUS
unsigned int irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0xffffffff}; unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = -1UL};
#else /* CONFIG_IRQ_ALL_CPUS */ #else /* CONFIG_IRQ_ALL_CPUS */
unsigned int irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0x00000000}; unsigned long irq_affinity [NR_IRQS] = { [0 ... NR_IRQS-1] = 0x0};
#endif /* CONFIG_IRQ_ALL_CPUS */ #endif /* CONFIG_IRQ_ALL_CPUS */
#define HEX_DIGITS 8 #define HEX_DIGITS 16
static int irq_affinity_read_proc (char *page, char **start, off_t off, static int irq_affinity_read_proc (char *page, char **start, off_t off,
int count, int *eof, void *data) int count, int *eof, void *data)
{ {
if (count < HEX_DIGITS+1) if (count < HEX_DIGITS+1)
return -EINVAL; return -EINVAL;
return sprintf (page, "%08x\n", irq_affinity[(int)(long)data]); return sprintf(page, "%16lx\n", irq_affinity[(long)data]);
} }
static unsigned int parse_hex_value (const char *buffer, static unsigned int parse_hex_value (const char *buffer,
...@@ -679,7 +679,7 @@ static unsigned int parse_hex_value (const char *buffer, ...@@ -679,7 +679,7 @@ static unsigned int parse_hex_value (const char *buffer,
return -EFAULT; return -EFAULT;
/* /*
* Parse the first 8 characters as a hex string, any non-hex char * Parse the first 16 characters as a hex string, any non-hex char
* is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same. * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same.
*/ */
value = 0; value = 0;
...@@ -704,7 +704,7 @@ static unsigned int parse_hex_value (const char *buffer, ...@@ -704,7 +704,7 @@ static unsigned int parse_hex_value (const char *buffer,
static int irq_affinity_write_proc (struct file *file, const char *buffer, static int irq_affinity_write_proc (struct file *file, const char *buffer,
unsigned long count, void *data) unsigned long count, void *data)
{ {
int irq = (int)(long) data, full_count = count, err; int irq = (long)data, full_count = count, err;
unsigned long new_value; unsigned long new_value;
if (!irq_desc[irq].handler->set_affinity) if (!irq_desc[irq].handler->set_affinity)
...@@ -712,8 +712,6 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer, ...@@ -712,8 +712,6 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
err = parse_hex_value(buffer, count, &new_value); err = parse_hex_value(buffer, count, &new_value);
/* Why is this disabled ? --BenH */
#if 0/*CONFIG_SMP*/
/* /*
* Do not allow disabling IRQs completely - it's a too easy * Do not allow disabling IRQs completely - it's a too easy
* way to make the system unusable accidentally :-) At least * way to make the system unusable accidentally :-) At least
...@@ -721,7 +719,6 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer, ...@@ -721,7 +719,6 @@ static int irq_affinity_write_proc (struct file *file, const char *buffer,
*/ */
if (!(new_value & cpu_online_map)) if (!(new_value & cpu_online_map))
return -EINVAL; return -EINVAL;
#endif
irq_affinity[irq] = new_value; irq_affinity[irq] = new_value;
irq_desc[irq].handler->set_affinity(irq, new_value); irq_desc[irq].handler->set_affinity(irq, new_value);
......
...@@ -398,46 +398,6 @@ _GLOBAL(_outsl_ns) ...@@ -398,46 +398,6 @@ _GLOBAL(_outsl_ns)
bdnz 00b bdnz 00b
blr blr
/*
* Extended precision shifts
*
* R3/R4 has 64 bit value
* R5 has shift count
* result in R3/R4
*
* ashrdi3: XXXYYY/ZZZAAA -> SSSXXX/YYYZZZ
* ashldi3: XXXYYY/ZZZAAA -> YYYZZZ/AAA000
* lshrdi3: XXXYYY/ZZZAAA -> 000XXX/YYYZZZ
*/
/* MIKEC: These may no longer be needed...what does gcc expect ? */
_GLOBAL(__ashrdi3)
li r6,32
sub r6,r6,r5
slw r7,r3,r6 /* isolate YYY */
srw r4,r4,r5 /* isolate ZZZ */
or r4,r4,r7 /* YYYZZZ */
sraw r3,r3,r5 /* SSSXXX */
blr
_GLOBAL(__ashldi3)
li r6,32
sub r6,r6,r5
srw r7,r4,r6 /* isolate ZZZ */
slw r4,r4,r5 /* AAA000 */
slw r3,r3,r5 /* YYY--- */
or r3,r3,r7 /* YYYZZZ */
blr
_GLOBAL(__lshrdi3)
li r6,32
sub r6,r6,r5
slw r7,r3,r6 /* isolate YYY */
srw r4,r4,r5 /* isolate ZZZ */
or r4,r4,r7 /* YYYZZZ */
srw r3,r3,r5 /* 000XXX */
blr
_GLOBAL(abs) _GLOBAL(abs)
cmpi 0,r3,0 cmpi 0,r3,0
bge 10f bge 10f
...@@ -551,7 +511,7 @@ _GLOBAL(sys_call_table32) ...@@ -551,7 +511,7 @@ _GLOBAL(sys_call_table32)
.llong .sys_rmdir /* 40 */ .llong .sys_rmdir /* 40 */
.llong .sys_dup .llong .sys_dup
.llong .sys_pipe .llong .sys_pipe
.llong .sys32_times .llong .compat_sys_times
.llong .sys_ni_syscall /* old prof syscall */ .llong .sys_ni_syscall /* old prof syscall */
.llong .sys_brk /* 45 */ .llong .sys_brk /* 45 */
.llong .sys_setgid .llong .sys_setgid
...@@ -614,9 +574,9 @@ _GLOBAL(sys_call_table32) ...@@ -614,9 +574,9 @@ _GLOBAL(sys_call_table32)
.llong .sys32_syslog .llong .sys32_syslog
.llong .compat_sys_setitimer .llong .compat_sys_setitimer
.llong .compat_sys_getitimer /* 105 */ .llong .compat_sys_getitimer /* 105 */
.llong .sys32_newstat .llong .compat_sys_newstat
.llong .sys32_newlstat .llong .compat_sys_newlstat
.llong .sys32_newfstat .llong .compat_sys_newfstat
.llong .sys_uname .llong .sys_uname
.llong .sys_ni_syscall /* 110 old iopl syscall */ .llong .sys_ni_syscall /* 110 old iopl syscall */
.llong .sys_vhangup .llong .sys_vhangup
......
...@@ -40,7 +40,6 @@ ...@@ -40,7 +40,6 @@
#include <asm/naca.h> #include <asm/naca.h>
#include <asm/pci_dma.h> #include <asm/pci_dma.h>
#include "xics.h"
#include "open_pic.h" #include "open_pic.h"
#include "pci.h" #include "pci.h"
...@@ -402,7 +401,7 @@ alloc_phb(struct device_node *dev, char *model, unsigned int addr_size_words) ...@@ -402,7 +401,7 @@ alloc_phb(struct device_node *dev, char *model, unsigned int addr_size_words)
* Python * Python
***************************************************************/ ***************************************************************/
if (strstr(model, "Python")) { if (strstr(model, "Python")) {
unsigned long chip_regs; void *chip_regs;
volatile u32 *tmp, i; volatile u32 *tmp, i;
PPCDBG(PPCDBG_PHBINIT, "\tCreate python\n"); PPCDBG(PPCDBG_PHBINIT, "\tCreate python\n");
...@@ -608,10 +607,6 @@ pSeries_pcibios_fixup(void) ...@@ -608,10 +607,6 @@ pSeries_pcibios_fixup(void)
pci_read_irq_line(dev); pci_read_irq_line(dev);
PPCDBGCALL(PPCDBG_PHBINIT, dumpPci_Dev(dev) ); PPCDBGCALL(PPCDBG_PHBINIT, dumpPci_Dev(dev) );
} }
if (naca->interrupt_controller == IC_PPC_XIC) {
xics_isa_init();
}
} }
/*********************************************************************** /***********************************************************************
......
...@@ -147,6 +147,7 @@ static unsigned long __inline__ count_leading_zeros64( unsigned long x ) ...@@ -147,6 +147,7 @@ static unsigned long __inline__ count_leading_zeros64( unsigned long x )
return lz; return lz;
} }
#ifdef CONFIG_PPC_ISERIES
static void tce_build_iSeries(struct TceTable *tbl, long tcenum, static void tce_build_iSeries(struct TceTable *tbl, long tcenum,
unsigned long uaddr, int direction ) unsigned long uaddr, int direction )
{ {
...@@ -180,7 +181,9 @@ static void tce_build_iSeries(struct TceTable *tbl, long tcenum, ...@@ -180,7 +181,9 @@ static void tce_build_iSeries(struct TceTable *tbl, long tcenum,
panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", setTceRc); panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", setTceRc);
} }
} }
#endif
#ifdef CONFIG_PPC_PSERIES
static void tce_build_pSeries(struct TceTable *tbl, long tcenum, static void tce_build_pSeries(struct TceTable *tbl, long tcenum,
unsigned long uaddr, int direction ) unsigned long uaddr, int direction )
{ {
...@@ -199,8 +202,8 @@ static void tce_build_pSeries(struct TceTable *tbl, long tcenum, ...@@ -199,8 +202,8 @@ static void tce_build_pSeries(struct TceTable *tbl, long tcenum,
tce_addr = ((union Tce *)tbl->base) + tcenum; tce_addr = ((union Tce *)tbl->base) + tcenum;
*tce_addr = (union Tce)tce.wholeTce; *tce_addr = (union Tce)tce.wholeTce;
} }
#endif
/* /*
* Build a TceTable structure. This contains a multi-level bit map which * Build a TceTable structure. This contains a multi-level bit map which
...@@ -548,6 +551,7 @@ static inline dma_addr_t get_tces( struct TceTable *tbl, unsigned order, void *p ...@@ -548,6 +551,7 @@ static inline dma_addr_t get_tces( struct TceTable *tbl, unsigned order, void *p
return retTce; return retTce;
} }
#ifdef CONFIG_PPC_ISERIES
static void tce_free_one_iSeries( struct TceTable *tbl, long tcenum ) static void tce_free_one_iSeries( struct TceTable *tbl, long tcenum )
{ {
u64 set_tce_rc; u64 set_tce_rc;
...@@ -560,7 +564,9 @@ static void tce_free_one_iSeries( struct TceTable *tbl, long tcenum ) ...@@ -560,7 +564,9 @@ static void tce_free_one_iSeries( struct TceTable *tbl, long tcenum )
panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", set_tce_rc); panic("PCI_DMA: HvCallXm_setTce failed, Rc: 0x%lx\n", set_tce_rc);
} }
#endif
#ifdef CONFIG_PPC_PSERIES
static void tce_free_one_pSeries( struct TceTable *tbl, long tcenum ) static void tce_free_one_pSeries( struct TceTable *tbl, long tcenum )
{ {
union Tce tce; union Tce tce;
...@@ -572,6 +578,7 @@ static void tce_free_one_pSeries( struct TceTable *tbl, long tcenum ) ...@@ -572,6 +578,7 @@ static void tce_free_one_pSeries( struct TceTable *tbl, long tcenum )
*tce_addr = (union Tce)tce.wholeTce; *tce_addr = (union Tce)tce.wholeTce;
} }
#endif
static void tce_free(struct TceTable *tbl, dma_addr_t dma_addr, static void tce_free(struct TceTable *tbl, dma_addr_t dma_addr,
unsigned order, unsigned num_pages) unsigned order, unsigned num_pages)
...@@ -609,6 +616,7 @@ static void tce_free(struct TceTable *tbl, dma_addr_t dma_addr, ...@@ -609,6 +616,7 @@ static void tce_free(struct TceTable *tbl, dma_addr_t dma_addr,
free_tce_range( tbl, free_tce, order ); free_tce_range( tbl, free_tce, order );
} }
#ifdef CONFIG_PPC_ISERIES
void __init create_virtual_bus_tce_table(void) void __init create_virtual_bus_tce_table(void)
{ {
struct TceTable *t; struct TceTable *t;
...@@ -661,6 +669,7 @@ void __init create_virtual_bus_tce_table(void) ...@@ -661,6 +669,7 @@ void __init create_virtual_bus_tce_table(void)
} }
else printk( "Virtual Bus VIO TCE table failed.\n"); else printk( "Virtual Bus VIO TCE table failed.\n");
} }
#endif
void create_tce_tables_for_buses(struct list_head *bus_list) void create_tce_tables_for_buses(struct list_head *bus_list)
{ {
...@@ -842,6 +851,7 @@ static struct TceTable* findHwTceTable(struct TceTable * newTceTable ) ...@@ -842,6 +851,7 @@ static struct TceTable* findHwTceTable(struct TceTable * newTceTable )
static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode, static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode,
struct TceTable* newTceTable ) struct TceTable* newTceTable )
{ {
#ifdef CONFIG_PPC_ISERIES
struct TceTableManagerCB* pciBusTceTableParms = (struct TceTableManagerCB*)kmalloc( sizeof(struct TceTableManagerCB), GFP_KERNEL ); struct TceTableManagerCB* pciBusTceTableParms = (struct TceTableManagerCB*)kmalloc( sizeof(struct TceTableManagerCB), GFP_KERNEL );
if(pciBusTceTableParms == NULL) panic("PCI_DMA: TCE Table Allocation failed."); if(pciBusTceTableParms == NULL) panic("PCI_DMA: TCE Table Allocation failed.");
...@@ -872,6 +882,7 @@ static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode, ...@@ -872,6 +882,7 @@ static void getTceTableParmsiSeries(struct iSeries_Device_Node* DevNode,
newTceTable->tceType = TCE_PCI; newTceTable->tceType = TCE_PCI;
kfree(pciBusTceTableParms); kfree(pciBusTceTableParms);
#endif
} }
static void getTceTableParmsPSeries(struct pci_controller *phb, static void getTceTableParmsPSeries(struct pci_controller *phb,
...@@ -1440,15 +1451,19 @@ void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems, ...@@ -1440,15 +1451,19 @@ void pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sglist, int nelems,
} }
#endif #endif
#ifdef CONFIG_PPC_PSERIES
/* These are called very early. */ /* These are called very early. */
void tce_init_pSeries(void) void tce_init_pSeries(void)
{ {
ppc_md.tce_build = tce_build_pSeries; ppc_md.tce_build = tce_build_pSeries;
ppc_md.tce_free_one = tce_free_one_pSeries; ppc_md.tce_free_one = tce_free_one_pSeries;
} }
#endif
#ifdef CONFIG_PPC_ISERIES
void tce_init_iSeries(void) void tce_init_iSeries(void)
{ {
ppc_md.tce_build = tce_build_iSeries; ppc_md.tce_build = tce_build_iSeries;
ppc_md.tce_free_one = tce_free_one_iSeries; ppc_md.tce_free_one = tce_free_one_iSeries;
} }
#endif
This diff is collapsed.
...@@ -258,6 +258,7 @@ static int rtc_read_proc(char *page, char **start, off_t off, ...@@ -258,6 +258,7 @@ static int rtc_read_proc(char *page, char **start, off_t off,
return len; return len;
} }
#ifdef CONFIG_PPC_ISERIES
/* /*
* Get the RTC from the virtual service processor * Get the RTC from the virtual service processor
* This requires flowing LpEvents to the primary partition * This requires flowing LpEvents to the primary partition
...@@ -271,60 +272,6 @@ void iSeries_get_rtc_time(struct rtc_time *rtc_tm) ...@@ -271,60 +272,6 @@ void iSeries_get_rtc_time(struct rtc_time *rtc_tm)
rtc_tm->tm_mon--; rtc_tm->tm_mon--;
} }
void pSeries_get_rtc_time(struct rtc_time *rtc_tm)
{
unsigned long ret[8];
int error;
int count;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count = 0;
do {
error = rtas_call(rtas_token("get-time-of-day"), 0, 8, (void *)&ret);
} while (error == -2 && ++count < 1000);
if (error != 0) {
printk(KERN_WARNING "error: reading the clock failed (%d)\n",
error);
return;
}
rtc_tm->tm_sec = ret[5];
rtc_tm->tm_min = ret[4];
rtc_tm->tm_hour = ret[3];
rtc_tm->tm_mday = ret[2];
rtc_tm->tm_mon = ret[1] - 1;
rtc_tm->tm_year = ret[0] - 1900;
}
int pSeries_set_rtc_time(struct rtc_time *tm)
{
int error;
int count;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count = 0;
do {
error = rtas_call(rtas_token("set-time-of-day"), 7, 1, NULL,
tm->tm_year + 1900, tm->tm_mon + 1,
tm->tm_mday, tm->tm_hour, tm->tm_min,
tm->tm_sec, 0);
} while (error == -2 && ++count < 1000);
if (error != 0)
printk(KERN_WARNING "error: setting the clock failed (%d)\n",
error);
return 0;
}
/* /*
* Set the RTC in the virtual service processor * Set the RTC in the virtual service processor
* This requires flowing LpEvents to the primary partition * This requires flowing LpEvents to the primary partition
...@@ -380,3 +327,59 @@ void iSeries_get_boot_time(struct rtc_time *tm) ...@@ -380,3 +327,59 @@ void iSeries_get_boot_time(struct rtc_time *tm)
tm->tm_year -= 1900; tm->tm_year -= 1900;
tm->tm_mon -= 1; tm->tm_mon -= 1;
} }
#endif
#ifdef CONFIG_PPC_PSERIES
void pSeries_get_rtc_time(struct rtc_time *rtc_tm)
{
unsigned long ret[8];
int error;
int count;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count = 0;
do {
error = rtas_call(rtas_token("get-time-of-day"), 0, 8, (void *)&ret);
} while (error == -2 && ++count < 1000);
if (error != 0) {
printk(KERN_WARNING "error: reading the clock failed (%d)\n",
error);
return;
}
rtc_tm->tm_sec = ret[5];
rtc_tm->tm_min = ret[4];
rtc_tm->tm_hour = ret[3];
rtc_tm->tm_mday = ret[2];
rtc_tm->tm_mon = ret[1] - 1;
rtc_tm->tm_year = ret[0] - 1900;
}
int pSeries_set_rtc_time(struct rtc_time *tm)
{
int error;
int count;
/*
* error -2 is clock busy, we keep retrying a few times to see
* if it will come good -- paulus
*/
count = 0;
do {
error = rtas_call(rtas_token("set-time-of-day"), 7, 1, NULL,
tm->tm_year + 1900, tm->tm_mon + 1,
tm->tm_mday, tm->tm_hour, tm->tm_min,
tm->tm_sec, 0);
} while (error == -2 && ++count < 1000);
if (error != 0)
printk(KERN_WARNING "error: setting the clock failed (%d)\n",
error);
return 0;
}
#endif
...@@ -153,14 +153,18 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5, ...@@ -153,14 +153,18 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5,
debugger_dabr_match = xmon_dabr_match; debugger_dabr_match = xmon_dabr_match;
#endif #endif
#ifdef CONFIG_PPC_ISERIES
/* pSeries systems are identified in prom.c via OF. */ /* pSeries systems are identified in prom.c via OF. */
if ( itLpNaca.xLparInstalled == 1 ) if ( itLpNaca.xLparInstalled == 1 )
naca->platform = PLATFORM_ISERIES_LPAR; naca->platform = PLATFORM_ISERIES_LPAR;
#endif
switch (naca->platform) { switch (naca->platform) {
#ifdef CONFIG_PPC_ISERIES
case PLATFORM_ISERIES_LPAR: case PLATFORM_ISERIES_LPAR:
iSeries_init_early(); iSeries_init_early();
break; break;
#endif
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
case PLATFORM_PSERIES: case PLATFORM_PSERIES:
...@@ -215,9 +219,11 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5, ...@@ -215,9 +219,11 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5,
mm_init_ppc64(); mm_init_ppc64();
switch (naca->platform) { switch (naca->platform) {
#ifdef CONFIG_PPC_ISERIES
case PLATFORM_ISERIES_LPAR: case PLATFORM_ISERIES_LPAR:
iSeries_init(); iSeries_init();
break; break;
#endif
default: default:
/* The following relies on the device tree being */ /* The following relies on the device tree being */
/* fully configured. */ /* fully configured. */
......
...@@ -56,7 +56,7 @@ unsigned long cpu_online_map = 0; ...@@ -56,7 +56,7 @@ unsigned long cpu_online_map = 0;
static struct smp_ops_t *smp_ops; static struct smp_ops_t *smp_ops;
volatile unsigned long cpu_callin_map[NR_CPUS]; volatile unsigned int cpu_callin_map[NR_CPUS];
extern unsigned char stab_array[]; extern unsigned char stab_array[];
...@@ -86,6 +86,7 @@ static inline void set_tb(unsigned int upper, unsigned int lower) ...@@ -86,6 +86,7 @@ static inline void set_tb(unsigned int upper, unsigned int lower)
mttbl(lower); mttbl(lower);
} }
#ifdef CONFIG_PPC_ISERIES
void iSeries_smp_message_recv( struct pt_regs * regs ) void iSeries_smp_message_recv( struct pt_regs * regs )
{ {
int cpu = smp_processor_id(); int cpu = smp_processor_id();
...@@ -117,7 +118,6 @@ static void smp_iSeries_message_pass(int target, int msg, unsigned long data, in ...@@ -117,7 +118,6 @@ static void smp_iSeries_message_pass(int target, int msg, unsigned long data, in
} }
} }
#ifdef CONFIG_PPC_ISERIES
static int smp_iSeries_numProcs(void) static int smp_iSeries_numProcs(void)
{ {
unsigned np, i; unsigned np, i;
...@@ -132,7 +132,6 @@ static int smp_iSeries_numProcs(void) ...@@ -132,7 +132,6 @@ static int smp_iSeries_numProcs(void)
} }
return np; return np;
} }
#endif
static int smp_iSeries_probe(void) static int smp_iSeries_probe(void)
{ {
...@@ -189,13 +188,12 @@ void __init smp_init_iSeries(void) ...@@ -189,13 +188,12 @@ void __init smp_init_iSeries(void)
smp_ops->probe = smp_iSeries_probe; smp_ops->probe = smp_iSeries_probe;
smp_ops->kick_cpu = smp_iSeries_kick_cpu; smp_ops->kick_cpu = smp_iSeries_kick_cpu;
smp_ops->setup_cpu = smp_iSeries_setup_cpu; smp_ops->setup_cpu = smp_iSeries_setup_cpu;
#ifdef CONFIG_PPC_ISERIES
#warning fix for iseries #warning fix for iseries
naca->processorCount = smp_iSeries_numProcs(); naca->processorCount = smp_iSeries_numProcs();
#endif
} }
#endif
#ifdef CONFIG_PPC_PSERIES
static void static void
smp_openpic_message_pass(int target, int msg, unsigned long data, int wait) smp_openpic_message_pass(int target, int msg, unsigned long data, int wait)
{ {
...@@ -257,6 +255,7 @@ smp_kick_cpu(int nr) ...@@ -257,6 +255,7 @@ smp_kick_cpu(int nr)
*/ */
paca[nr].xProcStart = 1; paca[nr].xProcStart = 1;
} }
#endif
static void __init smp_space_timers(unsigned int max_cpus) static void __init smp_space_timers(unsigned int max_cpus)
{ {
...@@ -273,6 +272,7 @@ static void __init smp_space_timers(unsigned int max_cpus) ...@@ -273,6 +272,7 @@ static void __init smp_space_timers(unsigned int max_cpus)
} }
} }
#ifdef CONFIG_PPC_PSERIES
static void __devinit pSeries_setup_cpu(int cpu) static void __devinit pSeries_setup_cpu(int cpu)
{ {
if (OpenPIC_Addr) { if (OpenPIC_Addr) {
...@@ -361,6 +361,7 @@ void __init smp_init_pSeries(void) ...@@ -361,6 +361,7 @@ void __init smp_init_pSeries(void)
smp_ops->kick_cpu = smp_kick_cpu; smp_ops->kick_cpu = smp_kick_cpu;
smp_ops->setup_cpu = pSeries_setup_cpu; smp_ops->setup_cpu = pSeries_setup_cpu;
} }
#endif
void smp_local_timer_interrupt(struct pt_regs * regs) void smp_local_timer_interrupt(struct pt_regs * regs)
{ {
...@@ -563,26 +564,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -563,26 +564,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
/* Fixup boot cpu */ /* Fixup boot cpu */
smp_store_cpu_info(smp_processor_id()); smp_store_cpu_info(smp_processor_id());
cpu_callin_map[smp_processor_id()] = 1; cpu_callin_map[smp_processor_id()] = 1;
paca[smp_processor_id()].prof_counter = 1;
for (i = 0; i < NR_CPUS; i++) { paca[smp_processor_id()].prof_multiplier = 1;
paca[i].prof_counter = 1;
paca[i].prof_multiplier = 1;
if (i != boot_cpuid) {
void *tmp;
/*
* the boot cpu segment table is statically
* initialized to real address 0x5000. The
* Other processor's tables are created and
* initialized here.
*/
tmp = &stab_array[PAGE_SIZE * (i-1)];
memset(tmp, 0, PAGE_SIZE);
paca[i].xStab_data.virt = (unsigned long)tmp;
paca[i].xStab_data.real = (unsigned long)__v2a(tmp);
paca[i].default_decr = tb_ticks_per_jiffy /
decr_overclock;
}
}
/* /*
* XXX very rough. * XXX very rough.
...@@ -616,6 +599,23 @@ int __devinit __cpu_up(unsigned int cpu) ...@@ -616,6 +599,23 @@ int __devinit __cpu_up(unsigned int cpu)
struct task_struct *p; struct task_struct *p;
int c; int c;
paca[cpu].prof_counter = 1;
paca[cpu].prof_multiplier = 1;
paca[cpu].default_decr = tb_ticks_per_jiffy / decr_overclock;
if (!cpu_has_slb()) {
void *tmp;
/* maximum of 48 CPUs on machines with a segment table */
if (cpu >= 48)
BUG();
tmp = &stab_array[PAGE_SIZE * cpu];
memset(tmp, 0, PAGE_SIZE);
paca[cpu].xStab_data.virt = (unsigned long)tmp;
paca[cpu].xStab_data.real = (unsigned long)__v2a(tmp);
}
/* create a process for the processor */ /* create a process for the processor */
/* only regs.msr is actually used, and 0 is OK for it */ /* only regs.msr is actually used, and 0 is OK for it */
memset(&regs, 0, sizeof(struct pt_regs)); memset(&regs, 0, sizeof(struct pt_regs));
......
...@@ -300,16 +300,16 @@ asmlinkage long sys32_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg ...@@ -300,16 +300,16 @@ asmlinkage long sys32_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg
struct ncp_mount_data32_v3 { struct ncp_mount_data32_v3 {
int version; int version;
unsigned int ncp_fd; unsigned int ncp_fd;
__kernel_uid_t32 mounted_uid; compat_uid_t mounted_uid;
__kernel_pid_t32 wdog_pid; compat_pid_t wdog_pid;
unsigned char mounted_vol[NCP_VOLNAME_LEN + 1]; unsigned char mounted_vol[NCP_VOLNAME_LEN + 1];
unsigned int time_out; unsigned int time_out;
unsigned int retry_count; unsigned int retry_count;
unsigned int flags; unsigned int flags;
__kernel_uid_t32 uid; compat_uid_t uid;
__kernel_gid_t32 gid; compat_gid_t gid;
__kernel_mode_t32 file_mode; compat_mode_t file_mode;
__kernel_mode_t32 dir_mode; compat_mode_t dir_mode;
}; };
struct ncp_mount_data32_v4 { struct ncp_mount_data32_v4 {
...@@ -380,11 +380,11 @@ static void *do_ncp_super_data_conv(void *raw_data) ...@@ -380,11 +380,11 @@ static void *do_ncp_super_data_conv(void *raw_data)
struct smb_mount_data32 { struct smb_mount_data32 {
int version; int version;
__kernel_uid_t32 mounted_uid; compat_uid_t mounted_uid;
__kernel_uid_t32 uid; compat_uid_t uid;
__kernel_gid_t32 gid; compat_gid_t gid;
__kernel_mode_t32 file_mode; compat_mode_t file_mode;
__kernel_mode_t32 dir_mode; compat_mode_t dir_mode;
}; };
static void *do_smb_super_data_conv(void *raw_data) static void *do_smb_super_data_conv(void *raw_data)
...@@ -802,10 +802,13 @@ asmlinkage int ppc32_select(u32 n, u32* inp, u32* outp, u32* exp, u32 tvp_x) ...@@ -802,10 +802,13 @@ asmlinkage int ppc32_select(u32 n, u32* inp, u32* outp, u32* exp, u32 tvp_x)
return sys32_select((int)n, inp, outp, exp, tvp_x); return sys32_select((int)n, inp, outp, exp, tvp_x);
} }
static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf) int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf)
{ {
int err; int err;
if (stat->size > MAX_NON_LFS)
return -EOVERFLOW;
err = put_user(stat->dev, &statbuf->st_dev); err = put_user(stat->dev, &statbuf->st_dev);
err |= put_user(stat->ino, &statbuf->st_ino); err |= put_user(stat->ino, &statbuf->st_ino);
err |= put_user(stat->mode, &statbuf->st_mode); err |= put_user(stat->mode, &statbuf->st_mode);
...@@ -813,8 +816,6 @@ static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf) ...@@ -813,8 +816,6 @@ static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf)
err |= put_user(stat->uid, &statbuf->st_uid); err |= put_user(stat->uid, &statbuf->st_uid);
err |= put_user(stat->gid, &statbuf->st_gid); err |= put_user(stat->gid, &statbuf->st_gid);
err |= put_user(stat->rdev, &statbuf->st_rdev); err |= put_user(stat->rdev, &statbuf->st_rdev);
if (stat->size > MAX_NON_LFS)
return -EOVERFLOW;
err |= put_user(stat->size, &statbuf->st_size); err |= put_user(stat->size, &statbuf->st_size);
err |= put_user(stat->atime.tv_sec, &statbuf->st_atime); err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
err |= put_user(0, &statbuf->__unused1); err |= put_user(0, &statbuf->__unused1);
...@@ -830,39 +831,6 @@ static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf) ...@@ -830,39 +831,6 @@ static int cp_new_stat32(struct kstat *stat, struct stat32 *statbuf)
return err; return err;
} }
asmlinkage long sys32_newstat(char* filename, struct stat32* statbuf)
{
struct kstat stat;
int error = vfs_stat(filename, &stat);
if (!error)
error = cp_new_stat32(&stat, statbuf);
return error;
}
asmlinkage long sys32_newlstat(char * filename, struct stat32 *statbuf)
{
struct kstat stat;
int error = vfs_lstat(filename, &stat);
if (!error)
error = cp_new_stat32(&stat, statbuf);
return error;
}
asmlinkage long sys32_newfstat(unsigned int fd, struct stat32 *statbuf)
{
struct kstat stat;
int error = vfs_fstat(fd, &stat);
if (!error)
error = cp_new_stat32(&stat, statbuf);
return error;
}
static inline int put_statfs (struct statfs32 *ubuf, struct statfs *kbuf) static inline int put_statfs (struct statfs32 *ubuf, struct statfs *kbuf)
{ {
int err; int err;
...@@ -1492,27 +1460,27 @@ struct nfsctl_client32 { ...@@ -1492,27 +1460,27 @@ struct nfsctl_client32 {
struct nfsctl_export32 { struct nfsctl_export32 {
s8 ex32_client[NFSCLNT_IDMAX+1]; s8 ex32_client[NFSCLNT_IDMAX+1];
s8 ex32_path[NFS_MAXPATHLEN+1]; s8 ex32_path[NFS_MAXPATHLEN+1];
__kernel_dev_t32 ex32_dev; compat_dev_t ex32_dev;
__kernel_ino_t32 ex32_ino; compat_ino_t ex32_ino;
s32 ex32_flags; s32 ex32_flags;
__kernel_uid_t32 ex32_anon_uid; compat_uid_t ex32_anon_uid;
__kernel_gid_t32 ex32_anon_gid; compat_gid_t ex32_anon_gid;
}; };
struct nfsctl_uidmap32 { struct nfsctl_uidmap32 {
u32 ug32_ident; /* char * */ u32 ug32_ident; /* char * */
__kernel_uid_t32 ug32_uidbase; compat_uid_t ug32_uidbase;
s32 ug32_uidlen; s32 ug32_uidlen;
u32 ug32_udimap; /* uid_t * */ u32 ug32_udimap; /* uid_t * */
__kernel_uid_t32 ug32_gidbase; compat_uid_t ug32_gidbase;
s32 ug32_gidlen; s32 ug32_gidlen;
u32 ug32_gdimap; /* gid_t * */ u32 ug32_gdimap; /* gid_t * */
}; };
struct nfsctl_fhparm32 { struct nfsctl_fhparm32 {
struct sockaddr gf32_addr; struct sockaddr gf32_addr;
__kernel_dev_t32 gf32_dev; compat_dev_t gf32_dev;
__kernel_ino_t32 gf32_ino; compat_ino_t gf32_ino;
s32 gf32_version; s32 gf32_version;
}; };
...@@ -1645,7 +1613,7 @@ static int nfs_uud32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32) ...@@ -1645,7 +1613,7 @@ static int nfs_uud32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
return -ENOMEM; return -ENOMEM;
for(i = 0; i < karg->ca_umap.ug_uidlen; i++) for(i = 0; i < karg->ca_umap.ug_uidlen; i++)
err |= __get_user(karg->ca_umap.ug_udimap[i], err |= __get_user(karg->ca_umap.ug_udimap[i],
&(((__kernel_uid_t32 *)A(uaddr))[i])); &(((compat_uid_t *)A(uaddr))[i]));
err |= __get_user(karg->ca_umap.ug_gidbase, err |= __get_user(karg->ca_umap.ug_gidbase,
&arg32->ca32_umap.ug32_gidbase); &arg32->ca32_umap.ug32_gidbase);
err |= __get_user(karg->ca_umap.ug_uidlen, err |= __get_user(karg->ca_umap.ug_uidlen,
...@@ -1659,7 +1627,7 @@ static int nfs_uud32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32) ...@@ -1659,7 +1627,7 @@ static int nfs_uud32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
return -ENOMEM; return -ENOMEM;
for(i = 0; i < karg->ca_umap.ug_gidlen; i++) for(i = 0; i < karg->ca_umap.ug_gidlen; i++)
err |= __get_user(karg->ca_umap.ug_gdimap[i], err |= __get_user(karg->ca_umap.ug_gdimap[i],
&(((__kernel_gid_t32 *)A(uaddr))[i])); &(((compat_gid_t *)A(uaddr))[i]));
return err; return err;
} }
...@@ -2076,37 +2044,6 @@ asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *t ...@@ -2076,37 +2044,6 @@ asmlinkage long sys32_settimeofday(struct compat_timeval *tv, struct timezone *t
} }
struct tms32 {
__kernel_clock_t32 tms_utime;
__kernel_clock_t32 tms_stime;
__kernel_clock_t32 tms_cutime;
__kernel_clock_t32 tms_cstime;
};
extern asmlinkage long sys_times(struct tms * tbuf);
asmlinkage long sys32_times(struct tms32 *tbuf)
{
struct tms t;
long ret;
mm_segment_t old_fs = get_fs ();
int err;
set_fs (KERNEL_DS);
ret = sys_times(tbuf ? &t : NULL);
set_fs (old_fs);
if (tbuf) {
err = put_user (t.tms_utime, &tbuf->tms_utime);
err |= __put_user (t.tms_stime, &tbuf->tms_stime);
err |= __put_user (t.tms_cutime, &tbuf->tms_cutime);
err |= __put_user (t.tms_cstime, &tbuf->tms_cstime);
if (err)
ret = -EFAULT;
}
return ret;
}
struct msgbuf32 { s32 mtype; char mtext[1]; }; struct msgbuf32 { s32 mtype; char mtext[1]; };
struct semid_ds32 { struct semid_ds32 {
...@@ -2144,8 +2081,8 @@ struct msqid_ds32 ...@@ -2144,8 +2081,8 @@ struct msqid_ds32
unsigned short msg_cbytes; unsigned short msg_cbytes;
unsigned short msg_qnum; unsigned short msg_qnum;
unsigned short msg_qbytes; unsigned short msg_qbytes;
__kernel_ipc_pid_t32 msg_lspid; compat_ipc_pid_t msg_lspid;
__kernel_ipc_pid_t32 msg_lrpid; compat_ipc_pid_t msg_lrpid;
}; };
struct msqid64_ds32 { struct msqid64_ds32 {
...@@ -2159,8 +2096,8 @@ struct msqid64_ds32 { ...@@ -2159,8 +2096,8 @@ struct msqid64_ds32 {
unsigned int msg_cbytes; unsigned int msg_cbytes;
unsigned int msg_qnum; unsigned int msg_qnum;
unsigned int msg_qbytes; unsigned int msg_qbytes;
__kernel_pid_t32 msg_lspid; compat_pid_t msg_lspid;
__kernel_pid_t32 msg_lrpid; compat_pid_t msg_lrpid;
unsigned int __unused4; unsigned int __unused4;
unsigned int __unused5; unsigned int __unused5;
}; };
...@@ -2171,8 +2108,8 @@ struct shmid_ds32 { ...@@ -2171,8 +2108,8 @@ struct shmid_ds32 {
compat_time_t shm_atime; compat_time_t shm_atime;
compat_time_t shm_dtime; compat_time_t shm_dtime;
compat_time_t shm_ctime; compat_time_t shm_ctime;
__kernel_ipc_pid_t32 shm_cpid; compat_ipc_pid_t shm_cpid;
__kernel_ipc_pid_t32 shm_lpid; compat_ipc_pid_t shm_lpid;
unsigned short shm_nattch; unsigned short shm_nattch;
unsigned short __unused; unsigned short __unused;
unsigned int __unused2; unsigned int __unused2;
...@@ -2189,8 +2126,8 @@ struct shmid64_ds32 { ...@@ -2189,8 +2126,8 @@ struct shmid64_ds32 {
compat_time_t shm_ctime; compat_time_t shm_ctime;
unsigned int __unused4; unsigned int __unused4;
compat_size_t shm_segsz; compat_size_t shm_segsz;
__kernel_pid_t32 shm_cpid; compat_pid_t shm_cpid;
__kernel_pid_t32 shm_lpid; compat_pid_t shm_lpid;
unsigned int shm_nattch; unsigned int shm_nattch;
unsigned int __unused5; unsigned int __unused5;
unsigned int __unused6; unsigned int __unused6;
...@@ -2712,7 +2649,7 @@ extern asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t* offset, siz ...@@ -2712,7 +2649,7 @@ extern asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t* offset, siz
* proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
* and the register representation of a signed int (msr in 64-bit mode) is performed. * and the register representation of a signed int (msr in 64-bit mode) is performed.
*/ */
asmlinkage long sys32_sendfile(u32 out_fd, u32 in_fd, __kernel_off_t32* offset, u32 count) asmlinkage long sys32_sendfile(u32 out_fd, u32 in_fd, compat_off_t* offset, u32 count)
{ {
mm_segment_t old_fs = get_fs(); mm_segment_t old_fs = get_fs();
int ret; int ret;
...@@ -2733,7 +2670,7 @@ asmlinkage long sys32_sendfile(u32 out_fd, u32 in_fd, __kernel_off_t32* offset, ...@@ -2733,7 +2670,7 @@ asmlinkage long sys32_sendfile(u32 out_fd, u32 in_fd, __kernel_off_t32* offset,
extern asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t *offset, size_t count); extern asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t *offset, size_t count);
asmlinkage int sys32_sendfile64(int out_fd, int in_fd, __kernel_loff_t32 *offset, s32 count) asmlinkage int sys32_sendfile64(int out_fd, int in_fd, compat_loff_t *offset, s32 count)
{ {
mm_segment_t old_fs = get_fs(); mm_segment_t old_fs = get_fs();
int ret; int ret;
...@@ -4296,7 +4233,7 @@ asmlinkage long sys32_time(compat_time_t* tloc) ...@@ -4296,7 +4233,7 @@ asmlinkage long sys32_time(compat_time_t* tloc)
extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len, extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
unsigned long *user_mask_ptr); unsigned long *user_mask_ptr);
asmlinkage int sys32_sched_setaffinity(__kernel_pid_t32 pid, unsigned int len, asmlinkage int sys32_sched_setaffinity(compat_pid_t pid, unsigned int len,
u32 *user_mask_ptr) u32 *user_mask_ptr)
{ {
unsigned long kernel_mask; unsigned long kernel_mask;
...@@ -4320,7 +4257,7 @@ asmlinkage int sys32_sched_setaffinity(__kernel_pid_t32 pid, unsigned int len, ...@@ -4320,7 +4257,7 @@ asmlinkage int sys32_sched_setaffinity(__kernel_pid_t32 pid, unsigned int len,
extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len, extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len,
unsigned long *user_mask_ptr); unsigned long *user_mask_ptr);
asmlinkage int sys32_sched_getaffinity(__kernel_pid_t32 pid, unsigned int len, asmlinkage int sys32_sched_getaffinity(compat_pid_t pid, unsigned int len,
u32 *user_mask_ptr) u32 *user_mask_ptr)
{ {
unsigned long kernel_mask; unsigned long kernel_mask;
......
...@@ -301,9 +301,11 @@ int timer_interrupt(struct pt_regs * regs) ...@@ -301,9 +301,11 @@ int timer_interrupt(struct pt_regs * regs)
next_dec = lpaca->default_decr; next_dec = lpaca->default_decr;
set_dec(next_dec); set_dec(next_dec);
#ifdef CONFIG_PPC_ISERIES
lpq = lpaca->lpQueuePtr; lpq = lpaca->lpQueuePtr;
if (lpq && ItLpQueue_isLpIntPending(lpq)) if (lpq && ItLpQueue_isLpIntPending(lpq))
lpEvent_count += ItLpQueue_process(lpq, regs); lpEvent_count += ItLpQueue_process(lpq, regs);
#endif
irq_exit(); irq_exit();
...@@ -458,9 +460,11 @@ void __init time_init(void) ...@@ -458,9 +460,11 @@ void __init time_init(void)
ppc_md.calibrate_decr(); ppc_md.calibrate_decr();
if ( ! piranha_simulator ) { #ifdef CONFIG_PPC_ISERIES
if (!piranha_simulator)
#endif
ppc_md.get_boot_time(&tm); ppc_md.get_boot_time(&tm);
}
write_lock_irqsave(&xtime_lock, flags); write_lock_irqsave(&xtime_lock, flags);
xtime.tv_sec = mktime(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, xtime.tv_sec = mktime(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec); tm.tm_hour, tm.tm_min, tm.tm_sec);
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <asm/naca.h> #include <asm/naca.h>
#include <asm/rtas.h> #include <asm/rtas.h>
#include "i8259.h" #include "i8259.h"
#include "xics.h" #include <asm/xics.h>
#include <asm/ppcdebug.h> #include <asm/ppcdebug.h>
#include <asm/machdep.h> #include <asm/machdep.h>
...@@ -430,15 +430,6 @@ xics_init_IRQ( void ) ...@@ -430,15 +430,6 @@ xics_init_IRQ( void )
ppc64_boot_msg(0x21, "XICS Done"); ppc64_boot_msg(0x21, "XICS Done");
} }
void xics_isa_init(void)
{
return;
if (request_irq(xics_irq_8259_cascade + XICS_IRQ_OFFSET, no_action,
0, "8259 cascade", 0))
printk(KERN_ERR "xics_init_IRQ: couldn't get 8259 cascade\n");
i8259_init();
}
void xics_set_affinity(unsigned int virq, unsigned long cpumask) void xics_set_affinity(unsigned int virq, unsigned long cpumask)
{ {
irq_desc_t *desc = irq_desc + virq; irq_desc_t *desc = irq_desc + virq;
...@@ -446,7 +437,7 @@ void xics_set_affinity(unsigned int virq, unsigned long cpumask) ...@@ -446,7 +437,7 @@ void xics_set_affinity(unsigned int virq, unsigned long cpumask)
unsigned long flags; unsigned long flags;
long status; long status;
unsigned long xics_status[2]; unsigned long xics_status[2];
u32 newmask; unsigned long newmask;
virq -= XICS_IRQ_OFFSET; virq -= XICS_IRQ_OFFSET;
irq = virt_irq_to_real(virq); irq = virt_irq_to_real(virq);
...@@ -464,12 +455,12 @@ void xics_set_affinity(unsigned int virq, unsigned long cpumask) ...@@ -464,12 +455,12 @@ void xics_set_affinity(unsigned int virq, unsigned long cpumask)
} }
/* For the moment only implement delivery to all cpus or one cpu */ /* For the moment only implement delivery to all cpus or one cpu */
if (cpumask == 0xffffffff) { if (cpumask == -1UL) {
newmask = default_distrib_server; newmask = default_distrib_server;
} else { } else {
if (!(cpumask & cpu_online_map)) if (!(cpumask & cpu_online_map))
goto out; goto out;
newmask = find_first_bit(&cpumask, 32); newmask = find_first_bit(&cpumask, 8*sizeof(unsigned long));
} }
status = rtas_call(ibm_set_xive, 3, 1, NULL, status = rtas_call(ibm_set_xive, 3, 1, NULL,
......
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
# Makefile for ppc64-specific library files.. # Makefile for ppc64-specific library files..
# #
export-objs := dec_and_lock.o L_TARGET = lib.a
obj-y := checksum.o dec_and_lock.o string.o strcase.o copypage.o \ export-objs := dec_and_lock.o
memcpy.o copyuser.o
obj-y := checksum.o dec_and_lock.o string.o strcase.o
obj-y += copypage.o memcpy.o copyuser.o
...@@ -121,7 +121,7 @@ _GLOBAL(memcpy) ...@@ -121,7 +121,7 @@ _GLOBAL(memcpy)
cmpwi cr1,r5,8 cmpwi cr1,r5,8
addi r3,r3,32 addi r3,r3,32
sld r9,r9,r10 sld r9,r9,r10
blt cr1,.Ldo_tail ble cr1,.Ldo_tail
ld r0,8(r4) ld r0,8(r4)
srd r7,r0,r11 srd r7,r0,r11
or r9,r7,r9 or r9,r7,r9
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Makefile for the linux ppc-specific parts of the memory manager. # Makefile for the linux ppc-specific parts of the memory manager.
# #
EXTRA_CFLAGS = -mno-minimal-toc EXTRA_CFLAGS += -mno-minimal-toc
obj-y := fault.o init.o extable.o imalloc.o obj-y := fault.o init.o extable.o imalloc.o
obj-$(CONFIG_DISCONTIGMEM) += numa.o obj-$(CONFIG_DISCONTIGMEM) += numa.o
obj-$(CONFIG_OPROFILE) += oprofile.o obj-$(CONFIG_OPROFILE) += oprofile.o
DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \ DRIVER_OBJS := $(addprefix ../../../drivers/oprofile/, \
oprof.o cpu_buffer.o buffer_sync.o \ oprof.o cpu_buffer.o buffer_sync.o \
event_buffer.o oprofile_files.o \ event_buffer.o oprofile_files.o \
oprofilefs.o oprofile_stats.o ) oprofilefs.o oprofile_stats.o )
oprofile-y := $(DRIVER_OBJS) init.o timer_int.o oprofile-y := $(DRIVER_OBJS) init.o timer_int.o
# Makefile for xmon # Makefile for xmon
EXTRA_CFLAGS = -mno-minimal-toc EXTRA_CFLAGS += -mno-minimal-toc
obj-y := start.o xmon.o ppc-dis.o ppc-opc.o subr_prf.o setjmp.o obj-y := start.o xmon.o ppc-dis.o ppc-opc.o subr_prf.o setjmp.o
...@@ -14,29 +14,13 @@ ...@@ -14,29 +14,13 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/processor.h> #include <asm/processor.h>
/* Transition to udbg isn't quite done yet...but very close. */
#define USE_UDBG
#ifdef USE_UDBG
#include <asm/udbg.h> #include <asm/udbg.h>
#endif
#ifndef USE_UDBG
static volatile unsigned char *sccc, *sccd;
#endif
unsigned long TXRDY, RXRDY;
extern void xmon_printf(const char *fmt, ...); extern void xmon_printf(const char *fmt, ...);
static int xmon_expect(const char *str, unsigned int timeout); static int xmon_expect(const char *str, unsigned int timeout);
#ifndef USE_UDBG
static int console = 0;
#endif
static int via_modem = 0;
/* static int xmon_use_sccb = 0; --Unused */
#define TB_SPEED 25000000 #define TB_SPEED 25000000
extern void *comport1;
static inline unsigned int readtb(void) static inline unsigned int readtb(void)
{ {
unsigned int ret; unsigned int ret;
...@@ -45,16 +29,10 @@ static inline unsigned int readtb(void) ...@@ -45,16 +29,10 @@ static inline unsigned int readtb(void)
return ret; return ret;
} }
#ifndef USE_UDBG static void sysrq_handle_xmon(int key, struct pt_regs *pt_regs,
void buf_access(void) struct tty_struct *tty)
{ {
sccd[3] &= ~0x80; /* reset DLAB */ xmon(pt_regs);
}
#endif
static void sysrq_handle_xmon(int key, struct pt_regs *pt_regs, struct tty_struct *tty)
{
xmon(pt_regs);
} }
static struct sysrq_key_op sysrq_xmon_op = static struct sysrq_key_op sysrq_xmon_op =
{ {
...@@ -68,50 +46,12 @@ xmon_map_scc(void) ...@@ -68,50 +46,12 @@ xmon_map_scc(void)
{ {
/* This maybe isn't the best place to register sysrq 'x' */ /* This maybe isn't the best place to register sysrq 'x' */
__sysrq_put_key_op('x', &sysrq_xmon_op); __sysrq_put_key_op('x', &sysrq_xmon_op);
#ifndef USE_UDBG
/* should already be mapped by the kernel boot */
sccd = (volatile unsigned char *) (((unsigned long)comport1));
sccc = (volatile unsigned char *) (((unsigned long)comport1)+5);
TXRDY = 0x20;
RXRDY = 1;
#endif
} }
static int scc_initialized = 0;
void xmon_init_scc(void);
extern void pmu_poll(void);
int int
xmon_write(void *handle, void *ptr, int nb) xmon_write(void *handle, void *ptr, int nb)
{ {
#ifdef USE_UDBG
return udbg_write(ptr, nb); return udbg_write(ptr, nb);
#else
char *p = ptr;
int i, c, ct;
if (!scc_initialized)
xmon_init_scc();
ct = 0;
for (i = 0; i < nb; ++i) {
while ((*sccc & TXRDY) == 0) {
}
c = p[i];
if (c == '\n' && !ct) {
c = '\r';
ct = 1;
--i;
} else {
if (console)
printk("%c", c);
ct = 0;
}
buf_access();
*sccd = c;
}
return i;
#endif
} }
int xmon_wants_key; int xmon_wants_key;
...@@ -119,68 +59,15 @@ int xmon_wants_key; ...@@ -119,68 +59,15 @@ int xmon_wants_key;
int int
xmon_read(void *handle, void *ptr, int nb) xmon_read(void *handle, void *ptr, int nb)
{ {
#ifdef USE_UDBG
return udbg_read(ptr, nb); return udbg_read(ptr, nb);
#else
char *p = ptr;
int i, c;
if (!scc_initialized)
xmon_init_scc();
for (i = 0; i < nb; ++i) {
do {
while ((*sccc & RXRDY) == 0)
;
buf_access();
c = *sccd;
} while (c == 0x11 || c == 0x13);
*p++ = c;
}
return i;
#endif
} }
int int
xmon_read_poll(void) xmon_read_poll(void)
{ {
#ifdef USE_UDBG
return udbg_getc_poll(); return udbg_getc_poll();
#else
if ((*sccc & RXRDY) == 0) {
return -1;
}
buf_access();
return *sccd;
#endif
} }
void
xmon_init_scc()
{
#ifndef USE_UDBG
sccd[3] = 0x83; eieio(); /* LCR = 8N1 + DLAB */
sccd[0] = 12; eieio(); /* DLL = 9600 baud */
sccd[1] = 0; eieio();
sccd[2] = 0; eieio(); /* FCR = 0 */
sccd[3] = 3; eieio(); /* LCR = 8N1 */
sccd[1] = 0; eieio(); /* IER = 0 */
#endif
scc_initialized = 1;
if (via_modem) {
for (;;) {
xmon_write(0, "ATE1V1\r", 7);
if (xmon_expect("OK", 5)) {
xmon_write(0, "ATA\r", 4);
if (xmon_expect("CONNECT", 40))
break;
}
xmon_write(0, "+++", 3);
xmon_expect("OK", 3);
}
}
}
void *xmon_stdin; void *xmon_stdin;
void *xmon_stdout; void *xmon_stdout;
void *xmon_stderr; void *xmon_stderr;
......
...@@ -51,26 +51,15 @@ void module_free(struct module *mod, void *module_region) ...@@ -51,26 +51,15 @@ void module_free(struct module *mod, void *module_region)
table entries. */ table entries. */
} }
/* s390/s390x needs additional memory for GOT/PLT sections. */ int module_frob_arch_sections(const Elf_Ehdr *hdr,
long module_core_size(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
const Elf32_Shdr *sechdrs, const char *secstrings,
const char *secstrings, struct module *mod)
struct module *module)
{ {
// FIXME: add space needed for GOT/PLT // FIXME: add space needed for GOT/PLT
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf_Shdr *sechdrs, int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -78,7 +67,7 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -78,7 +67,7 @@ int apply_relocate(Elf_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_offset; ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_addr;
ElfW(Sym) *sym; ElfW(Sym) *sym;
ElfW(Addr) *location; ElfW(Addr) *location;
...@@ -86,10 +75,10 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -86,10 +75,10 @@ int apply_relocate(Elf_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (ElfW(Sym) *)sechdrs[symindex].sh_offset sym = (ElfW(Sym) *)sechdrs[symindex].sh_addr
+ ELFW(R_SYM)(rel[i].r_info); + ELFW(R_SYM)(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -52,25 +52,15 @@ void module_free(struct module *mod, void *module_region) ...@@ -52,25 +52,15 @@ void module_free(struct module *mod, void *module_region)
} }
/* s390/s390x needs additional memory for GOT/PLT sections. */ /* s390/s390x needs additional memory for GOT/PLT sections. */
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
// FIXME: add space needed for GOT/PLT // FIXME: add space needed for GOT/PLT
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf_Shdr *sechdrs, int apply_relocate(Elf_Shdr *sechdrs,
const char *strtab, const char *strtab,
unsigned int symindex, unsigned int symindex,
...@@ -78,7 +68,7 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -78,7 +68,7 @@ int apply_relocate(Elf_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_offset; ElfW(Rel) *rel = (void *)sechdrs[relsec].sh_addr;
ElfW(Sym) *sym; ElfW(Sym) *sym;
ElfW(Addr) *location; ElfW(Addr) *location;
...@@ -86,10 +76,10 @@ int apply_relocate(Elf_Shdr *sechdrs, ...@@ -86,10 +76,10 @@ int apply_relocate(Elf_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (ElfW(Sym) *)sechdrs[symindex].sh_offset sym = (ElfW(Sym) *)sechdrs[symindex].sh_addr
+ ELFW(R_SYM)(rel[i].r_info); + ELFW(R_SYM)(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -37,20 +37,12 @@ void module_free(struct module *mod, void *module_region) ...@@ -37,20 +37,12 @@ void module_free(struct module *mod, void *module_region)
} }
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf32_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf32_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf32_Ehdr *hdr,
const Elf32_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf32_Shdr *sechdrs, int apply_relocate(Elf32_Shdr *sechdrs,
...@@ -71,7 +63,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -71,7 +63,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf32_Rela *rel = (void *)sechdrs[relsec].sh_offset; Elf32_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf32_Sym *sym; Elf32_Sym *sym;
u8 *location; u8 *location;
u32 *loc32; u32 *loc32;
...@@ -80,11 +72,11 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, ...@@ -80,11 +72,11 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
Elf32_Addr v; Elf32_Addr v;
/* This is where to make the change */ /* This is where to make the change */
location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
loc32 = (u32 *) location; loc32 = (u32 *) location;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf32_Sym *)sechdrs[symindex].sh_offset sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rel[i].r_info); + ELF32_R_SYM(rel[i].r_info);
if (!(v = sym->st_value)) { if (!(v = sym->st_value)) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -144,20 +144,12 @@ void module_free(struct module *mod, void *module_region) ...@@ -144,20 +144,12 @@ void module_free(struct module *mod, void *module_region)
} }
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf64_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf64_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf64_Ehdr *hdr,
const Elf64_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate(Elf64_Shdr *sechdrs, int apply_relocate(Elf64_Shdr *sechdrs,
...@@ -178,7 +170,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -178,7 +170,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf64_Rela *rel = (void *)sechdrs[relsec].sh_offset; Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf64_Sym *sym; Elf64_Sym *sym;
u8 *location; u8 *location;
u32 *loc32; u32 *loc32;
...@@ -187,14 +179,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -187,14 +179,14 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
Elf64_Addr v; Elf64_Addr v;
/* This is where to make the change */ /* This is where to make the change */
location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_offset location = (u8 *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
loc32 = (u32 *) location; loc32 = (u32 *) location;
BUG_ON(((u64)location >> (u64)32) != (u64)0); BUG_ON(((u64)location >> (u64)32) != (u64)0);
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf64_Sym *)sechdrs[symindex].sh_offset sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
+ ELF64_R_SYM(rel[i].r_info); + ELF64_R_SYM(rel[i].r_info);
if (!(v = sym->st_value)) { if (!(v = sym->st_value)) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -160,7 +160,7 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab, ...@@ -160,7 +160,7 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab,
struct module *mod) struct module *mod)
{ {
unsigned int i; unsigned int i;
Elf32_Rela *rela = (void *)sechdrs[relsec].sh_offset; Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr;
DEBUGP ("Applying relocate section %u to %u\n", relsec, DEBUGP ("Applying relocate section %u to %u\n", relsec,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
...@@ -168,11 +168,11 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab, ...@@ -168,11 +168,11 @@ int apply_relocate_add (Elf32_Shdr *sechdrs, const char *strtab,
for (i = 0; i < sechdrs[relsec].sh_size / sizeof (*rela); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof (*rela); i++) {
/* This is where to make the change */ /* This is where to make the change */
uint32_t *loc uint32_t *loc
= ((void *)sechdrs[sechdrs[relsec].sh_info].sh_offset = ((void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rela[i].r_offset); + rela[i].r_offset);
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
Elf32_Sym *sym Elf32_Sym *sym
= ((Elf32_Sym *)sechdrs[symindex].sh_offset = ((Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM (rela[i].r_info)); + ELF32_R_SYM (rela[i].r_info));
uint32_t val = sym->st_value; uint32_t val = sym->st_value;
......
...@@ -26,20 +26,12 @@ ...@@ -26,20 +26,12 @@
#define DEBUGP(fmt...) #define DEBUGP(fmt...)
/* We don't need anything special. */ /* We don't need anything special. */
long module_core_size(const Elf64_Ehdr *hdr, int module_frob_arch_sections(const Elf_Ehdr *hdr,
const Elf64_Shdr *sechdrs, const Elf_Shdr *sechdrs,
const char *secstrings, const char *secstrings,
struct module *module) struct module *mod)
{ {
return module->core_size; return 0;
}
long module_init_size(const Elf64_Ehdr *hdr,
const Elf64_Shdr *sechdrs,
const char *secstrings,
struct module *module)
{
return module->init_size;
} }
int apply_relocate_add(Elf64_Shdr *sechdrs, int apply_relocate_add(Elf64_Shdr *sechdrs,
...@@ -49,7 +41,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -49,7 +41,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
struct module *me) struct module *me)
{ {
unsigned int i; unsigned int i;
Elf64_Rela *rel = (void *)sechdrs[relsec].sh_offset; Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr;
Elf64_Sym *sym; Elf64_Sym *sym;
void *loc; void *loc;
u64 val; u64 val;
...@@ -58,11 +50,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, ...@@ -58,11 +50,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs,
sechdrs[relsec].sh_info); sechdrs[relsec].sh_info);
for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
/* This is where to make the change */ /* This is where to make the change */
loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_offset loc = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+ rel[i].r_offset; + rel[i].r_offset;
/* This is the symbol it is referring to */ /* This is the symbol it is referring to */
sym = (Elf64_Sym *)sechdrs[symindex].sh_offset sym = (Elf64_Sym *)sechdrs[symindex].sh_addr
+ ELF64_R_SYM(rel[i].r_info); + ELF64_R_SYM(rel[i].r_info);
if (!sym->st_value) { if (!sym->st_value) {
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
......
...@@ -145,6 +145,8 @@ static int ps2_open(struct serio *io) ...@@ -145,6 +145,8 @@ static int ps2_open(struct serio *io)
ps2if->open = 1; ps2if->open = 1;
enable_irq_wake(ps2if->dev->irq[0]);
sa1111_writel(PS2CR_ENA, ps2if->base + SA1111_PS2CR); sa1111_writel(PS2CR_ENA, ps2if->base + SA1111_PS2CR);
return 0; return 0;
} }
...@@ -155,6 +157,8 @@ static void ps2_close(struct serio *io) ...@@ -155,6 +157,8 @@ static void ps2_close(struct serio *io)
sa1111_writel(0, ps2if->base + SA1111_PS2CR); sa1111_writel(0, ps2if->base + SA1111_PS2CR);
disable_irq_wake(ps2if->dev->irq[0]);
ps2if->open = 0; ps2if->open = 0;
free_irq(ps2if->dev->irq[1], ps2if); free_irq(ps2if->dev->irq[1], ps2if);
...@@ -337,7 +341,7 @@ static int ps2_resume(struct device *dev, u32 level) ...@@ -337,7 +341,7 @@ static int ps2_resume(struct device *dev, u32 level)
*/ */
static struct sa1111_driver ps2_driver = { static struct sa1111_driver ps2_driver = {
.drv = { .drv = {
.name = "SA1111 PS2", .name = "sa1111-ps2",
.bus = &sa1111_bus_type, .bus = &sa1111_bus_type,
.probe = ps2_probe, .probe = ps2_probe,
.remove = ps2_remove, .remove = ps2_remove,
......
This diff is collapsed.
...@@ -6,9 +6,12 @@ ...@@ -6,9 +6,12 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/hardware/sa1111.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include "sa1100_generic.h" #include "sa1100_generic.h"
...@@ -76,6 +79,9 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__, ...@@ -76,6 +79,9 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
case 50: pa_dwr_set = SOCKET1_POWER; break; case 50: pa_dwr_set = SOCKET1_POWER; break;
} }
break; break;
default:
return -1;
} }
if (conf->vpp != conf->vcc && conf->vpp != 0) { if (conf->vpp != conf->vcc && conf->vpp != 0) {
...@@ -90,7 +96,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__, ...@@ -90,7 +96,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
local_irq_save(flags); local_irq_save(flags);
PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set; PA_DWR = (PA_DWR & ~pa_dwr_mask) | pa_dwr_set;
locla_irq_restore(flags); local_irq_restore(flags);
} }
return ret; return ret;
...@@ -117,7 +123,7 @@ int __init pcmcia_jornada720_init(void) ...@@ -117,7 +123,7 @@ int __init pcmcia_jornada720_init(void)
return ret; return ret;
} }
void __exit pcmcia_jornada720_exit(void) void __devexit pcmcia_jornada720_exit(void)
{ {
sa1100_unregister_pcmcia(&jornada720_pcmcia_ops); sa1100_unregister_pcmcia(&jornada720_pcmcia_ops);
} }
...@@ -36,11 +36,11 @@ int sa1111_pcmcia_init(struct pcmcia_init *init) ...@@ -36,11 +36,11 @@ int sa1111_pcmcia_init(struct pcmcia_init *init)
int i, ret; int i, ret;
for (i = ret = 0; i < ARRAY_SIZE(irqs); i++) { for (i = ret = 0; i < ARRAY_SIZE(irqs); i++) {
set_irq_type(irqs[i].irq, IRQT_FALLING);
ret = request_irq(irqs[i].irq, init->handler, SA_INTERRUPT, ret = request_irq(irqs[i].irq, init->handler, SA_INTERRUPT,
irqs[i].str, NULL); irqs[i].str, NULL);
if (ret) if (ret)
break; break;
set_irq_type(irqs[i].irq, IRQT_FALLING);
} }
if (i < ARRAY_SIZE(irqs)) { if (i < ARRAY_SIZE(irqs)) {
...@@ -280,7 +280,7 @@ static int pcmcia_resume(struct device *dev, u32 level) ...@@ -280,7 +280,7 @@ static int pcmcia_resume(struct device *dev, u32 level)
static struct sa1111_driver pcmcia_driver = { static struct sa1111_driver pcmcia_driver = {
.drv = { .drv = {
.name = "SA1111 PCMCIA", .name = "sa1111-pcmcia",
.bus = &sa1111_bus_type, .bus = &sa1111_bus_type,
.probe = pcmcia_probe, .probe = pcmcia_probe,
.remove = __devexit_p(pcmcia_remove), .remove = __devexit_p(pcmcia_remove),
......
This diff is collapsed.
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include <linux/stat.h> #include <linux/stat.h>
#include <linux/nls.h> #include <linux/nls.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/statfs.h> #include <linux/vfs.h>
#include "befs.h" #include "befs.h"
#include "btree.h" #include "btree.h"
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/vfs.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define __ASM_ARCH_MEMORY_H #define __ASM_ARCH_MEMORY_H
#include <linux/config.h> #include <linux/config.h>
#include <asm/arch/iop310.h>
/* /*
* Task size: 3GB * Task size: 3GB
......
#ifndef _ASMARM_CURRENT_H #ifndef _ASMARM_CURRENT_H
#define _ASMARM_CURRENT_H #define _ASMARM_CURRENT_H
#include <asm/thread_info.h> #include <linux/thread_info.h>
static inline struct task_struct *get_current(void) __attribute__ (( __const__ )); static inline struct task_struct *get_current(void) __attribute__ (( __const__ ));
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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