]> git.hungrycats.org Git - linux/commitdiff
[PATCH] PA-RISC update
authorMatthew Wilcox <willy@debian.org>
Fri, 13 Aug 2004 03:49:08 +0000 (20:49 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 13 Aug 2004 03:49:08 +0000 (20:49 -0700)
 - __PAGE_OFFSET is 0x10000000 (Randolph Chung)
 - PA8800 support (Grant Grundler)
 - debuglocks (Thibaut Varene)
 - PDC chassis disabling (Thibaut Varene)
 - Distinguish between Dinos in request_irq (Thibaut Varene)
 - Document interrupt registers (Randolph Chung)
 - Revamp CONFIG_DISCONTIGMEM support (Randolph Chung)
 - Remove STI console warning and special casing (Randolph Chung)
 - n4000 defconfig (Randolph Chung)
 - iosapic fixes (Bjorn Helgaas)
 - Fix a bug in entry.S where pa_dbit_lock was being trashed (Randolph Chung)
 - SMP support (Randolph Chung, Grant Grundler, James Bottomley)
 - Clear the pte in the fault handler (Joel Soete)
 - Change _exit prototype (Carlos O'Donell)
 - Better unwinding support (Randolph Chung)
 - GCC 3.4 fixes (Carlos O'Donell, Randolph Chung)

59 files changed:
Documentation/parisc/debugging
Documentation/parisc/registers
arch/parisc/Kconfig
arch/parisc/configs/a500_defconfig
arch/parisc/configs/b180_defconfig
arch/parisc/configs/c3000_defconfig
arch/parisc/configs/n4000_defconfig [new file with mode: 0644]
arch/parisc/defconfig
arch/parisc/kernel/cache.c
arch/parisc/kernel/entry.S
arch/parisc/kernel/firmware.c
arch/parisc/kernel/hardware.c
arch/parisc/kernel/head.S
arch/parisc/kernel/head64.S
arch/parisc/kernel/inventory.c
arch/parisc/kernel/irq.c
arch/parisc/kernel/parisc_ksyms.c
arch/parisc/kernel/pci-dma.c
arch/parisc/kernel/pdc_chassis.c
arch/parisc/kernel/process.c
arch/parisc/kernel/processor.c
arch/parisc/kernel/real2.S
arch/parisc/kernel/setup.c
arch/parisc/kernel/smp.c
arch/parisc/kernel/sys_parisc32.c
arch/parisc/kernel/traps.c
arch/parisc/kernel/unwind.c
arch/parisc/lib/Makefile
arch/parisc/lib/bitops.c
arch/parisc/lib/debuglocks.c [new file with mode: 0644]
arch/parisc/lib/io.c
arch/parisc/mm/init.c
drivers/parisc/dino.c
drivers/parisc/iommu-helpers.h
drivers/parisc/iosapic.c
drivers/parisc/lba_pci.c
drivers/parisc/led.c
drivers/parisc/sba_iommu.c
drivers/parisc/superio.c
include/asm-parisc/assembly.h
include/asm-parisc/bitops.h
include/asm-parisc/cacheflush.h
include/asm-parisc/dma-mapping.h
include/asm-parisc/hardware.h
include/asm-parisc/io.h
include/asm-parisc/mmzone.h
include/asm-parisc/numnodes.h [new file with mode: 0644]
include/asm-parisc/page.h
include/asm-parisc/pci.h
include/asm-parisc/pdc.h
include/asm-parisc/pdcpat.h
include/asm-parisc/pgalloc.h
include/asm-parisc/pgtable.h
include/asm-parisc/smp.h
include/asm-parisc/spinlock.h
include/asm-parisc/system.h
include/asm-parisc/thread_info.h
include/asm-parisc/unistd.h
include/asm-parisc/unwind.h

index 5e060917ac8f6291991bb45f2cf83a2ca194b1ee..d728594058e59b423c12192e948e6ccf86bc73bf 100644 (file)
@@ -7,7 +7,7 @@ linux/parisc.
 A lot of the assembly code currently runs in real mode, which means
 absolute addresses are used instead of virtual addresses as in the
 rest of the kernel.  To translate an absolute address to a virtual
-address you can lookup in System.map, add __PAGE_OFFSET (0xc0000000
+address you can lookup in System.map, add __PAGE_OFFSET (0x10000000
 currently).
 
 
@@ -21,7 +21,7 @@ the I/O range); the System Responder address is the address real-mode
 code tried to access.
 
 Typical values for the System Responder address are addresses larger
-than __PAGE_OFFSET (0xc0000000) which mean a virtual address didn't
+than __PAGE_OFFSET (0x10000000) which mean a virtual address didn't
 get translated to a physical address before real-mode code tried to
 access it.
 
index ad7edd91cf237e10d0163d89af1125c3d28ae060..08b9f558d4f8d399ee6f220212b9499a9bb1f938 100644 (file)
@@ -4,8 +4,6 @@ Register Usage for Linux/PA-RISC
 
        General Registers as specified by ABI
 
-       FPU Registers must not be used in kernel mode
-
        Control Registers
 
 CR 0 (Recovery Counter)                used for ptrace
@@ -13,11 +11,15 @@ CR 1-CR 7(undefined)                unused
 CR 8 (Protection ID)           per-process value*
 CR 9, 12, 13 (PIDS)            unused
 CR10 (CCR)                     lazy FPU saving*
-CR11                           as specified by ABI
+CR11                           as specified by ABI (SAR)
 CR14 (interruption vector)     initialized to fault_vector
 CR15 (EIEM)                    initialized to all ones*
 CR16 (Interval Timer)          read for cycle count/write starts Interval Tmr
 CR17-CR22                      interruption parameters
+CR19                           Interrupt Instruction Register
+CR20                           Interrupt Space Register
+CR21                           Interrupt Offset Register
+CR22                           Interrupt PSW
 CR23 (EIRR)                    read for pending interrupts/write clears bits
 CR24 (TR 0)                    Kernel Space Page Directory Pointer
 CR25 (TR 1)                    User   Space Page Directory Pointer
index ccd63a41f1116130c0ef56ea862323a270b92504..9e37d3dfe66be0acd631024d795d76e9904a3a93 100644 (file)
@@ -136,6 +136,20 @@ config SMP
 
          If you don't know what to do here, say N.
 
+config HOTPLUG_CPU
+       bool
+       default y if SMP
+       select HOTPLUG
+
+config DISCONTIGMEM
+       bool "Discontiguous memory support (EXPERIMENTAL)"
+       depends on EXPERIMENTAL
+       help
+         Say Y to support efficient handling of discontiguous physical memory,
+         for architectures which are either NUMA (Non-Uniform Memory Access)
+         or have huge holes in the physical address space for other reasons.
+         See <file:Documentation/vm/numa> for more.
+
 config PREEMPT
        bool
 #      bool "Preemptible Kernel"
@@ -204,6 +218,24 @@ config MAGIC_SYSRQ
          keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
          unless you really know what this hack does.
 
+config DEBUG_SPINLOCK
+        bool "Spinlock debugging"
+        depends on DEBUG_KERNEL
+        help
+          Say Y here and build SMP to catch missing spinlock initialization
+          and certain other kinds of spinlock errors commonly made.  This is
+          best used in conjunction with the NMI watchdog so that spinlock
+          deadlocks are also debuggable.
+
+config DEBUG_RWLOCK
+        bool "Read-write spinlock debugging"
+        depends on DEBUG_KERNEL && SMP
+        help
+          If you say Y here then read-write lock processing will count how many
+          times it has tried to get the lock and issue an error message after
+          too many attempts.  If you suspect a rwlock problem or a kernel
+          hacker asks for this option then say Y.  Otherwise say N.
+
 config FRAME_POINTER
        bool "Compile the kernel with frame pointers"
        help
index 5bfbaf9655b10bc4071608f6f2e34d811e620867..276fc0d17b58fb70889b68e10c139418ff8cf6d8 100644 (file)
@@ -20,19 +20,23 @@ CONFIG_BROKEN_ON_SMP=y
 #
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
 CONFIG_LOG_BUF_SHIFT=16
 CONFIG_HOTPLUG=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -51,11 +55,12 @@ CONFIG_KMOD=y
 # CONFIG_PA7000 is not set
 # CONFIG_PA7100LC is not set
 # CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
 CONFIG_PA8X00=y
 CONFIG_PA20=y
+CONFIG_PREFETCH=y
 CONFIG_PARISC64=y
 CONFIG_64BIT=y
-# CONFIG_PDC_NARROW is not set
 # CONFIG_SMP is not set
 # CONFIG_PREEMPT is not set
 CONFIG_COMPAT=y
@@ -71,8 +76,8 @@ CONFIG_PCI_LBA=y
 CONFIG_IOSAPIC=y
 CONFIG_IOMMU_SBA=y
 # CONFIG_SUPERIO is not set
-CONFIG_CHASSIS_LCD_LED=y
-# CONFIG_PDC_CHASSIS is not set
+# CONFIG_CHASSIS_LCD_LED is not set
+CONFIG_PDC_CHASSIS=y
 
 #
 # PCMCIA/CardBus support
@@ -168,7 +173,7 @@ CONFIG_SCSI_REPORT_LUNS=y
 # SCSI Transport Attributes
 #
 CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
+CONFIG_SCSI_FC_ATTRS=m
 
 #
 # SCSI low-level drivers
@@ -197,6 +202,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 CONFIG_SCSI_SYM53C8XX_IOMAPPED=y
+# CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
@@ -219,6 +225,7 @@ CONFIG_SCSI_DEBUG=m
 #
 # CONFIG_PCMCIA_FDOMAIN is not set
 # CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
 
 #
 # Multi-device support (RAID and LVM)
@@ -249,6 +256,7 @@ CONFIG_FUSION_CTL=m
 #
 # I2O device support
 #
+# CONFIG_I2O is not set
 
 #
 # Networking support
@@ -284,8 +292,6 @@ CONFIG_INET_ESP=m
 #
 # CONFIG_IP_VS is not set
 # CONFIG_IPV6 is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 
@@ -345,6 +351,8 @@ CONFIG_IP_NF_ARPFILTER=m
 CONFIG_IP_NF_ARP_MANGLE=m
 # CONFIG_IP_NF_COMPAT_IPCHAINS is not set
 # CONFIG_IP_NF_COMPAT_IPFWADM is not set
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_RAW=m
 CONFIG_XFRM=y
 CONFIG_XFRM_USER=m
 
@@ -353,7 +361,9 @@ CONFIG_XFRM_USER=m
 #
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
 # CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
 CONFIG_LLC=m
 CONFIG_LLC2=m
 # CONFIG_IPX is not set
@@ -374,18 +384,23 @@ CONFIG_LLC2=m
 # Network testing
 #
 CONFIG_NET_PKTGEN=m
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
 CONFIG_DUMMY=m
 CONFIG_BONDING=m
 # CONFIG_EQUALIZER is not set
 CONFIG_TUN=m
 # CONFIG_ETHERTAP is not set
 
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -432,7 +447,6 @@ CONFIG_8139TOO=m
 # CONFIG_8139TOO_TUNE_TWISTER is not set
 # CONFIG_8139TOO_8129 is not set
 # CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_8139_RXBUF_IDX=1
 # CONFIG_SIS900 is not set
 CONFIG_EPIC100=m
 # CONFIG_SUNDANCE is not set
@@ -451,7 +465,6 @@ CONFIG_E1000_NAPI=y
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
 # CONFIG_SK98LIN is not set
 CONFIG_TIGON3=m
 
@@ -460,17 +473,13 @@ CONFIG_TIGON3=m
 #
 CONFIG_IXGB=m
 CONFIG_IXGB_NAPI=y
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-# CONFIG_PPPOE is not set
-# CONFIG_SLIP is not set
+CONFIG_S2IO=m
+CONFIG_S2IO_NAPI=y
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
 
 #
 # Wireless LAN (non-hamradio)
@@ -512,19 +521,6 @@ CONFIG_AIRO_CS=m
 # CONFIG_PRISM54 is not set
 CONFIG_NET_WIRELESS=y
 
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-# CONFIG_NET_FC is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
 #
 # PCMCIA network device support
 #
@@ -539,21 +535,23 @@ CONFIG_PCMCIA_XIRC2PS=m
 # CONFIG_PCMCIA_AXNET is not set
 
 #
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# Bluetooth support
+# Wan interfaces
 #
-# CONFIG_BT is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # ISDN subsystem
@@ -750,6 +748,7 @@ CONFIG_VFAT_FS=m
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVPTS_FS_XATTR is not set
 # CONFIG_TMPFS is not set
@@ -798,7 +797,6 @@ CONFIG_SMB_NLS_REMOTE="cp437"
 CONFIG_CIFS=m
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
-# CONFIG_INTERMEZZO_FS is not set
 # CONFIG_AFS_FS is not set
 
 #
@@ -891,11 +889,13 @@ CONFIG_CRYPTO_CAST6=m
 # CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=m
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_CRC32C=m
 CONFIG_CRYPTO_TEST=m
 
 #
 # Library routines
 #
 CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=m
 CONFIG_ZLIB_DEFLATE=m
index 65f186377587b133b795c47d0f37d0a635a32bc5..b67d801404e136bc7b74057cf40d4eabc9c4b548 100644 (file)
@@ -21,16 +21,20 @@ CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
 CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_HOTPLUG is not set
 # CONFIG_IKCONFIG is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -45,8 +49,9 @@ CONFIG_OBSOLETE_MODPARM=y
 # Processor type and features
 #
 # CONFIG_PA7000 is not set
-# CONFIG_PA7100LC is not set
-CONFIG_PA7200=y
+CONFIG_PA7100LC=y
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
 # CONFIG_PA8X00 is not set
 CONFIG_PA11=y
 # CONFIG_64BIT is not set
@@ -70,7 +75,7 @@ CONFIG_PCI_LEGACY_PROC=y
 CONFIG_PCI_NAMES=y
 CONFIG_GSC_DINO=y
 # CONFIG_PCI_LBA is not set
-# CONFIG_CHASSIS_LCD_LED is not set
+CONFIG_CHASSIS_LCD_LED=y
 # CONFIG_PDC_CHASSIS is not set
 
 #
@@ -86,6 +91,7 @@ CONFIG_BINFMT_ELF=y
 #
 # Generic Driver Options
 #
+CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_DEBUG_DRIVER=y
 
 #
@@ -121,7 +127,7 @@ CONFIG_PARPORT_GSC=y
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_CRYPTOLOOP=y
 # CONFIG_BLK_DEV_NBD is not set
-CONFIG_BLK_DEV_CARMEL=y
+# CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 
 #
@@ -149,7 +155,6 @@ CONFIG_CHR_DEV_SG=y
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
 #
 # CONFIG_SCSI_MULTI_LUN is not set
-# CONFIG_SCSI_REPORT_LUNS is not set
 # CONFIG_SCSI_CONSTANTS is not set
 # CONFIG_SCSI_LOGGING is not set
 
@@ -163,6 +168,7 @@ CONFIG_SCSI_SPI_ATTRS=y
 # SCSI low-level drivers
 #
 # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
 # CONFIG_SCSI_7000FASST is not set
 # CONFIG_SCSI_ACARD is not set
 # CONFIG_SCSI_AHA152X is not set
@@ -171,11 +177,10 @@ CONFIG_SCSI_SPI_ATTRS=y
 # CONFIG_SCSI_AIC7XXX is not set
 # CONFIG_SCSI_AIC7XXX_OLD is not set
 # CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_DPT_I2O is not set
 # CONFIG_SCSI_IN2000 is not set
 # CONFIG_SCSI_MEGARAID is not set
 # CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
 # CONFIG_SCSI_DTC3280 is not set
 # CONFIG_SCSI_EATA is not set
@@ -197,6 +202,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_ZALON is not set
 # CONFIG_SCSI_PAS16 is not set
 # CONFIG_SCSI_PSI240I is not set
@@ -278,10 +284,10 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
 # CONFIG_NETFILTER is not set
+# CONFIG_BRIDGE is not set
 # CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
 # CONFIG_ATALK is not set
@@ -290,21 +296,27 @@ CONFIG_IP_PNP_BOOTP=y
 # QoS and/or fair queueing
 #
 # CONFIG_NET_SCHED is not set
+# CONFIG_NET_CLS_ROUTE is not set
 
 #
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
 
 #
 # ARCnet devices
 #
 # CONFIG_ARCNET is not set
-# CONFIG_DUMMY is not set
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
 
 #
 # Ethernet (10 or 100Mbit)
@@ -351,15 +363,12 @@ CONFIG_TULIP=y
 # Ethernet (10000 Mbit)
 #
 # CONFIG_IXGB is not set
-# CONFIG_FDDI is not set
-# CONFIG_PLIP is not set
-CONFIG_PPP=y
-# CONFIG_PPP_FILTER is not set
-# CONFIG_PPP_ASYNC is not set
-# CONFIG_PPP_SYNC_TTY is not set
-# CONFIG_PPP_DEFLATE is not set
-# CONFIG_PPP_BSDCOMP is not set
-# CONFIG_SLIP is not set
+# CONFIG_S2IO is not set
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
 
 #
 # Wireless LAN (non-hamradio)
@@ -384,33 +393,20 @@ CONFIG_NET_RADIO=y
 #
 CONFIG_NET_WIRELESS=y
 
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-# CONFIG_NET_FC is not set
-
 #
 # Wan interfaces
 #
 # CONFIG_WAN is not set
-
-#
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# Bluetooth support
-#
-# CONFIG_BT is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_FDDI is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=y
+# CONFIG_PPP_FILTER is not set
+# CONFIG_PPP_ASYNC is not set
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_PPP_DEFLATE is not set
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
 
 #
 # ISDN subsystem
@@ -473,7 +469,6 @@ CONFIG_INPUT_MOUSE=y
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_PCSPKR is not set
 # CONFIG_INPUT_UINPUT is not set
 # CONFIG_HP_SDC_RTC is not set
 
@@ -542,6 +537,11 @@ CONFIG_GEN_RTC=y
 #
 # CONFIG_I2C is not set
 
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
 #
 # Misc devices
 #
@@ -560,8 +560,10 @@ CONFIG_GEN_RTC=y
 # Graphics support
 #
 CONFIG_FB=y
+# CONFIG_FB_CIRRUS is not set
 # CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 CONFIG_FB_STI=y
 # CONFIG_FB_RIVA is not set
@@ -587,7 +589,6 @@ CONFIG_DUMMY_CONSOLE_COLUMNS=160
 CONFIG_DUMMY_CONSOLE_ROWS=64
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_PCI_CONSOLE=y
 # CONFIG_FONTS is not set
 CONFIG_FONT_8x8=y
 CONFIG_FONT_8x16=y
@@ -645,7 +646,8 @@ CONFIG_JOLIET=y
 #
 # DOS/FAT/NT Filesystems
 #
-# CONFIG_FAT_FS is not set
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
 # CONFIG_NTFS_FS is not set
 
 #
@@ -653,6 +655,7 @@ CONFIG_JOLIET=y
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
 # CONFIG_HUGETLB_PAGE is not set
@@ -662,6 +665,7 @@ CONFIG_RAMFS=y
 # Miscellaneous filesystems
 #
 # CONFIG_HFSPLUS_FS is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -676,6 +680,7 @@ CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
 CONFIG_NFSD=y
 CONFIG_NFSD_V3=y
+CONFIG_NFSD_TCP=y
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
@@ -720,6 +725,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # CONFIG_NLS_ISO8859_8 is not set
 # CONFIG_NLS_CODEPAGE_1250 is not set
 # CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
 # CONFIG_NLS_ISO8859_1 is not set
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
@@ -741,6 +747,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SPINLOCK is not set
 CONFIG_FRAME_POINTER=y
 # CONFIG_DEBUG_INFO is not set
 
@@ -770,12 +777,16 @@ CONFIG_CRYPTO=y
 # CONFIG_CRYPTO_AES is not set
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
 # CONFIG_CRYPTO_ARC4 is not set
 # CONFIG_CRYPTO_DEFLATE is not set
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
 # CONFIG_CRYPTO_TEST is not set
 
 #
 # Library routines
 #
+# CONFIG_CRC_CCITT is not set
 CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
index 78f79eb23e377828cdd6ff16cd743f468ecf938f..087dfcd1d4c99fc258e00b21311d9d91f5946750 100644 (file)
@@ -20,19 +20,23 @@ CONFIG_BROKEN_ON_SMP=y
 #
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
 CONFIG_LOG_BUF_SHIFT=16
 CONFIG_HOTPLUG=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_EMBEDDED=y
 CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
 CONFIG_FUTEX=y
 CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -51,8 +55,10 @@ CONFIG_KMOD=y
 # CONFIG_PA7000 is not set
 # CONFIG_PA7100LC is not set
 # CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
 CONFIG_PA8X00=y
 CONFIG_PA20=y
+CONFIG_PREFETCH=y
 # CONFIG_PARISC64 is not set
 # CONFIG_64BIT is not set
 # CONFIG_SMP is not set
@@ -70,7 +76,7 @@ CONFIG_PCI_LBA=y
 CONFIG_IOSAPIC=y
 CONFIG_IOMMU_SBA=y
 CONFIG_SUPERIO=y
-# CONFIG_CHASSIS_LCD_LED is not set
+CONFIG_CHASSIS_LCD_LED=y
 # CONFIG_PDC_CHASSIS is not set
 
 #
@@ -185,6 +191,7 @@ CONFIG_BLK_DEV_SIIMAGE=m
 # CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDEDMA_IVB is not set
 # CONFIG_IDEDMA_AUTO is not set
@@ -218,7 +225,7 @@ CONFIG_SCSI_REPORT_LUNS=y
 # SCSI Transport Attributes
 #
 CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
+CONFIG_SCSI_FC_ATTRS=m
 
 #
 # SCSI low-level drivers
@@ -236,7 +243,9 @@ CONFIG_SCSI_SATA=y
 # CONFIG_SCSI_SATA_SVW is not set
 CONFIG_SCSI_ATA_PIIX=m
 CONFIG_SCSI_SATA_PROMISE=m
+# CONFIG_SCSI_SATA_SX4 is not set
 CONFIG_SCSI_SATA_SIL=m
+# CONFIG_SCSI_SATA_SIS is not set
 CONFIG_SCSI_SATA_VIA=m
 # CONFIG_SCSI_SATA_VITESSE is not set
 # CONFIG_SCSI_BUSLOGIC is not set
@@ -254,6 +263,7 @@ CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
+# CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_PCI2000 is not set
 # CONFIG_SCSI_PCI2220I is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
@@ -279,6 +289,7 @@ CONFIG_SCSI_DEBUG=m
 # CONFIG_PCMCIA_FDOMAIN is not set
 # CONFIG_PCMCIA_NINJA_SCSI is not set
 CONFIG_PCMCIA_QLOGIC=m
+# CONFIG_PCMCIA_SYM53C500 is not set
 
 #
 # Multi-device support (RAID and LVM)
@@ -346,8 +357,6 @@ CONFIG_INET_ESP=m
 #
 # CONFIG_IP_VS is not set
 # CONFIG_IPV6 is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
 CONFIG_NETFILTER=y
 CONFIG_NETFILTER_DEBUG=y
 
@@ -407,6 +416,7 @@ CONFIG_IP_NF_ARPFILTER=m
 CONFIG_IP_NF_ARP_MANGLE=m
 CONFIG_IP_NF_COMPAT_IPCHAINS=m
 CONFIG_IP_NF_COMPAT_IPFWADM=m
+# CONFIG_IP_NF_RAW is not set
 CONFIG_XFRM=y
 CONFIG_XFRM_USER=m
 
@@ -415,7 +425,9 @@ CONFIG_XFRM_USER=m
 #
 # CONFIG_IP_SCTP is not set
 # CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
 # CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
 CONFIG_LLC=m
 CONFIG_LLC2=m
 # CONFIG_IPX is not set
@@ -436,18 +448,23 @@ CONFIG_LLC2=m
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
 CONFIG_DUMMY=m
 CONFIG_BONDING=m
 # CONFIG_EQUALIZER is not set
 CONFIG_TUN=m
 # CONFIG_ETHERTAP is not set
 
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -493,7 +510,6 @@ CONFIG_8139TOO=m
 # CONFIG_8139TOO_TUNE_TWISTER is not set
 # CONFIG_8139TOO_8129 is not set
 # CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_8139_RXBUF_IDX=1
 # CONFIG_SIS900 is not set
 # CONFIG_EPIC100 is not set
 # CONFIG_SUNDANCE is not set
@@ -512,7 +528,6 @@ CONFIG_E1000=m
 # CONFIG_HAMACHI is not set
 # CONFIG_YELLOWFIN is not set
 # CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
 # CONFIG_SK98LIN is not set
 CONFIG_TIGON3=m
 
@@ -521,36 +536,17 @@ CONFIG_TIGON3=m
 #
 CONFIG_IXGB=y
 CONFIG_IXGB_NAPI=y
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PPP=m
-# CONFIG_PPP_MULTILINK is not set
-# CONFIG_PPP_FILTER is not set
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPPOE=m
-# CONFIG_SLIP is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
+# CONFIG_S2IO is not set
 
 #
 # Token Ring devices
 #
 # CONFIG_TR is not set
-# CONFIG_NET_FC is not set
-# CONFIG_RCPCI is not set
-# CONFIG_SHAPER is not set
-# CONFIG_NETCONSOLE is not set
 
 #
-# Wan interfaces
+# Wireless LAN (non-hamradio)
 #
-# CONFIG_WAN is not set
+# CONFIG_NET_RADIO is not set
 
 #
 # PCMCIA network device support
@@ -566,21 +562,23 @@ CONFIG_PCMCIA_XIRC2PS=m
 CONFIG_PCMCIA_AXNET=m
 
 #
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# Bluetooth support
+# Wan interfaces
 #
-# CONFIG_BT is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPPOE=m
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
 
 #
 # ISDN subsystem
@@ -727,6 +725,7 @@ CONFIG_FB=y
 # CONFIG_FB_CIRRUS is not set
 # CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 CONFIG_FB_STI=y
 # CONFIG_FB_RIVA is not set
@@ -833,6 +832,7 @@ CONFIG_USB_WACOM=m
 CONFIG_USB_KBTAB=m
 # CONFIG_USB_POWERMATE is not set
 # CONFIG_USB_MTOUCH is not set
+# CONFIG_USB_EGALAX is not set
 # CONFIG_USB_XPAD is not set
 # CONFIG_USB_ATI_REMOTE is not set
 
@@ -881,6 +881,8 @@ CONFIG_USB_HPUSBSCSI=m
 CONFIG_USB_LEGOTOWER=m
 # CONFIG_USB_LCD is not set
 # CONFIG_USB_LED is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGETSERVO is not set
 # CONFIG_USB_TEST is not set
 
 #
@@ -931,6 +933,7 @@ CONFIG_VFAT_FS=m
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVFS_FS is not set
 # CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
@@ -976,7 +979,6 @@ CONFIG_SUNRPC=y
 # CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
 # CONFIG_CODA_FS is not set
-# CONFIG_INTERMEZZO_FS is not set
 # CONFIG_AFS_FS is not set
 
 #
@@ -1069,11 +1071,13 @@ CONFIG_CRYPTO_CAST6=m
 # CONFIG_CRYPTO_ARC4 is not set
 CONFIG_CRYPTO_DEFLATE=m
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_CRC32C=m
 CONFIG_CRYPTO_TEST=m
 
 #
 # Library routines
 #
 CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=m
 CONFIG_ZLIB_DEFLATE=m
diff --git a/arch/parisc/configs/n4000_defconfig b/arch/parisc/configs/n4000_defconfig
new file mode 100644 (file)
index 0000000..8df4bb1
--- /dev/null
@@ -0,0 +1,905 @@
+#
+# Automatically generated make config: don't edit
+#
+CONFIG_PARISC=y
+CONFIG_MMU=y
+CONFIG_STACK_GROWSUP=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+# CONFIG_CLEAN_COMPILE is not set
+# CONFIG_STANDALONE is not set
+CONFIG_BROKEN=y
+CONFIG_BROKEN_ON_SMP=y
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_HOTPLUG=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
+CONFIG_KMOD=y
+
+#
+# Processor type and features
+#
+# CONFIG_PA7000 is not set
+# CONFIG_PA7100LC is not set
+# CONFIG_PA7200 is not set
+# CONFIG_PA7300LC is not set
+CONFIG_PA8X00=y
+CONFIG_PA20=y
+CONFIG_PREFETCH=y
+CONFIG_PARISC64=y
+CONFIG_64BIT=y
+# CONFIG_SMP is not set
+CONFIG_DISCONTIGMEM=y
+# CONFIG_PREEMPT is not set
+CONFIG_COMPAT=y
+
+#
+# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
+#
+# CONFIG_GSC is not set
+CONFIG_PCI=y
+CONFIG_PCI_LEGACY_PROC=y
+CONFIG_PCI_NAMES=y
+CONFIG_PCI_LBA=y
+CONFIG_IOSAPIC=y
+CONFIG_IOMMU_SBA=y
+# CONFIG_SUPERIO is not set
+CONFIG_CHASSIS_LCD_LED=y
+# CONFIG_PDC_CHASSIS is not set
+
+#
+# PCMCIA/CardBus support
+#
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_YENTA=m
+CONFIG_CARDBUS=y
+# CONFIG_I82092 is not set
+# CONFIG_TCIC is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_FW_LOADER is not set
+CONFIG_DEBUG_DRIVER=y
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+CONFIG_BLK_DEV_UMEM=m
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_CARMEL is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=6144
+CONFIG_BLK_DEV_INITRD=y
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI=y
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=y
+CONFIG_SCSI_FC_ATTRS=m
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_ADVANSYS is not set
+# CONFIG_SCSI_MEGARAID is not set
+# CONFIG_SCSI_SATA is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_CPQFCTS is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_EATA_PIO is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+CONFIG_SCSI_SYM53C8XX_2=y
+CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
+CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
+CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
+CONFIG_SCSI_SYM53C8XX_IOMAPPED=y
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_PCI2000 is not set
+# CONFIG_SCSI_PCI2220I is not set
+# CONFIG_SCSI_QLOGIC_ISP is not set
+CONFIG_SCSI_QLOGIC_FC=m
+# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
+CONFIG_SCSI_QLOGIC_1280=m
+CONFIG_SCSI_QLA2XXX=y
+# CONFIG_SCSI_QLA21XX is not set
+# CONFIG_SCSI_QLA22XX is not set
+CONFIG_SCSI_QLA2300=m
+CONFIG_SCSI_QLA2322=m
+CONFIG_SCSI_QLA6312=m
+CONFIG_SCSI_QLA6322=m
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+CONFIG_SCSI_DEBUG=m
+
+#
+# PCMCIA SCSI adapter support
+#
+# CONFIG_PCMCIA_FDOMAIN is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+CONFIG_MD_LINEAR=y
+CONFIG_MD_RAID0=y
+CONFIG_MD_RAID1=y
+# CONFIG_MD_RAID5 is not set
+# CONFIG_MD_RAID6 is not set
+# CONFIG_MD_MULTIPATH is not set
+# CONFIG_BLK_DEV_DM is not set
+
+#
+# Fusion MPT device support
+#
+CONFIG_FUSION=m
+CONFIG_FUSION_MAX_SGE=40
+CONFIG_FUSION_ISENSE=m
+CONFIG_FUSION_CTL=m
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_NETLINK_DEV=y
+CONFIG_UNIX=y
+CONFIG_NET_KEY=m
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+# CONFIG_INET_IPCOMP is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+# CONFIG_IPV6 is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_FTP=m
+CONFIG_IP_NF_IRC=m
+CONFIG_IP_NF_TFTP=m
+CONFIG_IP_NF_AMANDA=m
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_LIMIT=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_PKTTYPE=m
+CONFIG_IP_NF_MATCH_MARK=m
+CONFIG_IP_NF_MATCH_MULTIPORT=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_DSCP=m
+CONFIG_IP_NF_MATCH_AH_ESP=m
+CONFIG_IP_NF_MATCH_LENGTH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_TCPMSS=m
+CONFIG_IP_NF_MATCH_HELPER=m
+CONFIG_IP_NF_MATCH_STATE=m
+CONFIG_IP_NF_MATCH_CONNTRACK=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_NAT=m
+CONFIG_IP_NF_NAT_NEEDED=y
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_SAME=m
+# CONFIG_IP_NF_NAT_LOCAL is not set
+CONFIG_IP_NF_NAT_SNMP_BASIC=m
+CONFIG_IP_NF_NAT_IRC=m
+CONFIG_IP_NF_NAT_FTP=m
+CONFIG_IP_NF_NAT_TFTP=m
+CONFIG_IP_NF_NAT_AMANDA=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_DSCP=m
+CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_CLASSIFY=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+CONFIG_IP_NF_TARGET_NOTRACK=m
+CONFIG_IP_NF_RAW=m
+CONFIG_XFRM=y
+CONFIG_XFRM_USER=m
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+CONFIG_LLC2=m
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_NET_DIVERT is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_NET_FASTROUTE is not set
+# CONFIG_NET_HW_FLOWCONTROL is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+CONFIG_NET_PKTGEN=m
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+# CONFIG_ETHERTAP is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+CONFIG_NET_VENDOR_3COM=y
+CONFIG_VORTEX=m
+CONFIG_TYPHOON=m
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+CONFIG_DE2104X=y
+CONFIG_TULIP=y
+# CONFIG_TULIP_MWI is not set
+CONFIG_TULIP_MMIO=y
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+CONFIG_PCMCIA_XIRCOM=m
+CONFIG_PCMCIA_XIRTULIP=m
+CONFIG_HP100=m
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_B44 is not set
+# CONFIG_FORCEDETH is not set
+# CONFIG_DGRS is not set
+CONFIG_EEPRO100=m
+# CONFIG_EEPRO100_PIO is not set
+CONFIG_E100=m
+CONFIG_E100_NAPI=y
+# CONFIG_FEALNX is not set
+CONFIG_NATSEMI=m
+# CONFIG_NE2K_PCI is not set
+# CONFIG_8139CP is not set
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_SIS900 is not set
+CONFIG_EPIC100=m
+# CONFIG_SUNDANCE is not set
+CONFIG_VIA_RHINE=m
+CONFIG_VIA_RHINE_MMIO=y
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_ACENIC=m
+CONFIG_ACENIC_OMIT_TIGON_I=y
+CONFIG_DL2K=m
+CONFIG_E1000=m
+CONFIG_E1000_NAPI=y
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SK98LIN is not set
+CONFIG_TIGON3=m
+
+#
+# Ethernet (10000 Mbit)
+#
+CONFIG_IXGB=m
+CONFIG_IXGB_NAPI=y
+CONFIG_S2IO=m
+CONFIG_S2IO_NAPI=y
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+# CONFIG_PCMCIA_RAYCS is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+# CONFIG_AIRO is not set
+CONFIG_HERMES=m
+CONFIG_PLX_HERMES=m
+CONFIG_TMD_HERMES=m
+CONFIG_PCI_HERMES=m
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_AIRO_CS=m
+# CONFIG_PCMCIA_WL3501 is not set
+
+#
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+#
+# CONFIG_PRISM54 is not set
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+# CONFIG_PCMCIA_FMVJ18X is not set
+# CONFIG_PCMCIA_PCNET is not set
+# CONFIG_PCMCIA_NMCLAN is not set
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+# CONFIG_PCMCIA_AXNET is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+# CONFIG_SERIO is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_MULTIPORT is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_MUX is not set
+CONFIG_PDC_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_QIC02_TAPE is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_GEN_RTC=y
+CONFIG_GEN_RTC_X=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_FTAPE is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=256
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE_COLUMNS=160
+CONFIG_DUMMY_CONSOLE_ROWS=64
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB is not set
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+# CONFIG_REISERFS_FS is not set
+CONFIG_JFS_FS=m
+# CONFIG_JFS_POSIX_ACL is not set
+# CONFIG_JFS_DEBUG is not set
+# CONFIG_JFS_STATISTICS is not set
+CONFIG_XFS_FS=m
+# CONFIG_XFS_RT is not set
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+CONFIG_UDF_FS=m
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
+# CONFIG_DEVFS_FS is not set
+# CONFIG_DEVPTS_FS_XATTR is not set
+CONFIG_TMPFS=y
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+CONFIG_UFS_FS=m
+# CONFIG_UFS_FS_WRITE is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFS_DIRECTIO=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_SMB_FS=m
+CONFIG_SMB_NLS_DEFAULT=y
+CONFIG_SMB_NLS_REMOTE="cp437"
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+CONFIG_NLS_CODEPAGE_863=m
+# CONFIG_NLS_CODEPAGE_864 is not set
+CONFIG_NLS_CODEPAGE_865=m
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=m
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_FRAME_POINTER is not set
+# CONFIG_DEBUG_INFO is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+# CONFIG_CRYPTO_ARC4 is not set
+CONFIG_CRYPTO_DEFLATE=m
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_TEST=m
+
+#
+# Library routines
+#
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
index ea5cbb23be9f1fc7997278c11814a8509fc685e7..ebd6301aa5999725141e5cdd0aba2c5e0f4eae5f 100644 (file)
@@ -888,6 +888,8 @@ CONFIG_OPROFILE=y
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_RWLOCK is not set
 CONFIG_FRAME_POINTER=y
 # CONFIG_DEBUG_INFO is not set
 
index 9fc0614401223e72cc94726b92f654b51d85d29b..eadc88c5a3d8a7e931b9d950b685f75df296eaca 100644 (file)
@@ -69,7 +69,7 @@ update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
 {
        struct page *page = pte_page(pte);
 
-       if (VALID_PAGE(page) && page_mapping(page) &&
+       if (pfn_valid(page_to_pfn(page)) && page_mapping(page) &&
            test_bit(PG_dcache_dirty, &page->flags)) {
 
                flush_kernel_dcache_page(page_address(page));
@@ -82,10 +82,11 @@ show_cache_info(struct seq_file *m)
 {
        seq_printf(m, "I-cache\t\t: %ld KB\n", 
                cache_info.ic_size/1024 );
-       seq_printf(m, "D-cache\t\t: %ld KB (%s)%s\n", 
+       seq_printf(m, "D-cache\t\t: %ld KB (%s%s, %d-way associative)\n", 
                cache_info.dc_size/1024,
                (cache_info.dc_conf.cc_wt ? "WT":"WB"),
-               (cache_info.dc_conf.cc_sh ? " - shared I/D":"")
+               (cache_info.dc_conf.cc_sh ? ", shared I/D":""),
+               (cache_info.dc_conf.cc_assoc)
        );
 
        seq_printf(m, "ITLB entries\t: %ld\n" "DTLB entries\t: %ld%s\n",
@@ -123,51 +124,60 @@ parisc_cache_init(void)
                panic("parisc_cache_init: pdc_cache_info failed");
 
 #if 0
-       printk(KERN_DEBUG "ic_size %lx dc_size %lx it_size %lx pdc_cache_info %d*long pdc_cache_cf %d\n",
-           cache_info.ic_size,
-           cache_info.dc_size,
-           cache_info.it_size,
-           sizeof (struct pdc_cache_info) / sizeof (long),
-           sizeof (struct pdc_cache_cf)
-       );
-
-       printk(KERN_DEBUG "dc base %x dc stride %x dc count %x dc loop %d\n",
-           cache_info.dc_base,
-           cache_info.dc_stride,
-           cache_info.dc_count,
-           cache_info.dc_loop);
-
-       printk(KERN_DEBUG "dc conf: alias %d block %d line %d wt %d sh %d cst %d assoc %d\n",
-           cache_info.dc_conf.cc_alias,
-           cache_info.dc_conf.cc_block,
-           cache_info.dc_conf.cc_line,
-           cache_info.dc_conf.cc_wt,
-           cache_info.dc_conf.cc_sh,
-           cache_info.dc_conf.cc_cst,
-           cache_info.dc_conf.cc_assoc);
-
-       printk(KERN_DEBUG "ic conf: alias %d block %d line %d wt %d sh %d cst %d assoc %d\n",
-           cache_info.ic_conf.cc_alias,
-           cache_info.ic_conf.cc_block,
-           cache_info.ic_conf.cc_line,
-           cache_info.ic_conf.cc_wt,
-           cache_info.ic_conf.cc_sh,
-           cache_info.ic_conf.cc_cst,
-           cache_info.ic_conf.cc_assoc);
-
-       printk(KERN_DEBUG "dt conf: sh %d page %d cst %d aid %d pad1 %d \n",
-           cache_info.dt_conf.tc_sh,
-           cache_info.dt_conf.tc_page,
-           cache_info.dt_conf.tc_cst,
-           cache_info.dt_conf.tc_aid,
-           cache_info.dt_conf.tc_pad1);
-
-       printk(KERN_DEBUG "it conf: sh %d page %d cst %d aid %d pad1 %d \n",
-           cache_info.it_conf.tc_sh,
-           cache_info.it_conf.tc_page,
-           cache_info.it_conf.tc_cst,
-           cache_info.it_conf.tc_aid,
-           cache_info.it_conf.tc_pad1);
+       printk("ic_size %lx dc_size %lx it_size %lx\n",
+               cache_info.ic_size,
+               cache_info.dc_size,
+               cache_info.it_size);
+
+       printk("DC  base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx\n",
+               cache_info.dc_base,
+               cache_info.dc_stride,
+               cache_info.dc_count,
+               cache_info.dc_loop);
+
+       printk("dc_conf = 0x%lx  alias %d blk %d line %d shift %d\n",
+               *(unsigned long *) (&cache_info.dc_conf),
+               cache_info.dc_conf.cc_alias,
+               cache_info.dc_conf.cc_block,
+               cache_info.dc_conf.cc_line,
+               cache_info.dc_conf.cc_shift);
+       printk("        wt %d sh %d cst %d assoc %d\n",
+               cache_info.dc_conf.cc_wt,
+               cache_info.dc_conf.cc_sh,
+               cache_info.dc_conf.cc_cst,
+               cache_info.dc_conf.cc_assoc);
+
+       printk("IC  base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx\n",
+               cache_info.ic_base,
+               cache_info.ic_stride,
+               cache_info.ic_count,
+               cache_info.ic_loop);
+
+       printk("ic_conf = 0x%lx  alias %d blk %d line %d shift %d\n",
+               *(unsigned long *) (&cache_info.ic_conf),
+               cache_info.ic_conf.cc_alias,
+               cache_info.ic_conf.cc_block,
+               cache_info.ic_conf.cc_line,
+               cache_info.ic_conf.cc_shift);
+       printk("        wt %d sh %d cst %d assoc %d\n",
+               cache_info.ic_conf.cc_wt,
+               cache_info.ic_conf.cc_sh,
+               cache_info.ic_conf.cc_cst,
+               cache_info.ic_conf.cc_assoc);
+
+       printk("D-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n",
+               cache_info.dt_conf.tc_sh,
+               cache_info.dt_conf.tc_page,
+               cache_info.dt_conf.tc_cst,
+               cache_info.dt_conf.tc_aid,
+               cache_info.dt_conf.tc_pad1);
+
+       printk("I-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n",
+               cache_info.it_conf.tc_sh,
+               cache_info.it_conf.tc_page,
+               cache_info.it_conf.tc_cst,
+               cache_info.it_conf.tc_aid,
+               cache_info.it_conf.tc_pad1);
 #endif
 
        split_tlb = 0;
@@ -179,10 +189,14 @@ parisc_cache_init(void)
                split_tlb = 1;
        }
 
-       dcache_stride = (1 << (cache_info.dc_conf.cc_block + 3)) *
-                                               cache_info.dc_conf.cc_line;
-       icache_stride = (1 << (cache_info.ic_conf.cc_block + 3)) *
-                                               cache_info.ic_conf.cc_line;
+       /* "New and Improved" version from Jim Hull 
+        *      (1 << (cc_block-1)) * (cc_line << (4 + cnf.cc_shift))
+        */
+#define CAFL_STRIDE(cnf) (cnf.cc_line << (3 + cnf.cc_block + cnf.cc_shift))
+       dcache_stride = CAFL_STRIDE(cache_info.dc_conf);
+       icache_stride = CAFL_STRIDE(cache_info.ic_conf);
+#undef CAFL_STRIDE
+
 #ifndef CONFIG_PA20
        if (pdc_btlb_info(&btlb_info) < 0) {
                memset(&btlb_info, 0, sizeof btlb_info);
@@ -191,8 +205,8 @@ parisc_cache_init(void)
 
        if ((boot_cpu_data.pdc.capabilities & PDC_MODEL_NVA_MASK) ==
                                                PDC_MODEL_NVA_UNSUPPORTED) {
-               printk(KERN_WARNING "Only equivalent aliasing supported\n");
-#ifndef CONFIG_SMP
+               printk(KERN_WARNING "parisc_cache_init: Only equivalent aliasing supported!\n");
+#if 0
                panic("SMP kernel required to avoid non-equivalent aliasing");
 #endif
        }
@@ -228,7 +242,7 @@ void disable_sr_hashing(void)
        disable_sr_hashing_asm(srhash_type);
 }
 
-void __flush_dcache_page(struct page *page)
+void flush_dcache_page(struct page *page)
 {
        struct address_space *mapping = page_mapping(page);
        struct vm_area_struct *mpnt = NULL;
@@ -236,6 +250,14 @@ void __flush_dcache_page(struct page *page)
        unsigned long offset;
        unsigned long addr;
        pgoff_t pgoff;
+       pte_t *pte;
+       unsigned long pfn = page_to_pfn(page);
+
+
+       if (mapping && !mapping_mapped(mapping)) {
+               set_bit(PG_dcache_dirty, &page->flags);
+               return;
+       }
 
        flush_kernel_dcache_page(page_address(page));
 
@@ -262,16 +284,23 @@ void __flush_dcache_page(struct page *page)
                 * isn't there, there's no point exciting the
                 * nadtlb handler into a nullification frenzy */
 
-               if (!translation_exists(mpnt, addr))
+
+               if(!(pte = translation_exists(mpnt, addr)))
                        continue;
 
+               /* make sure we really have this page: the private
+                * mappings may cover this area but have COW'd this
+                * particular page */
+               if(pte_pfn(*pte) != pfn)
+                       continue;
+
                __flush_cache_page(mpnt, addr);
 
                break;
        }
        flush_dcache_mmap_unlock(mapping);
 }
-EXPORT_SYMBOL(__flush_dcache_page);
+EXPORT_SYMBOL(flush_dcache_page);
 
 /* Defined in arch/parisc/kernel/pacache.S */
 EXPORT_SYMBOL(flush_kernel_dcache_range_asm);
index 9c284947db7c93ac99720fe23b96e0f07243e1d9..baee632786997d5284c727113a0d55908d7438e2 100644 (file)
        /* Look up a PTE in a 2-Level scheme (faulting at each
         * level if the entry isn't present 
         *
-        * NOTE: we use ldw even for LP64 because our pte
-        * and pmd are allocated <4GB */
+        * NOTE: we use ldw even for LP64, since the short pointers
+        * can address up to 1TB
+        */
        .macro          L2_ptep pmd,pte,index,va,fault
 #if PT_NLEVELS == 3
        EXTR            \va,31-ASM_PMD_SHIFT,ASM_BITS_PER_PMD,\index
 #else
        EXTR            \va,31-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index
 #endif
-       DEP             %r0,31,PAGE_SHIFT,\pmd  /* clear offset */
+       DEP             %r0,31,PAGE_SHIFT,\pmd  /* clear offset */
        copy            %r0,\pte
        ldw,s           \index(\pmd),\pmd
+       bb,>=,n         \pmd,_PxD_PRESENT_BIT,\fault
+       DEP             %r0,31,PxD_FLAG_SHIFT,\pmd /* clear flags */
+       copy            \pmd,%r9
+#ifdef __LP64__
+       shld            %r9,PxD_VALUE_SHIFT,\pmd
+#else
+       shlw            %r9,PxD_VALUE_SHIFT,\pmd
+#endif
        EXTR            \va,31-PAGE_SHIFT,ASM_BITS_PER_PTE,\index
-       bb,>=,n         \pmd,_PAGE_PRESENT_BIT,\fault
-       DEP             %r0,31,PAGE_SHIFT,\pmd  /* clear offset */
+       DEP             %r0,31,PAGE_SHIFT,\pmd  /* clear offset */
        shladd          \index,BITS_PER_PTE_ENTRY,\pmd,\pmd
        LDREG           %r0(\pmd),\pte          /* pmd is now pte */
        bb,>=,n         \pte,_PAGE_PRESENT_BIT,\fault
        copy            %r0,\pte
        extrd,u,*=      \va,31,32,%r0
        ldw,s           \index(\pgd),\pgd
+       extrd,u,*=      \va,31,32,%r0
+       bb,>=,n         \pgd,_PxD_PRESENT_BIT,\fault
+       extrd,u,*=      \va,31,32,%r0
+       shld            \pgd,PxD_VALUE_SHIFT,\index
+       extrd,u,*=      \va,31,32,%r0
+       copy            \index,\pgd
        extrd,u,*<>     \va,31,32,%r0
        ldo             ASM_PGD_PMD_OFFSET(\pgd),\pgd
-       extrd,u,*=      \va,31,32,%r0
-       bb,>=,n         \pgd,_PAGE_PRESENT_BIT,\fault
        L2_ptep         \pgd,\pte,\index,\va,\fault
        .endm
 
 
        /* Set the dirty bit (and accessed bit).  No need to be
         * clever, this is only used from the dirty fault */
-       .macro          update_dirty    ptep,pte,tmp,tmp1
+       .macro          update_dirty    ptep,pte,tmp
        ldi             _PAGE_ACCESSED|_PAGE_DIRTY,\tmp
        or              \tmp,\pte,\pte
        STREG           \pte,0(\ptep)
@@ -783,7 +795,7 @@ __kernel_thread:
 ret_from_kernel_thread:
 
        /* Call schedule_tail first though */
-       bl      schedule_tail, %r2
+       BL      schedule_tail, %r2
        nop
 
        LDREG   TI_TASK-THREAD_SZ_ALGN(%r30), %r1
@@ -1441,14 +1453,14 @@ nadtlb_emulate:
        and             %r9,%r16,%r17
        cmpb,<>,n       %r16,%r17,nadtlb_fault /* Not fdc,fic,pdc */
        bb,>=,n         %r9,26,nadtlb_nullify  /* m bit not set, just nullify */
-       b,l             get_register,%r25
+       BL              get_register,%r25
        extrw,u         %r9,15,5,%r8           /* Get index register # */
        CMPIB=,n        -1,%r1,nadtlb_fault    /* have to use slow path */
        copy            %r1,%r24
-       b,l             get_register,%r25
+       BL              get_register,%r25
        extrw,u         %r9,10,5,%r8           /* Get base register # */
        CMPIB=,n        -1,%r1,nadtlb_fault    /* have to use slow path */
-       b,l             set_register,%r25
+       BL              set_register,%r25
        add,l           %r1,%r24,%r1           /* doesn't affect c/b bits */
 
 nadtlb_nullify:
@@ -1548,7 +1560,7 @@ dbit_spin_20w:
 
 dbit_nolock_20w:
 #endif
-       update_dirty    ptp,pte,t0,t1
+       update_dirty    ptp,pte,t1
 
        make_insert_tlb spc,pte,prot
                
@@ -1585,7 +1597,7 @@ dbit_spin_11:
 
 dbit_nolock_11:
 #endif
-       update_dirty    ptp,pte,t0,t1
+       update_dirty    ptp,pte,t1
 
        make_insert_tlb_11      spc,pte,prot
 
@@ -1626,11 +1638,11 @@ dbit_spin_20:
 
 dbit_nolock_20:
 #endif
-       update_dirty    ptp,pte,t0,t1
+       update_dirty    ptp,pte,t1
 
        make_insert_tlb spc,pte,prot
 
-       f_extend        pte,t0
+       f_extend        pte,t1
        
         idtlbt          pte,prot
 
index 8127a709887055de27284928649ffe5f0f5f81ec..6ab67aadd174bdf950b7b821e840a63558f74ced 100644 (file)
@@ -65,6 +65,7 @@
 
 #include <asm/page.h>
 #include <asm/pdc.h>
+#include <asm/pdcpat.h>
 #include <asm/system.h>
 #include <asm/processor.h>     /* for boot_cpu_data */
 
@@ -176,7 +177,9 @@ void __init set_firmware_width(void)
  */
 void pdc_emergency_unlock(void)
 {
-        spin_unlock(&pdc_lock);
+       /* Spinlock DEBUG code freaks out if we unconditionally unlock */
+        if (spin_is_locked(&pdc_lock))
+               spin_unlock(&pdc_lock);
 }
 
 
@@ -234,11 +237,11 @@ int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_inf
 #ifdef __LP64__
 int pdc_pat_chassis_send_log(unsigned long state, unsigned long data)
 {
+       int retval = 0;
+        
        if (!is_pdc_pat())
                return -1;
 
-       int retval = 0;
-
        spin_lock_irq(&pdc_lock);
        retval = mem_pdc_call(PDC_PAT_CHASSIS_LOG, PDC_PAT_CHASSIS_WRITE_LOG, __pa(&state), __pa(&data));
        spin_unlock_irq(&pdc_lock);
@@ -1146,6 +1149,49 @@ int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr,
 
        return retval;
 }
+
+/**
+ * pdc_pat_io_pci_cfg_read - Read PCI configuration space.
+ * @pci_addr: PCI configuration space address for which the read request is being made.
+ * @pci_size: Size of read in bytes. Valid values are 1, 2, and 4. 
+ * @mem_addr: Pointer to return memory buffer.
+ *
+ */
+int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *mem_addr)
+{
+       int retval;
+       spin_lock_irq(&pdc_lock);
+       retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_READ,
+                                       __pa(pdc_result), pci_addr, pci_size);
+       switch(pci_size) {
+               case 1: *(u8 *) mem_addr =  (u8)  pdc_result[0];
+               case 2: *(u16 *)mem_addr =  (u16) pdc_result[0];
+               case 4: *(u32 *)mem_addr =  (u32) pdc_result[0];
+       }
+       spin_unlock_irq(&pdc_lock);
+
+       return retval;
+}
+
+/**
+ * pdc_pat_io_pci_cfg_write - Retrieve information about memory address ranges.
+ * @pci_addr: PCI configuration space address for which the write  request is being made.
+ * @pci_size: Size of write in bytes. Valid values are 1, 2, and 4. 
+ * @value: Pointer to 1, 2, or 4 byte value in low order end of argument to be 
+ *         written to PCI Config space.
+ *
+ */
+int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val)
+{
+       int retval;
+
+       spin_lock_irq(&pdc_lock);
+       retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_PCI_CONFIG_WRITE,
+                               pci_addr, pci_size, val);
+       spin_unlock_irq(&pdc_lock);
+
+       return retval;
+}
 #endif /* __LP64__ */
 
 
@@ -1230,29 +1276,29 @@ struct wide_stack {
 long real64_call(unsigned long fn, ...)
 {
        va_list args;
-       extern struct wide_stack real_stack;
+       extern struct wide_stack real64_stack __attribute__ ((alias ("real_stack")));
        extern unsigned long real64_call_asm(unsigned long *,
                                             unsigned long *, 
                                             unsigned long);
     
        va_start(args, fn);
-       real_stack.arg0 = va_arg(args, unsigned long);
-       real_stack.arg1 = va_arg(args, unsigned long);
-       real_stack.arg2 = va_arg(args, unsigned long);
-       real_stack.arg3 = va_arg(args, unsigned long);
-       real_stack.arg4 = va_arg(args, unsigned long);
-       real_stack.arg5 = va_arg(args, unsigned long);
-       real_stack.arg6 = va_arg(args, unsigned long);
-       real_stack.arg7 = va_arg(args, unsigned long);
-       real_stack.arg8 = va_arg(args, unsigned long);
-       real_stack.arg9 = va_arg(args, unsigned long);
-       real_stack.arg10 = va_arg(args, unsigned long);
-       real_stack.arg11 = va_arg(args, unsigned long);
-       real_stack.arg12 = va_arg(args, unsigned long);
-       real_stack.arg13 = va_arg(args, unsigned long);
+       real64_stack.arg0 = va_arg(args, unsigned long);
+       real64_stack.arg1 = va_arg(args, unsigned long);
+       real64_stack.arg2 = va_arg(args, unsigned long);
+       real64_stack.arg3 = va_arg(args, unsigned long);
+       real64_stack.arg4 = va_arg(args, unsigned long);
+       real64_stack.arg5 = va_arg(args, unsigned long);
+       real64_stack.arg6 = va_arg(args, unsigned long);
+       real64_stack.arg7 = va_arg(args, unsigned long);
+       real64_stack.arg8 = va_arg(args, unsigned long);
+       real64_stack.arg9 = va_arg(args, unsigned long);
+       real64_stack.arg10 = va_arg(args, unsigned long);
+       real64_stack.arg11 = va_arg(args, unsigned long);
+       real64_stack.arg12 = va_arg(args, unsigned long);
+       real64_stack.arg13 = va_arg(args, unsigned long);
        va_end(args);
        
-       return real64_call_asm(&real_stack.sp, &real_stack.arg0, fn);
+       return real64_call_asm(&real64_stack.sp, &real64_stack.arg0, fn);
 }
 
 #endif /* __LP64__ */
index b423e7d79b001717af6a8a7a6efc42a24f6ac22c..6b65bf4683a7d8ca9c56720efc5853daab4932e6 100644 (file)
@@ -263,6 +263,17 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
        {HPHW_NPROC,0x67E,0x4,0x81,"Hitachi Tiny 80"},
        {HPHW_NPROC,0x67F,0x4,0x81,"Hitachi Tiny 64"},
        {HPHW_NPROC,0x700,0x4,0x91,"NEC Aska Processor"},
+       {HPHW_NPROC,0x880,0x4,0x91,"Orca Mako"},
+       {HPHW_NPROC,0x881,0x4,0x91,"Everest Mako"},
+       {HPHW_NPROC,0x882,0x4,0x91,"Rainier/Medel Mako Slow"},
+       {HPHW_NPROC,0x883,0x4,0x91,"Rainier/Medel Mako Fast"},
+       {HPHW_NPROC,0x884,0x4,0x91,"Mt. Hamilton"},
+       {HPHW_NPROC,0x885,0x4,0x91,"Mt. Hamilton DC-"},
+       {HPHW_NPROC,0x886,0x4,0x91,"Storm Peak Slow DC-"},
+       {HPHW_NPROC,0x887,0x4,0x91,"Storm Peak Slow"},
+       {HPHW_NPROC,0x888,0x4,0x91,"Storm Peak Fast DC-"},
+       {HPHW_NPROC,0x889,0x4,0x91,"Storm Peak Fast"},
+       {HPHW_NPROC,0x88A,0x4,0x91,"Crestone Peak"},
        {HPHW_A_DIRECT, 0x004, 0x0000D, 0x00, "Arrakis MUX"}, 
        {HPHW_A_DIRECT, 0x005, 0x0000D, 0x00, "Dyun Kiuh MUX"}, 
        {HPHW_A_DIRECT, 0x006, 0x0000D, 0x00, "Baat Kiuh AP/MUX (40299B)"}, 
@@ -535,14 +546,17 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
        {HPHW_BCPORT, 0x800, 0x0000C, 0x10, "DEW BC Merced Port"}, 
        {HPHW_BCPORT, 0x801, 0x0000C, 0x10, "SMC Bus Interface Merced Bus0"}, 
        {HPHW_BCPORT, 0x802, 0x0000C, 0x10, "SMC Bus INterface Merced Bus1"}, 
-       {HPHW_BCPORT, 0x803, 0x0000C, 0x10, "IKE I/O Bus Converter Merced Port"}, 
-       {HPHW_BCPORT, 0x781, 0x0000C, 0x00, "IKE I/O Bus Converter Ropes Port"}, 
-       {HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O Bus Converter Merced Port"}, 
-       {HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O Bus Converter Ropes Port"}, 
+       {HPHW_BCPORT, 0x803, 0x0000C, 0x10, "IKE I/O BC Merced Port"}, 
+       {HPHW_BCPORT, 0x781, 0x0000C, 0x00, "IKE I/O BC Ropes Port"}, 
+       {HPHW_BCPORT, 0x804, 0x0000C, 0x10, "REO I/O BC Merced Port"}, 
+       {HPHW_BCPORT, 0x782, 0x0000C, 0x00, "REO I/O BC Ropes Port"}, 
+       {HPHW_BCPORT, 0x784, 0x0000C, 0x00, "Pluto I/O BC Ropes Port"}, 
        {HPHW_BRIDGE, 0x680, 0x0000A, 0x00, "Dino PCI Bridge"}, 
        {HPHW_BRIDGE, 0x682, 0x0000A, 0x00, "Cujo PCI Bridge"}, 
        {HPHW_BRIDGE, 0x782, 0x0000A, 0x00, "Elroy PCI Bridge"}, 
        {HPHW_BRIDGE, 0x583, 0x000A5, 0x00, "Saga PCI Bridge"}, 
+       {HPHW_BRIDGE, 0x783, 0x0000A, 0x00, "Mercury PCI Bridge"}, 
+       {HPHW_BRIDGE, 0x784, 0x0000A, 0x00, "Quicksilver AGP Bridge"}, 
        {HPHW_B_DMA, 0x004, 0x00018, 0x00, "Parallel I/O"}, 
        {HPHW_B_DMA, 0x004, 0x00019, 0x00, "Parallel RDB"}, 
        {HPHW_B_DMA, 0x004, 0x00020, 0x80, "MID_BUS PSI"}, 
@@ -1181,15 +1195,18 @@ static struct hp_hardware hp_hardware_list[] __initdata = {
        {HPHW_IOA, 0x581, 0x0000B, 0x10, "Uturn-IOA BC Runway Port"},
        {HPHW_IOA, 0x582, 0x0000B, 0x10, "Astro BC Runway Port"},
        {HPHW_IOA, 0x700, 0x0000B, 0x00, "NEC-IOS BC System Bus Port"},
+       {HPHW_IOA, 0x880, 0x0000C, 0x10, "Pluto BC McKinley Port"},
        {HPHW_MEMORY, 0x002, 0x00008, 0x00, "MID_BUS"}, 
        {HPHW_MEMORY, 0x063, 0x00009, 0x00, "712/132 L2 Upgrade"}, 
        {HPHW_MEMORY, 0x064, 0x00009, 0x00, "712/160 L2 Upgrade"}, 
        {HPHW_MEMORY, 0x065, 0x00009, 0x00, "715/132 L2 Upgrade"}, 
        {HPHW_MEMORY, 0x066, 0x00009, 0x00, "715/160 L2 Upgrade"},
+       {HPHW_MEMORY, 0x0AF, 0x00009, 0x00, "Everest Mako Memory"},
        {HPHW_OTHER, 0x004, 0x00030, 0x00, "Master"}, 
        {HPHW_OTHER, 0x004, 0x00034, 0x00, "Slave"}, 
        {HPHW_OTHER, 0x004, 0x00038, 0x00, "EDU"}, 
        {HPHW_OTHER, 0x004, 0x00049, 0x00, "LGB Control"}, 
+       {HPHW_MC, 0x004, 0x000C0, 0x00, "BMC IPMI Mgmt Ctlr"}, 
        {HPHW_FAULTY, 0, }  /* Special Marker for last entry */
 };
 
@@ -1290,7 +1307,7 @@ char *cpu_name_version[][2] = {
        [pcxw]  { "PA8500 (PCX-W)",     "2.0" },
        [pcxw_] { "PA8600 (PCX-W+)",    "2.0" },
        [pcxw2] { "PA8700 (PCX-W2)",    "2.0" },
-       [mako]  { "PA8800 (MAKO)",      "2.0" }
+       [mako]  { "PA8800 (Mako)",      "2.0" }
 };
 
 const char * __init
index 0297d4164dd7145ba7ee7fa9631f45d92791803d..a3525f1e5560bf76000f2936ad472c7ae13b9698 100644 (file)
@@ -76,7 +76,8 @@ $bss_loop:
        /* Initialize startup VM. Just map first 8 MB of memory */
        ldil            L%PA(pg0),%r1
        ldo             R%PA(pg0)(%r1),%r1
-       ldo             _PAGE_TABLE(%r1),%r3
+       shr             %r1,PxD_VALUE_SHIFT,%r3
+       ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
 
        ldil            L%PA(swapper_pg_dir),%r4
        ldo             R%PA(swapper_pg_dir)(%r4),%r4
@@ -86,7 +87,7 @@ $bss_loop:
        ldo             ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
 1:
        stw             %r3,0(%r4)
-       ldo             ASM_PAGE_SIZE(%r3),%r3
+       ldo             (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
        addib,>         -1,%r1,1b
        ldo             ASM_PGD_ENTRY_SIZE(%r4),%r4
 
@@ -266,6 +267,8 @@ smp_slave_stext:
        ldil            L%PA(smp_init_current_idle_task),%sp
        ldo             R%PA(smp_init_current_idle_task)(%sp),%sp
        ldw             0(%sp),%sp      /* load task address */
+       tophys_r1       %sp
+       ldw             TASK_THREAD_INFO(%sp), %sp
        mtctl           %sp,%cr30       /* store in cr30 */
        addil           L%THREAD_SZ_ALGN,%sp    /* stack is above task */
        ldo             R%THREAD_SZ_ALGN(%r1),%sp
index 78d8bad2eae79e20703f4f31732be0d9d6775b75..587a339a2fd84976ba6f80306a443701943404e2 100644 (file)
@@ -80,7 +80,8 @@ $bss_loop:
 
        ldil            L%PA(pmd0),%r5
        ldo             R%PA(pmd0)(%r5),%r5
-       ldo             _PAGE_TABLE(%r5),%r3
+       shrd            %r5,PxD_VALUE_SHIFT,%r3
+       ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
 
        ldil            L%PA(swapper_pg_dir),%r4
        ldo             R%PA(swapper_pg_dir)(%r4),%r4
@@ -90,16 +91,17 @@ $bss_loop:
 
        stw             %r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4)
 
-       ldo             _PAGE_TABLE(%r1),%r3
+       shrd            %r1,PxD_VALUE_SHIFT,%r3
+       ldo             (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
        ldo             ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r5
        ldi             ASM_PT_INITIAL,%r1
 1:
        stw             %r3,0(%r5)
-       ldo             ASM_PAGE_SIZE(%r3),%r3
+       ldo             (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
        addib,>         -1,%r1,1b
        ldo             ASM_PMD_ENTRY_SIZE(%r5),%r5
 
-       ldo             _PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */
+       ldo             _PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */
        ldil            L%PA(pg0),%r1
        ldo             R%PA(pg0)(%r1),%r1
 
@@ -299,6 +301,7 @@ smp_slave_stext:
        /*  Initialize the SP - monarch sets up smp_init_current_idle_task */
        load32          PA(smp_init_current_idle_task),%sp
        ldd             0(%sp),%sp      /* load task address */
+       tophys_r1       %sp
        ldd             TASK_THREAD_INFO(%sp), %sp
        mtctl           %sp,%cr30       /* store in cr30 */
        ldo             THREAD_SZ_ALGN(%sp),%sp
index ff3b9fe47392d5b46da8aecd66b3553df2b330b6..48ba5093eeabd0b5adb9c573a7aaf4be7e30037d 100644 (file)
@@ -25,7 +25,9 @@
 #include <linux/mm.h>
 #include <asm/hardware.h>
 #include <asm/io.h>
+#include <asm/mmzone.h>
 #include <asm/pdc.h>
+#include <asm/pdcpat.h>
 #include <asm/processor.h>
 #include <asm/page.h>
 #include <asm/parisc-device.h>
index ca1acad13e09a9860a18e44a7516ff0b9d644bfb..00739749a4b2e5a946046359fd256c1de9927399 100644 (file)
@@ -121,12 +121,6 @@ struct irqaction cpu_irq_actions[IRQ_PER_REGION] = {
 #endif
 };
 
-struct irq_region_ops cpu_irq_ops = {
-       .disable_irq    = disable_cpu_irq,
-       .enable_irq     = enable_cpu_irq,
-       .mask_irq       = unmask_cpu_irq,
-       .unmask_irq     = unmask_cpu_irq
-};
 
 struct irq_region cpu0_irq_region = {
        .ops    = {
@@ -200,8 +194,8 @@ void enable_irq(int irq)
 {
        struct irq_region *region;
 
-       DBG_IRQ(irq, ("enable_irq(%d) %d+%d eiem 0x%lx\n", irq,
-                               IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
+       DBG_IRQ(irq, ("enable_irq(%d) %d+%d EIRR 0x%lx EIEM 0x%lx\n", irq,
+                               IRQ_REGION(irq), IRQ_OFFSET(irq), mfctl(23), mfctl(15)));
        irq = irq_canonicalize(irq);
        region = irq_region[IRQ_REGION(irq)];
 
@@ -221,8 +215,9 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_puts(p, "     ");
 #ifdef CONFIG_SMP
                for (i = 0; i < NR_CPUS; i++)
+                       if (cpu_online(i))
 #endif
-                       seq_printf(p, "      CPU%02d ", i);
+                               seq_printf(p, "      CPU%02d ", i);
 
 #ifdef PARISC_IRQ_CR16_COUNTS
                seq_printf(p, "[min/avg/max] (CPU cycle counts)");
@@ -250,6 +245,7 @@ int show_interrupts(struct seq_file *p, void *v)
                seq_printf(p, "%3d: ", irq_no);
 #ifdef CONFIG_SMP
                for (; j < NR_CPUS; j++)
+                       if (cpu_online(j))
 #endif
                  seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq_no]);
 
@@ -338,7 +334,8 @@ txn_alloc_addr(int virt_irq)
        next_cpu++; /* assign to "next" CPU we want this bugger on */
 
        /* validate entry */
-       while ((next_cpu < NR_CPUS) && !cpu_data[next_cpu].txn_addr)
+       while ((next_cpu < NR_CPUS) && (!cpu_data[next_cpu].txn_addr || 
+               !cpu_online(next_cpu)))
                next_cpu++;
 
        if (next_cpu >= NR_CPUS) 
@@ -390,7 +387,7 @@ void do_irq(struct irqaction *action, int irq, struct pt_regs * regs)
        irq_enter();
        ++kstat_cpu(cpu).irqs[irq];
 
-       DBG_IRQ(irq, ("do_irq(%d) %d+%d\n", irq, IRQ_REGION(irq), IRQ_OFFSET(irq)));
+       DBG_IRQ(irq, ("do_irq(%d) %d+%d eiem 0x%lx\n", irq, IRQ_REGION(irq), IRQ_OFFSET(irq), cpu_eiem));
 
        for (; action; action = action->next) {
 #ifdef PARISC_IRQ_CR16_COUNTS
@@ -460,7 +457,7 @@ void do_cpu_irq_mask(struct pt_regs *regs)
 
 #ifdef DEBUG_IRQ
                if (eirr_val != (1UL << MAX_CPU_IRQ))
-                       printk(KERN_DEBUG "do_cpu_irq_mask  %x\n", eirr_val);
+                       printk(KERN_DEBUG "do_cpu_irq_mask  0x%x & 0x%x\n", eirr_val, cpu_eiem);
 #endif
 
                /* Work our way from MSb to LSb...same order we alloc EIRs */
@@ -865,7 +862,7 @@ EXPORT_SYMBOL(probe_irq_mask);
 void __init init_IRQ(void)
 {
        local_irq_disable();    /* PARANOID - should already be disabled */
-       mtctl(-1L, 23);         /* EIRR : clear all pending external intr */
+       mtctl(~0UL, 23);        /* EIRR : clear all pending external intr */
 #ifdef CONFIG_SMP
        if (!cpu_eiem)
                cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ);
index 516d52a15b07698b54c6403385172982e42d477d..dadcf135943e453f0cf008493031863a771bb6ab 100644 (file)
@@ -173,3 +173,9 @@ EXPORT_SYMBOL(__moddi3);
 extern void $$dyncall(void);
 EXPORT_SYMBOL($$dyncall);
 #endif
+
+#ifdef CONFIG_DISCONTIGMEM
+#include <asm/mmzone.h>
+EXPORT_SYMBOL(node_data);
+EXPORT_SYMBOL(pfnnid_map);
+#endif
index 5595f3bad66fc16b613603d895ccdac7f9076db4..ebbcbf295754ebba0b27661aa7b31c602566a713 100644 (file)
 #include <asm/pgalloc.h>
 #include <asm/uaccess.h>
 
+#ifdef DEBUG_PCI
+#undef ASSERT
+#define ASSERT(expr) \
+       if(!(expr)) { \
+               printk("\n%s:%d: Assertion " #expr " failed!\n", \
+                               __FILE__, __LINE__); \
+               panic(#expr); \
+       }
+#else
+#define ASSERT(expr)
+#endif
+
+
 static struct proc_dir_entry * proc_gsc_root = NULL;
 static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
 static unsigned long pcxl_used_bytes = 0;
index d79c0a49904849c55b91f1e2a42a5220a2faeea6..7268abfcd43df263a4fb57e8a44ffd793154485c 100644 (file)
@@ -2,7 +2,7 @@
  *    interfaces to log Chassis Codes via PDC (firmware)
  *
  *    Copyright (C) 2002 Laurent Canet <canetl@esiee.fr>
- *    Copyright (C) 2002-2003 Thibaut Varene <varenet@esiee.fr>
+ *    Copyright (C) 2002-2004 Thibaut VARENE <varenet@esiee.fr>
  *
  *    This program is free software; you can redistribute it and/or modify
  *    it under the terms of the GNU General Public License as published by
 
 #include <asm/pdc_chassis.h>
 #include <asm/processor.h>
+#include <asm/pdc.h>
+#include <asm/pdcpat.h>
 
 
 #ifdef CONFIG_PDC_CHASSIS
 static int pdc_chassis_old = 0;        
+static unsigned int pdc_chassis_enabled = 1;
+
+
+/**
+ * pdc_chassis_setup() - Enable/disable pdc_chassis code at boot time.
+ * @str configuration param: 0 to disable chassis log
+ * @return 1
+ */
+static int __init pdc_chassis_setup(char *str)
+{
+       /*panic_timeout = simple_strtoul(str, NULL, 0);*/
+       get_option(&str, &pdc_chassis_enabled);
+       return 1;
+}
+__setup("pdcchassis=", pdc_chassis_setup);
 
 
 /** 
@@ -114,29 +132,28 @@ void __init parisc_pdc_chassis_init(void)
 {
 #ifdef CONFIG_PDC_CHASSIS
        int handle = 0;
+       if (pdc_chassis_enabled) {
+               DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
+
+               /* Let see if we have something to handle... */
+               /* Check for PDC_PAT or old LED Panel */
+               pdc_chassis_checkold();
+               if (is_pdc_pat()) {
+                       printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
+                       handle = 1;
+               }
+               else if (pdc_chassis_old) {
+                       printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
+                       handle = 1;
+               }
 
-       DPRINTK(KERN_DEBUG "%s: parisc_pdc_chassis_init()\n", __FILE__);
-
-       /* Let see if we have something to handle... */
-       /* Check for PDC_PAT or old LED Panel */
-       pdc_chassis_checkold();
-       if (is_pdc_pat()) {
-#ifdef __LP64__        /* see pdc_chassis_send_status() */
-               printk(KERN_INFO "Enabling PDC_PAT chassis codes support.\n");
-               handle = 1;
-#endif /* __LP64__ */
-       }
-       else if (pdc_chassis_old) {
-               printk(KERN_INFO "Enabling old style chassis LED panel support.\n");
-               handle = 1;
-       }
-       
-       if (handle) {
-               /* initialize panic notifier chain */
-               notifier_chain_register(&panic_notifier_list, &pdc_chassis_panic_block);
+               if (handle) {
+                       /* initialize panic notifier chain */
+                       notifier_chain_register(&panic_notifier_list, &pdc_chassis_panic_block);
 
-               /* initialize reboot notifier chain */
-               register_reboot_notifier(&pdc_chassis_reboot_block);
+                       /* initialize reboot notifier chain */
+                       register_reboot_notifier(&pdc_chassis_reboot_block);
+               }
        }
 #endif /* CONFIG_PDC_CHASSIS */
 }
@@ -161,65 +178,68 @@ int pdc_chassis_send_status(int message)
        /* Maybe we should do that in an other way ? */
        int retval = 0;
 #ifdef CONFIG_PDC_CHASSIS
-       DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
-
-#ifdef __LP64__        /* pdc_pat_chassis_send_log is defined only when #ifdef __LP64__ */
-       if (is_pdc_pat()) {
-               switch(message) {
-                       case PDC_CHASSIS_DIRECT_BSTART:
-                               retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_BSTART, PDC_CHASSIS_LSTATE_RUN_NORMAL);
-                               break;
-                       
-                       case PDC_CHASSIS_DIRECT_BCOMPLETE:
-                               retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_BCOMPLETE, PDC_CHASSIS_LSTATE_RUN_NORMAL);
-                               break;
-                       
-                       case PDC_CHASSIS_DIRECT_SHUTDOWN:
-                               retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_SHUTDOWN, PDC_CHASSIS_LSTATE_NONOS);
-                               break;
-                       
-                       case PDC_CHASSIS_DIRECT_PANIC:
-                               retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_PANIC, PDC_CHASSIS_LSTATE_RUN_CRASHREC);
-                               break;
-               
-                       case PDC_CHASSIS_DIRECT_LPMC:
-                               retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_LPMC, PDC_CHASSIS_LSTATE_RUN_SYSINT);
-                               break;
-
-                       case PDC_CHASSIS_DIRECT_HPMC:
-                               retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_HPMC, PDC_CHASSIS_LSTATE_RUN_NCRIT);
-                               break;
-
-                       default:
-                               retval = -1;
-               }
-       } else retval = -1;
+       if (pdc_chassis_enabled) {
+
+               DPRINTK(KERN_DEBUG "%s: pdc_chassis_send_status(%d)\n", __FILE__, message);
+
+#ifdef CONFIG_PARISC64
+               if (is_pdc_pat()) {
+                       switch(message) {
+                               case PDC_CHASSIS_DIRECT_BSTART:
+                                       retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_BSTART, PDC_CHASSIS_LSTATE_RUN_NORMAL);
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_BCOMPLETE:
+                                       retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_BCOMPLETE, PDC_CHASSIS_LSTATE_RUN_NORMAL);
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_SHUTDOWN:
+                                       retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_SHUTDOWN, PDC_CHASSIS_LSTATE_NONOS);
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_PANIC:
+                                       retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_PANIC, PDC_CHASSIS_LSTATE_RUN_CRASHREC);
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_LPMC:
+                                       retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_LPMC, PDC_CHASSIS_LSTATE_RUN_SYSINT);
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_HPMC:
+                                       retval = pdc_pat_chassis_send_log(PDC_CHASSIS_PMSG_HPMC, PDC_CHASSIS_LSTATE_RUN_NCRIT);
+                                       break;
+
+                               default:
+                                       retval = -1;
+                       }
+               } else retval = -1;
 #else
-       if (pdc_chassis_old) {
-               switch (message) {
-                       case PDC_CHASSIS_DIRECT_BSTART:
-                       case PDC_CHASSIS_DIRECT_BCOMPLETE:
-                               retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_RUN));
-                               break;
-                                                       
-                       case PDC_CHASSIS_DIRECT_SHUTDOWN:
-                               retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_SHUT));
-                               break;
-                       
-                       case PDC_CHASSIS_DIRECT_HPMC:
-                       case PDC_CHASSIS_DIRECT_PANIC:
-                               retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_FLT));
-                               break;
-               
-                       case PDC_CHASSIS_DIRECT_LPMC:
-                               retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_WARN));
-                               break;
-
-                       default:
-                               retval = -1;
-               }
-       } else retval = -1;
-#endif /* __LP64__ */
+               if (pdc_chassis_old) {
+                       switch (message) {
+                               case PDC_CHASSIS_DIRECT_BSTART:
+                               case PDC_CHASSIS_DIRECT_BCOMPLETE:
+                                       retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_RUN));
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_SHUTDOWN:
+                                       retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_SHUT));
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_HPMC:
+                               case PDC_CHASSIS_DIRECT_PANIC:
+                                       retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_FLT));
+                                       break;
+
+                               case PDC_CHASSIS_DIRECT_LPMC:
+                                       retval = pdc_chassis_disp(PDC_CHASSIS_DISP_DATA(OSTAT_WARN));
+                                       break;
+
+                               default:
+                                       retval = -1;
+                       }
+               } else retval = -1;
+#endif /* CONFIG_PARISC64 */
+       }       /* if (pdc_chassis_enabled) */
 #endif /* CONFIG_PDC_CHASSIS */
        return retval;
 }
