Merge branch 'master'

This commit is contained in:
Steven Whitehouse 2006-06-06 10:31:26 -04:00
commit 4b01abc977
211 changed files with 2153 additions and 1536 deletions

View File

@ -214,12 +214,13 @@ hardware.
The interaction of the iflag bits is as follows (parity error The interaction of the iflag bits is as follows (parity error
given as an example): given as an example):
Parity error INPCK IGNPAR Parity error INPCK IGNPAR
None n/a n/a character received n/a 0 n/a character received, marked as
Yes n/a 0 character discarded
Yes 0 1 character received, marked as
TTY_NORMAL TTY_NORMAL
Yes 1 1 character received, marked as None 1 n/a character received, marked as
TTY_NORMAL
Yes 1 0 character received, marked as
TTY_PARITY TTY_PARITY
Yes 1 1 character discarded
Other flags may be used (eg, xon/xoff characters) if your Other flags may be used (eg, xon/xoff characters) if your
hardware supports hardware "soft" flow control. hardware supports hardware "soft" flow control.

View File

@ -565,7 +565,19 @@ BROADBAND PROCESSOR ARCHITECTURE
P: Arnd Bergmann P: Arnd Bergmann
M: arnd@arndb.de M: arnd@arndb.de
L: linuxppc-dev@ozlabs.org L: linuxppc-dev@ozlabs.org
W: http://linuxppc64.org W: http://www.penguinppc.org/ppc64/
S: Supported
BROADCOM BNX2 GIGABIT ETHERNET DRIVER
P: Michael Chan
M: mchan@broadcom.com
L: netdev@vger.kernel.org
S: Supported
BROADCOM TG3 GIGABIT ETHERNET DRIVER
P: Michael Chan
M: mchan@broadcom.com
L: netdev@vger.kernel.org
S: Supported S: Supported
BTTV VIDEO4LINUX DRIVER BTTV VIDEO4LINUX DRIVER
@ -1734,7 +1746,7 @@ M: paulus@au.ibm.com
P: Anton Blanchard P: Anton Blanchard
M: anton@samba.org M: anton@samba.org
M: anton@au.ibm.com M: anton@au.ibm.com
W: http://linuxppc64.org W: http://www.penguinppc.org/ppc64/
L: linuxppc-dev@ozlabs.org L: linuxppc-dev@ozlabs.org
S: Supported S: Supported
@ -1895,6 +1907,11 @@ L: linux-kernel@vger.kernel.org
W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html W: http://www.atnf.csiro.au/~rgooch/linux/kernel-patches.html
S: Maintained S: Maintained
MULTIMEDIA CARD SUBSYSTEM
P: Russell King
M: rmk+mmc@arm.linux.org.uk
S: Maintained
MULTISOUND SOUND DRIVER MULTISOUND SOUND DRIVER
P: Andrew Veliath P: Andrew Veliath
M: andrewtv@usa.net M: andrewtv@usa.net
@ -1917,6 +1934,12 @@ M: James.Bottomley@HansenPartnership.com
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
S: Maintained S: Maintained
NETEM NETWORK EMULATOR
P: Stephen Hemminger
M: shemminger@osdl.org
L: netem@osdl.org
S: Maintained
NETFILTER/IPTABLES/IPCHAINS NETFILTER/IPTABLES/IPCHAINS
P: Rusty Russell P: Rusty Russell
P: Marc Boucher P: Marc Boucher

View File

@ -1,8 +1,8 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 17 SUBLEVEL = 17
EXTRAVERSION =-rc5 EXTRAVERSION =-rc6
NAME=Lordi Rules NAME=Crazed Snow-Weasel
# *DOCUMENTATION* # *DOCUMENTATION*
# To see a list of typical targets execute "make help" # To see a list of typical targets execute "make help"

View File

@ -182,7 +182,6 @@ EXPORT_SYMBOL(smp_num_cpus);
EXPORT_SYMBOL(smp_call_function); EXPORT_SYMBOL(smp_call_function);
EXPORT_SYMBOL(smp_call_function_on_cpu); EXPORT_SYMBOL(smp_call_function_on_cpu);
EXPORT_SYMBOL(_atomic_dec_and_lock); EXPORT_SYMBOL(_atomic_dec_and_lock);
EXPORT_SYMBOL(cpu_present_mask);
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/* /*

View File

@ -94,7 +94,7 @@ common_shutdown_1(void *generic_ptr)
if (cpuid != boot_cpuid) { if (cpuid != boot_cpuid) {
flags |= 0x00040000UL; /* "remain halted" */ flags |= 0x00040000UL; /* "remain halted" */
*pflags = flags; *pflags = flags;
clear_bit(cpuid, &cpu_present_mask); cpu_clear(cpuid, cpu_present_map);
halt(); halt();
} }
#endif #endif
@ -120,8 +120,8 @@ common_shutdown_1(void *generic_ptr)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* Wait for the secondaries to halt. */ /* Wait for the secondaries to halt. */
cpu_clear(boot_cpuid, cpu_possible_map); cpu_clear(boot_cpuid, cpu_present_map);
while (cpus_weight(cpu_possible_map)) while (cpus_weight(cpu_present_map))
barrier(); barrier();
#endif #endif

View File

@ -68,7 +68,6 @@ enum ipi_message_type {
static int smp_secondary_alive __initdata = 0; static int smp_secondary_alive __initdata = 0;
/* Which cpus ids came online. */ /* Which cpus ids came online. */
cpumask_t cpu_present_mask;
cpumask_t cpu_online_map; cpumask_t cpu_online_map;
EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_online_map);
@ -439,7 +438,7 @@ setup_smp(void)
if ((cpu->flags & 0x1cc) == 0x1cc) { if ((cpu->flags & 0x1cc) == 0x1cc) {
smp_num_probed++; smp_num_probed++;
/* Assume here that "whami" == index */ /* Assume here that "whami" == index */
cpu_set(i, cpu_present_mask); cpu_set(i, cpu_present_map);
cpu->pal_revision = boot_cpu_palrev; cpu->pal_revision = boot_cpu_palrev;
} }
@ -450,11 +449,10 @@ setup_smp(void)
} }
} else { } else {
smp_num_probed = 1; smp_num_probed = 1;
cpu_set(boot_cpuid, cpu_present_mask);
} }
printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_map = %lx\n",
smp_num_probed, cpu_possible_map.bits[0]); smp_num_probed, cpu_present_map.bits[0]);
} }
/* /*
@ -473,7 +471,7 @@ smp_prepare_cpus(unsigned int max_cpus)
/* Nothing to do on a UP box, or when told not to. */ /* Nothing to do on a UP box, or when told not to. */
if (smp_num_probed == 1 || max_cpus == 0) { if (smp_num_probed == 1 || max_cpus == 0) {
cpu_present_mask = cpumask_of_cpu(boot_cpuid); cpu_present_map = cpumask_of_cpu(boot_cpuid);
printk(KERN_INFO "SMP mode deactivated.\n"); printk(KERN_INFO "SMP mode deactivated.\n");
return; return;
} }
@ -486,10 +484,6 @@ smp_prepare_cpus(unsigned int max_cpus)
void __devinit void __devinit
smp_prepare_boot_cpu(void) smp_prepare_boot_cpu(void)
{ {
/*
* Mark the boot cpu (current cpu) as online
*/
cpu_set(smp_processor_id(), cpu_online_map);
} }
int __devinit int __devinit

View File

@ -66,7 +66,7 @@ titan_update_irq_hw(unsigned long mask)
register int bcpu = boot_cpuid; register int bcpu = boot_cpuid;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
cpumask_t cpm = cpu_present_mask; cpumask_t cpm = cpu_present_map;
volatile unsigned long *dim0, *dim1, *dim2, *dim3; volatile unsigned long *dim0, *dim1, *dim2, *dim3;
unsigned long mask0, mask1, mask2, mask3, dummy; unsigned long mask0, mask1, mask2, mask3, dummy;

View File

@ -101,7 +101,7 @@ config DEBUG_S3C2410_UART
help help
Choice for UART for kernel low-level using S3C2410 UARTS, Choice for UART for kernel low-level using S3C2410 UARTS,
should be between zero and two. The port must have been should be between zero and two. The port must have been
initalised by the boot-loader before use. initialised by the boot-loader before use.
The uncompressor code port configuration is now handled The uncompressor code port configuration is now handled
by CONFIG_S3C2410_LOWLEVEL_UART_PORT. by CONFIG_S3C2410_LOWLEVEL_UART_PORT.

View File

@ -178,8 +178,12 @@ static int ixp23xx_irq_set_type(unsigned int irq, unsigned int type)
static void ixp23xx_irq_mask(unsigned int irq) static void ixp23xx_irq_mask(unsigned int irq)
{ {
volatile unsigned long *intr_reg = IXP23XX_INTR_EN1 + (irq / 32); volatile unsigned long *intr_reg;
if (irq >= 56)
irq += 8;
intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
*intr_reg &= ~(1 << (irq % 32)); *intr_reg &= ~(1 << (irq % 32));
} }
@ -199,17 +203,25 @@ static void ixp23xx_irq_ack(unsigned int irq)
*/ */
static void ixp23xx_irq_level_unmask(unsigned int irq) static void ixp23xx_irq_level_unmask(unsigned int irq)
{ {
volatile unsigned long *intr_reg = IXP23XX_INTR_EN1 + (irq / 32); volatile unsigned long *intr_reg;
ixp23xx_irq_ack(irq); ixp23xx_irq_ack(irq);
if (irq >= 56)
irq += 8;
intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
*intr_reg |= (1 << (irq % 32)); *intr_reg |= (1 << (irq % 32));
} }
static void ixp23xx_irq_edge_unmask(unsigned int irq) static void ixp23xx_irq_edge_unmask(unsigned int irq)
{ {
volatile unsigned long *intr_reg = IXP23XX_INTR_EN1 + (irq / 32); volatile unsigned long *intr_reg;
if (irq >= 56)
irq += 8;
intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
*intr_reg |= (1 << (irq % 32)); *intr_reg |= (1 << (irq % 32));
} }

View File

@ -141,7 +141,7 @@ config IXP4XX_INDIRECT_PCI
2) If > 64MB of memory space is required, the IXP4xx can be 2) If > 64MB of memory space is required, the IXP4xx can be
configured to use indirect registers to access PCI This allows configured to use indirect registers to access PCI This allows
for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus. for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus.
The disadvantadge of this is that every PCI access requires The disadvantage of this is that every PCI access requires
three local register accesses plus a spinlock, but in some three local register accesses plus a spinlock, but in some
cases the performance hit is acceptable. In addition, you cannot cases the performance hit is acceptable. In addition, you cannot
mmap() PCI devices in this case due to the indirect nature mmap() PCI devices in this case due to the indirect nature

View File

@ -493,6 +493,7 @@ static void __init mainstone_map_io(void)
MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)") MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
/* Maintainer: MontaVista Software Inc. */ /* Maintainer: MontaVista Software Inc. */
.phys_io = 0x40000000, .phys_io = 0x40000000,
.boot_params = 0xa0000100, /* BLOB boot parameter setting */
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = mainstone_map_io, .map_io = mainstone_map_io,
.init_irq = mainstone_init_irq, .init_irq = mainstone_init_irq,

View File

@ -170,7 +170,7 @@ config S3C2410_PM_DEBUG
depends on ARCH_S3C2410 && PM depends on ARCH_S3C2410 && PM
help help
Say Y here if you want verbose debugging from the PM Suspend and Say Y here if you want verbose debugging from the PM Suspend and
Resume code. See `Documentation/arm/Samsing-S3C24XX/Suspend.txt` Resume code. See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt>
for more information. for more information.
config S3C2410_PM_CHECK config S3C2410_PM_CHECK

View File

@ -376,7 +376,7 @@ void __init build_mem_type_table(void)
ecc_mask = 0; ecc_mask = 0;
} }
if (cpu_arch <= CPU_ARCH_ARMv5TEJ) { if (cpu_arch <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) {
for (i = 0; i < ARRAY_SIZE(mem_types); i++) { for (i = 0; i < ARRAY_SIZE(mem_types); i++) {
if (mem_types[i].prot_l1) if (mem_types[i].prot_l1)
mem_types[i].prot_l1 |= PMD_BIT4; mem_types[i].prot_l1 |= PMD_BIT4;
@ -631,7 +631,7 @@ void setup_mm_for_reboot(char mode)
pgd = init_mm.pgd; pgd = init_mm.pgd;
base_pmdval = PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT; base_pmdval = PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT;
if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ) if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale())
base_pmdval |= PMD_BIT4; base_pmdval |= PMD_BIT4;
for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++, pgd++) { for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++, pgd++) {

View File

@ -427,12 +427,13 @@ __xsc3_setup:
#endif #endif
mcr p15, 0, r0, c1, c0, 1 @ set auxiliary control reg mcr p15, 0, r0, c1, c0, 1 @ set auxiliary control reg
mrc p15, 0, r0, c1, c0, 0 @ get control register mrc p15, 0, r0, c1, c0, 0 @ get control register
bic r0, r0, #0x0200 @ .... ..R. .... ....
bic r0, r0, #0x0002 @ .... .... .... ..A. bic r0, r0, #0x0002 @ .... .... .... ..A.
orr r0, r0, #0x0005 @ .... .... .... .C.M orr r0, r0, #0x0005 @ .... .... .... .C.M
#if BTB_ENABLE #if BTB_ENABLE
bic r0, r0, #0x0200 @ .... ..R. .... ....
orr r0, r0, #0x3900 @ ..VI Z..S .... .... orr r0, r0, #0x3900 @ ..VI Z..S .... ....
#else #else
bic r0, r0, #0x0a00 @ .... Z.R. .... ....
orr r0, r0, #0x3100 @ ..VI ...S .... .... orr r0, r0, #0x3100 @ ..VI ...S .... ....
#endif #endif
#if L2_CACHE_ENABLE #if L2_CACHE_ENABLE

View File

@ -1066,14 +1066,6 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
}, },
}, },
{
.callback = disable_acpi_pci,
.ident = "HP xw9300",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
DMI_MATCH(DMI_PRODUCT_NAME, "HP xw9300 Workstation"),
},
},
{} {}
}; };

View File

@ -315,3 +315,4 @@ ENTRY(sys_call_table)
.long sys_splice .long sys_splice
.long sys_sync_file_range .long sys_sync_file_range
.long sys_tee /* 315 */ .long sys_tee /* 315 */
.long sys_vmsplice

View File

@ -93,9 +93,11 @@ int __init mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid
int i; int i;
for (i = 0; apic_probe[i]; ++i) { for (i = 0; apic_probe[i]; ++i) {
if (apic_probe[i]->mps_oem_check(mpc,oem,productid)) { if (apic_probe[i]->mps_oem_check(mpc,oem,productid)) {
genapic = apic_probe[i]; if (!cmdline_apic) {
printk(KERN_INFO "Switched to APIC driver `%s'.\n", genapic = apic_probe[i];
genapic->name); printk(KERN_INFO "Switched to APIC driver `%s'.\n",
genapic->name);
}
return 1; return 1;
} }
} }
@ -107,9 +109,11 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
int i; int i;
for (i = 0; apic_probe[i]; ++i) { for (i = 0; apic_probe[i]; ++i) {
if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) {
genapic = apic_probe[i]; if (!cmdline_apic) {
printk(KERN_INFO "Switched to APIC driver `%s'.\n", genapic = apic_probe[i];
genapic->name); printk(KERN_INFO "Switched to APIC driver `%s'.\n",
genapic->name);
}
return 1; return 1;
} }
} }

View File

