Skip to content

Commit

Permalink
[MIPS] PMC MSP71xx mips common
Browse files Browse the repository at this point in the history
Patch to add mips common support for the PMC-Sierra MSP71xx devices.

Signed-off-by: Marc St-Jean <Marc_St-Jean@pmc-sierra.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
Marc St-Jean authored and Ralf Baechle committed Jul 10, 2007
1 parent 35832e2 commit 9267a30
Show file tree
Hide file tree
Showing 10 changed files with 179 additions and 2 deletions.
35 changes: 35 additions & 0 deletions arch/mips/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,7 @@ config MIPS_SIM
select DMA_NONCOHERENT
select SYS_HAS_EARLY_PRINTK
select IRQ_CPU
select BOOT_RAW
select SYS_HAS_CPU_MIPS32_R1
select SYS_HAS_CPU_MIPS32_R2
select SYS_HAS_EARLY_PRINTK
Expand Down Expand Up @@ -333,6 +334,27 @@ config MACH_VR41XX
select SYS_HAS_CPU_VR41XX
select GENERIC_HARDIRQS_NO__DO_IRQ

config PMC_MSP
bool "PMC-Sierra MSP chipsets"
depends on EXPERIMENTAL
select DMA_NONCOHERENT
select SWAP_IO_SPACE
select NO_EXCEPT_FILL
select BOOT_RAW
select SYS_HAS_CPU_MIPS32_R1
select SYS_HAS_CPU_MIPS32_R2
select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_BIG_ENDIAN
select SYS_SUPPORTS_KGDB
select IRQ_CPU
select SERIAL_8250
select SERIAL_8250_CONSOLE
help
This adds support for the PMC-Sierra family of Multi-Service
Processor System-On-A-Chips. These parts include a number
of integrated peripherals, interfaces and DSPs in addition to
a variety of MIPS cores.

config PMC_YOSEMITE
bool "PMC-Sierra Yosemite eval board"
select DMA_COHERENT
Expand Down Expand Up @@ -706,6 +728,9 @@ config ARC
config ARCH_MAY_HAVE_PC_FDC
bool

config BOOT_RAW
bool

config DMA_COHERENT
bool

Expand Down Expand Up @@ -812,6 +837,12 @@ config IRQ_CPU_RM7K
config IRQ_CPU_RM9K
bool

config IRQ_MSP_SLP
bool

config IRQ_MSP_CIC
bool

config IRQ_MV64340
bool

Expand All @@ -825,6 +856,9 @@ config MIPS_BOARDS_GEN
config PCI_GT64XXX_PCI0
bool

config NO_EXCEPT_FILL
bool

config MIPS_TX3927
bool
select HAS_TXX9_SERIAL
Expand Down Expand Up @@ -886,6 +920,7 @@ config MIPS_L1_CACHE_SHIFT
int
default "4" if MACH_DECSTATION || SNI_RM
default "7" if SGI_IP27
default "4" if PMC_MSP4200_EVAL
default "5"

config HAVE_STD_PC_SERIAL_PORT
Expand Down
11 changes: 10 additions & 1 deletion arch/mips/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,14 @@ core-$(CONFIG_MOMENCO_OCELOT) += arch/mips/gt64120/common/ \
cflags-$(CONFIG_MOMENCO_OCELOT) += -Iinclude/asm-mips/mach-ocelot
load-$(CONFIG_MOMENCO_OCELOT) += 0xffffffff80100000

#
# PMC-Sierra MSP SOCs
#
core-$(CONFIG_PMC_MSP) += arch/mips/pmc-sierra/msp71xx/
cflags-$(CONFIG_PMC_MSP) += -Iinclude/asm-mips/pmc-sierra/msp71xx \
-mno-branch-likely
load-$(CONFIG_PMC_MSP) += 0xffffffff80100000

#
# PMC-Sierra Yosemite
#
Expand Down Expand Up @@ -595,7 +603,8 @@ JIFFIES = jiffies_64
endif

AFLAGS += $(cflags-y)
CFLAGS += $(cflags-y)
CFLAGS += $(cflags-y) \
-D"VMLINUX_LOAD_ADDRESS=$(load-y)"

LDFLAGS += -m $(ld-emul)