index f04dea6a7ef708bad02617427eeadd10390a441d..dd938ef771916e2e82c0dbf864935a0117bf390c 100644 (file)
@@ -380,18 +380,14 @@ get_wchan(struct task_struct *p)
        /*
         * These bracket the sleeping functions..
         */
-#      define first_sched      ((unsigned long) scheduling_functions_start_here)
-#      define last_sched       ((unsigned long) scheduling_functions_end_here)
 
        unwind_frame_init_from_blocked_task(&info, p);
        do {
                if (unwind_once(&info) < 0)
                        return 0;
                ip = info.ip;
-               if (ip < first_sched || ip >= last_sched)
+               if (!in_sched_functions(ip))
                        return ip;
        } while (count++ < 16);
        return 0;
-#      undef first_sched
-#      undef last_sched
 }
index dd7f239aafdd1741951585a61b02ee69cb806cb8..b4931ade43e778423a9d915fe3a2628e60b13e20 100644 (file)
 #include <linux/module.h>
 #include <linux/seq_file.h>
 #include <linux/slab.h>
+#include <linux/cpu.h>
 
 #include <asm/cache.h>
 #include <asm/hardware.h>      /* for register_parisc_driver() stuff */
 #include <asm/processor.h>
 #include <asm/page.h>
 #include <asm/pdc.h>