@ -13,7 +13,7 @@ choice
default SGI_IP22 default SGI_IP22
config MIPS_MTX1 config MIPS_MTX1
bool "Support for 4G Systems MTX-1 board" bool "4G Systems MTX-1 board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select SOC_AU1500 select SOC_AU1500
@ -120,7 +120,7 @@ config MIPS_MIRAGE
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config MIPS_COBALT config MIPS_COBALT
bool "Support for Cobalt Server" bool "Cobalt Server"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select I8259 select I8259
@ -132,7 +132,7 @@ config MIPS_COBALT
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config MACH_DECSTATION config MACH_DECSTATION
bool "Support for DECstations" bool "DECstations"
select BOOT_ELF32 select BOOT_ELF32
select DMA_NONCOHERENT select DMA_NONCOHERENT
select EARLY_PRINTK select EARLY_PRINTK
@ -158,7 +158,7 @@ config MACH_DECSTATION
otherwise choose R3000. otherwise choose R3000.
config MIPS_EV64120 config MIPS_EV64120
bool "Support for Galileo EV64120 Evaluation board (EXPERIMENTAL)" bool "Galileo EV64120 Evaluation board (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
@ -175,7 +175,7 @@ config MIPS_EV64120
kernel for this platform. kernel for this platform.
config MIPS_EV96100 config MIPS_EV96100
bool "Support for Galileo EV96100 Evaluation board (EXPERIMENTAL)" bool "Galileo EV96100 Evaluation board (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
@ -195,7 +195,7 @@ config MIPS_EV96100
here if you wish to build a kernel for this platform. here if you wish to build a kernel for this platform.
config MIPS_IVR config MIPS_IVR
bool "Support for Globespan IVR board" bool "Globespan IVR board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select ITE_BOARD_GEN select ITE_BOARD_GEN
@ -211,7 +211,7 @@ config MIPS_IVR
build a kernel for this platform. build a kernel for this platform.
config MIPS_ITE8172 config MIPS_ITE8172
bool "Support for ITE 8172G board" bool "ITE 8172G board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select ITE_BOARD_GEN select ITE_BOARD_GEN
@ -228,7 +228,7 @@ config MIPS_ITE8172
a kernel for this platform. a kernel for this platform.
config MACH_JAZZ config MACH_JAZZ
bool "Support for the Jazz family of machines" bool "Jazz family of machines"
select ARC select ARC
select ARC32 select ARC32
select ARCH_MAY_HAVE_PC_FDC select ARCH_MAY_HAVE_PC_FDC
@ -246,7 +246,7 @@ config MACH_JAZZ
Olivetti M700-10 workstations. Olivetti M700-10 workstations.
config LASAT config LASAT
bool "Support for LASAT Networks platforms" bool "LASAT Networks platforms"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select MIPS_GT64120 select MIPS_GT64120
@ -258,7 +258,7 @@ config LASAT
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config MIPS_ATLAS config MIPS_ATLAS
bool "Support for MIPS Atlas board" bool "MIPS Atlas board"
select BOOT_ELF32 select BOOT_ELF32
select DMA_NONCOHERENT select DMA_NONCOHERENT
select IRQ_CPU select IRQ_CPU
@ -283,7 +283,7 @@ config MIPS_ATLAS
board. board.
config MIPS_MALTA config MIPS_MALTA
bool "Support for MIPS Malta board" bool "MIPS Malta board"
select ARCH_MAY_HAVE_PC_FDC select ARCH_MAY_HAVE_PC_FDC
select BOOT_ELF32 select BOOT_ELF32
select HAVE_STD_PC_SERIAL_PORT select HAVE_STD_PC_SERIAL_PORT
@ -311,7 +311,7 @@ config MIPS_MALTA
board. board.
config MIPS_SEAD config MIPS_SEAD
bool "Support for MIPS SEAD board (EXPERIMENTAL)" bool "MIPS SEAD board (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select IRQ_CPU select IRQ_CPU
select DMA_NONCOHERENT select DMA_NONCOHERENT
@ -328,7 +328,7 @@ config MIPS_SEAD
board. board.
config MIPS_SIM config MIPS_SIM
bool 'Support for MIPS simulator (MIPSsim)' bool 'MIPS simulator (MIPSsim)'
select DMA_NONCOHERENT select DMA_NONCOHERENT
select IRQ_CPU select IRQ_CPU
select SYS_HAS_CPU_MIPS32_R1 select SYS_HAS_CPU_MIPS32_R1
@ -341,7 +341,7 @@ config MIPS_SIM
emulator. emulator.
config MOMENCO_JAGUAR_ATX config MOMENCO_JAGUAR_ATX
bool "Support for Momentum Jaguar board" bool "Momentum Jaguar board"
select BOOT_ELF32 select BOOT_ELF32
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
@ -361,7 +361,7 @@ config MOMENCO_JAGUAR_ATX
Momentum Computer <http://www.momenco.com/>. Momentum Computer <http://www.momenco.com/>.
config MOMENCO_OCELOT config MOMENCO_OCELOT
bool "Support for Momentum Ocelot board" bool "Momentum Ocelot board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select IRQ_CPU select IRQ_CPU
@ -378,7 +378,7 @@ config MOMENCO_OCELOT
Momentum Computer <http://www.momenco.com/>. Momentum Computer <http://www.momenco.com/>.
config MOMENCO_OCELOT_3 config MOMENCO_OCELOT_3
bool "Support for Momentum Ocelot-3 board" bool "Momentum Ocelot-3 board"
select BOOT_ELF32 select BOOT_ELF32
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
@ -397,7 +397,7 @@ config MOMENCO_OCELOT_3
PMC-Sierra Rm79000 core. PMC-Sierra Rm79000 core.
config MOMENCO_OCELOT_C config MOMENCO_OCELOT_C
bool "Support for Momentum Ocelot-C board" bool "Momentum Ocelot-C board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select IRQ_CPU select IRQ_CPU
@ -414,7 +414,7 @@ config MOMENCO_OCELOT_C
Momentum Computer <http://www.momenco.com/>. Momentum Computer <http://www.momenco.com/>.
config MOMENCO_OCELOT_G config MOMENCO_OCELOT_G
bool "Support for Momentum Ocelot-G board" bool "Momentum Ocelot-G board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select IRQ_CPU select IRQ_CPU
@ -431,23 +431,23 @@ config MOMENCO_OCELOT_G
Momentum Computer <http://www.momenco.com/>. Momentum Computer <http://www.momenco.com/>.
config MIPS_XXS1500 config MIPS_XXS1500
bool "Support for MyCable XXS1500 board" bool "MyCable XXS1500 board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select SOC_AU1500 select SOC_AU1500
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config PNX8550_V2PCI config PNX8550_V2PCI
bool "Support for Philips PNX8550 based Viper2-PCI board" bool "Philips PNX8550 based Viper2-PCI board"
select PNX8550 select PNX8550
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config PNX8550_JBS config PNX8550_JBS
bool "Support for Philips PNX8550 based JBS board" bool "Philips PNX8550 based JBS board"
select PNX8550 select PNX8550
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config DDB5074 config DDB5074
bool "Support for NEC DDB Vrc-5074 (EXPERIMENTAL)" bool "NEC DDB Vrc-5074 (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select DDB5XXX_COMMON select DDB5XXX_COMMON
select DMA_NONCOHERENT select DMA_NONCOHERENT
@ -465,7 +465,7 @@ config DDB5074
evaluation board. evaluation board.
config DDB5476 config DDB5476
bool "Support for NEC DDB Vrc-5476" bool "NEC DDB Vrc-5476"
select DDB5XXX_COMMON select DDB5XXX_COMMON
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HAVE_STD_PC_SERIAL_PORT select HAVE_STD_PC_SERIAL_PORT
@ -486,7 +486,7 @@ config DDB5476
IDE controller, PS2 keyboard, PS2 mouse, etc. IDE controller, PS2 keyboard, PS2 mouse, etc.
config DDB5477 config DDB5477
bool "Support for NEC DDB Vrc-5477" bool "NEC DDB Vrc-5477"
select DDB5XXX_COMMON select DDB5XXX_COMMON
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
@ -504,13 +504,13 @@ config DDB5477
ether port USB, AC97, PCI, etc. ether port USB, AC97, PCI, etc.
config MACH_VR41XX config MACH_VR41XX
bool "Support for NEC VR4100 series based machines" bool "NEC VR41XX-based machines"
select SYS_HAS_CPU_VR41XX select SYS_HAS_CPU_VR41XX
select SYS_SUPPORTS_32BIT_KERNEL select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL
config PMC_YOSEMITE config PMC_YOSEMITE
bool "Support for PMC-Sierra Yosemite eval board" bool "PMC-Sierra Yosemite eval board"
select DMA_COHERENT select DMA_COHERENT
select HW_HAS_PCI select HW_HAS_PCI
select IRQ_CPU select IRQ_CPU
@ -527,7 +527,7 @@ config PMC_YOSEMITE
manufactured by PMC-Sierra. manufactured by PMC-Sierra.
config QEMU config QEMU
bool "Support for Qemu" bool "Qemu"
select DMA_COHERENT select DMA_COHERENT
select GENERIC_ISA_DMA select GENERIC_ISA_DMA
select HAVE_STD_PC_SERIAL_PORT select HAVE_STD_PC_SERIAL_PORT
@ -547,7 +547,7 @@ config QEMU
can be found at http://www.linux-mips.org/wiki/Qemu. can be found at http://www.linux-mips.org/wiki/Qemu.
config SGI_IP22 config SGI_IP22
bool "Support for SGI IP22 (Indy/Indigo2)" bool "SGI IP22 (Indy/Indigo2)"
select ARC select ARC
select ARC32 select ARC32
select BOOT_ELF32 select BOOT_ELF32
@ -567,7 +567,7 @@ config SGI_IP22
that runs on these, say Y here. that runs on these, say Y here.
config SGI_IP27 config SGI_IP27
bool "Support for SGI IP27 (Origin200/2000)" bool "SGI IP27 (Origin200/2000)"
select ARC select ARC
select ARC64 select ARC64
select BOOT_ELF64 select BOOT_ELF64
@ -583,7 +583,7 @@ config SGI_IP27
here. here.
config SGI_IP32 config SGI_IP32
bool "Support for SGI IP32 (O2) (EXPERIMENTAL)" bool "SGI IP32 (O2) (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select ARC select ARC
select ARC32 select ARC32
@ -604,7 +604,7 @@ config SGI_IP32
If you want this kernel to run on SGI O2 workstation, say Y here. If you want this kernel to run on SGI O2 workstation, say Y here.
config SIBYTE_BIGSUR config SIBYTE_BIGSUR
bool "Support for Sibyte BCM91480B-BigSur" bool "Sibyte BCM91480B-BigSur"
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
select PCI_DOMAINS select PCI_DOMAINS
@ -615,7 +615,7 @@ config SIBYTE_BIGSUR
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_SWARM config SIBYTE_SWARM
bool "Support for Sibyte BCM91250A-SWARM" bool "Sibyte BCM91250A-SWARM"
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
select SIBYTE_SB1250 select SIBYTE_SB1250
@ -626,7 +626,7 @@ config SIBYTE_SWARM
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_SENTOSA config SIBYTE_SENTOSA
bool "Support for Sibyte BCM91250E-Sentosa" bool "Sibyte BCM91250E-Sentosa"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -637,7 +637,7 @@ config SIBYTE_SENTOSA
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_RHONE config SIBYTE_RHONE
bool "Support for Sibyte BCM91125E-Rhone" bool "Sibyte BCM91125E-Rhone"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -648,7 +648,7 @@ config SIBYTE_RHONE
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_CARMEL config SIBYTE_CARMEL
bool "Support for Sibyte BCM91120x-Carmel" bool "Sibyte BCM91120x-Carmel"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -659,7 +659,7 @@ config SIBYTE_CARMEL
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_PTSWARM config SIBYTE_PTSWARM
bool "Support for Sibyte BCM91250PT-PTSWARM" bool "Sibyte BCM91250PT-PTSWARM"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -671,7 +671,7 @@ config SIBYTE_PTSWARM
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_LITTLESUR config SIBYTE_LITTLESUR
bool "Support for Sibyte BCM91250C2-LittleSur" bool "Sibyte BCM91250C2-LittleSur"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -683,7 +683,7 @@ config SIBYTE_LITTLESUR
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_CRHINE config SIBYTE_CRHINE
bool "Support for Sibyte BCM91120C-CRhine" bool "Sibyte BCM91120C-CRhine"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -694,7 +694,7 @@ config SIBYTE_CRHINE
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SIBYTE_CRHONE config SIBYTE_CRHONE
bool "Support for Sibyte BCM91125C-CRhone" bool "Sibyte BCM91125C-CRhone"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select BOOT_ELF32 select BOOT_ELF32
select DMA_COHERENT select DMA_COHERENT
@ -706,7 +706,7 @@ config SIBYTE_CRHONE
select SYS_SUPPORTS_LITTLE_ENDIAN select SYS_SUPPORTS_LITTLE_ENDIAN
config SNI_RM200_PCI config SNI_RM200_PCI
bool "Support for SNI RM200 PCI" bool "SNI RM200 PCI"
select ARC select ARC
select ARC32 select ARC32
select ARCH_MAY_HAVE_PC_FDC select ARCH_MAY_HAVE_PC_FDC
@ -732,7 +732,7 @@ config SNI_RM200_PCI
support this machine type. support this machine type.
config TOSHIBA_JMR3927 config TOSHIBA_JMR3927
bool "Support for Toshiba JMR-TX3927 board" bool "Toshiba JMR-TX3927 board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HW_HAS_PCI select HW_HAS_PCI
select MIPS_TX3927 select MIPS_TX3927
@ -743,7 +743,7 @@ config TOSHIBA_JMR3927
select TOSHIBA_BOARDS select TOSHIBA_BOARDS
config TOSHIBA_RBTX4927 config TOSHIBA_RBTX4927
bool "Support for Toshiba TBTX49[23]7 board" bool "Toshiba TBTX49[23]7 board"
select DMA_NONCOHERENT select DMA_NONCOHERENT
select HAS_TXX9_SERIAL select HAS_TXX9_SERIAL
select HW_HAS_PCI select HW_HAS_PCI
@ -760,7 +760,7 @@ config TOSHIBA_RBTX4927
support this machine type support this machine type
config TOSHIBA_RBTX4938 config TOSHIBA_RBTX4938
bool "Support for Toshiba RBTX4938 board" bool "Toshiba RBTX4938 board"
select HAVE_STD_PC_SERIAL_PORT select HAVE_STD_PC_SERIAL_PORT
select DMA_NONCOHERENT select DMA_NONCOHERENT
select GENERIC_ISA_DMA select GENERIC_ISA_DMA
@ -1411,13 +1411,12 @@ config PAGE_SIZE_8KB
config PAGE_SIZE_16KB config PAGE_SIZE_16KB
bool "16kB" bool "16kB"
depends on EXPERIMENTAL && !CPU_R3000 && !CPU_TX39XX depends on !CPU_R3000 && !CPU_TX39XX
help help
Using 16kB page size will result in higher performance kernel at Using 16kB page size will result in higher performance kernel at
the price of higher memory consumption. This option is available on the price of higher memory consumption. This option is available on
all non-R3000 family processor. Not that at the time of this all non-R3000 family processors. Note that you will need a suitable
writing this option is still high experimental; there are also Linux distribution to support this.
issues with compatibility of user applications.
config PAGE_SIZE_64KB config PAGE_SIZE_64KB
bool "64kB" bool "64kB"
@ -1426,8 +1425,7 @@ config PAGE_SIZE_64KB
Using 64kB page size will result in higher performance kernel at Using 64kB page size will result in higher performance kernel at
the price of higher memory consumption. This option is available on the price of higher memory consumption. This option is available on
all non-R3000 family processor. Not that at the time of this all non-R3000 family processor. Not that at the time of this
writing this option is still high experimental; there are also writing this option is still high experimental.
issues with compatibility of user applications.
endchoice endchoice

View File

@ -68,6 +68,7 @@
extern void set_debug_traps(void); extern void set_debug_traps(void);
extern irq_cpustat_t irq_stat [NR_CPUS]; extern irq_cpustat_t irq_stat [NR_CPUS];
extern void mips_timer_interrupt(struct pt_regs *regs);
static void setup_local_irq(unsigned int irq, int type, int int_req); static void setup_local_irq(unsigned int irq, int type, int int_req);
static unsigned int startup_irq(unsigned int irq); static unsigned int startup_irq(unsigned int irq);

View File