Expand Down
20 changes: 20 additions & 0 deletions arch/mips/kernel/cpu-probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,9 +186,29 @@ static inline void check_wait(void)
}
}

static inline void check_errata(void)
{
struct cpuinfo_mips *c = &current_cpu_data;

switch (c->cputype) {
case CPU_34K:
/*
* Erratum "RPS May Cause Incorrect Instruction Execution"
* This code only handles VPE0, any SMP/SMTC/RTOS code
* making use of VPE1 will be responsable for that VPE.
*/
if ((c->processor_id & PRID_REV_MASK) <= PRID_REV_34K_V1_0_2)
write_c0_config7(read_c0_config7() | MIPS_CONF7_RPS);
break;
default:
break;
}
}

void __init check_bugs32(void)
{
check_wait();
check_errata();
}

/*
Expand Down
5 changes: 4 additions & 1 deletion arch/mips/kernel/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include <linux/init.h>
#include <linux/threads.h>

#include <asm/addrspace.h>
#include <asm/asm.h>
#include <asm/asmmacro.h>
#include <asm/irqflags.h>
Expand Down Expand Up @@ -129,16 +130,18 @@
#endif
.endm

#ifndef CONFIG_NO_EXCEPT_FILL
/*
* Reserved space for exception handlers.
* Necessary for machines which link their kernels at KSEG0.
*/
.fill 0x400
#endif

EXPORT(stext) # used for profiling
EXPORT(_stext)

#ifndef CONFIG_MIPS_SIM
#ifdef CONFIG_BOOT_RAW
/*
* Give us a fighting chance of running if execution beings at the
* kernel load address. This is needed because this platform does
Expand Down
6 changes: 6 additions & 0 deletions arch/mips/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ extern asmlinkage void handle_reserved(void);
extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
struct mips_fpu_struct *ctx, int has_fpu);

void (*board_watchpoint_handler)(struct pt_regs *regs);
void (*board_be_init)(void);
int (*board_be_handler)(struct pt_regs *regs, int is_fixup);
void (*board_nmi_handler_setup)(void);
Expand Down Expand Up @@ -833,6 +834,11 @@ asmlinkage void do_mdmx(struct pt_regs *regs)

asmlinkage void do_watch(struct pt_regs *regs)
{
if (board_watchpoint_handler) {
(*board_watchpoint_handler)(regs);
return;
}

/*
* We use the watch exception where available to detect stack
* overflows.
Expand Down
46 changes: 46 additions & 0 deletions arch/mips/pmc-sierra/Kconfig
Original file line number Diff line number Diff line change
@@ -1,3 +1,49 @@
choice
prompt "PMC-Sierra MSP SOC type"
depends on PMC_MSP

config PMC_MSP4200_EVAL
bool "PMC-Sierra MSP4200 Eval Board"
select IRQ_MSP_SLP
select HW_HAS_PCI

config PMC_MSP4200_GW
bool "PMC-Sierra MSP4200 VoIP Gateway"
select IRQ_MSP_SLP
select HW_HAS_PCI

config PMC_MSP7120_EVAL
bool "PMC-Sierra MSP7120 Eval Board"
select SYS_SUPPORTS_MULTITHREADING
select IRQ_MSP_CIC
select HW_HAS_PCI

config PMC_MSP7120_GW
bool "PMC-Sierra MSP7120 Residential Gateway"
select SYS_SUPPORTS_MULTITHREADING
select IRQ_MSP_CIC
select HW_HAS_PCI

config PMC_MSP7120_FPGA
bool "PMC-Sierra MSP7120 FPGA"
select SYS_SUPPORTS_MULTITHREADING
select IRQ_MSP_CIC
select HW_HAS_PCI

endchoice

menu "Options for PMC-Sierra MSP chipsets"
depends on PMC_MSP

config PMC_MSP_EMBEDDED_ROOTFS
bool "Root filesystem embedded in kernel image"
select MTD
select MTD_BLOCK
select MTD_PMC_MSP_RAMROOT
select MTD_RAM

endmenu

config HYPERTRANSPORT
bool "Hypertransport Support for PMC-Sierra Yosemite"
depends on PMC_YOSEMITE
12 changes: 12 additions & 0 deletions include/asm-mips/bootinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,18 @@
#define MACH_GROUP_LEMOTE 27
#define MACH_LEMOTE_FULONG 0

/*
* Valid machtype for group PMC-MSP
*/
#define MACH_GROUP_MSP 26 /* PMC-Sierra MSP boards/CPUs */
#define MACH_MSP4200_EVAL 0 /* PMC-Sierra MSP4200 Evaluation */
#define MACH_MSP4200_GW 1 /* PMC-Sierra MSP4200 Gateway demo */
#define MACH_MSP4200_FPGA 2 /* PMC-Sierra MSP4200 Emulation */
#define MACH_MSP7120_EVAL 3 /* PMC-Sierra MSP7120 Evaluation */
#define MACH_MSP7120_GW 4 /* PMC-Sierra MSP7120 Residential GW */
#define MACH_MSP7120_FPGA 5 /* PMC-Sierra MSP7120 Emulation */
#define MACH_MSP_OTHER 255 /* PMC-Sierra unknown board type */