+#include <asm/pdcpat.h>
 #include <asm/irq.h>           /* for struct irq_region */
 #include <asm/parisc-device.h>
 
@@ -187,6 +189,17 @@ static int __init processor_probe(struct parisc_device *dev)
                cpu_irq_actions[cpuid] = actions;
        }
 #endif
+
+       /* 
+        * Bring this CPU up now! (ignore bootstrap cpuid == 0)
+        */
+#ifdef CONFIG_SMP
+       if (cpuid) {
+               cpu_set(cpuid, cpu_present_map);
+               cpu_up(cpuid);
+       }
+#endif
+
        return 0;
 }
 
index 899fd7356a29906e2679298dcf8814c8a92c27c8..3637b0a98fddb89dedd000efc1c557604307443f 100644 (file)
 
        .section        .bss
        .export real_stack
+       .export real32_stack
+       .export real64_stack
        .align  64
 real_stack:
+real32_stack:
+real64_stack:
        .block  8192
 
 #ifdef __LP64__
index bcc9e37c1399fd8b7e81e00c3ce1492775ce967b..37bd6a607b95a22639f8bc068325c186f9630c4d 100644 (file)
@@ -51,6 +51,8 @@ char  command_line[COMMAND_LINE_SIZE];
 /* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
 struct proc_dir_entry * proc_runway_root = NULL;
 struct proc_dir_entry * proc_gsc_root = NULL;
+struct proc_dir_entry * proc_mckinley_root = NULL;
+
 
 void __init setup_cmdline(char **cmdline_p)
 {
@@ -206,12 +208,17 @@ static void __init parisc_proc_mkdir(void)
         case pcxw:
         case pcxw_:
         case pcxw2:
-       case mako:      /* XXX : this is really mckinley bus */
                 if (NULL == proc_runway_root)
                 {
                         proc_runway_root = proc_mkdir("bus/runway", 0);
                 }
                 break;
+       case mako:
+                if (NULL == proc_mckinley_root)
+                {
+                        proc_mckinley_root = proc_mkdir("bus/mckinley", 0);
+                }
+                break;
        default:
                /* FIXME: this was added to prevent the compiler 
                 * complaining about missing pcx, pcxs and pcxt
index 77be8d41e66c1108aa52cba910824d0c677a0334..0f1daa584c9ae36a64e0509e6664d5701c1aace2 100644 (file)
 
 #define kDEBUG 0
 
-spinlock_t pa_dbit_lock = SPIN_LOCK_UNLOCKED;
-
 spinlock_t smp_lock = SPIN_LOCK_UNLOCKED;
 
 volatile struct task_struct *smp_init_current_idle_task;
 
 static volatile int cpu_now_booting = 0;       /* track which CPU is booting */
-static int parisc_max_cpus = -1;               /* Command line */
 
 unsigned long cache_decay_ticks;       /* declared by include/linux/sched.h */
+
+static int parisc_max_cpus = 1;
+
+/* online cpus are ones that we've managed to bring up completely
+ * possible cpus are all valid cpu 
+ * present cpus are all detected cpu
+ *
+ * On startup we bring up the "possible" cpus. Since we discover
+ * CPUs later, we add them as hotplug, so the possible cpu mask is
+ * empty in the beginning.
+ */
+
 cpumask_t cpu_online_map = CPU_MASK_NONE;      /* Bitmap of online CPUs */
-cpumask_t cpu_possible_map = CPU_MASK_NONE;    /* Bitmap of Present CPUs */
+cpumask_t cpu_possible_map = CPU_MASK_ALL;     /* Bitmap of Present CPUs */
 
 EXPORT_SYMBOL(cpu_online_map);
 EXPORT_SYMBOL(cpu_possible_map);