@ -1,10 +1,9 @@
/* /*
* *
* BRIEF MODULE DESCRIPTION * BRIEF MODULE DESCRIPTION
* PROM library initialisation code, assuming a version of * PROM library initialisation code, assuming YAMON is the boot loader.
* pmon is the boot code.
* *
* Copyright 2000,2001 MontaVista Software Inc. * Copyright 2000, 2001, 2006 MontaVista Software Inc.
* Author: MontaVista Software, Inc. * Author: MontaVista Software, Inc.
* ppopov@mvista.com or source@mvista.com * ppopov@mvista.com or source@mvista.com
* *
@ -49,9 +48,9 @@ extern char **prom_argv, **prom_envp;
typedef struct typedef struct
{ {
char *name; char *name;
/* char *val; */ char *val;
}t_env_var; } t_env_var;
char * prom_getcmdline(void) char * prom_getcmdline(void)
@ -85,21 +84,16 @@ char *prom_getenv(char *envname)
{ {
/* /*
* Return a pointer to the given environment variable. * Return a pointer to the given environment variable.
* Environment variables are stored in the form of "memsize=64".
*/ */
t_env_var *env = (t_env_var *)prom_envp; t_env_var *env = (t_env_var *)prom_envp;
int i;
i = strlen(envname); while (env->name) {
if (strcmp(envname, env->name) == 0)
while(env->name) { return env->val;
if(strncmp(envname, env->name, i) == 0) {
return(env->name + strlen(envname) + 1);
}
env++; env++;
} }
return(NULL); return NULL;
} }
inline unsigned char str2hexnum(unsigned char c) inline unsigned char str2hexnum(unsigned char c)

View File

@ -112,6 +112,11 @@ sdsleep:
mtc0 k0, CP0_PAGEMASK mtc0 k0, CP0_PAGEMASK
lw k0, 0x14(sp) lw k0, 0x14(sp)
mtc0 k0, CP0_CONFIG mtc0 k0, CP0_CONFIG
/* We need to catch the ealry Alchemy SOCs with
* the write-only Config[OD] bit and set it back to one...
*/
jal au1x00_fixup_config_od
lw $1, PT_R1(sp) lw $1, PT_R1(sp)
lw $2, PT_R2(sp) lw $2, PT_R2(sp)
lw $3, PT_R3(sp) lw $3, PT_R3(sp)

View File

@ -116,6 +116,7 @@ void mips_timer_interrupt(struct pt_regs *regs)
null: null:
ack_r4ktimer(0); ack_r4ktimer(0);
irq_exit();
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM

View File

@ -86,7 +86,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -86,7 +86,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -149,7 +149,7 @@ void serial_set(int channel, unsigned long baud)
#else #else
/* /*
* Note: Set baud rate, hardcoded here for rate of 115200 * Note: Set baud rate, hardcoded here for rate of 115200
* since became unsure of above "buad rate" algorithm (??). * since became unsure of above "baud rate" algorithm (??).
*/ */
outreg(channel, LCR, 0x83); outreg(channel, LCR, 0x83);
outreg(channel, DLM, 0x00); // See note above outreg(channel, DLM, 0x00); // See note above

View File

@ -73,7 +73,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -72,7 +72,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -272,8 +272,8 @@ void output_sc_defines(void)
text("/* Linux sigcontext offsets. */"); text("/* Linux sigcontext offsets. */");
offset("#define SC_REGS ", struct sigcontext, sc_regs); offset("#define SC_REGS ", struct sigcontext, sc_regs);
offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs); offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs);
offset("#define SC_MDHI ", struct sigcontext, sc_hi); offset("#define SC_MDHI ", struct sigcontext, sc_mdhi);
offset("#define SC_MDLO ", struct sigcontext, sc_lo); offset("#define SC_MDLO ", struct sigcontext, sc_mdlo);
offset("#define SC_PC ", struct sigcontext, sc_pc); offset("#define SC_PC ", struct sigcontext, sc_pc);
offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr); offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr);
linefeed; linefeed;

View File

@ -206,7 +206,7 @@ static inline void check_daddi(void)
"daddi %0, %1, %3\n\t" "daddi %0, %1, %3\n\t"
".set pop" ".set pop"
: "=r" (v), "=&r" (tmp) : "=r" (v), "=&r" (tmp)
: "I" (0xffffffffffffdb9a), "I" (0x1234)); : "I" (0xffffffffffffdb9aUL), "I" (0x1234));
set_except_vector(12, handler); set_except_vector(12, handler);
local_irq_restore(flags); local_irq_restore(flags);
@ -224,7 +224,7 @@ static inline void check_daddi(void)
"dsrl %1, %1, 1\n\t" "dsrl %1, %1, 1\n\t"
"daddi %0, %1, %3" "daddi %0, %1, %3"
: "=r" (v), "=&r" (tmp) : "=r" (v), "=&r" (tmp)
: "I" (0xffffffffffffdb9a), "I" (0x1234)); : "I" (0xffffffffffffdb9aUL), "I" (0x1234));
set_except_vector(12, handler); set_except_vector(12, handler);
local_irq_restore(flags); local_irq_restore(flags);
@ -280,7 +280,7 @@ static inline void check_daddiu(void)
"daddu %1, %2\n\t" "daddu %1, %2\n\t"
".set pop" ".set pop"
: "=&r" (v), "=&r" (w), "=&r" (tmp) : "=&r" (v), "=&r" (w), "=&r" (tmp)
: "I" (0xffffffffffffdb9a), "I" (0x1234)); : "I" (0xffffffffffffdb9aUL), "I" (0x1234));
if (v == w) { if (v == w) {
printk("no.\n"); printk("no.\n");
@ -296,7 +296,7 @@ static inline void check_daddiu(void)
"addiu %1, $0, %4\n\t" "addiu %1, $0, %4\n\t"
"daddu %1, %2" "daddu %1, %2"
: "=&r" (v), "=&r" (w), "=&r" (tmp) : "=&r" (v), "=&r" (w), "=&r" (tmp)
: "I" (0xffffffffffffdb9a), "I" (0x1234)); : "I" (0xffffffffffffdb9aUL), "I" (0x1234));
if (v == w) { if (v == w) {
printk("yes.\n"); printk("yes.\n");

View File

@ -121,6 +121,7 @@ static inline void check_wait(void)
case CPU_24K: case CPU_24K:
case CPU_25KF: case CPU_25KF:
case CPU_34K: case CPU_34K:
case CPU_74K:
case CPU_PR4450: case CPU_PR4450:
cpu_wait = r4k_wait; cpu_wait = r4k_wait;
printk(" available.\n"); printk(" available.\n");
@ -432,6 +433,15 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
MIPS_CPU_LLSC; MIPS_CPU_LLSC;
c->tlbsize = 64; c->tlbsize = 64;
break; break;
case PRID_IMP_R14000:
c->cputype = CPU_R14000;
c->isa_level = MIPS_CPU_ISA_IV;
c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
MIPS_CPU_FPU | MIPS_CPU_32FPR |
MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
MIPS_CPU_LLSC;
c->tlbsize = 64;
break;
} }
} }
@ -593,6 +603,9 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c)
case PRID_IMP_34K: case PRID_IMP_34K:
c->cputype = CPU_34K; c->cputype = CPU_34K;
break; break;
case PRID_IMP_74K:
c->cputype = CPU_74K;
break;
} }
} }
@ -642,7 +655,7 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c)
case PRID_IMP_SB1: case PRID_IMP_SB1:
c->cputype = CPU_SB1; c->cputype = CPU_SB1;
/* FPU in pass1 is known to have issues. */ /* FPU in pass1 is known to have issues. */
if ((c->processor_id & 0xff) < 0x20) if ((c->processor_id & 0xff) < 0x02)
c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR);
break; break;
case PRID_IMP_SB1A: case PRID_IMP_SB1A:

View File

@ -101,7 +101,7 @@ FEXPORT(restore_all) # restore full frame
EMT EMT
1: 1:
mfc0 v1, CP0_TCSTATUS mfc0 v1, CP0_TCSTATUS
/* We set IXMT above, XOR should cler it here */ /* We set IXMT above, XOR should clear it here */
xori v1, v1, TCSTATUS_IXMT xori v1, v1, TCSTATUS_IXMT
or v1, v0, v1 or v1, v0, v1
mtc0 v1, CP0_TCSTATUS mtc0 v1, CP0_TCSTATUS

View File

@ -54,9 +54,11 @@
*/ */
mfc0 k0, CP0_CAUSE mfc0 k0, CP0_CAUSE
andi k0, k0, 0x7c andi k0, k0, 0x7c
add k1, k1, k0 #ifdef CONFIG_64BIT
PTR_L k0, saved_vectors(k1) dsll k0, k0, 1
jr k0 #endif
PTR_L k1, saved_vectors(k0)
jr k1
nop nop
1: 1:
move k0, sp move k0, sp

View File

@ -288,6 +288,9 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab,
sym = (Elf_Sym *)sechdrs[symindex].sh_addr sym = (Elf_Sym *)sechdrs[symindex].sh_addr
+ ELF_MIPS_R_SYM(rel[i]); + ELF_MIPS_R_SYM(rel[i]);
if (!sym->st_value) { if (!sym->st_value) {
/* Ignore unresolved weak symbol */
if (ELF_ST_BIND(sym->st_info) == STB_WEAK)
continue;
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
me->name, strtab + sym->st_name); me->name, strtab + sym->st_name);
return -ENOENT; return -ENOENT;
@ -325,6 +328,9 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
sym = (Elf_Sym *)sechdrs[symindex].sh_addr sym = (Elf_Sym *)sechdrs[symindex].sh_addr
+ ELF_MIPS_R_SYM(rel[i]); + ELF_MIPS_R_SYM(rel[i]);
if (!sym->st_value) { if (!sym->st_value) {
/* Ignore unresolved weak symbol */
if (ELF_ST_BIND(sym->st_info) == STB_WEAK)
continue;
printk(KERN_WARNING "%s: Unknown symbol %s\n", printk(KERN_WARNING "%s: Unknown symbol %s\n",
me->name, strtab + sym->st_name); me->name, strtab + sym->st_name);
return -ENOENT; return -ENOENT;

View File

@ -42,6 +42,7 @@ static const char *cpu_name[] = {
[CPU_R8000] = "R8000", [CPU_R8000] = "R8000",
[CPU_R10000] = "R10000", [CPU_R10000] = "R10000",
[CPU_R12000] = "R12000", [CPU_R12000] = "R12000",
[CPU_R14000] = "R14000",
[CPU_R4300] = "R4300", [CPU_R4300] = "R4300",
[CPU_R4650] = "R4650", [CPU_R4650] = "R4650",
[CPU_R4700] = "R4700", [CPU_R4700] = "R4700",
@ -74,6 +75,7 @@ static const char *cpu_name[] = {
[CPU_24K] = "MIPS 24K", [CPU_24K] = "MIPS 24K",
[CPU_25KF] = "MIPS 25Kf", [CPU_25KF] = "MIPS 25Kf",
[CPU_34K] = "MIPS 34K", [CPU_34K] = "MIPS 34K",
[CPU_74K] = "MIPS 74K",
[CPU_VR4111] = "NEC VR4111", [CPU_VR4111] = "NEC VR4111",
[CPU_VR4121] = "NEC VR4121", [CPU_VR4121] = "NEC VR4121",
[CPU_VR4122] = "NEC VR4122", [CPU_VR4122] = "NEC VR4122",

View File

@ -209,7 +209,7 @@ sys_call_table:
PTR sys_fork PTR sys_fork
PTR sys_read PTR sys_read
PTR sys_write PTR sys_write
PTR sys_open /* 4005 */ PTR compat_sys_open /* 4005 */
PTR sys_close PTR sys_close
PTR sys_waitpid PTR sys_waitpid
PTR sys_creat PTR sys_creat

View File

@ -246,7 +246,7 @@ static inline int parse_rd_cmdline(unsigned long* rd_start, unsigned long* rd_en
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
/* HACK: Guess if the sign extension was forgotten */ /* HACK: Guess if the sign extension was forgotten */
if (start > 0x0000000080000000 && start < 0x00000000ffffffff) if (start > 0x0000000080000000 && start < 0x00000000ffffffff)
start |= 0xffffffff00000000; start |= 0xffffffff00000000UL;
#endif #endif
end = start + size; end = start + size;
@ -355,8 +355,6 @@ static inline void bootmem_init(void)
} }
#endif #endif
memory_present(0, first_usable_pfn, max_low_pfn);
/* Initialize the boot-time allocator with low memory only. */ /* Initialize the boot-time allocator with low memory only. */
bootmap_size = init_bootmem(first_usable_pfn, max_low_pfn); bootmap_size = init_bootmem(first_usable_pfn, max_low_pfn);
@ -410,6 +408,7 @@ static inline void bootmem_init(void)
/* Register lowmem ranges */ /* Register lowmem ranges */
free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size)); free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
memory_present(0, curr_pfn, curr_pfn + size - 1);
} }
/* Reserve the bootmap memory. */ /* Reserve the bootmap memory. */
@ -419,17 +418,20 @@ static inline void bootmem_init(void)
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
initrd_below_start_ok = 1; initrd_below_start_ok = 1;
if (initrd_start) { if (initrd_start) {
unsigned long initrd_size = ((unsigned char *)initrd_end) - ((unsigned char *)initrd_start); unsigned long initrd_size = ((unsigned char *)initrd_end) -
((unsigned char *)initrd_start);
const int width = sizeof(long) * 2;
printk("Initial ramdisk at: 0x%p (%lu bytes)\n", printk("Initial ramdisk at: 0x%p (%lu bytes)\n",
(void *)initrd_start, initrd_size); (void *)initrd_start, initrd_size);
if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) { if (CPHYSADDR(initrd_end) > PFN_PHYS(max_low_pfn)) {
printk("initrd extends beyond end of memory " printk("initrd extends beyond end of memory "
"(0x%0*Lx > 0x%0*Lx)\ndisabling initrd\n", "(0x%0*Lx > 0x%0*Lx)\ndisabling initrd\n",
sizeof(long) * 2, width,
(unsigned long long)CPHYSADDR(initrd_end), (unsigned long long) CPHYSADDR(initrd_end),
sizeof(long) * 2, width,
(unsigned long long)PFN_PHYS(max_low_pfn)); (unsigned long long) PFN_PHYS(max_low_pfn));
initrd_start = initrd_end = 0; initrd_start = initrd_end = 0;
initrd_reserve_bootmem = 0; initrd_reserve_bootmem = 0;
} }

View File

@ -31,7 +31,6 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
save_gp_reg(31); save_gp_reg(31);
#undef save_gp_reg #undef save_gp_reg
#ifdef CONFIG_32BIT
err |= __put_user(regs->hi, &sc->sc_mdhi); err |= __put_user(regs->hi, &sc->sc_mdhi);
err |= __put_user(regs->lo, &sc->sc_mdlo); err |= __put_user(regs->lo, &sc->sc_mdlo);
if (cpu_has_dsp) { if (cpu_has_dsp) {
@ -43,20 +42,6 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
err |= __put_user(mflo3(), &sc->sc_lo3); err |= __put_user(mflo3(), &sc->sc_lo3);
err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp); err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
} }
#endif
#ifdef CONFIG_64BIT
err |= __put_user(regs->hi, &sc->sc_hi[0]);
err |= __put_user(regs->lo, &sc->sc_lo[0]);
if (cpu_has_dsp) {
err |= __put_user(mfhi1(), &sc->sc_hi[1]);
err |= __put_user(mflo1(), &sc->sc_lo[1]);
err |= __put_user(mfhi2(), &sc->sc_hi[2]);
err |= __put_user(mflo2(), &sc->sc_lo[2]);
err |= __put_user(mfhi3(), &sc->sc_hi[3]);
err |= __put_user(mflo3(), &sc->sc_lo[3]);
err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
}
#endif
err |= __put_user(!!used_math(), &sc->sc_used_math); err |= __put_user(!!used_math(), &sc->sc_used_math);
@ -92,7 +77,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
current_thread_info()->restart_block.fn = do_no_restart_syscall; current_thread_info()->restart_block.fn = do_no_restart_syscall;
err |= __get_user(regs->cp0_epc, &sc->sc_pc); err |= __get_user(regs->cp0_epc, &sc->sc_pc);
#ifdef CONFIG_32BIT
err |= __get_user(regs->hi, &sc->sc_mdhi); err |= __get_user(regs->hi, &sc->sc_mdhi);
err |= __get_user(regs->lo, &sc->sc_mdlo); err |= __get_user(regs->lo, &sc->sc_mdlo);
if (cpu_has_dsp) { if (cpu_has_dsp) {
@ -104,20 +88,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg); err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK); err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
} }
#endif
#ifdef CONFIG_64BIT
err |= __get_user(regs->hi, &sc->sc_hi[0]);
err |= __get_user(regs->lo, &sc->sc_lo[0]);
if (cpu_has_dsp) {
err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
}
#endif
#define restore_gp_reg(i) do { \ #define restore_gp_reg(i) do { \
err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \ err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \

