Pull osi-now into release branch
authorLen Brown <len.brown@intel.com>
Sat, 2 Jun 2007 05:02:09 +0000 (01:02 -0400)
committerLen Brown <len.brown@intel.com>
Sat, 2 Jun 2007 05:02:09 +0000 (01:02 -0400)
385 files changed:
Documentation/BUG-HUNTING
Documentation/SubmitChecklist
Documentation/SubmittingPatches
Documentation/feature-removal-schedule.txt
Documentation/hrtimer/timer_stats.txt
Documentation/ia64/aliasing-test.c
Documentation/kernel-parameters.txt
Documentation/networking/xfrm_sysctl.txt [new file with mode: 0644]
Documentation/sound/alsa/ALSA-Configuration.txt
Documentation/thinkpad-acpi.txt
Documentation/vm/slub.txt
MAINTAINERS
arch/alpha/Kconfig
arch/alpha/boot/tools/mkbb.c
arch/alpha/kernel/console.c
arch/alpha/kernel/core_marvel.c
arch/alpha/kernel/core_titan.c
arch/alpha/kernel/core_tsunami.c
arch/alpha/kernel/entry.S
arch/alpha/kernel/pci_iommu.c
arch/alpha/kernel/proto.h
arch/alpha/kernel/setup.c
arch/alpha/kernel/signal.c
arch/alpha/kernel/sys_dp264.c
arch/alpha/kernel/sys_marvel.c
arch/alpha/kernel/sys_titan.c
arch/alpha/kernel/systbls.S
arch/alpha/lib/Makefile
arch/alpha/lib/fls.c [new file with mode: 0644]
arch/arm/kernel/armksyms.c
arch/arm/kernel/stacktrace.c
arch/arm/mach-at91/board-dk.c
arch/arm/mach-at91/board-kb9202.c
arch/arm/mach-at91/board-sam9261ek.c
arch/arm/mach-at91/board-sam9263ek.c
arch/arm/mach-at91/board-sam9rlek.c
arch/arm/mach-footbridge/cats-pci.c
arch/arm/mach-imx/generic.c
arch/arm/mach-ixp2000/ixdp2400.c
arch/arm/mach-ixp2000/ixdp2800.c
arch/arm/mach-ixp2000/ixdp2x00.c
arch/arm/mach-ixp23xx/ixdp2351.c
arch/arm/mach-ixp23xx/pci.c
arch/arm/mach-ixp23xx/roadrunner.c
arch/arm/mach-ixp4xx/Kconfig
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-ixp4xx/coyote-pci.c
arch/arm/mach-ixp4xx/dsmg600-setup.c
arch/arm/mach-ixp4xx/ixdpg425-pci.c
arch/arm/mach-ixp4xx/nas100d-setup.c
arch/arm/mach-ixp4xx/nslu2-setup.c
arch/arm/mach-s3c2410/bast.h [deleted file]
arch/arm/mach-s3c2410/mach-amlm5900.c
arch/arm/mach-s3c2412/s3c2412.c
arch/arm/mach-s3c2443/clock.c
arch/arm/mach-sa1100/neponset.c
arch/arm/mm/Kconfig
arch/arm/mm/Makefile
arch/arm/mm/alignment.c
arch/arm/mm/proc-v7.S
arch/arm/mm/tlb-v7.S [new file with mode: 0644]
arch/arm/nwfpe/softfloat.h
arch/arm/oprofile/op_model_mpcore.c
arch/h8300/kernel/sys_h8300.c
arch/h8300/kernel/traps.c
arch/i386/kernel/microcode.c
arch/i386/kernel/reboot.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/vmi.c
arch/i386/oprofile/nmi_int.c
arch/i386/pci/fixup.c
arch/m68k/Kconfig
arch/m68k/Makefile
arch/m68k/kernel/Makefile
arch/m68k/kernel/module.c
arch/m68k/kernel/module.lds [new file with mode: 0644]
arch/m68k/kernel/setup.c
arch/m68k/kernel/vmlinux-std.lds
arch/m68k/kernel/vmlinux-sun3.lds
arch/m68k/mac/debug.c
arch/m68k/mm/init.c
arch/m68k/mm/memory.c
arch/m68k/mm/motorola.c
arch/m68k/sun3/config.c
arch/mips/jmr3927/rbhma3100/kgdb_io.c
arch/mips/pci/pci-ocelot.c
arch/powerpc/Kconfig
arch/powerpc/boot/dts/lite5200.dts
arch/powerpc/boot/dts/lite5200b.dts
arch/powerpc/mm/pgtable_32.c
arch/powerpc/platforms/chrp/pegasos_eth.c
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/sysdev/qe_lib/Kconfig
arch/ppc/kernel/entry.S
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/mm/hashtable.S
arch/ppc/mm/pgtable.c
arch/s390/hypfs/hypfs_diag.c
arch/s390/kernel/debug.c
arch/s390/kernel/setup.c
arch/s390/kernel/smp.c
arch/sh/Makefile
arch/sh/drivers/dma/dma-api.c
arch/sh/kernel/cf-enabler.c
arch/sh/kernel/cpu/sh3/entry.S
arch/sh/kernel/cpu/sh4/probe.c
arch/sh/kernel/smp.c
arch/sh/kernel/timers/timer.c
arch/sh/kernel/vsyscall/vsyscall.c
arch/sparc/Kconfig
arch/sparc/kernel/time.c
arch/sparc/lib/atomic32.c
arch/sparc64/Kconfig
arch/sparc64/kernel/Makefile
arch/sparc64/kernel/devices.c [deleted file]
arch/sparc64/kernel/entry.S
arch/sparc64/kernel/head.S
arch/sparc64/kernel/hvapi.c
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/itlb_miss.S
arch/sparc64/kernel/mdesc.c [new file with mode: 0644]
arch/sparc64/kernel/pci.c
arch/sparc64/kernel/pci_sabre.c
arch/sparc64/kernel/pci_sun4v.c
arch/sparc64/kernel/power.c
arch/sparc64/kernel/process.c
arch/sparc64/kernel/prom.c
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/sstate.c [new file with mode: 0644]
arch/sparc64/kernel/sun4v_ivec.S
arch/sparc64/kernel/time.c
arch/sparc64/kernel/traps.c
arch/sparc64/kernel/vmlinux.lds.S
arch/sparc64/mm/init.c
arch/sparc64/prom/misc.c
arch/x86_64/mm/init.c
crypto/cryptd.c
drivers/acpi/asus_acpi.c
drivers/acpi/numa.c
drivers/acpi/tables/tbinstal.c
drivers/acpi/thermal.c
drivers/acpi/toshiba_acpi.c
drivers/acpi/utilities/utcopy.c
drivers/acpi/utilities/utobject.c
drivers/ata/libata-core.c
drivers/auxdisplay/Kconfig
drivers/auxdisplay/cfag12864bfb.c
drivers/char/drm/Kconfig
drivers/char/drm/drm_drawable.c
drivers/char/drm/drm_pciids.h
drivers/char/drm/i915_irq.c
drivers/char/n_tty.c
drivers/char/random.c
drivers/char/tty_io.c
drivers/char/watchdog/ixp2000_wdt.c
drivers/firewire/Kconfig
drivers/firewire/Makefile
drivers/firewire/fw-card.c
drivers/firewire/fw-cdev.c
drivers/firewire/fw-device.h
drivers/firewire/fw-ohci.c
drivers/firewire/fw-sbp2.c
drivers/hwmon/Kconfig
drivers/hwmon/applesmc.c
drivers/hwmon/coretemp.c
drivers/hwmon/ds1621.c
drivers/hwmon/hwmon-vid.c
drivers/hwmon/w83627hf.c
drivers/i2c/busses/i2c-pxa.c
drivers/ieee1394/eth1394.c
drivers/ieee1394/eth1394.h
drivers/ieee1394/nodemgr.c
drivers/ieee1394/nodemgr.h
drivers/ieee1394/raw1394.c
drivers/ieee1394/sbp2.c
drivers/infiniband/core/cm.c
drivers/infiniband/hw/mthca/mthca_qp.c
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/input/serio/sa1111ps2.c
drivers/isdn/Kconfig
drivers/isdn/hardware/eicon/diva_didd.c
drivers/isdn/hardware/eicon/divasfunc.c
drivers/isdn/i4l/isdn_tty.c
drivers/kvm/vmx.c
drivers/macintosh/Kconfig
drivers/message/fusion/mptbase.h
drivers/message/fusion/mptscsih.c
drivers/misc/thinkpad_acpi.c
drivers/misc/thinkpad_acpi.h
drivers/misc/tifm_7xx1.c
drivers/mtd/devices/pmc551.c
drivers/mtd/nand/autcpu12.c
drivers/mtd/nand/ppchameleonevb.c
drivers/net/Kconfig
drivers/net/amd8111e.c
drivers/net/amd8111e.h
drivers/net/cassini.c
drivers/net/defxx.c
drivers/net/e1000/e1000_main.c
drivers/net/ehea/ehea.h
drivers/net/ehea/ehea_main.c
drivers/net/fec_8xx/fec_main.c
drivers/net/hp100.c
drivers/net/mlx4/alloc.c
drivers/net/skfp/smt.c
drivers/net/sky2.c
drivers/net/sky2.h
drivers/net/wireless/hostap/hostap_80211_tx.c
drivers/net/wireless/prism54/islpci_eth.c
drivers/pci/msi.c
drivers/pci/quirks.c
drivers/pci/search.c
drivers/pcmcia/at91_cf.c
drivers/rtc/rtc-cmos.c
drivers/s390/block/dasd_eer.c
drivers/s390/char/raw3270.c
drivers/s390/cio/device.c
drivers/s390/cio/device_fsm.c
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_ccw.c
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_scsi.c
drivers/sbus/char/flash.c
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/NCR5380.c
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/rx.c
drivers/scsi/aacraid/sa.c
drivers/scsi/aic7xxx/aic79xx_core.c
drivers/scsi/aic7xxx/aicasm/aicasm_gram.y
drivers/scsi/aic7xxx/aicasm/aicasm_macro_gram.y
drivers/scsi/aic94xx/aic94xx_tmf.c
drivers/scsi/ipr.c
drivers/scsi/jazz_esp.c
drivers/scsi/libsrp.c
drivers/scsi/megaraid/megaraid_sas.c
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/pluto.c
drivers/scsi/scsi_devinfo.c
drivers/scsi/sd.c
drivers/scsi/stex.c
drivers/serial/amba-pl010.c
drivers/serial/amba-pl011.c
drivers/serial/serial_ks8695.c
drivers/serial/suncore.c
drivers/serial/sunzilog.c
drivers/spi/atmel_spi.c
drivers/spi/spi_imx.c
drivers/usb/core/hcd.c
drivers/usb/core/hub.c
drivers/usb/core/usb.c
drivers/video/arkfb.c
drivers/video/console/fbcon.h
drivers/video/neofb.c
drivers/video/pm3fb.c
drivers/video/skeletonfb.c
drivers/video/vt8623fb.c
fs/afs/internal.h
fs/ext4/balloc.c
fs/ext4/extents.c
fs/ext4/inode.c
fs/ext4/namei.c
fs/ext4/super.c
fs/nfs/direct.c
fs/ntfs/inode.c
fs/ramfs/file-nommu.c
fs/udf/inode.c
fs/udf/super.c
fs/xfs/linux-2.6/xfs_aops.c
include/acpi/acpi_numa.h
include/acpi/acutils.h
include/asm-alpha/bitops.h
include/asm-alpha/core_t2.h
include/asm-alpha/core_titan.h
include/asm-alpha/core_tsunami.h
include/asm-alpha/core_wildfire.h
include/asm-alpha/thread_info.h
include/asm-alpha/unistd.h
include/asm-alpha/vga.h
include/asm-arm/arch-ixp4xx/nas100d.h
include/asm-arm/arch-ixp4xx/nslu2.h
include/asm-arm/arch-ixp4xx/platform.h
include/asm-arm/arch-s3c2410/map.h
include/asm-arm/arch-s3c2410/regs-gpioj.h
include/asm-arm/arch-s3c2410/regs-s3c2412.h [new file with mode: 0644]
include/asm-arm/ioctls.h
include/asm-arm/mach/arch.h
include/asm-arm/setup.h
include/asm-arm/termbits.h
include/asm-arm/termios.h
include/asm-arm/tlbflush.h
include/asm-arm26/setup.h
include/asm-generic/vmlinux.lds.h
include/asm-h8300/processor.h
include/asm-m68k/mmzone.h [new file with mode: 0644]
include/asm-m68k/module.h
include/asm-m68k/motorola_pgtable.h
include/asm-m68k/page.h
include/asm-m68k/pgalloc.h
include/asm-m68k/pgtable.h
include/asm-m68k/sun3_pgtable.h
include/asm-m68k/virtconvert.h
include/asm-sh/cpu-sh4/freq.h
include/asm-sh/dma.h
include/asm-sh/io.h
include/asm-sh/smp.h
include/asm-sh/spinlock.h
include/asm-sh/spinlock_types.h
include/asm-sparc/atomic.h
include/asm-sparc64/bugs.h
include/asm-sparc64/cpudata.h
include/asm-sparc64/hypervisor.h
include/asm-sparc64/kdebug.h
include/asm-sparc64/mdesc.h [new file with mode: 0644]
include/asm-sparc64/oplib.h
include/asm-sparc64/percpu.h
include/asm-sparc64/prom.h
include/asm-sparc64/smp.h
include/asm-sparc64/sstate.h [new file with mode: 0644]
include/asm-sparc64/thread_info.h
include/asm-sparc64/topology.h
include/asm-sparc64/tsb.h
include/linux/Kbuild
include/linux/bootmem.h
include/linux/errno.h
include/linux/ext4_fs.h
include/linux/ext4_fs_extents.h
include/linux/ext4_fs_i.h
include/linux/fb.h
include/linux/firewire-cdev.h
include/linux/ipv6.h
include/linux/netdevice.h
include/linux/pci_ids.h
include/linux/serial_core.h
include/linux/timer.h
include/net/sock.h
include/net/tcp.h
include/net/xfrm.h
include/sound/version.h
kernel/futex_compat.c
kernel/kallsyms.c
kernel/time/tick-sched.c
kernel/time/timer_stats.c
kernel/timer.c
lib/Kconfig.debug
mm/memory_hotplug.c
mm/page_alloc.c
mm/slub.c
mm/sparse.c
net/bridge/br_fdb.c
net/bridge/br_stp.c
net/bridge/br_stp_timer.c
net/core/sysctl_net_core.c
net/core/utils.c
net/ieee80211/ieee80211_module.c
net/ieee80211/softmac/ieee80211softmac_module.c
net/ipv4/fib_frontend.c
net/ipv4/tcp.c
net/ipv4/tcp_probe.c
net/ipv4/tcp_timer.c
net/ipv4/xfrm4_input.c
net/ipv4/xfrm4_mode_tunnel.c
net/ipv6/ah6.c
net/ipv6/ip6_fib.c
net/ipv6/xfrm6_input.c
net/ipv6/xfrm6_mode_tunnel.c
net/mac80211/ieee80211.c
net/mac80211/ieee80211_sta.c
net/packet/af_packet.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
scripts/checkpatch.pl [new file with mode: 0644]
sound/arm/sa11xx-uda1341.c
sound/pci/ali5451/ali5451.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_local.h
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_si3054.c
sound/pci/hda/patch_sigmatel.c
sound/soc/s3c24xx/s3c24xx-pcm.c

index 65b97e1dbf70cabf7a92dee53831f191f16b4015..35f5bd243336aeb1927f42483e26fa7586bcb205 100644 (file)
@@ -191,6 +191,30 @@ e.g. crash dump output as shown by Dave Miller.
 >        mov        0x8(%ebp), %ebx         ! %ebx = skb->sk
 >        mov        0x13c(%ebx), %eax       ! %eax = inet_sk(sk)->opt
 
+In addition, you can use GDB to figure out the exact file and line
+number of the OOPS from the vmlinux file. If you have
+CONFIG_DEBUG_INFO enabled, you can simply copy the EIP value from the
+OOPS:
+
+ EIP:    0060:[<c021e50e>]    Not tainted VLI
+
+And use GDB to translate that to human-readable form:
+
+  gdb vmlinux
+  (gdb) l *0xc021e50e
+
+If you don't have CONFIG_DEBUG_INFO enabled, you use the function
+offset from the OOPS:
+
+ EIP is at vt_ioctl+0xda8/0x1482
+
+And recompile the kernel with CONFIG_DEBUG_INFO enabled:
+
+  make vmlinux
+  gdb vmlinux
+  (gdb) p vt_ioctl
+  (gdb) l *(0x<address of vt_ioctl> + 0xda8)
+
 Another very useful option of the Kernel Hacking section in menuconfig is
 Debug memory allocations. This will help you see whether data has been
 initialised and not set before use etc. To see the values that get assigned
index 3af3e65cf43b54ccfb150824e9338b8567234812..6ebffb57e3dbf326c6db594da4206c2f30bf1050 100644 (file)
@@ -84,3 +84,9 @@ kernel patches.
 24: Avoid whitespace damage such as indenting with spaces or whitespace
     at the end of lines.  You can test this by feeding the patch to
     "git apply --check --whitespace=error-all"
+
+25: Check your patch for general style as detailed in
+    Documentation/CodingStyle.  Check for trivial violations with the
+    patch style checker prior to submission (scripts/checkpatch.pl).
+    You should be able to justify all violations that remain in
+    your patch.
index a417b25fb1aa40f62234c222db0a4be1cfaa938d..d91125ab6f49253fece7bc6e056cd248ec7812ec 100644 (file)
@@ -118,7 +118,20 @@ then only post say 15 or so at a time and wait for review and integration.
 
 
 
-4) Select e-mail destination.
+4) Style check your changes.
+
+Check your patch for basic style violations, details of which can be
+found in Documentation/CodingStyle.  Failure to do so simply wastes
+the reviewers time and will get your patch rejected, probabally
+without even being read.
+
+At a minimum you should check your patches with the patch style
+checker prior to submission (scripts/patchcheck.pl).  You should
+be able to justify all violations that remain in your patch.
+
+
+
+5) Select e-mail destination.
 
 Look through the MAINTAINERS file and the source code, and determine
 if your change applies to a specific subsystem of the kernel, with
@@ -146,7 +159,7 @@ discussed should the patch then be submitted to Linus.
 
 
 
-5) Select your CC (e-mail carbon copy) list.
+6) Select your CC (e-mail carbon copy) list.
 
 Unless you have a reason NOT to do so, CC linux-kernel@vger.kernel.org.
 
@@ -187,8 +200,7 @@ URL: <http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/>
 
 
 
-
-6) No MIME, no links, no compression, no attachments.  Just plain text.
+7) No MIME, no links, no compression, no attachments.  Just plain text.
 
 Linus and other kernel developers need to be able to read and comment
 on the changes you are submitting.  It is important for a kernel
@@ -223,9 +235,9 @@ pref("mailnews.display.disable_format_flowed_support", true);
 
 
 
-7) E-mail size.
+8) E-mail size.
 
-When sending patches to Linus, always follow step #6.
+When sending patches to Linus, always follow step #7.
 
 Large changes are not appropriate for mailing lists, and some
 maintainers.  If your patch, uncompressed, exceeds 40 kB in size,
@@ -234,7 +246,7 @@ server, and provide instead a URL (link) pointing to your patch.
 
 
 
-8) Name your kernel version.
+9) Name your kernel version.
 
 It is important to note, either in the subject line or in the patch
 description, the kernel version to which this patch applies.
@@ -244,7 +256,7 @@ Linus will not apply it.
 
 
 
-9) Don't get discouraged.  Re-submit.
+10) Don't get discouraged.  Re-submit.
 
 After you have submitted your change, be patient and wait.  If Linus
 likes your change and applies it, it will appear in the next version
@@ -270,7 +282,7 @@ When in doubt, solicit comments on linux-kernel mailing list.
 
 
 
-10) Include PATCH in the subject
+11) Include PATCH in the subject
 
 Due to high e-mail traffic to Linus, and to linux-kernel, it is common
 convention to prefix your subject line with [PATCH].  This lets Linus
@@ -279,7 +291,7 @@ e-mail discussions.
 
 
 
-11) Sign your work
+12) Sign your work
 
 To improve tracking of who did what, especially with patches that can
 percolate to their final resting place in the kernel through several
@@ -328,7 +340,8 @@ now, but you can do this to mark internal company procedures or just
 point out some special detail about the sign-off. 
 
 
-12) The canonical patch format
+
+13) The canonical patch format
 
 The canonical patch subject line is:
 
@@ -427,6 +440,10 @@ section Linus Computer Science 101.
 Nuff said.  If your code deviates too much from this, it is likely
 to be rejected without further review, and without comment.
 
+Check your patches with the patch style checker prior to submission
+(scripts/checkpatch.pl).  You should be able to justify all
+violations that remain in your patch.
+
 
 
 2) #ifdefs are ugly
index 5c8695a3d1399d57ed984472674667a063767613..49ae1ea9e868d9d0803e8d2711748be45cc1a546 100644 (file)
@@ -62,7 +62,7 @@ Who:  Dan Dennedy <dan@dennedy.org>, Stefan Richter <stefanr@s5r6.in-berlin.de>
 What:  old NCR53C9x driver
 When:  October 2007
 Why:   Replaced by the much better esp_scsi driver.  Actual low-level
-       driver can ported over almost trivially.
+       driver can be ported over almost trivially.
 Who:   David Miller <davem@davemloft.net>
        Christoph Hellwig <hch@lst.de>
 
@@ -70,6 +70,7 @@ Who:  David Miller <davem@davemloft.net>
 
 What:  Video4Linux API 1 ioctls and video_decoder.h from Video devices.
 When:  December 2006
+Files: include/linux/video_decoder.h
 Why:   V4L1 AP1 was replaced by V4L2 API. during migration from 2.4 to 2.6
        series. The old API have lots of drawbacks and don't provide enough
        means to work with all video and audio standards. The newer API is
index 27f782e3593f2f86047fbc2e74e387710f3a0f9a..22b0814d0ad0927024de028303a4af9cce0afc11 100644 (file)
@@ -2,9 +2,10 @@ timer_stats - timer usage statistics
 ------------------------------------
 
 timer_stats is a debugging facility to make the timer (ab)usage in a Linux
-system visible to kernel and userspace developers. It is not intended for
-production usage as it adds significant overhead to the (hr)timer code and the
-(hr)timer data structures.
+system visible to kernel and userspace developers. If enabled in the config
+but not used it has almost zero runtime overhead, and a relatively small
+data structure overhead. Even if collection is enabled runtime all the
+locking is per-CPU and lookup is hashed.
 
 timer_stats should be used by kernel and userspace developers to verify that
 their code does not make unduly use of timers. This helps to avoid unnecessary
index 3153167b41c3c39b999822df7f283aa1dd686d9e..d485256ee1cead1c71b20610c0db3e458cbd10db 100644 (file)
@@ -197,7 +197,7 @@ skip:
        return rc;
 }
 