@@ -289,7 +298,7 @@ send_IPI_allbutself(enum ipi_message_type op)
 {
        int i;
        
-       for (i = 0; i < parisc_max_cpus; i++) {
+       for (i = 0; i < NR_CPUS; i++) {
                if (cpu_online(i) && i != smp_processor_id())
                        send_IPI_single(i, op);
        }
@@ -325,6 +334,9 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
        unsigned long timeout;
        static spinlock_t lock = SPIN_LOCK_UNLOCKED;
 
+       if (num_online_cpus() < 2)
+               return 0;
+
        /* Can deadlock when called with interrupts disabled */
        WARN_ON(irqs_disabled());
        
@@ -377,35 +389,6 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
 
 EXPORT_SYMBOL(smp_call_function);
 
-
-
-/*
- *     Setup routine for controlling SMP activation
- *
- *     Command-line option of "nosmp" or "maxcpus=0" will disable SMP
- *     activation entirely (the MPS table probe still happens, though).
- *
- *     Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
- *     greater than 0, limits the maximum number of CPUs activated in
- *     SMP mode to <NUM>.
- */
-
-static int __init nosmp(char *str)
-{
-       parisc_max_cpus = 0;
-       return 1;
-}
-
-__setup("nosmp", nosmp);
-
-static int __init maxcpus(char *str)
-{
-       get_option(&str, &parisc_max_cpus);
-       return 1;
-}
-
-__setup("maxcpus=", maxcpus);
-
 /*
  * Flush all other CPU's tlb and then mine.  Do this with on_each_cpu()
  * as we want to ensure all TLB's flushed before proceeding.
@@ -502,7 +485,6 @@ void __init smp_callin(void)
        panic("smp_callin() AAAAaaaaahhhh....\n");
 }
 
-#if 0
 /*
  * Create the idle task for a new Slave CPU.  DO NOT use kernel_thread()
  * because that could end up calling schedule(). If it did, the new idle
@@ -524,7 +506,7 @@ static struct task_struct *fork_by_hand(void)
 /*
  * Bring one cpu online.
  */
-int __init smp_boot_one_cpu(int cpuid, int cpunum)
+int __init smp_boot_one_cpu(int cpuid)
 {
        struct task_struct *idle;
        long timeout;
@@ -544,14 +526,14 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
                panic("SMP: fork failed for CPU:%d", cpuid);
 
        wake_up_forked_process(idle);
-       init_idle(idle, cpunum);
+       init_idle(idle, cpuid);
        unhash_process(idle);
-       idle->thread_info->cpu = cpunum;
+       idle->thread_info->cpu = cpuid;
 
        /* Let _start know what logical CPU we're booting
        ** (offset into init_tasks[],cpu_data[])
        */
-       cpu_now_booting = cpunum;
+       cpu_now_booting = cpuid;
 
        /* 
        ** boot strap code needs to know the task address since
@@ -560,11 +542,18 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
        smp_init_current_idle_task = idle ;
        mb();
 
+       printk("Releasing cpu %d now, hpa=%lx\n", cpuid, cpu_data[cpuid].hpa);
+
        /*
        ** This gets PDC to release the CPU from a very tight loop.
-       ** See MEM_RENDEZ comments in head.S.
+       **
+       ** From the PA-RISC 2.0 Firmware Architecture Reference Specification:
+       ** "The MEM_RENDEZ vector specifies the location of OS_RENDEZ which 
+       ** is executed after receiving the rendezvous signal (an interrupt to 
+       ** EIR{0}). MEM_RENDEZ is valid only when it is nonzero and the 
+       ** contents of memory are valid."
        */
-       __raw_writel(IRQ_OFFSET(TIMER_IRQ), cpu_data[cpunum].hpa);
+       __raw_writel(IRQ_OFFSET(TIMER_IRQ), cpu_data[cpuid].hpa);
        mb();
 
        /* 
@@ -573,7 +562,7 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
         * Once the "monarch CPU" sees the bit change, it can move on.
         */
        for (timeout = 0; timeout < 10000; timeout++) {
-               if(cpu_online(cpunum)) {
+               if(cpu_online(cpuid)) {
                        /* Which implies Slave has started up */
                        cpu_now_booting = 0;
                        smp_init_current_idle_task = NULL;
@@ -592,16 +581,14 @@ int __init smp_boot_one_cpu(int cpuid, int cpunum)
 alive:
        /* Remember the Slave data */
 #if (kDEBUG>=100)
-       printk(KERN_DEBUG "SMP: CPU:%d (num %d) came alive after %ld _us\n",
-               cpuid,  cpunum, timeout * 100);
+       printk(KERN_DEBUG "SMP: CPU:%d came alive after %ld _us\n",
+               cpuid, timeout * 100);
 #endif /* kDEBUG */
 #ifdef ENTRY_SYS_CPUS
-       cpu_data[cpunum].state = STATE_RUNNING;
+       cpu_data[cpuid].state = STATE_RUNNING;
 #endif
        return 0;
 }
-#endif
-
 
 void __devinit smp_prepare_boot_cpu(void)
 {
@@ -612,15 +599,10 @@ void __devinit smp_prepare_boot_cpu(void)
 #endif
 
        /* Setup BSP mappings */
-       printk(KERN_DEBUG "SMP: bootstrap CPU ID is %d\n",bootstrap_processor);
-       init_task.thread_info->cpu = bootstrap_processor; 
-       current->thread_info->cpu = bootstrap_processor;
+       printk("SMP: bootstrap CPU ID is %d\n",bootstrap_processor);
 
        cpu_set(bootstrap_processor, cpu_online_map);
-       cpu_set(bootstrap_processor, cpu_possible_map);
-
-       /* Mark Boostrap processor as present */
-       current->active_mm = &init_mm;
+       cpu_set(bootstrap_processor, cpu_present_map);
 
        cache_decay_ticks = HZ/100;     /* FIXME very rough.  */
 }
@@ -633,15 +615,12 @@ void __devinit smp_prepare_boot_cpu(void)
 */
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
+       cpus_clear(cpu_present_map);
+       cpu_set(0, cpu_present_map);
 
-       if (max_cpus != -1) 
-               printk(KERN_INFO "SMP: Limited to %d CPUs\n", max_cpus);
-
-       printk(KERN_INFO "SMP: Monarch CPU activated (%lu.%02lu BogoMIPS)\n",
-              (cpu_data[0].loops_per_jiffy + 25) / 5000,
-              ((cpu_data[0].loops_per_jiffy + 25) / 50) % 100);
-
-       return;
+       parisc_max_cpus = max_cpus;
+       if (!max_cpus)
+               printk(KERN_INFO "SMP mode deactivated.\n");
 }
 
 
@@ -653,6 +632,9 @@ void smp_cpus_done(unsigned int cpu_max)
 
 int __devinit __cpu_up(unsigned int cpu)
 {
+       if (cpu != 0 && cpu < parisc_max_cpus)
+               smp_boot_one_cpu(cpu);
+
        return cpu_online(cpu) ? 0 : -ENOSYS;
 }
 
index 6b5649a6902612c5cb57a1c15a88c09e42d445f1..e78332541b180592131948fb23ab1953230fa78f 100644 (file)
@@ -205,10 +205,11 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
 
 asmlinkage long sys32_time(compat_time_t *tloc)
 {
-    struct timeval tv;
+       struct timeval tv;
+       compat_time_t now32;
 
        do_gettimeofday(&tv);
-       compat_time_t now32 = tv.tv_sec;
+       now32 = tv.tv_sec;
 
        if (tloc)
                if (put_user(now32, tloc))
@@ -344,7 +345,7 @@ filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino,
        put_user(reclen, &dirent->d_reclen);
        copy_to_user(dirent->d_name, name, namlen);
        put_user(0, dirent->d_name + namlen);
-       ((char *) dirent) += reclen;
+       dirent = (struct linux32_dirent *)((char *)dirent + reclen);
        buf->current_dir = dirent;
        buf->count -= reclen;
        return 0;
index d481796f5ddcdeb4a7815b5631690e8bd7e8382f..ff80b3c1f8a2765ea51b7f440dfaf5032e919b23 100644 (file)
 #include <asm/smp.h>
 #include <asm/pdc.h>
 #include <asm/pdc_chassis.h>
+#include <asm/unwind.h>
 
 #include "../math-emu/math-emu.h"      /* for handle_fpe() */
 
 #define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */
                          /*  dumped to the console via printk)          */
 
+#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
+spinlock_t pa_dbit_lock = SPIN_LOCK_UNLOCKED;
+#endif
+
 int printbinary(char *buf, unsigned long x, int nbits)
 {
        unsigned long mask = 1UL << (nbits - 1);
@@ -125,73 +130,37 @@ void show_regs(struct pt_regs *regs)
 
 void dump_stack(void)
 {
-       unsigned long stack;
-       show_trace(current, &stack);
+       show_stack(NULL, NULL);
 }
 
 EXPORT_SYMBOL(dump_stack);
 
-#ifndef __LP64__
-static int kstack_depth_to_print = 64 * 4;
-#else
-static int kstack_depth_to_print = 128 * 4;
-#endif
-
-void show_stack(struct task_struct *task, unsigned long *sp)
+void show_stack(struct task_struct *task, unsigned long *s)
 {
-       unsigned long *stack;
-       int i;
-
-       /*
-        * debugging aid: "show_stack(NULL);" prints the
-        * back trace for this cpu.
-        */
-       if (task==NULL)
-               sp = (unsigned long*)&sp;
-       else if(sp == NULL)
-               sp = (unsigned long*)task->thread.regs.ksp;
-
-       stack = sp;
-       printk("\n" KERN_CRIT "Stack Dump:\n");
-       printk(KERN_CRIT " " RFMT ":  ", (unsigned long) stack);
-       for (i=0; i < kstack_depth_to_print; i++) {
-               if (((long) stack & (THREAD_SIZE-1)) == 0)
-                       break;
-               if (i && ((i & 0x03) == 0))
-                       printk("\n" KERN_CRIT " " RFMT ":  ",
-                               (unsigned long) stack);
-               printk(RFMT " ", *stack--);
+       int i = 1;
+       struct unwind_frame_info info;
+
+       if (!task) {
+               unsigned long sp, ip, rp;
+
+HERE:
+               asm volatile ("copy %%r30, %0" : "=r"(sp));
+               ip = (unsigned long)&&HERE;
+               rp = (unsigned long)__builtin_return_address(0);
+               unwind_frame_init(&info, current, sp, ip, rp);
+       } else {
+               unwind_frame_init_from_blocked_task(&info, task);
        }
-       printk("\n" KERN_CRIT "\n");
-       show_trace(task, sp);
-}
 
+       printk("Backtrace:\n");
+       while (i <= 16) {
+               if (unwind_once(&info) < 0 || info.ip == 0)
+                       break;
 
-void show_trace(struct task_struct *task, unsigned long *stack)
-{
-       unsigned long *startstack;
-       unsigned long addr;
-       int i;
-
-       startstack = (unsigned long *)((unsigned long)stack & ~(THREAD_SIZE - 1));
-       i = 1;
-       stack = (long *)((long)(stack + 32) &~ (FRAME_SIZE-1)); /* Align */
-       printk("Kernel addresses on the stack:\n");
-       while (stack > startstack) {
-               stack -= 16;    /* Stack frames are a multiple of 16 words */
-               addr = stack[16 - RP_OFFSET / sizeof(long)];
-               /*
-                * If the address is either in the text segment of the
-                * kernel, or in the region which contains vmalloc'ed
-                * memory, it *may* be the address of a calling
-                * routine; if so, print it so that someone tracing
-                * down the cause of the crash will be able to figure
-                * out the call path that was taken.
-                */
-               if (__kernel_text_address(addr)) {
-                       printk(" [<" RFMT ">] ", addr);
+               if (__kernel_text_address(info.ip)) {
+                       printk(" [<" RFMT ">] ", info.ip);
 #ifdef CONFIG_KALLSYMS
-                       print_symbol("%s\n", addr);
+                       print_symbol("%s\n", info.ip);
 #else
                        if ((i & 0x03) == 0)
                                printk("\n");
index ccfd5fe5afb9ab34ded18731ac2a9d86239e0da7..abd749074a5ae9d20e796ae8baf1fb4fd0ce767b 100644 (file)
@@ -8,18 +8,6 @@
  * understand what is happening here
  */
 
-/*
- * J. David Anglin writes:
- *
- * "You have to adjust the current sp to that at the begining of the function.
- * There can be up to two stack additions to allocate the frame in the
- * prologue.  Similar things happen in the epilogue.  In the presence of
- * interrupts, you have to be concerned about where you are in the function
- * and what stack adjustments have taken place."
- *
- * For now these cases are not handled, but they should be!
- */
-
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
@@ -36,8 +24,8 @@
 #define dbg(x...)
 #endif
 
-extern const struct unwind_table_entry __start___unwind[];
-extern const struct unwind_table_entry __stop___unwind[];
+extern struct unwind_table_entry __start___unwind[];
+extern struct unwind_table_entry __stop___unwind[];
 
 static spinlock_t unwind_lock;
 /*
@@ -55,8 +43,6 @@ find_unwind_entry_in_table(const struct unwind_table *table, unsigned long addr)
        const struct unwind_table_entry *e = 0;
        unsigned long lo, hi, mid;
 
-       addr -= table->base_addr;
-
        for (lo = 0, hi = table->length; lo < hi; )
        {
                mid = (lo + hi) / 2;
@@ -97,10 +83,11 @@ find_unwind_entry(unsigned long addr)
 static void
 unwind_table_init(struct unwind_table *table, const char *name,
                  unsigned long base_addr, unsigned long gp,
-                 const void *table_start, const void *table_end)
+                 void *table_start, void *table_end)
 {
-       const struct unwind_table_entry *start = table_start;
-       const struct unwind_table_entry *end = table_end - 1;
+       struct unwind_table_entry *start = table_start;
+       struct unwind_table_entry *end = 
+               (struct unwind_table_entry *)table_end - 1;
 
        table->name = name;
        table->base_addr = base_addr;
@@ -108,14 +95,19 @@ unwind_table_init(struct unwind_table *table, const char *name,
        table->start = base_addr + start->region_start;
        table->end = base_addr + end->region_end;
        table->table = (struct unwind_table_entry *)table_start;
-       table->length = end - start;
+       table->length = end - start + 1;
        table->next = NULL;
+
+       for (; start <= end; start++) {
+               start->region_start += base_addr;
+               start->region_end += base_addr;
+       }
 }
 
 void *
 unwind_table_add(const char *name, unsigned long base_addr, 
                 unsigned long gp,
-                 const void *start, const void *end)
+                 void *start, void *end)
 {
        struct unwind_table *table;
        unsigned long flags;
@@ -206,6 +198,8 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
                        sp = info->prev_sp;
                } while (info->prev_ip < (unsigned long)_stext ||
                         info->prev_ip > (unsigned long)_etext);
+
+               dbg("analyzing func @ %lx with no unwind info, setting prev_sp=%lx prev_ip=%lx\n", info->ip, info->prev_sp, info->prev_ip);
        } else {
 
                dbg("e->start = 0x%x, e->end = 0x%x, Save_SP = %d, Save_RP = %d size = %u\n",
@@ -225,42 +219,57 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
                                /* ldo X(sp), sp, or stwm X,D(sp) */
                                frame_size += (insn & 0x1 ? -1 << 13 : 0) | 
                                        ((insn & 0x3fff) >> 1);
+                               dbg("analyzing func @ %lx, insn=%08x @ %lx, frame_size = %ld\n", info->ip, insn, npc, frame_size);
                        } else if ((insn & 0xffe00008) == 0x7ec00008) {
                                /* std,ma X,D(sp) */
                                frame_size += (insn & 0x1 ? -1 << 13 : 0) | 
                                        (((insn >> 4) & 0x3ff) << 3);
+                               dbg("analyzing func @ %lx, insn=%08x @ %lx, frame_size = %ld\n", info->ip, insn, npc, frame_size);
                        } else if (insn == 0x6bc23fd9) { 
                                /* stw rp,-20(sp) */
                                rpoffset = 20;
                                looking_for_rp = 0;
+                               dbg("analyzing func @ %lx, insn=stw rp,-20(sp) @ %lx\n", info->ip, npc);
                        } else if (insn == 0x0fc212c1) {
                                /* std rp,-16(sr0,sp) */
                                rpoffset = 16;
                                looking_for_rp = 0;
+                               dbg("analyzing func @ %lx, insn=std rp,-16(sp) @ %lx\n", info->ip, npc);
                        }
                }
 
                info->prev_sp = info->sp - frame_size;
                if (rpoffset)
-                       info->prev_ip = *(unsigned long *)(info->prev_sp - rpoffset);
+                       info->rp = *(unsigned long *)(info->prev_sp - rpoffset);
+               info->prev_ip = info->rp;
+               info->rp = 0;
+
+               dbg("analyzing func @ %lx, setting prev_sp=%lx prev_ip=%lx\n", info->ip, info->prev_sp, info->prev_ip);
        }
 }
 
 void unwind_frame_init(struct unwind_frame_info *info, struct task_struct *t, 
-                      struct pt_regs *regs)
+                      unsigned long sp, unsigned long ip, unsigned long rp)
 {
        memset(info, 0, sizeof(struct unwind_frame_info));
        info->t = t;
-       info->sp = regs->ksp;
-       info->ip = regs->kpc;
+       info->sp = sp;
+       info->ip = ip;
+       info->rp = rp;
 
-       dbg("(%d) Start unwind from sp=%08lx ip=%08lx\n", (int)t->pid, info->sp, info->ip);
+       dbg("(%d) Start unwind from sp=%08lx ip=%08lx\n", t ? (int)t->pid : 0, info->sp, info->ip);
 }
 
 void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct task_struct *t)
 {
        struct pt_regs *regs = &t->thread.regs;
-       unwind_frame_init(info, t, regs);
+       unwind_frame_init(info, t, regs->ksp, regs->kpc, 0);
+}
+
+void unwind_frame_init_running(struct unwind_frame_info *info, struct pt_regs *regs)
+{
+       unwind_frame_init(info, current, regs->gr[30], regs->iaoq[0],
+                         regs->gr[2]);
 }
 
 int unwind_once(struct unwind_frame_info *next_frame)
index f088c6372546a6d96b1802bb1057c5631d50e84f..7322c7e63a2ec179da6099ba4cc8b106e739bf2c 100644 (file)
@@ -3,3 +3,5 @@
 #
 
 lib-y  := lusercopy.o bitops.o checksum.o io.o memset.o
+
+lib-$(CONFIG_SMP) += debuglocks.o
index b7e171abd6ae60c3d2ad9ff63073004d340b5b4e..4c077fc4c0e51e5b8ea6172a44022ab129e3b8d4 100644 (file)
@@ -34,26 +34,26 @@ unsigned long __xchg64(unsigned long x, unsigned long *ptr)
 unsigned long __xchg32(int x, int *ptr)
 {
        unsigned long flags;
-       unsigned long temp;
+       long temp;
 
        atomic_spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
-       (long) temp = (long) *ptr;      /* XXX - sign extension wanted? */
+       temp = (long) *ptr;     /* XXX - sign extension wanted? */
        *ptr = x;
        atomic_spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
-       return temp;
+       return (unsigned long)temp;
 }
 
 
 unsigned long __xchg8(char x, char *ptr)
 {
        unsigned long flags;
-       unsigned long temp;
+       long temp;
 
        atomic_spin_lock_irqsave(ATOMIC_HASH(ptr), flags);
-       (long) temp = (long) *ptr;      /* XXX - sign extension wanted? */
+       temp = (long) *ptr;     /* XXX - sign extension wanted? */
        *ptr = x;
        atomic_spin_unlock_irqrestore(ATOMIC_HASH(ptr), flags);
-       return temp;
+       return (unsigned long)temp;
 }
 
 
diff --git a/arch/parisc/lib/debuglocks.c b/arch/parisc/lib/debuglocks.c
new file mode 100644 (file)
index 0000000..7e79f1b
--- /dev/null
@@ -0,0 +1,227 @@
+/* 
+ *    Debugging versions of SMP locking primitives.
+ *
+ *    Copyright (C) 2004 Thibaut VARENE <varenet@esiee.fr>
+ *
+ *    Some code stollen from alpha & sparc64 ;)
+ *
+ *    This program is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    This program is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with this program; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <asm/system.h>
+#include <asm/hardirq.h>       /* in_interrupt() */
+
+#undef INIT_STUCK
+#define INIT_STUCK 1L << 30
+
+#ifdef CONFIG_DEBUG_SPINLOCK
+
+void _dbg_spin_lock(spinlock_t * lock, const char *base_file, int line_no)
+{
+       volatile unsigned int *a;
+       long stuck = INIT_STUCK;
+       void *inline_pc = __builtin_return_address(0);
+       unsigned long started = jiffies;
+       int printed = 0;
+       int cpu = smp_processor_id();
+
+try_again:
+
+       /* Do the actual locking */
+       /* <T-Bone> ggg: we can't get stuck on the outter loop?
+        * <ggg> T-Bone: We can hit the outer loop
+        *      alot if multiple CPUs are constantly racing for a lock
+        *      and the backplane is NOT fair about which CPU sees
+        *      the update first. But it won't hang since every failed
+        *      attempt will drop us back into the inner loop and
+        *      decrement `stuck'.
+        * <ggg> K-class and some of the others are NOT fair in the HW
+        *      implementation so we could see false positives.
+        *      But fixing the lock contention is easier than
+        *      fixing the HW to be fair.
+        * <tausq> __ldcw() returns 1 if we get the lock; otherwise we
+        *      spin until the value of the lock changes, or we time out.
+        */
+       a = __ldcw_align(lock);
+       while (stuck && (__ldcw(a) == 0))
+               while ((*a == 0) && --stuck);
+
+       if (unlikely(stuck <= 0)) {
+               printk(KERN_WARNING
+                       "%s:%d: spin_lock(%s/%p) stuck in %s at %p(%d)"
+                       " owned by %s:%d in %s at %p(%d)\n",
+                       base_file, line_no, lock->module, lock,
+                       current->comm, inline_pc, cpu,
+                       lock->bfile, lock->bline, lock->task->comm,
+                       lock->previous, lock->oncpu);
+               stuck = INIT_STUCK;
+               printed = 1;
+               goto try_again;
+       }
+
+       /* Exiting.  Got the lock.  */
+       lock->oncpu = cpu;
+       lock->previous = inline_pc;
+       lock->task = current;
+       lock->bfile = (char *)base_file;
+       lock->bline = line_no;
+
+       if (unlikely(printed)) {
+               printk(KERN_WARNING
+                       "%s:%d: spin_lock grabbed in %s at %p(%d) %ld ticks\n",
+                       base_file, line_no, current->comm, inline_pc,
+                       cpu, jiffies - started);
+       }
+}
+
+void _dbg_spin_unlock(spinlock_t * lock, const char *base_file, int line_no)
+{
+       CHECK_LOCK(lock);
+       volatile unsigned int *a = __ldcw_align(lock);
+       if (unlikely((*a != 0) && lock->babble)) {
+               lock->babble--;
+               printk(KERN_WARNING
+                       "%s:%d: spin_unlock(%s:%p) not locked\n",
+                       base_file, line_no, lock->module, lock);
+       }
+       *a = 1; 
+}
+
+int _dbg_spin_trylock(spinlock_t * lock, const char *base_file, int line_no)
+{
+       int ret;
+       volatile unsigned int *a = __ldcw_align(lock);
+       if ((ret = (__ldcw(a) != 0))) {
+               lock->oncpu = smp_processor_id();
+               lock->previous = __builtin_return_address(0);
+               lock->task = current;
+       } else {
+               lock->bfile = (char *)base_file;
+               lock->bline = line_no;
+       }
+       return ret;
+}
+
+#endif /* CONFIG_DEBUG_SPINLOCK */
+
+#ifdef CONFIG_DEBUG_RWLOCK
+
+/* Interrupts trouble detailed explanation, thx Grant:
+ *
+ * o writer (wants to modify data) attempts to acquire the rwlock
+ * o He gets the write lock.
+ * o Interupts are still enabled, we take an interrupt with the
+ *   write still holding the lock.
+ * o interrupt handler tries to acquire the rwlock for read.
+ * o deadlock since the writer can't release it at this point.
+ * 
+ * In general, any use of spinlocks that competes between "base"
+ * level and interrupt level code will risk deadlock. Interrupts
+ * need to be disabled in the base level routines to avoid it.
+ * Or more precisely, only the IRQ the base level routine
+ * is competing with for the lock.  But it's more efficient/faster
+ * to just disable all interrupts on that CPU to guarantee
+ * once it gets the lock it can release it quickly too.
+ */
+void _dbg_write_lock(rwlock_t *rw, const char *bfile, int bline)
+{
+       void *inline_pc = __builtin_return_address(0);
+       unsigned long started = jiffies;
+       long stuck = INIT_STUCK;
+       int printed = 0;
+       int cpu = smp_processor_id();
+       
+       if(unlikely(in_interrupt())) {  /* acquiring write lock in interrupt context, bad idea */
+               printk(KERN_WARNING "write_lock caller: %s:%d, IRQs enabled,\n", bfile, bline);
+               BUG();
+       }
+
+       /* Note: if interrupts are disabled (which is most likely), the printk
+       will never show on the console. We might need a polling method to flush
+       the dmesg buffer anyhow. */
+       
+retry:
+       _raw_spin_lock(&rw->lock);
+
+       if(rw->counter != 0) {
+               /* this basically never happens */
+               _raw_spin_unlock(&rw->lock);
+               
+               stuck--;
+               if ((unlikely(stuck <= 0)) && (rw->counter < 0)) {
+                       printk(KERN_WARNING
+                               "%s:%d: write_lock stuck on writer"
+                               " in %s at %p(%d) %ld ticks\n",
+                               bfile, bline, current->comm, inline_pc,
+                               cpu, jiffies - started);
+                       stuck = INIT_STUCK;
+                       printed = 1;
+               }
+               else if (unlikely(stuck <= 0)) {
+                       printk(KERN_WARNING
+                               "%s:%d: write_lock stuck on reader"
+                               " in %s at %p(%d) %ld ticks\n",
+                               bfile, bline, current->comm, inline_pc,
+                               cpu, jiffies - started);
+                       stuck = INIT_STUCK;
+                       printed = 1;
+               }
+               
+               while(rw->counter != 0);
+
+               goto retry;
+       }
+
+       /* got it.  now leave without unlocking */
+       rw->counter = -1; /* remember we are locked */
+
+       if (unlikely(printed)) {
+               printk(KERN_WARNING
+                       "%s:%d: write_lock grabbed in %s at %p(%d) %ld ticks\n",
+                       bfile, bline, current->comm, inline_pc,
+                       cpu, jiffies - started);
+       }
+}
+
+void _dbg_read_lock(rwlock_t * rw, const char *bfile, int bline)
+{
+#if 0
+       void *inline_pc = __builtin_return_address(0);
+       unsigned long started = jiffies;
+       int cpu = smp_processor_id();
+#endif
+       unsigned long flags;
+
+       local_irq_save(flags);
+       _raw_spin_lock(&rw->lock); 
+
+       rw->counter++;
+#if 0
+       printk(KERN_WARNING
+               "%s:%d: read_lock grabbed in %s at %p(%d) %ld ticks\n",
+               bfile, bline, current->comm, inline_pc,
+               cpu, jiffies - started);
+#endif
+       _raw_spin_unlock(&rw->lock);
+       local_irq_restore(flags);
+}
+
+#endif /* CONFIG_DEBUG_RWLOCK */
index 27f635086a1107af03540c66219b22b6e82ab0a6..86fb6b0176b912a3a4f91e7bda0ed333a81f7aa6 100644 (file)
@@ -21,7 +21,7 @@ void __memcpy_toio(unsigned long dest, unsigned long src, int count)
                goto bytecopy;
        while (dest & 3) {
                writeb(*(char *)src, dest++);
-               ((char *)src)++;
+               src++;
                count--;
        }
        while (count > 3) {
@@ -33,7 +33,7 @@ void __memcpy_toio(unsigned long dest, unsigned long src, int count)
  bytecopy:
        while (count--) {
                writeb(*(char *)src, dest++);
-               ((char *)src)++;
+               src++;
        }
 }
 
@@ -62,17 +62,17 @@ void __memcpy_fromio(unsigned long dest, unsigned long src, int count)
        /* Then check for misaligned start address */
        if (src & 1) {
                *(u8 *)dest = readb(src);
-               ((u8 *)src)++;
-               ((u8 *)dest)++;
+               src++;
+               dest++;
                count--;
                if (count < 2) goto bytecopy;
        }
 
        if (src & 2) {
                *(u16 *)dest = __raw_readw(src);
-               ((u16 *)src)++;
-               ((u16 *)dest)++;
-               count-=2;
+               src += 2;
+               dest += 2;
+               count -= 2;
        }
 
        while (count > 3) {
@@ -85,16 +85,16 @@ void __memcpy_fromio(unsigned long dest, unsigned long src, int count)
  shortcopy:
        while (count > 1) {
                *(u16 *)dest = __raw_readw(src);
-               ((u16 *)src)++;
-               ((u16 *)dest)++;
-               count-=2;
+               src += 2;
+               dest += 2;
+               count -= 2;
        }
 
  bytecopy:
        while (count--) {
                *(char *)dest = readb(src);
-               ((char *)src)++;
-               ((char *)dest)++;
+               src++;
+               dest++;
        }
 }
 
@@ -125,12 +125,16 @@ void __memset_io(unsigned long dest, char fill, int count)
  */
 void insb (unsigned long port, void *dst, unsigned long count)
 {
-       while (((unsigned long)dst) & 0x3) {
+       unsigned char *p;
+
+       p = (unsigned char *)dst;
+
+       while (((unsigned long)p) & 0x3) {
                if (!count)
                        return;
                count--;
-               *(unsigned char *) dst = inb(port);
-               ((unsigned char *) dst)++;
+               *p = inb(port);
+               p++;
        }
 
        while (count >= 4) {
@@ -140,14 +144,14 @@ void insb (unsigned long port, void *dst, unsigned long count)
                w |= inb(port) << 16;
                w |= inb(port) << 8;
                w |= inb(port);
-               *(unsigned int *) dst = w;
-               ((unsigned int *) dst)++;
+               *(unsigned int *) p = w;
+               p += 4;
        }
 
        while (count) {
                --count;
-               *(unsigned char *) dst = inb(port);
-               ((unsigned char *) dst)++;
+               *p = inb(port);
+               p++;
        }
 }
 
@@ -162,11 +166,14 @@ void insb (unsigned long port, void *dst, unsigned long count)
 void insw (unsigned long port, void *dst, unsigned long count)
 {
        unsigned int l = 0, l2;
+       unsigned char *p;
+
+       p = (unsigned char *)dst;
        
        if (!count)
                return;
        
-       switch (((unsigned long) dst) & 0x3)
+       switch (((unsigned long)p) & 0x3)
        {
         case 0x00:                     /* Buffer 32-bit aligned */
                while (count>=2) {
@@ -174,28 +181,28 @@ void insw (unsigned long port, void *dst, unsigned long count)
                        count -= 2;
                        l = cpu_to_le16(inw(port)) << 16;
                        l |= cpu_to_le16(inw(port));
-                       *(unsigned int *) dst = l;
-                       ((unsigned int *) dst)++;
+                       *(unsigned int *)p = l;
+                       p += 4;
                }
                if (count) {
-                       *(unsigned short *) dst = cpu_to_le16(inw(port));
+                       *(unsigned short *)p = cpu_to_le16(inw(port));
                }
                break;
        
         case 0x02:                     /* Buffer 16-bit aligned */
-               *(unsigned short *) dst = cpu_to_le16(inw(port));
-               ((unsigned short *) dst)++;
+               *(unsigned short *)p = cpu_to_le16(inw(port));
+               p += 2;
                count--;
                while (count>=2) {
                        
                        count -= 2;
                        l = cpu_to_le16(inw(port)) << 16;
                        l |= cpu_to_le16(inw(port));
-                       *(unsigned int *) dst = l;
-                       ((unsigned int *) dst)++;
+                       *(unsigned int *)p = l;
+                       p += 4;
                }
                if (count) {
-                       *(unsigned short *) dst = cpu_to_le16(inw(port));
+                       *(unsigned short *)p = cpu_to_le16(inw(port));
                }
                break;
                
@@ -206,16 +213,16 @@ void insw (unsigned long port, void *dst, unsigned long count)
                --count;
                
                l = cpu_to_le16(inw(port));
-               *(unsigned char *) dst = l >> 8;
-               ((unsigned char *) dst)++;
+               *p = l >> 8;
+               p++;
                while (count--)
                {
                        l2 = cpu_to_le16(inw(port));
-                       *(unsigned short *) dst = (l & 0xff) << 8 | (l2 >> 8);
-                       ((unsigned short *) dst)++;
+                       *(unsigned short *)p = (l & 0xff) << 8 | (l2 >> 8);
+                       p += 2;
                        l = l2;
                }
-               *(unsigned char *) dst = l & 0xff;
+               *p = l & 0xff;
                break;
        }
 }
@@ -231,6 +238,9 @@ void insw (unsigned long port, void *dst, unsigned long count)
 void insl (unsigned long port, void *dst, unsigned long count)
 {
        unsigned int l = 0, l2;
+       unsigned char *p;
+
+       p = (unsigned char *)dst;
        
        if (!count)
                return;
@@ -240,8 +250,8 @@ void insl (unsigned long port, void *dst, unsigned long count)
         case 0x00:                     /* Buffer 32-bit aligned */
                while (count--)
                {
-                       *(unsigned int *) dst = cpu_to_le32(inl(port));
-                       ((unsigned int *) dst)++;
+                       *(unsigned int *)p = cpu_to_le32(inl(port));
+                       p += 4;
                }
                break;
        
@@ -249,51 +259,51 @@ void insl (unsigned long port, void *dst, unsigned long count)
                --count;
                
                l = cpu_to_le32(inl(port));
-               *(unsigned short *) dst = l >> 16;
-               ((unsigned short *) dst)++;
+               *(unsigned short *)p = l >> 16;
+               p += 2;
                
                while (count--)
                {
                        l2 = cpu_to_le32(inl(port));
-                       *(unsigned int *) dst = (l & 0xffff) << 16 | (l2 >> 16);
-                       ((unsigned int *) dst)++;
+                       *(unsigned int *)p = (l & 0xffff) << 16 | (l2 >> 16);
+                       p += 4;
                        l = l2;
                }
-               *(unsigned short *) dst = l & 0xffff;
+               *(unsigned short *)p = l & 0xffff;
                break;
         case 0x01:                     /* Buffer 8-bit aligned */
                --count;
                
                l = cpu_to_le32(inl(port));
-               *(unsigned char *) dst = l >> 24;
-               ((unsigned char *) dst)++;
-               *(unsigned short *) dst = (l >> 8) & 0xffff;
-               ((unsigned short *) dst)++;
+               *(unsigned char *)p = l >> 24;
+               p++;
+               *(unsigned short *)p = (l >> 8) & 0xffff;
+               p += 2;
                while (count--)
                {
                        l2 = cpu_to_le32(inl(port));
-                       *(unsigned int *) dst = (l & 0xff) << 24 | (l2 >> 8);
-                       ((unsigned int *) dst)++;
+                       *(unsigned int *)p = (l & 0xff) << 24 | (l2 >> 8);
+                       p += 4;
                        l = l2;
                }
-               *(unsigned char *) dst = l & 0xff;
+               *p = l & 0xff;
                break;
         case 0x03:                     /* Buffer 8-bit aligned */
                --count;
                
                l = cpu_to_le32(inl(port));
-               *(unsigned char *) dst = l >> 24;
-               ((unsigned char *) dst)++;
+               *p = l >> 24;
+               p++;
                while (count--)
                {
                        l2 = cpu_to_le32(inl(port));
-                       *(unsigned int *) dst = (l & 0xffffff) << 8 | l2 >> 24;
-                       ((unsigned int *) dst)++;
+                       *(unsigned int *)p = (l & 0xffffff) << 8 | l2 >> 24;
+                       p += 4;
                        l = l2;
                }
-               *(unsigned short *) dst = (l >> 8) & 0xffff;
-               ((unsigned short *) dst)++;
-               *(unsigned char *) dst = l & 0xff;
+               *(unsigned short *)p = (l >> 8) & 0xffff;
+               p += 2;
+               *p = l & 0xff;
                break;
        }
 }
@@ -307,10 +317,13 @@ void insl (unsigned long port, void *dst, unsigned long count)
  */
 void outsb(unsigned long port, const void * src, unsigned long count)
 {
+       const unsigned char *p;
+
+       p = (const unsigned char *)src;
        while (count) {
                count--;
-               outb(*(char *)src, port);
-               ((char *) src)++;
+               outb(*p, port);
+               p++;
        }
 }
 
@@ -323,40 +336,43 @@ void outsb(unsigned long port, const void * src, unsigned long count)
 void outsw (unsigned long port, const void *src, unsigned long count)
 {
        unsigned int l = 0, l2;
+       const unsigned char *p;
+
+       p = (const unsigned char *)src;
        
        if (!count)
                return;
        
-       switch (((unsigned long) src) & 0x3)
+       switch (((unsigned long)p) & 0x3)
        {
         case 0x00:                     /* Buffer 32-bit aligned */
                while (count>=2) {
                        count -= 2;
-                       l = *(unsigned int *) src;
-                       ((unsigned int *) src)++;
+                       l = *(unsigned int *)p;
+                       p += 4;
                        outw(le16_to_cpu(l >> 16), port);
                        outw(le16_to_cpu(l & 0xffff), port);
                }
                if (count) {
-                       outw(le16_to_cpu(*(unsigned short*)src), port);
+                       outw(le16_to_cpu(*(unsigned short*)p), port);
                }
                break;
        
         case 0x02:                     /* Buffer 16-bit aligned */
                
-               outw(le16_to_cpu(*(unsigned short*)src), port);
-               ((unsigned short *) src)++;
+               outw(le16_to_cpu(*(unsigned short*)p), port);
+               p += 2;
                count--;
                
                while (count>=2) {
                        count -= 2;
-                       l = *(unsigned int *) src;
-                       ((unsigned int *) src)++;
+                       l = *(unsigned int *)p;
+                       p += 4;
                        outw(le16_to_cpu(l >> 16), port);
                        outw(le16_to_cpu(l & 0xffff), port);
                }
                if (count) {
-                       outw(le16_to_cpu(*(unsigned short*)src), port);
+                       outw(le16_to_cpu(*(unsigned short *)p), port);
                }
                break;
                
@@ -364,18 +380,18 @@ void outsw (unsigned long port, const void *src, unsigned long count)
                /* I don't bother with 32bit transfers
                 * in this case, 16bit will have to do -- DE */
                
-               l  = *(unsigned char *) src << 8;
-               ((unsigned char *) src)++;
+               l  = *p << 8;
+               p++;
                count--;
                while (count)
                {
                        count--;
-                       l2 = *(unsigned short *) src;
-                       ((unsigned short *) src)++;
+                       l2 = *(unsigned short *)p;
+                       p += 2;
                        outw(le16_to_cpu(l | l2 >> 8), port);
                        l = l2 << 8;
                }
-               l2 = *(unsigned char *) src;
+               l2 = *(unsigned char *)p;
                outw (le16_to_cpu(l | l2>>8), port);
                break;
        
@@ -392,68 +408,73 @@ void outsw (unsigned long port, const void *src, unsigned long count)
 void outsl (unsigned long port, const void *src, unsigned long count)
 {
        unsigned int l = 0, l2;
+       const unsigned char *p;
+
+       p = (const unsigned char *)src;
        
        if (!count)
                return;
        
-       switch (((unsigned long) src) & 0x3)
+       switch (((unsigned long)p) & 0x3)
        {
         case 0x00:                     /* Buffer 32-bit aligned */
                while (count--)
                {
-                       outl(le32_to_cpu(*(unsigned int *) src), port);
-                       ((unsigned int *) src)++;
+                       outl(le32_to_cpu(*(unsigned int *)p), port);
+                       p += 4;
                }
                break;
        
         case 0x02:                     /* Buffer 16-bit aligned */
                --count;
                
-               l = *(unsigned short *) src;
-               ((unsigned short *) src)++;
+               l = *(unsigned short *)p;
+               p += 2;
                
                while (count--)
                {
-                       l2 = *(unsigned int *) src;
-                       ((unsigned int *) src)++;
+                       l2 = *(unsigned int *)p;
+                       p += 4;
                        outl (le32_to_cpu(l << 16 | l2 >> 16), port);
                        l = l2;
                }
-               l2 = *(unsigned short *) src;
+               l2 = *(unsigned short *)p;
                outl (le32_to_cpu(l << 16 | l2), port);
                break;
         case 0x01:                     /* Buffer 8-bit aligned */
                --count;
-               
-               l  = *(unsigned char *) src << 24;
-               ((unsigned char *) src)++;
-               l |= *(unsigned short *) src << 8;
-               ((unsigned short *) src)++;
+
+               l = *p << 24;
+               p++;
+               l |= *(unsigned short *)p << 8;
+               p += 2;
+
                while (count--)
                {
-                       l2 = *(unsigned int *) src;
-                       ((unsigned int *) src)++;
+                       l2 = *(unsigned int *)p;
+                       p += 4;
                        outl (le32_to_cpu(l | l2 >> 24), port);
                        l = l2 << 8;
                }
-               l2 = *(unsigned char *) src;
-                     outl (le32_to_cpu(l | l2), port);
+               l2 = *p;
+               outl (le32_to_cpu(l | l2), port);
                break;
         case 0x03:                     /* Buffer 8-bit aligned */
                --count;
                
-               l  = *(unsigned char *) src << 24;
-               ((unsigned char *) src)++;
+               l = *p << 24;
+               p++;
+
                while (count--)
                {
-                       l2 = *(unsigned int *) src;
-                       ((unsigned int *) src)++;
+                       l2 = *(unsigned int *)p;
+                       p += 4;
                        outl (le32_to_cpu(l | l2 >> 8), port);
                        l = l2 << 24;
                }
-               l2  = *(unsigned short *) src << 16;
-               ((unsigned short *) src)++;
-               l2 |= *(unsigned char *) src;
+               l2 = *(unsigned short *)p << 16;
+               p += 2;
+               l2 |= *p;
                outl (le32_to_cpu(l | l2), port);
                break;
        }
index 94f5d4e60920620b63b02ad4161fb6dc605b6db1..871d7df2779c0ba8b1f49541359c63f3f3e8e50d 100644 (file)
@@ -5,6 +5,7 @@
  *  Copyright 1999 SuSE GmbH
  *    changed by Philipp Rumpf
  *  Copyright 1999 Philipp Rumpf (prumpf@tux.org)
+ *  Copyright 2004 Randolph Chung (tausq@debian.org)
  *
  */
 
@@ -23,6 +24,7 @@
 #include <asm/pgalloc.h>
 #include <asm/tlb.h>
 #include <asm/pdc_chassis.h>
+#include <asm/mmzone.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 
@@ -32,10 +34,9 @@ extern char _end;    /* end of BSS, defined by linker */
 extern char __init_begin, __init_end;
 
 #ifdef CONFIG_DISCONTIGMEM
-struct node_map_data node_data[MAX_PHYSMEM_RANGES];
-bootmem_data_t bmem_data[MAX_PHYSMEM_RANGES];
-unsigned char *chunkmap;
-unsigned int maxchunkmap;
+struct node_map_data node_data[MAX_NUMNODES];
+bootmem_data_t bmem_data[MAX_NUMNODES];
+unsigned char pfnnid_map[PFNNID_MAP_MAX];
 #endif
 
 static struct resource data_resource = {
@@ -119,21 +120,6 @@ static void __init setup_bootmem(void)
 
        disable_sr_hashing(); /* Turn off space register hashing */
 
-#ifdef CONFIG_DISCONTIGMEM
-       /*
-        * The below is still true as of 2.4.2. If this is ever fixed,
-        * we can remove this warning!
-        */
-
-       printk(KERN_WARNING "\n\n");
-       printk(KERN_WARNING "CONFIG_DISCONTIGMEM is enabled, which is probably a mistake. This\n");
-       printk(KERN_WARNING "option can lead to heavy swapping, even when there are gigabytes\n");
-       printk(KERN_WARNING "of free memory.\n\n");
-#endif
-
-#ifdef __LP64__
-
-#ifndef CONFIG_DISCONTIGMEM
        /*
         * Sort the ranges. Since the number of ranges is typically
         * small, and performance is not an issue here, just do
@@ -160,11 +146,10 @@ static void __init setup_bootmem(void)
                }
        }
 
+#ifndef CONFIG_DISCONTIGMEM
        /*
         * Throw out ranges that are too far apart (controlled by
-        * MAX_GAP). If CONFIG_DISCONTIGMEM wasn't implemented so
-        * poorly, we would recommend enabling that option, but,
-        * until it is fixed, this is the best way to go.
+        * MAX_GAP).
         */
 
        for (i = 1; i < npmem_ranges; i++) {
@@ -172,6 +157,11 @@ static void __init setup_bootmem(void)
                        (pmem_ranges[i-1].start_pfn +
                         pmem_ranges[i-1].pages) > MAX_GAP) {
                        npmem_ranges = i;
+                       printk("Large gap in memory detected (%ld pages). "
+                              "Consider turning on CONFIG_DISCONTIGMEM\n",
+                              pmem_ranges[i].start_pfn -
+                              (pmem_ranges[i-1].start_pfn +
+                               pmem_ranges[i-1].pages));
                        break;
                }
        }
@@ -194,8 +184,6 @@ static void __init setup_bootmem(void)
                }
        }
 
-#endif /* __LP64__ */
-
        sysram_resource_count = npmem_ranges;
        for (i = 0; i < sysram_resource_count; i++) {
                struct resource *res = &sysram_resources[i];
@@ -218,6 +206,7 @@ static void __init setup_bootmem(void)
        mem_limit_func();       /* check for "mem=" argument */
 
        mem_max = 0;
+       num_physpages = 0;
        for (i = 0; i < npmem_ranges; i++) {
                unsigned long rsize;
 
@@ -232,15 +221,16 @@ static void __init setup_bootmem(void)
                                npmem_ranges = i + 1;
                                mem_max = mem_limit;
                        }
+               num_physpages += pmem_ranges[i].pages;
                        break;
                }
+           num_physpages += pmem_ranges[i].pages;
                mem_max += rsize;
        }
 
        printk(KERN_INFO "Total Memory: %ld Mb\n",mem_max >> 20);
 
 #ifndef CONFIG_DISCONTIGMEM
-
        /* Merge the ranges, keeping track of the holes */
 
        {
@@ -272,9 +262,18 @@ static void __init setup_bootmem(void)
        bootmap_start_pfn = PAGE_ALIGN(__pa((unsigned long) &_end)) >> PAGE_SHIFT;
 
 #ifdef CONFIG_DISCONTIGMEM
+       for (i = 0; i < MAX_PHYSMEM_RANGES; i++) {
+               memset(NODE_DATA(i), 0, sizeof(pg_data_t));
+               NODE_DATA(i)->bdata = &bmem_data[i];
+       }
+       memset(pfnnid_map, 0xff, sizeof(pfnnid_map));
+
+       numnodes = npmem_ranges;
+
        for (i = 0; i < npmem_ranges; i++)
-               node_data[i].pg_data.bdata = &bmem_data[i];
+               node_set_online(i);
 #endif
+
        /*
         * Initialize and free the full range of memory in each range.
         * Note that the only writing these routines do are to the bootmap,
@@ -443,16 +442,20 @@ unsigned long pcxl_dma_start;
 
 void __init mem_init(void)
 {
-       int i;
-
        high_memory = __va((max_pfn << PAGE_SHIFT));
-       max_mapnr = (virt_to_page(high_memory - 1) - mem_map) + 1;
 
-       num_physpages = 0;
-       mem_map = zone_table[0]->zone_mem_map;
-       for (i = 0; i < npmem_ranges; i++)
-               num_physpages += free_all_bootmem_node(NODE_DATA(i));
-       totalram_pages = num_physpages;
+#ifndef CONFIG_DISCONTIGMEM
+       max_mapnr = page_to_pfn(virt_to_page(high_memory - 1)) + 1;
+       mem_map = zone_table[ZONE_DMA]->zone_mem_map;
+       totalram_pages += free_all_bootmem();
+#else
+       {
+               int i;
+
+               for (i = 0; i < npmem_ranges; i++)
+                       totalram_pages += free_all_bootmem_node(NODE_DATA(i));
+       }
+#endif
 
        printk(KERN_INFO "Memory: %luk available\n", num_physpages << (PAGE_SHIFT-10));
 
@@ -486,6 +489,7 @@ void show_mem(void)
        show_free_areas();
        printk(KERN_INFO "Free swap:     %6ldkB\n",
                                nr_swap_pages<<(PAGE_SHIFT-10));
+#ifndef CONFIG_DISCONTIGMEM
        i = max_mapnr;
        while (i-- > 0) {
                total++;
@@ -493,15 +497,55 @@ void show_mem(void)
                        reserved++;
                else if (PageSwapCache(mem_map+i))
                        cached++;
-               else if (!atomic_read(&mem_map[i].count))
+               else if (!page_count(&mem_map[i]))
                        free++;
                else
-                       shared += atomic_read(&mem_map[i].count) - 1;
+                       shared += page_count(&mem_map[i]) - 1;
+       }
+#else
+       for (i = 0; i < npmem_ranges; i++) {
+               int j;
+
+               for (j = node_start_pfn(i); j < node_end_pfn(i); j++) {
+                       struct page *p;
+
+                       p = node_mem_map(i) + j - node_start_pfn(i);
+
+                       total++;
+                       if (PageReserved(p))
+                               reserved++;
+                       else if (PageSwapCache(p))
+                               cached++;
+                       else if (!page_count(p))
+                               free++;
+                       else
+                               shared += page_count(p) - 1;
+               }
        }
+#endif
        printk(KERN_INFO "%d pages of RAM\n", total);
        printk(KERN_INFO "%d reserved pages\n", reserved);
        printk(KERN_INFO "%d pages shared\n", shared);
        printk(KERN_INFO "%d pages swap cached\n", cached);
+
+
+#ifdef CONFIG_DISCONTIGMEM
+       {
+               struct zonelist *zl;
+               int i, j, k;
+
+               for (i = 0; i < npmem_ranges; i++) {
+                       for (j = 0; j < MAX_NR_ZONES; j++) {
+                               zl = NODE_DATA(i)->node_zonelists + j;
+
+                               printk("Zone list for zone %d on node %d: ", j, i);
+                               for (k = 0; zl->zones[k] != NULL; k++) 
+                                       printk("[%d/%s] ", zl->zones[k]->zone_pgdat->node_id, zl->zones[k]->name);
+                               printk("\n");
+                       }
+               }
+       }
+#endif
 }
 
 
@@ -544,7 +588,7 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
 #if PTRS_PER_PMD == 1
                pmd = (pmd_t *)__pa(pg_dir);
 #else
-               pmd = (pmd_t *) (PAGE_MASK & pgd_val(*pg_dir));
+               pmd = (pmd_t *)pgd_address(*pg_dir);
 
                /*
                 * pmd is physical at this point
@@ -555,7 +599,7 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
                        pmd = (pmd_t *) __pa(pmd);
                }
 
-               pgd_val(*pg_dir) = _PAGE_TABLE | (unsigned long) pmd;
+               pgd_populate(NULL, pg_dir, __va(pmd));
 #endif
                pg_dir++;
 
@@ -568,15 +612,14 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
                         * pg_table is physical at this point
                         */
 
-                       pg_table = (pte_t *) (PAGE_MASK & pmd_val(*pmd));
+                       pg_table = (pte_t *)pmd_address(*pmd);
                        if (!pg_table) {
                                pg_table = (pte_t *)
                                        alloc_bootmem_low_pages_node(NODE_DATA(0),PAGE_SIZE);
                                pg_table = (pte_t *) __pa(pg_table);
                        }
 
-                       pmd_val(*pmd) = _PAGE_TABLE |
-                                          (unsigned long) pg_table;
+                       pmd_populate_kernel(NULL, pmd, __va(pg_table));
 
                        /* now change pg_table to kernel virtual addresses */
 
@@ -584,8 +627,6 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
                        for (tmp2 = start_pte; tmp2 < PTRS_PER_PTE; tmp2++,pg_table++) {
                                pte_t pte;
 
-#if !defined(CONFIG_STI_CONSOLE)
-#warning STI console should explicitly allocate executable pages but does not
                                /*
                                 * Map the fault vector writable so we can
                                 * write the HPMC checksum.
@@ -595,7 +636,6 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
                                                        && address != gw_addr)
                                    pte = __mk_pte(address, PAGE_KERNEL_RO);
                                else
-#endif
                                    pte = __mk_pte(address, pgprot);
 
                                if (address >= end_paddr)
@@ -758,61 +798,26 @@ void __init paging_init(void)
        flush_tlb_all_local();
 
        for (i = 0; i < npmem_ranges; i++) {
-               unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0, };
+               unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0 };
 
+               /* We have an IOMMU, so all memory can go into a single
+                  ZONE_DMA zone. */
                zones_size[ZONE_DMA] = pmem_ranges[i].pages;
+
                free_area_init_node(i,NODE_DATA(i),NULL,zones_size,
-                               (pmem_ranges[i].start_pfn << PAGE_SHIFT),0);
-       }
+                               pmem_ranges[i].start_pfn, 0);
 
 #ifdef CONFIG_DISCONTIGMEM
-       /*
-        * Initialize support for virt_to_page() macro.
-        *
-        * Note that MAX_ADDRESS is the largest virtual address that
-        * we can map. However, since we map all physical memory into
-        * the kernel address space, it also has an effect on the maximum
-        * physical address we can map (MAX_ADDRESS - PAGE_OFFSET).
-        */
-
-       maxchunkmap = MAX_ADDRESS >> CHUNKSHIFT;
-       chunkmap = (unsigned char *)alloc_bootmem(maxchunkmap);
-
-       for (i = 0; i < maxchunkmap; i++)
-           chunkmap[i] = BADCHUNK;
-
-       for (i = 0; i < npmem_ranges; i++) {
-
-               ADJ_NODE_MEM_MAP(i) = NODE_MEM_MAP(i) - pmem_ranges[i].start_pfn;
                {
-                       unsigned long chunk_paddr;
-                       unsigned long end_paddr;
-                       int chunknum;
-
-                       chunk_paddr = (pmem_ranges[i].start_pfn << PAGE_SHIFT);
-                       end_paddr = chunk_paddr + (pmem_ranges[i].pages << PAGE_SHIFT);
-                       chunk_paddr &= CHUNKMASK;
-
-                       chunknum = (int)CHUNKNUM(chunk_paddr);
-                       while (chunk_paddr < end_paddr) {
-                               if (chunknum >= maxchunkmap)
-                                       goto badchunkmap1;
-                               if (chunkmap[chunknum] != BADCHUNK)
-                                       goto badchunkmap2;
-                               chunkmap[chunknum] = (unsigned char)i;
-                               chunk_paddr += CHUNKSZ;
-                               chunknum++;
-                       }
+                   int j;
+                   for (j = (node_start_pfn(i) >> PFNNID_SHIFT);
+                        j <= (node_end_pfn(i) >> PFNNID_SHIFT);
+                        j++) {
+                       pfnnid_map[j] = i;
+                   }
                }
-       }
-
-       return;
-
-badchunkmap1:
-       panic("paging_init: Physical address exceeds maximum address space!\n");
-badchunkmap2:
-       panic("paging_init: Collision in chunk map array. CHUNKSZ needs to be smaller\n");
 #endif
+       }
 }
 
 #ifdef CONFIG_PA20
index a9ca3c25c351583593160d32ff714aa0d4fed461..5840219f6efd72ccf31b9fd407edd43d60c60f43 100644 (file)
@@ -932,13 +932,16 @@ dino_driver_callback(struct parisc_device *dev)
        struct dino_device *dino_dev;   // Dino specific control struct
        const char *version = "unknown";
        const int name_len = 32;
+       char hw_path[64];
        char *name;
        int is_cujo = 0;
        struct pci_bus *bus;
-
+       
        name = kmalloc(name_len, GFP_KERNEL);
-       if(name)
-               snprintf(name, name_len, "Dino %s", dev->dev.bus_id);
+       if(name) {
+               print_pa_hwpath(dev, hw_path);
+               snprintf(name, name_len, "Dino [%s]", hw_path);
+       } 
        else
                name = "Dino";
 
index a6757b3bbf00ad9b3535918e222bb4ced773f227..38d9e1aba1d0f534e60a1dc6c4dca4ba1e67f056 100644 (file)
@@ -49,7 +49,15 @@ iommu_fill_pdir(struct ioc *ioc, struct scatterlist *startsg, int nents,
                        sg_dma_len(startsg) = 0;
                        dma_offset = (unsigned long) pide & ~IOVP_MASK;
                        n_mappings++;
+#if defined(ZX1_SUPPORT)
+                       /* Pluto IOMMU IO Virt Address is not zero based */
+                       sg_dma_address(dma_sg) = pide | ioc->ibase;
+#else
+                       /* SBA, ccio, and dino are zero based.
+                        * Trying to save a few CPU cycles for most users.
+                        */
                        sg_dma_address(dma_sg) = pide;
+#endif
                        pdirp = &(ioc->pdir_base[pide >> IOVP_SHIFT]);
                        prefetchw(pdirp);
                }
index 60466bd12a293c6c06674aa0933d6a05ed385384..33bff2ea9a87910f291a605ad050c253006daebd 100644 (file)
 
 #include <asm/byteorder.h>     /* get in-line asm for swab */
 #include <asm/pdc.h>
+#include <asm/pdcpat.h>
 #include <asm/page.h>
 #include <asm/segment.h>
 #include <asm/system.h>
-#include <asm/io.h>            /* gsc_read/write functions */
+#include <asm/io.h>            /* read/write functions */
 #ifdef CONFIG_SUPERIO
 #include <asm/superio.h>
 #endif
@@ -223,19 +224,7 @@ assert_failed (char *a, char *f, int l)
 #endif
 
 
-#define READ_U8(addr)  gsc_readb(addr)
-#define READ_U16(addr) le16_to_cpu(gsc_readw((u16 *) (addr)))
-#define READ_U32(addr) le32_to_cpu(gsc_readl((u32 *) (addr)))
-#define READ_REG16(addr) gsc_readw((u16 *) (addr))
-#define READ_REG32(addr) gsc_readl((u32 *) (addr))
-#define WRITE_U8(value, addr) gsc_writeb(value, addr)
-#define WRITE_U16(value, addr) gsc_writew(cpu_to_le16(value), (u16 *) (addr))
-#define WRITE_U32(value, addr) gsc_writel(cpu_to_le32(value), (u32 *) (addr))
-#define WRITE_REG16(value, addr) gsc_writew(value, (u16 *) (addr))
-#define WRITE_REG32(value, addr) gsc_writel(value, (u32 *) (addr))
-
-
-#define IOSAPIC_REG_SELECT              0
+#define IOSAPIC_REG_SELECT              0x00
 #define IOSAPIC_REG_WINDOW              0x10
 #define IOSAPIC_REG_EOI                 0x40
 
@@ -244,8 +233,19 @@ assert_failed (char *a, char *f, int l)
 #define IOSAPIC_IRDT_ENTRY(idx)                (0x10+(idx)*2)
 #define IOSAPIC_IRDT_ENTRY_HI(idx)     (0x11+(idx)*2)
 
+static inline unsigned int iosapic_read(unsigned long iosapic, unsigned int reg)
+{
+       writel(reg, iosapic + IOSAPIC_REG_SELECT);
+       return readl(iosapic + IOSAPIC_REG_WINDOW);
+}
+
+static inline void iosapic_write(unsigned long iosapic, unsigned int reg, u32 val)
+{
+       writel(reg, iosapic + IOSAPIC_REG_SELECT);
+       writel(val, iosapic + IOSAPIC_REG_WINDOW);
+}
+
 /*
-** FIXME: revisit which GFP flags we should really be using.
 **     GFP_KERNEL includes __GFP_WAIT flag and that may not
 **     be acceptable. Since this is boot time, we shouldn't have
 **     to wait ever and this code should (will?) never get called
@@ -260,16 +260,13 @@ assert_failed (char *a, char *f, int l)
 #define        IOSAPIC_UNLOCK(lck)     spin_unlock_irqrestore(lck, irqflags)
 
 
-#define IOSAPIC_VERSION_MASK            0x000000ff
-#define IOSAPIC_VERSION_SHIFT           0x0
-#define        IOSAPIC_VERSION(ver)                            \
-               (int) ((ver & IOSAPIC_VERSION_MASK) >> IOSAPIC_VERSION_SHIFT)
+#define IOSAPIC_VERSION_MASK   0x000000ff
+#define        IOSAPIC_VERSION(ver)    ((int) (ver & IOSAPIC_VERSION_MASK))
 
 #define IOSAPIC_MAX_ENTRY_MASK          0x00ff0000
-
 #define IOSAPIC_MAX_ENTRY_SHIFT         0x10
-#define        IOSAPIC_IRDT_MAX_ENTRY(ver)                     \
-               (int) ((ver&IOSAPIC_MAX_ENTRY_MASK) >> IOSAPIC_MAX_ENTRY_SHIFT)
+#define        IOSAPIC_IRDT_MAX_ENTRY(ver)     \
+       (int) (((ver) & IOSAPIC_MAX_ENTRY_MASK) >> IOSAPIC_MAX_ENTRY_SHIFT)
 
 /* bits in the "low" I/O Sapic IRdT entry */
 #define IOSAPIC_IRDT_ENABLE       0x10000
@@ -281,9 +278,6 @@ assert_failed (char *a, char *f, int l)
 #define IOSAPIC_IRDT_ID_EID_SHIFT              0x10
 
 
-
-#define        IOSAPIC_EOI(eoi_addr, eoi_data) gsc_writel(eoi_data, eoi_addr)
-
 static struct iosapic_info *iosapic_list;
 static spinlock_t iosapic_lock;
 static int iosapic_count;
@@ -403,14 +397,14 @@ iosapic_load_irt(unsigned long cell_num, struct irt_entry **irt)
        struct irt_entry *p = table;
        int i;
 
-       printk(KERN_DEBUG MODULE_NAME " Interrupt Routing Table (cell %ld)\n", cell_num);
-       printk(KERN_DEBUG MODULE_NAME " start = 0x%p num_entries %ld entry_size %d\n",
+       printk(MODULE_NAME " Interrupt Routing Table (cell %ld)\n", cell_num);
+       printk(MODULE_NAME " start = 0x%p num_entries %ld entry_size %d\n",
                table,
                num_entries,
                (int) sizeof(struct irt_entry));
 
        for (i = 0 ; i < num_entries ; i++, p++) {
-               printk(KERN_DEBUG MODULE_NAME " %02x %02x %02x %02x %02x %02x %02x %02x %08x%08x\n",
+               printk(MODULE_NAME " %02x %02x %02x %02x %02x %02x %02x %02x %08x%08x\n",
                p->entry_type, p->entry_length, p->interrupt_type,
                p->polarity_trigger, p->src_bus_irq_devno, p->src_bus_id,
                p->src_seg_id, p->dest_iosapic_intin,
@@ -608,22 +602,26 @@ iosapic_xlate_pin(struct iosapic_info *isi, struct pci_dev *pcidev)
 static irqreturn_t
 iosapic_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 {
-       struct vector_info *vi = (struct vector_info *)dev_id;
+       struct vector_info *vi = (struct vector_info *) dev_id;
        extern void do_irq(struct irqaction *a, int i, struct pt_regs *p);
        int irq_num = vi->iosapic->isi_region->data.irqbase + vi->irqline;
 
-       DBG("iosapic_interrupt(): irq %d line %d eoi %p\n",
-               irq, vi->irqline, vi->eoi_addr);
+       DBG("iosapic_interrupt(): irq %d line %d eoi 0x%p 0x%x\n",
+               irq, vi->irqline, vi->eoi_addr, vi->eoi_data);
+
+       /* Do NOT need to mask/unmask IRQ. processor is already masked. */
 
-/* FIXME: Need to mask/unmask? processor IRQ is already masked... */
        do_irq(&vi->iosapic->isi_region->action[vi->irqline], irq_num, regs);
 
        /*
+       ** PARISC only supports PCI devices below I/O SAPIC.
        ** PCI only supports level triggered in order to share IRQ lines.
-       ** I/O SAPIC must always issue EOI.
+       ** ergo I/O SAPIC must always issue EOI on parisc.
+       **
+       ** i386/ia64 support ISA devices and have to deal with
+       ** edge-triggered interrupts too.
        */
-       IOSAPIC_EOI(vi->eoi_addr, vi->eoi_data);
-
+       __raw_writel(vi->eoi_data, vi->eoi_addr);
        return IRQ_HANDLED;
 }
 
@@ -715,8 +713,7 @@ iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev)
        ASSERT(tmp == 0);
 
        vi->eoi_addr = (u32 *) (isi->isi_hpa + IOSAPIC_REG_EOI);
-       vi->eoi_data = cpu_to_le32(vi->irqline);
-
+       vi->eoi_data = cpu_to_le32(vi->txn_data);
        ASSERT(NULL != isi->isi_region);
 
        DBG_IRT("iosapic_fixup_irq() %d:%d %x %x line %d irq %d\n",
@@ -733,13 +730,8 @@ iosapic_rd_irt_entry(struct vector_info *vi , u32 *dp0, u32 *dp1)
        struct iosapic_info *isp = vi->iosapic;
        u8 idx = vi->irqline;
 
-       /* point the window register to the lower word */
-       WRITE_U32(IOSAPIC_IRDT_ENTRY(idx), isp->isi_hpa+IOSAPIC_REG_SELECT);
-       *dp0 = READ_U32(isp->isi_hpa+IOSAPIC_REG_WINDOW);
-
-       /* point the window register to the higher word */
-       WRITE_U32(IOSAPIC_IRDT_ENTRY_HI(idx), isp->isi_hpa+IOSAPIC_REG_SELECT);
-       *dp1 = READ_U32(isp->isi_hpa+IOSAPIC_REG_WINDOW);
+       *dp0 = iosapic_read(isp->isi_hpa, IOSAPIC_IRDT_ENTRY(idx));
+       *dp1 = iosapic_read(isp->isi_hpa, IOSAPIC_IRDT_ENTRY_HI(idx));
 }
 
 
@@ -750,24 +742,20 @@ iosapic_wr_irt_entry(struct vector_info *vi, u32 dp0, u32 dp1)
 
        ASSERT(NULL != isp);
        ASSERT(0 != isp->isi_hpa);
-       DBG_IRT("iosapic_wr_irt_entry(): irq %d hpa %p WINDOW %p  0x%x 0x%x\n",
+       DBG_IRT("iosapic_wr_irt_entry(): irq %d hpa %p 0x%x 0x%x\n",
                vi->irqline,
-               isp->isi_hpa, isp->isi_hpa+IOSAPIC_REG_WINDOW,
+               isp->isi_hpa,
                dp0, dp1);
 
-       /* point the window register to the lower word */
-       WRITE_U32(IOSAPIC_IRDT_ENTRY(vi->irqline), isp->isi_hpa+IOSAPIC_REG_SELECT);
-       WRITE_U32( dp0, isp->isi_hpa+IOSAPIC_REG_WINDOW);
+       iosapic_write(isp->isi_hpa, IOSAPIC_IRDT_ENTRY(vi->irqline), dp0);
 
        /* Read the window register to flush the writes down to HW  */
-       dp0 = READ_U32(isp->isi_hpa+IOSAPIC_REG_WINDOW);
+       dp0 = readl(isp->isi_hpa+IOSAPIC_REG_WINDOW);
 
-       /* point the window register to the higher word */
-       WRITE_U32(IOSAPIC_IRDT_ENTRY_HI(vi->irqline), isp->isi_hpa+IOSAPIC_REG_SELECT);
-       WRITE_U32( dp1, isp->isi_hpa+IOSAPIC_REG_WINDOW);
+       iosapic_write(isp->isi_hpa, IOSAPIC_IRDT_ENTRY_HI(vi->irqline), dp1);
 
        /* Read the window register to flush the writes down to HW  */
-       dp1 = READ_U32(isp->isi_hpa+IOSAPIC_REG_WINDOW);
+       dp1 = readl(isp->isi_hpa+IOSAPIC_REG_WINDOW);
 }
 
 
@@ -882,12 +870,12 @@ iosapic_enable_irq(void *dev, int irq)
        iosapic_set_irt_data(vi, &d0, &d1);
        iosapic_wr_irt_entry(vi, d0, d1);
 
-
 #ifdef DEBUG_IOSAPIC_IRT
 {
        u32 *t = (u32 *) ((ulong) vi->eoi_addr & ~0xffUL);
        printk("iosapic_enable_irq(): regs %p", vi->eoi_addr);
-       while (t < vi->eoi_addr) printk(" %x", READ_U32(t++));
+       for ( ; t < vi->eoi_addr; t++)
+               printk(" %x", readl(t));
        printk("\n");
 }
 
@@ -896,11 +884,7 @@ printk("iosapic_enable_irq(): sel ");
        struct iosapic_info *isp = vi->iosapic;
 
        for (d0=0x10; d0<0x1e; d0++) {
-               /* point the window register to the lower word */
-               WRITE_U32(d0, isp->isi_hpa+IOSAPIC_REG_SELECT);
-
-               /* read the word */
-               d1 = READ_U32(isp->isi_hpa+IOSAPIC_REG_WINDOW);
+               d1 = iosapic_read(isp->isi_hpa, d0);
                printk(" %x", d1);
        }
 }
@@ -908,13 +892,12 @@ printk("\n");
 #endif
 
        /*
-       ** KLUGE: IRQ should not be asserted when Drivers enabling their IRQ.
-       **        PCI supports level triggered in order to share IRQ lines.
-       **
-       ** Issueing I/O SAPIC an EOI causes an interrupt iff IRQ line is
-       ** asserted.
+       ** Issueing I/O SAPIC an EOI causes an interrupt IFF IRQ line is
+       ** asserted.  IRQ generally should not be asserted when a driver
+       ** enables their IRQ. It can lead to "interesting" race conditions
+       ** in the driver initialization sequence.
        */
-       IOSAPIC_EOI(vi->eoi_addr, vi->eoi_data);
+       __raw_writel(vi->eoi_data, vi->eoi_addr);
 }
 
 
@@ -949,11 +932,7 @@ iosapic_rd_version(struct iosapic_info *isi)
        ASSERT(isi);
        ASSERT(isi->isi_hpa);
 
-       /* point window to the version register */
-       WRITE_U32(IOSAPIC_REG_VERSION, isi->isi_hpa+IOSAPIC_REG_SELECT);
-
-       /* now read the version register */
-       return (READ_U32(isi->isi_hpa+IOSAPIC_REG_WINDOW));
+       return iosapic_read(isi->isi_hpa, IOSAPIC_REG_VERSION);
 }
 
 
index 176e0951b15c3d96f8149cb7d4f2f41716c0de0c..8126dbdcdafdd908bf5fe90ad9c9e2fcf3c4653d 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/kernel.h>
 #include <linux/spinlock.h>
 #include <linux/init.h>                /* for __init and __devinit */
-/* #define PCI_DEBUG   enable ASSERT */
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/slab.h>
@@ -43,6 +42,7 @@
 #include <asm/byteorder.h>
 #include <asm/irq.h>           /* for struct irq_region support */
 #include <asm/pdc.h>
+#include <asm/pdcpat.h>
 #include <asm/page.h>
 #include <asm/segment.h>
 #include <asm/system.h>
 #define DBG_PAT(x...)
 #endif
 
+#ifdef DEBUG_LBA
+#undef ASSERT
+#define ASSERT(expr) \
+       if(!(expr)) { \
+               printk("\n%s:%d: Assertion " #expr " failed!\n", \
+                               __FILE__, __LINE__); \
+               panic(#expr); \
+       }
+#else
+#define ASSERT(expr)
+#endif
+
+
 /*
 ** Config accessor functions only pass in the 8-bit bus number and not
 ** the 8-bit "PCI Segment" number. Each LBA will be assigned a PCI bus
 #define LBA_HINT_CFG   0x0310
 #define LBA_HINT_BASE  0x0380  /* 14 registers at every 8 bytes. */
 
+#define LBA_BUS_MODE   0x0620
+
 /* ERROR regs are needed for config cycle kluges */
 #define LBA_ERROR_CONFIG 0x0680
 #define     LBA_SMART_MODE 0x20
 #define LBA_IOSAPIC_BASE       0x800 /* Offset of IRQ logic */
 
 /* non-postable I/O port space, densely packed */
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
 #define LBA_ASTRO_PORT_BASE    (0xfffffffffee00000UL)
 #else
 #define LBA_ASTRO_PORT_BASE    (0xfee00000UL)
 #endif
 
+#define ELROY_HVERS    0x782
+#define MERCURY_HVERS  0x783
+#define QUICKSILVER_HVERS      0x784
+
+static inline int IS_ELROY(struct parisc_device *d)
+{
+       return (d->id.hversion == ELROY_HVERS);
+}
+
+static inline int IS_MERCURY(struct parisc_device *d)
+{
+       return (d->id.hversion == MERCURY_HVERS);
+}
+
+static inline int IS_QUICKSILVER(struct parisc_device *d)
+{
+       return (d->id.hversion == QUICKSILVER_HVERS);
+}
+
 
 /*
 ** lba_device: Per instance Elroy data structure
@@ -184,7 +218,7 @@ struct lba_device {
        spinlock_t      lba_lock;
        void            *iosapic_obj;
 
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
        unsigned long   iop_base;    /* PA_VIEW - for IO port accessor funcs */
 #endif
 
@@ -288,11 +322,6 @@ lba_device_present( u8 bus, u8 dfn, struct lba_device *d)
 {
        u8 first_bus = d->hba.hba_bus->secondary;
        u8 last_sub_bus = d->hba.hba_bus->subordinate;
-#if 0
-/* FIXME - see below in this function */
-        u8 dev = PCI_SLOT(dfn);
-        u8 func = PCI_FUNC(dfn);
-#endif
 
        ASSERT(bus >= first_bus);
        ASSERT(bus <= last_sub_bus);
@@ -306,19 +335,7 @@ lba_device_present( u8 bus, u8 dfn, struct lba_device *d)
            return(FALSE);
        }
 
-#if 0
-/*
-** FIXME: Need to implement code to fill the devices bitmap based
-** on contents of the local pci_bus tree "data base".
-** pci_register_ops() walks the bus for us and builds the tree.
-** For now, always do the config cycle.
-*/
-       bus -= first_bus;
-
-       return (((d->devices[bus][dev]) >> func) & 0x1);
-#else
        return TRUE;
-#endif
 }
 
 
@@ -503,6 +520,43 @@ lba_rd_cfg(struct lba_device *d, u32 tok, u8 reg, u32 size)
        return(data);
 }
 
+#ifdef CONFIG_PARISC64
+#define pat_cfg_addr(bus, devfn, addr) (((bus) << 16) | ((devfn) << 8) | (addr))
+
+static int pat_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
+{
+       int tok = pat_cfg_addr(bus->number, devfn, pos);
+       u32 tmp;
+       int ret = pdc_pat_io_pci_cfg_read(tok, size, &tmp);
+
+       DBG_CFG("%s(%d:%d.%d+0x%02x) -> 0x%x %d\n", __FUNCTION__, bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), pos, tmp, ret);
+
+       switch (size) {
+               case 1: *data = (u8)  tmp; return (tmp == (u8)  ~0);
+               case 2: *data = (u16) tmp; return (tmp == (u16) ~0);
+               case 4: *data = (u32) tmp; return (tmp == (u32) ~0);
+       }
+       *data = ~0;
+       return (ret);
+}
+
+static int pat_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 data)
+{
+       int tok = pat_cfg_addr(bus->number, devfn, pos);
+       int ret = pdc_pat_io_pci_cfg_write(tok, size, data);
+
+       DBG_CFG("%s(%d:%d.%d+0x%02x, 0x%lx/%d)\n", __FUNCTION__, bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), pos, data, size);
+       return (ret);
+}
+
+static struct pci_ops pat_cfg_ops = {
+       .read =         pat_cfg_read,
+       .write =        pat_cfg_write,
+};
+#else
+/* keep the compiler from complaining about undeclared variables */
+#define pat_cfg_ops lba_cfg_ops
+#endif
 
 static int lba_cfg_read(struct pci_bus *bus, unsigned int devfn, int pos, int size, u32 *data)
 {
@@ -610,6 +664,7 @@ static int lba_cfg_write(struct pci_bus *bus, unsigned int devfn, int pos, int s
        }
 
        DBG_CFG("%s(%x+%2x) = 0x%x (c)\n", __FUNCTION__, tok, pos, data);
+
        /* Basic Algorithm */
        LBA_CFG_TR4_ADDR_SETUP(d, tok | pos);
        switch(size) {
@@ -639,7 +694,7 @@ lba_bios_init(void)
 }
 
 
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
 
 /*
 ** Determine if a device is already configured.
@@ -677,6 +732,8 @@ lba_claim_dev_resources(struct pci_dev *dev)
                }
        }
 }
+#else
+#define lba_claim_dev_resources(dev)
 #endif
 
 
@@ -734,7 +791,7 @@ lba_fixup_bus(struct pci_bus *bus)
                        lba_dump_res(&iomem_resource, 2);
                }
 
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
                if (ldev->hba.gmmio_space.flags) {
                        err = request_resource(&iomem_resource, &(ldev->hba.gmmio_space));
                        if (err < 0) {
@@ -792,12 +849,10 @@ lba_fixup_bus(struct pci_bus *bus)
                bus->bridge_ctl &= ~(status & PCI_STATUS_FAST_BACK);
 #endif
 
-#ifdef __LP64__
                if (is_pdc_pat()) {
                        /* Claim resources for PDC's devices */
                        lba_claim_dev_resources(dev);
                }