View File

@ -247,6 +247,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
current_thread_info()->cpu = 0; current_thread_info()->cpu = 0;
smp_tune_scheduling(); smp_tune_scheduling();
plat_prepare_cpus(max_cpus); plat_prepare_cpus(max_cpus);
#ifndef CONFIG_HOTPLUG_CPU
cpu_present_map = cpu_possible_map;
#endif
} }
/* preload SMP state for boot cpu */ /* preload SMP state for boot cpu */
@ -442,7 +445,7 @@ static int __init topology_init(void)
int cpu; int cpu;
int ret; int ret;
for_each_cpu(cpu) { for_each_present_cpu(cpu) {
ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, NULL); ret = register_cpu(&per_cpu(cpu_devices, cpu), cpu, NULL);
if (ret) if (ret)
printk(KERN_WARNING "topology_init: register_cpu %d " printk(KERN_WARNING "topology_init: register_cpu %d "

View File

@ -276,31 +276,9 @@ void sys_set_thread_area(unsigned long addr)
asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3) asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
{ {
int tmp, len; int tmp;
char __user *name;
switch(cmd) { switch(cmd) {
case SETNAME: {
char nodename[__NEW_UTS_LEN + 1];
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
name = (char __user *) arg1;
len = strncpy_from_user(nodename, name, __NEW_UTS_LEN);
if (len < 0)
return -EFAULT;
down_write(&uts_sem);
strncpy(system_utsname.nodename, nodename, len);
nodename[__NEW_UTS_LEN] = '\0';
strlcpy(system_utsname.nodename, nodename,
sizeof(system_utsname.nodename));
up_write(&uts_sem);
return 0;
}
case MIPS_ATOMIC_SET: case MIPS_ATOMIC_SET:
printk(KERN_CRIT "How did I get here?\n"); printk(KERN_CRIT "How did I get here?\n");
return -EINVAL; return -EINVAL;
@ -313,9 +291,6 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
case FLUSH_CACHE: case FLUSH_CACHE:
__flush_cache_all(); __flush_cache_all();
return 0; return 0;
case MIPS_RDNVRAM:
return -EIO;
} }
return -EINVAL; return -EINVAL;

View File

@ -819,15 +819,30 @@ asmlinkage void do_watch(struct pt_regs *regs)
asmlinkage void do_mcheck(struct pt_regs *regs) asmlinkage void do_mcheck(struct pt_regs *regs)
{ {
const int field = 2 * sizeof(unsigned long);
int multi_match = regs->cp0_status & ST0_TS;
show_regs(regs); show_regs(regs);
dump_tlb_all();
if (multi_match) {
printk("Index : %0x\n", read_c0_index());
printk("Pagemask: %0x\n", read_c0_pagemask());
printk("EntryHi : %0*lx\n", field, read_c0_entryhi());
printk("EntryLo0: %0*lx\n", field, read_c0_entrylo0());
printk("EntryLo1: %0*lx\n", field, read_c0_entrylo1());
printk("\n");
dump_tlb_all();
}
show_code((unsigned int *) regs->cp0_epc);
/* /*
* Some chips may have other causes of machine check (e.g. SB1 * Some chips may have other causes of machine check (e.g. SB1
* graduation timer) * graduation timer)
*/ */
panic("Caught Machine Check exception - %scaused by multiple " panic("Caught Machine Check exception - %scaused by multiple "
"matching entries in the TLB.", "matching entries in the TLB.",
(regs->cp0_status & ST0_TS) ? "" : "not "); (multi_match) ? "" : "not ");
} }
asmlinkage void do_mt(struct pt_regs *regs) asmlinkage void do_mt(struct pt_regs *regs)
@ -902,6 +917,7 @@ static inline void parity_protection_init(void)
{ {
switch (current_cpu_data.cputype) { switch (current_cpu_data.cputype) {
case CPU_24K: case CPU_24K:
case CPU_34K:
case CPU_5KC: case CPU_5KC:
write_c0_ecc(0x80000000); write_c0_ecc(0x80000000);
back_to_back_c0_hazard(); back_to_back_c0_hazard();

View File

@ -151,23 +151,13 @@ SECTIONS
/* This is the MIPS specific mdebug section. */ /* This is the MIPS specific mdebug section. */
.mdebug : { *(.mdebug) } .mdebug : { *(.mdebug) }
/* These are needed for ELF backends which have not yet been
converted to the new style linker. */ STABS_DEBUG
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) } DWARF_DEBUG
/* DWARF debug sections.
Symbols in the .debug DWARF section are relative to the beginning of the
section so we begin .debug at 0. It's not clear yet what needs to happen
for the others. */
.debug 0 : { *(.debug) }
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_sfnames 0 : { *(.debug_sfnames) }
.line 0 : { *(.line) }
/* These must appear regardless of . */ /* These must appear regardless of . */
.gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
.gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
.comment : { *(.comment) }
.note : { *(.note) } .note : { *(.note) }
} }

View File

@ -29,7 +29,9 @@
ieee754dp ieee754dp_fint(int x) ieee754dp ieee754dp_fint(int x)
{ {
COMPXDP; u64 xm;
int xe;
int xs;
CLEARCX; CLEARCX;

View File

@ -29,7 +29,9 @@
ieee754dp ieee754dp_flong(s64 x) ieee754dp ieee754dp_flong(s64 x)
{ {
COMPXDP; u64 xm;
int xe;
int xs;
CLEARCX; CLEARCX;

View File

@ -29,7 +29,9 @@
ieee754sp ieee754sp_fint(int x) ieee754sp ieee754sp_fint(int x)
{ {
COMPXSP; unsigned xm;
int xe;
int xs;
CLEARCX; CLEARCX;

View File

@ -29,7 +29,9 @@
ieee754sp ieee754sp_flong(s64 x) ieee754sp ieee754sp_flong(s64 x)
{ {
COMPXDP; /* <--- need 64-bit mantissa temp */ u64 xm; /* <--- need 64-bit mantissa temp */
int xe;
int xs;
CLEARCX; CLEARCX;

View File

@ -29,6 +29,27 @@
#include <asm/war.h> #include <asm/war.h>
#include <asm/cacheflush.h> /* for run_uncached() */ #include <asm/cacheflush.h> /* for run_uncached() */
/*
* Special Variant of smp_call_function for use by cache functions:
*
* o No return value
* o collapses to normal function call on UP kernels
* o collapses to normal function call on systems with a single shared
* primary cache.
*/
static inline void r4k_on_each_cpu(void (*func) (void *info), void *info,
int retry, int wait)
{
preempt_disable();
#if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC)
smp_call_function(func, info, retry, wait);
#endif
func(info);
preempt_enable();
}
/* /*
* Must die. * Must die.
*/ */
@ -299,7 +320,7 @@ static void r4k_flush_cache_all(void)
if (!cpu_has_dc_aliases) if (!cpu_has_dc_aliases)
return; return;
on_each_cpu(local_r4k_flush_cache_all, NULL, 1, 1); r4k_on_each_cpu(local_r4k_flush_cache_all, NULL, 1, 1);
} }
static inline void local_r4k___flush_cache_all(void * args) static inline void local_r4k___flush_cache_all(void * args)
@ -314,13 +335,14 @@ static inline void local_r4k___flush_cache_all(void * args)
case CPU_R4400MC: case CPU_R4400MC:
case CPU_R10000: case CPU_R10000:
case CPU_R12000: case CPU_R12000:
case CPU_R14000:
r4k_blast_scache(); r4k_blast_scache();
} }
} }
static void r4k___flush_cache_all(void) static void r4k___flush_cache_all(void)
{ {
on_each_cpu(local_r4k___flush_cache_all, NULL, 1, 1); r4k_on_each_cpu(local_r4k___flush_cache_all, NULL, 1, 1);
} }
static inline void local_r4k_flush_cache_range(void * args) static inline void local_r4k_flush_cache_range(void * args)
@ -341,7 +363,7 @@ static inline void local_r4k_flush_cache_range(void * args)
static void r4k_flush_cache_range(struct vm_area_struct *vma, static void r4k_flush_cache_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end) unsigned long start, unsigned long end)
{ {
on_each_cpu(local_r4k_flush_cache_range, vma, 1, 1); r4k_on_each_cpu(local_r4k_flush_cache_range, vma, 1, 1);
} }
static inline void local_r4k_flush_cache_mm(void * args) static inline void local_r4k_flush_cache_mm(void * args)
@ -370,7 +392,7 @@ static void r4k_flush_cache_mm(struct mm_struct *mm)
if (!cpu_has_dc_aliases) if (!cpu_has_dc_aliases)
return; return;
on_each_cpu(local_r4k_flush_cache_mm, mm, 1, 1); r4k_on_each_cpu(local_r4k_flush_cache_mm, mm, 1, 1);
} }
struct flush_cache_page_args { struct flush_cache_page_args {
@ -461,7 +483,7 @@ static void r4k_flush_cache_page(struct vm_area_struct *vma,
args.addr = addr; args.addr = addr;
args.pfn = pfn; args.pfn = pfn;
on_each_cpu(local_r4k_flush_cache_page, &args, 1, 1); r4k_on_each_cpu(local_r4k_flush_cache_page, &args, 1, 1);
} }
static inline void local_r4k_flush_data_cache_page(void * addr) static inline void local_r4k_flush_data_cache_page(void * addr)
@ -471,7 +493,7 @@ static inline void local_r4k_flush_data_cache_page(void * addr)
static void r4k_flush_data_cache_page(unsigned long addr) static void r4k_flush_data_cache_page(unsigned long addr)
{ {
on_each_cpu(local_r4k_flush_data_cache_page, (void *) addr, 1, 1); r4k_on_each_cpu(local_r4k_flush_data_cache_page, (void *) addr, 1, 1);
} }
struct flush_icache_range_args { struct flush_icache_range_args {
@ -514,7 +536,7 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end)
args.start = start; args.start = start;
args.end = end; args.end = end;
on_each_cpu(local_r4k_flush_icache_range, &args, 1, 1); r4k_on_each_cpu(local_r4k_flush_icache_range, &args, 1, 1);
instruction_hazard(); instruction_hazard();
} }
@ -590,7 +612,7 @@ static void r4k_flush_icache_page(struct vm_area_struct *vma,
args.vma = vma; args.vma = vma;
args.page = page; args.page = page;
on_each_cpu(local_r4k_flush_icache_page, &args, 1, 1); r4k_on_each_cpu(local_r4k_flush_icache_page, &args, 1, 1);
} }
@ -689,7 +711,7 @@ static void local_r4k_flush_cache_sigtramp(void * arg)
static void r4k_flush_cache_sigtramp(unsigned long addr) static void r4k_flush_cache_sigtramp(unsigned long addr)
{ {
on_each_cpu(local_r4k_flush_cache_sigtramp, (void *) addr, 1, 1); r4k_on_each_cpu(local_r4k_flush_cache_sigtramp, (void *) addr, 1, 1);
} }
static void r4k_flush_icache_all(void) static void r4k_flush_icache_all(void)
@ -812,6 +834,7 @@ static void __init probe_pcache(void)
case CPU_R10000: case CPU_R10000:
case CPU_R12000: case CPU_R12000:
case CPU_R14000:
icache_size = 1 << (12 + ((config & R10K_CONF_IC) >> 29)); icache_size = 1 << (12 + ((config & R10K_CONF_IC) >> 29));
c->icache.linesz = 64; c->icache.linesz = 64;
c->icache.ways = 2; c->icache.ways = 2;
@ -965,9 +988,11 @@ static void __init probe_pcache(void)
c->dcache.flags |= MIPS_CACHE_PINDEX; c->dcache.flags |= MIPS_CACHE_PINDEX;
case CPU_R10000: case CPU_R10000:
case CPU_R12000: case CPU_R12000:
case CPU_R14000:
case CPU_SB1: case CPU_SB1:
break; break;
case CPU_24K: case CPU_24K:
case CPU_34K:
if (!(read_c0_config7() & (1 << 16))) if (!(read_c0_config7() & (1 << 16)))
default: default:
if (c->dcache.waysize > PAGE_SIZE) if (c->dcache.waysize > PAGE_SIZE)
@ -1091,6 +1116,7 @@ static void __init setup_scache(void)
case CPU_R10000: case CPU_R10000:
case CPU_R12000: case CPU_R12000:
case CPU_R14000:
scache_size = 0x80000 << ((config & R10K_CONF_SS) >> 16); scache_size = 0x80000 << ((config & R10K_CONF_SS) >> 16);
c->scache.linesz = 64 << ((config >> 13) & 1); c->scache.linesz = 64 << ((config >> 13) & 1);
c->scache.ways = 2; c->scache.ways = 2;
@ -1135,6 +1161,31 @@ static void __init setup_scache(void)
c->options |= MIPS_CPU_SUBSET_CACHES; c->options |= MIPS_CPU_SUBSET_CACHES;
} }
void au1x00_fixup_config_od(void)
{
/*
* c0_config.od (bit 19) was write only (and read as 0)
* on the early revisions of Alchemy SOCs. It disables the bus
* transaction overlapping and needs to be set to fix various errata.
*/
switch (read_c0_prid()) {
case 0x00030100: /* Au1000 DA */
case 0x00030201: /* Au1000 HA */
case 0x00030202: /* Au1000 HB */
case 0x01030200: /* Au1500 AB */
/*
* Au1100 errata actually keeps silence about this bit, so we set it
* just in case for those revisions that require it to be set according
* to arch/mips/au1000/common/cputable.c
*/
case 0x02030200: /* Au1100 AB */
case 0x02030201: /* Au1100 BA */
case 0x02030202: /* Au1100 BC */
set_c0_config(1 << 19);
break;
}
}
static inline void coherency_setup(void) static inline void coherency_setup(void)
{ {
change_c0_config(CONF_CM_CMASK, CONF_CM_DEFAULT); change_c0_config(CONF_CM_CMASK, CONF_CM_DEFAULT);
@ -1155,6 +1206,15 @@ static inline void coherency_setup(void)
case CPU_R4400MC: case CPU_R4400MC:
clear_c0_config(CONF_CU); clear_c0_config(CONF_CU);
break; break;
/*
* We need to catch the ealry Alchemy SOCs with
* the write-only co_config.od bit and set it back to one...
*/
case CPU_AU1000: /* rev. DA, HA, HB */
case CPU_AU1100: /* rev. AB, BA, BC ?? */
case CPU_AU1500: /* rev. AB */
au1x00_fixup_config_od();
break;
} }
} }

View File

@ -227,7 +227,7 @@ void __init mem_init(void)
for (tmp = 0; tmp < max_low_pfn; tmp++) for (tmp = 0; tmp < max_low_pfn; tmp++)
if (page_is_ram(tmp)) { if (page_is_ram(tmp)) {
ram++; ram++;
if (PageReserved(mem_map+tmp)) if (PageReserved(pfn_to_page(tmp)))
reservedpages++; reservedpages++;
} }

View File

@ -357,6 +357,7 @@ void __init build_clear_page(void)
case CPU_R10000: case CPU_R10000:
case CPU_R12000: case CPU_R12000:
case CPU_R14000:
pref_src_mode = Pref_LoadStreamed; pref_src_mode = Pref_LoadStreamed;
pref_dst_mode = Pref_StoreStreamed; pref_dst_mode = Pref_StoreStreamed;
break; break;

View File

@ -875,6 +875,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l,
case CPU_R10000: case CPU_R10000:
case CPU_R12000: case CPU_R12000:
case CPU_R14000:
case CPU_4KC: case CPU_4KC:
case CPU_SB1: case CPU_SB1:
case CPU_SB1A: case CPU_SB1A:
@ -906,6 +907,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l,
case CPU_4KEC: case CPU_4KEC:
case CPU_24K: case CPU_24K:
case CPU_34K: case CPU_34K:
case CPU_74K:
i_ehb(p); i_ehb(p);
tlbw(p); tlbw(p);
break; break;