-main()
+int main()
 {
        int rc;
 
index 79150144dca90e8a901dcff1d596c56050281197..5d0283cd3a81997fde0eaf901417ac0de33bf16b 100644 (file)
@@ -1135,9 +1135,9 @@ and is between 256 and 4096 characters. It is defined in the file
                        when set.
                        Format: <int>
 
-       noaliencache    [MM, NUMA] Disables the allcoation of alien caches in
-                       the slab allocator.  Saves per-node memory, but will
-                       impact performance on real NUMA hardware.
+       noaliencache    [MM, NUMA, SLAB] Disables the allocation of alien
+                       caches in the slab allocator.  Saves per-node memory,
+                       but will impact performance.
 
        noalign         [KNL,ARM]
 
@@ -1616,6 +1616,37 @@ and is between 256 and 4096 characters. It is defined in the file
 
        slram=          [HW,MTD]
 
+       slub_debug      [MM, SLUB]
+                       Enabling slub_debug allows one to determine the culprit
+                       if slab objects become corrupted. Enabling slub_debug
+                       creates guard zones around objects and poisons objects
+                       when not in use. Also tracks the last alloc / free.
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_max_order= [MM, SLUB]
+                       Determines the maximum allowed order for slabs. Setting
+                       this too high may cause fragmentation.
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_min_objects=       [MM, SLUB]
+                       The minimum objects per slab. SLUB will increase the
+                       slab order up to slub_max_order to generate a
+                       sufficiently big slab to satisfy the number of objects.
+                       The higher the number of objects the smaller the overhead
+                       of tracking slabs.
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_min_order= [MM, SLUB]
+                       Determines the mininum page order for slabs. Must be
+                       lower than slub_max_order
+                       For more information see Documentation/vm/slub.txt.
+
+       slub_nomerge    [MM, SLUB]
+                       Disable merging of slabs of similar size. May be
+                       necessary if there is some reason to distinguish
+                       allocs to different slabs.
+                       For more information see Documentation/vm/slub.txt.
+
        smart2=         [HW]
                        Format: <io1>[,<io2>[,...,<io8>]]
 
diff --git a/Documentation/networking/xfrm_sysctl.txt b/Documentation/networking/xfrm_sysctl.txt
new file mode 100644 (file)
index 0000000..5bbd167
--- /dev/null
@@ -0,0 +1,4 @@
+/proc/sys/net/core/xfrm_* Variables:
+
+xfrm_acq_expires - INTEGER
+       default 30 - hard timeout in seconds for acquire requests
index 57b878cc393c20ebd04c7713f83e3c249ae83db3..355ff0a2bb7c5a1cdc9862c4f827e9e49497c165 100644 (file)
@@ -917,6 +917,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
          ref           Reference board, base config
          m2-2          Some Gateway MX series laptops
          m6            Some Gateway NX series laptops
+         pa6           Gateway NX860 series
 
        STAC9227/9228/9229/927x
          ref           Reference board
index 2d4803359a043e228292d9f8e82eeffc14ff454b..9e6b94face4bb2a11f0ea743246f0b85adbbd105 100644 (file)
@@ -138,7 +138,7 @@ Hot keys
 --------
 
 procfs: /proc/acpi/ibm/hotkey
-sysfs device attribute: hotkey/*
+sysfs device attribute: hotkey_*
 
 Without this driver, only the Fn-F4 key (sleep button) generates an
 ACPI event. With the driver loaded, the hotkey feature enabled and the
@@ -196,10 +196,7 @@ The following commands can be written to the /proc/acpi/ibm/hotkey file:
 
 sysfs notes:
 
-       The hot keys attributes are in a hotkey/ subdirectory off the
-       thinkpad device.
-
-       bios_enabled:
+       hotkey_bios_enabled:
                Returns the status of the hot keys feature when
                thinkpad-acpi was loaded.  Upon module unload, the hot
                key feature status will be restored to this value.
@@ -207,19 +204,19 @@ sysfs notes:
                0: hot keys were disabled
                1: hot keys were enabled
 
-       bios_mask:
+       hotkey_bios_mask:
                Returns the hot keys mask when thinkpad-acpi was loaded.
                Upon module unload, the hot keys mask will be restored
                to this value.
 
-       enable:
+       hotkey_enable:
                Enables/disables the hot keys feature, and reports
                current status of the hot keys feature.
 
                0: disables the hot keys feature / feature disabled
                1: enables the hot keys feature / feature enabled
 
-       mask:
+       hotkey_mask:
                bit mask to enable ACPI event generation for each hot
                key (see above).  Returns the current status of the hot
                keys mask, and allows one to modify it.
@@ -229,7 +226,7 @@ Bluetooth
 ---------
 
 procfs: /proc/acpi/ibm/bluetooth
-sysfs device attribute: bluetooth/enable
+sysfs device attribute: bluetooth_enable
 
 This feature shows the presence and current state of a ThinkPad
 Bluetooth device in the internal ThinkPad CDC slot.
@@ -244,7 +241,7 @@ If Bluetooth is installed, the following commands can be used:
 Sysfs notes:
 
        If the Bluetooth CDC card is installed, it can be enabled /
-       disabled through the "bluetooth/enable" thinkpad-acpi device
+       disabled through the "bluetooth_enable" thinkpad-acpi device
        attribute, and its current status can also be queried.
 
        enable:
@@ -252,7 +249,7 @@ Sysfs notes:
                1: enables Bluetooth / Bluetooth is enabled.
 
        Note: this interface will be probably be superseeded by the
-       generic rfkill class.
+       generic rfkill class, so it is NOT to be considered stable yet.
 
 Video output control -- /proc/acpi/ibm/video
 --------------------------------------------
@@ -898,7 +895,7 @@ EXPERIMENTAL: WAN
 -----------------
 
 procfs: /proc/acpi/ibm/wan
-sysfs device attribute: wwan/enable
+sysfs device attribute: wwan_enable
 
 This feature is marked EXPERIMENTAL because the implementation
 directly accesses hardware registers and may not work as expected. USE
@@ -921,7 +918,7 @@ If the W-WAN card is installed, the following commands can be used:
 Sysfs notes:
 
        If the W-WAN card is installed, it can be enabled /
-       disabled through the "wwan/enable" thinkpad-acpi device
+       disabled through the "wwan_enable" thinkpad-acpi device
        attribute, and its current status can also be queried.
 
        enable:
@@ -929,7 +926,7 @@ Sysfs notes:
                1: enables WWAN card / WWAN card is enabled.
 
        Note: this interface will be probably be superseeded by the
-       generic rfkill class.
+       generic rfkill class, so it is NOT to be considered stable yet.
 
 Multiple Commands, Module Parameters
 ------------------------------------
index 727c8d81aeaf01da2ea02a5a9986aeff959cc003..1523320abd87e6fdfcf2d099869a54f2d3deea3c 100644 (file)
@@ -1,13 +1,9 @@
 Short users guide for SLUB
 --------------------------
 
-First of all slub should transparently replace SLAB. If you enable
-SLUB then everything should work the same (Note the word "should".
-There is likely not much value in that word at this point).
-
 The basic philosophy of SLUB is very different from SLAB. SLAB
 requires rebuilding the kernel to activate debug options for all
-SLABS. SLUB always includes full debugging but its off by default.
+slab caches. SLUB always includes full debugging but it is off by default.
 SLUB can enable debugging only for selected slabs in order to avoid
 an impact on overall system performance which may make a bug more
 difficult to find.
@@ -76,13 +72,28 @@ of objects.
 Careful with tracing: It may spew out lots of information and never stop if
 used on the wrong slab.
 
-SLAB Merging
+Slab merging
 ------------
 
-If no debugging is specified then SLUB may merge similar slabs together
+If no debug options are specified then SLUB may merge similar slabs together
 in order to reduce overhead and increase cache hotness of objects.
 slabinfo -a displays which slabs were merged together.
 
+Slab validation
+---------------
+
+SLUB can validate all object if the kernel was booted with slub_debug. In
+order to do so you must have the slabinfo tool. Then you can do
+
+slabinfo -v
+
+which will test all objects. Output will be generated to the syslog.
+
+This also works in a more limited way if boot was without slab debug.
+In that case slabinfo -v simply tests all reachable objects. Usually
+these are in the cpu slabs and the partial slabs. Full slabs are not
+tracked by SLUB in a non debug situation.
+
 Getting more performance
 ------------------------
 
@@ -91,9 +102,9 @@ list_lock once in a while to deal with partial slabs. That overhead is
 governed by the order of the allocation for each slab. The allocations
 can be influenced by kernel parameters:
 
-slub_min_objects=x             (default 8)
+slub_min_objects=x             (default 4)
 slub_min_order=x               (default 0)
-slub_max_order=x               (default 4)
+slub_max_order=x               (default 1)
 
 slub_min_objects allows to specify how many objects must at least fit
 into one slab in order for the allocation order to be acceptable.
@@ -109,5 +120,107 @@ longer be checked. This is useful to avoid SLUB trying to generate
 super large order pages to fit slub_min_objects of a slab cache with
 large object sizes into one high order page.
 
-
-Christoph Lameter, <clameter@sgi.com>, April 10, 2007
+SLUB Debug output
+-----------------
+
+Here is a sample of slub debug output:
+
+*** SLUB kmalloc-8: Redzone Active@0xc90f6d20 slab 0xc528c530 offset=3360 flags=0x400000c3 inuse=61 freelist=0xc90f6d58
+  Bytes b4 0xc90f6d10:  00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a ........ZZZZZZZZ
+    Object 0xc90f6d20:  31 30 31 39 2e 30 30 35                         1019.005
+   Redzone 0xc90f6d28:  00 cc cc cc                                     .
+FreePointer 0xc90f6d2c -> 0xc90f6d58
+Last alloc: get_modalias+0x61/0xf5 jiffies_ago=53 cpu=1 pid=554
+Filler 0xc90f6d50:  5a 5a 5a 5a 5a 5a 5a 5a                         ZZZZZZZZ
+  [<c010523d>] dump_trace+0x63/0x1eb
+  [<c01053df>] show_trace_log_lvl+0x1a/0x2f
+  [<c010601d>] show_trace+0x12/0x14
+  [<c0106035>] dump_stack+0x16/0x18
+  [<c017e0fa>] object_err+0x143/0x14b
+  [<c017e2cc>] check_object+0x66/0x234
+  [<c017eb43>] __slab_free+0x239/0x384
+  [<c017f446>] kfree+0xa6/0xc6
+  [<c02e2335>] get_modalias+0xb9/0xf5
+  [<c02e23b7>] dmi_dev_uevent+0x27/0x3c
+  [<c027866a>] dev_uevent+0x1ad/0x1da
+  [<c0205024>] kobject_uevent_env+0x20a/0x45b
+  [<c020527f>] kobject_uevent+0xa/0xf
+  [<c02779f1>] store_uevent+0x4f/0x58
+  [<c027758e>] dev_attr_store+0x29/0x2f
+  [<c01bec4f>] sysfs_write_file+0x16e/0x19c
+  [<c0183ba7>] vfs_write+0xd1/0x15a
+  [<c01841d7>] sys_write+0x3d/0x72
+  [<c0104112>] sysenter_past_esp+0x5f/0x99
+  [<b7f7b410>] 0xb7f7b410
+  =======================
+@@@ SLUB kmalloc-8: Restoring redzone (0xcc) from 0xc90f6d28-0xc90f6d2b
+
+
+
+If SLUB encounters a corrupted object then it will perform the following
+actions:
+
+1. Isolation and report of the issue
+
+This will be a message in the system log starting with
+
+*** SLUB <slab cache affected>: <What went wrong>@<object address>
+offset=<offset of object into slab> flags=<slabflags>
+inuse=<objects in use in this slab> freelist=<first free object in slab>
+
+2. Report on how the problem was dealt with in order to ensure the continued
+operation of the system.
+
+These are messages in the system log beginning with
+
+@@@ SLUB <slab cache affected>: <corrective action taken>
+
+
+In the above sample SLUB found that the Redzone of an active object has
+been overwritten. Here a string of 8 characters was written into a slab that
+has the length of 8 characters. However, a 8 character string needs a
+terminating 0. That zero has overwritten the first byte of the Redzone field.
+After reporting the details of the issue encountered the @@@ SLUB message
+tell us that SLUB has restored the redzone to its proper value and then
+system operations continue.
+
+Various types of lines can follow the @@@ SLUB line:
+
+Bytes b4 <address> : <bytes>
+       Show a few bytes before the object where the problem was detected.
+       Can be useful if the corruption does not stop with the start of the
+       object.
+
+Object <address> : <bytes>
+       The bytes of the object. If the object is inactive then the bytes
+       typically contain poisoning values. Any non-poison value shows a
+       corruption by a write after free.
+
+Redzone <address> : <bytes>
+       The redzone following the object. The redzone is used to detect
+       writes after the object. All bytes should always have the same
+       value. If there is any deviation then it is due to a write after
+       the object boundary.
+
+Freepointer
+       The pointer to the next free object in the slab. May become
+       corrupted if overwriting continues after the red zone.
+
+Last alloc:
+Last free:
+       Shows the address from which the object was allocated/freed last.
+       We note the pid, the time and the CPU that did so. This is usually
+       the most useful information to figure out where things went wrong.
+       Here get_modalias() did an kmalloc(8) instead of a kmalloc(9).
+
+Filler <address> : <bytes>
+       Unused data to fill up the space in order to get the next object
+       properly aligned. In the debug case we make sure that there are
+       at least 4 bytes of filler. This allow for the detection of writes
+       before the object.
+
+Following the filler will be a stackdump. That stackdump describes the
+location where the error was detected. The cause of the corruption is more
+likely to be found by looking at the information about the last alloc / free.
+
+Christoph Lameter, <clameter@sgi.com>, May 23, 2007
index 953291d08c76ff1cdea0b2c05ee7fb03cd6bfaa6..124b9508ae2ece20c58137abd4c9e1b7aeb629c6 100644 (file)
@@ -30,8 +30,11 @@ trivial patch so apply some common sense.
        job the maintainers (and especially Linus) do is to keep things
        looking the same. Sometimes this means that the clever hack in
        your driver to get around a problem actually needs to become a
-       generalized kernel feature ready for next time. See
-       Documentation/CodingStyle for guidance here.
+       generalized kernel feature ready for next time.
+
+       PLEASE check your patch with the automated style checker
+       (scripts/checkpatch.pl) to catch trival style violations.
+       See Documentation/CodingStyle for guidance here.
 
        PLEASE try to include any credit lines you want added with the
        patch. It avoids people being missed off by mistake and makes
@@ -972,6 +975,15 @@ M: johannes@sipsolutions.net
 L:     linux-wireless@vger.kernel.org
 S:     Maintained
 
+CHECKPATCH
+P:     Andy Whitcroft
+M:     apw@shadowen.org
+P:     Randy Dunlap
+M:     rdunlap@xenotime.net
+P:     Joel Schopp
+M:     jschopp@austin.ibm.com
+S:     Supported
+
 COMMON INTERNET FILE SYSTEM (CIFS)
 P:     Steve French
 M:     sfrench@samba.org
@@ -1486,6 +1498,14 @@ P:       Alexander Viro
 M:     viro@zeniv.linux.org.uk
 S:     Maintained
 
+FIREWIRE SUBSYSTEM
+P:     Kristian Hoegsberg, Stefan Richter
+M:     krh@redhat.com, stefanr@s5r6.in-berlin.de
+L:     linux1394-devel@lists.sourceforge.net
+W:     http://www.linux1394.org/
+T:     git kernel.org:/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
+S:     Maintained
+
 FIRMWARE LOADER (request_firmware)
 L:     linux-kernel@vger.kernel.org
 S:     Orphan
@@ -2334,7 +2354,7 @@ S:        Maintained
 
 MEGARAID SCSI DRIVERS
 P:     Neela Syam Kolli
-M:     Neela.Kolli@engenio.com
+M:     megaraidlinux@lsi.com
 S:     linux-scsi@vger.kernel.org
 W:     http://megaraid.lsilogic.com
 S:     Maintained
@@ -2880,8 +2900,8 @@ W:        ftp://ftp.kernel.org/pub/linux/kernel/people/rml/preempt-kernel
 S:     Supported
 
 PRISM54 WIRELESS DRIVER
-P:     Prism54 Development Team
-M:     developers@islsm.org
+P:     Luis R. Rodriguez
+M:     mcgrof@gmail.com
 L:     linux-wireless@vger.kernel.org
 W:     http://prism54.org
 S:     Maintained
index 770f717bd250c2c0965b6477e2b6b205b8f37dbe..79c6e5a2445652679b4aafa5d647e06248fe27b2 100644 (file)
@@ -83,22 +83,20 @@ choice
          check out the Linux/Alpha FAQ, accessible on the WWW from
          <http://www.alphalinux.org/>. In summary:
 
-         Alcor/Alpha-XLT     AS 600
+         Alcor/Alpha-XLT     AS 600, AS 500, XL-300, XL-366
          Alpha-XL            XL-233, XL-266
          AlphaBook1          Alpha laptop
          Avanti              AS 200, AS 205, AS 250, AS 255, AS 300, AS 400
          Cabriolet           AlphaPC64, AlphaPCI64
-         DP264               DP264
+         DP264               DP264 / DS20 / ES40 / DS10 / DS10L
          EB164               EB164 21164 evaluation board
          EB64+               EB64+ 21064 evaluation board
          EB66                EB66 21066 evaluation board
          EB66+               EB66+ 21066 evaluation board
-         Jensen              DECpc 150, DEC 2000 model 300,
-         DEC 2000 model 500
+         Jensen              DECpc 150, DEC 2000 models 300, 500
          LX164               AlphaPC164-LX
          Lynx                AS 2100A
-         Miata               Personal Workstation 433a, 433au, 500a,
-         500au, 600a, or 600au
+         Miata               Personal Workstation 433/500/600 a/au
          Marvel              AlphaServer ES47 / ES80 / GS1280
          Mikasa              AS 1000
          Noname              AXPpci33, UDB (Multia)
@@ -108,9 +106,9 @@ choice
          Ruffian             RPX164-2, AlphaPC164-UX, AlphaPC164-BX
          SX164               AlphaPC164-SX
          Sable               AS 2000, AS 2100
-         Shark               DS 20L
-         Takara              Takara
-         Titan               AlphaServer ES45 / DS25
+         Shark               DS 20L
+         Takara              Takara (OEM)
+         Titan               AlphaServer ES45 / DS25 / DS15
          Wildfire            AlphaServer GS 40/80/160/320
 
          If you don't know what to do, choose "generic".
@@ -481,6 +479,15 @@ config ALPHA_BROKEN_IRQ_MASK
        depends on ALPHA_GENERIC || ALPHA_PC164
        default y
 
+config VGA_HOSE
+       bool
+       depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI
+       default y
+       help
+         Support VGA on an arbitrary hose; needed for several platforms
+         which always have multiple hoses, and whose consoles support it.
+
+
 config ALPHA_SRM
        bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME
        default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL
@@ -537,10 +544,14 @@ config HAVE_DEC_LOCK
        default y
 
 config NR_CPUS
-       int "Maximum number of CPUs (2-64)"
-       range 2 64
+       int "Maximum number of CPUs (2-32)"
+       range 2 32
        depends on SMP
-       default "64"
+       default "32" if ALPHA_GENERIC || ALPHA_MARVEL
+       default "4" if !ALPHA_GENERIC && !ALPHA_MARVEL
+       help
+         MARVEL support can handle a maximum of 32 CPUs, all the others
+          with working support have a maximum of 4 CPUs.
 
 config ARCH_DISCONTIGMEM_ENABLE
        bool "Discontiguous Memory Support (EXPERIMENTAL)"
@@ -644,6 +655,13 @@ source "arch/alpha/oprofile/Kconfig"
 
 source "arch/alpha/Kconfig.debug"
 
+# DUMMY_CONSOLE may be defined in drivers/video/console/Kconfig
+# but we also need it if VGA_HOSE is set
+config DUMMY_CONSOLE
+       bool
+       depends on VGA_HOSE
+       default y
+
 source "security/Kconfig"
 
 source "crypto/Kconfig"
index 23c7190b047c2d716303d1beefa69342280c5a43..632a7fd6d7dcfeb42efd837e8188d55b5ebd933d 100644 (file)
@@ -81,7 +81,7 @@ typedef union __bootblock {
 #define        bootblock_label         __u1.__label
 #define bootblock_checksum     __u2.__checksum
 
-main(int argc, char ** argv)
+int main(int argc, char ** argv)
 {
     bootblock          bootblock_from_disk;
     bootblock          bootloader_image;
index f313b34939bbc5516894e64e2d047322bfa69bae..da711e37fc975af1041b7229d02b5aea84856f40 100644 (file)
@@ -9,16 +9,20 @@
 #include <linux/init.h>
 #include <linux/tty.h>
 #include <linux/console.h>
+#include <linux/vt.h>
 #include <asm/vga.h>
 #include <asm/machvec.h>
 
+#include "pci_impl.h"
+
 #ifdef CONFIG_VGA_HOSE
 
-/*
- * Externally-visible vga hose bases
- */
-unsigned long __vga_hose_io_base = 0;  /* base for default hose */
-unsigned long __vga_hose_mem_base = 0; /* base for default hose */
+struct pci_controller *pci_vga_hose;
+static struct resource alpha_vga = {
+       .name   = "alpha-vga+",
+       .start  = 0x3C0,
+       .end    = 0x3DF
+};
 
 static struct pci_controller * __init 
 default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2)
@@ -29,37 +33,59 @@ default_vga_hose_select(struct pci_controller *h1, struct pci_controller *h2)
        return h1;
 }
 
-void __init 
-set_vga_hose(struct pci_controller *hose)
-{
-       if (hose) {
-               __vga_hose_io_base = hose->io_space->start;
-               __vga_hose_mem_base = hose->mem_space->start;
-       }
-}
-
 void __init 
 locate_and_init_vga(void *(*sel_func)(void *, void *))
 {
        struct pci_controller *hose = NULL;
        struct pci_dev *dev = NULL;
 
+       /* Default the select function */
        if (!sel_func) sel_func = (void *)default_vga_hose_select;
 
+       /* Find the console VGA device */
        for(dev=NULL; (dev=pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, dev));) {
-               if (!hose) hose = dev->sysdata;
-               else hose = sel_func(hose, dev->sysdata);
+               if (!hose)
+                       hose = dev->sysdata;
+               else
+                       hose = sel_func(hose, dev->sysdata);
        }
 
-       /* Did we already inititialize the correct one? */
-       if (conswitchp == &vga_con &&
-           __vga_hose_io_base == hose->io_space->start &&
-           __vga_hose_mem_base == hose->mem_space->start)
+       /* Did we already initialize the correct one? Is there one? */
+       if (!hose || (conswitchp == &vga_con && pci_vga_hose == hose))
                return;
 
-       /* Set the VGA hose and init the new console */
-       set_vga_hose(hose);
+       /* Create a new VGA ioport resource WRT the hose it is on. */
+       alpha_vga.start += hose->io_space->start;
+       alpha_vga.end += hose->io_space->start;
+       request_resource(hose->io_space, &alpha_vga);
+
+       /* Set the VGA hose and init the new console. */
+       pci_vga_hose = hose;
        take_over_console(&vga_con, 0, MAX_NR_CONSOLES-1, 1);
 }
 
+void __init
+find_console_vga_hose(void)
+{
+       u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
+
+       if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
+               struct pci_controller *hose;
+               int h = (pu64[30] >> 24) & 0xff;        /* console hose # */
+
+               /*
+                * Our hose numbering DOES match the console's, so find
+                * the right one...
+                */
+               for (hose = hose_head; hose; hose = hose->next) {
+                       if (hose->index == h) break;
+               }
+
+               if (hose) {
+                       printk("Console graphics on hose %d\n", h);
+                       pci_vga_hose = hose;
+               }
+       }
+}
+
 #endif