-#endif
 
                 /*
                ** P2PB's have no IRQs. ignore them.
@@ -925,7 +980,7 @@ static struct pci_port_ops lba_astro_port_ops = {
 };
 
 
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
 #define PIOP_TO_GMMIO(lba, addr) \
        ((lba)->iop_base + (((addr)&0xFFFC)<<10) + ((addr)&3))
 
@@ -1093,7 +1148,11 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
                }
        }
 }
-#endif /* __LP64__ */
+#else
+/* keep compiler from complaining about missing declarations */
+#define lba_pat_port_ops lba_astro_port_ops
+#define lba_pat_resources(pa_dev, lba_dev)
+#endif /* CONFIG_PARISC64 */
 
 
 static void
@@ -1103,7 +1162,7 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
        unsigned long rsize;
        int lba_num;
 
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
        /*
        ** Sign extend all BAR values on "legacy" platforms.
        ** "Sprockets" PDC (Forte/Allegro) initializes everything
@@ -1237,7 +1296,7 @@ lba_hw_init(struct lba_device *d)
        printk("\n");
 #endif /* DEBUG_LBA_PAT */
 
-#ifdef __LP64__
+#ifdef CONFIG_PARISC64
 /*
  * FIXME add support for PDC_PAT_IO "Get slot status" - OLAR support
  * Only N-Class and up can really make use of Get slot status.
@@ -1317,7 +1376,7 @@ lba_common_init(struct lba_device *lba_dev)
 ** have work to do.
 */
 static int __init
-lba_driver_callback(struct parisc_device *dev)
+lba_driver_probe(struct parisc_device *dev)
 {
        struct lba_device *lba_dev;
        struct pci_bus *lba_bus;
@@ -1327,25 +1386,36 @@ lba_driver_callback(struct parisc_device *dev)
 
        /* Read HW Rev First */
        func_class = READ_REG32(dev->hpa + LBA_FCLASS);
-       func_class &= 0xf;
-
-       switch (func_class) {
-       case 0: version = "TR1.0"; break;
-       case 1: version = "TR2.0"; break;
-       case 2: version = "TR2.1"; break;
-       case 3: version = "TR2.2"; break;
-       case 4: version = "TR3.0"; break;
-       case 5: version = "TR4.0"; break;
-       default: version = "TR4+";
-       }
 
-       printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
-               MODULE_NAME, version, func_class & 0xf, dev->hpa);
+       if (IS_ELROY(dev)) {    
+               func_class &= 0xf;
+               switch (func_class) {
+               case 0: version = "TR1.0"; break;
+               case 1: version = "TR2.0"; break;
+               case 2: version = "TR2.1"; break;
+               case 3: version = "TR2.2"; break;
+               case 4: version = "TR3.0"; break;
+               case 5: version = "TR4.0"; break;
+               default: version = "TR4+";
+               }
+               printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
+                       MODULE_NAME, version, func_class & 0xf, dev->hpa);
+
+               /* Just in case we find some prototypes... */
+       } else if (IS_MERCURY(dev) || IS_QUICKSILVER(dev)) {
+               func_class &= 0xff;
+               version = kmalloc(6, GFP_KERNEL);
+               sprintf(version,"TR%d.%d",(func_class >> 4),(func_class & 0xf));
+               /* We could use one printk for both and have it outside,
+                 * but for the mask for func_class.
+                 */ 
+               printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
+                       MODULE_NAME, version, func_class & 0xff, dev->hpa);
+       }
 
-       /* Just in case we find some prototypes... */
        if (func_class < 2) {
-               printk(KERN_WARNING "Can't support LBA older than TR2.1 "
-                       "- continuing under adversity.\n");
+               printk(KERN_WARNING "Can't support LBA older than TR2.1"
+                               " - continuing under adversity.\n");
        }
 
        /*
@@ -1388,16 +1458,12 @@ lba_driver_callback(struct parisc_device *dev)
 
        /* ---------- Third : setup I/O Port and MMIO resources  --------- */
 
-#ifdef __LP64__
        if (is_pdc_pat()) {
                /* PDC PAT firmware uses PIOP region of GMMIO space. */
                pci_port = &lba_pat_port_ops;
-
                /* Go ask PDC PAT what resources this LBA has */
                lba_pat_resources(dev, lba_dev);
-       } else
-#endif
-       {
+       } else {
                /* Sprockets PDC uses NPIOP region */
                pci_port = &lba_astro_port_ops;
 
@@ -1412,9 +1478,9 @@ lba_driver_callback(struct parisc_device *dev)
        dev->dev.platform_data = lba_dev;
        lba_bus = lba_dev->hba.hba_bus =
                pci_scan_bus_parented(&dev->dev, lba_dev->hba.bus_num.start,
-                                     &lba_cfg_ops, NULL);
+                               is_pdc_pat() ? &pat_cfg_ops : &lba_cfg_ops,
+                               NULL);
 
-#ifdef __LP64__
        if (is_pdc_pat()) {
                /* assign resources to un-initialized devices */
                DBG_PAT("LBA pci_bus_assign_resources()\n");
@@ -1427,7 +1493,6 @@ lba_driver_callback(struct parisc_device *dev)
                lba_dump_res(&lba_dev->hba.lmmio_space, 2);
 #endif
        }
-#endif
 
        /*
        ** Once PCI register ops has walked the bus, access to config
@@ -1443,14 +1508,16 @@ lba_driver_callback(struct parisc_device *dev)
 }
 
 static struct parisc_device_id lba_tbl[] = {
-       { HPHW_BRIDGE, HVERSION_REV_ANY_ID, 0x782, 0xa },
+       { HPHW_BRIDGE, HVERSION_REV_ANY_ID, ELROY_HVERS, 0xa },
+       { HPHW_BRIDGE, HVERSION_REV_ANY_ID, MERCURY_HVERS, 0xa },
+       { HPHW_BRIDGE, HVERSION_REV_ANY_ID, QUICKSILVER_HVERS, 0xa },
        { 0, }
 };
 
 static struct parisc_driver lba_driver = {
        .name =         MODULE_NAME,
        .id_table =     lba_tbl,
-       .probe =        lba_driver_callback,
+       .probe =        lba_driver_probe,
 };
 
 /*
index 7d497802b906d6a18fc9b0c05ae56a562d55b1cb..c7d2d5d996ebc88ef8b00df90edc0572c4c8ce53 100644 (file)
@@ -157,13 +157,13 @@ static int led_proc_read(char *page, char **start, off_t off, int count,
 static int led_proc_write(struct file *file, const char *buf, 
        unsigned long count, void *data)
 {
-       char *cur, lbuf[count];
+       char *cur, lbuf[count + 1];
        int d;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EACCES;
 
-       memset(lbuf, 0, count);
+       memset(lbuf, 0, count + 1);
 
        if (copy_from_user(lbuf, buf, count))
                return -EFAULT;
@@ -197,7 +197,7 @@ static int led_proc_write(struct file *file, const char *buf,
 
                break;
        case LED_HASLCD:
-               while (*cur && cur[strlen(cur)-1] == '\n')
+               if (*cur && cur[strlen(cur)-1] == '\n')
                        cur[strlen(cur)-1] = 0;
                if (*cur == 0) 
                        cur = lcd_text_default;
index f1c850d20e4fa7e946dd697323d06356e0dfc325..f3cf291adc776b239794dece21ec134973b86b7f 100644 (file)
@@ -27,9 +27,7 @@
 
 #include <linux/mm.h>
 #include <linux/string.h>
-#undef PCI_DEBUG               /* for ASSERT */
 #include <linux/pci.h>
-#undef PCI_DEBUG
 
 #include <asm/byteorder.h>
 #include <asm/io.h>
 #include <linux/proc_fs.h>
 #include <asm/runway.h>                /* for proc_runway_root */
 #include <asm/pdc.h>           /* for PDC_MODEL_* */
+#include <asm/pdcpat.h>                /* for is_pdc_pat() */
 #include <asm/parisc-device.h>
 
+
+/* declared in arch/parisc/kernel/setup.c */
+extern struct proc_dir_entry * proc_mckinley_root;
+
 #define MODULE_NAME "SBA"
 
 #ifdef CONFIG_PROC_FS
@@ -54,6 +57,7 @@
 ** Don't even think about messing with it unless you have
 ** plenty of 710's to sacrifice to the computer gods. :^)
 */
+#undef DEBUG_SBA_ASSERT
 #undef DEBUG_SBA_INIT
 #undef DEBUG_SBA_RUN
 #undef DEBUG_SBA_RUN_SG
@@ -62,8 +66,6 @@
 #undef DEBUG_LARGE_SG_ENTRIES
 #undef DEBUG_DMB_TRAP
 
-#define SBA_INLINE     __inline__
-
 #ifdef DEBUG_SBA_INIT
 #define DBG_INIT(x...) printk(x)
 #else
 #define DBG_RES(x...)
 #endif
 