#define CL_SIZE COMMAND_LINE_SIZE

const char *get_system_type(void);
Expand Down
2 changes: 2 additions & 0 deletions include/asm-mips/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
* Definitions for 7:0 on legacy processors
*/

#define PRID_REV_MASK 0x00ff

#define PRID_REV_TX4927 0x0022
#define PRID_REV_TX4937 0x0030
Expand All @@ -125,6 +126,7 @@
#define PRID_REV_VR4122 0x0070
#define PRID_REV_VR4181A 0x0070 /* Same as VR4122 */
#define PRID_REV_VR4130 0x0080
#define PRID_REV_34K_V1_0_2 0x0022

/*
* Older processors used to encode processor version and revision in two
Expand Down
33 changes: 33 additions & 0 deletions include/asm-mips/mipsregs.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

#include <linux/linkage.h>
#include <asm/hazards.h>
#include <asm/war.h>

/*
* The following macros are especially useful for __asm__
Expand Down Expand Up @@ -537,6 +538,9 @@

#define MIPS_CONF7_WII (_ULCAST_(1) << 31)

#define MIPS_CONF7_RPS (_ULCAST_(1) << 2)


/*
* Bits in the MIPS32/64 coprocessor 1 (FPU) revision register.
*/
Expand Down Expand Up @@ -1298,10 +1302,39 @@ static inline void tlb_probe(void)

static inline void tlb_read(void)
{
#if MIPS34K_MISSED_ITLB_WAR
int res = 0;

__asm__ __volatile__(
" .set push \n"
" .set noreorder \n"
" .set noat \n"
" .set mips32r2 \n"
" .word 0x41610001 # dvpe $1 \n"
" move %0, $1 \n"
" ehb \n"
" .set pop \n"
: "=r" (res));

instruction_hazard();
#endif

__asm__ __volatile__(
".set noreorder\n\t"
"tlbr\n\t"
".set reorder");

#if MIPS34K_MISSED_ITLB_WAR
if ((res & _ULCAST_(1)))
__asm__ __volatile__(
" .set push \n"
" .set noreorder \n"
" .set noat \n"
" .set mips32r2 \n"
" .word 0x41600021 # evpe \n"
" ehb \n"
" .set pop \n");
#endif
}

static inline void tlb_write_indexed(void)
Expand Down
11 changes: 11 additions & 0 deletions include/asm-mips/war.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,14 @@
#define R10000_LLSC_WAR 1
#endif

/*
* 34K core erratum: "Problems Executing the TLBR Instruction"
*/
#if defined(CONFIG_PMC_MSP7120_EVAL) || defined(CONFIG_PMC_MSP7120_GW) || \
defined(CONFIG_PMC_MSP7120_FPGA)
#define MIPS34K_MISSED_ITLB_WAR 1
#endif

/*
* Workarounds default to off
*/
Expand Down Expand Up @@ -236,5 +244,8 @@
#ifndef R10000_LLSC_WAR
#define R10000_LLSC_WAR 0
#endif
#ifndef MIPS34K_MISSED_ITLB_WAR
#define MIPS34K_MISSED_ITLB_WAR 0
#endif

#endif /* _ASM_WAR_H */

0 comments on commit 9267a30

Please sign in to comment.