index 7f6a98455e74e52f666893b457f138a0eedc3cda..f10d2eddd2c309a807d58df12c48f01156f99efc 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 #include <asm/rtc.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -367,9 +368,8 @@ marvel_io7_present(gct6_node *node)
 }
 
 static void __init
-marvel_init_vga_hose(void)
+marvel_find_console_vga_hose(void)
 {
-#ifdef CONFIG_VGA_HOSE
        u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
 
        if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
@@ -403,7 +403,6 @@ marvel_init_vga_hose(void)
                        pci_vga_hose = hose;
                }
        }
-#endif /* CONFIG_VGA_HOSE */
 }
 
 gct6_search_struct gct_wanted_node_list[] = {
@@ -459,7 +458,7 @@ marvel_init_arch(void)
                marvel_init_io7(io7);
 
        /* Check for graphic console location (if any).  */
-       marvel_init_vga_hose();
+       marvel_find_console_vga_hose();
 }
 
 void
@@ -684,9 +683,6 @@ __marvel_rtc_io(u8 b, unsigned long addr, int write)
 /*
  * IO map support.
  */
-
-#define __marvel_is_mem_vga(a) (((a) >= 0xa0000) && ((a) <= 0xc0000))
-
 void __iomem *
 marvel_ioremap(unsigned long addr, unsigned long size)
 {
@@ -698,13 +694,9 @@ marvel_ioremap(unsigned long addr, unsigned long size)
        unsigned long pfn;
 
        /*
-        * Adjust the addr.
+        * Adjust the address.
         */ 
-#ifdef CONFIG_VGA_HOSE
-       if (pci_vga_hose && __marvel_is_mem_vga(addr)) {
-               addr += pci_vga_hose->mem_space->start;
-       }
-#endif
+       FIXUP_MEMADDR_VGA(addr);
 
        /*
         * Find the hose.
@@ -781,7 +773,9 @@ marvel_ioremap(unsigned long addr, unsigned long size)
                return (void __iomem *) vaddr;
        }
 
-       return NULL;
+       /* Assume it was already a reasonable address */
+       vaddr = baddr + hose->mem_space->start;
+       return (void __iomem *) vaddr;
 }
 
 void
@@ -803,21 +797,12 @@ marvel_is_mmio(const volatile void __iomem *xaddr)
                return (addr & 0xFF000000UL) == 0;
 }
 
-#define __marvel_is_port_vga(a)        \
-  (((a) >= 0x3b0) && ((a) < 0x3e0) && ((a) != 0x3b3) && ((a) != 0x3d3))
 #define __marvel_is_port_kbd(a)        (((a) == 0x60) || ((a) == 0x64))
 #define __marvel_is_port_rtc(a)        (((a) == 0x70) || ((a) == 0x71))
 
 void __iomem *marvel_ioportmap (unsigned long addr)
 {
-       if (__marvel_is_port_rtc (addr) || __marvel_is_port_kbd(addr))
-               ;
-#ifdef CONFIG_VGA_HOSE
-       else if (__marvel_is_port_vga (addr) && pci_vga_hose)
-               addr += pci_vga_hose->io_space->start;
-#endif
-       else
-               return NULL;
+       FIXUP_IOADDR_VGA(addr);
        return (void __iomem *)addr;
 }
 
@@ -829,8 +814,14 @@ marvel_ioread8(void __iomem *xaddr)
                return 0;
        else if (__marvel_is_port_rtc(addr))
                return __marvel_rtc_io(0, addr, 0);
-       else
+       else if (marvel_is_ioaddr(addr))
                return __kernel_ldbu(*(vucp)addr);
+       else
+               /* this should catch other legacy addresses
+                  that would normally fail on MARVEL,
+                  because there really is nothing there...
+               */
+               return ~0;
 }
 
 void
@@ -841,7 +832,7 @@ marvel_iowrite8(u8 b, void __iomem *xaddr)
                return;
        else if (__marvel_is_port_rtc(addr)) 
                __marvel_rtc_io(b, addr, 1);
-       else
+       else if (marvel_is_ioaddr(addr))
                __kernel_stb(b, *(vucp)addr);
 }
 
index 3662fef7db9a9c19413f01e06edf5de013e2edf9..819326627b966c3f166f76b38a11614ad51e11ec 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/smp.h>
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -34,6 +35,11 @@ struct
        unsigned long tba[4];
 } saved_config[4] __attribute__((common));
 
+/*
+ * Is PChip 1 present? No need to query it more than once.
+ */
+static int titan_pchip1_present;
+
 /*
  * BIOS32-style PCI interface:
  */
@@ -344,43 +350,17 @@ titan_init_one_pachip_port(titan_pachip_port *port, int index)
 static void __init
 titan_init_pachips(titan_pachip *pachip0, titan_pachip *pachip1)
 {
-       int pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
+       titan_pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
 
        /* Init the ports in hose order... */
        titan_init_one_pachip_port(&pachip0->g_port, 0);        /* hose 0 */
-       if (pchip1_present)
+       if (titan_pchip1_present)
                titan_init_one_pachip_port(&pachip1->g_port, 1);/* hose 1 */
        titan_init_one_pachip_port(&pachip0->a_port, 2);        /* hose 2 */
-       if (pchip1_present)
+       if (titan_pchip1_present)
                titan_init_one_pachip_port(&pachip1->a_port, 3);/* hose 3 */
 }
 
-static void __init
-titan_init_vga_hose(void)
-{
-#ifdef CONFIG_VGA_HOSE
-       u64 *pu64 = (u64 *)((u64)hwrpb + hwrpb->ctbt_offset);
-
-       if (pu64[7] == 3) {     /* TERM_TYPE == graphics */
-               struct pci_controller *hose;
-               int h = (pu64[30] >> 24) & 0xff;        /* console hose # */
-
-               /*
-                * Our hose numbering matches the console's, so just find
-                * the right one...
-                */
-               for (hose = hose_head; hose; hose = hose->next) {
-                       if (hose->index == h) break;
-               }
-
-               if (hose) {
-                       printk("Console graphics on hose %d\n", hose->index);
-                       pci_vga_hose = hose;
-               }
-       }
-#endif /* CONFIG_VGA_HOSE */
-}
-
 void __init
 titan_init_arch(void)
 {
@@ -406,6 +386,7 @@ titan_init_arch(void)
 
        /* With multiple PCI busses, we play with I/O as physical addrs.  */
        ioport_resource.end = ~0UL;
+       iomem_resource.end = ~0UL;
 
        /* PCI DMA Direct Mapping is 1GB at 2GB.  */
        __direct_map_base = 0x80000000;
@@ -415,7 +396,7 @@ titan_init_arch(void)
        titan_init_pachips(TITAN_pachip0, TITAN_pachip1);
 
        /* Check for graphic console location (if any).  */
-       titan_init_vga_hose();
+       find_console_vga_hose();
 }
 
 static void
@@ -441,9 +422,7 @@ titan_kill_one_pachip_port(titan_pachip_port *port, int index)
 static void
 titan_kill_pachips(titan_pachip *pachip0, titan_pachip *pachip1)
 {
-       int pchip1_present = TITAN_cchip->csc.csr & 1L<<14;
-
-       if (pchip1_present) {
+       if (titan_pchip1_present) {
                titan_kill_one_pachip_port(&pachip1->g_port, 1);
                titan_kill_one_pachip_port(&pachip1->a_port, 3);
        }
@@ -462,6 +441,14 @@ titan_kill_arch(int mode)
  * IO map support.
  */
 
+void __iomem *
+titan_ioportmap(unsigned long addr)
+{
+       FIXUP_IOADDR_VGA(addr);
+       return (void __iomem *)(addr + TITAN_IO_BIAS);
+}
+
+
 void __iomem *
 titan_ioremap(unsigned long addr, unsigned long size)
 {
@@ -475,14 +462,12 @@ titan_ioremap(unsigned long addr, unsigned long size)
        unsigned long pfn;
 
        /*
-        * Adjust the addr.
+        * Adjust the address and hose, if necessary.
         */ 
-#ifdef CONFIG_VGA_HOSE
-       if (pci_vga_hose && __titan_is_mem_vga(addr)) {
+       if (pci_vga_hose && __is_mem_vga(addr)) {
                h = pci_vga_hose->index;
                addr += pci_vga_hose->mem_space->start;
        }
-#endif
 
        /*
         * Find the hose.
@@ -521,8 +506,10 @@ titan_ioremap(unsigned long addr, unsigned long size)
                 * Map it
                 */
                area = get_vm_area(size, VM_IOREMAP);
-               if (!area)
+               if (!area) {
+                       printk("ioremap failed... no vm_area...\n");
                        return NULL;
+               }
 
                ptes = hose->sg_pci->ptes;
                for (vaddr = (unsigned long)area->addr; 
@@ -539,7 +526,7 @@ titan_ioremap(unsigned long addr, unsigned long size)
                        if (__alpha_remap_area_pages(vaddr,
                                                     pfn << PAGE_SHIFT, 
                                                     PAGE_SIZE, 0)) {
-                               printk("FAILED to map...\n");
+                               printk("FAILED to remap_area_pages...\n");
                                vfree(area->addr);
                                return NULL;
                        }
@@ -551,7 +538,8 @@ titan_ioremap(unsigned long addr, unsigned long size)
                return (void __iomem *) vaddr;
        }
 
-       return NULL;
+       /* Assume a legacy (read: VGA) address, and return appropriately. */
+       return (void __iomem *)(addr + TITAN_MEM_BIAS);
 }
 
 void
@@ -574,6 +562,7 @@ titan_is_mmio(const volatile void __iomem *xaddr)
 }
 
 #ifndef CONFIG_ALPHA_GENERIC
+EXPORT_SYMBOL(titan_ioportmap);
 EXPORT_SYMBOL(titan_ioremap);
 EXPORT_SYMBOL(titan_iounmap);
 EXPORT_SYMBOL(titan_is_mmio);
@@ -750,6 +739,7 @@ titan_agp_info(void)
        if (titan_query_agp(port))
                hosenum = 2;
        if (hosenum < 0 && 
+           titan_pchip1_present &&
            titan_query_agp(port = &TITAN_pachip1->a_port)) 
                hosenum = 3;
        
index ce623c6e55e1c9c30d1521a95309496273a2889f..ef91e09590d4d1aefe76772e81b29c83d9f73b78 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/smp.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "pci_impl.h"
@@ -349,6 +350,26 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
        tsunami_pci_tbi(hose, 0, -1);
 }
 
+
+void __iomem *
+tsunami_ioportmap(unsigned long addr)
+{
+       FIXUP_IOADDR_VGA(addr);
+       return (void __iomem *)(addr + TSUNAMI_IO_BIAS);
+}
+
+void __iomem *
+tsunami_ioremap(unsigned long addr, unsigned long size)
+{
+       FIXUP_MEMADDR_VGA(addr);
+       return (void __iomem *)(addr + TSUNAMI_MEM_BIAS);
+}
+
+#ifndef CONFIG_ALPHA_GENERIC
+EXPORT_SYMBOL(tsunami_ioportmap);
+EXPORT_SYMBOL(tsunami_ioremap);
+#endif
+
 void __init
 tsunami_init_arch(void)
 {
@@ -393,6 +414,9 @@ tsunami_init_arch(void)
        tsunami_init_one_pchip(TSUNAMI_pchip0, 0);
        if (TSUNAMI_cchip->csc.csr & 1L<<14)
                tsunami_init_one_pchip(TSUNAMI_pchip1, 1);
+
+       /* Check for graphic console location (if any).  */
+       find_console_vga_hose();
 }
 
 static void
index c95e95e1ab0423b2664e8359a32ff2da0d13372d..debc8f03886cf9edafa577664a90a6c8ec59c9ad 100644 (file)
@@ -391,11 +391,10 @@ $work_resched:
        bne     $2, $work_resched
 
 $work_notifysig:
-       mov     $sp, $17
+       mov     $sp, $16
        br      $1, do_switch_stack
-       mov     $5, $21
-       mov     $sp, $18
-       mov     $31, $16
+       mov     $sp, $17
+       mov     $5, $18
        jsr     $26, do_notify_resume
        bsr     $1, undo_switch_stack
        br      restore_all
index 6e7d1fe6e93532daa923ae6d6b69839e639954b6..28c84e55feb9b80440deda421730ff0c126e2963 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/bootmem.h>
+#include <linux/log2.h>
 
 #include <asm/io.h>
 #include <asm/hwrpb.h>
@@ -53,7 +54,7 @@ size_for_memory(unsigned long max)
 {
        unsigned long mem = max_low_pfn << PAGE_SHIFT;
        if (mem < max)
-               max = 1UL << ceil_log2(mem);
+               max = roundup_pow_of_two(mem);
        return max;
 }
 \f
index 95912ecc65e1bb63af2f6991c08f485bfe938e40..708d5ca87782ad011019250399787e6e1c4258e5 100644 (file)
@@ -108,6 +108,15 @@ extern int wildfire_cpuid_to_nid(int);
 extern unsigned long wildfire_node_mem_start(int);
 extern unsigned long wildfire_node_mem_size(int);
 
+/* console.c */
+#ifdef CONFIG_VGA_HOSE
+extern void find_console_vga_hose(void);
+extern void locate_and_init_vga(void *(*)(void *, void *));
+#else
+static inline void find_console_vga_hose(void) { }
+static inline void locate_and_init_vga(void *(*sel_func)(void *, void *)) { }
+#endif
+
 /* setup.c */
 extern unsigned long srm_hae;
 extern int boot_cpuid;
index 915f26345c45c91a1105d97ed7256c40a859455b..bd5e68cd61e84fb440bd0a618b6c90019d48fb75 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/notifier.h>
 #include <asm/setup.h>
 #include <asm/io.h>
+#include <linux/log2.h>
 
 extern struct atomic_notifier_head panic_notifier_list;
 static int alpha_panic_event(struct notifier_block *, unsigned long, void *);
@@ -1303,7 +1304,7 @@ external_cache_probe(int minsize, int width)
        long size = minsize, maxsize = MAX_BCACHE_SIZE * 2;
 
        if (maxsize > (max_low_pfn + 1) << PAGE_SHIFT)
-               maxsize = 1 << (floor_log2(max_low_pfn + 1) + PAGE_SHIFT);
+               maxsize = 1 << (ilog2(max_low_pfn + 1) + PAGE_SHIFT);
 
        /* Get the first block cached. */
        read_mem_block(__va(0), stride, size);
index 7f64aa767d5a2f92aa8dfca13d466b3983dc64c3..410af4f3140e3ce4ff83256753f8e41d81c12106 100644 (file)
@@ -32,8 +32,8 @@
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
 asmlinkage void ret_from_sys_call(void);
-static int do_signal(sigset_t *, struct pt_regs *, struct switch_stack *,
-                    unsigned long, unsigned long);
+static void do_signal(struct pt_regs *, struct switch_stack *,
+                     unsigned long, unsigned long);
 
 
 /*
@@ -146,11 +146,9 @@ sys_rt_sigaction(int sig, const struct sigaction __user *act,
 asmlinkage int
 do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
 {
-       sigset_t oldset;
-
        mask &= _BLOCKABLE;
        spin_lock_irq(&current->sighand->siglock);
-       oldset = current->blocked;
+       current->saved_sigmask = current->blocked;
        siginitset(&current->blocked, mask);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
@@ -160,19 +158,17 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
        regs->r0 = EINTR;
        regs->r19 = 1;
 
-       while (1) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule();
-               if (do_signal(&oldset, regs, sw, 0, 0))
-                       return -EINTR;
-       }
+       current->state = TASK_INTERRUPTIBLE;
+       schedule();
+       set_thread_flag(TIF_RESTORE_SIGMASK);
+       return -ERESTARTNOHAND;
 }
 
 asmlinkage int
 do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
                 struct pt_regs *regs, struct switch_stack *sw)
 {
-       sigset_t oldset, set;
+       sigset_t set;
 
        /* XXX: Don't preclude handling different sized sigset_t's.  */
        if (sigsetsize != sizeof(sigset_t))
@@ -182,7 +178,7 @@ do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
 
        sigdelsetmask(&set, ~_BLOCKABLE);
        spin_lock_irq(&current->sighand->siglock);
-       oldset = current->blocked;
+       current->saved_sigmask = current->blocked;
        current->blocked = set;
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
@@ -192,12 +188,10 @@ do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
        regs->r0 = EINTR;
        regs->r19 = 1;
 
-       while (1) {
-               current->state = TASK_INTERRUPTIBLE;
-               schedule();
-               if (do_signal(&oldset, regs, sw, 0, 0))
-                       return -EINTR;
-       }
+       current->state = TASK_INTERRUPTIBLE;
+       schedule();
+       set_thread_flag(TIF_RESTORE_SIGMASK);
+       return -ERESTARTNOHAND;
 }
 
 asmlinkage int
@@ -436,7 +430,7 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
        return err;
 }
 
-static void
+static int
 setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
            struct pt_regs *regs, struct switch_stack * sw)
 {
@@ -481,13 +475,14 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
                current->comm, current->pid, frame, regs->pc, regs->r26);
 #endif
 
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
-static void
+static int
 setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
               sigset_t *set, struct pt_regs *regs, struct switch_stack * sw)
 {
@@ -543,34 +538,38 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                current->comm, current->pid, frame, regs->pc, regs->r26);
 #endif
 
-       return;
+       return 0;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return -EFAULT;
 }
 
 
 /*
  * OK, we're invoking a handler.
  */
-static inline void
+static inline int
 handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
              sigset_t *oldset, struct pt_regs * regs, struct switch_stack *sw)
 {
+       int ret;
+
        if (ka->sa.sa_flags & SA_SIGINFO)
-               setup_rt_frame(sig, ka, info, oldset, regs, sw);
+               ret = setup_rt_frame(sig, ka, info, oldset, regs, sw);
        else
-               setup_frame(sig, ka, oldset, regs, sw);
+               ret = setup_frame(sig, ka, oldset, regs, sw);
 
-       if (ka->sa.sa_flags & SA_RESETHAND)
-               ka->sa.sa_handler = SIG_DFL;
+       if (ret == 0) {
+               spin_lock_irq(&current->sighand->siglock);
+               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+               if (!(ka->sa.sa_flags & SA_NODEFER)) 
+                       sigaddset(&current->blocked,sig);
+               recalc_sigpending();
+               spin_unlock_irq(&current->sighand->siglock);
+       }
 
-       spin_lock_irq(&current->sighand->siglock);
-       sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-       if (!(ka->sa.sa_flags & SA_NODEFER)) 
-               sigaddset(&current->blocked,sig);
-       recalc_sigpending();
-       spin_unlock_irq(&current->sighand->siglock);
+       return ret;
 }
 
 static inline void
@@ -611,30 +610,42 @@ syscall_restart(unsigned long r0, unsigned long r19,
  * restart. "r0" is also used as an indicator whether we can restart at
  * all (if we get here from anything but a syscall return, it will be 0)
  */
-static int
-do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw,
+static void
+do_signal(struct pt_regs * regs, struct switch_stack * sw,
          unsigned long r0, unsigned long r19)
 {
        siginfo_t info;
        int signr;
        unsigned long single_stepping = ptrace_cancel_bpt(current);
        struct k_sigaction ka;
+       sigset_t *oldset;
 
-       if (!oldset)
+       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+               oldset = &current->saved_sigmask;
+       else
                oldset = &current->blocked;
 
        /* This lets the debugger run, ... */
        signr = get_signal_to_deliver(&info, &ka, regs, NULL);
+
        /* ... so re-check the single stepping. */
        single_stepping |= ptrace_cancel_bpt(current);
 
        if (signr > 0) {
                /* Whee!  Actually deliver the signal.  */
-               if (r0) syscall_restart(r0, r19, regs, &ka);
-               handle_signal(signr, &ka, &info, oldset, regs, sw);
+               if (r0)
+                       syscall_restart(r0, r19, regs, &ka);
+               if (handle_signal(signr, &ka, &info, oldset, regs, sw) == 0) {
+                       /* A signal was successfully delivered, and the
+                          saved sigmask was stored on the signal frame,
+                          and will be restored by sigreturn.  So we can
+                          simply clear the restore sigmask flag.  */
+                       if (test_thread_flag(TIF_RESTORE_SIGMASK))
+                               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               }
                if (single_stepping) 
                        ptrace_set_bpt(current); /* re-set bpt */
-               return 1;
+               return;
        }
 
        if (r0) {
@@ -654,17 +665,22 @@ do_signal(sigset_t *oldset, struct pt_regs * regs, struct switch_stack * sw,
                        break;
                }
        }
+
+       /* If there's no signal to deliver, we just restore the saved mask.  */
+       if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
+               clear_thread_flag(TIF_RESTORE_SIGMASK);
+               sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
+       }
+
        if (single_stepping)
                ptrace_set_bpt(current);        /* re-set breakpoint */
-
-       return 0;
 }
 
 void
-do_notify_resume(sigset_t *oldset, struct pt_regs *regs,
-                struct switch_stack *sw, unsigned long r0,
-                unsigned long r19, unsigned long thread_info_flags)
+do_notify_resume(struct pt_regs *regs, struct switch_stack *sw,
+                unsigned long thread_info_flags,
+                unsigned long r0, unsigned long r19)
 {
-       if (thread_info_flags & _TIF_SIGPENDING)
-               do_signal(oldset, regs, sw, r0, r19);
+       if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
+               do_signal(regs, sw, r0, r19);
 }
index 85d2f933dd07b0b8d9ca88f13646e302d13e1328..c71b0fd7a61f8748b857463c03854006ec5b91a1 100644 (file)
@@ -543,6 +543,7 @@ dp264_init_pci(void)
 {
        common_init_pci();
        SMC669_Init(0);
+       locate_and_init_vga(NULL);
 }
 
 static void __init
@@ -551,6 +552,14 @@ monet_init_pci(void)
        common_init_pci();
        SMC669_Init(1);
        es1888_init();
+       locate_and_init_vga(NULL);
+}
+
+static void __init
+clipper_init_pci(void)
+{
+       common_init_pci();
+       locate_and_init_vga(NULL);
 }
 
 static void __init
@@ -655,7 +664,7 @@ struct alpha_machine_vector clipper_mv __initmv = {
        .init_arch              = tsunami_init_arch,
        .init_irq               = clipper_init_irq,
        .init_rtc               = common_init_rtc,
-       .init_pci               = common_init_pci,
+       .init_pci               = clipper_init_pci,
        .kill_arch              = tsunami_kill_arch,
        .pci_map_irq            = clipper_map_irq,
        .pci_swizzle            = common_swizzle,
index e349f03b830e9c96826646877006e640dcf0edad..0bcb968cb60a72b7a71b99d98947a53882f620be 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/core_marvel.h>
 #include <asm/hwrpb.h>
 #include <asm/tlbflush.h>
+#include <asm/vga.h>
 
 #include "proto.h"
 #include "err_impl.h"
@@ -412,10 +413,7 @@ marvel_init_pci(void)
 
        pci_probe_only = 1;
        common_init_pci();
-
-#ifdef CONFIG_VGA_HOSE
        locate_and_init_vga(NULL);
-#endif
 
        /* Clear any io7 errors.  */
        for (io7 = NULL; (io7 = marvel_next_io7(io7)) != NULL; ) 
index f009b7bc094310da51ff2f154df86911e01d24cc..1d3c1398c428d324d42f67b4fc24284831278b2b 100644 (file)
@@ -331,9 +331,7 @@ titan_init_pci(void)
        pci_probe_only = 1;
        common_init_pci();
        SMC669_Init(0);
-#ifdef CONFIG_VGA_HOSE
        locate_and_init_vga(NULL);
-#endif
 }
 
 \f