View File

@ -73,7 +73,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -73,7 +73,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -73,7 +73,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
/* disable interrupts */ /* disable interrupts */
UART16550_WRITE(OFS_INTR_ENABLE, 0); UART16550_WRITE(OFS_INTR_ENABLE, 0);
/* set up buad rate */ /* set up baud rate */
{ {
uint32 divisor; uint32 divisor;

View File

@ -14,8 +14,8 @@
#include "op_impl.h" #include "op_impl.h"
extern struct op_mips_model op_model_mipsxx __attribute__((weak)); extern struct op_mips_model op_model_mipsxx_ops __attribute__((weak));
extern struct op_mips_model op_model_rm9000 __attribute__((weak)); extern struct op_mips_model op_model_rm9000_ops __attribute__((weak));
static struct op_mips_model *model; static struct op_mips_model *model;
@ -80,13 +80,14 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
case CPU_24K: case CPU_24K:
case CPU_25KF: case CPU_25KF:
case CPU_34K: case CPU_34K:
case CPU_74K:
case CPU_SB1: case CPU_SB1:
case CPU_SB1A: case CPU_SB1A:
lmodel = &op_model_mipsxx; lmodel = &op_model_mipsxx_ops;
break; break;
case CPU_RM9000: case CPU_RM9000:
lmodel = &op_model_rm9000; lmodel = &op_model_rm9000_ops;
break; break;
}; };

View File