+#ifdef DEBUG_SBA_ASSERT
+#undef ASSERT
+#define ASSERT(expr) \
+       if(!(expr)) { \
+               printk("\n%s:%d: Assertion " #expr " failed!\n", \
+                               __FILE__, __LINE__); \
+               panic(#expr); \
+       }
+#else
+#define ASSERT(expr)
+#endif
+
+
+#if defined(__LP64__) && !defined(CONFIG_PDC_NARROW)
+/* "low end" PA8800 machines use ZX1 chipset */
+#define ZX1_SUPPORT
+#endif
+
+#define SBA_INLINE     __inline__
+
+
 /*
 ** The number of pdir entries to "free" before issueing
 ** a read to PCOM register to flush out PCOM writes.
 #define REOG_MERCED_PORT       0x805
 #define REOG_ROPES_PORT                0x783
 
+#define PLUTO_MCKINLEY_PORT    0x880
+#define PLUTO_ROPES_PORT       0x784
+
 #define SBA_FUNC_ID    0x0000  /* function id */
 #define SBA_FCLASS     0x0008  /* function class, bist, header, rev... */
 
 #define IS_IKE(id) \
 (((id)->hversion == IKE_MERCED_PORT) || ((id)->hversion == IKE_ROPES_PORT))
 
+#define IS_PLUTO(id) \
+(((id)->hversion == PLUTO_MCKINLEY_PORT) || ((id)->hversion == PLUTO_ROPES_PORT))
+
 #define SBA_FUNC_SIZE 4096   /* SBA configuration function reg set */
 
 #define ASTRO_IOC_OFFSET 0x20000
 /* Ike's IOC's occupy functions 2 and 3 (not 0 and 1) */
 #define IKE_IOC_OFFSET(p) ((p+2)*SBA_FUNC_SIZE)
 
+#define PLUTO_IOC_OFFSET 0x1000
+
 #define IOC_CTRL          0x8  /* IOC_CTRL offset */
 #define IOC_CTRL_TC       (1 << 0) /* TOC Enable */
 #define IOC_CTRL_CE       (1 << 1) /* Coalesce Enable */
 #define IOC_CTRL_RM       (1 << 8) /* Real Mode */
 #define IOC_CTRL_NC       (1 << 9) /* Non Coherent Mode */
 
-#define MAX_IOC                2       /* per Ike. Astro only has 1 */
+#define MAX_IOC                2       /* per Ike. Pluto/Astro only have 1. */
 
 
 /*
 #define IOC_TCNFG      0x318
 #define IOC_PDIR_BASE  0x320
 
-#define IOC_IOVA_SPACE_BASE    0       /* IOVA ranges start at 0 */
+/* AGP GART driver looks for this */
+#define SBA_IOMMU_COOKIE    0x0000badbadc0ffeeUL
+
 
 /*
 ** IOC supports 4/8/16/64KB page sizes (see TCNFG register)
 ** page since the Virtual Coherence Index has to be generated
 ** and updated for each page.
 **
-** IOVP_SIZE could only be greater than PAGE_SIZE if we are
-** confident the drivers really only touch the next physical
-** page iff that driver instance owns it.
+** PAGE_SIZE could be greater than IOVP_SIZE. But not the inverse.
 */
 #define IOVP_SIZE      PAGE_SIZE
 #define IOVP_SHIFT     PAGE_SHIFT
@@ -207,13 +238,20 @@ struct ioc {
        unsigned long   ioc_hpa;        /* I/O MMU base address */
        char    *res_map;       /* resource map, bit == pdir entry */
        u64     *pdir_base;     /* physical base address */
-
+       unsigned long   ibase;  /* pdir IOV Space base - shared w/lba_pci */
+       unsigned long   imask;  /* pdir IOV Space mask - shared w/lba_pci */
+#ifdef ZX1_SUPPORT
+       unsigned long   iovp_mask;      /* help convert IOVA to IOVP */
+#endif
        unsigned long   *res_hint;      /* next avail IOVP - circular search */
        spinlock_t      res_lock;
-       unsigned long   hint_mask_pdir; /* bits used for DMA hints */
        unsigned int    res_bitshift;   /* from the LEFT! */
        unsigned int    res_size;       /* size of resource map in bytes */
+#if SBA_HINT_SUPPORT
+/* FIXME : DMA HINTs not used */
+       unsigned long   hint_mask_pdir; /* bits used for DMA hints */
        unsigned int    hint_shift_pdir;
+#endif
 #if DELAYED_RESOURCE_CNT > 0
        int saved_cnt;
        struct sba_dma_pair {
@@ -239,8 +277,6 @@ struct ioc {
 
        /* STUFF We don't need in performance path */
        unsigned int    pdir_size;      /* in bytes, determined by IOV Space size */
-       unsigned long   ibase;          /* pdir IOV Space base - shared w/lba_pci */
-       unsigned long   imask;          /* pdir IOV Space mask - shared w/lba_pci */
 };
 
 struct sba_device {
@@ -274,6 +310,9 @@ static unsigned long piranha_bad_128k = 0;
 /* Looks nice and keeps the compiler happy */
 #define SBA_DEV(d) ((struct sba_device *) (d))
 
+#if SBA_AGP_SUPPORT
+static int reserve_sba_gart = 1;
+#endif
 
 #define ROUNDUP(x,y) ((x + ((y)-1)) & ~((y)-1))
 
@@ -333,12 +372,15 @@ static void
 sba_dump_tlb(unsigned long hpa)
 {
        DBG_INIT("IO TLB at 0x%lx\n", hpa);
-       DBG_INIT("IOC_IBASE    : %Lx\n", READ_REG64(hpa+IOC_IBASE));
-       DBG_INIT("IOC_IMASK    : %Lx\n", READ_REG64(hpa+IOC_IMASK));
-       DBG_INIT("IOC_TCNFG    : %Lx\n", READ_REG64(hpa+IOC_TCNFG));
-       DBG_INIT("IOC_PDIR_BASE: %Lx\n", READ_REG64(hpa+IOC_PDIR_BASE));
+       DBG_INIT("IOC_IBASE    : 0x%Lx\n", READ_REG64(hpa+IOC_IBASE));
+       DBG_INIT("IOC_IMASK    : 0x%Lx\n", READ_REG64(hpa+IOC_IMASK));
+       DBG_INIT("IOC_TCNFG    : 0x%Lx\n", READ_REG64(hpa+IOC_TCNFG));
+       DBG_INIT("IOC_PDIR_BASE: 0x%Lx\n", READ_REG64(hpa+IOC_PDIR_BASE));
        DBG_INIT("\n");
 }
+#else
+#define sba_dump_ranges(x)
+#define sba_dump_tlb(x)
 #endif
 
 
@@ -458,13 +500,18 @@ sba_dump_sg( struct ioc *ioc, struct scatterlist *startsg, int nents)
 #define PAGES_PER_RANGE 1      /* could increase this to 4 or 8 if needed */
 
 /* Convert from IOVP to IOVA and vice versa. */
-#define SBA_IOVA(ioc,iovp,offset,hint_reg) ((iovp) | (offset) | ((hint_reg)<<(ioc->hint_shift_pdir)))
-#define SBA_IOVP(ioc,iova) ((iova) & ioc->hint_mask_pdir)
 
-/* FIXME : review these macros to verify correctness and usage */
+#ifdef ZX1_SUPPORT
+/* Pluto (aka ZX1) boxes need to set or clear the ibase bits appropriately */
+#define SBA_IOVA(ioc,iovp,offset,hint_reg) ((ioc->ibase) | (iovp) | (offset))
+#define SBA_IOVP(ioc,iova) ((iova) & (ioc)->iovp_mask)
+#else
+/* only support Astro and ancestors. Saves a few cycles in key places */
+#define SBA_IOVA(ioc,iovp,offset,hint_reg) ((iovp) | (offset))
+#define SBA_IOVP(ioc,iova) (iova)
+#endif
+
 #define PDIR_INDEX(iovp)   ((iovp)>>IOVP_SHIFT)
-#define MKIOVP(dma_hint,pide)  (dma_addr_t)((long)(dma_hint) | ((long)(pide) << IOVP_SHIFT))
-#define MKIOVA(iovp,offset) (dma_addr_t)((long)iovp | (long)offset)
 
 #define RESMAP_MASK(n)    (~0UL << (BITS_PER_LONG - (n)))
 #define RESMAP_IDX_MASK   (sizeof(unsigned long) - 1)
@@ -661,8 +708,9 @@ sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
 *
 ***************************************************************/
 
+#if SBA_HINT_SUPPORT
 #define SBA_DMA_HINT(ioc, val) ((val) << (ioc)->hint_shift_pdir)
-
+#endif
 
 typedef unsigned long space_t;
 #define KERNEL_SPACE 0
@@ -677,25 +725,33 @@ typedef unsigned long space_t;
  *
  * Given a virtual address (vba, arg2) and space id, (sid, arg1)
  * sba_io_pdir_entry() loads the I/O PDIR entry pointed to by
- * pdir_ptr (arg0). Each IO Pdir entry consists of 8 bytes as
- * shown below (MSB == bit 0):
+ * pdir_ptr (arg0). 
+ * Using the bass-ackwards HP bit numbering, Each IO Pdir entry
+ * for Astro/Ike looks like:
+ *
  *
  *  0                    19                                 51   55       63
  * +-+---------------------+----------------------------------+----+--------+
  * |V|        U            |            PPN[43:12]            | U  |   VI   |
  * +-+---------------------+----------------------------------+----+--------+
  *
- *  V  == Valid Bit
+ * Pluto is basically identical, supports fewer physical address bits:
+ *
+ *  0                       23                              51   55       63
+ * +-+------------------------+-------------------------------+----+--------+
+ * |V|        U               |         PPN[39:12]            | U  |   VI   |
+ * +-+------------------------+-------------------------------+----+--------+
+ *
+ *  V  == Valid Bit  (Most Significant Bit is bit 0)
  *  U  == Unused
  * PPN == Physical Page Number
  * VI  == Virtual Index (aka Coherent Index)
  *
- * The physical address fields are filled with the results of the LPA
- * instruction.  The virtual index field is filled with the results of
- * of the LCI (Load Coherence Index) instruction.  The 8 bits used for
- * the virtual index are bits 12:19 of the value returned by LCI.
+ * LPA instruction output is put into PPN field.
+ * LCI (Load Coherence Index) instruction provides the "VI" bits.
  *
- * We need to pre-swap the bytes since PCX-W is Big Endian.
+ * We pre-swap the bytes since PCX-W is Big Endian and the
+ * IOMMU uses little endian for the pdir.
  */
 
 
@@ -713,7 +769,7 @@ sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
        ASSERT(sid == KERNEL_SPACE);
 
        pa = virt_to_phys(vba);
-       pa &= ~4095ULL;                 /* clear out offset bits */
+       pa &= IOVP_MASK;
 
        mtsp(sid,1);
        asm("lci 0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
@@ -800,7 +856,7 @@ sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
                } while (byte_cnt > 0);
        }
 
-       WRITE_REG(iovp, ioc->ioc_hpa+IOC_PCOM);
+       WRITE_REG( SBA_IOVA(ioc, iovp, 0, 0), ioc->ioc_hpa+IOC_PCOM);
 }
 
 /**
@@ -868,7 +924,7 @@ sba_map_single(struct device *dev, void *addr, size_t size,
        pide = sba_alloc_range(ioc, size);
        iovp = (dma_addr_t) pide << IOVP_SHIFT;
 
-       DBG_RUN("%s() 0x%p -> 0x%lx",
+       DBG_RUN("%s() 0x%p -> 0x%lx\n",
                __FUNCTION__, addr, (long) iovp | offset);
 
        pdir_start = &(ioc->pdir_base[pide]);
@@ -877,7 +933,7 @@ sba_map_single(struct device *dev, void *addr, size_t size,
                ASSERT(((u8 *)pdir_start)[7] == 0); /* verify availability */
                sba_io_pdir_entry(pdir_start, KERNEL_SPACE, (unsigned long) addr, 0);
 
-               DBG_RUN(" pdir 0x%p %02x%02x%02x%02x%02x%02x%02x%02x\n",
+               DBG_RUN("       pdir 0x%p %02x%02x%02x%02x%02x%02x%02x%02x\n",
                        pdir_start,
                        (u8) (((u8 *) pdir_start)[7]),
                        (u8) (((u8 *) pdir_start)[6]),
@@ -941,14 +997,18 @@ sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
        ioc->usingle_pages += size >> IOVP_SHIFT;
 #endif
 
+       sba_mark_invalid(ioc, iova, size);
+
 #if DELAYED_RESOURCE_CNT > 0
+       /* Delaying when we re-use a IO Pdir entry reduces the number
+        * of MMIO reads needed to flush writes to the PCOM register.
+        */
        d = &(ioc->saved[ioc->saved_cnt]);
        d->iova = iova;
        d->size = size;
        if (++(ioc->saved_cnt) >= DELAYED_RESOURCE_CNT) {
                int cnt = ioc->saved_cnt;
                while (cnt--) {
-                       sba_mark_invalid(ioc, d->iova, d->size);
                        sba_free_range(ioc, d->iova, d->size);
                        d--;
                }
@@ -956,7 +1016,6 @@ sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
                READ_REG(ioc->ioc_hpa+IOC_PCOM);        /* flush purges */
        }
 #else /* DELAYED_RESOURCE_CNT == 0 */
-       sba_mark_invalid(ioc, iova, size);
        sba_free_range(ioc, iova, size);
        READ_REG(ioc->ioc_hpa+IOC_PCOM);        /* flush purges */
 #endif /* DELAYED_RESOURCE_CNT == 0 */
@@ -1321,6 +1380,142 @@ sba_alloc_pdir(unsigned int pdir_size)
        return (void *) pdir_base;
 }
 
+static void
+sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
+{
+        /* lba_set_iregs() is in arch/parisc/kernel/lba_pci.c */
+        extern void lba_set_iregs(struct parisc_device *, u32, u32);
+
+       u32 iova_space_mask;
+       u32 iova_space_size;
+       int iov_order, tcnfg;
+       struct parisc_device *lba;
+#if SBA_AGP_SUPPORT
+       int agp_found = 0;
+#endif
+       /*
+       ** Firmware programs the base and size of a "safe IOVA space"
+       ** (one that doesn't overlap memory or LMMIO space) in the
+       ** IBASE and IMASK registers.
+       */
+       ioc->ibase = READ_REG(ioc->ioc_hpa + IOC_IBASE);
+       iova_space_size = ~(READ_REG(ioc->ioc_hpa + IOC_IMASK) & 0xFFFFFFFFUL) + 1;
+
+       if ((ioc->ibase < 0xfed00000UL) && ((ioc->ibase + iova_space_size) > 0xfee00000UL)) {
+               printk("WARNING: IOV space overlaps local config and interrupt message, truncating\n");
+               iova_space_size /= 2;
+       }
+
+       /*
+       ** iov_order is always based on a 1GB IOVA space since we want to
+       ** turn on the other half for AGP GART.
+       */
+       iov_order = get_order(iova_space_size >> (IOVP_SHIFT - PAGE_SHIFT));
+       ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);
+
+       DBG_INIT("%s() hpa 0x%lx IOV %dMB (%d bits)\n",
+               __FUNCTION__, ioc->ioc_hpa, iova_space_size >> 20,
+               iov_order + PAGE_SHIFT);
+
+       ioc->pdir_base = (void *) __get_free_pages(GFP_KERNEL,
+                                                  get_order(ioc->pdir_size));
+       if (!ioc->pdir_base)
+               panic("Couldn't allocate I/O Page Table\n");
+
+       memset(ioc->pdir_base, 0, ioc->pdir_size);
+
+       DBG_INIT("%s() pdir %p size %x\n",
+                       __FUNCTION__, ioc->pdir_base, ioc->pdir_size);
+
+#if SBA_HINT_SUPPORT
+       ioc->hint_shift_pdir = iov_order + PAGE_SHIFT;
+       ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT));
+
+       DBG_INIT("      hint_shift_pdir %x hint_mask_pdir %lx\n",
+               ioc->hint_shift_pdir, ioc->hint_mask_pdir);
+#endif
+
+       ASSERT((((unsigned long) ioc->pdir_base) & PAGE_MASK) == (unsigned long) ioc->pdir_base);
+       WRITE_REG(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE);
+
+       /* build IMASK for IOC and Elroy */
+       iova_space_mask =  0xffffffff;
+       iova_space_mask <<= (iov_order + PAGE_SHIFT);
+       ioc->imask = iova_space_mask;
+#ifdef ZX1_SUPPORT
+       ioc->iovp_mask = ~(iova_space_mask + PAGE_SIZE - 1);
+#endif
+       sba_dump_tlb(ioc->ioc_hpa);
+
+       /*
+       ** setup Mercury IBASE/IMASK registers as well.
+       */
+       for (lba = sba->child; lba; lba = lba->sibling) {
+               int rope_num = (lba->hpa >> 13) & 0xf;
+               if (rope_num >> 3 == ioc_num)
+                       lba_set_iregs(lba, ioc->ibase, ioc->imask);
+       }
+
+       WRITE_REG(ioc->imask, ioc->ioc_hpa + IOC_IMASK);
+
+#ifdef __LP64__
+       /*
+       ** Setting the upper bits makes checking for bypass addresses
+       ** a little faster later on.
+       */
+       ioc->imask |= 0xFFFFFFFF00000000UL;
+#endif
+
+       /* Set I/O PDIR Page size to system page size */
+       switch (PAGE_SHIFT) {
+               case 12: tcnfg = 0; break;      /*  4K */
+               case 13: tcnfg = 1; break;      /*  8K */
+               case 14: tcnfg = 2; break;      /* 16K */
+               case 16: tcnfg = 3; break;      /* 64K */
+               default:
+                       panic(__FILE__ "Unsupported system page size %d",
+                               1 << PAGE_SHIFT);
+                       break;
+       }
+       WRITE_REG(tcnfg, ioc->ioc_hpa + IOC_TCNFG);
+
+       /*
+       ** Program the IOC's ibase and enable IOVA translation
+       ** Bit zero == enable bit.
+       */
+       WRITE_REG(ioc->ibase | 1, ioc->ioc_hpa + IOC_IBASE);
+
+       /*
+       ** Clear I/O TLB of any possible entries.
+       ** (Yes. This is a bit paranoid...but so what)
+       */
+       WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);
+
+#if SBA_AGP_SUPPORT
+       /*
+       ** If an AGP device is present, only use half of the IOV space
+       ** for PCI DMA.  Unfortunately we can't know ahead of time
+       ** whether GART support will actually be used, for now we
+       ** can just key on any AGP device found in the system.
+       ** We program the next pdir index after we stop w/ a key for
+       ** the GART code to handshake on.
+       */
+       device=NULL;
+       for (lba = sba->child; lba; lba = lba->sibling) {
+               if (IS_QUICKSILVER(lba))
+                       break;
+       }
+
+       if (lba) {
+               DBG_INIT("%s: Reserving half of IOVA space for AGP GART support\n", __FUNCTION__);
+               ioc->pdir_size /= 2;
+               ((u64 *)ioc->pdir_base)[PDIR_INDEX(iova_space_size/2)] = SBA_IOMMU_COOKIE;
+       } else {
+               DBG_INIT("%s: No GART needed - no AGP controller found\n", __FUNCTION__);
+       }
+#endif /* 0 */
+
+}
 
 static void
 sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
@@ -1381,15 +1576,19 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
                __FUNCTION__, ioc->ioc_hpa, (int) (physmem>>20),
                iova_space_size>>20, iov_order + PAGE_SHIFT, pdir_size);
 
+       ioc->pdir_base = sba_alloc_pdir(pdir_size);
+
+       DBG_INIT("%s() pdir %p size %x\n",
+                       __FUNCTION__, ioc->pdir_base, pdir_size);
+
+#if SBA_HINT_SUPPORT
        /* FIXME : DMA HINTs not used */
        ioc->hint_shift_pdir = iov_order + PAGE_SHIFT;
        ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT));
 
-       ioc->pdir_base = sba_alloc_pdir(pdir_size);
-
-       DBG_INIT("%s() pdir %p size %x hint_shift_pdir %x hint_mask_pdir %lx\n",
-               __FUNCTION__, ioc->pdir_base, pdir_size,
-               ioc->hint_shift_pdir, ioc->hint_mask_pdir);
+       DBG_INIT("      hint_shift_pdir %x hint_mask_pdir %lx\n",
+                       ioc->hint_shift_pdir, ioc->hint_mask_pdir);
+#endif
 
        ASSERT((((unsigned long) ioc->pdir_base) & PAGE_MASK) == (unsigned long) ioc->pdir_base);
        WRITE_REG64(virt_to_phys(ioc->pdir_base), ioc->ioc_hpa + IOC_PDIR_BASE);
@@ -1402,8 +1601,11 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
        ** On C3000 w/512MB mem, HP-UX 10.20 reports:
        **     ibase=0, imask=0xFE000000, size=0x2000000.
        */
-       ioc->ibase = IOC_IOVA_SPACE_BASE | 1;   /* bit 0 == enable bit */
+       ioc->ibase = 0;
        ioc->imask = iova_space_mask;   /* save it */
+#ifdef ZX1_SUPPORT
+       ioc->iovp_mask = ~(iova_space_mask + PAGE_SIZE - 1);
+#endif
 
        DBG_INIT("%s() IOV base 0x%lx mask 0x%0lx\n",
                __FUNCTION__, ioc->ibase, ioc->imask);
@@ -1426,7 +1628,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
        /*
        ** Program the IOC's ibase and enable IOVA translation
        */
-       WRITE_REG(ioc->ibase, ioc->ioc_hpa+IOC_IBASE);
+       WRITE_REG(ioc->ibase | 1, ioc->ioc_hpa+IOC_IBASE);
        WRITE_REG(ioc->imask, ioc->ioc_hpa+IOC_IMASK);
 
        /* Set I/O PDIR Page size to 4K */
@@ -1438,6 +1640,8 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
        */
        WRITE_REG(0 | 31, ioc->ioc_hpa+IOC_PCOM);
 
+       ioc->ibase = 0; /* used by SBA_IOVA and related macros */       
+
        DBG_INIT("%s() DONE\n", __FUNCTION__);
 }
 
@@ -1476,23 +1680,32 @@ sba_hw_init(struct sba_device *sba_dev)
                */
        }
 
-       ioc_ctl = READ_REG(sba_dev->sba_hpa+IOC_CTRL);
-       DBG_INIT("%s() hpa 0x%lx ioc_ctl 0x%Lx ->",
-               __FUNCTION__, sba_dev->sba_hpa, ioc_ctl);
-       ioc_ctl &= ~(IOC_CTRL_RM | IOC_CTRL_NC | IOC_CTRL_CE);
-       ioc_ctl |= IOC_CTRL_TC; /* Astro: firmware enables this */
+       if (!IS_PLUTO(sba_dev->iodc)) {
+               ioc_ctl = READ_REG(sba_dev->sba_hpa+IOC_CTRL);
+               DBG_INIT("%s() hpa 0x%lx ioc_ctl 0x%Lx ->",
+                       __FUNCTION__, sba_dev->sba_hpa, ioc_ctl);
+               ioc_ctl &= ~(IOC_CTRL_RM | IOC_CTRL_NC | IOC_CTRL_CE);
+               ioc_ctl |= IOC_CTRL_TC; /* Astro: firmware enables this */
 
-       WRITE_REG(ioc_ctl, sba_dev->sba_hpa+IOC_CTRL);
+               WRITE_REG(ioc_ctl, sba_dev->sba_hpa+IOC_CTRL);
 
 #ifdef DEBUG_SBA_INIT
-       ioc_ctl = READ_REG64(sba_dev->sba_hpa+IOC_CTRL);
-       DBG_INIT(" 0x%Lx\n", ioc_ctl);
+               ioc_ctl = READ_REG64(sba_dev->sba_hpa+IOC_CTRL);
+               DBG_INIT(" 0x%Lx\n", ioc_ctl);
 #endif
+       } /* if !PLUTO */
 
        if (IS_ASTRO(sba_dev->iodc)) {
                /* PAT_PDC (L-class) also reports the same goofy base */
                sba_dev->ioc[0].ioc_hpa = ASTRO_IOC_OFFSET;
                num_ioc = 1;
+       } else if (IS_PLUTO(sba_dev->iodc)) {
+               /* We use a negative value for IOC HPA so it gets 
+                 * corrected when we add it with IKE's IOC offset.
+                * Doesnt look clean, but fewer code. 
+                 */
+               sba_dev->ioc[0].ioc_hpa = -PLUTO_IOC_OFFSET;
+               num_ioc = 1;
        } else {
                sba_dev->ioc[0].ioc_hpa = sba_dev->ioc[1].ioc_hpa = 0;
                num_ioc = 2;
@@ -1517,7 +1730,11 @@ sba_hw_init(struct sba_device *sba_dev)
                /* flush out the writes */
                READ_REG(sba_dev->ioc[i].ioc_hpa + ROPE7_CTL);
 
-               sba_ioc_init(sba_dev->dev, &(sba_dev->ioc[i]), i);
+               if (IS_PLUTO(sba_dev->iodc)) {
+                       sba_ioc_init_pluto(sba_dev->dev, &(sba_dev->ioc[i]), i);
+               } else {
+                       sba_ioc_init(sba_dev->dev, &(sba_dev->ioc[i]), i);
+               }
        }
 }
 
@@ -1709,11 +1926,16 @@ static struct parisc_device_id sba_tbl[] = {
        { HPHW_BCPORT, HVERSION_REV_ANY_ID, IKE_MERCED_PORT, 0xc },
        { HPHW_BCPORT, HVERSION_REV_ANY_ID, REO_MERCED_PORT, 0xc },
        { HPHW_BCPORT, HVERSION_REV_ANY_ID, REOG_MERCED_PORT, 0xc },
+       { HPHW_IOA, HVERSION_REV_ANY_ID, PLUTO_MCKINLEY_PORT, 0xc },
 /* These two entries commented out because we don't find them in a
  * buswalk yet.  If/when we do, they would cause us to think we had
  * many more SBAs then we really do.
  *     { HPHW_BCPORT, HVERSION_REV_ANY_ID, ASTRO_ROPES_PORT, 0xc },
  *     { HPHW_BCPORT, HVERSION_REV_ANY_ID, IKE_ROPES_PORT, 0xc },
+ */
+/* We shall also comment out Pluto Ropes Port since bus walk doesnt
+ * report it yet. 
+ *     { HPHW_BCPORT, HVERSION_REV_ANY_ID, PLUTO_ROPES_PORT, 0xc },
  */
        { 0, }
 };
@@ -1739,9 +1961,7 @@ sba_driver_callback(struct parisc_device *dev)
        int i;
        char *version;
 
-#ifdef DEBUG_SBA_INIT
        sba_dump_ranges(dev->hpa);
-#endif
 
        /* Read HW Rev First */
        func_class = READ_REG(dev->hpa + SBA_FCLASS);
@@ -1758,13 +1978,16 @@ sba_driver_callback(struct parisc_device *dev)
                version = astro_rev;
 
        } else if (IS_IKE(&dev->id)) {
-               static char ike_rev[]="Ike rev ?";
-
+               static char ike_rev[] = "Ike rev ?";
                ike_rev[8] = '0' + (char) (func_class & 0xff);
                version = ike_rev;
+       } else if (IS_PLUTO(&dev->id)) {
+               static char pluto_rev[]="Pluto ?.?";
+               pluto_rev[6] = '0' + (char) ((func_class & 0xf0) >> 4); 
+               pluto_rev[8] = '0' + (char) (func_class & 0x0f); 
+               version = pluto_rev;
        } else {
-               static char reo_rev[]="REO rev ?";
-
+               static char reo_rev[] = "REO rev ?";
                reo_rev[8] = '0' + (char) (func_class & 0xff);
                version = reo_rev;
        }
@@ -1772,18 +1995,14 @@ sba_driver_callback(struct parisc_device *dev)
        if (!global_ioc_cnt) {
                global_ioc_cnt = count_parisc_driver(&sba_driver);
 
-               /* Only Astro has one IOC per SBA */
-               if (!IS_ASTRO(&dev->id))
+               /* Astro and Pluto have one IOC per SBA */
+               if ((!IS_ASTRO(&dev->id)) || (!IS_PLUTO(&dev->id)))
                        global_ioc_cnt *= 2;
        }
 
        printk(KERN_INFO "%s found %s at 0x%lx\n",
                MODULE_NAME, version, dev->hpa);
 
-#ifdef DEBUG_SBA_INIT
-       sba_dump_tlb(dev->hpa);
-#endif
-
        sba_dev = kmalloc(sizeof(struct sba_device), GFP_KERNEL);
        if (NULL == sba_dev) {
                printk(KERN_ERR MODULE_NAME " - couldn't alloc sba_device\n");
@@ -1813,6 +2032,8 @@ sba_driver_callback(struct parisc_device *dev)
                create_proc_info_entry("Astro", 0, proc_runway_root, sba_proc_info);
        } else if (IS_IKE(&dev->id)) {
                create_proc_info_entry("Ike", 0, proc_runway_root, sba_proc_info);
+       } else if (IS_PLUTO(&dev->id)) {
+               create_proc_info_entry("Pluto", 0, proc_mckinley_root, sba_proc_info);
        } else {
                create_proc_info_entry("Reo", 0, proc_runway_root, sba_proc_info);
        }
index ad7811509b7807e638c34f17e91f31da17810c4d..6357ec10ebf4eda69a75118b8220788247237f1e 100644 (file)
@@ -419,8 +419,10 @@ superio_serial_init(void)
 {
 #ifdef CONFIG_SERIAL_8250
        int retval;
+#ifdef CONFIG_SERIAL_8250_CONSOLE
        extern void serial8250_console_init(void); /* drivers/serial/8250.c */
-       
+#endif        
+        
        if (!sio_dev.irq_region)
                return; /* superio not present */
 
@@ -438,8 +440,10 @@ superio_serial_init(void)
                return;
        }
 
+#ifdef CONFIG_SERIAL_8250_CONSOLE
        serial8250_console_init();
-
+#endif
+        
        serial[1].iobase = sio_dev.sp2_base;
        serial[1].irq = sio_dev.irq_region->data.irqbase + SP2_IRQ;
        retval = early_serial_setup(&serial[1]);
index b421d4b8d178f667835a36d8a35657e8945f4570..5ba8c5cd46bdfe938792b8abc09c85af475936ae 100644 (file)
@@ -24,6 +24,7 @@
 #ifdef __LP64__
 #define LDREG  ldd
 #define STREG  std
+#define LDREGX  ldd,s
 #define LDREGM ldd,mb
 #define STREGM std,ma
 #define RP_OFFSET      16
 #else
 #define LDREG  ldw
 #define STREG  stw
+#define LDREGX  ldwx,s
 #define LDREGM ldwm
 #define STREGM stwm
 #define RP_OFFSET      20
 #define FRAME_SIZE     64
 #endif
 
+#ifdef CONFIG_PA20
+#define BL             b,l
+#else
+#define BL             bl
+#endif
+
 #ifdef __ASSEMBLY__
 
 #ifdef __LP64__
        depd,z  \r, 63-\sa, 64-\sa, \t
        .endm
 
+       /* Shift Right - note the r and t can NOT be the same! */
+       .macro shr r, sa, t
+       extru \r, 31-\sa, 32-\sa, \t
+       .endm
+
+       /* pa20w version of shift right */
+       .macro shrd r, sa, t
+       extrd,u \r, 63-\sa, 64-\sa, \t
+       .endm
+
        /* load 32-bit 'value' into 'reg' compensating for the ldil
         * sign-extension when running in wide mode.
         * WARNING!! neither 'value' nor 'reg' can be expressions
index caa31732820bae961bc090b0e1e25fecdc45de3c..914f70ce0f752ffd2a932b10d5b21778e1f6e7e4 100644 (file)
@@ -30,7 +30,7 @@
 #define smp_mb__before_clear_bit()      smp_mb()
 #define smp_mb__after_clear_bit()       smp_mb()
 
-static __inline__ void set_bit(int nr, void * address)
+static __inline__ void set_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -43,7 +43,7 @@ static __inline__ void set_bit(int nr, void * address)
        atomic_spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
 }
 
-static __inline__ void __set_bit(int nr, void * address)
+static __inline__ void __set_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -53,7 +53,7 @@ static __inline__ void __set_bit(int nr, void * address)
        *addr |= mask;
 }
 
-static __inline__ void clear_bit(int nr, void * address)
+static __inline__ void clear_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -66,7 +66,7 @@ static __inline__ void clear_bit(int nr, void * address)
        atomic_spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
 }
 
-static __inline__ void __clear_bit(unsigned long nr, volatile void * address)
+static __inline__ void __clear_bit(unsigned long nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -76,7 +76,7 @@ static __inline__ void __clear_bit(unsigned long nr, volatile void * address)
        *addr &= ~mask;
 }
 
-static __inline__ void change_bit(int nr, void * address)
+static __inline__ void change_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -89,7 +89,7 @@ static __inline__ void change_bit(int nr, void * address)
        atomic_spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
 }
 
-static __inline__ void __change_bit(int nr, void * address)
+static __inline__ void __change_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -99,7 +99,7 @@ static __inline__ void __change_bit(int nr, void * address)
        *addr ^= mask;
 }
 
-static __inline__ int test_and_set_bit(int nr, void * address)
+static __inline__ int test_and_set_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -116,7 +116,7 @@ static __inline__ int test_and_set_bit(int nr, void * address)
        return oldbit;
 }
 
-static __inline__ int __test_and_set_bit(int nr, void * address)
+static __inline__ int __test_and_set_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -130,7 +130,7 @@ static __inline__ int __test_and_set_bit(int nr, void * address)
        return oldbit;
 }
 
-static __inline__ int test_and_clear_bit(int nr, void * address)
+static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -147,7 +147,7 @@ static __inline__ int test_and_clear_bit(int nr, void * address)
        return oldbit;
 }
 
-static __inline__ int __test_and_clear_bit(int nr, void * address)
+static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -161,7 +161,7 @@ static __inline__ int __test_and_clear_bit(int nr, void * address)
        return oldbit;
 }
 
-static __inline__ int test_and_change_bit(int nr, void * address)
+static __inline__ int test_and_change_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -178,7 +178,7 @@ static __inline__ int test_and_change_bit(int nr, void * address)
        return oldbit;
 }
 
-static __inline__ int __test_and_change_bit(int nr, void * address)
+static __inline__ int __test_and_change_bit(int nr, volatile unsigned long * address)
 {
        unsigned long mask;
        unsigned long *addr = (unsigned long *) address;
@@ -192,10 +192,10 @@ static __inline__ int __test_and_change_bit(int nr, void * address)
        return oldbit;
 }
 
-static __inline__ int test_bit(int nr, const void *address)
+static __inline__ int test_bit(int nr, const volatile unsigned long *address)
 {
        unsigned long mask;
-       unsigned long *addr = (unsigned long *) address;
+       const unsigned long *addr = (const unsigned long *)address;
        
        addr += (nr >> SHIFT_PER_LONG);
        mask = 1L << CHOP_SHIFTCOUNT(nr);
@@ -322,7 +322,7 @@ static __inline__ int fls(int x)
  * unlikely to be set. It's guaranteed that at least one of the 140
  * bits is cleared.
  */