index f6cfe8ce3f966b68cd5827c215eca6df94ffc57e..79de99e32c35f91ad2fcebc0ab8513bc5fd612d7 100644 (file)
@@ -465,6 +465,38 @@ sys_call_table:
        .quad sys_inotify_init
        .quad sys_inotify_add_watch             /* 445 */
        .quad sys_inotify_rm_watch
+       .quad sys_fdatasync
+       .quad sys_kexec_load
+       .quad sys_migrate_pages
+       .quad sys_openat                        /* 450 */
+       .quad sys_mkdirat
+       .quad sys_mknodat
+       .quad sys_fchownat
+       .quad sys_futimesat
+       .quad sys_fstatat64                     /* 455 */
+       .quad sys_unlinkat
+       .quad sys_renameat
+       .quad sys_linkat
+       .quad sys_symlinkat
+       .quad sys_readlinkat                    /* 460 */
+       .quad sys_fchmodat
+       .quad sys_faccessat
+       .quad sys_pselect6
+       .quad sys_ppoll
+       .quad sys_unshare                       /* 465 */
+       .quad sys_set_robust_list
+       .quad sys_get_robust_list
+       .quad sys_splice
+       .quad sys_sync_file_range
+       .quad sys_tee                           /* 470 */
+       .quad sys_vmsplice
+       .quad sys_move_pages
+       .quad sys_getcpu
+       .quad sys_epoll_pwait
+       .quad sys_utimensat                     /* 475 */
+       .quad sys_signalfd
+       .quad sys_timerfd
+       .quad sys_eventfd
 
        .size sys_call_table, . - sys_call_table
        .type sys_call_table, @object
index ea098f3b629f166c703720f65cf358429d10cf03..266f78e130766f5dc3ad1c1af261d368a92ef610 100644 (file)
@@ -37,7 +37,8 @@ lib-y =       __divqu.o __remqu.o __divlu.o __remlu.o \
        $(ev6-y)clear_page.o \
        $(ev6-y)copy_page.o \
        fpreg.o \
-       callback_srm.o srm_puts.o srm_printk.o
+       callback_srm.o srm_puts.o srm_printk.o \
+       fls.o
 
 lib-$(CONFIG_SMP) += dec_and_lock.o
 
diff --git a/arch/alpha/lib/fls.c b/arch/alpha/lib/fls.c
new file mode 100644 (file)
index 0000000..7ad84ea
--- /dev/null
@@ -0,0 +1,38 @@
+/* 
+ * arch/alpha/lib/fls.c
+ */
+
+#include <linux/module.h>
+#include <asm/bitops.h>
+
+/* This is fls(x)-1, except zero is held to zero.  This allows most
+   efficent input into extbl, plus it allows easy handling of fls(0)=0.  */
+
+const unsigned char __flsm1_tab[256] = 
+{
+  0,
+  0,
+  1, 1,
+  2, 2, 2, 2,
+  3, 3, 3, 3, 3, 3, 3, 3,
+  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+  6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+  7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
+};
+
+EXPORT_SYMBOL(__flsm1_tab);
index 9179e82203142bec7678ab20051b52590549396a..f73d62e8ab606473b4cc69e4f25775493f3a8af8 100644 (file)
@@ -57,7 +57,7 @@ extern void fp_enter(void);
 #define EXPORT_SYMBOL_ALIAS(sym,orig)          \
  EXPORT_CRC_ALIAS(sym)                         \
  static const struct kernel_symbol __ksymtab_##sym     \
-  __attribute_used__ __attribute__((section("__ksymtab"))) =   \
+  __used __attribute__((section("__ksymtab"))) =       \
     { (unsigned long)&orig, #sym };
 
 /*
index 8b63ad89d0a815c2cde57f138b951bffba33471a..ae31deb2d0653a6a8fe57b000fb2827de9acdf13 100644 (file)
@@ -13,7 +13,7 @@ int walk_stackframe(unsigned long fp, unsigned long low, unsigned long high,
                /*
                 * Check current frame pointer is within bounds
                 */
-               if ((fp - 12) < low || fp + 4 >= high)
+               if (fp < (low + 12) || fp + 4 >= high)
                        break;
 
                frame = (struct stackframe *)(fp - 12);
index 6043c38c0a9e84b6063d52111cb9c9b2173b8eb6..af497896a96ce761dcb6a45281a7148e1c7e3bd6 100644 (file)
@@ -132,7 +132,7 @@ static struct mtd_partition __initdata dk_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(dk_nand_partition);
        return dk_nand_partition;
index 76f6e1e553eaeabc252b1f4e60d9ba86b59101db..7d9b1a278fd63feb961e3ff21466952bae530dd2 100644 (file)
@@ -96,7 +96,7 @@ static struct mtd_partition __initdata kb9202_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(kb9202_nand_partition);
        return kb9202_nand_partition;
index 1f0c8a400b3a6c219dc981d9b84fba471559bbd9..26ca8ab3f62a7dc3df8f620178cf2695614ce44e 100644 (file)
@@ -178,7 +178,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(ek_nand_partition);
        return ek_nand_partition;
index f57458559fb66da229df4273f2aebf56f79739dd..c164c8e58ae6a037cdfbbf4b9b5a9842b9b094e2 100644 (file)
@@ -180,7 +180,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(ek_nand_partition);
        return ek_nand_partition;
index 30c79aca84d420f2b67eb0da8393ce9c01395d2c..9b61320f295aca158355be2ad7ead7596a2cb385 100644 (file)
@@ -87,7 +87,7 @@ static struct mtd_partition __initdata ek_nand_partition[] = {
        },
 };
 
-static struct mtd_partition *nand_partitions(int size, int *num_partitions)
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
 {
        *num_partitions = ARRAY_SIZE(ek_nand_partition);
        return ek_nand_partition;
index 4f984fde7375fc867d865bfae26ed53668c93f0c..35eb232a649a2b11aae684fdc169e3cf69fcefd2 100644 (file)
@@ -45,7 +45,7 @@ static struct hw_pci cats_pci __initdata = {
        .postinit               = dc21285_postinit,
 };
 
-static int cats_pci_init(void)
+static int __init cats_pci_init(void)
 {
        if (machine_is_cats())
                pci_common_init(&cats_pci);
index 7a7fa51ec62c11882e8833c94368536e3c77be2d..1c474cf709ca9b4a4241a112fceba2c1560244ea 100644 (file)
@@ -201,7 +201,6 @@ void __init imx_set_mmc_info(struct imxmmc_platform_data *info)
 {
        imx_mmc_device.dev.platform_data = info;
 }
-EXPORT_SYMBOL(imx_set_mmc_info);
 
 static struct imxfb_mach_info imx_fb_info;
 
index 0fdd03ab36e6c4cbbcfd7da57a7cb8c4d8684c68..ce7c15c73004e6e9a353abb66f04946cdc660f03 100644 (file)
@@ -164,7 +164,7 @@ int __init ixdp2400_pci_init(void)
 
 subsys_initcall(ixdp2400_pci_init);
 
-void ixdp2400_init_irq(void)
+void __init ixdp2400_init_irq(void)
 {
        ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS);
 }
index 70d247f09a7ecebe5451f4290efdea4c362b0bbb..14f09b80ab77180977da17826c0b8b8170203862 100644 (file)
@@ -279,7 +279,7 @@ int __init ixdp2800_pci_init(void)
 
 subsys_initcall(ixdp2800_pci_init);
 
-void ixdp2800_init_irq(void)
+void __init ixdp2800_init_irq(void)
 {
        ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2800_NR_IRQS);
 }
index 011065b967b45db3080d8e6dfe45d8546853755e..73c651e83d92e5fe98dd2b1ecaa0f7c15c402a2e 100644 (file)
@@ -145,7 +145,7 @@ static struct irq_chip ixdp2x00_cpld_irq_chip = {
        .unmask = ixdp2x00_irq_unmask
 };
 
-void ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs)
+void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_irqs)
 {
        unsigned int irq;
 
index 7a86a2516eaa57e30fc74c7330116fbff53bb02d..c41a6b5a0accbe986eafbbbf50f603c5c203e669 100644 (file)
@@ -124,7 +124,7 @@ static struct irq_chip ixdp2351_intb_chip = {
        .unmask = ixdp2351_intb_unmask
 };
 
-void ixdp2351_init_irq(void)
+void __init ixdp2351_init_irq(void)
 {
        int irq;
 
index ac7d43d23c28f1f35d6dd5abc62adee1dee95e0b..227f808dc0ecc8a52723d1003ed30d9c014907e9 100644 (file)
@@ -284,7 +284,7 @@ int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys)
        return 1;
 }
 
-void ixp23xx_pci_slave_init(void)
+void __init ixp23xx_pci_slave_init(void)
 {
        ixp23xx_pci_common_init();
 }
index d06e21b70de57e4e9c627489a762fd0bf3a543cb..e35644961aa442d9766a168088bee79713bd3151 100644 (file)
@@ -110,7 +110,7 @@ static int __init roadrunner_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
        return NO_IRQ;
 }
 
