Commit ee1262db authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6:
  sparc: Set UTS_MACHINE correctly.
  sparc,leon: init_leon srmmu cleanup
  sparc32: Remove early interrupt enable.
  sparc, leon: Added Aeroflex Gaisler entry in manufacturer_info structure
  sparc64: Faster early-boot framebuffer console.
  Revert "sparc: Make atomic locks raw"
  sparc: remove unused nfsd #includes
  sparc: Fixup last users of irq_chip->typename
  Added sparc_leon3_snooping_enabled() and converted extern inline to static inline
  No auxio on LEON
  apbuart: Use of_find_node_by_path to find root node.
  sparc: Replace old style lock initializer
  sparc: Make atomic locks raw
  apbuart: Fix build and missing driver unregister.
  apbuart: Kill dependency on deprecated Sparc-only PROM interfaces.
  apbuart: Fix build warning.
  sparc: Support for GRLIB APBUART serial port
  watchdog: Remove BKL from rio watchdog driver
  sparc: Remove BKL from apc
  sparc,leon: Sparc-Leon SMP support
parents a421018e 7f5620a5
...@@ -221,6 +221,13 @@ config SPARC64_SMP ...@@ -221,6 +221,13 @@ config SPARC64_SMP
default y default y
depends on SPARC64 && SMP depends on SPARC64 && SMP
config EARLYFB
bool "Support for early boot text console"
default y
depends on SPARC64
help
Say Y here to enable a faster early framebuffer boot console.
choice choice
prompt "Kernel page size" if SPARC64 prompt "Kernel page size" if SPARC64
default SPARC64_PAGE_SIZE_8KB default SPARC64_PAGE_SIZE_8KB
......
...@@ -27,6 +27,7 @@ AS := $(AS) -32 ...@@ -27,6 +27,7 @@ AS := $(AS) -32
LDFLAGS := -m elf32_sparc LDFLAGS := -m elf32_sparc
CHECKFLAGS += -D__sparc__ CHECKFLAGS += -D__sparc__
export BITS := 32 export BITS := 32
UTS_MACHINE := sparc
#KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7 #KBUILD_CFLAGS += -g -pipe -fcall-used-g5 -fcall-used-g7
KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7 KBUILD_CFLAGS += -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
...@@ -46,6 +47,7 @@ CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__ -m64 ...@@ -46,6 +47,7 @@ CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__ -m64
LDFLAGS := -m elf64_sparc LDFLAGS := -m elf64_sparc
export BITS := 64 export BITS := 64
UTS_MACHINE := sparc64
KBUILD_CFLAGS += -m64 -pipe -mno-fpu -mcpu=ultrasparc -mcmodel=medlow \ KBUILD_CFLAGS += -m64 -pipe -mno-fpu -mcpu=ultrasparc -mcmodel=medlow \
-ffixed-g4 -ffixed-g5 -fcall-used-g7 -Wno-sign-compare \ -ffixed-g4 -ffixed-g5 -fcall-used-g7 -Wno-sign-compare \
......
#ifndef _SPARC_BTEXT_H
#define _SPARC_BTEXT_H
extern int btext_find_display(void);
#endif /* _SPARC_BTEXT_H */
...@@ -148,7 +148,7 @@ static inline unsigned long leon_load_reg(unsigned long paddr) ...@@ -148,7 +148,7 @@ static inline unsigned long leon_load_reg(unsigned long paddr)
return retval; return retval;
} }
extern inline void leon_srmmu_disabletlb(void) static inline void leon_srmmu_disabletlb(void)
{ {
unsigned int retval; unsigned int retval;
__asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r"(retval) : "r"(0), __asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r"(retval) : "r"(0),
...@@ -158,7 +158,7 @@ extern inline void leon_srmmu_disabletlb(void) ...@@ -158,7 +158,7 @@ extern inline void leon_srmmu_disabletlb(void)
"i"(ASI_LEON_MMUREGS) : "memory"); "i"(ASI_LEON_MMUREGS) : "memory");
} }
extern inline void leon_srmmu_enabletlb(void) static inline void leon_srmmu_enabletlb(void)
{ {
unsigned int retval; unsigned int retval;
__asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r"(retval) : "r"(0), __asm__ __volatile__("lda [%%g0] %2, %0\n\t" : "=r"(retval) : "r"(0),
...@@ -190,7 +190,7 @@ extern void leon_init_IRQ(void); ...@@ -190,7 +190,7 @@ extern void leon_init_IRQ(void);
extern unsigned long last_valid_pfn; extern unsigned long last_valid_pfn;
extern inline unsigned long sparc_leon3_get_dcachecfg(void) static inline unsigned long sparc_leon3_get_dcachecfg(void)
{ {
unsigned int retval; unsigned int retval;
__asm__ __volatile__("lda [%1] %2, %0\n\t" : __asm__ __volatile__("lda [%1] %2, %0\n\t" :
...@@ -201,7 +201,7 @@ extern inline unsigned long sparc_leon3_get_dcachecfg(void) ...@@ -201,7 +201,7 @@ extern inline unsigned long sparc_leon3_get_dcachecfg(void)
} }
/* enable snooping */ /* enable snooping */
extern inline void sparc_leon3_enable_snooping(void) static inline void sparc_leon3_enable_snooping(void)
{ {
__asm__ __volatile__ ("lda [%%g0] 2, %%l1\n\t" __asm__ __volatile__ ("lda [%%g0] 2, %%l1\n\t"
"set 0x800000, %%l2\n\t" "set 0x800000, %%l2\n\t"
...@@ -209,7 +209,14 @@ extern inline void sparc_leon3_enable_snooping(void) ...@@ -209,7 +209,14 @@ extern inline void sparc_leon3_enable_snooping(void)
"sta %%l2, [%%g0] 2\n\t" : : : "l1", "l2"); "sta %%l2, [%%g0] 2\n\t" : : : "l1", "l2");
}; };
extern inline void sparc_leon3_disable_cache(void) static inline int sparc_leon3_snooping_enabled(void)
{
u32 cctrl;
__asm__ __volatile__("lda [%%g0] 2, %0\n\t" : "=r"(cctrl));
return (cctrl >> 23) & 1;
};
static inline void sparc_leon3_disable_cache(void)
{ {
__asm__ __volatile__ ("lda [%%g0] 2, %%l1\n\t" __asm__ __volatile__ ("lda [%%g0] 2, %%l1\n\t"
"set 0x00000f, %%l2\n\t" "set 0x00000f, %%l2\n\t"
...@@ -340,6 +347,30 @@ extern int leon_flush_needed(void); ...@@ -340,6 +347,30 @@ extern int leon_flush_needed(void);
extern void leon_switch_mm(void); extern void leon_switch_mm(void);
extern int srmmu_swprobe_trace; extern int srmmu_swprobe_trace;
#ifdef CONFIG_SMP
extern int leon_smp_nrcpus(void);
extern void leon_clear_profile_irq(int cpu);
extern void leon_smp_done(void);
extern void leon_boot_cpus(void);
extern int leon_boot_one_cpu(int i);
void leon_init_smp(void);
extern void cpu_probe(void);
extern void cpu_idle(void);
extern void init_IRQ(void);
extern void cpu_panic(void);
extern int __leon_processor_id(void);
void leon_enable_irq_cpu(unsigned int irq_nr, unsigned int cpu);
extern unsigned int real_irq_entry[], smpleon_ticker[];
extern unsigned int patchme_maybe_smp_msg[];
extern unsigned long trapbase_cpu1[];
extern unsigned long trapbase_cpu2[];
extern unsigned long trapbase_cpu3[];
extern unsigned int t_nmi[], linux_trap_ipi15_leon[];
extern unsigned int linux_trap_ipi15_sun4m[];
#endif /* CONFIG_SMP */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
...@@ -356,6 +387,10 @@ extern int srmmu_swprobe_trace; ...@@ -356,6 +387,10 @@ extern int srmmu_swprobe_trace;
#define leon_switch_mm() do {} while (0) #define leon_switch_mm() do {} while (0)
#define leon_init_IRQ() do {} while (0) #define leon_init_IRQ() do {} while (0)
#define init_leon() do {} while (0) #define init_leon() do {} while (0)
#define leon_smp_done() do {} while (0)
#define leon_boot_cpus() do {} while (0)
#define leon_boot_one_cpu(i) 1
#define leon_init_smp() do {} while (0)
#endif /* !defined(CONFIG_SPARC_LEON) */ #endif /* !defined(CONFIG_SPARC_LEON) */
......
...@@ -35,8 +35,8 @@ struct rw_semaphore { ...@@ -35,8 +35,8 @@ struct rw_semaphore {
#endif #endif
#define __RWSEM_INITIALIZER(name) \ #define __RWSEM_INITIALIZER(name) \
{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \ { RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \
__RWSEM_DEP_MAP_INIT(name) } LIST_HEAD_INIT((name).wait_list) __RWSEM_DEP_MAP_INIT(name) }
#define DECLARE_RWSEM(name) \ #define DECLARE_RWSEM(name) \
struct rw_semaphore name = __RWSEM_INITIALIZER(name) struct rw_semaphore name = __RWSEM_INITIALIZER(name)
......
...@@ -106,6 +106,15 @@ static inline int hard_smp4d_processor_id(void) ...@@ -106,6 +106,15 @@ static inline int hard_smp4d_processor_id(void)
return cpuid; return cpuid;
} }
extern inline int hard_smpleon_processor_id(void)
{
int cpuid;
__asm__ __volatile__("rd %%asr17,%0\n\t"
"srl %0,28,%0" :
"=&r" (cpuid) : );
return cpuid;
}
#ifndef MODULE #ifndef MODULE
static inline int hard_smp_processor_id(void) static inline int hard_smp_processor_id(void)
{ {
......
...@@ -72,7 +72,7 @@ obj-y += dma.o ...@@ -72,7 +72,7 @@ obj-y += dma.o
obj-$(CONFIG_SPARC32_PCI) += pcic.o obj-$(CONFIG_SPARC32_PCI) += pcic.o
obj-$(CONFIG_SMP) += trampoline_$(BITS).o smp_$(BITS).o obj-$(CONFIG_SMP) += trampoline_$(BITS).o smp_$(BITS).o
obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o obj-$(CONFIG_SPARC32_SMP) += sun4m_smp.o sun4d_smp.o leon_smp.o
obj-$(CONFIG_SPARC64_SMP) += hvtramp.o obj-$(CONFIG_SPARC64_SMP) += hvtramp.o
obj-y += auxio_$(BITS).o obj-y += auxio_$(BITS).o
...@@ -87,6 +87,7 @@ obj-$(CONFIG_KGDB) += kgdb_$(BITS).o ...@@ -87,6 +87,7 @@ obj-$(CONFIG_KGDB) += kgdb_$(BITS).o
obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o
CFLAGS_REMOVE_ftrace.o := -pg CFLAGS_REMOVE_ftrace.o := -pg
obj-$(CONFIG_EARLYFB) += btext.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
# sparc64 PCI # sparc64 PCI
obj-$(CONFIG_SPARC64_PCI) += pci.o pci_common.o psycho_common.o obj-$(CONFIG_SPARC64_PCI) += pci.o pci_common.o psycho_common.o
......
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/smp_lock.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
...@@ -76,7 +75,6 @@ static inline void apc_free(struct of_device *op) ...@@ -76,7 +75,6 @@ static inline void apc_free(struct of_device *op)
static int apc_open(struct inode *inode, struct file *f) static int apc_open(struct inode *inode, struct file *f)
{ {
cycle_kernel_lock();
return 0; return 0;
} }
...@@ -87,61 +85,46 @@ static int apc_release(struct inode *inode, struct file *f) ...@@ -87,61 +85,46 @@ static int apc_release(struct inode *inode, struct file *f)
static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg) static long apc_ioctl(struct file *f, unsigned int cmd, unsigned long __arg)
{ {
__u8 inarg, __user *arg; __u8 inarg, __user *arg = (__u8 __user *) __arg;
arg = (__u8 __user *) __arg;
lock_kernel();
switch (cmd) { switch (cmd) {
case APCIOCGFANCTL: case APCIOCGFANCTL:
if (put_user(apc_readb(APC_FANCTL_REG) & APC_REGMASK, arg)) { if (put_user(apc_readb(APC_FANCTL_REG) & APC_REGMASK, arg))
unlock_kernel();
return -EFAULT; return -EFAULT;
}
break; break;
case APCIOCGCPWR: case APCIOCGCPWR:
if (put_user(apc_readb(APC_CPOWER_REG) & APC_REGMASK, arg)) { if (put_user(apc_readb(APC_CPOWER_REG) & APC_REGMASK, arg))
unlock_kernel();
return -EFAULT; return -EFAULT;
}
break; break;
case APCIOCGBPORT: case APCIOCGBPORT:
if (put_user(apc_readb(APC_BPORT_REG) & APC_BPMASK, arg)) { if (put_user(apc_readb(APC_BPORT_REG) & APC_BPMASK, arg))
unlock_kernel();
return -EFAULT; return -EFAULT;
}
break; break;
case APCIOCSFANCTL: case APCIOCSFANCTL:
if (get_user(inarg, arg)) { if (get_user(inarg, arg))
unlock_kernel();
return -EFAULT; return -EFAULT;
}
apc_writeb(inarg & APC_REGMASK, APC_FANCTL_REG); apc_writeb(inarg & APC_REGMASK, APC_FANCTL_REG);
break; break;
case APCIOCSCPWR: case APCIOCSCPWR:
if (get_user(inarg, arg)) { if (get_user(inarg, arg))
unlock_kernel();
return -EFAULT; return -EFAULT;
}
apc_writeb(inarg & APC_REGMASK, APC_CPOWER_REG); apc_writeb(inarg & APC_REGMASK, APC_CPOWER_REG);
break; break;
case APCIOCSBPORT: case APCIOCSBPORT:
if (get_user(inarg, arg)) { if (get_user(inarg, arg))
unlock_kernel();
return -EFAULT; return -EFAULT;
}
apc_writeb(inarg & APC_BPMASK, APC_BPORT_REG); apc_writeb(inarg & APC_BPMASK, APC_BPORT_REG);
break; break;
default: default:
unlock_kernel();
return -EINVAL; return -EINVAL;
}; };
unlock_kernel();
return 0; return 0;
} }
......
...@@ -28,6 +28,7 @@ void __init auxio_probe(void) ...@@ -28,6 +28,7 @@ void __init auxio_probe(void)
struct resource r; struct resource r;
switch (sparc_cpu_model) { switch (sparc_cpu_model) {
case sparc_leon:
case sun4d: case sun4d:
case sun4: case sun4:
return; return;
......
This diff is collapsed.
...@@ -184,6 +184,17 @@ static const struct manufacturer_info __initconst manufacturer_info[] = { ...@@ -184,6 +184,17 @@ static const struct manufacturer_info __initconst manufacturer_info[] = {
FPU(3, "Fujitsu or Weitek on-chip FPU"), FPU(3, "Fujitsu or Weitek on-chip FPU"),
FPU(-1, NULL) FPU(-1, NULL)
} }
},{
0xF, /* Aeroflex Gaisler */
.cpu_info = {
CPU(3, "LEON"),
CPU(-1, NULL)
},
.fpu_info = {
FPU(2, "GRFPU"),
FPU(3, "GRFPU-Lite"),
FPU(-1, NULL)
}
},{ },{
0x17, 0x17,
.cpu_info = { .cpu_info = {
......
...@@ -400,6 +400,39 @@ linux_trap_ipi15_sun4d: ...@@ -400,6 +400,39 @@ linux_trap_ipi15_sun4d:
/* FIXME */ /* FIXME */
1: b,a 1b 1: b,a 1b
#ifdef CONFIG_SPARC_LEON
.globl smpleon_ticker
/* SMP per-cpu ticker interrupts are handled specially. */
smpleon_ticker:
SAVE_ALL
or %l0, PSR_PIL, %g2
wr %g2, 0x0, %psr
WRITE_PAUSE
wr %g2, PSR_ET, %psr
WRITE_PAUSE
call leon_percpu_timer_interrupt
add %sp, STACKFRAME_SZ, %o0
wr %l0, PSR_ET, %psr
WRITE_PAUSE
RESTORE_ALL
.align 4
.globl linux_trap_ipi15_leon
linux_trap_ipi15_leon:
SAVE_ALL
or %l0, PSR_PIL, %l4
wr %l4, 0x0, %psr
WRITE_PAUSE
wr %l4, PSR_ET, %psr
WRITE_PAUSE
call leon_cross_call_irq
nop
b ret_trap_lockless_ipi
clr %l6
#endif /* CONFIG_SPARC_LEON */
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/* This routine handles illegal instructions and privileged /* This routine handles illegal instructions and privileged
......
...@@ -811,8 +811,30 @@ found_version: ...@@ -811,8 +811,30 @@ found_version:
got_prop: got_prop:
#ifdef CONFIG_SPARC_LEON #ifdef CONFIG_SPARC_LEON
/* no cpu-type check is needed, it is a SPARC-LEON */ /* no cpu-type check is needed, it is a SPARC-LEON */
#ifdef CONFIG_SMP
ba leon_smp_init
nop
.global leon_smp_init
leon_smp_init:
sethi %hi(boot_cpu_id), %g1 ! master always 0
stb %g0, [%g1 + %lo(boot_cpu_id)]
sethi %hi(boot_cpu_id4), %g1 ! master always 0
stb %g0, [%g1 + %lo(boot_cpu_id4)]
rd %asr17,%g1
srl %g1,28,%g1
cmp %g0,%g1
beq sun4c_continue_boot !continue with master
nop
ba leon_smp_cpu_startup
nop
#else
ba sun4c_continue_boot ba sun4c_continue_boot
nop nop
#endif
#endif #endif
set cputypval, %o2 set cputypval, %o2
ldub [%o2 + 0x4], %l1 ldub [%o2 + 0x4], %l1
......
...@@ -48,8 +48,13 @@ ...@@ -48,8 +48,13 @@
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/io-unit.h> #include <asm/io-unit.h>
#include <asm/leon.h>
#ifdef CONFIG_SPARC_LEON
#define mmu_inval_dma_area(p, l) leon_flush_dcache_all()
#else
#define mmu_inval_dma_area(p, l) /* Anton pulled it out for 2.4.0-xx */ #define mmu_inval_dma_area(p, l) /* Anton pulled it out for 2.4.0-xx */
#endif
static struct resource *_sparc_find_resource(struct resource *r, static struct resource *_sparc_find_resource(struct resource *r,
unsigned long); unsigned long);
......
...@@ -187,7 +187,7 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -187,7 +187,7 @@ int show_interrupts(struct seq_file *p, void *v)
for_each_online_cpu(j) for_each_online_cpu(j)
seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
#endif #endif
seq_printf(p, " %9s", irq_desc[i].chip->typename); seq_printf(p, " %9s", irq_desc[i].chip->name);
seq_printf(p, " %s", action->name); seq_printf(p, " %s", action->name);
for (action=action->next; action; action = action->next) for (action=action->next; action; action = action->next)
...@@ -484,7 +484,7 @@ static void sun4v_virq_eoi(unsigned int virt_irq) ...@@ -484,7 +484,7 @@ static void sun4v_virq_eoi(unsigned int virt_irq)
} }
static struct irq_chip sun4u_irq = { static struct irq_chip sun4u_irq = {
.typename = "sun4u", .name = "sun4u",
.enable = sun4u_irq_enable, .enable = sun4u_irq_enable,
.disable = sun4u_irq_disable, .disable = sun4u_irq_disable,
.eoi = sun4u_irq_eoi, .eoi = sun4u_irq_eoi,
...@@ -492,7 +492,7 @@ static struct irq_chip sun4u_irq = { ...@@ -492,7 +492,7 @@ static struct irq_chip sun4u_irq = {
}; };
static struct irq_chip sun4v_irq = { static struct irq_chip sun4v_irq = {
.typename = "sun4v", .name = "sun4v",
.enable = sun4v_irq_enable, .enable = sun4v_irq_enable,
.disable = sun4v_irq_disable, .disable = sun4v_irq_disable,
.eoi = sun4v_irq_eoi, .eoi = sun4v_irq_eoi,
...@@ -500,7 +500,7 @@ static struct irq_chip sun4v_irq = { ...@@ -500,7 +500,7 @@ static struct irq_chip sun4v_irq = {
}; };
static struct irq_chip sun4v_virq = { static struct irq_chip sun4v_virq = {
.typename = "vsun4v", .name = "vsun4v",
.enable = sun4v_virq_enable, .enable = sun4v_virq_enable,
.disable = sun4v_virq_disable, .disable = sun4v_virq_disable,
.eoi = sun4v_virq_eoi, .eoi = sun4v_virq_eoi,
......
...@@ -12,11 +12,14 @@ ...@@ -12,11 +12,14 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/timer.h> #include <asm/timer.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/leon.h> #include <asm/leon.h>
#include <asm/leon_amba.h> #include <asm/leon_amba.h>
#include <asm/traps.h>
#include <asm/cacheflush.h>
#include "prom.h" #include "prom.h"
#include "irq.h" #include "irq.h"
...@@ -115,6 +118,21 @@ void __init leon_init_timers(irq_handler_t counter_fn) ...@@ -115,6 +118,21 @@ void __init leon_init_timers(irq_handler_t counter_fn)
(((1000000 / 100) - 1))); (((1000000 / 100) - 1)));
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, 0); LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, 0);
#ifdef CONFIG_SMP
leon_percpu_timer_dev[0].start = (int)leon3_gptimer_regs;
leon_percpu_timer_dev[0].irq = leon3_gptimer_irq+1;
if (!(LEON3_BYPASS_LOAD_PA(&leon3_gptimer_regs->config) &
(1<<LEON3_GPTIMER_SEPIRQ))) {
prom_printf("irq timer not configured with seperate irqs \n");
BUG();
}
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].val, 0);
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].rld, (((1000000/100) - 1)));
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].ctrl, 0);
# endif
} else { } else {
printk(KERN_ERR "No Timer/irqctrl found\n"); printk(KERN_ERR "No Timer/irqctrl found\n");
BUG(); BUG();
...@@ -130,11 +148,41 @@ void __init leon_init_timers(irq_handler_t counter_fn) ...@@ -130,11 +148,41 @@ void __init leon_init_timers(irq_handler_t counter_fn)
prom_halt(); prom_halt();
} }
# ifdef CONFIG_SMP
{
unsigned long flags;
struct tt_entry *trap_table = &sparc_ttable[SP_TRAP_IRQ1 + (leon_percpu_timer_dev[0].irq - 1)];
/* For SMP we use the level 14 ticker, however the bootup code
* has copied the firmwares level 14 vector into boot cpu's
* trap table, we must fix this now or we get squashed.
*/
local_irq_save(flags);
patchme_maybe_smp_msg[0] = 0x01000000; /* NOP out the branch */
/* Adjust so that we jump directly to smpleon_ticker */
trap_table->inst_three += smpleon_ticker - real_irq_entry;
local_flush_cache_all();
local_irq_restore(flags);
}
# endif
if (leon3_gptimer_regs) { if (leon3_gptimer_regs) {
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl,
LEON3_GPTIMER_EN | LEON3_GPTIMER_EN |
LEON3_GPTIMER_RL | LEON3_GPTIMER_RL |
LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN); LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN);
#ifdef CONFIG_SMP
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].ctrl,
LEON3_GPTIMER_EN |
LEON3_GPTIMER_RL |
LEON3_GPTIMER_LD |
LEON3_GPTIMER_IRQEN);
#endif
} }
} }
...@@ -175,6 +223,42 @@ void __init leon_node_init(struct device_node *dp, struct device_node ***nextp) ...@@ -175,6 +223,42 @@ void __init leon_node_init(struct device_node *dp, struct device_node ***nextp)
} }
} }
#ifdef CONFIG_SMP
void leon_set_cpu_int(int cpu, int level)
{
unsigned long mask;
mask = get_irqmask(level);
LEON3_BYPASS_STORE_PA(&leon3_irqctrl_regs->force[cpu], mask);
}
static void leon_clear_ipi(int cpu, int level)
{
unsigned long mask;
mask = get_irqmask(level);
LEON3_BYPASS_STORE_PA(&leon3_irqctrl_regs->force[cpu], mask<<16);
}
static void leon_set_udt(int cpu)
{
}
void leon_clear_profile_irq(int cpu)
{
}
void leon_enable_irq_cpu(unsigned int irq_nr, unsigned int cpu)
{
unsigned long mask, flags, *addr;
mask = get_irqmask(irq_nr);
local_irq_save(flags);
addr = (unsigned long *)&(leon3_irqctrl_regs->mask[cpu]);
LEON3_BYPASS_STORE_PA(addr, (LEON3_BYPASS_LOAD_PA(addr) | (mask)));
local_irq_restore(flags);
}
#endif
void __init leon_init_IRQ(void) void __init leon_init_IRQ(void)
{ {
sparc_init_timers = leon_init_timers; sparc_init_timers = leon_init_timers;
......
This diff is collapsed.
...@@ -112,7 +112,7 @@ static void free_msi(struct pci_pbm_info *pbm, int msi_num) ...@@ -112,7 +112,7 @@ static void free_msi(struct pci_pbm_info *pbm, int msi_num)
} }
static struct irq_chip msi_irq = { static struct irq_chip msi_irq = {
.typename = "PCI-MSI", .name = "PCI-MSI",
.mask = mask_msi_irq, .mask = mask_msi_irq,
.unmask = unmask_msi_irq, .unmask = unmask_msi_irq,
.enable = unmask_msi_irq, .enable = unmask_msi_irq,
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mmu.h> #include <asm/mmu.h>
#include <asm/ns87303.h> #include <asm/ns87303.h>
#include <asm/btext.h>
#ifdef CONFIG_IP_PNP #ifdef CONFIG_IP_PNP
#include <net/ipconfig.h> #include <net/ipconfig.h>
...@@ -286,6 +287,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -286,6 +287,9 @@ void __init setup_arch(char **cmdline_p)
parse_early_param(); parse_early_param();
boot_flags_init(*cmdline_p); boot_flags_init(*cmdline_p);
#ifdef CONFIG_EARLYFB
if (btext_find_display())
#endif
register_console(&prom_early_console); register_console(&prom_early_console);
if (tlb_type == hypervisor) if (tlb_type == hypervisor)
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/cpudata.h> #include <asm/cpudata.h>
#include <asm/leon.h>
#include "irq.h" #include "irq.h"
...@@ -96,6 +97,9 @@ void __init smp_cpus_done(unsigned int max_cpus) ...@@ -96,6 +97,9 @@ void __init smp_cpus_done(unsigned int max_cpus)
case sun4d: case sun4d:
smp4d_smp_done(); smp4d_smp_done();
break; break;
case sparc_leon:
leon_smp_done();
break;
case sun4e: case sun4e:
printk("SUN4E\n"); printk("SUN4E\n");
BUG(); BUG();
...@@ -306,6 +310,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -306,6 +310,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
case sun4d: case sun4d:
smp4d_boot_cpus(); smp4d_boot_cpus();
break; break;
case sparc_leon:
leon_boot_cpus();
break;
case sun4e: case sun4e:
printk("SUN4E\n"); printk("SUN4E\n");
BUG(); BUG();
...@@ -376,6 +383,9 @@ int __cpuinit __cpu_up(unsigned int cpu) ...@@ -376,6 +383,9 @@ int __cpuinit __cpu_up(unsigned int cpu)
case sun4d: case sun4d:
ret = smp4d_boot_one_cpu(cpu); ret = smp4d_boot_one_cpu(cpu);
break; break;
case sparc_leon:
ret = leon_boot_one_cpu(cpu);
break;
case sun4e: case sun4e:
printk("SUN4E\n"); printk("SUN4E\n");
BUG(); BUG();
......
...@@ -26,11 +26,6 @@ ...@@ -26,11 +26,6 @@
#include <linux/nfs_fs.h> #include <linux/nfs_fs.h>
#include <linux/quota.h> #include <linux/quota.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/sunrpc/svc.h>
#include <linux/nfsd/nfsd.h>
#include <linux/nfsd/cache.h>
#include <linux/nfsd/xdr.h>
#include <linux/nfsd/syscall.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/stat.h> #include <linux/stat.h>
......
...@@ -210,9 +210,6 @@ static void __init sbus_time_init(void) ...@@ -210,9 +210,6 @@ static void __init sbus_time_init(void)
btfixup(); btfixup();
sparc_init_timers(timer_interrupt); sparc_init_timers(timer_interrupt);
/* Now that OBP ticker has been silenced, it is safe to enable IRQ. */
local_irq_enable();
} }
void __init time_init(void) void __init time_init(void)
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <asm/contregs.h> #include <asm/contregs.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
.globl sun4m_cpu_startup, __smp4m_processor_id .globl sun4m_cpu_startup, __smp4m_processor_id, __leon_processor_id
.globl sun4d_cpu_startup, __smp4d_processor_id .globl sun4d_cpu_startup, __smp4d_processor_id
__CPUINIT __CPUINIT
...@@ -106,6 +106,12 @@ __smp4d_processor_id: ...@@ -106,6 +106,12 @@ __smp4d_processor_id:
retl retl
mov %g1, %o7 mov %g1, %o7
__leon_processor_id:
rd %asr17,%g2
srl %g2,28,%g2
retl
mov %g1, %o7
/* CPUID in bootbus can be found at PA 0xff0140000 */ /* CPUID in bootbus can be found at PA 0xff0140000 */
#define SUN4D_BOOTBUS_CPUID 0xf0140000 #define SUN4D_BOOTBUS_CPUID 0xf0140000
...@@ -160,3 +166,64 @@ sun4d_cpu_startup: ...@@ -160,3 +166,64 @@ sun4d_cpu_startup:
nop nop
b,a smp_do_cpu_idle b,a smp_do_cpu_idle
#ifdef CONFIG_SPARC_LEON
__CPUINIT
.align 4
.global leon_smp_cpu_startup, smp_penguin_ctable
leon_smp_cpu_startup:
set smp_penguin_ctable,%g1
ld [%g1+4],%g1
srl %g1,4,%g1
set 0x00000100,%g5 /* SRMMU_CTXTBL_PTR */
sta %g1, [%g5] ASI_M_MMUREGS
/* Set up a sane %psr -- PIL<0xf> S<0x1> PS<0x1> CWP<0x0> */
set (PSR_PIL | PSR_S | PSR_PS), %g1
wr %g1, 0x0, %psr ! traps off though
WRITE_PAUSE
/* Our %wim is one behind CWP */
mov 2, %g1
wr %g1, 0x0, %wim
WRITE_PAUSE
/* Set tbr - we use just one trap table. */
set trapbase, %g1
wr %g1, 0x0, %tbr
WRITE_PAUSE
/* Get our CPU id */
rd %asr17,%g3
/* Give ourselves a stack and curptr. */
set current_set, %g5
srl %g3, 28, %g4
sll %g4, 2, %g4
ld [%g5 + %g4], %g6
sethi %hi(THREAD_SIZE - STACKFRAME_SZ), %sp
or %sp, %lo(THREAD_SIZE - STACKFRAME_SZ), %sp
add %g6, %sp, %sp
/* Turn on traps (PSR_ET). */
rd %psr, %g1
wr %g1, PSR_ET, %psr ! traps on
WRITE_PAUSE
/* Init our caches, etc. */
set poke_srmmu, %g5
ld [%g5], %g5
call %g5
nop
/* Start this processor. */
call leon_callin
nop
b,a smp_do_cpu_idle
#endif
...@@ -1990,7 +1990,7 @@ void __init poke_leonsparc(void) ...@@ -1990,7 +1990,7 @@ void __init poke_leonsparc(void)
void __init init_leon(void) void __init init_leon(void)
{ {
srmmu_name = "Leon"; srmmu_name = "LEON";
BTFIXUPSET_CALL(flush_cache_all, leon_flush_cache_all, BTFIXUPSET_CALL(flush_cache_all, leon_flush_cache_all,
BTFIXUPCALL_NORM); BTFIXUPCALL_NORM);
...@@ -2037,8 +2037,6 @@ static void __init get_srmmu_type(void) ...@@ -2037,8 +2037,6 @@ static void __init get_srmmu_type(void)
/* First, check for sparc-leon. */ /* First, check for sparc-leon. */
if (sparc_cpu_model == sparc_leon) { if (sparc_cpu_model == sparc_leon) {
psr_typ = 0xf; /* hardcoded ids for older models/simulators */
psr_vers = 2;
init_leon(); init_leon();
return; return;
} }
...@@ -2301,7 +2299,8 @@ void __init ld_mmu_srmmu(void) ...@@ -2301,7 +2299,8 @@ void __init ld_mmu_srmmu(void)
BTFIXUPSET_CALL(flush_cache_mm, smp_flush_cache_mm, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(flush_cache_mm, smp_flush_cache_mm, BTFIXUPCALL_NORM);
BTFIXUPSET_CALL(flush_cache_range, smp_flush_cache_range, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(flush_cache_range, smp_flush_cache_range, BTFIXUPCALL_NORM);
BTFIXUPSET_CALL(flush_cache_page, smp_flush_cache_page, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(flush_cache_page, smp_flush_cache_page, BTFIXUPCALL_NORM);
if (sparc_cpu_model != sun4d) { if (sparc_cpu_model != sun4d &&
sparc_cpu_model != sparc_leon) {
BTFIXUPSET_CALL(flush_tlb_all, smp_flush_tlb_all, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(flush_tlb_all, smp_flush_tlb_all, BTFIXUPCALL_NORM);
BTFIXUPSET_CALL(flush_tlb_mm, smp_flush_tlb_mm, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(flush_tlb_mm, smp_flush_tlb_mm, BTFIXUPCALL_NORM);
BTFIXUPSET_CALL(flush_tlb_range, smp_flush_tlb_range, BTFIXUPCALL_NORM); BTFIXUPSET_CALL(flush_tlb_range, smp_flush_tlb_range, BTFIXUPCALL_NORM);
...@@ -2330,6 +2329,8 @@ void __init ld_mmu_srmmu(void) ...@@ -2330,6 +2329,8 @@ void __init ld_mmu_srmmu(void)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (sparc_cpu_model == sun4d) if (sparc_cpu_model == sun4d)
sun4d_init_smp(); sun4d_init_smp();
else if (sparc_cpu_model == sparc_leon)
leon_init_smp();
else else
sun4m_init_smp(); sun4m_init_smp();
#endif #endif
......
...@@ -1477,4 +1477,17 @@ config SERIAL_BCM63XX_CONSOLE ...@@ -1477,4 +1477,17 @@ config SERIAL_BCM63XX_CONSOLE
If you have enabled the serial port on the bcm63xx CPU If you have enabled the serial port on the bcm63xx CPU
you can make it the console by answering Y to this option. you can make it the console by answering Y to this option.
config SERIAL_GRLIB_GAISLER_APBUART
tristate "GRLIB APBUART serial support"
depends on OF
---help---
Add support for the GRLIB APBUART serial port.
config SERIAL_GRLIB_GAISLER_APBUART_CONSOLE
bool "Console on GRLIB APBUART serial port"
depends on SERIAL_GRLIB_GAISLER_APBUART=y
select SERIAL_CORE_CONSOLE
help
Support for running a console on the GRLIB APBUART
endmenu endmenu
...@@ -81,3 +81,4 @@ obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o ...@@ -81,3 +81,4 @@ obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o
obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
obj-$(CONFIG_SERIAL_QE) += ucc_uart.o obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
obj-$(CONFIG_SERIAL_TIMBERDALE) += timbuart.o obj-$(CONFIG_SERIAL_TIMBERDALE) += timbuart.o
obj-$(CONFIG_SERIAL_GRLIB_GAISLER_APBUART) += apbuart.o
This diff is collapsed.
#ifndef __GRLIB_APBUART_H__
#define __GRLIB_APBUART_H__
#include <asm/io.h>
#define UART_NR 8
static int grlib_apbuart_port_nr;
struct grlib_apbuart_regs_map {
u32 data;
u32 status;
u32 ctrl;
u32 scaler;
};
struct amba_prom_registers {
unsigned int phys_addr;
unsigned int reg_size;
};
/*
* The following defines the bits in the APBUART Status Registers.
*/
#define UART_STATUS_DR 0x00000001 /* Data Ready */
#define UART_STATUS_TSE 0x00000002 /* TX Send Register Empty */
#define UART_STATUS_THE 0x00000004 /* TX Hold Register Empty */
#define UART_STATUS_BR 0x00000008 /* Break Error */
#define UART_STATUS_OE 0x00000010 /* RX Overrun Error */
#define UART_STATUS_PE 0x00000020 /* RX Parity Error */
#define UART_STATUS_FE 0x00000040 /* RX Framing Error */
#define UART_STATUS_ERR 0x00000078 /* Error Mask */
/*
* The following defines the bits in the APBUART Ctrl Registers.
*/
#define UART_CTRL_RE 0x00000001 /* Receiver enable */
#define UART_CTRL_TE 0x00000002 /* Transmitter enable */
#define UART_CTRL_RI 0x00000004 /* Receiver interrupt enable */
#define UART_CTRL_TI 0x00000008 /* Transmitter irq */
#define UART_CTRL_PS 0x00000010 /* Parity select */
#define UART_CTRL_PE 0x00000020 /* Parity enable */
#define UART_CTRL_FL 0x00000040 /* Flow control enable */
#define UART_CTRL_LB 0x00000080 /* Loopback enable */
#define APBBASE(port) ((struct grlib_apbuart_regs_map *)((port)->membase))
#define APBBASE_DATA_P(port) (&(APBBASE(port)->data))
#define APBBASE_STATUS_P(port) (&(APBBASE(port)->status))
#define APBBASE_CTRL_P(port) (&(APBBASE(port)->ctrl))
#define APBBASE_SCALAR_P(port) (&(APBBASE(port)->scaler))
#define UART_GET_CHAR(port) (__raw_readl(APBBASE_DATA_P(port)))
#define UART_PUT_CHAR(port, v) (__raw_writel(v, APBBASE_DATA_P(port)))
#define UART_GET_STATUS(port) (__raw_readl(APBBASE_STATUS_P(port)))
#define UART_PUT_STATUS(port, v)(__raw_writel(v, APBBASE_STATUS_P(port)))
#define UART_GET_CTRL(port) (__raw_readl(APBBASE_CTRL_P(port)))
#define UART_PUT_CTRL(port, v) (__raw_writel(v, APBBASE_CTRL_P(port)))
#define UART_GET_SCAL(port) (__raw_readl(APBBASE_SCALAR_P(port)))
#define UART_PUT_SCAL(port, v) (__raw_writel(v, APBBASE_SCALAR_P(port)))
#define UART_RX_DATA(s) (((s) & UART_STATUS_DR) != 0)
#define UART_TX_READY(s) (((s) & UART_STATUS_THE) != 0)
#endif /* __GRLIB_APBUART_H__ */
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/miscdevice.h> #include <linux/miscdevice.h>
#include <linux/smp_lock.h>
#include <linux/watchdog.h> #include <linux/watchdog.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h> #include <linux/of_device.h>
...@@ -75,7 +74,6 @@ static void riowd_writereg(struct riowd *p, u8 val, int index) ...@@ -75,7 +74,6 @@ static void riowd_writereg(struct riowd *p, u8 val, int index)
static int riowd_open(struct inode *inode, struct file *filp) static int riowd_open(struct inode *inode, struct file *filp)
{ {
cycle_kernel_lock();
nonseekable_open(inode, filp); nonseekable_open(inode, filp);
return 0; return 0;
} }
...@@ -194,6 +192,8 @@ static int __devinit riowd_probe(struct of_device *op, ...@@ -194,6 +192,8 @@ static int __devinit riowd_probe(struct of_device *op,
printk(KERN_ERR PFX "Cannot map registers.\n"); printk(KERN_ERR PFX "Cannot map registers.\n");
goto out_free; goto out_free;
} }
/* Make miscdev useable right away */
riowd_device = p;
err = misc_register(&riowd_miscdev); err = misc_register(&riowd_miscdev);
if (err) { if (err) {
...@@ -205,10 +205,10 @@ static int __devinit riowd_probe(struct of_device *op, ...@@ -205,10 +205,10 @@ static int __devinit riowd_probe(struct of_device *op,
"regs at %p\n", riowd_timeout, p->regs); "regs at %p\n", riowd_timeout, p->regs);
dev_set_drvdata(&op->dev, p); dev_set_drvdata(&op->dev, p);
riowd_device = p;
return 0; return 0;
out_iounmap: out_iounmap:
riowd_device = NULL;
of_iounmap(&op->resource[0], p->regs, 2); of_iounmap(&op->resource[0], p->regs, 2);
out_free: out_free:
......
...@@ -179,6 +179,9 @@ ...@@ -179,6 +179,9 @@
/* BCM63xx family SoCs */ /* BCM63xx family SoCs */
#define PORT_BCM63XX 89 #define PORT_BCM63XX 89
/* Aeroflex Gaisler GRLIB APBUART */
#define PORT_APBUART 90
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <linux/compiler.h> #include <linux/compiler.h>
......
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