-static inline int sched_find_first_bit(unsigned long *b)
+static inline int sched_find_first_bit(const unsigned long *b)
 {
 #ifndef __LP64__
        if (unlikely(b[0]))
@@ -354,9 +354,9 @@ static inline int sched_find_first_bit(unsigned long *b)
 #define find_first_zero_bit(addr, size) \
        find_next_zero_bit((addr), (size), 0)
 
-static __inline__ unsigned long find_next_zero_bit(void * addr, unsigned long size, unsigned long offset)
+static __inline__ unsigned long find_next_zero_bit(const void * addr, unsigned long size, unsigned long offset)
 {
-       unsigned long * p = ((unsigned long *) addr) + (offset >> SHIFT_PER_LONG);
+       const unsigned long * p = ((unsigned long *) addr) + (offset >> SHIFT_PER_LONG);
        unsigned long result = offset & ~(BITS_PER_LONG-1);
        unsigned long tmp;
 
@@ -389,9 +389,9 @@ found_middle:
        return result + ffz(tmp);
 }
 
-static __inline__ unsigned long find_next_bit(unsigned long *addr, unsigned long size, unsigned long offset)
+static __inline__ unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset)
 {
-       unsigned long *p = addr + (offset >> 6);
+       const unsigned long *p = addr + (offset >> 6);
        unsigned long result = offset & ~(BITS_PER_LONG-1);
        unsigned long tmp;
 
@@ -446,15 +446,15 @@ found_middle:
  * disabling interrupts.
  */
 #ifdef __LP64__
-#define ext2_set_bit(nr, addr)         test_and_set_bit((nr) ^ 0x38, addr)
-#define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x38, addr)
-#define ext2_clear_bit(nr, addr)       test_and_clear_bit((nr) ^ 0x38, addr)
-#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x38, addr)
+#define ext2_set_bit(nr, addr)         test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr)
+#define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr)
+#define ext2_clear_bit(nr, addr)       test_and_clear_bit((nr) ^ 0x38, (unsigned long *)addr)
+#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x38, (unsigned long *)addr)
 #else
-#define ext2_set_bit(nr, addr)         test_and_set_bit((nr) ^ 0x18, addr)
-#define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x18, addr)
-#define ext2_clear_bit(nr, addr)       test_and_clear_bit((nr) ^ 0x18, addr)
-#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x18, addr)
+#define ext2_set_bit(nr, addr)         test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr)
+#define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr)
+#define ext2_clear_bit(nr, addr)       test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr)
+#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr)
 #endif
 
 #endif /* __KERNEL__ */
index a5700c29f18a868d9f2732e7ba7644cb96d0dc80..3086cdaf4edda3f8bbed6da8a234dd3ac629ed24 100644 (file)
@@ -65,18 +65,7 @@ flush_user_icache_range(unsigned long start, unsigned long end)
 #endif
 }
 
-extern void __flush_dcache_page(struct page *page);
-
-static inline void flush_dcache_page(struct page *page)
-{
-       struct address_space *mapping = page_mapping(page);
-
-       if (mapping && !mapping_mapped(mapping)) {
-               set_bit(PG_dcache_dirty, &page->flags);
-       } else {
-               __flush_dcache_page(page);
-       }
-}
+extern void flush_dcache_page(struct page *page);
 
 #define flush_dcache_mmap_lock(mapping) \
        spin_lock_irq(&(mapping)->tree_lock)
@@ -115,28 +104,29 @@ static inline void flush_cache_range(struct vm_area_struct *vma,
 
 /* Simple function to work out if we have an existing address translation
  * for a user space vma. */
-static inline int translation_exists(struct vm_area_struct *vma,
-                                    unsigned long addr)
+static inline pte_t *__translation_exists(struct mm_struct *mm,
+                                         unsigned long addr)
 {
-       pgd_t *pgd = pgd_offset(vma->vm_mm, addr);
+       pgd_t *pgd = pgd_offset(mm, addr);
        pmd_t *pmd;
        pte_t *pte;
 
        if(pgd_none(*pgd))
-               return 0;
+               return NULL;
 
        pmd = pmd_offset(pgd, addr);
        if(pmd_none(*pmd) || pmd_bad(*pmd))
-               return 0;
+               return NULL;
 
        pte = pte_offset_map(pmd, addr);
 
        /* The PA flush mappings show up as pte_none, but they're
         * valid none the less */
        if(pte_none(*pte) && ((pte_val(*pte) & _PAGE_FLUSH) == 0))
-               return 0;
-       return 1;
+               return NULL;
+       return pte;
 }
+#define        translation_exists(vma, addr)   __translation_exists((vma)->vm_mm, addr)
 
 
 /* Private function to flush a page from the cache of a non-current
index 89808f7786dc136a292e083bcd9d24bd25683344..be4458181e389260bc17f59993ae06afe35a3046 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/mm.h>
 #include <linux/config.h>
 #include <asm/cacheflush.h>
+#include <asm/scatterlist.h>
 
 /* See Documentation/DMA-mapping.txt */
 struct hppa_dma_ops {
index 3fc29c68f6faa7fb6df9a23637a9d2c033b283af..b383b3c75ad095945610e82b0b7ba7889b293345 100644 (file)
@@ -97,6 +97,7 @@ struct bc_module {
 #define HPHW_IOA       12
 #define HPHW_BRIDGE    13
 #define HPHW_FABRIC    14
+#define HPHW_MC               15
 #define HPHW_FAULTY    31
 
 
index 714db8ebf31cebfe5da44675daddfc51d8705e34..fe536cfa3366849418c21b8e84760d8203000e48 100644 (file)
@@ -24,11 +24,6 @@ extern unsigned long parisc_vmerge_max_size;
 #define virt_to_bus virt_to_phys
 #define bus_to_virt phys_to_virt
 
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_phys(page)     ((page - mem_map) << PAGE_SHIFT)
-
 /* Memory mapped IO */
 
 extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
index 221a7ef1f95ff5c5900db2748cb6331b14b8392a..928bf50c4693e2d5d31849f4f71c19f17187d93b 100644 (file)
 #ifndef _PARISC_MMZONE_H
 #define _PARISC_MMZONE_H
 
+#ifdef CONFIG_DISCONTIGMEM
+
+#define MAX_PHYSMEM_RANGES 8 /* Fix the size for now (current known max is 3) */
+extern int npmem_ranges;
+
 struct node_map_data {
     pg_data_t pg_data;
-    struct page *adj_node_mem_map;
 };
 
 extern struct node_map_data node_data[];
-extern unsigned char *chunkmap;
-
-#define BADCHUNK                ((unsigned char)0xff)
-#define CHUNKSZ                 (256*1024*1024)
-#define CHUNKSHIFT              28
-#define CHUNKMASK               (~(CHUNKSZ - 1))
-#define CHUNKNUM(paddr)         ((paddr) >> CHUNKSHIFT)
 
 #define NODE_DATA(nid)          (&node_data[nid].pg_data)
-#define NODE_MEM_MAP(nid)       (NODE_DATA(nid)->node_mem_map)
-#define ADJ_NODE_MEM_MAP(nid)   (node_data[nid].adj_node_mem_map)
 
-#define phys_to_page(paddr) \
-       (ADJ_NODE_MEM_MAP(chunkmap[CHUNKNUM((paddr))]) \
-       + ((paddr) >> PAGE_SHIFT))
+/*
+ * Given a kernel address, find the home node of the underlying memory.
+ */
+#define kvaddr_to_nid(kaddr)   pfn_to_nid(__pa(kaddr) >> PAGE_SHIFT)
+
+#define node_mem_map(nid)      (NODE_DATA(nid)->node_mem_map)
+#define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
+#define node_end_pfn(nid)                                              \
+({                                                                     \
+       pg_data_t *__pgdat = NODE_DATA(nid);                            \
+       __pgdat->node_start_pfn + __pgdat->node_spanned_pages;          \
+})
+#define node_localnr(pfn, nid)         ((pfn) - node_start_pfn(nid))
+
+#define local_mapnr(kvaddr)                                            \
+({                                                                     \
+       unsigned long __pfn = __pa(kvaddr) >> PAGE_SHIFT;               \
+       (__pfn - node_start_pfn(pfn_to_nid(__pfn)));                    \
+})
+
+#define pfn_to_page(pfn)                                               \
+({                                                                     \
+       unsigned long __pfn = (pfn);                                    \
+       int __node  = pfn_to_nid(__pfn);                                \
+       &node_mem_map(__node)[node_localnr(__pfn,__node)];              \
+})
+
+#define page_to_pfn(pg)                                                        \
+({                                                                     \
+       struct page *__page = pg;                                       \
+       struct zone *__zone = page_zone(__page);                        \
+       BUG_ON(__zone == NULL);                                         \
+       (unsigned long)(__page - __zone->zone_mem_map)                  \
+               + __zone->zone_start_pfn;                               \
+})
+
+/* We have these possible memory map layouts:
+ * Astro: 0-3.75, 67.75-68, 4-64
+ * zx1: 0-1, 257-260, 4-256
+ * Stretch (N-class): 0-2, 4-32, 34-xxx
+ */
+
+/* Since each 1GB can only belong to one region (node), we can create
+ * an index table for pfn to nid lookup; each entry in pfnnid_map 
+ * represents 1GB, and contains the node that the memory belongs to. */
+
+#define PFNNID_SHIFT (30 - PAGE_SHIFT)
+#define PFNNID_MAP_MAX  512     /* support 512GB */
+extern unsigned char pfnnid_map[PFNNID_MAP_MAX];
+
+#ifndef __LP64__
+#define pfn_is_io(pfn) ((pfn & (0xf0000000UL >> PAGE_SHIFT)) == (0xf0000000UL >> PAGE_SHIFT))
+#else
+/* io can be 0xf0f0f0f0f0xxxxxx or 0xfffffffff0000000 */
+#define pfn_is_io(pfn) ((pfn & (0xf000000000000000UL >> PAGE_SHIFT)) == (0xf000000000000000UL >> PAGE_SHIFT))
+#endif
+
+static inline int pfn_to_nid(unsigned long pfn)
+{
+       unsigned int i;
+       unsigned char r;
+
+       if (unlikely(pfn_is_io(pfn)))
+               return 0;
+
+       i = pfn >> PFNNID_SHIFT;
+       BUG_ON(i >= sizeof(pfnnid_map) / sizeof(pfnnid_map[0]));
+       r = pfnnid_map[i];
+       BUG_ON(r == 0xff);
+
+       return (int)r;
+}
 
-#define virt_to_page(kvaddr) phys_to_page(__pa(kvaddr))
+static inline int pfn_valid(int pfn)
+{
+       int nid = pfn_to_nid(pfn);
 
-/* This is kind of bogus, need to investigate performance of doing it right */
-#define VALID_PAGE(page)       ((page - mem_map) < max_mapnr)
+       if (nid >= 0)
+               return (pfn < node_end_pfn(nid));
+       return 0;
+}
 
-#endif /* !_PARISC_MMZONE_H */
+#else /* !CONFIG_DISCONTIGMEM */
+#define MAX_PHYSMEM_RANGES     1 
+#endif
+#endif /* _PARISC_MMZONE_H */
diff --git a/include/asm-parisc/numnodes.h b/include/asm-parisc/numnodes.h
new file mode 100644 (file)
index 0000000..dcdd933
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _ASM_MAX_NUMNODES_H
+#define _ASM_MAX_NUMNODES_H
+
+#include <linux/config.h>
+
+/* Max 8 Nodes */
+#define NODES_SHIFT    3
+
+#endif /* _ASM_MAX_NUMNODES_H */
index 54cc342e4c51f7c13b8218e794eb4e5aa8fa38c1..4a12692f94b4659c5d10769416cddebb34421f88 100644 (file)
@@ -60,10 +60,15 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 #else
 #define pte_flags(x)   ((x).flags)
 #endif
-#define pmd_val(x)     ((x).pmd)
-#define pgd_val(x)     ((x).pgd)
+
+/* These do not work lvalues, so make sure we don't use them as such. */
+#define pmd_val(x)     ((x).pmd + 0)
+#define pgd_val(x)     ((x).pgd + 0)
 #define pgprot_val(x)  ((x).pgprot)
 
+#define __pmd_val_set(x,n) (x).pmd = (n)
+#define __pgd_val_set(x,n) (x).pgd = (n)
+
 #define __pte(x)       ((pte_t) { (x) } )
 #define __pmd(x)       ((pmd_t) { (x) } )
 #define __pgd(x)       ((pgd_t) { (x) } )
@@ -83,12 +88,6 @@ extern __inline__ int get_order(unsigned long size)
        return order;
 }
 
-#ifdef __LP64__
-#define MAX_PHYSMEM_RANGES 8 /* Fix the size for now (current known max is 3) */
-#else
-#define MAX_PHYSMEM_RANGES 1 /* First range is only range that fits in 32 bits */
-#endif
-
 typedef struct __physmem_range {
        unsigned long start_pfn;
        unsigned long pages;       /* PAGE_SIZE pages */
@@ -144,15 +143,16 @@ extern int npmem_ranges;
 #define __pa(x)                        ((unsigned long)(x)-PAGE_OFFSET)
 #define __va(x)                        ((void *)((unsigned long)(x)+PAGE_OFFSET))
 
+#ifndef CONFIG_DISCONTIGMEM
 #define pfn_to_page(pfn)       (mem_map + (pfn))
 #define page_to_pfn(page)      ((unsigned long)((page) - mem_map))
 #define pfn_valid(pfn)         ((pfn) < max_mapnr)
+#endif /* CONFIG_DISCONTIGMEM */
+
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
-#ifndef CONFIG_DISCONTIGMEM
-#define virt_to_page(kaddr)     (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
-#define VALID_PAGE(page)       ((page - mem_map) < max_mapnr)
-#endif  /* !CONFIG_DISCONTIGMEM */
+#define page_to_phys(page)     (page_to_pfn(page) << PAGE_SHIFT)
+#define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 
 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
                                 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
index b091f0845662251c76191ac8b5818d7a74ce44ff..ba34a4e49d83c1b27c8c1c5b59e4ff90f4fbcba7 100644 (file)
 */
 #define PCI_MAX_BUSSES 256
 
-/* [soapbox on]
-** Who the hell can develop stuff without ASSERT or VASSERT?
-** No one understands all the modules across all platforms.
-** For linux add another dimension - processor architectures.
-**
-** This should be a standard/global macro used liberally
-** in all code. Every respectable engineer I know in HP
-** would support this argument. - grant
-** [soapbox off]
-*/
-#ifdef PCI_DEBUG
-#define ASSERT(expr) \
-       if(!(expr)) { \
-               printk("\n%s:%d: Assertion " #expr " failed!\n", \
-                      __FILE__, __LINE__); \
-               panic(#expr); \
-       }
-#else
-#define ASSERT(expr)
-#endif
-
-
 /*
 ** pci_hba_data (aka H2P_OBJECT in HP/UX)
 **
index 990ddd36deeafccb1c58e47f79f84a9be05e3613..ce9a9e1b33ff1e87c3cd8aa2af9fd71dc56431c7 100644 (file)
@@ -297,175 +297,6 @@ typedef struct {
 #define OSTAT_RUN              6
 #define OSTAT_ON               7
 
-#ifdef __LP64__
-/* PDC PAT CELL */
-#define PDC_PAT_CELL   64L             /* Interface for gaining and 
-                                        * manipulating cell state within PD */
-#define PDC_PAT_CELL_GET_NUMBER           0L   /* Return Cell number           */
-#define PDC_PAT_CELL_GET_INFO      1L  /* Returns info about Cell      */
-#define PDC_PAT_CELL_MODULE        2L  /* Returns info about Module    */
-#define PDC_PAT_CELL_SET_ATTENTION 9L  /* Set Cell Attention indicator */
-#define PDC_PAT_CELL_NUMBER_TO_LOC 10L /* Cell Number -> Location      */
-#define PDC_PAT_CELL_WALK_FABRIC   11L /* Walk the Fabric              */
-#define PDC_PAT_CELL_GET_RDT_SIZE  12L /* Return Route Distance Table Sizes */
-#define PDC_PAT_CELL_GET_RDT       13L /* Return Route Distance Tables */
-#define PDC_PAT_CELL_GET_LOCAL_PDH_SZ  14L /* Read Local PDH Buffer Size*/
-#define PDC_PAT_CELL_SET_LOCAL_PDH     15L /* Write Local PDH Buffer   */
-#define PDC_PAT_CELL_GET_REMOTE_PDH_SZ 16L /* Return Remote PDH Buffer Size */
-#define PDC_PAT_CELL_GET_REMOTE_PDH    17L /* Read Remote PDH Buffer   */
-#define PDC_PAT_CELL_GET_DBG_INFO  128L        /* Return DBG Buffer Info       */
-#define PDC_PAT_CELL_CHANGE_ALIAS  129L        /* Change Non-Equivalent Alias Checking */
-
-/*
-** Arg to PDC_PAT_CELL_MODULE memaddr[4]
-**
-** Addresses on the Merced Bus != all Runway Bus addresses.
-** This is intended for programming SBA/LBA chips range registers.
-*/
-#define IO_VIEW                        0UL
-#define PA_VIEW                        1UL
-
-/* PDC_PAT_CELL_MODULE entity type values */
-#define PAT_ENTITY_CA          0       /* central agent        */
-#define PAT_ENTITY_PROC                1       /* processor            */
-#define PAT_ENTITY_MEM         2       /* memory controller    */
-#define PAT_ENTITY_SBA         3       /* system bus adapter   */
-#define PAT_ENTITY_LBA         4       /* local bus adapter    */
-#define PAT_ENTITY_PBC         5       /* processor bus converter */
-#define PAT_ENTITY_XBC         6       /* crossbar fabric connect */
-#define PAT_ENTITY_RC          7       /* fabric interconnect  */
-
-/* PDC_PAT_CELL_MODULE address range type values */
-#define PAT_PBNUM              0       /* PCI Bus Number       */
-#define PAT_LMMIO              1       /* < 4G MMIO Space      */
-#define PAT_GMMIO              2       /* > 4G MMIO Space      */
-#define PAT_NPIOP              3       /* Non Postable I/O Port Space */
-#define PAT_PIOP               4       /* Postable I/O Port Space */
-#define PAT_AHPA               5       /* Additional HPA Space */
-#define PAT_UFO                        6       /* HPA Space (UFO for Mariposa) */
-#define PAT_GNIP               7       /* GNI Reserved Space   */
-
-
-/* PDC PAT CHASSIS LOG */
-#define PDC_PAT_CHASSIS_LOG    65L     /* Platform logging & forward
-                                        ** progress functions  */
-#define PDC_PAT_CHASSIS_WRITE_LOG      0L /* Write Log Entry   */
-#define PDC_PAT_CHASSIS_READ_LOG       1L /* Read  Log Entry   */
-
-
-/* PDC PAT CPU  */
-#define PDC_PAT_CPU            67L     /* Interface to CPU configuration
-                                        * within the protection domain */
-#define PDC_PAT_CPU_INFO               0L /* Return CPU config info    */
-#define PDC_PAT_CPU_DELETE             1L /* Delete CPU                */
-#define PDC_PAT_CPU_ADD                        2L /* Add    CPU                */
-#define PDC_PAT_CPU_GET_NUMBER         3L /* Return CPU Number         */
-#define PDC_PAT_CPU_GET_HPA            4L /* Return CPU HPA            */
-#define PDC_PAT_CPU_STOP               5L /* Stop   CPU                */
-#define PDC_PAT_CPU_RENDEZVOUS         6L /* Rendezvous CPU            */
-#define PDC_PAT_CPU_GET_CLOCK_INFO     7L /* Return CPU Clock info     */
-#define PDC_PAT_CPU_GET_RENDEZVOUS_STATE 8L /* Return Rendezvous State */
-#define PDC_PAT_CPU_PLUNGE_FABRIC      128L /* Plunge Fabric           */
-#define PDC_PAT_CPU_UPDATE_CACHE_CLEANSING 129L /* Manipulate Cache 
-                                                 * Cleansing Mode      */
-
-/*  PDC PAT EVENT */
-#define PDC_PAT_EVENT          68L     /* Interface to Platform Events */
-#define PDC_PAT_EVENT_GET_CAPS         0L /* Get Capabilities          */
-#define PDC_PAT_EVENT_SET_MODE         1L /* Set Notification Mode     */
-#define PDC_PAT_EVENT_SCAN             2L /* Scan Event                */
-#define PDC_PAT_EVENT_HANDLE           3L /* Handle Event              */
-#define PDC_PAT_EVENT_GET_NB_CALL      4L /* Get Non-Blocking call Args*/
-
-/*  PDC PAT HPMC */
-#define PDC_PAT_HPMC           70L     /* Cause processor to go into spin
-                                        ** loop, and wait for wake up from
-                                        ** Monarch Processor           */
-#define PDC_PAT_HPMC_RENDEZ_CPU                0L /* go into spin loop         */
-#define PDC_PAT_HPMC_SET_PARAMS                1L /* Allows OS to specify intr which PDC 
-                                        * will use to interrupt OS during machine
-                                        * check rendezvous             */
-
-/* parameters for PDC_PAT_HPMC_SET_PARAMS */
-#define HPMC_SET_PARAMS_INTR           1L /* Rendezvous Interrupt      */
-#define HPMC_SET_PARAMS_WAKE           2L /* Wake up processor         */
-
-/*  PDC PAT IO */
-#define PDC_PAT_IO             71L     /* On-line services for I/O modules */
-#define PDC_PAT_IO_GET_SLOT_STATUS      5L /* Get Slot Status Info     */
-#define PDC_PAT_IO_GET_LOC_FROM_HARDWARE 6L /* Get Physical Location from */
-                                            /* Hardware Path           */
-#define PDC_PAT_IO_GET_HARDWARE_FROM_LOC 7L /* Get Hardware Path from 
-                                             * Physical Location       */
-#define PDC_PAT_IO_GET_PCI_CONFIG_FROM_HW 11L /* Get PCI Configuration
-                                               * Address from Hardware Path */
-#define PDC_PAT_IO_GET_HW_FROM_PCI_CONFIG 12L /* Get Hardware Path 
-                                               * from PCI Configuration Address */
-#define PDC_PAT_IO_READ_HOST_BRIDGE_INFO  13L /* Read Host Bridge State Info */
-#define PDC_PAT_IO_CLEAR_HOST_BRIDGE_INFO 14L /* Clear Host Bridge State Info*/
-#define PDC_PAT_IO_GET_PCI_ROUTING_TABLE_SIZE 15L /* Get PCI INT Routing Table 
-                                                   * Size              */
-#define PDC_PAT_IO_GET_PCI_ROUTING_TABLE  16L /* Get PCI INT Routing Table */
-#define PDC_PAT_IO_GET_HINT_TABLE_SIZE    17L /* Get Hint Table Size   */
-#define PDC_PAT_IO_GET_HINT_TABLE      18L /* Get Hint Table           */
-#define PDC_PAT_IO_PCI_CONFIG_READ     19L /* PCI Config Read          */
-#define PDC_PAT_IO_PCI_CONFIG_WRITE    20L /* PCI Config Write         */
-#define PDC_PAT_IO_GET_NUM_IO_SLOTS    21L /* Get Number of I/O Bay Slots in 
-                                                         * Cabinet             */
-#define PDC_PAT_IO_GET_LOC_IO_SLOTS    22L /* Get Physical Location of I/O */
-                                           /* Bay Slots in Cabinet     */
-#define PDC_PAT_IO_BAY_STATUS_INFO     28L /* Get I/O Bay Slot Status Info */
-#define PDC_PAT_IO_GET_PROC_VIEW       29L /* Get Processor view of IO address */
-#define PDC_PAT_IO_PROG_SBA_DIR_RANGE  30L /* Program directed range   */
-
-/* PDC PAT MEM */
-#define PDC_PAT_MEM            72L  /* Manage memory page deallocation */
-#define PDC_PAT_MEM_PD_INFO            0L /* Return PDT info for PD    */
-#define PDC_PAT_MEM_PD_CLEAR           1L /* Clear PDT for PD          */
-#define PDC_PAT_MEM_PD_READ            2L /* Read PDT entries for PD   */
-#define PDC_PAT_MEM_PD_RESET           3L /* Reset clear bit for PD    */
-#define PDC_PAT_MEM_CELL_INFO          5L /* Return PDT info For Cell  */
-#define PDC_PAT_MEM_CELL_CLEAR         6L /* Clear PDT For Cell        */
-#define PDC_PAT_MEM_CELL_READ          7L /* Read PDT entries For Cell */
-#define PDC_PAT_MEM_CELL_RESET         8L /* Reset clear bit For Cell  */
-#define PDC_PAT_MEM_SETGM              9L /* Set Golden Memory value   */
-#define PDC_PAT_MEM_ADD_PAGE           10L /* ADDs a page to the cell  */
-#define PDC_PAT_MEM_ADDRESS            11L /* Get Physical Location From*/
-                                           /* Memory Address           */
-#define PDC_PAT_MEM_GET_TXT_SIZE       12L /* Get Formatted Text Size  */
-#define PDC_PAT_MEM_GET_PD_TXT         13L /* Get PD Formatted Text    */
-#define PDC_PAT_MEM_GET_CELL_TXT       14L /* Get Cell Formatted Text  */
-#define PDC_PAT_MEM_RD_STATE_INFO      15L /* Read Mem Module State Info*/
-#define PDC_PAT_MEM_CLR_STATE_INFO     16L /*Clear Mem Module State Info*/
-#define PDC_PAT_MEM_CLEAN_RANGE        128L /*Clean Mem in specific range*/
-#define PDC_PAT_MEM_GET_TBL_SIZE       131L /* Get Memory Table Size   */
-#define PDC_PAT_MEM_GET_TBL            132L /* Get Memory Table        */
-
-/* PDC PAT NVOLATILE */
-#define PDC_PAT_NVOLATILE      73L        /* Access Non-Volatile Memory*/
-#define PDC_PAT_NVOLATILE_READ         0L /* Read Non-Volatile Memory  */
-#define PDC_PAT_NVOLATILE_WRITE                1L /* Write Non-Volatile Memory */
-#define PDC_PAT_NVOLATILE_GET_SIZE     2L /* Return size of NVM        */
-#define PDC_PAT_NVOLATILE_VERIFY       3L /* Verify contents of NVM    */
-#define PDC_PAT_NVOLATILE_INIT         4L /* Initialize NVM            */
-
-/* PDC PAT PD */
-#define PDC_PAT_PD             74L         /* Protection Domain Info   */
-#define PDC_PAT_PD_GET_ADDR_MAP                0L  /* Get Address Map          */
-
-/* PDC_PAT_PD_GET_ADDR_MAP entry types */
-#define PAT_MEMORY_DESCRIPTOR          1
-
-/* PDC_PAT_PD_GET_ADDR_MAP memory types */
-#define PAT_MEMTYPE_MEMORY             0
-#define PAT_MEMTYPE_FIRMWARE           4
-
-/* PDC_PAT_PD_GET_ADDR_MAP memory usage */
-#define PAT_MEMUSE_GENERAL             0
-#define PAT_MEMUSE_GI                  128
-#define PAT_MEMUSE_GNI                 129
-#endif /* __LP64__ */
-
 #ifndef __ASSEMBLY__
 
 #include <linux/types.h>
@@ -478,12 +309,6 @@ extern int pdc_type;
 #define PDC_TYPE_SYSTEM_MAP     1 /* 32-bit, but supports PDC_SYSTEM_MAP */
 #define PDC_TYPE_SNAKE          2 /* Doesn't support SYSTEM_MAP */
 
-#ifdef CONFIG_PARISC64
-#define is_pdc_pat()    (PDC_TYPE_PAT == pdc_type)
-#else
-#define is_pdc_pat()    (0)
-#endif
-
 struct pdc_chassis_info {       /* for PDC_CHASSIS_INFO */
        unsigned long actcnt;   /* actual number of bytes returned */
        unsigned long maxcnt;   /* maximum number of bytes that could be returned */
@@ -521,10 +346,10 @@ struct pdc_cache_cf {             /* for PDC_CACHE  (I/D-caches) */
 #ifdef __LP64__
                cc_padW:32,
 #endif
-               cc_alias:4,     /* alias boundaries for virtual addresses   */
+               cc_alias: 4,    /* alias boundaries for virtual addresses   */
                cc_block: 4,    /* to determine most efficient stride */
                cc_line : 3,    /* maximum amount written back as a result of store (multiple of 16 bytes) */
-               cc_pad0 : 2,    /* reserved */
+               cc_shift: 2,    /* how much to shift cc_block left */
                cc_wt   : 1,    /* 0 = WT-Dcache, 1 = WB-Dcache */
                cc_sh   : 2,    /* 0 = separate I/D-cache, else shared I/D-cache */
                cc_cst  : 3,    /* 0 = incoherent D-cache, 1=coherent D-cache */
@@ -674,40 +499,6 @@ struct pdc_tod {
        unsigned long tod_usec;
 };
 
-#ifdef __LP64__
-struct pdc_pat_cell_num {
-       unsigned long cell_num;
-       unsigned long cell_loc;
-};
-
-struct pdc_pat_cpu_num {
-       unsigned long cpu_num;
-       unsigned long cpu_loc;
-};
-
-struct pdc_pat_pd_addr_map_entry {
-       unsigned char entry_type;       /* 1 = Memory Descriptor Entry Type */
-       unsigned char reserve1[5];
-       unsigned char memory_type;
-       unsigned char memory_usage;
-       unsigned long paddr;
-       unsigned int  pages;            /* Length in 4K pages */
-       unsigned int  reserve2;
-       unsigned long cell_map;
-};
-
-/* FIXME: mod[508] should really be a union of the various mod components */
-struct pdc_pat_cell_mod_maddr_block {  /* PDC_PAT_CELL_MODULE */
-       unsigned long cba;              /* function 0 configuration space address */
-       unsigned long mod_info;         /* module information */
-       unsigned long mod_location;     /* physical location of the module */
-       struct hardware_path mod_path;  /* hardware path */
-       unsigned long mod[508];         /* PAT cell module components */
-};
-
-typedef struct pdc_pat_cell_mod_maddr_block pdc_pat_cell_mod_maddr_block_t;
-#endif /* __LP64__ */
-
 /* architected results from PDC_PIM/transfer hpmc on a PA1.1 machine */
 
 struct pdc_hpmc_pim_11 { /* PDC_PIM */
@@ -969,52 +760,6 @@ int pdc_sti_call(unsigned long func, unsigned long flags,
                  unsigned long inptr, unsigned long outputr,
                  unsigned long glob_cfg);
 
-#ifdef __LP64__
-int pdc_pat_chassis_send_log(unsigned long status, unsigned long data);
-int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info);
-int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod,
-                       unsigned long view_type, void *mem_addr);
-int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, void *hpa);
-int pdc_pat_get_irt_size(unsigned long *num_entries, unsigned long cell_num);
-int pdc_pat_get_irt(void *r_addr, unsigned long cell_num);
-int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, 
-                           unsigned long count, unsigned long offset);
-
-/********************************************************************
-* PDC_PAT_CELL[Return Cell Module] memaddr[0] conf_base_addr
-* ----------------------------------------------------------
-* Bit  0 to 51 - conf_base_addr
-* Bit 52 to 62 - reserved
-* Bit       63 - endianess bit
-********************************************************************/
-#define PAT_GET_CBA(value) ((value) & 0xfffffffffffff000UL)
-
-/********************************************************************
-* PDC_PAT_CELL[Return Cell Module] memaddr[1] mod_info
-* ----------------------------------------------------
-* Bit  0 to  7 - entity type
-*    0 = central agent,            1 = processor,
-*    2 = memory controller,        3 = system bus adapter,
-*    4 = local bus adapter,        5 = processor bus converter,
-*    6 = crossbar fabric connect,  7 = fabric interconnect,
-*    8 to 254 reserved,            255 = unknown.
-* Bit  8 to 15 - DVI
-* Bit 16 to 23 - IOC functions
-* Bit 24 to 39 - reserved
-* Bit 40 to 63 - mod_pages
-*    number of 4K pages a module occupies starting at conf_base_addr
-********************************************************************/
-#define PAT_GET_ENTITY(value)  (((value) >> 56) & 0xffUL)
-#define PAT_GET_DVI(value)     (((value) >> 48) & 0xffUL)
-#define PAT_GET_IOC(value)     (((value) >> 40) & 0xffUL)
-#define PAT_GET_MOD_PAGES(value)(((value) & 0xffffffUL)
-
-#else /* !__LP64__ */
-/* No PAT support for 32-bit kernels...sorry */
-#define pdc_pat_get_irt_size(num_entries, cell_numn)   PDC_BAD_PROC
-#define pdc_pat_get_irt(r_addr, cell_num)      PDC_BAD_PROC
-#endif /* !__LP64__ */
-
 extern void pdc_init(void);
 
 #endif /* __ASSEMBLY__ */
index 2f74d900812a107e31f9a1799b1c1f66a5adbf81..715d94da61c79d8b398d8d862cdc80a7bac6a6f0 100644 (file)
@@ -6,12 +6,11 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (c) Hewlett Packard (Paul Bame <bame@puffin.external.hp.com>)
- * Copyright 2000 (c) Grant Grundler <grundler@puffin.external.hp.com>
+ * Copyright 2000 (c) Hewlett Packard (Paul Bame <bame()spam.parisc-linux.org>)
+ * Copyright 2000,2004 (c) Grant Grundler <grundler()nahspam.parisc-linux.org>
  */
 
 
-/* PDC PAT CELL */
 #define PDC_PAT_CELL                   64L   /* Interface for gaining and 
                                          * manipulatin g cell state within PD */
 #define PDC_PAT_CELL_GET_NUMBER    0L   /* Return Cell number */
 #define PAT_GNIP            7         /* GNI Reserved Space */
 
 
-/* PDC PAT CHASSIS LOG */
 
-#define PDC_PAT_CHASSIS_LOG            65L /* Platform logging & forward
-                                           ** progress functions */
+/* PDC PAT CHASSIS LOG -- Platform logging & forward progress functions */
+
+#define PDC_PAT_CHASSIS_LOG            65L
 #define PDC_PAT_CHASSIS_WRITE_LOG      0L /* Write Log Entry */
 #define PDC_PAT_CHASSIS_READ_LOG       1L /* Read  Log Entry */
 
-/* PDC PAT CPU  */
 
-#define PDC_PAT_CPU                    67L /* Interface to CPU configuration
-                                               * within the protection domain */
+/* PDC PAT CPU  -- CPU configuration within the protection domain */
+
+#define PDC_PAT_CPU                    67L
 #define PDC_PAT_CPU_INFO               0L /* Return CPU config info */
 #define PDC_PAT_CPU_DELETE             1L /* Delete CPU */
 #define PDC_PAT_CPU_ADD                2L /* Add    CPU */
 #define PDC_PAT_CPU_PLUNGE_FABRIC      128L /* Plunge Fabric */
 #define PDC_PAT_CPU_UPDATE_CACHE_CLEANSING 129L /* Manipulate Cache 
                                                  * Cleansing Mode */
-/*  PDC PAT EVENT */
+/*  PDC PAT EVENT -- Platform Events */
 
-#define PDC_PAT_EVENT                  68L /* Interface to Platform Events */
+#define PDC_PAT_EVENT                  68L
 #define PDC_PAT_EVENT_GET_CAPS         0L /* Get Capabilities */
 #define PDC_PAT_EVENT_SET_MODE         1L /* Set Notification Mode */
 #define PDC_PAT_EVENT_SCAN             2L /* Scan Event */
 #define PDC_PAT_EVENT_HANDLE           3L /* Handle Event */
 #define PDC_PAT_EVENT_GET_NB_CALL      4L /* Get Non-Blocking call Args */
 
-/*  PDC PAT HPMC */
+/*  PDC PAT HPMC -- Cause processor to go into spin loop, and wait
+ *                     for wake up from Monarch Processor.
+ */
 
-#define PDC_PAT_HPMC               70L /* Cause processor to go into spin
-                                      ** loop, and wait for wake up from
-                                      ** Monarch Processor */
+#define PDC_PAT_HPMC               70L
 #define PDC_PAT_HPMC_RENDEZ_CPU     0L /* go into spin loop */
 #define PDC_PAT_HPMC_SET_PARAMS     1L /* Allows OS to specify intr which PDC 
-                                        * will use to interrupt OS during machine
-                                        * check rendezvous */
+                                        * will use to interrupt OS during
+                                        * machine check rendezvous */
 
 /* parameters for PDC_PAT_HPMC_SET_PARAMS: */
 #define HPMC_SET_PARAMS_INTR       1L /* Rendezvous Interrupt */
 #define HPMC_SET_PARAMS_WAKE       2L /* Wake up processor */
 
-/*  PDC PAT IO */
 
-#define PDC_PAT_IO                  71L /* On-line services for I/O modules */
+/*  PDC PAT IO  -- On-line services for I/O modules */
+
+#define PDC_PAT_IO                  71L
 #define PDC_PAT_IO_GET_SLOT_STATUS     5L /* Get Slot Status Info*/
 #define PDC_PAT_IO_GET_LOC_FROM_HARDWARE 6L /* Get Physical Location from */
                                             /* Hardware Path */
 #define PDC_PAT_IO_GET_PROC_VIEW        29L /* Get Processor view of IO address */
 #define PDC_PAT_IO_PROG_SBA_DIR_RANGE   30L /* Program directed range */
 
-/* PDC PAT MEM */
 
-#define PDC_PAT_MEM                    72L /* Manage memory page deallocation */
+/* PDC PAT MEM  -- Manage memory page deallocation */
+
+#define PDC_PAT_MEM            72L
 #define PDC_PAT_MEM_PD_INFO            0L /* Return PDT info for PD       */
 #define PDC_PAT_MEM_PD_CLEAR           1L /* Clear PDT for PD             */
 #define PDC_PAT_MEM_PD_READ            2L /* Read PDT entries for PD      */
 #define PDC_PAT_MEM_GET_TBL_SIZE       131L /* Get Memory Table Size     */
 #define PDC_PAT_MEM_GET_TBL            132L /* Get Memory Table          */
 
-/* PDC PAT NVOLATILE */
 
-#define PDC_PAT_NVOLATILE              73L /* Access Non-Volatile Memory */
-#define PDC_PAT_NVOLATILE_READ         0L /* Read Non-Volatile Memory   */
-#define PDC_PAT_NVOLATILE_WRITE        1L /* Write Non-Volatile Memory  */
-#define PDC_PAT_NVOLATILE_GET_SIZE     2L /* Return size of NVM         */
-#define PDC_PAT_NVOLATILE_VERIFY       3L /* Verify contents of NVM     */
-#define PDC_PAT_NVOLATILE_INIT         4L /* Initialize NVM             */
+/* PDC PAT NVOLATILE  --  Access Non-Volatile Memory */
+
+#define PDC_PAT_NVOLATILE      73L
+#define PDC_PAT_NVOLATILE_READ         0L /* Read Non-Volatile Memory   */
+#define PDC_PAT_NVOLATILE_WRITE                1L /* Write Non-Volatile Memory  */
+#define PDC_PAT_NVOLATILE_GET_SIZE     2L /* Return size of NVM         */
+#define PDC_PAT_NVOLATILE_VERIFY       3L /* Verify contents of NVM     */
+#define PDC_PAT_NVOLATILE_INIT         4L /* Initialize NVM             */
+
+/* PDC PAT PD */
+#define PDC_PAT_PD             74L         /* Protection Domain Info   */
+#define PDC_PAT_PD_GET_ADDR_MAP                0L  /* Get Address Map          */
+
+/* PDC_PAT_PD_GET_ADDR_MAP entry types */
+#define PAT_MEMORY_DESCRIPTOR          1   
+
+/* PDC_PAT_PD_GET_ADDR_MAP memory types */
+#define PAT_MEMTYPE_MEMORY             0
+#define PAT_MEMTYPE_FIRMWARE           4
+
+/* PDC_PAT_PD_GET_ADDR_MAP memory usage */
+#define PAT_MEMUSE_GENERAL             0
+#define PAT_MEMUSE_GI                  128
+#define PAT_MEMUSE_GNI                 129
+
 
 #ifndef __ASSEMBLY__
 #include <linux/types.h>
 
+#ifdef CONFIG_PARISC64
+#define is_pdc_pat()   (PDC_TYPE_PAT == pdc_type)
+extern int pdc_pat_get_irt_size(unsigned long *num_entries, unsigned long cell_num);
+extern int pdc_pat_get_irt(void *r_addr, unsigned long cell_num);
+#else  /* ! CONFIG_PARISC64 */
+/* No PAT support for 32-bit kernels...sorry */
+#define is_pdc_pat()   (0)
+#define pdc_pat_get_irt_size(num_entries, cell_numn)   PDC_BAD_PROC
+#define pdc_pat_get_irt(r_addr, cell_num)              PDC_BAD_PROC
+#endif /* ! CONFIG_PARISC64 */
+
+
+struct pdc_pat_cell_num {
+       unsigned long cell_num;
+       unsigned long cell_loc;
+};
+
+struct pdc_pat_cpu_num {
+       unsigned long cpu_num;
+       unsigned long cpu_loc;
+};
+
+struct pdc_pat_pd_addr_map_entry {
+       unsigned char entry_type;       /* 1 = Memory Descriptor Entry Type */
+       unsigned char reserve1[5];
+       unsigned char memory_type;
+       unsigned char memory_usage;
+       unsigned long paddr;
+       unsigned int  pages;            /* Length in 4K pages */
+       unsigned int  reserve2;
+       unsigned long cell_map;
+};
+
+/********************************************************************
+* PDC_PAT_CELL[Return Cell Module] memaddr[0] conf_base_addr
+* ----------------------------------------------------------
+* Bit  0 to 51 - conf_base_addr
+* Bit 52 to 62 - reserved
+* Bit       63 - endianess bit
+********************************************************************/
+#define PAT_GET_CBA(value) ((value) & 0xfffffffffffff000UL)
+
+/********************************************************************
+* PDC_PAT_CELL[Return Cell Module] memaddr[1] mod_info
+* ----------------------------------------------------
+* Bit  0 to  7 - entity type
+*    0 = central agent,            1 = processor,
+*    2 = memory controller,        3 = system bus adapter,
+*    4 = local bus adapter,        5 = processor bus converter,
+*    6 = crossbar fabric connect,  7 = fabric interconnect,
+*    8 to 254 reserved,            255 = unknown.
+* Bit  8 to 15 - DVI
+* Bit 16 to 23 - IOC functions
+* Bit 24 to 39 - reserved
+* Bit 40 to 63 - mod_pages
+*    number of 4K pages a module occupies starting at conf_base_addr
+********************************************************************/
+#define PAT_GET_ENTITY(value)  (((value) >> 56) & 0xffUL)
+#define PAT_GET_DVI(value)     (((value) >> 48) & 0xffUL)
+#define PAT_GET_IOC(value)     (((value) >> 40) & 0xffUL)
+#define PAT_GET_MOD_PAGES(value)(((value) & 0xffffffUL)
+
+
 /*
 ** PDC_PAT_CELL_GET_INFO return block
 */
@@ -192,26 +274,34 @@ typedef struct pdc_pat_cell_info_rtn_block {
 
 /* FIXME: mod[508] should really be a union of the various mod components */
 struct pdc_pat_cell_mod_maddr_block {  /* PDC_PAT_CELL_MODULE */
-       unsigned long cba;              /* function 0 configuration space address */
-       unsigned long mod_info;         /* module information */
-       unsigned long mod_location;     /* physical location of the module */
-       unsigned long mod_path;         /* module path (device path - layers) */
+       unsigned long cba;              /* func 0 cfg space address */
+       unsigned long mod_info;         /* module information */
+       unsigned long mod_location;     /* physical location of the module */
+       struct hardware_path mod_path;  /* module path (device path - layers) */
        unsigned long mod[508];         /* PAT cell module components */
 } __attribute__((aligned(8))) ;
 
 typedef struct pdc_pat_cell_mod_maddr_block pdc_pat_cell_mod_maddr_block_t;
 
 
-extern int pdc_pat_cell_get_number(void *);
-extern int pdc_pat_cell_module(void *, unsigned long, unsigned long, unsigned long, void *);
+extern int pdc_pat_chassis_send_log(unsigned long status, unsigned long data);
+extern int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info);
+extern int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod, unsigned long view_type, void *mem_addr);
 extern int pdc_pat_cell_num_to_loc(void *, unsigned long);
 
+extern int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, void *hpa);
+
+extern int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, unsigned long count, unsigned long offset);
+
+
+extern int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *val); 
+extern int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val); 
+
+
 /* Flag to indicate this is a PAT box...don't use this unless you
 ** really have to...it might go away some day.
 */