-static void roadrunner_pci_preinit(void)
+static void __init roadrunner_pci_preinit(void)
 {
        set_irq_type(IRQ_ROADRUNNER_PCI_INTC, IRQT_LOW);
        set_irq_type(IRQ_ROADRUNNER_PCI_INTD, IRQT_LOW);
index 9715ef506c24b363f09164ac2cde59c4acba9e92..060909870b505b582ee4a2ee684cdd9ddd311e67 100644 (file)
@@ -104,9 +104,6 @@ config MACH_DSMG600
          DSM-G600 RevA device. For more information on this platform,
          see http://www.nslu2-linux.org/wiki/DSMG600/HomePage
 
-#
-# Avila and IXDP share the same source for now. Will change in future
-#
 config ARCH_IXDP4XX
        bool
        depends on ARCH_IXDP425 || MACH_IXDP465 || MACH_KIXRP435
index 64685da1462d644c35dbc66434f07cdb105a9e23..8112f726ffa0885e2edd505b3a0e17ad5e925b0f 100644 (file)
@@ -283,7 +283,7 @@ static struct irqaction ixp4xx_timer_irq = {
        .handler        = ixp4xx_timer_interrupt,
 };
 
-static void __init ixp4xx_timer_init(void)
+void __init ixp4xx_timer_init(void)
 {
        /* Reset/disable counter */
        *IXP4XX_OSRT1 = 0;
index 7bc94f3def1c8dc8d3b882de548747ced6c99c79..ad2e5b97966ecfbb221d6260489f320c5e64e087 100644 (file)
 
 #include <asm/mach/pci.h>
 
-extern void ixp4xx_pci_preinit(void);
-extern int ixp4xx_setup(int nr, struct pci_sys_data *sys);
-extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys);
-
 void __init coyote_pci_preinit(void)
 {
        set_irq_type(IRQ_COYOTE_PCI_SLOT0, IRQT_LOW);
index 1caff65e22cc398ce5df87f87c64ea0207418e34..1e75e105c4f7fe4638d6da3d6224b6b79a6a811a 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
+#include <asm/mach/time.h>
 
 static struct flash_platform_data dsmg600_flash_data = {
        .map_name               = "cfi_probe",
@@ -128,6 +129,19 @@ static void dsmg600_power_off(void)
        gpio_line_set(DSMG600_PO_GPIO, IXP4XX_GPIO_HIGH);
 }
 
+static void __init dsmg600_timer_init(void)
+{
+    /* The xtal on this machine is non-standard. */
+    ixp4xx_timer_freq = DSMG600_FREQ;
+
+    /* Call standard timer_init function. */
+    ixp4xx_timer_init();
+}
+
+static struct sys_timer dsmg600_timer = {
+    .init   = dsmg600_timer_init,
+};
+
 static void __init dsmg600_init(void)
 {
        ixp4xx_sys_init();
@@ -155,21 +169,13 @@ static void __init dsmg600_init(void)
 #endif
 }
 
-static void __init dsmg600_fixup(struct machine_desc *desc,
-                struct tag *tags, char **cmdline, struct meminfo *mi)
-{
-       /* The xtal on this machine is non-standard. */
-        ixp4xx_timer_freq = DSMG600_FREQ;
-}
-
 MACHINE_START(DSMG600, "D-Link DSM-G600 RevA")
        /* Maintainer: www.nslu2-linux.org */
        .phys_io        = IXP4XX_PERIPHERAL_BASE_PHYS,
        .io_pg_offst    = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xFFFC,
        .boot_params    = 0x00000100,
-       .fixup          = dsmg600_fixup,
        .map_io         = ixp4xx_map_io,
        .init_irq       = ixp4xx_init_irq,
-       .timer          = &ixp4xx_timer,
+       .timer          = &dsmg600_timer,
        .init_machine   = dsmg600_init,
 MACHINE_END
index 509a95a692a419b569a8514bc08cb87434f39031..d1e75b7dc3b1a1263ed545c3f3a43dace8037a60 100644 (file)
 
 #include <asm/mach/pci.h>
 
-extern void ixp4xx_pci_preinit(void);
-extern int ixp4xx_setup(int nr, struct pci_sys_data *sys);
-extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys);
-
 void __init ixdpg425_pci_preinit(void)
 {
        set_irq_type(IRQ_IXP4XX_GPIO6, IRQT_LOW);
index 9a31444d9214e82aea76b803c6bff835ce187829..78a17413ceca702549b1b6a0d7720bef782c6f67 100644 (file)
@@ -155,7 +155,8 @@ static void __init nas100d_init(void)
 
        pm_power_off = nas100d_power_off;
 
-       /* This is only useful on a modified machine, but it is valuable
+       /*
+        * This is only useful on a modified machine, but it is valuable
         * to have it first in order to see debug messages, and so that
         * it does *not* get removed if platform_add_devices fails!
         */
index 162c266e5f8fb8ff3883f4df29ddc69c7f80e3ab..9bf8ccbcaccfd009baa0c07da854e38cbda96010 100644 (file)
@@ -22,6 +22,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
+#include <asm/mach/time.h>
 
 static struct flash_platform_data nslu2_flash_data = {
        .map_name               = "cfi_probe",
@@ -49,26 +50,26 @@ static struct ixp4xx_i2c_pins nslu2_i2c_gpio_pins = {
 static struct resource nslu2_led_resources[] = {
        {
                .name           = "ready",  /* green led */
-               .start          = NSLU2_LED_GRN,
-               .end            = NSLU2_LED_GRN,
+               .start          = NSLU2_LED_GRN_GPIO,
+               .end            = NSLU2_LED_GRN_GPIO,
                .flags          = IXP4XX_GPIO_HIGH,
        },
        {
                .name           = "status", /* red led */
-               .start          = NSLU2_LED_RED,
-               .end            = NSLU2_LED_RED,
+               .start          = NSLU2_LED_RED_GPIO,
+               .end            = NSLU2_LED_RED_GPIO,
                .flags          = IXP4XX_GPIO_HIGH,
        },
        {
                .name           = "disk-1",
-               .start          = NSLU2_LED_DISK1,
-               .end            = NSLU2_LED_DISK1,
+               .start          = NSLU2_LED_DISK1_GPIO,
+               .end            = NSLU2_LED_DISK1_GPIO,
                .flags          = IXP4XX_GPIO_LOW,
        },
        {
                .name           = "disk-2",
-               .start          = NSLU2_LED_DISK2,
-               .end            = NSLU2_LED_DISK2,
+               .start          = NSLU2_LED_DISK2_GPIO,
+               .end            = NSLU2_LED_DISK2_GPIO,
                .flags          = IXP4XX_GPIO_LOW,
        },
 };
@@ -157,10 +158,21 @@ static void nslu2_power_off(void)
        gpio_line_set(NSLU2_PO_GPIO, IXP4XX_GPIO_HIGH);
 }
 
-static void __init nslu2_init(void)
+static void __init nslu2_timer_init(void)
 {
-       ixp4xx_timer_freq = NSLU2_FREQ;
+    /* The xtal on this machine is non-standard. */
+    ixp4xx_timer_freq = NSLU2_FREQ;
+
+    /* Call standard timer_init function. */
+    ixp4xx_timer_init();
+}
 
+static struct sys_timer nslu2_timer = {
+    .init   = nslu2_timer_init,
+};
+
+static void __init nslu2_init(void)
+{
        ixp4xx_sys_init();
 
        nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
@@ -169,7 +181,8 @@ static void __init nslu2_init(void)
 
        pm_power_off = nslu2_power_off;
 
-       /* This is only useful on a modified machine, but it is valuable
+       /*
+        * This is only useful on a modified machine, but it is valuable
         * to have it first in order to see debug messages, and so that
         * it does *not* get removed if platform_add_devices fails!
         */
@@ -185,6 +198,6 @@ MACHINE_START(NSLU2, "Linksys NSLU2")
        .boot_params    = 0x00000100,
        .map_io         = ixp4xx_map_io,
        .init_irq       = ixp4xx_init_irq,
-       .timer          = &ixp4xx_timer,
+       .timer          = &nslu2_timer,
        .init_machine   = nslu2_init,
 MACHINE_END
diff --git a/arch/arm/mach-s3c2410/bast.h b/arch/arm/mach-s3c2410/bast.h
deleted file mode 100644 (file)
index e985437..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-/* linux/arch/arm/mach-s3c2410/bast.h
-extern void bast_init_irq(void);
index bc308ceb91c31788c972b97b262dd72f3709f0dd..435adcce6482a369e5898de40bfc4bdfb690a6e1 100644 (file)
@@ -160,7 +160,7 @@ static struct platform_device *amlm5900_devices[] __initdata = {
 #endif
 };
 
-void __init amlm5900_map_io(void)
+static void __init amlm5900_map_io(void)
 {
        s3c24xx_init_io(amlm5900_iodesc, ARRAY_SIZE(amlm5900_iodesc));
        s3c24xx_init_clocks(0);
index c602aa39f9c4080671a6525c4e4cd2ecbde7d475..782b5814ced24411f356a4566c8f19265de3601b 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/list.h>
 #include <linux/timer.h>
 #include <linux/init.h>
+#include <linux/delay.h>
 #include <linux/sysdev.h>
 #include <linux/serial_core.h>
 #include <linux/platform_device.h>
@@ -29,6 +30,7 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
+#include <asm/arch/reset.h>
 #include <asm/arch/idle.h>
 
 #include <asm/arch/regs-clock.h>
@@ -38,6 +40,7 @@
 #include <asm/arch/regs-gpioj.h>
 #include <asm/arch/regs-dsc.h>
 #include <asm/arch/regs-spi.h>
+#include <asm/arch/regs-s3c2412.h>
 
 #include <asm/plat-s3c24xx/s3c2412.h>
 #include <asm/plat-s3c24xx/cpu.h>
@@ -106,6 +109,23 @@ static void s3c2412_idle(void)
        cpu_do_idle();
 }
 
+static void s3c2412_hard_reset(void)
+{
+       /* errata "Watch-dog/Software Reset Problem" specifies that
+        * this reset must be done with the SYSCLK sourced from
+        * EXTCLK instead of FOUT to avoid a glitch in the reset
+        * mechanism.
+        *
+        * See the watchdog section of the S3C2412 manual for more
+        * information on this fix.
+        */
+
+       __raw_writel(0x00, S3C2412_CLKSRC);
+       __raw_writel(S3C2412_SWRST_RESET, S3C2412_SWRST);
+
+       mdelay(1);
+}
+
 /* s3c2412_map_io
  *
  * register the standard cpu IO areas, and any passed in from the
@@ -122,6 +142,10 @@ void __init s3c2412_map_io(struct map_desc *mach_desc, int mach_size)
 
        s3c24xx_idle = s3c2412_idle;
 
+       /* set custom reset hook */
+
+       s3c24xx_reset_hook = s3c2412_hard_reset;
+
        /* register our io-tables */
 
        iotable_init(s3c2412_iodesc, ARRAY_SIZE(s3c2412_iodesc));
index 5955efb5de8d8b4af1032ef739e2ca67c6d2ee82..58402948c47cd6c9a7099ef1ec233577ed18f833 100644 (file)
@@ -394,7 +394,7 @@ static int s3c2443_setrate_usbhost(struct clk *clk, unsigned long rate)
        return 0;
 }
 
-struct clk clk_usb_bus_host = {
+static struct clk clk_usb_bus_host = {
        .name           = "usb-bus-host-parent",
        .id             = -1,
        .parent         = &clk_esysclk,
@@ -758,7 +758,6 @@ static struct clk init_clocks[] = {
                .parent         = &clk_h,
                .enable         = s3c2443_clkcon_enable_h,
                .ctrlbit        = S3C2443_HCLKCON_CFC,
-               .ctrlbit        = S3C2443_HCLKCON_HSMMC,
        }, {
                .name           = "ssmc",
                .id             = -1,
index d7c038a0256bf9cfd82d9ea7d2b9f7e1676897a3..4cbf9468f654c970b226262c7e1d4a481436f9c5 100644 (file)
@@ -139,12 +139,12 @@ static u_int neponset_get_mctrl(struct uart_port *port)
        return ret;
 }
 
-static struct sa1100_port_fns neponset_port_fns __initdata = {
+static struct sa1100_port_fns neponset_port_fns __devinitdata = {
        .set_mctrl      = neponset_set_mctrl,
        .get_mctrl      = neponset_get_mctrl,
 };
 
-static int neponset_probe(struct platform_device *dev)
+static int __devinit neponset_probe(struct platform_device *dev)
 {
        sa1100_register_uart_fns(&neponset_port_fns);
 
index 5f472a8b406a554dc0033a6dedba517f8192c247..e7904bc92c73f846abda2b872f3c3e86139c0cfd 100644 (file)
@@ -379,7 +379,7 @@ config CPU_V7
        select CPU_CP15_MMU
        select CPU_HAS_ASID
        select CPU_COPY_V6 if MMU
-       select CPU_TLB_V6 if MMU
+       select CPU_TLB_V7 if MMU
 
 # Figure out what processor architecture version we should be using.
 # This defines the compiler instruction set which depends on the machine type.
@@ -498,6 +498,9 @@ config CPU_TLB_V4WBI
 config CPU_TLB_V6
        bool
 
+config CPU_TLB_V7
+       bool
+
 endif
 
 config CPU_HAS_ASID
index b5bd335ff14aad48f44331c0c17e5462f38d433d..762702765fc3f03d4e3c30ea52cb9cf0b0673793 100644 (file)
@@ -46,6 +46,7 @@ obj-$(CONFIG_CPU_TLB_V4WT)    += tlb-v4.o
 obj-$(CONFIG_CPU_TLB_V4WB)     += tlb-v4wb.o
 obj-$(CONFIG_CPU_TLB_V4WBI)    += tlb-v4wbi.o
 obj-$(CONFIG_CPU_TLB_V6)       += tlb-v6.o
+obj-$(CONFIG_CPU_TLB_V7)       += tlb-v7.o
 
 obj-$(CONFIG_CPU_ARM610)       += proc-arm6_7.o
 obj-$(CONFIG_CPU_ARM710)       += proc-arm6_7.o
index 36440c899583b9131143e9fc30a54fb8b9be70ab..074b7cb0774349d6a51e7c4d210e472a892c4e01 100644 (file)
@@ -630,7 +630,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 
        fs = get_fs();
        set_fs(KERNEL_DS);
-       if thumb_mode(regs) {
+       if (thumb_mode(regs)) {
                fault = __get_user(tinstr, (u16 *)(instrptr & ~1));
                if (!(fault))
                        instr = thumb2arm(tinstr);
index dd823dd4a374545031a11fd890bb8344411b8a14..718f4782ee8b943e14d6a4bb6dc9f515ff9c47b4 100644 (file)
@@ -256,7 +256,7 @@ __v7_proc_info:
        .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
        .long   cpu_v7_name
        .long   v7_processor_functions
-       .long   v6wbi_tlb_fns
+       .long   v7wbi_tlb_fns
        .long   v6_user_fns
        .long   v7_cache_fns
        .size   __v7_proc_info, . - __v7_proc_info
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S
new file mode 100644 (file)
index 0000000..b56dda8
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ *  linux/arch/arm/mm/tlb-v7.S
+ *
+ *  Copyright (C) 1997-2002 Russell King
+ *  Modified for ARMv7 by Catalin Marinas
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  ARM architecture version 6 TLB handling functions.
+ *  These assume a split I/D TLB.
+ */
+#include <linux/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/page.h>
+#include <asm/tlbflush.h>
+#include "proc-macros.S"
+
+/*
+ *     v7wbi_flush_user_tlb_range(start, end, vma)
+ *
+ *     Invalidate a range of TLB entries in the specified address space.
+ *
+ *     - start - start address (may not be aligned)
+ *     - end   - end address (exclusive, may not be aligned)
+ *     - vma   - vma_struct describing address range
+ *
+ *     It is assumed that:
+ *     - the "Invalidate single entry" instruction will invalidate
+ *       both the I and the D TLBs on Harvard-style TLBs
+ */
+ENTRY(v7wbi_flush_user_tlb_range)
+       vma_vm_mm r3, r2                        @ get vma->vm_mm
+       mmid    r3, r3                          @ get vm_mm->context.id
+       dsb
+       mov     r0, r0, lsr #PAGE_SHIFT         @ align address
+       mov     r1, r1, lsr #PAGE_SHIFT
+       asid    r3, r3                          @ mask ASID
+       orr     r0, r3, r0, lsl #PAGE_SHIFT     @ Create initial MVA
+       mov     r1, r1, lsl #PAGE_SHIFT
+       vma_vm_flags r2, r2                     @ get vma->vm_flags
+1:
+       mcr     p15, 0, r0, c8, c6, 1           @ TLB invalidate D MVA (was 1)
+       tst     r2, #VM_EXEC                    @ Executable area ?
+       mcrne   p15, 0, r0, c8, c5, 1           @ TLB invalidate I MVA (was 1)
+       add     r0, r0, #PAGE_SZ
+       cmp     r0, r1
+       blo     1b
+       mov     ip, #0
+       mcr     p15, 0, ip, c7, c5, 6           @ flush BTAC/BTB
+       dsb
+       mov     pc, lr
+
+/*
+ *     v7wbi_flush_kern_tlb_range(start,end)
+ *
+ *     Invalidate a range of kernel TLB entries
+ *
+ *     - start - start address (may not be aligned)
+ *     - end   - end address (exclusive, may not be aligned)
+ */
+ENTRY(v7wbi_flush_kern_tlb_range)
+       dsb
+       mov     r0, r0, lsr #PAGE_SHIFT         @ align address
+       mov     r1, r1, lsr #PAGE_SHIFT
+       mov     r0, r0, lsl #PAGE_SHIFT
+       mov     r1, r1, lsl #PAGE_SHIFT
+1:
+       mcr     p15, 0, r0, c8, c6, 1           @ TLB invalidate D MVA
+       mcr     p15, 0, r0, c8, c5, 1           @ TLB invalidate I MVA
+       add     r0, r0, #PAGE_SZ
+       cmp     r0, r1
+       blo     1b
+       mov     r2, #0
+       mcr     p15, 0, r2, c7, c5, 6           @ flush BTAC/BTB
+       dsb
+       isb
+       mov     pc, lr
+
+       .section ".text.init", #alloc, #execinstr
+
+       .type   v7wbi_tlb_fns, #object
+ENTRY(v7wbi_tlb_fns)
+       .long   v7wbi_flush_user_tlb_range
+       .long   v7wbi_flush_kern_tlb_range
+       .long   v6wbi_tlb_flags
+       .size   v7wbi_tlb_fns, . - v7wbi_tlb_fns
index 0a3067452cd29767544cc4b3198d7eabc0a32b7c..260fe29d73f576d4e6d8df64420c3ed8eb8f283f 100644 (file)
@@ -273,4 +273,7 @@ static inline flag float64_lt_nocheck(float64 a, float64 b)
 extern flag float32_is_nan( float32 a );
 extern flag float64_is_nan( float64 a );
 
+extern int32 float64_to_uint32( struct roundingData *roundData, float64 a );
+extern int32 float64_to_uint32_round_to_zero( float64 a );
+
 #endif
index 898500718249dc59da11a9b76359c0e72481c3a0..7791da791f5f936cb54c7d1f7cf38832652007e5 100644 (file)
@@ -257,8 +257,13 @@ static void em_stop(void)
  */
 static void em_route_irq(int irq, unsigned int cpu)
 {
-       irq_desc[irq].affinity = cpumask_of_cpu(cpu);
-       irq_desc[irq].chip->set_affinity(irq, cpumask_of_cpu(cpu));
+       struct irq_desc *desc = irq_desc + irq;
+       cpumask_t mask = cpumask_of_cpu(cpu);
+
+       spin_lock_irq(&desc->lock);
+       desc->affinity = mask;
+       desc->chip->set_affinity(irq, mask);
+       spin_unlock_irq(&desc->lock);
 }
 
 static int em_setup(void)
index 11ba75a05220bc7cfefe8febcbfd19b7c29b9315..de7688cfd573e6f73373b754efc1aecbcdf5571c 100644 (file)
@@ -288,9 +288,9 @@ asmlinkage void syscall_print(void *dummy,...)
 int kernel_execve(const char *filename, char *const argv[], char *const envp[])
 {
        register long res __asm__("er0");
+       register char *const *_c __asm__("er3") = envp;
+       register char *const *_b __asm__("er2") = argv;
        register const char * _a __asm__("er1") = filename;
-       register void *_b __asm__("er2") = argv;
-       register void *_c __asm__("er3") = envp;
        __asm__ __volatile__ ("mov.l %1,er0\n\t"
                        "trapa  #0\n\t"
                        : "=r" (res)
index 300e3279ca5abb5b25c3afab13fd8748dba41382..f97183011c2cb501ccf6cb07de9d12a87e00d93a 100644 (file)
@@ -136,7 +136,7 @@ void show_stack(struct task_struct *task, unsigned long *esp)
        printk("\nCall Trace:");
        i = 0;
        stack = esp;
-       while (((unsigned long)stack & (THREAD_SIZE - 1)) == 0) {
+       while (((unsigned long)stack & (THREAD_SIZE - 1)) != 0) {
                addr = *stack++;
                /*
                 * If the address is either in the text segment of the
index 83f825f2e2d7db0ee5b5a002d78792219fb64b8f..d865d041bea1dc7c25d9a8e1eaa63f54c6812ea0 100644 (file)
@@ -478,7 +478,7 @@ static int __init microcode_dev_init (void)
        return 0;
 }
 
-static void __exit microcode_dev_exit (void)
+static void microcode_dev_exit (void)
 {
        misc_deregister(&microcode_dev);
 }
index 50dfc65319cda0392ae1c79152d148b694fa7c86..5513f8d5b5becff34c9e77cceb77835aeb90b0ec 100644 (file)
@@ -89,6 +89,14 @@ static int __init set_bios_reboot(struct dmi_system_id *d)
 }
 
 static struct dmi_system_id __initdata reboot_dmi_table[] = {
+       {       /* Handle problems with rebooting on Dell E520's */
+               .callback = set_bios_reboot,
+               .ident = "Dell E520",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM061"),
+               },
+       },
        {       /* Handle problems with rebooting on Dell 1300's */
                .callback = set_bios_reboot,
                .ident = "Dell PowerEdge 1300",
index 08f07a74a9d3753184ab7a3096697eaac4d2cb98..88baed1e7e83a1469ecc33f1ed5e6e1c17a00af4 100644 (file)
@@ -943,10 +943,9 @@ exit:
 
 static void smp_tune_scheduling(void)
 {
-       unsigned long cachesize;       /* kB   */
-
        if (cpu_khz) {
-               cachesize = boot_cpu_data.x86_cache_size;
+               /* cache size in kB */
+               long cachesize = boot_cpu_data.x86_cache_size;
 
                if (cachesize > 0)
                        max_cache_size = cachesize * 1024;
index c8726c424b3549a2b45aaa839dc21a3d464769ba..c12720d7cbc50b8b0bc0804ba19df993128a574d 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/bootmem.h>
 #include <linux/mm.h>
 #include <linux/highmem.h>
+#include <linux/sched.h>
 #include <asm/vmi.h>
 #include <asm/io.h>
 #include <asm/fixmap.h>
index a7c0783b269a5ecaf9d74feaa4d8b8350291a7df..11b7a51566a8cb4715dc606bf82534e374a210c8 100644 (file)
@@ -154,7 +154,7 @@ static int allocate_msrs(void)
        size_t counters_size = sizeof(struct op_msr) * model->num_counters;
 
        int i;
-       for_each_online_cpu(i) {
+       for_each_possible_cpu(i) {
                cpu_msrs[i].counters = kmalloc(counters_size, GFP_KERNEL);
                if (!cpu_msrs[i].counters) {
                        success = 0;
@@ -211,8 +211,14 @@ static int nmi_setup(void)
        /* Assume saved/restored counters are the same on all CPUs */
        model->fill_in_addresses(&cpu_msrs[0]);
        for_each_possible_cpu (cpu) {
-               if (cpu != 0)
-                       cpu_msrs[cpu] = cpu_msrs[0];
+               if (cpu != 0) {
+                       memcpy(cpu_msrs[cpu].counters, cpu_msrs[0].counters,
+                               sizeof(struct op_msr) * model->num_counters);
+
+                       memcpy(cpu_msrs[cpu].controls, cpu_msrs[0].controls,
+                               sizeof(struct op_msr) * model->num_controls);
+               }
+
        }
        on_each_cpu(nmi_save_registers, NULL, 0, 1);
        on_each_cpu(nmi_cpu_setup, NULL, 0, 1);
index b62eafb997bce2b1bf4dcd379ef06ca954bceae7..b95b42950ed447d2774fe2aac9e6e66830d91960 100644 (file)
@@ -436,3 +436,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
                        pci_early_fixup_cyrix_5530);
 DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
                        pci_early_fixup_cyrix_5530);
+
+/*
+ * Siemens Nixdorf AG FSC Multiprocessor Interrupt Controller:
+ * prevent update of the BAR0, which doesn't look like a normal BAR.
+ */
+static void __devinit pci_siemens_interrupt_controller(struct pci_dev *dev)
+{
+       dev->resource[0].flags |= IORESOURCE_PCI_FIXED;
+}
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015,
+                         pci_siemens_interrupt_controller);
index b8536c7c0877577541f1a7ab0b977f29a44b82b0..85cdd23b0447e2dafd1ed517a2a2cd66910da365 100644 (file)
@@ -355,8 +355,9 @@ config RMW_INSNS
          adventurous.
 
 config SINGLE_MEMORY_CHUNK
-       bool "Use one physical chunk of memory only"
-       depends on ADVANCED && !SUN3
+       bool "Use one physical chunk of memory only" if ADVANCED && !SUN3
+       default y if SUN3
+       select NEED_MULTIPLE_NODES
        help
          Ignore all but the first contiguous chunk of physical memory for VM
          purposes.  This will save a few bytes kernel size and may speed up
@@ -377,6 +378,14 @@ config 060_WRITETHROUGH
          is hardwired on.  The 53c710 SCSI driver is known to suffer from
          this problem.
 
+config ARCH_DISCONTIGMEM_ENABLE
+       def_bool !SINGLE_MEMORY_CHUNK
+
+config NODES_SHIFT
+       int
+       default "3"
+       depends on !SINGLE_MEMORY_CHUNK
+
 source "mm/Kconfig"
 
 endmenu
index c20831a7e1a9e1a064261ab861d5ea960ea322a9..aa383a5ea7acbcd34191e77867a3f969c5635c48 100644 (file)
@@ -19,6 +19,7 @@ COMPILE_ARCH = $(shell uname -m)
 # override top level makefile
 AS += -m68020
 LDFLAGS := -m m68kelf
+LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
 ifneq ($(COMPILE_ARCH),$(ARCH))
        # prefix for cross-compiling binaries
        CROSS_COMPILE = m68k-linux-gnu-
index 0b68ab8d63d1d5a120f9e4403b317ecdbfd71308..a806208c7fb5fadea24701d9d7b4dab68582aee6 100644 (file)
@@ -9,13 +9,12 @@ else
 endif
 extra-y        += vmlinux.lds
 
-obj-y  := entry.o process.o traps.o ints.o signal.o ptrace.o \
+obj-y  := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
           sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o
 
 devres-y = ../../../kernel/irq/devres.o
 
 obj-$(CONFIG_PCI)      += bios32.o
-obj-$(CONFIG_MODULES)  += module.o
 obj-y$(CONFIG_MMU_SUN3) += dma.o       # no, it's not a typo
 
 EXTRA_AFLAGS := -traditional
index 3b1a2ff61ddcf18846fc108859e964a6d28110fd..774862bc6977297c0099c4bdfa96980820dcf1df 100644 (file)
@@ -1,3 +1,9 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive
+ * for more details.
+ */
+
 #include <linux/moduleloader.h>
 #include <linux/elf.h>
 #include <linux/vmalloc.h>
@@ -11,6 +17,8 @@
 #define DEBUGP(fmt...)
 #endif
 
+#ifdef CONFIG_MODULES
+
 void *module_alloc(unsigned long size)
 {
        if (size == 0)
@@ -118,11 +126,32 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
 
 int module_finalize(const Elf_Ehdr *hdr,
                    const Elf_Shdr *sechdrs,
-                   struct module *me)
+                   struct module *mod)
 {
+       module_fixup(mod, mod->arch.fixup_start, mod->arch.fixup_end);
+
        return 0;
 }
 
 void module_arch_cleanup(struct module *mod)
 {
 }
+
+#endif /* CONFIG_MODULES */
+
+void module_fixup(struct module *mod, struct m68k_fixup_info *start,
+                 struct m68k_fixup_info *end)
+{
+       struct m68k_fixup_info *fixup;
+
+       for (fixup = start; fixup < end; fixup++) {
+               switch (fixup->type) {
+               case m68k_fixup_memoffset:
+                       *(u32 *)fixup->addr = m68k_memoffset;
+                       break;
+               case m68k_fixup_vnode_shift:
+                       *(u16 *)fixup->addr += m68k_virt_to_node_shift;
+                       break;
+               }
+       }
+}
diff --git a/arch/m68k/kernel/module.lds b/arch/m68k/kernel/module.lds
new file mode 100644 (file)
index 0000000..fda94fa
--- /dev/null
@@ -0,0 +1,7 @@
+SECTIONS {
+       .m68k_fixup : {
+               __start_fixup = .;
+               *(.m68k_fixup)
+               __stop_fixup = .;
+       }
+}
index 610319356691d2fda4d8796cbcdffa3b9e18b3e7..215c7bd43924f43a21ce8b55d90ef3acc54e6da2 100644 (file)
@@ -60,14 +60,12 @@ extern unsigned long availmem;
 int m68k_num_memory;
 int m68k_realnum_memory;
 EXPORT_SYMBOL(m68k_realnum_memory);
-#ifdef CONFIG_SINGLE_MEMORY_CHUNK
 unsigned long m68k_memoffset;
 EXPORT_SYMBOL(m68k_memoffset);
-#endif
 struct mem_info m68k_memory[NUM_MEMINFO];
 EXPORT_SYMBOL(m68k_memory);
 
-static struct mem_info m68k_ramdisk;
+struct mem_info m68k_ramdisk;
 
 static char m68k_command_line[CL_SIZE];
 
@@ -208,9 +206,6 @@ static void __init m68k_parse_bootinfo(const struct bi_record *record)
 void __init setup_arch(char **cmdline_p)
 {
        extern int _etext, _edata, _end;
-#ifndef CONFIG_SUN3
-       unsigned long endmem, startmem;
-#endif
        int i;
 
        /* The bootinfo is located right after the kernel bss */
@@ -320,30 +315,16 @@ void __init setup_arch(char **cmdline_p)
                panic("No configuration setup");
        }
 
-#ifndef CONFIG_SUN3
-       startmem= m68k_memory[0].addr;
-       endmem = startmem + m68k_memory[0].size;
-       high_memory = (void *)PAGE_OFFSET;
-       for (i = 0; i < m68k_num_memory; i++) {
-               m68k_memory[i].size &= MASK_256K;
-               if (m68k_memory[i].addr < startmem)
-                       startmem = m68k_memory[i].addr;
-               if (m68k_memory[i].addr+m68k_memory[i].size > endmem)
-                       endmem = m68k_memory[i].addr+m68k_memory[i].size;
-               high_memory += m68k_memory[i].size;
-       }
-
-       availmem += init_bootmem_node(NODE_DATA(0), availmem >> PAGE_SHIFT,
-                                     startmem >> PAGE_SHIFT, endmem >> PAGE_SHIFT);
-
-       for (i = 0; i < m68k_num_memory; i++)
-               free_bootmem(m68k_memory[i].addr, m68k_memory[i].size);
-
-       reserve_bootmem(m68k_memory[0].addr, availmem - m68k_memory[0].addr);
+       paging_init();
 
+#ifndef CONFIG_SUN3
+       for (i = 1; i < m68k_num_memory; i++)
+               free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
+                                 m68k_memory[i].size);
 #ifdef CONFIG_BLK_DEV_INITRD
        if (m68k_ramdisk.size) {
-               reserve_bootmem(m68k_ramdisk.addr, m68k_ramdisk.size);
+               reserve_bootmem_node(__virt_to_node(phys_to_virt(m68k_ramdisk.addr)),
+                                    m68k_ramdisk.addr, m68k_ramdisk.size);
                initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr);
                initrd_end = initrd_start + m68k_ramdisk.size;
                printk("initrd: %08lx - %08lx\n", initrd_start, initrd_end);
@@ -362,8 +343,6 @@ void __init setup_arch(char **cmdline_p)
 
 #endif /* !CONFIG_SUN3 */
 
-       paging_init();
-
 /* set ISA defs early as possible */
 #if defined(CONFIG_ISA) && defined(MULTI_ISA)
 #if defined(CONFIG_Q40)
index 78f139226a1ba1dee2fce98e7c1e7a7ee2e3af3c..40f02b128f22bb3a62ebce9d66349f3f78dc7fdc 100644 (file)
@@ -60,6 +60,11 @@ SECTIONS
   __con_initcall_start = .;
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
+  .m68k_fixup : {
+       __start_fixup = .;
+       *(.m68k_fixup)
+       __stop_fixup = .;
+  }
   SECURITY_INIT
 #ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(8192);
index c8999b2db23b01f86f0aff8d269b78894147f623..f06425b6d20643a9fc32d74bfdc5af6c3487a394 100644 (file)
@@ -54,6 +54,11 @@ __init_begin = .;
        __con_initcall_start = .;
        .con_initcall.init : { *(.con_initcall.init) }
        __con_initcall_end = .;
+       .m68k_fixup : {
+               __start_fixup = .;
+               *(.m68k_fixup)
+               __stop_fixup = .;
+       }
        SECURITY_INIT
 #ifdef CONFIG_BLK_DEV_INITRD
        . = ALIGN(8192);
index 7a5bed5bdc574d11a29daaa65a859655a2ede48f..e8a57138b4a6e54980247110f56c7310a32dad4f 100644 (file)
@@ -71,7 +71,7 @@ void mac_debugging_short(int pos, short num)
 
        /* calculate current offset */
        pengoffset = (unsigned char *)mac_videobase +
-               (150+line*2) * mac_rowbytes) + 80 * peng;
+               (150+line*2) * mac_rowbytes + 80 * peng;
 
        pptr = pengoffset;
 
index ab90213e5c54030bb1872b68e3342c31c0fb40b7..f1de19e1dde66f50317db6f7a40992fdba481f2f 100644 (file)
@@ -7,6 +7,7 @@
  *  to motorola.c and sun3mmu.c
  */
 
+#include <linux/module.h>
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
+static bootmem_data_t __initdata bootmem_data[MAX_NUMNODES];
+
+pg_data_t pg_data_map[MAX_NUMNODES];
+EXPORT_SYMBOL(pg_data_map);
+
+int m68k_virt_to_node_shift;
+
+#ifndef CONFIG_SINGLE_MEMORY_CHUNK
+pg_data_t *pg_data_table[65];
+EXPORT_SYMBOL(pg_data_table);
+#endif
+
+void m68k_setup_node(int node)
+{
+#ifndef CONFIG_SINGLE_MEMORY_CHUNK
+       struct mem_info *info = m68k_memory + node;
+       int i, end;
+
+       i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift();
+       end = (unsigned long)phys_to_virt(info->addr + info->size - 1) >> __virt_to_node_shift();
+       for (; i <= end; i++) {
+               if (pg_data_table[i])
+                       printk("overlap at %u for chunk %u\n", i, node);
+               pg_data_table[i] = pg_data_map + node;
+       }
+#endif
+       pg_data_map[node].bdata = bootmem_data + node;
+       node_set_online(node);
+}
+
+
 /*
  * ZERO_PAGE is a special page that is used for zero-initialized
  * data and COW.
@@ -40,52 +72,51 @@ void *empty_zero_page;
 
 void show_mem(void)
 {
-    unsigned long i;
-    int free = 0, total = 0, reserved = 0, shared = 0;
-    int cached = 0;
-
-    printk("\nMem-info:\n");
-    show_free_areas();
-    printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-    i = max_mapnr;
-    while (i-- > 0) {
-       total++;
-       if (PageReserved(mem_map+i))
-           reserved++;
-       else if (PageSwapCache(mem_map+i))
-           cached++;
-       else if (!page_count(mem_map+i))
-           free++;
-       else
-           shared += page_count(mem_map+i) - 1;
-    }
-    printk("%d pages of RAM\n",total);
-    printk("%d free pages\n",free);
-    printk("%d reserved pages\n",reserved);
-    printk("%d pages shared\n",shared);
-    printk("%d pages swap cached\n",cached);
+       pg_data_t *pgdat;
+       int free = 0, total = 0, reserved = 0, shared = 0;
+       int cached = 0;
+       int i;
+
+       printk("\nMem-info:\n");
+       show_free_areas();
+       printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
+       for_each_online_pgdat(pgdat) {
+               for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       struct page *page = pgdat->node_mem_map + i;
+                       total++;
+                       if (PageReserved(page))
+                               reserved++;
+                       else if (PageSwapCache(page))
+                               cached++;
+                       else if (!page_count(page))
+                               free++;
+                       else
+                               shared += page_count(page) - 1;
+               }
+       }
+       printk("%d pages of RAM\n",total);
+       printk("%d free pages\n",free);
+       printk("%d reserved pages\n",reserved);
+       printk("%d pages shared\n",shared);
+       printk("%d pages swap cached\n",cached);
 }
 
 extern void init_pointer_table(unsigned long ptable);
 
 /* References to section boundaries */
 
-extern char _text, _etext, _edata, __bss_start, _end;
-extern char __init_begin, __init_end;
+extern char _text[], _etext[];
+extern char __init_begin[], __init_end[];
 
 extern pmd_t *zero_pgtable;
 
 void __init mem_init(void)
 {
+       pg_data_t *pgdat;
        int codepages = 0;
        int datapages = 0;
        int initpages = 0;
-       unsigned long tmp;
-#ifndef CONFIG_SUN3
        int i;
-#endif
-
-       max_mapnr = num_physpages = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT);
 
 #ifdef CONFIG_ATARI
        if (MACH_IS_ATARI)
@@ -93,19 +124,25 @@ void __init mem_init(void)
 #endif
 
        /* this will put all memory onto the freelists */
-       totalram_pages = free_all_bootmem();
-
-       for (tmp = PAGE_OFFSET ; tmp < (unsigned long)high_memory; tmp += PAGE_SIZE) {
-               if (PageReserved(virt_to_page(tmp))) {
-                       if (tmp >= (unsigned long)&_text
-                           && tmp < (unsigned long)&_etext)
+       totalram_pages = num_physpages = 0;
+       for_each_online_pgdat(pgdat) {
+               num_physpages += pgdat->node_present_pages;
+
+               totalram_pages += free_all_bootmem_node(pgdat);
+               for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       struct page *page = pgdat->node_mem_map + i;
+                       char *addr = page_to_virt(page);
+
+                       if (!PageReserved(page))
+                               continue;
+                       if (addr >= _text &&
+                           addr < _etext)
                                codepages++;
-                       else if (tmp >= (unsigned long) &__init_begin
-                                && tmp < (unsigned long) &__init_end)
+                       else if (addr >= __init_begin &&
+                                addr < __init_end)
                                initpages++;
                        else
                                datapages++;
-                       continue;
                }
        }
 
@@ -124,7 +161,7 @@ void __init mem_init(void)
 
        printk("Memory: %luk/%luk available (%dk kernel code, %dk data, %dk init)\n",
               (unsigned long)nr_free_pages() << (PAGE_SHIFT-10),
-              max_mapnr << (PAGE_SHIFT-10),
+              totalram_pages << (PAGE_SHIFT-10),
               codepages << (PAGE_SHIFT-10),
               datapages << (PAGE_SHIFT-10),
               initpages << (PAGE_SHIFT-10));
index 13c0b4ad01eb5977384b333a7f761303bfa1b56c..b7473525b43179fa9066d3a1d978120f1caac164 100644 (file)
@@ -127,67 +127,6 @@ int free_pointer_table (pmd_t *ptable)
        return 0;
 }
 
-#ifdef DEBUG_INVALID_PTOV
-int mm_inv_cnt = 5;
-#endif
-
-#ifndef CONFIG_SINGLE_MEMORY_CHUNK
-/*
- * The following two routines map from a physical address to a kernel
- * virtual address and vice versa.
- */
-unsigned long mm_vtop(unsigned long vaddr)
-{
-       int i=0;
-       unsigned long voff = (unsigned long)vaddr - PAGE_OFFSET;
-
-       do {
-               if (voff < m68k_memory[i].size) {
-#ifdef DEBUGPV
-                       printk ("VTOP(%p)=%lx\n", vaddr,
-                               m68k_memory[i].addr + voff);
-#endif
-                       return m68k_memory[i].addr + voff;
-               }
-               voff -= m68k_memory[i].size;
-       } while (++i < m68k_num_memory);
-
-       /* As a special case allow `__pa(high_memory)'.  */
-       if (voff == 0)
-               return m68k_memory[i-1].addr + m68k_memory[i-1].size;
-
-       return -1;
-}
-EXPORT_SYMBOL(mm_vtop);
-
-unsigned long mm_ptov (unsigned long paddr)
-{
-       int i = 0;
-       unsigned long poff, voff = PAGE_OFFSET;
-
-       do {
-               poff = paddr - m68k_memory[i].addr;
-               if (poff < m68k_memory[i].size) {
-#ifdef DEBUGPV
-                       printk ("PTOV(%lx)=%lx\n", paddr, poff + voff);
-#endif
-                       return poff + voff;
-               }
-               voff += m68k_memory[i].size;
-       } while (++i < m68k_num_memory);
-
-#ifdef DEBUG_INVALID_PTOV
-       if (mm_inv_cnt > 0) {
-               mm_inv_cnt--;
-               printk("Invalid use of phys_to_virt(0x%lx) at 0x%p!\n",
-                       paddr, __builtin_return_address(0));
-       }
-#endif
-       return -1;
-}
-EXPORT_SYMBOL(mm_ptov);
-#endif
-
 /* invalidate page in both caches */
 static inline void clear040(unsigned long paddr)
 {
@@ -354,15 +293,3 @@ void cache_push (unsigned long paddr, int len)
 }
 EXPORT_SYMBOL(cache_push);
 
-#ifndef CONFIG_SINGLE_MEMORY_CHUNK
-int mm_end_of_chunk (unsigned long addr, int len)
-{
-       int i;
-
-       for (i = 0; i < m68k_num_memory; i++)
-               if (m68k_memory[i].addr + m68k_memory[i].size == addr + len)
-                       return 1;
-       return 0;
-}
-EXPORT_SYMBOL(mm_end_of_chunk);
-#endif
index afcccdc6ad45db38b9b656b08cd5e5e7f3a2e95d..7d571a2b44dd0bd2d61e6d3dcc9239146fe5d4c4 100644 (file)
@@ -43,6 +43,11 @@ unsigned long mm_cachebits;
 EXPORT_SYMBOL(mm_cachebits);
 #endif
 
+/* size of memory already mapped in head.S */
+#define INIT_MAPPED_SIZE       (4UL<<20)
+
+extern unsigned long availmem;
+
 static pte_t * __init kernel_page_table(void)
 {
        pte_t *ptablep;
@@ -98,19 +103,20 @@ static pmd_t * __init kernel_ptr_table(void)
        return last_pgtable;
 }
 
-static unsigned long __init
-map_chunk (unsigned long addr, long size)
+static void __init map_node(int node)
 {
 #define PTRTREESIZE (256*1024)
 #define ROOTTREESIZE (32*1024*1024)
-       static unsigned long virtaddr = PAGE_OFFSET;
-       unsigned long physaddr;
+       unsigned long physaddr, virtaddr, size;
        pgd_t *pgd_dir;
        pmd_t *pmd_dir;
        pte_t *pte_dir;
 
-       physaddr = (addr | m68k_supervisor_cachemode |
-                   _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
+       size = m68k_memory[node].size;
+       physaddr = m68k_memory[node].addr;
+       virtaddr = (unsigned long)phys_to_virt(physaddr);
+       physaddr |= m68k_supervisor_cachemode |
+                   _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY;
        if (CPU_IS_040_OR_060)
                physaddr |= _PAGE_GLOBAL040;
 
@@ -190,8 +196,6 @@ map_chunk (unsigned long addr, long size)
 #ifdef DEBUG
        printk("\n");
 #endif
-
-       return virtaddr;
 }
 
 /*
@@ -200,15 +204,16 @@ map_chunk (unsigned long addr, long size)
  */
 void __init paging_init(void)
 {
-       int chunk;
-       unsigned long mem_avail = 0;
        unsigned long zones_size[MAX_NR_ZONES] = { 0, };
+       unsigned long min_addr, max_addr;
+       unsigned long addr, size, end;
+       int i;
 
 #ifdef DEBUG
        {
                extern unsigned long availmem;
-               printk ("start of paging_init (%p, %lx, %lx, %lx)\n",
-                       kernel_pg_dir, availmem, start_mem, end_mem);
+               printk ("start of paging_init (%p, %lx)\n",
+                       kernel_pg_dir, availmem);
        }
 #endif
 
@@ -222,24 +227,62 @@ void __init paging_init(void)
                        pgprot_val(protection_map[i]) |= _PAGE_CACHE040;
        }
 
+       min_addr = m68k_memory[0].addr;
+       max_addr = min_addr + m68k_memory[0].size;
+       for (i = 1; i < m68k_num_memory;) {
+               if (m68k_memory[i].addr < min_addr) {
+                       printk("Ignoring memory chunk at 0x%lx:0x%lx before the first chunk\n",
+                               m68k_memory[i].addr, m68k_memory[i].size);
+                       printk("Fix your bootloader or use a memfile to make use of this area!\n");
+                       m68k_num_memory--;
+                       memmove(m68k_memory + i, m68k_memory + i + 1,
+                               (m68k_num_memory - i) * sizeof(struct mem_info));
+                       continue;
+               }
+               addr = m68k_memory[i].addr + m68k_memory[i].size;
+               if (addr > max_addr)
+                       max_addr = addr;
+               i++;
+       }
+       m68k_memoffset = min_addr - PAGE_OFFSET;
+       m68k_virt_to_node_shift = fls(max_addr - min_addr - 1) - 6;
+
+       module_fixup(NULL, __start_fixup, __stop_fixup);
+       flush_icache();
+
+       high_memory = phys_to_virt(max_addr);
+
+       min_low_pfn = availmem >> PAGE_SHIFT;
+       max_low_pfn = max_addr >> PAGE_SHIFT;
+
+       for (i = 0; i < m68k_num_memory; i++) {
+               addr = m68k_memory[i].addr;
+               end = addr + m68k_memory[i].size;
+               m68k_setup_node(i);
+               availmem = PAGE_ALIGN(availmem);
+               availmem += init_bootmem_node(NODE_DATA(i),
+                                             availmem >> PAGE_SHIFT,
+                                             addr >> PAGE_SHIFT,
+                                             end >> PAGE_SHIFT);
+       }
+
        /*
         * Map the physical memory available into the kernel virtual
-        * address space.  It may allocate some memory for page
-        * tables and thus modify availmem.
+        * address space. First initialize the bootmem allocator with
+        * the memory we already mapped, so map_node() has something
+        * to allocate.
         */
+       addr = m68k_memory[0].addr;
+       size = m68k_memory[0].size;
+       free_bootmem_node(NODE_DATA(0), availmem, min(INIT_MAPPED_SIZE, size) - (availmem - addr));
+       map_node(0);
+       if (size > INIT_MAPPED_SIZE)
+               free_bootmem_node(NODE_DATA(0), addr + INIT_MAPPED_SIZE, size - INIT_MAPPED_SIZE);
 
-       for (chunk = 0; chunk < m68k_num_memory; chunk++) {
-               mem_avail = map_chunk (m68k_memory[chunk].addr,
-                                      m68k_memory[chunk].size);
-
-       }
+       for (i = 1; i < m68k_num_memory; i++)
+               map_node(i);
 
        flush_tlb_all();
-#ifdef DEBUG
-       printk ("memory available is %ldKB\n", mem_avail >> 10);
-       printk ("start_mem is %#lx\nvirtual_end is %#lx\n",
-               start_mem, end_mem);
-#endif
 
        /*
         * initialize the bad page table and bad page to point
@@ -256,14 +299,11 @@ void __init paging_init(void)
 #ifdef DEBUG
        printk ("before free_area_init\n");
 #endif
-       zones_size[ZONE_DMA] = (mach_max_dma_address < (unsigned long)high_memory ?
-                               (mach_max_dma_address+1) : (unsigned long)high_memory);
-       zones_size[ZONE_NORMAL] = (unsigned long)high_memory - zones_size[0];
-
-       zones_size[ZONE_DMA] = (zones_size[ZONE_DMA] - PAGE_OFFSET) >> PAGE_SHIFT;
-       zones_size[ZONE_NORMAL] >>= PAGE_SHIFT;
-
-       free_area_init(zones_size);
+       for (i = 0; i < m68k_num_memory; i++) {
+               zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
+               free_area_init_node(i, pg_data_map + i, zones_size,
+                                   m68k_memory[i].addr >> PAGE_SHIFT, NULL);
+       }
 }
 
 extern char __init_begin, __init_end;
index 4851b8437a87f69d1d6ab9659d534819d367aca7..c0fbd278fbb151e30821a66bb25b4c902f2573ee 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/contregs.h>
 #include <asm/movs.h>
 #include <asm/pgtable.h>
+#include <asm/pgalloc.h>
 #include <asm/sun3-head.h>
 #include <asm/sun3mmu.h>
 #include <asm/rtc.h>
@@ -127,6 +128,7 @@ void __init sun3_bootmem_alloc(unsigned long memory_start, unsigned long memory_
        high_memory = (void *)memory_end;
        availmem = memory_start;
 
+       m68k_setup_node(0);
        availmem += init_bootmem_node(NODE_DATA(0), start_page, 0, num_pages);
        availmem = (availmem + (PAGE_SIZE-1)) & PAGE_MASK;
 
index 2604f2c9a96e0c89359553ec747e25a65d78da89..342579cfdc01d3b37ca739b96c862753734cc202 100644 (file)
@@ -36,7 +36,7 @@
 #define TIMEOUT       0xffffff
 
 static int remoteDebugInitialized = 0;
-static void debugInit(int baud)
+static void debugInit(int baud);
 
 int putDebugChar(unsigned char c)
 {
index 7f94f26d35ae054abc028298e6aacc77321486c1..1421d34535efecf29475c631492010480feb4942 100644 (file)
@@ -71,19 +71,19 @@ static inline void pci0WriteConfigReg(unsigned int offset, unsigned int data)
 }
 
 static struct resource ocelot_mem_resource = {
-       start   = GT_PCI_MEM_BASE;
-       end     = GT_PCI_MEM_BASE + GT_PCI_MEM_BASE - 1;
+       .start  = GT_PCI_MEM_BASE,
+       .end    = GT_PCI_MEM_BASE + GT_PCI_MEM_BASE - 1,
 };
 
 static struct resource ocelot_io_resource = {
-       start   = GT_PCI_IO_BASE;
-       end     = GT_PCI_IO_BASE + GT_PCI_IO_SIZE - 1;
+       .start  = GT_PCI_IO_BASE,
+       .end    = GT_PCI_IO_BASE + GT_PCI_IO_SIZE - 1,
 };
 
 static struct pci_controller ocelot_pci_controller = {
-       .pci_ops        = gt64xxx_pci0_ops;
-       .mem_resource   = &ocelot_mem_resource;
-       .io_resource    = &ocelot_io_resource;
+       .pci_ops        = gt64xxx_pci0_ops,
+       .mem_resource   = &ocelot_mem_resource,
+       .io_resource    = &ocelot_io_resource,
 };
 
 static int __init ocelot_pcibios_init(void)
index 56d3c0dcd2b802f8c5f4a4dd2847c15f8f0ca864..5eaeafd30bdfe2710b7e35f325fee9692b751d44 100644 (file)
@@ -118,6 +118,7 @@ config GENERIC_BUG
        depends on BUG
 
 config SYS_SUPPORTS_APM_EMULATION
+       default y if PMAC_APM_EMU
        bool
 
 config DEFAULT_UIMAGE
index eae68ab1177f77660e00a8cc31e97f71b7a48719..d29308fe4c24d35e4fefd9ecff0e45c1a965b904 100644 (file)
@@ -67,7 +67,7 @@
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        device_type = "interrupt-controller";
-                       compatible = "mpc5200_pic";
+                       compatible = "mpc5200-pic";
                        reg = <500 80>;
                        built-in;
                };
index 5185625a9419d1304e9c5c7b6a43abd989de7bea..f242531f04514a56668e0f3ea525e086e442fb5b 100644 (file)
@@ -67,7 +67,7 @@
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        device_type = "interrupt-controller";
-                       compatible = "mpc5200b-pic\0mpc5200_pic";
+                       compatible = "mpc5200b-pic\0mpc5200-pic";
                        reg = <500 80>;
                        built-in;
                };
index d8232b7a08f70043e45246e3c8018b093c7e37cc..f6ae1a57d652999c679545ae21fd5b6499cfae58 100644 (file)
@@ -93,7 +93,7 @@ void pgd_free(pgd_t *pgd)
        free_pages((unsigned long)pgd, PGDIR_ORDER);
 }
 
-pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+__init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
 {
        pte_t *pte;
        extern int mem_init_done;
index 71045677559a6b0f7deed4da21e66b925b9a2fed..5bcc58d9a4dd39ad451785b36ad00d1ecb8e3e70 100644 (file)
@@ -169,7 +169,7 @@ static int Enable_SRAM(void)
 
 /***********/
 /***********/
-int mv643xx_eth_add_pds(void)
+static int __init mv643xx_eth_add_pds(void)
 {
        int ret = 0;
        static struct pci_device_id pci_marvell_mv64360[] = {
index a410bc76a8a8ee5cc4bb2226a0906e37e7054329..07b1c4ec428d590daa4882638118dbee161a343c 100644 (file)
@@ -384,7 +384,7 @@ int boot_part;
 static dev_t boot_dev;
 
 #ifdef CONFIG_SCSI
-void __init note_scsi_host(struct device_node *node, void *host)
+void note_scsi_host(struct device_node *node, void *host)
 {
        int l;
        char *p;
index 887739f3badc6a18ed203c9af86e25a4a9185368..f611d344a126e5dc05dd6a913859b5a97d486abc 100644 (file)
@@ -5,15 +5,13 @@
 config UCC_SLOW
        bool
        default n
-       select UCC
        help
          This option provides qe_lib support to UCC slow
          protocols: UART, BISYNC, QMC
 
 config UCC_FAST
        bool
-       default n
-       select UCC
+       default y if UCC_GETH
        help
          This option provides qe_lib support to UCC fast
          protocols: HDLC, Ethernet, ATM, transparent
index ab64256110bd2ab2547d34f359877b40874b0717..fba7ca17a67e1565cdb8cb83628f828b7640b77d 100644 (file)
@@ -596,7 +596,11 @@ fast_exception_return:
        mr      r12,r4          /* restart at exc_exit_restart */
        b       2b
 
-       .comm   fee_restarts,4
+       .section .bss
+       .align  2
+fee_restarts:
+       .space  4
+       .previous
 
 /* aargh, a nonrecoverable interrupt, panic */
 /* aargh, we don't know which trap this is */
@@ -851,7 +855,11 @@ load_dbcr0:
        mtspr   SPRN_DBSR,r11   /* clear all pending debug events */
        blr
 
-       .comm   global_dbcr0,8
+       .section .bss
+       .align  4
+global_dbcr0:
+       .space  8
+       .previous
 #endif /* !(CONFIG_4xx || CONFIG_BOOKE) */
 
 do_work:                       /* r10 contains MSR_KERNEL here */
@@ -926,4 +934,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_601)
        /* shouldn't return */
        b       4b
 
-       .comm   ee_restarts,4
+       .section .bss
+       .align  2
+ee_restarts:
+       .space  4
+       .previous
index 4ad499605d056b2ce07e31f1ce25db4f7f9b0cbd..a4165209ac7cd738499087a71cb74c92336f6d0d 100644 (file)
@@ -40,7 +40,6 @@
 #include <asm/time.h>
 #include <asm/cputable.h>
 #include <asm/btext.h>
-#include <asm/div64.h>
 #include <asm/xmon.h>
 #include <asm/signal.h>
 #include <asm/dcr.h>
@@ -93,7 +92,6 @@ EXPORT_SYMBOL(strncpy);
 EXPORT_SYMBOL(strcat);
 EXPORT_SYMBOL(strlen);
 EXPORT_SYMBOL(strcmp);
-EXPORT_SYMBOL(__div64_32);
 
 EXPORT_SYMBOL(csum_partial);
 EXPORT_SYMBOL(csum_partial_copy_generic);
index e756942e65c40fe482f3f223321938ffc9103f65..5f364dc501549bc41ab5a9a079c98529953234e3 100644 (file)
 #include <asm/asm-offsets.h>
 
 #ifdef CONFIG_SMP
-       .comm   mmu_hash_lock,4
+       .section .bss
+       .align  2
+       .globl mmu_hash_lock
+mmu_hash_lock:
+       .space  4
 #endif /* CONFIG_SMP */
 
 /*
@@ -461,9 +465,17 @@ found_slot:
        sync            /* make sure pte updates get to memory */
        blr
 
-       .comm   next_slot,4
-       .comm   primary_pteg_full,4
-       .comm   htab_hash_searches,4
+       .section .bss
+       .align  2
+next_slot:
+       .space  4
+       .globl primary_pteg_full
+primary_pteg_full:
+       .space  4
+       .globl htab_hash_searches
+htab_hash_searches:
+       .space  4
+       .previous
 
 /*
  * Flush the entry for a particular page from the hash table.
index c023b7298809b282639168eb2125f4e9d3218de0..35ebb6395ae3329d5117d4d0611d21e60d12a361 100644 (file)
@@ -92,7 +92,7 @@ void pgd_free(pgd_t *pgd)
        free_pages((unsigned long)pgd, PGDIR_ORDER);
 }
 
-pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
+__init_refok pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
 {
        pte_t *pte;
        extern int mem_init_done;
index 2782cf9da5b47b2057d20314e4af604183c01196..b9a1ce1f28e488e25ab251350316475f1f114395 100644 (file)
@@ -481,9 +481,17 @@ out:
 
 /* Diagnose 224 functions */
 
-static void diag224(void *ptr)
+static int diag224(void *ptr)
 {
-       asm volatile("diag %0,%1,0x224" : :"d" (0), "d"(ptr) : "memory");
+       int rc = -ENOTSUPP;
+
+       asm volatile(
+               "       diag    %1,%2,0x224\n"
+               "0:     lhi     %0,0x0\n"
+               "1:\n"
+               EX_TABLE(0b,1b)
+               : "+d" (rc) :"d" (0), "d" (ptr) : "memory");
+       return rc;
 }
 
 static int diag224_get_name_table(void)
@@ -492,7 +500,10 @@ static int diag224_get_name_table(void)
        diag224_cpu_names = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA);
        if (!diag224_cpu_names)
                return -ENOMEM;
-       diag224(diag224_cpu_names);
+       if (diag224(diag224_cpu_names)) {
+               kfree(diag224_cpu_names);
+               return -ENOTSUPP;
+       }
        EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16);
        return 0;
 }
index dca6eaf82c80859a847802a1d6e975e8682a7691..1b2f5ce45320967275e3da19d6d33d43707e1a21 100644 (file)
@@ -163,7 +163,7 @@ unsigned int debug_feature_version = __DEBUG_FEATURE_VERSION;
 
 static debug_info_t *debug_area_first = NULL;
 static debug_info_t *debug_area_last = NULL;
-static DECLARE_MUTEX(debug_lock);
+static DEFINE_MUTEX(debug_mutex);
 
 static int initialized;
 
@@ -576,7 +576,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length,
        int rc = 0;
        file_private_info_t *p_info;
 
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        p_info = ((file_private_info_t *) file->private_data);
        if (p_info->view->input_proc)
                rc = p_info->view->input_proc(p_info->debug_info_org,
@@ -584,7 +584,7 @@ debug_input(struct file *file, const char __user *user_buf, size_t length,
                                              length, offset);
        else
                rc = -EPERM;
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
        return rc;              /* number of input characters */
 }
 
@@ -602,7 +602,7 @@ debug_open(struct inode *inode, struct file *file)
        file_private_info_t *p_info;
        debug_info_t *debug_info, *debug_info_snapshot;
 
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        debug_info = file->f_path.dentry->d_inode->i_private;
        /* find debug view */
        for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
@@ -653,7 +653,7 @@ found:
        file->private_data = p_info;
        debug_info_get(debug_info);
 out:
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
        return rc;
 }
 
@@ -688,7 +688,7 @@ debug_register (char *name, int pages_per_area, int nr_areas, int buf_size)
 
        if (!initialized)
                BUG();
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
 
         /* create new debug_info */
 
@@ -702,7 +702,7 @@ out:
         if (!rc){
                printk(KERN_ERR "debug: debug_register failed for %s\n",name);
         }
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
        return rc;
 }
 
@@ -716,9 +716,9 @@ debug_unregister(debug_info_t * id)
 {
        if (!id)
                goto out;
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        debug_info_put(id);
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
 
 out:
        return;
@@ -1054,11 +1054,11 @@ __init debug_init(void)
        int rc = 0;
 
        s390dbf_sysctl_header = register_sysctl_table(s390dbf_dir_table);
-       down(&debug_lock);
+       mutex_lock(&debug_mutex);
        debug_debugfs_root_entry = debugfs_create_dir(DEBUG_DIR_ROOT,NULL);
        printk(KERN_INFO "debug: Initialization complete\n");
        initialized = 1;
-       up(&debug_lock);
+       mutex_unlock(&debug_mutex);
 
        return rc;
 }
index 6bfb0889eb1076510f4856a84ea76d5820de4f7c..51d6309e7f3bc90939335c6269c04170ab987481 100644 (file)
@@ -102,7 +102,7 @@ static struct resource data_resource = {
 /*
  * cpu_init() initializes state that is per-CPU.
  */
-void __devinit cpu_init (void)
+void __cpuinit cpu_init(void)
 {
         int addr = hard_smp_processor_id();
 
@@ -915,7 +915,7 @@ setup_arch(char **cmdline_p)
        setup_zfcpdump(console_devno);
 }
 
-void print_cpu_info(struct cpuinfo_S390 *cpuinfo)
+void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo)
 {
    printk("cpu %d "
 #ifdef CONFIG_SMP
index 09f028a3266ba7698061422c3dfd5c0f2998827a..8ff2feaf9b00357996efe466410da5181f70ce39 100644 (file)
@@ -492,7 +492,7 @@ static unsigned int __init smp_count_cpus(void)
 /*
  *     Activate a secondary processor.
  */
-int __devinit start_secondary(void *cpuvoid)
+int __cpuinit start_secondary(void *cpuvoid)
 {
        /* Setup the cpu */
        cpu_init();
@@ -741,7 +741,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                        smp_create_idle(cpu);
 }
 
-void __devinit smp_prepare_boot_cpu(void)
+void __init smp_prepare_boot_cpu(void)
 {
        BUG_ON(smp_processor_id() != 0);
 
@@ -750,7 +750,7 @@ void __devinit smp_prepare_boot_cpu(void)
        current_set[0] = current;
 }
 
-void smp_cpus_done(unsigned int max_cpus)
+void __init smp_cpus_done(unsigned int max_cpus)
 {
        cpu_present_map = cpu_possible_map;
 }
index 7b1122417050a8cd01c991f876398e98f86506f5..883b03b040c455c471c704e605c62e8163c607e1 100644 (file)
@@ -39,7 +39,7 @@ cflags-$(CONFIG_CPU_SH2A)             := -m2a $(call cc-option,-m2a-nofpu,)
 cflags-$(CONFIG_CPU_SH3)               := -m3
 cflags-$(CONFIG_CPU_SH4)               := -m4 \
        $(call cc-option,-mno-implicit-fp,-m4-nofpu)
-cflags-$(CONFIG_CPU_SH4A)              := -m4a $(call cc-option,-m4a-nofpu,)
+cflags-$(CONFIG_CPU_SH4A)              := $(call cc-option,-m4a,) $(call cc-option,-m4a-nofpu,)
 
 cflags-$(CONFIG_CPU_BIG_ENDIAN)                += -mb
 cflags-$(CONFIG_CPU_LITTLE_ENDIAN)     += -ml
index 8057a27a1bc6bb760d81ce01ee800b7638ceebaf..cf8e119943306abd598cd1c761c7ce118891cb14 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/list.h>
 #include <linux/platform_device.h>
 #include <linux/mm.h>
+#include <linux/sched.h>
 #include <asm/dma.h>
 
 DEFINE_SPINLOCK(dma_spin_lock);
index 849a9e191391dee23ea1d4c48a85b7c541471513..ebc73b85094a9b9b63a3667556c077c432e0e624 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/init.h>
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
+#include <linux/interrupt.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 
@@ -149,6 +150,11 @@ static int __init cf_init_se(void)
        ctrl_outb(0x42, PA_MRSHPC_MW2 + 0x200);
        return 0;
 }
+#else
+static int __init cf_init_se(void)
+{
+       return -1;
+}
 #endif
 
 int __init cf_init(void)
index 832c0b4a1e6ca2fe78583e57af93ebd44f78d7bc..659cc081e5e701f5d155bf72e9cd297f93a42524 100644 (file)
@@ -320,6 +320,7 @@ skip_restore:
 
        .align  2
 5:     .long   0x00001000      ! DSP
+6:     .long   in_nmi
 7:     .long   0x30000000
 
 ! common exception handler
index 8cd04904c77a02c9fc6dfff2f28756fc8ca8f282..fab2eb07196b2538ac24bf5b05733df66fb1ee73 100644 (file)
@@ -12,6 +12,7 @@
  */
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/smp.h>
 #include <asm/processor.h>
 #include <asm/cache.h>
 
index dbebaddcfe394974686c833a39f837d562720fa5..283e1425ced57046d63cd850317f1c6b5e8dd766 100644 (file)
@@ -10,6 +10,8 @@
  * Free Software Foundation; either version 2 of the License, or (at your
  * option) any later version.
  */
+
+#include <linux/err.h>
 #include <linux/cache.h>
 #include <linux/cpumask.h>
 #include <linux/delay.h>
index a6bcc913d25e8687f96ad783220fbdfaa64f111b..4e7e747d1b696c59a16016cb42aedbe516ae734b 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/string.h>
 #include <asm/timer.h>
 
-static struct sys_timer *sys_timers[] __initdata = {
+static struct sys_timer *sys_timers[] = {
 #ifdef CONFIG_SH_TMU
        &tmu_timer,
 #endif
@@ -26,7 +26,7 @@ static struct sys_timer *sys_timers[] __initdata = {
        NULL,
 };
 
-static char timer_override[10] __initdata;
+static char timer_override[10];
 static int __init timer_setup(char *str)
 {
        if (str)
@@ -53,4 +53,3 @@ struct sys_timer *get_sys_timer(void)
 
        return NULL;
 }
-
index e146bafcd14fb11459e60f1db77549502b22644e..2aa9438361bcb99a75ac7369dd0c1c2ea8ba5997 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/gfp.h>
 #include <linux/module.h>
 #include <linux/elf.h>
+#include <linux/sched.h>
 
 /*
  * Should the kernel map a VDSO page into processes and pass its
index bd992c0048f0aa1d8801b6dde2b3380982268ef9..fbcc00c6c06ea6dff4c0706ac86a5806b1b63b4e 100644 (file)
@@ -178,6 +178,13 @@ config ARCH_HAS_ILOG2_U64
        bool
        default n
 
+config EMULATED_CMPXCHG
+       bool
+       default y
+       help
+         Sparc32 does not have a CAS instruction like sparc64. cmpxchg()
+         is emulated, and therefore it is not completely atomic.
+
 config SUN_PM
        bool
        default y
index f1401b57ccc70992424e6d391805d988a75e1b85..7b4612da74a6ff0f830beba61d8eea3142c2b515 100644 (file)
@@ -148,7 +148,7 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
 }
 
 /* Kick start a stopped clock (procedure from the Sun NVRAM/hostid FAQ). */
-static void __init kick_start_clock(void)
+static void __devinit kick_start_clock(void)
 {
        struct mostek48t02 *regs = (struct mostek48t02 *)mstk48t02_regs;
        unsigned char sec;
@@ -223,7 +223,7 @@ static __inline__ int has_low_battery(void)
        return (data1 == data2);        /* Was the write blocked? */
 }
 
-static void __init mostek_set_system_time(void)
+static void __devinit mostek_set_system_time(void)
 {
        unsigned int year, mon, day, hour, min, sec;
        struct mostek48t02 *mregs;
index 559335f4917d1d1d03ee7ea28b9ff8e7d6948c6e..cbddeb38ffdab2bf5f25562190dd833bf2f9ded4 100644 (file)
@@ -2,6 +2,7 @@
  * atomic32.c: 32-bit atomic_t implementation
  *
  * Copyright (C) 2004 Keith M Wesolowski
+ * Copyright (C) 2007 Kyle McMartin
  * 
  * Based on asm-parisc/atomic.h Copyright (C) 2000 Philipp Rumpf
  */
@@ -117,3 +118,17 @@ unsigned long ___change_bit(unsigned long *addr, unsigned long mask)
        return old & mask;
 }
 EXPORT_SYMBOL(___change_bit);
+
+unsigned long __cmpxchg_u32(volatile u32 *ptr, u32 old, u32 new)
+{
+       unsigned long flags;
+       u32 prev;
+
+       spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
+       if ((prev = *ptr) == old)
+               *ptr = new;
+       spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
+
+       return (unsigned long)prev;
+}
+EXPORT_SYMBOL(__cmpxchg_u32);
index 831781cab271826827a29c404d5dc1509fb85ba9..bd00f89eed1ed3c4dcaa7a5cb39cd6ef1a132505 100644 (file)
@@ -147,10 +147,10 @@ config SMP
          If you don't know what to do here, say N.
 
 config NR_CPUS
-       int "Maximum number of CPUs (2-64)"
-       range 2 64
+       int "Maximum number of CPUs (2-1024)"
+       range 2 1024
        depends on SMP
-       default "32"
+       default "64"
 
 source "drivers/cpufreq/Kconfig"
 
index c749dccacc3203083255b6b6ea2a35764b5cecc9..d8d19093d12fd0a650f1196f2d44f490895fccc3 100644 (file)
@@ -8,11 +8,11 @@ EXTRA_CFLAGS := -Werror
 extra-y                := head.o init_task.o vmlinux.lds
 
 obj-y          := process.o setup.o cpu.o idprom.o \
-                  traps.o devices.o auxio.o una_asm.o \
+                  traps.o auxio.o una_asm.o \
                   irq.o ptrace.o time.o sys_sparc.o signal.o \
                   unaligned.o central.o pci.o starfire.o semaphore.o \
                   power.o sbus.o iommu_common.o sparc64_ksyms.o chmc.o \
-                  visemul.o prom.o of_device.o hvapi.o
+                  visemul.o prom.o of_device.o hvapi.o sstate.o mdesc.o
 
 obj-$(CONFIG_STACKTRACE) += stacktrace.o
 obj-$(CONFIG_PCI)       += ebus.o isa.o pci_common.o pci_iommu.o \
diff --git a/arch/sparc64/kernel/devices.c b/arch/sparc64/kernel/devices.c
deleted file mode 100644 (file)
index 0e03c8e..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-/* devices.c: Initial scan of the prom device tree for important
- *            Sparc device nodes which we need to find.
- *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
- */
-
-#include <linux/kernel.h>
-#include <linux/threads.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/string.h>
-#include <linux/spinlock.h>
-#include <linux/errno.h>
-#include <linux/bootmem.h>
-
-#include <asm/page.h>
-#include <asm/oplib.h>
-#include <asm/system.h>
-#include <asm/smp.h>
-#include <asm/spitfire.h>
-#include <asm/timer.h>
-#include <asm/cpudata.h>
-
-/* Used to synchronize accesses to NatSemi SUPER I/O chip configure
- * operations in asm/ns87303.h
- */
-DEFINE_SPINLOCK(ns87303_lock);
-
-extern void cpu_probe(void);
-extern void central_probe(void);
-
-static const char *cpu_mid_prop(void)
-{
-       if (tlb_type == spitfire)
-               return "upa-portid";
-       return "portid";
-}
-
-static int get_cpu_mid(struct device_node *dp)
-{
-       struct property *prop;
-
-       if (tlb_type == hypervisor) {
-               struct linux_prom64_registers *reg;
-               int len;
-
-               prop = of_find_property(dp, "cpuid", &len);
-               if (prop && len == 4)
-                       return *(int *) prop->value;
-
-               prop = of_find_property(dp, "reg", NULL);
-               reg = prop->value;
-               return (reg[0].phys_addr >> 32) & 0x0fffffffUL;
-       } else {
-               const char *prop_name = cpu_mid_prop();
-
-               prop = of_find_property(dp, prop_name, NULL);
-               if (prop)
-                       return *(int *) prop->value;
-               return 0;
-       }
-}
-
-static int check_cpu_node(struct device_node *dp, int *cur_inst,
-                         int (*compare)(struct device_node *, int, void *),
-                         void *compare_arg,
-                         struct device_node **dev_node, int *mid)
-{
-       if (!compare(dp, *cur_inst, compare_arg)) {
-               if (dev_node)
-                       *dev_node = dp;
-               if (mid)
-                       *mid = get_cpu_mid(dp);
-               return 0;
-       }
-
-       (*cur_inst)++;
-
-       return -ENODEV;
-}
-
-static int __cpu_find_by(int (*compare)(struct device_node *, int, void *),
-                        void *compare_arg,
-                        struct device_node **dev_node, int *mid)
-{
-       struct device_node *dp;
-       int cur_inst;
-
-       cur_inst = 0;
-       for_each_node_by_type(dp, "cpu") {
-               int err = check_cpu_node(dp, &cur_inst,
-                                        compare, compare_arg,
-                                        dev_node, mid);
-               if (err == 0)
-                       return 0;
-       }
-
-       return -ENODEV;
-}
-
-static int cpu_instance_compare(struct device_node *dp, int instance, void *_arg)
-{
-       int desired_instance = (int) (long) _arg;
-
-       if (instance == desired_instance)
-               return 0;
-       return -ENODEV;
-}
-
-int cpu_find_by_instance(int instance, struct device_node **dev_node, int *mid)
-{
-       return __cpu_find_by(cpu_instance_compare, (void *)(long)instance,
-                            dev_node, mid);
-}
-
-static int cpu_mid_compare(struct device_node *dp, int instance, void *_arg)
-{
-       int desired_mid = (int) (long) _arg;
-       int this_mid;
-
-       this_mid = get_cpu_mid(dp);
-       if (this_mid == desired_mid)
-               return 0;
-       return -ENODEV;
-}
-
-int cpu_find_by_mid(int mid, struct device_node **dev_node)
-{
-       return __cpu_find_by(cpu_mid_compare, (void *)(long)mid,
-                            dev_node, NULL);
-}
-
-void __init device_scan(void)
-{
-       /* FIX ME FAST... -DaveM */
-       ioport_resource.end = 0xffffffffffffffffUL;
-
-       prom_printf("Booting Linux...\n");
-
-#ifndef CONFIG_SMP
-       {
-               struct device_node *dp;
-               int err, def;
-
-               err = cpu_find_by_instance(0, &dp, NULL);
-               if (err) {
-                       prom_printf("No cpu nodes, cannot continue\n");
-                       prom_halt();
-               }
-               cpu_data(0).clock_tick =
-                       of_getintprop_default(dp, "clock-frequency", 0);
-
-               def = ((tlb_type == hypervisor) ?
-                      (8 * 1024) :
-                      (16 * 1024));
-               cpu_data(0).dcache_size = of_getintprop_default(dp,
-                                                               "dcache-size",
-                                                               def);
-
-               def = 32;
-               cpu_data(0).dcache_line_size =
-                       of_getintprop_default(dp, "dcache-line-size", def);
-
-               def = 16 * 1024;
-               cpu_data(0).icache_size = of_getintprop_default(dp,
-                                                               "icache-size",
-                                                               def);
-
-               def = 32;
-               cpu_data(0).icache_line_size =
-                       of_getintprop_default(dp, "icache-line-size", def);
-
-               def = ((tlb_type == hypervisor) ?
-                      (3 * 1024 * 1024) :
-                      (4 * 1024 * 1024));
-               cpu_data(0).ecache_size = of_getintprop_default(dp,
-                                                               "ecache-size",
-                                                               def);
-
-               def = 64;
-               cpu_data(0).ecache_line_size =
-                       of_getintprop_default(dp, "ecache-line-size", def);
-               printk("CPU[0]: Caches "
-                      "D[sz(%d):line_sz(%d)] "
-                      "I[sz(%d):line_sz(%d)] "
-                      "E[sz(%d):line_sz(%d)]\n",
-                      cpu_data(0).dcache_size, cpu_data(0).dcache_line_size,
-                      cpu_data(0).icache_size, cpu_data(0).icache_line_size,
-                      cpu_data(0).ecache_size, cpu_data(0).ecache_line_size);
-       }
-#endif
-
-       central_probe();
-
-       cpu_probe();
-}
index 732b77cb71f84fd0b356177a3341946969634cff..ed712e0b337238199b52aadc646b6123a585aef6 100644 (file)
@@ -1725,96 +1725,142 @@ real_hard_smp_processor_id:
         * returns %o0: sysino
         */
        .globl  sun4v_devino_to_sysino
+       .type   sun4v_devino_to_sysino,#function
 sun4v_devino_to_sysino:
        mov     HV_FAST_INTR_DEVINO2SYSINO, %o5
        ta      HV_FAST_TRAP
        retl
         mov    %o1, %o0
+       .size   sun4v_devino_to_sysino, .-sun4v_devino_to_sysino
 
        /* %o0: sysino
         *
         * returns %o0: intr_enabled (HV_INTR_{DISABLED,ENABLED})
         */
        .globl  sun4v_intr_getenabled
+       .type   sun4v_intr_getenabled,#function
 sun4v_intr_getenabled:
        mov     HV_FAST_INTR_GETENABLED, %o5
        ta      HV_FAST_TRAP
        retl
         mov    %o1, %o0
+       .size   sun4v_intr_getenabled, .-sun4v_intr_getenabled
 
        /* %o0: sysino
         * %o1: intr_enabled (HV_INTR_{DISABLED,ENABLED})
         */
        .globl  sun4v_intr_setenabled
+       .type   sun4v_intr_setenabled,#function
 sun4v_intr_setenabled:
        mov     HV_FAST_INTR_SETENABLED, %o5
        ta      HV_FAST_TRAP
        retl
         nop
+       .size   sun4v_intr_setenabled, .-sun4v_intr_setenabled
 
        /* %o0: sysino
         *
         * returns %o0: intr_state (HV_INTR_STATE_*)
         */
        .globl  sun4v_intr_getstate
+       .type   sun4v_intr_getstate,#function
 sun4v_intr_getstate:
        mov     HV_FAST_INTR_GETSTATE, %o5
        ta      HV_FAST_TRAP
        retl
         mov    %o1, %o0
+       .size   sun4v_intr_getstate, .-sun4v_intr_getstate
 
        /* %o0: sysino
         * %o1: intr_state (HV_INTR_STATE_*)
         */
        .globl  sun4v_intr_setstate
+       .type   sun4v_intr_setstate,#function
 sun4v_intr_setstate:
        mov     HV_FAST_INTR_SETSTATE, %o5
        ta      HV_FAST_TRAP
        retl
         nop
+       .size   sun4v_intr_setstate, .-sun4v_intr_setstate
 
        /* %o0: sysino
         *
         * returns %o0: cpuid
         */
        .globl  sun4v_intr_gettarget
+       .type   sun4v_intr_gettarget,#function
 sun4v_intr_gettarget:
        mov     HV_FAST_INTR_GETTARGET, %o5
        ta      HV_FAST_TRAP
        retl
         mov    %o1, %o0
+       .size   sun4v_intr_gettarget, .-sun4v_intr_gettarget
 
        /* %o0: sysino
         * %o1: cpuid
         */
        .globl  sun4v_intr_settarget
+       .type   sun4v_intr_settarget,#function
 sun4v_intr_settarget:
        mov     HV_FAST_INTR_SETTARGET, %o5
        ta      HV_FAST_TRAP
        retl
         nop
+       .size   sun4v_intr_settarget, .-sun4v_intr_settarget
 
-       /* %o0: type
-        * %o1: queue paddr
-        * %o2: num queue entries
+       /* %o0: cpuid
+        * %o1: pc
+        * %o2: rtba
+        * %o3: arg0
         *
         * returns %o0: status
         */
-       .globl  sun4v_cpu_qconf
-sun4v_cpu_qconf:
-       mov     HV_FAST_CPU_QCONF, %o5
+       .globl  sun4v_cpu_start
+       .type   sun4v_cpu_start,#function
+sun4v_cpu_start:
+       mov     HV_FAST_CPU_START, %o5
        ta      HV_FAST_TRAP
        retl
         nop
+       .size   sun4v_cpu_start, .-sun4v_cpu_start
 
-       /* returns %o0: status
+       /* %o0: cpuid
+        *
+        * returns %o0: status
         */
+       .globl  sun4v_cpu_stop
+       .type   sun4v_cpu_stop,#function
+sun4v_cpu_stop:
+       mov     HV_FAST_CPU_STOP, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_cpu_stop, .-sun4v_cpu_stop
+
+       /* returns %o0: status  */
        .globl  sun4v_cpu_yield
+       .type   sun4v_cpu_yield, #function
 sun4v_cpu_yield:
        mov     HV_FAST_CPU_YIELD, %o5
        ta      HV_FAST_TRAP
        retl
         nop
+       .size   sun4v_cpu_yield, .-sun4v_cpu_yield
+
+       /* %o0: type
+        * %o1: queue paddr
+        * %o2: num queue entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_cpu_qconf
+       .type   sun4v_cpu_qconf,#function
+sun4v_cpu_qconf:
+       mov     HV_FAST_CPU_QCONF, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_cpu_qconf, .-sun4v_cpu_qconf
 
        /* %o0: num cpus in cpu list
         * %o1: cpu list paddr
@@ -1823,11 +1869,13 @@ sun4v_cpu_yield:
         * returns %o0: status
         */
        .globl  sun4v_cpu_mondo_send
+       .type   sun4v_cpu_mondo_send,#function
 sun4v_cpu_mondo_send:
        mov     HV_FAST_CPU_MONDO_SEND, %o5
        ta      HV_FAST_TRAP
        retl
         nop
+       .size   sun4v_cpu_mondo_send, .-sun4v_cpu_mondo_send
 
        /* %o0: CPU ID
         *
@@ -1835,6 +1883,7 @@ sun4v_cpu_mondo_send:
         *         %o0: cpu state as HV_CPU_STATE_*
         */
        .globl  sun4v_cpu_state
+       .type   sun4v_cpu_state,#function
 sun4v_cpu_state:
        mov     HV_FAST_CPU_STATE, %o5
        ta      HV_FAST_TRAP
@@ -1843,6 +1892,37 @@ sun4v_cpu_state:
        mov     %o1, %o0
 1:     retl
         nop
+       .size   sun4v_cpu_state, .-sun4v_cpu_state
+
+       /* %o0: virtual address
+        * %o1: must be zero
+        * %o2: TTE
+        * %o3: HV_MMU_* flags
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_mmu_map_perm_addr
+       .type   sun4v_mmu_map_perm_addr,#function
+sun4v_mmu_map_perm_addr:
+       mov     HV_FAST_MMU_MAP_PERM_ADDR, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_mmu_map_perm_addr, .-sun4v_mmu_map_perm_addr
+
+       /* %o0: number of TSB descriptions
+        * %o1: TSB descriptions real address
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_mmu_tsb_ctx0
+       .type   sun4v_mmu_tsb_ctx0,#function
+sun4v_mmu_tsb_ctx0:
+       mov     HV_FAST_MMU_TSB_CTX0, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_mmu_tsb_ctx0, .-sun4v_mmu_tsb_ctx0
 
        /* %o0: API group number
         * %o1: pointer to unsigned long major number storage
@@ -1851,6 +1931,7 @@ sun4v_cpu_state:
         * returns %o0: status
         */
        .globl  sun4v_get_version
+       .type   sun4v_get_version,#function
 sun4v_get_version:
        mov     HV_CORE_GET_VER, %o5
        mov     %o1, %o3
@@ -1859,6 +1940,7 @@ sun4v_get_version:
        stx     %o1, [%o3]
        retl
         stx    %o2, [%o4]
+       .size   sun4v_get_version, .-sun4v_get_version
 
        /* %o0: API group number
         * %o1: desired major number
@@ -1868,18 +1950,49 @@ sun4v_get_version:
         * returns %o0: status
         */
        .globl  sun4v_set_version
+       .type   sun4v_set_version,#function
 sun4v_set_version:
        mov     HV_CORE_SET_VER, %o5
        mov     %o3, %o4
        ta      HV_CORE_TRAP
        retl
         stx    %o1, [%o4]
+       .size   sun4v_set_version, .-sun4v_set_version
+
+       /* %o0: pointer to unsigned long time
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_tod_get
+       .type   sun4v_tod_get,#function
+sun4v_tod_get:
+       mov     %o0, %o4
+       mov     HV_FAST_TOD_GET, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       retl
+        nop
+       .size   sun4v_tod_get, .-sun4v_tod_get
+
+       /* %o0: time
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_tod_set
+       .type   sun4v_tod_set,#function
+sun4v_tod_set:
+       mov     HV_FAST_TOD_SET, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_tod_set, .-sun4v_tod_set
 
        /* %o0: pointer to unsigned long status
         *
         * returns %o0: signed character
         */
        .globl  sun4v_con_getchar
+       .type   sun4v_con_getchar,#function
 sun4v_con_getchar:
        mov     %o0, %o4
        mov     HV_FAST_CONS_GETCHAR, %o5
@@ -1889,17 +2002,20 @@ sun4v_con_getchar:
        stx     %o0, [%o4]
        retl
         sra    %o1, 0, %o0
+       .size   sun4v_con_getchar, .-sun4v_con_getchar
 
        /* %o0: signed long character
         *
         * returns %o0: status
         */
        .globl  sun4v_con_putchar
+       .type   sun4v_con_putchar,#function
 sun4v_con_putchar:
        mov     HV_FAST_CONS_PUTCHAR, %o5
        ta      HV_FAST_TRAP
        retl
         sra    %o0, 0, %o0
+       .size   sun4v_con_putchar, .-sun4v_con_putchar
 
        /* %o0: buffer real address
         * %o1: buffer size
@@ -1908,6 +2024,7 @@ sun4v_con_putchar:
         * returns %o0: status
         */
        .globl  sun4v_con_read
+       .type   sun4v_con_read,#function
 sun4v_con_read:
        mov     %o2, %o4
        mov     HV_FAST_CONS_READ, %o5
@@ -1922,6 +2039,7 @@ sun4v_con_read:
        stx     %o1, [%o4]
 1:     retl
         nop
+       .size   sun4v_con_read, .-sun4v_con_read
 
        /* %o0: buffer real address
         * %o1: buffer size
@@ -1930,6 +2048,7 @@ sun4v_con_read:
         * returns %o0: status
         */
        .globl  sun4v_con_write
+       .type   sun4v_con_write,#function
 sun4v_con_write:
        mov     %o2, %o4
        mov     HV_FAST_CONS_WRITE, %o5
@@ -1937,3 +2056,517 @@ sun4v_con_write:
        stx     %o1, [%o4]
        retl
         nop
+       .size   sun4v_con_write, .-sun4v_con_write
+
+       /* %o0: soft state
+        * %o1: address of description string
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_mach_set_soft_state
+       .type   sun4v_mach_set_soft_state,#function
+sun4v_mach_set_soft_state:
+       mov     HV_FAST_MACH_SET_SOFT_STATE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_mach_set_soft_state, .-sun4v_mach_set_soft_state
+
+       /* %o0: exit code
+        *
+        * Does not return.
+        */
+       .globl  sun4v_mach_exit
+       .type   sun4v_mach_exit,#function
+sun4v_mach_exit:
+       mov     HV_FAST_MACH_EXIT, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_mach_exit, .-sun4v_mach_exit
+
+       /* %o0: buffer real address
+        * %o1: buffer length
+        * %o2: pointer to unsigned long real_buf_len
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_mach_desc
+       .type   sun4v_mach_desc,#function
+sun4v_mach_desc:
+       mov     %o2, %o4
+       mov     HV_FAST_MACH_DESC, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       retl
+        nop
+       .size   sun4v_mach_desc, .-sun4v_mach_desc
+
+       /* %o0: new timeout in milliseconds
+        * %o1: pointer to unsigned long orig_timeout
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_mach_set_watchdog
+       .type   sun4v_mach_set_watchdog,#function
+sun4v_mach_set_watchdog:
+       mov     %o1, %o4
+       mov     HV_FAST_MACH_SET_WATCHDOG, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       retl
+        nop
+       .size   sun4v_mach_set_watchdog, .-sun4v_mach_set_watchdog
+
+       /* No inputs and does not return.  */
+       .globl  sun4v_mach_sir
+       .type   sun4v_mach_sir,#function
+sun4v_mach_sir:
+       mov     %o1, %o4
+       mov     HV_FAST_MACH_SIR, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       retl
+        nop
+       .size   sun4v_mach_sir, .-sun4v_mach_sir
+
+       /* %o0: channel
+        * %o1: ra
+        * %o2: num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_tx_qconf
+       .type   sun4v_ldc_tx_qconf,#function
+sun4v_ldc_tx_qconf:
+       mov     HV_FAST_LDC_TX_QCONF, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_tx_qconf, .-sun4v_ldc_tx_qconf
+
+       /* %o0: channel
+        * %o1: pointer to unsigned long ra
+        * %o2: pointer to unsigned long num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_tx_qinfo
+       .type   sun4v_ldc_tx_qinfo,#function
+sun4v_ldc_tx_qinfo:
+       mov     %o1, %g1
+       mov     %o2, %g2
+       mov     HV_FAST_LDC_TX_QINFO, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       stx     %o2, [%g2]
+       retl
+        nop
+       .size   sun4v_ldc_tx_qinfo, .-sun4v_ldc_tx_qinfo
+
+       /* %o0: channel
+        * %o1: pointer to unsigned long head_off
+        * %o2: pointer to unsigned long tail_off
+        * %o2: pointer to unsigned long chan_state
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_tx_get_state
+       .type   sun4v_ldc_tx_get_state,#function
+sun4v_ldc_tx_get_state:
+       mov     %o1, %g1
+       mov     %o2, %g2
+       mov     %o3, %g3
+       mov     HV_FAST_LDC_TX_GET_STATE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       stx     %o2, [%g2]
+       stx     %o3, [%g3]
+       retl
+        nop
+       .size   sun4v_ldc_tx_get_state, .-sun4v_ldc_tx_get_state
+
+       /* %o0: channel
+        * %o1: tail_off
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_tx_set_qtail
+       .type   sun4v_ldc_tx_set_qtail,#function
+sun4v_ldc_tx_set_qtail:
+       mov     HV_FAST_LDC_TX_SET_QTAIL, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_tx_set_qtail, .-sun4v_ldc_tx_set_qtail
+
+       /* %o0: channel
+        * %o1: ra
+        * %o2: num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_rx_qconf
+       .type   sun4v_ldc_rx_qconf,#function
+sun4v_ldc_rx_qconf:
+       mov     HV_FAST_LDC_RX_QCONF, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_rx_qconf, .-sun4v_ldc_rx_qconf
+
+       /* %o0: channel
+        * %o1: pointer to unsigned long ra
+        * %o2: pointer to unsigned long num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_rx_qinfo
+       .type   sun4v_ldc_rx_qinfo,#function
+sun4v_ldc_rx_qinfo:
+       mov     %o1, %g1
+       mov     %o2, %g2
+       mov     HV_FAST_LDC_RX_QINFO, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       stx     %o2, [%g2]
+       retl
+        nop
+       .size   sun4v_ldc_rx_qinfo, .-sun4v_ldc_rx_qinfo
+
+       /* %o0: channel
+        * %o1: pointer to unsigned long head_off
+        * %o2: pointer to unsigned long tail_off
+        * %o2: pointer to unsigned long chan_state
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_rx_get_state
+       .type   sun4v_ldc_rx_get_state,#function
+sun4v_ldc_rx_get_state:
+       mov     %o1, %g1
+       mov     %o2, %g2
+       mov     %o3, %g3
+       mov     HV_FAST_LDC_RX_GET_STATE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       stx     %o2, [%g2]
+       stx     %o3, [%g3]
+       retl
+        nop
+       .size   sun4v_ldc_rx_get_state, .-sun4v_ldc_rx_get_state
+
+       /* %o0: channel
+        * %o1: head_off
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_rx_set_qhead
+       .type   sun4v_ldc_rx_set_qhead,#function
+sun4v_ldc_rx_set_qhead:
+       mov     HV_FAST_LDC_RX_SET_QHEAD, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_rx_set_qhead, .-sun4v_ldc_rx_set_qhead
+
+       /* %o0: channel
+        * %o1: ra
+        * %o2: num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_set_map_table
+       .type   sun4v_ldc_set_map_table,#function
+sun4v_ldc_set_map_table:
+       mov     HV_FAST_LDC_SET_MAP_TABLE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_set_map_table, .-sun4v_ldc_set_map_table
+
+       /* %o0: channel
+        * %o1: pointer to unsigned long ra
+        * %o2: pointer to unsigned long num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_get_map_table
+       .type   sun4v_ldc_get_map_table,#function
+sun4v_ldc_get_map_table:
+       mov     %o1, %g1
+       mov     %o2, %g2
+       mov     HV_FAST_LDC_GET_MAP_TABLE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       stx     %o2, [%g2]
+       retl
+        nop
+       .size   sun4v_ldc_get_map_table, .-sun4v_ldc_get_map_table
+
+       /* %o0: channel
+        * %o1: dir_code
+        * %o2: tgt_raddr
+        * %o3: lcl_raddr
+        * %o4: len
+        * %o5: pointer to unsigned long actual_len
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_copy
+       .type   sun4v_ldc_copy,#function
+sun4v_ldc_copy:
+       mov     %o5, %g1
+       mov     HV_FAST_LDC_COPY, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       retl
+        nop
+       .size   sun4v_ldc_copy, .-sun4v_ldc_copy
+
+       /* %o0: channel
+        * %o1: cookie
+        * %o2: pointer to unsigned long ra
+        * %o3: pointer to unsigned long perm
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_mapin
+       .type   sun4v_ldc_mapin,#function
+sun4v_ldc_mapin:
+       mov     %o2, %g1
+       mov     %o3, %g2
+       mov     HV_FAST_LDC_MAPIN, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       stx     %o2, [%g2]
+       retl
+        nop
+       .size   sun4v_ldc_mapin, .-sun4v_ldc_mapin
+
+       /* %o0: ra
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_unmap
+       .type   sun4v_ldc_unmap,#function
+sun4v_ldc_unmap:
+       mov     HV_FAST_LDC_UNMAP, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_unmap, .-sun4v_ldc_unmap
+
+       /* %o0: cookie
+        * %o1: mte_cookie
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ldc_revoke
+       .type   sun4v_ldc_revoke,#function
+sun4v_ldc_revoke:
+       mov     HV_FAST_LDC_REVOKE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ldc_revoke, .-sun4v_ldc_revoke
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: pointer to unsigned long cookie
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_get_cookie
+       .type   sun4v_vintr_get_cookie,#function
+sun4v_vintr_get_cookie:
+       mov     %o2, %g1
+       mov     HV_FAST_VINTR_GET_COOKIE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       retl
+        nop
+       .size   sun4v_vintr_get_cookie, .-sun4v_vintr_get_cookie
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: cookie
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_set_cookie
+       .type   sun4v_vintr_set_cookie,#function
+sun4v_vintr_set_cookie:
+       mov     HV_FAST_VINTR_SET_COOKIE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_vintr_set_cookie, .-sun4v_vintr_set_cookie
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: pointer to unsigned long valid_state
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_get_valid
+       .type   sun4v_vintr_get_valid,#function
+sun4v_vintr_get_valid:
+       mov     %o2, %g1
+       mov     HV_FAST_VINTR_GET_VALID, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       retl
+        nop
+       .size   sun4v_vintr_get_valid, .-sun4v_vintr_get_valid
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: valid_state
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_set_valid
+       .type   sun4v_vintr_set_valid,#function
+sun4v_vintr_set_valid:
+       mov     HV_FAST_VINTR_SET_VALID, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_vintr_set_valid, .-sun4v_vintr_set_valid
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: pointer to unsigned long state
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_get_state
+       .type   sun4v_vintr_get_state,#function
+sun4v_vintr_get_state:
+       mov     %o2, %g1
+       mov     HV_FAST_VINTR_GET_STATE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       retl
+        nop
+       .size   sun4v_vintr_get_state, .-sun4v_vintr_get_state
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: state
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_set_state
+       .type   sun4v_vintr_set_state,#function
+sun4v_vintr_set_state:
+       mov     HV_FAST_VINTR_SET_STATE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_vintr_set_state, .-sun4v_vintr_set_state
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: pointer to unsigned long cpuid
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_get_target
+       .type   sun4v_vintr_get_target,#function
+sun4v_vintr_get_target:
+       mov     %o2, %g1
+       mov     HV_FAST_VINTR_GET_TARGET, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%g1]
+       retl
+        nop
+       .size   sun4v_vintr_get_target, .-sun4v_vintr_get_target
+
+       /* %o0: device handle
+        * %o1: device INO
+        * %o2: cpuid
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_vintr_set_target
+       .type   sun4v_vintr_set_target,#function
+sun4v_vintr_set_target:
+       mov     HV_FAST_VINTR_SET_TARGET, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_vintr_set_target, .-sun4v_vintr_set_target
+
+       /* %o0: NCS sub-function
+        * %o1: sub-function arg real-address
+        * %o2: sub-function arg size
+        *
+        * returns %o0: status
+        */
+       .globl  sun4v_ncs_request
+       .type   sun4v_ncs_request,#function
+sun4v_ncs_request:
+       mov     HV_FAST_NCS_REQUEST, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_ncs_request, .-sun4v_ncs_request
+
+       .globl  sun4v_scv_send
+       .type   sun4v_scv_send,#function
+sun4v_scv_send:
+       save    %sp, -192, %sp
+       mov     %i0, %o0
+       mov     %i1, %o1
+       mov     %i2, %o2
+       mov     HV_FAST_SVC_SEND, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%i3]
+       ret
+       restore
+       .size   sun4v_scv_send, .-sun4v_scv_send
+
+       .globl  sun4v_scv_recv
+       .type   sun4v_scv_recv,#function
+sun4v_scv_recv:
+       save    %sp, -192, %sp
+       mov     %i0, %o0
+       mov     %i1, %o1
+       mov     %i2, %o2
+       mov     HV_FAST_SVC_RECV, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%i3]
+       ret
+       restore
+       .size   sun4v_scv_recv, .-sun4v_scv_recv
+
+       .globl  sun4v_scv_getstatus
+       .type   sun4v_scv_getstatus,#function
+sun4v_scv_getstatus:
+       mov     HV_FAST_SVC_GETSTATUS, %o5
+       mov     %o1, %o4
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       retl
+        nop
+       .size   sun4v_scv_getstatus, .-sun4v_scv_getstatus
+
+       .globl  sun4v_scv_setstatus
+       .type   sun4v_scv_setstatus,#function
+sun4v_scv_setstatus:
+       mov     HV_FAST_SVC_SETSTATUS, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_scv_setstatus, .-sun4v_scv_setstatus
+
+       .globl  sun4v_scv_clrstatus
+       .type   sun4v_scv_clrstatus,#function
+sun4v_scv_clrstatus:
+       mov     HV_FAST_SVC_CLRSTATUS, %o5
+       ta      HV_FAST_TRAP
+       retl
+        nop
+       .size   sun4v_scv_clrstatus, .-sun4v_scv_clrstatus
index baea10a9819681cb409d1ae205ec36a468d3c4aa..77259526cb152daff39c213176ac02db1cae3346 100644 (file)
@@ -523,7 +523,7 @@ tlb_fixup_done:
 #else
        mov     0, %o0
 #endif
-       stb     %o0, [%g6 + TI_CPU]
+       sth     %o0, [%g6 + TI_CPU]
 
        /* Off we go.... */
        call    start_kernel
@@ -653,33 +653,54 @@ setup_tba:
         restore
 sparc64_boot_end:
 
-#include "ktlb.S"
-#include "tsb.S"
 #include "etrap.S"
 #include "rtrap.S"
 #include "winfixup.S"
 #include "entry.S"
 #include "sun4v_tlb_miss.S"
 #include "sun4v_ivec.S"
+#include "ktlb.S"
+#include "tsb.S"
 
 /*
  * The following skip makes sure the trap table in ttable.S is aligned
  * on a 32K boundary as required by the v9 specs for TBA register.
  *
  * We align to a 32K boundary, then we have the 32K kernel TSB,
- * then the 32K aligned trap table.
+ * the 64K kernel 4MB TSB, and then the 32K aligned trap table.
  */
 1:
        .skip   0x4000 + _start - 1b
 
+! 0x0000000000408000
+
        .globl  swapper_tsb
 swapper_tsb:
        .skip   (32 * 1024)
 
-! 0x0000000000408000
+       .globl  swapper_4m_tsb
+swapper_4m_tsb:
+       .skip   (64 * 1024)
+
+! 0x0000000000420000
 
+       /* Some care needs to be exercised if you try to move the
+        * location of the trap table relative to other things.  For
+        * one thing there are br* instructions in some of the
+        * trap table entires which branch back to code in ktlb.S
+        * Those instructions can only handle a signed 16-bit
+        * displacement.
+        *
+        * There is a binutils bug (bugzilla #4558) which causes
+        * the relocation overflow checks for such instructions to
+        * not be done correctly.  So bintuils will not notice the
+        * error and will instead write junk into the relocation and
+        * you'll have an unbootable kernel.
+        */
 #include "ttable.S"
 
+! 0x0000000000428000
+
 #include "systbls.S"
 
        .data
index f03ffc829c7a96fe52927b30c541a71dfff360d0..f34f5d6181eff1af2dbd4197cf5ad9eeaae11996 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <asm/hypervisor.h>
 #include <asm/oplib.h>
+#include <asm/sstate.h>
 
 /* If the hypervisor indicates that the API setting
  * calls are unsupported, by returning HV_EBADTRAP or
@@ -107,7 +108,7 @@ int sun4v_hvapi_register(unsigned long group, unsigned long major,
                                p->minor = actual_minor;
                                ret = 0;
                        } else if (hv_ret == HV_EBADTRAP ||
-                                  HV_ENOTSUPPORTED) {
+                                  hv_ret == HV_ENOTSUPPORTED) {
                                if (p->flags & FLAG_PRE_API) {
                                        if (major == 1) {
                                                p->major = 1;
@@ -179,6 +180,8 @@ void __init sun4v_hvapi_init(void)
        if (sun4v_hvapi_register(group, major, &minor))
                goto bad;
 
+       sun4v_sstate_init();
+
        return;
 
 bad:
index 3edc18e1b818da7dda4032634c1360b6e1c94072..a36f8dd0c0216e9244896736af33682a6ac7e889 100644 (file)
@@ -171,8 +171,6 @@ skip:
        return 0;
 }
 
-extern unsigned long real_hard_smp_processor_id(void);
-
 static unsigned int sun4u_compute_tid(unsigned long imap, unsigned long cpuid)
 {
        unsigned int tid;
@@ -694,9 +692,20 @@ void init_irqwork_curcpu(void)
        trap_block[cpu].irq_worklist = 0;
 }
 
-static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type)
+/* Please be very careful with register_one_mondo() and
+ * sun4v_register_mondo_queues().
+ *
+ * On SMP this gets invoked from the CPU trampoline before
+ * the cpu has fully taken over the trap table from OBP,
+ * and it's kernel stack + %g6 thread register state is
+ * not fully cooked yet.
+ *
+ * Therefore you cannot make any OBP calls, not even prom_printf,
+ * from these two routines.
+ */
+static void __cpuinit register_one_mondo(unsigned long paddr, unsigned long type, unsigned long qmask)
 {
-       unsigned long num_entries = 128;
+       unsigned long num_entries = (qmask + 1) / 64;
        unsigned long status;
 
        status = sun4v_cpu_qconf(type, paddr, num_entries);
@@ -711,44 +720,58 @@ static void __cpuinit sun4v_register_mondo_queues(int this_cpu)
 {
        struct trap_per_cpu *tb = &trap_block[this_cpu];
 
-       register_one_mondo(tb->cpu_mondo_pa, HV_CPU_QUEUE_CPU_MONDO);
-       register_one_mondo(tb->dev_mondo_pa, HV_CPU_QUEUE_DEVICE_MONDO);
-       register_one_mondo(tb->resum_mondo_pa, HV_CPU_QUEUE_RES_ERROR);
-       register_one_mondo(tb->nonresum_mondo_pa, HV_CPU_QUEUE_NONRES_ERROR);
+       register_one_mondo(tb->cpu_mondo_pa, HV_CPU_QUEUE_CPU_MONDO,
+                          tb->cpu_mondo_qmask);
+       register_one_mondo(tb->dev_mondo_pa, HV_CPU_QUEUE_DEVICE_MONDO,
+                          tb->dev_mondo_qmask);
+       register_one_mondo(tb->resum_mondo_pa, HV_CPU_QUEUE_RES_ERROR,
+                          tb->resum_qmask);
+       register_one_mondo(tb->nonresum_mondo_pa, HV_CPU_QUEUE_NONRES_ERROR,
+                          tb->nonresum_qmask);
 }
 
-static void __cpuinit alloc_one_mondo(unsigned long *pa_ptr, int use_bootmem)
+static void __cpuinit alloc_one_mondo(unsigned long *pa_ptr, unsigned long qmask, int use_bootmem)
 {
-       void *page;
+       unsigned long size = PAGE_ALIGN(qmask + 1);
+       unsigned long order = get_order(size);
+       void *p = NULL;
 
-       if (use_bootmem)
-               page = alloc_bootmem_low_pages(PAGE_SIZE);
-       else
-               page = (void *) get_zeroed_page(GFP_ATOMIC);
+       if (use_bootmem) {
+               p = __alloc_bootmem_low(size, size, 0);
+       } else {
+               struct page *page = alloc_pages(GFP_ATOMIC | __GFP_ZERO, order);
+               if (page)
+                       p = page_address(page);
+       }
 
-       if (!page) {
+       if (!p) {
                prom_printf("SUN4V: Error, cannot allocate mondo queue.\n");
                prom_halt();
        }
 
-       *pa_ptr = __pa(page);
+       *pa_ptr = __pa(p);
 }
 
-static void __cpuinit alloc_one_kbuf(unsigned long *pa_ptr, int use_bootmem)
+static void __cpuinit alloc_one_kbuf(unsigned long *pa_ptr, unsigned long q