dect
/
linux-2.6
Archived
13
0
Fork 0

Merge branch 'forlinus' of git://parisc-linux.org/home/kyle/git/parisc-2.6

This commit is contained in:
Linus Torvalds 2005-10-28 10:08:46 -07:00
commit 8ed5759043
84 changed files with 4295 additions and 2119 deletions

View File

@ -2247,6 +2247,12 @@ S: 249 Nichols Avenue
S: Syracuse, New York 13206 S: Syracuse, New York 13206
S: USA S: USA
N: Kyle McMartin
E: kyle@parisc-linux.org
D: Linux/PARISC hacker
D: AD1889 sound driver
S: Ottawa, Canada
N: Dirk Melchers N: Dirk Melchers
E: dirk@merlin.nbg.sub.org E: dirk@merlin.nbg.sub.org
D: 8 bit XT hard disk driver for OMTI5520 D: 8 bit XT hard disk driver for OMTI5520

View File

@ -197,6 +197,15 @@ M: Thorsten Knabe <linux@thorsten-knabe.de>
W: http://linux.thorsten-knabe.de W: http://linux.thorsten-knabe.de
S: Maintained S: Maintained
AD1889 SOUND DRIVER
P: Kyle McMartin
M: kyle@parisc-linux.org
P: Thibaut Varene
M: T-Bone@parisc-linux.org
W: http://wiki.parisc-linux.org/AD1889
L: parisc-linux@lists.parisc-linux.org
S: Maintained
ADM1025 HARDWARE MONITOR DRIVER ADM1025 HARDWARE MONITOR DRIVER
P: Jean Delvare P: Jean Delvare
M: khali@linux-fr.org M: khali@linux-fr.org

View File

@ -47,10 +47,10 @@ config PM
config ISA_DMA_API config ISA_DMA_API
bool bool
default y
config ARCH_MAY_HAVE_PC_FDC config ARCH_MAY_HAVE_PC_FDC
bool bool
depends on BROKEN
default y default y
source "init/Kconfig" source "init/Kconfig"
@ -154,13 +154,14 @@ config HOTPLUG_CPU
config ARCH_DISCONTIGMEM_ENABLE config ARCH_DISCONTIGMEM_ENABLE
bool "Discontiguous memory support (EXPERIMENTAL)" bool "Discontiguous memory support (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on 64BIT && EXPERIMENTAL
help help
Say Y to support efficient handling of discontiguous physical memory, Say Y to support efficient handling of discontiguous physical memory,
for architectures which are either NUMA (Non-Uniform Memory Access) for architectures which are either NUMA (Non-Uniform Memory Access)
or have huge holes in the physical address space for other reasons. or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more. See <file:Documentation/vm/numa> for more.
source "kernel/Kconfig.hz"
source "mm/Kconfig" source "mm/Kconfig"
config PREEMPT config PREEMPT

View File

@ -20,7 +20,8 @@ NM = sh $(srctree)/arch/parisc/nm
CHECKFLAGS += -D__hppa__=1 CHECKFLAGS += -D__hppa__=1
ifdef CONFIG_64BIT ifdef CONFIG_64BIT
CROSS_COMPILE := hppa64-linux- CROSS_COMPILE := $(shell if [ -x /usr/bin/hppa64-linux-gnu-gcc ]; then \
echo hppa64-linux-gnu-; else echo hppa64-linux-; fi)
UTS_MACHINE := parisc64 UTS_MACHINE := parisc64
CHECKFLAGS += -D__LP64__=1 -m64 CHECKFLAGS += -D__LP64__=1 -m64
else else
@ -34,6 +35,14 @@ FINAL_LD=$(CROSS_COMPILE)ld --warn-common --warn-section-align
OBJCOPY_FLAGS =-O binary -R .note -R .comment -S OBJCOPY_FLAGS =-O binary -R .note -R .comment -S
GCC_VERSION := $(call cc-version)
ifneq ($(shell if [ -z $(GCC_VERSION) ] ; then echo "bad"; fi ;),)
$(error Sorry, couldn't find ($(cc-version)).)
endif
ifneq ($(shell if [ $(GCC_VERSION) -lt 0303 ] ; then echo "bad"; fi ;),)
$(error Sorry, your compiler is too old ($(GCC_VERSION)). GCC v3.3 or above is required.)
endif
cflags-y := -pipe cflags-y := -pipe
# These flags should be implied by an hppa-linux configuration, but they # These flags should be implied by an hppa-linux configuration, but they
@ -43,7 +52,7 @@ cflags-y += -mno-space-regs -mfast-indirect-calls
# Currently we save and restore fpregs on all kernel entry/interruption paths. # Currently we save and restore fpregs on all kernel entry/interruption paths.
# If that gets optimized, we might need to disable the use of fpregs in the # If that gets optimized, we might need to disable the use of fpregs in the
# kernel. # kernel.
#cflags-y += -mdisable-fpregs cflags-y += -mdisable-fpregs
# Without this, "ld -r" results in .text sections that are too big # Without this, "ld -r" results in .text sections that are too big
# (> 0x40000) for branches to reach stubs. # (> 0x40000) for branches to reach stubs.

View File

@ -1,12 +1,16 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.10-pa5 # Linux kernel version: 2.6.14-rc5-pa1
# Wed Jan 5 13:20:32 2005 # Fri Oct 21 23:04:34 2005
# #
CONFIG_PARISC=y CONFIG_PARISC=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_STACK_GROWSUP=y CONFIG_STACK_GROWSUP=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# #
# Code maturity level options # Code maturity level options
@ -15,35 +19,40 @@ CONFIG_EXPERIMENTAL=y
# CONFIG_CLEAN_COMPILE is not set # CONFIG_CLEAN_COMPILE is not set
CONFIG_BROKEN=y CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32
# #
# General setup # General setup
# #
CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=16
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
CONFIG_KOBJECT_UEVENT=y CONFIG_KOBJECT_UEVENT=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_EMBEDDED is not set # CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0 CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
# #
# Loadable module support # Loadable module support
@ -65,9 +74,18 @@ CONFIG_PA7100LC=y
# CONFIG_PA7300LC is not set # CONFIG_PA7300LC is not set
# CONFIG_PA8X00 is not set # CONFIG_PA8X00 is not set
CONFIG_PA11=y CONFIG_PA11=y
# CONFIG_64BIT is not set
# CONFIG_SMP is not set # CONFIG_SMP is not set
# CONFIG_DISCONTIGMEM is not set # CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
# CONFIG_HPUX is not set # CONFIG_HPUX is not set
@ -81,8 +99,6 @@ CONFIG_GSC_LASI=y
# CONFIG_GSC_WAX is not set # CONFIG_GSC_WAX is not set
# CONFIG_EISA is not set # CONFIG_EISA is not set
# CONFIG_PCI is not set # CONFIG_PCI is not set
CONFIG_CHASSIS_LCD_LED=y
# CONFIG_PDC_CHASSIS is not set
# #
# PCCARD (PCMCIA/CardBus) support # PCCARD (PCMCIA/CardBus) support
@ -90,12 +106,15 @@ CONFIG_CHASSIS_LCD_LED=y
# CONFIG_PCCARD is not set # CONFIG_PCCARD is not set
# #
# PC-card bridges # PCI Hotplug Support
# #
# #
# PCI Hotplug Support # PA-RISC specific drivers
# #
CONFIG_CHASSIS_LCD_LED=y
# CONFIG_PDC_CHASSIS is not set
CONFIG_PDC_STABLE=y
# #
# Executable file formats # Executable file formats
@ -104,137 +123,7 @@ CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
# #
# Device Drivers # Networking
#
#
# Generic Driver Options
#
# CONFIG_STANDALONE is not set
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
CONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set
#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set
#
# Parallel port support
#
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_PC_CML1=m
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
CONFIG_PARPORT_GSC=y
# CONFIG_PARPORT_OTHER is not set
# CONFIG_PARPORT_1284 is not set
#
# Plug and Play support
#
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_PARIDE is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_CRYPTOLOOP=y
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=6144
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_CDROM_PKTCDVD is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=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 is not set
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set
#
# SCSI Transport Attributes
#
CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set
#
# SCSI low-level drivers
#
# CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
CONFIG_SCSI_LASI700=y
CONFIG_53C700_MEM_MAPPED=y
CONFIG_53C700_LE_ON_BE=y
# CONFIG_SCSI_ZALON is not set
CONFIG_SCSI_DEBUG=m
#
# Multi-device support (RAID and LVM)
#
CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
# CONFIG_MD_RAID10 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_MD_RAID6 is not set
# CONFIG_MD_MULTIPATH is not set
# CONFIG_MD_FAULTY is not set
# CONFIG_BLK_DEV_DM is not set
#
# Fusion MPT device support
#
#
# IEEE 1394 (FireWire) support
#
# CONFIG_IEEE1394 is not set
#
# I2O device support
#
#
# Networking support
# #
CONFIG_NET=y CONFIG_NET=y
@ -243,12 +132,14 @@ CONFIG_NET=y
# #
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=y
CONFIG_UNIX=y CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m CONFIG_NET_KEY=m
CONFIG_INET=y CONFIG_INET=y
CONFIG_IP_MULTICAST=y CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_PNP=y CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_BOOTP=y
@ -262,8 +153,10 @@ CONFIG_INET_AH=m
CONFIG_INET_ESP=m CONFIG_INET_ESP=m
# CONFIG_INET_IPCOMP is not set # CONFIG_INET_IPCOMP is not set
CONFIG_INET_TUNNEL=m CONFIG_INET_TUNNEL=m
CONFIG_IP_TCPDIAG=y CONFIG_INET_DIAG=m
# CONFIG_IP_TCPDIAG_IPV6 is not set CONFIG_INET_TCP_DIAG=m
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y
# #
# IP: Virtual Server Configuration # IP: Virtual Server Configuration
@ -272,6 +165,7 @@ CONFIG_IP_TCPDIAG=y
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
CONFIG_NETFILTER=y CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set # CONFIG_NETFILTER_DEBUG is not set
# CONFIG_NETFILTER_NETLINK is not set
# #
# IP: Netfilter Configuration # IP: Netfilter Configuration
@ -279,11 +173,14 @@ CONFIG_NETFILTER=y
CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_CONNTRACK=m
# CONFIG_IP_NF_CT_ACCT is not set # CONFIG_IP_NF_CT_ACCT is not set
CONFIG_IP_NF_CONNTRACK_MARK=y CONFIG_IP_NF_CONNTRACK_MARK=y
# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
CONFIG_IP_NF_CT_PROTO_SCTP=m CONFIG_IP_NF_CT_PROTO_SCTP=m
CONFIG_IP_NF_FTP=m CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m CONFIG_IP_NF_IRC=m
# CONFIG_IP_NF_NETBIOS_NS is not set
CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_AMANDA=m
# CONFIG_IP_NF_PPTP is not set
CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_LIMIT=m
@ -307,21 +204,23 @@ CONFIG_IP_NF_MATCH_OWNER=m
# CONFIG_IP_NF_MATCH_ADDRTYPE is not set # CONFIG_IP_NF_MATCH_ADDRTYPE is not set
# CONFIG_IP_NF_MATCH_REALM is not set # CONFIG_IP_NF_MATCH_REALM is not set
CONFIG_IP_NF_MATCH_SCTP=m CONFIG_IP_NF_MATCH_SCTP=m
# CONFIG_IP_NF_MATCH_DCCP is not set
CONFIG_IP_NF_MATCH_COMMENT=m CONFIG_IP_NF_MATCH_COMMENT=m
CONFIG_IP_NF_MATCH_CONNMARK=m CONFIG_IP_NF_MATCH_CONNMARK=m
CONFIG_IP_NF_MATCH_HASHLIMIT=m CONFIG_IP_NF_MATCH_HASHLIMIT=m
# CONFIG_IP_NF_MATCH_STRING is not set
CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_TARGET_TCPMSS=m
# CONFIG_IP_NF_TARGET_NFQUEUE is not set
CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_SAME=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_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_FTP=m
@ -333,6 +232,7 @@ CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_TARGET_CLASSIFY=m
# CONFIG_IP_NF_TARGET_TTL is not set
CONFIG_IP_NF_TARGET_CONNMARK=m CONFIG_IP_NF_TARGET_CONNMARK=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_RAW=m CONFIG_IP_NF_RAW=m
@ -340,10 +240,11 @@ CONFIG_IP_NF_TARGET_NOTRACK=m
CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP_NF_ARP_MANGLE=m
# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
# CONFIG_IP_NF_COMPAT_IPFWADM is not set #
CONFIG_XFRM=y # DCCP Configuration (EXPERIMENTAL)
CONFIG_XFRM_USER=m #
# CONFIG_IP_DCCP is not set
# #
# SCTP Configuration (EXPERIMENTAL) # SCTP Configuration (EXPERIMENTAL)
@ -362,10 +263,6 @@ CONFIG_LLC2=m
# CONFIG_NET_DIVERT is not set # CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set # CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set # CONFIG_WAN_ROUTER is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set # CONFIG_NET_CLS_ROUTE is not set
@ -373,17 +270,162 @@ CONFIG_LLC2=m
# Network testing # Network testing
# #
CONFIG_NET_PKTGEN=m CONFIG_NET_PKTGEN=m
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_HAMRADIO is not set # CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set # CONFIG_IRDA is not set
# CONFIG_BT is not set # CONFIG_BT is not set
# CONFIG_IEEE80211 is not set
#
# Device Drivers
#
#
# Generic Driver Options
#
# CONFIG_STANDALONE is not set
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
CONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set
#
# Memory Technology Devices (MTD)
#
# CONFIG_MTD is not set
#
# Parallel port support
#
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=m
# CONFIG_PARPORT_PC_FIFO is not set
# CONFIG_PARPORT_PC_SUPERIO is not set
CONFIG_PARPORT_GSC=y
# CONFIG_PARPORT_1284 is not set
#
# Plug and Play support
#
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_CRYPTOLOOP=y
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=6144
CONFIG_BLK_DEV_INITRD=y
# CONFIG_CDROM_PKTCDVD is not set
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_ATA_OVER_ETH=m
#
# ATA/ATAPI/MFM/RLL support
#
# CONFIG_IDE is not set
#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
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
# CONFIG_CHR_DEV_SCH is not set
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
# CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set
#
# SCSI Transport Attributes
#
CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set
CONFIG_SCSI_ISCSI_ATTRS=m
# CONFIG_SCSI_SAS_ATTRS is not set
#
# SCSI low-level drivers
#
# CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_PPA is not set
# CONFIG_SCSI_IMM is not set
CONFIG_SCSI_LASI700=y
CONFIG_53C700_LE_ON_BE=y
# CONFIG_SCSI_ZALON is not set
CONFIG_SCSI_DEBUG=m
#
# Multi-device support (RAID and LVM)
#
CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
# CONFIG_MD_RAID10 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_MD_RAID6 is not set
# CONFIG_MD_MULTIPATH is not set
# CONFIG_MD_FAULTY is not set
# CONFIG_BLK_DEV_DM is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_IEEE1394 is not set
#
# I2O device support
#
#
# Network device support
#
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
CONFIG_DUMMY=m CONFIG_DUMMY=m
CONFIG_BONDING=m CONFIG_BONDING=m
# CONFIG_EQUALIZER is not set # CONFIG_EQUALIZER is not set
CONFIG_TUN=m CONFIG_TUN=m
# CONFIG_ETHERTAP is not set
#
# PHY device support
#
# CONFIG_PHYLIB is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
@ -391,6 +433,7 @@ CONFIG_TUN=m
CONFIG_NET_ETHERNET=y CONFIG_NET_ETHERNET=y
CONFIG_MII=m CONFIG_MII=m
CONFIG_LASI_82596=y CONFIG_LASI_82596=y
# CONFIG_NET_POCKET is not set
# #
# Ethernet (1000 Mbit) # Ethernet (1000 Mbit)
@ -414,6 +457,7 @@ CONFIG_NET_RADIO=y
# #
# CONFIG_STRIP is not set # CONFIG_STRIP is not set
# CONFIG_ATMEL is not set # CONFIG_ATMEL is not set
# CONFIG_HOSTAP is not set
# #
# Wan interfaces # Wan interfaces
@ -431,6 +475,8 @@ CONFIG_PPPOE=m
# CONFIG_SLIP is not set # CONFIG_SLIP is not set
# CONFIG_SHAPER is not set # CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set # CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# #
# ISDN subsystem # ISDN subsystem
@ -459,19 +505,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_EVBUG is not set
#
# Input I/O drivers
#
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_PARKBD is not set
CONFIG_SERIO_GSCPS2=y
CONFIG_HP_SDC=y
CONFIG_HIL_MLC=y
# CONFIG_SERIO_RAW is not set
# #
# Input Device Drivers # Input Device Drivers
# #
@ -483,6 +516,7 @@ CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
# CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_NEWTON is not set
CONFIG_KEYBOARD_HIL_OLD=y
# CONFIG_KEYBOARD_HIL is not set # CONFIG_KEYBOARD_HIL is not set
CONFIG_INPUT_MOUSE=y CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2=y
@ -493,6 +527,19 @@ CONFIG_MOUSE_HIL=m
# CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set # CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_PARKBD is not set
CONFIG_SERIO_GSCPS2=y
CONFIG_HP_SDC=y
CONFIG_HIL_MLC=y
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
# CONFIG_GAMEPORT is not set
# #
# Character devices # Character devices
# #
@ -511,7 +558,6 @@ CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_RSA is not set # CONFIG_SERIAL_8250_RSA is not set
# #
@ -546,11 +592,13 @@ CONFIG_GEN_RTC_X=y
# #
# Ftape, the floppy tape device driver # Ftape, the floppy tape device driver
# #
# CONFIG_AGP is not set
# CONFIG_DRM is not set
CONFIG_RAW_DRIVER=y CONFIG_RAW_DRIVER=y
CONFIG_MAX_RAW_DEVS=256 CONFIG_MAX_RAW_DEVS=256
#
# TPM devices
#
# #
# I2C support # I2C support
# #
@ -561,10 +609,20 @@ CONFIG_MAX_RAW_DEVS=256
# #
# CONFIG_W1 is not set # CONFIG_W1 is not set
#
# Hardware Monitoring support
#
# CONFIG_HWMON is not set
# CONFIG_HWMON_VID is not set
# #
# Misc devices # Misc devices
# #
#
# Multimedia Capabilities Port drivers
#
# #
# Multimedia devices # Multimedia devices
# #
@ -579,28 +637,36 @@ CONFIG_MAX_RAW_DEVS=256
# Graphics support # Graphics support
# #
CONFIG_FB=y CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SOFT_CURSOR=y
# CONFIG_FB_MACMODES is not set
CONFIG_FB_MODE_HELPERS=y CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y CONFIG_FB_TILEBLITTING=y
CONFIG_FB_STI=y CONFIG_FB_STI=y
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_VIRTUAL is not set # CONFIG_FB_VIRTUAL is not set
# #
# Console display driver support # Console display driver support
# #
CONFIG_STI_CONSOLE=y CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=128 CONFIG_DUMMY_CONSOLE_COLUMNS=128
CONFIG_DUMMY_CONSOLE_ROWS=48 CONFIG_DUMMY_CONSOLE_ROWS=48
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_STI_CONSOLE=y
CONFIG_FONTS=y CONFIG_FONTS=y
CONFIG_FONT_8x8=y CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y CONFIG_FONT_8x16=y
# CONFIG_FONT_6x11 is not set # CONFIG_FONT_6x11 is not set
# CONFIG_FONT_7x14 is not set
# CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_PEARL_8x8 is not set
# CONFIG_FONT_ACORN_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set
# CONFIG_FONT_MINI_4x6 is not set # CONFIG_FONT_MINI_4x6 is not set
# CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN8x16 is not set
# CONFIG_FONT_SUN12x22 is not set # CONFIG_FONT_SUN12x22 is not set
# CONFIG_FONT_10x18 is not set
# #
# Logo configuration # Logo configuration
@ -610,6 +676,7 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_VGA16 is not set # CONFIG_LOGO_LINUX_VGA16 is not set
# CONFIG_LOGO_LINUX_CLUT224 is not set # CONFIG_LOGO_LINUX_CLUT224 is not set
CONFIG_LOGO_PARISC_CLUT224=y CONFIG_LOGO_PARISC_CLUT224=y
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
# #
# Sound # Sound
@ -656,10 +723,6 @@ CONFIG_SND_HARMONY=y
# CONFIG_USB_ARCH_HAS_HCD is not set # CONFIG_USB_ARCH_HAS_HCD is not set
# CONFIG_USB_ARCH_HAS_OHCI is not set # CONFIG_USB_ARCH_HAS_OHCI is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
# #
# USB Gadget Support # USB Gadget Support
# #
@ -670,11 +733,21 @@ CONFIG_SND_HARMONY=y
# #
# CONFIG_MMC is not set # CONFIG_MMC is not set
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set
#
# SN Devices
#
# #
# File systems # File systems
# #
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set # CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set # CONFIG_EXT3_FS_XATTR is not set
CONFIG_JBD=y CONFIG_JBD=y
@ -682,20 +755,24 @@ CONFIG_JBD=y
# CONFIG_REISERFS_FS is not set # CONFIG_REISERFS_FS is not set
CONFIG_JFS_FS=m CONFIG_JFS_FS=m
# CONFIG_JFS_POSIX_ACL is not set # CONFIG_JFS_POSIX_ACL is not set
# CONFIG_JFS_SECURITY is not set
# CONFIG_JFS_DEBUG is not set # CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set # CONFIG_JFS_STATISTICS is not set
CONFIG_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_FS=m CONFIG_XFS_FS=m
# CONFIG_XFS_RT is not set CONFIG_XFS_EXPORT=y
# CONFIG_XFS_QUOTA is not set # CONFIG_XFS_QUOTA is not set
# CONFIG_XFS_SECURITY is not set # CONFIG_XFS_SECURITY is not set
# CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_POSIX_ACL is not set
# CONFIG_XFS_RT is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set # CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set # CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
# #
# CD-ROM/DVD Filesystems # CD-ROM/DVD Filesystems
@ -722,14 +799,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y CONFIG_TMPFS=y
CONFIG_TMPFS_XATTR=y
# CONFIG_TMPFS_SECURITY is not set
# CONFIG_HUGETLBFS is not set # CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# #
# Miscellaneous filesystems # Miscellaneous filesystems
@ -754,16 +828,19 @@ CONFIG_UFS_FS=m
# #
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
CONFIG_NFS_V3=y CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y CONFIG_NFS_V4=y
CONFIG_NFS_DIRECTIO=y CONFIG_NFS_DIRECTIO=y
CONFIG_NFSD=m CONFIG_NFSD=m
CONFIG_NFSD_V3=y CONFIG_NFSD_V3=y
# CONFIG_NFSD_V3_ACL is not set
CONFIG_NFSD_V4=y CONFIG_NFSD_V4=y
CONFIG_NFSD_TCP=y CONFIG_NFSD_TCP=y
CONFIG_ROOT_NFS=y CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=m CONFIG_EXPORTFS=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_GSS=y
CONFIG_RPCSEC_GSS_KRB5=y CONFIG_RPCSEC_GSS_KRB5=y
@ -778,6 +855,7 @@ CONFIG_CIFS=m
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set # CONFIG_AFS_FS is not set
# CONFIG_9P_FS is not set
# #
# Partition Types # Partition Types
@ -838,13 +916,19 @@ CONFIG_OPROFILE=m
# #
# Kernel hacking # Kernel hacking
# #
# CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_LOG_BUF_SHIFT=16
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_IOREMAP is not set
# CONFIG_DEBUG_FS is not set
# #
# Security options # Security options
@ -865,6 +949,7 @@ CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_WP512=m CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_TWOFISH=m
@ -881,10 +966,15 @@ CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_CRC32C=m CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_TEST=m
#
# Hardware crypto devices
#
# #
# Library routines # Library routines
# #
CONFIG_CRC_CCITT=m CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
CONFIG_CRC32=y CONFIG_CRC32=y
CONFIG_LIBCRC32C=m CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_INFLATE=m

View File

@ -1,7 +1,7 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.11-rc4-pa1 # Linux kernel version: 2.6.14-rc5-pa1
# Wed Feb 16 11:32:49 2005 # Fri Oct 21 23:04:54 2005
# #
CONFIG_PARISC=y CONFIG_PARISC=y
CONFIG_MMU=y CONFIG_MMU=y
@ -10,6 +10,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# #
# Code maturity level options # Code maturity level options
@ -19,26 +20,32 @@ CONFIG_EXPERIMENTAL=y
CONFIG_BROKEN=y CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_LOCK_KERNEL=y CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
# #
# General setup # General setup
# #
CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=16
CONFIG_HOTPLUG=y CONFIG_HOTPLUG=y
CONFIG_KOBJECT_UEVENT=y CONFIG_KOBJECT_UEVENT=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
# CONFIG_CPUSETS is not set
CONFIG_INITRAMFS_SOURCE=""
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ALL=y
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@ -48,6 +55,7 @@ CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0 CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
# #
# Loadable module support # Loadable module support
@ -74,7 +82,19 @@ CONFIG_PREFETCH=y
CONFIG_64BIT=y CONFIG_64BIT=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_HOTPLUG_CPU=y CONFIG_HOTPLUG_CPU=y
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
CONFIG_DISCONTIGMEM_MANUAL=y
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_DISCONTIGMEM=y CONFIG_DISCONTIGMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_NEED_MULTIPLE_NODES=y
# CONFIG_SPARSEMEM_STATIC is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
CONFIG_COMPAT=y CONFIG_COMPAT=y
CONFIG_NR_CPUS=8 CONFIG_NR_CPUS=8
@ -85,7 +105,7 @@ CONFIG_NR_CPUS=8
# CONFIG_GSC is not set # CONFIG_GSC is not set
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y # CONFIG_PCI_DEBUG is not set
CONFIG_PCI_LBA=y CONFIG_PCI_LBA=y
CONFIG_IOSAPIC=y CONFIG_IOSAPIC=y
CONFIG_IOMMU_SBA=y CONFIG_IOMMU_SBA=y
@ -96,6 +116,8 @@ CONFIG_IOMMU_SBA=y
CONFIG_PCCARD=m CONFIG_PCCARD=m
# CONFIG_PCMCIA_DEBUG is not set # CONFIG_PCMCIA_DEBUG is not set
CONFIG_PCMCIA=m CONFIG_PCMCIA=m
# CONFIG_PCMCIA_LOAD_CIS is not set
CONFIG_PCMCIA_IOCTL=y
CONFIG_CARDBUS=y CONFIG_CARDBUS=y
# #
@ -104,7 +126,6 @@ CONFIG_CARDBUS=y
CONFIG_YENTA=m CONFIG_YENTA=m
CONFIG_PD6729=m CONFIG_PD6729=m
CONFIG_I82092=m CONFIG_I82092=m
CONFIG_TCIC=m
CONFIG_PCCARD_NONSTATIC=m CONFIG_PCCARD_NONSTATIC=m
# #
@ -126,6 +147,203 @@ CONFIG_PDC_STABLE=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set # CONFIG_BINFMT_MISC is not set
#
# Networking
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
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
CONFIG_INET_TUNNEL=m
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y
#
# IP: Virtual Server Configuration
#
# CONFIG_IP_VS is not set
CONFIG_IPV6=m
# CONFIG_IPV6_PRIVACY is not set
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_INET6_TUNNEL=m
CONFIG_IPV6_TUNNEL=m
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
# CONFIG_NETFILTER_NETLINK is not set
#
# IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=m
# CONFIG_IP_NF_CT_ACCT is not set
CONFIG_IP_NF_CONNTRACK_MARK=y
# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
CONFIG_IP_NF_CT_PROTO_SCTP=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m
# CONFIG_IP_NF_NETBIOS_NS is not set
CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_AMANDA=m
# CONFIG_IP_NF_PPTP is not set
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_MATCH_ADDRTYPE is not set
# CONFIG_IP_NF_MATCH_REALM is not set
CONFIG_IP_NF_MATCH_SCTP=m
# CONFIG_IP_NF_MATCH_DCCP is not set
CONFIG_IP_NF_MATCH_COMMENT=m
CONFIG_IP_NF_MATCH_CONNMARK=m
CONFIG_IP_NF_MATCH_HASHLIMIT=m
# CONFIG_IP_NF_MATCH_STRING is not set
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
# CONFIG_IP_NF_TARGET_NFQUEUE is not set
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_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_TTL is not set
CONFIG_IP_NF_TARGET_CONNMARK=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_TARGET_NOTRACK=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
#
# IPv6: Netfilter Configuration (EXPERIMENTAL)
#
# CONFIG_IP6_NF_QUEUE is not set
CONFIG_IP6_NF_IPTABLES=m
# CONFIG_IP6_NF_MATCH_LIMIT is not set
CONFIG_IP6_NF_MATCH_MAC=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_HL=m
# CONFIG_IP6_NF_MATCH_MULTIPORT is not set
# CONFIG_IP6_NF_MATCH_OWNER is not set
# CONFIG_IP6_NF_MATCH_MARK is not set
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
# CONFIG_IP6_NF_MATCH_AHESP is not set
# CONFIG_IP6_NF_MATCH_LENGTH is not set
# CONFIG_IP6_NF_MATCH_EUI64 is not set
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_TARGET_REJECT=m
# CONFIG_IP6_NF_TARGET_NFQUEUE is not set
CONFIG_IP6_NF_MANGLE=m
# CONFIG_IP6_NF_TARGET_MARK is not set
# CONFIG_IP6_NF_TARGET_HL is not set
CONFIG_IP6_NF_RAW=m
#
# DCCP Configuration (EXPERIMENTAL)
#
CONFIG_IP_DCCP=m
CONFIG_INET_DCCP_DIAG=m
#
# DCCP CCIDs Configuration (EXPERIMENTAL)
#
# CONFIG_IP_DCCP_CCID3 is not set
#
# DCCP Kernel Hacking
#
# CONFIG_IP_DCCP_DEBUG is not set
#
# 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_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
#
# Network testing
#
CONFIG_NET_PKTGEN=m
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_IEEE80211 is not set
# #
# Device Drivers # Device Drivers
# #
@ -138,6 +356,11 @@ CONFIG_BINFMT_ELF=y
CONFIG_FW_LOADER=y CONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set
# #
# Memory Technology Devices (MTD) # Memory Technology Devices (MTD)
# #
@ -169,7 +392,6 @@ CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=6144 CONFIG_BLK_DEV_RAM_SIZE=6144
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_CDROM_PKTCDVD is not set # CONFIG_CDROM_PKTCDVD is not set
# #
@ -189,6 +411,7 @@ CONFIG_IOSCHED_CFQ=y
# #
# SCSI device support # SCSI device support
# #
CONFIG_RAID_ATTRS=m
CONFIG_SCSI=y CONFIG_SCSI=y
CONFIG_SCSI_PROC_FS=y CONFIG_SCSI_PROC_FS=y
@ -201,6 +424,7 @@ CONFIG_CHR_DEV_ST=y
CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not set # CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SG=y
# CONFIG_CHR_DEV_SCH is not set
# #
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@ -215,6 +439,7 @@ CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_SPI_ATTRS=y CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_FC_ATTRS=m CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_ISCSI_ATTRS=m CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
# #
# SCSI low-level drivers # SCSI low-level drivers
@ -229,14 +454,12 @@ CONFIG_SCSI_ISCSI_ATTRS=m
# CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ADVANSYS is not set
# CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
# CONFIG_SCSI_SATA is not set # CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_CPQFCTS is not set
# CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_INIA100 is not set
@ -246,8 +469,6 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
# CONFIG_SCSI_IPR is not set # CONFIG_SCSI_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_ISP is not set
CONFIG_SCSI_QLOGIC_FC=m CONFIG_SCSI_QLOGIC_FC=m
# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set # CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
@ -258,7 +479,9 @@ CONFIG_SCSI_QLA2XXX=y
# CONFIG_SCSI_QLA22XX is not set # CONFIG_SCSI_QLA22XX is not set
CONFIG_SCSI_QLA2300=m CONFIG_SCSI_QLA2300=m
CONFIG_SCSI_QLA2322=m CONFIG_SCSI_QLA2322=m
CONFIG_SCSI_QLA6312=m # CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_QLA24XX is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_DC390T is not set
CONFIG_SCSI_DEBUG=m CONFIG_SCSI_DEBUG=m
@ -288,8 +511,11 @@ CONFIG_MD_RAID1=y
# #
# Fusion MPT device support # Fusion MPT device support
# #
CONFIG_FUSION=m CONFIG_FUSION=y
CONFIG_FUSION_MAX_SGE=40 CONFIG_FUSION_SPI=m
CONFIG_FUSION_FC=m
# CONFIG_FUSION_SAS is not set
CONFIG_FUSION_MAX_SGE=128
CONFIG_FUSION_CTL=m CONFIG_FUSION_CTL=m
# #
@ -303,159 +529,24 @@ CONFIG_FUSION_CTL=m
# CONFIG_I2O is not set # CONFIG_I2O is not set
# #
# Networking support # Network device 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
CONFIG_INET_TUNNEL=m
CONFIG_IP_TCPDIAG=y
# CONFIG_IP_TCPDIAG_IPV6 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_CT_ACCT is not set
CONFIG_IP_NF_CONNTRACK_MARK=y
CONFIG_IP_NF_CT_PROTO_SCTP=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_MATCH_ADDRTYPE is not set
# CONFIG_IP_NF_MATCH_REALM is not set
CONFIG_IP_NF_MATCH_SCTP=m
CONFIG_IP_NF_MATCH_COMMENT=m
CONFIG_IP_NF_MATCH_CONNMARK=m
CONFIG_IP_NF_MATCH_HASHLIMIT=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=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_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_CONNMARK=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_TARGET_NOTRACK=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=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
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE 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_NETDEVICES=y
CONFIG_DUMMY=m CONFIG_DUMMY=m
CONFIG_BONDING=m CONFIG_BONDING=m
# CONFIG_EQUALIZER is not set # CONFIG_EQUALIZER is not set
CONFIG_TUN=m CONFIG_TUN=m
# CONFIG_ETHERTAP is not set
# #
# ARCnet devices # ARCnet devices
# #
# CONFIG_ARCNET is not set # CONFIG_ARCNET is not set
#
# PHY device support
#
# CONFIG_PHYLIB is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
# #
@ -463,6 +554,7 @@ CONFIG_NET_ETHERNET=y
CONFIG_MII=m CONFIG_MII=m
# CONFIG_HAPPYMEAL is not set # CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set # CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set
CONFIG_NET_VENDOR_3COM=y CONFIG_NET_VENDOR_3COM=y
CONFIG_VORTEX=m CONFIG_VORTEX=m
CONFIG_TYPHOON=m CONFIG_TYPHOON=m
@ -479,6 +571,7 @@ CONFIG_TULIP_MMIO=y
# CONFIG_DE4X5 is not set # CONFIG_DE4X5 is not set
# CONFIG_WINBOND_840 is not set # CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set # CONFIG_DM9102 is not set
# CONFIG_ULI526X is not set
CONFIG_PCMCIA_XIRCOM=m CONFIG_PCMCIA_XIRCOM=m
# CONFIG_PCMCIA_XIRTULIP is not set # CONFIG_PCMCIA_XIRTULIP is not set
CONFIG_HP100=m CONFIG_HP100=m
@ -489,48 +582,43 @@ CONFIG_PCNET32=m
# CONFIG_B44 is not set # CONFIG_B44 is not set
# CONFIG_FORCEDETH is not set # CONFIG_FORCEDETH is not set
# CONFIG_DGRS is not set # CONFIG_DGRS is not set
CONFIG_EEPRO100=m # CONFIG_EEPRO100 is not set
CONFIG_E100=m CONFIG_E100=m
CONFIG_E100_NAPI=y
# CONFIG_FEALNX is not set # CONFIG_FEALNX is not set
CONFIG_NATSEMI=m # CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set # CONFIG_NE2K_PCI is not set
# CONFIG_8139CP is not set # CONFIG_8139CP is not set
CONFIG_8139TOO=m # CONFIG_8139TOO is not set
# 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_SIS900 is not set
CONFIG_EPIC100=m # CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set # CONFIG_SUNDANCE is not set
CONFIG_VIA_RHINE=m # CONFIG_VIA_RHINE is not set
CONFIG_VIA_RHINE_MMIO=y
# #
# Ethernet (1000 Mbit) # Ethernet (1000 Mbit)
# #
CONFIG_ACENIC=m CONFIG_ACENIC=m
CONFIG_ACENIC_OMIT_TIGON_I=y CONFIG_ACENIC_OMIT_TIGON_I=y
CONFIG_DL2K=m # CONFIG_DL2K is not set
CONFIG_E1000=m CONFIG_E1000=m
CONFIG_E1000_NAPI=y CONFIG_E1000_NAPI=y
# CONFIG_NS83820 is not set # CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set # CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set # CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set # CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SKGE is not set
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set # CONFIG_VIA_VELOCITY is not set
CONFIG_TIGON3=m CONFIG_TIGON3=m
# CONFIG_BNX2 is not set
# #
# Ethernet (10000 Mbit) # Ethernet (10000 Mbit)
# #
CONFIG_IXGB=m # CONFIG_CHELSIO_T1 is not set
CONFIG_IXGB_NAPI=y # CONFIG_IXGB is not set
CONFIG_S2IO=m # CONFIG_S2IO is not set
CONFIG_S2IO_NAPI=y
# CONFIG_2BUFF_MODE is not set
# #
# Token Ring devices # Token Ring devices
@ -560,6 +648,7 @@ CONFIG_PCMCIA_RAYCS=m
CONFIG_HERMES=m CONFIG_HERMES=m
CONFIG_PLX_HERMES=m CONFIG_PLX_HERMES=m
CONFIG_TMD_HERMES=m CONFIG_TMD_HERMES=m
# CONFIG_NORTEL_HERMES is not set
CONFIG_PCI_HERMES=m CONFIG_PCI_HERMES=m
# CONFIG_ATMEL is not set # CONFIG_ATMEL is not set
@ -567,6 +656,7 @@ CONFIG_PCI_HERMES=m
# Wireless 802.11b Pcmcia/Cardbus cards support # Wireless 802.11b Pcmcia/Cardbus cards support
# #
CONFIG_PCMCIA_HERMES=m CONFIG_PCMCIA_HERMES=m
# CONFIG_PCMCIA_SPECTRUM is not set
CONFIG_AIRO_CS=m CONFIG_AIRO_CS=m
CONFIG_PCMCIA_WL3501=m CONFIG_PCMCIA_WL3501=m
@ -574,6 +664,7 @@ CONFIG_PCMCIA_WL3501=m
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
# #
# CONFIG_PRISM54 is not set # CONFIG_PRISM54 is not set
# CONFIG_HOSTAP is not set
CONFIG_NET_WIRELESS=y CONFIG_NET_WIRELESS=y
# #
@ -607,6 +698,8 @@ CONFIG_PPP_BSDCOMP=m
# CONFIG_NET_FC is not set # CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set # CONFIG_SHAPER is not set
# CONFIG_NETCONSOLE is not set # CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# #
# ISDN subsystem # ISDN subsystem
@ -632,13 +725,6 @@ CONFIG_INPUT=y
# CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_EVDEV is not set
# CONFIG_INPUT_EVBUG 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 # Input Device Drivers
# #
@ -648,6 +734,12 @@ CONFIG_SOUND_GAMEPORT=y
# CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_INPUT_MISC is not set # CONFIG_INPUT_MISC is not set
#
# Hardware I/O ports
#
# CONFIG_SERIO is not set
# CONFIG_GAMEPORT is not set
# #
# Character devices # Character devices
# #
@ -667,7 +759,6 @@ CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_RSA is not set # CONFIG_SERIAL_8250_RSA is not set
# #
@ -677,6 +768,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_PDC_CONSOLE=y CONFIG_PDC_CONSOLE=y
CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set # CONFIG_LEGACY_PTYS is not set
@ -707,6 +799,11 @@ CONFIG_GEN_RTC_X=y
CONFIG_RAW_DRIVER=y CONFIG_RAW_DRIVER=y
CONFIG_MAX_RAW_DEVS=256 CONFIG_MAX_RAW_DEVS=256
#
# TPM devices
#
# CONFIG_TCG_TPM is not set
# #
# I2C support # I2C support
# #
@ -717,10 +814,20 @@ CONFIG_MAX_RAW_DEVS=256
# #
# CONFIG_W1 is not set # CONFIG_W1 is not set
#
# Hardware Monitoring support
#
# CONFIG_HWMON is not set
# CONFIG_HWMON_VID is not set
# #
# Misc devices # Misc devices
# #
#
# Multimedia Capabilities Port drivers
#
# #
# Multimedia devices # Multimedia devices
# #
@ -742,6 +849,7 @@ CONFIG_MAX_RAW_DEVS=256
CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=160 CONFIG_DUMMY_CONSOLE_COLUMNS=160
CONFIG_DUMMY_CONSOLE_ROWS=64 CONFIG_DUMMY_CONSOLE_ROWS=64
# CONFIG_STI_CONSOLE is not set
# #
# Sound # Sound
@ -751,13 +859,9 @@ CONFIG_DUMMY_CONSOLE_ROWS=64
# #
# USB support # USB support
# #
# CONFIG_USB is not set
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
# CONFIG_USB is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
# #
# USB Gadget Support # USB Gadget Support
@ -772,17 +876,18 @@ CONFIG_USB_ARCH_HAS_OHCI=y
# #
# InfiniBand support # InfiniBand support
# #
CONFIG_INFINIBAND=m # CONFIG_INFINIBAND is not set
CONFIG_INFINIBAND_MTHCA=m
# CONFIG_INFINIBAND_MTHCA_DEBUG is not set #
CONFIG_INFINIBAND_IPOIB=m # SN Devices
# CONFIG_INFINIBAND_IPOIB_DEBUG is not set #
# #
# File systems # File systems
# #
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set # CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set # CONFIG_EXT3_FS_XATTR is not set
CONFIG_JBD=y CONFIG_JBD=y
@ -794,22 +899,20 @@ CONFIG_JFS_FS=m
# CONFIG_JFS_DEBUG is not set # CONFIG_JFS_DEBUG is not set
# CONFIG_JFS_STATISTICS is not set # CONFIG_JFS_STATISTICS is not set
CONFIG_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y
#
# XFS support
#
CONFIG_XFS_FS=m CONFIG_XFS_FS=m
CONFIG_XFS_EXPORT=y CONFIG_XFS_EXPORT=y
# CONFIG_XFS_RT is not set
# CONFIG_XFS_QUOTA is not set # CONFIG_XFS_QUOTA is not set
# CONFIG_XFS_SECURITY is not set # CONFIG_XFS_SECURITY is not set
# CONFIG_XFS_POSIX_ACL is not set # CONFIG_XFS_POSIX_ACL is not set
# CONFIG_XFS_RT is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set # CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set # CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
# #
# CD-ROM/DVD Filesystems # CD-ROM/DVD Filesystems
@ -836,13 +939,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_TMPFS_XATTR is not set
# CONFIG_HUGETLBFS is not set # CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# #
# Miscellaneous filesystems # Miscellaneous filesystems
@ -867,15 +968,18 @@ CONFIG_UFS_FS=m
# #
CONFIG_NFS_FS=m CONFIG_NFS_FS=m
CONFIG_NFS_V3=y CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y CONFIG_NFS_V4=y
CONFIG_NFS_DIRECTIO=y CONFIG_NFS_DIRECTIO=y
CONFIG_NFSD=m CONFIG_NFSD=m
CONFIG_NFSD_V3=y CONFIG_NFSD_V3=y
# CONFIG_NFSD_V3_ACL is not set
CONFIG_NFSD_V4=y CONFIG_NFSD_V4=y
CONFIG_NFSD_TCP=y CONFIG_NFSD_TCP=y
CONFIG_LOCKD=m CONFIG_LOCKD=m
CONFIG_LOCKD_V4=y CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=m CONFIG_EXPORTFS=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=m CONFIG_SUNRPC=m
CONFIG_SUNRPC_GSS=m CONFIG_SUNRPC_GSS=m
CONFIG_RPCSEC_GSS_KRB5=m CONFIG_RPCSEC_GSS_KRB5=m
@ -890,6 +994,7 @@ CONFIG_CIFS=m
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set # CONFIG_AFS_FS is not set
# CONFIG_9P_FS is not set
# #
# Partition Types # Partition Types
@ -906,15 +1011,15 @@ CONFIG_NLS_CODEPAGE_437=m
# CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_775 is not set
CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m # CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_862 is not set
CONFIG_NLS_CODEPAGE_863=m # CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_864 is not set
CONFIG_NLS_CODEPAGE_865=m # CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_936 is not set
@ -926,10 +1031,10 @@ CONFIG_NLS_CODEPAGE_865=m
# CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set # CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ASCII is not set # CONFIG_NLS_ASCII is not set
CONFIG_NLS_ISO8859_1=m # CONFIG_NLS_ISO8859_1 is not set
CONFIG_NLS_ISO8859_2=m # CONFIG_NLS_ISO8859_2 is not set
CONFIG_NLS_ISO8859_3=m # CONFIG_NLS_ISO8859_3 is not set
CONFIG_NLS_ISO8859_4=m # CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_7 is not set
@ -950,11 +1055,15 @@ CONFIG_OPROFILE=m
# #
# Kernel hacking # Kernel hacking
# #
# CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_LOG_BUF_SHIFT=16
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_IOREMAP is not set # CONFIG_DEBUG_IOREMAP is not set
@ -974,25 +1083,26 @@ CONFIG_KEYS_DEBUG_PROC_KEYS=y
CONFIG_CRYPTO=y CONFIG_CRYPTO=y
CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m # CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=m CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_SHA256=m # CONFIG_CRYPTO_SHA256 is not set
CONFIG_CRYPTO_SHA512=m # CONFIG_CRYPTO_SHA512 is not set
CONFIG_CRYPTO_WP512=m # CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_TGR192 is not set
CONFIG_CRYPTO_DES=m CONFIG_CRYPTO_DES=m
CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m # CONFIG_CRYPTO_TWOFISH is not set
CONFIG_CRYPTO_SERPENT=m # CONFIG_CRYPTO_SERPENT is not set
CONFIG_CRYPTO_AES=m # CONFIG_CRYPTO_AES is not set
CONFIG_CRYPTO_CAST5=m # CONFIG_CRYPTO_CAST5 is not set
CONFIG_CRYPTO_CAST6=m # CONFIG_CRYPTO_CAST6 is not set
CONFIG_CRYPTO_TEA=m # CONFIG_CRYPTO_TEA is not set
CONFIG_CRYPTO_ARC4=m # CONFIG_CRYPTO_ARC4 is not set
CONFIG_CRYPTO_KHAZAD=m # CONFIG_CRYPTO_KHAZAD is not set
CONFIG_CRYPTO_ANUBIS=m # CONFIG_CRYPTO_ANUBIS is not set
CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_MICHAEL_MIC=m # CONFIG_CRYPTO_MICHAEL_MIC is not set
CONFIG_CRYPTO_CRC32C=m CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_TEST=m
@ -1004,6 +1114,7 @@ CONFIG_CRYPTO_TEST=m
# Library routines # Library routines
# #
CONFIG_CRC_CCITT=m CONFIG_CRC_CCITT=m
# CONFIG_CRC16 is not set
CONFIG_CRC32=y CONFIG_CRC32=y
CONFIG_LIBCRC32C=m CONFIG_LIBCRC32C=m
CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_INFLATE=m

View File

@ -1,12 +1,15 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.10-pa5 # Linux kernel version: 2.6.14-rc5-pa1
# Wed Jan 5 13:35:54 2005 # Fri Oct 21 23:06:10 2005
# #
CONFIG_PARISC=y CONFIG_PARISC=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_STACK_GROWSUP=y CONFIG_STACK_GROWSUP=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
# #
# Code maturity level options # Code maturity level options
@ -14,33 +17,39 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_EXPERIMENTAL is not set # CONFIG_EXPERIMENTAL is not set
CONFIG_CLEAN_COMPILE=y CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32
# #
# General setup # General setup
# #
CONFIG_LOCALVERSION="" CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SWAP=y CONFIG_SWAP=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
CONFIG_LOG_BUF_SHIFT=16
# CONFIG_HOTPLUG is not set # CONFIG_HOTPLUG is not set
CONFIG_KOBJECT_UEVENT=y CONFIG_KOBJECT_UEVENT=y
# CONFIG_IKCONFIG is not set CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_EMBEDDED is not set # CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SHMEM=y CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0 CONFIG_CC_ALIGN_JUMPS=0
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
# #
# Loadable module support # Loadable module support
@ -60,8 +69,14 @@ CONFIG_PA7100LC=y
# CONFIG_PA7300LC is not set # CONFIG_PA7300LC is not set
# CONFIG_PA8X00 is not set # CONFIG_PA8X00 is not set
CONFIG_PA11=y CONFIG_PA11=y
# CONFIG_64BIT is not set
# CONFIG_SMP is not set # CONFIG_SMP is not set
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
# CONFIG_HPUX is not set # CONFIG_HPUX is not set
@ -78,11 +93,25 @@ CONFIG_EISA_NAMES=y
CONFIG_ISA=y CONFIG_ISA=y
CONFIG_PCI=y CONFIG_PCI=y
CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_LEGACY_PROC=y
CONFIG_PCI_NAMES=y # CONFIG_PCI_DEBUG is not set
CONFIG_GSC_DINO=y CONFIG_GSC_DINO=y
# CONFIG_PCI_LBA is not set # CONFIG_PCI_LBA is not set
#
# PCCARD (PCMCIA/CardBus) support
#
# CONFIG_PCCARD is not set
#
# PCI Hotplug Support
#
#
# PA-RISC specific drivers
#
CONFIG_CHASSIS_LCD_LED=y CONFIG_CHASSIS_LCD_LED=y
# CONFIG_PDC_CHASSIS is not set # CONFIG_PDC_CHASSIS is not set
CONFIG_PDC_STABLE=y
# #
# Executable file formats # Executable file formats
@ -90,6 +119,64 @@ CONFIG_CHASSIS_LCD_LED=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set # CONFIG_BINFMT_MISC is not set
#
# Networking
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_PNP=y
# CONFIG_IP_PNP_DHCP is not set
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_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_TUNNEL is not set
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
# CONFIG_TCP_CONG_ADVANCED is not set
CONFIG_TCP_CONG_BIC=y
CONFIG_IPV6=y
# CONFIG_IPV6_PRIVACY is not set
# CONFIG_INET6_AH is not set
# CONFIG_INET6_ESP is not set
# CONFIG_INET6_IPCOMP is not set
# CONFIG_INET6_TUNNEL is not set
# CONFIG_IPV6_TUNNEL 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
# CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_HAMRADIO is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_IEEE80211 is not set
# #
# Device Drivers # Device Drivers
# #
@ -99,8 +186,14 @@ CONFIG_BINFMT_ELF=y
# #
CONFIG_STANDALONE=y CONFIG_STANDALONE=y
# CONFIG_PREVENT_FIRMWARE_BUILD is not set # CONFIG_PREVENT_FIRMWARE_BUILD is not set
# CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set
# #
# Memory Technology Devices (MTD) # Memory Technology Devices (MTD)
# #
@ -111,10 +204,8 @@ CONFIG_STANDALONE=y
# #
CONFIG_PARPORT=y CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y CONFIG_PARPORT_PC=y
CONFIG_PARPORT_PC_CML1=y
# CONFIG_PARPORT_SERIAL is not set # CONFIG_PARPORT_SERIAL is not set
CONFIG_PARPORT_GSC=y CONFIG_PARPORT_GSC=y
# CONFIG_PARPORT_OTHER is not set
# CONFIG_PARPORT_1284 is not set # CONFIG_PARPORT_1284 is not set
# #
@ -125,19 +216,17 @@ CONFIG_PARPORT_GSC=y
# #
# Block devices # Block devices
# #
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set # CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_CRYPTOLOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y
# CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_RAM is not set # CONFIG_BLK_DEV_RAM is not set
CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_INITRAMFS_SOURCE=""
CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD=m
CONFIG_CDROM_PKTCDVD_BUFFERS=8 CONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set # CONFIG_CDROM_PKTCDVD_WCACHE is not set
@ -149,6 +238,7 @@ CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y CONFIG_IOSCHED_CFQ=y
CONFIG_ATA_OVER_ETH=y
# #
# ATA/ATAPI/MFM/RLL support # ATA/ATAPI/MFM/RLL support
@ -158,6 +248,7 @@ CONFIG_IOSCHED_CFQ=y
# #
# SCSI device support # SCSI device support
# #
# CONFIG_RAID_ATTRS is not set
CONFIG_SCSI=y CONFIG_SCSI=y
CONFIG_SCSI_PROC_FS=y CONFIG_SCSI_PROC_FS=y
@ -170,6 +261,7 @@ CONFIG_CHR_DEV_ST=y
CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not set # CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SG=y
# CONFIG_CHR_DEV_SCH is not set
# #
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@ -183,16 +275,16 @@ CONFIG_CHR_DEV_SG=y
# #
CONFIG_SCSI_SPI_ATTRS=y CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set
# CONFIG_SCSI_ISCSI_ATTRS is not set
# CONFIG_SCSI_SAS_ATTRS is not set
# #
# SCSI low-level drivers # SCSI low-level drivers
# #
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_7000FASST is not set
# CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AHA152X is not set # CONFIG_SCSI_AHA152X is not set
# CONFIG_SCSI_AHA1542 is not set
# CONFIG_SCSI_AHA1740 is not set # CONFIG_SCSI_AHA1740 is not set
# CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX is not set
@ -202,14 +294,11 @@ CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_IN2000 is not set
# CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
# CONFIG_SCSI_SATA is not set # CONFIG_SCSI_SATA is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_DTC3280 is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_EATA_PIO is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_GENERIC_NCR5380 is not set # CONFIG_SCSI_GENERIC_NCR5380 is not set
# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set # CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_IPS is not set
@ -219,7 +308,6 @@ CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_IMM is not set # CONFIG_SCSI_IMM is not set
# CONFIG_SCSI_NCR53C406A is not set # CONFIG_SCSI_NCR53C406A is not set
CONFIG_SCSI_LASI700=y CONFIG_SCSI_LASI700=y
CONFIG_53C700_MEM_MAPPED=y
CONFIG_53C700_LE_ON_BE=y CONFIG_53C700_LE_ON_BE=y
CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
@ -231,7 +319,6 @@ CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PAS16 is not set
# CONFIG_SCSI_PSI240I is not set # CONFIG_SCSI_PSI240I is not set
# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_FAS is not set
# CONFIG_SCSI_QLOGIC_ISP is not set
# CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_FC is not set
# CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLOGIC_1280 is not set
CONFIG_SCSI_QLA2XXX=y CONFIG_SCSI_QLA2XXX=y
@ -240,12 +327,12 @@ CONFIG_SCSI_QLA2XXX=y
# CONFIG_SCSI_QLA2300 is not set # CONFIG_SCSI_QLA2300 is not set
# CONFIG_SCSI_QLA2322 is not set # CONFIG_SCSI_QLA2322 is not set
# CONFIG_SCSI_QLA6312 is not set # CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_QLA6322 is not set # CONFIG_SCSI_QLA24XX is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_SIM710 is not set # CONFIG_SCSI_SIM710 is not set
# CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_SYM53C416 is not set
# CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_T128 is not set # CONFIG_SCSI_T128 is not set
# CONFIG_SCSI_U14_34F is not set
# CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_NSP32 is not set
# CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DEBUG is not set
@ -263,6 +350,7 @@ CONFIG_MD_LINEAR=y
CONFIG_MD_RAID0=y CONFIG_MD_RAID0=y
CONFIG_MD_RAID1=y CONFIG_MD_RAID1=y
CONFIG_MD_RAID5=y CONFIG_MD_RAID5=y
CONFIG_MD_RAID6=y
# CONFIG_MD_MULTIPATH is not set # CONFIG_MD_MULTIPATH is not set
# CONFIG_MD_FAULTY is not set # CONFIG_MD_FAULTY is not set
# CONFIG_BLK_DEV_DM is not set # CONFIG_BLK_DEV_DM is not set
@ -271,6 +359,9 @@ CONFIG_MD_RAID5=y
# Fusion MPT device support # Fusion MPT device support
# #
# CONFIG_FUSION is not set # CONFIG_FUSION is not set
# CONFIG_FUSION_SPI is not set
# CONFIG_FUSION_FC is not set
# CONFIG_FUSION_SAS is not set
# #
# IEEE 1394 (FireWire) support # IEEE 1394 (FireWire) support
@ -283,58 +374,8 @@ CONFIG_MD_RAID5=y
# CONFIG_I2O is not set # CONFIG_I2O is not set
# #
# Networking support # Network device support
# #
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=y
CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
CONFIG_IP_PNP=y
# CONFIG_IP_PNP_DHCP is not set
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_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_TUNNEL is not set
CONFIG_IP_TCPDIAG=y
# CONFIG_IP_TCPDIAG_IPV6 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
#
# 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_NETDEVICES=y
# CONFIG_DUMMY is not set # CONFIG_DUMMY is not set
# CONFIG_BONDING is not set # CONFIG_BONDING is not set
@ -346,6 +387,11 @@ CONFIG_NETDEVICES=y
# #
# CONFIG_ARCNET is not set # CONFIG_ARCNET is not set
#
# PHY device support
#
# CONFIG_PHYLIB is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
# #
@ -354,8 +400,8 @@ CONFIG_NET_ETHERNET=y
# CONFIG_LASI_82596 is not set # CONFIG_LASI_82596 is not set
# CONFIG_HAPPYMEAL is not set # CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set # CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set
# CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set # CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set # CONFIG_NET_VENDOR_RACAL is not set
@ -369,6 +415,7 @@ CONFIG_TULIP=y
# CONFIG_DE4X5 is not set # CONFIG_DE4X5 is not set
# CONFIG_WINBOND_840 is not set # CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set # CONFIG_DM9102 is not set
# CONFIG_ULI526X is not set
# CONFIG_DEPCA is not set # CONFIG_DEPCA is not set
# CONFIG_HP100 is not set # CONFIG_HP100 is not set
# CONFIG_NET_ISA is not set # CONFIG_NET_ISA is not set
@ -384,12 +431,15 @@ CONFIG_TULIP=y
# CONFIG_NS83820 is not set # CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set # CONFIG_HAMACHI is not set
# CONFIG_R8169 is not set # CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set # CONFIG_TIGON3 is not set
# CONFIG_BNX2 is not set
# #
# Ethernet (10000 Mbit) # Ethernet (10000 Mbit)
# #
# CONFIG_CHELSIO_T1 is not set
# CONFIG_IXGB is not set # CONFIG_IXGB is not set
# CONFIG_S2IO is not set # CONFIG_S2IO is not set
@ -413,12 +463,12 @@ CONFIG_NET_RADIO=y
# #
# Wireless 802.11b ISA/PCI cards support # Wireless 802.11b ISA/PCI cards support
# #
# CONFIG_AIRO is not set
# CONFIG_HERMES is not set # CONFIG_HERMES is not set
# #
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
# #
# CONFIG_HOSTAP is not set
CONFIG_NET_WIRELESS=y CONFIG_NET_WIRELESS=y
# #
@ -435,6 +485,8 @@ CONFIG_PPP=y
# CONFIG_PPP_BSDCOMP is not set # CONFIG_PPP_BSDCOMP is not set
# CONFIG_SLIP is not set # CONFIG_SLIP is not set
# CONFIG_NET_FC is not set # CONFIG_NET_FC is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# #
# ISDN subsystem # ISDN subsystem
@ -463,24 +515,13 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_EVDEV=y CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_EVBUG is not set
#
# Input I/O drivers
#
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
CONFIG_SERIO=y
# CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_PARKBD is not set
CONFIG_SERIO_GSCPS2=y
# CONFIG_HP_SDC is not set
# CONFIG_SERIO_PCIPS2 is not set
# CONFIG_SERIO_RAW is not set
# #
# Input Device Drivers # Input Device Drivers
# #
CONFIG_INPUT_KEYBOARD=y CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ATKBD is not set CONFIG_KEYBOARD_ATKBD=y
CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
# CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_XTKBD is not set
@ -488,7 +529,7 @@ CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_HIL_OLD is not set # CONFIG_KEYBOARD_HIL_OLD is not set
# CONFIG_KEYBOARD_HIL is not set # CONFIG_KEYBOARD_HIL is not set
CONFIG_INPUT_MOUSE=y CONFIG_INPUT_MOUSE=y
# CONFIG_MOUSE_PS2 is not set CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_INPORT is not set # CONFIG_MOUSE_INPORT is not set
# CONFIG_MOUSE_LOGIBM is not set # CONFIG_MOUSE_LOGIBM is not set
@ -501,6 +542,19 @@ CONFIG_INPUT_MISC=y
# CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_UINPUT is not set
# CONFIG_HP_SDC_RTC is not set # CONFIG_HP_SDC_RTC is not set
#
# Hardware I/O ports
#
CONFIG_SERIO=y
# CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_PARKBD is not set
CONFIG_SERIO_GSCPS2=y
# CONFIG_HP_SDC is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
# CONFIG_GAMEPORT is not set
# #
# Character devices # Character devices
# #
@ -519,8 +573,11 @@ CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_RSA is not set # CONFIG_SERIAL_8250_RSA is not set
# CONFIG_SERIAL_8250_FOURPORT is not set
# CONFIG_SERIAL_8250_ACCENT is not set
# CONFIG_SERIAL_8250_BOCA is not set
# CONFIG_SERIAL_8250_HUB6 is not set
# #
# Non-8250 serial port support # Non-8250 serial port support
@ -529,6 +586,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_PDC_CONSOLE is not set # CONFIG_PDC_CONSOLE is not set
CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTY_COUNT=256
@ -555,10 +613,13 @@ CONFIG_GEN_RTC=y
# #
# Ftape, the floppy tape device driver # Ftape, the floppy tape device driver
# #
# CONFIG_AGP is not set
# CONFIG_DRM is not set # CONFIG_DRM is not set
# CONFIG_RAW_DRIVER is not set # CONFIG_RAW_DRIVER is not set
#
# TPM devices
#
# #
# I2C support # I2C support
# #
@ -569,10 +630,20 @@ CONFIG_GEN_RTC=y
# #
# CONFIG_W1 is not set # CONFIG_W1 is not set
#
# Hardware Monitoring support
#
# CONFIG_HWMON is not set
# CONFIG_HWMON_VID is not set
# #
# Misc devices # Misc devices
# #
#
# Multimedia Capabilities Port drivers
#
# #
# Multimedia devices # Multimedia devices
# #
@ -587,6 +658,11 @@ CONFIG_GEN_RTC=y
# Graphics support # Graphics support
# #
CONFIG_FB=y CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SOFT_CURSOR=y
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_MODE_HELPERS is not set
# CONFIG_FB_TILEBLITTING is not set # CONFIG_FB_TILEBLITTING is not set
# CONFIG_FB_CIRRUS is not set # CONFIG_FB_CIRRUS is not set
@ -595,6 +671,7 @@ CONFIG_FB=y
# CONFIG_FB_ASILIANT is not set # CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set # CONFIG_FB_IMSTT is not set
CONFIG_FB_STI=y CONFIG_FB_STI=y
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set # CONFIG_FB_RIVA is not set
# CONFIG_FB_MATROX is not set # CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON_OLD is not set # CONFIG_FB_RADEON_OLD is not set
@ -606,18 +683,19 @@ CONFIG_FB_STI=y
# CONFIG_FB_KYRO is not set # CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set # CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_CYBLA is not set
# CONFIG_FB_TRIDENT is not set # CONFIG_FB_TRIDENT is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_VIRTUAL is not set # CONFIG_FB_VIRTUAL is not set
# #
# Console display driver support # Console display driver support
# #
# CONFIG_MDA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y
CONFIG_STI_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=160 CONFIG_DUMMY_CONSOLE_COLUMNS=160
CONFIG_DUMMY_CONSOLE_ROWS=64 CONFIG_DUMMY_CONSOLE_ROWS=64
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_STI_CONSOLE=y
# CONFIG_FONTS is not set # CONFIG_FONTS is not set
CONFIG_FONT_8x8=y CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y CONFIG_FONT_8x16=y
@ -630,6 +708,7 @@ CONFIG_LOGO_LINUX_MONO=y
CONFIG_LOGO_LINUX_VGA16=y CONFIG_LOGO_LINUX_VGA16=y
CONFIG_LOGO_LINUX_CLUT224=y CONFIG_LOGO_LINUX_CLUT224=y
CONFIG_LOGO_PARISC_CLUT224=y CONFIG_LOGO_PARISC_CLUT224=y
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
# #
# Sound # Sound
@ -639,13 +718,9 @@ CONFIG_LOGO_PARISC_CLUT224=y
# #
# USB support # USB support
# #
# CONFIG_USB is not set
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
# CONFIG_USB is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
#
# #
# USB Gadget Support # USB Gadget Support
@ -657,24 +732,37 @@ CONFIG_USB_ARCH_HAS_OHCI=y
# #
# CONFIG_MMC is not set # CONFIG_MMC is not set
#
# InfiniBand support
#
# CONFIG_INFINIBAND is not set
#
# SN Devices
#
# #
# File systems # File systems
# #
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set # CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set # CONFIG_EXT3_FS_XATTR is not set
CONFIG_JBD=y CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set # CONFIG_JBD_DEBUG is not set
# CONFIG_REISERFS_FS is not set # CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set # CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set
# CONFIG_XFS_FS is not set # CONFIG_XFS_FS is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
# CONFIG_ROMFS_FS is not set # CONFIG_ROMFS_FS is not set
CONFIG_INOTIFY=y
# CONFIG_QUOTA is not set # CONFIG_QUOTA is not set
CONFIG_DNOTIFY=y CONFIG_DNOTIFY=y
# CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
# #
# CD-ROM/DVD Filesystems # CD-ROM/DVD Filesystems
@ -697,11 +785,10 @@ CONFIG_JOLIET=y
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_SYSFS=y CONFIG_SYSFS=y
# CONFIG_DEVPTS_FS_XATTR is not set
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_TMPFS_XATTR is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# #
# Miscellaneous filesystems # Miscellaneous filesystems
@ -719,15 +806,19 @@ CONFIG_RAMFS=y
# #
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
CONFIG_NFS_V3=y CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
CONFIG_NFSD=y CONFIG_NFSD=y
CONFIG_NFSD_V3=y CONFIG_NFSD_V3=y
# CONFIG_NFSD_V3_ACL is not set
CONFIG_NFSD_TCP=y CONFIG_NFSD_TCP=y
CONFIG_ROOT_NFS=y CONFIG_ROOT_NFS=y
CONFIG_LOCKD=y CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=y CONFIG_EXPORTFS=y
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y CONFIG_SUNRPC=y
# CONFIG_SMB_FS is not set CONFIG_SMB_FS=y
# CONFIG_SMB_NLS_DEFAULT is not set
# CONFIG_CIFS is not set # CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set # CONFIG_CODA_FS is not set
@ -785,13 +876,19 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# #
# Kernel hacking # Kernel hacking
# #
# CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_LOG_BUF_SHIFT=16
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_IOREMAP is not set
# CONFIG_DEBUG_FS is not set
# #
# Security options # Security options
@ -815,6 +912,7 @@ CONFIG_CRYPTO=y
# CONFIG_CRYPTO_SHA256 is not set # CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_DES is not set # CONFIG_CRYPTO_DES is not set
# CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH is not set
@ -831,9 +929,14 @@ CONFIG_CRYPTO=y
# CONFIG_CRYPTO_CRC32C is not set # CONFIG_CRYPTO_CRC32C is not set
# CONFIG_CRYPTO_TEST is not set # CONFIG_CRYPTO_TEST is not set
#
# Hardware crypto devices
#
# #
# Library routines # Library routines
# #
# CONFIG_CRC_CCITT is not set # CONFIG_CRC_CCITT is not set
# CONFIG_CRC16 is not set
CONFIG_CRC32=y CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -27,6 +27,7 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/sections.h>
int split_tlb; int split_tlb;
int dcache_stride; int dcache_stride;
@ -207,6 +208,9 @@ parisc_cache_init(void)
/* "New and Improved" version from Jim Hull /* "New and Improved" version from Jim Hull
* (1 << (cc_block-1)) * (cc_line << (4 + cnf.cc_shift)) * (1 << (cc_block-1)) * (cc_line << (4 + cnf.cc_shift))
* The following CAFL_STRIDE is an optimized version, see
* http://lists.parisc-linux.org/pipermail/parisc-linux/2004-June/023625.html
* http://lists.parisc-linux.org/pipermail/parisc-linux/2004-June/023671.html
*/ */
#define CAFL_STRIDE(cnf) (cnf.cc_line << (3 + cnf.cc_block + 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); dcache_stride = CAFL_STRIDE(cache_info.dc_conf);
@ -339,17 +343,15 @@ int parisc_cache_flush_threshold = FLUSH_THRESHOLD;
void parisc_setup_cache_timing(void) void parisc_setup_cache_timing(void)
{ {
unsigned long rangetime, alltime; unsigned long rangetime, alltime;
extern char _text; /* start of kernel code, defined by linker */
extern char _end; /* end of BSS, defined by linker */
unsigned long size; unsigned long size;
alltime = mfctl(16); alltime = mfctl(16);
flush_data_cache(); flush_data_cache();
alltime = mfctl(16) - alltime; alltime = mfctl(16) - alltime;
size = (unsigned long)(&_end - _text); size = (unsigned long)(_end - _text);
rangetime = mfctl(16); rangetime = mfctl(16);
flush_kernel_dcache_range((unsigned long)&_text, size); flush_kernel_dcache_range((unsigned long)_text, size);
rangetime = mfctl(16) - rangetime; rangetime = mfctl(16) - rangetime;
printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n", printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n",

View File

@ -46,36 +46,51 @@ static struct device root = {
.bus_id = "parisc", .bus_id = "parisc",
}; };
#define for_each_padev(padev) \ static inline int check_dev(struct device *dev)
for (padev = next_dev(&root); padev != NULL; \ {
padev = next_dev(&padev->dev)) if (dev->bus == &parisc_bus_type) {
struct parisc_device *pdev;
pdev = to_parisc_device(dev);
return pdev->id.hw_type != HPHW_FAULTY;
}
return 1;
}
#define check_dev(padev) \ static struct device *
(padev->id.hw_type != HPHW_FAULTY) ? padev : next_dev(&padev->dev) parse_tree_node(struct device *parent, int index, struct hardware_path *modpath);
struct recurse_struct {
void * obj;
int (*fn)(struct device *, void *);
};
static int descend_children(struct device * dev, void * data)
{
struct recurse_struct * recurse_data = (struct recurse_struct *)data;
if (recurse_data->fn(dev, recurse_data->obj))
return 1;
else
return device_for_each_child(dev, recurse_data, descend_children);
}
/** /**
* next_dev - enumerates registered devices * for_each_padev - Iterate over all devices in the tree
* @dev: the previous device returned from next_dev * @fn: Function to call for each device.
* @data: Data to pass to the called function.
* *
* next_dev does a depth-first search of the tree, returning parents * This performs a depth-first traversal of the tree, calling the
* before children. Returns NULL when there are no more devices. * function passed for each node. It calls the function for parents
* before children.
*/ */
static struct parisc_device *next_dev(struct device *dev)
static int for_each_padev(int (*fn)(struct device *, void *), void * data)
{ {
if (!list_empty(&dev->children)) { struct recurse_struct recurse_data = {
dev = list_to_dev(dev->children.next); .obj = data,
return check_dev(to_parisc_device(dev)); .fn = fn,
} };
return device_for_each_child(&root, &recurse_data, descend_children);
while (dev != &root) {
if (dev->node.next != &dev->parent->children) {
dev = list_to_dev(dev->node.next);
return to_parisc_device(dev);
}
dev = dev->parent;
}
return NULL;
} }
/** /**
@ -105,12 +120,6 @@ static int match_device(struct parisc_driver *driver, struct parisc_device *dev)
return 0; return 0;
} }
static void claim_device(struct parisc_driver *driver, struct parisc_device *dev)
{
dev->driver = driver;
request_mem_region(dev->hpa, 0x1000, driver->name);
}
static int parisc_driver_probe(struct device *dev) static int parisc_driver_probe(struct device *dev)
{ {
int rc; int rc;
@ -119,8 +128,8 @@ static int parisc_driver_probe(struct device *dev)
rc = pa_drv->probe(pa_dev); rc = pa_drv->probe(pa_dev);
if(!rc) if (!rc)
claim_device(pa_drv, pa_dev); pa_dev->driver = pa_drv;
return rc; return rc;
} }
@ -131,7 +140,6 @@ static int parisc_driver_remove(struct device *dev)
struct parisc_driver *pa_drv = to_parisc_driver(dev->driver); struct parisc_driver *pa_drv = to_parisc_driver(dev->driver);
if (pa_drv->remove) if (pa_drv->remove)
pa_drv->remove(pa_dev); pa_drv->remove(pa_dev);
release_mem_region(pa_dev->hpa, 0x1000);
return 0; return 0;
} }
@ -173,6 +181,24 @@ int register_parisc_driver(struct parisc_driver *driver)
} }
EXPORT_SYMBOL(register_parisc_driver); EXPORT_SYMBOL(register_parisc_driver);
struct match_count {
struct parisc_driver * driver;
int count;
};
static int match_and_count(struct device * dev, void * data)
{
struct match_count * m = data;
struct parisc_device * pdev = to_parisc_device(dev);
if (check_dev(dev)) {
if (match_device(m->driver, pdev))
m->count++;
}
return 0;
}
/** /**
* count_parisc_driver - count # of devices this driver would match * count_parisc_driver - count # of devices this driver would match
* @driver: the PA-RISC driver to try * @driver: the PA-RISC driver to try
@ -182,15 +208,14 @@ EXPORT_SYMBOL(register_parisc_driver);
*/ */
int count_parisc_driver(struct parisc_driver *driver) int count_parisc_driver(struct parisc_driver *driver)
{ {
struct parisc_device *device; struct match_count m = {
int cnt = 0; .driver = driver,
.count = 0,
};
for_each_padev(device) { for_each_padev(match_and_count, &m);
if (match_device(driver, device))
cnt++;
}
return cnt; return m.count;
} }
@ -206,14 +231,34 @@ int unregister_parisc_driver(struct parisc_driver *driver)
} }
EXPORT_SYMBOL(unregister_parisc_driver); EXPORT_SYMBOL(unregister_parisc_driver);
struct find_data {
unsigned long hpa;
struct parisc_device * dev;
};
static int find_device(struct device * dev, void * data)
{
struct parisc_device * pdev = to_parisc_device(dev);
struct find_data * d = (struct find_data*)data;
if (check_dev(dev)) {
if (pdev->hpa.start == d->hpa) {
d->dev = pdev;
return 1;
}
}
return 0;
}
static struct parisc_device *find_device_by_addr(unsigned long hpa) static struct parisc_device *find_device_by_addr(unsigned long hpa)
{ {
struct parisc_device *dev; struct find_data d = {
for_each_padev(dev) { .hpa = hpa,
if (dev->hpa == hpa) };
return dev; int ret;
}
return NULL; ret = for_each_padev(find_device, &d);
return ret ? d.dev : NULL;
} }
/** /**
@ -387,6 +432,23 @@ struct parisc_device * create_tree_node(char id, struct device *parent)
return dev; return dev;
} }
struct match_id_data {
char id;
struct parisc_device * dev;
};
static int match_by_id(struct device * dev, void * data)
{
struct parisc_device * pdev = to_parisc_device(dev);
struct match_id_data * d = data;
if (pdev->hw_path == d->id) {
d->dev = pdev;
return 1;
}
return 0;
}
/** /**
* alloc_tree_node - returns a device entry in the iotree * alloc_tree_node - returns a device entry in the iotree
* @parent: the parent node in the tree * @parent: the parent node in the tree
@ -397,15 +459,13 @@ struct parisc_device * create_tree_node(char id, struct device *parent)
*/ */
static struct parisc_device * alloc_tree_node(struct device *parent, char id) static struct parisc_device * alloc_tree_node(struct device *parent, char id)
{ {
struct device *dev; struct match_id_data d = {
.id = id,
list_for_each_entry(dev, &parent->children, node) { };
struct parisc_device *padev = to_parisc_device(dev); if (device_for_each_child(parent, &d, match_by_id))
if (padev->hw_path == id) return d.dev;
return padev; else
} return create_tree_node(id, parent);
return create_tree_node(id, parent);
} }
static struct parisc_device *create_parisc_device(struct hardware_path *modpath) static struct parisc_device *create_parisc_device(struct hardware_path *modpath)
@ -439,10 +499,8 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
dev = create_parisc_device(mod_path); dev = create_parisc_device(mod_path);
if (dev->id.hw_type != HPHW_FAULTY) { if (dev->id.hw_type != HPHW_FAULTY) {
char p[64];
print_pa_hwpath(dev, p);
printk("Two devices have hardware path %s. Please file a bug with HP.\n" printk("Two devices have hardware path %s. Please file a bug with HP.\n"
"In the meantime, you could try rearranging your cards.\n", p); "In the meantime, you could try rearranging your cards.\n", parisc_pathname(dev));
return NULL; return NULL;
} }
@ -451,12 +509,27 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
dev->id.hversion_rev = iodc_data[1] & 0x0f; dev->id.hversion_rev = iodc_data[1] & 0x0f;
dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) | dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) |
(iodc_data[5] << 8) | iodc_data[6]; (iodc_data[5] << 8) | iodc_data[6];
dev->hpa = hpa; dev->hpa.name = parisc_pathname(dev);
dev->hpa.start = hpa;
if (hpa == 0xf4000000 || hpa == 0xf6000000 ||
hpa == 0xf8000000 || hpa == 0xfa000000) {
dev->hpa.end = hpa + 0x01ffffff;
} else {
dev->hpa.end = hpa + 0xfff;
}
dev->hpa.flags = IORESOURCE_MEM;
name = parisc_hardware_description(&dev->id); name = parisc_hardware_description(&dev->id);
if (name) { if (name) {
strlcpy(dev->name, name, sizeof(dev->name)); strlcpy(dev->name, name, sizeof(dev->name));
} }
/* Silently fail things like mouse ports which are subsumed within
* the keyboard controller
*/
if ((hpa & 0xfff) == 0 && insert_resource(&iomem_resource, &dev->hpa))
printk("Unable to claim HPA %lx for device %s\n",
hpa, name);
return dev; return dev;
} }
@ -555,6 +628,33 @@ static int match_parisc_device(struct device *dev, int index,
return (curr->hw_path == id); return (curr->hw_path == id);
} }
struct parse_tree_data {
int index;
struct hardware_path * modpath;
struct device * dev;
};
static int check_parent(struct device * dev, void * data)
{
struct parse_tree_data * d = data;
if (check_dev(dev)) {
if (dev->bus == &parisc_bus_type) {
if (match_parisc_device(dev, d->index, d->modpath))
d->dev = dev;
} else if (is_pci_dev(dev)) {
if (match_pci_device(dev, d->index, d->modpath))
d->dev = dev;
} else if (dev->bus == NULL) {
/* we are on a bus bridge */
struct device *new = parse_tree_node(dev, d->index, d->modpath);
if (new)
d->dev = new;
}
}
return d->dev != NULL;
}
/** /**
* parse_tree_node - returns a device entry in the iotree * parse_tree_node - returns a device entry in the iotree
* @parent: the parent node in the tree * @parent: the parent node in the tree
@ -568,24 +668,18 @@ static int match_parisc_device(struct device *dev, int index,
static struct device * static struct device *
parse_tree_node(struct device *parent, int index, struct hardware_path *modpath) parse_tree_node(struct device *parent, int index, struct hardware_path *modpath)
{ {
struct device *device; struct parse_tree_data d = {
.index = index,
list_for_each_entry(device, &parent->children, node) { .modpath = modpath,
if (device->bus == &parisc_bus_type) { };
if (match_parisc_device(device, index, modpath))
return device;
} else if (is_pci_dev(device)) {
if (match_pci_device(device, index, modpath))
return device;
} else if (device->bus == NULL) {
/* we are on a bus bridge */
struct device *new = parse_tree_node(device, index, modpath);
if (new)
return new;
}
}
return NULL; struct recurse_struct recurse_data = {
.obj = &d,
.fn = check_parent,
};
device_for_each_child(parent, &recurse_data, descend_children);
return d.dev;
} }
/** /**
@ -636,7 +730,7 @@ EXPORT_SYMBOL(device_to_hwpath);
((dev->id.hw_type == HPHW_IOA) || (dev->id.hw_type == HPHW_BCPORT)) ((dev->id.hw_type == HPHW_IOA) || (dev->id.hw_type == HPHW_BCPORT))
#define IS_LOWER_PORT(dev) \ #define IS_LOWER_PORT(dev) \
((gsc_readl(dev->hpa + offsetof(struct bc_module, io_status)) \ ((gsc_readl(dev->hpa.start + offsetof(struct bc_module, io_status)) \
& BC_PORT_MASK) == BC_LOWER_PORT) & BC_PORT_MASK) == BC_LOWER_PORT)
#define MAX_NATIVE_DEVICES 64 #define MAX_NATIVE_DEVICES 64
@ -645,8 +739,8 @@ EXPORT_SYMBOL(device_to_hwpath);
#define FLEX_MASK F_EXTEND(0xfffc0000) #define FLEX_MASK F_EXTEND(0xfffc0000)
#define IO_IO_LOW offsetof(struct bc_module, io_io_low) #define IO_IO_LOW offsetof(struct bc_module, io_io_low)
#define IO_IO_HIGH offsetof(struct bc_module, io_io_high) #define IO_IO_HIGH offsetof(struct bc_module, io_io_high)
#define READ_IO_IO_LOW(dev) (unsigned long)(signed int)gsc_readl(dev->hpa + IO_IO_LOW) #define READ_IO_IO_LOW(dev) (unsigned long)(signed int)gsc_readl(dev->hpa.start + IO_IO_LOW)
#define READ_IO_IO_HIGH(dev) (unsigned long)(signed int)gsc_readl(dev->hpa + IO_IO_HIGH) #define READ_IO_IO_HIGH(dev) (unsigned long)(signed int)gsc_readl(dev->hpa.start + IO_IO_HIGH)
static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high, static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high,
struct device *parent); struct device *parent);
@ -655,10 +749,10 @@ void walk_lower_bus(struct parisc_device *dev)
{ {
unsigned long io_io_low, io_io_high; unsigned long io_io_low, io_io_high;
if(!BUS_CONVERTER(dev) || IS_LOWER_PORT(dev)) if (!BUS_CONVERTER(dev) || IS_LOWER_PORT(dev))
return; return;
if(dev->id.hw_type == HPHW_IOA) { if (dev->id.hw_type == HPHW_IOA) {
io_io_low = (unsigned long)(signed int)(READ_IO_IO_LOW(dev) << 16); io_io_low = (unsigned long)(signed int)(READ_IO_IO_LOW(dev) << 16);
io_io_high = io_io_low + MAX_NATIVE_DEVICES * NATIVE_DEVICE_OFFSET; io_io_high = io_io_low + MAX_NATIVE_DEVICES * NATIVE_DEVICE_OFFSET;
} else { } else {
@ -731,7 +825,7 @@ static void print_parisc_device(struct parisc_device *dev)
print_pa_hwpath(dev, hw_path); print_pa_hwpath(dev, hw_path);
printk(KERN_INFO "%d. %s at 0x%lx [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }", printk(KERN_INFO "%d. %s at 0x%lx [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
++count, dev->name, dev->hpa, hw_path, dev->id.hw_type, ++count, dev->name, dev->hpa.start, hw_path, dev->id.hw_type,
dev->id.hversion_rev, dev->id.hversion, dev->id.sversion); dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
if (dev->num_addrs) { if (dev->num_addrs) {
@ -753,13 +847,20 @@ void init_parisc_bus(void)
get_device(&root); get_device(&root);
} }
static int print_one_device(struct device * dev, void * data)
{
struct parisc_device * pdev = to_parisc_device(dev);
if (check_dev(dev))
print_parisc_device(pdev);
return 0;
}
/** /**
* print_parisc_devices - Print out a list of devices found in this system * print_parisc_devices - Print out a list of devices found in this system
*/ */
void print_parisc_devices(void) void print_parisc_devices(void)
{ {
struct parisc_device *dev; for_each_padev(print_one_device, NULL);
for_each_padev(dev) {
print_parisc_device(dev);
}
} }

View File

@ -30,14 +30,14 @@
* - save registers to kernel stack and handle in assembly or C */ * - save registers to kernel stack and handle in assembly or C */
#include <asm/psw.h>
#include <asm/assembly.h> /* for LDREG/STREG defines */ #include <asm/assembly.h> /* for LDREG/STREG defines */
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/psw.h>
#include <asm/signal.h> #include <asm/signal.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#ifdef __LP64__ #ifdef CONFIG_64BIT
#define CMPIB cmpib,* #define CMPIB cmpib,*
#define CMPB cmpb,* #define CMPB cmpb,*
#define COND(x) *x #define COND(x) *x
@ -67,19 +67,22 @@
/* Switch to virtual mapping, trashing only %r1 */ /* Switch to virtual mapping, trashing only %r1 */
.macro virt_map .macro virt_map
rsm PSW_SM_Q,%r0 /* pcxt_ssm_bug */
tovirt_r1 %r29 rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */
mfsp %sr7, %r1
or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */
mtsp %r1, %sr3
mtsp %r0, %sr4 mtsp %r0, %sr4
mtsp %r0, %sr5 mtsp %r0, %sr5
mfsp %sr7, %r1
or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */
mtsp %r1, %sr3
tovirt_r1 %r29
load32 KERNEL_PSW, %r1
rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */
mtsp %r0, %sr6 mtsp %r0, %sr6
mtsp %r0, %sr7 mtsp %r0, %sr7
load32 KERNEL_PSW, %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
mtctl %r1, %ipsw
load32 4f, %r1 load32 4f, %r1
mtctl %r1, %cr18 /* Set IIAOQ tail */ mtctl %r1, %cr18 /* Set IIAOQ tail */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
@ -214,7 +217,7 @@
va = r8 /* virtual address for which the trap occured */ va = r8 /* virtual address for which the trap occured */
spc = r24 /* space for which the trap occured */ spc = r24 /* space for which the trap occured */
#ifndef __LP64__ #ifndef CONFIG_64BIT
/* /*
* itlb miss interruption handler (parisc 1.1 - 32 bit) * itlb miss interruption handler (parisc 1.1 - 32 bit)
@ -236,7 +239,7 @@
.macro itlb_20 code .macro itlb_20 code
mfctl %pcsq, spc mfctl %pcsq, spc
#ifdef __LP64__ #ifdef CONFIG_64BIT
b itlb_miss_20w b itlb_miss_20w
#else #else
b itlb_miss_20 b itlb_miss_20
@ -246,7 +249,7 @@
.align 32 .align 32
.endm .endm
#ifndef __LP64__ #ifndef CONFIG_64BIT
/* /*
* naitlb miss interruption handler (parisc 1.1 - 32 bit) * naitlb miss interruption handler (parisc 1.1 - 32 bit)
* *
@ -283,7 +286,7 @@
.macro naitlb_20 code .macro naitlb_20 code
mfctl %isr,spc mfctl %isr,spc
#ifdef __LP64__ #ifdef CONFIG_64BIT
b itlb_miss_20w b itlb_miss_20w
#else #else
b itlb_miss_20 b itlb_miss_20
@ -296,7 +299,7 @@
.align 32 .align 32
.endm .endm
#ifndef __LP64__ #ifndef CONFIG_64BIT
/* /*
* dtlb miss interruption handler (parisc 1.1 - 32 bit) * dtlb miss interruption handler (parisc 1.1 - 32 bit)
*/ */
@ -318,7 +321,7 @@
.macro dtlb_20 code .macro dtlb_20 code
mfctl %isr, spc mfctl %isr, spc
#ifdef __LP64__ #ifdef CONFIG_64BIT
b dtlb_miss_20w b dtlb_miss_20w
#else #else
b dtlb_miss_20 b dtlb_miss_20
@ -328,7 +331,7 @@
.align 32 .align 32
.endm .endm
#ifndef __LP64__ #ifndef CONFIG_64BIT
/* nadtlb miss interruption handler (parisc 1.1 - 32 bit) */ /* nadtlb miss interruption handler (parisc 1.1 - 32 bit) */
.macro nadtlb_11 code .macro nadtlb_11 code
@ -346,7 +349,7 @@
.macro nadtlb_20 code .macro nadtlb_20 code
mfctl %isr,spc mfctl %isr,spc
#ifdef __LP64__ #ifdef CONFIG_64BIT
b nadtlb_miss_20w b nadtlb_miss_20w
#else #else
b nadtlb_miss_20 b nadtlb_miss_20
@ -356,7 +359,7 @@
.align 32 .align 32
.endm .endm
#ifndef __LP64__ #ifndef CONFIG_64BIT
/* /*
* dirty bit trap interruption handler (parisc 1.1 - 32 bit) * dirty bit trap interruption handler (parisc 1.1 - 32 bit)
*/ */
@ -378,7 +381,7 @@
.macro dbit_20 code .macro dbit_20 code
mfctl %isr,spc mfctl %isr,spc
#ifdef __LP64__ #ifdef CONFIG_64BIT
b dbit_trap_20w b dbit_trap_20w
#else #else
b dbit_trap_20 b dbit_trap_20
@ -391,7 +394,7 @@
/* The following are simple 32 vs 64 bit instruction /* The following are simple 32 vs 64 bit instruction
* abstractions for the macros */ * abstractions for the macros */
.macro EXTR reg1,start,length,reg2 .macro EXTR reg1,start,length,reg2
#ifdef __LP64__ #ifdef CONFIG_64BIT
extrd,u \reg1,32+\start,\length,\reg2 extrd,u \reg1,32+\start,\length,\reg2
#else #else
extrw,u \reg1,\start,\length,\reg2 extrw,u \reg1,\start,\length,\reg2
@ -399,7 +402,7 @@
.endm .endm
.macro DEP reg1,start,length,reg2 .macro DEP reg1,start,length,reg2
#ifdef __LP64__ #ifdef CONFIG_64BIT
depd \reg1,32+\start,\length,\reg2 depd \reg1,32+\start,\length,\reg2
#else #else
depw \reg1,\start,\length,\reg2 depw \reg1,\start,\length,\reg2
@ -407,7 +410,7 @@
.endm .endm
.macro DEPI val,start,length,reg .macro DEPI val,start,length,reg
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi \val,32+\start,\length,\reg depdi \val,32+\start,\length,\reg
#else #else
depwi \val,\start,\length,\reg depwi \val,\start,\length,\reg
@ -418,7 +421,7 @@
* fault. We have to extract this and place it in the va, * fault. We have to extract this and place it in the va,
* zeroing the corresponding bits in the space register */ * zeroing the corresponding bits in the space register */
.macro space_adjust spc,va,tmp .macro space_adjust spc,va,tmp
#ifdef __LP64__ #ifdef CONFIG_64BIT
extrd,u \spc,63,SPACEID_SHIFT,\tmp extrd,u \spc,63,SPACEID_SHIFT,\tmp
depd %r0,63,SPACEID_SHIFT,\spc depd %r0,63,SPACEID_SHIFT,\spc
depd \tmp,31,SPACEID_SHIFT,\va depd \tmp,31,SPACEID_SHIFT,\va
@ -476,7 +479,7 @@
bb,>=,n \pmd,_PxD_PRESENT_BIT,\fault bb,>=,n \pmd,_PxD_PRESENT_BIT,\fault
DEP %r0,31,PxD_FLAG_SHIFT,\pmd /* clear flags */ DEP %r0,31,PxD_FLAG_SHIFT,\pmd /* clear flags */
copy \pmd,%r9 copy \pmd,%r9
#ifdef __LP64__ #ifdef CONFIG_64BIT
shld %r9,PxD_VALUE_SHIFT,\pmd shld %r9,PxD_VALUE_SHIFT,\pmd
#else #else
shlw %r9,PxD_VALUE_SHIFT,\pmd shlw %r9,PxD_VALUE_SHIFT,\pmd
@ -607,7 +610,7 @@
.macro do_alias spc,tmp,tmp1,va,pte,prot,fault .macro do_alias spc,tmp,tmp1,va,pte,prot,fault
cmpib,COND(<>),n 0,\spc,\fault cmpib,COND(<>),n 0,\spc,\fault
ldil L%(TMPALIAS_MAP_START),\tmp ldil L%(TMPALIAS_MAP_START),\tmp
#if defined(__LP64__) && (TMPALIAS_MAP_START >= 0x80000000) #if defined(CONFIG_64BIT) && (TMPALIAS_MAP_START >= 0x80000000)
/* on LP64, ldi will sign extend into the upper 32 bits, /* on LP64, ldi will sign extend into the upper 32 bits,
* which is behaviour we don't want */ * which is behaviour we don't want */
depdi 0,31,32,\tmp depdi 0,31,32,\tmp
@ -621,7 +624,7 @@
* OK, it is in the temp alias region, check whether "from" or "to". * OK, it is in the temp alias region, check whether "from" or "to".
* Check "subtle" note in pacache.S re: r23/r26. * Check "subtle" note in pacache.S re: r23/r26.
*/ */
#ifdef __LP64__ #ifdef CONFIG_64BIT
extrd,u,*= \va,41,1,%r0 extrd,u,*= \va,41,1,%r0
#else #else
extrw,u,= \va,9,1,%r0 extrw,u,= \va,9,1,%r0
@ -688,7 +691,7 @@ fault_vector_20:
def 30 def 30
def 31 def 31
#ifndef __LP64__ #ifndef CONFIG_64BIT
.export fault_vector_11 .export fault_vector_11
@ -761,7 +764,7 @@ __kernel_thread:
copy %r30, %r1 copy %r30, %r1
ldo PT_SZ_ALGN(%r30),%r30 ldo PT_SZ_ALGN(%r30),%r30
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* Yo, function pointers in wide mode are little structs... -PB */ /* Yo, function pointers in wide mode are little structs... -PB */
ldd 24(%r26), %r2 ldd 24(%r26), %r2
STREG %r2, PT_GR27(%r1) /* Store childs %dp */ STREG %r2, PT_GR27(%r1) /* Store childs %dp */
@ -777,7 +780,7 @@ __kernel_thread:
or %r26, %r24, %r26 /* will have kernel mappings. */ or %r26, %r24, %r26 /* will have kernel mappings. */
ldi 1, %r25 /* stack_start, signals kernel thread */ ldi 1, %r25 /* stack_start, signals kernel thread */
stw %r0, -52(%r30) /* user_tid */ stw %r0, -52(%r30) /* user_tid */
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
BL do_fork, %r2 BL do_fork, %r2
@ -806,7 +809,7 @@ ret_from_kernel_thread:
LDREG TI_TASK-THREAD_SZ_ALGN(%r30), %r1 LDREG TI_TASK-THREAD_SZ_ALGN(%r30), %r1
LDREG TASK_PT_GR25(%r1), %r26 LDREG TASK_PT_GR25(%r1), %r26
#ifdef __LP64__ #ifdef CONFIG_64BIT
LDREG TASK_PT_GR27(%r1), %r27 LDREG TASK_PT_GR27(%r1), %r27
LDREG TASK_PT_GR22(%r1), %r22 LDREG TASK_PT_GR22(%r1), %r22
#endif #endif
@ -814,11 +817,16 @@ ret_from_kernel_thread:
ble 0(%sr7, %r1) ble 0(%sr7, %r1)
copy %r31, %r2 copy %r31, %r2
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
loadgp /* Thread could have been in a module */ loadgp /* Thread could have been in a module */
#endif #endif
#ifndef CONFIG_64BIT
b sys_exit b sys_exit
#else
load32 sys_exit, %r1
bv %r0(%r1)
#endif
ldi 0, %r26 ldi 0, %r26
.import sys_execve, code .import sys_execve, code
@ -830,7 +838,7 @@ __execve:
STREG %r26, PT_GR26(%r16) STREG %r26, PT_GR26(%r16)
STREG %r25, PT_GR25(%r16) STREG %r25, PT_GR25(%r16)
STREG %r24, PT_GR24(%r16) STREG %r24, PT_GR24(%r16)
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
BL sys_execve, %r2 BL sys_execve, %r2
@ -855,6 +863,7 @@ __execve:
_switch_to: _switch_to:
STREG %r2, -RP_OFFSET(%r30) STREG %r2, -RP_OFFSET(%r30)
callee_save_float
callee_save callee_save
load32 _switch_to_ret, %r2 load32 _switch_to_ret, %r2
@ -871,6 +880,7 @@ _switch_to:
_switch_to_ret: _switch_to_ret:
mtctl %r0, %cr0 /* Needed for single stepping */ mtctl %r0, %cr0 /* Needed for single stepping */
callee_rest callee_rest
callee_rest_float
LDREG -RP_OFFSET(%r30), %r2 LDREG -RP_OFFSET(%r30), %r2
bv %r0(%r2) bv %r0(%r2)
@ -888,9 +898,6 @@ _switch_to_ret:
* this way, then we will need to copy %sr3 in to PT_SR[3..7], and * this way, then we will need to copy %sr3 in to PT_SR[3..7], and
* adjust IASQ[0..1]. * adjust IASQ[0..1].
* *
* Note that the following code uses a "relied upon translation".
* See the parisc ACD for details. The ssm is necessary due to a
* PCXT bug.
*/ */
.align 4096 .align 4096
@ -911,7 +918,7 @@ syscall_exit_rfi:
STREG %r19,PT_IAOQ1(%r16) STREG %r19,PT_IAOQ1(%r16)
LDREG PT_PSW(%r16),%r19 LDREG PT_PSW(%r16),%r19
load32 USER_PSW_MASK,%r1 load32 USER_PSW_MASK,%r1
#ifdef __LP64__ #ifdef CONFIG_64BIT
load32 USER_PSW_HI_MASK,%r20 load32 USER_PSW_HI_MASK,%r20
depd %r20,31,32,%r1 depd %r20,31,32,%r1
#endif #endif
@ -955,7 +962,7 @@ intr_return:
/* shift left ____cacheline_aligned (aka L1_CACHE_BYTES) amount /* shift left ____cacheline_aligned (aka L1_CACHE_BYTES) amount
** irq_stat[] is defined using ____cacheline_aligned. ** irq_stat[] is defined using ____cacheline_aligned.
*/ */
#ifdef __LP64__ #ifdef CONFIG_64BIT
shld %r1, 6, %r20 shld %r1, 6, %r20
#else #else
shlw %r1, 5, %r20 shlw %r1, 5, %r20
@ -963,9 +970,6 @@ intr_return:
add %r19,%r20,%r19 /* now have &irq_stat[smp_processor_id()] */ add %r19,%r20,%r19 /* now have &irq_stat[smp_processor_id()] */
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
LDREG IRQSTAT_SIRQ_PEND(%r19),%r20 /* hardirq.h: unsigned long */
cmpib,<>,n 0,%r20,intr_do_softirq /* forward */
intr_check_resched: intr_check_resched:
/* check for reschedule */ /* check for reschedule */
@ -985,24 +989,19 @@ intr_restore:
rest_fp %r1 rest_fp %r1
rest_general %r29 rest_general %r29
/* Create a "relied upon translation" PA 2.0 Arch. F-5 */ /* inverse of virt_map */
ssm 0,%r0 pcxt_ssm_bug
nop rsm PSW_SM_QUIET,%r0 /* prepare for rfi */
nop
nop
nop
nop
nop
nop
tophys_r1 %r29 tophys_r1 %r29
rsm (PSW_SM_Q|PSW_SM_P|PSW_SM_D|PSW_SM_I),%r0
/* Restore space id's and special cr's from PT_REGS /* Restore space id's and special cr's from PT_REGS
* structure pointed to by r29 */ * structure pointed to by r29
*/
rest_specials %r29 rest_specials %r29
/* Important: Note that rest_stack restores r29 /* IMPORTANT: rest_stack restores r29 last (we are using it)!
* last (we are using it)! It also restores r1 and r30. */ * It also restores r1 and r30.
*/
rest_stack rest_stack
rfi rfi
@ -1015,17 +1014,6 @@ intr_restore:
nop nop
nop nop
.import do_softirq,code
intr_do_softirq:
bl do_softirq,%r2
#ifdef __LP64__
ldo -16(%r30),%r29 /* Reference param save area */
#else
nop
#endif
b intr_check_resched
nop
.import schedule,code .import schedule,code
intr_do_resched: intr_do_resched:
/* Only do reschedule if we are returning to user space */ /* Only do reschedule if we are returning to user space */
@ -1036,12 +1024,17 @@ intr_do_resched:
CMPIB= 0,%r20,intr_restore /* backward */ CMPIB= 0,%r20,intr_restore /* backward */
nop nop
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
ldil L%intr_check_sig, %r2 ldil L%intr_check_sig, %r2
#ifndef CONFIG_64BIT
b schedule b schedule
#else
load32 schedule, %r20
bv %r0(%r20)
#endif
ldo R%intr_check_sig(%r2), %r2 ldo R%intr_check_sig(%r2), %r2
@ -1064,7 +1057,7 @@ intr_do_signal:
copy %r0, %r24 /* unsigned long in_syscall */ copy %r0, %r24 /* unsigned long in_syscall */
copy %r16, %r25 /* struct pt_regs *regs */ copy %r16, %r25 /* struct pt_regs *regs */
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
@ -1088,7 +1081,7 @@ intr_extint:
mfctl %cr31,%r1 mfctl %cr31,%r1
copy %r30,%r17 copy %r30,%r17
/* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/ /* FIXME! depi below has hardcoded idea of interrupt stack size (32k)*/
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi 0,63,15,%r17 depdi 0,63,15,%r17
#else #else
depi 0,31,15,%r17 depi 0,31,15,%r17
@ -1115,7 +1108,7 @@ intr_extint:
ldil L%intr_return, %r2 ldil L%intr_return, %r2
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
@ -1153,15 +1146,17 @@ intr_save:
CMPIB=,n 6,%r26,skip_save_ior CMPIB=,n 6,%r26,skip_save_ior
/* save_specials left ipsw value in r8 for us to test */
mfctl %cr20, %r16 /* isr */ mfctl %cr20, %r16 /* isr */
nop /* serialize mfctl on PA 2.0 to avoid 4 cycle penalty */
mfctl %cr21, %r17 /* ior */ mfctl %cr21, %r17 /* ior */
#ifdef __LP64__
#ifdef CONFIG_64BIT
/* /*
* If the interrupted code was running with W bit off (32 bit), * If the interrupted code was running with W bit off (32 bit),
* clear the b bits (bits 0 & 1) in the ior. * clear the b bits (bits 0 & 1) in the ior.
* save_specials left ipsw value in r8 for us to test.
*/ */
extrd,u,*<> %r8,PSW_W_BIT,1,%r0 extrd,u,*<> %r8,PSW_W_BIT,1,%r0
depdi 0,1,2,%r17 depdi 0,1,2,%r17
@ -1192,7 +1187,7 @@ skip_save_ior:
loadgp loadgp
copy %r29, %r25 /* arg1 is pt_regs */ copy %r29, %r25 /* arg1 is pt_regs */
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
@ -1230,7 +1225,7 @@ skip_save_ior:
spc = r24 /* space for which the trap occured */ spc = r24 /* space for which the trap occured */
ptp = r25 /* page directory/page table pointer */ ptp = r25 /* page directory/page table pointer */
#ifdef __LP64__ #ifdef CONFIG_64BIT
dtlb_miss_20w: dtlb_miss_20w:
space_adjust spc,va,t0 space_adjust spc,va,t0
@ -1487,10 +1482,10 @@ nadtlb_emulate:
add,l %r1,%r24,%r1 /* doesn't affect c/b bits */ add,l %r1,%r24,%r1 /* doesn't affect c/b bits */
nadtlb_nullify: nadtlb_nullify:
mfctl %cr22,%r8 /* Get ipsw */ mfctl %ipsw,%r8
ldil L%PSW_N,%r9 ldil L%PSW_N,%r9
or %r8,%r9,%r8 /* Set PSW_N */ or %r8,%r9,%r8 /* Set PSW_N */
mtctl %r8,%cr22 mtctl %r8,%ipsw
rfir rfir
nop nop
@ -1521,7 +1516,7 @@ nadtlb_probe_check:
nop nop
#ifdef __LP64__ #ifdef CONFIG_64BIT
itlb_miss_20w: itlb_miss_20w:
/* /*
@ -1588,7 +1583,7 @@ itlb_miss_20:
#endif #endif
#ifdef __LP64__ #ifdef CONFIG_64BIT
dbit_trap_20w: dbit_trap_20w:
space_adjust spc,va,t0 space_adjust spc,va,t0
@ -1797,7 +1792,7 @@ sys_fork_wrapper:
STREG %r2,-RP_OFFSET(%r30) STREG %r2,-RP_OFFSET(%r30)
ldo FRAME_SIZE(%r30),%r30 ldo FRAME_SIZE(%r30),%r30
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
@ -1847,7 +1842,7 @@ sys_clone_wrapper:
STREG %r2,-RP_OFFSET(%r30) STREG %r2,-RP_OFFSET(%r30)
ldo FRAME_SIZE(%r30),%r30 ldo FRAME_SIZE(%r30),%r30
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
@ -1869,7 +1864,7 @@ sys_vfork_wrapper:
STREG %r2,-RP_OFFSET(%r30) STREG %r2,-RP_OFFSET(%r30)
ldo FRAME_SIZE(%r30),%r30 ldo FRAME_SIZE(%r30),%r30
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
@ -1897,10 +1892,10 @@ sys_vfork_wrapper:
STREG %r2,-RP_OFFSET(%r30) STREG %r2,-RP_OFFSET(%r30)
ldo FRAME_SIZE(%r30),%r30 ldo FRAME_SIZE(%r30),%r30
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
bl \execve,%r2 BL \execve,%r2
copy %r1,%arg0 copy %r1,%arg0
ldo -FRAME_SIZE(%r30),%r30 ldo -FRAME_SIZE(%r30),%r30
@ -1923,7 +1918,7 @@ error_\execve:
sys_execve_wrapper: sys_execve_wrapper:
execve_wrapper sys_execve execve_wrapper sys_execve
#ifdef __LP64__ #ifdef CONFIG_64BIT
.export sys32_execve_wrapper .export sys32_execve_wrapper
.import sys32_execve .import sys32_execve
@ -1937,7 +1932,7 @@ sys_rt_sigreturn_wrapper:
ldo TASK_REGS(%r26),%r26 /* get pt regs */ ldo TASK_REGS(%r26),%r26 /* get pt regs */
/* Don't save regs, we are going to restore them from sigcontext. */ /* Don't save regs, we are going to restore them from sigcontext. */
STREG %r2, -RP_OFFSET(%r30) STREG %r2, -RP_OFFSET(%r30)
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo FRAME_SIZE(%r30), %r30 ldo FRAME_SIZE(%r30), %r30
BL sys_rt_sigreturn,%r2 BL sys_rt_sigreturn,%r2
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
@ -1968,7 +1963,7 @@ sys_sigaltstack_wrapper:
ldo TASK_REGS(%r1),%r24 /* get pt regs */ ldo TASK_REGS(%r1),%r24 /* get pt regs */
LDREG TASK_PT_GR30(%r24),%r24 LDREG TASK_PT_GR30(%r24),%r24
STREG %r2, -RP_OFFSET(%r30) STREG %r2, -RP_OFFSET(%r30)
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo FRAME_SIZE(%r30), %r30 ldo FRAME_SIZE(%r30), %r30
b,l do_sigaltstack,%r2 b,l do_sigaltstack,%r2
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
@ -1982,7 +1977,7 @@ sys_sigaltstack_wrapper:
bv %r0(%r2) bv %r0(%r2)
nop nop
#ifdef __LP64__ #ifdef CONFIG_64BIT
.export sys32_sigaltstack_wrapper .export sys32_sigaltstack_wrapper
sys32_sigaltstack_wrapper: sys32_sigaltstack_wrapper:
/* Get the user stack pointer */ /* Get the user stack pointer */
@ -2006,7 +2001,7 @@ sys_rt_sigsuspend_wrapper:
reg_save %r24 reg_save %r24
STREG %r2, -RP_OFFSET(%r30) STREG %r2, -RP_OFFSET(%r30)
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo FRAME_SIZE(%r30), %r30 ldo FRAME_SIZE(%r30), %r30
b,l sys_rt_sigsuspend,%r2 b,l sys_rt_sigsuspend,%r2
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
@ -2079,7 +2074,7 @@ syscall_check_bh:
ldw TI_CPU-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 /* cpu # */ ldw TI_CPU-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r26 /* cpu # */
/* shift left ____cacheline_aligned (aka L1_CACHE_BYTES) bits */ /* shift left ____cacheline_aligned (aka L1_CACHE_BYTES) bits */
#ifdef __LP64__ #ifdef CONFIG_64BIT
shld %r26, 6, %r20 shld %r26, 6, %r20
#else #else
shlw %r26, 5, %r20 shlw %r26, 5, %r20
@ -2087,9 +2082,6 @@ syscall_check_bh:
add %r19,%r20,%r19 /* now have &irq_stat[smp_processor_id()] */ add %r19,%r20,%r19 /* now have &irq_stat[smp_processor_id()] */
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
LDREG IRQSTAT_SIRQ_PEND(%r19),%r20 /* hardirq.h: unsigned long */
cmpib,<>,n 0,%r20,syscall_do_softirq /* forward */
syscall_check_resched: syscall_check_resched:
/* check for reschedule */ /* check for reschedule */
@ -2144,7 +2136,7 @@ syscall_restore:
depi 3,31,2,%r31 /* ensure return to user mode. */ depi 3,31,2,%r31 /* ensure return to user mode. */
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* decide whether to reset the wide mode bit /* decide whether to reset the wide mode bit
* *
* For a syscall, the W bit is stored in the lowest bit * For a syscall, the W bit is stored in the lowest bit
@ -2227,20 +2219,10 @@ pt_regs_ok:
b intr_restore b intr_restore
nop nop
.import do_softirq,code
syscall_do_softirq:
bl do_softirq,%r2
nop
/* NOTE: We enable I-bit incase we schedule later,
* and we might be going back to userspace if we were
* traced. */
b syscall_check_resched
ssm PSW_SM_I, %r0 /* do_softirq returns with I bit off */
.import schedule,code .import schedule,code
syscall_do_resched: syscall_do_resched:
BL schedule,%r2 BL schedule,%r2
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#else #else
nop nop
@ -2260,7 +2242,7 @@ syscall_do_signal:
ldi 1, %r24 /* unsigned long in_syscall */ ldi 1, %r24 /* unsigned long in_syscall */
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
BL do_signal,%r2 BL do_signal,%r2

View File

@ -83,15 +83,15 @@ static unsigned long pdc_result2[32] __attribute__ ((aligned (8)));
int parisc_narrow_firmware = 1; int parisc_narrow_firmware = 1;
#endif #endif
/* on all currently-supported platforms, IODC I/O calls are always /* On most currently-supported platforms, IODC I/O calls are 32-bit calls
* 32-bit calls, and MEM_PDC calls are always the same width as the OS. * and MEM_PDC calls are always the same width as the OS.
* This means Cxxx boxes can't run wide kernels right now. -PB * Some PAT boxes may have 64-bit IODC I/O.
* *
* CONFIG_PDC_NARROW has been added to allow 64-bit kernels to run on * Ryan Bradetich added the now obsolete CONFIG_PDC_NARROW to allow
* systems with 32-bit MEM_PDC calls. This will allow wide kernels to * 64-bit kernels to run on systems with 32-bit MEM_PDC calls.
* run on Cxxx boxes now. -RB * This allowed wide kernels to run on Cxxx boxes.
* * We now detect 32-bit-only PDC and dynamically switch to 32-bit mode
* Note that some PAT boxes may have 64-bit IODC I/O... * when running a 64-bit kernel on such boxes (e.g. C200 or C360).
*/ */
#ifdef __LP64__ #ifdef __LP64__

View File

@ -12,7 +12,7 @@
* Initial Version 04-23-1999 by Helge Deller <deller@gmx.de> * Initial Version 04-23-1999 by Helge Deller <deller@gmx.de>
*/ */
#include <linux/autoconf.h> /* for CONFIG_SMP */ #include <linux/config.h> /* for CONFIG_SMP */
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/psw.h> #include <asm/psw.h>
@ -36,10 +36,10 @@ boot_args:
.align 4 .align 4
.import init_thread_union,data .import init_thread_union,data
.import fault_vector_20,code /* IVA parisc 2.0 32 bit */ .import fault_vector_20,code /* IVA parisc 2.0 32 bit */
#ifndef __LP64__ #ifndef CONFIG_64BIT
.import fault_vector_11,code /* IVA parisc 1.1 32 bit */ .import fault_vector_11,code /* IVA parisc 1.1 32 bit */
.import $global$ /* forward declaration */ .import $global$ /* forward declaration */
#endif /*!LP64*/ #endif /*!CONFIG_64BIT*/
.export stext .export stext
.export _stext,data /* Kernel want it this way! */ .export _stext,data /* Kernel want it this way! */
_stext: _stext:
@ -76,7 +76,7 @@ $bss_loop:
mtctl %r4,%cr24 /* Initialize kernel root pointer */ mtctl %r4,%cr24 /* Initialize kernel root pointer */
mtctl %r4,%cr25 /* Initialize user root pointer */ mtctl %r4,%cr25 /* Initialize user root pointer */
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* Set pmd in pgd */ /* Set pmd in pgd */
load32 PA(pmd0),%r5 load32 PA(pmd0),%r5
shrd %r5,PxD_VALUE_SHIFT,%r3 shrd %r5,PxD_VALUE_SHIFT,%r3
@ -99,7 +99,7 @@ $bss_loop:
stw %r3,0(%r4) stw %r3,0(%r4)
ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3 ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
addib,> -1,%r1,1b addib,> -1,%r1,1b
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo ASM_PMD_ENTRY_SIZE(%r4),%r4 ldo ASM_PMD_ENTRY_SIZE(%r4),%r4
#else #else
ldo ASM_PGD_ENTRY_SIZE(%r4),%r4 ldo ASM_PGD_ENTRY_SIZE(%r4),%r4
@ -170,7 +170,7 @@ common_stext:
stw %r0,0x28(%r0) /* MEM_RENDEZ_HI */ stw %r0,0x28(%r0) /* MEM_RENDEZ_HI */
#endif /*CONFIG_SMP*/ #endif /*CONFIG_SMP*/
#ifdef __LP64__ #ifdef CONFIG_64BIT
tophys_r1 %sp tophys_r1 %sp
/* Save the rfi target address */ /* Save the rfi target address */
@ -224,8 +224,6 @@ stext_pdc_ret:
mtctl %r0,%cr12 mtctl %r0,%cr12
mtctl %r0,%cr13 mtctl %r0,%cr13
/* Prepare to RFI! Man all the cannons! */
/* Initialize the global data pointer */ /* Initialize the global data pointer */
loadgp loadgp
@ -235,7 +233,7 @@ stext_pdc_ret:
* following short sequence of instructions can determine this * following short sequence of instructions can determine this
* (without being illegal on a PA1.1 machine). * (without being illegal on a PA1.1 machine).
*/ */
#ifndef __LP64__ #ifndef CONFIG_64BIT
ldi 32,%r10 ldi 32,%r10
mtctl %r10,%cr11 mtctl %r10,%cr11
.level 2.0 .level 2.0
@ -248,52 +246,22 @@ stext_pdc_ret:
$is_pa20: $is_pa20:
.level LEVEL /* restore 1.1 || 2.0w */ .level LEVEL /* restore 1.1 || 2.0w */
#endif /*!LP64*/ #endif /*!CONFIG_64BIT*/
load32 PA(fault_vector_20),%r10 load32 PA(fault_vector_20),%r10
$install_iva: $install_iva:
mtctl %r10,%cr14 mtctl %r10,%cr14
#ifdef __LP64__ b aligned_rfi /* Prepare to RFI! Man all the cannons! */
b aligned_rfi
nop nop
.align 256 .align 128
aligned_rfi: aligned_rfi:
ssm 0,0 pcxt_ssm_bug
nop /* 1 */
nop /* 2 */
nop /* 3 */
nop /* 4 */
nop /* 5 */
nop /* 6 */
nop /* 7 */
nop /* 8 */
#endif
#ifdef __LP64__ /* move to psw.h? */ rsm PSW_SM_QUIET,%r0 /* off troublesome PSW bits */
#define PSW_BITS PSW_Q+PSW_I+PSW_D+PSW_P+PSW_R /* Don't need NOPs, have 8 compliant insn before rfi */
#else
#define PSW_BITS PSW_SM_Q
#endif
$rfi:
/* turn off troublesome PSW bits */
rsm PSW_BITS,%r0
/* kernel PSW:
* - no interruptions except HPMC and TOC (which are handled by PDC)
* - Q bit set (IODC / PDC interruptions)
* - big-endian
* - virtually mapped
*/
load32 KERNEL_PSW,%r10
mtctl %r10,%ipsw
/* Set the space pointers for the post-RFI world
** Clear the two-level IIA Space Queue, effectively setting
** Kernel space.
*/
mtctl %r0,%cr17 /* Clear IIASQ tail */ mtctl %r0,%cr17 /* Clear IIASQ tail */
mtctl %r0,%cr17 /* Clear IIASQ head */ mtctl %r0,%cr17 /* Clear IIASQ head */
@ -301,8 +269,11 @@ $rfi:
mtctl %r11,%cr18 /* IIAOQ head */ mtctl %r11,%cr18 /* IIAOQ head */
ldo 4(%r11),%r11 ldo 4(%r11),%r11
mtctl %r11,%cr18 /* IIAOQ tail */ mtctl %r11,%cr18 /* IIAOQ tail */
load32 KERNEL_PSW,%r10
mtctl %r10,%ipsw
/* Jump to hyperspace */ /* Jump through hyperspace to Virt Mode */
rfi rfi
nop nop
@ -313,7 +284,7 @@ $rfi:
.import smp_init_current_idle_task,data .import smp_init_current_idle_task,data
.import smp_callin,code .import smp_callin,code
#ifndef __LP64__ #ifndef CONFIG_64BIT
smp_callin_rtn: smp_callin_rtn:
.proc .proc
.callinfo .callinfo
@ -321,7 +292,7 @@ smp_callin_rtn:
nop nop
nop nop
.procend .procend
#endif /*!LP64*/ #endif /*!CONFIG_64BIT*/
/*************************************************************************** /***************************************************************************
* smp_slave_stext is executed by all non-monarch Processors when the Monarch * smp_slave_stext is executed by all non-monarch Processors when the Monarch
@ -356,7 +327,7 @@ smp_slave_stext:
mtctl %r4,%cr24 /* Initialize kernel root pointer */ mtctl %r4,%cr24 /* Initialize kernel root pointer */
mtctl %r4,%cr25 /* Initialize user root pointer */ mtctl %r4,%cr25 /* Initialize user root pointer */
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* Setup PDCE_PROC entry */ /* Setup PDCE_PROC entry */
copy %arg0,%r3 copy %arg0,%r3
#else #else
@ -373,7 +344,7 @@ smp_slave_stext:
.procend .procend
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#ifndef __LP64__ #ifndef CONFIG_64BIT
.data .data
.align 4 .align 4
@ -383,4 +354,4 @@ smp_slave_stext:
.size $global$,4 .size $global$,4
$global$: $global$:
.word 0 .word 0
#endif /*!LP64*/ #endif /*!CONFIG_64BIT*/

View File

@ -104,12 +104,9 @@ static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg)
} }
out: out:
if (kversion.name) kfree(kversion.name);
kfree(kversion.name); kfree(kversion.date);
if (kversion.date) kfree(kversion.desc);
kfree(kversion.date);
if (kversion.desc)
kfree(kversion.desc);
return ret; return ret;
} }
@ -166,9 +163,7 @@ static int drm32_getsetunique(unsigned int fd, unsigned int cmd, unsigned long a
ret = -EFAULT; ret = -EFAULT;
} }
if (karg.unique != NULL) kfree(karg.unique);
kfree(karg.unique);
return ret; return ret;
} }
@ -265,7 +260,6 @@ static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
} }
kfree(karg.list); kfree(karg.list);
return ret; return ret;
} }
@ -305,7 +299,6 @@ static int drm32_free_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
out: out:
kfree(karg.list); kfree(karg.list);
return ret; return ret;
} }
@ -494,15 +487,10 @@ static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg)
} }
out: out:
if (karg.send_indices) kfree(karg.send_indices);
kfree(karg.send_indices); kfree(karg.send_sizes);
if (karg.send_sizes) kfree(karg.request_indices);
kfree(karg.send_sizes); kfree(karg.request_sizes);
if (karg.request_indices)
kfree(karg.request_indices);
if (karg.request_sizes)
kfree(karg.request_sizes);
return ret; return ret;
} }
@ -555,9 +543,7 @@ static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg)
ret = -EFAULT; ret = -EFAULT;
} }
if (karg.contexts) kfree(karg.contexts);
kfree(karg.contexts);
return ret; return ret;
} }

View File

@ -26,7 +26,7 @@
* can be used. * can be used.
*/ */
#ifdef __LP64__ #ifdef CONFIG_64BIT
#define ADDIB addib,* #define ADDIB addib,*
#define CMPB cmpb,* #define CMPB cmpb,*
#define ANDCM andcm,* #define ANDCM andcm,*
@ -40,8 +40,10 @@
.level 2.0 .level 2.0
#endif #endif
#include <asm/assembly.h> #include <linux/config.h>
#include <asm/psw.h> #include <asm/psw.h>
#include <asm/assembly.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/cache.h> #include <asm/cache.h>
@ -62,32 +64,23 @@ flush_tlb_all_local:
* to happen in real mode with all interruptions disabled. * to happen in real mode with all interruptions disabled.
*/ */
/* /* pcxt_ssm_bug - relied upon translation! PA 2.0 Arch. F-4 and F-5 */
* Once again, we do the rfi dance ... some day we need examine rsm PSW_SM_I, %r19 /* save I-bit state */
* all of our uses of this type of code and see what can be load32 PA(1f), %r1
* consolidated. nop
*/ nop
nop
nop
nop
rsm PSW_SM_I, %r19 /* relied upon translation! PA 2.0 Arch. F-5 */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
nop
nop
nop
nop
nop
nop
nop
rsm PSW_SM_Q, %r0 /* Turn off Q bit to load iia queue */
ldil L%REAL_MODE_PSW, %r1
ldo R%REAL_MODE_PSW(%r1), %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%PA(1f), %r1
ldo R%PA(1f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 REAL_MODE_PSW, %r1
mtctl %r1, %ipsw
rfi rfi
nop nop
@ -178,29 +171,36 @@ fdtonemiddle: /* Loop if LOOP = 1 */
ADDIB> -1, %r22, fdtoneloop /* Outer loop count decr */ ADDIB> -1, %r22, fdtoneloop /* Outer loop count decr */
add %r21, %r20, %r20 /* increment space */ add %r21, %r20, %r20 /* increment space */
fdtdone: fdtdone:
/*
* Switch back to virtual mode
*/
/* pcxt_ssm_bug */
rsm PSW_SM_I, %r0
load32 2f, %r1
nop
nop
nop
nop
nop
/* Switch back to virtual mode */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
rsm PSW_SM_Q, %r0 /* clear Q bit to load iia queue */
ldil L%KERNEL_PSW, %r1
ldo R%KERNEL_PSW(%r1), %r1
or %r1, %r19, %r1 /* Set I bit if set on entry */
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%(2f), %r1
ldo R%(2f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 KERNEL_PSW, %r1
or %r1, %r19, %r1 /* I-bit to state on entry */
mtctl %r1, %ipsw /* restore I-bit (entire PSW) */
rfi rfi
nop nop
2: bv %r0(%r2) 2: bv %r0(%r2)
nop nop
.exit
.exit
.procend .procend
.export flush_instruction_cache_local,code .export flush_instruction_cache_local,code
@ -227,7 +227,7 @@ flush_instruction_cache_local:
fimanyloop: /* Loop if LOOP >= 2 */ fimanyloop: /* Loop if LOOP >= 2 */
ADDIB> -1, %r31, fimanyloop /* Adjusted inner loop decr */ ADDIB> -1, %r31, fimanyloop /* Adjusted inner loop decr */
fice 0(%sr1, %arg0) fice %r0(%sr1, %arg0)
fice,m %arg1(%sr1, %arg0) /* Last fice and addr adjust */ fice,m %arg1(%sr1, %arg0) /* Last fice and addr adjust */
movb,tr %arg3, %r31, fimanyloop /* Re-init inner loop count */ movb,tr %arg3, %r31, fimanyloop /* Re-init inner loop count */
ADDIB<=,n -1, %arg2, fisync /* Outer loop decr */ ADDIB<=,n -1, %arg2, fisync /* Outer loop decr */
@ -238,7 +238,7 @@ fioneloop: /* Loop if LOOP = 1 */
fisync: fisync:
sync sync
mtsm %r22 mtsm %r22 /* restore I-bit */
bv %r0(%r2) bv %r0(%r2)
nop nop
.exit .exit
@ -269,7 +269,7 @@ flush_data_cache_local:
fdmanyloop: /* Loop if LOOP >= 2 */ fdmanyloop: /* Loop if LOOP >= 2 */
ADDIB> -1, %r31, fdmanyloop /* Adjusted inner loop decr */ ADDIB> -1, %r31, fdmanyloop /* Adjusted inner loop decr */
fdce 0(%sr1, %arg0) fdce %r0(%sr1, %arg0)
fdce,m %arg1(%sr1, %arg0) /* Last fdce and addr adjust */ fdce,m %arg1(%sr1, %arg0) /* Last fdce and addr adjust */
movb,tr %arg3, %r31, fdmanyloop /* Re-init inner loop count */ movb,tr %arg3, %r31, fdmanyloop /* Re-init inner loop count */
ADDIB<=,n -1, %arg2, fdsync /* Outer loop decr */ ADDIB<=,n -1, %arg2, fdsync /* Outer loop decr */
@ -281,7 +281,7 @@ fdoneloop: /* Loop if LOOP = 1 */
fdsync: fdsync:
syncdma syncdma
sync sync
mtsm %r22 mtsm %r22 /* restore I-bit */
bv %r0(%r2) bv %r0(%r2)
nop nop
.exit .exit
@ -296,7 +296,7 @@ copy_user_page_asm:
.callinfo NO_CALLS .callinfo NO_CALLS
.entry .entry
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* PA8x00 CPUs can consume 2 loads or 1 store per cycle. /* PA8x00 CPUs can consume 2 loads or 1 store per cycle.
* Unroll the loop by hand and arrange insn appropriately. * Unroll the loop by hand and arrange insn appropriately.
* GCC probably can do this just as well. * GCC probably can do this just as well.
@ -351,7 +351,11 @@ copy_user_page_asm:
std %r22, 120(%r26) std %r22, 120(%r26)
ldo 128(%r26), %r26 ldo 128(%r26), %r26
ADDIB> -1, %r1, 1b /* bundle 10 */ /* conditional branches nullify on forward taken branch, and on
* non-taken backward branch. Note that .+4 is a backwards branch.
* The ldd should only get executed if the branch is taken.
*/
ADDIB>,n -1, %r1, 1b /* bundle 10 */
ldd 0(%r25), %r19 /* start next loads */ ldd 0(%r25), %r19 /* start next loads */
#else #else
@ -363,10 +367,10 @@ copy_user_page_asm:
* the full 64 bit register values on interrupt, we can't * the full 64 bit register values on interrupt, we can't
* use ldd/std on a 32 bit kernel. * use ldd/std on a 32 bit kernel.
*/ */
ldw 0(%r25), %r19
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */ ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
1: 1:
ldw 0(%r25), %r19
ldw 4(%r25), %r20 ldw 4(%r25), %r20
ldw 8(%r25), %r21 ldw 8(%r25), %r21
ldw 12(%r25), %r22 ldw 12(%r25), %r22
@ -396,11 +400,12 @@ copy_user_page_asm:
ldw 60(%r25), %r22 ldw 60(%r25), %r22
stw %r19, 48(%r26) stw %r19, 48(%r26)
stw %r20, 52(%r26) stw %r20, 52(%r26)
ldo 64(%r25), %r25
stw %r21, 56(%r26) stw %r21, 56(%r26)
stw %r22, 60(%r26) stw %r22, 60(%r26)
ldo 64(%r26), %r26 ldo 64(%r26), %r26
ADDIB> -1, %r1, 1b ADDIB>,n -1, %r1, 1b
ldo 64(%r25), %r25 ldw 0(%r25), %r19
#endif #endif
bv %r0(%r2) bv %r0(%r2)
nop nop
@ -456,7 +461,7 @@ copy_user_page_asm:
sub %r25, %r1, %r23 /* move physical addr into non shadowed reg */ sub %r25, %r1, %r23 /* move physical addr into non shadowed reg */
ldil L%(TMPALIAS_MAP_START), %r28 ldil L%(TMPALIAS_MAP_START), %r28
#ifdef __LP64__ #ifdef CONFIG_64BIT
extrd,u %r26,56,32, %r26 /* convert phys addr to tlb insert format */ extrd,u %r26,56,32, %r26 /* convert phys addr to tlb insert format */
extrd,u %r23,56,32, %r23 /* convert phys addr to tlb insert format */ extrd,u %r23,56,32, %r23 /* convert phys addr to tlb insert format */
depd %r24,63,22, %r28 /* Form aliased virtual address 'to' */ depd %r24,63,22, %r28 /* Form aliased virtual address 'to' */
@ -543,7 +548,7 @@ __clear_user_page_asm:
tophys_r1 %r26 tophys_r1 %r26
ldil L%(TMPALIAS_MAP_START), %r28 ldil L%(TMPALIAS_MAP_START), %r28
#ifdef __LP64__ #ifdef CONFIG_64BIT
#if (TMPALIAS_MAP_START >= 0x80000000) #if (TMPALIAS_MAP_START >= 0x80000000)
depdi 0, 31,32, %r28 /* clear any sign extension */ depdi 0, 31,32, %r28 /* clear any sign extension */
#endif #endif
@ -560,7 +565,7 @@ __clear_user_page_asm:
pdtlb 0(%r28) pdtlb 0(%r28)
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldi 32, %r1 /* PAGE_SIZE/128 == 32 */ ldi 32, %r1 /* PAGE_SIZE/128 == 32 */
/* PREFETCH (Write) has not (yet) been proven to help here */ /* PREFETCH (Write) has not (yet) been proven to help here */
@ -585,7 +590,7 @@ __clear_user_page_asm:
ADDIB> -1, %r1, 1b ADDIB> -1, %r1, 1b
ldo 128(%r28), %r28 ldo 128(%r28), %r28
#else /* ! __LP64 */ #else /* ! CONFIG_64BIT */
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */ ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
@ -608,7 +613,7 @@ __clear_user_page_asm:
stw %r0, 60(%r28) stw %r0, 60(%r28)
ADDIB> -1, %r1, 1b ADDIB> -1, %r1, 1b
ldo 64(%r28), %r28 ldo 64(%r28), %r28
#endif /* __LP64 */ #endif /* CONFIG_64BIT */
bv %r0(%r2) bv %r0(%r2)
nop nop
@ -626,7 +631,7 @@ flush_kernel_dcache_page:
ldil L%dcache_stride, %r1 ldil L%dcache_stride, %r1
ldw R%dcache_stride(%r1), %r23 ldw R%dcache_stride(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi,z 1, 63-PAGE_SHIFT,1, %r25 depdi,z 1, 63-PAGE_SHIFT,1, %r25
#else #else
depwi,z 1, 31-PAGE_SHIFT,1, %r25 depwi,z 1, 31-PAGE_SHIFT,1, %r25
@ -670,7 +675,7 @@ flush_user_dcache_page:
ldil L%dcache_stride, %r1 ldil L%dcache_stride, %r1
ldw R%dcache_stride(%r1), %r23 ldw R%dcache_stride(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi,z 1,63-PAGE_SHIFT,1, %r25 depdi,z 1,63-PAGE_SHIFT,1, %r25
#else #else
depwi,z 1,31-PAGE_SHIFT,1, %r25 depwi,z 1,31-PAGE_SHIFT,1, %r25
@ -714,7 +719,7 @@ flush_user_icache_page:
ldil L%dcache_stride, %r1 ldil L%dcache_stride, %r1
ldw R%dcache_stride(%r1), %r23 ldw R%dcache_stride(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi,z 1, 63-PAGE_SHIFT,1, %r25 depdi,z 1, 63-PAGE_SHIFT,1, %r25
#else #else
depwi,z 1, 31-PAGE_SHIFT,1, %r25 depwi,z 1, 31-PAGE_SHIFT,1, %r25
@ -759,7 +764,7 @@ purge_kernel_dcache_page:
ldil L%dcache_stride, %r1 ldil L%dcache_stride, %r1
ldw R%dcache_stride(%r1), %r23 ldw R%dcache_stride(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi,z 1, 63-PAGE_SHIFT,1, %r25 depdi,z 1, 63-PAGE_SHIFT,1, %r25
#else #else
depwi,z 1, 31-PAGE_SHIFT,1, %r25 depwi,z 1, 31-PAGE_SHIFT,1, %r25
@ -807,7 +812,7 @@ flush_alias_page:
tophys_r1 %r26 tophys_r1 %r26
ldil L%(TMPALIAS_MAP_START), %r28 ldil L%(TMPALIAS_MAP_START), %r28
#ifdef __LP64__ #ifdef CONFIG_64BIT
extrd,u %r26, 56,32, %r26 /* convert phys addr to tlb insert format */ extrd,u %r26, 56,32, %r26 /* convert phys addr to tlb insert format */
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */
depdi 0, 63,12, %r28 /* Clear any offset bits */ depdi 0, 63,12, %r28 /* Clear any offset bits */
@ -824,7 +829,7 @@ flush_alias_page:
ldil L%dcache_stride, %r1 ldil L%dcache_stride, %r1
ldw R%dcache_stride(%r1), %r23 ldw R%dcache_stride(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi,z 1, 63-PAGE_SHIFT,1, %r29 depdi,z 1, 63-PAGE_SHIFT,1, %r29
#else #else
depwi,z 1, 31-PAGE_SHIFT,1, %r29 depwi,z 1, 31-PAGE_SHIFT,1, %r29
@ -935,7 +940,7 @@ flush_kernel_icache_page:
ldil L%icache_stride, %r1 ldil L%icache_stride, %r1
ldw R%icache_stride(%r1), %r23 ldw R%icache_stride(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
depdi,z 1, 63-PAGE_SHIFT,1, %r25 depdi,z 1, 63-PAGE_SHIFT,1, %r25
#else #else
depwi,z 1, 31-PAGE_SHIFT,1, %r25 depwi,z 1, 31-PAGE_SHIFT,1, %r25
@ -944,23 +949,23 @@ flush_kernel_icache_page:
sub %r25, %r23, %r25 sub %r25, %r23, %r25
1: fic,m %r23(%r26) 1: fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
CMPB<< %r26, %r25, 1b CMPB<< %r26, %r25, 1b
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
sync sync
bv %r0(%r2) bv %r0(%r2)
@ -982,17 +987,18 @@ flush_kernel_icache_range_asm:
ANDCM %r26, %r21, %r26 ANDCM %r26, %r21, %r26
1: CMPB<<,n %r26, %r25, 1b 1: CMPB<<,n %r26, %r25, 1b
fic,m %r23(%r26) fic,m %r23(%sr4, %r26)
sync sync
bv %r0(%r2) bv %r0(%r2)
nop nop
.exit .exit
.procend .procend
.align 128 /* align should cover use of rfi in disable_sr_hashing_asm and
* srdis_done.
*/
.align 256
.export disable_sr_hashing_asm,code .export disable_sr_hashing_asm,code
disable_sr_hashing_asm: disable_sr_hashing_asm:
@ -1000,28 +1006,26 @@ disable_sr_hashing_asm:
.callinfo NO_CALLS .callinfo NO_CALLS
.entry .entry
/* Switch to real mode */ /*
* Switch to real mode
*/
/* pcxt_ssm_bug */
rsm PSW_SM_I, %r0
load32 PA(1f), %r1
nop
nop
nop
nop
nop
ssm 0, %r0 /* relied upon translation! */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
nop
nop
nop
nop
nop
nop
nop
rsm (PSW_SM_Q|PSW_SM_I), %r0 /* disable Q&I to load the iia queue */
ldil L%REAL_MODE_PSW, %r1
ldo R%REAL_MODE_PSW(%r1), %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%PA(1f), %r1
ldo R%PA(1f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 REAL_MODE_PSW, %r1
mtctl %r1, %ipsw
rfi rfi
nop nop
@ -1053,27 +1057,31 @@ srdis_pcxl:
srdis_pa20: srdis_pa20:
/* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+ */ /* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+,PCXW2 */
.word 0x144008bc /* mfdiag %dr2, %r28 */ .word 0x144008bc /* mfdiag %dr2, %r28 */
depdi 0, 54,1, %r28 /* clear DIAG_SPHASH_ENAB (bit 54) */ depdi 0, 54,1, %r28 /* clear DIAG_SPHASH_ENAB (bit 54) */
.word 0x145c1840 /* mtdiag %r28, %dr2 */ .word 0x145c1840 /* mtdiag %r28, %dr2 */
srdis_done: srdis_done:
/* Switch back to virtual mode */ /* Switch back to virtual mode */
rsm PSW_SM_I, %r0 /* prep to load iia queue */
load32 2f, %r1
nop
nop
nop
nop
nop
rsm PSW_SM_Q, %r0 /* clear Q bit to load iia queue */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
ldil L%KERNEL_PSW, %r1
ldo R%KERNEL_PSW(%r1), %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%(2f), %r1
ldo R%(2f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 KERNEL_PSW, %r1
mtctl %r1, %ipsw
rfi rfi
nop nop

View File

@ -31,7 +31,7 @@
#include <asm/page.h> /* get_order */ #include <asm/page.h> /* get_order */
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/tlbflush.h> /* for purge_tlb_*() macros */
static struct proc_dir_entry * proc_gsc_root = NULL; static struct proc_dir_entry * proc_gsc_root = NULL;
static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length); static int pcxl_proc_info(char *buffer, char **start, off_t offset, int length);
@ -333,18 +333,28 @@ pcxl_free_range(unsigned long vaddr, size_t size)
static int __init static int __init
pcxl_dma_init(void) pcxl_dma_init(void)
{ {
if (pcxl_dma_start == 0) if (pcxl_dma_start == 0)
return 0; return 0;
spin_lock_init(&pcxl_res_lock); spin_lock_init(&pcxl_res_lock);
pcxl_res_size = PCXL_DMA_MAP_SIZE >> (PAGE_SHIFT + 3); pcxl_res_size = PCXL_DMA_MAP_SIZE >> (PAGE_SHIFT + 3);
pcxl_res_hint = 0; pcxl_res_hint = 0;
pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL, pcxl_res_map = (char *)__get_free_pages(GFP_KERNEL,
get_order(pcxl_res_size)); get_order(pcxl_res_size));
memset(pcxl_res_map, 0, pcxl_res_size); memset(pcxl_res_map, 0, pcxl_res_size);
proc_gsc_root = proc_mkdir("gsc", 0); proc_gsc_root = proc_mkdir("gsc", 0);
create_proc_info_entry("dino", 0, proc_gsc_root, pcxl_proc_info); if (!proc_gsc_root)
return 0; printk(KERN_WARNING
"pcxl_dma_init: Unable to create gsc /proc dir entry\n");
else {
struct proc_dir_entry* ent;
ent = create_proc_info_entry("pcxl_dma", 0,
proc_gsc_root, pcxl_proc_info);
if (!ent)
printk(KERN_WARNING
"pci-dma.c: Unable to create pcxl_dma /proc entry.\n");
}
return 0;
} }
__initcall(pcxl_dma_init); __initcall(pcxl_dma_init);
@ -545,16 +555,16 @@ struct hppa_dma_ops pcx_dma_ops = {
static int pcxl_proc_info(char *buf, char **start, off_t offset, int len) static int pcxl_proc_info(char *buf, char **start, off_t offset, int len)
{ {
#if 0
u_long i = 0; u_long i = 0;
unsigned long *res_ptr = (u_long *)pcxl_res_map; unsigned long *res_ptr = (u_long *)pcxl_res_map;
unsigned long total_pages = pcxl_res_size << 3; /* 8 bits per byte */ #endif
unsigned long total_pages = pcxl_res_size << 3; /* 8 bits per byte */
sprintf(buf, "\nDMA Mapping Area size : %d bytes (%d pages)\n", sprintf(buf, "\nDMA Mapping Area size : %d bytes (%ld pages)\n",
PCXL_DMA_MAP_SIZE, PCXL_DMA_MAP_SIZE, total_pages);
(pcxl_res_size << 3) ); /* 1 bit per page */
sprintf(buf, "%sResource bitmap : %d bytes (%d pages)\n", sprintf(buf, "%sResource bitmap : %d bytes\n", buf, pcxl_res_size);
buf, pcxl_res_size, pcxl_res_size << 3); /* 8 bits per byte */
strcat(buf, " total: free: used: % used:\n"); strcat(buf, " total: free: used: % used:\n");
sprintf(buf, "%sblocks %8d %8ld %8ld %8ld%%\n", buf, pcxl_res_size, sprintf(buf, "%sblocks %8d %8ld %8ld %8ld%%\n", buf, pcxl_res_size,
@ -564,7 +574,8 @@ static int pcxl_proc_info(char *buf, char **start, off_t offset, int len)
sprintf(buf, "%spages %8ld %8ld %8ld %8ld%%\n", buf, total_pages, sprintf(buf, "%spages %8ld %8ld %8ld %8ld%%\n", buf, total_pages,
total_pages - pcxl_used_pages, pcxl_used_pages, total_pages - pcxl_used_pages, pcxl_used_pages,
(pcxl_used_pages * 100 / total_pages)); (pcxl_used_pages * 100 / total_pages));
#if 0
strcat(buf, "\nResource bitmap:"); strcat(buf, "\nResource bitmap:");
for(; i < (pcxl_res_size / sizeof(u_long)); ++i, ++res_ptr) { for(; i < (pcxl_res_size / sizeof(u_long)); ++i, ++res_ptr) {
@ -572,6 +583,7 @@ static int pcxl_proc_info(char *buf, char **start, off_t offset, int len)
strcat(buf,"\n "); strcat(buf,"\n ");
sprintf(buf, "%s %08lx", buf, *res_ptr); sprintf(buf, "%s %08lx", buf, *res_ptr);
} }
#endif
strcat(buf, "\n"); strcat(buf, "\n");
return strlen(buf); return strlen(buf);
} }

View File

@ -202,7 +202,8 @@ static void
pcibios_link_hba_resources( struct resource *hba_res, struct resource *r) pcibios_link_hba_resources( struct resource *hba_res, struct resource *r)
{ {
if (!r->parent) { if (!r->parent) {
printk(KERN_EMERG "PCI: Tell willy he's wrong\n"); printk(KERN_EMERG "PCI: resource not parented! [%lx-%lx]\n",
r->start, r->end);
r->parent = hba_res; r->parent = hba_res;
/* reverse link is harder *sigh* */ /* reverse link is harder *sigh* */

View File

@ -41,7 +41,7 @@
/* Define EARLY_BOOTUP_DEBUG to debug kernel related boot problems. /* Define EARLY_BOOTUP_DEBUG to debug kernel related boot problems.
* On production kernels EARLY_BOOTUP_DEBUG should be undefined. */ * On production kernels EARLY_BOOTUP_DEBUG should be undefined. */
#undef EARLY_BOOTUP_DEBUG #define EARLY_BOOTUP_DEBUG
#include <linux/config.h> #include <linux/config.h>
@ -49,14 +49,8 @@
#include <linux/console.h> #include <linux/console.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <asm/page.h>
#include <asm/types.h>
#include <asm/system.h>
#include <asm/pdc.h> /* for iodc_call() proto and friends */ #include <asm/pdc.h> /* for iodc_call() proto and friends */
@ -96,7 +90,6 @@ static int pdc_console_setup(struct console *co, char *options)
} }
#if defined(CONFIG_PDC_CONSOLE) #if defined(CONFIG_PDC_CONSOLE)
#define PDC_CONSOLE_DEVICE pdc_console_device
static struct tty_driver * pdc_console_device (struct console *c, int *index) static struct tty_driver * pdc_console_device (struct console *c, int *index)
{ {
extern struct tty_driver console_driver; extern struct tty_driver console_driver;
@ -104,22 +97,19 @@ static struct tty_driver * pdc_console_device (struct console *c, int *index)
return &console_driver; return &console_driver;
} }
#else #else
#define PDC_CONSOLE_DEVICE NULL #define pdc_console_device NULL
#endif #endif
static struct console pdc_cons = { static struct console pdc_cons = {
.name = "ttyB", .name = "ttyB",
.write = pdc_console_write, .write = pdc_console_write,
.device = PDC_CONSOLE_DEVICE, .device = pdc_console_device,
.setup = pdc_console_setup, .setup = pdc_console_setup,
.flags = CON_BOOT|CON_PRINTBUFFER|CON_ENABLED, .flags = CON_BOOT | CON_PRINTBUFFER | CON_ENABLED,
.index = -1, .index = -1,
}; };
static int pdc_console_initialized; static int pdc_console_initialized;
extern unsigned long con_start; /* kernel/printk.c */
extern unsigned long log_end; /* kernel/printk.c */
static void pdc_console_init_force(void) static void pdc_console_init_force(void)
{ {
@ -146,27 +136,11 @@ void __init pdc_console_init(void)
} }
/* Unregister the pdc console with the printk console layer */
void pdc_console_die(void)
{
if (!pdc_console_initialized)
return;
--pdc_console_initialized;
printk(KERN_INFO "Switching from PDC console\n");
/* Don't repeat what we've already printed */
con_start = log_end;
unregister_console(&pdc_cons);
}
/* /*
* Used for emergencies. Currently only used if an HPMC occurs. If an * Used for emergencies. Currently only used if an HPMC occurs. If an
* HPMC occurs, it is possible that the current console may not be * HPMC occurs, it is possible that the current console may not be
* properly initialed after the PDC IO reset. This routine unregisters all * properly initialised after the PDC IO reset. This routine unregisters
* of the current consoles, reinitializes the pdc console and * all of the current consoles, reinitializes the pdc console and
* registers it. * registers it.
*/ */
@ -177,13 +151,13 @@ void pdc_console_restart(void)
if (pdc_console_initialized) if (pdc_console_initialized)
return; return;
/* If we've already seen the output, don't bother to print it again */
if (console_drivers != NULL)
pdc_cons.flags &= ~CON_PRINTBUFFER;
while ((console = console_drivers) != NULL) while ((console = console_drivers) != NULL)
unregister_console(console_drivers); unregister_console(console_drivers);
/* Don't repeat what we've already printed */
con_start = log_end;
/* force registering the pdc console */ /* force registering the pdc console */
pdc_console_init_force(); pdc_console_init_force();
} }

View File

@ -746,7 +746,8 @@ static int perf_write_image(uint64_t *memaddr)
uint64_t *bptr; uint64_t *bptr;
uint32_t dwords; uint32_t dwords;
uint32_t *intrigue_rdr; uint32_t *intrigue_rdr;
uint64_t *intrigue_bitmask, tmp64, proc_hpa; uint64_t *intrigue_bitmask, tmp64;
void __iomem *runway;
struct rdr_tbl_ent *tentry; struct rdr_tbl_ent *tentry;
int i; int i;
@ -798,15 +799,16 @@ static int perf_write_image(uint64_t *memaddr)
return -1; return -1;
} }
proc_hpa = cpu_device->hpa; runway = ioremap(cpu_device->hpa.start, 4096);
/* Merge intrigue bits into Runway STATUS 0 */ /* Merge intrigue bits into Runway STATUS 0 */
tmp64 = __raw_readq(proc_hpa + RUNWAY_STATUS) & 0xffecfffffffffffful; tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
__raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul), proc_hpa + RUNWAY_STATUS); __raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
runway + RUNWAY_STATUS);
/* Write RUNWAY DEBUG registers */ /* Write RUNWAY DEBUG registers */
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
__raw_writeq(*memaddr++, proc_hpa + RUNWAY_DEBUG + i); __raw_writeq(*memaddr++, runway + RUNWAY_DEBUG);
} }
return 0; return 0;

View File

@ -9,7 +9,7 @@
* Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org> * Copyright (C) 2000-2003 Paul Bame <bame at parisc-linux.org>
* Copyright (C) 2000 Philipp Rumpf <prumpf with tux.org> * Copyright (C) 2000 Philipp Rumpf <prumpf with tux.org>
* Copyright (C) 2000 David Kennedy <dkennedy with linuxcare.com> * Copyright (C) 2000 David Kennedy <dkennedy with linuxcare.com>
* Copyright (C) 2000 Richard Hirst <rhirst with parisc-lixux.org> * Copyright (C) 2000 Richard Hirst <rhirst with parisc-linux.org>
* Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org> * Copyright (C) 2000 Grant Grundler <grundler with parisc-linux.org>
* Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org> * Copyright (C) 2001 Alan Modra <amodra at parisc-linux.org>
* Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org> * Copyright (C) 2001-2002 Ryan Bradetich <rbrad at parisc-linux.org>
@ -245,7 +245,17 @@ int
sys_clone(unsigned long clone_flags, unsigned long usp, sys_clone(unsigned long clone_flags, unsigned long usp,
struct pt_regs *regs) struct pt_regs *regs)
{ {
int __user *user_tid = (int __user *)regs->gr[26]; /* Arugments from userspace are:
r26 = Clone flags.
r25 = Child stack.
r24 = parent_tidptr.
r23 = Is the TLS storage descriptor
r22 = child_tidptr
However, these last 3 args are only examined
if the proper flags are set. */
int __user *child_tidptr;
int __user *parent_tidptr;
/* usp must be word aligned. This also prevents users from /* usp must be word aligned. This also prevents users from
* passing in the value 1 (which is the signal for a special * passing in the value 1 (which is the signal for a special
@ -253,10 +263,20 @@ sys_clone(unsigned long clone_flags, unsigned long usp,
usp = ALIGN(usp, 4); usp = ALIGN(usp, 4);
/* A zero value for usp means use the current stack */ /* A zero value for usp means use the current stack */
if(usp == 0) if (usp == 0)
usp = regs->gr[30]; usp = regs->gr[30];
return do_fork(clone_flags, usp, regs, 0, user_tid, NULL); if (clone_flags & CLONE_PARENT_SETTID)
parent_tidptr = (int __user *)regs->gr[24];
else
parent_tidptr = NULL;
if (clone_flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID))
child_tidptr = (int __user *)regs->gr[22];
else
child_tidptr = NULL;
return do_fork(clone_flags, usp, regs, 0, parent_tidptr, child_tidptr);
} }
int int
@ -332,6 +352,10 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
} else { } else {
cregs->kpc = (unsigned long) &child_return; cregs->kpc = (unsigned long) &child_return;
} }
/* Setup thread TLS area from the 4th parameter in clone */
if (clone_flags & CLONE_SETTLS)
cregs->cr27 = pregs->gr[23];
} }
return 0; return 0;

View File

@ -92,7 +92,7 @@ static int __init processor_probe(struct parisc_device *dev)
* May get overwritten by PAT code. * May get overwritten by PAT code.
*/ */
cpuid = boot_cpu_data.cpu_count; cpuid = boot_cpu_data.cpu_count;
txn_addr = dev->hpa; /* for legacy PDC */ txn_addr = dev->hpa.start; /* for legacy PDC */
#ifdef __LP64__ #ifdef __LP64__
if (is_pdc_pat()) { if (is_pdc_pat()) {
@ -122,7 +122,7 @@ static int __init processor_probe(struct parisc_device *dev)
* boot time (ie shutdown a CPU from an OS perspective). * boot time (ie shutdown a CPU from an OS perspective).
*/ */
/* get the cpu number */ /* get the cpu number */
status = pdc_pat_cpu_get_number(&cpu_info, dev->hpa); status = pdc_pat_cpu_get_number(&cpu_info, dev->hpa.start);
BUG_ON(PDC_OK != status); BUG_ON(PDC_OK != status);
@ -130,7 +130,7 @@ static int __init processor_probe(struct parisc_device *dev)
printk(KERN_WARNING "IGNORING CPU at 0x%x," printk(KERN_WARNING "IGNORING CPU at 0x%x,"
" cpu_slot_id > NR_CPUS" " cpu_slot_id > NR_CPUS"
" (%ld > %d)\n", " (%ld > %d)\n",
dev->hpa, cpu_info.cpu_num, NR_CPUS); dev->hpa.start, cpu_info.cpu_num, NR_CPUS);
/* Ignore CPU since it will only crash */ /* Ignore CPU since it will only crash */
boot_cpu_data.cpu_count--; boot_cpu_data.cpu_count--;
return 1; return 1;
@ -149,7 +149,7 @@ static int __init processor_probe(struct parisc_device *dev)
p->loops_per_jiffy = loops_per_jiffy; p->loops_per_jiffy = loops_per_jiffy;
p->dev = dev; /* Save IODC data in case we need it */ p->dev = dev; /* Save IODC data in case we need it */
p->hpa = dev->hpa; /* save CPU hpa */ p->hpa = dev->hpa.start; /* save CPU hpa */
p->cpuid = cpuid; /* save CPU id */ p->cpuid = cpuid; /* save CPU id */
p->txn_addr = txn_addr; /* save CPU IRQ address */ p->txn_addr = txn_addr; /* save CPU IRQ address */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP

View File

@ -7,8 +7,10 @@
* Copyright (C) 2000 Hewlett Packard (Paul Bame bame@puffin.external.hp.com) * Copyright (C) 2000 Hewlett Packard (Paul Bame bame@puffin.external.hp.com)
* *
*/ */
#include <asm/assembly.h> #include <linux/config.h>
#include <asm/psw.h> #include <asm/psw.h>
#include <asm/assembly.h>
.section .bss .section .bss
.export real_stack .export real_stack
@ -20,7 +22,7 @@ real32_stack:
real64_stack: real64_stack:
.block 8192 .block 8192
#ifdef __LP64__ #ifdef CONFIG_64BIT
# define REG_SZ 8 # define REG_SZ 8
#else #else
# define REG_SZ 4 # define REG_SZ 4
@ -50,7 +52,7 @@ save_cr_end:
real32_call_asm: real32_call_asm:
STREG %rp, -RP_OFFSET(%sp) /* save RP */ STREG %rp, -RP_OFFSET(%sp) /* save RP */
#ifdef __LP64__ #ifdef CONFIG_64BIT
callee_save callee_save
ldo 2*REG_SZ(%sp), %sp /* room for a couple more saves */ ldo 2*REG_SZ(%sp), %sp /* room for a couple more saves */
STREG %r27, -1*REG_SZ(%sp) STREG %r27, -1*REG_SZ(%sp)
@ -77,7 +79,7 @@ real32_call_asm:
b,l save_control_regs,%r2 /* modifies r1, r2, r28 */ b,l save_control_regs,%r2 /* modifies r1, r2, r28 */
nop nop
#ifdef __LP64__ #ifdef CONFIG_64BIT
rsm PSW_SM_W, %r0 /* go narrow */ rsm PSW_SM_W, %r0 /* go narrow */
#endif #endif
@ -85,7 +87,7 @@ real32_call_asm:
bv 0(%r31) bv 0(%r31)
nop nop
ric_ret: ric_ret:
#ifdef __LP64__ #ifdef CONFIG_64BIT
ssm PSW_SM_W, %r0 /* go wide */ ssm PSW_SM_W, %r0 /* go wide */
#endif #endif
/* restore CRs before going virtual in case we page fault */ /* restore CRs before going virtual in case we page fault */
@ -97,7 +99,7 @@ ric_ret:
tovirt_r1 %sp tovirt_r1 %sp
LDREG -REG_SZ(%sp), %sp /* restore SP */ LDREG -REG_SZ(%sp), %sp /* restore SP */
#ifdef __LP64__ #ifdef CONFIG_64BIT
LDREG -1*REG_SZ(%sp), %r27 LDREG -1*REG_SZ(%sp), %r27
LDREG -2*REG_SZ(%sp), %r29 LDREG -2*REG_SZ(%sp), %r29
ldo -2*REG_SZ(%sp), %sp ldo -2*REG_SZ(%sp), %sp
@ -143,24 +145,21 @@ restore_control_regs:
/* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for /* rfi_virt2real() and rfi_real2virt() could perhaps be adapted for
* more general-purpose use by the several places which need RFIs * more general-purpose use by the several places which need RFIs
*/ */
.align 128
.text .text
.align 128
rfi_virt2real: rfi_virt2real:
/* switch to real mode... */ /* switch to real mode... */
ssm 0,0 /* See "relied upon translation" */ rsm PSW_SM_I,%r0
nop /* PA 2.0 Arch. F-5 */ load32 PA(rfi_v2r_1), %r1
nop
nop
nop nop
nop nop
nop nop
nop nop
nop nop
rsm (PSW_SM_Q|PSW_SM_I),%r0 /* disable Q & I bits to load iia queue */ rsm PSW_SM_Q,%r0 /* disable Q & I bits to load iia queue */
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
load32 PA(rfi_v2r_1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
@ -184,10 +183,8 @@ rfi_v2r_1:
.text .text
.align 128 .align 128
rfi_real2virt: rfi_real2virt:
ssm 0,0 /* See "relied upon translation" */ rsm PSW_SM_I,%r0
nop /* PA 2.0 Arch. F-5 */ load32 (rfi_r2v_1), %r1
nop
nop
nop nop
nop nop
nop nop
@ -197,7 +194,6 @@ rfi_real2virt:
rsm PSW_SM_Q,%r0 /* disable Q bit to load iia queue */ rsm PSW_SM_Q,%r0 /* disable Q bit to load iia queue */
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
load32 (rfi_r2v_1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
@ -218,7 +214,7 @@ rfi_r2v_1:
bv 0(%r2) bv 0(%r2)
nop nop
#ifdef __LP64__ #ifdef CONFIG_64BIT
/************************ 64-bit real-mode calls ***********************/ /************************ 64-bit real-mode calls ***********************/
/* This is only usable in wide kernels right now and will probably stay so */ /* This is only usable in wide kernels right now and will probably stay so */
@ -296,7 +292,7 @@ pc_in_user_space:
** comparing function pointers. ** comparing function pointers.
*/ */
__canonicalize_funcptr_for_compare: __canonicalize_funcptr_for_compare:
#ifdef __LP64__ #ifdef CONFIG_64BIT
bve (%r2) bve (%r2)
#else #else
bv %r0(%r2) bv %r0(%r2)

View File

@ -490,15 +490,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
give_sigsegv: give_sigsegv:
DBG(1,"setup_rt_frame: sending SIGSEGV\n"); DBG(1,"setup_rt_frame: sending SIGSEGV\n");
if (sig == SIGSEGV) force_sigsegv(sig, current);
ka->sa.sa_handler = SIG_DFL;
si.si_signo = SIGSEGV;
si.si_errno = 0;
si.si_code = SI_KERNEL;
si.si_pid = current->pid;
si.si_uid = current->uid;
si.si_addr = frame;
force_sig_info(SIGSEGV, &si, current);
return 0; return 0;
} }
@ -633,10 +625,14 @@ do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall)
put_user(0xe0008200, &usp[3]); put_user(0xe0008200, &usp[3]);
put_user(0x34140000, &usp[4]); put_user(0x34140000, &usp[4]);
/* Stack is 64-byte aligned, and we only /* Stack is 64-byte aligned, and we only need
* need to flush 1 cache line */ * to flush 1 cache line.
asm("fdc 0(%%sr3, %0)\n" * Flushing one cacheline is cheap.
"fic 0(%%sr3, %0)\n" * "sync" on bigger (> 4 way) boxes is not.
*/
asm("fdc %%r0(%%sr3, %0)\n"
"sync\n"
"fic %%r0(%%sr3, %0)\n"
"sync\n" "sync\n"
: : "r"(regs->gr[30])); : : "r"(regs->gr[30]));

View File

@ -18,7 +18,7 @@
*/ */
#undef ENTRY_SYS_CPUS /* syscall support for iCOD-like functionality */ #undef ENTRY_SYS_CPUS /* syscall support for iCOD-like functionality */
#include <linux/autoconf.h> #include <linux/config.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>

View File

@ -6,6 +6,7 @@
* thanks to Philipp Rumpf, Mike Shaver and various others * thanks to Philipp Rumpf, Mike Shaver and various others
* sorry about the wall, puffin.. * sorry about the wall, puffin..
*/ */
#include <linux/config.h> /* for CONFIG_SMP */
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/unistd.h> #include <asm/unistd.h>
@ -22,15 +23,13 @@
*/ */
#define KILL_INSN break 0,0 #define KILL_INSN break 0,0
#include <linux/config.h> /* for CONFIG_SMP */ #ifdef CONFIG_64BIT
#ifdef __LP64__
.level 2.0w .level 2.0w
#else #else
.level 1.1 .level 1.1
#endif #endif
#ifndef __LP64__ #ifndef CONFIG_64BIT
.macro fixup_branch,lbl .macro fixup_branch,lbl
b \lbl b \lbl
.endm .endm
@ -103,7 +102,7 @@ linux_gateway_entry:
mfsp %sr7,%r1 /* save user sr7 */ mfsp %sr7,%r1 /* save user sr7 */
mtsp %r1,%sr3 /* and store it in sr3 */ mtsp %r1,%sr3 /* and store it in sr3 */
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* for now we can *always* set the W bit on entry to the syscall /* for now we can *always* set the W bit on entry to the syscall
* since we don't support wide userland processes. We could * since we don't support wide userland processes. We could
* also save the current SM other than in r0 and restore it on * also save the current SM other than in r0 and restore it on
@ -155,7 +154,7 @@ linux_gateway_entry:
STREG %r19, TASK_PT_GR19(%r1) STREG %r19, TASK_PT_GR19(%r1)
LDREGM -FRAME_SIZE(%r30), %r2 /* get users sp back */ LDREGM -FRAME_SIZE(%r30), %r2 /* get users sp back */
#ifdef __LP64__ #ifdef CONFIG_64BIT
extrd,u %r2,63,1,%r19 /* W hidden in bottom bit */ extrd,u %r2,63,1,%r19 /* W hidden in bottom bit */
#if 0 #if 0
xor %r19,%r2,%r2 /* clear bottom bit */ xor %r19,%r2,%r2 /* clear bottom bit */
@ -186,7 +185,7 @@ linux_gateway_entry:
loadgp loadgp
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
copy %r19,%r2 /* W bit back to r2 */ copy %r19,%r2 /* W bit back to r2 */
#else #else
@ -205,7 +204,7 @@ linux_gateway_entry:
/* Note! We cannot use the syscall table that is mapped /* Note! We cannot use the syscall table that is mapped
nearby since the gateway page is mapped execute-only. */ nearby since the gateway page is mapped execute-only. */
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldil L%sys_call_table, %r1 ldil L%sys_call_table, %r1
or,= %r2,%r2,%r2 or,= %r2,%r2,%r2
addil L%(sys_call_table64-sys_call_table), %r1 addil L%(sys_call_table64-sys_call_table), %r1
@ -321,7 +320,7 @@ tracesys_next:
LDREG TASK_PT_GR25(%r1), %r25 LDREG TASK_PT_GR25(%r1), %r25
LDREG TASK_PT_GR24(%r1), %r24 LDREG TASK_PT_GR24(%r1), %r24
LDREG TASK_PT_GR23(%r1), %r23 LDREG TASK_PT_GR23(%r1), %r23
#ifdef __LP64__ #ifdef CONFIG_64BIT
LDREG TASK_PT_GR22(%r1), %r22 LDREG TASK_PT_GR22(%r1), %r22
LDREG TASK_PT_GR21(%r1), %r21 LDREG TASK_PT_GR21(%r1), %r21
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
@ -350,7 +349,7 @@ tracesys_next:
tracesys_exit: tracesys_exit:
ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */
LDREG TI_TASK(%r1), %r1 LDREG TI_TASK(%r1), %r1
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
bl syscall_trace, %r2 bl syscall_trace, %r2
@ -371,7 +370,7 @@ tracesys_exit:
tracesys_sigexit: tracesys_sigexit:
ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */ ldo -THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 /* get task ptr */
LDREG 0(%r1), %r1 LDREG 0(%r1), %r1
#ifdef __LP64__ #ifdef CONFIG_64BIT
ldo -16(%r30),%r29 /* Reference param save area */ ldo -16(%r30),%r29 /* Reference param save area */
#endif #endif
bl syscall_trace, %r2 bl syscall_trace, %r2
@ -404,7 +403,7 @@ lws_start:
gate .+8, %r0 gate .+8, %r0
depi 3, 31, 2, %r31 /* Ensure we return to userspace */ depi 3, 31, 2, %r31 /* Ensure we return to userspace */
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* FIXME: If we are a 64-bit kernel just /* FIXME: If we are a 64-bit kernel just
* turn this on unconditionally. * turn this on unconditionally.
*/ */
@ -440,7 +439,7 @@ lws_exit_nosys:
/* Fall through: Return to userspace */ /* Fall through: Return to userspace */
lws_exit: lws_exit:
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* decide whether to reset the wide mode bit /* decide whether to reset the wide mode bit
* *
* For a syscall, the W bit is stored in the lowest bit * For a syscall, the W bit is stored in the lowest bit
@ -486,7 +485,7 @@ lws_exit:
/* ELF64 Process entry path */ /* ELF64 Process entry path */
lws_compare_and_swap64: lws_compare_and_swap64:
#ifdef __LP64__ #ifdef CONFIG_64BIT
b,n lws_compare_and_swap b,n lws_compare_and_swap
#else #else
/* If we are not a 64-bit kernel, then we don't /* If we are not a 64-bit kernel, then we don't
@ -497,7 +496,7 @@ lws_compare_and_swap64:
/* ELF32 Process entry path */ /* ELF32 Process entry path */
lws_compare_and_swap32: lws_compare_and_swap32:
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* Clip all the input registers */ /* Clip all the input registers */
depdi 0, 31, 32, %r26 depdi 0, 31, 32, %r26
depdi 0, 31, 32, %r25 depdi 0, 31, 32, %r25
@ -608,7 +607,7 @@ cas_action:
the other for the store. Either return -EFAULT. the other for the store. Either return -EFAULT.
Each of the entries must be relocated. */ Each of the entries must be relocated. */
.section __ex_table,"aw" .section __ex_table,"aw"
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* Pad the address calculation */ /* Pad the address calculation */
.word 0,(2b - linux_gateway_page) .word 0,(2b - linux_gateway_page)
.word 0,(3b - linux_gateway_page) .word 0,(3b - linux_gateway_page)
@ -619,7 +618,7 @@ cas_action:
.previous .previous
.section __ex_table,"aw" .section __ex_table,"aw"
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* Pad the address calculation */ /* Pad the address calculation */
.word 0,(1b - linux_gateway_page) .word 0,(1b - linux_gateway_page)
.word 0,(3b - linux_gateway_page) .word 0,(3b - linux_gateway_page)
@ -638,7 +637,7 @@ end_linux_gateway_page:
/* Relocate symbols assuming linux_gateway_page is mapped /* Relocate symbols assuming linux_gateway_page is mapped
to virtual address 0x0 */ to virtual address 0x0 */
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* FIXME: The code will always be on the gateay page /* FIXME: The code will always be on the gateay page
and thus it will be on the first 4k, the and thus it will be on the first 4k, the
assembler seems to think that the final assembler seems to think that the final
@ -666,7 +665,7 @@ lws_table:
sys_call_table: sys_call_table:
#include "syscall_table.S" #include "syscall_table.S"
#ifdef __LP64__ #ifdef CONFIG_64BIT
.align 4096 .align 4096
.export sys_call_table64 .export sys_call_table64
.Lsys_call_table64: .Lsys_call_table64:

View File

@ -35,7 +35,7 @@
#undef ENTRY_UHOH #undef ENTRY_UHOH
#undef ENTRY_COMP #undef ENTRY_COMP
#undef ENTRY_OURS #undef ENTRY_OURS
#if defined(__LP64__) && !defined(SYSCALL_TABLE_64BIT) #if defined(CONFIG_64BIT) && !defined(SYSCALL_TABLE_64BIT)
/* Use ENTRY_SAME for 32-bit syscalls which are the same on wide and /* Use ENTRY_SAME for 32-bit syscalls which are the same on wide and
* narrow palinux. Use ENTRY_DIFF for those where a 32-bit specific * narrow palinux. Use ENTRY_DIFF for those where a 32-bit specific
* implementation is required on wide palinux. Use ENTRY_COMP where * implementation is required on wide palinux. Use ENTRY_COMP where
@ -46,7 +46,7 @@
#define ENTRY_UHOH(_name_) .dword sys32_##unimplemented #define ENTRY_UHOH(_name_) .dword sys32_##unimplemented
#define ENTRY_OURS(_name_) .dword parisc_##_name_ #define ENTRY_OURS(_name_) .dword parisc_##_name_
#define ENTRY_COMP(_name_) .dword compat_sys_##_name_ #define ENTRY_COMP(_name_) .dword compat_sys_##_name_
#elif defined(__LP64__) && defined(SYSCALL_TABLE_64BIT) #elif defined(CONFIG_64BIT) && defined(SYSCALL_TABLE_64BIT)
#define ENTRY_SAME(_name_) .dword sys_##_name_ #define ENTRY_SAME(_name_) .dword sys_##_name_
#define ENTRY_DIFF(_name_) .dword sys_##_name_ #define ENTRY_DIFF(_name_) .dword sys_##_name_
#define ENTRY_UHOH(_name_) .dword sys_##_name_ #define ENTRY_UHOH(_name_) .dword sys_##_name_
@ -368,5 +368,11 @@
ENTRY_COMP(mbind) /* 260 */ ENTRY_COMP(mbind) /* 260 */
ENTRY_COMP(get_mempolicy) ENTRY_COMP(get_mempolicy)
ENTRY_COMP(set_mempolicy) ENTRY_COMP(set_mempolicy)
ENTRY_SAME(ni_syscall) /* 263: reserved for vserver */
ENTRY_SAME(add_key)
ENTRY_SAME(request_key) /* 265 */
ENTRY_SAME(keyctl)
ENTRY_SAME(ioprio_set)
ENTRY_SAME(ioprio_get)
/* Nothing yet */ /* Nothing yet */

View File

@ -89,14 +89,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
} }
} }
#ifdef CONFIG_CHASSIS_LCD_LED
/* Only schedule the led tasklet on cpu 0, and only if it
* is enabled.
*/
if (cpu == 0 && !atomic_read(&led_tasklet.count))
tasklet_schedule(&led_tasklet);
#endif
/* check soft power switch status */ /* check soft power switch status */
if (cpu == 0 && !atomic_read(&power_tasklet.count)) if (cpu == 0 && !atomic_read(&power_tasklet.count))
tasklet_schedule(&power_tasklet); tasklet_schedule(&power_tasklet);
@ -104,6 +96,24 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
unsigned long profile_pc(struct pt_regs *regs)
{
unsigned long pc = instruction_pointer(regs);
if (regs->gr[0] & PSW_N)
pc -= 4;
#ifdef CONFIG_SMP
if (in_lock_functions(pc))
pc = regs->gr[2];
#endif
return pc;
}
EXPORT_SYMBOL(profile_pc);
/*** converted from ia64 ***/ /*** converted from ia64 ***/
/* /*
* Return the number of micro-seconds that elapsed since the last * Return the number of micro-seconds that elapsed since the last

View File

@ -74,7 +74,10 @@ void show_regs(struct pt_regs *regs)
char *level; char *level;
unsigned long cr30; unsigned long cr30;
unsigned long cr31; unsigned long cr31;
/* carlos says that gcc understands better memory in a struct,
* and it makes our life easier with fpregs -- T-Bone */
struct { u32 sw[2]; } s;
level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT; level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT;
printk("%s\n", level); /* don't want to have that pretty register dump messed up */ printk("%s\n", level); /* don't want to have that pretty register dump messed up */
@ -103,11 +106,33 @@ void show_regs(struct pt_regs *regs)
printk("%s\n", buf); printk("%s\n", buf);
} }
#if RIDICULOUSLY_VERBOSE /* FR are 64bit everywhere. Need to use asm to get the content
for (i = 0; i < 32; i += 2) * of fpsr/fper1, and we assume that we won't have a FP Identify
printk("%sFR%02d : %016lx FR%2d : %016lx", level, i, * in our way, otherwise we're screwed.
regs->fr[i], i+1, regs->fr[i+1]); * The fldd is used to restore the T-bit if there was one, as the
#endif * store clears it anyway.
* BTW, PA2.0 book says "thou shall not use fstw on FPSR/FPERs". */
__asm__ (
"fstd %%fr0,0(%1) \n\t"
"fldd 0(%1),%%fr0 \n\t"
: "=m" (s) : "r" (&s) : "%r0"
);
printk("%s\n", level);
printk("%s VZOUICununcqcqcqcqcqcrmunTDVZOUI\n", level);
printbinary(buf, s.sw[0], 32);
printk("%sFPSR: %s\n", level, buf);
printk("%sFPER1: %08x\n", level, s.sw[1]);
/* here we'll print fr0 again, tho it'll be meaningless */
for (i = 0; i < 32; i += 4) {
int j;
p = buf;
p += sprintf(p, "%sfr%02d-%02d ", level, i, i + 3);
for (j = 0; j < 4; j++)
p += sprintf(p, " %016llx", (i+j) == 0 ? 0 : regs->fr[i+j]);
printk("%s\n", buf);
}
cr30 = mfctl(30); cr30 = mfctl(30);
cr31 = mfctl(31); cr31 = mfctl(31);

View File

@ -513,15 +513,18 @@ void handle_unaligned(struct pt_regs *regs)
register int flop=0; /* true if this is a flop */ register int flop=0; /* true if this is a flop */
/* log a message with pacing */ /* log a message with pacing */
if (user_mode(regs)) if (user_mode(regs)) {
{ if (current->thread.flags & PARISC_UAC_SIGBUS) {
if (unaligned_count > 5 && jiffies - last_time > 5*HZ) goto force_sigbus;
{ }
if (unaligned_count > 5 && jiffies - last_time > 5*HZ) {
unaligned_count = 0; unaligned_count = 0;
last_time = jiffies; last_time = jiffies;
} }
if (++unaligned_count < 5)
{ if (!(current->thread.flags & PARISC_UAC_NOPRINT)
&& ++unaligned_count < 5) {
char buf[256]; char buf[256];
sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n", sprintf(buf, "%s(%d): unaligned access to 0x" RFMT " at ip=0x" RFMT "\n",
current->comm, current->pid, regs->ior, regs->iaoq[0]); current->comm, current->pid, regs->ior, regs->iaoq[0]);
@ -530,6 +533,7 @@ void handle_unaligned(struct pt_regs *regs)
show_regs(regs); show_regs(regs);
#endif #endif
} }
if (!unaligned_enabled) if (!unaligned_enabled)
goto force_sigbus; goto force_sigbus;
} }

View File

@ -35,7 +35,7 @@
extrd,u \t2,63,32,\t2 extrd,u \t2,63,32,\t2
#endif #endif
/* t2 = &__per_cpu_offset[smp_processor_id()]; */ /* t2 = &__per_cpu_offset[smp_processor_id()]; */
LDREG,s \t2(\t1),\t2 LDREGX \t2(\t1),\t2
addil LT%per_cpu__exception_data,%r27 addil LT%per_cpu__exception_data,%r27
LDREG RT%per_cpu__exception_data(%r1),\t1 LDREG RT%per_cpu__exception_data(%r1),\t1
/* t1 = &__get_cpu_var(exception_data) */ /* t1 = &__get_cpu_var(exception_data) */
@ -53,6 +53,8 @@
.endm .endm
#endif #endif
.level LEVEL
.text .text
.section .fixup, "ax" .section .fixup, "ax"

View File

@ -339,6 +339,7 @@ unsigned long pa_memcpy(void *dstp, const void *srcp, unsigned long len)
pds = (double *)pcs; pds = (double *)pcs;
pdd = (double *)pcd; pdd = (double *)pcd;
#if 0
/* Copy 8 doubles at a time */ /* Copy 8 doubles at a time */
while (len >= 8*sizeof(double)) { while (len >= 8*sizeof(double)) {
register double r1, r2, r3, r4, r5, r6, r7, r8; register double r1, r2, r3, r4, r5, r6, r7, r8;
@ -366,6 +367,7 @@ unsigned long pa_memcpy(void *dstp, const void *srcp, unsigned long len)
fstdma(d_space, r8, pdd, pmc_store_exc); fstdma(d_space, r8, pdd, pmc_store_exc);
len -= 8*sizeof(double); len -= 8*sizeof(double);
} }
#endif
pws = (unsigned int *)pds; pws = (unsigned int *)pds;
pwd = (unsigned int *)pdd; pwd = (unsigned int *)pdd;

View File

@ -204,7 +204,7 @@ static irqreturn_t hil_kbd_interrupt(struct serio *serio,
hil_packet packet; hil_packet packet;
int idx; int idx;
kbd = (struct hil_kbd *)serio->private; kbd = serio_get_drvdata(serio);
if (kbd == NULL) { if (kbd == NULL) {
BUG(); BUG();
return IRQ_HANDLED; return IRQ_HANDLED;
@ -234,7 +234,7 @@ static void hil_kbd_disconnect(struct serio *serio)
{ {
struct hil_kbd *kbd; struct hil_kbd *kbd;
kbd = (struct hil_kbd *)serio->private; kbd = serio_get_drvdata(serio);
if (kbd == NULL) { if (kbd == NULL) {
BUG(); BUG();
return; return;
@ -245,20 +245,20 @@ static void hil_kbd_disconnect(struct serio *serio)
kfree(kbd); kfree(kbd);
} }
static void hil_kbd_connect(struct serio *serio, struct serio_driver *drv) static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv)
{ {
struct hil_kbd *kbd; struct hil_kbd *kbd;
uint8_t did, *idd; uint8_t did, *idd;
int i; int i;
if (serio->type != (SERIO_HIL_MLC | SERIO_HIL)) return; kbd = kmalloc(sizeof(*kbd), GFP_KERNEL);
if (!kbd)
if (!(kbd = kmalloc(sizeof(struct hil_kbd), GFP_KERNEL))) return; return -ENOMEM;
memset(kbd, 0, sizeof(struct hil_kbd)); memset(kbd, 0, sizeof(struct hil_kbd));
if (serio_open(serio, drv)) goto bail0; if (serio_open(serio, drv)) goto bail0;
serio->private = kbd; serio_set_drvdata(serio, kbd);
kbd->serio = serio; kbd->serio = serio;
kbd->dev.private = kbd; kbd->dev.private = kbd;
@ -342,19 +342,31 @@ static void hil_kbd_connect(struct serio *serio, struct serio_driver *drv)
down(&(kbd->sem)); down(&(kbd->sem));
up(&(kbd->sem)); up(&(kbd->sem));
return; return 0;
bail1: bail1:
serio_close(serio); serio_close(serio);
bail0: bail0:
kfree(kbd); kfree(kbd);
serio_set_drvdata(serio, NULL);
return -EIO;
} }
static struct serio_device_id hil_kbd_ids[] = {
{
.type = SERIO_HIL_MLC,
.proto = SERIO_HIL,
.id = SERIO_ANY,
.extra = SERIO_ANY,
},
{ 0 }
};
struct serio_driver hil_kbd_serio_drv = { struct serio_driver hil_kbd_serio_drv = {
.driver = { .driver = {
.name = "hil_kbd", .name = "hil_kbd",
}, },
.description = "HP HIL keyboard driver", .description = "HP HIL keyboard driver",
.id_table = hil_kbd_ids,
.connect = hil_kbd_connect, .connect = hil_kbd_connect,
.disconnect = hil_kbd_disconnect, .disconnect = hil_kbd_disconnect,
.interrupt = hil_kbd_interrupt .interrupt = hil_kbd_interrupt

View File

@ -22,7 +22,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irq.h> #include <linux/interrupt.h>
#include <linux/hil.h> #include <linux/hil.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
@ -278,11 +278,11 @@ static int __init
hil_init_chip(struct parisc_device *dev) hil_init_chip(struct parisc_device *dev)
{ {
if (!dev->irq) { if (!dev->irq) {
printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n", dev->hpa); printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%08lx\n", dev->hpa.start);
return -ENODEV; return -ENODEV;
} }
hil_base = dev->hpa; hil_base = dev->hpa.start;
hil_irq = dev->irq; hil_irq = dev->irq;
hil_dev.dev_id = dev; hil_dev.dev_id = dev;
@ -299,7 +299,7 @@ static struct parisc_device_id hil_tbl[] = {
MODULE_DEVICE_TABLE(parisc, hil_tbl); MODULE_DEVICE_TABLE(parisc, hil_tbl);
static struct parisc_driver hil_driver = { static struct parisc_driver hil_driver = {
.name = "HIL", .name = "hil",
.id_table = hil_tbl, .id_table = hil_tbl,
.probe = hil_init_chip, .probe = hil_init_chip,
}; };

View File

@ -196,7 +196,7 @@ static irqreturn_t hil_ptr_interrupt(struct serio *serio,
hil_packet packet; hil_packet packet;
int idx; int idx;
ptr = (struct hil_ptr *)serio->private; ptr = serio_get_drvdata(serio);
if (ptr == NULL) { if (ptr == NULL) {
BUG(); BUG();
return IRQ_HANDLED; return IRQ_HANDLED;
@ -227,7 +227,7 @@ static void hil_ptr_disconnect(struct serio *serio)
{ {
struct hil_ptr *ptr; struct hil_ptr *ptr;
ptr = (struct hil_ptr *)serio->private; ptr = serio_get_drvdata(serio);
if (ptr == NULL) { if (ptr == NULL) {
BUG(); BUG();
return; return;
@ -238,21 +238,19 @@ static void hil_ptr_disconnect(struct serio *serio)
kfree(ptr); kfree(ptr);
} }
static void hil_ptr_connect(struct serio *serio, struct serio_driver *driver) static int hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
{ {
struct hil_ptr *ptr; struct hil_ptr *ptr;
char *txt; char *txt;
unsigned int i, naxsets, btntype; unsigned int i, naxsets, btntype;
uint8_t did, *idd; uint8_t did, *idd;
if (serio->type != (SERIO_HIL_MLC | SERIO_HIL)) return; if (!(ptr = kmalloc(sizeof(struct hil_ptr), GFP_KERNEL))) return -ENOMEM;
if (!(ptr = kmalloc(sizeof(struct hil_ptr), GFP_KERNEL))) return;
memset(ptr, 0, sizeof(struct hil_ptr)); memset(ptr, 0, sizeof(struct hil_ptr));
if (serio_open(serio, driver)) goto bail0; if (serio_open(serio, driver)) goto bail0;
serio->private = ptr; serio_set_drvdata(serio, ptr);
ptr->serio = serio; ptr->serio = serio;
ptr->dev.private = ptr; ptr->dev.private = ptr;
@ -380,23 +378,34 @@ static void hil_ptr_connect(struct serio *serio, struct serio_driver *driver)
(btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad", (btntype == BTN_MOUSE) ? "HIL mouse":"HIL tablet or touchpad",
did); did);
return; return 0;
bail1: bail1:
serio_close(serio); serio_close(serio);
bail0: bail0:
kfree(ptr); kfree(ptr);
return; serio_set_drvdata(serio, NULL);
return -ENODEV;
} }
static struct serio_device_id hil_ptr_ids[] = {
{
.type = SERIO_HIL_MLC,
.proto = SERIO_HIL,
.id = SERIO_ANY,
.extra = SERIO_ANY,
},
{ 0 }
};
static struct serio_driver hil_ptr_serio_driver = { static struct serio_driver hil_ptr_serio_driver = {
.driver = { .driver = {
.name = "hil_ptr", .name = "hil_ptr",
}, },
.description = "HP HIL mouse/tablet driver", .description = "HP HIL mouse/tablet driver",
.connect = hil_ptr_connect, .id_table = hil_ptr_ids,
.disconnect = hil_ptr_disconnect, .connect = hil_ptr_connect,
.interrupt = hil_ptr_interrupt .disconnect = hil_ptr_disconnect,
.interrupt = hil_ptr_interrupt
}; };
static int __init hil_ptr_init(void) static int __init hil_ptr_init(void)

View File

@ -211,9 +211,6 @@ static void gscps2_reset(struct gscps2port *ps2port)
writeb(0xff, addr+GSC_RESET); writeb(0xff, addr+GSC_RESET);
gscps2_flush(ps2port); gscps2_flush(ps2port);
spin_unlock_irqrestore(&ps2port->lock, flags); spin_unlock_irqrestore(&ps2port->lock, flags);
/* enable it */
gscps2_enable(ps2port, ENABLE);
} }
static LIST_HEAD(ps2port_list); static LIST_HEAD(ps2port_list);
@ -307,6 +304,9 @@ static int gscps2_open(struct serio *port)
gscps2_reset(ps2port); gscps2_reset(ps2port);
/* enable it */
gscps2_enable(ps2port, ENABLE);
gscps2_interrupt(0, NULL, NULL); gscps2_interrupt(0, NULL, NULL);
return 0; return 0;
@ -331,7 +331,7 @@ static int __init gscps2_probe(struct parisc_device *dev)
{ {
struct gscps2port *ps2port; struct gscps2port *ps2port;
struct serio *serio; struct serio *serio;
unsigned long hpa = dev->hpa; unsigned long hpa = dev->hpa.start;
int ret; int ret;
if (!dev->irq) if (!dev->irq)
@ -370,8 +370,6 @@ static int __init gscps2_probe(struct parisc_device *dev)
serio->port_data = ps2port; serio->port_data = ps2port;
serio->dev.parent = &dev->dev; serio->dev.parent = &dev->dev;
list_add_tail(&ps2port->node, &ps2port_list);
ret = -EBUSY; ret = -EBUSY;
if (request_irq(dev->irq, gscps2_interrupt, SA_SHIRQ, ps2port->port->name, ps2port)) if (request_irq(dev->irq, gscps2_interrupt, SA_SHIRQ, ps2port->port->name, ps2port))
goto fail_miserably; goto fail_miserably;
@ -396,15 +394,16 @@ static int __init gscps2_probe(struct parisc_device *dev)
serio_register_port(ps2port->port); serio_register_port(ps2port->port);
list_add_tail(&ps2port->node, &ps2port_list);
return 0; return 0;
fail: fail:
free_irq(dev->irq, ps2port); free_irq(dev->irq, ps2port);
fail_miserably: fail_miserably:
list_del(&ps2port->node);
iounmap(ps2port->addr); iounmap(ps2port->addr);
release_mem_region(dev->hpa, GSC_STATUS + 4); release_mem_region(dev->hpa.start, GSC_STATUS + 4);
fail_nomem: fail_nomem:
kfree(ps2port); kfree(ps2port);
@ -444,7 +443,7 @@ static struct parisc_device_id gscps2_device_tbl[] = {
}; };
static struct parisc_driver parisc_ps2_driver = { static struct parisc_driver parisc_ps2_driver = {
.name = "GSC PS2", .name = "gsc_ps2",
.id_table = gscps2_device_tbl, .id_table = gscps2_device_tbl,
.probe = gscps2_probe, .probe = gscps2_probe,
.remove = gscps2_remove, .remove = gscps2_remove,

View File

@ -801,7 +801,8 @@ static int hil_mlc_serio_open(struct serio *serio) {
struct hil_mlc_serio_map *map; struct hil_mlc_serio_map *map;
struct hil_mlc *mlc; struct hil_mlc *mlc;
if (serio->private != NULL) return -EBUSY; if (serio_get_drvdata(serio) != NULL)
return -EBUSY;
map = serio->port_data; map = serio->port_data;
if (map == NULL) { if (map == NULL) {
@ -832,11 +833,18 @@ static void hil_mlc_serio_close(struct serio *serio) {
return; return;
} }
serio->private = NULL; serio_set_drvdata(serio, NULL);
serio->drv = NULL; serio->drv = NULL;
/* TODO wake up interruptable */ /* TODO wake up interruptable */
} }
static struct serio_device_id hil_mlc_serio_id = {
.type = SERIO_HIL_MLC,
.proto = SERIO_HIL,
.extra = SERIO_ANY,
.id = SERIO_ANY,
};
int hil_mlc_register(hil_mlc *mlc) { int hil_mlc_register(hil_mlc *mlc) {
int i; int i;
unsigned long flags; unsigned long flags;
@ -867,7 +875,7 @@ int hil_mlc_register(hil_mlc *mlc) {
mlc_serio = kmalloc(sizeof(*mlc_serio), GFP_KERNEL); mlc_serio = kmalloc(sizeof(*mlc_serio), GFP_KERNEL);
mlc->serio[i] = mlc_serio; mlc->serio[i] = mlc_serio;
memset(mlc_serio, 0, sizeof(*mlc_serio)); memset(mlc_serio, 0, sizeof(*mlc_serio));
mlc_serio->type = SERIO_HIL | SERIO_HIL_MLC; mlc_serio->id = hil_mlc_serio_id;
mlc_serio->write = hil_mlc_serio_write; mlc_serio->write = hil_mlc_serio_write;
mlc_serio->open = hil_mlc_serio_open; mlc_serio->open = hil_mlc_serio_open;
mlc_serio->close = hil_mlc_serio_close; mlc_serio->close = hil_mlc_serio_close;

View File

@ -764,7 +764,7 @@ MODULE_DEVICE_TABLE(parisc, hp_sdc_tbl);
static int __init hp_sdc_init_hppa(struct parisc_device *d); static int __init hp_sdc_init_hppa(struct parisc_device *d);
static struct parisc_driver hp_sdc_driver = { static struct parisc_driver hp_sdc_driver = {
.name = "HP SDC", .name = "hp_sdc",
.id_table = hp_sdc_tbl, .id_table = hp_sdc_tbl,
.probe = hp_sdc_init_hppa, .probe = hp_sdc_init_hppa,
}; };
@ -875,9 +875,9 @@ static int __init hp_sdc_init_hppa(struct parisc_device *d)
hp_sdc.dev = d; hp_sdc.dev = d;
hp_sdc.irq = d->irq; hp_sdc.irq = d->irq;
hp_sdc.nmi = d->aux_irq; hp_sdc.nmi = d->aux_irq;
hp_sdc.base_io = d->hpa; hp_sdc.base_io = d->hpa.start;
hp_sdc.data_io = d->hpa + 0x800; hp_sdc.data_io = d->hpa.start + 0x800;
hp_sdc.status_io = d->hpa + 0x801; hp_sdc.status_io = d->hpa.start + 0x801;
return hp_sdc_init(); return hp_sdc_init();
} }

View File

@ -415,6 +415,10 @@ static int rx_ring_size = RX_RING_SIZE;
static int ticks_limit = 100; static int ticks_limit = 100;
static int max_cmd_backlog = TX_RING_SIZE-1; static int max_cmd_backlog = TX_RING_SIZE-1;
#ifdef CONFIG_NET_POLL_CONTROLLER
static void i596_poll_controller(struct net_device *dev);
#endif
static inline void CA(struct net_device *dev) static inline void CA(struct net_device *dev)
{ {
@ -636,11 +640,11 @@ static int init_i596_mem(struct net_device *dev)
disable_irq(dev->irq); /* disable IRQs from LAN */ disable_irq(dev->irq); /* disable IRQs from LAN */
DEB(DEB_INIT, DEB(DEB_INIT,
printk("RESET 82596 port: %p (with IRQ %d disabled)\n", printk("RESET 82596 port: %lx (with IRQ %d disabled)\n",
(void*)(dev->base_addr + PA_I82596_RESET), (dev->base_addr + PA_I82596_RESET),
dev->irq)); dev->irq));
gsc_writel(0, (void*)(dev->base_addr + PA_I82596_RESET)); /* Hard Reset */ gsc_writel(0, (dev->base_addr + PA_I82596_RESET)); /* Hard Reset */
udelay(100); /* Wait 100us - seems to help */ udelay(100); /* Wait 100us - seems to help */
/* change the scp address */ /* change the scp address */
@ -1209,6 +1213,9 @@ static int __devinit i82596_probe(struct net_device *dev,
dev->set_multicast_list = set_multicast_list; dev->set_multicast_list = set_multicast_list;
dev->tx_timeout = i596_tx_timeout; dev->tx_timeout = i596_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT; dev->watchdog_timeo = TX_TIMEOUT;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev->poll_controller = i596_poll_controller;
#endif
dev->priv = (void *)(dev->mem_start); dev->priv = (void *)(dev->mem_start);
@ -1242,6 +1249,14 @@ static int __devinit i82596_probe(struct net_device *dev,
return 0; return 0;
} }
#ifdef CONFIG_NET_POLL_CONTROLLER
static void i596_poll_controller(struct net_device *dev)
{
disable_irq(dev->irq);
i596_interrupt(dev->irq, dev, NULL);
enable_irq(dev->irq);
}
#endif
static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs) static irqreturn_t i596_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{ {
@ -1528,17 +1543,18 @@ lan_init_chip(struct parisc_device *dev)
if (!dev->irq) { if (!dev->irq) {
printk(KERN_ERR "%s: IRQ not found for i82596 at 0x%lx\n", printk(KERN_ERR "%s: IRQ not found for i82596 at 0x%lx\n",
__FILE__, dev->hpa); __FILE__, dev->hpa.start);
return -ENODEV; return -ENODEV;
} }
printk(KERN_INFO "Found i82596 at 0x%lx, IRQ %d\n", dev->hpa, dev->irq); printk(KERN_INFO "Found i82596 at 0x%lx, IRQ %d\n", dev->hpa.start,
dev->irq);
netdevice = alloc_etherdev(0); netdevice = alloc_etherdev(0);
if (!netdevice) if (!netdevice)
return -ENOMEM; return -ENOMEM;
netdevice->base_addr = dev->hpa; netdevice->base_addr = dev->hpa.start;
netdevice->irq = dev->irq; netdevice->irq = dev->irq;
retval = i82596_probe(netdevice, &dev->dev); retval = i82596_probe(netdevice, &dev->dev);
@ -1566,7 +1582,7 @@ static struct parisc_device_id lan_tbl[] = {
MODULE_DEVICE_TABLE(parisc, lan_tbl); MODULE_DEVICE_TABLE(parisc, lan_tbl);
static struct parisc_driver lan_driver = { static struct parisc_driver lan_driver = {
.name = "Apricot", .name = "lasi_82596",
.id_table = lan_tbl, .id_table = lan_tbl,
.probe = lan_init_chip, .probe = lan_init_chip,
}; };

View File

@ -77,12 +77,12 @@ asp_init_chip(struct parisc_device *dev)
struct gsc_irq gsc_irq; struct gsc_irq gsc_irq;
int ret; int ret;
asp.version = gsc_readb(dev->hpa + ASP_VER_OFFSET) & 0xf; asp.version = gsc_readb(dev->hpa.start + ASP_VER_OFFSET) & 0xf;
asp.name = (asp.version == 1) ? "Asp" : "Cutoff"; asp.name = (asp.version == 1) ? "Asp" : "Cutoff";
asp.hpa = ASP_INTERRUPT_ADDR; asp.hpa = ASP_INTERRUPT_ADDR;
printk(KERN_INFO "%s version %d at 0x%lx found.\n", printk(KERN_INFO "%s version %d at 0x%lx found.\n",
asp.name, asp.version, dev->hpa); asp.name, asp.version, dev->hpa.start);
/* the IRQ ASP should use */ /* the IRQ ASP should use */
ret = -EBUSY; ret = -EBUSY;
@ -126,7 +126,7 @@ static struct parisc_device_id asp_tbl[] = {
}; };
struct parisc_driver asp_driver = { struct parisc_driver asp_driver = {
.name = "Asp", .name = "asp",
.id_table = asp_tbl, .id_table = asp_tbl,
.probe = asp_init_chip, .probe = asp_init_chip,
}; };

View File

@ -100,9 +100,9 @@
#define DBG_RUN_SG(x...) #define DBG_RUN_SG(x...)
#endif #endif
#define CCIO_INLINE /* inline */ #define CCIO_INLINE inline
#define WRITE_U32(value, addr) gsc_writel(value, (u32 *)(addr)) #define WRITE_U32(value, addr) __raw_writel(value, addr)
#define READ_U32(addr) gsc_readl((u32 *)(addr)) #define READ_U32(addr) __raw_readl(addr)
#define U2_IOA_RUNWAY 0x580 #define U2_IOA_RUNWAY 0x580
#define U2_BC_GSC 0x501 #define U2_BC_GSC 0x501
@ -115,28 +115,28 @@
struct ioa_registers { struct ioa_registers {
/* Runway Supervisory Set */ /* Runway Supervisory Set */
volatile int32_t unused1[12]; int32_t unused1[12];
volatile uint32_t io_command; /* Offset 12 */ uint32_t io_command; /* Offset 12 */
volatile uint32_t io_status; /* Offset 13 */ uint32_t io_status; /* Offset 13 */
volatile uint32_t io_control; /* Offset 14 */ uint32_t io_control; /* Offset 14 */
volatile int32_t unused2[1]; int32_t unused2[1];
/* Runway Auxiliary Register Set */ /* Runway Auxiliary Register Set */
volatile uint32_t io_err_resp; /* Offset 0 */ uint32_t io_err_resp; /* Offset 0 */
volatile uint32_t io_err_info; /* Offset 1 */ uint32_t io_err_info; /* Offset 1 */
volatile uint32_t io_err_req; /* Offset 2 */ uint32_t io_err_req; /* Offset 2 */
volatile uint32_t io_err_resp_hi; /* Offset 3 */ uint32_t io_err_resp_hi; /* Offset 3 */
volatile uint32_t io_tlb_entry_m; /* Offset 4 */ uint32_t io_tlb_entry_m; /* Offset 4 */
volatile uint32_t io_tlb_entry_l; /* Offset 5 */ uint32_t io_tlb_entry_l; /* Offset 5 */
volatile uint32_t unused3[1]; uint32_t unused3[1];
volatile uint32_t io_pdir_base; /* Offset 7 */ uint32_t io_pdir_base; /* Offset 7 */
volatile uint32_t io_io_low_hv; /* Offset 8 */ uint32_t io_io_low_hv; /* Offset 8 */
volatile uint32_t io_io_high_hv; /* Offset 9 */ uint32_t io_io_high_hv; /* Offset 9 */
volatile uint32_t unused4[1]; uint32_t unused4[1];
volatile uint32_t io_chain_id_mask; /* Offset 11 */ uint32_t io_chain_id_mask; /* Offset 11 */
volatile uint32_t unused5[2]; uint32_t unused5[2];
volatile uint32_t io_io_low; /* Offset 14 */ uint32_t io_io_low; /* Offset 14 */
volatile uint32_t io_io_high; /* Offset 15 */ uint32_t io_io_high; /* Offset 15 */
}; };
/* /*
@ -226,7 +226,7 @@ struct ioa_registers {
*/ */
struct ioc { struct ioc {
struct ioa_registers *ioc_hpa; /* I/O MMU base address */ struct ioa_registers __iomem *ioc_regs; /* I/O MMU base address */
u8 *res_map; /* resource map, bit == pdir entry */ u8 *res_map; /* resource map, bit == pdir entry */
u64 *pdir_base; /* physical base address */ u64 *pdir_base; /* physical base address */
u32 pdir_size; /* bytes, function of IOV Space size */ u32 pdir_size; /* bytes, function of IOV Space size */
@ -595,7 +595,7 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
** Grab virtual index [0:11] ** Grab virtual index [0:11]
** Deposit virt_idx bits into I/O PDIR word ** Deposit virt_idx bits into I/O PDIR word
*/ */
asm volatile ("lci 0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba)); asm volatile ("lci %%r0(%%sr1, %1), %0" : "=r" (ci) : "r" (vba));
asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci)); asm volatile ("extru %1,19,12,%0" : "+r" (ci) : "r" (ci));
asm volatile ("depw %1,15,12,%0" : "+r" (pa) : "r" (ci)); asm volatile ("depw %1,15,12,%0" : "+r" (pa) : "r" (ci));
@ -613,7 +613,7 @@ ccio_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
** the real mode coherence index generation of U2, the PDIR entry ** the real mode coherence index generation of U2, the PDIR entry
** must be flushed to memory to retain coherence." ** must be flushed to memory to retain coherence."
*/ */
asm volatile("fdc 0(%0)" : : "r" (pdir_ptr)); asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr));
asm volatile("sync"); asm volatile("sync");
} }
@ -636,7 +636,7 @@ ccio_clear_io_tlb(struct ioc *ioc, dma_addr_t iovp, size_t byte_cnt)
byte_cnt += chain_size; byte_cnt += chain_size;
while(byte_cnt > chain_size) { while(byte_cnt > chain_size) {
WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_hpa->io_command); WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_regs->io_command);
iovp += chain_size; iovp += chain_size;
byte_cnt -= chain_size; byte_cnt -= chain_size;
} }
@ -684,7 +684,7 @@ ccio_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
** Hopefully someone figures out how to patch (NOP) the ** Hopefully someone figures out how to patch (NOP) the
** FDC/SYNC out at boot time. ** FDC/SYNC out at boot time.
*/ */
asm volatile("fdc 0(%0)" : : "r" (pdir_ptr[7])); asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr[7]));
iovp += IOVP_SIZE; iovp += IOVP_SIZE;
byte_cnt -= IOVP_SIZE; byte_cnt -= IOVP_SIZE;
@ -1251,7 +1251,7 @@ static struct parisc_device_id ccio_tbl[] = {
static int ccio_probe(struct parisc_device *dev); static int ccio_probe(struct parisc_device *dev);
static struct parisc_driver ccio_driver = { static struct parisc_driver ccio_driver = {
.name = "U2:Uturn", .name = "ccio",
.id_table = ccio_tbl, .id_table = ccio_tbl,
.probe = ccio_probe, .probe = ccio_probe,
}; };
@ -1314,14 +1314,13 @@ ccio_ioc_init(struct ioc *ioc)
ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64); ioc->pdir_size = (iova_space_size / IOVP_SIZE) * sizeof(u64);
BUG_ON(ioc->pdir_size >= 4 * 1024 * 1024); /* max pdir size < 4MB */ BUG_ON(ioc->pdir_size > 8 * 1024 * 1024); /* max pdir size <= 8MB */
/* Verify it's a power of two */ /* Verify it's a power of two */
BUG_ON((1 << get_order(ioc->pdir_size)) != (ioc->pdir_size >> PAGE_SHIFT)); BUG_ON((1 << get_order(ioc->pdir_size)) != (ioc->pdir_size >> PAGE_SHIFT));
DBG_INIT("%s() hpa 0x%lx mem %luMB IOV %dMB (%d bits)\n", DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",
__FUNCTION__, __FUNCTION__, ioc->ioc_regs,
ioc->ioc_hpa,
(unsigned long) num_physpages >> (20 - PAGE_SHIFT), (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
iova_space_size>>20, iova_space_size>>20,
iov_order + PAGE_SHIFT); iov_order + PAGE_SHIFT);
@ -1329,13 +1328,12 @@ ccio_ioc_init(struct ioc *ioc)
ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL, ioc->pdir_base = (u64 *)__get_free_pages(GFP_KERNEL,
get_order(ioc->pdir_size)); get_order(ioc->pdir_size));
if(NULL == ioc->pdir_base) { if(NULL == ioc->pdir_base) {
panic("%s:%s() could not allocate I/O Page Table\n", __FILE__, panic("%s() could not allocate I/O Page Table\n", __FUNCTION__);
__FUNCTION__);
} }
memset(ioc->pdir_base, 0, ioc->pdir_size); memset(ioc->pdir_base, 0, ioc->pdir_size);
BUG_ON((((unsigned long)ioc->pdir_base) & PAGE_MASK) != (unsigned long)ioc->pdir_base); BUG_ON((((unsigned long)ioc->pdir_base) & PAGE_MASK) != (unsigned long)ioc->pdir_base);
DBG_INIT(" base %p", ioc->pdir_base); DBG_INIT(" base %p\n", ioc->pdir_base);
/* resource map size dictated by pdir_size */ /* resource map size dictated by pdir_size */
ioc->res_size = (ioc->pdir_size / sizeof(u64)) >> 3; ioc->res_size = (ioc->pdir_size / sizeof(u64)) >> 3;
@ -1344,8 +1342,7 @@ ccio_ioc_init(struct ioc *ioc)
ioc->res_map = (u8 *)__get_free_pages(GFP_KERNEL, ioc->res_map = (u8 *)__get_free_pages(GFP_KERNEL,
get_order(ioc->res_size)); get_order(ioc->res_size));
if(NULL == ioc->res_map) { if(NULL == ioc->res_map) {
panic("%s:%s() could not allocate resource map\n", __FILE__, panic("%s() could not allocate resource map\n", __FUNCTION__);
__FUNCTION__);
} }
memset(ioc->res_map, 0, ioc->res_size); memset(ioc->res_map, 0, ioc->res_size);
@ -1366,44 +1363,58 @@ ccio_ioc_init(struct ioc *ioc)
** Initialize IOA hardware ** Initialize IOA hardware
*/ */
WRITE_U32(CCIO_CHAINID_MASK << ioc->chainid_shift, WRITE_U32(CCIO_CHAINID_MASK << ioc->chainid_shift,
&ioc->ioc_hpa->io_chain_id_mask); &ioc->ioc_regs->io_chain_id_mask);
WRITE_U32(virt_to_phys(ioc->pdir_base), WRITE_U32(virt_to_phys(ioc->pdir_base),
&ioc->ioc_hpa->io_pdir_base); &ioc->ioc_regs->io_pdir_base);
/* /*
** Go to "Virtual Mode" ** Go to "Virtual Mode"
*/ */
WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_hpa->io_control); WRITE_U32(IOA_NORMAL_MODE, &ioc->ioc_regs->io_control);
/* /*
** Initialize all I/O TLB entries to 0 (Valid bit off). ** Initialize all I/O TLB entries to 0 (Valid bit off).
*/ */
WRITE_U32(0, &ioc->ioc_hpa->io_tlb_entry_m); WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_m);
WRITE_U32(0, &ioc->ioc_hpa->io_tlb_entry_l); WRITE_U32(0, &ioc->ioc_regs->io_tlb_entry_l);
for(i = 1 << CCIO_CHAINID_SHIFT; i ; i--) { for(i = 1 << CCIO_CHAINID_SHIFT; i ; i--) {
WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioc->chainid_shift)), WRITE_U32((CMD_TLB_DIRECT_WRITE | (i << ioc->chainid_shift)),
&ioc->ioc_hpa->io_command); &ioc->ioc_regs->io_command);
} }
} }
static void static void
ccio_init_resource(struct resource *res, char *name, unsigned long ioaddr) ccio_init_resource(struct resource *res, char *name, void __iomem *ioaddr)
{ {
int result; int result;
res->parent = NULL; res->parent = NULL;
res->flags = IORESOURCE_MEM; res->flags = IORESOURCE_MEM;
res->start = (unsigned long)(signed) __raw_readl(ioaddr) << 16; /*
res->end = (unsigned long)(signed) (__raw_readl(ioaddr + 4) << 16) - 1; * bracing ((signed) ...) are required for 64bit kernel because
* we only want to sign extend the lower 16 bits of the register.
* The upper 16-bits of range registers are hardcoded to 0xffff.
*/
res->start = (unsigned long)((signed) READ_U32(ioaddr) << 16);
res->end = (unsigned long)((signed) (READ_U32(ioaddr + 4) << 16) - 1);
res->name = name; res->name = name;
/*
* Check if this MMIO range is disable
*/
if (res->end + 1 == res->start) if (res->end + 1 == res->start)
return; return;
result = request_resource(&iomem_resource, res);
/* On some platforms (e.g. K-Class), we have already registered
* resources for devices reported by firmware. Some are children
* of ccio.
* "insert" ccio ranges in the mmio hierarchy (/proc/iomem).
*/
result = insert_resource(&iomem_resource, res);
if (result < 0) { if (result < 0) {
printk(KERN_ERR "%s: failed to claim CCIO bus address space (%08lx,%08lx)\n", printk(KERN_ERR "%s() failed to claim CCIO bus address space (%08lx,%08lx)\n",
__FILE__, res->start, res->end); __FUNCTION__, res->start, res->end);
} }
} }
@ -1414,9 +1425,8 @@ static void __init ccio_init_resources(struct ioc *ioc)
sprintf(name, "GSC Bus [%d/]", ioc->hw_path); sprintf(name, "GSC Bus [%d/]", ioc->hw_path);
ccio_init_resource(res, name, (unsigned long)&ioc->ioc_hpa->io_io_low); ccio_init_resource(res, name, &ioc->ioc_regs->io_io_low);
ccio_init_resource(res + 1, name, ccio_init_resource(res + 1, name, &ioc->ioc_regs->io_io_low_hv);
(unsigned long)&ioc->ioc_hpa->io_io_low_hv);
} }
static int new_ioc_area(struct resource *res, unsigned long size, static int new_ioc_area(struct resource *res, unsigned long size,
@ -1427,7 +1437,12 @@ static int new_ioc_area(struct resource *res, unsigned long size,
res->start = (max - size + 1) &~ (align - 1); res->start = (max - size + 1) &~ (align - 1);
res->end = res->start + size; res->end = res->start + size;
if (!request_resource(&iomem_resource, res))
/* We might be trying to expand the MMIO range to include
* a child device that has already registered it's MMIO space.
* Use "insert" instead of request_resource().
*/
if (!insert_resource(&iomem_resource, res))
return 0; return 0;
return new_ioc_area(res, size, min, max - size, align); return new_ioc_area(res, size, min, max - size, align);
@ -1486,15 +1501,15 @@ int ccio_allocate_resource(const struct parisc_device *dev,
if (!expand_ioc_area(parent, size, min, max, align)) { if (!expand_ioc_area(parent, size, min, max, align)) {
__raw_writel(((parent->start)>>16) | 0xffff0000, __raw_writel(((parent->start)>>16) | 0xffff0000,
(unsigned long)&(ioc->ioc_hpa->io_io_low)); &ioc->ioc_regs->io_io_low);
__raw_writel(((parent->end)>>16) | 0xffff0000, __raw_writel(((parent->end)>>16) | 0xffff0000,
(unsigned long)&(ioc->ioc_hpa->io_io_high)); &ioc->ioc_regs->io_io_high);
} else if (!expand_ioc_area(parent + 1, size, min, max, align)) { } else if (!expand_ioc_area(parent + 1, size, min, max, align)) {
parent++; parent++;
__raw_writel(((parent->start)>>16) | 0xffff0000, __raw_writel(((parent->start)>>16) | 0xffff0000,
(unsigned long)&(ioc->ioc_hpa->io_io_low_hv)); &ioc->ioc_regs->io_io_low_hv);
__raw_writel(((parent->end)>>16) | 0xffff0000, __raw_writel(((parent->end)>>16) | 0xffff0000,
(unsigned long)&(ioc->ioc_hpa->io_io_high_hv)); &ioc->ioc_regs->io_io_high_hv);
} else { } else {
return -EBUSY; return -EBUSY;
} }
@ -1521,7 +1536,12 @@ int ccio_request_resource(const struct parisc_device *dev,
return -EBUSY; return -EBUSY;
} }
return request_resource(parent, res); /* "transparent" bus bridges need to register MMIO resources
* firmware assigned them. e.g. children of hppb.c (e.g. K-class)
* registered their resources in the PDC "bus walk" (See
* arch/parisc/kernel/inventory.c).
*/
return insert_resource(parent, res);
} }
/** /**
@ -1546,7 +1566,7 @@ static int ccio_probe(struct parisc_device *dev)
ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn"; ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";
printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name, dev->hpa); printk(KERN_INFO "Found %s at 0x%lx\n", ioc->name, dev->hpa.start);
for (i = 0; i < ioc_count; i++) { for (i = 0; i < ioc_count; i++) {
ioc_p = &(*ioc_p)->next; ioc_p = &(*ioc_p)->next;
@ -1554,7 +1574,7 @@ static int ccio_probe(struct parisc_device *dev)
*ioc_p = ioc; *ioc_p = ioc;
ioc->hw_path = dev->hw_path; ioc->hw_path = dev->hw_path;
ioc->ioc_hpa = (struct ioa_registers *)dev->hpa; ioc->ioc_regs = ioremap(dev->hpa.start, 4096);
ccio_ioc_init(ioc); ccio_ioc_init(ioc);
ccio_init_resources(ioc); ccio_init_resources(ioc);
hppa_dma_ops = &ccio_ops; hppa_dma_ops = &ccio_ops;

View File

@ -167,7 +167,7 @@ ccio_probe(struct parisc_device *dev)
{ {
printk(KERN_INFO "%s found %s at 0x%lx\n", MODULE_NAME, printk(KERN_INFO "%s found %s at 0x%lx\n", MODULE_NAME,
dev->id.hversion == U2_BC_GSC ? "U2" : "UTurn", dev->id.hversion == U2_BC_GSC ? "U2" : "UTurn",
dev->hpa); dev->hpa.start);
/* /*
** FIXME - should check U2 registers to verify it's really running ** FIXME - should check U2 registers to verify it's really running

View File

@ -178,6 +178,8 @@ static int dino_cfg_read(struct pci_bus *bus, unsigned int devfn, int where,
void __iomem *base_addr = d->hba.base_addr; void __iomem *base_addr = d->hba.base_addr;
unsigned long flags; unsigned long flags;
DBG("%s: %p, %d, %d, %d\n", __FUNCTION__, base_addr, devfn, where,
size);
spin_lock_irqsave(&d->dinosaur_pen, flags); spin_lock_irqsave(&d->dinosaur_pen, flags);
/* tell HW which CFG address */ /* tell HW which CFG address */
@ -211,6 +213,8 @@ static int dino_cfg_write(struct pci_bus *bus, unsigned int devfn, int where,
void __iomem *base_addr = d->hba.base_addr; void __iomem *base_addr = d->hba.base_addr;
unsigned long flags; unsigned long flags;
DBG("%s: %p, %d, %d, %d\n", __FUNCTION__, base_addr, devfn, where,
size);
spin_lock_irqsave(&d->dinosaur_pen, flags); spin_lock_irqsave(&d->dinosaur_pen, flags);
/* avoid address stepping feature */ /* avoid address stepping feature */
@ -295,7 +299,7 @@ static void dino_disable_irq(unsigned int irq)
struct dino_device *dino_dev = irq_desc[irq].handler_data; struct dino_device *dino_dev = irq_desc[irq].handler_data;
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq);
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, irq_dev, irq); DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
/* Clear the matching bit in the IMR register */ /* Clear the matching bit in the IMR register */
dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq)); dino_dev->imr &= ~(DINO_MASK_IRQ(local_irq));
@ -308,7 +312,7 @@ static void dino_enable_irq(unsigned int irq)
int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq); int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq);
u32 tmp; u32 tmp;
DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, irq_dev, irq); DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, dino_dev, irq);
/* /*
** clear pending IRQ bits ** clear pending IRQ bits
@ -490,7 +494,7 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr)
if (res->start == F_EXTEND(0xf0000000UL | (i * _8MB))) if (res->start == F_EXTEND(0xf0000000UL | (i * _8MB)))
break; break;
} }
DBG("DINO GSC WRITE i=%d, start=%lx, dino addr = %lx\n", DBG("DINO GSC WRITE i=%d, start=%lx, dino addr = %p\n",
i, res->start, base_addr + DINO_IO_ADDR_EN); i, res->start, base_addr + DINO_IO_ADDR_EN);
__raw_writel(1 << i, base_addr + DINO_IO_ADDR_EN); __raw_writel(1 << i, base_addr + DINO_IO_ADDR_EN);
} }
@ -683,6 +687,14 @@ static void __init
dino_card_init(struct dino_device *dino_dev) dino_card_init(struct dino_device *dino_dev)
{ {
u32 brdg_feat = 0x00784e05; u32 brdg_feat = 0x00784e05;
unsigned long status;
status = __raw_readl(dino_dev->hba.base_addr+DINO_IO_STATUS);
if (status & 0x0000ff80) {
__raw_writel(0x00000005,
dino_dev->hba.base_addr+DINO_IO_COMMAND);
udelay(1);
}
__raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_GMASK); __raw_writel(0x00000000, dino_dev->hba.base_addr+DINO_GMASK);
__raw_writel(0x00000001, dino_dev->hba.base_addr+DINO_IO_FBB_EN); __raw_writel(0x00000001, dino_dev->hba.base_addr+DINO_IO_FBB_EN);
@ -902,15 +914,15 @@ void ccio_cujo20_fixup(struct parisc_device *dev, u32 iovp);
** If so, initialize the chip appropriately (card-mode vs bridge mode). ** If so, initialize the chip appropriately (card-mode vs bridge mode).
** Much of the initialization is common though. ** Much of the initialization is common though.
*/ */
static int __init static int __init dino_probe(struct parisc_device *dev)
dino_driver_callback(struct parisc_device *dev)
{ {
struct dino_device *dino_dev; // Dino specific control struct struct dino_device *dino_dev; // Dino specific control struct
const char *version = "unknown"; const char *version = "unknown";
char *name; char *name;
int is_cujo = 0; int is_cujo = 0;
struct pci_bus *bus; struct pci_bus *bus;
unsigned long hpa = dev->hpa.start;
name = "Dino"; name = "Dino";
if (is_card_dino(&dev->id)) { if (is_card_dino(&dev->id)) {
version = "3.x (card mode)"; version = "3.x (card mode)";
@ -928,11 +940,11 @@ dino_driver_callback(struct parisc_device *dev)
} }
} }
printk("%s version %s found at 0x%lx\n", name, version, dev->hpa); printk("%s version %s found at 0x%lx\n", name, version, hpa);
if (!request_mem_region(dev->hpa, PAGE_SIZE, name)) { if (!request_mem_region(hpa, PAGE_SIZE, name)) {
printk(KERN_ERR "DINO: Hey! Someone took my MMIO space (0x%ld)!\n", printk(KERN_ERR "DINO: Hey! Someone took my MMIO space (0x%ld)!\n",
dev->hpa); hpa);
return 1; return 1;
} }
@ -940,12 +952,12 @@ dino_driver_callback(struct parisc_device *dev)
if (is_cujo && dev->id.hversion_rev == 1) { if (is_cujo && dev->id.hversion_rev == 1) {
#ifdef CONFIG_IOMMU_CCIO #ifdef CONFIG_IOMMU_CCIO
printk(KERN_WARNING "Enabling Cujo 2.0 bug workaround\n"); printk(KERN_WARNING "Enabling Cujo 2.0 bug workaround\n");
if (dev->hpa == (unsigned long)CUJO_RAVEN_ADDR) { if (hpa == (unsigned long)CUJO_RAVEN_ADDR) {
ccio_cujo20_fixup(dev, CUJO_RAVEN_BADPAGE); ccio_cujo20_fixup(dev, CUJO_RAVEN_BADPAGE);
} else if (dev->hpa == (unsigned long)CUJO_FIREHAWK_ADDR) { } else if (hpa == (unsigned long)CUJO_FIREHAWK_ADDR) {
ccio_cujo20_fixup(dev, CUJO_FIREHAWK_BADPAGE); ccio_cujo20_fixup(dev, CUJO_FIREHAWK_BADPAGE);
} else { } else {
printk("Don't recognise Cujo at address 0x%lx, not enabling workaround\n", dev->hpa); printk("Don't recognise Cujo at address 0x%lx, not enabling workaround\n", hpa);
} }
#endif #endif
} else if (!is_cujo && !is_card_dino(&dev->id) && } else if (!is_cujo && !is_card_dino(&dev->id) &&
@ -970,7 +982,7 @@ dino_driver_callback(struct parisc_device *dev)
memset(dino_dev, 0, sizeof(struct dino_device)); memset(dino_dev, 0, sizeof(struct dino_device));
dino_dev->hba.dev = dev; dino_dev->hba.dev = dev;
dino_dev->hba.base_addr = ioremap(dev->hpa, 4096); /* faster access */ dino_dev->hba.base_addr = ioremap(hpa, 4096);
dino_dev->hba.lmmio_space_offset = 0; /* CPU addrs == bus addrs */ dino_dev->hba.lmmio_space_offset = 0; /* CPU addrs == bus addrs */
spin_lock_init(&dino_dev->dinosaur_pen); spin_lock_init(&dino_dev->dinosaur_pen);
dino_dev->hba.iommu = ccio_get_iommu(dev); dino_dev->hba.iommu = ccio_get_iommu(dev);
@ -1027,9 +1039,9 @@ static struct parisc_device_id dino_tbl[] = {
}; };
static struct parisc_driver dino_driver = { static struct parisc_driver dino_driver = {
.name = "Dino", .name = "dino",
.id_table = dino_tbl, .id_table = dino_tbl,
.probe = dino_driver_callback, .probe = dino_probe,
}; };
/* /*

View File

@ -315,7 +315,7 @@ static int __devinit eisa_probe(struct parisc_device *dev)
char *name = is_mongoose(dev) ? "Mongoose" : "Wax"; char *name = is_mongoose(dev) ? "Mongoose" : "Wax";
printk(KERN_INFO "%s EISA Adapter found at 0x%08lx\n", printk(KERN_INFO "%s EISA Adapter found at 0x%08lx\n",
name, dev->hpa); name, dev->hpa.start);
eisa_dev.hba.dev = dev; eisa_dev.hba.dev = dev;
eisa_dev.hba.iommu = ccio_get_iommu(dev); eisa_dev.hba.iommu = ccio_get_iommu(dev);
@ -397,7 +397,7 @@ static struct parisc_device_id eisa_tbl[] = {
MODULE_DEVICE_TABLE(parisc, eisa_tbl); MODULE_DEVICE_TABLE(parisc, eisa_tbl);
static struct parisc_driver eisa_driver = { static struct parisc_driver eisa_driver = {
.name = "EISA Bus Adapter", .name = "eisa_ba",
.id_table = eisa_tbl, .id_table = eisa_tbl,
.probe = eisa_probe, .probe = eisa_probe,
}; };

View File

@ -183,12 +183,20 @@ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp)
*irqp = irq; *irqp = irq;
} }
static struct device *next_device(struct klist_iter *i)
{
struct klist_node * n = klist_next(i);
return n ? container_of(n, struct device, knode_parent) : NULL;
}
void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
void (*choose_irq)(struct parisc_device *, void *)) void (*choose_irq)(struct parisc_device *, void *))
{ {
struct device *dev; struct device *dev;
struct klist_iter i;
list_for_each_entry(dev, &parent->dev.children, node) { klist_iter_init(&parent->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *padev = to_parisc_device(dev); struct parisc_device *padev = to_parisc_device(dev);
/* work-around for 715/64 and others which have parent /* work-around for 715/64 and others which have parent
@ -197,6 +205,7 @@ void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
return gsc_fixup_irqs(padev, ctrl, choose_irq); return gsc_fixup_irqs(padev, ctrl, choose_irq);
choose_irq(padev, ctrl); choose_irq(padev, ctrl);
} }
klist_iter_exit(&i);
} }
int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic) int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic)

View File

@ -68,14 +68,14 @@ static int hppb_probe(struct parisc_device *dev)
memset(card->next, '\0', sizeof(struct hppb_card)); memset(card->next, '\0', sizeof(struct hppb_card));
card = card->next; card = card->next;
} }
printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa); printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa.start);
card->hpa = dev->hpa; card->hpa = dev->hpa.start;
card->mmio_region.name = "HP-PB Bus"; card->mmio_region.name = "HP-PB Bus";
card->mmio_region.flags = IORESOURCE_MEM; card->mmio_region.flags = IORESOURCE_MEM;
card->mmio_region.start = __raw_readl(dev->hpa + IO_IO_LOW); card->mmio_region.start = gsc_readl(dev->hpa.start + IO_IO_LOW);
card->mmio_region.end = __raw_readl(dev->hpa + IO_IO_HIGH) - 1; card->mmio_region.end = gsc_readl(dev->hpa.start + IO_IO_HIGH) - 1;
status = ccio_request_resource(dev, &card->mmio_region); status = ccio_request_resource(dev, &card->mmio_region);
if(status < 0) { if(status < 0) {
@ -93,7 +93,7 @@ static struct parisc_device_id hppb_tbl[] = {
}; };
static struct parisc_driver hppb_driver = { static struct parisc_driver hppb_driver = {
.name = "Gecko Boa", .name = "gecko_boa",
.id_table = hppb_tbl, .id_table = hppb_tbl,
.probe = hppb_probe, .probe = hppb_probe,
}; };

View File

@ -244,7 +244,7 @@ static struct irt_entry *iosapic_alloc_irt(int num_entries)
* 4-byte alignment on 32-bit kernels * 4-byte alignment on 32-bit kernels
*/ */
a = (unsigned long)kmalloc(sizeof(struct irt_entry) * num_entries + 8, GFP_KERNEL); a = (unsigned long)kmalloc(sizeof(struct irt_entry) * num_entries + 8, GFP_KERNEL);
a = (a + 7) & ~7; a = (a + 7UL) & ~7UL;
return (struct irt_entry *)a; return (struct irt_entry *)a;
} }

View File

@ -175,7 +175,7 @@ lasi_init_chip(struct parisc_device *dev)
return -ENOMEM; return -ENOMEM;
lasi->name = "Lasi"; lasi->name = "Lasi";
lasi->hpa = dev->hpa; lasi->hpa = dev->hpa.start;
/* Check the 4-bit (yes, only 4) version register */ /* Check the 4-bit (yes, only 4) version register */
lasi->version = gsc_readl(lasi->hpa + LASI_VER) & 0xf; lasi->version = gsc_readl(lasi->hpa + LASI_VER) & 0xf;
@ -233,7 +233,7 @@ static struct parisc_device_id lasi_tbl[] = {
}; };
struct parisc_driver lasi_driver = { struct parisc_driver lasi_driver = {
.name = "Lasi", .name = "lasi",
.id_table = lasi_tbl, .id_table = lasi_tbl,
.probe = lasi_init_chip, .probe = lasi_init_chip,
}; };

View File

@ -1288,7 +1288,7 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)
** Adjust "window" for this rope. ** Adjust "window" for this rope.
*/ */
rsize /= ROPES_PER_IOC; rsize /= ROPES_PER_IOC;
r->start += (rsize + 1) * LBA_NUM(pa_dev->hpa); r->start += (rsize + 1) * LBA_NUM(pa_dev->hpa.start);
r->end = r->start + rsize; r->end = r->start + rsize;
} else { } else {
r->end = r->start = 0; /* Not enabled. */ r->end = r->start = 0; /* Not enabled. */
@ -1458,7 +1458,7 @@ lba_driver_probe(struct parisc_device *dev)
u32 func_class; u32 func_class;
void *tmp_obj; void *tmp_obj;
char *version; char *version;
void __iomem *addr = ioremap(dev->hpa, 4096); void __iomem *addr = ioremap(dev->hpa.start, 4096);
/* Read HW Rev First */ /* Read HW Rev First */
func_class = READ_REG32(addr + LBA_FCLASS); func_class = READ_REG32(addr + LBA_FCLASS);
@ -1476,7 +1476,7 @@ lba_driver_probe(struct parisc_device *dev)
} }
printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n", printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
MODULE_NAME, version, func_class & 0xf, dev->hpa); MODULE_NAME, version, func_class & 0xf, dev->hpa.start);
if (func_class < 2) { if (func_class < 2) {
printk(KERN_WARNING "Can't support LBA older than " printk(KERN_WARNING "Can't support LBA older than "
@ -1503,17 +1503,17 @@ lba_driver_probe(struct parisc_device *dev)
* but for the mask for func_class. * but for the mask for func_class.
*/ */
printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n", printk(KERN_INFO "%s version %s (0x%x) found at 0x%lx\n",
MODULE_NAME, version, func_class & 0xff, dev->hpa); MODULE_NAME, version, func_class & 0xff, dev->hpa.start);
cfg_ops = &mercury_cfg_ops; cfg_ops = &mercury_cfg_ops;
} else { } else {
printk(KERN_ERR "Unknown LBA found at 0x%lx\n", dev->hpa); printk(KERN_ERR "Unknown LBA found at 0x%lx\n", dev->hpa.start);
return -ENODEV; return -ENODEV;
} }
/* /*
** Tell I/O SAPIC driver we have a IRQ handler/region. ** Tell I/O SAPIC driver we have a IRQ handler/region.
*/ */
tmp_obj = iosapic_register(dev->hpa + LBA_IOSAPIC_BASE); tmp_obj = iosapic_register(dev->hpa.start + LBA_IOSAPIC_BASE);
/* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't /* NOTE: PCI devices (e.g. 103c:1005 graphics card) which don't
** have an IRT entry will get NULL back from iosapic code. ** have an IRT entry will get NULL back from iosapic code.
@ -1635,7 +1635,7 @@ void __init lba_init(void)
*/ */
void lba_set_iregs(struct parisc_device *lba, u32 ibase, u32 imask) void lba_set_iregs(struct parisc_device *lba, u32 ibase, u32 imask)
{ {
void __iomem * base_addr = ioremap(lba->hpa, 4096); void __iomem * base_addr = ioremap(lba->hpa.start, 4096);
imask <<= 2; /* adjust for hints - 2 more bits */ imask <<= 2; /* adjust for hints - 2 more bits */

View File

@ -18,6 +18,9 @@
* Changes: * Changes:
* - Audit copy_from_user in led_proc_write. * - Audit copy_from_user in led_proc_write.
* Daniele Bellucci <bellucda@tiscali.it> * Daniele Bellucci <bellucda@tiscali.it>
* - Switch from using a tasklet to a work queue, so the led_LCD_driver
* can sleep.
* David Pye <dmp@davidmpye.dyndns.org>
*/ */
#include <linux/config.h> #include <linux/config.h>
@ -37,6 +40,7 @@
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/ctype.h> #include <linux/ctype.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/workqueue.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/processor.h> #include <asm/processor.h>
@ -47,25 +51,30 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
/* The control of the LEDs and LCDs on PARISC-machines have to be done /* The control of the LEDs and LCDs on PARISC-machines have to be done
completely in software. The necessary calculations are done in a tasklet completely in software. The necessary calculations are done in a work queue
which is scheduled at every timer interrupt and since the calculations task which is scheduled regularly, and since the calculations may consume a
may consume relatively much CPU-time some of the calculations can be relatively large amount of CPU time, some of the calculations can be
turned off with the following variables (controlled via procfs) */ turned off with the following variables (controlled via procfs) */
static int led_type = -1; static int led_type = -1;
static int led_heartbeat = 1; static unsigned char lastleds; /* LED state from most recent update */
static int led_diskio = 1; static unsigned int led_heartbeat = 1;
static int led_lanrxtx = 1; static unsigned int led_diskio = 1;
static unsigned int led_lanrxtx = 1;
static char lcd_text[32]; static char lcd_text[32];
static char lcd_text_default[32]; static char lcd_text_default[32];
static struct workqueue_struct *led_wq;
static void led_work_func(void *);
static DECLARE_WORK(led_task, led_work_func, NULL);
#if 0 #if 0
#define DPRINTK(x) printk x #define DPRINTK(x) printk x
#else #else
#define DPRINTK(x) #define DPRINTK(x)
#endif #endif
struct lcd_block { struct lcd_block {
unsigned char command; /* stores the command byte */ unsigned char command; /* stores the command byte */
unsigned char on; /* value for turning LED on */ unsigned char on; /* value for turning LED on */
@ -116,12 +125,27 @@ lcd_info __attribute__((aligned(8))) =
#define LCD_DATA_REG lcd_info.lcd_data_reg_addr #define LCD_DATA_REG lcd_info.lcd_data_reg_addr
#define LED_DATA_REG lcd_info.lcd_cmd_reg_addr /* LASI & ASP only */ #define LED_DATA_REG lcd_info.lcd_cmd_reg_addr /* LASI & ASP only */
#define LED_HASLCD 1
#define LED_NOLCD 0
/* The workqueue must be created at init-time */
static int start_task(void)
{
/* Display the default text now */
if (led_type == LED_HASLCD) lcd_print( lcd_text_default );
/* Create the work queue and queue the LED task */
led_wq = create_singlethread_workqueue("led_wq");
queue_work(led_wq, &led_task);
return 0;
}
device_initcall(start_task);
/* ptr to LCD/LED-specific function */ /* ptr to LCD/LED-specific function */
static void (*led_func_ptr) (unsigned char); static void (*led_func_ptr) (unsigned char);
#define LED_HASLCD 1
#define LED_NOLCD 0
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static int led_proc_read(char *page, char **start, off_t off, int count, static int led_proc_read(char *page, char **start, off_t off, int count,
int *eof, void *data) int *eof, void *data)
@ -286,52 +310,35 @@ static void led_LASI_driver(unsigned char leds)
/* /*
** **
** led_LCD_driver() ** led_LCD_driver()
**
** The logic of the LCD driver is, that we write at every scheduled call
** only to one of LCD_CMD_REG _or_ LCD_DATA_REG - registers.
** That way we don't need to let this tasklet busywait for min_cmd_delay
** milliseconds.
**
** TODO: check the value of "min_cmd_delay" against the value of HZ.
** **
*/ */
static void led_LCD_driver(unsigned char leds) static void led_LCD_driver(unsigned char leds)
{ {
static int last_index; /* 0:heartbeat, 1:disk, 2:lan_in, 3:lan_out */ static int i;
static int last_was_cmd;/* 0: CMD was written last, 1: DATA was last */ static unsigned char mask[4] = { LED_HEARTBEAT, LED_DISK_IO,
struct lcd_block *block_ptr; LED_LAN_RCV, LED_LAN_TX };
int value;
switch (last_index) {
case 0: block_ptr = &lcd_info.heartbeat;
value = leds & LED_HEARTBEAT;
break;
case 1: block_ptr = &lcd_info.disk_io;
value = leds & LED_DISK_IO;
break;
case 2: block_ptr = &lcd_info.lan_rcv;
value = leds & LED_LAN_RCV;
break;
case 3: block_ptr = &lcd_info.lan_tx;
value = leds & LED_LAN_TX;
break;
default: /* should never happen: */
return;
}
if (last_was_cmd) {
/* write the value to the LCD data port */
gsc_writeb( value ? block_ptr->on : block_ptr->off, LCD_DATA_REG );
} else {
/* write the command-byte to the LCD command register */
gsc_writeb( block_ptr->command, LCD_CMD_REG );
}
/* now update the vars for the next interrupt iteration */ static struct lcd_block * blockp[4] = {
if (++last_was_cmd == 2) { /* switch between cmd & data */ &lcd_info.heartbeat,
last_was_cmd = 0; &lcd_info.disk_io,
if (++last_index == 4) &lcd_info.lan_rcv,
last_index = 0; /* switch back to heartbeat index */ &lcd_info.lan_tx
};
/* Convert min_cmd_delay to milliseconds */
unsigned int msec_cmd_delay = 1 + (lcd_info.min_cmd_delay / 1000);
for (i=0; i<4; ++i)
{
if ((leds & mask[i]) != (lastleds & mask[i]))
{
gsc_writeb( blockp[i]->command, LCD_CMD_REG );
msleep(msec_cmd_delay);
gsc_writeb( leds & mask[i] ? blockp[i]->on :
blockp[i]->off, LCD_DATA_REG );
msleep(msec_cmd_delay);
}
} }
} }
@ -356,7 +363,7 @@ static __inline__ int led_get_net_activity(void)
rx_total = tx_total = 0; rx_total = tx_total = 0;
/* we are running as tasklet, so locking dev_base /* we are running as a workqueue task, so locking dev_base
* for reading should be OK */ * for reading should be OK */
read_lock(&dev_base_lock); read_lock(&dev_base_lock);
rcu_read_lock(); rcu_read_lock();
@ -405,7 +412,7 @@ static __inline__ int led_get_diskio_activity(void)
static unsigned long last_pgpgin, last_pgpgout; static unsigned long last_pgpgin, last_pgpgout;
struct page_state pgstat; struct page_state pgstat;
int changed; int changed;
get_full_page_state(&pgstat); /* get no of sectors in & out */ get_full_page_state(&pgstat); /* get no of sectors in & out */
/* Just use a very simple calculation here. Do not care about overflow, /* Just use a very simple calculation here. Do not care about overflow,
@ -413,87 +420,71 @@ static __inline__ int led_get_diskio_activity(void)
changed = (pgstat.pgpgin != last_pgpgin) || (pgstat.pgpgout != last_pgpgout); changed = (pgstat.pgpgin != last_pgpgin) || (pgstat.pgpgout != last_pgpgout);
last_pgpgin = pgstat.pgpgin; last_pgpgin = pgstat.pgpgin;
last_pgpgout = pgstat.pgpgout; last_pgpgout = pgstat.pgpgout;
return (changed ? LED_DISK_IO : 0); return (changed ? LED_DISK_IO : 0);
} }
/* /*
** led_tasklet_func() ** led_work_func()
** **
** is scheduled at every timer interrupt from time.c and ** manages when and which chassis LCD/LED gets updated
** updates the chassis LCD/LED
TODO: TODO:
- display load average (older machines like 715/64 have 4 "free" LED's for that) - display load average (older machines like 715/64 have 4 "free" LED's for that)
- optimizations - optimizations
*/ */
#define HEARTBEAT_LEN (HZ*6/100) #define HEARTBEAT_LEN (HZ*10/100)
#define HEARTBEAT_2ND_RANGE_START (HZ*22/100) #define HEARTBEAT_2ND_RANGE_START (HZ*28/100)
#define HEARTBEAT_2ND_RANGE_END (HEARTBEAT_2ND_RANGE_START + HEARTBEAT_LEN) #define HEARTBEAT_2ND_RANGE_END (HEARTBEAT_2ND_RANGE_START + HEARTBEAT_LEN)
#define NORMALIZED_COUNT(count) (count/(HZ/100)) #define LED_UPDATE_INTERVAL (1 + (HZ*19/1000))
static void led_tasklet_func(unsigned long unused) static void led_work_func (void *unused)
{ {
static unsigned char lastleds; static unsigned long last_jiffies;
unsigned char currentleds; /* stores current value of the LEDs */
static unsigned long count; /* static incremented value, not wrapped */
static unsigned long count_HZ; /* counter in range 0..HZ */ static unsigned long count_HZ; /* counter in range 0..HZ */
unsigned char currentleds = 0; /* stores current value of the LEDs */
/* exit if not initialized */ /* exit if not initialized */
if (!led_func_ptr) if (!led_func_ptr)
return; return;
/* increment the local counters */ /* increment the heartbeat timekeeper */
++count; count_HZ += jiffies - last_jiffies;
if (++count_HZ == HZ) last_jiffies = jiffies;
if (count_HZ >= HZ)
count_HZ = 0; count_HZ = 0;
currentleds = lastleds; if (likely(led_heartbeat))
if (led_heartbeat)
{ {
/* flash heartbeat-LED like a real heart (2 x short then a long delay) */ /* flash heartbeat-LED like a real heart
if (count_HZ<HEARTBEAT_LEN || * (2 x short then a long delay)
(count_HZ>=HEARTBEAT_2ND_RANGE_START && count_HZ<HEARTBEAT_2ND_RANGE_END)) */
currentleds |= LED_HEARTBEAT; if (count_HZ < HEARTBEAT_LEN ||
else (count_HZ >= HEARTBEAT_2ND_RANGE_START &&
currentleds &= ~LED_HEARTBEAT; count_HZ < HEARTBEAT_2ND_RANGE_END))
currentleds |= LED_HEARTBEAT;
} }
/* look for network activity and flash LEDs respectively */ if (likely(led_lanrxtx)) currentleds |= led_get_net_activity();
if (led_lanrxtx && ((NORMALIZED_COUNT(count)+(8/2)) & 7) == 0) if (likely(led_diskio)) currentleds |= led_get_diskio_activity();
{
currentleds &= ~(LED_LAN_RCV | LED_LAN_TX);
currentleds |= led_get_net_activity();
}
/* avoid to calculate diskio-stats at same irq as netio-stats */
if (led_diskio && (NORMALIZED_COUNT(count) & 7) == 0)
{
currentleds &= ~LED_DISK_IO;
currentleds |= led_get_diskio_activity();
}
/* blink all LEDs twice a second if we got an Oops (HPMC) */ /* blink all LEDs twice a second if we got an Oops (HPMC) */
if (oops_in_progress) { if (unlikely(oops_in_progress))
currentleds = (count_HZ<=(HZ/2)) ? 0 : 0xff; currentleds = (count_HZ<=(HZ/2)) ? 0 : 0xff;
if (currentleds != lastleds)
{
led_func_ptr(currentleds); /* Update the LCD/LEDs */
lastleds = currentleds;
} }
/* update the LCD/LEDs */ queue_delayed_work(led_wq, &led_task, LED_UPDATE_INTERVAL);
if (currentleds != lastleds) {
led_func_ptr(currentleds);
lastleds = currentleds;
}
} }
/* main led tasklet struct (scheduled from time.c) */
DECLARE_TASKLET_DISABLED(led_tasklet, led_tasklet_func, 0);
/* /*
** led_halt() ** led_halt()
** **
@ -522,9 +513,13 @@ static int led_halt(struct notifier_block *nb, unsigned long event, void *buf)
default: return NOTIFY_DONE; default: return NOTIFY_DONE;
} }
/* completely stop the LED/LCD tasklet */ /* Cancel the work item and delete the queue */
tasklet_disable(&led_tasklet); if (led_wq) {
cancel_rearming_delayed_workqueue(led_wq, &led_task);
destroy_workqueue(led_wq);
led_wq = NULL;
}
if (lcd_info.model == DISPLAY_MODEL_LCD) if (lcd_info.model == DISPLAY_MODEL_LCD)
lcd_print(txt); lcd_print(txt);
else else
@ -559,7 +554,6 @@ int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long d
printk(KERN_INFO "LCD display at %lx,%lx registered\n", printk(KERN_INFO "LCD display at %lx,%lx registered\n",
LCD_CMD_REG , LCD_DATA_REG); LCD_CMD_REG , LCD_DATA_REG);
led_func_ptr = led_LCD_driver; led_func_ptr = led_LCD_driver;
lcd_print( lcd_text_default );
led_type = LED_HASLCD; led_type = LED_HASLCD;
break; break;
@ -589,9 +583,11 @@ int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long d
initialized++; initialized++;
register_reboot_notifier(&led_notifier); register_reboot_notifier(&led_notifier);
/* start the led tasklet for the first time */ /* Ensure the work is queued */
tasklet_enable(&led_tasklet); if (led_wq) {
queue_work(led_wq, &led_task);
}
return 0; return 0;
} }
@ -626,8 +622,8 @@ void __init register_led_regions(void)
** lcd_print() ** lcd_print()
** **
** Displays the given string on the LCD-Display of newer machines. ** Displays the given string on the LCD-Display of newer machines.
** lcd_print() disables the timer-based led tasklet during its ** lcd_print() disables/enables the timer-based led work queue to
** execution and enables it afterwards again. ** avoid a race condition while writing the CMD/DATA register pair.
** **
*/ */
int lcd_print( char *str ) int lcd_print( char *str )
@ -637,12 +633,13 @@ int lcd_print( char *str )
if (!led_func_ptr || lcd_info.model != DISPLAY_MODEL_LCD) if (!led_func_ptr || lcd_info.model != DISPLAY_MODEL_LCD)
return 0; return 0;
/* temporarily disable the led tasklet */ /* temporarily disable the led work task */
tasklet_disable(&led_tasklet); if (led_wq)
cancel_rearming_delayed_workqueue(led_wq, &led_task);
/* copy display string to buffer for procfs */ /* copy display string to buffer for procfs */
strlcpy(lcd_text, str, sizeof(lcd_text)); strlcpy(lcd_text, str, sizeof(lcd_text));
/* Set LCD Cursor to 1st character */ /* Set LCD Cursor to 1st character */
gsc_writeb(lcd_info.reset_cmd1, LCD_CMD_REG); gsc_writeb(lcd_info.reset_cmd1, LCD_CMD_REG);
udelay(lcd_info.min_cmd_delay); udelay(lcd_info.min_cmd_delay);
@ -656,8 +653,10 @@ int lcd_print( char *str )
udelay(lcd_info.min_cmd_delay); udelay(lcd_info.min_cmd_delay);
} }
/* re-enable the led tasklet */ /* re-queue the work */
tasklet_enable(&led_tasklet); if (led_wq) {
queue_work(led_wq, &led_task);
}
return lcd_info.lcd_width; return lcd_info.lcd_width;
} }

View File

@ -536,7 +536,7 @@ pdcs_info_read(struct subsystem *entry, char *buf)
out += sprintf(out, "Memory tested: "); out += sprintf(out, "Memory tested: ");
if ((result & 0x0F) < 0x0E) if ((result & 0x0F) < 0x0E)
out += sprintf(out, "%.3f MB", 0.256*(1<<(result & 0x0F))); out += sprintf(out, "%d kB", (1<<(result & 0x0F))*256);
else else
out += sprintf(out, "All"); out += sprintf(out, "All");
out += sprintf(out, "\n"); out += sprintf(out, "\n");

View File

@ -91,8 +91,8 @@ extern struct proc_dir_entry * proc_mckinley_root;
#define DBG_RES(x...) #define DBG_RES(x...)
#endif #endif
#if defined(__LP64__) && !defined(CONFIG_PDC_NARROW) #if defined(CONFIG_64BIT)
/* "low end" PA8800 machines use ZX1 chipset */ /* "low end" PA8800 machines use ZX1 chipset: PAT PDC and only run 64-bit */
#define ZX1_SUPPORT #define ZX1_SUPPORT
#endif #endif
@ -231,7 +231,7 @@ struct ioc {
spinlock_t res_lock; spinlock_t res_lock;
unsigned int res_bitshift; /* from the LEFT! */ unsigned int res_bitshift; /* from the LEFT! */
unsigned int res_size; /* size of resource map in bytes */ unsigned int res_size; /* size of resource map in bytes */
#if SBA_HINT_SUPPORT #ifdef SBA_HINT_SUPPORT
/* FIXME : DMA HINTs not used */ /* FIXME : DMA HINTs not used */
unsigned long hint_mask_pdir; /* bits used for DMA hints */ unsigned long hint_mask_pdir; /* bits used for DMA hints */
unsigned int hint_shift_pdir; unsigned int hint_shift_pdir;
@ -294,7 +294,7 @@ static unsigned long piranha_bad_128k = 0;
/* Looks nice and keeps the compiler happy */ /* Looks nice and keeps the compiler happy */
#define SBA_DEV(d) ((struct sba_device *) (d)) #define SBA_DEV(d) ((struct sba_device *) (d))
#if SBA_AGP_SUPPORT #ifdef SBA_AGP_SUPPORT
static int reserve_sba_gart = 1; static int reserve_sba_gart = 1;
#endif #endif
@ -314,7 +314,7 @@ static int reserve_sba_gart = 1;
#define WRITE_REG32(val, addr) __raw_writel(cpu_to_le32(val), addr) #define WRITE_REG32(val, addr) __raw_writel(cpu_to_le32(val), addr)
#define WRITE_REG64(val, addr) __raw_writeq(cpu_to_le64(val), addr) #define WRITE_REG64(val, addr) __raw_writeq(cpu_to_le64(val), addr)
#ifdef __LP64__ #ifdef CONFIG_64BIT
#define READ_REG(addr) READ_REG64(addr) #define READ_REG(addr) READ_REG64(addr)
#define WRITE_REG(value, addr) WRITE_REG64(value, addr) #define WRITE_REG(value, addr) WRITE_REG64(value, addr)
#else #else
@ -324,7 +324,7 @@ static int reserve_sba_gart = 1;
#ifdef DEBUG_SBA_INIT #ifdef DEBUG_SBA_INIT
/* NOTE: When __LP64__ isn't defined, READ_REG64() is two 32-bit reads */ /* NOTE: When CONFIG_64BIT isn't defined, READ_REG64() is two 32-bit reads */
/** /**
* sba_dump_ranges - debugging only - print ranges assigned to this IOA * sba_dump_ranges - debugging only - print ranges assigned to this IOA
@ -364,7 +364,7 @@ static void sba_dump_tlb(void __iomem *hpa)
#else #else
#define sba_dump_ranges(x) #define sba_dump_ranges(x)
#define sba_dump_tlb(x) #define sba_dump_tlb(x)
#endif #endif /* DEBUG_SBA_INIT */
#ifdef ASSERT_PDIR_SANITY #ifdef ASSERT_PDIR_SANITY
@ -674,7 +674,7 @@ sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
* *
***************************************************************/ ***************************************************************/
#if SBA_HINT_SUPPORT #ifdef SBA_HINT_SUPPORT
#define SBA_DMA_HINT(ioc, val) ((val) << (ioc)->hint_shift_pdir) #define SBA_DMA_HINT(ioc, val) ((val) << (ioc)->hint_shift_pdir)
#endif #endif
@ -743,9 +743,8 @@ sba_io_pdir_entry(u64 *pdir_ptr, space_t sid, unsigned long vba,
* (bit #61, big endian), we have to flush and sync every time * (bit #61, big endian), we have to flush and sync every time
* IO-PDIR is changed in Ike/Astro. * IO-PDIR is changed in Ike/Astro.
*/ */
if (ioc_needs_fdc) { if (ioc_needs_fdc)
asm volatile("fdc 0(%%sr1,%0)\n\tsync" : : "r" (pdir_ptr)); asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr));
}
} }
@ -769,42 +768,57 @@ static SBA_INLINE void
sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt) sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
{ {
u32 iovp = (u32) SBA_IOVP(ioc,iova); u32 iovp = (u32) SBA_IOVP(ioc,iova);
u64 *pdir_ptr = &ioc->pdir_base[PDIR_INDEX(iovp)];
/* Even though this is a big-endian machine, the entries
** in the iopdir are little endian. That's why we clear the byte
** at +7 instead of at +0.
*/
int off = PDIR_INDEX(iovp)*sizeof(u64)+7;
#ifdef ASSERT_PDIR_SANITY #ifdef ASSERT_PDIR_SANITY
/* Assert first pdir entry is set */ /* Assert first pdir entry is set.
if (0x80 != (((u8 *) ioc->pdir_base)[off])) { **
** Even though this is a big-endian machine, the entries
** in the iopdir are little endian. That's why we look at
** the byte at +7 instead of at +0.
*/
if (0x80 != (((u8 *) pdir_ptr)[7])) {
sba_dump_pdir_entry(ioc,"sba_mark_invalid()", PDIR_INDEX(iovp)); sba_dump_pdir_entry(ioc,"sba_mark_invalid()", PDIR_INDEX(iovp));
} }
#endif #endif
if (byte_cnt <= IOVP_SIZE) if (byte_cnt > IOVP_SIZE)
{ {
iovp |= IOVP_SHIFT; /* set "size" field for PCOM */ #if 0
unsigned long entries_per_cacheline = ioc_needs_fdc ?
L1_CACHE_ALIGN(((unsigned long) pdir_ptr))
- (unsigned long) pdir_ptr;
: 262144;
#endif
/* /* set "size" field for PCOM */
** clear I/O PDIR entry "valid" bit iovp |= get_order(byte_cnt) + PAGE_SHIFT;
** Do NOT clear the rest - save it for debugging.
** We should only clear bits that have previously
** been enabled.
*/
((u8 *)(ioc->pdir_base))[off] = 0;
} else {
u32 t = get_order(byte_cnt) + PAGE_SHIFT;
iovp |= t;
do { do {
/* clear I/O Pdir entry "valid" bit first */ /* clear I/O Pdir entry "valid" bit first */
((u8 *)(ioc->pdir_base))[off] = 0; ((u8 *) pdir_ptr)[7] = 0;
off += sizeof(u64); if (ioc_needs_fdc) {
asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr));
#if 0
entries_per_cacheline = L1_CACHE_SHIFT - 3;
#endif
}
pdir_ptr++;
byte_cnt -= IOVP_SIZE; byte_cnt -= IOVP_SIZE;
} while (byte_cnt > 0); } while (byte_cnt > IOVP_SIZE);
} } else
iovp |= IOVP_SHIFT; /* set "size" field for PCOM */
/*
** clear I/O PDIR entry "valid" bit.
** We have to R/M/W the cacheline regardless how much of the
** pdir entry that we clobber.
** The rest of the entry would be useful for debugging if we
** could dump core on HPMC.
*/
((u8 *) pdir_ptr)[7] = 0;
if (ioc_needs_fdc)
asm volatile("fdc %%r0(%0)" : : "r" (pdir_ptr));
WRITE_REG( SBA_IOVA(ioc, iovp, 0, 0), ioc->ioc_hpa+IOC_PCOM); WRITE_REG( SBA_IOVA(ioc, iovp, 0, 0), ioc->ioc_hpa+IOC_PCOM);
} }
@ -819,18 +833,29 @@ sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)
static int sba_dma_supported( struct device *dev, u64 mask) static int sba_dma_supported( struct device *dev, u64 mask)
{ {
struct ioc *ioc; struct ioc *ioc;
if (dev == NULL) { if (dev == NULL) {
printk(KERN_ERR MODULE_NAME ": EISA/ISA/et al not supported\n"); printk(KERN_ERR MODULE_NAME ": EISA/ISA/et al not supported\n");
BUG(); BUG();
return(0); return(0);
} }
/* Documentation/DMA-mapping.txt tells drivers to try 64-bit first,
* then fall back to 32-bit if that fails.
* We are just "encouraging" 32-bit DMA masks here since we can
* never allow IOMMU bypass unless we add special support for ZX1.
*/
if (mask > ~0U)
return 0;
ioc = GET_IOC(dev); ioc = GET_IOC(dev);
/* check if mask is > than the largest IO Virt Address */ /*
* check if mask is >= than the current max IO Virt Address
return((int) (mask >= (ioc->ibase + * The max IO Virt address will *always* < 30 bits.
(ioc->pdir_size / sizeof(u64) * IOVP_SIZE) ))); */
return((int)(mask >= (ioc->ibase - 1 +
(ioc->pdir_size / sizeof(u64) * IOVP_SIZE) )));
} }
@ -898,11 +923,17 @@ sba_map_single(struct device *dev, void *addr, size_t size,
size -= IOVP_SIZE; size -= IOVP_SIZE;
pdir_start++; pdir_start++;
} }
/* form complete address */
/* force FDC ops in io_pdir_entry() to be visible to IOMMU */
if (ioc_needs_fdc)
asm volatile("sync" : : );
#ifdef ASSERT_PDIR_SANITY #ifdef ASSERT_PDIR_SANITY
sba_check_pdir(ioc,"Check after sba_map_single()"); sba_check_pdir(ioc,"Check after sba_map_single()");
#endif #endif
spin_unlock_irqrestore(&ioc->res_lock, flags); spin_unlock_irqrestore(&ioc->res_lock, flags);
/* form complete address */
return SBA_IOVA(ioc, iovp, offset, DEFAULT_DMA_HINT_REG); return SBA_IOVA(ioc, iovp, offset, DEFAULT_DMA_HINT_REG);
} }
@ -958,12 +989,19 @@ sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size,
d--; d--;
} }
ioc->saved_cnt = 0; ioc->saved_cnt = 0;
READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */
} }
#else /* DELAYED_RESOURCE_CNT == 0 */ #else /* DELAYED_RESOURCE_CNT == 0 */
sba_free_range(ioc, iova, size); sba_free_range(ioc, iova, size);
/* If fdc's were issued, force fdc's to be visible now */
if (ioc_needs_fdc)
asm volatile("sync" : : );
READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */ READ_REG(ioc->ioc_hpa+IOC_PCOM); /* flush purges */
#endif /* DELAYED_RESOURCE_CNT == 0 */ #endif /* DELAYED_RESOURCE_CNT == 0 */
spin_unlock_irqrestore(&ioc->res_lock, flags); spin_unlock_irqrestore(&ioc->res_lock, flags);
/* XXX REVISIT for 2.5 Linux - need syncdma for zero-copy support. /* XXX REVISIT for 2.5 Linux - need syncdma for zero-copy support.
@ -1106,6 +1144,10 @@ sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents,
*/ */
filled = iommu_fill_pdir(ioc, sglist, nents, 0, sba_io_pdir_entry); filled = iommu_fill_pdir(ioc, sglist, nents, 0, sba_io_pdir_entry);
/* force FDC ops in io_pdir_entry() to be visible to IOMMU */
if (ioc_needs_fdc)
asm volatile("sync" : : );
#ifdef ASSERT_PDIR_SANITY #ifdef ASSERT_PDIR_SANITY
if (sba_check_pdir(ioc,"Check after sba_map_sg()")) if (sba_check_pdir(ioc,"Check after sba_map_sg()"))
{ {
@ -1234,8 +1276,10 @@ sba_alloc_pdir(unsigned int pdir_size)
unsigned long pdir_order = get_order(pdir_size); unsigned long pdir_order = get_order(pdir_size);
pdir_base = __get_free_pages(GFP_KERNEL, pdir_order); pdir_base = __get_free_pages(GFP_KERNEL, pdir_order);
if (NULL == (void *) pdir_base) if (NULL == (void *) pdir_base) {
panic("sba_ioc_init() could not allocate I/O Page Table\n"); panic("%s() could not allocate I/O Page Table\n",
__FUNCTION__);
}
/* If this is not PA8700 (PCX-W2) /* If this is not PA8700 (PCX-W2)
** OR newer than ver 2.2 ** OR newer than ver 2.2
@ -1322,19 +1366,29 @@ sba_alloc_pdir(unsigned int pdir_size)
return (void *) pdir_base; return (void *) pdir_base;
} }
/* setup Mercury or Elroy IBASE/IMASK registers. */ static struct device *next_device(struct klist_iter *i)
static void setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
{ {
/* lba_set_iregs() is in drivers/parisc/lba_pci.c */ struct klist_node * n = klist_next(i);
return n ? container_of(n, struct device, knode_parent) : NULL;
}
/* setup Mercury or Elroy IBASE/IMASK registers. */
static void
setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
{
/* lba_set_iregs() is in drivers/parisc/lba_pci.c */
extern void lba_set_iregs(struct parisc_device *, u32, u32); extern void lba_set_iregs(struct parisc_device *, u32, u32);
struct device *dev; struct device *dev;
struct klist_iter i;
list_for_each_entry(dev, &sba->dev.children, node) { klist_iter_init(&sba->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *lba = to_parisc_device(dev); struct parisc_device *lba = to_parisc_device(dev);
int rope_num = (lba->hpa >> 13) & 0xf; int rope_num = (lba->hpa.start >> 13) & 0xf;
if (rope_num >> 3 == ioc_num) if (rope_num >> 3 == ioc_num)
lba_set_iregs(lba, ioc->ibase, ioc->imask); lba_set_iregs(lba, ioc->ibase, ioc->imask);
} }
klist_iter_exit(&i);
} }
static void static void
@ -1343,7 +1397,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
u32 iova_space_mask; u32 iova_space_mask;
u32 iova_space_size; u32 iova_space_size;
int iov_order, tcnfg; int iov_order, tcnfg;
#if SBA_AGP_SUPPORT #ifdef SBA_AGP_SUPPORT
int agp_found = 0; int agp_found = 0;
#endif #endif
/* /*
@ -1380,7 +1434,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
DBG_INIT("%s() pdir %p size %x\n", DBG_INIT("%s() pdir %p size %x\n",
__FUNCTION__, ioc->pdir_base, ioc->pdir_size); __FUNCTION__, ioc->pdir_base, ioc->pdir_size);
#if SBA_HINT_SUPPORT #ifdef SBA_HINT_SUPPORT
ioc->hint_shift_pdir = iov_order + PAGE_SHIFT; ioc->hint_shift_pdir = iov_order + PAGE_SHIFT;
ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT)); ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT));
@ -1404,7 +1458,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
WRITE_REG(ioc->imask, ioc->ioc_hpa + IOC_IMASK); WRITE_REG(ioc->imask, ioc->ioc_hpa + IOC_IMASK);
#ifdef __LP64__ #ifdef CONFIG_64BIT
/* /*
** Setting the upper bits makes checking for bypass addresses ** Setting the upper bits makes checking for bypass addresses
** a little faster later on. ** a little faster later on.
@ -1437,7 +1491,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
*/ */
WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM); WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);
#if SBA_AGP_SUPPORT #ifdef SBA_AGP_SUPPORT
/* /*
** If an AGP device is present, only use half of the IOV space ** If an AGP device is present, only use half of the IOV space
** for PCI DMA. Unfortunately we can't know ahead of time ** for PCI DMA. Unfortunately we can't know ahead of time
@ -1489,11 +1543,9 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
if (iova_space_size < (1 << (20 - PAGE_SHIFT))) { if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
iova_space_size = 1 << (20 - PAGE_SHIFT); iova_space_size = 1 << (20 - PAGE_SHIFT);
} }
#ifdef __LP64__
else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) { else if (iova_space_size > (1 << (30 - PAGE_SHIFT))) {
iova_space_size = 1 << (30 - PAGE_SHIFT); iova_space_size = 1 << (30 - PAGE_SHIFT);
} }
#endif
/* /*
** iova space must be log2() in size. ** iova space must be log2() in size.
@ -1519,7 +1571,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
DBG_INIT("%s() pdir %p size %x\n", DBG_INIT("%s() pdir %p size %x\n",
__FUNCTION__, ioc->pdir_base, pdir_size); __FUNCTION__, ioc->pdir_base, pdir_size);
#if SBA_HINT_SUPPORT #ifdef SBA_HINT_SUPPORT
/* FIXME : DMA HINTs not used */ /* FIXME : DMA HINTs not used */
ioc->hint_shift_pdir = iov_order + PAGE_SHIFT; ioc->hint_shift_pdir = iov_order + PAGE_SHIFT;
ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT)); ioc->hint_mask_pdir = ~(0x3 << (iov_order + PAGE_SHIFT));
@ -1590,7 +1642,7 @@ sba_ioc_init(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
static void __iomem *ioc_remap(struct sba_device *sba_dev, int offset) static void __iomem *ioc_remap(struct sba_device *sba_dev, int offset)
{ {
return ioremap(sba_dev->dev->hpa + offset, SBA_FUNC_SIZE); return ioremap(sba_dev->dev->hpa.start + offset, SBA_FUNC_SIZE);
} }
static void sba_hw_init(struct sba_device *sba_dev) static void sba_hw_init(struct sba_device *sba_dev)
@ -1968,7 +2020,7 @@ sba_driver_callback(struct parisc_device *dev)
u32 func_class; u32 func_class;
int i; int i;
char *version; char *version;
void __iomem *sba_addr = ioremap(dev->hpa, SBA_FUNC_SIZE); void __iomem *sba_addr = ioremap(dev->hpa.start, SBA_FUNC_SIZE);
sba_dump_ranges(sba_addr); sba_dump_ranges(sba_addr);
@ -2010,7 +2062,7 @@ sba_driver_callback(struct parisc_device *dev)
} }
printk(KERN_INFO "%s found %s at 0x%lx\n", printk(KERN_INFO "%s found %s at 0x%lx\n",
MODULE_NAME, version, dev->hpa); MODULE_NAME, version, dev->hpa.start);
sba_dev = kmalloc(sizeof(struct sba_device), GFP_KERNEL); sba_dev = kmalloc(sizeof(struct sba_device), GFP_KERNEL);
if (!sba_dev) { if (!sba_dev) {

View File

@ -11,6 +11,7 @@
* (C) Copyright 2000 Alex deVries <alex@onefishtwo.ca> * (C) Copyright 2000 Alex deVries <alex@onefishtwo.ca>
* (C) Copyright 2001 John Marvin <jsm fc hp com> * (C) Copyright 2001 John Marvin <jsm fc hp com>
* (C) Copyright 2003 Grant Grundler <grundler parisc-linux org> * (C) Copyright 2003 Grant Grundler <grundler parisc-linux org>
* (C) Copyright 2005 Kyle McMartin <kyle@parisc-linux.org>
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as * modify it under the terms of the GNU General Public License as
@ -405,6 +406,7 @@ static void __devinit superio_serial_init(void)
serial[0].iobase = sio_dev.sp1_base; serial[0].iobase = sio_dev.sp1_base;
serial[0].irq = SP1_IRQ; serial[0].irq = SP1_IRQ;
spin_lock_init(&serial[0].lock);
retval = early_serial_setup(&serial[0]); retval = early_serial_setup(&serial[0]);
if (retval < 0) { if (retval < 0) {
@ -414,6 +416,7 @@ static void __devinit superio_serial_init(void)
serial[1].iobase = sio_dev.sp2_base; serial[1].iobase = sio_dev.sp2_base;
serial[1].irq = SP2_IRQ; serial[1].irq = SP2_IRQ;
spin_lock_init(&serial[1].lock);
retval = early_serial_setup(&serial[1]); retval = early_serial_setup(&serial[1]);
if (retval < 0) if (retval < 0)

View File

@ -81,7 +81,7 @@ wax_init_chip(struct parisc_device *dev)
return -ENOMEM; return -ENOMEM;
wax->name = "wax"; wax->name = "wax";
wax->hpa = dev->hpa; wax->hpa = dev->hpa.start;
wax->version = 0; /* gsc_readb(wax->hpa+WAX_VER); */ wax->version = 0; /* gsc_readb(wax->hpa+WAX_VER); */
printk(KERN_INFO "%s at 0x%lx found.\n", wax->name, wax->hpa); printk(KERN_INFO "%s at 0x%lx found.\n", wax->name, wax->hpa);

View File

@ -359,11 +359,12 @@ static int __devinit parport_init_chip(struct parisc_device *dev)
unsigned long port; unsigned long port;
if (!dev->irq) { if (!dev->irq) {
printk("IRQ not found for parallel device at 0x%lx\n", dev->hpa); printk(KERN_WARNING "IRQ not found for parallel device at 0x%lx\n",
dev->hpa.start);
return -ENODEV; return -ENODEV;
} }
port = dev->hpa + PARPORT_GSC_OFFSET; port = dev->hpa.start + PARPORT_GSC_OFFSET;
/* some older machines with ASP-chip don't support /* some older machines with ASP-chip don't support
* the enhanced parport modes. * the enhanced parport modes.

View File

@ -98,7 +98,7 @@ MODULE_DEVICE_TABLE(parisc, lasi700_ids);
static int __init static int __init
lasi700_probe(struct parisc_device *dev) lasi700_probe(struct parisc_device *dev)
{ {
unsigned long base = dev->hpa + LASI_SCSI_CORE_OFFSET; unsigned long base = dev->hpa.start + LASI_SCSI_CORE_OFFSET;
struct NCR_700_Host_Parameters *hostdata; struct NCR_700_Host_Parameters *hostdata;
struct Scsi_Host *host; struct Scsi_Host *host;
@ -125,8 +125,6 @@ lasi700_probe(struct parisc_device *dev)
hostdata->dmode_extra = DMODE_FC2; hostdata->dmode_extra = DMODE_FC2;
} }
NCR_700_set_mem_mapped(hostdata);
host = NCR_700_detect(&lasi700_template, hostdata, &dev->dev); host = NCR_700_detect(&lasi700_template, hostdata, &dev->dev);
if (!host) if (!host)
goto out_kfree; goto out_kfree;
@ -168,7 +166,7 @@ lasi700_driver_remove(struct parisc_device *dev)
} }
static struct parisc_driver lasi700_driver = { static struct parisc_driver lasi700_driver = {
.name = "Lasi SCSI", .name = "lasi_scsi",
.id_table = lasi700_ids, .id_table = lasi700_ids,
.probe = lasi700_probe, .probe = lasi700_probe,
.remove = __devexit_p(lasi700_driver_remove), .remove = __devexit_p(lasi700_driver_remove),

View File

@ -88,7 +88,7 @@ zalon_probe(struct parisc_device *dev)
struct gsc_irq gsc_irq; struct gsc_irq gsc_irq;
u32 zalon_vers; u32 zalon_vers;
int error = -ENODEV; int error = -ENODEV;
void __iomem *zalon = ioremap(dev->hpa, 4096); void __iomem *zalon = ioremap(dev->hpa.start, 4096);
void __iomem *io_port = zalon + GSC_SCSI_ZALON_OFFSET; void __iomem *io_port = zalon + GSC_SCSI_ZALON_OFFSET;
static int unit = 0; static int unit = 0;
struct Scsi_Host *host; struct Scsi_Host *host;
@ -127,7 +127,7 @@ zalon_probe(struct parisc_device *dev)
device.chip = zalon720_chip; device.chip = zalon720_chip;
device.host_id = 7; device.host_id = 7;
device.dev = &dev->dev; device.dev = &dev->dev;
device.slot.base = dev->hpa + GSC_SCSI_ZALON_OFFSET; device.slot.base = dev->hpa.start + GSC_SCSI_ZALON_OFFSET;
device.slot.base_v = io_port; device.slot.base_v = io_port;
device.slot.irq = dev->irq; device.slot.irq = dev->irq;
device.differential = 2; device.differential = 2;

View File

@ -29,7 +29,6 @@
static int __init static int __init
serial_init_chip(struct parisc_device *dev) serial_init_chip(struct parisc_device *dev)
{ {
static int serial_line_nr;
struct uart_port port; struct uart_port port;
unsigned long address; unsigned long address;
int err; int err;
@ -42,12 +41,13 @@ serial_init_chip(struct parisc_device *dev)
*/ */
if (parisc_parent(dev)->id.hw_type != HPHW_IOA) { if (parisc_parent(dev)->id.hw_type != HPHW_IOA) {
printk(KERN_INFO "Serial: device 0x%lx not configured.\n" printk(KERN_INFO "Serial: device 0x%lx not configured.\n"
"Enable support for Wax, Lasi, Asp or Dino.\n", dev->hpa); "Enable support for Wax, Lasi, Asp or Dino.\n",
dev->hpa.start);
} }
return -ENODEV; return -ENODEV;
} }
address = dev->hpa; address = dev->hpa.start;
if (dev->id.sversion != 0x8d) { if (dev->id.sversion != 0x8d) {
address += 0x800; address += 0x800;
} }

View File

@ -27,6 +27,7 @@
#include <linux/delay.h> /* for udelay */ #include <linux/delay.h> /* for udelay */
#include <linux/device.h> #include <linux/device.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/irq.h>
#include <asm/parisc-device.h> #include <asm/parisc-device.h>
#ifdef CONFIG_MAGIC_SYSRQ #ifdef CONFIG_MAGIC_SYSRQ
@ -444,7 +445,7 @@ static int __init mux_probe(struct parisc_device *dev)
unsigned long bytecnt; unsigned long bytecnt;
struct uart_port *port; struct uart_port *port;
status = pdc_iodc_read(&bytecnt, dev->hpa, 0, iodc_data, 32); status = pdc_iodc_read(&bytecnt, dev->hpa.start, 0, iodc_data, 32);
if(status != PDC_OK) { if(status != PDC_OK) {
printk(KERN_ERR "Serial mux: Unable to read IODC.\n"); printk(KERN_ERR "Serial mux: Unable to read IODC.\n");
return 1; return 1;
@ -469,16 +470,18 @@ static int __init mux_probe(struct parisc_device *dev)
for(i = 0; i < ports; ++i, ++port_cnt) { for(i = 0; i < ports; ++i, ++port_cnt) {
port = &mux_ports[port_cnt]; port = &mux_ports[port_cnt];
port->iobase = 0; port->iobase = 0;
port->mapbase = dev->hpa + MUX_OFFSET + (i * MUX_LINE_OFFSET); port->mapbase = dev->hpa.start + MUX_OFFSET +
(i * MUX_LINE_OFFSET);
port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET); port->membase = ioremap(port->mapbase, MUX_LINE_OFFSET);
port->iotype = SERIAL_IO_MEM; port->iotype = SERIAL_IO_MEM;
port->type = PORT_MUX; port->type = PORT_MUX;
port->irq = SERIAL_IRQ_NONE; port->irq = NO_IRQ;
port->uartclk = 0; port->uartclk = 0;
port->fifosize = MUX_FIFO_SIZE; port->fifosize = MUX_FIFO_SIZE;
port->ops = &mux_pops; port->ops = &mux_pops;
port->flags = UPF_BOOT_AUTOCONF; port->flags = UPF_BOOT_AUTOCONF;
port->line = port_cnt; port->line = port_cnt;
spin_lock_init(&port->lock);
status = uart_add_one_port(&mux_driver, port); status = uart_add_one_port(&mux_driver, port);
BUG_ON(status); BUG_ON(status);
} }
@ -497,7 +500,7 @@ static struct parisc_device_id mux_tbl[] = {
MODULE_DEVICE_TABLE(parisc, mux_tbl); MODULE_DEVICE_TABLE(parisc, mux_tbl);
static struct parisc_driver serial_mux_driver = { static struct parisc_driver serial_mux_driver = {
.name = "Serial MUX", .name = "serial_mux",
.id_table = mux_tbl, .id_table = mux_tbl,
.probe = mux_probe, .probe = mux_probe,
}; };

View File

@ -110,7 +110,7 @@ config STI_CONSOLE
config FONTS config FONTS
bool "Select compiled-in fonts" bool "Select compiled-in fonts"
depends on FRAMEBUFFER_CONSOLE depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
help help
Say Y here if you would like to use fonts other than the default Say Y here if you would like to use fonts other than the default
your frame buffer console usually use. your frame buffer console usually use.
@ -123,7 +123,7 @@ config FONTS
config FONT_8x8 config FONT_8x8
bool "VGA 8x8 font" if FONTS bool "VGA 8x8 font" if FONTS
depends on FRAMEBUFFER_CONSOLE depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
default y if !SPARC32 && !SPARC64 && !FONTS default y if !SPARC32 && !SPARC64 && !FONTS
help help
This is the "high resolution" font for the VGA frame buffer (the one This is the "high resolution" font for the VGA frame buffer (the one
@ -137,7 +137,7 @@ config FONT_8x8
config FONT_8x16 config FONT_8x16
bool "VGA 8x16 font" if FONTS bool "VGA 8x16 font" if FONTS
depends on FRAMEBUFFER_CONSOLE || SGI_NEWPORT_CONSOLE=y || USB_SISUSBVGA_CON depends on FRAMEBUFFER_CONSOLE || SGI_NEWPORT_CONSOLE=y || STI_CONSOLE || USB_SISUSBVGA_CON
default y if !SPARC32 && !SPARC64 && !FONTS default y if !SPARC32 && !SPARC64 && !FONTS
help help
This is the "high resolution" font for the VGA frame buffer (the one This is the "high resolution" font for the VGA frame buffer (the one
@ -147,7 +147,7 @@ config FONT_8x16
config FONT_6x11 config FONT_6x11
bool "Mac console 6x11 font (not supported by all drivers)" if FONTS bool "Mac console 6x11 font (not supported by all drivers)" if FONTS
depends on FRAMEBUFFER_CONSOLE depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
default y if !SPARC32 && !SPARC64 && !FONTS && MAC default y if !SPARC32 && !SPARC64 && !FONTS && MAC
help help
Small console font with Macintosh-style high-half glyphs. Some Mac Small console font with Macintosh-style high-half glyphs. Some Mac

View File

@ -511,12 +511,12 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
struct sti_cooked_font *cooked_font; struct sti_cooked_font *cooked_font;
if (!fbfont_name || !strlen(fbfont_name)) if (!fbfont_name || !strlen(fbfont_name))
return NULL; return NULL;
fbfont = find_font(fbfont_name); fbfont = find_font(fbfont_name);
if (!fbfont) if (!fbfont)
fbfont = get_default_font(1024,768); fbfont = get_default_font(1024,768);
if (!fbfont) if (!fbfont)
return NULL; return NULL;
DPRINTK((KERN_DEBUG "selected %dx%d fb-font %s\n", DPRINTK((KERN_DEBUG "selected %dx%d fb-font %s\n",
fbfont->width, fbfont->height, fbfont->name)); fbfont->width, fbfont->height, fbfont->name));
@ -527,7 +527,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
nf = kmalloc(size, GFP_KERNEL); nf = kmalloc(size, GFP_KERNEL);
if (!nf) if (!nf)
return NULL; return NULL;
memset(nf, 0, size); memset(nf, 0, size);
nf->first_char = 0; nf->first_char = 0;
@ -546,8 +546,8 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
cooked_font = kmalloc(sizeof(*cooked_font), GFP_KERNEL); cooked_font = kmalloc(sizeof(*cooked_font), GFP_KERNEL);
if (!cooked_font) { if (!cooked_font) {
kfree(nf); kfree(nf);
return NULL; return NULL;
} }
cooked_font->raw = nf; cooked_font->raw = nf;
@ -595,7 +595,7 @@ sti_select_font(struct sti_cooked_rom *rom,
static void __init static void __init
sti_dump_rom(struct sti_rom *rom) sti_dump_rom(struct sti_rom *rom)
{ {
printk(KERN_INFO " id %04x-%04x, conforms to spec rev. %d.%02x\n", printk(KERN_INFO " id %04x-%04x, conforms to spec rev. %d.%02x\n",
rom->graphics_id[0], rom->graphics_id[0],
rom->graphics_id[1], rom->graphics_id[1],
rom->revno[0] >> 4, rom->revno[0] >> 4,
@ -651,15 +651,16 @@ sti_search_font(struct sti_cooked_rom *rom, int height, int width)
struct sti_cooked_font *font; struct sti_cooked_font *font;
int i = 0; int i = 0;
for(font = rom->font_start; font; font = font->next_font, i++) { for (font = rom->font_start; font; font = font->next_font, i++) {
if((font->raw->width == width) && (font->raw->height == height)) if ((font->raw->width == width) &&
(font->raw->height == height))
return i; return i;
} }
return 0; return 0;
} }
#define BMODE_RELOCATE(offset) offset = (offset) / 4; #define BMODE_RELOCATE(offset) offset = (offset) / 4;
#define BMODE_LAST_ADDR_OFFS 0x50 #define BMODE_LAST_ADDR_OFFS 0x50
static void * __init static void * __init
sti_bmode_font_raw(struct sti_cooked_font *f) sti_bmode_font_raw(struct sti_cooked_font *f)
@ -700,35 +701,35 @@ sti_get_bmode_rom (unsigned long address)
{ {
struct sti_rom *raw; struct sti_rom *raw;
u32 size; u32 size;
struct sti_rom_font *raw_font, *font_start; struct sti_rom_font *raw_font, *font_start;
sti_bmode_rom_copy(address + BMODE_LAST_ADDR_OFFS, sizeof(size), &size); sti_bmode_rom_copy(address + BMODE_LAST_ADDR_OFFS, sizeof(size), &size);
size = (size+3) / 4; size = (size+3) / 4;
raw = kmalloc(size, GFP_KERNEL); raw = kmalloc(size, GFP_KERNEL);
if (raw) { if (raw) {
sti_bmode_rom_copy(address, size, raw); sti_bmode_rom_copy(address, size, raw);
memmove (&raw->res004, &raw->type[0], 0x3c); memmove (&raw->res004, &raw->type[0], 0x3c);
raw->type[3] = raw->res004; raw->type[3] = raw->res004;
BMODE_RELOCATE (raw->region_list); BMODE_RELOCATE (raw->region_list);
BMODE_RELOCATE (raw->font_start); BMODE_RELOCATE (raw->font_start);
BMODE_RELOCATE (raw->init_graph); BMODE_RELOCATE (raw->init_graph);
BMODE_RELOCATE (raw->state_mgmt); BMODE_RELOCATE (raw->state_mgmt);
BMODE_RELOCATE (raw->font_unpmv); BMODE_RELOCATE (raw->font_unpmv);
BMODE_RELOCATE (raw->block_move); BMODE_RELOCATE (raw->block_move);
BMODE_RELOCATE (raw->inq_conf); BMODE_RELOCATE (raw->inq_conf);
raw_font = ((void *)raw) + raw->font_start; raw_font = ((void *)raw) + raw->font_start;
font_start = raw_font; font_start = raw_font;
while (raw_font->next_font) { while (raw_font->next_font) {
BMODE_RELOCATE (raw_font->next_font); BMODE_RELOCATE (raw_font->next_font);
raw_font = ((void *)font_start) + raw_font->next_font; raw_font = ((void *)font_start) + raw_font->next_font;
} }
} }
return raw; return raw;
} }
struct sti_rom * __init struct sti_rom * __init
@ -736,15 +737,15 @@ sti_get_wmode_rom (unsigned long address)
{ {
struct sti_rom *raw; struct sti_rom *raw;
unsigned long size; unsigned long size;
/* read the ROM size directly from the struct in ROM */ /* read the ROM size directly from the struct in ROM */
size = gsc_readl(address + offsetof(struct sti_rom,last_addr)); size = gsc_readl(address + offsetof(struct sti_rom,last_addr));
raw = kmalloc(size, GFP_KERNEL); raw = kmalloc(size, GFP_KERNEL);
if(raw) if (raw)
sti_rom_copy(address, size, raw); sti_rom_copy(address, size, raw);
return raw; return raw;
} }
int __init int __init
@ -757,14 +758,14 @@ sti_read_rom(int wordmode, struct sti_struct *sti, unsigned long address)
if (!cooked) if (!cooked)
goto out_err; goto out_err;
if (wordmode) if (wordmode)
raw = sti_get_wmode_rom (address); raw = sti_get_wmode_rom (address);
else else
raw = sti_get_bmode_rom (address); raw = sti_get_bmode_rom (address);
if (!raw)
goto out_err;
if (!raw)
goto out_err;
if (!sti_cook_fonts(cooked, raw)) { if (!sti_cook_fonts(cooked, raw)) {
printk(KERN_ERR "No font found for STI at %08lx\n", address); printk(KERN_ERR "No font found for STI at %08lx\n", address);
goto out_err; goto out_err;
@ -787,7 +788,7 @@ sti_read_rom(int wordmode, struct sti_struct *sti, unsigned long address)
sti->font_width = sti->font->raw->width; sti->font_width = sti->font->raw->width;
sti->font_height = sti->font->raw->height; sti->font_height = sti->font->raw->height;
if (!wordmode) if (!wordmode)
sti->font->raw = sti_bmode_font_raw(sti->font); sti->font->raw = sti_bmode_font_raw(sti->font);
sti->sti_mem_request = raw->sti_mem_req; sti->sti_mem_request = raw->sti_mem_req;
sti->graphics_id[0] = raw->graphics_id[0]; sti->graphics_id[0] = raw->graphics_id[0];
@ -811,16 +812,16 @@ sti_try_rom_generic(unsigned long address, unsigned long hpa, struct pci_dev *pd
u32 sig; u32 sig;
if (num_sti_roms >= MAX_STI_ROMS) { if (num_sti_roms >= MAX_STI_ROMS) {
printk(KERN_WARNING "maximum number of STI ROMS reached !\n"); printk(KERN_WARNING "maximum number of STI ROMS reached !\n");
return NULL; return NULL;
} }
sti = kmalloc(sizeof(*sti), GFP_KERNEL); sti = kmalloc(sizeof(*sti), GFP_KERNEL);
if (!sti) { if (!sti) {
printk(KERN_ERR "Not enough memory !\n"); printk(KERN_ERR "Not enough memory !\n");
return NULL; return NULL;
} }
memset(sti, 0, sizeof(*sti)); memset(sti, 0, sizeof(*sti));
spin_lock_init(&sti->lock); spin_lock_init(&sti->lock);
@ -932,28 +933,21 @@ static void __init sticore_check_for_default_sti(struct sti_struct *sti, char *p
*/ */
static int __init sticore_pa_init(struct parisc_device *dev) static int __init sticore_pa_init(struct parisc_device *dev)
{ {
unsigned long rom = 0;
char pa_path[21]; char pa_path[21];
struct sti_struct *sti = NULL; struct sti_struct *sti = NULL;
int hpa = dev->hpa.start;
if(dev->num_addrs) {
rom = dev->addr[0]; if (dev->num_addrs && dev->addr[0])
} sti = sti_try_rom_generic(dev->addr[0], hpa, NULL);
if (!rom) { if (!sti)
rom = dev->hpa; sti = sti_try_rom_generic(hpa, hpa, NULL);
DPRINTK((KERN_DEBUG "Trying STI ROM at %08lx, hpa at %08lx\n", rom, dev->hpa)); if (!sti)
sti = sti_try_rom_generic(rom, dev->hpa, NULL); sti = sti_try_rom_generic(PAGE0->proc_sti, hpa, NULL);
rom = PAGE0->proc_sti;
}
if (!sti) {
DPRINTK((KERN_DEBUG "Trying STI ROM at %08lx, hpa at %08lx\n", rom, dev->hpa));
sti = sti_try_rom_generic(rom, dev->hpa, NULL);
}
if (!sti) if (!sti)
return 1; return 1;
print_pa_hwpath(dev, pa_path); print_pa_hwpath(dev, pa_path);
sticore_check_for_default_sti (sti, pa_path); sticore_check_for_default_sti(sti, pa_path);
return 0; return 0;
} }

View File

@ -21,7 +21,9 @@
#ifndef _PARISC_ASSEMBLY_H #ifndef _PARISC_ASSEMBLY_H
#define _PARISC_ASSEMBLY_H #define _PARISC_ASSEMBLY_H
#ifdef __LP64__ #define CALLEE_FLOAT_FRAME_SIZE 80
#ifdef CONFIG_64BIT
#define LDREG ldd #define LDREG ldd
#define STREG std #define STREG std
#define LDREGX ldd,s #define LDREGX ldd,s
@ -30,8 +32,8 @@
#define SHRREG shrd #define SHRREG shrd
#define RP_OFFSET 16 #define RP_OFFSET 16
#define FRAME_SIZE 128 #define FRAME_SIZE 128
#define CALLEE_SAVE_FRAME_SIZE 144 #define CALLEE_REG_FRAME_SIZE 144
#else #else /* CONFIG_64BIT */
#define LDREG ldw #define LDREG ldw
#define STREG stw #define STREG stw
#define LDREGX ldwx,s #define LDREGX ldwx,s
@ -40,9 +42,11 @@
#define SHRREG shr #define SHRREG shr
#define RP_OFFSET 20 #define RP_OFFSET 20
#define FRAME_SIZE 64 #define FRAME_SIZE 64
#define CALLEE_SAVE_FRAME_SIZE 128 #define CALLEE_REG_FRAME_SIZE 128
#endif #endif
#define CALLEE_SAVE_FRAME_SIZE (CALLEE_REG_FRAME_SIZE + CALLEE_FLOAT_FRAME_SIZE)
#ifdef CONFIG_PA20 #ifdef CONFIG_PA20
#define BL b,l #define BL b,l
# ifdef CONFIG_64BIT # ifdef CONFIG_64BIT
@ -300,9 +304,35 @@
fldd,mb -8(\regs), %fr0 fldd,mb -8(\regs), %fr0
.endm .endm
.macro callee_save_float
fstd,ma %fr12, 8(%r30)
fstd,ma %fr13, 8(%r30)
fstd,ma %fr14, 8(%r30)
fstd,ma %fr15, 8(%r30)
fstd,ma %fr16, 8(%r30)
fstd,ma %fr17, 8(%r30)
fstd,ma %fr18, 8(%r30)
fstd,ma %fr19, 8(%r30)
fstd,ma %fr20, 8(%r30)
fstd,ma %fr21, 8(%r30)
.endm
.macro callee_rest_float
fldd,mb -8(%r30), %fr21
fldd,mb -8(%r30), %fr20
fldd,mb -8(%r30), %fr19
fldd,mb -8(%r30), %fr18
fldd,mb -8(%r30), %fr17
fldd,mb -8(%r30), %fr16
fldd,mb -8(%r30), %fr15
fldd,mb -8(%r30), %fr14
fldd,mb -8(%r30), %fr13
fldd,mb -8(%r30), %fr12
.endm
#ifdef __LP64__ #ifdef __LP64__
.macro callee_save .macro callee_save
std,ma %r3, CALLEE_SAVE_FRAME_SIZE(%r30) std,ma %r3, CALLEE_REG_FRAME_SIZE(%r30)
mfctl %cr27, %r3 mfctl %cr27, %r3
std %r4, -136(%r30) std %r4, -136(%r30)
std %r5, -128(%r30) std %r5, -128(%r30)
@ -340,13 +370,13 @@
ldd -128(%r30), %r5 ldd -128(%r30), %r5
ldd -136(%r30), %r4 ldd -136(%r30), %r4
mtctl %r3, %cr27 mtctl %r3, %cr27
ldd,mb -CALLEE_SAVE_FRAME_SIZE(%r30), %r3 ldd,mb -CALLEE_REG_FRAME_SIZE(%r30), %r3
.endm .endm
#else /* ! __LP64__ */ #else /* ! __LP64__ */
.macro callee_save .macro callee_save
stw,ma %r3, CALLEE_SAVE_FRAME_SIZE(%r30) stw,ma %r3, CALLEE_REG_FRAME_SIZE(%r30)
mfctl %cr27, %r3 mfctl %cr27, %r3
stw %r4, -124(%r30) stw %r4, -124(%r30)
stw %r5, -120(%r30) stw %r5, -120(%r30)
@ -384,7 +414,7 @@
ldw -120(%r30), %r5 ldw -120(%r30), %r5
ldw -124(%r30), %r4 ldw -124(%r30), %r4
mtctl %r3, %cr27 mtctl %r3, %cr27
ldw,mb -CALLEE_SAVE_FRAME_SIZE(%r30), %r3 ldw,mb -CALLEE_REG_FRAME_SIZE(%r30), %r3
.endm .endm
#endif /* ! __LP64__ */ #endif /* ! __LP64__ */
@ -450,5 +480,30 @@
REST_CR (%cr22, PT_PSW (\regs)) REST_CR (%cr22, PT_PSW (\regs))
.endm .endm
/* First step to create a "relied upon translation"
* See PA 2.0 Arch. page F-4 and F-5.
*
* The ssm was originally necessary due to a "PCxT bug".
* But someone decided it needed to be added to the architecture
* and this "feature" went into rev3 of PA-RISC 1.1 Arch Manual.
* It's been carried forward into PA 2.0 Arch as well. :^(
*
* "ssm 0,%r0" is a NOP with side effects (prefetch barrier).
* rsm/ssm prevents the ifetch unit from speculatively fetching
* instructions past this line in the code stream.
* PA 2.0 processor will single step all insn in the same QUAD (4 insn).
*/
.macro pcxt_ssm_bug
rsm PSW_SM_I,%r0
nop /* 1 */
nop /* 2 */
nop /* 3 */
nop /* 4 */
nop /* 5 */
nop /* 6 */
nop /* 7 */
.endm
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif #endif

View File

@ -2,7 +2,7 @@
#define _PARISC_BITOPS_H #define _PARISC_BITOPS_H
#include <linux/compiler.h> #include <linux/compiler.h>
#include <asm/spinlock.h> #include <asm/types.h> /* for BITS_PER_LONG/SHIFT_PER_LONG */
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/atomic.h> #include <asm/atomic.h>
@ -12,193 +12,157 @@
* to include/asm-i386/bitops.h or kerneldoc * to include/asm-i386/bitops.h or kerneldoc
*/ */
#ifdef __LP64__ #define CHOP_SHIFTCOUNT(x) (((unsigned long) (x)) & (BITS_PER_LONG - 1))
# define SHIFT_PER_LONG 6
#ifndef BITS_PER_LONG
# define BITS_PER_LONG 64
#endif
#else
# define SHIFT_PER_LONG 5
#ifndef BITS_PER_LONG
# define BITS_PER_LONG 32
#endif
#endif
#define CHOP_SHIFTCOUNT(x) ((x) & (BITS_PER_LONG - 1))
#define smp_mb__before_clear_bit() smp_mb() #define smp_mb__before_clear_bit() smp_mb()
#define smp_mb__after_clear_bit() smp_mb() #define smp_mb__after_clear_bit() smp_mb()
static __inline__ void set_bit(int nr, volatile unsigned long * address) /* See http://marc.theaimsgroup.com/?t=108826637900003 for discussion
* on use of volatile and __*_bit() (set/clear/change):
* *_bit() want use of volatile.
* __*_bit() are "relaxed" and don't use spinlock or volatile.
*/
static __inline__ void set_bit(int nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address;
unsigned long flags; unsigned long flags;
addr += (nr >> SHIFT_PER_LONG); addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
_atomic_spin_lock_irqsave(addr, flags); _atomic_spin_lock_irqsave(addr, flags);
*addr |= mask; *addr |= mask;
_atomic_spin_unlock_irqrestore(addr, flags); _atomic_spin_unlock_irqrestore(addr, flags);
} }
static __inline__ void __set_bit(int nr, volatile unsigned long * address) static __inline__ void __set_bit(unsigned long nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG);
unsigned long *addr = (unsigned long *) address;
addr += (nr >> SHIFT_PER_LONG); *m |= 1UL << CHOP_SHIFTCOUNT(nr);
mask = 1L << CHOP_SHIFTCOUNT(nr);
*addr |= mask;
} }
static __inline__ void clear_bit(int nr, volatile unsigned long * address) static __inline__ void clear_bit(int nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long mask = ~(1UL << CHOP_SHIFTCOUNT(nr));
unsigned long *addr = (unsigned long *) address;
unsigned long flags; unsigned long flags;
addr += (nr >> SHIFT_PER_LONG); addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
_atomic_spin_lock_irqsave(addr, flags); _atomic_spin_lock_irqsave(addr, flags);
*addr &= ~mask; *addr &= mask;
_atomic_spin_unlock_irqrestore(addr, flags); _atomic_spin_unlock_irqrestore(addr, flags);
} }
static __inline__ void __clear_bit(unsigned long nr, volatile unsigned long * address) static __inline__ void __clear_bit(unsigned long nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG);
unsigned long *addr = (unsigned long *) address;
addr += (nr >> SHIFT_PER_LONG); *m &= ~(1UL << CHOP_SHIFTCOUNT(nr));
mask = 1L << CHOP_SHIFTCOUNT(nr);
*addr &= ~mask;
} }
static __inline__ void change_bit(int nr, volatile unsigned long * address) static __inline__ void change_bit(int nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address;
unsigned long flags; unsigned long flags;
addr += (nr >> SHIFT_PER_LONG); addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
_atomic_spin_lock_irqsave(addr, flags); _atomic_spin_lock_irqsave(addr, flags);
*addr ^= mask; *addr ^= mask;
_atomic_spin_unlock_irqrestore(addr, flags); _atomic_spin_unlock_irqrestore(addr, flags);
} }
static __inline__ void __change_bit(int nr, volatile unsigned long * address) static __inline__ void __change_bit(unsigned long nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long *m = (unsigned long *) addr + (nr >> SHIFT_PER_LONG);
unsigned long *addr = (unsigned long *) address;
addr += (nr >> SHIFT_PER_LONG); *m ^= 1UL << CHOP_SHIFTCOUNT(nr);
mask = 1L << CHOP_SHIFTCOUNT(nr);
*addr ^= mask;
} }
static __inline__ int test_and_set_bit(int nr, volatile unsigned long * address) static __inline__ int test_and_set_bit(int nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address; unsigned long oldbit;
int oldbit;
unsigned long flags; unsigned long flags;
addr += (nr >> SHIFT_PER_LONG); addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
_atomic_spin_lock_irqsave(addr, flags); _atomic_spin_lock_irqsave(addr, flags);
oldbit = (*addr & mask) ? 1 : 0; oldbit = *addr;
*addr |= mask; *addr = oldbit | mask;
_atomic_spin_unlock_irqrestore(addr, flags); _atomic_spin_unlock_irqrestore(addr, flags);
return oldbit; return (oldbit & mask) ? 1 : 0;
} }
static __inline__ int __test_and_set_bit(int nr, volatile unsigned long * address) static __inline__ int __test_and_set_bit(int nr, volatile unsigned long * address)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address; unsigned long oldbit;
int oldbit; unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG);
addr += (nr >> SHIFT_PER_LONG); oldbit = *addr;
mask = 1L << CHOP_SHIFTCOUNT(nr); *addr = oldbit | mask;
oldbit = (*addr & mask) ? 1 : 0;
*addr |= mask;
return oldbit; return (oldbit & mask) ? 1 : 0;
} }
static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * address) static __inline__ int test_and_clear_bit(int nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address; unsigned long oldbit;
int oldbit;
unsigned long flags; unsigned long flags;
addr += (nr >> SHIFT_PER_LONG); addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
_atomic_spin_lock_irqsave(addr, flags); _atomic_spin_lock_irqsave(addr, flags);
oldbit = (*addr & mask) ? 1 : 0; oldbit = *addr;
*addr &= ~mask; *addr = oldbit & ~mask;
_atomic_spin_unlock_irqrestore(addr, flags); _atomic_spin_unlock_irqrestore(addr, flags);
return oldbit; return (oldbit & mask) ? 1 : 0;
} }
static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long * address) static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long * address)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address; unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG);
int oldbit; unsigned long oldbit;
addr += (nr >> SHIFT_PER_LONG); oldbit = *addr;
mask = 1L << CHOP_SHIFTCOUNT(nr); *addr = oldbit & ~mask;
oldbit = (*addr & mask) ? 1 : 0;
*addr &= ~mask;
return oldbit; return (oldbit & mask) ? 1 : 0;
} }
static __inline__ int test_and_change_bit(int nr, volatile unsigned long * address) static __inline__ int test_and_change_bit(int nr, volatile unsigned long * addr)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address; unsigned long oldbit;
int oldbit;
unsigned long flags; unsigned long flags;
addr += (nr >> SHIFT_PER_LONG); addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
_atomic_spin_lock_irqsave(addr, flags); _atomic_spin_lock_irqsave(addr, flags);
oldbit = (*addr & mask) ? 1 : 0; oldbit = *addr;
*addr ^= mask; *addr = oldbit ^ mask;
_atomic_spin_unlock_irqrestore(addr, flags); _atomic_spin_unlock_irqrestore(addr, flags);
return oldbit; return (oldbit & mask) ? 1 : 0;
} }
static __inline__ int __test_and_change_bit(int nr, volatile unsigned long * address) static __inline__ int __test_and_change_bit(int nr, volatile unsigned long * address)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
unsigned long *addr = (unsigned long *) address; unsigned long *addr = (unsigned long *)address + (nr >> SHIFT_PER_LONG);
int oldbit; unsigned long oldbit;
addr += (nr >> SHIFT_PER_LONG); oldbit = *addr;
mask = 1L << CHOP_SHIFTCOUNT(nr); *addr = oldbit ^ mask;
oldbit = (*addr & mask) ? 1 : 0;
*addr ^= mask;
return oldbit; return (oldbit & mask) ? 1 : 0;
} }
static __inline__ int test_bit(int nr, const volatile unsigned long *address) static __inline__ int test_bit(int nr, const volatile unsigned long *address)
{ {
unsigned long mask; unsigned long mask = 1UL << CHOP_SHIFTCOUNT(nr);
const unsigned long *addr = (const unsigned long *)address; const unsigned long *addr = (const unsigned long *)address + (nr >> SHIFT_PER_LONG);
addr += (nr >> SHIFT_PER_LONG);
mask = 1L << CHOP_SHIFTCOUNT(nr);
return !!(*addr & mask); return !!(*addr & mask);
} }
@ -229,7 +193,7 @@ static __inline__ unsigned long __ffs(unsigned long x)
unsigned long ret; unsigned long ret;
__asm__( __asm__(
#if BITS_PER_LONG > 32 #ifdef __LP64__
" ldi 63,%1\n" " ldi 63,%1\n"
" extrd,u,*<> %0,63,32,%%r0\n" " extrd,u,*<> %0,63,32,%%r0\n"
" extrd,u,*TR %0,31,32,%0\n" /* move top 32-bits down */ " extrd,u,*TR %0,31,32,%0\n" /* move top 32-bits down */
@ -304,14 +268,7 @@ static __inline__ int fls(int x)
* hweightN: returns the hamming weight (i.e. the number * hweightN: returns the hamming weight (i.e. the number
* of bits set) of a N-bit word * of bits set) of a N-bit word
*/ */
#define hweight64(x) \ #define hweight64(x) generic_hweight64(x)
({ \
unsigned long __x = (x); \
unsigned int __w; \
__w = generic_hweight32((unsigned int) __x); \
__w += generic_hweight32((unsigned int) (__x>>32)); \
__w; \
})
#define hweight32(x) generic_hweight32(x) #define hweight32(x) generic_hweight32(x)
#define hweight16(x) generic_hweight16(x) #define hweight16(x) generic_hweight16(x)
#define hweight8(x) generic_hweight8(x) #define hweight8(x) generic_hweight8(x)
@ -324,7 +281,13 @@ static __inline__ int fls(int x)
*/ */
static inline int sched_find_first_bit(const unsigned long *b) static inline int sched_find_first_bit(const unsigned long *b)
{ {
#ifndef __LP64__ #ifdef __LP64__
if (unlikely(b[0]))
return __ffs(b[0]);
if (unlikely(b[1]))
return __ffs(b[1]) + 64;
return __ffs(b[2]) + 128;
#else
if (unlikely(b[0])) if (unlikely(b[0]))
return __ffs(b[0]); return __ffs(b[0]);
if (unlikely(b[1])) if (unlikely(b[1]))
@ -334,14 +297,6 @@ static inline int sched_find_first_bit(const unsigned long *b)
if (b[3]) if (b[3])
return __ffs(b[3]) + 96; return __ffs(b[3]) + 96;
return __ffs(b[4]) + 128; return __ffs(b[4]) + 128;
#else
if (unlikely(b[0]))
return __ffs(b[0]);
if (unlikely(((unsigned int)b[1])))
return __ffs(b[1]) + 64;
if (b[1] >> 32)
return __ffs(b[1] >> 32) + 96;
return __ffs(b[2]) + 128;
#endif #endif
} }
@ -391,7 +346,7 @@ found_middle:
static __inline__ unsigned long find_next_bit(const 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)
{ {
const unsigned long *p = addr + (offset >> 6); const unsigned long *p = addr + (offset >> SHIFT_PER_LONG);
unsigned long result = offset & ~(BITS_PER_LONG-1); unsigned long result = offset & ~(BITS_PER_LONG-1);
unsigned long tmp; unsigned long tmp;
@ -445,71 +400,90 @@ found_middle:
* test_and_{set,clear}_bit guarantee atomicity without * test_and_{set,clear}_bit guarantee atomicity without
* disabling interrupts. * disabling interrupts.
*/ */
#ifdef __LP64__
#define ext2_set_bit(nr, addr) __test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr) /* '3' is bits per byte */
#define ext2_set_bit_atomic(l,nr,addr) test_and_set_bit((nr) ^ 0x38, (unsigned long *)addr) #define LE_BYTE_ADDR ((sizeof(unsigned long) - 1) << 3)
#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) #define ext2_test_bit(nr, addr) \
#else test_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#define ext2_set_bit(nr, addr) __test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr) #define ext2_set_bit(nr, addr) \
#define ext2_set_bit_atomic(l,nr,addr) test_and_set_bit((nr) ^ 0x18, (unsigned long *)addr) __test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr) #define ext2_clear_bit(nr, addr) \
#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x18, (unsigned long *)addr) __test_and_clear_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#endif
#define ext2_set_bit_atomic(l,nr,addr) \
test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#define ext2_clear_bit_atomic(l,nr,addr) \
test_and_clear_bit( (nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
static __inline__ int ext2_test_bit(int nr, __const__ void * addr)
{
__const__ unsigned char *ADDR = (__const__ unsigned char *) addr;
return (ADDR[nr >> 3] >> (nr & 7)) & 1;
}
/*
* This implementation of ext2_find_{first,next}_zero_bit was stolen from
* Linus' asm-alpha/bitops.h and modified for a big-endian machine.
*/
#define ext2_find_first_zero_bit(addr, size) \ #define ext2_find_first_zero_bit(addr, size) \
ext2_find_next_zero_bit((addr), (size), 0) ext2_find_next_zero_bit((addr), (size), 0)
extern __inline__ unsigned long ext2_find_next_zero_bit(void *addr, /* include/linux/byteorder does not support "unsigned long" type */
unsigned long size, unsigned long offset) static inline unsigned long ext2_swabp(unsigned long * x)
{ {
unsigned int *p = ((unsigned int *) addr) + (offset >> 5); #ifdef __LP64__
unsigned int result = offset & ~31UL; return (unsigned long) __swab64p((u64 *) x);
unsigned int tmp; #else
return (unsigned long) __swab32p((u32 *) x);
#endif
}
/* include/linux/byteorder doesn't support "unsigned long" type */
static inline unsigned long ext2_swab(unsigned long y)
{
#ifdef __LP64__
return (unsigned long) __swab64((u64) y);
#else
return (unsigned long) __swab32((u32) y);
#endif
}
static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
{
unsigned long *p = (unsigned long *) addr + (offset >> SHIFT_PER_LONG);
unsigned long result = offset & ~(BITS_PER_LONG - 1);
unsigned long tmp;
if (offset >= size) if (offset >= size)
return size; return size;
size -= result; size -= result;
offset &= 31UL; offset &= (BITS_PER_LONG - 1UL);
if (offset) { if (offset) {
tmp = cpu_to_le32p(p++); tmp = ext2_swabp(p++);
tmp |= ~0UL >> (32-offset); tmp |= (~0UL >> (BITS_PER_LONG - offset));
if (size < 32) if (size < BITS_PER_LONG)
goto found_first; goto found_first;
if (tmp != ~0U) if (~tmp)
goto found_middle; goto found_middle;
size -= 32; size -= BITS_PER_LONG;
result += 32; result += BITS_PER_LONG;
} }
while (size >= 32) {
if ((tmp = cpu_to_le32p(p++)) != ~0U) while (size & ~(BITS_PER_LONG - 1)) {
goto found_middle; if (~(tmp = *(p++)))
result += 32; goto found_middle_swap;
size -= 32; result += BITS_PER_LONG;
size -= BITS_PER_LONG;
} }
if (!size) if (!size)
return result; return result;
tmp = cpu_to_le32p(p); tmp = ext2_swabp(p);
found_first: found_first:
tmp |= ~0U << size; tmp |= ~0UL << size;
if (tmp == ~0UL) /* Are any bits zero? */
return result + size; /* Nope. Skip ffz */
found_middle: found_middle:
return result + ffz(tmp); return result + ffz(tmp);
found_middle_swap:
return result + ffz(ext2_swab(tmp));
} }
/* Bitmap functions for the minix filesystem. */ /* Bitmap functions for the minix filesystem. */
#define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr) #define minix_test_and_set_bit(nr,addr) ext2_set_bit(nr,addr)
#define minix_set_bit(nr,addr) ((void)ext2_set_bit(nr,addr)) #define minix_set_bit(nr,addr) ((void)ext2_set_bit(nr,addr))

View File

@ -114,6 +114,7 @@
#define ENOTSUP 252 /* Function not implemented (POSIX.4 / HPUX) */ #define ENOTSUP 252 /* Function not implemented (POSIX.4 / HPUX) */
#define ECANCELLED 253 /* aio request was canceled before complete (POSIX.4 / HPUX) */ #define ECANCELLED 253 /* aio request was canceled before complete (POSIX.4 / HPUX) */
#define ECANCELED ECANCELLED /* SuSv3 and Solaris wants one 'L' */
/* for robust mutexes */ /* for robust mutexes */
#define EOWNERDEAD 254 /* Owner died */ #define EOWNERDEAD 254 /* Owner died */

View File

@ -69,6 +69,8 @@
#define CRT_ID_TVRX S9000_ID_98765 /* TVRX (gto/falcon) */ #define CRT_ID_TVRX S9000_ID_98765 /* TVRX (gto/falcon) */
#define CRT_ID_ARTIST S9000_ID_ARTIST /* Artist */ #define CRT_ID_ARTIST S9000_ID_ARTIST /* Artist */
#define CRT_ID_SUMMIT 0x2FC1066B /* Summit FX2, FX4, FX6 ... */ #define CRT_ID_SUMMIT 0x2FC1066B /* Summit FX2, FX4, FX6 ... */
#define CRT_ID_LEGO 0x35ACDA30 /* Lego FX5, FX10 ... */
#define CRT_ID_PINNACLE 0x35ACDA16 /* Pinnacle FXe */
/* structure for ioctl(GCDESCRIBE) */ /* structure for ioctl(GCDESCRIBE) */

View File

@ -23,9 +23,6 @@
#define LED_CMD_REG_NONE 0 /* NULL == no addr for the cmd register */ #define LED_CMD_REG_NONE 0 /* NULL == no addr for the cmd register */
/* led tasklet struct */
extern struct tasklet_struct led_tasklet;
/* register_led_driver() */ /* register_led_driver() */
int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long data_reg); int __init register_led_driver(int model, unsigned long cmd_reg, unsigned long data_reg);

View File

@ -1,7 +1,7 @@
#include <linux/device.h> #include <linux/device.h>
struct parisc_device { struct parisc_device {
unsigned long hpa; /* Hard Physical Address */ struct resource hpa; /* Hard Physical Address */
struct parisc_device_id id; struct parisc_device_id id;
struct parisc_driver *driver; /* Driver for this device */ struct parisc_driver *driver; /* Driver for this device */
char name[80]; /* The hardware description */ char name[80]; /* The hardware description */
@ -39,6 +39,11 @@ struct parisc_driver {
#define to_parisc_driver(d) container_of(d, struct parisc_driver, drv) #define to_parisc_driver(d) container_of(d, struct parisc_driver, drv)
#define parisc_parent(d) to_parisc_device(d->dev.parent) #define parisc_parent(d) to_parisc_device(d->dev.parent)
static inline char *parisc_pathname(struct parisc_device *d)
{
return d->dev.bus_id;
}
static inline void static inline void
parisc_set_drvdata(struct parisc_device *d, void *p) parisc_set_drvdata(struct parisc_device *d, void *p)
{ {

View File

@ -69,7 +69,7 @@ struct pci_hba_data {
#define PCI_PORT_HBA(a) ((a) >> HBA_PORT_SPACE_BITS) #define PCI_PORT_HBA(a) ((a) >> HBA_PORT_SPACE_BITS)
#define PCI_PORT_ADDR(a) ((a) & (HBA_PORT_SPACE_SIZE - 1)) #define PCI_PORT_ADDR(a) ((a) & (HBA_PORT_SPACE_SIZE - 1))
#if CONFIG_64BIT #ifdef CONFIG_64BIT
#define PCI_F_EXTEND 0xffffffff00000000UL #define PCI_F_EXTEND 0xffffffff00000000UL
#define PCI_IS_LMMIO(hba,a) pci_is_lmmio(hba,a) #define PCI_IS_LMMIO(hba,a) pci_is_lmmio(hba,a)

View File

@ -501,6 +501,8 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
remap_pfn_range(vma, vaddr, pfn, size, prot) remap_pfn_range(vma, vaddr, pfn, size, prot)
#define pgprot_noncached(prot) __pgprot(pgprot_val(prot) | _PAGE_NO_CACHE)
#define MK_IOSPACE_PFN(space, pfn) (pfn) #define MK_IOSPACE_PFN(space, pfn) (pfn)
#define GET_IOSPACE(pfn) 0 #define GET_IOSPACE(pfn) 0
#define GET_PFN(pfn) (pfn) #define GET_PFN(pfn) (pfn)

View File

@ -122,8 +122,27 @@ struct thread_struct {
}; };
/* Thread struct flags. */ /* Thread struct flags. */
#define PARISC_UAC_NOPRINT (1UL << 0) /* see prctl and unaligned.c */
#define PARISC_UAC_SIGBUS (1UL << 1)
#define PARISC_KERNEL_DEATH (1UL << 31) /* see die_if_kernel()... */ #define PARISC_KERNEL_DEATH (1UL << 31) /* see die_if_kernel()... */
#define PARISC_UAC_SHIFT 0
#define PARISC_UAC_MASK (PARISC_UAC_NOPRINT|PARISC_UAC_SIGBUS)
#define SET_UNALIGN_CTL(task,value) \
({ \
(task)->thread.flags = (((task)->thread.flags & ~PARISC_UAC_MASK) \
| (((value) << PARISC_UAC_SHIFT) & \
PARISC_UAC_MASK)); \
0; \
})
#define GET_UNALIGN_CTL(task,addr) \
({ \
put_user(((task)->thread.flags & PARISC_UAC_MASK) \
>> PARISC_UAC_SHIFT, (int __user *) (addr)); \
})
#define INIT_THREAD { \ #define INIT_THREAD { \
regs: { gr: { 0, }, \ regs: { gr: { 0, }, \
fr: { 0, }, \ fr: { 0, }, \

View File

@ -1,4 +1,7 @@
#ifndef _PARISC_PSW_H #ifndef _PARISC_PSW_H
#include <linux/config.h>
#define PSW_I 0x00000001 #define PSW_I 0x00000001
#define PSW_D 0x00000002 #define PSW_D 0x00000002
#define PSW_P 0x00000004 #define PSW_P 0x00000004
@ -9,6 +12,16 @@
#define PSW_G 0x00000040 /* PA1.x only */ #define PSW_G 0x00000040 /* PA1.x only */
#define PSW_O 0x00000080 /* PA2.0 only */ #define PSW_O 0x00000080 /* PA2.0 only */
/* ssm/rsm instructions number PSW_W and PSW_E differently */
#define PSW_SM_I PSW_I /* Enable External Interrupts */
#define PSW_SM_D PSW_D
#define PSW_SM_P PSW_P
#define PSW_SM_Q PSW_Q /* Enable Interrupt State Collection */
#define PSW_SM_R PSW_R /* Enable Recover Counter Trap */
#define PSW_SM_W 0x200 /* PA2.0 only : Enable Wide Mode */
#define PSW_SM_QUIET PSW_SM_R+PSW_SM_Q+PSW_SM_P+PSW_SM_D+PSW_SM_I
#define PSW_CB 0x0000ff00 #define PSW_CB 0x0000ff00
#define PSW_M 0x00010000 #define PSW_M 0x00010000
@ -30,33 +43,21 @@
#define PSW_Z 0x40000000 /* PA1.x only */ #define PSW_Z 0x40000000 /* PA1.x only */
#define PSW_Y 0x80000000 /* PA1.x only */ #define PSW_Y 0x80000000 /* PA1.x only */
#ifdef __LP64__ #ifdef CONFIG_64BIT
#define PSW_HI_CB 0x000000ff /* PA2.0 only */ # define PSW_HI_CB 0x000000ff /* PA2.0 only */
#endif #endif
/* PSW bits to be used with ssm/rsm */ #ifdef CONFIG_64BIT
#define PSW_SM_I 0x1 # define USER_PSW_HI_MASK PSW_HI_CB
#define PSW_SM_D 0x2 # define WIDE_PSW PSW_W
#define PSW_SM_P 0x4 #else
#define PSW_SM_Q 0x8 # define WIDE_PSW 0
#define PSW_SM_R 0x10
#define PSW_SM_F 0x20
#define PSW_SM_G 0x40
#define PSW_SM_O 0x80
#define PSW_SM_E 0x100
#define PSW_SM_W 0x200
#ifdef __LP64__
# define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
# define KERNEL_PSW (PSW_W | PSW_C | PSW_Q | PSW_P | PSW_D)
# define REAL_MODE_PSW (PSW_W | PSW_Q)
# define USER_PSW_MASK (PSW_W | PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
# define USER_PSW_HI_MASK (PSW_HI_CB)
#else
# define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
# define KERNEL_PSW (PSW_C | PSW_Q | PSW_P | PSW_D)
# define REAL_MODE_PSW (PSW_Q)
# define USER_PSW_MASK (PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
#endif #endif
/* Used when setting up for rfi */
#define KERNEL_PSW (WIDE_PSW | PSW_C | PSW_Q | PSW_P | PSW_D)
#define REAL_MODE_PSW (WIDE_PSW | PSW_Q)
#define USER_PSW_MASK (WIDE_PSW | PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
#define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
#endif #endif

View File

@ -49,7 +49,7 @@ struct pt_regs {
#define user_mode(regs) (((regs)->iaoq[0] & 3) ? 1 : 0) #define user_mode(regs) (((regs)->iaoq[0] & 3) ? 1 : 0)
#define user_space(regs) (((regs)->iasq[1] != 0) ? 1 : 0) #define user_space(regs) (((regs)->iasq[1] != 0) ? 1 : 0)
#define instruction_pointer(regs) ((regs)->iaoq[0] & ~3) #define instruction_pointer(regs) ((regs)->iaoq[0] & ~3)
#define profile_pc(regs) instruction_pointer(regs) unsigned long profile_pc(struct pt_regs *);
extern void show_regs(struct pt_regs *); extern void show_regs(struct pt_regs *);
#endif #endif

View File

@ -5,11 +5,6 @@
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/spinlock_types.h> #include <asm/spinlock_types.h>
/* Note that PA-RISC has to use `1' to mean unlocked and `0' to mean locked
* since it only has load-and-zero. Moreover, at least on some PA processors,
* the semaphore address has to be 16-byte aligned.
*/
static inline int __raw_spin_is_locked(raw_spinlock_t *x) static inline int __raw_spin_is_locked(raw_spinlock_t *x)
{ {
volatile unsigned int *a = __ldcw_align(x); volatile unsigned int *a = __ldcw_align(x);

View File

@ -6,11 +6,15 @@
#endif #endif
typedef struct { typedef struct {
#ifdef CONFIG_PA20
volatile unsigned int slock;
# define __RAW_SPIN_LOCK_UNLOCKED { 1 }
#else
volatile unsigned int lock[4]; volatile unsigned int lock[4];
# define __RAW_SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 } }
#endif
} raw_spinlock_t; } raw_spinlock_t;
#define __RAW_SPIN_LOCK_UNLOCKED { { 1, 1, 1, 1 } }
typedef struct { typedef struct {
raw_spinlock_t lock; raw_spinlock_t lock;
volatile int counter; volatile int counter;

View File

@ -138,13 +138,7 @@ static inline void set_eiem(unsigned long val)
#define set_wmb(var, value) do { var = value; wmb(); } while (0) #define set_wmb(var, value) do { var = value; wmb(); } while (0)
/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ #ifndef CONFIG_PA20
#define __ldcw(a) ({ \
unsigned __ret; \
__asm__ __volatile__("ldcw 0(%1),%0" : "=r" (__ret) : "r" (a)); \
__ret; \
})
/* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data, /* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data,
and GCC only guarantees 8-byte alignment for stack locals, we can't and GCC only guarantees 8-byte alignment for stack locals, we can't
be assured of 16-byte alignment for atomic lock data even if we be assured of 16-byte alignment for atomic lock data even if we
@ -152,37 +146,41 @@ static inline void set_eiem(unsigned long val)
we use a struct containing an array of four ints for the atomic lock we use a struct containing an array of four ints for the atomic lock
type and dynamically select the 16-byte aligned int from the array type and dynamically select the 16-byte aligned int from the array
for the semaphore. */ for the semaphore. */
#define __PA_LDCW_ALIGNMENT 16 #define __PA_LDCW_ALIGNMENT 16
#define __ldcw_align(a) ({ \ #define __ldcw_align(a) ({ \
unsigned long __ret = (unsigned long) &(a)->lock[0]; \ unsigned long __ret = (unsigned long) &(a)->lock[0]; \
__ret = (__ret + __PA_LDCW_ALIGNMENT - 1) & ~(__PA_LDCW_ALIGNMENT - 1); \ __ret = (__ret + __PA_LDCW_ALIGNMENT - 1) & ~(__PA_LDCW_ALIGNMENT - 1); \
(volatile unsigned int *) __ret; \ (volatile unsigned int *) __ret; \
}) })
#define LDCW "ldcw"
#else /*CONFIG_PA20*/
/* From: "Jim Hull" <jim.hull of hp.com>
I've attached a summary of the change, but basically, for PA 2.0, as
long as the ",CO" (coherent operation) completer is specified, then the
16-byte alignment requirement for ldcw and ldcd is relaxed, and instead
they only require "natural" alignment (4-byte for ldcw, 8-byte for
ldcd). */
#define __PA_LDCW_ALIGNMENT 4
#define __ldcw_align(a) ((volatile unsigned int *)a)
#define LDCW "ldcw,co"
#endif /*!CONFIG_PA20*/
/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */
#define __ldcw(a) ({ \
unsigned __ret; \
__asm__ __volatile__(LDCW " 0(%1),%0" : "=r" (__ret) : "r" (a)); \
__ret; \
})
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
# define __lock_aligned __attribute__((__section__(".data.lock_aligned"))) # define __lock_aligned __attribute__((__section__(".data.lock_aligned")))
#endif #endif
#define KERNEL_START (0x10100000 - 0x1000) #define KERNEL_START (0x10100000 - 0x1000)
/* This is for the serialisation of PxTLB broadcasts. At least on the
* N class systems, only one PxTLB inter processor broadcast can be
* active at any one time on the Merced bus. This tlb purge
* synchronisation is fairly lightweight and harmless so we activate
* it on all SMP systems not just the N class. */
#ifdef CONFIG_SMP
extern spinlock_t pa_tlb_lock;
#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
#else
#define purge_tlb_start(x) do { } while(0)
#define purge_tlb_end(x) do { } while (0)
#endif
#define arch_align_stack(x) (x) #define arch_align_stack(x) (x)
#endif #endif

View File

@ -7,6 +7,26 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
/* This is for the serialisation of PxTLB broadcasts. At least on the
* N class systems, only one PxTLB inter processor broadcast can be
* active at any one time on the Merced bus. This tlb purge
* synchronisation is fairly lightweight and harmless so we activate
* it on all SMP systems not just the N class. */
#ifdef CONFIG_SMP
extern spinlock_t pa_tlb_lock;
#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
#else
#define purge_tlb_start(x) do { } while(0)
#define purge_tlb_end(x) do { } while (0)
#endif
extern void flush_tlb_all(void); extern void flush_tlb_all(void);
/* /*
@ -64,29 +84,26 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
{ {
unsigned long npages; unsigned long npages;
npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT; npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
if (npages >= 512) /* XXX arbitrary, should be tuned */ if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */
flush_tlb_all(); flush_tlb_all();
else { else {
mtsp(vma->vm_mm->context,1); mtsp(vma->vm_mm->context,1);
purge_tlb_start();
if (split_tlb) { if (split_tlb) {
purge_tlb_start();
while (npages--) { while (npages--) {
pdtlb(start); pdtlb(start);
pitlb(start); pitlb(start);
start += PAGE_SIZE; start += PAGE_SIZE;
} }
purge_tlb_end();
} else { } else {
purge_tlb_start();
while (npages--) { while (npages--) {
pdtlb(start); pdtlb(start);
start += PAGE_SIZE; start += PAGE_SIZE;
} }
purge_tlb_end();
} }
purge_tlb_end();
} }
} }

View File

@ -33,8 +33,10 @@ typedef unsigned long long __u64;
#ifdef __LP64__ #ifdef __LP64__
#define BITS_PER_LONG 64 #define BITS_PER_LONG 64
#define SHIFT_PER_LONG 6
#else #else
#define BITS_PER_LONG 32 #define BITS_PER_LONG 32
#define SHIFT_PER_LONG 5
#endif #endif
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__

View File

@ -687,8 +687,8 @@
#define __NR_shmget (__NR_Linux + 194) #define __NR_shmget (__NR_Linux + 194)
#define __NR_shmctl (__NR_Linux + 195) #define __NR_shmctl (__NR_Linux + 195)
#define __NR_getpmsg (__NR_Linux + 196) /* some people actually want streams */ #define __NR_getpmsg (__NR_Linux + 196) /* Somebody *wants* streams? */
#define __NR_putpmsg (__NR_Linux + 197) /* some people actually want streams */ #define __NR_putpmsg (__NR_Linux + 197)
#define __NR_lstat64 (__NR_Linux + 198) #define __NR_lstat64 (__NR_Linux + 198)
#define __NR_truncate64 (__NR_Linux + 199) #define __NR_truncate64 (__NR_Linux + 199)
@ -755,8 +755,14 @@
#define __NR_mbind (__NR_Linux + 260) #define __NR_mbind (__NR_Linux + 260)
#define __NR_get_mempolicy (__NR_Linux + 261) #define __NR_get_mempolicy (__NR_Linux + 261)
#define __NR_set_mempolicy (__NR_Linux + 262) #define __NR_set_mempolicy (__NR_Linux + 262)
#define __NR_vserver (__NR_Linux + 263)
#define __NR_add_key (__NR_Linux + 264)
#define __NR_request_key (__NR_Linux + 265)
#define __NR_keyctl (__NR_Linux + 266)
#define __NR_ioprio_set (__NR_Linux + 267)
#define __NR_ioprio_get (__NR_Linux + 268)
#define __NR_Linux_syscalls 263 #define __NR_Linux_syscalls 269
#define HPUX_GATEWAY_ADDR 0xC0000004 #define HPUX_GATEWAY_ADDR 0xC0000004
#define LINUX_GATEWAY_ADDR 0x100 #define LINUX_GATEWAY_ADDR 0x100
@ -807,10 +813,10 @@
#define K_INLINE_SYSCALL(name, nr, args...) ({ \ #define K_INLINE_SYSCALL(name, nr, args...) ({ \
long __sys_res; \ long __sys_res; \
{ \ { \
register unsigned long __res asm("r28"); \ register unsigned long __res __asm__("r28"); \
K_LOAD_ARGS_##nr(args) \ K_LOAD_ARGS_##nr(args) \
/* FIXME: HACK stw/ldw r19 around syscall */ \ /* FIXME: HACK stw/ldw r19 around syscall */ \
asm volatile( \ __asm__ volatile( \
K_STW_ASM_PIC \ K_STW_ASM_PIC \
" ble 0x100(%%sr2, %%r0)\n" \ " ble 0x100(%%sr2, %%r0)\n" \
" ldi %1, %%r20\n" \ " ldi %1, %%r20\n" \

483
include/linux/hil.h Normal file
View File

@ -0,0 +1,483 @@
#ifndef _HIL_H_
#define _HIL_H_
/*
* Hewlett Packard Human Interface Loop (HP-HIL) Protocol -- header.
*
* Copyright (c) 2001 Brian S. Julin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL").
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
*
* References:
* HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
*
* A note of thanks to HP for providing and shipping reference materials
* free of charge to help in the development of HIL support for Linux.
*
*/
#include <asm/types.h>
/* Physical constants relevant to raw loop/device timing.
*/
#define HIL_CLOCK 8MHZ
#define HIL_EK1_CLOCK 30HZ
#define HIL_EK2_CLOCK 60HZ
#define HIL_TIMEOUT_DEV 5 /* ms */
#define HIL_TIMEOUT_DEVS 10 /* ms */
#define HIL_TIMEOUT_NORESP 10 /* ms */
#define HIL_TIMEOUT_DEVS_DATA 16 /* ms */
#define HIL_TIMEOUT_SELFTEST 200 /* ms */
/* Actual wire line coding. These will only be useful if someone is
* implementing a software MLC to run HIL devices on a non-parisc machine.
*/
#define HIL_WIRE_PACKET_LEN 15
enum hil_wire_bitpos {
HIL_WIRE_START = 0,
HIL_WIRE_ADDR2,
HIL_WIRE_ADDR1,
HIL_WIRE_ADDR0,
HIL_WIRE_COMMAND,
HIL_WIRE_DATA7,
HIL_WIRE_DATA6,
HIL_WIRE_DATA5,
HIL_WIRE_DATA4,
HIL_WIRE_DATA3,
HIL_WIRE_DATA2,
HIL_WIRE_DATA1,
HIL_WIRE_DATA0,
HIL_WIRE_PARITY,
HIL_WIRE_STOP
};
/* HP documentation uses these bit positions to refer to commands;
* we will call these "packets".
*/
enum hil_pkt_bitpos {
HIL_PKT_CMD = 0x00000800,
HIL_PKT_ADDR2 = 0x00000400,
HIL_PKT_ADDR1 = 0x00000200,
HIL_PKT_ADDR0 = 0x00000100,
HIL_PKT_ADDR_MASK = 0x00000700,
HIL_PKT_ADDR_SHIFT = 8,
HIL_PKT_DATA7 = 0x00000080,
HIL_PKT_DATA6 = 0x00000040,
HIL_PKT_DATA5 = 0x00000020,
HIL_PKT_DATA4 = 0x00000010,
HIL_PKT_DATA3 = 0x00000008,
HIL_PKT_DATA2 = 0x00000004,
HIL_PKT_DATA1 = 0x00000002,
HIL_PKT_DATA0 = 0x00000001,
HIL_PKT_DATA_MASK = 0x000000FF,
HIL_PKT_DATA_SHIFT = 0
};
/* The HIL MLC also has several error/status/control bits. We extend the
* "packet" to include these when direct access to the MLC is available,
* or emulate them in cases where they are not available.
*
* This way the device driver knows that the underlying MLC driver
* has had to deal with loop errors.
*/
enum hil_error_bitpos {
HIL_ERR_OB = 0x00000800, /* MLC is busy sending an auto-poll,
or we have filled up the output
buffer and must wait. */
HIL_ERR_INT = 0x00010000, /* A normal interrupt has occurred. */
HIL_ERR_NMI = 0x00020000, /* An NMI has occurred. */
HIL_ERR_LERR = 0x00040000, /* A poll didn't come back. */
HIL_ERR_PERR = 0x01000000, /* There was a Parity Error. */
HIL_ERR_FERR = 0x02000000, /* There was a Framing Error. */
HIL_ERR_FOF = 0x04000000 /* Input FIFO Overflowed. */
};
enum hil_control_bitpos {
HIL_CTRL_TEST = 0x00010000,
HIL_CTRL_IPF = 0x00040000,
HIL_CTRL_APE = 0x02000000
};
/* Bits 30,31 are unused, we use them to control write behavior. */
#define HIL_DO_ALTER_CTRL 0x40000000 /* Write MSW of packet to control
before writing LSW to loop */
#define HIL_CTRL_ONLY 0xc0000000 /* *Only* alter the control registers */
/* This gives us a 32-bit "packet"
*/
typedef u32 hil_packet;
/* HIL Loop commands
*/
enum hil_command {
HIL_CMD_IFC = 0x00, /* Interface Clear */
HIL_CMD_EPT = 0x01, /* Enter Pass-Thru Mode */
HIL_CMD_ELB = 0x02, /* Enter Loop-Back Mode */
HIL_CMD_IDD = 0x03, /* Identify and Describe */
HIL_CMD_DSR = 0x04, /* Device Soft Reset */
HIL_CMD_PST = 0x05, /* Perform Self Test */
HIL_CMD_RRG = 0x06, /* Read Register */
HIL_CMD_WRG = 0x07, /* Write Register */
HIL_CMD_ACF = 0x08, /* Auto Configure */
HIL_CMDID_ACF = 0x07, /* Auto Configure bits with incremented ID */
HIL_CMD_POL = 0x10, /* Poll */
HIL_CMDCT_POL = 0x0f, /* Poll command bits with item count */
HIL_CMD_RPL = 0x20, /* RePoll */
HIL_CMDCT_RPL = 0x0f, /* RePoll command bits with item count */
HIL_CMD_RNM = 0x30, /* Report Name */
HIL_CMD_RST = 0x31, /* Report Status */
HIL_CMD_EXD = 0x32, /* Extended Describe */
HIL_CMD_RSC = 0x33, /* Report Security Code */
/* 0x34 to 0x3c reserved for future use */
HIL_CMD_DKA = 0x3d, /* Disable Keyswitch Autorepeat */
HIL_CMD_EK1 = 0x3e, /* Enable Keyswitch Autorepeat 1 */
HIL_CMD_EK2 = 0x3f, /* Enable Keyswitch Autorepeat 2 */
HIL_CMD_PR1 = 0x40, /* Prompt1 */
HIL_CMD_PR2 = 0x41, /* Prompt2 */
HIL_CMD_PR3 = 0x42, /* Prompt3 */
HIL_CMD_PR4 = 0x43, /* Prompt4 */
HIL_CMD_PR5 = 0x44, /* Prompt5 */
HIL_CMD_PR6 = 0x45, /* Prompt6 */
HIL_CMD_PR7 = 0x46, /* Prompt7 */
HIL_CMD_PRM = 0x47, /* Prompt (General Purpose) */
HIL_CMD_AK1 = 0x48, /* Acknowlege1 */
HIL_CMD_AK2 = 0x49, /* Acknowlege2 */
HIL_CMD_AK3 = 0x4a, /* Acknowlege3 */
HIL_CMD_AK4 = 0x4b, /* Acknowlege4 */
HIL_CMD_AK5 = 0x4c, /* Acknowlege5 */
HIL_CMD_AK6 = 0x4d, /* Acknowlege6 */
HIL_CMD_AK7 = 0x4e, /* Acknowlege7 */
HIL_CMD_ACK = 0x4f, /* Acknowlege (General Purpose) */
/* 0x50 to 0x78 reserved for future use */
/* 0x80 to 0xEF device-specific commands */
/* 0xf0 to 0xf9 reserved for future use */
HIL_CMD_RIO = 0xfa, /* Register I/O Error */
HIL_CMD_SHR = 0xfb, /* System Hard Reset */
HIL_CMD_TER = 0xfc, /* Transmission Error */
HIL_CMD_CAE = 0xfd, /* Configuration Address Error */
HIL_CMD_DHR = 0xfe, /* Device Hard Reset */
/* 0xff is prohibited from use. */
};
/*
* Response "records" to HIL commands
*/
/* Device ID byte
*/
#define HIL_IDD_DID_TYPE_MASK 0xe0 /* Primary type bits */
#define HIL_IDD_DID_TYPE_KB_INTEGRAL 0xa0 /* Integral keyboard */
#define HIL_IDD_DID_TYPE_KB_ITF 0xc0 /* ITD keyboard */
#define HIL_IDD_DID_TYPE_KB_RSVD 0xe0 /* Reserved keyboard type */
#define HIL_IDD_DID_TYPE_KB_LANG_MASK 0x1f /* Keyboard locale bits */
#define HIL_IDD_DID_KBLANG_USE_ESD 0x00 /* Use ESD Locale instead */
#define HIL_IDD_DID_TYPE_ABS 0x80 /* Absolute Positioners */
#define HIL_IDD_DID_ABS_RSVD1_MASK 0xf8 /* Reserved */
#define HIL_IDD_DID_ABS_RSVD1 0x98
#define HIL_IDD_DID_ABS_TABLET_MASK 0xf8 /* Tablets and digitizers */
#define HIL_IDD_DID_ABS_TABLET 0x90
#define HIL_IDD_DID_ABS_TSCREEN_MASK 0xfc /* Touch screens */
#define HIL_IDD_DID_ABS_TSCREEN 0x8c
#define HIL_IDD_DID_ABS_RSVD2_MASK 0xfc /* Reserved */
#define HIL_IDD_DID_ABS_RSVD2 0x88
#define HIL_IDD_DID_ABS_RSVD3_MASK 0xfc /* Reserved */
#define HIL_IDD_DID_ABS_RSVD3 0x80
#define HIL_IDD_DID_TYPE_REL 0x60 /* Relative Positioners */
#define HIL_IDD_DID_REL_RSVD1_MASK 0xf0 /* Reserved */
#define HIL_IDD_DID_REL_RSVD1 0x70
#define HIL_IDD_DID_REL_RSVD2_MASK 0xfc /* Reserved */
#define HIL_IDD_DID_REL_RSVD2 0x6c
#define HIL_IDD_DID_REL_MOUSE_MASK 0xfc /* Mouse */
#define HIL_IDD_DID_REL_MOUSE 0x68
#define HIL_IDD_DID_REL_QUAD_MASK 0xf8 /* Other Quadrature Devices */
#define HIL_IDD_DID_REL_QUAD 0x60
#define HIL_IDD_DID_TYPE_CHAR 0x40 /* Character Entry */
#define HIL_IDD_DID_CHAR_BARCODE_MASK 0xfc /* Barcode Reader */
#define HIL_IDD_DID_CHAR_BARCODE 0x5c
#define HIL_IDD_DID_CHAR_RSVD1_MASK 0xfc /* Reserved */
#define HIL_IDD_DID_CHAR_RSVD1 0x58
#define HIL_IDD_DID_CHAR_RSVD2_MASK 0xf8 /* Reserved */
#define HIL_IDD_DID_CHAR_RSVD2 0x50
#define HIL_IDD_DID_CHAR_RSVD3_MASK 0xf0 /* Reserved */
#define HIL_IDD_DID_CHAR_RSVD3 0x40
#define HIL_IDD_DID_TYPE_OTHER 0x20 /* Miscellaneous */
#define HIL_IDD_DID_OTHER_RSVD1_MASK 0xf0 /* Reserved */
#define HIL_IDD_DID_OTHER_RSVD1 0x30
#define HIL_IDD_DID_OTHER_BARCODE_MASK 0xfc /* Tone Generator */
#define HIL_IDD_DID_OTHER_BARCODE 0x2c
#define HIL_IDD_DID_OTHER_RSVD2_MASK 0xfc /* Reserved */
#define HIL_IDD_DID_OTHER_RSVD2 0x28
#define HIL_IDD_DID_OTHER_RSVD3_MASK 0xf8 /* Reserved */
#define HIL_IDD_DID_OTHER_RSVD3 0x20
#define HIL_IDD_DID_TYPE_KEYPAD 0x00 /* Vectra Keyboard */
/* IDD record header
*/
#define HIL_IDD_HEADER_AXSET_MASK 0x03 /* Number of axis in a set */
#define HIL_IDD_HEADER_RSC 0x04 /* Supports RSC command */
#define HIL_IDD_HEADER_EXD 0x08 /* Supports EXD command */
#define HIL_IDD_HEADER_IOD 0x10 /* IOD byte to follow */
#define HIL_IDD_HEADER_16BIT 0x20 /* 16 (vs. 8) bit resolution */
#define HIL_IDD_HEADER_ABS 0x40 /* Reports Absolute Position */
#define HIL_IDD_HEADER_2X_AXIS 0x80 /* Two sets of 1-3 axis */
/* I/O Descriptor
*/
#define HIL_IDD_IOD_NBUTTON_MASK 0x07 /* Number of buttons */
#define HIL_IDD_IOD_PROXIMITY 0x08 /* Proximity in/out events */
#define HIL_IDD_IOD_PROMPT_MASK 0x70 /* Number of prompts/acks */
#define HIL_IDD_IOD_PROMPT_SHIFT 4
#define HIL_IDD_IOD_PROMPT 0x80 /* Generic prompt/ack */
#define HIL_IDD_NUM_AXES_PER_SET(header_packet) \
((header_packet) & HIL_IDD_HEADER_AXSET_MASK)
#define HIL_IDD_NUM_AXSETS(header_packet) \
(2 - !((header_packet) & HIL_IDD_HEADER_2X_AXIS))
#define HIL_IDD_LEN(header_packet) \
((4 - !(header_packet & HIL_IDD_HEADER_IOD) - \
2 * !(HIL_IDD_NUM_AXES_PER_SET(header_packet))) + \
2 * HIL_IDD_NUM_AXES_PER_SET(header_packet) * \
!!((header_packet) & HIL_IDD_HEADER_ABS))
/* The following HIL_IDD_* macros assume you have an array of
* packets and/or unpacked 8-bit data in the order that they
* were received.
*/
#define HIL_IDD_AXIS_COUNTS_PER_M(header_ptr) \
(!(HIL_IDD_NUM_AXSETS(*(header_ptr))) ? -1 : \
(((*(header_ptr + 1) & HIL_PKT_DATA_MASK) + \
((*(header_ptr + 2) & HIL_PKT_DATA_MASK)) << 8) \
* ((*(header_ptr) & HIL_IDD_HEADER_16BIT) ? 100 : 1)))
#define HIL_IDD_AXIS_MAX(header_ptr, __axnum) \
((!(*(header_ptr) & HIL_IDD_HEADER_ABS) || \
(HIL_IDD_NUM_AXES_PER_SET(*(header_ptr)) <= __axnum)) ? 0 : \
((HIL_PKT_DATA_MASK & *((header_ptr) + 3 + 2 * __axnum)) + \
((HIL_PKT_DATA_MASK & *((header_ptr) + 4 + 2 * __axnum)) << 8)))
#define HIL_IDD_IOD(header_ptr) \
(*(header_ptr + HIL_IDD_LEN((*header_ptr)) - 1))
#define HIL_IDD_HAS_GEN_PROMPT(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) && \
(HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROMPT))
#define HIL_IDD_HAS_GEN_PROXIMITY(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) && \
(HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_PROXIMITY))
#define HIL_IDD_NUM_BUTTONS(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) ? \
(HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NBUTTON_MASK) : 0)
#define HIL_IDD_NUM_PROMPTS(header_ptr) \
((*header_ptr & HIL_IDD_HEADER_IOD) ? \
((HIL_IDD_IOD(header_ptr) & HIL_IDD_IOD_NPROMPT_MASK) \
>> HIL_IDD_IOD_PROMPT_SHIFT) : 0)
/* The response to HIL EXD commands -- the "extended describe record" */
#define HIL_EXD_HEADER_WRG 0x03 /* Supports type2 WRG */
#define HIL_EXD_HEADER_WRG_TYPE1 0x01 /* Supports type1 WRG */
#define HIL_EXD_HEADER_WRG_TYPE2 0x02 /* Supports type2 WRG */
#define HIL_EXD_HEADER_RRG 0x04 /* Supports RRG command */
#define HIL_EXD_HEADER_RNM 0x10 /* Supports RNM command */
#define HIL_EXD_HEADER_RST 0x20 /* Supports RST command */
#define HIL_EXD_HEADER_LOCALE 0x40 /* Contains locale code */
#define HIL_EXD_NUM_RRG(header_ptr) \
((*header_ptr & HIL_EXD_HEADER_RRG) ? \
(*(header_ptr + 1) & HIL_PKT_DATA_MASK) : 0)
#define HIL_EXD_NUM_WWG(header_ptr) \
((*header_ptr & HIL_EXD_HEADER_WRG) ? \
(*(header_ptr + 2 - !(*header_ptr & HIL_EXD_HEADER_RRG)) & \
HIL_PKT_DATA_MASK) : 0)
#define HIL_EXD_LEN(header_ptr) \
(!!(*header_ptr & HIL_EXD_HEADER_RRG) + \
!!(*header_ptr & HIL_EXD_HEADER_WRG) + \
!!(*header_ptr & HIL_EXD_HEADER_LOCALE) + \
2 * !!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) + 1)
#define HIL_EXD_LOCALE(header_ptr) \
(!(*header_ptr & HIL_EXD_HEADER_LOCALE) ? -1 : \
(*(header_ptr + HIL_EXD_LEN(header_ptr) - 1) & HIL_PKT_DATA_MASK))
#define HIL_EXD_WRG_TYPE2_LEN(header_ptr) \
(!(*header_ptr & HIL_EXD_HEADER_WRG_TYPE2) ? -1 : \
(*(header_ptr + HIL_EXD_LEN(header_ptr) - 2 - \
!!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) + \
((*(header_ptr + HIL_EXD_LEN(header_ptr) - 1 - \
!!(*header_ptr & HIL_EXD_HEADER_LOCALE)) & HIL_PKT_DATA_MASK) << 8))
/* Device locale codes. */
/* Last defined locale code. Everything above this is "Reserved",
and note that this same table applies to the Device ID Byte where
keyboards may have a nationality code which is only 5 bits. */
#define HIL_LOCALE_MAX 0x1f
/* Map to hopefully useful strings. I was trying to make these look
like locale.aliases strings do; maybe that isn't the right table to
emulate. In either case, I didn't have much to work on. */
#define HIL_LOCALE_MAP \
"", /* 0x00 Reserved */ \
"", /* 0x01 Reserved */ \
"", /* 0x02 Reserved */ \
"swiss.french", /* 0x03 Swiss/French */ \
"portuguese", /* 0x04 Portuguese */ \
"arabic", /* 0x05 Arabic */ \
"hebrew", /* 0x06 Hebrew */ \
"english.canadian", /* 0x07 Canadian English */ \
"turkish", /* 0x08 Turkish */ \
"greek", /* 0x09 Greek */ \
"thai", /* 0x0a Thai (Thailand) */ \
"italian", /* 0x0b Italian */ \
"korean", /* 0x0c Hangul (Korea) */ \
"dutch", /* 0x0d Dutch */ \
"swedish", /* 0x0e Swedish */ \
"german", /* 0x0f German */ \
"chinese", /* 0x10 Chinese-PRC */ \
"chinese", /* 0x11 Chinese-ROC */ \
"swiss.french", /* 0x12 Swiss/French II */ \
"spanish", /* 0x13 Spanish */ \
"swiss.german", /* 0x14 Swiss/German II */ \
"flemish", /* 0x15 Belgian (Flemish) */ \
"finnish", /* 0x16 Finnish */ \
"english.uk", /* 0x17 United Kingdom */ \
"french.canadian", /* 0x18 French/Canadian */ \
"swiss.german", /* 0x19 Swiss/German */ \
"norwegian", /* 0x1a Norwegian */ \
"french", /* 0x1b French */ \
"danish", /* 0x1c Danish */ \
"japanese", /* 0x1d Katakana */ \
"spanish", /* 0x1e Latin American/Spanish*/\
"english.us" /* 0x1f United States */ \
/* HIL keycodes */
#define HIL_KEYCODES_SET1_TBLSIZE 128
#define HIL_KEYCODES_SET1 \
KEY_5, KEY_RESERVED, KEY_RIGHTALT, KEY_LEFTALT, \
KEY_RIGHTSHIFT, KEY_LEFTSHIFT, KEY_LEFTCTRL, KEY_SYSRQ, \
KEY_KP4, KEY_KP8, KEY_KP5, KEY_KP9, \
KEY_KP6, KEY_KP7, KEY_KPCOMMA, KEY_KPENTER, \
KEY_KP1, KEY_KPSLASH, KEY_KP2, KEY_KPPLUS, \
KEY_KP3, KEY_KPASTERISK, KEY_KP0, KEY_KPMINUS, \
KEY_B, KEY_V, KEY_C, KEY_X, \
KEY_Z, KEY_RESERVED, KEY_RESERVED, KEY_ESC, \
KEY_6, KEY_F10, KEY_3, KEY_F11, \
KEY_KPDOT, KEY_F9, KEY_TAB /*KP*/, KEY_F12, \
KEY_H, KEY_G, KEY_F, KEY_D, \
KEY_S, KEY_A, KEY_RESERVED, KEY_CAPSLOCK, \
KEY_U, KEY_Y, KEY_T, KEY_R, \
KEY_E, KEY_W, KEY_Q, KEY_TAB, \
KEY_7, KEY_6, KEY_5, KEY_4, \
KEY_3, KEY_2, KEY_1, KEY_GRAVE, \
KEY_F13, KEY_F14, KEY_F15, KEY_F16, \
KEY_F17, KEY_F18, KEY_F19, KEY_F20, \
KEY_MENU, KEY_F4, KEY_F3, KEY_F2, \
KEY_F1, KEY_VOLUMEUP, KEY_STOP, KEY_SENDFILE, \
KEY_SYSRQ, KEY_F5, KEY_F6, KEY_F7, \
KEY_F8, KEY_VOLUMEDOWN, KEY_DEL_EOL, KEY_DEL_EOS, \
KEY_8, KEY_9, KEY_0, KEY_MINUS, \
KEY_EQUAL, KEY_BACKSPACE, KEY_INS_LINE, KEY_DEL_LINE, \
KEY_I, KEY_O, KEY_P, KEY_LEFTBRACE, \
KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_INSERT, KEY_DELETE, \
KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, \
KEY_APOSTROPHE, KEY_ENTER, KEY_HOME, KEY_PAGEUP, \
KEY_M, KEY_COMMA, KEY_DOT, KEY_SLASH, \
KEY_BACKSLASH, KEY_SELECT, KEY_102ND, KEY_PAGEDOWN, \
KEY_N, KEY_SPACE, KEY_NEXT, KEY_RESERVED, \
KEY_LEFT, KEY_DOWN, KEY_UP, KEY_RIGHT
#define HIL_KEYCODES_SET3_TBLSIZE 128
#define HIL_KEYCODES_SET3 \
KEY_RESERVED, KEY_ESC, KEY_1, KEY_2, \
KEY_3, KEY_4, KEY_5, KEY_6, \
KEY_7, KEY_8, KEY_9, KEY_0, \
KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_TAB, \
KEY_Q, KEY_W, KEY_E, KEY_R, \
KEY_T, KEY_Y, KEY_U, KEY_I, \
KEY_O, KEY_P, KEY_LEFTBRACE, KEY_RIGHTBRACE, \
KEY_ENTER, KEY_LEFTCTRL, KEY_A, KEY_S, \
KEY_D, KEY_F, KEY_G, KEY_H, \
KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, \
KEY_APOSTROPHE,KEY_GRAVE, KEY_LEFTSHIFT, KEY_BACKSLASH, \
KEY_Z, KEY_X, KEY_C, KEY_V, \
KEY_B, KEY_N, KEY_M, KEY_COMMA, \
KEY_DOT, KEY_SLASH, KEY_RIGHTSHIFT, KEY_KPASTERISK, \
KEY_LEFTALT, KEY_SPACE, KEY_CAPSLOCK, KEY_F1, \
KEY_F2, KEY_F3, KEY_F4, KEY_F5, \
KEY_F6, KEY_F7, KEY_F8, KEY_F9, \
KEY_F10, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_KP7, \
KEY_KP8, KEY_KP9, KEY_KPMINUS, KEY_KP4, \
KEY_KP5, KEY_KP6, KEY_KPPLUS, KEY_KP1, \
KEY_KP2, KEY_KP3, KEY_KP0, KEY_KPDOT, \
KEY_SYSRQ, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
KEY_UP, KEY_LEFT, KEY_DOWN, KEY_RIGHT, \
KEY_HOME, KEY_PAGEUP, KEY_END, KEY_PAGEDOWN, \
KEY_INSERT, KEY_DELETE, KEY_102ND, KEY_RESERVED, \
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
KEY_F1, KEY_F2, KEY_F3, KEY_F4, \
KEY_F5, KEY_F6, KEY_F7, KEY_F8, \
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, \
KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED
/* Response to POL command, the "poll record header" */
#define HIL_POL_NUM_AXES_MASK 0x03 /* Number of axis reported */
#define HIL_POL_CTS 0x04 /* Device ready to receive data */
#define HIL_POL_STATUS_PENDING 0x08 /* Device has status to report */
#define HIL_POL_CHARTYPE_MASK 0x70 /* Type of character data to follow */
#define HIL_POL_CHARTYPE_NONE 0x00 /* No character data to follow */
#define HIL_POL_CHARTYPE_RSVD1 0x10 /* Reserved Set 1 */
#define HIL_POL_CHARTYPE_ASCII 0x20 /* U.S. ASCII */
#define HIL_POL_CHARTYPE_BINARY 0x30 /* Binary data */
#define HIL_POL_CHARTYPE_SET1 0x40 /* Keycode Set 1 */
#define HIL_POL_CHARTYPE_RSVD2 0x50 /* Reserved Set 2 */
#define HIL_POL_CHARTYPE_SET2 0x60 /* Keycode Set 2 */
#define HIL_POL_CHARTYPE_SET3 0x70 /* Keycode Set 3 */
#define HIL_POL_AXIS_ALT 0x80 /* Data is from axis set 2 */
#endif /* _HIL_H_ */

168
include/linux/hil_mlc.h Normal file
View File

@ -0,0 +1,168 @@
/*
* HP Human Interface Loop Master Link Controller driver.
*
* Copyright (c) 2001 Brian S. Julin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL").
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
*
* References:
* HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
*
*/
#include <linux/hil.h>
#include <linux/time.h>
#include <linux/interrupt.h>
#include <asm/semaphore.h>
#include <linux/serio.h>
#include <linux/list.h>
typedef struct hil_mlc hil_mlc;
/* The HIL has a complicated state engine.
* We define the structure of nodes in the state engine here.
*/
enum hilse_act {
/* HILSE_OUT prepares to receive input if the next node
* is an IN or EXPECT, and then sends the given packet.
*/
HILSE_OUT = 0,
/* HILSE_CTS checks if the loop is busy. */
HILSE_CTS,
/* HILSE_OUT_LAST sends the given command packet to
* the last configured/running device on the loop.
*/
HILSE_OUT_LAST,
/* HILSE_OUT_DISC sends the given command packet to
* the next device past the last configured/running one.
*/
HILSE_OUT_DISC,
/* HILSE_FUNC runs a callback function with given arguments.
* a positive return value causes the "ugly" branch to be taken.
*/
HILSE_FUNC,
/* HILSE_IN simply expects any non-errored packet to arrive
* within arg usecs.
*/
HILSE_IN = 0x100,
/* HILSE_EXPECT expects a particular packet to arrive
* within arg usecs, any other packet is considered an error.
*/
HILSE_EXPECT,
/* HILSE_EXPECT_LAST as above but dev field should be last
* discovered/operational device.
*/
HILSE_EXPECT_LAST,
/* HILSE_EXPECT_LAST as above but dev field should be first
* undiscovered/inoperational device.
*/
HILSE_EXPECT_DISC
};
typedef int (hilse_func) (hil_mlc *mlc, int arg);
struct hilse_node {
enum hilse_act act; /* How to process this node */
union {
hilse_func *func; /* Function to call if HILSE_FUNC */
hil_packet packet; /* Packet to send or to compare */
} object;
int arg; /* Timeout in usec or parm for func */
int good; /* Node to jump to on success */
int bad; /* Node to jump to on error */
int ugly; /* Node to jump to on timeout */
};
/* Methods for back-end drivers, e.g. hp_sdc_mlc */
typedef int (hil_mlc_cts) (hil_mlc *mlc);
typedef void (hil_mlc_out) (hil_mlc *mlc);
typedef int (hil_mlc_in) (hil_mlc *mlc, suseconds_t timeout);
struct hil_mlc_devinfo {
uint8_t idd[16]; /* Device ID Byte and Describe Record */
uint8_t rsc[16]; /* Security Code Header and Record */
uint8_t exd[16]; /* Extended Describe Record */
uint8_t rnm[16]; /* Device name as returned by RNM command */
};
struct hil_mlc_serio_map {
hil_mlc *mlc;
int di_revmap;
int didx;
};
/* How many (possibly old/detached) devices the we try to keep track of */
#define HIL_MLC_DEVMEM 16
struct hil_mlc {
struct list_head list; /* hil_mlc is organized as linked list */
rwlock_t lock;
void *priv; /* Data specific to a particular type of MLC */
int seidx; /* Current node in state engine */
int istarted, ostarted;
hil_mlc_cts *cts;
struct semaphore csem; /* Raised when loop idle */
hil_mlc_out *out;
struct semaphore osem; /* Raised when outpacket dispatched */
hil_packet opacket;
hil_mlc_in *in;
struct semaphore isem; /* Raised when a packet arrives */
hil_packet ipacket[16];
hil_packet imatch;
int icount;
struct timeval instart;
suseconds_t intimeout;
int ddi; /* Last operational device id */
int lcv; /* LCV to throttle loops */
struct timeval lcv_tv; /* Time loop was started */
int di_map[7]; /* Maps below items to live devs */
struct hil_mlc_devinfo di[HIL_MLC_DEVMEM];
struct serio *serio[HIL_MLC_DEVMEM];
struct hil_mlc_serio_map serio_map[HIL_MLC_DEVMEM];
hil_packet serio_opacket[HIL_MLC_DEVMEM];
int serio_oidx[HIL_MLC_DEVMEM];
struct hil_mlc_devinfo di_scratch; /* Temporary area */
int opercnt;
struct tasklet_struct *tasklet;
};
int hil_mlc_register(hil_mlc *mlc);
int hil_mlc_unregister(hil_mlc *mlc);

300
include/linux/hp_sdc.h Normal file
View File

@ -0,0 +1,300 @@
/*
* HP i8042 System Device Controller -- header
*
* Copyright (c) 2001 Brian S. Julin
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL").
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
*
* References:
*
* HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A
*
* System Device Controller Microprocessor Firmware Theory of Operation
* for Part Number 1820-4784 Revision B. Dwg No. A-1820-4784-2
*
*/
#ifndef _LINUX_HP_SDC_H
#define _LINUX_HP_SDC_H
#include <linux/interrupt.h>
#include <linux/types.h>
#include <linux/time.h>
#include <linux/timer.h>
#if defined(__hppa__)
#include <asm/hardware.h>
#endif
/* No 4X status reads take longer than this (in usec).
*/
#define HP_SDC_MAX_REG_DELAY 20000
typedef void (hp_sdc_irqhook) (int irq, void *dev_id,
uint8_t status, uint8_t data);
int hp_sdc_request_timer_irq(hp_sdc_irqhook *callback);
int hp_sdc_request_hil_irq(hp_sdc_irqhook *callback);
int hp_sdc_request_cooked_irq(hp_sdc_irqhook *callback);
int hp_sdc_release_timer_irq(hp_sdc_irqhook *callback);
int hp_sdc_release_hil_irq(hp_sdc_irqhook *callback);
int hp_sdc_release_cooked_irq(hp_sdc_irqhook *callback);
typedef struct {
int actidx; /* Start of act. Acts are atomic WRT I/O to SDC */
int idx; /* Index within the act */
int endidx; /* transaction is over and done if idx == endidx */
uint8_t *seq; /* commands/data for the transaction */
union {
hp_sdc_irqhook *irqhook; /* Callback, isr or tasklet context */
struct semaphore *semaphore; /* Semaphore to sleep on. */
} act;
} hp_sdc_transaction;
int hp_sdc_enqueue_transaction(hp_sdc_transaction *this);
int hp_sdc_dequeue_transaction(hp_sdc_transaction *this);
/* The HP_SDC_ACT* values are peculiar to this driver.
* Nuance: never HP_SDC_ACT_DATAIN | HP_SDC_ACT_DEALLOC, use another
* act to perform the dealloc.
*/
#define HP_SDC_ACT_PRECMD 0x01 /* Send a command first */
#define HP_SDC_ACT_DATAREG 0x02 /* Set data registers */
#define HP_SDC_ACT_DATAOUT 0x04 /* Send data bytes */
#define HP_SDC_ACT_POSTCMD 0x08 /* Send command after */
#define HP_SDC_ACT_DATAIN 0x10 /* Collect data after */
#define HP_SDC_ACT_DURING 0x1f
#define HP_SDC_ACT_SEMAPHORE 0x20 /* Raise semaphore after */
#define HP_SDC_ACT_CALLBACK 0x40 /* Pass data to IRQ handler */
#define HP_SDC_ACT_DEALLOC 0x80 /* Destroy transaction after */
#define HP_SDC_ACT_AFTER 0xe0
#define HP_SDC_ACT_DEAD 0x60 /* Act timed out. */
/* Rest of the flags are straightforward representation of the SDC interface */
#define HP_SDC_STATUS_IBF 0x02 /* Input buffer full */
#define HP_SDC_STATUS_IRQMASK 0xf0 /* Bits containing "level 1" irq */
#define HP_SDC_STATUS_PERIODIC 0x10 /* Periodic 10ms timer */
#define HP_SDC_STATUS_USERTIMER 0x20 /* "Special purpose" timer */
#define HP_SDC_STATUS_TIMER 0x30 /* Both PERIODIC and USERTIMER */
#define HP_SDC_STATUS_REG 0x40 /* Data from an i8042 register */
#define HP_SDC_STATUS_HILCMD 0x50 /* Command from HIL MLC */
#define HP_SDC_STATUS_HILDATA 0x60 /* Data from HIL MLC */
#define HP_SDC_STATUS_PUP 0x70 /* Sucessful power-up self test */
#define HP_SDC_STATUS_KCOOKED 0x80 /* Key from cooked kbd */
#define HP_SDC_STATUS_KRPG 0xc0 /* Key from Repeat Gen */
#define HP_SDC_STATUS_KMOD_SUP 0x10 /* Shift key is up */
#define HP_SDC_STATUS_KMOD_CUP 0x20 /* Control key is up */
#define HP_SDC_NMISTATUS_FHS 0x40 /* NMI is a fast handshake irq */
/* Internal i8042 registers (there are more, but they are not too useful). */
#define HP_SDC_USE 0x02 /* Resource usage (including OB bit) */
#define HP_SDC_IM 0x04 /* Interrupt mask */
#define HP_SDC_CFG 0x11 /* Configuration register */
#define HP_SDC_KBLANGUAGE 0x12 /* Keyboard language */
#define HP_SDC_D0 0x70 /* General purpose data buffer 0 */
#define HP_SDC_D1 0x71 /* General purpose data buffer 1 */
#define HP_SDC_D2 0x72 /* General purpose data buffer 2 */
#define HP_SDC_D3 0x73 /* General purpose data buffer 3 */
#define HP_SDC_VT1 0x74 /* Timer for voice 1 */
#define HP_SDC_VT2 0x75 /* Timer for voice 2 */
#define HP_SDC_VT3 0x76 /* Timer for voice 3 */
#define HP_SDC_VT4 0x77 /* Timer for voice 4 */
#define HP_SDC_KBN 0x78 /* Which HIL devs are Nimitz */
#define HP_SDC_KBC 0x79 /* Which HIL devs are cooked kbds */
#define HP_SDC_LPS 0x7a /* i8042's view of HIL status */
#define HP_SDC_LPC 0x7b /* i8042's view of HIL "control" */
#define HP_SDC_RSV 0x7c /* Reserved "for testing" */
#define HP_SDC_LPR 0x7d /* i8042 count of HIL reconfigs */
#define HP_SDC_XTD 0x7e /* "Extended Configuration" register */
#define HP_SDC_STR 0x7f /* i8042 self-test result */
/* Bitfields for above registers */
#define HP_SDC_USE_LOOP 0x04 /* Command is currently on the loop. */
#define HP_SDC_IM_MASK 0x1f /* these bits not part of cmd/status */
#define HP_SDC_IM_FH 0x10 /* Mask the fast handshake irq */
#define HP_SDC_IM_PT 0x08 /* Mask the periodic timer irq */
#define HP_SDC_IM_TIMERS 0x04 /* Mask the MT/DT/CT irq */
#define HP_SDC_IM_RESET 0x02 /* Mask the reset key irq */
#define HP_SDC_IM_HIL 0x01 /* Mask the HIL MLC irq */
#define HP_SDC_CFG_ROLLOVER 0x08 /* WTF is "N-key rollover"? */
#define HP_SDC_CFG_KBD 0x10 /* There is a keyboard */
#define HP_SDC_CFG_NEW 0x20 /* Supports/uses HIL MLC */
#define HP_SDC_CFG_KBD_OLD 0x03 /* keyboard code for non-HIL */
#define HP_SDC_CFG_KBD_NEW 0x07 /* keyboard code from HIL autoconfig */
#define HP_SDC_CFG_REV 0x40 /* Code revision bit */
#define HP_SDC_CFG_IDPROM 0x80 /* IDPROM present in kbd (not HIL) */
#define HP_SDC_LPS_NDEV 0x07 /* # devices autoconfigured on HIL */
#define HP_SDC_LPS_ACSUCC 0x08 /* loop autoconfigured successfully */
#define HP_SDC_LPS_ACFAIL 0x80 /* last loop autoconfigure failed */
#define HP_SDC_LPC_APE_IPF 0x01 /* HIL MLC APE/IPF (autopoll) set */
#define HP_SDC_LPC_ARCONERR 0x02 /* i8042 autoreconfigs loop on err */
#define HP_SDC_LPC_ARCQUIET 0x03 /* i8042 doesn't report autoreconfigs*/
#define HP_SDC_LPC_COOK 0x10 /* i8042 cooks devices in _KBN */
#define HP_SDC_LPC_RC 0x80 /* causes autoreconfig */
#define HP_SDC_XTD_REV 0x07 /* contains revision code */
#define HP_SDC_XTD_REV_STRINGS(val, str) \
switch (val) { \
case 0x1: str = "1820-3712"; break; \
case 0x2: str = "1820-4379"; break; \
case 0x3: str = "1820-4784"; break; \
default: str = "unknown"; \
};
#define HP_SDC_XTD_BEEPER 0x08 /* TI SN76494 beeper available */
#define HP_SDC_XTD_BBRTC 0x20 /* OKI MSM-58321 BBRTC present */
#define HP_SDC_CMD_LOAD_RT 0x31 /* Load real time (from 8042) */
#define HP_SDC_CMD_LOAD_FHS 0x36 /* Load the fast handshake timer */
#define HP_SDC_CMD_LOAD_MT 0x38 /* Load the match timer */
#define HP_SDC_CMD_LOAD_DT 0x3B /* Load the delay timer */
#define HP_SDC_CMD_LOAD_CT 0x3E /* Load the cycle timer */
#define HP_SDC_CMD_SET_IM 0x40 /* 010xxxxx == set irq mask */
/* The documents provided do not explicitly state that all registers betweem
* 0x01 and 0x1f inclusive can be read by sending their register index as a
* command, but this is implied and appears to be the case.
*/
#define HP_SDC_CMD_READ_RAM 0x00 /* Load from i8042 RAM (autoinc) */
#define HP_SDC_CMD_READ_USE 0x02 /* Undocumented! Load from usage reg */
#define HP_SDC_CMD_READ_IM 0x04 /* Load current interrupt mask */
#define HP_SDC_CMD_READ_KCC 0x11 /* Load primary kbd config code */
#define HP_SDC_CMD_READ_KLC 0x12 /* Load primary kbd language code */
#define HP_SDC_CMD_READ_T1 0x13 /* Load timer output buffer byte 1 */
#define HP_SDC_CMD_READ_T2 0x14 /* Load timer output buffer byte 1 */
#define HP_SDC_CMD_READ_T3 0x15 /* Load timer output buffer byte 1 */
#define HP_SDC_CMD_READ_T4 0x16 /* Load timer output buffer byte 1 */
#define HP_SDC_CMD_READ_T5 0x17 /* Load timer output buffer byte 1 */
#define HP_SDC_CMD_READ_D0 0xf0 /* Load from i8042 RAM location 0x70 */
#define HP_SDC_CMD_READ_D1 0xf1 /* Load from i8042 RAM location 0x71 */
#define HP_SDC_CMD_READ_D2 0xf2 /* Load from i8042 RAM location 0x72 */
#define HP_SDC_CMD_READ_D3 0xf3 /* Load from i8042 RAM location 0x73 */
#define HP_SDC_CMD_READ_VT1 0xf4 /* Load from i8042 RAM location 0x74 */
#define HP_SDC_CMD_READ_VT2 0xf5 /* Load from i8042 RAM location 0x75 */
#define HP_SDC_CMD_READ_VT3 0xf6 /* Load from i8042 RAM location 0x76 */
#define HP_SDC_CMD_READ_VT4 0xf7 /* Load from i8042 RAM location 0x77 */
#define HP_SDC_CMD_READ_KBN 0xf8 /* Load from i8042 RAM location 0x78 */
#define HP_SDC_CMD_READ_KBC 0xf9 /* Load from i8042 RAM location 0x79 */
#define HP_SDC_CMD_READ_LPS 0xfa /* Load from i8042 RAM location 0x7a */
#define HP_SDC_CMD_READ_LPC 0xfb /* Load from i8042 RAM location 0x7b */
#define HP_SDC_CMD_READ_RSV 0xfc /* Load from i8042 RAM location 0x7c */
#define HP_SDC_CMD_READ_LPR 0xfd /* Load from i8042 RAM location 0x7d */
#define HP_SDC_CMD_READ_XTD 0xfe /* Load from i8042 RAM location 0x7e */
#define HP_SDC_CMD_READ_STR 0xff /* Load from i8042 RAM location 0x7f */
#define HP_SDC_CMD_SET_ARD 0xA0 /* Set emulated autorepeat delay */
#define HP_SDC_CMD_SET_ARR 0xA2 /* Set emulated autorepeat rate */
#define HP_SDC_CMD_SET_BELL 0xA3 /* Set voice 3 params for "beep" cmd */
#define HP_SDC_CMD_SET_RPGR 0xA6 /* Set "RPG" irq rate (doesn't work) */
#define HP_SDC_CMD_SET_RTMS 0xAD /* Set the RTC time (milliseconds) */
#define HP_SDC_CMD_SET_RTD 0xAF /* Set the RTC time (days) */
#define HP_SDC_CMD_SET_FHS 0xB2 /* Set fast handshake timer */
#define HP_SDC_CMD_SET_MT 0xB4 /* Set match timer */
#define HP_SDC_CMD_SET_DT 0xB7 /* Set delay timer */
#define HP_SDC_CMD_SET_CT 0xBA /* Set cycle timer */
#define HP_SDC_CMD_SET_RAMP 0xC1 /* Reset READ_RAM autoinc counter */
#define HP_SDC_CMD_SET_D0 0xe0 /* Load to i8042 RAM location 0x70 */
#define HP_SDC_CMD_SET_D1 0xe1 /* Load to i8042 RAM location 0x71 */
#define HP_SDC_CMD_SET_D2 0xe2 /* Load to i8042 RAM location 0x72 */
#define HP_SDC_CMD_SET_D3 0xe3 /* Load to i8042 RAM location 0x73 */
#define HP_SDC_CMD_SET_VT1 0xe4 /* Load to i8042 RAM location 0x74 */
#define HP_SDC_CMD_SET_VT2 0xe5 /* Load to i8042 RAM location 0x75 */
#define HP_SDC_CMD_SET_VT3 0xe6 /* Load to i8042 RAM location 0x76 */
#define HP_SDC_CMD_SET_VT4 0xe7 /* Load to i8042 RAM location 0x77 */
#define HP_SDC_CMD_SET_KBN 0xe8 /* Load to i8042 RAM location 0x78 */
#define HP_SDC_CMD_SET_KBC 0xe9 /* Load to i8042 RAM location 0x79 */
#define HP_SDC_CMD_SET_LPS 0xea /* Load to i8042 RAM location 0x7a */
#define HP_SDC_CMD_SET_LPC 0xeb /* Load to i8042 RAM location 0x7b */
#define HP_SDC_CMD_SET_RSV 0xec /* Load to i8042 RAM location 0x7c */
#define HP_SDC_CMD_SET_LPR 0xed /* Load to i8042 RAM location 0x7d */
#define HP_SDC_CMD_SET_XTD 0xee /* Load to i8042 RAM location 0x7e */
#define HP_SDC_CMD_SET_STR 0xef /* Load to i8042 RAM location 0x7f */
#define HP_SDC_CMD_DO_RTCW 0xc2 /* i8042 RAM 0x70 --> RTC */
#define HP_SDC_CMD_DO_RTCR 0xc3 /* RTC[0x70 0:3] --> irq/status/data */
#define HP_SDC_CMD_DO_BEEP 0xc4 /* i8042 RAM 0x70-74 --> beeper,VT3 */
#define HP_SDC_CMD_DO_HIL 0xc5 /* i8042 RAM 0x70-73 -->
HIL MLC R0,R1 i8042 HIL watchdog */
/* Values used to (de)mangle input/output to/from the HIL MLC */
#define HP_SDC_DATA 0x40 /* Data from an 8042 register */
#define HP_SDC_HIL_CMD 0x50 /* Data from HIL MLC R1/8042 */
#define HP_SDC_HIL_R1MASK 0x0f /* Contents of HIL MLC R1 0:3 */
#define HP_SDC_HIL_AUTO 0x10 /* Set if POL results from i8042 */
#define HP_SDC_HIL_ISERR 0x80 /* Has meaning as in next 4 values */
#define HP_SDC_HIL_RC_DONE 0x80 /* i8042 auto-configured loop */
#define HP_SDC_HIL_ERR 0x81 /* HIL MLC R2 had a bit set */
#define HP_SDC_HIL_TO 0x82 /* i8042 HIL watchdog expired */
#define HP_SDC_HIL_RC 0x84 /* i8042 is auto-configuring loop */
#define HP_SDC_HIL_DAT 0x60 /* Data from HIL MLC R0 */
typedef struct {
rwlock_t ibf_lock;
rwlock_t lock; /* user/tasklet lock */
rwlock_t rtq_lock; /* isr/tasklet lock */
rwlock_t hook_lock; /* isr/user lock for handler add/del */
unsigned int irq, nmi; /* Our IRQ lines */
unsigned long base_io, status_io, data_io; /* Our IO ports */
uint8_t im; /* Interrupt mask */
int set_im; /* Interrupt mask needs to be set. */
int ibf; /* Last known status of IBF flag */
uint8_t wi; /* current i8042 write index */
uint8_t r7[4]; /* current i8042[0x70 - 0x74] values */
uint8_t r11, r7e; /* Values from version/revision regs */
hp_sdc_irqhook *timer, *reg, *hil, *pup, *cooked;
#define HP_SDC_QUEUE_LEN 16
hp_sdc_transaction *tq[HP_SDC_QUEUE_LEN]; /* All pending read/writes */
int rcurr, rqty; /* Current read transact in process */
struct timeval rtv; /* Time when current read started */
int wcurr; /* Current write transact in process */
int dev_err; /* carries status from registration */
#if defined(__hppa__)
struct parisc_device *dev;
#elif defined(__mc68000__)
void *dev;
#else
#error No support for device registration on this arch yet.
#endif
struct timer_list kicker; /* Keeps below task alive */
struct tasklet_struct task;
} hp_i8042_sdc;
#endif /* _LINUX_HP_SDC_H */

View File

@ -644,6 +644,7 @@ struct input_absinfo {
#define BUS_ADB 0x17 #define BUS_ADB 0x17
#define BUS_I2C 0x18 #define BUS_I2C 0x18
#define BUS_HOST 0x19 #define BUS_HOST 0x19
#define BUS_GSC 0x1A
/* /*
* Values describing the status of an effect * Values describing the status of an effect

View File

@ -197,7 +197,7 @@ snd_harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
spin_unlock(&h->lock); spin_unlock(&h->lock);
if (dstatus & HARMONY_DSTATUS_PN) { if (dstatus & HARMONY_DSTATUS_PN) {
if (h->psubs) { if (h->psubs && h->st.playing) {
spin_lock(&h->lock); spin_lock(&h->lock);
h->pbuf.buf += h->pbuf.count; /* PAGE_SIZE */ h->pbuf.buf += h->pbuf.count; /* PAGE_SIZE */
h->pbuf.buf %= h->pbuf.size; /* MAX_BUFS*PAGE_SIZE */ h->pbuf.buf %= h->pbuf.size; /* MAX_BUFS*PAGE_SIZE */
@ -216,7 +216,7 @@ snd_harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
} }
if (dstatus & HARMONY_DSTATUS_RN) { if (dstatus & HARMONY_DSTATUS_RN) {
if (h->csubs) { if (h->csubs && h->st.capturing) {
spin_lock(&h->lock); spin_lock(&h->lock);
h->cbuf.buf += h->cbuf.count; h->cbuf.buf += h->cbuf.count;
h->cbuf.buf %= h->cbuf.size; h->cbuf.buf %= h->cbuf.size;
@ -316,6 +316,7 @@ snd_harmony_playback_trigger(snd_pcm_substream_t *ss, int cmd)
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
h->st.playing = 0; h->st.playing = 0;
harmony_mute(h); harmony_mute(h);
harmony_write(h, HARMONY_PNXTADD, h->sdma.addr);
harmony_disable_interrupts(h); harmony_disable_interrupts(h);
break; break;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
@ -351,8 +352,9 @@ snd_harmony_capture_trigger(snd_pcm_substream_t *ss, int cmd)
break; break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
h->st.capturing = 0; h->st.capturing = 0;
harmony_mute(h); harmony_mute(h);
harmony_disable_interrupts(h); harmony_write(h, HARMONY_RNXTADD, h->gdma.addr);
harmony_disable_interrupts(h);
break; break;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
@ -408,7 +410,8 @@ snd_harmony_playback_prepare(snd_pcm_substream_t *ss)
h->pbuf.size = snd_pcm_lib_buffer_bytes(ss); h->pbuf.size = snd_pcm_lib_buffer_bytes(ss);
h->pbuf.count = snd_pcm_lib_period_bytes(ss); h->pbuf.count = snd_pcm_lib_period_bytes(ss);
h->pbuf.buf = 0; if (h->pbuf.buf >= h->pbuf.size)
h->pbuf.buf = 0;
h->st.playing = 0; h->st.playing = 0;
h->st.rate = snd_harmony_rate_bits(rt->rate); h->st.rate = snd_harmony_rate_bits(rt->rate);
@ -437,7 +440,8 @@ snd_harmony_capture_prepare(snd_pcm_substream_t *ss)
h->cbuf.size = snd_pcm_lib_buffer_bytes(ss); h->cbuf.size = snd_pcm_lib_buffer_bytes(ss);
h->cbuf.count = snd_pcm_lib_period_bytes(ss); h->cbuf.count = snd_pcm_lib_period_bytes(ss);
h->cbuf.buf = 0; if (h->cbuf.buf >= h->cbuf.size)
h->cbuf.buf = 0;
h->st.capturing = 0; h->st.capturing = 0;
h->st.rate = snd_harmony_rate_bits(rt->rate); h->st.rate = snd_harmony_rate_bits(rt->rate);
@ -712,13 +716,14 @@ snd_harmony_volume_get(snd_kcontrol_t *kc,
left = (h->st.gain >> shift_left) & mask; left = (h->st.gain >> shift_left) & mask;
right = (h->st.gain >> shift_right) & mask; right = (h->st.gain >> shift_right) & mask;
if (invert) { if (invert) {
left = mask - left; left = mask - left;
right = mask - right; right = mask - right;
} }
ucontrol->value.integer.value[0] = left; ucontrol->value.integer.value[0] = left;
ucontrol->value.integer.value[1] = right; if (shift_left != shift_right)
ucontrol->value.integer.value[1] = right;
spin_unlock_irqrestore(&h->mixer_lock, flags); spin_unlock_irqrestore(&h->mixer_lock, flags);
@ -738,22 +743,82 @@ snd_harmony_volume_put(snd_kcontrol_t *kc,
int old_gain = h->st.gain; int old_gain = h->st.gain;
unsigned long flags; unsigned long flags;
left = ucontrol->value.integer.value[0] & mask;
right = ucontrol->value.integer.value[1] & mask;
if (invert) {
left = mask - left;
right = mask - right;
}
spin_lock_irqsave(&h->mixer_lock, flags); spin_lock_irqsave(&h->mixer_lock, flags);
h->st.gain &= ~( (mask << shift_right) | (mask << shift_left) ); left = ucontrol->value.integer.value[0] & mask;
h->st.gain |= ( (left << shift_left) | (right << shift_right) ); if (invert)
left = mask - left;
h->st.gain &= ~( (mask << shift_left ) );
h->st.gain |= (left << shift_left);
if (shift_left != shift_right) {
right = ucontrol->value.integer.value[1] & mask;
if (invert)
right = mask - right;
h->st.gain &= ~( (mask << shift_right) );
h->st.gain |= (right << shift_right);
}
snd_harmony_set_new_gain(h); snd_harmony_set_new_gain(h);
spin_unlock_irqrestore(&h->mixer_lock, flags); spin_unlock_irqrestore(&h->mixer_lock, flags);
return (old_gain - h->st.gain); return h->st.gain != old_gain;
}
static int
snd_harmony_captureroute_info(snd_kcontrol_t *kc,
snd_ctl_elem_info_t *uinfo)
{
static char *texts[2] = { "Line", "Mic" };
uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
uinfo->count = 1;
uinfo->value.enumerated.items = 2;
if (uinfo->value.enumerated.item > 1)
uinfo->value.enumerated.item = 1;
strcpy(uinfo->value.enumerated.name,
texts[uinfo->value.enumerated.item]);
return 0;
}
static int
snd_harmony_captureroute_get(snd_kcontrol_t *kc,
snd_ctl_elem_value_t *ucontrol)
{
harmony_t *h = snd_kcontrol_chip(kc);
int value;
unsigned long flags;
spin_lock_irqsave(&h->mixer_lock, flags);
value = (h->st.gain >> HARMONY_GAIN_IS_SHIFT) & 1;
ucontrol->value.enumerated.item[0] = value;
spin_unlock_irqrestore(&h->mixer_lock, flags);
return 0;
}
static int
snd_harmony_captureroute_put(snd_kcontrol_t *kc,
snd_ctl_elem_value_t *ucontrol)
{
harmony_t *h = snd_kcontrol_chip(kc);
int value;
int old_gain = h->st.gain;
unsigned long flags;
spin_lock_irqsave(&h->mixer_lock, flags);
value = ucontrol->value.enumerated.item[0] & 1;
h->st.gain &= ~HARMONY_GAIN_IS_MASK;
h->st.gain |= value << HARMONY_GAIN_IS_SHIFT;
snd_harmony_set_new_gain(h);
spin_unlock_irqrestore(&h->mixer_lock, flags);
return h->st.gain != old_gain;
} }
#define HARMONY_CONTROLS (sizeof(snd_harmony_controls)/ \ #define HARMONY_CONTROLS (sizeof(snd_harmony_controls)/ \
@ -767,10 +832,25 @@ snd_harmony_volume_put(snd_kcontrol_t *kc,
((mask) << 16) | ((invert) << 24)) } ((mask) << 16) | ((invert) << 24)) }
static snd_kcontrol_new_t snd_harmony_controls[] = { static snd_kcontrol_new_t snd_harmony_controls[] = {
HARMONY_VOLUME("Playback Volume", HARMONY_GAIN_LO_SHIFT, HARMONY_VOLUME("Master Playback Volume", HARMONY_GAIN_LO_SHIFT,
HARMONY_GAIN_RO_SHIFT, HARMONY_GAIN_OUT, 1), HARMONY_GAIN_RO_SHIFT, HARMONY_GAIN_OUT, 1),
HARMONY_VOLUME("Capture Volume", HARMONY_GAIN_LI_SHIFT, HARMONY_VOLUME("Capture Volume", HARMONY_GAIN_LI_SHIFT,
HARMONY_GAIN_RI_SHIFT, HARMONY_GAIN_IN, 0), HARMONY_GAIN_RI_SHIFT, HARMONY_GAIN_IN, 0),
HARMONY_VOLUME("Monitor Volume", HARMONY_GAIN_MA_SHIFT,
HARMONY_GAIN_MA_SHIFT, HARMONY_GAIN_MA, 1),
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Input Route",
.info = snd_harmony_captureroute_info,
.get = snd_harmony_captureroute_get,
.put = snd_harmony_captureroute_put
},
HARMONY_VOLUME("Internal Speaker Switch", HARMONY_GAIN_SE_SHIFT,
HARMONY_GAIN_SE_SHIFT, 1, 0),
HARMONY_VOLUME("Line-Out Switch", HARMONY_GAIN_LE_SHIFT,
HARMONY_GAIN_LE_SHIFT, 1, 0),
HARMONY_VOLUME("Headphones Switch", HARMONY_GAIN_HE_SHIFT,
HARMONY_GAIN_HE_SHIFT, 1, 0),
}; };
static void __init static void __init
@ -852,14 +932,14 @@ snd_harmony_create(snd_card_t *card,
memset(&h->pbuf, 0, sizeof(h->pbuf)); memset(&h->pbuf, 0, sizeof(h->pbuf));
memset(&h->cbuf, 0, sizeof(h->cbuf)); memset(&h->cbuf, 0, sizeof(h->cbuf));
h->hpa = padev->hpa; h->hpa = padev->hpa.start;
h->card = card; h->card = card;
h->dev = padev; h->dev = padev;
h->irq = padev->irq; h->irq = padev->irq;
h->iobase = ioremap_nocache(padev->hpa, HARMONY_SIZE); h->iobase = ioremap_nocache(padev->hpa.start, HARMONY_SIZE);
if (h->iobase == NULL) { if (h->iobase == NULL) {
printk(KERN_ERR PFX "unable to remap hpa 0x%lx\n", printk(KERN_ERR PFX "unable to remap hpa 0x%lx\n",
padev->hpa); padev->hpa.start);
err = -EBUSY; err = -EBUSY;
goto free_and_ret; goto free_and_ret;
} }

View File

@ -61,7 +61,7 @@ typedef struct snd_card_harmony {
#define HARMONY_SIZE 64 #define HARMONY_SIZE 64
#define BUF_SIZE PAGE_SIZE #define BUF_SIZE PAGE_SIZE
#define MAX_BUFS 10 #define MAX_BUFS 16
#define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE) #define MAX_BUF_SIZE (MAX_BUFS * BUF_SIZE)
#define PLAYBACK_BUFS MAX_BUFS #define PLAYBACK_BUFS MAX_BUFS
@ -101,28 +101,31 @@ typedef struct snd_card_harmony {
#define HARMONY_SS_MONO 0x00000000 #define HARMONY_SS_MONO 0x00000000
#define HARMONY_SS_STEREO 0x00000001 #define HARMONY_SS_STEREO 0x00000001
#define HARMONY_GAIN_SILENCE 0x00F00FFF #define HARMONY_GAIN_SILENCE 0x01F00FFF
#define HARMONY_GAIN_DEFAULT 0x0FF00000 #define HARMONY_GAIN_DEFAULT 0x01F00FFF
#define HARMONY_GAIN_HE_SHIFT 27 #define HARMONY_GAIN_HE_SHIFT 27 /* headphones enabled */
#define HARMONY_GAIN_HE_MASK (1 << HARMONY_GAIN_HE_SHIFT) #define HARMONY_GAIN_HE_MASK (1 << HARMONY_GAIN_HE_SHIFT)
#define HARMONY_GAIN_LE_SHIFT 26 #define HARMONY_GAIN_LE_SHIFT 26 /* line-out enabled */
#define HARMONY_GAIN_LE_MASK (1 << HARMONY_GAIN_LE_SHIFT) #define HARMONY_GAIN_LE_MASK (1 << HARMONY_GAIN_LE_SHIFT)
#define HARMONY_GAIN_SE_SHIFT 25 #define HARMONY_GAIN_SE_SHIFT 25 /* internal-speaker enabled */
#define HARMONY_GAIN_SE_MASK (1 << HARMONY_GAIN_SE_SHIFT) #define HARMONY_GAIN_SE_MASK (1 << HARMONY_GAIN_SE_SHIFT)
#define HARMONY_GAIN_IS_SHIFT 24 #define HARMONY_GAIN_IS_SHIFT 24 /* input select - 0 for line, 1 for mic */
#define HARMONY_GAIN_IS_MASK (1 << HARMONY_GAIN_IS_SHIFT) #define HARMONY_GAIN_IS_MASK (1 << HARMONY_GAIN_IS_SHIFT)
/* monitor attenuation */
#define HARMONY_GAIN_MA 0x0f #define HARMONY_GAIN_MA 0x0f
#define HARMONY_GAIN_MA_SHIFT 20 #define HARMONY_GAIN_MA_SHIFT 20
#define HARMONY_GAIN_MA_MASK (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT) #define HARMONY_GAIN_MA_MASK (HARMONY_GAIN_MA << HARMONY_GAIN_MA_SHIFT)
/* input gain */
#define HARMONY_GAIN_IN 0x0f #define HARMONY_GAIN_IN 0x0f
#define HARMONY_GAIN_LI_SHIFT 16 #define HARMONY_GAIN_LI_SHIFT 16
#define HARMONY_GAIN_LI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_LI_SHIFT) #define HARMONY_GAIN_LI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_LI_SHIFT)
#define HARMONY_GAIN_RI_SHIFT 12 #define HARMONY_GAIN_RI_SHIFT 12
#define HARMONY_GAIN_RI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_RI_SHIFT) #define HARMONY_GAIN_RI_MASK (HARMONY_GAIN_IN << HARMONY_GAIN_RI_SHIFT)
/* output gain (master volume) */
#define HARMONY_GAIN_OUT 0x3f #define HARMONY_GAIN_OUT 0x3f
#define HARMONY_GAIN_LO_SHIFT 6 #define HARMONY_GAIN_LO_SHIFT 6
#define HARMONY_GAIN_LO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT) #define HARMONY_GAIN_LO_MASK (HARMONY_GAIN_OUT << HARMONY_GAIN_LO_SHIFT)