Commit 4675d604 authored by Anton Altaparmakov's avatar Anton Altaparmakov

Merge cantab.net:/home/src/ntfs-2.6

into cantab.net:/home/src/ntfs-2.6-devel
parents 7b70b359 1f5c9ef7
...@@ -349,6 +349,8 @@ prototypes: ...@@ -349,6 +349,8 @@ prototypes:
loff_t *, int); loff_t *, int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long (*get_unmapped_area)(struct file *, unsigned long,
unsigned long, unsigned long, unsigned long); unsigned long, unsigned long, unsigned long);
int (*check_flags)(int);
int (*dir_notify)(struct file *, unsigned long);
}; };
locking rules: locking rules:
...@@ -375,6 +377,8 @@ writev: no ...@@ -375,6 +377,8 @@ writev: no
sendfile: no sendfile: no
sendpage: no sendpage: no
get_unmapped_area: no get_unmapped_area: no
check_flags: no
dir_notify: no
->llseek() locking has moved from llseek to the individual llseek ->llseek() locking has moved from llseek to the individual llseek
implementations. If your fs is not using generic_file_llseek, you implementations. If your fs is not using generic_file_llseek, you
......
...@@ -7,7 +7,7 @@ linux/parisc. ...@@ -7,7 +7,7 @@ linux/parisc.
A lot of the assembly code currently runs in real mode, which means A lot of the assembly code currently runs in real mode, which means
absolute addresses are used instead of virtual addresses as in the absolute addresses are used instead of virtual addresses as in the
rest of the kernel. To translate an absolute address to a virtual rest of the kernel. To translate an absolute address to a virtual
address you can lookup in System.map, add __PAGE_OFFSET (0xc0000000 address you can lookup in System.map, add __PAGE_OFFSET (0x10000000
currently). currently).
...@@ -21,7 +21,7 @@ the I/O range); the System Responder address is the address real-mode ...@@ -21,7 +21,7 @@ the I/O range); the System Responder address is the address real-mode
code tried to access. code tried to access.
Typical values for the System Responder address are addresses larger Typical values for the System Responder address are addresses larger
than __PAGE_OFFSET (0xc0000000) which mean a virtual address didn't than __PAGE_OFFSET (0x10000000) which mean a virtual address didn't
get translated to a physical address before real-mode code tried to get translated to a physical address before real-mode code tried to
access it. access it.
......
...@@ -4,8 +4,6 @@ Register Usage for Linux/PA-RISC ...@@ -4,8 +4,6 @@ Register Usage for Linux/PA-RISC
General Registers as specified by ABI General Registers as specified by ABI
FPU Registers must not be used in kernel mode
Control Registers Control Registers
CR 0 (Recovery Counter) used for ptrace CR 0 (Recovery Counter) used for ptrace
...@@ -13,11 +11,15 @@ CR 1-CR 7(undefined) unused ...@@ -13,11 +11,15 @@ CR 1-CR 7(undefined) unused
CR 8 (Protection ID) per-process value* CR 8 (Protection ID) per-process value*
CR 9, 12, 13 (PIDS) unused CR 9, 12, 13 (PIDS) unused
CR10 (CCR) lazy FPU saving* CR10 (CCR) lazy FPU saving*
CR11 as specified by ABI CR11 as specified by ABI (SAR)
CR14 (interruption vector) initialized to fault_vector CR14 (interruption vector) initialized to fault_vector
CR15 (EIEM) initialized to all ones* CR15 (EIEM) initialized to all ones*
CR16 (Interval Timer) read for cycle count/write starts Interval Tmr CR16 (Interval Timer) read for cycle count/write starts Interval Tmr
CR17-CR22 interruption parameters CR17-CR22 interruption parameters
CR19 Interrupt Instruction Register
CR20 Interrupt Space Register
CR21 Interrupt Offset Register
CR22 Interrupt PSW
CR23 (EIRR) read for pending interrupts/write clears bits CR23 (EIRR) read for pending interrupts/write clears bits
CR24 (TR 0) Kernel Space Page Directory Pointer CR24 (TR 0) Kernel Space Page Directory Pointer
CR25 (TR 1) User Space Page Directory Pointer CR25 (TR 1) User Space Page Directory Pointer
......
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 8 SUBLEVEL = 8
EXTRAVERSION =-rc4 EXTRAVERSION = .1
NAME=Zonked Quokka NAME=Zonked Quokka
# *DOCUMENTATION* # *DOCUMENTATION*
......
...@@ -253,7 +253,7 @@ menu "General setup" ...@@ -253,7 +253,7 @@ menu "General setup"
# Select various configuration options depending on the machine type # Select various configuration options depending on the machine type
config DISCONTIGMEM config DISCONTIGMEM
bool bool
depends on ARCH_EDB7211 || ARCH_SA1100 || (ARCH_LH7A40X && !LH7A40X_SROMLL) depends on ARCH_EDB7211 || ARCH_SA1100 || (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
default y default y
help help
Say Y to support efficient handling of discontiguous physical memory, Say Y to support efficient handling of discontiguous physical memory,
......
...@@ -55,7 +55,7 @@ tune-$(CONFIG_CPU_XSCALE) :=$(call check_gcc,-mtune=xscale,-mtune=strongarm110) ...@@ -55,7 +55,7 @@ tune-$(CONFIG_CPU_XSCALE) :=$(call check_gcc,-mtune=xscale,-mtune=strongarm110)
tune-$(CONFIG_CPU_V6) :=-mtune=strongarm tune-$(CONFIG_CPU_V6) :=-mtune=strongarm
# Need -Uarm for gcc < 3.x # Need -Uarm for gcc < 3.x
CFLAGS +=-mapcs-32 $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Wa,-mno-fpu -Uarm CFLAGS +=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Wa,-mno-fpu -Uarm
AFLAGS +=-mapcs-32 $(arch-y) $(tune-y) -msoft-float -Wa,-mno-fpu AFLAGS +=-mapcs-32 $(arch-y) $(tune-y) -msoft-float -Wa,-mno-fpu
CHECK := $(CHECK) -D__arm__=1 CHECK := $(CHECK) -D__arm__=1
......
...@@ -4,11 +4,10 @@ ...@@ -4,11 +4,10 @@
# Object file lists. # Object file lists.
obj-y := fiq.o time.o obj-y := time.o
# generic.o
obj-$(CONFIG_MACH_KEV7A400) += arch-kev7a400.o irq-lh7a400.o obj-$(CONFIG_MACH_KEV7A400) += arch-kev7a400.o irq-lh7a400.o
obj-$(CONFIG_MACH_LPD7A400) += arch-lpd7a40x.o ide-lpd7a40x.o irq-lh7a400.o obj-$(CONFIG_MACH_LPD7A400) += arch-lpd7a40x.o irq-lh7a400.o
obj-$(CONFIG_MACH_LPD7A404) += arch-lpd7a40x.o ide-lpd7a40x.o irq-lh7a404.o obj-$(CONFIG_MACH_LPD7A404) += arch-lpd7a40x.o irq-lh7a404.o
obj-m := obj-m :=
obj-n := obj-n :=
......
...@@ -265,6 +265,7 @@ lpd7a400_map_io(void) ...@@ -265,6 +265,7 @@ lpd7a400_map_io(void)
#ifdef CONFIG_MACH_LPD7A400 #ifdef CONFIG_MACH_LPD7A400
extern void lh7a400_init_irq (void); extern void lh7a400_init_irq (void);
extern void lh7a40x_init_time (void);
MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10") MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10")
MAINTAINER ("Marc Singer") MAINTAINER ("Marc Singer")
...@@ -272,6 +273,7 @@ MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10") ...@@ -272,6 +273,7 @@ MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10")
BOOT_PARAMS (0xc0000100) BOOT_PARAMS (0xc0000100)
MAPIO (lpd7a400_map_io) MAPIO (lpd7a400_map_io)
INITIRQ (lh7a400_init_irq) INITIRQ (lh7a400_init_irq)
INITTIME (lh7a40x_init_time)
INIT_MACHINE (lpd7a40x_init) INIT_MACHINE (lpd7a40x_init)
MACHINE_END MACHINE_END
......
/*
* linux/arch/arm/lib/lh7a400-fiqhandler.S
* Copyright (C) 2002, Lineo, Inc.
* based on linux/arch/arm/lib/floppydma.S, which is
* Copyright (C) 1995, 1996 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/linkage.h>
#include <asm/assembler.h>
.text
.global fiqhandler_end
@ register usage:
@ r8 &interrupt controller registers
@ r9 &gpio registers
@ r11 work
@ r12 work
ENTRY(fiqhandler)
@ read the status register to find out which FIQ this is
ldr r12, [r8] @ intc->status
and r12, r12, #0xf @ only interested in low-order 4 bits
@ translate FIQ 0:3 to IRQ 23:26
@ disable this FIQ and enable the corresponding IRQ
str r12, [r8, #0xc] @ disable this FIQ
mov r12, r12, lsl #23 @ get the corresopnding IRQ bit
str r12, [r8, #0x8] @ enable that IRQ
subs pc, lr, #4
fiqhandler_end:
/* arch/arm/mach-lh7a40x/ide-lpd7a40x.c
*
* Copyright (C) 2004 Logic Product Development
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*/
#include <linux/config.h>
#include <linux/ide.h>
#include <asm/io.h>
#define IOBARRIER_READ readl (IOBARRIER_VIRT)
static u8 lpd7a40x_ide_inb (unsigned long port)
{
u16 v = (u16) readw (port & ~0x1);
IOBARRIER_READ;
if (port & 0x1)
v >>= 8;
return v & 0xff;
}
static u16 lpd7a40x_ide_inw (unsigned long port)
{
u16 v = (u16) readw (port);
IOBARRIER_READ;
return v;
}
static void lpd7a40x_ide_insw (unsigned long port, void *addr, u32 count)
{
while (count--) {
*((u16*) addr)++ = (u16) readw (port);
IOBARRIER_READ;
}
}
static u32 lpd7a40x_ide_inl (unsigned long port)
{
u32 v = (u16) readw (port);
IOBARRIER_READ;
v |= (u16) readw (port + 2);
IOBARRIER_READ;
return v;
}
static void lpd7a40x_ide_insl (unsigned long port, void *addr, u32 count)
{
while (count--) {
*((u16*) addr)++ = (u16) readw (port);
IOBARRIER_READ;
*((u16*) addr)++ = (u16) readw (port + 2);
IOBARRIER_READ;
}
}
/* lpd7a40x_ide_outb -- this function is complicated by the fact that
* the user wants to be able to do byte IO and the hardware cannot.
* In order to write the high byte, we need to write a short. So, we
* read before writing in order to maintain the register values that
* shouldn't change. This isn't a good idea for the data IO registers
* since reading from them will not return the current value. We
* expect that this function handles the control register adequately.
*/
static void lpd7a40x_ide_outb (u8 valueUser, unsigned long port)
{
/* Block writes to SELECT register. Draconian, but the only
* way to cope with this hardware configuration without
* modifying the SELECT_DRIVE call in the ide driver. */
if ((port & 0xf) == 0x6)
return;
if (port & 0x1) { /* Perform read before write. Only
* the COMMAND register needs
* this. */
u16 value = (u16) readw (port & ~0x1);
IOBARRIER_READ;
value = (value & 0x00ff) | (valueUser << 8);
writew (value, port & ~0x1);
IOBARRIER_READ;
}
else { /* Allow low-byte writes which seem to
* be OK. */
writeb (valueUser, port);
IOBARRIER_READ;
}
}
static void lpd7a40x_ide_outbsync (ide_drive_t *drive, u8 value,
unsigned long port)
{
lpd7a40x_ide_outb (value, port);
}
static void lpd7a40x_ide_outw (u16 value, unsigned long port)
{
writew (value, port);
IOBARRIER_READ;
}
static void lpd7a40x_ide_outsw (unsigned long port, void *addr, u32 count)
{
while (count-- > 0) {
writew (*((u16*) addr)++, port);
IOBARRIER_READ;
}
}
static void lpd7a40x_ide_outl (u32 value, unsigned long port)
{
writel (value, port);
IOBARRIER_READ;
}
static void lpd7a40x_ide_outsl (unsigned long port, void *addr, u32 count)
{
while (count-- > 0) {
writel (*((u32*) addr)++, port);
IOBARRIER_READ;
}
}
void lpd7a40x_SELECT_DRIVE (ide_drive_t *drive)
{
unsigned jifStart = jiffies;
#define WAIT_TIME (30*HZ/1000)
/* Check for readiness. */
while ((HWIF(drive)->INB(IDE_STATUS_REG) & 0x40) == 0)
if (jifStart <= jiffies + WAIT_TIME)
return;
/* Only allow one drive.
For more information, see Documentation/arm/Sharp-LH/ */
if (drive->select.all & (1<<4))
return;
/* OUTW so that the IDLE_IMMEDIATE (and not NOP) command is sent. */
HWIF(drive)->OUTW(drive->select.all | 0xe100, IDE_SELECT_REG);
}
void lpd7a40x_hwif_ioops (ide_hwif_t *hwif)
{
hwif->mmio = 2; /* Just for show */
hwif->irq = IDE_NO_IRQ; /* Stop this probing */
hwif->OUTB = lpd7a40x_ide_outb;
hwif->OUTBSYNC = lpd7a40x_ide_outbsync;
hwif->OUTW = lpd7a40x_ide_outw;
hwif->OUTL = lpd7a40x_ide_outl;
hwif->OUTSW = lpd7a40x_ide_outsw;
hwif->OUTSL = lpd7a40x_ide_outsl;
hwif->INB = lpd7a40x_ide_inb;
hwif->INW = lpd7a40x_ide_inw;
hwif->INL = lpd7a40x_ide_inl;
hwif->INSW = lpd7a40x_ide_insw;
hwif->INSL = lpd7a40x_ide_insl;
hwif->selectproc = lpd7a40x_SELECT_DRIVE;
}
...@@ -84,6 +84,11 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; ...@@ -84,6 +84,11 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
#warning ACPI uses CMPXCHG, i486 and later hardware #warning ACPI uses CMPXCHG, i486 and later hardware
#endif #endif
#define MAX_MADT_ENTRIES 256
u8 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] =
{ [0 ... MAX_MADT_ENTRIES-1] = 0xff };
EXPORT_SYMBOL(x86_acpiid_to_apicid);
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Boot-time Configuration Boot-time Configuration
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
...@@ -225,6 +230,8 @@ acpi_parse_lapic ( ...@@ -225,6 +230,8 @@ acpi_parse_lapic (
if (processor->flags.enabled == 0) if (processor->flags.enabled == 0)
return 0; return 0;
x86_acpiid_to_apicid[processor->acpi_id] = processor->id;
mp_register_lapic ( mp_register_lapic (
processor->id, /* APIC ID */ processor->id, /* APIC ID */
processor->flags.enabled); /* Enabled? */ processor->flags.enabled); /* Enabled? */
......
...@@ -77,10 +77,7 @@ void __init acpi_reserve_bootmem(void) ...@@ -77,10 +77,7 @@ void __init acpi_reserve_bootmem(void)
printk(KERN_ERR "ACPI: Wakeup code way too big, S3 disabled.\n"); printk(KERN_ERR "ACPI: Wakeup code way too big, S3 disabled.\n");
return; return;
} }
#ifdef CONFIG_X86_PAE
printk(KERN_ERR "ACPI: S3 and PAE do not like each other for now, S3 disabled.\n");
return;
#endif
acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE); acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE);
if (!acpi_wakeup_address) if (!acpi_wakeup_address)
printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n"); printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n");
......
...@@ -108,13 +108,27 @@ acpi_processor_set_performance ( ...@@ -108,13 +108,27 @@ acpi_processor_set_performance (
u32 value = 0; u32 value = 0;
int i = 0; int i = 0;
struct cpufreq_freqs cpufreq_freqs; struct cpufreq_freqs cpufreq_freqs;
cpumask_t saved_mask;
int retval;
ACPI_FUNCTION_TRACE("acpi_processor_set_performance"); ACPI_FUNCTION_TRACE("acpi_processor_set_performance");
/*
* TBD: Use something other than set_cpus_allowed.
* As set_cpus_allowed is a bit racy,
* with any other set_cpus_allowed for this process.
*/
saved_mask = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(cpu));
if (smp_processor_id() != cpu) {
return_VALUE(-EAGAIN);
}
if (state == data->acpi_data.state) { if (state == data->acpi_data.state) {
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Already at target state (P%d)\n", state)); "Already at target state (P%d)\n", state));
return_VALUE(0); retval = 0;
goto migrate_end;
} }
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n",
...@@ -144,7 +158,8 @@ acpi_processor_set_performance ( ...@@ -144,7 +158,8 @@ acpi_processor_set_performance (
if (ret) { if (ret) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, ACPI_DEBUG_PRINT((ACPI_DB_WARN,
"Invalid port width 0x%04x\n", bit_width)); "Invalid port width 0x%04x\n", bit_width));
return_VALUE(ret); retval = ret;
goto migrate_end;
} }
/* /*
...@@ -166,7 +181,8 @@ acpi_processor_set_performance ( ...@@ -166,7 +181,8 @@ acpi_processor_set_performance (
if (ret) { if (ret) {
ACPI_DEBUG_PRINT((ACPI_DB_WARN, ACPI_DEBUG_PRINT((ACPI_DB_WARN,
"Invalid port width 0x%04x\n", bit_width)); "Invalid port width 0x%04x\n", bit_width));
return_VALUE(ret); retval = ret;
goto migrate_end;
} }
if (value == (u32) data->acpi_data.states[state].status) if (value == (u32) data->acpi_data.states[state].status)
break; break;
...@@ -183,7 +199,8 @@ acpi_processor_set_performance ( ...@@ -183,7 +199,8 @@ acpi_processor_set_performance (
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE);
cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE);
ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Transition failed\n")); ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Transition failed\n"));
return_VALUE(-ENODEV); retval = -ENODEV;
goto migrate_end;
} }
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
...@@ -192,7 +209,10 @@ acpi_processor_set_performance ( ...@@ -192,7 +209,10 @@ acpi_processor_set_performance (
data->acpi_data.state = state; data->acpi_data.state = state;
return_VALUE(0); retval = 0;
migrate_end:
set_cpus_allowed(current, saved_mask);
return_VALUE(retval);
} }
...@@ -266,6 +286,69 @@ acpi_cpufreq_guess_freq ( ...@@ -266,6 +286,69 @@ acpi_cpufreq_guess_freq (
} }
/*
* acpi_processor_cpu_init_pdc_est - let BIOS know about the SMP capabilities
* of this driver
* @perf: processor-specific acpi_io_data struct
* @cpu: CPU being initialized
*
* To avoid issues with legacy OSes, some BIOSes require to be informed of
* the SMP capabilities of OS P-state driver. Here we set the bits in _PDC
* accordingly, for Enhanced Speedstep. Actual call to _PDC is done in
* driver/acpi/processor.c
*/
static void
acpi_processor_cpu_init_pdc_est(
struct acpi_processor_performance *perf,
unsigned int cpu,
struct acpi_object_list *obj_list
)
{
union acpi_object *obj;
u32 *buf;
struct cpuinfo_x86 *c = cpu_data + cpu;
ACPI_FUNCTION_TRACE("acpi_processor_cpu_init_pdc_est");
if (!cpu_has(c, X86_FEATURE_EST))
return_VOID;
/* Initialize pdc. It will be used later. */
if (!obj_list)
return_VOID;
if (!(obj_list->count && obj_list->pointer))
return_VOID;
obj = obj_list->pointer;
if ((obj->buffer.length == 12) && obj->buffer.pointer) {
buf = (u32 *)obj->buffer.pointer;
buf[0] = ACPI_PDC_REVISION_ID;
buf[1] = 1;
buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
perf->pdc = obj_list;
}
return_VOID;
}
/* CPU specific PDC initialization */
static void
acpi_processor_cpu_init_pdc(
struct acpi_processor_performance *perf,
unsigned int cpu,
struct acpi_object_list *obj_list
)
{
struct cpuinfo_x86 *c = cpu_data + cpu;
ACPI_FUNCTION_TRACE("acpi_processor_cpu_init_pdc");
perf->pdc = NULL;
if (cpu_has(c, X86_FEATURE_EST))
acpi_processor_cpu_init_pdc_est(perf, cpu, obj_list);
return_VOID;
}
static int static int
acpi_cpufreq_cpu_init ( acpi_cpufreq_cpu_init (
struct cpufreq_policy *policy) struct cpufreq_policy *policy)
...@@ -275,7 +358,14 @@ acpi_cpufreq_cpu_init ( ...@@ -275,7 +358,14 @@ acpi_cpufreq_cpu_init (
struct cpufreq_acpi_io *data; struct cpufreq_acpi_io *data;
unsigned int result = 0; unsigned int result = 0;
union acpi_object arg0 = {ACPI_TYPE_BUFFER};
u32 arg0_buf[3];
struct acpi_object_list arg_list = {1, &arg0};
ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_init"); ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_init");
/* setup arg_list for _PDC settings */
arg0.buffer.length = 12;
arg0.buffer.pointer = (u8 *) arg0_buf;
data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
if (!data) if (!data)
...@@ -284,7 +374,10 @@ acpi_cpufreq_cpu_init ( ...@@ -284,7 +374,10 @@ acpi_cpufreq_cpu_init (
acpi_io_data[cpu] = data; acpi_io_data[cpu] = data;
acpi_processor_cpu_init_pdc(&data->acpi_data, cpu, &arg_list);
result = acpi_processor_register_performance(&data->acpi_data, cpu); result = acpi_processor_register_performance(&data->acpi_data, cpu);
data->acpi_data.pdc = NULL;
if (result) if (result)
goto err_free; goto err_free;
......
...@@ -162,27 +162,6 @@ static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string) ...@@ -162,27 +162,6 @@ static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string)
#define NO_MATCH { DMI_NONE, NULL} #define NO_MATCH { DMI_NONE, NULL}
#define MATCH DMI_MATCH #define MATCH DMI_MATCH
/*
* Some machines, usually laptops, can't handle an enabled local APIC.
* The symptoms include hangs or reboots when suspending or resuming,
* attaching or detaching the power cord, or entering BIOS setup screens
* through magic key sequences.
*/
static int __init local_apic_kills_bios(struct dmi_blacklist *d)
{
#ifdef CONFIG_X86_LOCAL_APIC
extern int enable_local_apic;
if (enable_local_apic == 0) {
enable_local_apic = -1;
printk(KERN_WARNING "%s with broken BIOS detected. "
"Refusing to enable the local APIC.\n",
d->ident);
}
#endif
return 0;
}
/* /*
* Toshiba keyboard likes to repeat keys when they are not repeated. * Toshiba keyboard likes to repeat keys when they are not repeated.
*/ */
...@@ -284,32 +263,6 @@ static __init int disable_acpi_pci(struct dmi_blacklist *d) ...@@ -284,32 +263,6 @@ static __init int disable_acpi_pci(struct dmi_blacklist *d)
static __initdata struct dmi_blacklist dmi_blacklist[]={ static __initdata struct dmi_blacklist dmi_blacklist[]={
/* Machines which have problems handling enabled local APICs */
{ local_apic_kills_bios, "Dell Inspiron", {
MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
MATCH(DMI_PRODUCT_NAME, "Inspiron"),
NO_MATCH, NO_MATCH
} },
{ local_apic_kills_bios, "Dell Latitude", {
MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
MATCH(DMI_PRODUCT_NAME, "Latitude"),
NO_MATCH, NO_MATCH
} },
{ local_apic_kills_bios, "IBM Thinkpad T20", {
MATCH(DMI_BOARD_VENDOR, "IBM"),
MATCH(DMI_BOARD_NAME, "264741U"),
NO_MATCH, NO_MATCH
} },
{ local_apic_kills_bios, "ASUS L3C", {
MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
MATCH(DMI_BOARD_NAME, "P4_L3C"),
NO_MATCH, NO_MATCH
} },
{ broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */ { broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */
MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"), MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
NO_MATCH, NO_MATCH, NO_MATCH NO_MATCH, NO_MATCH, NO_MATCH
......
...@@ -238,14 +238,39 @@ void mask_and_ack_8259A(unsigned int irq) ...@@ -238,14 +238,39 @@ void mask_and_ack_8259A(unsigned int irq)
} }
} }
static char irq_trigger[2];
/**
* ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ
*/
static void restore_ELCR(char *trigger)
{
outb(trigger[0], 0x4d0);
outb(trigger[1], 0x4d1);
}
static void save_ELCR(char *trigger)
{
/* IRQ 0,1,2,8,13 are marked as reserved */
trigger[0] = inb(0x4d0) & 0xF8;
trigger[1] = inb(0x4d1) & 0xDE;
}
static int i8259A_resume(struct sys_device *dev) static int i8259A_resume(struct sys_device *dev)
{ {
init_8259A(0); init_8259A(0);
restore_ELCR(irq_trigger);
return 0;
}
static int i8259A_suspend(struct sys_device *dev, u32 state)
{
save_ELCR(irq_trigger);
return 0; return 0;
} }
static struct sysdev_class i8259_sysdev_class = { static struct sysdev_class i8259_sysdev_class = {
set_kset_name("i8259"), set_kset_name("i8259"),
.suspend = i8259A_suspend,
.resume = i8259A_resume, .resume = i8259A_resume,
}; };
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/compiler.h> #include <linux/compiler.h>
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/sysdev.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/desc.h> #include <asm/desc.h>
...@@ -2262,6 +2263,98 @@ static int __init io_apic_bug_finalize(void) ...@@ -2262,6 +2263,98 @@ static int __init io_apic_bug_finalize(void)
late_initcall(io_apic_bug_finalize); late_initcall(io_apic_bug_finalize);
struct sysfs_ioapic_data {
struct sys_device dev;
struct IO_APIC_route_entry entry[0];
};
static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
static int ioapic_suspend(struct sys_device *dev, u32 state)
{
struct IO_APIC_route_entry *entry;
struct sysfs_ioapic_data *data;
unsigned long flags;
int i;
data = container_of(dev, struct sysfs_ioapic_data, dev);
entry = data->entry;
spin_lock_irqsave(&ioapic_lock, flags);
for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
*(((int *)entry) + 1) = io_apic_read(dev->id, 0x11 + 2 * i);
*(((int *)entry) + 0) = io_apic_read(dev->id, 0x10 + 2 * i);
}
spin_unlock_irqrestore(&ioapic_lock, flags);
return 0;
}
static int ioapic_resume(struct sys_device *dev)
{
struct IO_APIC_route_entry *entry;
struct sysfs_ioapic_data *data;
unsigned long flags;
union IO_APIC_reg_00 reg_00;
int i;
data = container_of(dev, struct sysfs_ioapic_data, dev);
entry = data->entry;
spin_lock_irqsave(&ioapic_lock, flags);
reg_00.raw = io_apic_read(dev->id, 0);
if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
io_apic_write(dev->id, 0, reg_00.raw);
}
for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
io_apic_write(dev->id, 0x11+2*i, *(((int *)entry)+1));
io_apic_write(dev->id, 0x10+2*i, *(((int *)entry)+0));
}
spin_unlock_irqrestore(&ioapic_lock, flags);
return 0;
}
static struct sysdev_class ioapic_sysdev_class = {
set_kset_name("ioapic"),
.suspend = ioapic_suspend,
.resume = ioapic_resume,
};
static int __init ioapic_init_sysfs(void)
{
struct sys_device * dev;
int i, size, error = 0;
error = sysdev_class_register(&ioapic_sysdev_class);
if (error)
return error;
for (i = 0; i < nr_ioapics; i++ ) {
size = sizeof(struct sys_device) + nr_ioapic_registers[i]
* sizeof(struct IO_APIC_route_entry);
mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL);
if (!mp_ioapic_data[i]) {
printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
continue;
}
memset(mp_ioapic_data[i], 0, size);
dev = &mp_ioapic_data[i]->dev;
dev->id = i;
dev->cls = &ioapic_sysdev_class;
error = sysdev_register(dev);
if (error) {
kfree(mp_ioapic_data[i]);
mp_ioapic_data[i] = NULL;
printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
continue;
}
}
return 0;
}
device_initcall(ioapic_init_sysfs);
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
ACPI-based IOAPIC Configuration ACPI-based IOAPIC Configuration
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
......
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
#include <asm/ist.h> #include <asm/ist.h>
#include <asm/io.h> #include <asm/io.h>
#include "setup_arch_pre.h" #include "setup_arch_pre.h"
#include <bios_ebda.h>
/* This value is set up by the early boot code to point to the value /* This value is set up by the early boot code to point to the value
immediately after the boot time page tables. It contains a *physical* immediately after the boot time page tables. It contains a *physical*
...@@ -991,6 +992,17 @@ static void __init register_bootmem_low_pages(unsigned long max_low_pfn) ...@@ -991,6 +992,17 @@ static void __init register_bootmem_low_pages(unsigned long max_low_pfn)
} }
} }
/*
* workaround for Dell systems that neglect to reserve EBDA
*/
static void __init reserve_ebda_region(void)
{
unsigned int addr;
addr = get_bios_ebda();
if (addr)
reserve_bootmem(addr, PAGE_SIZE);
}
static unsigned long __init setup_memory(void) static unsigned long __init setup_memory(void)
{ {
unsigned long bootmap_size, start_pfn, max_low_pfn; unsigned long bootmap_size, start_pfn, max_low_pfn;
...@@ -1037,6 +1049,9 @@ static unsigned long __init setup_memory(void) ...@@ -1037,6 +1049,9 @@ static unsigned long __init setup_memory(void)
*/ */
reserve_bootmem(0, PAGE_SIZE); reserve_bootmem(0, PAGE_SIZE);
/* reserve EBDA region, it's a 4K region */
reserve_ebda_region();
/* could be an AMD 768MPX chipset. Reserve a page before VGA to prevent /* could be an AMD 768MPX chipset. Reserve a page before VGA to prevent
PCI prefetch into it (errata #56). Usually the page is reserved anyways, PCI prefetch into it (errata #56). Usually the page is reserved anyways,
unless you have no PS/2 mouse plugged in. */ unless you have no PS/2 mouse plugged in. */
......
...@@ -72,6 +72,10 @@ static cpumask_t smp_commenced_mask; ...@@ -72,6 +72,10 @@ static cpumask_t smp_commenced_mask;
/* Per CPU bogomips and other parameters */ /* Per CPU bogomips and other parameters */
struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
u8 x86_cpu_to_apicid[NR_CPUS] =
{ [0 ... NR_CPUS-1] = 0xff };
EXPORT_SYMBOL(x86_cpu_to_apicid);
/* Set when the idlers are all forked */ /* Set when the idlers are all forked */
int smp_threads_ready; int smp_threads_ready;
...@@ -875,6 +879,7 @@ static int __init do_boot_cpu(int apicid) ...@@ -875,6 +879,7 @@ static int __init do_boot_cpu(int apicid)
inquire_remote_apic(apicid); inquire_remote_apic(apicid);
} }
} }
x86_cpu_to_apicid[cpu] = apicid;
if (boot_error) { if (boot_error) {
/* Try to put things back the way they were before ... */ /* Try to put things back the way they were before ... */
unmap_cpu_to_logical_apicid(cpu); unmap_cpu_to_logical_apicid(cpu);
...@@ -957,6 +962,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) ...@@ -957,6 +962,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID)); boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
boot_cpu_logical_apicid = logical_smp_processor_id(); boot_cpu_logical_apicid = logical_smp_processor_id();
x86_cpu_to_apicid[0] = boot_cpu_physical_apicid;
current_thread_info()->cpu = 0; current_thread_info()->cpu = 0;
smp_tune_scheduling(); smp_tune_scheduling();
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <asm/e820.h> #include <asm/e820.h>
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/mmzone.h> #include <asm/mmzone.h>
#include <bios_ebda.h>
struct pglist_data *node_data[MAX_NUMNODES]; struct pglist_data *node_data[MAX_NUMNODES];
bootmem_data_t node0_bdata; bootmem_data_t node0_bdata;
...@@ -219,6 +220,17 @@ static unsigned long calculate_numa_remap_pages(void) ...@@ -219,6 +220,17 @@ static unsigned long calculate_numa_remap_pages(void)
return reserve_pages; return reserve_pages;
} }
/*
* workaround for Dell systems that neglect to reserve EBDA
*/
static void __init reserve_ebda_region_node(void)
{
unsigned int addr;
addr = get_bios_ebda();
if (addr)
reserve_bootmem_node(NODE_DATA(0), addr, PAGE_SIZE);
}
unsigned long __init setup_memory(void) unsigned long __init setup_memory(void)
{ {
int nid; int nid;
...@@ -318,6 +330,9 @@ unsigned long __init setup_memory(void) ...@@ -318,6 +330,9 @@ unsigned long __init setup_memory(void)
*/ */
reserve_bootmem_node(NODE_DATA(0), PAGE_SIZE, PAGE_SIZE); reserve_bootmem_node(NODE_DATA(0), PAGE_SIZE, PAGE_SIZE);
/* reserve EBDA region, it's a 4K region */
reserve_ebda_region_node();
#ifdef CONFIG_ACPI_SLEEP #ifdef CONFIG_ACPI_SLEEP
/* /*
* Reserve low memory region for sleep support. * Reserve low memory region for sleep support.
......
...@@ -65,6 +65,11 @@ void (*pm_power_off) (void); ...@@ -65,6 +65,11 @@ void (*pm_power_off) (void);
unsigned char acpi_kbd_controller_present = 1; unsigned char acpi_kbd_controller_present = 1;
unsigned char acpi_legacy_devices; unsigned char acpi_legacy_devices;
#define MAX_SAPICS 256
u16 ia64_acpiid_to_sapicid[MAX_SAPICS] =
{ [0 ... MAX_SAPICS - 1] = -1 };
EXPORT_SYMBOL(ia64_acpiid_to_sapicid);
const char * const char *
acpi_get_sysname (void) acpi_get_sysname (void)
{ {
...@@ -193,6 +198,7 @@ acpi_parse_lsapic (acpi_table_entry_header *header, const unsigned long end) ...@@ -193,6 +198,7 @@ acpi_parse_lsapic (acpi_table_entry_header *header, const unsigned long end)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid; smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid;
#endif #endif
ia64_acpiid_to_sapicid[lsapic->acpi_id] = (lsapic->id << 8) | lsapic->eid;
++available_cpus; ++available_cpus;
} }
......
...@@ -136,6 +136,20 @@ config SMP ...@@ -136,6 +136,20 @@ config SMP
If you don't know what to do here, say N. If you don't know what to do here, say N.
config HOTPLUG_CPU
bool
default y if SMP
select HOTPLUG
config DISCONTIGMEM
bool "Discontiguous memory support (EXPERIMENTAL)"
depends on EXPERIMENTAL
help
Say Y to support efficient handling of discontiguous physical memory,
for architectures which are either NUMA (Non-Uniform Memory Access)
or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more.
config PREEMPT config PREEMPT
bool bool
# bool "Preemptible Kernel" # bool "Preemptible Kernel"
...@@ -204,6 +218,24 @@ config MAGIC_SYSRQ ...@@ -204,6 +218,24 @@ config MAGIC_SYSRQ
keys are documented in <file:Documentation/sysrq.txt>. Don't say Y keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
unless you really know what this hack does. unless you really know what this hack does.
config DEBUG_SPINLOCK
bool "Spinlock debugging"
depends on DEBUG_KERNEL
help
Say Y here and build SMP to catch missing spinlock initialization
and certain other kinds of spinlock errors commonly made. This is
best used in conjunction with the NMI watchdog so that spinlock
deadlocks are also debuggable.
config DEBUG_RWLOCK
bool "Read-write spinlock debugging"
depends on DEBUG_KERNEL && SMP
help
If you say Y here then read-write lock processing will count how many
times it has tried to get the lock and issue an error message after
too many attempts. If you suspect a rwlock problem or a kernel
hacker asks for this option then say Y. Otherwise say N.
config FRAME_POINTER config FRAME_POINTER
bool "Compile the kernel with frame pointers" bool "Compile the kernel with frame pointers"
help help
......
...@@ -20,19 +20,23 @@ CONFIG_BROKEN_ON_SMP=y ...@@ -20,19 +20,23 @@ CONFIG_BROKEN_ON_SMP=y
# #
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=16 CONFIG_LOG_BUF_SHIFT=16
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y 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_CC_OPTIMIZE_FOR_SIZE is not set # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
# #
...@@ -51,11 +55,12 @@ CONFIG_KMOD=y ...@@ -51,11 +55,12 @@ CONFIG_KMOD=y
# CONFIG_PA7000 is not set # CONFIG_PA7000 is not set
# CONFIG_PA7100LC is not set # CONFIG_PA7100LC is not set
# CONFIG_PA7200 is not set # CONFIG_PA7200 is not set
# CONFIG_PA7300LC is not set
CONFIG_PA8X00=y CONFIG_PA8X00=y
CONFIG_PA20=y CONFIG_PA20=y
CONFIG_PREFETCH=y
CONFIG_PARISC64=y CONFIG_PARISC64=y
CONFIG_64BIT=y CONFIG_64BIT=y
# CONFIG_PDC_NARROW is not set
# CONFIG_SMP is not set # CONFIG_SMP is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
CONFIG_COMPAT=y CONFIG_COMPAT=y
...@@ -71,8 +76,8 @@ CONFIG_PCI_LBA=y ...@@ -71,8 +76,8 @@ CONFIG_PCI_LBA=y
CONFIG_IOSAPIC=y CONFIG_IOSAPIC=y
CONFIG_IOMMU_SBA=y CONFIG_IOMMU_SBA=y
# CONFIG_SUPERIO is not set # CONFIG_SUPERIO is not set
CONFIG_CHASSIS_LCD_LED=y # CONFIG_CHASSIS_LCD_LED is not set
# CONFIG_PDC_CHASSIS is not set CONFIG_PDC_CHASSIS=y
# #
# PCMCIA/CardBus support # PCMCIA/CardBus support
...@@ -168,7 +173,7 @@ CONFIG_SCSI_REPORT_LUNS=y ...@@ -168,7 +173,7 @@ CONFIG_SCSI_REPORT_LUNS=y
# SCSI Transport Attributes # SCSI Transport Attributes
# #
CONFIG_SCSI_SPI_ATTRS=y CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set CONFIG_SCSI_FC_ATTRS=m
# #
# SCSI low-level drivers # SCSI low-level drivers
...@@ -197,6 +202,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 ...@@ -197,6 +202,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_IOMAPPED=y CONFIG_SCSI_SYM53C8XX_IOMAPPED=y
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_PCI2000 is not set # CONFIG_SCSI_PCI2000 is not set
# CONFIG_SCSI_PCI2220I is not set # CONFIG_SCSI_PCI2220I is not set
# CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_ISP is not set
...@@ -219,6 +225,7 @@ CONFIG_SCSI_DEBUG=m ...@@ -219,6 +225,7 @@ CONFIG_SCSI_DEBUG=m
# #
# CONFIG_PCMCIA_FDOMAIN is not set # CONFIG_PCMCIA_FDOMAIN is not set
# CONFIG_PCMCIA_QLOGIC is not set # CONFIG_PCMCIA_QLOGIC is not set
# CONFIG_PCMCIA_SYM53C500 is not set
# #
# Multi-device support (RAID and LVM) # Multi-device support (RAID and LVM)
...@@ -249,6 +256,7 @@ CONFIG_FUSION_CTL=m ...@@ -249,6 +256,7 @@ CONFIG_FUSION_CTL=m
# #
# I2O device support # I2O device support
# #
# CONFIG_I2O is not set
# #
# Networking support # Networking support
...@@ -284,8 +292,6 @@ CONFIG_INET_ESP=m ...@@ -284,8 +292,6 @@ CONFIG_INET_ESP=m
# #
# CONFIG_IP_VS is not set # CONFIG_IP_VS is not set
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
CONFIG_NETFILTER=y CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set # CONFIG_NETFILTER_DEBUG is not set
...@@ -345,6 +351,8 @@ CONFIG_IP_NF_ARPFILTER=m ...@@ -345,6 +351,8 @@ CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP_NF_ARP_MANGLE=m
# CONFIG_IP_NF_COMPAT_IPCHAINS is not set # CONFIG_IP_NF_COMPAT_IPCHAINS is not set
# CONFIG_IP_NF_COMPAT_IPFWADM is not set # CONFIG_IP_NF_COMPAT_IPFWADM is not set
CONFIG_IP_NF_TARGET_NOTRACK=m
CONFIG_IP_NF_RAW=m
CONFIG_XFRM=y CONFIG_XFRM=y
CONFIG_XFRM_USER=m CONFIG_XFRM_USER=m
...@@ -353,7 +361,9 @@ CONFIG_XFRM_USER=m ...@@ -353,7 +361,9 @@ CONFIG_XFRM_USER=m
# #
# CONFIG_IP_SCTP is not set # CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
CONFIG_LLC=m CONFIG_LLC=m
CONFIG_LLC2=m CONFIG_LLC2=m
# CONFIG_IPX is not set # CONFIG_IPX is not set
...@@ -374,18 +384,23 @@ CONFIG_LLC2=m ...@@ -374,18 +384,23 @@ CONFIG_LLC2=m
# Network testing # Network testing
# #
CONFIG_NET_PKTGEN=m CONFIG_NET_PKTGEN=m
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
CONFIG_DUMMY=m CONFIG_DUMMY=m
CONFIG_BONDING=m CONFIG_BONDING=m
# CONFIG_EQUALIZER is not set # CONFIG_EQUALIZER is not set
CONFIG_TUN=m CONFIG_TUN=m
# CONFIG_ETHERTAP is not set # CONFIG_ETHERTAP is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
# #
...@@ -432,7 +447,6 @@ CONFIG_8139TOO=m ...@@ -432,7 +447,6 @@ CONFIG_8139TOO=m
# CONFIG_8139TOO_TUNE_TWISTER is not set # CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not set # CONFIG_8139TOO_8129 is not set
# CONFIG_8139_OLD_RX_RESET is not set # CONFIG_8139_OLD_RX_RESET is not set
CONFIG_8139_RXBUF_IDX=1
# CONFIG_SIS900 is not set # CONFIG_SIS900 is not set
CONFIG_EPIC100=m CONFIG_EPIC100=m
# CONFIG_SUNDANCE is not set # CONFIG_SUNDANCE is not set
...@@ -451,7 +465,6 @@ CONFIG_E1000_NAPI=y ...@@ -451,7 +465,6 @@ CONFIG_E1000_NAPI=y
# CONFIG_HAMACHI is not set # CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set # CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set # CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
CONFIG_TIGON3=m CONFIG_TIGON3=m
...@@ -460,17 +473,13 @@ CONFIG_TIGON3=m ...@@ -460,17 +473,13 @@ CONFIG_TIGON3=m
# #
CONFIG_IXGB=m CONFIG_IXGB=m
CONFIG_IXGB_NAPI=y CONFIG_IXGB_NAPI=y
# CONFIG_FDDI is not set CONFIG_S2IO=m
# CONFIG_HIPPI is not set CONFIG_S2IO_NAPI=y
CONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not set #
# CONFIG_PPP_FILTER is not set # Token Ring devices
CONFIG_PPP_ASYNC=m #
CONFIG_PPP_SYNC_TTY=m # CONFIG_TR is not set
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
# CONFIG_PPPOE is not set
# CONFIG_SLIP is not set
# #
# Wireless LAN (non-hamradio) # Wireless LAN (non-hamradio)
...@@ -512,19 +521,6 @@ CONFIG_AIRO_CS=m ...@@ -512,19 +521,6 @@ CONFIG_AIRO_CS=m
# CONFIG_PRISM54 is not set # CONFIG_PRISM54 is not set
CONFIG_NET_WIRELESS=y CONFIG_NET_WIRELESS=y
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
# #
# PCMCIA network device support # PCMCIA network device support
# #
...@@ -539,21 +535,23 @@ CONFIG_PCMCIA_XIRC2PS=m ...@@ -539,21 +535,23 @@ CONFIG_PCMCIA_XIRC2PS=m
# CONFIG_PCMCIA_AXNET is not set # CONFIG_PCMCIA_AXNET is not set
# #
# Amateur Radio support # Wan interfaces
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# Bluetooth support
# #
# CONFIG_BT is not set # CONFIG_WAN is not set
# CONFIG_NETPOLL is not set # CONFIG_FDDI is not set
# CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_HIPPI is not set
CONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
# CONFIG_PPPOE is not set
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
# #
# ISDN subsystem # ISDN subsystem
...@@ -750,6 +748,7 @@ CONFIG_VFAT_FS=m ...@@ -750,6 +748,7 @@ CONFIG_VFAT_FS=m
# #
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set # CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_DEVPTS_FS_XATTR is not set
# CONFIG_TMPFS is not set # CONFIG_TMPFS is not set
...@@ -798,7 +797,6 @@ CONFIG_SMB_NLS_REMOTE="cp437" ...@@ -798,7 +797,6 @@ CONFIG_SMB_NLS_REMOTE="cp437"
CONFIG_CIFS=m CONFIG_CIFS=m
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
# CONFIG_AFS_FS is not set # CONFIG_AFS_FS is not set
# #
...@@ -891,11 +889,13 @@ CONFIG_CRYPTO_CAST6=m ...@@ -891,11 +889,13 @@ CONFIG_CRYPTO_CAST6=m
# CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_ARC4 is not set
CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_DEFLATE=m
# CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_MICHAEL_MIC is not set
CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_TEST=m
# #
# Library routines # Library routines
# #
CONFIG_CRC32=y CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m CONFIG_ZLIB_DEFLATE=m
...@@ -21,16 +21,20 @@ CONFIG_SWAP=y ...@@ -21,16 +21,20 @@ CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=15 CONFIG_LOG_BUF_SHIFT=15
# CONFIG_HOTPLUG is not set # CONFIG_HOTPLUG is not set
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
# CONFIG_EMBEDDED is not set # CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y 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_CC_OPTIMIZE_FOR_SIZE is not set # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
# #
...@@ -45,8 +49,9 @@ CONFIG_OBSOLETE_MODPARM=y ...@@ -45,8 +49,9 @@ CONFIG_OBSOLETE_MODPARM=y
# Processor type and features # Processor type and features
# #
# CONFIG_PA7000 is not set # CONFIG_PA7000 is not set
# CONFIG_PA7100LC is not set CONFIG_PA7100LC=y
CONFIG_PA7200=y # CONFIG_PA7200 is not set
# CONFIG_PA7300LC is not set
# CONFIG_PA8X00 is not set # CONFIG_PA8X00 is not set
CONFIG_PA11=y CONFIG_PA11=y
# CONFIG_64BIT is not set # CONFIG_64BIT is not set
...@@ -70,7 +75,7 @@ CONFIG_PCI_LEGACY_PROC=y ...@@ -70,7 +75,7 @@ CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y CONFIG_PCI_NAMES=y
CONFIG_GSC_DINO=y CONFIG_GSC_DINO=y
# CONFIG_PCI_LBA is not set # CONFIG_PCI_LBA is not set
# CONFIG_CHASSIS_LCD_LED is not set CONFIG_CHASSIS_LCD_LED=y
# CONFIG_PDC_CHASSIS is not set # CONFIG_PDC_CHASSIS is not set
# #
...@@ -86,6 +91,7 @@ CONFIG_BINFMT_ELF=y ...@@ -86,6 +91,7 @@ CONFIG_BINFMT_ELF=y
# #
# Generic Driver Options # Generic Driver Options
# #
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_DEBUG_DRIVER=y CONFIG_DEBUG_DRIVER=y
# #
...@@ -121,7 +127,7 @@ CONFIG_PARPORT_GSC=y ...@@ -121,7 +127,7 @@ CONFIG_PARPORT_GSC=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y
# CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_CARMEL=y # CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_RAM is not set
# #
...@@ -149,7 +155,6 @@ CONFIG_CHR_DEV_SG=y ...@@ -149,7 +155,6 @@ CONFIG_CHR_DEV_SG=y
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
# #
# CONFIG_SCSI_MULTI_LUN is not set # CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_REPORT_LUNS is not set
# CONFIG_SCSI_CONSTANTS is not set # CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_LOGGING is not set
...@@ -163,6 +168,7 @@ CONFIG_SCSI_SPI_ATTRS=y ...@@ -163,6 +168,7 @@ CONFIG_SCSI_SPI_ATTRS=y
# SCSI low-level drivers # SCSI low-level drivers
# #
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_7000FASST is not set
# CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AHA152X is not set # CONFIG_SCSI_AHA152X is not set
...@@ -171,11 +177,10 @@ CONFIG_SCSI_SPI_ATTRS=y ...@@ -171,11 +177,10 @@ CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_IN2000 is not set
# CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_MEGARAID is not set
# CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_CPQFCTS is not set
# CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_DTC3280 is not set
# CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA is not set
...@@ -197,6 +202,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 ...@@ -197,6 +202,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_ZALON is not set # CONFIG_SCSI_ZALON is not set
# CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PAS16 is not set
# CONFIG_SCSI_PSI240I is not set # CONFIG_SCSI_PSI240I is not set
...@@ -278,10 +284,10 @@ CONFIG_IP_PNP_BOOTP=y ...@@ -278,10 +284,10 @@ CONFIG_IP_PNP_BOOTP=y
# CONFIG_INET_AH is not set # CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set # CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set # CONFIG_INET_IPCOMP is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
# CONFIG_LLC2 is not set # CONFIG_LLC2 is not set
# CONFIG_IPX is not set # CONFIG_IPX is not set
# CONFIG_ATALK is not set # CONFIG_ATALK is not set
...@@ -290,21 +296,27 @@ CONFIG_IP_PNP_BOOTP=y ...@@ -290,21 +296,27 @@ CONFIG_IP_PNP_BOOTP=y
# QoS and/or fair queueing # QoS and/or fair queueing
# #
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
# #
# Network testing # Network testing
# #
# CONFIG_NET_PKTGEN is not set # CONFIG_NET_PKTGEN is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# #
# ARCnet devices # ARCnet devices
# #
# CONFIG_ARCNET is not set # CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
...@@ -351,15 +363,12 @@ CONFIG_TULIP=y ...@@ -351,15 +363,12 @@ CONFIG_TULIP=y
# Ethernet (10000 Mbit) # Ethernet (10000 Mbit)
# #
# CONFIG_IXGB is not set # CONFIG_IXGB is not set
# CONFIG_FDDI is not set # CONFIG_S2IO is not set
# CONFIG_PLIP is not set
CONFIG_PPP=y #
# CONFIG_PPP_FILTER is not set # Token Ring devices
# CONFIG_PPP_ASYNC is not set #
# CONFIG_PPP_SYNC_TTY is not set # CONFIG_TR is not set
# CONFIG_PPP_DEFLATE is not set
# CONFIG_PPP_BSDCOMP is not set
# CONFIG_SLIP is not set
# #
# Wireless LAN (non-hamradio) # Wireless LAN (non-hamradio)
...@@ -384,33 +393,20 @@ CONFIG_NET_RADIO=y ...@@ -384,33 +393,20 @@ CONFIG_NET_RADIO=y
# #
CONFIG_NET_WIRELESS=y CONFIG_NET_WIRELESS=y
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# #
# Wan interfaces # Wan interfaces
# #
# CONFIG_WAN is not set # CONFIG_WAN is not set
# CONFIG_FDDI is not set
# # CONFIG_PLIP is not set
# Amateur Radio support CONFIG_PPP=y
# # CONFIG_PPP_FILTER is not set
# CONFIG_HAMRADIO is not set # CONFIG_PPP_ASYNC is not set
# CONFIG_PPP_SYNC_TTY is not set
# # CONFIG_PPP_DEFLATE is not set
# IrDA (infrared) support # CONFIG_PPP_BSDCOMP is not set
# # CONFIG_SLIP is not set
# CONFIG_IRDA is not set # CONFIG_NET_FC is not set
#
# Bluetooth support
#
# CONFIG_BT is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# #
# ISDN subsystem # ISDN subsystem
...@@ -473,7 +469,6 @@ CONFIG_INPUT_MOUSE=y ...@@ -473,7 +469,6 @@ CONFIG_INPUT_MOUSE=y
# CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y CONFIG_INPUT_MISC=y
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_UINPUT is not set
# CONFIG_HP_SDC_RTC is not set # CONFIG_HP_SDC_RTC is not set
...@@ -542,6 +537,11 @@ CONFIG_GEN_RTC=y ...@@ -542,6 +537,11 @@ CONFIG_GEN_RTC=y
# #
# CONFIG_I2C is not set # CONFIG_I2C is not set
#
# Dallas's 1-wire bus
#
# CONFIG_W1 is not set
# #
# Misc devices # Misc devices
# #
...@@ -560,8 +560,10 @@ CONFIG_GEN_RTC=y ...@@ -560,8 +560,10 @@ CONFIG_GEN_RTC=y
# Graphics support # Graphics support
# #
CONFIG_FB=y CONFIG_FB=y
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set # CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set # CONFIG_FB_IMSTT is not set
CONFIG_FB_STI=y CONFIG_FB_STI=y
# CONFIG_FB_RIVA is not set # CONFIG_FB_RIVA is not set
...@@ -587,7 +589,6 @@ CONFIG_DUMMY_CONSOLE_COLUMNS=160 ...@@ -587,7 +589,6 @@ CONFIG_DUMMY_CONSOLE_COLUMNS=160
CONFIG_DUMMY_CONSOLE_ROWS=64 CONFIG_DUMMY_CONSOLE_ROWS=64
CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_PCI_CONSOLE=y
# CONFIG_FONTS is not set # CONFIG_FONTS is not set
CONFIG_FONT_8x8=y CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y CONFIG_FONT_8x16=y
...@@ -645,7 +646,8 @@ CONFIG_JOLIET=y ...@@ -645,7 +646,8 @@ CONFIG_JOLIET=y
# #
# DOS/FAT/NT Filesystems # DOS/FAT/NT Filesystems
# #
# CONFIG_FAT_FS is not set # CONFIG_MSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_NTFS_FS is not set # CONFIG_NTFS_FS is not set
# #
...@@ -653,6 +655,7 @@ CONFIG_JOLIET=y ...@@ -653,6 +655,7 @@ CONFIG_JOLIET=y
# #
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
...@@ -662,6 +665,7 @@ CONFIG_RAMFS=y ...@@ -662,6 +665,7 @@ CONFIG_RAMFS=y
# Miscellaneous filesystems # Miscellaneous filesystems
# #
# CONFIG_HFSPLUS_FS is not set # CONFIG_HFSPLUS_FS is not set
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
# CONFIG_CRAMFS is not set # CONFIG_CRAMFS is not set
# CONFIG_VXFS_FS is not set # CONFIG_VXFS_FS is not set
# CONFIG_HPFS_FS is not set # CONFIG_HPFS_FS is not set
...@@ -676,6 +680,7 @@ CONFIG_NFS_FS=y ...@@ -676,6 +680,7 @@ CONFIG_NFS_FS=y
CONFIG_NFS_V3=y CONFIG_NFS_V3=y
CONFIG_NFSD=y CONFIG_NFSD=y
CONFIG_NFSD_V3=y CONFIG_NFSD_V3=y
CONFIG_NFSD_TCP=y
CONFIG_ROOT_NFS=y CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y CONFIG_LOCKD_V4=y
...@@ -720,6 +725,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" ...@@ -720,6 +725,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set
# CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_3 is not set
...@@ -741,6 +747,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" ...@@ -741,6 +747,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
...@@ -770,12 +777,16 @@ CONFIG_CRYPTO=y ...@@ -770,12 +777,16 @@ CONFIG_CRYPTO=y
# CONFIG_CRYPTO_AES is not set # CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_CAST6 is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_DEFLATE is not set # CONFIG_CRYPTO_DEFLATE is not set
# CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set # CONFIG_CRYPTO_TEST is not set
# #
# Library routines # Library routines
# #
# CONFIG_CRC_CCITT is not set
CONFIG_CRC32=y CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set
...@@ -20,19 +20,23 @@ CONFIG_BROKEN_ON_SMP=y ...@@ -20,19 +20,23 @@ CONFIG_BROKEN_ON_SMP=y
# #
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
# CONFIG_POSIX_MQUEUE is not set
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=16 CONFIG_LOG_BUF_SHIFT=16
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_IOSCHED_NOOP=y 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_CC_OPTIMIZE_FOR_SIZE is not set # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
# #
...@@ -51,8 +55,10 @@ CONFIG_KMOD=y ...@@ -51,8 +55,10 @@ CONFIG_KMOD=y
# CONFIG_PA7000 is not set # CONFIG_PA7000 is not set
# CONFIG_PA7100LC is not set # CONFIG_PA7100LC is not set
# CONFIG_PA7200 is not set # CONFIG_PA7200 is not set
# CONFIG_PA7300LC is not set
CONFIG_PA8X00=y CONFIG_PA8X00=y
CONFIG_PA20=y CONFIG_PA20=y
CONFIG_PREFETCH=y
# CONFIG_PARISC64 is not set # CONFIG_PARISC64 is not set
# CONFIG_64BIT is not set # CONFIG_64BIT is not set
# CONFIG_SMP is not set # CONFIG_SMP is not set
...@@ -70,7 +76,7 @@ CONFIG_PCI_LBA=y ...@@ -70,7 +76,7 @@ CONFIG_PCI_LBA=y
CONFIG_IOSAPIC=y CONFIG_IOSAPIC=y
CONFIG_IOMMU_SBA=y CONFIG_IOMMU_SBA=y
CONFIG_SUPERIO=y CONFIG_SUPERIO=y
# CONFIG_CHASSIS_LCD_LED is not set CONFIG_CHASSIS_LCD_LED=y
# CONFIG_PDC_CHASSIS is not set # CONFIG_PDC_CHASSIS is not set
# #
...@@ -185,6 +191,7 @@ CONFIG_BLK_DEV_SIIMAGE=m ...@@ -185,6 +191,7 @@ CONFIG_BLK_DEV_SIIMAGE=m
# CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
CONFIG_BLK_DEV_IDEDMA=y CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not set # CONFIG_IDEDMA_IVB is not set
# CONFIG_IDEDMA_AUTO is not set # CONFIG_IDEDMA_AUTO is not set
...@@ -218,7 +225,7 @@ CONFIG_SCSI_REPORT_LUNS=y ...@@ -218,7 +225,7 @@ CONFIG_SCSI_REPORT_LUNS=y
# SCSI Transport Attributes # SCSI Transport Attributes
# #
CONFIG_SCSI_SPI_ATTRS=y CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set CONFIG_SCSI_FC_ATTRS=m
# #
# SCSI low-level drivers # SCSI low-level drivers
...@@ -236,7 +243,9 @@ CONFIG_SCSI_SATA=y ...@@ -236,7 +243,9 @@ CONFIG_SCSI_SATA=y
# CONFIG_SCSI_SATA_SVW is not set # CONFIG_SCSI_SATA_SVW is not set
CONFIG_SCSI_ATA_PIIX=m CONFIG_SCSI_ATA_PIIX=m
CONFIG_SCSI_SATA_PROMISE=m CONFIG_SCSI_SATA_PROMISE=m
# CONFIG_SCSI_SATA_SX4 is not set
CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIL=m
# CONFIG_SCSI_SATA_SIS is not set
CONFIG_SCSI_SATA_VIA=m CONFIG_SCSI_SATA_VIA=m
# CONFIG_SCSI_SATA_VITESSE is not set # CONFIG_SCSI_SATA_VITESSE is not set
# CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_BUSLOGIC is not set
...@@ -254,6 +263,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 ...@@ -254,6 +263,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_PCI2000 is not set # CONFIG_SCSI_PCI2000 is not set
# CONFIG_SCSI_PCI2220I is not set # CONFIG_SCSI_PCI2220I is not set
# CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_ISP is not set
...@@ -279,6 +289,7 @@ CONFIG_SCSI_DEBUG=m ...@@ -279,6 +289,7 @@ CONFIG_SCSI_DEBUG=m
# CONFIG_PCMCIA_FDOMAIN is not set # CONFIG_PCMCIA_FDOMAIN is not set
# CONFIG_PCMCIA_NINJA_SCSI is not set # CONFIG_PCMCIA_NINJA_SCSI is not set
CONFIG_PCMCIA_QLOGIC=m CONFIG_PCMCIA_QLOGIC=m
# CONFIG_PCMCIA_SYM53C500 is not set
# #
# Multi-device support (RAID and LVM) # Multi-device support (RAID and LVM)
...@@ -346,8 +357,6 @@ CONFIG_INET_ESP=m ...@@ -346,8 +357,6 @@ CONFIG_INET_ESP=m
# #
# CONFIG_IP_VS is not set # CONFIG_IP_VS is not set
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
CONFIG_NETFILTER=y CONFIG_NETFILTER=y
CONFIG_NETFILTER_DEBUG=y CONFIG_NETFILTER_DEBUG=y
...@@ -407,6 +416,7 @@ CONFIG_IP_NF_ARPFILTER=m ...@@ -407,6 +416,7 @@ CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_IP_NF_COMPAT_IPCHAINS=m CONFIG_IP_NF_COMPAT_IPCHAINS=m
CONFIG_IP_NF_COMPAT_IPFWADM=m CONFIG_IP_NF_COMPAT_IPFWADM=m
# CONFIG_IP_NF_RAW is not set
CONFIG_XFRM=y CONFIG_XFRM=y
CONFIG_XFRM_USER=m CONFIG_XFRM_USER=m
...@@ -415,7 +425,9 @@ CONFIG_XFRM_USER=m ...@@ -415,7 +425,9 @@ CONFIG_XFRM_USER=m
# #
# CONFIG_IP_SCTP is not set # CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
CONFIG_LLC=m CONFIG_LLC=m
CONFIG_LLC2=m CONFIG_LLC2=m
# CONFIG_IPX is not set # CONFIG_IPX is not set
...@@ -436,18 +448,23 @@ CONFIG_LLC2=m ...@@ -436,18 +448,23 @@ CONFIG_LLC2=m
# Network testing # Network testing
# #
# CONFIG_NET_PKTGEN is not set # CONFIG_NET_PKTGEN is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
CONFIG_DUMMY=m CONFIG_DUMMY=m
CONFIG_BONDING=m CONFIG_BONDING=m
# CONFIG_EQUALIZER is not set # CONFIG_EQUALIZER is not set
CONFIG_TUN=m CONFIG_TUN=m
# CONFIG_ETHERTAP is not set # CONFIG_ETHERTAP is not set
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
# #
...@@ -493,7 +510,6 @@ CONFIG_8139TOO=m ...@@ -493,7 +510,6 @@ CONFIG_8139TOO=m
# CONFIG_8139TOO_TUNE_TWISTER is not set # CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not set # CONFIG_8139TOO_8129 is not set
# CONFIG_8139_OLD_RX_RESET is not set # CONFIG_8139_OLD_RX_RESET is not set
CONFIG_8139_RXBUF_IDX=1
# CONFIG_SIS900 is not set # CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set # CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set # CONFIG_SUNDANCE is not set
...@@ -512,7 +528,6 @@ CONFIG_E1000=m ...@@ -512,7 +528,6 @@ CONFIG_E1000=m
# CONFIG_HAMACHI is not set # CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set # CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set # CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
CONFIG_TIGON3=m CONFIG_TIGON3=m
...@@ -521,36 +536,17 @@ CONFIG_TIGON3=m ...@@ -521,36 +536,17 @@ CONFIG_TIGON3=m
# #
CONFIG_IXGB=y CONFIG_IXGB=y
CONFIG_IXGB_NAPI=y CONFIG_IXGB_NAPI=y
# CONFIG_FDDI is not set # CONFIG_S2IO is not set
# CONFIG_HIPPI is not set
CONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPPOE=m
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
# #
# Token Ring devices # Token Ring devices
# #
# CONFIG_TR is not set # CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
# #
# Wan interfaces # Wireless LAN (non-hamradio)
# #
# CONFIG_WAN is not set # CONFIG_NET_RADIO is not set
# #
# PCMCIA network device support # PCMCIA network device support
...@@ -566,21 +562,23 @@ CONFIG_PCMCIA_XIRC2PS=m ...@@ -566,21 +562,23 @@ CONFIG_PCMCIA_XIRC2PS=m
CONFIG_PCMCIA_AXNET=m CONFIG_PCMCIA_AXNET=m
# #
# Amateur Radio support # Wan interfaces
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# Bluetooth support
# #
# CONFIG_BT is not set # CONFIG_WAN is not set
# CONFIG_NETPOLL is not set # CONFIG_FDDI is not set
# CONFIG_NET_POLL_CONTROLLER is not set # CONFIG_HIPPI is not set
CONFIG_PPP=m
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPPOE=m
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set
# #
# ISDN subsystem # ISDN subsystem
...@@ -727,6 +725,7 @@ CONFIG_FB=y ...@@ -727,6 +725,7 @@ CONFIG_FB=y
# CONFIG_FB_CIRRUS is not set # CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set # CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set # CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set # CONFIG_FB_IMSTT is not set
CONFIG_FB_STI=y CONFIG_FB_STI=y
# CONFIG_FB_RIVA is not set # CONFIG_FB_RIVA is not set
...@@ -833,6 +832,7 @@ CONFIG_USB_WACOM=m ...@@ -833,6 +832,7 @@ CONFIG_USB_WACOM=m
CONFIG_USB_KBTAB=m CONFIG_USB_KBTAB=m
# CONFIG_USB_POWERMATE is not set # CONFIG_USB_POWERMATE is not set
# CONFIG_USB_MTOUCH is not set # CONFIG_USB_MTOUCH is not set
# CONFIG_USB_EGALAX is not set
# CONFIG_USB_XPAD is not set # CONFIG_USB_XPAD is not set
# CONFIG_USB_ATI_REMOTE is not set # CONFIG_USB_ATI_REMOTE is not set
...@@ -881,6 +881,8 @@ CONFIG_USB_HPUSBSCSI=m ...@@ -881,6 +881,8 @@ CONFIG_USB_HPUSBSCSI=m
CONFIG_USB_LEGOTOWER=m CONFIG_USB_LEGOTOWER=m
# CONFIG_USB_LCD is not set # CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set # CONFIG_USB_LED is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGETSERVO is not set
# CONFIG_USB_TEST is not set # CONFIG_USB_TEST is not set
# #
...@@ -931,6 +933,7 @@ CONFIG_VFAT_FS=m ...@@ -931,6 +933,7 @@ CONFIG_VFAT_FS=m
# #
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set # CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y CONFIG_TMPFS=y
...@@ -976,7 +979,6 @@ CONFIG_SUNRPC=y ...@@ -976,7 +979,6 @@ CONFIG_SUNRPC=y
# CONFIG_CIFS is not set # CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
# CONFIG_AFS_FS is not set # CONFIG_AFS_FS is not set
# #
...@@ -1069,11 +1071,13 @@ CONFIG_CRYPTO_CAST6=m ...@@ -1069,11 +1071,13 @@ CONFIG_CRYPTO_CAST6=m
# CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_ARC4 is not set
CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_DEFLATE=m
# CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_MICHAEL_MIC is not set
CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_TEST=m
# #
# Library routines # Library routines
# #
CONFIG_CRC32=y CONFIG_CRC32=y
CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m CONFIG_ZLIB_DEFLATE=m
This diff is collapsed.
...@@ -888,6 +888,8 @@ CONFIG_OPROFILE=y ...@@ -888,6 +888,8 @@ CONFIG_OPROFILE=y
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_RWLOCK is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
......
...@@ -69,7 +69,7 @@ update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) ...@@ -69,7 +69,7 @@ update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
{ {
struct page *page = pte_page(pte); struct page *page = pte_page(pte);
if (VALID_PAGE(page) && page_mapping(page) && if (pfn_valid(page_to_pfn(page)) && page_mapping(page) &&
test_bit(PG_dcache_dirty, &page->flags)) { test_bit(PG_dcache_dirty, &page->flags)) {
flush_kernel_dcache_page(page_address(page)); flush_kernel_dcache_page(page_address(page));
...@@ -82,10 +82,11 @@ show_cache_info(struct seq_file *m) ...@@ -82,10 +82,11 @@ show_cache_info(struct seq_file *m)
{ {
seq_printf(m, "I-cache\t\t: %ld KB\n", seq_printf(m, "I-cache\t\t: %ld KB\n",
cache_info.ic_size/1024 ); cache_info.ic_size/1024 );
seq_printf(m, "D-cache\t\t: %ld KB (%s)%s\n", seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %d-way associative)\n",
cache_info.dc_size/1024, cache_info.dc_size/1024,
(cache_info.dc_conf.cc_wt ? "WT":"WB"), (cache_info.dc_conf.cc_wt ? "WT":"WB"),
(cache_info.dc_conf.cc_sh ? " - shared I/D":"") (cache_info.dc_conf.cc_sh ? ", shared I/D":""),
(cache_info.dc_conf.cc_assoc)
); );
seq_printf(m, "ITLB entries\t: %ld\n" "DTLB entries\t: %ld%s\n", seq_printf(m, "ITLB entries\t: %ld\n" "DTLB entries\t: %ld%s\n",
...@@ -123,46 +124,55 @@ parisc_cache_init(void) ...@@ -123,46 +124,55 @@ parisc_cache_init(void)
panic("parisc_cache_init: pdc_cache_info failed"); panic("parisc_cache_init: pdc_cache_info failed");
#if 0 #if 0
printk(KERN_DEBUG "ic_size %lx dc_size %lx it_size %lx pdc_cache_info %d*long pdc_cache_cf %d\n", printk("ic_size %lx dc_size %lx it_size %lx\n",
cache_info.ic_size, cache_info.ic_size,
cache_info.dc_size, cache_info.dc_size,
cache_info.it_size, cache_info.it_size);
sizeof (struct pdc_cache_info) / sizeof (long),
sizeof (struct pdc_cache_cf)
);
printk(KERN_DEBUG "dc base %x dc stride %x dc count %x dc loop %d\n", printk("DC base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx\n",
cache_info.dc_base, cache_info.dc_base,
cache_info.dc_stride, cache_info.dc_stride,
cache_info.dc_count, cache_info.dc_count,
cache_info.dc_loop); cache_info.dc_loop);
printk(KERN_DEBUG "dc conf: alias %d block %d line %d wt %d sh %d cst %d assoc %d\n", printk("dc_conf = 0x%lx alias %d blk %d line %d shift %d\n",
*(unsigned long *) (&cache_info.dc_conf),
cache_info.dc_conf.cc_alias, cache_info.dc_conf.cc_alias,
cache_info.dc_conf.cc_block, cache_info.dc_conf.cc_block,
cache_info.dc_conf.cc_line, cache_info.dc_conf.cc_line,
cache_info.dc_conf.cc_shift);
printk(" wt %d sh %d cst %d assoc %d\n",
cache_info.dc_conf.cc_wt, cache_info.dc_conf.cc_wt,
cache_info.dc_conf.cc_sh, cache_info.dc_conf.cc_sh,
cache_info.dc_conf.cc_cst, cache_info.dc_conf.cc_cst,
cache_info.dc_conf.cc_assoc); cache_info.dc_conf.cc_assoc);
printk(KERN_DEBUG "ic conf: alias %d block %d line %d wt %d sh %d cst %d assoc %d\n", printk("IC base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx\n",
cache_info.ic_base,
cache_info.ic_stride,
cache_info.ic_count,
cache_info.ic_loop);
printk("ic_conf = 0x%lx alias %d blk %d line %d shift %d\n",
*(unsigned long *) (&cache_info.ic_conf),
cache_info.ic_conf.cc_alias, cache_info.ic_conf.cc_alias,
cache_info.ic_conf.cc_block, cache_info.ic_conf.cc_block,
cache_info.ic_conf.cc_line, cache_info.ic_conf.cc_line,
cache_info.ic_conf.cc_shift);
printk(" wt %d sh %d cst %d assoc %d\n",
cache_info.ic_conf.cc_wt, cache_info.ic_conf.cc_wt,
cache_info.ic_conf.cc_sh, cache_info.ic_conf.cc_sh,
cache_info.ic_conf.cc_cst, cache_info.ic_conf.cc_cst,
cache_info.ic_conf.cc_assoc); cache_info.ic_conf.cc_assoc);
printk(KERN_DEBUG "dt conf: sh %d page %d cst %d aid %d pad1 %d \n", printk("D-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n",
cache_info.dt_conf.tc_sh, cache_info.dt_conf.tc_sh,
cache_info.dt_conf.tc_page, cache_info.dt_conf.tc_page,
cache_info.dt_conf.tc_cst, cache_info.dt_conf.tc_cst,
cache_info.dt_conf.tc_aid, cache_info.dt_conf.tc_aid,
cache_info.dt_conf.tc_pad1); cache_info.dt_conf.tc_pad1);
printk(KERN_DEBUG "it conf: sh %d page %d cst %d aid %d pad1 %d \n", printk("I-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n",
cache_info.it_conf.tc_sh, cache_info.it_conf.tc_sh,
cache_info.it_conf.tc_page, cache_info.it_conf.tc_page,
cache_info.it_conf.tc_cst, cache_info.it_conf.tc_cst,
...@@ -179,10 +189,14 @@ parisc_cache_init(void) ...@@ -179,10 +189,14 @@ parisc_cache_init(void)
split_tlb = 1; split_tlb = 1;
} }
dcache_stride = (1 << (cache_info.dc_conf.cc_block + 3)) * /* "New and Improved" version from Jim Hull
cache_info.dc_conf.cc_line; * (1 << (cc_block-1)) * (cc_line << (4 + cnf.cc_shift))
icache_stride = (1 << (cache_info.ic_conf.cc_block + 3)) * */
cache_info.ic_conf.cc_line; #define CAFL_STRIDE(cnf) (cnf.cc_line << (3 + cnf.cc_block + cnf.cc_shift))
dcache_stride = CAFL_STRIDE(cache_info.dc_conf);
icache_stride = CAFL_STRIDE(cache_info.ic_conf);
#undef CAFL_STRIDE
#ifndef CONFIG_PA20 #ifndef CONFIG_PA20
if (pdc_btlb_info(&btlb_info) < 0) { if (pdc_btlb_info(&btlb_info) < 0) {
memset(&btlb_info, 0, sizeof btlb_info); memset(&btlb_info, 0, sizeof btlb_info);
...@@ -191,8 +205,8 @@ parisc_cache_init(void) ...@@ -191,8 +205,8 @@ parisc_cache_init(void)
if ((boot_cpu_data.pdc.capabilities & PDC_MODEL_NVA_MASK) == if ((boot_cpu_data.pdc.capabilities & PDC_MODEL_NVA_MASK) ==
PDC_MODEL_NVA_UNSUPPORTED) { PDC_MODEL_NVA_UNSUPPORTED) {
printk(KERN_WARNING "Only equivalent aliasing supported\n"); printk(KERN_WARNING "parisc_cache_init: Only equivalent aliasing supported!\n");
#ifndef CONFIG_SMP #if 0
panic("SMP kernel required to avoid non-equivalent aliasing"); panic("SMP kernel required to avoid non-equivalent aliasing");
#endif #endif
} }
...@@ -228,7 +242,7 @@ void disable_sr_hashing(void) ...@@ -228,7 +242,7 @@ void disable_sr_hashing(void)
disable_sr_hashing_asm(srhash_type); disable_sr_hashing_asm(srhash_type);
} }
void __flush_dcache_page(struct page *page) void flush_dcache_page(struct page *page)
{ {
struct address_space *mapping = page_mapping(page); struct address_space *mapping = page_mapping(page);
struct vm_area_struct *mpnt = NULL; struct vm_area_struct *mpnt = NULL;
...@@ -236,6 +250,14 @@ void __flush_dcache_page(struct page *page) ...@@ -236,6 +250,14 @@ void __flush_dcache_page(struct page *page)
unsigned long offset; unsigned long offset;
unsigned long addr; unsigned long addr;
pgoff_t pgoff; pgoff_t pgoff;
pte_t *pte;
unsigned long pfn = page_to_pfn(page);
if (mapping && !mapping_mapped(mapping)) {
set_bit(PG_dcache_dirty, &page->flags);
return;
}
flush_kernel_dcache_page(page_address(page)); flush_kernel_dcache_page(page_address(page));
...@@ -262,7 +284,14 @@ void __flush_dcache_page(struct page *page) ...@@ -262,7 +284,14 @@ void __flush_dcache_page(struct page *page)
* isn't there, there's no point exciting the * isn't there, there's no point exciting the
* nadtlb handler into a nullification frenzy */ * nadtlb handler into a nullification frenzy */
if (!translation_exists(mpnt, addr))
if(!(pte = translation_exists(mpnt, addr)))
continue;
/* make sure we really have this page: the private
* mappings may cover this area but have COW'd this
* particular page */
if(pte_pfn(*pte) != pfn)
continue; continue;
__flush_cache_page(mpnt, addr); __flush_cache_page(mpnt, addr);
...@@ -271,7 +300,7 @@ void __flush_dcache_page(struct page *page) ...@@ -271,7 +300,7 @@ void __flush_dcache_page(struct page *page)
} }
flush_dcache_mmap_unlock(mapping); flush_dcache_mmap_unlock(mapping);
} }
EXPORT_SYMBOL(__flush_dcache_page); EXPORT_SYMBOL(flush_dcache_page);
/* Defined in arch/parisc/kernel/pacache.S */ /* Defined in arch/parisc/kernel/pacache.S */
EXPORT_SYMBOL(flush_kernel_dcache_range_asm); EXPORT_SYMBOL(flush_kernel_dcache_range_asm);
......
...@@ -455,8 +455,9 @@ ...@@ -455,8 +455,9 @@
/* Look up a PTE in a 2-Level scheme (faulting at each /* Look up a PTE in a 2-Level scheme (faulting at each
* level if the entry isn't present * level if the entry isn't present
* *
* NOTE: we use ldw even for LP64 because our pte * NOTE: we use ldw even for LP64, since the short pointers
* and pmd are allocated <4GB */ * can address up to 1TB
*/
.macro L2_ptep pmd,pte,index,va,fault .macro L2_ptep pmd,pte,index,va,fault
#if PT_NLEVELS == 3 #if PT_NLEVELS == 3
EXTR \va,31-ASM_PMD_SHIFT,ASM_BITS_PER_PMD,\index EXTR \va,31-ASM_PMD_SHIFT,ASM_BITS_PER_PMD,\index
...@@ -466,8 +467,15 @@ ...@@ -466,8 +467,15 @@
DEP %r0,31,PAGE_SHIFT,\pmd /* clear offset */ DEP %r0,31,PAGE_SHIFT,\pmd /* clear offset */
copy %r0,\pte copy %r0,\pte
ldw,s \index(\pmd),\pmd ldw,s \index(\pmd),\pmd
bb,>=,n \pmd,_PxD_PRESENT_BIT,\fault
DEP %r0,31,PxD_FLAG_SHIFT,\pmd /* clear flags */
copy \pmd,%r9
#ifdef __LP64__
shld %r9,PxD_VALUE_SHIFT,\pmd
#else
shlw %r9,PxD_VALUE_SHIFT,\pmd
#endif
EXTR \va,31-PAGE_SHIFT,ASM_BITS_PER_PTE,\index EXTR \va,31-PAGE_SHIFT,ASM_BITS_PER_PTE,\index
bb,>=,n \pmd,_PAGE_PRESENT_BIT,\fault
DEP %r0,31,PAGE_SHIFT,\pmd /* clear offset */ DEP %r0,31,PAGE_SHIFT,\pmd /* clear offset */
shladd \index,BITS_PER_PTE_ENTRY,\pmd,\pmd shladd \index,BITS_PER_PTE_ENTRY,\pmd,\pmd
LDREG %r0(\pmd),\pte /* pmd is now pte */ LDREG %r0(\pmd),\pte /* pmd is now pte */
...@@ -489,10 +497,14 @@ ...@@ -489,10 +497,14 @@
copy %r0,\pte copy %r0,\pte
extrd,u,*= \va,31,32,%r0 extrd,u,*= \va,31,32,%r0
ldw,s \index(\pgd),\pgd ldw,s \index(\pgd),\pgd
extrd,u,*= \va,31,32,%r0
bb,>=,n \pgd,_PxD_PRESENT_BIT,\fault
extrd,u,*= \va,31,32,%r0
shld \pgd,PxD_VALUE_SHIFT,\index
extrd,u,*= \va,31,32,%r0
copy \index,\pgd
extrd,u,*<> \va,31,32,%r0 extrd,u,*<> \va,31,32,%r0
ldo ASM_PGD_PMD_OFFSET(\pgd),\pgd ldo ASM_PGD_PMD_OFFSET(\pgd),\pgd
extrd,u,*= \va,31,32,%r0
bb,>=,n \pgd,_PAGE_PRESENT_BIT,\fault
L2_ptep \pgd,\pte,\index,\va,\fault L2_ptep \pgd,\pte,\index,\va,\fault
.endm .endm
...@@ -507,7 +519,7 @@ ...@@ -507,7 +519,7 @@
/* Set the dirty bit (and accessed bit). No need to be /* Set the dirty bit (and accessed bit). No need to be
* clever, this is only used from the dirty fault */ * clever, this is only used from the dirty fault */
.macro update_dirty ptep,pte,tmp,tmp1 .macro update_dirty ptep,pte,tmp
ldi _PAGE_ACCESSED|_PAGE_DIRTY,\tmp ldi _PAGE_ACCESSED|_PAGE_DIRTY,\tmp
or \tmp,\pte,\pte or \tmp,\pte,\pte
STREG \pte,0(\ptep) STREG \pte,0(\ptep)
...@@ -783,7 +795,7 @@ __kernel_thread: ...@@ -783,7 +795,7 @@ __kernel_thread:
ret_from_kernel_thread: ret_from_kernel_thread:
/* Call schedule_tail first though */ /* Call schedule_tail first though */
bl schedule_tail, %r2 BL schedule_tail, %r2
nop nop
LDREG TI_TASK-THREAD_SZ_ALGN(%r30), %r1 LDREG TI_TASK-THREAD_SZ_ALGN(%r30), %r1
...@@ -1441,14 +1453,14 @@ nadtlb_emulate: ...@@ -1441,14 +1453,14 @@ nadtlb_emulate:
and %r9,%r16,%r17 and %r9,%r16,%r17
cmpb,<>,n %r16,%r17,nadtlb_fault /* Not fdc,fic,pdc */ cmpb,<>,n %r16,%r17,nadtlb_fault /* Not fdc,fic,pdc */
bb,>=,n %r9,26,nadtlb_nullify /* m bit not set, just nullify */ bb,>=,n %r9,26,nadtlb_nullify /* m bit not set, just nullify */
b,l get_register,%r25 BL get_register,%r25
extrw,u %r9,15,5,%r8 /* Get index register # */ extrw,u %r9,15,5,%r8 /* Get index register # */
CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */ CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */
copy %r1,%r24 copy %r1,%r24
b,l get_register,%r25 BL get_register,%r25
extrw,u %r9,10,5,%r8 /* Get base register # */ extrw,u %r9,10,5,%r8 /* Get base register # */
CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */ CMPIB=,n -1,%r1,nadtlb_fault /* have to use slow path */
b,l set_register,%r25 BL set_register,%r25
add,l %r1,%r24,%r1 /* doesn't affect c/b bits */ add,l %r1,%r24,%r1 /* doesn't affect c/b bits */
nadtlb_nullify: nadtlb_nullify:
...@@ -1548,7 +1560,7 @@ dbit_spin_20w: ...@@ -1548,7 +1560,7 @@ dbit_spin_20w:
dbit_nolock_20w: dbit_nolock_20w:
#endif #endif
update_dirty ptp,pte,t0,t1 update_dirty ptp,pte,t1
make_insert_tlb spc,pte,prot make_insert_tlb spc,pte,prot
...@@ -1585,7 +1597,7 @@ dbit_spin_11: ...@@ -1585,7 +1597,7 @@ dbit_spin_11:
dbit_nolock_11: dbit_nolock_11:
#endif #endif
update_dirty ptp,pte,t0,t1 update_dirty ptp,pte,t1
make_insert_tlb_11 spc,pte,prot make_insert_tlb_11 spc,pte,prot
...@@ -1626,11 +1638,11 @@ dbit_spin_20: ...@@ -1626,11 +1638,11 @@ dbit_spin_20:
dbit_nolock_20: dbit_nolock_20:
#endif #endif
update_dirty ptp,pte,t0,t1 update_dirty ptp,pte,t1
make_insert_tlb spc,pte,prot make_insert_tlb spc,pte,prot
f_extend pte,t0 f_extend pte,t1
idtlbt pte,prot idtlbt pte,prot
......
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/pdcpat.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/processor.h> /* for boot_cpu_data */ #include <asm/processor.h> /* for boot_cpu_data */
...@@ -176,6 +177,8 @@ void __init set_firmware_width(void) ...@@ -176,6 +177,8 @@ void __init set_firmware_width(void)
*/ */
void pdc_emergency_unlock(void) void pdc_emergency_unlock(void)
{ {
/* Spinlock DEBUG code freaks out if we unconditionally unlock */
if (spin_is_locked(&pdc_lock))
spin_unlock(&pdc_lock); spin_unlock(&pdc_lock);
} }
...@@ -234,11 +237,11 @@ int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_inf ...@@ -234,11 +237,11 @@ int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_inf
#ifdef __LP64__ #ifdef __LP64__
int pdc_pat_chassis_send_log(unsigned long state, unsigned long data) int pdc_pat_chassis_send_log(unsigned long state, unsigned long data)
{ {
int retval = 0;
if (!is_pdc_pat()) if (!is_pdc_pat())
return -1; return -1;
int retval = 0;
spin_lock_irq(&pdc_lock); spin_lock_irq(&pdc_lock);
retval = mem_pdc_call(PDC_PAT_CHASSIS_LOG, PDC_PAT_CHASSIS_WRITE_LOG, __pa(&state), __pa(&data)); retval = mem_pdc_call(PDC_PAT_CHASSIS_LOG, PDC_PAT_CHASSIS_WRITE_LOG, __pa(&state), __pa(&data));
spin_unlock_irq(&pdc_lock); spin_unlock_irq(&pdc_lock);
...@@ -1146,6 +1149,49 @@ int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, ...@@ -1146,6 +1149,49 @@ int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr,
return retval; return retval;
} }
/**
* pdc_pat_io_pci_cfg_read - Read PCI configuration space.
* @pci_addr: PCI configuration space address for which the read request is being made.
* @pci_size: Size of read in bytes. Valid values are 1, 2, and 4.
* @mem_addr: Pointer to return memory buffer.
*
*/
int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *mem_addr)
{
int retval;
spin_lock_irq(&pdc_lock);
retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_READ,
__pa(pdc_result), pci_addr, pci_size);
switch(pci_size) {
case 1: *(u8 *) mem_addr = (u8) pdc_result[0];
case 2: *(u16 *)mem_addr = (u16) pdc_result[0];
case 4: *(u32 *)mem_addr = (u32) pdc_result[0];
}
spin_unlock_irq(&pdc_lock);
return retval;
}
/**
* pdc_pat_io_pci_cfg_write - Retrieve information about memory address ranges.
* @pci_addr: PCI configuration space address for which the write request is being made.
* @pci_size: Size of write in bytes. Valid values are 1, 2, and 4.
* @value: Pointer to 1, 2, or 4 byte value in low order end of argument to be
* written to PCI Config space.
*
*/
int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val)
{
int retval;
spin_lock_irq(&pdc_lock);
retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_WRITE,
pci_addr, pci_size, val);
spin_unlock_irq(&pdc_lock);
return retval;
}
#endif /* __LP64__ */ #endif /* __LP64__ */
...@@ -1230,29 +1276,29 @@ struct wide_stack { ...@@ -1230,29 +1276,29 @@ struct wide_stack {
long real64_call(unsigned long fn, ...) long real64_call(unsigned long fn, ...)
{ {
va_list args; va_list args;
extern struct wide_stack real_stack; extern struct wide_stack real64_stack __attribute__ ((alias ("real_stack")));
extern unsigned long real64_call_asm(unsigned long *, extern unsigned long real64_call_asm(unsigned long *,
unsigned long *, unsigned long *,
unsigned long); unsigned long);
va_start(args, fn); va_start(args, fn);
real_stack.arg0 = va_arg(args, unsigned long); real64_stack.arg0 = va_arg(args, unsigned long);
real_stack.arg1 = va_arg(args, unsigned long); real64_stack.arg1 = va_arg(args, unsigned long);
real_stack.arg2 = va_arg(args, unsigned long); real64_stack.arg2 = va_arg(args, unsigned long);
real_stack.arg3 = va_arg(args, unsigned long); real64_stack.arg3 = va_arg(args, unsigned long);
real_stack.arg4 = va_arg(args, unsigned long); real64_stack.arg4 = va_arg(args, unsigned long);
real_stack.arg5 = va_arg(args, unsigned long); real64_stack.arg5 = va_arg(args, unsigned long);
real_stack.arg6 = va_arg(args, unsigned long); real64_stack.arg6 = va_arg(args, unsigned long);
real_stack.arg7 = va_arg(args, unsigned long); real64_stack.arg7 = va_arg(args, unsigned long);
real_stack.arg8 = va_arg(args, unsigned long); real64_stack.arg8 = va_arg(args, unsigned long);
real_stack.arg9 = va_arg(args, unsigned long); real64_stack.arg9 = va_arg(args, unsigned long);
real_stack.arg10 = va_arg(args, unsigned long); real64_stack.arg10 = va_arg(args, unsigned long);
real_stack.arg11 = va_arg(args, unsigned long); real64_stack.arg11 = va_arg(args, unsigned long);
real_stack.arg12 = va_arg(args, unsigned long); real64_stack.arg12 = va_arg(args, unsigned long);
real_stack.arg13 = va_arg(args, unsigned long); real64_stack.arg13 = va_arg(args, unsigned long);
va_end(args); va_end(args);
return real64_call_asm(&real_stack.sp, &real_stack.arg0, fn); return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn);
} }
#endif /* __LP64__ */ #endif /* __LP64__ */
......
...@@ -263,6 +263,17 @@ static struct hp_hardware hp_hardware_list[] __initdata = { ...@@ -263,6 +263,17 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
{HPHW_NPROC,0x67E,0x4,0x81,"Hitachi Tiny 80"}, {HPHW_NPROC,0x67E,0x4,0x81,"Hitachi Tiny 80"},
{HPHW_NPROC,0x67F,0x4,0x81,"Hitachi Tiny 64"}, {HPHW_NPROC,0x67F,0x4,0x81,"Hitachi Tiny 64"},
{HPHW_NPROC,0x700,0x4,0x91,"NEC Aska Processor"}, {HPHW_NPROC,0x700,0x4,0x91,"NEC Aska Processor"},
{HPHW_NPROC,0x880,0x4,0x91,"Orca Mako"},
{HPHW_NPROC,0x881,0x4,0x91,"Everest Mako"},
{HPHW_NPROC,0x882,0x4,0x91,"Rainier/Medel Mako Slow"},
{HPHW_NPROC,0x883,0x4,0x91,"Rainier/Medel Mako Fast"},
{HPHW_NPROC,0x884,0x4,0x91,"Mt. Hamilton"},
{HPHW_NPROC,0x885,0x4,0x91,"Mt. Hamilton DC-"},
{HPHW_NPROC,0x886,0x4,0x91,"Storm Peak Slow DC-"},
{HPHW_NPROC,0x887,0x4,0x91,"Storm Peak Slow"},
{HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"},
{HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"},
{HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak"},
{HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"}, {HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"},
{HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"}, {HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"},
{HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"}, {HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"},
...@@ -535,14 +546,17 @@ static struct hp_hardware hp_hardware_list[] __initdata = { ...@@ -535,14 +546,17 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
{HPHW_BCPORT, 0x800, 0x0000C, 0x10, "DEW BC Merced Port"}, {HPHW_BCPORT, 0x800, 0x0000C, 0x10, "DEW BC Merced Port"},
{HPHW_BCPORT, 0x801, 0x0000C, 0x10, "SMC Bus Interface Merced Bus0"}, {HPHW_BCPORT, 0x801, 0x0000C, 0x10, "SMC Bus Interface Merced Bus0"},
{HPHW_BCPORT, 0x802, 0x0000C, 0x10, "SMC Bus INterface Merced Bus1"}, {HPHW_BCPORT, 0x802, 0x0000C, 0x10, "SMC Bus INterface Merced Bus1"},
{HPHW_BCPORT, 0x803, 0x0000C, 0x10, "IKE I/O Bus Converter Merced Port"}, {HPHW_BCPORT, 0x803, 0x0000C, 0x10, "IKE I/O BC Merced Port"},
{HPHW_BCPORT, 0x781, 0x0000C, 0x00, "IKE I/O Bus Converter Ropes Port"}, {HPHW_BCPORT, 0x781, 0x0000C, 0x00, "IKE I/O BC Ropes Port"},
{HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O Bus Converter Merced Port"}, {HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"},
{HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O Bus Converter Ropes Port"}, {HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"},
{HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"},
{HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"}, {HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"},
{HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"}, {HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"},
{HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"}, {HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"},
{HPHW_BRIDGE, 0x583, 0x000A5, 0x00, "Saga PCI Bridge"}, {HPHW_BRIDGE, 0x583, 0x000A5, 0x00, "Saga PCI Bridge"},
{HPHW_BRIDGE, 0x783, 0x0000A, 0x00, "Mercury PCI Bridge"},
{HPHW_BRIDGE, 0x784, 0x0000A, 0x00, "Quicksilver AGP Bridge"},
{HPHW_B_DMA, 0x004, 0x00018, 0x00, "Parallel I/O"}, {HPHW_B_DMA, 0x004, 0x00018, 0x00, "Parallel I/O"},
{HPHW_B_DMA, 0x004, 0x00019, 0x00, "Parallel RDB"}, {HPHW_B_DMA, 0x004, 0x00019, 0x00, "Parallel RDB"},
{HPHW_B_DMA, 0x004, 0x00020, 0x80, "MID_BUS PSI"}, {HPHW_B_DMA, 0x004, 0x00020, 0x80, "MID_BUS PSI"},
...@@ -1181,15 +1195,18 @@ static struct hp_hardware hp_hardware_list[] __initdata = { ...@@ -1181,15 +1195,18 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
{HPHW_IOA, 0x581, 0x0000B, 0x10, "Uturn-IOA BC Runway Port"}, {HPHW_IOA, 0x581, 0x0000B, 0x10, "Uturn-IOA BC Runway Port"},
{HPHW_IOA, 0x582, 0x0000B, 0x10, "Astro BC Runway Port"}, {HPHW_IOA, 0x582, 0x0000B, 0x10, "Astro BC Runway Port"},
{HPHW_IOA, 0x700, 0x0000B, 0x00, "NEC-IOS BC System Bus Port"}, {HPHW_IOA, 0x700, 0x0000B, 0x00, "NEC-IOS BC System Bus Port"},
{HPHW_IOA, 0x880, 0x0000C, 0x10, "Pluto BC McKinley Port"},
{HPHW_MEMORY, 0x002, 0x00008, 0x00, "MID_BUS"}, {HPHW_MEMORY, 0x002, 0x00008, 0x00, "MID_BUS"},
{HPHW_MEMORY, 0x063, 0x00009, 0x00, "712/132 L2 Upgrade"}, {HPHW_MEMORY, 0x063, 0x00009, 0x00, "712/132 L2 Upgrade"},
{HPHW_MEMORY, 0x064, 0x00009, 0x00, "712/160 L2 Upgrade"}, {HPHW_MEMORY, 0x064, 0x00009, 0x00, "712/160 L2 Upgrade"},
{HPHW_MEMORY, 0x065, 0x00009, 0x00, "715/132 L2 Upgrade"}, {HPHW_MEMORY, 0x065, 0x00009, 0x00, "715/132 L2 Upgrade"},
{HPHW_MEMORY, 0x066, 0x00009, 0x00, "715/160 L2 Upgrade"}, {HPHW_MEMORY, 0x066, 0x00009, 0x00, "715/160 L2 Upgrade"},
{HPHW_MEMORY, 0x0AF, 0x00009, 0x00, "Everest Mako Memory"},
{HPHW_OTHER, 0x004, 0x00030, 0x00, "Master"}, {HPHW_OTHER, 0x004, 0x00030, 0x00, "Master"},
{HPHW_OTHER, 0x004, 0x00034, 0x00, "Slave"}, {HPHW_OTHER, 0x004, 0x00034, 0x00, "Slave"},
{HPHW_OTHER, 0x004, 0x00038, 0x00, "EDU"}, {HPHW_OTHER, 0x004, 0x00038, 0x00, "EDU"},
{HPHW_OTHER, 0x004, 0x00049, 0x00, "LGB Control"}, {HPHW_OTHER, 0x004, 0x00049, 0x00, "LGB Control"},
{HPHW_MC, 0x004, 0x000C0, 0x00, "BMC IPMI Mgmt Ctlr"},
{HPHW_FAULTY, 0, } /* Special Marker for last entry */ {HPHW_FAULTY, 0, } /* Special Marker for last entry */
}; };
...@@ -1290,7 +1307,7 @@ char *cpu_name_version[][2] = { ...@@ -1290,7 +1307,7 @@ char *cpu_name_version[][2] = {
[pcxw] { "PA8500 (PCX-W)", "2.0" }, [pcxw] { "PA8500 (PCX-W)", "2.0" },
[pcxw_] { "PA8600 (PCX-W+)", "2.0" }, [pcxw_] { "PA8600 (PCX-W+)", "2.0" },
[pcxw2] { "PA8700 (PCX-W2)", "2.0" }, [pcxw2] { "PA8700 (PCX-W2)", "2.0" },
[mako] { "PA8800 (MAKO)", "2.0" } [mako] { "PA8800 (Mako)", "2.0" }
}; };
const char * __init const char * __init
......
...@@ -76,7 +76,8 @@ $bss_loop: ...@@ -76,7 +76,8 @@ $bss_loop:
/* Initialize startup VM. Just map first 8 MB of memory */ /* Initialize startup VM. Just map first 8 MB of memory */
ldil L%PA(pg0),%r1 ldil L%PA(pg0),%r1
ldo R%PA(pg0)(%r1),%r1 ldo R%PA(pg0)(%r1),%r1
ldo _PAGE_TABLE(%r1),%r3 shr %r1,PxD_VALUE_SHIFT,%r3
ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
ldil L%PA(swapper_pg_dir),%r4 ldil L%PA(swapper_pg_dir),%r4
ldo R%PA(swapper_pg_dir)(%r4),%r4 ldo R%PA(swapper_pg_dir)(%r4),%r4
...@@ -86,7 +87,7 @@ $bss_loop: ...@@ -86,7 +87,7 @@ $bss_loop:
ldo ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4 ldo ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
1: 1:
stw %r3,0(%r4) stw %r3,0(%r4)
ldo ASM_PAGE_SIZE(%r3),%r3 ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
addib,> -1,%r1,1b addib,> -1,%r1,1b
ldo ASM_PGD_ENTRY_SIZE(%r4),%r4 ldo ASM_PGD_ENTRY_SIZE(%r4),%r4
...@@ -266,6 +267,8 @@ smp_slave_stext: ...@@ -266,6 +267,8 @@ smp_slave_stext:
ldil L%PA(smp_init_current_idle_task),%sp ldil L%PA(smp_init_current_idle_task),%sp
ldo R%PA(smp_init_current_idle_task)(%sp),%sp ldo R%PA(smp_init_current_idle_task)(%sp),%sp
ldw 0(%sp),%sp /* load task address */ ldw 0(%sp),%sp /* load task address */
tophys_r1 %sp
ldw TASK_THREAD_INFO(%sp), %sp
mtctl %sp,%cr30 /* store in cr30 */ mtctl %sp,%cr30 /* store in cr30 */
addil L%THREAD_SZ_ALGN,%sp /* stack is above task */ addil L%THREAD_SZ_ALGN,%sp /* stack is above task */
ldo R%THREAD_SZ_ALGN(%r1),%sp ldo R%THREAD_SZ_ALGN(%r1),%sp
......
...@@ -80,7 +80,8 @@ $bss_loop: ...@@ -80,7 +80,8 @@ $bss_loop:
ldil L%PA(pmd0),%r5 ldil L%PA(pmd0),%r5
ldo R%PA(pmd0)(%r5),%r5 ldo R%PA(pmd0)(%r5),%r5
ldo _PAGE_TABLE(%r5),%r3 shrd %r5,PxD_VALUE_SHIFT,%r3
ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
ldil L%PA(swapper_pg_dir),%r4 ldil L%PA(swapper_pg_dir),%r4
ldo R%PA(swapper_pg_dir)(%r4),%r4 ldo R%PA(swapper_pg_dir)(%r4),%r4
...@@ -90,12 +91,13 @@ $bss_loop: ...@@ -90,12 +91,13 @@ $bss_loop:
stw %r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4) stw %r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4)
ldo _PAGE_TABLE(%r1),%r3 shrd %r1,PxD_VALUE_SHIFT,%r3
ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
ldo ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r5 ldo ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r5
ldi ASM_PT_INITIAL,%r1 ldi ASM_PT_INITIAL,%r1
1: 1:
stw %r3,0(%r5) stw %r3,0(%r5)
ldo ASM_PAGE_SIZE(%r3),%r3 ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
addib,> -1,%r1,1b addib,> -1,%r1,1b
ldo ASM_PMD_ENTRY_SIZE(%r5),%r5 ldo ASM_PMD_ENTRY_SIZE(%r5),%r5
...@@ -299,6 +301,7 @@ smp_slave_stext: ...@@ -299,6 +301,7 @@ smp_slave_stext:
/* Initialize the SP - monarch sets up smp_init_current_idle_task */ /* Initialize the SP - monarch sets up smp_init_current_idle_task */
load32 PA(smp_init_current_idle_task),%sp load32 PA(smp_init_current_idle_task),%sp
ldd 0(%sp),%sp /* load task address */ ldd 0(%sp),%sp /* load task address */
tophys_r1 %sp
ldd TASK_THREAD_INFO(%sp), %sp ldd TASK_THREAD_INFO(%sp), %sp
mtctl %sp,%cr30 /* store in cr30 */ mtctl %sp,%cr30 /* store in cr30 */
ldo THREAD_SZ_ALGN(%sp),%sp ldo THREAD_SZ_ALGN(%sp),%sp
......
...@@ -25,7 +25,9 @@ ...@@ -25,7 +25,9 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/mmzone.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/pdcpat.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/parisc-device.h> #include <asm/parisc-device.h>
......
...@@ -121,12 +121,6 @@ struct irqaction cpu_irq_actions[IRQ_PER_REGION] = { ...@@ -121,12 +121,6 @@ struct irqaction cpu_irq_actions[IRQ_PER_REGION] = {
#endif #endif
}; };
struct irq_region_ops cpu_irq_ops = {
.disable_irq = disable_cpu_irq,
.enable_irq = enable_cpu_irq,
.mask_irq = unmask_cpu_irq,
.unmask_irq = unmask_cpu_irq
};
struct irq_region cpu0_irq_region = { struct irq_region cpu0_irq_region = {
.ops = { .ops = {
...@@ -200,8 +194,8 @@ void enable_irq(int irq) ...@@ -200,8 +194,8 @@ void enable_irq(int irq)
{ {
struct irq_region *region; struct irq_region *region;
DBG_IRQ(irq, ("enable_irq(%d) %d+%d eiem 0x%lx\n", irq, DBG_IRQ(irq, ("enable_irq(%d) %d+%d EIRR 0x%lx EIEM 0x%lx\n", irq,
IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem)); IRQ_REGION(irq), IRQ_OFFSET(irq), mfctl(23), mfctl(15)));
irq = irq_canonicalize(irq); irq = irq_canonicalize(irq);
region = irq_region[IRQ_REGION(irq)]; region = irq_region[IRQ_REGION(irq)];
...@@ -221,6 +215,7 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -221,6 +215,7 @@ int show_interrupts(struct seq_file *p, void *v)
seq_puts(p, " "); seq_puts(p, " ");
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
for (i = 0; i < NR_CPUS; i++) for (i = 0; i < NR_CPUS; i++)
if (cpu_online(i))
#endif #endif
seq_printf(p, " CPU%02d ", i); seq_printf(p, " CPU%02d ", i);
...@@ -250,6 +245,7 @@ int show_interrupts(struct seq_file *p, void *v) ...@@ -250,6 +245,7 @@ int show_interrupts(struct seq_file *p, void *v)
seq_printf(p, "%3d: ", irq_no); seq_printf(p, "%3d: ", irq_no);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
for (; j < NR_CPUS; j++) for (; j < NR_CPUS; j++)
if (cpu_online(j))
#endif #endif
seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq_no]); seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq_no]);
...@@ -338,7 +334,8 @@ txn_alloc_addr(int virt_irq) ...@@ -338,7 +334,8 @@ txn_alloc_addr(int virt_irq)
next_cpu++; /* assign to "next" CPU we want this bugger on */ next_cpu++; /* assign to "next" CPU we want this bugger on */
/* validate entry */ /* validate entry */
while ((next_cpu < NR_CPUS) && !cpu_data[next_cpu].txn_addr) while ((next_cpu < NR_CPUS) && (!cpu_data[next_cpu].txn_addr ||
!cpu_online(next_cpu)))
next_cpu++; next_cpu++;
if (next_cpu >= NR_CPUS) if (next_cpu >= NR_CPUS)
...@@ -390,7 +387,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs) ...@@ -390,7 +387,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs)
irq_enter(); irq_enter();
++kstat_cpu(cpu).irqs[irq]; ++kstat_cpu(cpu).irqs[irq];
DBG_IRQ(irq, ("do_irq(%d) %d+%d\n", irq, IRQ_REGION(irq), IRQ_OFFSET(irq))); DBG_IRQ(irq, ("do_irq(%d) %d+%d eiem 0x%lx\n", irq, IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
for (; action; action = action->next) { for (; action; action = action->next) {
#ifdef PARISC_IRQ_CR16_COUNTS #ifdef PARISC_IRQ_CR16_COUNTS
...@@ -460,7 +457,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) ...@@ -460,7 +457,7 @@ void do_cpu_irq_mask(struct pt_regs *regs)
#ifdef DEBUG_IRQ #ifdef DEBUG_IRQ
if (eirr_val != (1UL << MAX_CPU_IRQ)) if (eirr_val != (1UL << MAX_CPU_IRQ))
printk(KERN_DEBUG "do_cpu_irq_mask %x\n", eirr_val); printk(KERN_DEBUG "do_cpu_irq_mask 0x%x & 0x%x\n", eirr_val, cpu_eiem);
#endif #endif
/* Work our way from MSb to LSb...same order we alloc EIRs */ /* Work our way from MSb to LSb...same order we alloc EIRs */
...@@ -865,7 +862,7 @@ EXPORT_SYMBOL(probe_irq_mask); ...@@ -865,7 +862,7 @@ EXPORT_SYMBOL(probe_irq_mask);
void __init init_IRQ(void) void __init init_IRQ(void)
{ {
local_irq_disable(); /* PARANOID - should already be disabled */ local_irq_disable(); /* PARANOID - should already be disabled */
mtctl(-1L, 23); /* EIRR : clear all pending external intr */ mtctl(~0UL, 23); /* EIRR : clear all pending external intr */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (!cpu_eiem) if (!cpu_eiem)
cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ); cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ);
......
...@@ -173,3 +173,9 @@ EXPORT_SYMBOL(__moddi3); ...@@ -173,3 +173,9 @@ EXPORT_SYMBOL(__moddi3);
extern void $$dyncall(void); extern void $$dyncall(void);
EXPORT_SYMBOL($$dyncall); EXPORT_SYMBOL($$dyncall);
#endif #endif
#ifdef CONFIG_DISCONTIGMEM
#include <asm/mmzone.h>
EXPORT_SYMBOL(node_data);
EXPORT_SYMBOL(pfnnid_map);
#endif
...@@ -32,6 +32,19 @@ ...@@ -32,6 +32,19 @@
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#ifdef DEBUG_PCI
#undef ASSERT
#define ASSERT(expr) \
if(!(expr)) { \
printk("\n%s:%d: Assertion " #expr " failed!\n", \
__FILE__, __LINE__); \
panic(#expr); \
}
#else
#define ASSERT(expr)
#endif
static struct proc_dir_entry * proc_gsc_root = NULL; static struct proc_dir_entry * proc_gsc_root = NULL;
static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length); static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
static unsigned long pcxl_used_bytes = 0; static unsigned long pcxl_used_bytes = 0;
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* interfaces to log Chassis Codes via PDC (firmware) * interfaces to log Chassis Codes via PDC (firmware)
* *
* Copyright (C) 2002 Laurent Canet <canetl@esiee.fr> * Copyright (C) 2002 Laurent Canet <canetl@esiee.fr>
* Copyright (C) 2002-2003 Thibaut Varene <varenet@esiee.fr> * Copyright (C) 2002-2004 Thibaut VARENE <varenet@esiee.fr>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -33,10 +33,28 @@ ...@@ -33,10 +33,28 @@
#include <asm/pdc_chassis.h> #include <asm/pdc_chassis.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/pdc.h>
#include <asm/pdcpat.h>
#ifdef CONFIG_PDC_CHASSIS #ifdef CONFIG_PDC_CHASSIS
static int pdc_chassis_old = 0; static int pdc_chassis_old = 0;
static unsigned int pdc_chassis_enabled = 1;
/**
* pdc_chassis_setup() - Enable/disable pdc_chassis code at boot time.
* @str configuration param: 0 to disable chassis log
* @return 1
*/
static int __init pdc_chassis_setup(char *str)
{
/*panic_timeout = simple_strtoul(str, NULL, 0);*/
get_option(&str, &pdc_chassis_enabled);
return 1;
}
__setup("pdcchassis=", pdc_chassis_setup);
/** /**
...@@ -114,17 +132,15 @@ void __init parisc_pdc_chassis_init(void) ...@@ -114,17 +132,15 @@ void __init parisc_pdc_chassis_init(void)
{ {
#ifdef CONFIG_PDC_CHASSIS #ifdef CONFIG_PDC_CHASSIS
int handle = 0; int handle = 0;
if (pdc_chassis_enabled) {
DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__); DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
/* Let see if we have something to handle... */ /* Let see if we have something to handle... */
/* Check for PDC_PAT or old LED Panel */ /* Check for PDC_PAT or old LED Panel */
pdc_chassis_checkold(); pdc_chassis_checkold();
if (is_pdc_pat()) { if (is_pdc_pat()) {
#ifdef __LP64__ /* see pdc_chassis_send_status() */
printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n"); printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
handle = 1; handle = 1;
#endif /* __LP64__ */
} }
else if (pdc_chassis_old) { else if (pdc_chassis_old) {
printk(KERN_INFO "Enabling old style chassis LED panel support.\n"); printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
...@@ -138,6 +154,7 @@ void __init parisc_pdc_chassis_init(void) ...@@ -138,6 +154,7 @@ void __init parisc_pdc_chassis_init(void)
/* initialize reboot notifier chain */ /* initialize reboot notifier chain */
register_reboot_notifier(&pdc_chassis_reboot_block); register_reboot_notifier(&pdc_chassis_reboot_block);
} }
}
#endif /* CONFIG_PDC_CHASSIS */ #endif /* CONFIG_PDC_CHASSIS */
} }
...@@ -161,9 +178,11 @@ int pdc_chassis_send_status(int message) ...@@ -161,9 +178,11 @@ int pdc_chassis_send_status(int message)
/* Maybe we should do that in an other way ? */ /* Maybe we should do that in an other way ? */
int retval = 0; int retval = 0;
#ifdef CONFIG_PDC_CHASSIS #ifdef CONFIG_PDC_CHASSIS
if (pdc_chassis_enabled) {
DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message); DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
#ifdef __LP64__ /* pdc_pat_chassis_send_log is defined only when #ifdef __LP64__ */ #ifdef CONFIG_PARISC64
if (is_pdc_pat()) { if (is_pdc_pat()) {
switch(message) { switch(message) {
case PDC_CHASSIS_DIRECT_BSTART: case PDC_CHASSIS_DIRECT_BSTART:
...@@ -219,7 +238,8 @@ int pdc_chassis_send_status(int message) ...@@ -219,7 +238,8 @@ int pdc_chassis_send_status(int message)
retval = -1; retval = -1;
} }
} else retval = -1; } else retval = -1;
#endif /* __LP64__ */ #endif /* CONFIG_PARISC64 */
} /* if (pdc_chassis_enabled) */
#endif /* CONFIG_PDC_CHASSIS */ #endif /* CONFIG_PDC_CHASSIS */
return retval; return retval;
} }
...@@ -380,18 +380,14 @@ get_wchan(struct task_struct *p) ...@@ -380,18 +380,14 @@ get_wchan(struct task_struct *p)
/* /*
* These bracket the sleeping functions.. * These bracket the sleeping functions..
*/ */
# define first_sched ((unsigned long) scheduling_functions_start_here)
# define last_sched ((unsigned long) scheduling_functions_end_here)
unwind_frame_init_from_blocked_task(&info, p); unwind_frame_init_from_blocked_task(&info, p);
do { do {
if (unwind_once(&info) < 0) if (unwind_once(&info) < 0)
return 0; return 0;
ip = info.ip; ip = info.ip;
if (ip < first_sched || ip >= last_sched) if (!in_sched_functions(ip))
return ip; return ip;
} while (count++ < 16); } while (count++ < 16);
return 0; return 0;
# undef first_sched
# undef last_sched
} }
...@@ -33,12 +33,14 @@ ...@@ -33,12 +33,14 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/cpu.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/hardware.h> /* for register_parisc_driver() stuff */ #include <asm/hardware.h> /* for register_parisc_driver() stuff */
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/pdcpat.h>
#include <asm/irq.h> /* for struct irq_region */ #include <asm/irq.h> /* for struct irq_region */
#include <asm/parisc-device.h> #include <asm/parisc-device.h>
...@@ -187,6 +189,17 @@ static int __init processor_probe(struct parisc_device *dev) ...@@ -187,6 +189,17 @@ static int __init processor_probe(struct parisc_device *dev)
cpu_irq_actions[cpuid] = actions; cpu_irq_actions[cpuid] = actions;
} }
#endif #endif
/*
* Bring this CPU up now! (ignore bootstrap cpuid == 0)
*/
#ifdef CONFIG_SMP
if (cpuid) {
cpu_set(cpuid, cpu_present_map);
cpu_up(cpuid);
}
#endif
return 0; return 0;
} }
......
...@@ -12,8 +12,12 @@ ...@@ -12,8 +12,12 @@
.section .bss .section .bss
.export real_stack .export real_stack
.export real32_stack
.export real64_stack
.align 64 .align 64
real_stack: real_stack:
real32_stack:
real64_stack:
.block 8192 .block 8192
#ifdef __LP64__ #ifdef __LP64__
......
...@@ -51,6 +51,8 @@ char command_line[COMMAND_LINE_SIZE]; ...@@ -51,6 +51,8 @@ char command_line[COMMAND_LINE_SIZE];
/* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */ /* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
struct proc_dir_entry * proc_runway_root = NULL; struct proc_dir_entry * proc_runway_root = NULL;
struct proc_dir_entry * proc_gsc_root = NULL; struct proc_dir_entry * proc_gsc_root = NULL;
struct proc_dir_entry * proc_mckinley_root = NULL;
void __init setup_cmdline(char **cmdline_p) void __init setup_cmdline(char **cmdline_p)
{ {
...@@ -206,12 +208,17 @@ static void __init parisc_proc_mkdir(void) ...@@ -206,12 +208,17 @@ static void __init parisc_proc_mkdir(void)
case pcxw: case pcxw:
case pcxw_: case pcxw_:
case pcxw2: case pcxw2:
case mako: /* XXX : this is really mckinley bus */
if (NULL == proc_runway_root) if (NULL == proc_runway_root)
{ {
proc_runway_root = proc_mkdir("bus/runway", 0); proc_runway_root = proc_mkdir("bus/runway", 0);
} }
break; break;
case mako:
if (NULL == proc_mckinley_root)
{
proc_mckinley_root = proc_mkdir("bus/mckinley", 0);
}
break;
default: default:
/* FIXME: this was added to prevent the compiler /* FIXME: this was added to prevent the compiler
* complaining about missing pcx, pcxs and pcxt * complaining about missing pcx, pcxs and pcxt
......
...@@ -54,18 +54,27 @@ ...@@ -54,18 +54,27 @@
#define kDEBUG 0 #define kDEBUG 0
spinlock_t pa_dbit_lock = SPIN_LOCK_UNLOCKED;
spinlock_t smp_lock = SPIN_LOCK_UNLOCKED; spinlock_t smp_lock = SPIN_LOCK_UNLOCKED;
volatile struct task_struct *smp_init_current_idle_task; volatile struct task_struct *smp_init_current_idle_task;
static volatile int cpu_now_booting = 0; /* track which CPU is booting */ static volatile int cpu_now_booting = 0; /* track which CPU is booting */
static int parisc_max_cpus = -1; /* Command line */
unsigned long cache_decay_ticks; /* declared by include/linux/sched.h */ unsigned long cache_decay_ticks; /* declared by include/linux/sched.h */
static int parisc_max_cpus = 1;
/* online cpus are ones that we've managed to bring up completely
* possible cpus are all valid cpu
* present cpus are all detected cpu
*
* On startup we bring up the "possible" cpus. Since we discover
* CPUs later, we add them as hotplug, so the possible cpu mask is
* empty in the beginning.
*/
cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */ cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */
cpumask_t cpu_possible_map = CPU_MASK_NONE; /* Bitmap of Present CPUs */ cpumask_t cpu_possible_map = CPU_MASK_ALL; /* Bitmap of Present CPUs */
EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_online_map);
EXPORT_SYMBOL(cpu_possible_map); EXPORT_SYMBOL(cpu_possible_map);
...@@ -289,7 +298,7 @@ send_IPI_allbutself(enum ipi_message_type op) ...@@ -289,7 +298,7 @@ send_IPI_allbutself(enum ipi_message_type op)
{ {
int i; int i;
for (i = 0; i < parisc_max_cpus; i++) { for (i = 0; i < NR_CPUS; i++) {
if (cpu_online(i) && i != smp_processor_id()) if (cpu_online(i) && i != smp_processor_id())
send_IPI_single(i, op); send_IPI_single(i, op);
} }
...@@ -325,6 +334,9 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait) ...@@ -325,6 +334,9 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
unsigned long timeout; unsigned long timeout;
static spinlock_t lock = SPIN_LOCK_UNLOCKED; static spinlock_t lock = SPIN_LOCK_UNLOCKED;
if (num_online_cpus() < 2)
return 0;
/* Can deadlock when called with interrupts disabled */ /* Can deadlock when called with interrupts disabled */
WARN_ON(irqs_disabled()); WARN_ON(irqs_disabled());
...@@ -377,35 +389,6 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait) ...@@ -377,35 +389,6 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
EXPORT_SYMBOL(smp_call_function); EXPORT_SYMBOL(smp_call_function);
/*
* Setup routine for controlling SMP activation
*
* Command-line option of "nosmp" or "maxcpus=0" will disable SMP
* activation entirely (the MPS table probe still happens, though).
*
* Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
* greater than 0, limits the maximum number of CPUs activated in
* SMP mode to <NUM>.
*/
static int __init nosmp(char *str)
{
parisc_max_cpus = 0;
return 1;
}
__setup("nosmp", nosmp);
static int __init maxcpus(char *str)
{
get_option(&str, &parisc_max_cpus);
return 1;
}
__setup("maxcpus=", maxcpus);
/* /*
* Flush all other CPU's tlb and then mine. Do this with on_each_cpu() * Flush all other CPU's tlb and then mine. Do this with on_each_cpu()
* as we want to ensure all TLB's flushed before proceeding. * as we want to ensure all TLB's flushed before proceeding.
...@@ -502,7 +485,6 @@ void __init smp_callin(void) ...@@ -502,7 +485,6 @@ void __init smp_callin(void)
panic("smp_callin() AAAAaaaaahhhh....\n"); panic("smp_callin() AAAAaaaaahhhh....\n");
} }
#if 0
/* /*
* Create the idle task for a new Slave CPU. DO NOT use kernel_thread() * Create the idle task for a new Slave CPU. DO NOT use kernel_thread()
* because that could end up calling schedule(). If it did, the new idle * because that could end up calling schedule(). If it did, the new idle
...@@ -524,7 +506,7 @@ static struct task_struct *fork_by_hand(void) ...@@ -524,7 +506,7 @@ static struct task_struct *fork_by_hand(void)
/* /*
* Bring one cpu online. * Bring one cpu online.
*/ */
int __init smp_boot_one_cpu(int cpuid, int cpunum) int __init smp_boot_one_cpu(int cpuid)
{ {
struct task_struct *idle; struct task_struct *idle;
long timeout; long timeout;
...@@ -544,14 +526,14 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum) ...@@ -544,14 +526,14 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
panic("SMP: fork failed for CPU:%d", cpuid); panic("SMP: fork failed for CPU:%d", cpuid);
wake_up_forked_process(idle); wake_up_forked_process(idle);
init_idle(idle, cpunum); init_idle(idle, cpuid);
unhash_process(idle); unhash_process(idle);
idle->thread_info->cpu = cpunum; idle->thread_info->cpu = cpuid;
/* Let _start know what logical CPU we're booting /* Let _start know what logical CPU we're booting
** (offset into init_tasks[],cpu_data[]) ** (offset into init_tasks[],cpu_data[])
*/ */
cpu_now_booting = cpunum; cpu_now_booting = cpuid;
/* /*
** boot strap code needs to know the task address since ** boot strap code needs to know the task address since
...@@ -560,11 +542,18 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum) ...@@ -560,11 +542,18 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
smp_init_current_idle_task = idle ; smp_init_current_idle_task = idle ;
mb(); mb();
printk("Releasing cpu %d now, hpa=%lx\n", cpuid, cpu_data[cpuid].hpa);
/* /*
** This gets PDC to release the CPU from a very tight loop. ** This gets PDC to release the CPU from a very tight loop.
** See MEM_RENDEZ comments in head.S. **
** From the PA-RISC 2.0 Firmware Architecture Reference Specification:
** "The MEM_RENDEZ vector specifies the location of OS_RENDEZ which
** is executed after receiving the rendezvous signal (an interrupt to
** EIR{0}). MEM_RENDEZ is valid only when it is nonzero and the
** contents of memory are valid."
*/ */
__raw_writel(IRQ_OFFSET(TIMER_IRQ), cpu_data[cpunum].hpa); __raw_writel(IRQ_OFFSET(TIMER_IRQ), cpu_data[cpuid].hpa);
mb(); mb();
/* /*
...@@ -573,7 +562,7 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum) ...@@ -573,7 +562,7 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
* Once the "monarch CPU" sees the bit change, it can move on. * Once the "monarch CPU" sees the bit change, it can move on.
*/ */
for (timeout = 0; timeout < 10000; timeout++) { for (timeout = 0; timeout < 10000; timeout++) {
if(cpu_online(cpunum)) { if(cpu_online(cpuid)) {
/* Which implies Slave has started up */ /* Which implies Slave has started up */
cpu_now_booting = 0; cpu_now_booting = 0;
smp_init_current_idle_task = NULL; smp_init_current_idle_task = NULL;
...@@ -592,16 +581,14 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum) ...@@ -592,16 +581,14 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
alive: alive:
/* Remember the Slave data */ /* Remember the Slave data */
#if (kDEBUG>=100) #if (kDEBUG>=100)
printk(KERN_DEBUG "SMP: CPU:%d (num %d) came alive after %ld _us\n", printk(KERN_DEBUG "SMP: CPU:%d came alive after %ld _us\n",
cpuid, cpunum, timeout * 100); cpuid, timeout * 100);
#endif /* kDEBUG */ #endif /* kDEBUG */
#ifdef ENTRY_SYS_CPUS #ifdef ENTRY_SYS_CPUS
cpu_data[cpunum].state = STATE_RUNNING; cpu_data[cpuid].state = STATE_RUNNING;
#endif #endif
return 0; return 0;
} }
#endif
void __devinit smp_prepare_boot_cpu(void) void __devinit smp_prepare_boot_cpu(void)
{ {
...@@ -612,15 +599,10 @@ void __devinit smp_prepare_boot_cpu(void) ...@@ -612,15 +599,10 @@ void __devinit smp_prepare_boot_cpu(void)
#endif #endif
/* Setup BSP mappings */ /* Setup BSP mappings */
printk(KERN_DEBUG "SMP: bootstrap CPU ID is %d\n",bootstrap_processor); printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor);
init_task.thread_info->cpu = bootstrap_processor;
current->thread_info->cpu = bootstrap_processor;
cpu_set(bootstrap_processor, cpu_online_map); cpu_set(bootstrap_processor, cpu_online_map);
cpu_set(bootstrap_processor, cpu_possible_map); cpu_set(bootstrap_processor, cpu_present_map);
/* Mark Boostrap processor as present */
current->active_mm = &init_mm;
cache_decay_ticks = HZ/100; /* FIXME very rough. */ cache_decay_ticks = HZ/100; /* FIXME very rough. */
} }
...@@ -633,15 +615,12 @@ void __devinit smp_prepare_boot_cpu(void) ...@@ -633,15 +615,12 @@ void __devinit smp_prepare_boot_cpu(void)
*/ */
void __init smp_prepare_cpus(unsigned int max_cpus) void __init smp_prepare_cpus(unsigned int max_cpus)
{ {
cpus_clear(cpu_present_map);
cpu_set(0, cpu_present_map);
if (max_cpus != -1) parisc_max_cpus = max_cpus;
printk(KERN_INFO "SMP: Limited to %d CPUs\n", max_cpus); if (!max_cpus)
printk(KERN_INFO "SMP mode deactivated.\n");
printk(KERN_INFO "SMP: Monarch CPU activated (%lu.%02lu BogoMIPS)\n",
(cpu_data[0].loops_per_jiffy + 25) / 5000,
((cpu_data[0].loops_per_jiffy + 25) / 50) % 100);
return;
} }
...@@ -653,6 +632,9 @@ void smp_cpus_done(unsigned int cpu_max) ...@@ -653,6 +632,9 @@ void smp_cpus_done(unsigned int cpu_max)
int __devinit __cpu_up(unsigned int cpu) int __devinit __cpu_up(unsigned int cpu)
{ {
if (cpu != 0 && cpu < parisc_max_cpus)
smp_boot_one_cpu(cpu);
return cpu_online(cpu) ? 0 : -ENOSYS; return cpu_online(cpu) ? 0 : -ENOSYS;
} }
......
...@@ -206,9 +206,10 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i) ...@@ -206,9 +206,10 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
asmlinkage long sys32_time(compat_time_t *tloc) asmlinkage long sys32_time(compat_time_t *tloc)
{ {
struct timeval tv; struct timeval tv;
compat_time_t now32;
do_gettimeofday(&tv); do_gettimeofday(&tv);
compat_time_t now32 = tv.tv_sec; now32 = tv.tv_sec;
if (tloc) if (tloc)
if (put_user(now32, tloc)) if (put_user(now32, tloc))
...@@ -344,7 +345,7 @@ filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino, ...@@ -344,7 +345,7 @@ filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino,
put_user(reclen, &dirent->d_reclen); put_user(reclen, &dirent->d_reclen);
copy_to_user(dirent->d_name, name, namlen); copy_to_user(dirent->d_name, name, namlen);
put_user(0, dirent->d_name + namlen); put_user(0, dirent->d_name + namlen);
((char *) dirent) += reclen; dirent = (struct linux32_dirent *)((char *)dirent + reclen);
buf->current_dir = dirent; buf->current_dir = dirent;
buf->count -= reclen; buf->count -= reclen;
return 0; return 0;
......
...@@ -38,12 +38,17 @@ ...@@ -38,12 +38,17 @@
#include <asm/smp.h> #include <asm/smp.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/pdc_chassis.h> #include <asm/pdc_chassis.h>
#include <asm/unwind.h>
#include "../math-emu/math-emu.h" /* for handle_fpe() */ #include "../math-emu/math-emu.h" /* for handle_fpe() */
#define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */ #define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */
/* dumped to the console via printk) */ /* dumped to the console via printk) */
#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
spinlock_t pa_dbit_lock = SPIN_LOCK_UNLOCKED;
#endif
int printbinary(char *buf, unsigned long x, int nbits) int printbinary(char *buf, unsigned long x, int nbits)
{ {
unsigned long mask = 1UL << (nbits - 1); unsigned long mask = 1UL << (nbits - 1);
...@@ -125,73 +130,37 @@ void show_regs(struct pt_regs *regs) ...@@ -125,73 +130,37 @@ void show_regs(struct pt_regs *regs)
void dump_stack(void) void dump_stack(void)
{ {
unsigned long stack; show_stack(NULL, NULL);
show_trace(current, &stack);
} }
EXPORT_SYMBOL(dump_stack); EXPORT_SYMBOL(dump_stack);
#ifndef __LP64__ void show_stack(struct task_struct *task, unsigned long *s)
static int kstack_depth_to_print = 64 * 4;
#else
static int kstack_depth_to_print = 128 * 4;
#endif
void show_stack(struct task_struct *task, unsigned long *sp)
{ {
unsigned long *stack; int i = 1;
int i; struct unwind_frame_info info;
/* if (!task) {
* debugging aid: "show_stack(NULL);" prints the unsigned long sp, ip, rp;
* back trace for this cpu.
*/ HERE:
if (task==NULL) asm volatile ("copy %%r30, %0" : "=r"(sp));
sp = (unsigned long*)&sp; ip = (unsigned long)&&HERE;
else if(sp == NULL) rp = (unsigned long)__builtin_return_address(0);
sp = (unsigned long*)task->thread.regs.ksp; unwind_frame_init(&info, current, sp, ip, rp);
} else {
stack = sp; unwind_frame_init_from_blocked_task(&info, task);
printk("\n" KERN_CRIT "Stack Dump:\n");
printk(KERN_CRIT " " RFMT ": ", (unsigned long) stack);
for (i=0; i < kstack_depth_to_print; i++) {
if (((long) stack & (THREAD_SIZE-1)) == 0)
break;
if (i && ((i & 0x03) == 0))
printk("\n" KERN_CRIT " " RFMT ": ",
(unsigned long) stack);
printk(RFMT " ", *stack--);
} }
printk("\n" KERN_CRIT "\n");
show_trace(task, sp);
}
printk("Backtrace:\n");
while (i <= 16) {
if (unwind_once(&info) < 0 || info.ip == 0)
break;
void show_trace(struct task_struct *task, unsigned long *stack) if (__kernel_text_address(info.ip)) {
{ printk(" [<" RFMT ">] ", info.ip);
unsigned long *startstack;
unsigned long addr;
int i;
startstack = (unsigned long *)((unsigned long)stack & ~(THREAD_SIZE - 1));
i = 1;
stack = (long *)((long)(stack + 32) &~ (FRAME_SIZE-1)); /* Align */
printk("Kernel addresses on the stack:\n");
while (stack > startstack) {
stack -= 16; /* Stack frames are a multiple of 16 words */
addr = stack[16 - RP_OFFSET / sizeof(long)];
/*
* If the address is either in the text segment of the
* kernel, or in the region which contains vmalloc'ed
* memory, it *may* be the address of a calling
* routine; if so, print it so that someone tracing
* down the cause of the crash will be able to figure
* out the call path that was taken.
*/
if (__kernel_text_address(addr)) {
printk(" [<" RFMT ">] ", addr);
#ifdef CONFIG_KALLSYMS #ifdef CONFIG_KALLSYMS
print_symbol("%s\n", addr); print_symbol("%s\n", info.ip);
#else #else
if ((i & 0x03) == 0) if ((i & 0x03) == 0)
printk("\n"); printk("\n");
......
...@@ -8,18 +8,6 @@ ...@@ -8,18 +8,6 @@
* understand what is happening here * understand what is happening here
*/ */
/*
* J. David Anglin writes:
*
* "You have to adjust the current sp to that at the begining of the function.
* There can be up to two stack additions to allocate the frame in the
* prologue. Similar things happen in the epilogue. In the presence of
* interrupts, you have to be concerned about where you are in the function
* and what stack adjustments have taken place."
*
* For now these cases are not handled, but they should be!
*/
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -36,8 +24,8 @@ ...@@ -36,8 +24,8 @@
#define dbg(x...) #define dbg(x...)
#endif #endif
extern const struct unwind_table_entry __start___unwind[]; extern struct unwind_table_entry __start___unwind[];
extern const struct unwind_table_entry __stop___unwind[]; extern struct unwind_table_entry __stop___unwind[];
static spinlock_t unwind_lock; static spinlock_t unwind_lock;
/* /*
...@@ -55,8 +43,6 @@ find_unwind_entry_in_table(const struct unwind_table *table, unsigned long addr) ...@@ -55,8 +43,6 @@ find_unwind_entry_in_table(const struct unwind_table *table, unsigned long addr)
const struct unwind_table_entry *e = 0; const struct unwind_table_entry *e = 0;
unsigned long lo, hi, mid; unsigned long lo, hi, mid;
addr -= table->base_addr;
for (lo = 0, hi = table->length; lo < hi; ) for (lo = 0, hi = table->length; lo < hi; )
{ {
mid = (lo + hi) / 2; mid = (lo + hi) / 2;
...@@ -97,10 +83,11 @@ find_unwind_entry(unsigned long addr) ...@@ -97,10 +83,11 @@ find_unwind_entry(unsigned long addr)
static void static void
unwind_table_init(struct unwind_table *table, const char *name, unwind_table_init(struct unwind_table *table, const char *name,
unsigned long base_addr, unsigned long gp, unsigned long base_addr, unsigned long gp,
const void *table_start, const void *table_end) void *table_start, void *table_end)
{ {
const struct unwind_table_entry *start = table_start; struct unwind_table_entry *start = table_start;
const struct unwind_table_entry *end = table_end - 1; struct unwind_table_entry *end =
(struct unwind_table_entry *)table_end - 1;
table->name = name; table->name = name;
table->base_addr = base_addr; table->base_addr = base_addr;
...@@ -108,14 +95,19 @@ unwind_table_init(struct unwind_table *table, const char *name, ...@@ -108,14 +95,19 @@ unwind_table_init(struct unwind_table *table, const char *name,
table->start = base_addr + start->region_start; table->start = base_addr + start->region_start;
table->end = base_addr + end->region_end; table->end = base_addr + end->region_end;
table->table = (struct unwind_table_entry *)table_start; table->table = (struct unwind_table_entry *)table_start;
table->length = end - start; table->length = end - start + 1;
table->next = NULL; table->next = NULL;
for (; start <= end; start++) {
start->region_start += base_addr;
start->region_end += base_addr;
}
} }
void * void *
unwind_table_add(const char *name, unsigned long base_addr, unwind_table_add(const char *name, unsigned long base_addr,
unsigned long gp, unsigned long gp,
const void *start, const void *end) void *start, void *end)
{ {
struct unwind_table *table; struct unwind_table *table;
unsigned long flags; unsigned long flags;
...@@ -206,6 +198,8 @@ static void unwind_frame_regs(struct unwind_frame_info *info) ...@@ -206,6 +198,8 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
sp = info->prev_sp; sp = info->prev_sp;
} while (info->prev_ip < (unsigned long)_stext || } while (info->prev_ip < (unsigned long)_stext ||
info->prev_ip > (unsigned long)_etext); info->prev_ip > (unsigned long)_etext);
dbg("analyzing func @ %lx with no unwind info, setting prev_sp=%lx prev_ip=%lx\n", info->ip, info->prev_sp, info->prev_ip);
} else { } else {
dbg("e->start = 0x%x, e->end = 0x%x, Save_SP = %d, Save_RP = %d size = %u\n", dbg("e->start = 0x%x, e->end = 0x%x, Save_SP = %d, Save_RP = %d size = %u\n",
...@@ -225,42 +219,57 @@ static void unwind_frame_regs(struct unwind_frame_info *info) ...@@ -225,42 +219,57 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
/* ldo X(sp), sp, or stwm X,D(sp) */ /* ldo X(sp), sp, or stwm X,D(sp) */
frame_size += (insn & 0x1 ? -1 << 13 : 0) | frame_size += (insn & 0x1 ? -1 << 13 : 0) |
((insn & 0x3fff) >> 1); ((insn & 0x3fff) >> 1);
dbg("analyzing func @ %lx, insn=%08x @ %lx, frame_size = %ld\n", info->ip, insn, npc, frame_size);
} else if ((insn & 0xffe00008) == 0x7ec00008) { } else if ((insn & 0xffe00008) == 0x7ec00008) {
/* std,ma X,D(sp) */ /* std,ma X,D(sp) */
frame_size += (insn & 0x1 ? -1 << 13 : 0) | frame_size += (insn & 0x1 ? -1 << 13 : 0) |
(((insn >> 4) & 0x3ff) << 3); (((insn >> 4) & 0x3ff) << 3);
dbg("analyzing func @ %lx, insn=%08x @ %lx, frame_size = %ld\n", info->ip, insn, npc, frame_size);
} else if (insn == 0x6bc23fd9) { } else if (insn == 0x6bc23fd9) {
/* stw rp,-20(sp) */ /* stw rp,-20(sp) */
rpoffset = 20; rpoffset = 20;
looking_for_rp = 0; looking_for_rp = 0;
dbg("analyzing func @ %lx, insn=stw rp,-20(sp) @ %lx\n", info->ip, npc);
} else if (insn == 0x0fc212c1) { } else if (insn == 0x0fc212c1) {
/* std rp,-16(sr0,sp) */ /* std rp,-16(sr0,sp) */
rpoffset = 16; rpoffset = 16;
looking_for_rp = 0; looking_for_rp = 0;
dbg("analyzing func @ %lx, insn=std rp,-16(sp) @ %lx\n", info->ip, npc);
} }
} }
info->prev_sp = info->sp - frame_size; info->prev_sp = info->sp - frame_size;
if (rpoffset) if (rpoffset)
info->prev_ip = *(unsigned long *)(info->prev_sp - rpoffset); info->rp = *(unsigned long *)(info->prev_sp - rpoffset);
info->prev_ip = info->rp;
info->rp = 0;
dbg("analyzing func @ %lx, setting prev_sp=%lx prev_ip=%lx\n", info->ip, info->prev_sp, info->prev_ip);
} }
} }
void unwind_frame_init(struct unwind_frame_info *info, struct task_struct *t, void unwind_frame_init(struct unwind_frame_info *info, struct task_struct *t,
struct pt_regs *regs) unsigned long sp, unsigned long ip, unsigned long rp)
{ {
memset(info, 0, sizeof(struct unwind_frame_info)); memset(info, 0, sizeof(struct unwind_frame_info));
info->t = t; info->t = t;
info->sp = regs->ksp; info->sp = sp;
info->ip = regs->kpc; info->ip = ip;
info->rp = rp;
dbg("(%d) Start unwind from sp=%08lx ip=%08lx\n", (int)t->pid, info->sp, info->ip); dbg("(%d) Start unwind from sp=%08lx ip=%08lx\n", t ? (int)t->pid : 0, info->sp, info->ip);
} }
void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct task_struct *t) void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct task_struct *t)
{ {
struct pt_regs *regs = &t->thread.regs; struct pt_regs *regs = &t->thread.regs;
unwind_frame_init(info, t, regs); unwind_frame_init(info, t, regs->ksp, regs->kpc, 0);
}
void unwind_frame_init_running(struct unwind_frame_info *info, struct pt_regs *regs)
{
unwind_frame_init(info, current, regs->gr[30], regs->iaoq[0],
regs->gr[2]);
} }
int unwind_once(struct unwind_frame_info *next_frame) int unwind_once(struct unwind_frame_info *next_frame)
......
...@@ -3,3 +3,5 @@ ...@@ -3,3 +3,5 @@
# #
lib-y := lusercopy.o bitops.o checksum.o io.o memset.o lib-y := lusercopy.o bitops.o checksum.o io.o memset.o
lib-$(CONFIG_SMP) += debuglocks.o
...@@ -34,26 +34,26 @@ unsigned long __xchg64(unsigned long x, unsigned long *ptr) ...@@ -34,26 +34,26 @@ unsigned long __xchg64(unsigned long x, unsigned long *ptr)
unsigned long __xchg32(int x, int *ptr) unsigned long __xchg32(int x, int *ptr)
{ {
unsigned long flags; unsigned long flags;
unsigned long temp; long temp;
atomic_spin_lock_irqsave(ATOMIC_HASH(ptr), flags); atomic_spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
(long) temp = (long) *ptr; /* XXX - sign extension wanted? */ temp = (long) *ptr; /* XXX - sign extension wanted? */
*ptr = x; *ptr = x;
atomic_spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags); atomic_spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
return temp; return (unsigned long)temp;
} }
unsigned long __xchg8(char x, char *ptr) unsigned long __xchg8(char x, char *ptr)
{ {
unsigned long flags; unsigned long flags;
unsigned long temp; long temp;
atomic_spin_lock_irqsave(ATOMIC_HASH(ptr), flags); atomic_spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
(long) temp = (long) *ptr; /* XXX - sign extension wanted? */ temp = (long) *ptr; /* XXX - sign extension wanted? */
*ptr = x; *ptr = x;
atomic_spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags); atomic_spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
return temp; return (unsigned long)temp;
} }
......
/*
* Debugging versions of SMP locking primitives.
*
* Copyright (C) 2004 Thibaut VARENE <varenet@esiee.fr>
*
* Some code stollen from alpha & sparc64 ;)
*
* 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 Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <asm/system.h>
#include <asm/hardirq.h> /* in_interrupt() */
#undef INIT_STUCK
#define INIT_STUCK 1L << 30
#ifdef CONFIG_DEBUG_SPINLOCK
void _dbg_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
{
volatile unsigned int *a;
long stuck = INIT_STUCK;
void *inline_pc = __builtin_return_address(0);
unsigned long started = jiffies;
int printed = 0;
int cpu = smp_processor_id();
try_again:
/* Do the actual locking */
/* <T-Bone> ggg: we can't get stuck on the outter loop?
* <ggg> T-Bone: We can hit the outer loop
* alot if multiple CPUs are constantly racing for a lock
* and the backplane is NOT fair about which CPU sees
* the update first. But it won't hang since every failed
* attempt will drop us back into the inner loop and
* decrement `stuck'.
* <ggg> K-class and some of the others are NOT fair in the HW
* implementation so we could see false positives.
* But fixing the lock contention is easier than
* fixing the HW to be fair.
* <tausq> __ldcw() returns 1 if we get the lock; otherwise we
* spin until the value of the lock changes, or we time out.
*/
a = __ldcw_align(lock);
while (stuck && (__ldcw(a) == 0))
while ((*a == 0) && --stuck);
if (unlikely(stuck <= 0)) {
printk(KERN_WARNING
"%s:%d: spin_lock(%s/%p) stuck in %s at %p(%d)"
" owned by %s:%d in %s at %p(%d)\n",
base_file, line_no, lock->module, lock,
current->comm, inline_pc, cpu,
lock->bfile, lock->bline, lock->task->comm,
lock->previous, lock->oncpu);
stuck = INIT_STUCK;
printed = 1;
goto try_again;
}
/* Exiting. Got the lock. */
lock->oncpu = cpu;
lock->previous = inline_pc;
lock->task = current;
lock->bfile = (char *)base_file;
lock->bline = line_no;
if (unlikely(printed)) {
printk(KERN_WARNING
"%s:%d: spin_lock grabbed in %s at %p(%d) %ld ticks\n",
base_file, line_no, current->comm, inline_pc,
cpu, jiffies - started);
}
}
void _dbg_spin_unlock(spinlock_t * lock, const char *base_file, int line_no)
{
CHECK_LOCK(lock);
volatile unsigned int *a = __ldcw_align(lock);
if (unlikely((*a != 0) && lock->babble)) {
lock->babble--;
printk(KERN_WARNING
"%s:%d: spin_unlock(%s:%p) not locked\n",
base_file, line_no, lock->module, lock);
}
*a = 1;
}
int _dbg_spin_trylock(spinlock_t * lock, const char *base_file, int line_no)
{
int ret;
volatile unsigned int *a = __ldcw_align(lock);
if ((ret = (__ldcw(a) != 0))) {
lock->oncpu = smp_processor_id();
lock->previous = __builtin_return_address(0);
lock->task = current;
} else {
lock->bfile = (char *)base_file;
lock->bline = line_no;
}
return ret;
}
#endif /* CONFIG_DEBUG_SPINLOCK */
#ifdef CONFIG_DEBUG_RWLOCK
/* Interrupts trouble detailed explanation, thx Grant:
*
* o writer (wants to modify data) attempts to acquire the rwlock
* o He gets the write lock.
* o Interupts are still enabled, we take an interrupt with the
* write still holding the lock.
* o interrupt handler tries to acquire the rwlock for read.
* o deadlock since the writer can't release it at this point.
*
* In general, any use of spinlocks that competes between "base"
* level and interrupt level code will risk deadlock. Interrupts
* need to be disabled in the base level routines to avoid it.
* Or more precisely, only the IRQ the base level routine
* is competing with for the lock. But it's more efficient/faster
* to just disable all interrupts on that CPU to guarantee
* once it gets the lock it can release it quickly too.
*/
void _dbg_write_lock(rwlock_t *rw, const char *bfile, int bline)
{
void *inline_pc = __builtin_return_address(0);
unsigned long started = jiffies;
long stuck = INIT_STUCK;
int printed = 0;
int cpu = smp_processor_id();
if(unlikely(in_interrupt())) { /* acquiring write lock in interrupt context, bad idea */
printk(KERN_WARNING "write_lock caller: %s:%d, IRQs enabled,\n", bfile, bline);
BUG();
}
/* Note: if interrupts are disabled (which is most likely), the printk
will never show on the console. We might need a polling method to flush
the dmesg buffer anyhow. */
retry:
_raw_spin_lock(&rw->lock);
if(rw->counter != 0) {
/* this basically never happens */
_raw_spin_unlock(&rw->lock);
stuck--;
if ((unlikely(stuck <= 0)) && (rw->counter < 0)) {
printk(KERN_WARNING
"%s:%d: write_lock stuck on writer"
" in %s at %p(%d) %ld ticks\n",
bfile, bline, current->comm, inline_pc,
cpu, jiffies - started);
stuck = INIT_STUCK;
printed = 1;
}
else if (unlikely(stuck <= 0)) {
printk(KERN_WARNING
"%s:%d: write_lock stuck on reader"
" in %s at %p(%d) %ld ticks\n",
bfile, bline, current->comm, inline_pc,
cpu, jiffies - started);
stuck = INIT_STUCK;
printed = 1;
}
while(rw->counter != 0);
goto retry;
}
/* got it. now leave without unlocking */
rw->counter = -1; /* remember we are locked */
if (unlikely(printed)) {
printk(KERN_WARNING
"%s:%d: write_lock grabbed in %s at %p(%d) %ld ticks\n",
bfile, bline, current->comm, inline_pc,
cpu, jiffies - started);
}
}
void _dbg_read_lock(rwlock_t * rw, const char *bfile, int bline)
{
#if 0
void *inline_pc = __builtin_return_address(0);
unsigned long started = jiffies;
int cpu = smp_processor_id();
#endif
unsigned long flags;
local_irq_save(flags);
_raw_spin_lock(&rw->lock);
rw->counter++;
#if 0
printk(KERN_WARNING
"%s:%d: read_lock grabbed in %s at %p(%d) %ld ticks\n",
bfile, bline, current->comm, inline_pc,
cpu, jiffies - started);
#endif
_raw_spin_unlock(&rw->lock);
local_irq_restore(flags);
}
#endif /* CONFIG_DEBUG_RWLOCK */
This diff is collapsed.
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* Copyright 1999 SuSE GmbH * Copyright 1999 SuSE GmbH
* changed by Philipp Rumpf * changed by Philipp Rumpf
* Copyright 1999 Philipp Rumpf (prumpf@tux.org) * Copyright 1999 Philipp Rumpf (prumpf@tux.org)
* Copyright 2004 Randolph Chung (tausq@debian.org)
* *
*/ */
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/tlb.h> #include <asm/tlb.h>
#include <asm/pdc_chassis.h> #include <asm/pdc_chassis.h>
#include <asm/mmzone.h>
DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
...@@ -32,10 +34,9 @@ extern char _end; /* end of BSS, defined by linker */ ...@@ -32,10 +34,9 @@ extern char _end; /* end of BSS, defined by linker */
extern char __init_begin, __init_end; extern char __init_begin, __init_end;
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
struct node_map_data node_data[MAX_PHYSMEM_RANGES]; struct node_map_data node_data[MAX_NUMNODES];
bootmem_data_t bmem_data[MAX_PHYSMEM_RANGES]; bootmem_data_t bmem_data[MAX_NUMNODES];
unsigned char *chunkmap; unsigned char pfnnid_map[PFNNID_MAP_MAX];
unsigned int maxchunkmap;
#endif #endif
static struct resource data_resource = { static struct resource data_resource = {
...@@ -119,21 +120,6 @@ static void __init setup_bootmem(void) ...@@ -119,21 +120,6 @@ static void __init setup_bootmem(void)
disable_sr_hashing(); /* Turn off space register hashing */ disable_sr_hashing(); /* Turn off space register hashing */
#ifdef CONFIG_DISCONTIGMEM
/*
* The below is still true as of 2.4.2. If this is ever fixed,
* we can remove this warning!
*/
printk(KERN_WARNING "\n\n");
printk(KERN_WARNING "CONFIG_DISCONTIGMEM is enabled, which is probably a mistake. This\n");
printk(KERN_WARNING "option can lead to heavy swapping, even when there are gigabytes\n");
printk(KERN_WARNING "of free memory.\n\n");
#endif
#ifdef __LP64__
#ifndef CONFIG_DISCONTIGMEM
/* /*
* Sort the ranges. Since the number of ranges is typically * Sort the ranges. Since the number of ranges is typically
* small, and performance is not an issue here, just do * small, and performance is not an issue here, just do
...@@ -160,11 +146,10 @@ static void __init setup_bootmem(void) ...@@ -160,11 +146,10 @@ static void __init setup_bootmem(void)
} }
} }
#ifndef CONFIG_DISCONTIGMEM
/* /*
* Throw out ranges that are too far apart (controlled by * Throw out ranges that are too far apart (controlled by
* MAX_GAP). If CONFIG_DISCONTIGMEM wasn't implemented so * MAX_GAP).
* poorly, we would recommend enabling that option, but,
* until it is fixed, this is the best way to go.
*/ */
for (i = 1; i < npmem_ranges; i++) { for (i = 1; i < npmem_ranges; i++) {
...@@ -172,6 +157,11 @@ static void __init setup_bootmem(void) ...@@ -172,6 +157,11 @@ static void __init setup_bootmem(void)
(pmem_ranges[i-1].start_pfn + (pmem_ranges[i-1].start_pfn +
pmem_ranges[i-1].pages) > MAX_GAP) { pmem_ranges[i-1].pages) > MAX_GAP) {
npmem_ranges = i; npmem_ranges = i;
printk("Large gap in memory detected (%ld pages). "
"Consider turning on CONFIG_DISCONTIGMEM\n",
pmem_ranges[i].start_pfn -
(pmem_ranges[i-1].start_pfn +
pmem_ranges[i-1].pages));
break; break;
} }
} }
...@@ -194,8 +184,6 @@ static void __init setup_bootmem(void) ...@@ -194,8 +184,6 @@ static void __init setup_bootmem(void)
} }
} }
#endif /* __LP64__ */
sysram_resource_count = npmem_ranges; sysram_resource_count = npmem_ranges;
for (i = 0; i < sysram_resource_count; i++) { for (i = 0; i < sysram_resource_count; i++) {
struct resource *res = &sysram_resources[i]; struct resource *res = &sysram_resources[i];
...@@ -218,6 +206,7 @@ static void __init setup_bootmem(void) ...@@ -218,6 +206,7 @@ static void __init setup_bootmem(void)
mem_limit_func(); /* check for "mem=" argument */ mem_limit_func(); /* check for "mem=" argument */
mem_max = 0; mem_max = 0;
num_physpages = 0;
for (i = 0; i < npmem_ranges; i++) { for (i = 0; i < npmem_ranges; i++) {
unsigned long rsize; unsigned long rsize;
...@@ -232,15 +221,16 @@ static void __init setup_bootmem(void) ...@@ -232,15 +221,16 @@ static void __init setup_bootmem(void)
npmem_ranges = i + 1; npmem_ranges = i + 1;
mem_max = mem_limit; mem_max = mem_limit;
} }
num_physpages += pmem_ranges[i].pages;
break; break;
} }
num_physpages += pmem_ranges[i].pages;
mem_max += rsize; mem_max += rsize;
} }
printk(KERN_INFO "Total Memory: %ld Mb\n",mem_max >> 20); printk(KERN_INFO "Total Memory: %ld Mb\n",mem_max >> 20);
#ifndef CONFIG_DISCONTIGMEM #ifndef CONFIG_DISCONTIGMEM
/* Merge the ranges, keeping track of the holes */ /* Merge the ranges, keeping track of the holes */
{ {
...@@ -272,9 +262,18 @@ static void __init setup_bootmem(void) ...@@ -272,9 +262,18 @@ static void __init setup_bootmem(void)
bootmap_start_pfn = PAGE_ALIGN(__pa((unsigned long) &_end)) >> PAGE_SHIFT; bootmap_start_pfn = PAGE_ALIGN(__pa((unsigned long) &_end)) >> PAGE_SHIFT;
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
for (i = 0; i < MAX_PHYSMEM_RANGES; i++) {
memset(NODE_DATA(i), 0, sizeof(pg_data_t));
NODE_DATA(i)->bdata = &bmem_data[i];
}
memset(pfnnid_map, 0xff, sizeof(pfnnid_map));
numnodes = npmem_ranges;
for (i = 0; i < npmem_ranges; i++) for (i = 0; i < npmem_ranges; i++)
node_data[i].pg_data.bdata = &bmem_data[i]; node_set_online(i);
#endif #endif
/* /*
* Initialize and free the full range of memory in each range. * Initialize and free the full range of memory in each range.
* Note that the only writing these routines do are to the bootmap, * Note that the only writing these routines do are to the bootmap,
...@@ -443,16 +442,20 @@ unsigned long pcxl_dma_start; ...@@ -443,16 +442,20 @@ unsigned long pcxl_dma_start;
void __init mem_init(void) void __init mem_init(void)
{ {
int i;
high_memory = __va((max_pfn << PAGE_SHIFT)); high_memory = __va((max_pfn << PAGE_SHIFT));
max_mapnr = (virt_to_page(high_memory - 1) - mem_map) + 1;
num_physpages = 0; #ifndef CONFIG_DISCONTIGMEM
mem_map = zone_table[0]->zone_mem_map; max_mapnr = page_to_pfn(virt_to_page(high_memory - 1)) + 1;
mem_map = zone_table[ZONE_DMA]->zone_mem_map;
totalram_pages += free_all_bootmem();
#else
{
int i;
for (i = 0; i < npmem_ranges; i++) for (i = 0; i < npmem_ranges; i++)
num_physpages += free_all_bootmem_node(NODE_DATA(i)); totalram_pages += free_all_bootmem_node(NODE_DATA(i));
totalram_pages = num_physpages; }
#endif
printk(KERN_INFO "Memory: %luk available\n", num_physpages << (PAGE_SHIFT-10)); printk(KERN_INFO "Memory: %luk available\n", num_physpages << (PAGE_SHIFT-10));
...@@ -486,6 +489,7 @@ void show_mem(void) ...@@ -486,6 +489,7 @@ void show_mem(void)
show_free_areas(); show_free_areas();
printk(KERN_INFO "Free swap: %6ldkB\n", printk(KERN_INFO "Free swap: %6ldkB\n",
nr_swap_pages<<(PAGE_SHIFT-10)); nr_swap_pages<<(PAGE_SHIFT-10));
#ifndef CONFIG_DISCONTIGMEM
i = max_mapnr; i = max_mapnr;
while (i-- > 0) { while (i-- > 0) {
total++; total++;
...@@ -493,15 +497,55 @@ void show_mem(void) ...@@ -493,15 +497,55 @@ void show_mem(void)
reserved++; reserved++;
else if (PageSwapCache(mem_map+i)) else if (PageSwapCache(mem_map+i))
cached++; cached++;
else if (!atomic_read(&mem_map[i].count)) else if (!page_count(&mem_map[i]))
free++; free++;
else else
shared += atomic_read(&mem_map[i].count) - 1; shared += page_count(&mem_map[i]) - 1;
} }
#else
for (i = 0; i < npmem_ranges; i++) {
int j;
for (j = node_start_pfn(i); j < node_end_pfn(i); j++) {
struct page *p;
p = node_mem_map(i) + j - node_start_pfn(i);
total++;
if (PageReserved(p))
reserved++;
else if (PageSwapCache(p))
cached++;
else if (!page_count(p))
free++;
else
shared += page_count(p) - 1;
}
}
#endif
printk(KERN_INFO "%d pages of RAM\n", total); printk(KERN_INFO "%d pages of RAM\n", total);
printk(KERN_INFO "%d reserved pages\n", reserved); printk(KERN_INFO "%d reserved pages\n", reserved);
printk(KERN_INFO "%d pages shared\n", shared); printk(KERN_INFO "%d pages shared\n", shared);
printk(KERN_INFO "%d pages swap cached\n", cached); printk(KERN_INFO "%d pages swap cached\n", cached);
#ifdef CONFIG_DISCONTIGMEM
{
struct zonelist *zl;
int i, j, k;
for (i = 0; i < npmem_ranges; i++) {
for (j = 0; j < MAX_NR_ZONES; j++) {
zl = NODE_DATA(i)->node_zonelists + j;
printk("Zone list for zone %d on node %d: ", j, i);
for (k = 0; zl->zones[k] != NULL; k++)
printk("[%d/%s] ", zl->zones[k]->zone_pgdat->node_id, zl->zones[k]->name);
printk("\n");
}
}
}
#endif
} }
...@@ -544,7 +588,7 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd ...@@ -544,7 +588,7 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
#if PTRS_PER_PMD == 1 #if PTRS_PER_PMD == 1
pmd = (pmd_t *)__pa(pg_dir); pmd = (pmd_t *)__pa(pg_dir);
#else #else
pmd = (pmd_t *) (PAGE_MASK & pgd_val(*pg_dir)); pmd = (pmd_t *)pgd_address(*pg_dir);
/* /*
* pmd is physical at this point * pmd is physical at this point
...@@ -555,7 +599,7 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd ...@@ -555,7 +599,7 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
pmd = (pmd_t *) __pa(pmd); pmd = (pmd_t *) __pa(pmd);
} }
pgd_val(*pg_dir) = _PAGE_TABLE | (unsigned long) pmd; pgd_populate(NULL, pg_dir, __va(pmd));
#endif #endif
pg_dir++; pg_dir++;
...@@ -568,15 +612,14 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd ...@@ -568,15 +612,14 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
* pg_table is physical at this point * pg_table is physical at this point
*/ */
pg_table = (pte_t *) (PAGE_MASK & pmd_val(*pmd)); pg_table = (pte_t *)pmd_address(*pmd);
if (!pg_table) { if (!pg_table) {
pg_table = (pte_t *) pg_table = (pte_t *)
alloc_bootmem_low_pages_node(NODE_DATA(0),PAGE_SIZE); alloc_bootmem_low_pages_node(NODE_DATA(0),PAGE_SIZE);
pg_table = (pte_t *) __pa(pg_table); pg_table = (pte_t *) __pa(pg_table);
} }
pmd_val(*pmd) = _PAGE_TABLE | pmd_populate_kernel(NULL, pmd, __va(pg_table));
(unsigned long) pg_table;
/* now change pg_table to kernel virtual addresses */ /* now change pg_table to kernel virtual addresses */
...@@ -584,8 +627,6 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd ...@@ -584,8 +627,6 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
for (tmp2 = start_pte; tmp2 < PTRS_PER_PTE; tmp2++,pg_table++) { for (tmp2 = start_pte; tmp2 < PTRS_PER_PTE; tmp2++,pg_table++) {
pte_t pte; pte_t pte;
#if !defined(CONFIG_STI_CONSOLE)
#warning STI console should explicitly allocate executable pages but does not
/* /*
* Map the fault vector writable so we can * Map the fault vector writable so we can
* write the HPMC checksum. * write the HPMC checksum.
...@@ -595,7 +636,6 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd ...@@ -595,7 +636,6 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
&& address != gw_addr) && address != gw_addr)
pte = __mk_pte(address, PAGE_KERNEL_RO); pte = __mk_pte(address, PAGE_KERNEL_RO);
else else
#endif
pte = __mk_pte(address, pgprot); pte = __mk_pte(address, pgprot);
if (address >= end_paddr) if (address >= end_paddr)
...@@ -758,61 +798,26 @@ void __init paging_init(void) ...@@ -758,61 +798,26 @@ void __init paging_init(void)
flush_tlb_all_local(); flush_tlb_all_local();
for (i = 0; i < npmem_ranges; i++) { for (i = 0; i < npmem_ranges; i++) {
unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0, }; unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0 };
/* We have an IOMMU, so all memory can go into a single
ZONE_DMA zone. */
zones_size[ZONE_DMA] = pmem_ranges[i].pages; zones_size[ZONE_DMA] = pmem_ranges[i].pages;
free_area_init_node(i,NODE_DATA(i),NULL,zones_size, free_area_init_node(i,NODE_DATA(i),NULL,zones_size,
(pmem_ranges[i].start_pfn << PAGE_SHIFT),0); pmem_ranges[i].start_pfn, 0);
}
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
/*
* Initialize support for virt_to_page() macro.
*
* Note that MAX_ADDRESS is the largest virtual address that
* we can map. However, since we map all physical memory into
* the kernel address space, it also has an effect on the maximum
* physical address we can map (MAX_ADDRESS - PAGE_OFFSET).
*/
maxchunkmap = MAX_ADDRESS >> CHUNKSHIFT;
chunkmap = (unsigned char *)alloc_bootmem(maxchunkmap);
for (i = 0; i < maxchunkmap; i++)
chunkmap[i] = BADCHUNK;
for (i = 0; i < npmem_ranges; i++) {
ADJ_NODE_MEM_MAP(i) = NODE_MEM_MAP(i) - pmem_ranges[i].start_pfn;
{ {
unsigned long chunk_paddr; int j;
unsigned long end_paddr; for (j = (node_start_pfn(i) >> PFNNID_SHIFT);
int chunknum; j <= (node_end_pfn(i) >> PFNNID_SHIFT);
j++) {
chunk_paddr = (pmem_ranges[i].start_pfn << PAGE_SHIFT); pfnnid_map[j] = i;
end_paddr = chunk_paddr + (pmem_ranges[i].pages << PAGE_SHIFT);
chunk_paddr &= CHUNKMASK;
chunknum = (int)CHUNKNUM(chunk_paddr);
while (chunk_paddr < end_paddr) {
if (chunknum >= maxchunkmap)
goto badchunkmap1;
if (chunkmap[chunknum] != BADCHUNK)
goto badchunkmap2;
chunkmap[chunknum] = (unsigned char)i;
chunk_paddr += CHUNKSZ;
chunknum++;
}
} }
} }
return;
badchunkmap1:
panic("paging_init: Physical address exceeds maximum address space!\n");
badchunkmap2:
panic("paging_init: Collision in chunk map array. CHUNKSZ needs to be smaller\n");
#endif #endif
}
} }
#ifdef CONFIG_PA20 #ifdef CONFIG_PA20
......
...@@ -342,7 +342,7 @@ void mask_and_ack_8259A(unsigned int irq) ...@@ -342,7 +342,7 @@ void mask_and_ack_8259A(unsigned int irq)
} }
} }
void __init init_8259A(int auto_eoi) void init_8259A(int auto_eoi)
{ {
unsigned long flags; unsigned long flags;
...@@ -385,6 +385,57 @@ void __init init_8259A(int auto_eoi) ...@@ -385,6 +385,57 @@ void __init init_8259A(int auto_eoi)
spin_unlock_irqrestore(&i8259A_lock, flags); spin_unlock_irqrestore(&i8259A_lock, flags);
} }
static char irq_trigger[2];
/**
* ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ
*/
static void restore_ELCR(char *trigger)
{
outb(trigger[0], 0x4d0);
outb(trigger[1], 0x4d1);
}
static void save_ELCR(char *trigger)
{
/* IRQ 0,1,2,8,13 are marked as reserved */
trigger[0] = inb(0x4d0) & 0xF8;
trigger[1] = inb(0x4d1) & 0xDE;
}
static int i8259A_resume(struct sys_device *dev)
{
init_8259A(0);
restore_ELCR(irq_trigger);
return 0;
}
static int i8259A_suspend(struct sys_device *dev, u32 state)
{
save_ELCR(irq_trigger);
return 0;
}
static struct sysdev_class i8259_sysdev_class = {
set_kset_name("i8259"),
.suspend = i8259A_suspend,
.resume = i8259A_resume,
};
static struct sys_device device_i8259A = {
.id = 0,
.cls = &i8259_sysdev_class,
};
static int __init i8259A_init_sysfs(void)
{
int error = sysdev_class_register(&i8259_sysdev_class);
if (!error)
error = sysdev_register(&device_i8259A);
return error;
}
device_initcall(i8259A_init_sysfs);
/* /*
* IRQ2 is cascade interrupt to second interrupt controller * IRQ2 is cascade interrupt to second interrupt controller
*/ */
......
...@@ -423,6 +423,20 @@ static inline void copy_edd(void) ...@@ -423,6 +423,20 @@ static inline void copy_edd(void)
} }
#endif #endif
#define EBDA_ADDR_POINTER 0x40E
static void __init reserve_ebda_region(void)
{
unsigned int addr;
/**
* there is a real-mode segmented pointer pointing to the
* 4K EBDA area at 0x40E
*/
addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER);
addr <<= 4;
if (addr)
reserve_bootmem_generic(addr, PAGE_SIZE);
}
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
unsigned long low_mem_size; unsigned long low_mem_size;
...@@ -487,6 +501,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -487,6 +501,9 @@ void __init setup_arch(char **cmdline_p)
*/ */
reserve_bootmem_generic(0, PAGE_SIZE); reserve_bootmem_generic(0, PAGE_SIZE);
/* reserve ebda region */
reserve_ebda_region();
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* /*
* But first pinch a few for the stack/trampoline stuff * But first pinch a few for the stack/trampoline stuff
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/bootmem.h> #include <linux/bootmem.h>
#include <linux/thread_info.h> #include <linux/thread_info.h>
#include <linux/module.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/mc146818rtc.h> #include <linux/mc146818rtc.h>
...@@ -62,6 +63,7 @@ cpumask_t cpu_online_map; ...@@ -62,6 +63,7 @@ cpumask_t cpu_online_map;
/* which logical CPU number maps to which CPU (physical APIC ID) */ /* which logical CPU number maps to which CPU (physical APIC ID) */
volatile char x86_cpu_to_apicid[NR_CPUS]; volatile char x86_cpu_to_apicid[NR_CPUS];
EXPORT_SYMBOL(x86_cpu_to_apicid);
static cpumask_t cpu_callin_map; static cpumask_t cpu_callin_map;
cpumask_t cpu_callout_map; cpumask_t cpu_callout_map;
......
...@@ -47,4 +47,4 @@ obj-$(CONFIG_ACPI_DEBUG) += debug.o ...@@ -47,4 +47,4 @@ obj-$(CONFIG_ACPI_DEBUG) += debug.o
obj-$(CONFIG_ACPI_NUMA) += numa.o obj-$(CONFIG_ACPI_NUMA) += numa.o
obj-$(CONFIG_ACPI_ASUS) += asus_acpi.o obj-$(CONFIG_ACPI_ASUS) += asus_acpi.o
obj-$(CONFIG_ACPI_TOSHIBA) += toshiba_acpi.o obj-$(CONFIG_ACPI_TOSHIBA) += toshiba_acpi.o
obj-$(CONFIG_ACPI_BUS) += scan.o obj-$(CONFIG_ACPI_BUS) += scan.o motherboard.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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