@ -23,7 +23,7 @@
#define M_COUNTER_OVERFLOW (1UL << 31) #define M_COUNTER_OVERFLOW (1UL << 31)
struct op_mips_model op_model_mipsxx; struct op_mips_model op_model_mipsxx_ops;
static struct mipsxx_register_config { static struct mipsxx_register_config {
unsigned int control[4]; unsigned int control[4];
@ -34,7 +34,7 @@ static struct mipsxx_register_config {
static void mipsxx_reg_setup(struct op_counter_config *ctr) static void mipsxx_reg_setup(struct op_counter_config *ctr)
{ {
unsigned int counters = op_model_mipsxx.num_counters; unsigned int counters = op_model_mipsxx_ops.num_counters;
int i; int i;
/* Compute the performance counter control word. */ /* Compute the performance counter control word. */
@ -62,7 +62,7 @@ static void mipsxx_reg_setup(struct op_counter_config *ctr)
static void mipsxx_cpu_setup (void *args) static void mipsxx_cpu_setup (void *args)
{ {
unsigned int counters = op_model_mipsxx.num_counters; unsigned int counters = op_model_mipsxx_ops.num_counters;
switch (counters) { switch (counters) {
case 4: case 4:
@ -83,7 +83,7 @@ static void mipsxx_cpu_setup (void *args)
/* Start all counters on current CPU */ /* Start all counters on current CPU */
static void mipsxx_cpu_start(void *args) static void mipsxx_cpu_start(void *args)
{ {
unsigned int counters = op_model_mipsxx.num_counters; unsigned int counters = op_model_mipsxx_ops.num_counters;
switch (counters) { switch (counters) {
case 4: case 4:
@ -100,7 +100,7 @@ static void mipsxx_cpu_start(void *args)
/* Stop all counters on current CPU */ /* Stop all counters on current CPU */
static void mipsxx_cpu_stop(void *args) static void mipsxx_cpu_stop(void *args)
{ {
unsigned int counters = op_model_mipsxx.num_counters; unsigned int counters = op_model_mipsxx_ops.num_counters;
switch (counters) { switch (counters) {
case 4: case 4:
@ -116,7 +116,7 @@ static void mipsxx_cpu_stop(void *args)
static int mipsxx_perfcount_handler(struct pt_regs *regs) static int mipsxx_perfcount_handler(struct pt_regs *regs)
{ {
unsigned int counters = op_model_mipsxx.num_counters; unsigned int counters = op_model_mipsxx_ops.num_counters;
unsigned int control; unsigned int control;
unsigned int counter; unsigned int counter;
int handled = 0; int handled = 0;
@ -187,33 +187,37 @@ static int __init mipsxx_init(void)
reset_counters(counters); reset_counters(counters);
op_model_mipsxx.num_counters = counters; op_model_mipsxx_ops.num_counters = counters;
switch (current_cpu_data.cputype) { switch (current_cpu_data.cputype) {
case CPU_20KC: case CPU_20KC:
op_model_mipsxx.cpu_type = "mips/20K"; op_model_mipsxx_ops.cpu_type = "mips/20K";
break; break;
case CPU_24K: case CPU_24K:
op_model_mipsxx.cpu_type = "mips/24K"; op_model_mipsxx_ops.cpu_type = "mips/24K";
break; break;
case CPU_25KF: case CPU_25KF:
op_model_mipsxx.cpu_type = "mips/25K"; op_model_mipsxx_ops.cpu_type = "mips/25K";
break; break;
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
case CPU_34K: case CPU_34K:
op_model_mipsxx.cpu_type = "mips/34K"; op_model_mipsxx_ops.cpu_type = "mips/34K";
break;
case CPU_74K:
op_model_mipsxx_ops.cpu_type = "mips/74K";
break; break;
#endif #endif
case CPU_5KC: case CPU_5KC:
op_model_mipsxx.cpu_type = "mips/5K"; op_model_mipsxx_ops.cpu_type = "mips/5K";
break; break;
case CPU_SB1: case CPU_SB1:
case CPU_SB1A: case CPU_SB1A:
op_model_mipsxx.cpu_type = "mips/sb1"; op_model_mipsxx_ops.cpu_type = "mips/sb1";
break; break;
default: default:
@ -229,12 +233,12 @@ static int __init mipsxx_init(void)
static void mipsxx_exit(void) static void mipsxx_exit(void)
{ {
reset_counters(op_model_mipsxx.num_counters); reset_counters(op_model_mipsxx_ops.num_counters);
perf_irq = null_perf_irq; perf_irq = null_perf_irq;
} }
struct op_mips_model op_model_mipsxx = { struct op_mips_model op_model_mipsxx_ops = {
.reg_setup = mipsxx_reg_setup, .reg_setup = mipsxx_reg_setup,
.cpu_setup = mipsxx_cpu_setup, .cpu_setup = mipsxx_cpu_setup,
.init = mipsxx_init, .init = mipsxx_init,

View File

@ -126,7 +126,7 @@ static void rm9000_exit(void)
free_irq(rm9000_perfcount_irq, NULL); free_irq(rm9000_perfcount_irq, NULL);
} }
struct op_mips_model op_model_rm9000 = { struct op_mips_model op_model_rm9000_ops = {
.reg_setup = rm9000_reg_setup, .reg_setup = rm9000_reg_setup,
.cpu_setup = rm9000_cpu_setup, .cpu_setup = rm9000_cpu_setup,
.init = rm9000_init, .init = rm9000_init,

View File

@ -31,12 +31,12 @@
/* issue a PIO read to make sure no PIO writes are pending */ /* issue a PIO read to make sure no PIO writes are pending */
static void inline flush_crime_bus(void) static void inline flush_crime_bus(void)
{ {
volatile unsigned long junk = crime->control; crime->control;
} }
static void inline flush_mace_bus(void) static void inline flush_mace_bus(void)
{ {
volatile unsigned long junk = mace->perif.ctrl.misc; mace->perif.ctrl.misc;
} }
#undef DEBUG_IRQ #undef DEBUG_IRQ

View File

@ -2057,10 +2057,45 @@ static void __init flatten_device_tree(void)
} }
#ifdef CONFIG_PPC_MAPLE
static void __init fixup_device_tree(void) /* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
* The values are bad, and it doesn't even have the right number of cells. */
static void __init fixup_device_tree_maple(void)
{ {
phandle isa;
u32 isa_ranges[6];
isa = call_prom("finddevice", 1, 1, ADDR("/ht@0/isa@4"));
if (!PHANDLE_VALID(isa))
return;
if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
== PROM_ERROR)
return;
if (isa_ranges[0] != 0x1 ||
isa_ranges[1] != 0xf4000000 ||
isa_ranges[2] != 0x00010000)
return;
prom_printf("fixing up bogus ISA range on Maple...\n");
isa_ranges[0] = 0x1;
isa_ranges[1] = 0x0;
isa_ranges[2] = 0x01002000; /* IO space; PCI device = 4 */
isa_ranges[3] = 0x0;
isa_ranges[4] = 0x0;
isa_ranges[5] = 0x00010000;
prom_setprop(isa, "/ht@0/isa@4", "ranges",
isa_ranges, sizeof(isa_ranges));
}
#else
#define fixup_device_tree_maple()
#endif
#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC) #if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
static void __init fixup_device_tree_pmac(void)
{
phandle u3, i2c, mpic; phandle u3, i2c, mpic;
u32 u3_rev; u32 u3_rev;
u32 interrupts[2]; u32 interrupts[2];
@ -2097,9 +2132,16 @@ static void __init fixup_device_tree(void)
parent = (u32)mpic; parent = (u32)mpic;
prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent", prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
&parent, sizeof(parent)); &parent, sizeof(parent));
#endif
} }
#else
#define fixup_device_tree_pmac()
#endif
static void __init fixup_device_tree(void)
{
fixup_device_tree_maple();
fixup_device_tree_pmac();
}
static void __init prom_find_boot_cpu(void) static void __init prom_find_boot_cpu(void)
{ {

View File

@ -1157,6 +1157,7 @@ EXPORT_SYMBOL_GPL(pmac_i2c_xfer);
/* some quirks for platform function decoding */ /* some quirks for platform function decoding */
enum { enum {
pmac_i2c_quirk_invmask = 0x00000001u, pmac_i2c_quirk_invmask = 0x00000001u,
pmac_i2c_quirk_skip = 0x00000002u,
}; };
static void pmac_i2c_devscan(void (*callback)(struct device_node *dev, static void pmac_i2c_devscan(void (*callback)(struct device_node *dev,
@ -1172,6 +1173,15 @@ static void pmac_i2c_devscan(void (*callback)(struct device_node *dev,
/* XXX Study device-tree's & apple drivers are get the quirks /* XXX Study device-tree's & apple drivers are get the quirks
* right ! * right !
*/ */
/* Workaround: It seems that running the clockspreading
* properties on the eMac will cause lockups during boot.
* The machine seems to work fine without that. So for now,
* let's make sure i2c-hwclock doesn't match about "imic"
* clocks and we'll figure out if we really need to do
* something special about those later.
*/
{ "i2c-hwclock", "imic5002", pmac_i2c_quirk_skip },
{ "i2c-hwclock", "imic5003", pmac_i2c_quirk_skip },
{ "i2c-hwclock", NULL, pmac_i2c_quirk_invmask }, { "i2c-hwclock", NULL, pmac_i2c_quirk_invmask },
{ "i2c-cpu-voltage", NULL, 0}, { "i2c-cpu-voltage", NULL, 0},
{ "temp-monitor", NULL, 0 }, { "temp-monitor", NULL, 0 },
@ -1198,6 +1208,8 @@ static void pmac_i2c_devscan(void (*callback)(struct device_node *dev,
if (p->compatible && if (p->compatible &&
!device_is_compatible(np, p->compatible)) !device_is_compatible(np, p->compatible))
continue; continue;
if (p->quirks & pmac_i2c_quirk_skip)
break;
callback(np, p->quirks); callback(np, p->quirks);
break; break;
} }

View File

@ -11,6 +11,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/prom.h> #include <asm/prom.h>
@ -546,6 +547,7 @@ struct pmf_device {
static LIST_HEAD(pmf_devices); static LIST_HEAD(pmf_devices);
static spinlock_t pmf_lock = SPIN_LOCK_UNLOCKED; static spinlock_t pmf_lock = SPIN_LOCK_UNLOCKED;
static DEFINE_MUTEX(pmf_irq_mutex);
static void pmf_release_device(struct kref *kref) static void pmf_release_device(struct kref *kref)
{ {
@ -864,15 +866,17 @@ int pmf_register_irq_client(struct device_node *target,
spin_lock_irqsave(&pmf_lock, flags); spin_lock_irqsave(&pmf_lock, flags);
func = __pmf_find_function(target, name, PMF_FLAGS_INT_GEN); func = __pmf_find_function(target, name, PMF_FLAGS_INT_GEN);
if (func == NULL) { if (func)
spin_unlock_irqrestore(&pmf_lock, flags); func = pmf_get_function(func);
spin_unlock_irqrestore(&pmf_lock, flags);
if (func == NULL)
return -ENODEV; return -ENODEV;
} mutex_lock(&pmf_irq_mutex);
if (list_empty(&func->irq_clients)) if (list_empty(&func->irq_clients))
func->dev->handlers->irq_enable(func); func->dev->handlers->irq_enable(func);
list_add(&client->link, &func->irq_clients); list_add(&client->link, &func->irq_clients);
client->func = func; client->func = func;
spin_unlock_irqrestore(&pmf_lock, flags); mutex_unlock(&pmf_irq_mutex);
return 0; return 0;
} }
@ -881,16 +885,16 @@ EXPORT_SYMBOL_GPL(pmf_register_irq_client);
void pmf_unregister_irq_client(struct pmf_irq_client *client) void pmf_unregister_irq_client(struct pmf_irq_client *client)
{ {
struct pmf_function *func = client->func; struct pmf_function *func = client->func;
unsigned long flags;
BUG_ON(func == NULL); BUG_ON(func == NULL);
spin_lock_irqsave(&pmf_lock, flags); mutex_lock(&pmf_irq_mutex);
client->func = NULL; client->func = NULL;
list_del(&client->link); list_del(&client->link);
if (list_empty(&func->irq_clients)) if (list_empty(&func->irq_clients))
func->dev->handlers->irq_disable(func); func->dev->handlers->irq_disable(func);
spin_unlock_irqrestore(&pmf_lock, flags); mutex_unlock(&pmf_irq_mutex);
pmf_put_function(func);
} }
EXPORT_SYMBOL_GPL(pmf_unregister_irq_client); EXPORT_SYMBOL_GPL(pmf_unregister_irq_client);

View File

@ -463,11 +463,23 @@ static int pmac_pm_finish(suspend_state_t state)
return 0; return 0;
} }
static int pmac_pm_valid(suspend_state_t state)
{
switch (state) {
case PM_SUSPEND_DISK:
return 1;
/* can't do any other states via generic mechanism yet */
default:
return 0;
}
}
static struct pm_ops pmac_pm_ops = { static struct pm_ops pmac_pm_ops = {
.pm_disk_mode = PM_DISK_SHUTDOWN, .pm_disk_mode = PM_DISK_SHUTDOWN,
.prepare = pmac_pm_prepare, .prepare = pmac_pm_prepare,
.enter = pmac_pm_enter, .enter = pmac_pm_enter,
.finish = pmac_pm_finish, .finish = pmac_pm_finish,
.valid = pmac_pm_valid,
}; };
#endif /* CONFIG_SOFTWARE_SUSPEND */ #endif /* CONFIG_SOFTWARE_SUSPEND */

View File

@ -134,7 +134,7 @@ main(void)
DEFINE(TI_TASK, offsetof(struct thread_info, task)); DEFINE(TI_TASK, offsetof(struct thread_info, task));
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain)); DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, flags)); DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));

View File

@ -279,11 +279,11 @@ static int mpc8272ads_platform_notify(struct device *dev)
static const struct platform_notify_dev_map dev_map[] = { static const struct platform_notify_dev_map dev_map[] = {
{ {
.bus_id = "fsl-cpm-fcc", .bus_id = "fsl-cpm-fcc",
.rtn = mpc8272ads_fixup_enet_pdata .rtn = mpc8272ads_fixup_enet_pdata,
}, },
{ {
.bus_id = "fsl-cpm-scc:uart", .bus_id = "fsl-cpm-scc:uart",
.rtn = mpc .rtn = mpc8272ads_fixup_uart_pdata,
}, },
{ {
.bus_id = NULL .bus_id = NULL
@ -335,15 +335,15 @@ struct platform_device* early_uart_get_pdev(int index)
struct platform_device* pdev = NULL; struct platform_device* pdev = NULL;
if(index) { /*assume SCC4 here*/ if(index) { /*assume SCC4 here*/
pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC4]; pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC4];
pinfo = &mpc8272<F12>_uart_pdata[1]; pinfo = &mpc8272_uart_pdata[fsid_scc4_uart];
} else { /*over SCC1*/ } else { /*over SCC1*/
pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC1]; pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC1];
pinfo = &mpc8272_uart_pdata[0]; pinfo = &mpc8272_uart_pdata[fsid_scc1_uart];
} }
pinfo->uart_clk = bd->bi_intfreq; pinfo->uart_clk = bd->bi_intfreq;
pdev->dev.platform_data = pinfo; pdev->dev.platform_data = pinfo;
ppc_sys_fixup_mem_resource(pdev, IMAP_ADDR); ppc_sys_fixup_mem_resource(pdev, CPM_MAP_ADDR);
return NULL; return NULL;
} }

View File

@ -121,13 +121,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A00, .start = 0x11A00,
.end = 0x11A1F, .end = 0x11A1F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8000, .start = 0x8000,
.end = 0x80ff, .end = 0x80ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
@ -145,13 +145,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A20, .start = 0x11A20,
.end = 0x11A3F, .end = 0x11A3F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8100, .start = 0x8100,
.end = 0x81ff, .end = 0x81ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
@ -169,13 +169,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A40, .start = 0x11A40,
.end = 0x11A5F, .end = 0x11A5F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8200, .start = 0x8200,
.end = 0x82ff, .end = 0x82ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
@ -193,13 +193,13 @@ struct platform_device ppc_sys_platform_devices[] = {
.num_resources = 3, .num_resources = 3,
.resource = (struct resource[]) { .resource = (struct resource[]) {
{ {
.name = "scc_mem", .name = "regs",
.start = 0x11A60, .start = 0x11A60,
.end = 0x11A7F, .end = 0x11A7F,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.name = "scc_pram", .name = "pram",
.start = 0x8300, .start = 0x8300,
.end = 0x83ff, .end = 0x83ff,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,

View File

@ -139,13 +139,13 @@ struct ppc_sys_spec ppc_sys_specs[] = {
.ppc_sys_name = "8272", .ppc_sys_name = "8272",
.mask = 0x0000ff00, .mask = 0x0000ff00,
.value = 0x00000c00, .value = 0x00000c00,
.num_devices = 11, .num_devices = 12,
.device_list = (enum ppc_sys_devices[]) .device_list = (enum ppc_sys_devices[])
{ {
MPC82xx_CPM_FCC1, MPC82xx_CPM_FCC2, MPC82xx_CPM_SCC1, MPC82xx_CPM_FCC1, MPC82xx_CPM_FCC2, MPC82xx_CPM_SCC1,
MPC82xx_CPM_SCC2, MPC82xx_CPM_SCC3, MPC82xx_CPM_SMC1, MPC82xx_CPM_SCC2, MPC82xx_CPM_SCC3, MPC82xx_CPM_SCC4,
MPC82xx_CPM_SMC2, MPC82xx_CPM_SPI, MPC82xx_CPM_I2C, MPC82xx_CPM_SMC1, MPC82xx_CPM_SMC2, MPC82xx_CPM_SPI,
MPC82xx_CPM_USB, MPC82xx_SEC1, MPC82xx_CPM_I2C, MPC82xx_CPM_USB, MPC82xx_SEC1,
}, },
}, },
/* below is a list of the 8280 family of processors */ /* below is a list of the 8280 family of processors */

View File

@ -272,7 +272,7 @@ static inline void stop_hz_timer(void)
next = next_timer_interrupt(); next = next_timer_interrupt();
do { do {
seq = read_seqbegin_irqsave(&xtime_lock, flags); seq = read_seqbegin_irqsave(&xtime_lock, flags);
timer = (__u64 next) - (__u64 jiffies) + jiffies_64; timer = ((__u64) next) - ((__u64) jiffies) + jiffies_64;
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
todval = -1ULL; todval = -1ULL;
/* Be careful about overflows. */ /* Be careful about overflows. */

View File

@ -10,6 +10,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/threads.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/asi.h> #include <asm/asi.h>
#include <asm/pstate.h> #include <asm/pstate.h>
@ -493,6 +494,35 @@ tlb_fixup_done:
call prom_init call prom_init
mov %l7, %o0 ! OpenPROM cif handler mov %l7, %o0 ! OpenPROM cif handler
/* Initialize current_thread_info()->cpu as early as possible.
* In order to do that accurately we have to patch up the get_cpuid()
* assembler sequences. And that, in turn, requires that we know
* if we are on a Starfire box or not. While we're here, patch up
* the sun4v sequences as well.
*/
call check_if_starfire
nop
call per_cpu_patch
nop
call sun4v_patch
nop
#ifdef CONFIG_SMP
call hard_smp_processor_id
nop
cmp %o0, NR_CPUS
blu,pt %xcc, 1f
nop
call boot_cpu_id_too_large
nop
/* Not reached... */
1:
#else
mov 0, %o0
#endif
stb %o0, [%g6 + TI_CPU]
/* Off we go.... */ /* Off we go.... */
call start_kernel call start_kernel
nop nop

View File

@ -220,7 +220,7 @@ char reboot_command[COMMAND_LINE_SIZE];
static struct pt_regs fake_swapper_regs = { { 0, }, 0, 0, 0, 0 }; static struct pt_regs fake_swapper_regs = { { 0, }, 0, 0, 0, 0 };
static void __init per_cpu_patch(void) void __init per_cpu_patch(void)
{ {
struct cpuid_patch_entry *p; struct cpuid_patch_entry *p;
unsigned long ver; unsigned long ver;
@ -280,7 +280,7 @@ static void __init per_cpu_patch(void)
} }
} }
static void __init sun4v_patch(void) void __init sun4v_patch(void)
{ {
struct sun4v_1insn_patch_entry *p1; struct sun4v_1insn_patch_entry *p1;
struct sun4v_2insn_patch_entry *p2; struct sun4v_2insn_patch_entry *p2;
@ -315,6 +315,15 @@ static void __init sun4v_patch(void)
} }
} }
#ifdef CONFIG_SMP
void __init boot_cpu_id_too_large(int cpu)
{
prom_printf("Serious problem, boot cpu id (%d) >= NR_CPUS (%d)\n",
cpu, NR_CPUS);
prom_halt();
}
#endif
void __init setup_arch(char **cmdline_p) void __init setup_arch(char **cmdline_p)
{ {
/* Initialize PROM console and command line. */ /* Initialize PROM console and command line. */
@ -332,16 +341,6 @@ void __init setup_arch(char **cmdline_p)
conswitchp = &prom_con; conswitchp = &prom_con;
#endif #endif
/* Work out if we are starfire early on */
check_if_starfire();
/* Now we know enough to patch the get_cpuid sequences
* used by trap code.
*/
per_cpu_patch();
sun4v_patch();
boot_flags_init(*cmdline_p); boot_flags_init(*cmdline_p);
idprom_init(); idprom_init();

View File

@ -1264,7 +1264,6 @@ void __init smp_tick_init(void)
boot_cpu_id = hard_smp_processor_id(); boot_cpu_id = hard_smp_processor_id();
current_tick_offset = timer_tick_offset; current_tick_offset = timer_tick_offset;
cpu_set(boot_cpu_id, cpu_online_map);
prof_counter(boot_cpu_id) = prof_multiplier(boot_cpu_id) = 1; prof_counter(boot_cpu_id) = prof_multiplier(boot_cpu_id) = 1;
} }
@ -1345,18 +1344,6 @@ void __init smp_setup_cpu_possible_map(void)
void __devinit smp_prepare_boot_cpu(void) void __devinit smp_prepare_boot_cpu(void)
{ {
int cpu = hard_smp_processor_id();
if (cpu >= NR_CPUS) {
prom_printf("Serious problem, boot cpu id >= NR_CPUS\n");
prom_halt();
}
current_thread_info()->cpu = cpu;
__local_per_cpu_offset = __per_cpu_offset(cpu);
cpu_set(smp_processor_id(), cpu_online_map);
cpu_set(smp_processor_id(), phys_cpu_present_map);
} }
int __devinit __cpu_up(unsigned int cpu) int __devinit __cpu_up(unsigned int cpu)
@ -1433,4 +1420,7 @@ void __init setup_per_cpu_areas(void)
for (i = 0; i < NR_CPUS; i++, ptr += size) for (i = 0; i < NR_CPUS; i++, ptr += size)
memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
/* Setup %g5 for the boot cpu. */
__local_per_cpu_offset = __per_cpu_offset(smp_processor_id());
} }

View File

@ -165,8 +165,9 @@ csum_partial_end_cruft:
sll %g1, 8, %g1 sll %g1, 8, %g1
or %o5, %g1, %o4 or %o5, %g1, %o4
1: add %o2, %o4, %o2 1: addcc %o2, %o4, %o2
addc %g0, %o2, %o2
csum_partial_finish: csum_partial_finish:
retl retl
mov %o2, %o0 srl %o2, 0, %o0

View File

@ -221,11 +221,12 @@ FUNC_NAME: /* %o0=src, %o1=dst, %o2=len, %o3=sum */
sll %g1, 8, %g1 sll %g1, 8, %g1
or %o5, %g1, %o4 or %o5, %g1, %o4
1: add %o3, %o4, %o3 1: addcc %o3, %o4, %o3
addc %g0, %o3, %o3
70: 70:
retl retl
mov %o3, %o0 srl %o3, 0, %o0
95: mov 0, GLOBAL_SPARE 95: mov 0, GLOBAL_SPARE
brlez,pn %o2, 4f brlez,pn %o2, 4f

View File

@ -33,5 +33,9 @@ include $(srctree)/arch/i386/Makefile.cpu
# prevent gcc from keeping the stack 16 byte aligned. Taken from i386. # prevent gcc from keeping the stack 16 byte aligned. Taken from i386.
cflags-y += $(call cc-option,-mpreferred-stack-boundary=2) cflags-y += $(call cc-option,-mpreferred-stack-boundary=2)
# Prevent sprintf in nfsd from being converted to strcpy and resulting in
# an unresolved reference.
cflags-y += -ffreestanding
CFLAGS += $(cflags-y) CFLAGS += $(cflags-y)
USER_CFLAGS += $(cflags-y) USER_CFLAGS += $(cflags-y)

View File

@ -120,20 +120,11 @@ extern int is_syscall(unsigned long addr);
extern void free_irq(unsigned int, void *); extern void free_irq(unsigned int, void *);
extern int cpu(void); extern int cpu(void);
extern void time_init_kern(void);
/* Are we disallowed to sleep? Used to choose between GFP_KERNEL and GFP_ATOMIC. */ /* Are we disallowed to sleep? Used to choose between GFP_KERNEL and GFP_ATOMIC. */
extern int __cant_sleep(void); extern int __cant_sleep(void);
extern void segv_handler(int sig, union uml_pt_regs *regs); extern void segv_handler(int sig, union uml_pt_regs *regs);
extern void sigio_handler(int sig, union uml_pt_regs *regs); extern void sigio_handler(int sig, union uml_pt_regs *regs);
#endif #endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* adjust the settings for this buffer only. This must remain at the end
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
* c-file-style: "linux"
* End:
*/

View File

@ -84,6 +84,16 @@ void timer_irq(union uml_pt_regs *regs)
} }
} }
void time_init_kern(void)
{
unsigned long long nsecs;
nsecs = os_nsecs();
set_normalized_timespec(&wall_to_monotonic, -nsecs / BILLION,
-nsecs % BILLION);
}
void do_boot_timer_handler(struct sigcontext * sc) void do_boot_timer_handler(struct sigcontext * sc)
{ {
struct pt_regs regs; struct pt_regs regs;

View File

@ -59,7 +59,7 @@ static __init void do_uml_initcalls(void)
initcall_t *call; initcall_t *call;
call = &__uml_initcall_start; call = &__uml_initcall_start;
while (call < &__uml_initcall_end){; while (call < &__uml_initcall_end){
(*call)(); (*call)();
call++; call++;
} }

View File

@ -81,20 +81,12 @@ void uml_idle_timer(void)
set_interval(ITIMER_REAL); set_interval(ITIMER_REAL);
} }
extern void ktime_get_ts(struct timespec *ts);
#define do_posix_clock_monotonic_gettime(ts) ktime_get_ts(ts)
void time_init(void) void time_init(void)
{ {
struct timespec now;
if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR) if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR)
panic("Couldn't set SIGVTALRM handler"); panic("Couldn't set SIGVTALRM handler");
set_interval(ITIMER_VIRTUAL); set_interval(ITIMER_VIRTUAL);
time_init_kern();
do_posix_clock_monotonic_gettime(&now);
wall_to_monotonic.tv_sec = -now.tv_sec;
wall_to_monotonic.tv_nsec = -now.tv_nsec;
} }
unsigned long long os_nsecs(void) unsigned long long os_nsecs(void)

View File

@ -99,11 +99,12 @@ long sys_ipc (uint call, int first, int second,
switch (call) { switch (call) {
case SEMOP: case SEMOP:
return sys_semtimedop(first, (struct sembuf *) ptr, second, return sys_semtimedop(first, (struct sembuf __user *) ptr,
NULL); second, NULL);
case SEMTIMEDOP: case SEMTIMEDOP:
return sys_semtimedop(first, (struct sembuf *) ptr, second, return sys_semtimedop(first, (struct sembuf __user *) ptr,
(const struct timespec *) fifth); second,
(const struct timespec __user *) fifth);
case SEMGET: case SEMGET:
return sys_semget (first, second, third); return sys_semget (first, second, third);
case SEMCTL: { case SEMCTL: {

View File

@ -21,7 +21,7 @@
#include "skas.h" #include "skas.h"
static int copy_sc_from_user_skas(struct pt_regs *regs, static int copy_sc_from_user_skas(struct pt_regs *regs,
struct sigcontext *from) struct sigcontext __user *from)
{ {
int err = 0; int err = 0;
@ -54,7 +54,8 @@ static int copy_sc_from_user_skas(struct pt_regs *regs,
return(err); return(err);
} }
int copy_sc_to_user_skas(struct sigcontext *to, struct _fpstate *to_fp, int copy_sc_to_user_skas(struct sigcontext __user *to,
struct _fpstate __user *to_fp,
struct pt_regs *regs, unsigned long mask, struct pt_regs *regs, unsigned long mask,
unsigned long sp) unsigned long sp)
{ {
@ -106,10 +107,11 @@ int copy_sc_to_user_skas(struct sigcontext *to, struct _fpstate *to_fp,
#endif #endif
#ifdef CONFIG_MODE_TT #ifdef CONFIG_MODE_TT
int copy_sc_from_user_tt(struct sigcontext *to, struct sigcontext *from, int copy_sc_from_user_tt(struct sigcontext *to, struct sigcontext __user *from,
int fpsize) int fpsize)
{ {
struct _fpstate *to_fp, *from_fp; struct _fpstate *to_fp;
struct _fpstate __user *from_fp;
unsigned long sigs; unsigned long sigs;
int err; int err;
@ -124,13 +126,14 @@ int copy_sc_from_user_tt(struct sigcontext *to, struct sigcontext *from,
return(err); return(err);
} }
int copy_sc_to_user_tt(struct sigcontext *to, struct _fpstate *fp, int copy_sc_to_user_tt(struct sigcontext __user *to, struct _fpstate __user *fp,
struct sigcontext *from, int fpsize, unsigned long sp) struct sigcontext *from, int fpsize, unsigned long sp)
{ {
struct _fpstate *to_fp, *from_fp; struct _fpstate __user *to_fp;
struct _fpstate *from_fp;
int err; int err;
to_fp = (fp ? fp : (struct _fpstate *) (to + 1)); to_fp = (fp ? fp : (struct _fpstate __user *) (to + 1));
from_fp = from->fpstate; from_fp = from->fpstate;
err = copy_to_user(to, from, sizeof(*to)); err = copy_to_user(to, from, sizeof(*to));
/* The SP in the sigcontext is the updated one for the signal /* The SP in the sigcontext is the updated one for the signal
@ -158,7 +161,8 @@ static int copy_sc_from_user(struct pt_regs *to, void __user *from)
return(ret); return(ret);
} }
static int copy_sc_to_user(struct sigcontext *to, struct _fpstate *fp, static int copy_sc_to_user(struct sigcontext __user *to,
struct _fpstate __user *fp,
struct pt_regs *from, unsigned long mask, struct pt_regs *from, unsigned long mask,
unsigned long sp) unsigned long sp)
{ {
@ -169,7 +173,7 @@ static int copy_sc_to_user(struct sigcontext *to, struct _fpstate *fp,
struct rt_sigframe struct rt_sigframe
{ {
char *pretcode; char __user *pretcode;
struct ucontext uc; struct ucontext uc;
struct siginfo info; struct siginfo info;
}; };
@ -188,7 +192,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig,
frame = (struct rt_sigframe __user *) frame = (struct rt_sigframe __user *)
round_down(stack_top - sizeof(struct rt_sigframe), 16) - 8; round_down(stack_top - sizeof(struct rt_sigframe), 16) - 8;
frame = (struct rt_sigframe *) ((unsigned long) frame - 128); frame = (struct rt_sigframe __user *) ((unsigned long) frame - 128);
if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate))) if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate)))
goto out; goto out;

View File

@ -45,7 +45,7 @@ static long arch_prctl_tt(int code, unsigned long addr)
case ARCH_GET_GS: case ARCH_GET_GS:
ret = arch_prctl(code, (unsigned long) &tmp); ret = arch_prctl(code, (unsigned long) &tmp);
if(!ret) if(!ret)
ret = put_user(tmp, &addr); ret = put_user(tmp, (long __user *)addr);
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;

View File

@ -339,7 +339,7 @@ int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top,
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
int i, ret; int i, ret;
stack_base = IA32_STACK_TOP - MAX_ARG_PAGES * PAGE_SIZE; stack_base = stack_top - MAX_ARG_PAGES * PAGE_SIZE;
mm->arg_start = bprm->p + stack_base; mm->arg_start = bprm->p + stack_base;
bprm->p += stack_base; bprm->p += stack_base;
@ -357,7 +357,7 @@ int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top,
{ {
mpnt->vm_mm = mm; mpnt->vm_mm = mm;
mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p; mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
mpnt->vm_end = IA32_STACK_TOP; mpnt->vm_end = stack_top;
if (executable_stack == EXSTACK_ENABLE_X) if (executable_stack == EXSTACK_ENABLE_X)
mpnt->vm_flags = VM_STACK_FLAGS | VM_EXEC; mpnt->vm_flags = VM_STACK_FLAGS | VM_EXEC;
else if (executable_stack == EXSTACK_DISABLE_X) else if (executable_stack == EXSTACK_DISABLE_X)

View File

@ -149,7 +149,7 @@ unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsi
addr = start; addr = start;
if (addr > ei->addr + ei->size) if (addr > ei->addr + ei->size)
continue; continue;
while (bad_addr(&addr, size) && addr+size < ei->addr + ei->size) while (bad_addr(&addr, size) && addr+size <= ei->addr+ei->size)
; ;
last = addr + size; last = addr + size;
if (last > ei->addr + ei->size) if (last > ei->addr + ei->size)

View File

@ -281,12 +281,7 @@ tracesys:
ja 1f ja 1f
movq %r10,%rcx /* fixup for C */ movq %r10,%rcx /* fixup for C */
call *sys_call_table(,%rax,8) call *sys_call_table(,%rax,8)
movq %rax,RAX-ARGOFFSET(%rsp) 1: movq %rax,RAX-ARGOFFSET(%rsp)
1: SAVE_REST
movq %rsp,%rdi
call syscall_trace_leave
RESTORE_TOP_OF_STACK %rbx
RESTORE_REST
/* Use IRET because user could have changed frame */ /* Use IRET because user could have changed frame */
jmp int_ret_from_sys_call jmp int_ret_from_sys_call
CFI_ENDPROC CFI_ENDPROC

View File

@ -54,6 +54,10 @@ dma_alloc_pages(struct device *dev, gfp_t gfp, unsigned order)
else else
#endif #endif
node = numa_node_id(); node = numa_node_id();
if (node < first_node(node_online_map))
node = first_node(node_online_map);
page = alloc_pages_node(node, gfp, order); page = alloc_pages_node(node, gfp, order);
return page ? page_address(page) : NULL; return page ? page_address(page) : NULL;
} }

View File

@ -631,10 +631,8 @@ static int __init pci_iommu_init(void)
printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n"); printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n");
if (end_pfn > MAX_DMA32_PFN) { if (end_pfn > MAX_DMA32_PFN) {
printk(KERN_ERR "WARNING more than 4GB of memory " printk(KERN_ERR "WARNING more than 4GB of memory "
"but IOMMU not compiled in.\n" "but IOMMU not available.\n"
KERN_ERR "WARNING 32bit PCI may malfunction.\n" KERN_ERR "WARNING 32bit PCI may malfunction.\n");
KERN_ERR "You might want to enable "
"CONFIG_GART_IOMMU\n");
} }
return -1; return -1;
} }

View File

@ -68,7 +68,7 @@ int pmtimer_mark_offset(void)
offset_delay = delta % (USEC_PER_SEC / HZ); offset_delay = delta % (USEC_PER_SEC / HZ);
rdtscll(tsc); rdtscll(tsc);
vxtime.last_tsc = tsc - offset_delay * cpu_khz; vxtime.last_tsc = tsc - offset_delay * (u64)cpu_khz / 1000;
/* don't calculate delay for first run, /* don't calculate delay for first run,
or if we've got less then a tick */ or if we've got less then a tick */

View File

@ -1051,7 +1051,7 @@ static void srat_detect_node(void)
for now. */ for now. */
node = apicid_to_node[hard_smp_processor_id()]; node = apicid_to_node[hard_smp_processor_id()];
if (node == NUMA_NO_NODE) if (node == NUMA_NO_NODE)
node = 0; node = first_node(node_online_map);
numa_set_node(cpu, node); numa_set_node(cpu, node);
if (acpi_numa > 0) if (acpi_numa > 0)

View File

@ -399,8 +399,10 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
/* First clean up the node list */ /* First clean up the node list */
for (i = 0; i < MAX_NUMNODES; i++) { for (i = 0; i < MAX_NUMNODES; i++) {
cutoff_node(i, start, end); cutoff_node(i, start, end);
if ((nodes[i].end - nodes[i].start) < NODE_MIN_SIZE) if ((nodes[i].end - nodes[i].start) < NODE_MIN_SIZE) {
unparse_node(i); unparse_node(i);
node_set_offline(i);
}
} }
if (acpi_numa <= 0) if (acpi_numa <= 0)

View File

@ -33,7 +33,7 @@ static int cfq_slice_idle = HZ / 70;
#define CFQ_KEY_ASYNC (0) #define CFQ_KEY_ASYNC (0)
static DEFINE_RWLOCK(cfq_exit_lock); static DEFINE_SPINLOCK(cfq_exit_lock);
/* /*
* for the hash of cfqq inside the cfqd * for the hash of cfqq inside the cfqd
@ -133,6 +133,7 @@ struct cfq_data {
mempool_t *crq_pool; mempool_t *crq_pool;
int rq_in_driver; int rq_in_driver;
int hw_tag;
/* /*
* schedule slice state info * schedule slice state info
@ -500,10 +501,13 @@ static void cfq_resort_rr_list(struct cfq_queue *cfqq, int preempted)
/* /*
* if queue was preempted, just add to front to be fair. busy_rr * if queue was preempted, just add to front to be fair. busy_rr
* isn't sorted. * isn't sorted, but insert at the back for fairness.
*/ */
if (preempted || list == &cfqd->busy_rr) { if (preempted || list == &cfqd->busy_rr) {
list_add(&cfqq->cfq_list, list); if (preempted)
list = list->prev;
list_add_tail(&cfqq->cfq_list, list);
return; return;
} }
@ -664,6 +668,15 @@ static void cfq_activate_request(request_queue_t *q, struct request *rq)
struct cfq_data *cfqd = q->elevator->elevator_data; struct cfq_data *cfqd = q->elevator->elevator_data;
cfqd->rq_in_driver++; cfqd->rq_in_driver++;
/*
* If the depth is larger 1, it really could be queueing. But lets
* make the mark a little higher - idling could still be good for
* low queueing, and a low queueing number could also just indicate
* a SCSI mid layer like behaviour where limit+1 is often seen.
*/
if (!cfqd->hw_tag && cfqd->rq_in_driver > 4)
cfqd->hw_tag = 1;
} }
static void cfq_deactivate_request(request_queue_t *q, struct request *rq) static void cfq_deactivate_request(request_queue_t *q, struct request *rq)
@ -878,6 +891,13 @@ static struct cfq_queue *cfq_set_active_queue(struct cfq_data *cfqd)
if (!list_empty(&cfqd->cur_rr) || cfq_get_next_prio_level(cfqd) != -1) if (!list_empty(&cfqd->cur_rr) || cfq_get_next_prio_level(cfqd) != -1)
cfqq = list_entry_cfqq(cfqd->cur_rr.next); cfqq = list_entry_cfqq(cfqd->cur_rr.next);
/*
* If no new queues are available, check if the busy list has some
* before falling back to idle io.
*/
if (!cfqq && !list_empty(&cfqd->busy_rr))
cfqq = list_entry_cfqq(cfqd->busy_rr.next);
/* /*
* if we have idle queues and no rt or be queues had pending * if we have idle queues and no rt or be queues had pending
* requests, either allow immediate service if the grace period * requests, either allow immediate service if the grace period
@ -1284,7 +1304,7 @@ static void cfq_exit_io_context(struct io_context *ioc)
/* /*
* put the reference this task is holding to the various queues * put the reference this task is holding to the various queues
*/ */
read_lock_irqsave(&cfq_exit_lock, flags); spin_lock_irqsave(&cfq_exit_lock, flags);
n = rb_first(&ioc->cic_root); n = rb_first(&ioc->cic_root);
while (n != NULL) { while (n != NULL) {
@ -1294,7 +1314,7 @@ static void cfq_exit_io_context(struct io_context *ioc)
n = rb_next(n); n = rb_next(n);
} }
read_unlock_irqrestore(&cfq_exit_lock, flags); spin_unlock_irqrestore(&cfq_exit_lock, flags);
} }
static struct cfq_io_context * static struct cfq_io_context *
@ -1400,7 +1420,7 @@ static int cfq_ioc_set_ioprio(struct io_context *ioc, unsigned int ioprio)
struct cfq_io_context *cic; struct cfq_io_context *cic;
struct rb_node *n; struct rb_node *n;
write_lock(&cfq_exit_lock); spin_lock(&cfq_exit_lock);
n = rb_first(&ioc->cic_root); n = rb_first(&ioc->cic_root);
while (n != NULL) { while (n != NULL) {
@ -1410,7 +1430,7 @@ static int cfq_ioc_set_ioprio(struct io_context *ioc, unsigned int ioprio)
n = rb_next(n); n = rb_next(n);
} }
write_unlock(&cfq_exit_lock); spin_unlock(&cfq_exit_lock);
return 0; return 0;
} }
@ -1458,7 +1478,8 @@ retry:
* set ->slice_left to allow preemption for a new process * set ->slice_left to allow preemption for a new process
*/ */
cfqq->slice_left = 2 * cfqd->cfq_slice_idle; cfqq->slice_left = 2 * cfqd->cfq_slice_idle;
cfq_mark_cfqq_idle_window(cfqq); if (!cfqd->hw_tag)
cfq_mark_cfqq_idle_window(cfqq);
cfq_mark_cfqq_prio_changed(cfqq); cfq_mark_cfqq_prio_changed(cfqq);
cfq_init_prio_data(cfqq); cfq_init_prio_data(cfqq);
} }
@ -1475,9 +1496,10 @@ out:
static void static void
cfq_drop_dead_cic(struct io_context *ioc, struct cfq_io_context *cic) cfq_drop_dead_cic(struct io_context *ioc, struct cfq_io_context *cic)
{ {
read_lock(&cfq_exit_lock); spin_lock(&cfq_exit_lock);
rb_erase(&cic->rb_node, &ioc->cic_root); rb_erase(&cic->rb_node, &ioc->cic_root);
read_unlock(&cfq_exit_lock); list_del_init(&cic->queue_list);
spin_unlock(&cfq_exit_lock);
kmem_cache_free(cfq_ioc_pool, cic); kmem_cache_free(cfq_ioc_pool, cic);
atomic_dec(&ioc_count); atomic_dec(&ioc_count);
} }
@ -1545,11 +1567,11 @@ restart:
BUG(); BUG();
} }
read_lock(&cfq_exit_lock); spin_lock(&cfq_exit_lock);
rb_link_node(&cic->rb_node, parent, p); rb_link_node(&cic->rb_node, parent, p);
rb_insert_color(&cic->rb_node, &ioc->cic_root); rb_insert_color(&cic->rb_node, &ioc->cic_root);
list_add(&cic->queue_list, &cfqd->cic_list); list_add(&cic->queue_list, &cfqd->cic_list);
read_unlock(&cfq_exit_lock); spin_unlock(&cfq_exit_lock);
} }
/* /*
@ -1648,7 +1670,7 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq,
{ {
int enable_idle = cfq_cfqq_idle_window(cfqq); int enable_idle = cfq_cfqq_idle_window(cfqq);
if (!cic->ioc->task || !cfqd->cfq_slice_idle) if (!cic->ioc->task || !cfqd->cfq_slice_idle || cfqd->hw_tag)
enable_idle = 0; enable_idle = 0;
else if (sample_valid(cic->ttime_samples)) { else if (sample_valid(cic->ttime_samples)) {
if (cic->ttime_mean > cfqd->cfq_slice_idle) if (cic->ttime_mean > cfqd->cfq_slice_idle)
@ -1739,14 +1761,24 @@ cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq); cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
cic = crq->io_context;
/* /*
* we never wait for an async request and we don't allow preemption * we never wait for an async request and we don't allow preemption
* of an async request. so just return early * of an async request. so just return early
*/ */
if (!cfq_crq_is_sync(crq)) if (!cfq_crq_is_sync(crq)) {
/*
* sync process issued an async request, if it's waiting
* then expire it and kick rq handling.
*/
if (cic == cfqd->active_cic &&
del_timer(&cfqd->idle_slice_timer)) {
cfq_slice_expired(cfqd, 0);
cfq_start_queueing(cfqd, cfqq);
}
return; return;
}
cic = crq->io_context;
cfq_update_io_thinktime(cfqd, cic); cfq_update_io_thinktime(cfqd, cic);
cfq_update_io_seektime(cfqd, cic, crq); cfq_update_io_seektime(cfqd, cic, crq);
@ -2164,10 +2196,9 @@ static void cfq_idle_class_timer(unsigned long data)
* race with a non-idle queue, reset timer * race with a non-idle queue, reset timer
*/ */
end = cfqd->last_end_request + CFQ_IDLE_GRACE; end = cfqd->last_end_request + CFQ_IDLE_GRACE;
if (!time_after_eq(jiffies, end)) { if (!time_after_eq(jiffies, end))
cfqd->idle_class_timer.expires = end; mod_timer(&cfqd->idle_class_timer, end);
add_timer(&cfqd->idle_class_timer); else
} else
cfq_schedule_dispatch(cfqd); cfq_schedule_dispatch(cfqd);
spin_unlock_irqrestore(cfqd->queue->queue_lock, flags); spin_unlock_irqrestore(cfqd->queue->queue_lock, flags);
@ -2187,7 +2218,7 @@ static void cfq_exit_queue(elevator_t *e)
cfq_shutdown_timer_wq(cfqd); cfq_shutdown_timer_wq(cfqd);
write_lock(&cfq_exit_lock); spin_lock(&cfq_exit_lock);
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
if (cfqd->active_queue) if (cfqd->active_queue)
@ -2210,7 +2241,7 @@ static void cfq_exit_queue(elevator_t *e)
} }
spin_unlock_irq(q->queue_lock); spin_unlock_irq(q->queue_lock);
write_unlock(&cfq_exit_lock); spin_unlock(&cfq_exit_lock);
cfq_shutdown_timer_wq(cfqd); cfq_shutdown_timer_wq(cfqd);

View File

@ -8,7 +8,6 @@
* *
*/ */
#include <linux/vt_kern.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/pm.h> #include <linux/pm.h>
@ -66,6 +65,7 @@ int suspend_device(struct device * dev, pm_message_t state)
return error; return error;
} }
/** /**
* device_suspend - Save state and stop all devices in system. * device_suspend - Save state and stop all devices in system.
* @state: Power state to put each device in. * @state: Power state to put each device in.
@ -85,9 +85,6 @@ int device_suspend(pm_message_t state)
{ {
int error = 0; int error = 0;
if (!is_console_suspend_safe())
return -EINVAL;
down(&dpm_sem); down(&dpm_sem);
down(&dpm_list_sem); down(&dpm_list_sem);
while (!list_empty(&dpm_active) && error == 0) { while (!list_empty(&dpm_active) && error == 0) {

View File

@ -86,7 +86,7 @@ config AGP_NVIDIA
config AGP_SIS config AGP_SIS
tristate "SiS chipset support" tristate "SiS chipset support"
depends on AGP && X86_32 depends on AGP
help help
This option gives you AGP support for the GLX component of This option gives you AGP support for the GLX component of
X on Silicon Integrated Systems [SiS] chipsets. X on Silicon Integrated Systems [SiS] chipsets.

View File

@ -617,6 +617,9 @@ static int agp_amd64_resume(struct pci_dev *pdev)
pci_set_power_state(pdev, PCI_D0); pci_set_power_state(pdev, PCI_D0);
pci_restore_state(pdev); pci_restore_state(pdev);
if (pdev->vendor == PCI_VENDOR_ID_NVIDIA)
nforce3_agp_init(pdev);
return amd_8151_configure(); return amd_8151_configure();
} }

View File

@ -345,6 +345,12 @@ static struct agp_device_ids via_agp_device_ids[] __devinitdata =
.chipset_name = "PT880", .chipset_name = "PT880",
}, },
/* PT880 Ultra */
{
.device_id = PCI_DEVICE_ID_VIA_PT880ULTRA,
.chipset_name = "PT880 Ultra",
},
/* PT890 */ /* PT890 */
{ {
.device_id = PCI_DEVICE_ID_VIA_8783_0, .device_id = PCI_DEVICE_ID_VIA_8783_0,
@ -511,6 +517,7 @@ static struct pci_device_id agp_via_pci_table[] = {
ID(PCI_DEVICE_ID_VIA_8763_0), ID(PCI_DEVICE_ID_VIA_8763_0),
ID(PCI_DEVICE_ID_VIA_8378_0), ID(PCI_DEVICE_ID_VIA_8378_0),
ID(PCI_DEVICE_ID_VIA_PT880), ID(PCI_DEVICE_ID_VIA_PT880),
ID(PCI_DEVICE_ID_VIA_PT880ULTRA),
ID(PCI_DEVICE_ID_VIA_8783_0), ID(PCI_DEVICE_ID_VIA_8783_0),
ID(PCI_DEVICE_ID_VIA_PX8X0_0), ID(PCI_DEVICE_ID_VIA_PX8X0_0),
ID(PCI_DEVICE_ID_VIA_3269_0), ID(PCI_DEVICE_ID_VIA_3269_0),

View File

@ -1184,20 +1184,20 @@ static void port_outl(struct si_sm_io *io, unsigned int offset,
static void port_cleanup(struct smi_info *info) static void port_cleanup(struct smi_info *info)
{ {
unsigned int addr = info->io.addr_data; unsigned int addr = info->io.addr_data;
int mapsize; int idx;
if (addr) { if (addr) {
mapsize = ((info->io_size * info->io.regspacing) for (idx = 0; idx < info->io_size; idx++) {
- (info->io.regspacing - info->io.regsize)); release_region(addr + idx * info->io.regspacing,
info->io.regsize);
release_region (addr, mapsize); }
} }
} }
static int port_setup(struct smi_info *info) static int port_setup(struct smi_info *info)
{ {
unsigned int addr = info->io.addr_data; unsigned int addr = info->io.addr_data;
int mapsize; int idx;
if (!addr) if (!addr)
return -ENODEV; return -ENODEV;
@ -1225,16 +1225,22 @@ static int port_setup(struct smi_info *info)
return -EINVAL; return -EINVAL;
} }
/* Calculate the total amount of memory to claim. This is an /* Some BIOSes reserve disjoint I/O regions in their ACPI
* unusual looking calculation, but it avoids claiming any * tables. This causes problems when trying to register the
* more memory than it has to. It will claim everything * entire I/O region. Therefore we must register each I/O
* between the first address to the end of the last full * port separately.
* register. */ */
mapsize = ((info->io_size * info->io.regspacing) for (idx = 0; idx < info->io_size; idx++) {
- (info->io.regspacing - info->io.regsize)); if (request_region(addr + idx * info->io.regspacing,
info->io.regsize, DEVICE_NAME) == NULL) {
if (request_region(addr, mapsize, DEVICE_NAME) == NULL) /* Undo allocations */
return -EIO; while (idx--) {
release_region(addr + idx * info->io.regspacing,
info->io.regsize);
}
return -EIO;
}
}
return 0; return 0;
} }

View File

@ -149,7 +149,7 @@ struct cm4000_dev {
#define ZERO_DEV(dev) \ #define ZERO_DEV(dev) \
memset(&dev->atr_csum,0, \ memset(&dev->atr_csum,0, \
sizeof(struct cm4000_dev) - \ sizeof(struct cm4000_dev) - \
/*link*/ sizeof(struct pcmcia_device) - \ /*link*/ sizeof(struct pcmcia_device *) - \
/*node*/ sizeof(dev_node_t) - \ /*node*/ sizeof(dev_node_t) - \
/*atr*/ MAX_ATR*sizeof(char) - \ /*atr*/ MAX_ATR*sizeof(char) - \
/*rbuf*/ 512*sizeof(char) - \ /*rbuf*/ 512*sizeof(char) - \

View File

@ -105,6 +105,12 @@ static const char* tcpa_event_type_strings[] = {
"Non-Host Info" "Non-Host Info"
}; };
struct tcpa_pc_event {
u32 event_id;
u32 event_size;
u8 event_data[0];
};
enum tcpa_pc_event_ids { enum tcpa_pc_event_ids {
SMBIOS = 1, SMBIOS = 1,
BIS_CERT, BIS_CERT,
@ -114,14 +120,15 @@ enum tcpa_pc_event_ids {
NVRAM, NVRAM,
OPTION_ROM_EXEC, OPTION_ROM_EXEC,
OPTION_ROM_CONFIG, OPTION_ROM_CONFIG,
OPTION_ROM_MICROCODE, OPTION_ROM_MICROCODE = 10,
S_CRTM_VERSION, S_CRTM_VERSION,
S_CRTM_CONTENTS, S_CRTM_CONTENTS,
POST_CONTENTS, POST_CONTENTS,
HOST_TABLE_OF_DEVICES,
}; };
static const char* tcpa_pc_event_id_strings[] = { static const char* tcpa_pc_event_id_strings[] = {
"" "",
"SMBIOS", "SMBIOS",
"BIS Certificate", "BIS Certificate",
"POST BIOS ", "POST BIOS ",
@ -130,11 +137,12 @@ static const char* tcpa_pc_event_id_strings[] = {
"NVRAM", "NVRAM",
"Option ROM", "Option ROM",
"Option ROM config", "Option ROM config",
"Option ROM microcode", "",
"Option ROM microcode ",
"S-CRTM Version", "S-CRTM Version",
"S-CRTM Contents", "S-CRTM Contents ",
"S-CRTM POST Contents", "POST Contents ",
"POST Contents", "Table of Devices",
}; };
/* returns pointer to start of pos. entry of tcg log */ /* returns pointer to start of pos. entry of tcg log */
@ -206,7 +214,7 @@ static int get_event_name(char *dest, struct tcpa_event *event,
const char *name = ""; const char *name = "";
char data[40] = ""; char data[40] = "";
int i, n_len = 0, d_len = 0; int i, n_len = 0, d_len = 0;
u32 event_id; struct tcpa_pc_event *pc_event;
switch(event->event_type) { switch(event->event_type) {
case PREBOOT: case PREBOOT:
@ -235,31 +243,32 @@ static int get_event_name(char *dest, struct tcpa_event *event,
} }
break; break;
case EVENT_TAG: case EVENT_TAG:
event_id = be32_to_cpu(*((u32 *)event_entry)); pc_event = (struct tcpa_pc_event *)event_entry;
/* ToDo Row data -> Base64 */ /* ToDo Row data -> Base64 */
switch (event_id) { switch (pc_event->event_id) {
case SMBIOS: case SMBIOS:
case BIS_CERT: case BIS_CERT:
case CMOS: case CMOS:
case NVRAM: case NVRAM:
case OPTION_ROM_EXEC: case OPTION_ROM_EXEC:
case OPTION_ROM_CONFIG: case OPTION_ROM_CONFIG:
case OPTION_ROM_MICROCODE:
case S_CRTM_VERSION: case S_CRTM_VERSION:
case S_CRTM_CONTENTS: name = tcpa_pc_event_id_strings[pc_event->event_id];
case POST_CONTENTS:
name = tcpa_pc_event_id_strings[event_id];
n_len = strlen(name); n_len = strlen(name);
break; break;
/* hash data */
case POST_BIOS_ROM: case POST_BIOS_ROM:
case ESCD: case ESCD:
name = tcpa_pc_event_id_strings[event_id]; case OPTION_ROM_MICROCODE:
case S_CRTM_CONTENTS:
case POST_CONTENTS:
name = tcpa_pc_event_id_strings[pc_event->event_id];
n_len = strlen(name); n_len = strlen(name);
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
d_len += sprintf(data, "%02x", d_len += sprintf(&data[2*i], "%02x",
event_entry[8 + i]); pc_event->event_data[i]);
break; break;
default: default:
break; break;
@ -275,53 +284,13 @@ static int get_event_name(char *dest, struct tcpa_event *event,
static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v) static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v)
{ {
struct tcpa_event *event = v;
char *data = v;
int i;
char *eventname; for (i = 0; i < sizeof(struct tcpa_event) + event->event_size; i++)
char data[4];
u32 help;
int i, len;
struct tcpa_event *event = (struct tcpa_event *) v;
unsigned char *event_entry =
(unsigned char *) (v + sizeof(struct tcpa_event));
eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL);
if (!eventname) {
printk(KERN_ERR "%s: ERROR - No Memory for event name\n ",
__func__);
return -ENOMEM;
}
/* 1st: PCR used is in little-endian format (4 bytes) */
help = le32_to_cpu(event->pcr_index);
memcpy(data, &help, 4);
for (i = 0; i < 4; i++)
seq_putc(m, data[i]); seq_putc(m, data[i]);
/* 2nd: SHA1 (20 bytes) */
for (i = 0; i < 20; i++)
seq_putc(m, event->pcr_value[i]);
/* 3rd: event type identifier (4 bytes) */
help = le32_to_cpu(event->event_type);
memcpy(data, &help, 4);
for (i = 0; i < 4; i++)
seq_putc(m, data[i]);
len = 0;
len += get_event_name(eventname, event, event_entry);
/* 4th: filename <= 255 + \'0' delimiter */
if (len > TCG_EVENT_NAME_LEN_MAX)
len = TCG_EVENT_NAME_LEN_MAX;
for (i = 0; i < len; i++)
seq_putc(m, eventname[i]);
/* 5th: delimiter */
seq_putc(m, '\0');
kfree(eventname);
return 0; return 0;
} }

View File

@ -457,10 +457,6 @@ static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev,
} }
vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0)); vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
if ((vendor & 0xFFFF) == 0xFFFF) {
rc = -ENODEV;
goto out_err;
}
/* Default timeouts */ /* Default timeouts */
chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT); chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);

View File

@ -3238,14 +3238,6 @@ void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org)
} }
} }
int is_console_suspend_safe(void)
{
/* It is unsafe to suspend devices while X has control of the
* hardware. Make sure we are running on a kernel-controlled console.
*/
return vc_cons[fg_console].d->vc_mode == KD_TEXT;
}
/* /*
* Visible symbols for modules * Visible symbols for modules
*/ */

