patch-2.4.10 linux/arch/ppc/kernel/prep_setup.c
Next file: linux/arch/ppc/kernel/prep_time.c
Previous file: linux/arch/ppc/kernel/prep_pci.c
Back to the patch index
Back to the overall index
- Lines: 252
- Date:
Sat Sep 8 12:38:42 2001
- Orig file:
v2.4.9/linux/arch/ppc/kernel/prep_setup.c
- Orig date:
Mon Aug 27 12:41:39 2001
diff -u --recursive --new-file v2.4.9/linux/arch/ppc/kernel/prep_setup.c linux/arch/ppc/kernel/prep_setup.c
@@ -1,5 +1,5 @@
/*
- * BK Id: SCCS/s.prep_setup.c 1.26 08/05/01 16:18:54 trini
+ * BK Id: SCCS/s.prep_setup.c 1.36 09/08/01 15:47:42 paulus
*/
/*
* linux/arch/ppc/kernel/setup.c
@@ -7,6 +7,9 @@
* Copyright (C) 1995 Linus Torvalds
* Adapted from 'alpha' version by Gary Thomas
* Modified by Cort Dougan (cort@cs.nmt.edu)
+ *
+ * Support for PReP (Motorola MTX/MVME)
+ * by Troy Benjegerdes (hozer@drgw.net)
*/
/*
@@ -38,7 +41,7 @@
#include <linux/pci.h>
#include <linux/ide.h>
-#include <asm/init.h>
+#include <asm/sections.h>
#include <asm/mmu.h>
#include <asm/processor.h>
#include <asm/residual.h>
@@ -78,6 +81,7 @@
extern unsigned char rs_nvram_read_val(int addr);
extern void rs_nvram_write_val(int addr,
unsigned char val);
+extern void ibm_prep_init(void);
extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode);
extern int pckbd_getkeycode(unsigned int scancode);
@@ -329,13 +333,20 @@
/*print_residual_device_info();*/
- raven_init();
+ switch (_prep_type) {
+ case _PREP_Motorola:
+ raven_init();
+ break;
+ case _PREP_IBM:
+ ibm_prep_init();
+ break;
+ }
#ifdef CONFIG_VGA_CONSOLE
/* remap the VGA memory */
vgacon_remap_base = 0xf0000000;
/*vgacon_remap_base = ioremap(0xc0000000, 0xba000);*/
- conswitchp = &vga_con;
+ conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &dummy_con;
#endif
@@ -662,23 +673,6 @@
}
}
-#if 0
-void __prep
-prep_do_IRQ(struct pt_regs *regs, int cpu)
-{
- int irq;
-
- if ( (irq = i8259_irq(0)) < 0 )
- {
- printk(KERN_DEBUG "Bogus interrupt from PC = %lx\n",
- regs->nip);
- ppc_spurious_interrupts++;
- return;
- }
- ppc_irq_dispatch_handler( regs, irq );
-}
-#endif
-
int __prep
prep_get_irq(struct pt_regs *regs)
{
@@ -701,18 +695,6 @@
/*
* IDE stuff.
*/
-void __prep
-prep_ide_insw(ide_ioreg_t port, void *buf, int ns)
-{
- _insw((unsigned short *)((port)+_IO_BASE), buf, ns);
-}
-
-void __prep
-prep_ide_outsw(ide_ioreg_t port, void *buf, int ns)
-{
- _outsw((unsigned short *)((port)+_IO_BASE), buf, ns);
-}
-
int __prep
prep_ide_default_irq(ide_ioreg_t base)
{
@@ -721,8 +703,9 @@
case 0x170: return 13;
case 0x1e8: return 11;
case 0x168: return 10;
- default:
- return 0;
+ case 0xfff0: return 14; /* MCP(N)750 ide0 */
+ case 0xffe0: return 15; /* MCP(N)750 ide1 */
+ default: return 0;
}
}
@@ -780,6 +763,45 @@
}
#endif
+#ifdef CONFIG_SMP
+/* PReP (MTX) support */
+static int
+smp_prep_probe(void)
+{
+ extern int mot_multi;
+
+ if (mot_multi) {
+ openpic_request_IPIs();
+ smp_hw_index[1] = 1;
+ return 2;
+ }
+
+ return 1;
+}
+
+static void
+smp_prep_kick_cpu(int nr)
+{
+ *(unsigned long *)KERNELBASE = nr;
+ asm volatile("dcbf 0,%0"::"r"(KERNELBASE):"memory");
+ printk("CPU1 reset, waiting\n");
+}
+
+static void
+smp_prep_setup_cpu(int cpu_nr)
+{
+ if (OpenPIC_Addr)
+ do_openpic_setup_cpu();
+}
+
+static struct smp_ops_t prep_smp_ops = {
+ smp_openpic_message_pass,
+ smp_prep_probe,
+ smp_prep_kick_cpu,
+ smp_prep_setup_cpu,
+};
+#endif /* CONFIG_SMP */
+
/*
* This finds the amount of physical ram and does necessary
* setup for prep. This is pretty architecture specific so
@@ -788,29 +810,39 @@
*/
unsigned long __init prep_find_end_of_memory(void)
{
- unsigned long total;
+ unsigned long total = 0;
+ extern unsigned int boot_mem_size;
+
#ifdef CONFIG_PREP_RESIDUAL
total = res->TotalMemory;
-#else
- total = 0;
#endif
- if (total == 0 )
- {
+ if (total == 0 && boot_mem_size != 0)
+ total = boot_mem_size;
+
+ if (total == 0) {
/*
* I need a way to probe the amount of memory if the residual
* data doesn't contain it. -- Cort
*/
- printk("Ramsize from residual data was 0 -- Probing for value\n");
total = 0x02000000;
- printk("Ramsize default to be %ldM\n", total>>20);
+ printk(KERN_INFO "Ramsize from residual data was 0"
+ " -- defaulting to %ldM\n", total>>20);
}
return (total);
}
-unsigned long *MotSave_SmpIar;
-unsigned char *MotSave_CpusState[2];
+/*
+ * Setup the bat mappings we're going to load that cover
+ * the io areas. RAM was mapped by mapin_ram().
+ * -- Cort
+ */
+void __init prep_map_io(void)
+{
+ io_block_mapping(0x80000000, 0x80000000, 0x10000000, _PAGE_IO);
+ io_block_mapping(0xf0000000, 0xc0000000, 0x08000000, _PAGE_IO);
+}
void __init
prep_init2(void)
@@ -838,13 +870,6 @@
{
memcpy((void *)res,(void *)(r3+KERNELBASE),
sizeof(RESIDUAL));
-
- /* These need to be saved for the Motorola Prep
- * MVME4600 and Dual MTX boards.
- */
- MotSave_SmpIar = &old_res->VitalProductData.SmpIar;
- MotSave_CpusState[0] = &old_res->Cpus[0].CpuState;
- MotSave_CpusState[1] = &old_res->Cpus[1].CpuState;
}
#endif
@@ -912,19 +937,16 @@
}
ppc_md.find_end_of_memory = prep_find_end_of_memory;
+ ppc_md.setup_io_mappings = prep_map_io;
#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
- ppc_ide_md.insw = prep_ide_insw;
- ppc_ide_md.outsw = prep_ide_outsw;
ppc_ide_md.default_irq = prep_ide_default_irq;
ppc_ide_md.default_io_base = prep_ide_default_io_base;
ppc_ide_md.ide_check_region = prep_ide_check_region;
ppc_ide_md.ide_request_region = prep_ide_request_region;
ppc_ide_md.ide_release_region = prep_ide_release_region;
- ppc_ide_md.fix_driveid = NULL;
ppc_ide_md.ide_init_hwif = prep_ide_init_hwif_ports;
-#endif
- ppc_ide_md.io_base = _IO_BASE;
+#endif
#ifdef CONFIG_VT
ppc_md.kbd_setkeycode = pckbd_setkeycode;
@@ -938,4 +960,8 @@
SYSRQ_KEY = 0x54;
#endif
#endif
+
+#ifdef CONFIG_SMP
+ ppc_md.smp_ops = &prep_smp_ops;
+#endif /* CONFIG_SMP */
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)