Commit 42355f57 authored by Ralf Bächle's avatar Ralf Bächle Committed by Linus Torvalds

[PATCH] mips: PMC-Sierra updates

SMP support for the PMC-Sierra Yosemite evaluation board.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 7c6d55e8
...@@ -388,6 +388,7 @@ config PMC_YOSEMITE ...@@ -388,6 +388,7 @@ config PMC_YOSEMITE
select HW_HAS_PCI select HW_HAS_PCI
select IRQ_CPU select IRQ_CPU
select IRQ_CPU_RM7K select IRQ_CPU_RM7K
select IRQ_CPU_RM9K
select SWAP_IO_SPACE select SWAP_IO_SPACE
help help
Yosemite is an evaluation board for the RM9000x2 processor Yosemite is an evaluation board for the RM9000x2 processor
......
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.10-rc2 # Linux kernel version: 2.6.11-rc2
# Fri Nov 26 00:00:39 2004 # Wed Jan 26 02:49:13 2005
# #
CONFIG_MIPS=y CONFIG_MIPS=y
# CONFIG_MIPS64 is not set # CONFIG_MIPS64 is not set
...@@ -80,14 +80,15 @@ CONFIG_PMC_YOSEMITE=y ...@@ -80,14 +80,15 @@ CONFIG_PMC_YOSEMITE=y
# CONFIG_SNI_RM200_PCI is not set # CONFIG_SNI_RM200_PCI is not set
# CONFIG_TOSHIBA_RBTX4927 is not set # CONFIG_TOSHIBA_RBTX4927 is not set
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_HAVE_DEC_LOCK=y CONFIG_HAVE_DEC_LOCK=y
CONFIG_DMA_COHERENT=y CONFIG_DMA_COHERENT=y
# CONFIG_CPU_LITTLE_ENDIAN is not set # CONFIG_CPU_LITTLE_ENDIAN is not set
CONFIG_IRQ_CPU=y CONFIG_IRQ_CPU=y
CONFIG_IRQ_CPU_RM7K=y CONFIG_IRQ_CPU_RM7K=y
CONFIG_IRQ_CPU_RM9K=y
CONFIG_SWAP_IO_SPACE=y CONFIG_SWAP_IO_SPACE=y
CONFIG_MIPS_L1_CACHE_SHIFT=5 CONFIG_MIPS_L1_CACHE_SHIFT=5
# CONFIG_FB is not set
# #
# CPU selection # CPU selection
...@@ -133,6 +134,19 @@ CONFIG_PCI_LEGACY_PROC=y ...@@ -133,6 +134,19 @@ CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y CONFIG_PCI_NAMES=y
CONFIG_MMU=y CONFIG_MMU=y
#
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set
#
# PC-card bridges
#
#
# PCI Hotplug Support
#
# #
# Executable file formats # Executable file formats
# #
...@@ -149,6 +163,7 @@ CONFIG_TRAD_SIGNALS=y ...@@ -149,6 +163,7 @@ CONFIG_TRAD_SIGNALS=y
# #
CONFIG_STANDALONE=y CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
# #
...@@ -172,10 +187,12 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y ...@@ -172,10 +187,12 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
# CONFIG_BLK_DEV_LOOP is not set # CONFIG_BLK_DEV_LOOP is not set
# CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_RAM is not set
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
# CONFIG_LBD is not set # CONFIG_LBD is not set
CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD=m
...@@ -189,6 +206,7 @@ CONFIG_IOSCHED_NOOP=y ...@@ -189,6 +206,7 @@ CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y CONFIG_IOSCHED_CFQ=y
CONFIG_ATA_OVER_ETH=m
# #
# ATA/ATAPI/MFM/RLL support # ATA/ATAPI/MFM/RLL support
...@@ -401,7 +419,8 @@ CONFIG_LEGACY_PTY_COUNT=256 ...@@ -401,7 +419,8 @@ CONFIG_LEGACY_PTY_COUNT=256
# #
# CONFIG_WATCHDOG is not set # CONFIG_WATCHDOG is not set
# CONFIG_RTC is not set # CONFIG_RTC is not set
# CONFIG_GEN_RTC is not set CONFIG_GEN_RTC=y
CONFIG_GEN_RTC_X=y
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
...@@ -409,7 +428,6 @@ CONFIG_LEGACY_PTY_COUNT=256 ...@@ -409,7 +428,6 @@ CONFIG_LEGACY_PTY_COUNT=256
# #
# Ftape, the floppy tape device driver # Ftape, the floppy tape device driver
# #
# CONFIG_AGP is not set
# CONFIG_DRM is not set # CONFIG_DRM is not set
# CONFIG_RAW_DRIVER is not set # CONFIG_RAW_DRIVER is not set
...@@ -440,6 +458,8 @@ CONFIG_LEGACY_PTY_COUNT=256 ...@@ -440,6 +458,8 @@ CONFIG_LEGACY_PTY_COUNT=256
# #
# Graphics support # Graphics support
# #
# CONFIG_FB is not set
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
# #
# Sound # Sound
...@@ -453,11 +473,25 @@ CONFIG_LEGACY_PTY_COUNT=256 ...@@ -453,11 +473,25 @@ CONFIG_LEGACY_PTY_COUNT=256
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
# #
# USB Gadget Support # USB Gadget Support
# #
# CONFIG_USB_GADGET is not set # CONFIG_USB_GADGET is not set
#
# MMC/SD Card support
#
# CONFIG_MMC is not set
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set
# #
# File systems # File systems
# #
...@@ -548,6 +582,7 @@ CONFIG_DEBUG_KERNEL=y ...@@ -548,6 +582,7 @@ CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_HIGHMEM is not set # CONFIG_DEBUG_HIGHMEM is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_FS is not set
CONFIG_CROSSCOMPILE=y CONFIG_CROSSCOMPILE=y
CONFIG_CMDLINE="" CONFIG_CMDLINE=""
# CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_STACK_USAGE is not set
...@@ -566,6 +601,10 @@ CONFIG_KEYS_DEBUG_PROC_KEYS=y ...@@ -566,6 +601,10 @@ CONFIG_KEYS_DEBUG_PROC_KEYS=y
# #
# CONFIG_CRYPTO is not set # CONFIG_CRYPTO is not set
#
# Hardware crypto devices
#
# #
# Library routines # Library routines
# #
......
...@@ -22,91 +22,69 @@ ...@@ -22,91 +22,69 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA. * 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <linux/init.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/version.h>
#include <asm/pci.h>
#include <asm/io.h>
#include <asm/titan_dep.h> #include <asm/titan_dep.h>
/*
* Titan PCI Config Read Byte
*/
static int titan_read_config(struct pci_bus *bus, unsigned int devfn, int reg, static int titan_read_config(struct pci_bus *bus, unsigned int devfn, int reg,
int size, u32 * val) int size, u32 * val)
{ {
uint32_t address, tmp;
int dev, busno, func; int dev, busno, func;
uint32_t address_reg, data_reg;
uint32_t address;
busno = bus->number; busno = bus->number;
dev = PCI_SLOT(devfn); dev = PCI_SLOT(devfn);
func = PCI_FUNC(devfn); func = PCI_FUNC(devfn);
address_reg = TITAN_PCI_0_CONFIG_ADDRESS;
data_reg = TITAN_PCI_0_CONFIG_DATA;
address = (busno << 16) | (dev << 11) | (func << 8) | address = (busno << 16) | (dev << 11) | (func << 8) |
(reg & 0xfc) | 0x80000000; (reg & 0xfc) | 0x80000000;
/* start the configuration cycle */ /* start the configuration cycle */
TITAN_WRITE(address_reg, address); TITAN_WRITE(TITAN_PCI_0_CONFIG_ADDRESS, address);
tmp = TITAN_READ(TITAN_PCI_0_CONFIG_DATA) >> ((reg & 3) << 3);
switch (size) { switch (size) {
case 1: case 1:
*val = TITAN_READ_8(data_reg + (~reg & 0x3)); tmp &= 0xff;
break;
case 2: case 2:
*val = TITAN_READ_16(data_reg + (~reg & 0x2)); tmp &= 0xffff;
break;
case 4:
*val = TITAN_READ(data_reg);
break;
} }
*val = tmp;
return PCIBIOS_SUCCESSFUL; return PCIBIOS_SUCCESSFUL;
} }
/*
* Titan PCI Config Byte Write
*/
static int titan_write_config(struct pci_bus *bus, unsigned int devfn, int reg, static int titan_write_config(struct pci_bus *bus, unsigned int devfn, int reg,
int size, u32 val) int size, u32 val)
{ {
uint32_t address_reg, data_reg, address; uint32_t address;
int dev, busno, func; int dev, busno, func;
busno = bus->number; busno = bus->number;
dev = PCI_SLOT(devfn); dev = PCI_SLOT(devfn);
func = PCI_FUNC(devfn); func = PCI_FUNC(devfn);
address_reg = TITAN_PCI_0_CONFIG_ADDRESS;
data_reg = TITAN_PCI_0_CONFIG_DATA;
address = (busno << 16) | (dev << 11) | (func << 8) | address = (busno << 16) | (dev << 11) | (func << 8) |
(reg & 0xfc) | 0x80000000; (reg & 0xfc) | 0x80000000;
/* start the configuration cycle */ /* start the configuration cycle */
TITAN_WRITE(address_reg, address); TITAN_WRITE(TITAN_PCI_0_CONFIG_ADDRESS, address);
/* write the data */ /* write the data */
switch (size) { switch (size) {
case 1: case 1:
TITAN_WRITE_8(data_reg + (~reg & 0x3), val); TITAN_WRITE_8(TITAN_PCI_0_CONFIG_DATA + (~reg & 0x3), val);
break; break;
case 2: case 2:
TITAN_WRITE_16(data_reg + (~reg & 0x2), val); TITAN_WRITE_16(TITAN_PCI_0_CONFIG_DATA + (~reg & 0x2), val);
break; break;
case 4: case 4:
TITAN_WRITE(data_reg, val); TITAN_WRITE(TITAN_PCI_0_CONFIG_DATA, val);
break; break;
} }
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <asm/gt64240.h> #include <asm/titan_dep.h>
extern struct pci_ops titan_pci_ops; extern struct pci_ops titan_pci_ops;
...@@ -23,6 +23,7 @@ static struct resource py_mem_resource = { ...@@ -23,6 +23,7 @@ static struct resource py_mem_resource = {
* anyway. So we just claim 64kB here. * anyway. So we just claim 64kB here.
*/ */
#define TITAN_IO_SIZE 0x0000ffffUL #define TITAN_IO_SIZE 0x0000ffffUL
#define TITAN_IO_BASE 0xe8000000UL
static struct resource py_io_resource = { static struct resource py_io_resource = {
"Titan IO MEM", 0x00001000UL, TITAN_IO_SIZE - 1, IORESOURCE_IO, "Titan IO MEM", 0x00001000UL, TITAN_IO_SIZE - 1, IORESOURCE_IO,
...@@ -42,11 +43,12 @@ static int __init pmc_yosemite_setup(void) ...@@ -42,11 +43,12 @@ static int __init pmc_yosemite_setup(void)
{ {
unsigned long io_v_base; unsigned long io_v_base;
io_v_base = (unsigned long) ioremap(0xe0000000UL,TITAN_IO_SIZE); io_v_base = (unsigned long) ioremap(TITAN_IO_BASE, TITAN_IO_SIZE);
if (!io_v_base) if (!io_v_base)
panic(ioremap_failed); panic(ioremap_failed);
set_io_port_base(io_v_base); set_io_port_base(io_v_base);
TITAN_WRITE(RM9000x2_OCD_LKM7, TITAN_READ(RM9000x2_OCD_LKM7) | 1);
ioport_resource.end = TITAN_IO_SIZE - 1; ioport_resource.end = TITAN_IO_SIZE - 1;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* Copyright (C) 2003 PMC-Sierra Inc. * Copyright (C) 2003 PMC-Sierra Inc.
* Author: Manish Lachwani (lachwani@pmc-sierra.com) * Author: Manish Lachwani (lachwani@pmc-sierra.com)
* Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
...@@ -29,7 +30,6 @@ ...@@ -29,7 +30,6 @@
* Header file for atmel_read_eeprom.c * Header file for atmel_read_eeprom.c
*/ */
#include <linux/config.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/kernel.h> #include <linux/kernel.h>
......
...@@ -31,9 +31,6 @@ ...@@ -31,9 +31,6 @@
* the interrupt came from channel A or B. * the interrupt came from channel A or B.
*/ */
#include <linux/config.h>
#ifdef CONFIG_KGDB
#include <asm/serial.h> #include <asm/serial.h>
/* /*
...@@ -181,4 +178,3 @@ int putDebugChar(unsigned char byte) ...@@ -181,4 +178,3 @@ int putDebugChar(unsigned char byte)
return 1; return 1;
} }
#endif
...@@ -34,37 +34,24 @@ ...@@ -34,37 +34,24 @@
and t0, t2 and t0, t2
andi t2, t0, STATUSF_IP7 /* INTB5 hardware line */
bnez t2, ll_timer_irq /* Timer */
andi t1, t0, STATUSF_IP2 /* INTB0 hardware line */ andi t1, t0, STATUSF_IP2 /* INTB0 hardware line */
bnez t1, ll_pcia_irq /* 64-bit PCI */ bnez t1, ll_pcia_irq /* 64-bit PCI */
andi t1, t0, STATUSF_IP3 /* INTB1 hardware line */ andi t2, t0, STATUSF_IP3 /* INTB1 hardware line */
bnez t1, ll_pcib_irq /* second 64-bit PCI slot */ bnez t2, ll_pcib_irq /* second 64-bit PCI slot */
andi t1, t0, STATUSF_IP4 /* INTB2 hardware line */ andi t1, t0, STATUSF_IP4 /* INTB2 hardware line */
bnez t1, ll_duart_irq /* UART */ bnez t1, ll_duart_irq /* UART */
andi t1, t0, STATUSF_IP5 /* SMP inter-core interrupts */ andi t2, t0, STATUSF_IP5 /* SMP inter-core interrupts */
bnez t1, ll_smp_irq bnez t2, ll_smp_irq
andi t1, t0, STATUSF_IP6 andi t1, t0, STATUSF_IP6
bnez t1, ll_ht_irq /* Hypertransport */ bnez t1, ll_ht_irq /* Hypertransport */
andi t1, t0, STATUSF_IP7 /* INTB5 hardware line */
bnez t1, ll_timer_irq /* Timer */
nop move a0, sp
nop j do_extended_irq
/* Extended interrupts */
mfc0 t0, CP0_CAUSE
cfc0 t1, CP0_S1_INTCONTROL
sll t2, t1, 8
and t0, t2
srl t0, t0, 16
.set reorder
j spurious_interrupt
nop
END(titan_handle_int) END(titan_handle_int)
.set reorder
.align 5 .align 5
ll_pcia_irq: ll_pcia_irq:
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
* *
* Second level Interrupt handlers for the PMC-Sierra Titan/Yosemite board * Second level Interrupt handlers for the PMC-Sierra Titan/Yosemite board
*/ */
#include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
...@@ -110,6 +110,21 @@ asmlinkage void ll_ht_smp_irq_handler(int irq, struct pt_regs *regs) ...@@ -110,6 +110,21 @@ asmlinkage void ll_ht_smp_irq_handler(int irq, struct pt_regs *regs)
do_IRQ(irq, regs); do_IRQ(irq, regs);
} }
asmlinkage void do_extended_irq(struct pt_regs *regs)
{
unsigned int intcontrol = read_c0_intcontrol();
unsigned int cause = read_c0_cause();
unsigned int status = read_c0_status();
unsigned int pending_sr, pending_ic;
pending_sr = status & cause & 0xff00;
pending_ic = (cause >> 8) & intcontrol & 0xff00;
if (pending_ic & (1 << 13))
do_IRQ(13, regs);
}
#ifdef CONFIG_KGDB #ifdef CONFIG_KGDB
extern void init_second_port(void); extern void init_second_port(void);
#endif #endif
...@@ -124,6 +139,7 @@ void __init arch_init_irq(void) ...@@ -124,6 +139,7 @@ void __init arch_init_irq(void)
set_except_vector(0, titan_handle_int); set_except_vector(0, titan_handle_int);
mips_cpu_irq_init(0); mips_cpu_irq_init(0);
rm7k_cpu_irq_init(8); rm7k_cpu_irq_init(8);
rm9k_cpu_irq_init(12);
#ifdef CONFIG_KGDB #ifdef CONFIG_KGDB
/* At this point, initialize the second serial port */ /* At this point, initialize the second serial port */
......
...@@ -43,7 +43,7 @@ const char *get_system_type(void) ...@@ -43,7 +43,7 @@ const char *get_system_type(void)
static void prom_cpu0_exit(void *arg) static void prom_cpu0_exit(void *arg)
{ {
void *nvram = (void *) YOSEMITE_NVRAM_BASE_ADDR; void *nvram = (void *) YOSEMITE_RTC_BASE;
/* Ask the NVRAM/RTC/watchdog chip to assert reset in 1/16 second */ /* Ask the NVRAM/RTC/watchdog chip to assert reset in 1/16 second */
writeb(0x84, nvram + 0xff7); writeb(0x84, nvram + 0xff7);
...@@ -94,8 +94,6 @@ void __init prom_init(void) ...@@ -94,8 +94,6 @@ void __init prom_init(void)
_machine_halt = prom_halt; _machine_halt = prom_halt;
_machine_power_off = prom_halt; _machine_power_off = prom_halt;
#ifdef CONFIG_MIPS32
debug_vectors = cv; debug_vectors = cv;
arcs_cmdline[0] = '\0'; arcs_cmdline[0] = '\0';
...@@ -109,6 +107,11 @@ void __init prom_init(void) ...@@ -109,6 +107,11 @@ void __init prom_init(void)
strcat(arcs_cmdline, " "); strcat(arcs_cmdline, " ");
} }
#ifdef CONFIG_SERIAL_8250_CONSOLE
if ((strstr(arcs_cmdline, "console=ttyS")) == NULL)
strcat(arcs_cmdline, "console=ttyS0,115200");
#endif
while (*env) { while (*env) {
if (strncmp("ocd_base", *env, strlen("ocd_base")) == 0) if (strncmp("ocd_base", *env, strlen("ocd_base")) == 0)
yosemite_base = yosemite_base =
...@@ -122,7 +125,6 @@ void __init prom_init(void) ...@@ -122,7 +125,6 @@ void __init prom_init(void)
env++; env++;
} }
#endif /* CONFIG_MIPS32 */
mips_machgroup = MACH_GROUP_TITAN; mips_machgroup = MACH_GROUP_TITAN;
mips_machtype = MACH_TITAN_YOSEMITE; mips_machtype = MACH_TITAN_YOSEMITE;
......
...@@ -48,9 +48,12 @@ struct yo_uartregs { ...@@ -48,9 +48,12 @@ struct yo_uartregs {
#define iu_iir u3.iir #define iu_iir u3.iir
#define iu_fcr u3.fcr #define iu_fcr u3.fcr
#define ssnop() __asm__ __volatile__("sll $0, $0, 1\n");
#define ssnop_4() do { ssnop(); ssnop(); ssnop(); ssnop(); } while (0)
#define IO_BASE_64 0x9000000000000000ULL #define IO_BASE_64 0x9000000000000000ULL
static unsigned char readb_outer_space(unsigned long phys) static unsigned char readb_outer_space(unsigned long long phys)
{ {
unsigned long long vaddr = IO_BASE_64 | phys; unsigned long long vaddr = IO_BASE_64 | phys;
unsigned char res; unsigned char res;
...@@ -58,29 +61,23 @@ static unsigned char readb_outer_space(unsigned long phys) ...@@ -58,29 +61,23 @@ static unsigned char readb_outer_space(unsigned long phys)
sr = read_c0_status(); sr = read_c0_status();
write_c0_status((sr | ST0_KX) & ~ ST0_IE); write_c0_status((sr | ST0_KX) & ~ ST0_IE);
__asm__("sll $0, $0, 2\n"); ssnop_4();
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
__asm__ __volatile__ ( __asm__ __volatile__ (
" .set mips3 \n" " .set mips3 \n"
" ld %0, (%0) \n" " ld %0, %1 \n"
" lbu %0, (%0) \n" " lbu %0, (%0) \n"
" .set mips0 \n" " .set mips0 \n"
: "=r" (res) : "=r" (res)
: "0" (&vaddr)); : "m" (vaddr));
write_c0_status(sr); write_c0_status(sr);
__asm__("sll $0, $0, 2\n"); ssnop_4();
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
return res; return res;
} }
static void writeb_outer_space(unsigned long phys, unsigned char c) static void writeb_outer_space(unsigned long long phys, unsigned char c)
{ {
unsigned long long vaddr = IO_BASE_64 | phys; unsigned long long vaddr = IO_BASE_64 | phys;
unsigned long tmp; unsigned long tmp;
...@@ -88,30 +85,24 @@ static void writeb_outer_space(unsigned long phys, unsigned char c) ...@@ -88,30 +85,24 @@ static void writeb_outer_space(unsigned long phys, unsigned char c)
sr = read_c0_status(); sr = read_c0_status();
write_c0_status((sr | ST0_KX) & ~ ST0_IE); write_c0_status((sr | ST0_KX) & ~ ST0_IE);
__asm__("sll $0, $0, 2\n"); ssnop_4();
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
__asm__ __volatile__ ( __asm__ __volatile__ (
" .set mips3 \n" " .set mips3 \n"
" ld %0, (%1) \n" " ld %0, %1 \n"
" sb %2, (%0) \n" " sb %2, (%0) \n"
" .set mips0 \n" " .set mips0 \n"
: "=r" (tmp) : "=&r" (tmp)
: "r" (&vaddr), "r" (c)); : "m" (vaddr), "r" (c));
write_c0_status(sr); write_c0_status(sr);
__asm__("sll $0, $0, 2\n"); ssnop_4();
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
__asm__("sll $0, $0, 2\n");
} }
void prom_putchar(char c) void prom_putchar(char c)
{ {
unsigned long lsr = 0xfd000008UL + offsetof(struct yo_uartregs, iu_lsr); unsigned long lsr = 0xfd000008ULL + offsetof(struct yo_uartregs, iu_lsr);
unsigned long thr = 0xfd000008UL + offsetof(struct yo_uartregs, iu_thr); unsigned long thr = 0xfd000008ULL + offsetof(struct yo_uartregs, iu_thr);
while ((readb_outer_space(lsr) & 0x20) == 0); while ((readb_outer_space(lsr) & 0x20) == 0);
writeb_outer_space(thr, c); writeb_outer_space(thr, c);
......
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/termios.h>
#include <linux/tty.h>
#include <linux/serial.h>
#include <linux/serial_core.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
...@@ -45,84 +49,80 @@ ...@@ -45,84 +49,80 @@
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/serial.h> #include <asm/serial.h>
#include <linux/termios.h>
#include <linux/tty.h>
#include <linux/serial.h>
#include <linux/serial_core.h>
#include <asm/titan_dep.h> #include <asm/titan_dep.h>
#include <asm/m48t37.h>
#include "setup.h" #include "setup.h"
unsigned char titan_ge_mac_addr_base[6] = { unsigned char titan_ge_mac_addr_base[6] = {
0x00, 0x03, 0xcc, 0x1d, 0x22, 0x00 // 0x00, 0x03, 0xcc, 0x1d, 0x22, 0x00
0x00, 0xe0, 0x04, 0x00, 0x00, 0x21
}; };
unsigned long cpu_clock; unsigned long cpu_clock;
unsigned long yosemite_base; unsigned long yosemite_base;
static struct m48t37_rtc *m48t37_base;
void __init bus_error_init(void) void __init bus_error_init(void)
{ {
/* Do nothing */ /* Do nothing */
} }
unsigned long m48t37y_get_time(void) unsigned long m48t37y_get_time(void)
{ {
//unsigned char *rtc_base = (unsigned char *) YOSEMITE_RTC_BASE;
unsigned char *rtc_base = (unsigned char *) 0xfc000000UL;
unsigned int year, month, day, hour, min, sec; unsigned int year, month, day, hour, min, sec;
return;
/* Stop the update to the time */ /* Stop the update to the time */
rtc_base[0x7ff8] = 0x40; m48t37_base->control = 0x40;
year = BCD2BIN(rtc_base[0x7fff]); year = BCD2BIN(m48t37_base->year);
year += BCD2BIN(rtc_base[0x7fff1]) * 100; year += BCD2BIN(m48t37_base->century) * 100;
month = BCD2BIN(rtc_base[0x7ffe]); month = BCD2BIN(m48t37_base->month);
day = BCD2BIN(rtc_base[0x7ffd]); day = BCD2BIN(m48t37_base->date);
hour = BCD2BIN(rtc_base[0x7ffb]); hour = BCD2BIN(m48t37_base->hour);
min = BCD2BIN(rtc_base[0x7ffa]); min = BCD2BIN(m48t37_base->min);
sec = BCD2BIN(rtc_base[0x7ff9]); sec = BCD2BIN(m48t37_base->sec);
/* Start the update to the time again */ /* Start the update to the time again */
rtc_base[0x7ff8] = 0x00; m48t37_base->control = 0x00;
return mktime(year, month, day, hour, min, sec); return mktime(year, month, day, hour, min, sec);
} }
int m48t37y_set_time(unsigned long sec) int m48t37y_set_time(unsigned long sec)
{ {
unsigned char *rtc_base = (unsigned char *) YOSEMITE_RTC_BASE;
struct rtc_time tm; struct rtc_time tm;
return;
/* convert to a more useful format -- note months count from 0 */ /* convert to a more useful format -- note months count from 0 */
to_tm(sec, &tm); to_tm(sec, &tm);
tm.tm_mon += 1; tm.tm_mon += 1;
/* enable writing */ /* enable writing */
rtc_base[0x7ff8] = 0x80; m48t37_base->control = 0x80;
/* year */ /* year */
rtc_base[0x7fff] = BIN2BCD(tm.tm_year % 100); m48t37_base->year = BIN2BCD(tm.tm_year % 100);
rtc_base[0x7ff1] = BIN2BCD(tm.tm_year / 100); m48t37_base->century = BIN2BCD(tm.tm_year / 100);
/* month */ /* month */
rtc_base[0x7ffe] = BIN2BCD(tm.tm_mon); m48t37_base->month = BIN2BCD(tm.tm_mon);
/* day */ /* day */
rtc_base[0x7ffd] = BIN2BCD(tm.tm_mday); m48t37_base->date = BIN2BCD(tm.tm_mday);
/* hour/min/sec */ /* hour/min/sec */
rtc_base[0x7ffb] = BIN2BCD(tm.tm_hour); m48t37_base->hour = BIN2BCD(tm.tm_hour);
rtc_base[0x7ffa] = BIN2BCD(tm.tm_min); m48t37_base->min = BIN2BCD(tm.tm_min);
rtc_base[0x7ff9] = BIN2BCD(tm.tm_sec); m48t37_base->sec = BIN2BCD(tm.tm_sec);
/* day of week -- not really used, but let's keep it up-to-date */ /* day of week -- not really used, but let's keep it up-to-date */
rtc_base[0x7ffc] = BIN2BCD(tm.tm_wday + 1); m48t37_base->day = BIN2BCD(tm.tm_wday + 1);
/* disable writing */ /* disable writing */
rtc_base[0x7ff8] = 0x00; m48t37_base->control = 0x00;
return 0; return 0;
} }
...@@ -136,13 +136,9 @@ void yosemite_time_init(void) ...@@ -136,13 +136,9 @@ void yosemite_time_init(void)
{ {
board_timer_setup = yosemite_timer_setup; board_timer_setup = yosemite_timer_setup;
mips_hpt_frequency = cpu_clock / 2; mips_hpt_frequency = cpu_clock / 2;
mips_hpt_frequency = 33000000 * 3 * 5;
rtc_get_time = m48t37y_get_time;
rtc_set_time = m48t37y_set_time;
} }
unsigned long uart_base = 0xfd000000L;
/* No other usable initialization hook than this ... */ /* No other usable initialization hook than this ... */
extern void (*late_time_init)(void); extern void (*late_time_init)(void);
...@@ -161,16 +157,18 @@ EXPORT_SYMBOL(ocd_base); ...@@ -161,16 +157,18 @@ EXPORT_SYMBOL(ocd_base);
static void __init py_map_ocd(void) static void __init py_map_ocd(void)
{ {
struct uart_port up;
/*
* Not specifically interrupt stuff but in case of SMP core_send_ipi
* needs this first so I'm mapping it here ...
*/
ocd_base = (unsigned long) ioremap(OCD_BASE, OCD_SIZE); ocd_base = (unsigned long) ioremap(OCD_BASE, OCD_SIZE);
if (!ocd_base) if (!ocd_base)
panic("Mapping OCD failed - game over. Your score is 0."); panic("Mapping OCD failed - game over. Your score is 0.");
/* Kludge for PMON bug ... */
OCD_WRITE(0x0710, 0x0ffff029);
}
static void __init py_uart_setup(void)
{
struct uart_port up;
/* /*
* Register to interrupt zero because we share the interrupt with * Register to interrupt zero because we share the interrupt with
* the serial driver which we don't properly support yet. * the serial driver which we don't properly support yet.
...@@ -188,12 +186,36 @@ static void __init py_map_ocd(void) ...@@ -188,12 +186,36 @@ static void __init py_map_ocd(void)
printk(KERN_ERR "Early serial init of port 0 failed\n"); printk(KERN_ERR "Early serial init of port 0 failed\n");
} }
static int __init pmc_yosemite_setup(void) static void __init py_rtc_setup(void)
{ {
extern void pmon_smp_bootstrap(void); m48t37_base = ioremap(YOSEMITE_RTC_BASE, YOSEMITE_RTC_SIZE);
if (!m48t37_base)
printk(KERN_ERR "Mapping the RTC failed\n");
rtc_get_time = m48t37y_get_time;
rtc_set_time = m48t37y_set_time;
write_seqlock(&xtime_lock);
xtime.tv_sec = m48t37y_get_time();
xtime.tv_nsec = 0;
set_normalized_timespec(&wall_to_monotonic,
-xtime.tv_sec, -xtime.tv_nsec);
write_sequnlock(&xtime_lock);
}
/* Not only time init but that's what the hook it's called through is named */
static void __init py_late_time_init(void)
{
py_map_ocd();
py_uart_setup();
py_rtc_setup();
}
static int __init pmc_yosemite_setup(void)
{
board_time_init = yosemite_time_init; board_time_init = yosemite_time_init;
late_time_init = py_map_ocd; late_time_init = py_late_time_init;
/* Add memory regions */ /* Add memory regions */
add_memory_region(0x00000000, 0x10000000, BOOT_MEM_RAM); add_memory_region(0x00000000, 0x10000000, BOOT_MEM_RAM);
......
/* /*
* Copyright 2003 PMC-Sierra * Copyright 2003, 04 PMC-Sierra
* Author: Manish Lachwani (lachwani@pmc-sierra.com) * Author: Manish Lachwani (lachwani@pmc-sierra.com)
* Copyright 2004 Ralf Baechle <ralf@linux-mips.org>
* *
* Board specific definititions for the PMC-Sierra Yosemite * Board specific definititions for the PMC-Sierra Yosemite
* *
...@@ -12,9 +13,9 @@ ...@@ -12,9 +13,9 @@
#ifndef __SETUP_H__ #ifndef __SETUP_H__
#define __SETUP_H__ #define __SETUP_H__
/* NVRAM Base */ /* M48T37 RTC + NVRAM */
#define YOSEMITE_NVRAM_BASE_ADDR 0xbb000678 /* XXX Need change */ #define YOSEMITE_RTC_BASE 0xfc800000
#define YOSEMITE_RTC_BASE 0xbb000679 /* XXX Need change */ #define YOSEMITE_RTC_SIZE 0x00800000
#define HYPERTRANSPORT_BAR0_ADDR 0x00000006 #define HYPERTRANSPORT_BAR0_ADDR 0x00000006
#define HYPERTRANSPORT_SIZE0 0x0fffffff #define HYPERTRANSPORT_SIZE0 0x0fffffff
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
#include <asm/pmon.h> #include <asm/pmon.h>
#include <asm/titan_dep.h> #include <asm/titan_dep.h>
extern unsigned int (*mips_hpt_read)(void);
extern void (*mips_hpt_init)(unsigned int);
#define LAUNCHSTACK_SIZE 256 #define LAUNCHSTACK_SIZE 256
static spinlock_t launch_lock __initdata; static spinlock_t launch_lock __initdata;
...@@ -37,7 +40,7 @@ void __init prom_grab_secondary(void) ...@@ -37,7 +40,7 @@ void __init prom_grab_secondary(void)
{ {
spin_lock(&launch_lock); spin_lock(&launch_lock);
debug_vectors->cpustart(1, &prom_smp_bootstrap, pmon_cpustart(1, &prom_smp_bootstrap,
launchstack + LAUNCHSTACK_SIZE, 0); launchstack + LAUNCHSTACK_SIZE, 0);
} }
...@@ -47,23 +50,38 @@ void __init prom_grab_secondary(void) ...@@ -47,23 +50,38 @@ void __init prom_grab_secondary(void)
* We don't want to start the secondary CPU yet nor do we have a nice probing * We don't want to start the secondary CPU yet nor do we have a nice probing
* feature in PMON so we just assume presence of the secondary core. * feature in PMON so we just assume presence of the secondary core.
*/ */
void prom_prepare_cpus(unsigned int max_cpus) static char maxcpus_string[] __initdata =
KERN_WARNING "max_cpus set to 0; using 1 instead\n";
void __init prom_prepare_cpus(unsigned int max_cpus)
{ {
int enabled = 0, i;
if (max_cpus == 0) {
printk(maxcpus_string);
max_cpus = 1;
}
cpus_clear(phys_cpu_present_map); cpus_clear(phys_cpu_present_map);
for (i = 0; i < 2; i++) {
if (i == max_cpus)
break;
/* /*
* The boot CPU * The boot CPU
*/ */
cpu_set(0, phys_cpu_present_map); cpu_set(i, phys_cpu_present_map);
__cpu_number_map[0] = 0; __cpu_number_map[i] = i;
__cpu_logical_map[0] = 0; __cpu_logical_map[i] = i;
enabled++;
}
/* /*
* The secondary core * Be paranoid. Enable the IPI only if we're really about to go SMP.
*/ */
cpu_set(1, phys_cpu_present_map); if (enabled > 1)
__cpu_number_map[1] = 1; set_c0_status(STATUSF_IP5);
__cpu_logical_map[1] = 1;
} }
/* /*
...@@ -95,6 +113,8 @@ void prom_cpus_done(void) ...@@ -95,6 +113,8 @@ void prom_cpus_done(void)
*/ */
void prom_init_secondary(void) void prom_init_secondary(void)
{ {
mips_hpt_init(mips_hpt_read());
set_c0_status(ST0_CO | ST0_IE | ST0_IM); set_c0_status(ST0_CO | ST0_IE | ST0_IM);
} }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define cpu_has_vtag_icache 0 #define cpu_has_vtag_icache 0
#define cpu_has_dc_aliases 0 #define cpu_has_dc_aliases 0
#define cpu_has_ic_fills_f_dc 0 #define cpu_has_ic_fills_f_dc 0
#define cpu_icache_snoops_remote_store 0
#define cpu_has_nofpuex 0 #define cpu_has_nofpuex 0
#define cpu_has_64bits 1 #define cpu_has_64bits 1
......
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