View File

@ -491,7 +491,7 @@ static struct pci_device_id divil_pci[] = {
#define MSR_LBAR_SMB 0x5140000B #define MSR_LBAR_SMB 0x5140000B
static int scx200_add_cs553x(void) static __init int scx200_add_cs553x(void)
{ {
u32 low, hi; u32 low, hi;
u32 smb_base; u32 smb_base;

View File

@ -345,17 +345,17 @@ sgiioc4_resetproc(ide_drive_t * drive)
static u8 static u8
sgiioc4_INB(unsigned long port) sgiioc4_INB(unsigned long port)
{ {
u8 reg = (u8) inb(port); u8 reg = (u8) readb((void __iomem *) port);
if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */ if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */
if (reg & 0x51) { /* Not busy...check for interrupt */ if (reg & 0x51) { /* Not busy...check for interrupt */
unsigned long other_ir = port - 0x110; unsigned long other_ir = port - 0x110;
unsigned int intr_reg = (u32) inl(other_ir); unsigned int intr_reg = (u32) readl((void __iomem *) other_ir);
/* Clear the Interrupt, Error bits on the IOC4 */ /* Clear the Interrupt, Error bits on the IOC4 */
if (intr_reg & 0x03) { if (intr_reg & 0x03) {
outl(0x03, other_ir); writel(0x03, (void __iomem *) other_ir);
intr_reg = (u32) inl(other_ir); intr_reg = (u32) readl((void __iomem *) other_ir);
} }
} }
} }
@ -606,6 +606,12 @@ ide_init_sgiioc4(ide_hwif_t * hwif)
hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off; hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off;
hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq; hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq;
hwif->ide_dma_timeout = &__ide_dma_timeout; hwif->ide_dma_timeout = &__ide_dma_timeout;
/*
* The IOC4 uses MMIO rather than Port IO.
* It also needs special workarounds for INB.
*/
default_hwif_mmiops(hwif);
hwif->INB = &sgiioc4_INB; hwif->INB = &sgiioc4_INB;
} }
@ -743,6 +749,6 @@ ioc4_ide_exit(void)
module_init(ioc4_ide_init); module_init(ioc4_ide_init);
module_exit(ioc4_ide_exit); module_exit(ioc4_ide_exit);
MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)"); MODULE_AUTHOR("Aniket Malatpure/Jeremy Higdon");
MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card"); MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -845,7 +845,7 @@ static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud
&sbp2_highlevel, ud->ne->host, &sbp2_ops, &sbp2_highlevel, ud->ne->host, &sbp2_ops,
sizeof(struct sbp2_status_block), sizeof(quadlet_t), sizeof(struct sbp2_status_block), sizeof(quadlet_t),
0x010000000000ULL, CSR1212_ALL_SPACE_END); 0x010000000000ULL, CSR1212_ALL_SPACE_END);
if (!scsi_id->status_fifo_addr) { if (scsi_id->status_fifo_addr == ~0ULL) {
SBP2_ERR("failed to allocate status FIFO address range"); SBP2_ERR("failed to allocate status FIFO address range");
goto failed_alloc; goto failed_alloc;
} }

