Commit 89a2fa5f authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6

parents 27266a18 68ee3eb8
...@@ -149,14 +149,20 @@ config HOTPLUG_CPU ...@@ -149,14 +149,20 @@ config HOTPLUG_CPU
default y if SMP default y if SMP
select HOTPLUG select HOTPLUG
config ARCH_SELECT_MEMORY_MODEL
def_bool y
depends on 64BIT
config ARCH_DISCONTIGMEM_ENABLE config ARCH_DISCONTIGMEM_ENABLE
bool "Discontiguous memory support (EXPERIMENTAL)" def_bool y
depends on 64BIT && EXPERIMENTAL depends on 64BIT
help
Say Y to support efficient handling of discontiguous physical memory, config ARCH_FLATMEM_ENABLE
for architectures which are either NUMA (Non-Uniform Memory Access) def_bool y
or have huge holes in the physical address space for other reasons.
See <file:Documentation/vm/numa> for more. config ARCH_DISCONTIGMEM_DEFAULT
def_bool y
depends on ARCH_DISCONTIGMEM_ENABLE
source "kernel/Kconfig.hz" source "kernel/Kconfig.hz"
source "mm/Kconfig" source "mm/Kconfig"
......
...@@ -11,4 +11,14 @@ config DEBUG_RWLOCK ...@@ -11,4 +11,14 @@ config DEBUG_RWLOCK
too many attempts. If you suspect a rwlock problem or a kernel too many attempts. If you suspect a rwlock problem or a kernel
hacker asks for this option then say Y. Otherwise say N. hacker asks for this option then say Y. Otherwise say N.
config DEBUG_RODATA
bool "Write protect kernel read-only data structures"
depends on DEBUG_KERNEL
help
Mark the kernel read-only data as write-protected in the pagetables,
in order to catch accidental (and incorrect) writes to such const
data. This option may have a slight performance impact because a
portion of the kernel code won't be covered by a TLB anymore.
If in doubt, say "N".
endmenu endmenu
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.14-rc5-pa1 # Linux kernel version: 2.6.16-rc1-pa0
# Fri Oct 21 23:06:10 2005 # Tue Jan 17 08:21:01 2006
# #
CONFIG_PARISC=y CONFIG_PARISC=y
CONFIG_MMU=y CONFIG_MMU=y
...@@ -29,8 +29,6 @@ CONFIG_SYSVIPC=y ...@@ -29,8 +29,6 @@ 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_HOTPLUG is not set
CONFIG_KOBJECT_UEVENT=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
...@@ -38,8 +36,10 @@ CONFIG_INITRAMFS_SOURCE="" ...@@ -38,8 +36,10 @@ CONFIG_INITRAMFS_SOURCE=""
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_HOTPLUG=y
CONFIG_PRINTK=y CONFIG_PRINTK=y
CONFIG_BUG=y CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
...@@ -48,8 +48,10 @@ CONFIG_CC_ALIGN_FUNCTIONS=0 ...@@ -48,8 +48,10 @@ 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_SLAB=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
# CONFIG_SLOB is not set
# #
# Loadable module support # Loadable module support
...@@ -57,9 +59,27 @@ CONFIG_BASE_SMALL=0 ...@@ -57,9 +59,27 @@ CONFIG_BASE_SMALL=0
CONFIG_MODULES=y CONFIG_MODULES=y
# CONFIG_MODULE_UNLOAD is not set # CONFIG_MODULE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y CONFIG_OBSOLETE_MODPARM=y
CONFIG_MODVERSIONS=y
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_KMOD is not set # CONFIG_KMOD is not set
#
# Block layer
#
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_DEFAULT_AS is not set
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
# #
# Processor type and features # Processor type and features
# #
...@@ -77,6 +97,7 @@ CONFIG_HZ=250 ...@@ -77,6 +97,7 @@ CONFIG_HZ=250
CONFIG_FLATMEM=y CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPLIT_PTLOCK_CPUS=4096
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
# CONFIG_HPUX is not set # CONFIG_HPUX is not set
...@@ -84,8 +105,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y ...@@ -84,8 +105,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y
# Bus options (PCI, PCMCIA, EISA, GSC, ISA) # Bus options (PCI, PCMCIA, EISA, GSC, ISA)
# #
CONFIG_GSC=y CONFIG_GSC=y
# CONFIG_HPPB is not set CONFIG_HPPB=y
# CONFIG_IOMMU_CCIO is not set CONFIG_IOMMU_CCIO=y
CONFIG_GSC_LASI=y CONFIG_GSC_LASI=y
CONFIG_GSC_WAX=y CONFIG_GSC_WAX=y
CONFIG_EISA=y CONFIG_EISA=y
...@@ -165,8 +186,11 @@ CONFIG_IPV6=y ...@@ -165,8 +186,11 @@ CONFIG_IPV6=y
# CONFIG_LLC2 is not set # CONFIG_LLC2 is not set
# CONFIG_IPX is not set # CONFIG_IPX is not set
# CONFIG_ATALK is not set # CONFIG_ATALK is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
# #
# Network testing # Network testing
...@@ -205,6 +229,7 @@ CONFIG_STANDALONE=y ...@@ -205,6 +229,7 @@ CONFIG_STANDALONE=y
CONFIG_PARPORT=y CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y CONFIG_PARPORT_PC=y
# CONFIG_PARPORT_SERIAL is not set # CONFIG_PARPORT_SERIAL is not set
CONFIG_PARPORT_NOT_PC=y
CONFIG_PARPORT_GSC=y CONFIG_PARPORT_GSC=y
# CONFIG_PARPORT_1284 is not set # CONFIG_PARPORT_1284 is not set
...@@ -230,14 +255,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16 ...@@ -230,14 +255,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
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
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_ATA_OVER_ETH=y CONFIG_ATA_OVER_ETH=y
# #
...@@ -281,6 +298,7 @@ CONFIG_SCSI_SPI_ATTRS=y ...@@ -281,6 +298,7 @@ CONFIG_SCSI_SPI_ATTRS=y
# #
# SCSI low-level drivers # SCSI low-level drivers
# #
# CONFIG_ISCSI_TCP is not set
# 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_ACARD is not set # CONFIG_SCSI_ACARD is not set
...@@ -313,21 +331,19 @@ CONFIG_SCSI_SYM53C8XX_2=y ...@@ -313,21 +331,19 @@ CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set CONFIG_SCSI_SYM53C8XX_MMIO=y
# CONFIG_SCSI_IPR is not set # CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_ZALON is not set CONFIG_SCSI_ZALON=y
CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
CONFIG_SCSI_NCR53C8XX_SYNC=40
# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
# CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PAS16 is not set
# CONFIG_SCSI_PSI240I is not set # CONFIG_SCSI_PSI240I is not set
# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_FAS 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_QLA_FC is not set
# CONFIG_SCSI_QLA21XX is not set
# CONFIG_SCSI_QLA22XX is not set
# CONFIG_SCSI_QLA2300 is not set
# CONFIG_SCSI_QLA2322 is not set
# CONFIG_SCSI_QLA6312 is not set
# CONFIG_SCSI_QLA24XX is not set
# CONFIG_SCSI_LPFC 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
...@@ -397,7 +413,7 @@ CONFIG_NETDEVICES=y ...@@ -397,7 +413,7 @@ CONFIG_NETDEVICES=y
# #
CONFIG_NET_ETHERNET=y CONFIG_NET_ETHERNET=y
# CONFIG_MII is not set # CONFIG_MII is not set
# CONFIG_LASI_82596 is not set CONFIG_LASI_82596=y
# 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_CASSINI is not set
...@@ -464,6 +480,7 @@ CONFIG_NET_RADIO=y ...@@ -464,6 +480,7 @@ CONFIG_NET_RADIO=y
# Wireless 802.11b ISA/PCI cards support # Wireless 802.11b ISA/PCI cards support
# #
# CONFIG_HERMES is not set # CONFIG_HERMES is not set
# CONFIG_ATMEL 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
...@@ -527,7 +544,7 @@ CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y ...@@ -527,7 +544,7 @@ CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
# 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 is not set # CONFIG_KEYBOARD_HIL_OLD is not set
# CONFIG_KEYBOARD_HIL is not set CONFIG_KEYBOARD_HIL=y
CONFIG_INPUT_MOUSE=y CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_SERIAL is not set
...@@ -535,7 +552,7 @@ CONFIG_MOUSE_PS2=y ...@@ -535,7 +552,7 @@ CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_LOGIBM is not set # CONFIG_MOUSE_LOGIBM is not set
# CONFIG_MOUSE_PC110PAD is not set # CONFIG_MOUSE_PC110PAD is not set
# CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_MOUSE_HIL is not set CONFIG_MOUSE_HIL=y
# CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y CONFIG_INPUT_MISC=y
...@@ -549,7 +566,8 @@ CONFIG_SERIO=y ...@@ -549,7 +566,8 @@ CONFIG_SERIO=y
# CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PARKBD is not set
CONFIG_SERIO_GSCPS2=y CONFIG_SERIO_GSCPS2=y
# CONFIG_HP_SDC is not set CONFIG_HP_SDC=y
CONFIG_HIL_MLC=y
# CONFIG_SERIO_PCIPS2 is not set # CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set # CONFIG_SERIO_RAW is not set
...@@ -569,6 +587,7 @@ CONFIG_HW_CONSOLE=y ...@@ -569,6 +587,7 @@ CONFIG_HW_CONSOLE=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=13 CONFIG_SERIAL_8250_NR_UARTS=13
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y 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
...@@ -582,11 +601,10 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y ...@@ -582,11 +601,10 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
# #
# Non-8250 serial port support # Non-8250 serial port support
# #
# CONFIG_SERIAL_MUX is not set CONFIG_SERIAL_MUX=y
# CONFIG_PDC_CONSOLE is not set CONFIG_SERIAL_MUX_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=y CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256 CONFIG_LEGACY_PTY_COUNT=256
...@@ -625,6 +643,12 @@ CONFIG_GEN_RTC=y ...@@ -625,6 +643,12 @@ CONFIG_GEN_RTC=y
# #
# CONFIG_I2C is not set # CONFIG_I2C is not set
#
# SPI support
#
# CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set
# #
# Dallas's 1-wire bus # Dallas's 1-wire bus
# #
...@@ -661,7 +685,6 @@ CONFIG_FB=y ...@@ -661,7 +685,6 @@ CONFIG_FB=y
CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_SOFT_CURSOR=y
# CONFIG_FB_MACMODES is not set # 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
...@@ -671,6 +694,7 @@ CONFIG_FB_SOFT_CURSOR=y ...@@ -671,6 +694,7 @@ CONFIG_FB_SOFT_CURSOR=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_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set # 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
...@@ -683,9 +707,7 @@ CONFIG_FB_STI=y ...@@ -683,9 +707,7 @@ 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
# #
...@@ -695,6 +717,7 @@ CONFIG_DUMMY_CONSOLE=y ...@@ -695,6 +717,7 @@ 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_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
CONFIG_STI_CONSOLE=y CONFIG_STI_CONSOLE=y
# CONFIG_FONTS is not set # CONFIG_FONTS is not set
CONFIG_FONT_8x8=y CONFIG_FONT_8x8=y
...@@ -713,7 +736,85 @@ CONFIG_LOGO_PARISC_CLUT224=y ...@@ -713,7 +736,85 @@ CONFIG_LOGO_PARISC_CLUT224=y
# #
# Sound # Sound
# #
# CONFIG_SOUND is not set CONFIG_SOUND=y
#
# Advanced Linux Sound Architecture
#
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_SEQUENCER=y
# CONFIG_SND_SEQ_DUMMY is not set
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_SUPPORT_OLD_API=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
#
# Generic devices
#
# CONFIG_SND_DUMMY is not set
# CONFIG_SND_VIRMIDI is not set
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_MPU401 is not set
#
# PCI devices
#
# CONFIG_SND_AD1889 is not set
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_EMU10K1X is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_FM801 is not set
# CONFIG_SND_HDA_INTEL is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_HDSPM is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
# CONFIG_SND_INTEL8X0 is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_PCXHR is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VIA82XX_MODEM is not set
# CONFIG_SND_VX222 is not set
# CONFIG_SND_YMFPCI is not set
#
# GSC devices
#
CONFIG_SND_HARMONY=y
#
# Open Sound System
#
# CONFIG_SOUND_PRIME is not set
# #
# USB support # USB support
...@@ -722,6 +823,10 @@ CONFIG_USB_ARCH_HAS_HCD=y ...@@ -722,6 +823,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
# CONFIG_USB is not set # CONFIG_USB is not set
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
#
# #
# USB Gadget Support # USB Gadget Support
# #
...@@ -877,18 +982,23 @@ CONFIG_NLS_DEFAULT="iso8859-1" ...@@ -877,18 +982,23 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# Kernel hacking # Kernel hacking
# #
# CONFIG_PRINTK_TIME is not set # CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y
CONFIG_LOG_BUF_SHIFT=16 CONFIG_LOG_BUF_SHIFT=16
CONFIG_DETECT_SOFTLOCKUP=y 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_MUTEXES is not set
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP 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
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set
CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_DEBUG_RODATA is not set
# #
# Security options # Security options
......
...@@ -22,10 +22,9 @@ ...@@ -22,10 +22,9 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/unistd.h> #include <asm/unistd.h>
.text
#define ENTRY_NAME(_name_) .word _name_ #define ENTRY_NAME(_name_) .word _name_
.section .rodata,"a"
.align 4 .align 4
.export hpux_call_table .export hpux_call_table
.import hpux_unimplemented_wrapper .import hpux_unimplemented_wrapper
......
...@@ -408,11 +408,10 @@ static void setup_bus_id(struct parisc_device *padev) ...@@ -408,11 +408,10 @@ static void setup_bus_id(struct parisc_device *padev)
struct parisc_device * create_tree_node(char id, struct device *parent) struct parisc_device * create_tree_node(char id, struct device *parent)
{ {
struct parisc_device *dev = kmalloc(sizeof(*dev), GFP_KERNEL); struct parisc_device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev) if (!dev)
return NULL; return NULL;
memset(dev, 0, sizeof(*dev));
dev->hw_path = id; dev->hw_path = id;
dev->id.hw_type = HPHW_FAULTY; dev->id.hw_type = HPHW_FAULTY;
......
...@@ -48,9 +48,6 @@ EXPORT_SYMBOL(strrchr); ...@@ -48,9 +48,6 @@ EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strpbrk); EXPORT_SYMBOL(strpbrk);
#include <linux/pm.h>
EXPORT_SYMBOL(pm_power_off);
#include <asm/atomic.h> #include <asm/atomic.h>
EXPORT_SYMBOL(__xchg8); EXPORT_SYMBOL(__xchg8);
EXPORT_SYMBOL(__xchg32); EXPORT_SYMBOL(__xchg32);
......
...@@ -47,18 +47,17 @@ ...@@ -47,18 +47,17 @@
* this makes the boot time much longer than necessary. * this makes the boot time much longer than necessary.
* 20ms seems to work for all the HP PCI implementations to date. * 20ms seems to work for all the HP PCI implementations to date.
* *
* XXX: turn into a #defined constant in <asm/pci.h> ? * #define pci_post_reset_delay 50
*/ */
int pci_post_reset_delay = 50;
struct pci_port_ops *pci_port; struct pci_port_ops *pci_port __read_mostly;
struct pci_bios_ops *pci_bios; struct pci_bios_ops *pci_bios __read_mostly;
int pci_hba_count = 0; static int pci_hba_count __read_mostly;
/* parisc_pci_hba used by pci_port->in/out() ops to lookup bus data. */ /* parisc_pci_hba used by pci_port->in/out() ops to lookup bus data. */
#define PCI_HBA_MAX 32 #define PCI_HBA_MAX 32
struct pci_hba_data *parisc_pci_hba[PCI_HBA_MAX]; static struct pci_hba_data *parisc_pci_hba[PCI_HBA_MAX] __read_mostly;
/******************************************************************** /********************************************************************
...@@ -259,8 +258,10 @@ void __devinit pcibios_resource_to_bus(struct pci_dev *dev, ...@@ -259,8 +258,10 @@ void __devinit pcibios_resource_to_bus(struct pci_dev *dev,
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
struct pci_bus_region *region) struct pci_bus_region *region)
{ {
#ifdef CONFIG_64BIT
struct pci_bus *bus = dev->bus; struct pci_bus *bus = dev->bus;
struct pci_hba_data *hba = HBA_DATA(bus->bridge->platform_data); struct pci_hba_data *hba = HBA_DATA(bus->bridge->platform_data);
#endif
if (res->flags & IORESOURCE_MEM) { if (res->flags & IORESOURCE_MEM) {
res->start = PCI_HOST_ADDR(hba, region->start); res->start = PCI_HOST_ADDR(hba, region->start);
......
...@@ -68,20 +68,20 @@ struct rdr_tbl_ent { ...@@ -68,20 +68,20 @@ struct rdr_tbl_ent {
}; };
static int perf_processor_interface __read_mostly = UNKNOWN_INTF; static int perf_processor_interface __read_mostly = UNKNOWN_INTF;
static int perf_enabled __read_mostly = 0; static int perf_enabled __read_mostly;
static spinlock_t perf_lock; static spinlock_t perf_lock;
struct parisc_device *cpu_device __read_mostly = NULL; struct parisc_device *cpu_device __read_mostly;
/* RDRs to write for PCX-W */ /* RDRs to write for PCX-W */
static int perf_rdrs_W[] = static const int perf_rdrs_W[] =
{ 0, 1, 4, 5, 6, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, -1 }; { 0, 1, 4, 5, 6, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, -1 };
/* RDRs to write for PCX-U */ /* RDRs to write for PCX-U */
static int perf_rdrs_U[] = static const int perf_rdrs_U[] =
{ 0, 1, 4, 5, 6, 7, 16, 17, 18, 20, 21, 22, 23, 24, 25, -1 }; { 0, 1, 4, 5, 6, 7, 16, 17, 18, 20, 21, 22, 23, 24, 25, -1 };
/* RDR register descriptions for PCX-W */ /* RDR register descriptions for PCX-W */
static struct rdr_tbl_ent perf_rdr_tbl_W[] = { static const struct rdr_tbl_ent perf_rdr_tbl_W[] = {
{ 19, 1, 8 }, /* RDR 0 */ { 19, 1, 8 }, /* RDR 0 */
{ 16, 1, 16 }, /* RDR 1 */ { 16, 1, 16 }, /* RDR 1 */
{ 72, 2, 0 }, /* RDR 2 */ { 72, 2, 0 }, /* RDR 2 */
...@@ -117,7 +117,7 @@ static struct rdr_tbl_ent perf_rdr_tbl_W[] = { ...@@ -117,7 +117,7 @@ static struct rdr_tbl_ent perf_rdr_tbl_W[] = {
}; };
/* RDR register descriptions for PCX-U */ /* RDR register descriptions for PCX-U */
static struct rdr_tbl_ent perf_rdr_tbl_U[] = { static const struct rdr_tbl_ent perf_rdr_tbl_U[] = {
{ 19, 1, 8 }, /* RDR 0 */ { 19, 1, 8 }, /* RDR 0 */
{ 32, 1, 16 }, /* RDR 1 */ { 32, 1, 16 }, /* RDR 1 */
{ 20, 1, 0 }, /* RDR 2 */ { 20, 1, 0 }, /* RDR 2 */
...@@ -156,7 +156,7 @@ static struct rdr_tbl_ent perf_rdr_tbl_U[] = { ...@@ -156,7 +156,7 @@ static struct rdr_tbl_ent perf_rdr_tbl_U[] = {
* A non-zero write_control in the above tables is a byte offset into * A non-zero write_control in the above tables is a byte offset into
* this array. * this array.
*/ */
static uint64_t perf_bitmasks[] = { static const uint64_t perf_bitmasks[] = {
0x0000000000000000ul, /* first dbl word must be zero */ 0x0000000000000000ul, /* first dbl word must be zero */
0xfdffe00000000000ul, /* RDR0 bitmask */ 0xfdffe00000000000ul, /* RDR0 bitmask */
0x003f000000000000ul, /* RDR1 bitmask */ 0x003f000000000000ul, /* RDR1 bitmask */
...@@ -173,7 +173,7 @@ static uint64_t perf_bitmasks[] = { ...@@ -173,7 +173,7 @@ static uint64_t perf_bitmasks[] = {
* Write control bitmasks for Pa-8700 processor given * Write control bitmasks for Pa-8700 processor given
* somethings have changed slightly. * somethings have changed slightly.
*/ */
static uint64_t perf_bitmasks_piranha[] = { static const uint64_t perf_bitmasks_piranha[] = {
0x0000000000000000ul, /* first dbl word must be zero */ 0x0000000000000000ul, /* first dbl word must be zero */
0xfdffe00000000000ul, /* RDR0 bitmask */ 0xfdffe00000000000ul, /* RDR0 bitmask */
0x003f000000000000ul, /* RDR1 bitmask */ 0x003f000000000000ul, /* RDR1 bitmask */
...@@ -186,7 +186,7 @@ static uint64_t perf_bitmasks_piranha[] = { ...@@ -186,7 +186,7 @@ static uint64_t perf_bitmasks_piranha[] = {
0xfffc000000000000ul 0xfffc000000000000ul
}; };
static uint64_t *bitmask_array; /* array of bitmasks to use */ static const uint64_t *bitmask_array; /* array of bitmasks to use */
/****************************************************************************** /******************************************************************************
* Function Prototypes * Function Prototypes
...@@ -200,7 +200,7 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun ...@@ -200,7 +200,7 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg); static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
static void perf_start_counters(void); static void perf_start_counters(void);
static int perf_stop_counters(uint32_t *raddr); static int perf_stop_counters(uint32_t *raddr);
static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num); static const struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num);
static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer); static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer);
static int perf_rdr_clear(uint32_t rdr_num); static int perf_rdr_clear(uint32_t rdr_num);
static int perf_write_image(uint64_t *memaddr); static int perf_write_image(uint64_t *memaddr);
...@@ -444,7 +444,6 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ...@@ -444,7 +444,6 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
uint32_t raddr[4]; uint32_t raddr[4];
int error = 0; int error = 0;
lock_kernel();
switch (cmd) { switch (cmd) {
case PA_PERF_ON: case PA_PERF_ON:
...@@ -477,8 +476,6 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ...@@ -477,8 +476,6 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
error = -ENOTTY; error = -ENOTTY;
} }
unlock_kernel();
return error; return error;
} }
...@@ -655,7 +652,7 @@ static int perf_stop_counters(uint32_t *raddr) ...@@ -655,7 +652,7 @@ static int perf_stop_counters(uint32_t *raddr)
* Retrieve a pointer to the description of what this * Retrieve a pointer to the description of what this
* RDR contains. * RDR contains.
*/ */
static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num) static const struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num)
{ {
if (perf_processor_interface == ONYX_INTF) { if (perf_processor_interface == ONYX_INTF) {
return &perf_rdr_tbl_U[rdr_num]; return &perf_rdr_tbl_U[rdr_num];
...@@ -673,7 +670,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer) ...@@ -673,7 +670,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer)
{ {
uint64_t data, data_mask = 0; uint64_t data, data_mask = 0;
uint32_t width, xbits, i; uint32_t width, xbits, i;
struct rdr_tbl_ent *tentry; const struct rdr_tbl_ent *tentry;
tentry = perf_rdr_get_entry(rdr_num); tentry = perf_rdr_get_entry(rdr_num);
if ((width = tentry->width) == 0) if ((width = tentry->width) == 0)
...@@ -721,7 +718,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer) ...@@ -721,7 +718,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer)
*/ */
static int perf_rdr_clear(uint32_t rdr_num) static int perf_rdr_clear(uint32_t rdr_num)
{ {
struct rdr_tbl_ent *tentry; const struct rdr_tbl_ent *tentry;
int32_t i; int32_t i;
tentry = perf_rdr_get_entry(rdr_num); tentry = perf_rdr_get_entry(rdr_num);
...@@ -753,10 +750,11 @@ static int perf_write_image(uint64_t *memaddr) ...@@ -753,10 +750,11 @@ static int perf_write_image(uint64_t *memaddr)
uint64_t buffer[MAX_RDR_WORDS]; uint64_t buffer[MAX_RDR_WORDS];
uint64_t *bptr; uint64_t *bptr;
uint32_t dwords; uint32_t dwords;
uint32_t *intrigue_rdr; const uint32_t *intrigue_rdr;
uint64_t *intrigue_bitmask, tmp64; const uint64_t *intrigue_bitmask;
uint64_t tmp64;
void __iomem *runway; void __iomem *runway;
struct rdr_tbl_ent *tentry; const struct rdr_tbl_ent *tentry;
int i; int i;
/* Clear out counters */ /* Clear out counters */
...@@ -830,7 +828,7 @@ static int perf_write_image(uint64_t *memaddr) ...@@ -830,7 +828,7 @@ static int perf_write_image(uint64_t *memaddr)
*/ */
static void perf_rdr_write(uint32_t rdr_num, uint64_t *buffer) static void perf_rdr_write(uint32_t rdr_num, uint64_t *buffer)
{ {
struct rdr_tbl_ent *tentry; const struct rdr_tbl_ent *tentry;
int32_t i; int32_t i;
printk("perf_rdr_write\n"); printk("perf_rdr_write\n");
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#define PCXU_IMAGE_SIZE 584 #define PCXU_IMAGE_SIZE 584
static uint32_t onyx_images[][PCXU_IMAGE_SIZE/sizeof(uint32_t)] = { static uint32_t onyx_images[][PCXU_IMAGE_SIZE/sizeof(uint32_t)] __read_mostly = {
/* /*
* CPI: * CPI:
* *
...@@ -2093,7 +2093,7 @@ static uint32_t onyx_images[][PCXU_IMAGE_SIZE/sizeof(uint32_t)] = { ...@@ -2093,7 +2093,7 @@ static uint32_t onyx_images[][PCXU_IMAGE_SIZE/sizeof(uint32_t)] = {
}; };
#define PCXW_IMAGE_SIZE 576 #define PCXW_IMAGE_SIZE 576
static uint32_t cuda_images[][PCXW_IMAGE_SIZE/sizeof(uint32_t)] = { static uint32_t cuda_images[][PCXW_IMAGE_SIZE/sizeof(uint32_t)] __read_mostly = {
/* /*
* CPI: FROM CPI.IDF (Image 0) * CPI: FROM CPI.IDF (Image 0)
* *
......
...@@ -54,27 +54,6 @@ ...@@ -54,27 +54,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/unwind.h> #include <asm/unwind.h>
static int hlt_counter __read_mostly;
/*
* Power off function, if any
*/
void (*pm_power_off)(void);
void disable_hlt(void)
{
hlt_counter++;
}
EXPORT_SYMBOL(disable_hlt);
void enable_hlt(void)
{
hlt_counter--;
}
EXPORT_SYMBOL(enable_hlt);
void default_idle(void) void default_idle(void)
{ {
barrier(); barrier();
...@@ -102,12 +81,7 @@ void cpu_idle(void) ...@@ -102,12 +81,7 @@ void cpu_idle(void)
} }
#ifdef __LP64__ #define COMMAND_GLOBAL F_EXTEND(0xfffe0030)
#define COMMAND_GLOBAL 0xfffffffffffe0030UL
#else
#define COMMAND_GLOBAL 0xfffe0030
#endif
#define CMD_RESET 5 /* reset any module */ #define CMD_RESET 5 /* reset any module */
/* /*
...@@ -162,6 +136,7 @@ void machine_halt(void) ...@@ -162,6 +136,7 @@ void machine_halt(void)
*/ */
} }
void (*chassis_power_off)(void);
/* /*
* This routine is called from sys_reboot to actually turn off the * This routine is called from sys_reboot to actually turn off the
...@@ -170,8 +145,8 @@ void machine_halt(void) ...@@ -170,8 +145,8 @@ void machine_halt(void)
void machine_power_off(void) void machine_power_off(void)
{ {
/* If there is a registered power off handler, call it. */ /* If there is a registered power off handler, call it. */
if(pm_power_off) if (chassis_power_off)
pm_power_off(); chassis_power_off();
/* Put the soft power button back under hardware control. /* Put the soft power button back under hardware control.
* If the user had already pressed the power button, the * If the user had already pressed the power button, the
...@@ -187,6 +162,8 @@ void machine_power_off(void) ...@@ -187,6 +162,8 @@ void machine_power_off(void)
KERN_EMERG "Please power this system off now."); KERN_EMERG "Please power this system off now.");
} }
void (*pm_power_off)(void) = machine_power_off;
EXPORT_SYMBOL(pm_power_off);
/* /*
* Create a kernel thread * Create a kernel thread
......
...@@ -91,7 +91,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -91,7 +91,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
int copied; int copied;
#ifdef __LP64__ #ifdef __LP64__
if (is_compat_task(child)) { if (personality(child->personality) == PER_LINUX32) {
unsigned int tmp; unsigned int tmp;
addr &= 0xffffffffL; addr &= 0xffffffffL;
...@@ -123,7 +123,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -123,7 +123,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
case PTRACE_POKEDATA: case PTRACE_POKEDATA:
ret = 0; ret = 0;
#ifdef __LP64__ #ifdef __LP64__
if (is_compat_task(child)) { if (personality(child->personality) == PER_LINUX32) {
unsigned int tmp = (unsigned int)data; unsigned int tmp = (unsigned int)data;
DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n", DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n",
request == PTRACE_POKETEXT ? "TEXT" : "DATA", request == PTRACE_POKETEXT ? "TEXT" : "DATA",
...@@ -146,7 +146,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -146,7 +146,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
case PTRACE_PEEKUSR: { case PTRACE_PEEKUSR: {
ret = -EIO; ret = -EIO;
#ifdef __LP64__ #ifdef __LP64__
if (is_compat_task(child)) { if (personality(child->personality) == PER_LINUX32) {
unsigned int tmp; unsigned int tmp;
if (addr & (sizeof(int)-1)) if (addr & (sizeof(int)-1))
...@@ -205,7 +205,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -205,7 +205,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
goto out_tsk; goto out_tsk;
} }
#ifdef __LP64__ #ifdef __LP64__
if (is_compat_task(child)) { if (personality(child->personality) == PER_LINUX32) {
if (addr & (sizeof(int)-1)) if (addr & (sizeof(int)-1))
goto out_tsk; goto out_tsk;
if ((addr = translate_usr_offset(addr)) < 0) if ((addr = translate_usr_offset(addr)) < 0)
......
...@@ -317,7 +317,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -317,7 +317,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
if(personality(current->personality) == PER_LINUX32) { if(personality(current->personality) == PER_LINUX32) {
DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
err |= compat_copy_siginfo_to_user(&compat_frame->info, info); err |= copy_siginfo_to_user32(&compat_frame->info, info);
DBG(1,"SETUP_RT_FRAME: 1\n"); DBG(1,"SETUP_RT_FRAME: 1\n");
compat_val = (compat_int_t)current->sas_ss_sp; compat_val = (compat_int_t)current->sas_ss_sp;
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp); err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <asm/compat_signal.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "signal32.h" #include "signal32.h"
...@@ -398,3 +397,104 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __ ...@@ -398,3 +397,104 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __
return err; return err;
} }
int
copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
{
unsigned long tmp;
int err;
if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t)))
return -EFAULT;
err = __get_user(to->si_signo, &from->si_signo);
err |= __get_user(to->si_errno, &from->si_errno);
err |= __get_user(to->si_code, &from->si_code);
if (to->si_code < 0)
err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
switch (to->si_code >> 16) {
case __SI_CHLD >> 16:
err |= __get_user(to->si_utime, &from->si_utime);
err |= __get_user(to->si_stime, &from->si_stime);
err |= __get_user(to->si_status, &from->si_status);
default:
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
break;
case __SI_FAULT >> 16:
err |= __get_user(tmp, &from->si_addr);
to->si_addr = (void __user *) tmp;
break;
case __SI_POLL >> 16:
err |= __get_user(to->si_band, &from->si_band);
err |= __get_user(to->si_fd, &from->si_fd);
break;
case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
case __SI_MESGQ >> 16:
err |= __get_user(to->si_pid, &from->si_pid);
err |= __get_user(to->si_uid, &from->si_uid);
err |= __get_user(to->si_int, &from->si_int);
break;
}
}
return err;
}
int
copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from)
{
unsigned int addr;
int err;
if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
return -EFAULT;
/* If you change siginfo_t structure, please be sure
this code is fixed accordingly.
It should never copy any pad contained in the structure
to avoid security leaks, but must copy the generic
3 ints plus the relevant union member.
This routine must convert siginfo from 64bit to 32bit as well
at the same time. */
err = __put_user(from->si_signo, &to->si_signo);
err |= __put_user(from->si_errno, &to->si_errno);
err |= __put_user((short)from->si_code, &to->si_code);
if (from->si_code < 0)
err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
else {
switch (from->si_code >> 16) {
case __SI_CHLD >> 16:
err |= __put_user(from->si_utime, &to->si_utime);
err |= __put_user(from->si_stime, &to->si_stime);
err |= __put_user(from->si_status, &to->si_status);
default:
err |= __put_user(from->si_pid, &to->si_pid);
err |= __put_user(from->si_uid, &to->si_uid);
break;
case __SI_FAULT >> 16:
/* avoid type-checking warnings by copying _pad[0] in lieu of si_addr... */
err |= __put_user(from->_sifields._pad[0], &to->si_addr);
break;
case __SI_POLL >> 16:
err |= __put_user(from->si_band, &to->si_band);
err |= __put_user(from->si_fd, &to->si_fd);
break;
case __SI_TIMER >> 16:
err |= __put_user(from->si_tid, &to->si_tid);
err |= __put_user(from->si_overrun, &to->si_overrun);
addr = (unsigned long) from->si_ptr;
err |= __put_user(addr, &to->si_ptr);
break;
case __SI_RT >> 16: /* Not generated by the kernel as of now. */
case __SI_MESGQ >> 16:
err |= __put_user(from->si_uid, &to->si_uid);
err |= __put_user(from->si_pid, &to->si_pid);
addr = (unsigned long) from->si_ptr;
err |= __put_user(addr, &to->si_ptr);
break;
}
}
return err;
}
...@@ -20,8 +20,34 @@ ...@@ -20,8 +20,34 @@
#define _PARISC64_KERNEL_SIGNAL32_H #define _PARISC64_KERNEL_SIGNAL32_H
#include <linux/compat.h> #include <linux/compat.h>
#include <asm/compat_signal.h>
#include <asm/compat_rt_sigframe.h> typedef compat_uptr_t compat_sighandler_t;
typedef struct compat_sigaltstack {
compat_uptr_t ss_sp;
compat_int_t ss_flags;
compat_size_t ss_size;
} compat_stack_t;
/* Most things should be clean enough to redefine this at will, if care
is taken to make libc match. */
struct compat_sigaction {
compat_sighandler_t sa_handler;
compat_uint_t sa_flags;
compat_sigset_t sa_mask; /* mask last for extensibility */
};
/* 32-bit ucontext as seen from an 64-bit kernel */
struct compat_ucontext {
compat_uint_t uc_flags;
compat_uptr_t uc_link;
compat_stack_t uc_stack; /* struct compat_sigaltstack (12 bytes)*/
/* FIXME: Pad out to get uc_mcontext to start at an 8-byte aligned boundary */
compat_uint_t pad[1];
struct compat_sigcontext uc_mcontext;
compat_sigset_t uc_sigmask; /* mask last for extensibility */
};
/* ELF32 signal handling */ /* ELF32 signal handling */
...@@ -29,6 +55,103 @@ struct k_sigaction32 { ...@@ -29,6 +55,103 @@ struct k_sigaction32 {
struct compat_sigaction sa; struct compat_sigaction sa;
}; };
typedef struct compat_siginfo {
int si_signo;
int si_errno;
int si_code;
union {
int _pad[((128/sizeof(int)) - 3)];
/* kill() */
struct {
unsigned int _pid; /* sender's pid */
unsigned int _uid; /* sender's uid */
} _kill;
/* POSIX.1b timers */
struct {
compat_timer_t _tid; /* timer id */
int _overrun; /* overrun count */
char _pad[sizeof(unsigned int) - sizeof(int)];
compat_sigval_t _sigval; /* same as below */
int _sys_private; /* not to be passed to user */
} _timer;
/* POSIX.1b signals */
struct {
unsigned int _pid; /* sender's pid */
unsigned int _uid; /* sender's uid */
compat_sigval_t _sigval;
} _rt;
/* SIGCHLD */
struct {
unsigned int _pid; /* which child */
unsigned int _uid; /* sender's uid */
int _status; /* exit code */
compat_clock_t _utime;
compat_clock_t _stime;
} _sigchld;
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
struct {
unsigned int _addr; /* faulting insn/memory ref. */
} _sigfault;
/* SIGPOLL */
struct {
int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
int _fd;
} _sigpoll;
} _sifields;
} compat_siginfo_t;
int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from);
int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from);
/* In a deft move of uber-hackery, we decide to carry the top half of all
* 64-bit registers in a non-portable, non-ABI, hidden structure.
* Userspace can read the hidden structure if it *wants* but is never
* guaranteed to be in the same place. Infact the uc_sigmask from the
* ucontext_t structure may push the hidden register file downards
*/
struct compat_regfile {
/* Upper half of all the 64-bit registers that were truncated
on a copy to a 32-bit userspace */
compat_int_t rf_gr[32];
compat_int_t rf_iasq[2];
compat_int_t rf_iaoq[2];
compat_int_t rf_sar;
};
#define COMPAT_SIGRETURN_TRAMP 4
#define COMPAT_SIGRESTARTBLOCK_TRAMP 5
#define COMPAT_TRAMP_SIZE (COMPAT_SIGRETURN_TRAMP + \
COMPAT_SIGRESTARTBLOCK_TRAMP)
struct compat_rt_sigframe {
/* XXX: Must match trampoline size in arch/parisc/kernel/signal.c
Secondary to that it must protect the ERESTART_RESTARTBLOCK
trampoline we left on the stack (we were bad and didn't
change sp so we could run really fast.) */
compat_uint_t tramp[COMPAT_TRAMP_SIZE];
compat_siginfo_t info;
struct compat_ucontext uc;
/* Hidden location of truncated registers, *must* be last. */
struct compat_regfile regs;
};
/*
* The 32-bit ABI wants at least 48 bytes for a function call frame:
* 16 bytes for arg0-arg3, and 32 bytes for magic (the only part of
* which Linux/parisc uses is sp-20 for the saved return pointer...)
* Then, the stack pointer must be rounded to a cache line (64 bytes).
*/
#define SIGFRAME32 64
#define FUNCTIONCALLFRAME32 48
#define PARISC_RT_SIGFRAME_SIZE32 (((sizeof(struct compat_rt_sigframe) + FUNCTIONCALLFRAME32) + SIGFRAME32) & -SIGFRAME32)
void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
int do_sigaltstack32 (const compat_stack_t __user *uss32, int do_sigaltstack32 (const compat_stack_t __user *uss32,
......
...@@ -650,6 +650,8 @@ end_linux_gateway_page: ...@@ -650,6 +650,8 @@ end_linux_gateway_page:
#define LWS_ENTRY(_name_) .word (lws_##_name_ - linux_gateway_page) #define LWS_ENTRY(_name_) .word (lws_##_name_ - linux_gateway_page)
#endif #endif
.section .rodata,"a"
.align 4096 .align 4096
/* Light-weight-syscall table */ /* Light-weight-syscall table */
/* Start of lws table. */ /* Start of lws table. */
......
...@@ -374,5 +374,24 @@ ...@@ -374,5 +374,24 @@
ENTRY_SAME(keyctl) ENTRY_SAME(keyctl)
ENTRY_SAME(ioprio_set) ENTRY_SAME(ioprio_set)
ENTRY_SAME(ioprio_get) ENTRY_SAME(ioprio_get)
ENTRY_SAME(inotify_init)
ENTRY_SAME(inotify_add_watch) /* 270 */
ENTRY_SAME(inotify_rm_watch)
ENTRY_COMP(pselect6)
ENTRY_COMP(ppoll)
ENTRY_SAME(migrate_pages)
ENTRY_COMP(openat) /* 275 */
ENTRY_SAME(mkdirat)
ENTRY_SAME(mknodat)
ENTRY_SAME(fchownat)
ENTRY_COMP(futimesat)
ENTRY_COMP(newfstatat) /* 280 */
ENTRY_SAME(unlinkat)
ENTRY_SAME(renameat)
ENTRY_SAME(linkat)
ENTRY_SAME(symlinkat)
ENTRY_SAME(readlinkat) /* 285 */
ENTRY_SAME(fchmodat)
ENTRY_SAME(faccessat)
/* Nothing yet */ /* Nothing yet */
...@@ -193,10 +193,9 @@ void show_stack(struct task_struct *task, unsigned long *s) ...@@ -193,10 +193,9 @@ void show_stack(struct task_struct *task, unsigned long *s)
HERE: HERE:
asm volatile ("copy %%r30, %0" : "=r"(sp)); asm volatile ("copy %%r30, %0" : "=r"(sp));
r = (struct pt_regs *)kmalloc(sizeof(struct pt_regs), GFP_KERNEL); r = kzalloc(sizeof(struct pt_regs), GFP_KERNEL);
if (!r) if (!r)
return; return;
memset(r, 0, sizeof(struct pt_regs));
r->iaoq[0] = (unsigned long)&&HERE; r->iaoq[0] = (unsigned long)&&HERE;
r->gr[2] = (unsigned long)__builtin_return_address(0); r->gr[2] = (unsigned long)__builtin_return_address(0);
r->gr[30] = sp; r->gr[30] = sp;
......
...@@ -337,6 +337,7 @@ decode_fpu(unsigned int Fpu_register[], unsigned int trap_counts[]) ...@@ -337,6 +337,7 @@ decode_fpu(unsigned int Fpu_register[], unsigned int trap_counts[])
} }
break; break;
case INVALIDEXCEPTION: case INVALIDEXCEPTION:
case OPC_2E_INVALIDEXCEPTION:
update_trap_counts(Fpu_register, aflags, bflags, trap_counts); update_trap_counts(Fpu_register, aflags, bflags, trap_counts);
return SIGNALCODE(SIGFPE, FPE_FLTINV); return SIGNALCODE(SIGFPE, FPE_FLTINV);
case DIVISIONBYZEROEXCEPTION: case DIVISIONBYZEROEXCEPTION:
......
...@@ -371,17 +371,11 @@ static void __init setup_bootmem(void) ...@@ -371,17 +371,11 @@ static void __init setup_bootmem(void)
void free_initmem(void) void free_initmem(void)
{ {
/* FIXME: */
#if 0
printk(KERN_INFO "NOT FREEING INITMEM (%dk)\n",
(&__init_end - &__init_begin) >> 10);
return;
#else
unsigned long addr; unsigned long addr;
printk(KERN_INFO "Freeing unused kernel memory: "); printk(KERN_INFO "Freeing unused kernel memory: ");
#if 1 #ifdef CONFIG_DEBUG_KERNEL
/* Attempt to catch anyone trying to execute code here /* Attempt to catch anyone trying to execute code here
* by filling the page with BRK insns. * by filling the page with BRK insns.
* *
...@@ -414,9 +408,21 @@ void free_initmem(void) ...@@ -414,9 +408,21 @@ void free_initmem(void)
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE); pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE);
printk("%luk freed\n", (unsigned long)(&__init_end - &__init_begin) >> 10); printk("%luk freed\n", (unsigned long)(&__init_end - &__init_begin) >> 10);
#endif
} }
#ifdef CONFIG_DEBUG_RODATA
void mark_rodata_ro(void)
{
extern char __start_rodata, __end_rodata;
/* rodata memory was already mapped with KERNEL_RO access rights by
pagetable_init() and map_pages(). No need to do additional stuff here */
printk (KERN_INFO "Write protecting the kernel read-only data: %luk\n",
(unsigned long)(&__end_rodata - &__start_rodata) >> 10);
}
#endif
/* /*
* Just an arbitrary offset to serve as a "hole" between mapping areas * Just an arbitrary offset to serve as a "hole" between mapping areas
* (between top of physical memory and a potential pcxl dma mapping * (between top of physical memory and a potential pcxl dma mapping
...@@ -477,11 +483,6 @@ void __init mem_init(void) ...@@ -477,11 +483,6 @@ void __init mem_init(void)
} }
int do_check_pgt_cache(int low, int high)
{
return 0;
}
unsigned long *empty_zero_page __read_mostly; unsigned long *empty_zero_page __read_mostly;
void show_mem(void) void show_mem(void)
...@@ -690,7 +691,7 @@ static void __init pagetable_init(void) ...@@ -690,7 +691,7 @@ static void __init pagetable_init(void)
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
if (initrd_end && initrd_end > mem_limit) { if (initrd_end && initrd_end > mem_limit) {
printk("initrd: mapping %08lx-%08lx\n", initrd_start, initrd_end); printk(KERN_INFO "initrd: mapping %08lx-%08lx\n", initrd_start, initrd_end);
map_pages(initrd_start, __pa(initrd_start), map_pages(initrd_start, __pa(initrd_start),
initrd_end - initrd_start, PAGE_KERNEL); initrd_end - initrd_start, PAGE_KERNEL);
} }
...@@ -792,8 +793,6 @@ map_hpux_gateway_page(struct task_struct *tsk, struct mm_struct *mm) ...@@ -792,8 +793,6 @@ map_hpux_gateway_page(struct task_struct *tsk, struct mm_struct *mm)
EXPORT_SYMBOL(map_hpux_gateway_page); EXPORT_SYMBOL(map_hpux_gateway_page);
#endif #endif
extern void flush_tlb_all_local(void);
void __init paging_init(void) void __init paging_init(void)
{ {
int i; int i;
...@@ -802,7 +801,7 @@ void __init paging_init(void) ...@@ -802,7 +801,7 @@ void __init paging_init(void)
pagetable_init(); pagetable_init();
gateway_init(); gateway_init();
flush_cache_all_local(); /* start with known state */ flush_cache_all_local(); /* start with known state */
flush_tlb_all_local(); flush_tlb_all_local(NULL);
for (i = 0; i < npmem_ranges; i++) { for (i = 0; i < npmem_ranges; i++) {
unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0 }; unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0 };
...@@ -993,7 +992,7 @@ void flush_tlb_all(void) ...@@ -993,7 +992,7 @@ void flush_tlb_all(void)
do_recycle++; do_recycle++;
} }
spin_unlock(&sid_lock); spin_unlock(&sid_lock);
on_each_cpu((void (*)(void *))flush_tlb_all_local, NULL, 1, 1); on_each_cpu(flush_tlb_all_local, NULL, 1, 1);
if (do_recycle) { if (do_recycle) {
spin_lock(&sid_lock); spin_lock(&sid_lock);
recycle_sids(recycle_ndirty,recycle_dirty_array); recycle_sids(recycle_ndirty,recycle_dirty_array);
......
...@@ -1423,7 +1423,7 @@ static void __init ccio_init_resources(struct ioc *ioc) ...@@ -1423,7 +1423,7 @@ static void __init ccio_init_resources(struct ioc *ioc)
struct resource *res = ioc->mmio_region; struct resource *res = ioc->mmio_region;
char *name = kmalloc(14, GFP_KERNEL); char *name = kmalloc(14, GFP_KERNEL);
sprintf(name, "GSC Bus [%d/]", ioc->hw_path); snprintf(name, 14, "GSC Bus [%d/]", ioc->hw_path);
ccio_init_resource(res, name, &ioc->ioc_regs->io_io_low); ccio_init_resource(res, name, &ioc->ioc_regs->io_io_low);
ccio_init_resource(res + 1, name, &ioc->ioc_regs->io_io_low_hv); ccio_init_resource(res + 1, name, &ioc->ioc_regs->io_io_low_hv);
...@@ -1557,12 +1557,11 @@ static int ccio_probe(struct parisc_device *dev) ...@@ -1557,12 +1557,11 @@ static int ccio_probe(struct parisc_device *dev)
int i; int i;
struct ioc *ioc, **ioc_p = &ioc_list; struct ioc *ioc, **ioc_p = &ioc_list;
ioc = kmalloc(sizeof(struct ioc), GFP_KERNEL); ioc = kzalloc(sizeof(struct ioc), GFP_KERNEL);
if (ioc == NULL) { if (ioc == NULL) {
printk(KERN_ERR MODULE_NAME ": memory allocation failure\n"); printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");
return 1; return 1;
} }
memset(ioc, 0, sizeof(struct ioc));
ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn"; ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";
...@@ -1578,7 +1577,7 @@ static int ccio_probe(struct parisc_device *dev) ...@@ -1578,7 +1577,7 @@ static int ccio_probe(struct parisc_device *dev)
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;
dev->dev.platform_data = kmalloc(sizeof(struct pci_hba_data), GFP_KERNEL); dev->dev.platform_data = kzalloc(sizeof(struct pci_hba_data), GFP_KERNEL);
/* if this fails, no I/O cards will work, so may as well bug */ /* if this fails, no I/O cards will work, so may as well bug */
BUG_ON(dev->dev.platform_data == NULL); BUG_ON(dev->dev.platform_data == NULL);
......
...@@ -989,14 +989,12 @@ static int __init dino_probe(struct parisc_device *dev) ...@@ -989,14 +989,12 @@ static int __init dino_probe(struct parisc_device *dev)
*/ */
} }
dino_dev = kmalloc(sizeof(struct dino_device), GFP_KERNEL); dino_dev = kzalloc(sizeof(struct dino_device), GFP_KERNEL);
if (!dino_dev) { if (!dino_dev) {
printk("dino_init_chip - couldn't alloc dino_device\n"); printk("dino_init_chip - couldn't alloc dino_device\n");
return 1; return 1;
} }
memset(dino_dev, 0, sizeof(struct dino_device));
dino_dev->hba.dev = dev; dino_dev->hba.dev = dev;
dino_dev->hba.base_addr = ioremap(hpa, 4096); 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 */
......
...@@ -60,12 +60,11 @@ static int hppb_probe(struct parisc_device *dev) ...@@ -60,12 +60,11 @@ static int hppb_probe(struct parisc_device *dev)
} }
if(card->hpa) { if(card->hpa) {
card->next = kmalloc(sizeof(struct hppb_card), GFP_KERNEL); card->next = kzalloc(sizeof(struct hppb_card), GFP_KERNEL);
if(!card->next) { if(!card->next) {
printk(KERN_ERR "HP-PB: Unable to allocate memory.\n"); printk(KERN_ERR "HP-PB: Unable to allocate memory.\n");
return 1; return 1;
} }
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.start); printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa.start);
......
...@@ -873,28 +873,24 @@ void *iosapic_register(unsigned long hpa) ...@@ -873,28 +873,24 @@ void *iosapic_register(unsigned long hpa)
return NULL; return NULL;
} }
isi = (struct iosapic_info *)kmalloc(sizeof(struct iosapic_info), GFP_KERNEL); isi = (struct iosapic_info *)kzalloc(sizeof(struct iosapic_info), GFP_KERNEL);
if (!isi) { if (!isi) {
BUG(); BUG();
return NULL; return NULL;
} }
memset(isi, 0, sizeof(struct iosapic_info));
isi->addr = ioremap(hpa, 4096); isi->addr = ioremap(hpa, 4096);
isi->isi_hpa = hpa; isi->isi_hpa = hpa;
isi->isi_version = iosapic_rd_version(isi); isi->isi_version = iosapic_rd_version(isi);
isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1; isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1;
vip = isi->isi_vector = (struct vector_info *) vip = isi->isi_vector = (struct vector_info *)
kmalloc(sizeof(struct vector_info) * isi->isi_num_vectors, GFP_KERNEL); kzalloc(sizeof(struct vector_info) * isi->isi_num_vectors, GFP_KERNEL);
if (vip == NULL) { if (vip == NULL) {
kfree(isi); kfree(isi);
return NULL; return NULL;
} }
memset(vip, 0, sizeof(struct vector_info) * isi->isi_num_vectors);
for (cnt=0; cnt < isi->isi_num_vectors; cnt++, vip++) { for (cnt=0; cnt < isi->isi_num_vectors; cnt++, vip++) {
vip->irqline = (unsigned char) cnt; vip->irqline = (unsigned char) cnt;
vip->iosapic = isi; vip->iosapic = isi;
......
...@@ -166,11 +166,12 @@ static void lasi_power_off(void) ...@@ -166,11 +166,12 @@ static void lasi_power_off(void)
int __init int __init
lasi_init_chip(struct parisc_device *dev) lasi_init_chip(struct parisc_device *dev)
{ {
extern void (*chassis_power_off)(void);
struct gsc_asic *lasi; struct gsc_asic *lasi;
struct gsc_irq gsc_irq; struct gsc_irq gsc_irq;
int ret; int ret;
lasi = kmalloc(sizeof(*lasi), GFP_KERNEL); lasi = kzalloc(sizeof(*lasi), GFP_KERNEL);
if (!lasi) if (!lasi)
return -ENOMEM; return -ENOMEM;
...@@ -222,7 +223,7 @@ lasi_init_chip(struct parisc_device *dev) ...@@ -222,7 +223,7 @@ lasi_init_chip(struct parisc_device *dev)
* ensure that only the first LASI (the one controlling the power off) * ensure that only the first LASI (the one controlling the power off)
* should set the HPA here */ * should set the HPA here */
lasi_power_off_hpa = lasi->hpa; lasi_power_off_hpa = lasi->hpa;
pm_power_off = lasi_power_off; chassis_power_off = lasi_power_off;
return ret; return ret;
} }
......
...@@ -1565,7 +1565,7 @@ lba_driver_probe(struct parisc_device *dev) ...@@ -1565,7 +1565,7 @@ lba_driver_probe(struct parisc_device *dev)
} else if (IS_MERCURY(dev) || IS_QUICKSILVER(dev)) { } else if (IS_MERCURY(dev) || IS_QUICKSILVER(dev)) {
func_class &= 0xff; func_class &= 0xff;
version = kmalloc(6, GFP_KERNEL); version = kmalloc(6, GFP_KERNEL);
sprintf(version,"TR%d.%d",(func_class >> 4),(func_class & 0xf)); snprintf(version, 6, "TR%d.%d",(func_class >> 4),(func_class & 0xf));
/* We could use one printk for both Elroy and Mercury, /* We could use one printk for both Elroy and Mercury,
* but for the mask for func_class. * but for the mask for func_class.
*/ */
...@@ -1586,14 +1586,12 @@ lba_driver_probe(struct parisc_device *dev) ...@@ -1586,14 +1586,12 @@ lba_driver_probe(struct parisc_device *dev)
** have an IRT entry will get NULL back from iosapic code. ** have an IRT entry will get NULL back from iosapic code.
*/ */
lba_dev = kmalloc(sizeof(struct lba_device), GFP_KERNEL); lba_dev = kzalloc(sizeof(struct lba_device), GFP_KERNEL);
if (!lba_dev) { if (!lba_dev) {
printk(KERN_ERR "lba_init_chip - couldn't alloc lba_device\n"); printk(KERN_ERR "lba_init_chip - couldn't alloc lba_device\n");
return(1); return(1);
} }
memset(lba_dev, 0, sizeof(struct lba_device));
/* ---------- First : initialize data we already have --------- */ /* ---------- First : initialize data we already have --------- */
......
/* /*
* Interfaces to retrieve and set PDC Stable options (firmware) * Interfaces to retrieve and set PDC Stable options (firmware)
* *
* Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org> * Copyright (C) 2005-2006 Thibaut VARENE <varenet@parisc-linux.org>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -26,11 +26,19 @@ ...@@ -26,11 +26,19 @@
* *
* Since locations between 96 and 192 are the various paths, most (if not * Since locations between 96 and 192 are the various paths, most (if not
* all) PA-RISC machines should have them. Anyway, for safety reasons, the * all) PA-RISC machines should have them. Anyway, for safety reasons, the
* following code can deal with only 96 bytes of Stable Storage, and all * following code can deal with just 96 bytes of Stable Storage, and all
* sizes between 96 and 192 bytes (provided they are multiple of struct * sizes between 96 and 192 bytes (provided they are multiple of struct
* device_path size, eg: 128, 160 and 192) to provide full information. * device_path size, eg: 128, 160 and 192) to provide full information.
* The code makes no use of data above 192 bytes. One last word: there's one * The code makes no use of data above 192 bytes. One last word: there's one
* path we can always count on: the primary path. * path we can always count on: the primary path.
*
* The current policy wrt file permissions is:
* - write: root only
* - read: (reading triggers PDC calls) ? root only : everyone
* The rationale is that PDC calls could hog (DoS) the machine.
*
* TODO:
* - timer/fastsize write calls
*/ */
#undef PDCS_DEBUG #undef PDCS_DEBUG
...@@ -50,13 +58,15 @@ ...@@ -50,13 +58,15 @@
#include <linux/kobject.h> #include <linux/kobject.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/spinlock.h>
#include <asm/pdc.h> #include <asm/pdc.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#define PDCS_VERSION "0.10" #define PDCS_VERSION "0.22"
#define PDCS_PREFIX "PDC Stable Storage"
#define PDCS_ADDR_PPRI 0x00 #define PDCS_ADDR_PPRI 0x00
#define PDCS_ADDR_OSID 0x40 #define PDCS_ADDR_OSID 0x40
...@@ -70,10 +80,12 @@ MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data"); ...@@ -70,10 +80,12 @@ MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_VERSION(PDCS_VERSION); MODULE_VERSION(PDCS_VERSION);
/* holds Stable Storage size. Initialized once and for all, no lock needed */
static unsigned long pdcs_size __read_mostly; static unsigned long pdcs_size __read_mostly;
/* This struct defines what we need to deal with a parisc pdc path entry */ /* This struct defines what we need to deal with a parisc pdc path entry */
struct pdcspath_entry { struct pdcspath_entry {
rwlock_t rw_lock; /* to protect path entry access */
short ready; /* entry record is valid if != 0 */ short ready; /* entry record is valid if != 0 */
unsigned long addr; /* entry address in stable storage */ unsigned long addr; /* entry address in stable storage */
char *name; /* entry name */ char *name; /* entry name */
...@@ -121,6 +133,8 @@ struct pdcspath_attribute paths_attr_##_name = { \ ...@@ -121,6 +133,8 @@ struct pdcspath_attribute paths_attr_##_name = { \
* content of the stable storage WRT various paths in these structs. We read * content of the stable storage WRT various paths in these structs. We read
* these structs when reading the files, and we will write to these structs when * these structs when reading the files, and we will write to these structs when
* writing to the files, and only then write them back to the Stable Storage. * writing to the files, and only then write them back to the Stable Storage.
*
* This function expects to be called with @entry->rw_lock write-hold.
*/ */
static int static int
pdcspath_fetch(struct pdcspath_entry *entry) pdcspath_fetch(struct pdcspath_entry *entry)
...@@ -160,14 +174,15 @@ pdcspath_fetch(struct pdcspath_entry *entry) ...@@ -160,14 +174,15 @@ pdcspath_fetch(struct pdcspath_entry *entry)
* pointer, from which it'll find out the corresponding hardware path. * pointer, from which it'll find out the corresponding hardware path.
* For now we do not handle the case where there's an error in writing to the * For now we do not handle the case where there's an error in writing to the
* Stable Storage area, so you'd better not mess up the data :P * Stable Storage area, so you'd better not mess up the data :P
*
* This function expects to be called with @entry->rw_lock write-hold.
*/ */
static int static void
pdcspath_store(struct pdcspath_entry *entry) pdcspath_store(struct pdcspath_entry *entry)
{ {
struct device_path *devpath; struct device_path *devpath;
if (!entry) BUG_ON(!entry);
return -EINVAL;
devpath = &entry->devpath; devpath = &entry->devpath;
...@@ -176,10 +191,8 @@ pdcspath_store(struct pdcspath_entry *entry) ...@@ -176,10 +191,8 @@ pdcspath_store(struct pdcspath_entry *entry)
First case, we don't have a preset hwpath... */ First case, we don't have a preset hwpath... */
if (!entry->ready) { if (!entry->ready) {
/* ...but we have a device, map it */ /* ...but we have a device, map it */
if (entry->dev) BUG_ON(!entry->dev);
device_to_hwpath(entry->dev, (struct hardware_path *)devpath); device_to_hwpath(entry->dev, (struct hardware_path *)devpath);
else
return -EINVAL;
} }
/* else, we expect the provided hwpath to be valid. */ /* else, we expect the provided hwpath to be valid. */
...@@ -191,15 +204,13 @@ pdcspath_store(struct pdcspath_entry *entry) ...@@ -191,15 +204,13 @@ pdcspath_store(struct pdcspath_entry *entry)
printk(KERN_ERR "%s: an error occured when writing to PDC.\n" printk(KERN_ERR "%s: an error occured when writing to PDC.\n"
"It is likely that the Stable Storage data has been corrupted.\n" "It is likely that the Stable Storage data has been corrupted.\n"
"Please check it carefully upon next reboot.\n", __func__); "Please check it carefully upon next reboot.\n", __func__);
return -EIO; WARN_ON(1);
} }
/* kobject is already registered */ /* kobject is already registered */
entry->ready = 2; entry->ready = 2;
DPRINTK("%s: device: 0x%p\n", __func__, entry->dev); DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
return 0;
} }
/** /**
...@@ -214,14 +225,17 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf) ...@@ -214,14 +225,17 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf)
{ {
char *out = buf; char *out = buf;
struct device_path *devpath; struct device_path *devpath;
unsigned short i; short i;
if (!entry || !buf) if (!entry || !buf)
return -EINVAL; return -EINVAL;
read_lock(&entry->rw_lock);
devpath = &entry->devpath; devpath = &entry->devpath;
i = entry->ready;
read_unlock(&entry->rw_lock);
if (!entry->ready) if (!i) /* entry is not ready */
return -ENODATA; return -ENODATA;
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {
...@@ -242,7 +256,7 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf) ...@@ -242,7 +256,7 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf)
* *
* We will call this function to change the current hardware path. * We will call this function to change the current hardware path.
* Hardware paths are to be given '/'-delimited, without brackets. * Hardware paths are to be given '/'-delimited, without brackets.
* We take care to make sure that the provided path actually maps to an existing * We make sure that the provided path actually maps to an existing
* device, BUT nothing would prevent some foolish user to set the path to some * device, BUT nothing would prevent some foolish user to set the path to some
* PCI bridge or even a CPU... * PCI bridge or even a CPU...
* A better work around would be to make sure we are at the end of a device tree * A better work around would be to make sure we are at the end of a device tree
...@@ -298,17 +312,19 @@ pdcspath_hwpath_write(struct pdcspath_entry *entry, const char *buf, size_t coun ...@@ -298,17 +312,19 @@ pdcspath_hwpath_write(struct pdcspath_entry *entry, const char *buf, size_t coun
} }
/* So far so good, let's get in deep */ /* So far so good, let's get in deep */
write_lock(&entry->rw_lock);
entry->ready = 0; entry->ready = 0;
entry->dev = dev; entry->dev = dev;
/* Now, dive in. Write back to the hardware */ /* Now, dive in. Write back to the hardware */
WARN_ON(pdcspath_store(entry)); /* this warn should *NEVER* happen */ pdcspath_store(entry);
/* Update the symlink to the real device */ /* Update the symlink to the real device */
sysfs_remove_link(&entry->kobj, "device"); sysfs_remove_link(&entry->kobj, "device");
sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device");
write_unlock(&entry->rw_lock);
printk(KERN_INFO "PDC Stable Storage: changed \"%s\" path to \"%s\"\n", printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" path to \"%s\"\n",
entry->name, buf); entry->name, buf);
return count; return count;
...@@ -326,14 +342,17 @@ pdcspath_layer_read(struct pdcspath_entry *entry, char *buf) ...@@ -326,14 +342,17 @@ pdcspath_layer_read(struct pdcspath_entry *entry, char *buf)
{ {
char *out = buf; char *out = buf;
struct device_path *devpath; struct device_path *devpath;
unsigned short i; short i;
if (!entry || !buf) if (!entry || !buf)
return -EINVAL; return -EINVAL;
read_lock(&entry->rw_lock);
devpath = &entry->devpath; devpath = &entry->devpath;
i = entry->ready;
read_unlock(&entry->rw_lock);
if (!entry->ready) if (!i) /* entry is not ready */
return -ENODATA; return -ENODATA;
for (i = 0; devpath->layers[i] && (likely(i < 6)); i++) for (i = 0; devpath->layers[i] && (likely(i < 6)); i++)
...@@ -388,15 +407,17 @@ pdcspath_layer_write(struct pdcspath_entry *entry, const char *buf, size_t count ...@@ -388,15 +407,17 @@ pdcspath_layer_write(struct pdcspath_entry *entry, const char *buf, size_t count
} }
/* So far so good, let's get in deep */ /* So far so good, let's get in deep */
write_lock(&entry->rw_lock);
/* First, overwrite the current layers with the new ones, not touching /* First, overwrite the current layers with the new ones, not touching
the hardware path. */ the hardware path. */
memcpy(&entry->devpath.layers, &layers, sizeof(layers)); memcpy(&entry->devpath.layers, &layers, sizeof(layers));
/* Now, dive in. Write back to the hardware */ /* Now, dive in. Write back to the hardware */
WARN_ON(pdcspath_store(entry)); /* this warn should *NEVER* happen */ pdcspath_store(entry);
write_unlock(&entry->rw_lock);
printk(KERN_INFO "PDC Stable Storage: changed \"%s\" layers to \"%s\"\n", printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" layers to \"%s\"\n",
entry->name, buf); entry->name, buf);
return count; return count;
...@@ -415,9 +436,6 @@ pdcspath_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) ...@@ -415,9 +436,6 @@ pdcspath_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
struct pdcspath_attribute *pdcs_attr = to_pdcspath_attribute(attr); struct pdcspath_attribute *pdcs_attr = to_pdcspath_attribute(attr);
ssize_t ret = 0; ssize_t ret = 0;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
if (pdcs_attr->show) if (pdcs_attr->show)
ret = pdcs_attr->show(entry, buf); ret = pdcs_attr->show(entry, buf);
...@@ -454,8 +472,8 @@ static struct sysfs_ops pdcspath_attr_ops = { ...@@ -454,8 +472,8 @@ static struct sysfs_ops pdcspath_attr_ops = {
}; };
/* These are the two attributes of any PDC path. */ /* These are the two attributes of any PDC path. */
static PATHS_ATTR(hwpath, 0600, pdcspath_hwpath_read, pdcspath_hwpath_write); static PATHS_ATTR(hwpath, 0644, pdcspath_hwpath_read, pdcspath_hwpath_write);
static PATHS_ATTR(layer, 0600, pdcspath_layer_read, pdcspath_layer_write); static PATHS_ATTR(layer, 0644, pdcspath_layer_read, pdcspath_layer_write);
static struct attribute *paths_subsys_attrs[] = { static struct attribute *paths_subsys_attrs[] = {
&paths_attr_hwpath.attr, &paths_attr_hwpath.attr,
...@@ -484,36 +502,119 @@ static struct pdcspath_entry *pdcspath_entries[] = { ...@@ -484,36 +502,119 @@ static struct pdcspath_entry *pdcspath_entries[] = {
NULL, NULL,
}; };
/* For more insight of what's going on here, refer to PDC Procedures doc,
* Section PDC_STABLE */
/** /**
* pdcs_info_read - Pretty printing of the remaining useful data. * pdcs_size_read - Stable Storage size output.
* @entry: An allocated and populated subsytem struct. We don't use it tho. * @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to. * @buf: The output buffer to write to.
*
* We will call this function to format the output of the 'info' attribute file.
* Please refer to PDC Procedures documentation, section PDC_STABLE to get a
* better insight of what we're doing here.
*/ */
static ssize_t static ssize_t
pdcs_info_read(struct subsystem *entry, char *buf) pdcs_size_read(struct subsystem *entry, char *buf)
{ {
char *out = buf; char *out = buf;
__u32 result;
struct device_path devpath;
char *tmpstr = NULL;
if (!entry || !buf) if (!entry || !buf)
return -EINVAL; return -EINVAL;
/* show the size of the stable storage */ /* show the size of the stable storage */
out += sprintf(out, "Stable Storage size: %ld bytes\n", pdcs_size); out += sprintf(out, "%ld\n", pdcs_size);
/* deal with flags */ return out - buf;
if (pdc_stable_read(PDCS_ADDR_PPRI, &devpath, sizeof(devpath)) != PDC_OK) }
return -EIO;
/**
* pdcs_auto_read - Stable Storage autoboot/search flag output.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to.
* @knob: The PF_AUTOBOOT or PF_AUTOSEARCH flag
*/
static ssize_t
pdcs_auto_read(struct subsystem *entry, char *buf, int knob)
{
char *out = buf;
struct pdcspath_entry *pathentry;
if (!entry || !buf)
return -EINVAL;
/* Current flags are stored in primary boot path entry */
pathentry = &pdcspath_entry_primary;
read_lock(&pathentry->rw_lock);
out += sprintf(out, "%s\n", (pathentry->devpath.flags & knob) ?
"On" : "Off");
read_unlock(&pathentry->rw_lock);
return out - buf;
}
/**
* pdcs_autoboot_read - Stable Storage autoboot flag output.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to.
*/
static inline ssize_t
pdcs_autoboot_read(struct subsystem *entry, char *buf)
{
return pdcs_auto_read(entry, buf, PF_AUTOBOOT);
}
/**
* pdcs_autosearch_read - Stable Storage autoboot flag output.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to.
*/
static inline ssize_t
pdcs_autosearch_read(struct subsystem *entry, char *buf)
{
return pdcs_auto_read(entry, buf, PF_AUTOSEARCH);
}
/**
* pdcs_timer_read - Stable Storage timer count output (in seconds).
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to.
*
* The value of the timer field correponds to a number of seconds in powers of 2.
*/
static ssize_t
pdcs_timer_read(struct subsystem *entry, char *buf)
{
char *out = buf;
struct pdcspath_entry *pathentry;
if (!entry || !buf)
return -EINVAL;
/* Current flags are stored in primary boot path entry */
pathentry = &pdcspath_entry_primary;
/* print the timer value in seconds */
read_lock(&pathentry->rw_lock);
out += sprintf(out, "%u\n", (pathentry->devpath.flags & PF_TIMER) ?
(1 << (pathentry->devpath.flags & PF_TIMER)) : 0);
read_unlock(&pathentry->rw_lock);
out += sprintf(out, "Autoboot: %s\n", (devpath.flags & PF_AUTOBOOT) ? "On" : "Off"); return out - buf;
out += sprintf(out, "Autosearch: %s\n", (devpath.flags & PF_AUTOSEARCH) ? "On" : "Off"); }
out += sprintf(out, "Timer: %u s\n", (devpath.flags & PF_TIMER) ? (1 << (devpath.flags & PF_TIMER)) : 0);
/**
* pdcs_osid_read - Stable Storage OS ID register output.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to.
*/
static ssize_t
pdcs_osid_read(struct subsystem *entry, char *buf)
{
char *out = buf;
__u32 result;
char *tmpstr = NULL;
if (!entry || !buf)
return -EINVAL;
/* get OSID */ /* get OSID */
if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK) if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK)
...@@ -529,13 +630,31 @@ pdcs_info_read(struct subsystem *entry, char *buf) ...@@ -529,13 +630,31 @@ pdcs_info_read(struct subsystem *entry, char *buf)
case 0x0005: tmpstr = "Novell Netware dependent data"; break; case 0x0005: tmpstr = "Novell Netware dependent data"; break;
default: tmpstr = "Unknown"; break; default: tmpstr = "Unknown"; break;
} }
out += sprintf(out, "OS ID: %s (0x%.4x)\n", tmpstr, (result >> 16)); out += sprintf(out, "%s (0x%.4x)\n", tmpstr, (result >> 16));
return out - buf;
}
/**
* pdcs_fastsize_read - Stable Storage FastSize register output.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The output buffer to write to.
*
* This register holds the amount of system RAM to be tested during boot sequence.
*/
static ssize_t
pdcs_fastsize_read(struct subsystem *entry, char *buf)
{
char *out = buf;
__u32 result;
if (!entry || !buf)
return -EINVAL;
/* get fast-size */ /* get fast-size */
if (pdc_stable_read(PDCS_ADDR_FSIZ, &result, sizeof(result)) != PDC_OK) if (pdc_stable_read(PDCS_ADDR_FSIZ, &result, sizeof(result)) != PDC_OK)
return -EIO; return -EIO;
out += sprintf(out, "Memory tested: ");
if ((result & 0x0F) < 0x0E) if ((result & 0x0F) < 0x0E)
out += sprintf(out, "%d kB", (1<<(result & 0x0F))*256); out += sprintf(out, "%d kB", (1<<(result & 0x0F))*256);
else else
...@@ -546,22 +665,18 @@ pdcs_info_read(struct subsystem *entry, char *buf) ...@@ -546,22 +665,18 @@ pdcs_info_read(struct subsystem *entry, char *buf)
} }
/** /**
* pdcs_info_write - This function handles boot flag modifying. * pdcs_auto_write - This function handles autoboot/search flag modifying.
* @entry: An allocated and populated subsytem struct. We don't use it tho. * @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The input buffer to read from. * @buf: The input buffer to read from.
* @count: The number of bytes to be read. * @count: The number of bytes to be read.
* @knob: The PF_AUTOBOOT or PF_AUTOSEARCH flag
* *
* We will call this function to change the current boot flags. * We will call this function to change the current autoboot flag.
* We expect a precise syntax: * We expect a precise syntax:
* \"n n\" (n == 0 or 1) to toggle respectively AutoBoot and AutoSearch * \"n\" (n == 0 or 1) to toggle AutoBoot Off or On
*
* As of now there is no incentive on my side to provide more "knobs" to that
* interface, since modifying the rest of the data is pretty meaningless when
* the machine is running and for the expected use of that facility, such as
* PALO setting up the boot disk when installing a Linux distribution...
*/ */
static ssize_t static ssize_t
pdcs_info_write(struct subsystem *entry, const char *buf, size_t count) pdcs_auto_write(struct subsystem *entry, const char *buf, size_t count, int knob)
{ {
struct pdcspath_entry *pathentry; struct pdcspath_entry *pathentry;
unsigned char flags; unsigned char flags;
...@@ -582,7 +697,9 @@ pdcs_info_write(struct subsystem *entry, const char *buf, size_t count) ...@@ -582,7 +697,9 @@ pdcs_info_write(struct subsystem *entry, const char *buf, size_t count)
pathentry = &pdcspath_entry_primary; pathentry = &pdcspath_entry_primary;
/* Be nice to the existing flag record */ /* Be nice to the existing flag record */
read_lock(&pathentry->rw_lock);
flags = pathentry->devpath.flags; flags = pathentry->devpath.flags;
read_unlock(&pathentry->rw_lock);
DPRINTK("%s: flags before: 0x%X\n", __func__, flags); DPRINTK("%s: flags before: 0x%X\n", __func__, flags);
...@@ -595,50 +712,85 @@ pdcs_info_write(struct subsystem *entry, const char *buf, size_t count) ...@@ -595,50 +712,85 @@ pdcs_info_write(struct subsystem *entry, const char *buf, size_t count)
if ((c != 0) && (c != 1)) if ((c != 0) && (c != 1))
goto parse_error; goto parse_error;
if (c == 0) if (c == 0)
flags &= ~PF_AUTOBOOT; flags &= ~knob;
else
flags |= PF_AUTOBOOT;
if (*temp++ != ' ')
goto parse_error;
c = *temp++ - '0';
if ((c != 0) && (c != 1))
goto parse_error;
if (c == 0)
flags &= ~PF_AUTOSEARCH;
else else
flags |= PF_AUTOSEARCH; flags |= knob;
DPRINTK("%s: flags after: 0x%X\n", __func__, flags); DPRINTK("%s: flags after: 0x%X\n", __func__, flags);
/* So far so good, let's get in deep */ /* So far so good, let's get in deep */
write_lock(&pathentry->rw_lock);
/* Change the path entry flags first */ /* Change the path entry flags first */
pathentry->devpath.flags = flags; pathentry->devpath.flags = flags;
/* Now, dive in. Write back to the hardware */ /* Now, dive in. Write back to the hardware */
WARN_ON(pdcspath_store(pathentry)); /* this warn should *NEVER* happen */ pdcspath_store(pathentry);
write_unlock(&pathentry->rw_lock);
printk(KERN_INFO "PDC Stable Storage: changed flags to \"%s\"\n", buf); printk(KERN_INFO PDCS_PREFIX ": changed \"%s\" to \"%s\"\n",
(knob & PF_AUTOBOOT) ? "autoboot" : "autosearch",
(flags & knob) ? "On" : "Off");
return count; return count;
parse_error: parse_error:
printk(KERN_WARNING "%s: Parse error: expect \"n n\" (n == 0 or 1) for AB and AS\n", __func__); printk(KERN_WARNING "%s: Parse error: expect \"n\" (n == 0 or 1)\n", __func__);
return -EINVAL; return -EINVAL;
} }
/* The last attribute (the 'root' one actually) with all remaining data. */ /**
static PDCS_ATTR(info, 0600, pdcs_info_read, pdcs_info_write); * pdcs_autoboot_write - This function handles autoboot flag modifying.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The input buffer to read from.
* @count: The number of bytes to be read.
*
* We will call this function to change the current boot flags.
* We expect a precise syntax:
* \"n\" (n == 0 or 1) to toggle AutoSearch Off or On
*/
static inline ssize_t
pdcs_autoboot_write(struct subsystem *entry, const char *buf, size_t count)
{
return pdcs_auto_write(entry, buf, count, PF_AUTOBOOT);
}
/**
* pdcs_autosearch_write - This function handles autosearch flag modifying.
* @entry: An allocated and populated subsytem struct. We don't use it tho.
* @buf: The input buffer to read from.
* @count: The number of bytes to be read.
*
* We will call this function to change the current boot flags.
* We expect a precise syntax:
* \"n\" (n == 0 or 1) to toggle AutoSearch Off or On
*/
static inline ssize_t
pdcs_autosearch_write(struct subsystem *entry, const char *buf, size_t count)
{
return pdcs_auto_write(entry, buf, count, PF_AUTOSEARCH);
}
/* The remaining attributes. */
static PDCS_ATTR(size, 0444, pdcs_size_read, NULL);
static PDCS_ATTR(autoboot, 0644, pdcs_autoboot_read, pdcs_autoboot_write);
static PDCS_ATTR(autosearch, 0644, pdcs_autosearch_read, pdcs_autosearch_write);
static PDCS_ATTR(timer, 0444, pdcs_timer_read, NULL);
static PDCS_ATTR(osid, 0400, pdcs_osid_read, NULL);
static PDCS_ATTR(fastsize, 0400, pdcs_fastsize_read, NULL);
static struct subsys_attribute *pdcs_subsys_attrs[] = { static struct subsys_attribute *pdcs_subsys_attrs[] = {
&pdcs_attr_info, &pdcs_attr_size,
NULL, /* maybe more in the future? */ &pdcs_attr_autoboot,
&pdcs_attr_autosearch,
&pdcs_attr_timer,
&pdcs_attr_osid,
&pdcs_attr_fastsize,
NULL,
}; };
static decl_subsys(paths, &ktype_pdcspath, NULL); static decl_subsys(paths, &ktype_pdcspath, NULL);
static decl_subsys(pdc, NULL, NULL); static decl_subsys(stable, NULL, NULL);
/** /**
* pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage. * pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage.
...@@ -656,8 +808,16 @@ pdcs_register_pathentries(void) ...@@ -656,8 +808,16 @@ pdcs_register_pathentries(void)
struct pdcspath_entry *entry; struct pdcspath_entry *entry;
int err; int err;
/* Initialize the entries rw_lock before anything else */
for (i = 0; (entry = pdcspath_entries[i]); i++)
rwlock_init(&entry->rw_lock);
for (i = 0; (entry = pdcspath_entries[i]); i++) { for (i = 0; (entry = pdcspath_entries[i]); i++) {
if (pdcspath_fetch(entry) < 0) write_lock(&entry->rw_lock);
err = pdcspath_fetch(entry);
write_unlock(&entry->rw_lock);
if (err < 0)
continue; continue;
if ((err = kobject_set_name(&entry->kobj, "%s", entry->name))) if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
...@@ -667,13 +827,14 @@ pdcs_register_pathentries(void) ...@@ -667,13 +827,14 @@ pdcs_register_pathentries(void)
return err; return err;
/* kobject is now registered */ /* kobject is now registered */
write_lock(&entry->rw_lock);
entry->ready = 2; entry->ready = 2;
if (!entry->dev)
continue;
/* Add a nice symlink to the real device */ /* Add a nice symlink to the real device */
if (entry->dev)
sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device"); sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device");
write_unlock(&entry->rw_lock);
} }
return 0; return 0;
...@@ -688,14 +849,17 @@ pdcs_unregister_pathentries(void) ...@@ -688,14 +849,17 @@ pdcs_unregister_pathentries(void)
unsigned short i; unsigned short i;
struct pdcspath_entry *entry; struct pdcspath_entry *entry;
for (i = 0; (entry = pdcspath_entries[i]); i++) for (i = 0; (entry = pdcspath_entries[i]); i++) {
read_lock(&entry->rw_lock);
if (entry->ready >= 2) if (entry->ready >= 2)
kobject_unregister(&entry->kobj); kobject_unregister(&entry->kobj);
read_unlock(&entry->rw_lock);
}
} }
/* /*
* For now we register the pdc subsystem with the firmware subsystem * For now we register the stable subsystem with the firmware subsystem
* and the paths subsystem with the pdc subsystem * and the paths subsystem with the stable subsystem
*/ */
static int __init static int __init
pdc_stable_init(void) pdc_stable_init(void)
...@@ -707,19 +871,23 @@ pdc_stable_init(void) ...@@ -707,19 +871,23 @@ pdc_stable_init(void)
if (pdc_stable_get_size(&pdcs_size) != PDC_OK) if (pdc_stable_get_size(&pdcs_size) != PDC_OK)
return -ENODEV; return -ENODEV;
printk(KERN_INFO "PDC Stable Storage facility v%s\n", PDCS_VERSION); /* make sure we have enough data */
if (pdcs_size < 96)
return -ENODATA;
printk(KERN_INFO PDCS_PREFIX " facility v%s\n", PDCS_VERSION);
/* For now we'll register the pdc subsys within this driver */ /* For now we'll register the stable subsys within this driver */
if ((rc = firmware_register(&pdc_subsys))) if ((rc = firmware_register(&stable_subsys)))
goto fail_firmreg; goto fail_firmreg;
/* Don't forget the info entry */ /* Don't forget the root entries */
for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++) for (i = 0; (attr = pdcs_subsys_attrs[i]) && !error; i++)
if (attr->show) if (attr->show)
error = subsys_create_file(&pdc_subsys, attr); error = subsys_create_file(&stable_subsys, attr);
/* register the paths subsys as a subsystem of pdc subsys */ /* register the paths subsys as a subsystem of stable subsys */
kset_set_kset_s(&paths_subsys, pdc_subsys); kset_set_kset_s(&paths_subsys, stable_subsys);
if ((rc= subsystem_register(&paths_subsys))) if ((rc= subsystem_register(&paths_subsys)))
goto fail_subsysreg; goto fail_subsysreg;
...@@ -734,10 +902,10 @@ pdc_stable_init(void) ...@@ -734,10 +902,10 @@ pdc_stable_init(void)
subsystem_unregister(&paths_subsys); subsystem_unregister(&paths_subsys);
fail_subsysreg: fail_subsysreg:
firmware_unregister(&pdc_subsys); firmware_unregister(&stable_subsys);
fail_firmreg: fail_firmreg:
printk(KERN_INFO "PDC Stable Storage bailing out\n"); printk(KERN_INFO PDCS_PREFIX " bailing out\n");
return rc; return rc;
} }
...@@ -747,7 +915,7 @@ pdc_stable_exit(void) ...@@ -747,7 +915,7 @@ pdc_stable_exit(void)
pdcs_unregister_pathentries(); pdcs_unregister_pathentries();
subsystem_unregister(&paths_subsys); subsystem_unregister(&paths_subsys);
firmware_unregister(&pdc_subsys); firmware_unregister(&stable_subsys);
} }
......
...@@ -2064,14 +2064,13 @@ sba_driver_callback(struct parisc_device *dev) ...@@ -2064,14 +2064,13 @@ 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.start); MODULE_NAME, version, dev->hpa.start);
sba_dev = kmalloc(sizeof(struct sba_device), GFP_KERNEL); sba_dev = kzalloc(sizeof(struct sba_device), GFP_KERNEL);
if (!sba_dev) { if (!sba_dev) {
printk(KERN_ERR MODULE_NAME " - couldn't alloc sba_device\n"); printk(KERN_ERR MODULE_NAME " - couldn't alloc sba_device\n");
return -ENOMEM; return -ENOMEM;
} }
parisc_set_drvdata(dev, sba_dev); parisc_set_drvdata(dev, sba_dev);
memset(sba_dev, 0, sizeof(struct sba_device));
for(i=0; i<MAX_IOC; i++) for(i=0; i<MAX_IOC; i++)
spin_lock_init(&(sba_dev->ioc[i].res_lock)); spin_lock_init(&(sba_dev->ioc[i].res_lock));
......
...@@ -89,6 +89,9 @@ static struct superio_device sio_dev; ...@@ -89,6 +89,9 @@ static struct superio_device sio_dev;
#define DBG_INIT(x...) #define DBG_INIT(x...)
#endif #endif
#define SUPERIO "SuperIO"
#define PFX SUPERIO ": "
static irqreturn_t static irqreturn_t
superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs) superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
{ {
...@@ -117,7 +120,7 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs) ...@@ -117,7 +120,7 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
local_irq = results & 0x0f; local_irq = results & 0x0f;
if (local_irq == 2 || local_irq > 7) { if (local_irq == 2 || local_irq > 7) {
printk(KERN_ERR "SuperIO: slave interrupted!\n"); printk(KERN_ERR PFX "slave interrupted!\n");
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -128,7 +131,7 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs) ...@@ -128,7 +131,7 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
outb(OCW3_ISR,IC_PIC1+0); outb(OCW3_ISR,IC_PIC1+0);
results = inb(IC_PIC1+0); results = inb(IC_PIC1+0);
if ((results & 0x80) == 0) { /* if ISR7 not set: spurious */ if ((results & 0x80) == 0) { /* if ISR7 not set: spurious */
printk(KERN_WARNING "SuperIO: spurious interrupt!\n"); printk(KERN_WARNING PFX "spurious interrupt!\n");
return IRQ_HANDLED; return IRQ_HANDLED;
} }
} }
...@@ -163,27 +166,27 @@ superio_init(struct pci_dev *pcidev) ...@@ -163,27 +166,27 @@ superio_init(struct pci_dev *pcidev)
/* ...then properly fixup the USB to point at suckyio PIC */ /* ...then properly fixup the USB to point at suckyio PIC */
sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev);
printk(KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", printk(KERN_INFO PFX "Found NS87560 Legacy I/O device at %s (IRQ %i) \n",
pci_name(pdev), pdev->irq); pci_name(pdev), pdev->irq);
pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base);
sio->sp1_base &= ~1; sio->sp1_base &= ~1;
printk (KERN_INFO "SuperIO: Serial port 1 at 0x%x\n", sio->sp1_base); printk(KERN_INFO PFX "Serial port 1 at 0x%x\n", sio->sp1_base);
pci_read_config_dword (pdev, SIO_SP2BAR, &sio->sp2_base); pci_read_config_dword (pdev, SIO_SP2BAR, &sio->sp2_base);
sio->sp2_base &= ~1; sio->sp2_base &= ~1;
printk (KERN_INFO "SuperIO: Serial port 2 at 0x%x\n", sio->sp2_base); printk(KERN_INFO PFX "Serial port 2 at 0x%x\n", sio->sp2_base);
pci_read_config_dword (pdev, SIO_PPBAR, &sio->pp_base); pci_read_config_dword (pdev, SIO_PPBAR, &sio->pp_base);
sio->pp_base &= ~1; sio->pp_base &= ~1;
printk (KERN_INFO "SuperIO: Parallel port at 0x%x\n", sio->pp_base); printk(KERN_INFO PFX "Parallel port at 0x%x\n", sio->pp_base);
pci_read_config_dword (pdev, SIO_FDCBAR, &sio->fdc_base); pci_read_config_dword (pdev, SIO_FDCBAR, &sio->fdc_base);
sio->fdc_base &= ~1; sio->fdc_base &= ~1;
printk (KERN_INFO "SuperIO: Floppy controller at 0x%x\n", sio->fdc_base); printk(KERN_INFO PFX "Floppy controller at 0x%x\n", sio->fdc_base);
pci_read_config_dword (pdev, SIO_ACPIBAR, &sio->acpi_base); pci_read_config_dword (pdev, SIO_ACPIBAR, &sio->acpi_base);
sio->acpi_base &= ~1; sio->acpi_base &= ~1;
printk (KERN_INFO "SuperIO: ACPI at 0x%x\n", sio->acpi_base); printk(KERN_INFO PFX "ACPI at 0x%x\n", sio->acpi_base);
request_region (IC_PIC1, 0x1f, "pic1"); request_region (IC_PIC1, 0x1f, "pic1");
request_region (IC_PIC2, 0x1f, "pic2"); request_region (IC_PIC2, 0x1f, "pic2");
...@@ -263,14 +266,14 @@ superio_init(struct pci_dev *pcidev) ...@@ -263,14 +266,14 @@ superio_init(struct pci_dev *pcidev)
/* Setup USB power regulation */ /* Setup USB power regulation */
outb(1, sio->acpi_base + USB_REG_CR); outb(1, sio->acpi_base + USB_REG_CR);
if (inb(sio->acpi_base + USB_REG_CR) & 1) if (inb(sio->acpi_base + USB_REG_CR) & 1)
printk(KERN_INFO "SuperIO: USB regulator enabled\n"); printk(KERN_INFO PFX "USB regulator enabled\n");
else else
printk(KERN_ERR "USB regulator not initialized!\n"); printk(KERN_ERR PFX "USB regulator not initialized!\n");
if (request_irq(pdev->irq, superio_interrupt, SA_INTERRUPT, if (request_irq(pdev->irq, superio_interrupt, SA_INTERRUPT,
"SuperIO", (void *)sio)) { SUPERIO, (void *)sio)) {
printk(KERN_ERR "SuperIO: could not get irq\n"); printk(KERN_ERR PFX "could not get irq\n");
BUG(); BUG();
return; return;
} }
...@@ -284,7 +287,7 @@ static void superio_disable_irq(unsigned int irq) ...@@ -284,7 +287,7 @@ static void superio_disable_irq(unsigned int irq)
u8 r8; u8 r8;
if ((irq < 1) || (irq == 2) || (irq > 7)) { if ((irq < 1) || (irq == 2) || (irq > 7)) {
printk(KERN_ERR "SuperIO: Illegal irq number.\n"); printk(KERN_ERR PFX "Illegal irq number.\n");
BUG(); BUG();
return; return;
} }
...@@ -301,7 +304,7 @@ static void superio_enable_irq(unsigned int irq) ...@@ -301,7 +304,7 @@ static void superio_enable_irq(unsigned int irq)
u8 r8; u8 r8;
if ((irq < 1) || (irq == 2) || (irq > 7)) { if ((irq < 1) || (irq == 2) || (irq > 7)) {
printk(KERN_ERR "SuperIO: Illegal irq number (%d).\n", irq); printk(KERN_ERR PFX "Illegal irq number (%d).\n", irq);
BUG(); BUG();
return; return;
} }
...@@ -319,7 +322,7 @@ static unsigned int superio_startup_irq(unsigned int irq) ...@@ -319,7 +322,7 @@ static unsigned int superio_startup_irq(unsigned int irq)
} }
static struct hw_interrupt_type superio_interrupt_type = { static struct hw_interrupt_type superio_interrupt_type = {
.typename = "SuperIO", .typename = SUPERIO,
.startup = superio_startup_irq, .startup = superio_startup_irq,
.shutdown = superio_disable_irq, .shutdown = superio_disable_irq,
.enable = superio_enable_irq, .enable = superio_enable_irq,
...@@ -413,7 +416,7 @@ static void __devinit superio_serial_init(void) ...@@ -413,7 +416,7 @@ static void __devinit superio_serial_init(void)
retval = early_serial_setup(&serial[0]); retval = early_serial_setup(&serial[0]);
if (retval < 0) { if (retval < 0) {
printk(KERN_WARNING "SuperIO: Register Serial #0 failed.\n"); printk(KERN_WARNING PFX "Register Serial #0 failed.\n");
return; return;
} }
...@@ -423,7 +426,7 @@ static void __devinit superio_serial_init(void) ...@@ -423,7 +426,7 @@ static void __devinit superio_serial_init(void)
retval = early_serial_setup(&serial[1]); retval = early_serial_setup(&serial[1]);
if (retval < 0) if (retval < 0)
printk(KERN_WARNING "SuperIO: Register Serial #1 failed.\n"); printk(KERN_WARNING PFX "Register Serial #1 failed.\n");
#endif /* CONFIG_SERIAL_8250 */ #endif /* CONFIG_SERIAL_8250 */
} }
...@@ -437,7 +440,7 @@ static void __devinit superio_parport_init(void) ...@@ -437,7 +440,7 @@ static void __devinit superio_parport_init(void)
PARPORT_DMA_NONE /* dma */, PARPORT_DMA_NONE /* dma */,
NULL /*struct pci_dev* */) ) NULL /*struct pci_dev* */) )
printk(KERN_WARNING "SuperIO: Probing parallel port failed.\n"); printk(KERN_WARNING PFX "Probing parallel port failed.\n");
#endif /* CONFIG_PARPORT_PC */ #endif /* CONFIG_PARPORT_PC */
} }
...@@ -499,7 +502,7 @@ static struct pci_device_id superio_tbl[] = { ...@@ -499,7 +502,7 @@ static struct pci_device_id superio_tbl[] = {
}; };
static struct pci_driver superio_driver = { static struct pci_driver superio_driver = {
.name = "SuperIO", .name = SUPERIO,
.id_table = superio_tbl, .id_table = superio_tbl,
.probe = superio_probe, .probe = superio_probe,
}; };
......
...@@ -76,7 +76,7 @@ wax_init_chip(struct parisc_device *dev) ...@@ -76,7 +76,7 @@ wax_init_chip(struct parisc_device *dev)
struct gsc_irq gsc_irq; struct gsc_irq gsc_irq;
int ret; int ret;
wax = kmalloc(sizeof(*wax), GFP_KERNEL); wax = kzalloc(sizeof(*wax), GFP_KERNEL);
if (!wax) if (!wax)
return -ENOMEM; return -ENOMEM;
......
...@@ -249,7 +249,7 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base, ...@@ -249,7 +249,7 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base,
struct parport tmp; struct parport tmp;
struct parport *p = &tmp; struct parport *p = &tmp;
priv = kmalloc (sizeof (struct parport_gsc_private), GFP_KERNEL); priv = kzalloc (sizeof (struct parport_gsc_private), GFP_KERNEL);
if (!priv) { if (!priv) {
printk (KERN_DEBUG "parport (0x%lx): no memory!\n", base); printk (KERN_DEBUG "parport (0x%lx): no memory!\n", base);
return NULL; return NULL;
......
...@@ -30,10 +30,11 @@ ...@@ -30,10 +30,11 @@
#define STI_DRIVERVERSION "Version 0.9a" #define STI_DRIVERVERSION "Version 0.9a"
struct sti_struct *default_sti; struct sti_struct *default_sti __read_mostly;
static int num_sti_roms; /* # of STI ROMS found */ /* number of STI ROMS found and their ptrs to each struct */
static struct sti_struct *sti_roms[MAX_STI_ROMS]; /* ptr to each sti_struct */ static int num_sti_roms __read_mostly;
static struct sti_struct *sti_roms[MAX_STI_ROMS] __read_mostly;
/* The colour indices used by STI are /* The colour indices used by STI are
...@@ -266,7 +267,7 @@ sti_rom_copy(unsigned long base, unsigned long count, void *dest) ...@@ -266,7 +267,7 @@ sti_rom_copy(unsigned long base, unsigned long count, void *dest)
static char default_sti_path[21]; static char default_sti_path[21] __read_mostly;
#ifndef MODULE #ifndef MODULE
static int __init sti_setup(char *str) static int __init sti_setup(char *str)
...@@ -414,10 +415,10 @@ sti_init_glob_cfg(struct sti_struct *sti, ...@@ -414,10 +415,10 @@ sti_init_glob_cfg(struct sti_struct *sti,
if (!sti->sti_mem_request) if (!sti->sti_mem_request)
sti->sti_mem_request = 256; /* STI default */ sti->sti_mem_request = 256; /* STI default */
glob_cfg = kmalloc(sizeof(*sti->glob_cfg), GFP_KERNEL); glob_cfg = kzalloc(sizeof(*sti->glob_cfg), GFP_KERNEL);
glob_cfg_ext = kmalloc(sizeof(*glob_cfg_ext), GFP_KERNEL); glob_cfg_ext = kzalloc(sizeof(*glob_cfg_ext), GFP_KERNEL);
save_addr = kmalloc(save_addr_size, GFP_KERNEL); save_addr = kzalloc(save_addr_size, GFP_KERNEL);
sti_mem_addr = kmalloc(sti->sti_mem_request, GFP_KERNEL); sti_mem_addr = kzalloc(sti->sti_mem_request, GFP_KERNEL);
if (!(glob_cfg && glob_cfg_ext && save_addr && sti_mem_addr)) { if (!(glob_cfg && glob_cfg_ext && save_addr && sti_mem_addr)) {
kfree(glob_cfg); kfree(glob_cfg);
...@@ -427,11 +428,6 @@ sti_init_glob_cfg(struct sti_struct *sti, ...@@ -427,11 +428,6 @@ sti_init_glob_cfg(struct sti_struct *sti,
return -ENOMEM; return -ENOMEM;
} }
memset(glob_cfg, 0, sizeof(*glob_cfg));
memset(glob_cfg_ext, 0, sizeof(*glob_cfg_ext));
memset(save_addr, 0, save_addr_size);
memset(sti_mem_addr, 0, sti->sti_mem_request);
glob_cfg->ext_ptr = STI_PTR(glob_cfg_ext); glob_cfg->ext_ptr = STI_PTR(glob_cfg_ext);
glob_cfg->save_addr = STI_PTR(save_addr); glob_cfg->save_addr = STI_PTR(save_addr);
for (i=0; i<8; i++) { for (i=0; i<8; i++) {
...@@ -502,9 +498,9 @@ sti_init_glob_cfg(struct sti_struct *sti, ...@@ -502,9 +498,9 @@ sti_init_glob_cfg(struct sti_struct *sti,
#ifdef CONFIG_FB #ifdef CONFIG_FB
struct sti_cooked_font * __init struct sti_cooked_font * __init
sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name ) sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
{ {
struct font_desc *fbfont; const struct font_desc *fbfont;
unsigned int size, bpc; unsigned int size, bpc;
void *dest; void *dest;
struct sti_rom_font *nf; struct sti_rom_font *nf;
...@@ -525,10 +521,9 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name ) ...@@ -525,10 +521,9 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
size = bpc * 256; size = bpc * 256;
size += sizeof(struct sti_rom_font); size += sizeof(struct sti_rom_font);
nf = kmalloc(size, GFP_KERNEL); nf = kzalloc(size, GFP_KERNEL);
if (!nf) if (!nf)
return NULL; return NULL;
memset(nf, 0, size);
nf->first_char = 0; nf->first_char = 0;
nf->last_char = 255; nf->last_char = 255;
...@@ -544,7 +539,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name ) ...@@ -544,7 +539,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
dest += sizeof(struct sti_rom_font); dest += sizeof(struct sti_rom_font);
memcpy(dest, fbfont->data, bpc*256); memcpy(dest, fbfont->data, bpc*256);
cooked_font = kmalloc(sizeof(*cooked_font), GFP_KERNEL); cooked_font = kzalloc(sizeof(*cooked_font), GFP_KERNEL);
if (!cooked_font) { if (!cooked_font) {
kfree(nf); kfree(nf);
return NULL; return NULL;
...@@ -559,7 +554,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name ) ...@@ -559,7 +554,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
} }
#else #else
struct sti_cooked_font * __init struct sti_cooked_font * __init
sti_select_fbfont(struct sti_cooked_rom *cooked_rom, char *fbfont_name) sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
{ {
return NULL; return NULL;
} }
...@@ -617,7 +612,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom, ...@@ -617,7 +612,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
struct sti_rom_font *raw_font, *font_start; struct sti_rom_font *raw_font, *font_start;
struct sti_cooked_font *cooked_font; struct sti_cooked_font *cooked_font;
cooked_font = kmalloc(sizeof(*cooked_font), GFP_KERNEL); cooked_font = kzalloc(sizeof(*cooked_font), GFP_KERNEL);
if (!cooked_font) if (!cooked_font)
return 0; return 0;
...@@ -631,7 +626,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom, ...@@ -631,7 +626,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
while (raw_font->next_font) { while (raw_font->next_font) {
raw_font = ((void *)font_start) + (raw_font->next_font); raw_font = ((void *)font_start) + (raw_font->next_font);
cooked_font->next_font = kmalloc(sizeof(*cooked_font), GFP_KERNEL); cooked_font->next_font = kzalloc(sizeof(*cooked_font), GFP_KERNEL);
if (!cooked_font->next_font) if (!cooked_font->next_font)
return 1; return 1;
...@@ -668,10 +663,9 @@ sti_bmode_font_raw(struct sti_cooked_font *f) ...@@ -668,10 +663,9 @@ sti_bmode_font_raw(struct sti_cooked_font *f)
unsigned char *n, *p, *q; unsigned char *n, *p, *q;
int size = f->raw->bytes_per_char*256+sizeof(struct sti_rom_font); int size = f->raw->bytes_per_char*256+sizeof(struct sti_rom_font);
n = kmalloc (4*size, GFP_KERNEL); n = kzalloc (4*size, GFP_KERNEL);
if (!n) if (!n)
return NULL; return NULL;
memset (n, 0, 4*size);
p = n + 3; p = n + 3;
q = (unsigned char *)f->raw; q = (unsigned char *)f->raw;
while (size--) { while (size--) {
...@@ -816,13 +810,12 @@ sti_try_rom_generic(unsigned long address, unsigned long hpa, struct pci_dev *pd ...@@ -816,13 +810,12 @@ sti_try_rom_generic(unsigned long address, unsigned long hpa, struct pci_dev *pd
return NULL; return NULL;
} }
sti = kmalloc(sizeof(*sti), GFP_KERNEL); sti = kzalloc(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));
spin_lock_init(&sti->lock); spin_lock_init(&sti->lock);
test_rom: test_rom:
...@@ -1035,7 +1028,7 @@ static struct parisc_driver pa_sti_driver = { ...@@ -1035,7 +1028,7 @@ static struct parisc_driver pa_sti_driver = {
* sti_init_roms() - detects all STI ROMs and stores them in sti_roms[] * sti_init_roms() - detects all STI ROMs and stores them in sti_roms[]
*/ */
static int sticore_initialized; static int sticore_initialized __read_mostly;
static void __init sti_init_roms(void) static void __init sti_init_roms(void)
{ {
......
/* Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
* Copyright (C) 2006 Kyle McMartin <kyle@parisc-linux.org>
*/
#ifndef _ASM_PARISC_ATOMIC_H_ #ifndef _ASM_PARISC_ATOMIC_H_
#define _ASM_PARISC_ATOMIC_H_ #define _ASM_PARISC_ATOMIC_H_
#include <linux/config.h> #include <linux/config.h>
#include <linux/types.h>
#include <asm/system.h> #include <asm/system.h>
/* Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>. */
/* /*
* Atomic operations that C can't guarantee us. Useful for * Atomic operations that C can't guarantee us. Useful for
...@@ -46,15 +50,6 @@ extern raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned; ...@@ -46,15 +50,6 @@ extern raw_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned;
# define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore(f); } while (0) # define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore(f); } while (0)
#endif #endif
/* Note that we need not lock read accesses - aligned word writes/reads
* are atomic, so a reader never sees unconsistent values.
*
* Cache-line alignment would conflict with, for example, linux/module.h
*/
typedef struct { volatile int counter; } atomic_t;
/* This should get optimized out since it's never called. /* This should get optimized out since it's never called.
** Or get a link error if xchg is used "wrong". ** Or get a link error if xchg is used "wrong".
*/ */
...@@ -69,10 +64,9 @@ extern unsigned long __xchg64(unsigned long, unsigned long *); ...@@ -69,10 +64,9 @@ extern unsigned long __xchg64(unsigned long, unsigned long *);
#endif #endif
/* optimizer better get rid of switch since size is a constant */ /* optimizer better get rid of switch since size is a constant */
static __inline__ unsigned long __xchg(unsigned long x, __volatile__ void * ptr, static __inline__ unsigned long
int size) __xchg(unsigned long x, __volatile__ void * ptr, int size)
{ {
switch(size) { switch(size) {
#ifdef __LP64__ #ifdef __LP64__
case 8: return __xchg64(x,(unsigned long *) ptr); case 8: return __xchg64(x,(unsigned long *) ptr);
...@@ -129,7 +123,13 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size) ...@@ -129,7 +123,13 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)
(unsigned long)_n_, sizeof(*(ptr))); \ (unsigned long)_n_, sizeof(*(ptr))); \
}) })
/* Note that we need not lock read accesses - aligned word writes/reads
* are atomic, so a reader never sees unconsistent values.
*
* Cache-line alignment would conflict with, for example, linux/module.h
*/
typedef struct { volatile int counter; } atomic_t;
/* It's possible to reduce all atomic operations to either /* It's possible to reduce all atomic operations to either
* __atomic_add_return, atomic_set and atomic_read (the latter * __atomic_add_return, atomic_set and atomic_read (the latter
...@@ -210,12 +210,66 @@ static __inline__ int atomic_read(const atomic_t *v) ...@@ -210,12 +210,66 @@ static __inline__ int atomic_read(const atomic_t *v)
#define atomic_dec_and_test(v) (atomic_dec_return(v) == 0) #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)
#define ATOMIC_INIT(i) { (i) } #define ATOMIC_INIT(i) ((atomic_t) { (i) })
#define smp_mb__before_atomic_dec() smp_mb() #define smp_mb__before_atomic_dec() smp_mb()
#define smp_mb__after_atomic_dec() smp_mb() #define smp_mb__after_atomic_dec() smp_mb()
#define smp_mb__before_atomic_inc() smp_mb() #define smp_mb__before_atomic_inc() smp_mb()
#define smp_mb__after_atomic_inc() smp_mb() #define smp_mb__after_atomic_inc() smp_mb()
#ifdef __LP64__
typedef struct { volatile s64 counter; } atomic64_t;
#define ATOMIC64_INIT(i) ((atomic64_t) { (i) })
static __inline__ int
__atomic64_add_return(s64 i, atomic64_t *v)
{
int ret;
unsigned long flags;
_atomic_spin_lock_irqsave(v, flags);
ret = (v->counter += i);
_atomic_spin_unlock_irqrestore(v, flags);
return ret;
}
static __inline__ void
atomic64_set(atomic64_t *v, s64 i)
{
unsigned long flags;
_atomic_spin_lock_irqsave(v, flags);
v->counter = i;
_atomic_spin_unlock_irqrestore(v, flags);
}
static __inline__ s64
atomic64_read(const atomic64_t *v)
{
return v->counter;
}
#define atomic64_add(i,v) ((void)(__atomic64_add_return( ((s64)i),(v))))
#define atomic64_sub(i,v) ((void)(__atomic64_add_return(-((s64)i),(v))))
#define atomic64_inc(v) ((void)(__atomic64_add_return( 1,(v))))
#define atomic64_dec(v) ((void)(__atomic64_add_return( -1,(v))))
#define atomic64_add_return(i,v) (__atomic64_add_return( ((s64)i),(v)))
#define atomic64_sub_return(i,v) (__atomic64_add_return(-((s64)i),(v)))
#define atomic64_inc_return(v) (__atomic64_add_return( 1,(v)))
#define atomic64_dec_return(v) (__atomic64_add_return( -1,(v)))
#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
#define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
#define atomic64_dec_and_test(v) (atomic64_dec_return(v) == 0)
#endif /* __LP64__ */
#include <asm-generic/atomic.h> #include <asm-generic/atomic.h>
#endif
#endif /* _ASM_PARISC_ATOMIC_H_ */
...@@ -183,4 +183,10 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long ...@@ -183,4 +183,10 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long
__flush_cache_page(vma, vmaddr); __flush_cache_page(vma, vmaddr);
} }
#ifdef CONFIG_DEBUG_RODATA
void mark_rodata_ro(void);
#endif #endif
#endif /* _PARISC_CACHEFLUSH_H */
#ifndef _ASM_PARISC_COMPAT_UCONTEXT_H #ifndef _ASM_PARISC_COMPAT_UCONTEXT_H
#define _ASM_PARISC_COMPAT_UCONTEXT_H #define _ASM_PARISC_COMPAT_UCONTEXT_H
#include<linux/compat.h> #include <linux/compat.h>
#include<asm/compat_signal.h>
/* 32-bit ucontext as seen from an 64-bit kernel */ /* 32-bit ucontext as seen from an 64-bit kernel */
struct compat_ucontext { struct compat_ucontext {
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
#define CRT_ID_ELK_1024DB 0x27849CA5 /* Elk 1024x768 double buffer */ #define CRT_ID_ELK_1024DB 0x27849CA5 /* Elk 1024x768 double buffer */
#define CRT_ID_ELK_GS S9000_ID_A1924A /* Elk 1280x1024 GreyScale */ #define CRT_ID_ELK_GS S9000_ID_A1924A /* Elk 1280x1024 GreyScale */
#define CRT_ID_CRX24 S9000_ID_A1439A /* Piranha */ #define CRT_ID_CRX24 S9000_ID_A1439A /* Piranha */
#define CRT_ID_VISUALIZE_EG 0x2D08C0A7 /* Graffiti (built-in B132+/B160L) */ #define CRT_ID_VISUALIZE_EG 0x2D08C0A7 /* Graffiti, A4450A (built-in B132+/B160L) */
#define CRT_ID_THUNDER 0x2F23E5FC /* Thunder 1 VISUALIZE 48*/ #define CRT_ID_THUNDER 0x2F23E5FC /* Thunder 1 VISUALIZE 48*/
#define CRT_ID_THUNDER2 0x2F8D570E /* Thunder 2 VISUALIZE 48 XP*/ #define CRT_ID_THUNDER2 0x2F8D570E /* Thunder 2 VISUALIZE 48 XP*/
#define CRT_ID_HCRX S9000_ID_HCRX /* Hyperdrive HCRX */ #define CRT_ID_HCRX S9000_ID_HCRX /* Hyperdrive HCRX */
......
...@@ -18,6 +18,18 @@ ...@@ -18,6 +18,18 @@
*/ */
#define PCI_MAX_BUSSES 256 #define PCI_MAX_BUSSES 256
/* To be used as: mdelay(pci_post_reset_delay);
*
* post_reset is the time the kernel should stall to prevent anyone from
* accessing the PCI bus once #RESET is de-asserted.
* PCI spec somewhere says 1 second but with multi-PCI bus systems,
* this makes the boot time much longer than necessary.
* 20ms seems to work for all the HP PCI implementations to date.
*/
#define pci_post_reset_delay 50
/* /*
** pci_hba_data (aka H2P_OBJECT in HP/UX) ** pci_hba_data (aka H2P_OBJECT in HP/UX)
** **
...@@ -83,7 +95,7 @@ static __inline__ int pci_is_lmmio(struct pci_hba_data *hba, unsigned long a) ...@@ -83,7 +95,7 @@ static __inline__ int pci_is_lmmio(struct pci_hba_data *hba, unsigned long a)
/* /*
** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses. ** Convert between PCI (IO_VIEW) addresses and processor (PA_VIEW) addresses.
** See pcibios.c for more conversions used by Generic PCI code. ** See pci.c for more conversions used by Generic PCI code.
** **
** Platform characteristics/firmware guarantee that ** Platform characteristics/firmware guarantee that
** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO ** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO
...@@ -191,9 +203,6 @@ struct pci_bios_ops { ...@@ -191,9 +203,6 @@ struct pci_bios_ops {
*/ */
extern struct pci_port_ops *pci_port; extern struct pci_port_ops *pci_port;
extern struct pci_bios_ops *pci_bios; extern struct pci_bios_ops *pci_bios;
extern int pci_post_reset_delay; /* delay after de-asserting #RESET */
extern int pci_hba_count;
extern struct pci_hba_data *parisc_pci_hba[];
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
extern void pcibios_register_hba(struct pci_hba_data *); extern void pcibios_register_hba(struct pci_hba_data *);
......
...@@ -137,7 +137,6 @@ static inline void pte_free_kernel(pte_t *pte) ...@@ -137,7 +137,6 @@ static inline void pte_free_kernel(pte_t *pte)
#define pte_free(page) pte_free_kernel(page_address(page)) #define pte_free(page) pte_free_kernel(page_address(page))
extern int do_check_pgt_cache(int, int);
#define check_pgt_cache() do { } while (0) #define check_pgt_cache() do { } while (0)
#endif #endif
...@@ -213,7 +213,7 @@ extern void *vmalloc_start; ...@@ -213,7 +213,7 @@ extern void *vmalloc_start;
#define PAGE_COPY PAGE_EXECREAD #define PAGE_COPY PAGE_EXECREAD
#define PAGE_RWX __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_WRITE | _PAGE_EXEC |_PAGE_ACCESSED) #define PAGE_RWX __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | _PAGE_WRITE | _PAGE_EXEC |_PAGE_ACCESSED)
#define PAGE_KERNEL __pgprot(_PAGE_KERNEL) #define PAGE_KERNEL __pgprot(_PAGE_KERNEL)
#define PAGE_KERNEL_RO __pgprot(_PAGE_PRESENT | _PAGE_EXEC | _PAGE_READ | _PAGE_DIRTY | _PAGE_ACCESSED) #define PAGE_KERNEL_RO __pgprot(_PAGE_KERNEL & ~_PAGE_WRITE)
#define PAGE_KERNEL_UNC __pgprot(_PAGE_KERNEL | _PAGE_NO_CACHE) #define PAGE_KERNEL_UNC __pgprot(_PAGE_KERNEL | _PAGE_NO_CACHE)
#define PAGE_GATEWAY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_GATEWAY| _PAGE_READ) #define PAGE_GATEWAY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_GATEWAY| _PAGE_READ)
#define PAGE_FLUSH __pgprot(_PAGE_FLUSH) #define PAGE_FLUSH __pgprot(_PAGE_FLUSH)
......
#ifndef _ASM_PARISC_RT_SIGFRAME_H #ifndef _ASM_PARISC_RT_SIGFRAME_H
#define _ASM_PARISC_RT_SIGFRAME_H #define _ASM_PARISC_RT_SIGFRAME_H
#ifdef CONFIG_COMPAT
#include <asm/compat_rt_sigframe.h>
#endif
#define SIGRETURN_TRAMP 4 #define SIGRETURN_TRAMP 4
#define SIGRESTARTBLOCK_TRAMP 5 #define SIGRESTARTBLOCK_TRAMP 5
#define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP) #define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)
......
...@@ -761,8 +761,27 @@ ...@@ -761,8 +761,27 @@
#define __NR_keyctl (__NR_Linux + 266) #define __NR_keyctl (__NR_Linux + 266)
#define __NR_ioprio_set (__NR_Linux + 267) #define __NR_ioprio_set (__NR_Linux + 267)
#define __NR_ioprio_get (__NR_Linux + 268) #define __NR_ioprio_get (__NR_Linux + 268)
#define __NR_inotify_init (__NR_Linux + 269)
#define __NR_inotify_add_watch (__NR_Linux + 270)
#define __NR_inotify_rm_watch (__NR_Linux + 271)
#define __NR_migrate_pages (__NR_Linux + 272)
#define __NR_pselect6 (__NR_Linux + 273)
#define __NR_ppoll (__NR_Linux + 274)
#define __NR_openat (__NR_Linux + 275)
#define __NR_mkdirat (__NR_Linux + 276)
#define __NR_mknodat (__NR_Linux + 277)
#define __NR_fchownat (__NR_Linux + 278)
#define __NR_futimesat (__NR_Linux + 279)
#define __NR_newfstatat (__NR_Linux + 280)
#define __NR_unlinkat (__NR_Linux + 281)
#define __NR_renameat (__NR_Linux + 282)
#define __NR_linkat (__NR_Linux + 283)
#define __NR_symlinkat (__NR_Linux + 284)
#define __NR_readlinkat (__NR_Linux + 285)
#define __NR_fchmodat (__NR_Linux + 286)
#define __NR_faccessat (__NR_Linux + 287)
#define __NR_Linux_syscalls 269 #define __NR_Linux_syscalls 288
#define HPUX_GATEWAY_ADDR 0xC0000004 #define HPUX_GATEWAY_ADDR 0xC0000004
#define LINUX_GATEWAY_ADDR 0x100 #define LINUX_GATEWAY_ADDR 0x100
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment