Commit a77e3b76 authored by Paul Mackerras's avatar Paul Mackerras

Merge samba.org:/home/paulus/kernel/tart

into samba.org:/home/paulus/kernel/for-linus-ppc
parents 5e8a4a7d f8e77483
......@@ -340,9 +340,16 @@ CONFIG_PREP_RESIDUAL
other useful pieces of information. Sometimes this information is
not present or incorrect.
Unless you expect to boot on a PReP system, there is not need to
Unless you expect to boot on a PReP system, there is no need to
select Y.
PReP residual data available in /proc/residual
CONFIG_PROC_PREPRESIDUAL
Enabling this option will create a /proc/residual file which allows
you to get at the residual data on PReP systems. You will need a tool
(lsresidual) to parse it. If you aren't on a PReP system, you don't
want this.
CONFIG_ADB
Apple Desktop Bus (ADB) support is for support of devices which
are connected to an ADB port. ADB devices tend to have 4 pins.
......
......@@ -67,7 +67,7 @@ extern int CRT_tstc(void);
extern unsigned long serial_init(int chan, void *ignored);
extern void serial_close(unsigned long com_port);
extern void gunzip(void *, int, unsigned char *, int *);
extern void setup_legacy(void);
extern void serial_fixups(void);
struct bi_record *
decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
......@@ -76,7 +76,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum)
char *cp, ch;
struct bi_record *rec, *birecs;
setup_legacy();
serial_fixups();
com_port = serial_init(0, NULL);
/* assume the chunk below 8M is free */
......
......@@ -9,7 +9,7 @@
* trini@mvista.com
* Derived from arch/ppc/boot/prep/head.S (Cort Dougan, many others).
*
* Copyright 2001 MontaVista Software Inc.
* Copyright 2001-2002 MontaVista Software Inc.
*
* 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
......@@ -188,10 +188,11 @@ start_ldr:
bl decompress_kernel
/*
* Make sure the kernel knows we don't have things set in
* Make sure the kernel knows we don't have things set in
* registers. -- Tom
*/
li r4,0
li r5,0
li r6,0
/*
......
......@@ -75,7 +75,7 @@ extern void gunzip(void *, int, unsigned char *, int *);
extern void _put_MSR(unsigned int val);
extern unsigned long serial_init(int chan, void *ignored);
extern void setup_legacy(void);
extern void serial_fixups(void);
void
writel(unsigned int val, unsigned int address)
......@@ -134,7 +134,7 @@ decompress_kernel(unsigned long load_addr, int num_words, unsigned long cksum,
int start_multi = 0;
unsigned int pci_viddid, pci_did, tulip_pci_base, tulip_base;
setup_legacy();
serial_fixups();
#if defined(CONFIG_SERIAL_CONSOLE)
com_port = serial_init(0, NULL);
#endif /* CONFIG_SERIAL_CONSOLE */
......
......@@ -3,15 +3,15 @@
*
* Author: Tom Rini <trini@mvista.com>
*
* This will go and setup ISA_io to 0xFE00000.
* This will go and setup ISA_io to 0xFE00000 and return.
*/
#include <asm/ppc_asm.h>
.text
.globl setup_legacy
setup_legacy:
.globl serial_fixups
serial_fixups:
lis r3,ISA_io@h /* Load ISA_io */
ori r3,r3,ISA_io@l
lis r4,0xFE00 /* Load the value, 0xFE00000 */
......
......@@ -4,11 +4,12 @@
* Author: Tom Rini <trini@mvista.com>
*
* This is an empty function for machines which use SERIAL_IO_MEM
* and don't need ISA_io set to anything but 0;
* and don't need ISA_io set to anything but 0, or perform any other
* serial fixups.
*/
.text
.globl setup_legacy
setup_legacy:
.globl serial_fixups
serial_fixups:
blr
......@@ -3,15 +3,15 @@
*
* Author: Tom Rini <trini@mvista.com>
*
* This will go and setup ISA_io to 0x8000000.
* This will go and setup ISA_io to 0x8000000 and return.
*/
#include <asm/ppc_asm.h>
.text
.globl setup_legacy
setup_legacy:
.globl serial_fixups
serial_fixups:
lis r3,ISA_io@h /* Load ISA_io */
ori r3,r3,ISA_io@l
lis r4,0x8000 /* Load the value, 0x8000000 */
......
......@@ -54,7 +54,7 @@ char *bootrom_cmdline = "";
char compiled_string[] = CONFIG_CMDLINE;
#endif
char ramroot_string[] = "root=/dev/ram";
char netroot_string[] = "root=/dev/nfs rw ip=auto";
char netroot_string[] = "root=/dev/nfs rw ip=on";
/* Serial port to use. */
unsigned long com_port;
......
......@@ -362,6 +362,7 @@ if [ "$CONFIG_ALL_PPC" = "y" ]; then
bool 'Support for Open Firmware device tree in /proc' CONFIG_PROC_DEVICETREE
bool 'Support for RTAS (RunTime Abstraction Services) in /proc' CONFIG_PPC_RTAS
bool 'Support for PReP Residual Data' CONFIG_PREP_RESIDUAL
dep_bool ' Support for reading of PReP Residual Data in /proc' CONFIG_PROC_PREPRESIDUAL $CONFIG_PREP_RESIDUAL
fi
bool 'Default bootloader kernel arguments' CONFIG_CMDLINE_BOOL
......@@ -574,15 +575,15 @@ if [ "$CONFIG_8260" = "y" ]; then
source arch/ppc/8260_io/Config.in
fi
if [ "$CONFIG_4xx" = "y"]; then
if [ "$CONFIG_4xx" = "y" ]; then
mainmenu_option next_comment
comment 'IBM 4xx options'
if [ "$CONFIG_STB03xxx" = "y" ]; then
bool 'STB IR Keyboard' CONFIG_STB_KB
bool 'SICC Serial port' CONFIG_SERIAL_SICC
if [ "$CONFIG_SERIAL_SICC" = "y" -a "$CONFIG_UART0_TTYS1" = "y" ]; then
define_bool CONFIG_UART1_DFLT_CONSOLE y
define_bool CONFIG_SERIAL_SICC_CONSOLE y
define_bool CONFIG_UART1_DFLT_CONSOLE y
define_bool CONFIG_SERIAL_SICC_CONSOLE y
fi
fi
endmenu
......@@ -621,8 +622,8 @@ if [ "$CONFIG_ALL_PPC" = "y" ]; then
fi
if [ "$CONFIG_4xx" = "y" -o "$CONFIG_GT64260" = "y" \
-o "$CONFIG_LOPEC" = "y" -o "$CONFIG_MCPN765" = "y" \
-o "$CONFIG_PRPMC800" = "y" -o "$CONFIG_SANDPOINT" = "y" \
-o "$CONFIG_ZX4500" = "y" ]; then
-o "$CONFIG_PPLUS" = "y" -o "$CONFIG_PRPMC800" = "y" \
-o "$CONFIG_SANDPOINT" = "y" -o "$CONFIG_ZX4500" = "y" ]; then
bool 'Support for early boot texts over serial port' CONFIG_SERIAL_TEXT_DEBUG
fi
endmenu
......@@ -56,19 +56,18 @@ obj-$(CONFIG_PM) += ppc4xx_pm.o
endif
obj-$(CONFIG_8xx) += m8xx_setup.o ppc8xx_pic.o
ifeq ($(CONFIG_8xx),y)
obj-$(CONFIG_PCI) += qspan_pci.o
ifndef CONFIG_MATH_EMULATION
obj-$(CONFIG_PCI) += qspan_pci.o i8259.o
ifneq ($(CONFIG_MATH_EMULATION),n)
obj-y += softemu8xx.o
endif
endif
obj-$(CONFIG_MBX) += i8259.o
obj-$(CONFIG_ALL_PPC) += prom_init.o prom.o open_pic.o \
indirect_pci.o i8259.o
obj-$(CONFIG_ADIR) += i8259.o indirect_pci.o pci_auto.o \
todc_time.o
obj-$(CONFIG_EV64260) += gt64260_common.o gt64260_pic.o \
indirect_pci.o todc_time.o pci_auto.o
obj-$(CONFIG_GEMINI) += open_pic.o
obj-$(CONFIG_GEMINI) += open_pic.o i8259.o
obj-$(CONFIG_K2) += i8259.o indirect_pci.o todc_time.o \
pci_auto.o
obj-$(CONFIG_LOPEC) += mpc10x_common.o indirect_pci.o pci_auto.o \
......
......@@ -21,17 +21,37 @@ static spinlock_t i8259_lock = SPIN_LOCK_UNLOCKED;
int i8259_pic_irq_offset;
/* Acknowledge the irq using the PCI host bridge's interrupt acknowledge
* feature. (Polling is somehow broken on some IBM and Motorola PReP boxes.)
/*
* Acknowledge the IRQ using either the PCI host bridge's interrupt
* acknowledge feature or poll. How i8259_init() is called determines
* which is called. It should be noted that polling is broken on some
* IBM and Motorola PReP boxes so we must use the int-ack feature on them.
*/
int i8259_irq(struct pt_regs *regs)
int
i8259_irq(struct pt_regs *regs)
{
int irq;
spin_lock/*_irqsave*/(&i8259_lock/*, flags*/);
spin_lock(&i8259_lock);
/* Either int-ack or poll for the IRQ */
if (pci_intack)
irq = *pci_intack;
else {
/* Perform an interrupt acknowledge cycle on controller 1. */
outb(0x0C, 0x20); /* prepare for poll */
irq = inb(0x20) & 7;
if (irq == 2 ) {
/*
* Interrupt is cascaded so perform interrupt
* acknowledge on controller 2.
*/
outb(0x0C, 0xA0); /* prepare for poll */
irq = (inb(0xA0) & 7) + 8;
}
}
irq = *pci_intack;
if (irq==7) {
if (irq == 7) {
/*
* This may be a spurious interrupt.
*
......@@ -39,47 +59,13 @@ int i8259_irq(struct pt_regs *regs)
* significant bit is not set then there is no valid
* interrupt.
*/
if(~inb(0x20)&0x80) {
if (!pci_intack)
outb(0x0B, 0x20); /* ISR register */
if(~inb(0x20) & 0x80)
irq = -1;
}
}
spin_unlock/*_irqrestore*/(&i8259_lock/*, flags*/);
return irq;
}
/* Poke the 8259's directly using poll commands. */
int i8259_poll(void)
{
int irq;
spin_lock/*_irqsave*/(&i8259_lock/*, flags*/);
/*
* Perform an interrupt acknowledge cycle on controller 1
*/
outb(0x0C, 0x20); /* prepare for poll */
irq = inb(0x20) & 7;
if (irq == 2) {
/*
* Interrupt is cascaded so perform interrupt
* acknowledge on controller 2
*/
outb(0x0C, 0xA0); /* prepare for poll */
irq = (inb(0xA0) & 7) + 8;
} else if (irq==7) {
/*
* This may be a spurious interrupt
*
* Read the interrupt status register. If the most
* significant bit is not set then there is no valid
* interrupt
*/
outb(0x0b, 0x20);
if(~inb(0x20)&0x80) {
spin_unlock/*_irqrestore*/(&i8259_lock/*, flags*/);
return -1;
}
}
spin_unlock/*_irqrestore*/(&i8259_lock/*, flags*/);
spin_unlock(&i8259_lock);
return irq;
}
......@@ -171,11 +157,13 @@ static struct resource pic_edgectrl_iores = {
"8259 edge control", 0x4d0, 0x4d1, IORESOURCE_BUSY
};
/* i8259_init()
/*
* i8259_init()
* intack_addr - PCI interrupt acknowledge (real) address which will return
* the active irq from the 8259
*/
void __init i8259_init(long intack_addr)
void __init
i8259_init(long intack_addr)
{
unsigned long flags;
......@@ -209,9 +197,6 @@ void __init i8259_init(long intack_addr)
request_resource(&ioport_resource, &pic2_iores);
request_resource(&ioport_resource, &pic_edgectrl_iores);
/* XXX remove me after board maintainers fix their i8259_init calls */
if (intack_addr == 0)
panic("You must supply a PCI interrupt acknowledge address to i8259_init()\n");
pci_intack = ioremap(intack_addr, 1);
if (intack_addr != 0)
pci_intack = ioremap(intack_addr, 1);
}
......@@ -799,26 +799,20 @@ static void openpic_ipi_action(int cpl, void *dev_id, struct pt_regs *regs)
#endif /* CONFIG_SMP */
/* This one may be merged with PReP and CHRP */
int
openpic_get_irq(struct pt_regs *regs)
{
/*
* Clean up needed. -VAL
*/
int irq = openpic_irq();
/* Management of the cascade should be moved out of here */
/* Yep - because openpic !=> i8259, for one thing. -VAL */
if (open_pic_irq_offset && irq == open_pic_irq_offset)
{
#ifndef CONFIG_GEMINI
irq = i8259_irq(regs); /* get IRQ from cascade */
#endif
/*
* This needs to be cleaned up. We don't necessarily have
* an i8259 cascaded or even a cascade.
*/
if (open_pic_irq_offset && irq == open_pic_irq_offset) {
/* Get the IRQ from the cascade. */
irq = i8259_irq(regs);
openpic_eoi();
}
if (irq == OPENPIC_VEC_SPURIOUS + open_pic_irq_offset)
} else if (irq == OPENPIC_VEC_SPURIOUS + open_pic_irq_offset)
irq = -1;
return irq;
}
......
......@@ -6,7 +6,7 @@
* Author: Dan Cox
* danc@mvista.com (or, alternately, source@mvista.com)
*
* Copyright 2001 MontaVista Software Inc.
* Copyright 2001-2002 MontaVista Software Inc.
*
* 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
......@@ -14,18 +14,11 @@
* option) any later version.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <asm/machdep.h>
#include <asm/byteorder.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/pci-bridge.h>
#include <asm/open_pic.h>
#include <asm/mpc10x.h>
static inline int __init
......
......@@ -15,34 +15,23 @@
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/pci.h>
#include <linux/time.h>
#include <linux/types.h>
#include <linux/major.h>
#include <linux/kdev_t.h>
#include <linux/delay.h>
#include <linux/pci_ids.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/ide.h>
#include <linux/irq.h>
#include <linux/seq_file.h>
#include <linux/blk.h>
#include <linux/console.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/machdep.h>
#include <asm/page.h>
#include <asm/dma.h>
#include <asm/io.h>
#include <asm/time.h>
#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/open_pic.h>
#include <asm/i8259.h>
#include <asm/pci-bridge.h>
#include <asm/todc.h>
#include <asm/bootinfo.h>
#include <asm/mpc10x.h>
#include <asm/hw_irq.h>
extern void lopec_find_bridges(void);
......@@ -230,7 +219,7 @@ lopec_init_IRQ(void)
i8259_init(0xfef00000);
}
void __init
static int __init
lopec_request_io(void)
{
outb(0x00, 0x4d0);
......@@ -242,9 +231,11 @@ lopec_request_io(void)
request_region(0x80, 0x10, "dma page reg");
request_region(0xa0, 0x20, "pic2");
request_region(0xc0, 0x20, "dma2");
return 0;
}
arch_initcall(lopec_request_io);
device_initcall(lopec_request_io);
static void __init
lopec_map_io(void)
......
......@@ -6,7 +6,7 @@
* Author: Mark A. Greer
* mgreer@mvista.com
*
* Copyright 2001 MontaVista Software Inc.
* Copyright 2001-2002 MontaVista Software Inc.
*
* 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
......@@ -31,7 +31,6 @@
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/ide.h>
#include <linux/irq.h>
#include <linux/seq_file.h>
#include <asm/system.h>
......@@ -125,7 +124,7 @@ mcpn765_setup_arch(void)
OpenPIC_NumInitSenses = sizeof(mcpn765_openpic_initsenses);
printk("Motorola MCG MCPN765 cPCI Non-System Board\n");
printk("MCPN765 port (C) 2001 MontaVista Software, Inc. (source@mvista.com)\n");
printk("MCPN765 port (MontaVista Software, Inc. (source@mvista.com))\n");
if ( ppc_md.progress )
ppc_md.progress("mcpn765_setup_arch: exit", 0);
......
......@@ -72,7 +72,6 @@
#include <asm/todc.h>
#include <asm/bootinfo.h>
#undef CONFIG_SERIAL_TEXT_DEBUG
#undef DUMP_DBATS
TODC_ALLOC();
......@@ -500,9 +499,7 @@ platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
#ifdef CONFIG_SERIAL_TEXT_DEBUG
ppc_md.progress = pplus_progress;
#else /* !CONFIG_SERIAL_TEXT_DEBUG */
ppc_md.progress = NULL;
#endif /* CONFIG_SERIAL_TEXT_DEBUG */
#endif
#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
ppc_ide_md.default_irq = pplus_ide_default_irq;
......
......@@ -117,9 +117,6 @@ prep_show_cpuinfo(struct seq_file *m)
{
extern char *Motherboard_map_name;
int cachew;
#ifdef CONFIG_PREP_RESIDUAL
int i;
#endif
seq_printf(m, "machine\t\t: PReP %s\n", Motherboard_map_name);
......@@ -180,6 +177,8 @@ prep_show_cpuinfo(struct seq_file *m)
no_l2:
#ifdef CONFIG_PREP_RESIDUAL
if (res->ResidualLength != 0) {
int i;
/* print info about SIMMs */
seq_printf(m, "simms\t\t: ");
for (i = 0; (res->ActualNumMemories) && (i < MAX_MEMS); i++) {
......@@ -812,8 +811,8 @@ prep_map_io(void)
io_block_mapping(0xf0000000, PREP_ISA_MEM_BASE, 0x08000000, _PAGE_IO);
}
static void __init
prep_init2(void)
static int __init
prep_request_io(void)
{
#ifdef CONFIG_NVRAM
request_region(PREP_NVRAM_AS0, 0x8, "nvram");
......@@ -822,8 +821,12 @@ prep_init2(void)
request_region(0x40,0x20,"timer");
request_region(0x80,0x10,"dma page reg");
request_region(0xc0,0x20,"dma2");
return 0;
}
device_initcall(prep_request_io);
void __init
prep_init(unsigned long r3, unsigned long r4, unsigned long r5,
unsigned long r6, unsigned long r7)
......@@ -863,7 +866,6 @@ prep_init(unsigned long r3, unsigned long r4, unsigned long r5,
ppc_md.init_IRQ = prep_init_IRQ;
/* this gets changed later on if we have an OpenPIC -- Cort */
ppc_md.get_irq = i8259_irq;
ppc_md.init = prep_init2;
ppc_md.restart = prep_restart;
ppc_md.power_off = prep_power_off;
......
......@@ -876,3 +876,38 @@ PnP_TAG_PACKET __init *PnP_find_large_vendor_packet(unsigned char *p,
};
return 0; /* not found */
}
#ifdef CONFIG_PROC_PREPRESIDUAL
static int proc_prep_residual_read(char * buf, char ** start, off_t off,
int count, int *eof, void *data)
{
int n;
n = res->ResidualLength - off;
if (n < 0) {
*eof = 1;
n = 0;
}
else {
if (n > count)
n = count;
else
*eof = 1;
memcpy(buf, (char *)res + off, n);
*start = buf;
}
return n;
}
void __init
proc_prep_residual_init(void)
{
if (res->ResidualLength)
create_proc_read_entry("residual", S_IRUGO, NULL,
proc_prep_residual_read, NULL);
}
__initcall(proc_prep_residual_init);
#endif
......@@ -6,7 +6,7 @@
* Author: Mark A. Greer
* mgreer@mvista.com
*
* Copyright 2000, 2001 MontaVista Software Inc.
* Copyright 2000-2002 MontaVista Software Inc.
*
* 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
......@@ -71,7 +71,6 @@
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/ide.h>
#include <linux/irq.h>
#include <linux/seq_file.h>
#include <asm/system.h>
......@@ -180,7 +179,7 @@ sandpoint_setup_arch(void)
#endif
printk("Motorola SPS Sandpoint Test Platform\n");
printk("Sandpoint port (C) 2000, 2001 MontaVista Software, Inc. (source@mvista.com)\n");
printk("Sandpoint port (MontaVista Software, Inc. (source@mvista.com))\n");
/* The Sandpoint rom doesn't enable any caches. Do that now.
* The 7450 portion will also set up the L3s once I get enough
......
......@@ -9,8 +9,7 @@
extern struct hw_interrupt_type i8259_pic;
void i8259_init(long);
int i8259_irq(struct pt_regs *regs);
int i8259_poll(void);
extern void i8259_init(long intack_addr);
extern int i8259_irq(struct pt_regs *regs);
#endif /* _PPC_KERNEL_i8259_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