-#ifdef __LP64__
 extern int pdc_pat;     /* arch/parisc/kernel/inventory.c */
-#endif
 
 /********************************************************************
 * PDC_PAT_CELL[Return Cell Module] memaddr[0] conf_base_addr
index 7b2a36c9d7a07ff8612d7481e56608ac563602d6..53a6fec7df959588753102198c829dc36da8fcbe 100644 (file)
@@ -21,7 +21,7 @@
  * kernel for machines with under 4GB of memory) */
 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
 {
-       pgd_t *pgd = (pgd_t *)__get_free_pages(GFP_KERNEL|GFP_DMA,
+       pgd_t *pgd = (pgd_t *)__get_free_pages(GFP_KERNEL,
                                               PGD_ALLOC_ORDER);
        pgd_t *actual_pgd = pgd;
 
@@ -30,13 +30,15 @@ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
 #ifdef __LP64__
                actual_pgd += PTRS_PER_PGD;
                /* Populate first pmd with allocated memory.  We mark it
-                * with _PAGE_GATEWAY as a signal to the system that this
+                * with PxD_FLAG_ATTACHED as a signal to the system that this
                 * pmd entry may not be cleared. */
-               pgd_val(*actual_pgd) = (_PAGE_TABLE | _PAGE_GATEWAY) + 
-                       (__u32)__pa((unsigned long)pgd);
+               __pgd_val_set(*actual_pgd, (PxD_FLAG_PRESENT | 
+                                       PxD_FLAG_VALID | 
+                                       PxD_FLAG_ATTACHED) 
+                       + (__u32)(__pa((unsigned long)pgd) >> PxD_VALUE_SHIFT));
                /* The first pmd entry also is marked with _PAGE_GATEWAY as
                 * a signal that this pmd may not be freed */
-               pgd_val(*pgd) = _PAGE_GATEWAY;
+               __pgd_val_set(*pgd, PxD_FLAG_ATTACHED);
 #endif
        }
        return actual_pgd;
@@ -56,14 +58,13 @@ static inline void pgd_free(pgd_t *pgd)
 
 static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
 {
-       pgd_val(*pgd) = _PAGE_TABLE + (__u32)__pa((unsigned long)pmd);
+       __pgd_val_set(*pgd, (PxD_FLAG_PRESENT | PxD_FLAG_VALID) +
+                       (__u32)(__pa((unsigned long)pmd) >> PxD_VALUE_SHIFT));
 }
 
-/* NOTE: pmd must be in ZONE_DMA (<4GB) so the pgd pointer can be
- * housed in 32 bits */
 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
 {
-       pmd_t *pmd = (pmd_t *)__get_free_pages(GFP_KERNEL|__GFP_REPEAT|GFP_DMA,
+       pmd_t *pmd = (pmd_t *)__get_free_pages(GFP_KERNEL|__GFP_REPEAT,
                                               PMD_ORDER);
        if (pmd)
                memset(pmd, 0, PAGE_SIZE<<PMD_ORDER);
@@ -73,7 +74,7 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
 static inline void pmd_free(pmd_t *pmd)
 {
 #ifdef __LP64__
-       if(pmd_val(*pmd) & _PAGE_GATEWAY)
+       if(pmd_flag(*pmd) & PxD_FLAG_ATTACHED)
                /* This is the permanent pmd attached to the pgd;
                 * cannot free it */
                return;
@@ -102,23 +103,24 @@ pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
 #ifdef __LP64__
        /* preserve the gateway marker if this is the beginning of
         * the permanent pmd */
-       if(pmd_val(*pmd) & _PAGE_GATEWAY)
-               pmd_val(*pmd) = (_PAGE_TABLE | _PAGE_GATEWAY)
-                       + (__u32)__pa((unsigned long)pte);
+       if(pmd_flag(*pmd) & PxD_FLAG_ATTACHED)
+               __pmd_val_set(*pmd, (PxD_FLAG_PRESENT |
+                                PxD_FLAG_VALID |
+                                PxD_FLAG_ATTACHED) 
+                       + (__u32)(__pa((unsigned long)pte) >> PxD_VALUE_SHIFT));
        else
 #endif
-               pmd_val(*pmd) = _PAGE_TABLE + (__u32)__pa((unsigned long)pte);
+               __pmd_val_set(*pmd, (PxD_FLAG_PRESENT | PxD_FLAG_VALID) 
+                       + (__u32)(__pa((unsigned long)pte) >> PxD_VALUE_SHIFT));
 }
 
 #define pmd_populate(mm, pmd, pte_page) \
        pmd_populate_kernel(mm, pmd, page_address(pte_page))
 
-/* NOTE: pte must be in ZONE_DMA (<4GB) so that the pmd pointer
- * can be housed in 32 bits */
 static inline struct page *
 pte_alloc_one(struct mm_struct *mm, unsigned long address)
 {
-       struct page *page = alloc_page(GFP_KERNEL|__GFP_REPEAT|GFP_DMA);
+       struct page *page = alloc_page(GFP_KERNEL|__GFP_REPEAT);
        if (likely(page != NULL))
                clear_page(page_address(page));
        return page;
@@ -127,7 +129,7 @@ pte_alloc_one(struct mm_struct *mm, unsigned long address)
 static inline pte_t *
 pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
 {
-       pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|GFP_DMA);
+       pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
        if (likely(pte != NULL))
                clear_page(pte);
        return pte;
index 37da21882a265423fbd04b91b0986a423453afa5..1593a8a7a5fbc73d2abe3ffec8008ee1a7329e88 100644 (file)
 
 /* This is the size of the initially mapped kernel memory (i.e. currently
  * 0 to 1<<23 == 8MB */
+#ifdef CONFIG_64BIT
+#define KERNEL_INITIAL_ORDER   24
+#else
 #define KERNEL_INITIAL_ORDER   23
+#endif
 #define KERNEL_INITIAL_SIZE    (1 << KERNEL_INITIAL_ORDER)
 
-#ifdef __LP64__
+#ifdef CONFIG_64BIT
 #define PT_NLEVELS     3
 #define PGD_ORDER      1 /* Number of pages per pgd */
 #define PMD_ORDER      1 /* Number of pages per pmd */
@@ -177,6 +181,21 @@ extern  void *vmalloc_start;
 #define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
 #define _PAGE_KERNEL   (_PAGE_PRESENT | _PAGE_EXEC | _PAGE_READ | _PAGE_WRITE | _PAGE_DIRTY | _PAGE_ACCESSED)
 
+/* The pgd/pmd contains a ptr (in phys addr space); since all pgds/pmds
+ * are page-aligned, we don't care about the PAGE_OFFSET bits, except
+ * for a few meta-information bits, so we shift the address to be
+ * able to effectively address 40-bits of physical address space. */
+#define _PxD_PRESENT_BIT   31
+#define _PxD_ATTACHED_BIT  30
+#define _PxD_VALID_BIT     29
+
+#define PxD_FLAG_PRESENT  (1 << xlate_pabit(_PxD_PRESENT_BIT))
+#define PxD_FLAG_ATTACHED (1 << xlate_pabit(_PxD_ATTACHED_BIT))
+#define PxD_FLAG_VALID    (1 << xlate_pabit(_PxD_VALID_BIT))
+#define PxD_FLAG_MASK     (0xf)
+#define PxD_FLAG_SHIFT    (4)
+#define PxD_VALUE_SHIFT   (8)
+
 #ifndef __ASSEMBLY__
 
 #define PAGE_NONE      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
@@ -244,49 +263,49 @@ extern unsigned long *empty_zero_page;
 #define pte_present(x) (pte_val(x) & _PAGE_PRESENT)
 #define pte_clear(xp)  do { pte_val(*(xp)) = 0; } while (0)
 
-#ifdef __LP64__
+#define pmd_flag(x)    (pmd_val(x) & PxD_FLAG_MASK)
+#define pmd_address(x) ((unsigned long)(pmd_val(x) &~ PxD_FLAG_MASK) << PxD_VALUE_SHIFT)
+#define pgd_flag(x)    (pgd_val(x) & PxD_FLAG_MASK)
+#define pgd_address(x) ((unsigned long)(pgd_val(x) &~ PxD_FLAG_MASK) << PxD_VALUE_SHIFT)
+
+#ifdef CONFIG_64BIT
 /* The first entry of the permanent pmd is not there if it contains
  * the gateway marker */
-#define pmd_none(x)    (!pmd_val(x) || pmd_val(x) == _PAGE_GATEWAY)
-#define pmd_bad(x)     ((pmd_val(x) & ~PAGE_MASK) != _PAGE_TABLE && (pmd_val(x) & ~PAGE_MASK) != (_PAGE_TABLE | _PAGE_GATEWAY))
+#define pmd_none(x)    (!pmd_val(x) || pmd_flag(x) == PxD_FLAG_ATTACHED)
 #else
 #define pmd_none(x)    (!pmd_val(x))
-#define pmd_bad(x)     ((pmd_val(x) & ~PAGE_MASK) != _PAGE_TABLE)
 #endif
-#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT)
+#define pmd_bad(x)     (!(pmd_flag(x) & PxD_FLAG_VALID))
+#define pmd_present(x) (pmd_flag(x) & PxD_FLAG_PRESENT)
 static inline void pmd_clear(pmd_t *pmd) {
-#ifdef __LP64__
-       if(pmd_val(*pmd) & _PAGE_GATEWAY)
+#ifdef CONFIG_64BIT
+       if (pmd_flag(*pmd) & PxD_FLAG_ATTACHED)
                /* This is the entry pointing to the permanent pmd
                 * attached to the pgd; cannot clear it */
-               pmd_val(*pmd) = _PAGE_GATEWAY;
+               __pmd_val_set(*pmd, PxD_FLAG_ATTACHED);
        else
 #endif
-               pmd_val(*pmd) = 0;
+               __pmd_val_set(*pmd,  0);
 }
 
 
 
 #if PT_NLEVELS == 3
-#define pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK))
+#define pgd_page(pgd) ((unsigned long) __va(pgd_address(pgd)))
 
 /* For 64 bit we have three level tables */
 
 #define pgd_none(x)     (!pgd_val(x))
-#ifdef __LP64__
-#define pgd_bad(x)      ((pgd_val(x) & ~PAGE_MASK) != _PAGE_TABLE && (pgd_val(x) & ~PAGE_MASK) != (_PAGE_TABLE | _PAGE_GATEWAY))
-#else
-#define pgd_bad(x)      ((pgd_val(x) & ~PAGE_MASK) != _PAGE_TABLE)
-#endif
-#define pgd_present(x)  (pgd_val(x) & _PAGE_PRESENT)
+#define pgd_bad(x)      (!(pgd_flag(x) & PxD_FLAG_VALID))
+#define pgd_present(x)  (pgd_flag(x) & PxD_FLAG_PRESENT)
 static inline void pgd_clear(pgd_t *pgd) {
-#ifdef __LP64__
-       if(pgd_val(*pgd) & _PAGE_GATEWAY)
+#ifdef CONFIG_64BIT
+       if(pgd_flag(*pgd) & PxD_FLAG_ATTACHED)
                /* This is the permanent pmd attached to the pgd; cannot
                 * free it */
                return;
 #endif
-       pgd_val(*pgd) = 0;
+       __pgd_val_set(*pgd, 0);
 }
 #else
 /*
@@ -353,15 +372,11 @@ extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 
 #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT)
 
-#ifdef CONFIG_DISCONTIGMEM
-#define pte_page(x) (phys_to_page(pte_val(x)))
-#else
-#define pte_page(x) (mem_map+(pte_val(x) >> PAGE_SHIFT))
-#endif
+#define pte_page(pte)          (pfn_to_page(pte_pfn(pte)))
 
-#define pmd_page_kernel(pmd)   ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
+#define pmd_page_kernel(pmd)   ((unsigned long) __va(pmd_address(pmd)))
 
-#define __pmd_page(pmd) ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
+#define __pmd_page(pmd) ((unsigned long) __va(pmd_address(pmd)))
 #define pmd_page(pmd)  virt_to_page((void *)__pmd_page(pmd))
 
 #define pgd_index(address) ((address) >> PGDIR_SHIFT)
@@ -419,7 +434,7 @@ static inline int ptep_test_and_clear_young(pte_t *ptep)
 #ifdef CONFIG_SMP
        if (!pte_young(*ptep))
                return 0;
-       return test_and_clear_bit(xlate_pabit(_PAGE_ACCESSED_BIT), ptep);
+       return test_and_clear_bit(xlate_pabit(_PAGE_ACCESSED_BIT), &pte_val(*ptep));
 #else
        pte_t pte = *ptep;
        if (!pte_young(pte))
@@ -434,7 +449,7 @@ static inline int ptep_test_and_clear_dirty(pte_t *ptep)
 #ifdef CONFIG_SMP
        if (!pte_dirty(*ptep))
                return 0;
-       return test_and_clear_bit(xlate_pabit(_PAGE_DIRTY_BIT), ptep);
+       return test_and_clear_bit(xlate_pabit(_PAGE_DIRTY_BIT), &pte_val(*ptep));
 #else
        pte_t pte = *ptep;
        if (!pte_dirty(pte))
@@ -444,11 +459,7 @@ static inline int ptep_test_and_clear_dirty(pte_t *ptep)
 #endif
 }
 
-#ifdef CONFIG_SMP
 extern spinlock_t pa_dbit_lock;
-#else
-static int pa_dbit_lock; /* dummy to keep the compilers happy */
-#endif
 
 static inline pte_t ptep_get_and_clear(pte_t *ptep)
 {
@@ -483,7 +494,7 @@ static inline void ptep_set_wrprotect(pte_t *ptep)
 static inline void ptep_mkdirty(pte_t *ptep)
 {
 #ifdef CONFIG_SMP
-       set_bit(xlate_pabit(_PAGE_DIRTY_BIT), ptep);
+       set_bit(xlate_pabit(_PAGE_DIRTY_BIT), &pte_val(*ptep));
 #else
        pte_t old_pte = *ptep;
        set_pte(ptep, pte_mkdirty(old_pte));
index 1efee58869bb742c1a0ee6d49484669f10f4dca6..fde77ac35463b1610c7c085d57b3ca9bd55f0fc6 100644 (file)
@@ -52,11 +52,18 @@ extern void smp_send_reschedule(int cpu);
 extern unsigned long cpu_present_mask;
 
 #define smp_processor_id()     (current_thread_info()->cpu)
-#define cpu_online(cpu)                cpu_isset(cpu, cpu_online_map)
 
 #endif /* CONFIG_SMP */
 
 #define NO_PROC_ID             0xFF            /* No processor magic marker */
 #define ANY_PROC_ID            0xFF            /* Any processor magic marker */
+static inline int __cpu_disable (void) {
+  return 0;
+}
+static inline void __cpu_die (unsigned int cpu) {
+  while(1)
+    ;
+}
+extern int __cpu_up (unsigned int cpu);
 
 #endif /*  __ASM_SMP_H */
index 1ad3aaa6da315def1a8ebe79e634c618c81a0ab1..7a2c25d477b5b9a85da41cb82a9a90fb8385a268 100644 (file)
@@ -8,8 +8,11 @@
  * the semaphore address has to be 16-byte aligned.
  */
 
+#ifndef CONFIG_DEBUG_SPINLOCK
+
+#define __SPIN_LOCK_UNLOCKED   { { 1, 1, 1, 1 } }
 #undef SPIN_LOCK_UNLOCKED
-#define SPIN_LOCK_UNLOCKED (spinlock_t) { { 1, 1, 1, 1 } }
+#define SPIN_LOCK_UNLOCKED (spinlock_t) __SPIN_LOCK_UNLOCKED
 
 #define spin_lock_init(x)      do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
 
@@ -41,6 +44,83 @@ static inline int _raw_spin_trylock(spinlock_t *x)
        return __ldcw(a) != 0;
 }
        
+#define spin_lock_own(LOCK, LOCATION)  ((void)0)
+
+#else /* !(CONFIG_DEBUG_SPINLOCK) */
+
+#define SPINLOCK_MAGIC 0x1D244B3C
+
+#define __SPIN_LOCK_UNLOCKED   { { 1, 1, 1, 1 }, SPINLOCK_MAGIC, 10, __FILE__ , NULL, 0, -1, NULL, NULL }
+#undef SPIN_LOCK_UNLOCKED
+#define SPIN_LOCK_UNLOCKED (spinlock_t) __SPIN_LOCK_UNLOCKED
+
+#define spin_lock_init(x)      do { *(x) = SPIN_LOCK_UNLOCKED; } while(0)
+
+#define CHECK_LOCK(x)                                                  \
+       do {                                                            \
+               if (unlikely((x)->magic != SPINLOCK_MAGIC)) {                   \
+                       printk(KERN_ERR "%s:%d: spin_is_locked"         \
+                       " on uninitialized spinlock %p.\n",             \
+                               __FILE__, __LINE__, (x));               \
+               }                                                       \
+       } while(0)
+
+#define spin_is_locked(x)                                              \
+       ({                                                              \
+               CHECK_LOCK(x);                                          \
+               volatile unsigned int *a = __ldcw_align(x);             \
+               if (unlikely((*a == 0) && (x)->babble)) {                               \
+                       (x)->babble--;                                  \
+                       printk("KERN_WARNING                            \
+                               %s:%d: spin_is_locked(%s/%p) already"   \
+                               " locked by %s:%d in %s at %p(%d)\n",   \
+                               __FILE__,__LINE__, (x)->module, (x),    \
+                               (x)->bfile, (x)->bline, (x)->task->comm,\
+                               (x)->previous, (x)->oncpu);             \
+               }                                                       \
+               *a == 0;                                                \
+       })
+
+#define spin_unlock_wait(x)                                            \
+       do {                                                            \
+               CHECK_LOCK(x);                                          \
+               volatile unsigned int *a = __ldcw_align(x);             \
+               if (unlikely((*a == 0) && (x)->babble)) {                               \
+                       (x)->babble--;                                  \
+                       printk("KERN_WARNING                            \
+                               %s:%d: spin_unlock_wait(%s/%p)"         \
+                               " owned by %s:%d in %s at %p(%d)\n",    \
+                               __FILE__,__LINE__, (x)->module, (x),    \
+                               (x)->bfile, (x)->bline, (x)->task->comm,\
+                               (x)->previous, (x)->oncpu);             \
+               }                                                       \
+               barrier();                                              \
+       } while (*((volatile unsigned char *)(__ldcw_align(x))) == 0)
+
+extern void _dbg_spin_lock(spinlock_t *lock, const char *base_file, int line_no);
+extern void _dbg_spin_unlock(spinlock_t *lock, const char *, int);
+extern int _dbg_spin_trylock(spinlock_t * lock, const char *, int);
+
+#define _raw_spin_lock_flags(lock, flags) _raw_spin_lock(lock)
+
+#define _raw_spin_unlock(lock) _dbg_spin_unlock(lock, __FILE__, __LINE__)
+#define _raw_spin_lock(lock) _dbg_spin_lock(lock, __FILE__, __LINE__)
+#define _raw_spin_trylock(lock) _dbg_spin_trylock(lock, __FILE__, __LINE__)
+
+/* just in case we need it */
+#define spin_lock_own(LOCK, LOCATION)                                  \
+do {                                                                   \
+       volatile unsigned int *a = __ldcw_align(LOCK);                  \
+       if (!((*a == 0) && ((LOCK)->oncpu == smp_processor_id())))      \
+               printk("KERN_WARNING                                    \
+                       %s: called on %d from %p but lock %s on %d\n",  \
+                       LOCATION, smp_processor_id(),                   \
+                       __builtin_return_address(0),                    \
+                       (*a == 0) ? "taken" : "freed", (LOCK)->on_cpu); \
+} while (0)
+
+#endif /* !(CONFIG_DEBUG_SPINLOCK) */
+
 /*
  * Read-write spinlocks, allowing multiple readers
  * but only one writer.
@@ -50,7 +130,7 @@ typedef struct {
        volatile int counter;
 } rwlock_t;
 
-#define RW_LOCK_UNLOCKED (rwlock_t) { { { 1, 1, 1, 1 } }, 0 }
+#define RW_LOCK_UNLOCKED (rwlock_t) { __SPIN_LOCK_UNLOCKED, 0 }
 
 #define rwlock_init(lp)        do { *(lp) = RW_LOCK_UNLOCKED; } while (0)
 
@@ -59,6 +139,10 @@ typedef struct {
 /* read_lock, read_unlock are pretty straightforward.  Of course it somehow
  * sucks we end up saving/restoring flags twice for read_lock_irqsave aso. */
 
+#ifdef CONFIG_DEBUG_RWLOCK
+extern void _dbg_read_lock(rwlock_t * rw, const char *bfile, int bline);
+#define _raw_read_lock(rw) _dbg_read_lock(rw, __FILE__, __LINE__)
+#else
 static  __inline__ void _raw_read_lock(rwlock_t *rw)
 {
        unsigned long flags;
@@ -70,6 +154,7 @@ static  __inline__ void _raw_read_lock(rwlock_t *rw)
        _raw_spin_unlock(&rw->lock);
        local_irq_restore(flags);
 }
+#endif /* CONFIG_DEBUG_RWLOCK */
 
 static  __inline__ void _raw_read_unlock(rwlock_t *rw)
 {
@@ -92,6 +177,10 @@ static  __inline__ void _raw_read_unlock(rwlock_t *rw)
  * writers) in interrupt handlers someone fucked up and we'd dead-lock
  * sooner or later anyway.   prumpf */
 
+#ifdef CONFIG_DEBUG_RWLOCK
+extern void _dbg_write_lock(rwlock_t * rw, const char *bfile, int bline);
+#define _raw_write_lock(rw) _dbg_write_lock(rw, __FILE__, __LINE__)
+#else
 static  __inline__ void _raw_write_lock(rwlock_t *rw)
 {
 retry:
@@ -109,6 +198,7 @@ retry:
        /* got it.  now leave without unlocking */
        rw->counter = -1; /* remember we are locked */
 }
+#endif /* CONFIG_DEBUG_RWLOCK */
 
 /* write_unlock is absolutely trivial - we don't have to wait for anything */
 
index d73c20d42af96aee9c87434a40595b88c8f97ede..e2b84285da9386054b87075c52835af934d3cd69 100644 (file)
@@ -166,6 +166,16 @@ static inline void set_eiem(unsigned long val)
 
 typedef struct {
        volatile unsigned int lock[4];
+#ifdef CONFIG_DEBUG_SPINLOCK
+       unsigned long magic;
+       volatile unsigned int babble;
+       const char *module;
+       char *bfile;
+       int bline;
+       int oncpu;
+       void *previous;
+       struct task_struct * task;
+#endif
 } spinlock_t;
 
 #define __lock_aligned __attribute__((__section__(".data.lock_aligned")))
index c709d004952814d176eaa2b3a07e894ddc9816fc..07c1a9f408276aaca1890adf70291bf4fe5b3e56 100644 (file)
@@ -9,11 +9,11 @@
 struct thread_info {
        struct task_struct *task;       /* main task structure */
        struct exec_domain *exec_domain;/* execution domain */
-       __u32 flags;                    /* thread_info flags (see TIF_*) */
-       __u32 cpu;                      /* current CPU */
+       unsigned long flags;            /* thread_info flags (see TIF_*) */
        mm_segment_t addr_limit;        /* user-level address space limit */
-       struct restart_block restart_block;
+       __u32 cpu;                      /* current CPU */
        __s32 preempt_count;            /* 0=premptable, <0=BUG; will also serve as bh-counter */
+       struct restart_block restart_block;
 };
 
 #define INIT_THREAD_INFO(tsk)                  \
index 72b457db1422705e4f2142f3dba9feb62619a2cc..c862d24d55474056086f61ff39d36e02b3efc789 100644 (file)
@@ -958,9 +958,9 @@ static inline int close(int fd)
        return sys_close(fd);
 }
 
-static inline int _exit(int exitcode)
+static inline void _exit(int exitcode)
 {
-       return sys_exit(exitcode);
+       sys_exit(exitcode);
 }
 
 static inline pid_t waitpid(pid_t pid, int *wait_stat, int options)
index 5a52cb1f11749fbf8f80bc5a602ff63b0fb8f3a5..ff9396b0172952051545ee3232addc3e57dc2ca9 100644 (file)
@@ -50,22 +50,22 @@ struct unwind_table {
 };
 
 struct unwind_frame_info {
-       unsigned long sp;
-       unsigned long ip;
        struct task_struct *t;
        /* Eventually we would like to be able to get at any of the registers
           available; but for now we only try to get the sp and ip for each
           frame */
        /* struct pt_regs regs; */
+       unsigned long sp, ip, rp;
        unsigned long prev_sp, prev_ip;
 };
 
 void * unwind_table_add(const char *name, unsigned long base_addr, 
                 unsigned long gp,
-                 const void *start, const void *end);
+                 void *start, void *end);
 void unwind_frame_init(struct unwind_frame_info *info, struct task_struct *t, 
-                      struct pt_regs *regs);
+                      unsigned long sp, unsigned long ip, unsigned long rp);
 void unwind_frame_init_from_blocked_task(struct unwind_frame_info *info, struct task_struct *t);
+void unwind_frame_init_running(struct unwind_frame_info *info, struct pt_regs *regs);
 int unwind_once(struct unwind_frame_info *info);
 int unwind_to_user(struct unwind_frame_info *info);