]> err.no Git - linux-2.6/commitdiff
[MIPS] PMC MSP71xx mips common
authorMarc St-Jean <stjeanma@pmc-sierra.com>
Thu, 14 Jun 2007 21:55:31 +0000 (15:55 -0600)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 10 Jul 2007 16:33:03 +0000 (17:33 +0100)
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>
arch/mips/Kconfig
arch/mips/Makefile
arch/mips/kernel/cpu-probe.c
arch/mips/kernel/head.S
arch/mips/kernel/traps.c
arch/mips/pmc-sierra/Kconfig
include/asm-mips/bootinfo.h
include/asm-mips/cpu.h
include/asm-mips/mipsregs.h
include/asm-mips/war.h

index 3994f611ec2673ed25c2d2e3012f94568d19b0f5..2076d472ea99ae79e1e4b855ab44996b8eba2242 100644 (file)
@@ -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
@@ -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
@@ -706,6 +728,9 @@ config ARC
 config ARCH_MAY_HAVE_PC_FDC
        bool
 
+config BOOT_RAW
+       bool
+
 config DMA_COHERENT
        bool
 
@@ -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
 
@@ -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
@@ -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
index 6642ee5fdc46942cdd85eb34aafb9d6c1809e0d5..2b9af2fd55079938684f4f3a885c16523b6b9186 100644 (file)
@@ -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
 #
@@ -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)
 
index 23d8a3b7dd7556d60612efd83f781811a877bee7..c6b8b074a81aa65fad1fa9d0ce3aede09bff8ef5 100644 (file)
@@ -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();
 }
 
 /*
index 1f096aa35bc093e9b621681a0a4168b84d68476b..f78538eceef77c903bf393b20256ce7b2a5552a7 100644 (file)
@@ -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>
 #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
index 9b19a84d11ef2f006aedab7f66edc5901860a26c..80ea4fa95bd9b121b4b201e65f74e12b29dbb948 100644 (file)
@@ -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);
@@ -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.
index 24d514c9dff98a3970d969d7ac747cefcc26ebc7..abbd0bbfabd7ba9e93452727eb5a4f397244d625 100644 (file)
@@ -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
index 12f9d7139ebf978419a09ea7c98663e9cad2aa27..94fc9be1aab653530efd676465179deb71186b05 100644 (file)
 #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);
index a3623954dad1c532172f88803db695b65763d7d5..3857358fb6de6a4c28123abf69543733c761be32 100644 (file)
  * Definitions for 7:0 on legacy processors
  */
 
+#define PRID_REV_MASK          0x00ff
 
 #define PRID_REV_TX4927                0x0022
 #define PRID_REV_TX4937                0x0030
 #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
index 668db02c28043d796f9663838f8e66c6f544d490..706b3691f57e25cb0477923b976b15574b6ec409 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <linux/linkage.h>
 #include <asm/hazards.h>
+#include <asm/war.h>
 
 /*
  * The following macros are especially useful for __asm__
 
 #define MIPS_CONF7_WII         (_ULCAST_(1) << 31)
 
+#define MIPS_CONF7_RPS         (_ULCAST_(1) << 2)
+
+
 /*
  * Bits in the MIPS32/64 coprocessor 1 (FPU) revision register.
  */
@@ -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)
index c507f1b8014ee92f8c502c82c7fa8a8d8b85075b..45cb82724830664f41de7f9da79020e5b1246e53 100644 (file)
 #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
  */
 #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 */