View File

@ -490,26 +490,7 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
first_ind = srq->first_free; first_ind = srq->first_free;
for (nreq = 0; wr; ++nreq, wr = wr->next) { for (nreq = 0; wr; wr = wr->next) {
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
nreq = 0;
doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
doorbell[1] = cpu_to_be32(srq->srqn << 8);
/*
* Make sure that descriptors are written
* before doorbell is rung.
*/
wmb();
mthca_write64(doorbell,
dev->kar + MTHCA_RECEIVE_DOORBELL,
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
first_ind = srq->first_free;
}
ind = srq->first_free; ind = srq->first_free;
if (ind < 0) { if (ind < 0) {
@ -569,6 +550,26 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
srq->wrid[ind] = wr->wr_id; srq->wrid[ind] = wr->wr_id;
srq->first_free = next_ind; srq->first_free = next_ind;
++nreq;
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
nreq = 0;
doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
doorbell[1] = cpu_to_be32(srq->srqn << 8);
/*
* Make sure that descriptors are written
* before doorbell is rung.
*/
wmb();
mthca_write64(doorbell,
dev->kar + MTHCA_RECEIVE_DOORBELL,
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
first_ind = srq->first_free;
}
} }
if (likely(nreq)) { if (likely(nreq)) {

Some files were not shown because too many files have changed in this diff Show More