Merge master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6
This commit is contained in:
commit
89a2fa5f21
40 changed files with 904 additions and 328 deletions
|
@ -149,14 +149,20 @@ config HOTPLUG_CPU
|
|||
default y if SMP
|
||||
select HOTPLUG
|
||||
|
||||
config ARCH_SELECT_MEMORY_MODEL
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
bool "Discontiguous memory support (EXPERIMENTAL)"
|
||||
depends on 64BIT && EXPERIMENTAL
|
||||
help
|
||||
Say Y to support efficient handling of discontiguous physical memory,
|
||||
for architectures which are either NUMA (Non-Uniform Memory Access)
|
||||
or have huge holes in the physical address space for other reasons.
|
||||
See <file:Documentation/vm/numa> for more.
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
|
||||
config ARCH_FLATMEM_ENABLE
|
||||
def_bool y
|
||||
|
||||
config ARCH_DISCONTIGMEM_DEFAULT
|
||||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
source "kernel/Kconfig.hz"
|
||||
source "mm/Kconfig"
|
||||
|
|
|
@ -11,4 +11,14 @@ config DEBUG_RWLOCK
|
|||
too many attempts. If you suspect a rwlock problem or a kernel
|
||||
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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc5-pa1
|
||||
# Fri Oct 21 23:06:10 2005
|
||||
# Linux kernel version: 2.6.16-rc1-pa0
|
||||
# Tue Jan 17 08:21:01 2006
|
||||
#
|
||||
CONFIG_PARISC=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -29,8 +29,6 @@ CONFIG_SYSVIPC=y
|
|||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
|
@ -38,8 +36,10 @@ CONFIG_INITRAMFS_SOURCE=""
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -48,8 +48,10 @@ CONFIG_CC_ALIGN_FUNCTIONS=0
|
|||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
|
@ -57,9 +59,27 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
# CONFIG_MODULE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL 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
|
||||
#
|
||||
|
@ -77,6 +97,7 @@ CONFIG_HZ=250
|
|||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_HPUX is not set
|
||||
|
||||
|
@ -84,8 +105,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y
|
|||
# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
|
||||
#
|
||||
CONFIG_GSC=y
|
||||
# CONFIG_HPPB is not set
|
||||
# CONFIG_IOMMU_CCIO is not set
|
||||
CONFIG_HPPB=y
|
||||
CONFIG_IOMMU_CCIO=y
|
||||
CONFIG_GSC_LASI=y
|
||||
CONFIG_GSC_WAX=y
|
||||
CONFIG_EISA=y
|
||||
|
@ -165,8 +186,11 @@ CONFIG_IPV6=y
|
|||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
|
@ -205,6 +229,7 @@ CONFIG_STANDALONE=y
|
|||
CONFIG_PARPORT=y
|
||||
CONFIG_PARPORT_PC=y
|
||||
# CONFIG_PARPORT_SERIAL is not set
|
||||
CONFIG_PARPORT_NOT_PC=y
|
||||
CONFIG_PARPORT_GSC=y
|
||||
# CONFIG_PARPORT_1284 is not set
|
||||
|
||||
|
@ -230,14 +255,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
|
|||
CONFIG_CDROM_PKTCDVD=m
|
||||
CONFIG_CDROM_PKTCDVD_BUFFERS=8
|
||||
# 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
|
||||
|
||||
#
|
||||
|
@ -281,6 +298,7 @@ CONFIG_SCSI_SPI_ATTRS=y
|
|||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
|
@ -313,21 +331,19 @@ CONFIG_SCSI_SYM53C8XX_2=y
|
|||
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
|
||||
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
||||
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
||||
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
|
||||
CONFIG_SCSI_SYM53C8XX_MMIO=y
|
||||
# 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_PSI240I is not set
|
||||
# CONFIG_SCSI_QLOGIC_FAS is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
CONFIG_SCSI_QLA2XXX=y
|
||||
# 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_QLA_FC is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_SIM710 is not set
|
||||
# CONFIG_SCSI_SYM53C416 is not set
|
||||
|
@ -397,7 +413,7 @@ CONFIG_NETDEVICES=y
|
|||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
# CONFIG_LASI_82596 is not set
|
||||
CONFIG_LASI_82596=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
|
@ -464,6 +480,7 @@ CONFIG_NET_RADIO=y
|
|||
# Wireless 802.11b ISA/PCI cards support
|
||||
#
|
||||
# CONFIG_HERMES is not set
|
||||
# CONFIG_ATMEL is not set
|
||||
|
||||
#
|
||||
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
|
||||
|
@ -527,7 +544,7 @@ CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
|
|||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON 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_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
|
@ -535,7 +552,7 @@ CONFIG_MOUSE_PS2=y
|
|||
# CONFIG_MOUSE_LOGIBM is not set
|
||||
# CONFIG_MOUSE_PC110PAD 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_TOUCHSCREEN is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
|
@ -549,7 +566,8 @@ CONFIG_SERIO=y
|
|||
# CONFIG_SERIO_SERPORT is not set
|
||||
# CONFIG_SERIO_PARKBD is not set
|
||||
CONFIG_SERIO_GSCPS2=y
|
||||
# CONFIG_HP_SDC is not set
|
||||
CONFIG_HP_SDC=y
|
||||
CONFIG_HIL_MLC=y
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
|
@ -569,6 +587,7 @@ CONFIG_HW_CONSOLE=y
|
|||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=13
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
|
@ -582,11 +601,10 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
# CONFIG_SERIAL_MUX is not set
|
||||
# CONFIG_PDC_CONSOLE is not set
|
||||
CONFIG_SERIAL_MUX=y
|
||||
CONFIG_SERIAL_MUX_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -625,6 +643,12 @@ CONFIG_GEN_RTC=y
|
|||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
|
@ -661,7 +685,6 @@ CONFIG_FB=y
|
|||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
|
@ -671,6 +694,7 @@ CONFIG_FB_SOFT_CURSOR=y
|
|||
# CONFIG_FB_ASILIANT is not set
|
||||
# CONFIG_FB_IMSTT is not set
|
||||
CONFIG_FB_STI=y
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_NVIDIA is not set
|
||||
# CONFIG_FB_RIVA is not set
|
||||
# CONFIG_FB_MATROX is not set
|
||||
|
@ -683,9 +707,7 @@ CONFIG_FB_STI=y
|
|||
# CONFIG_FB_KYRO is not set
|
||||
# CONFIG_FB_3DFX is not set
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_CYBLA is not set
|
||||
# CONFIG_FB_TRIDENT is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
|
@ -695,6 +717,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
CONFIG_DUMMY_CONSOLE_COLUMNS=160
|
||||
CONFIG_DUMMY_CONSOLE_ROWS=64
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_STI_CONSOLE=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
|
@ -713,7 +736,85 @@ CONFIG_LOGO_PARISC_CLUT224=y
|
|||
#
|
||||
# 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
|
||||
|
@ -722,6 +823,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -877,18 +982,23 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_IOREMAP 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
|
||||
|
|
|
@ -22,10 +22,9 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.text
|
||||
|
||||
#define ENTRY_NAME(_name_) .word _name_
|
||||
|
||||
.section .rodata,"a"
|
||||
.align 4
|
||||
.export hpux_call_table
|
||||
.import hpux_unimplemented_wrapper
|
||||
|
|
|
@ -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 *dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
struct parisc_device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
memset(dev, 0, sizeof(*dev));
|
||||
dev->hw_path = id;
|
||||
dev->id.hw_type = HPHW_FAULTY;
|
||||
|
||||
|
|
|
@ -48,9 +48,6 @@ EXPORT_SYMBOL(strrchr);
|
|||
EXPORT_SYMBOL(strstr);
|
||||
EXPORT_SYMBOL(strpbrk);
|
||||
|
||||
#include <linux/pm.h>
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
#include <asm/atomic.h>
|
||||
EXPORT_SYMBOL(__xchg8);
|
||||
EXPORT_SYMBOL(__xchg32);
|
||||
|
|
|
@ -47,18 +47,17 @@
|
|||
* this makes the boot time much longer than necessary.
|
||||
* 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_bios_ops *pci_bios;
|
||||
struct pci_port_ops *pci_port __read_mostly;
|
||||
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. */
|
||||
#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,
|
|||
void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
|
||||
struct pci_bus_region *region)
|
||||
{
|
||||
#ifdef CONFIG_64BIT
|
||||
struct pci_bus *bus = dev->bus;
|
||||
struct pci_hba_data *hba = HBA_DATA(bus->bridge->platform_data);
|
||||
#endif
|
||||
|
||||
if (res->flags & IORESOURCE_MEM) {
|
||||
res->start = PCI_HOST_ADDR(hba, region->start);
|
||||
|
|
|
@ -68,20 +68,20 @@ struct rdr_tbl_ent {
|
|||
};
|
||||
|
||||
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;
|
||||
struct parisc_device *cpu_device __read_mostly = NULL;
|
||||
struct parisc_device *cpu_device __read_mostly;
|
||||
|
||||
/* 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 };
|
||||
|
||||
/* 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 };
|
||||
|
||||
/* 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 */
|
||||
{ 16, 1, 16 }, /* RDR 1 */
|
||||
{ 72, 2, 0 }, /* RDR 2 */
|
||||
|
@ -117,7 +117,7 @@ static struct rdr_tbl_ent perf_rdr_tbl_W[] = {
|
|||
};
|
||||
|
||||
/* 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 */
|
||||
{ 32, 1, 16 }, /* RDR 1 */
|
||||
{ 20, 1, 0 }, /* RDR 2 */
|
||||
|
@ -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
|
||||
* this array.
|
||||
*/
|
||||
static uint64_t perf_bitmasks[] = {
|
||||
static const uint64_t perf_bitmasks[] = {
|
||||
0x0000000000000000ul, /* first dbl word must be zero */
|
||||
0xfdffe00000000000ul, /* RDR0 bitmask */
|
||||
0x003f000000000000ul, /* RDR1 bitmask */
|
||||
|
@ -173,7 +173,7 @@ static uint64_t perf_bitmasks[] = {
|
|||
* Write control bitmasks for Pa-8700 processor given
|
||||
* somethings have changed slightly.
|
||||
*/
|
||||
static uint64_t perf_bitmasks_piranha[] = {
|
||||
static const uint64_t perf_bitmasks_piranha[] = {
|
||||
0x0000000000000000ul, /* first dbl word must be zero */
|
||||
0xfdffe00000000000ul, /* RDR0 bitmask */
|
||||
0x003f000000000000ul, /* RDR1 bitmask */
|
||||
|
@ -186,7 +186,7 @@ static uint64_t perf_bitmasks_piranha[] = {
|
|||
0xfffc000000000000ul
|
||||
};
|
||||
|
||||
static uint64_t *bitmask_array; /* array of bitmasks to use */
|
||||
static const uint64_t *bitmask_array; /* array of bitmasks to use */
|
||||
|
||||
/******************************************************************************
|
||||
* Function Prototypes
|
||||
|
@ -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 void perf_start_counters(void);
|
||||
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_clear(uint32_t rdr_num);
|
||||
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)
|
|||
uint32_t raddr[4];
|
||||
int error = 0;
|
||||
|
||||
lock_kernel();
|
||||
switch (cmd) {
|
||||
|
||||
case PA_PERF_ON:
|
||||
|
@ -477,8 +476,6 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
error = -ENOTTY;
|
||||
}
|
||||
|
||||
unlock_kernel();
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
@ -655,7 +652,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|||
* Retrieve a pointer to the description of what this
|
||||
* 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) {
|
||||
return &perf_rdr_tbl_U[rdr_num];
|
||||
|
@ -673,7 +670,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer)
|
|||
{
|
||||
uint64_t data, data_mask = 0;
|
||||
uint32_t width, xbits, i;
|
||||
struct rdr_tbl_ent *tentry;
|
||||
const struct rdr_tbl_ent *tentry;
|
||||
|
||||
tentry = perf_rdr_get_entry(rdr_num);
|
||||
if ((width = tentry->width) == 0)
|
||||
|
@ -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)
|
||||
{
|
||||
struct rdr_tbl_ent *tentry;
|
||||
const struct rdr_tbl_ent *tentry;
|
||||
int32_t i;
|
||||
|
||||
tentry = perf_rdr_get_entry(rdr_num);
|
||||
|
@ -753,10 +750,11 @@ static int perf_write_image(uint64_t *memaddr)
|
|||
uint64_t buffer[MAX_RDR_WORDS];
|
||||
uint64_t *bptr;
|
||||
uint32_t dwords;
|
||||
uint32_t *intrigue_rdr;
|
||||
uint64_t *intrigue_bitmask, tmp64;
|
||||
const uint32_t *intrigue_rdr;
|
||||
const uint64_t *intrigue_bitmask;
|
||||
uint64_t tmp64;
|
||||
void __iomem *runway;
|
||||
struct rdr_tbl_ent *tentry;
|
||||
const struct rdr_tbl_ent *tentry;
|
||||
int i;
|
||||
|
||||
/* Clear out counters */
|
||||
|
@ -830,7 +828,7 @@ static int perf_write_image(uint64_t *memaddr)
|
|||
*/
|
||||
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;
|
||||
|
||||
printk("perf_rdr_write\n");
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
#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:
|
||||
*
|
||||
|
@ -2093,7 +2093,7 @@ static uint32_t onyx_images[][PCXU_IMAGE_SIZE/sizeof(uint32_t)] = {
|
|||
};
|
||||
#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)
|
||||
*
|
||||
|
|
|
@ -54,27 +54,6 @@
|
|||
#include <asm/uaccess.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)
|
||||
{
|
||||
barrier();
|
||||
|
@ -102,12 +81,7 @@ void cpu_idle(void)
|
|||
}
|
||||
|
||||
|
||||
#ifdef __LP64__
|
||||
#define COMMAND_GLOBAL 0xfffffffffffe0030UL
|
||||
#else
|
||||
#define COMMAND_GLOBAL 0xfffe0030
|
||||
#endif
|
||||
|
||||
#define COMMAND_GLOBAL F_EXTEND(0xfffe0030)
|
||||
#define CMD_RESET 5 /* reset any module */
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
@ -170,8 +145,8 @@ void machine_halt(void)
|
|||
void machine_power_off(void)
|
||||
{
|
||||
/* If there is a registered power off handler, call it. */
|
||||
if(pm_power_off)
|
||||
pm_power_off();
|
||||
if (chassis_power_off)
|
||||
chassis_power_off();
|
||||
|
||||
/* Put the soft power button back under hardware control.
|
||||
* If the user had already pressed the power button, the
|
||||
|
@ -187,6 +162,8 @@ void machine_power_off(void)
|
|||
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
|
||||
|
|
|
@ -91,7 +91,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
int copied;
|
||||
|
||||
#ifdef __LP64__
|
||||
if (is_compat_task(child)) {
|
||||
if (personality(child->personality) == PER_LINUX32) {
|
||||
unsigned int tmp;
|
||||
|
||||
addr &= 0xffffffffL;
|
||||
|
@ -123,7 +123,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
case PTRACE_POKEDATA:
|
||||
ret = 0;
|
||||
#ifdef __LP64__
|
||||
if (is_compat_task(child)) {
|
||||
if (personality(child->personality) == PER_LINUX32) {
|
||||
unsigned int tmp = (unsigned int)data;
|
||||
DBG("sys_ptrace(POKE%s, %d, %lx, %lx)\n",
|
||||
request == PTRACE_POKETEXT ? "TEXT" : "DATA",
|
||||
|
@ -146,7 +146,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
case PTRACE_PEEKUSR: {
|
||||
ret = -EIO;
|
||||
#ifdef __LP64__
|
||||
if (is_compat_task(child)) {
|
||||
if (personality(child->personality) == PER_LINUX32) {
|
||||
unsigned int tmp;
|
||||
|
||||
if (addr & (sizeof(int)-1))
|
||||
|
@ -205,7 +205,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
goto out_tsk;
|
||||
}
|
||||
#ifdef __LP64__
|
||||
if (is_compat_task(child)) {
|
||||
if (personality(child->personality) == PER_LINUX32) {
|
||||
if (addr & (sizeof(int)-1))
|
||||
goto out_tsk;
|
||||
if ((addr = translate_usr_offset(addr)) < 0)
|
||||
|
|
|
@ -317,7 +317,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
|
||||
if(personality(current->personality) == PER_LINUX32) {
|
||||
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");
|
||||
compat_val = (compat_int_t)current->sas_ss_sp;
|
||||
err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
#include <asm/compat_signal.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "signal32.h"
|
||||
|
@ -398,3 +397,104 @@ setup_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __
|
|||
|
||||
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 @@
|
|||
#define _PARISC64_KERNEL_SIGNAL32_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 */
|
||||
|
||||
|
@ -29,6 +55,103 @@ struct k_sigaction32 {
|
|||
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_64to32(compat_sigset_t *s32, sigset_t *s64);
|
||||
int do_sigaltstack32 (const compat_stack_t __user *uss32,
|
||||
|
|
|
@ -650,6 +650,8 @@ end_linux_gateway_page:
|
|||
#define LWS_ENTRY(_name_) .word (lws_##_name_ - linux_gateway_page)
|
||||
#endif
|
||||
|
||||
.section .rodata,"a"
|
||||
|
||||
.align 4096
|
||||
/* Light-weight-syscall table */
|
||||
/* Start of lws table. */
|
||||
|
|
|
@ -374,5 +374,24 @@
|
|||
ENTRY_SAME(keyctl)
|
||||
ENTRY_SAME(ioprio_set)
|
||||
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 */
|
||||
|
||||
|
|
|
@ -193,10 +193,9 @@ void show_stack(struct task_struct *task, unsigned long *s)
|
|||
|
||||
HERE:
|
||||
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)
|
||||
return;
|
||||
memset(r, 0, sizeof(struct pt_regs));
|
||||
r->iaoq[0] = (unsigned long)&&HERE;
|
||||
r->gr[2] = (unsigned long)__builtin_return_address(0);
|
||||
r->gr[30] = sp;
|
||||
|
|
|
@ -337,6 +337,7 @@ decode_fpu(unsigned int Fpu_register[], unsigned int trap_counts[])
|
|||
}
|
||||
break;
|
||||
case INVALIDEXCEPTION:
|
||||
case OPC_2E_INVALIDEXCEPTION:
|
||||
update_trap_counts(Fpu_register, aflags, bflags, trap_counts);
|
||||
return SIGNALCODE(SIGFPE, FPE_FLTINV);
|
||||
case DIVISIONBYZEROEXCEPTION:
|
||||
|
|
|
@ -371,17 +371,11 @@ static void __init setup_bootmem(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;
|
||||
|
||||
printk(KERN_INFO "Freeing unused kernel memory: ");
|
||||
|
||||
#if 1
|
||||
#ifdef CONFIG_DEBUG_KERNEL
|
||||
/* Attempt to catch anyone trying to execute code here
|
||||
* by filling the page with BRK insns.
|
||||
*
|
||||
|
@ -414,9 +408,21 @@ void free_initmem(void)
|
|||
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE);
|
||||
|
||||
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
|
||||
* (between top of physical memory and a potential pcxl dma mapping
|
||||
|
@ -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;
|
||||
|
||||
void show_mem(void)
|
||||
|
@ -690,7 +691,7 @@ static void __init pagetable_init(void)
|
|||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
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),
|
||||
initrd_end - initrd_start, PAGE_KERNEL);
|
||||
}
|
||||
|
@ -792,8 +793,6 @@ map_hpux_gateway_page(struct task_struct *tsk, struct mm_struct *mm)
|
|||
EXPORT_SYMBOL(map_hpux_gateway_page);
|
||||
#endif
|
||||
|
||||
extern void flush_tlb_all_local(void);
|
||||
|
||||
void __init paging_init(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -802,7 +801,7 @@ void __init paging_init(void)
|
|||
pagetable_init();
|
||||
gateway_init();
|
||||
flush_cache_all_local(); /* start with known state */
|
||||
flush_tlb_all_local();
|
||||
flush_tlb_all_local(NULL);
|
||||
|
||||
for (i = 0; i < npmem_ranges; i++) {
|
||||
unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0 };
|
||||
|
@ -993,7 +992,7 @@ void flush_tlb_all(void)
|
|||
do_recycle++;
|
||||
}
|
||||
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) {
|
||||
spin_lock(&sid_lock);
|
||||
recycle_sids(recycle_ndirty,recycle_dirty_array);
|
||||
|
|
|
@ -1423,7 +1423,7 @@ static void __init ccio_init_resources(struct ioc *ioc)
|
|||
struct resource *res = ioc->mmio_region;
|
||||
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 + 1, name, &ioc->ioc_regs->io_io_low_hv);
|
||||
|
@ -1557,12 +1557,11 @@ static int ccio_probe(struct parisc_device *dev)
|
|||
int i;
|
||||
struct ioc *ioc, **ioc_p = &ioc_list;
|
||||
|
||||
ioc = kmalloc(sizeof(struct ioc), GFP_KERNEL);
|
||||
ioc = kzalloc(sizeof(struct ioc), GFP_KERNEL);
|
||||
if (ioc == NULL) {
|
||||
printk(KERN_ERR MODULE_NAME ": memory allocation failure\n");
|
||||
return 1;
|
||||
}
|
||||
memset(ioc, 0, sizeof(struct ioc));
|
||||
|
||||
ioc->name = dev->id.hversion == U2_IOA_RUNWAY ? "U2" : "UTurn";
|
||||
|
||||
|
@ -1578,7 +1577,7 @@ static int ccio_probe(struct parisc_device *dev)
|
|||
ccio_ioc_init(ioc);
|
||||
ccio_init_resources(ioc);
|
||||
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 */
|
||||
BUG_ON(dev->dev.platform_data == NULL);
|
||||
|
|
|
@ -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) {
|
||||
printk("dino_init_chip - couldn't alloc dino_device\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
memset(dino_dev, 0, sizeof(struct dino_device));
|
||||
|
||||
dino_dev->hba.dev = dev;
|
||||
dino_dev->hba.base_addr = ioremap(hpa, 4096);
|
||||
dino_dev->hba.lmmio_space_offset = 0; /* CPU addrs == bus addrs */
|
||||
|
|
|
@ -60,12 +60,11 @@ static int hppb_probe(struct parisc_device *dev)
|
|||
}
|
||||
|
||||
if(card->hpa) {
|
||||
card->next = kmalloc(sizeof(struct hppb_card), GFP_KERNEL);
|
||||
card->next = kzalloc(sizeof(struct hppb_card), GFP_KERNEL);
|
||||
if(!card->next) {
|
||||
printk(KERN_ERR "HP-PB: Unable to allocate memory.\n");
|
||||
return 1;
|
||||
}
|
||||
memset(card->next, '\0', sizeof(struct hppb_card));
|
||||
card = card->next;
|
||||
}
|
||||
printk(KERN_INFO "Found GeckoBoa at 0x%lx\n", dev->hpa.start);
|
||||
|
|
|
@ -873,28 +873,24 @@ void *iosapic_register(unsigned long hpa)
|
|||
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) {
|
||||
BUG();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(isi, 0, sizeof(struct iosapic_info));
|
||||
|
||||
isi->addr = ioremap(hpa, 4096);
|
||||
isi->isi_hpa = hpa;
|
||||
isi->isi_version = iosapic_rd_version(isi);
|
||||
isi->isi_num_vectors = IOSAPIC_IRDT_MAX_ENTRY(isi->isi_version) + 1;
|
||||
|
||||
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) {
|
||||
kfree(isi);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(vip, 0, sizeof(struct vector_info) * isi->isi_num_vectors);
|
||||
|
||||
for (cnt=0; cnt < isi->isi_num_vectors; cnt++, vip++) {
|
||||
vip->irqline = (unsigned char) cnt;
|
||||
vip->iosapic = isi;
|
||||
|
|
|
@ -166,11 +166,12 @@ static void lasi_power_off(void)
|
|||
int __init
|
||||
lasi_init_chip(struct parisc_device *dev)
|
||||
{
|
||||
extern void (*chassis_power_off)(void);
|
||||
struct gsc_asic *lasi;
|
||||
struct gsc_irq gsc_irq;
|
||||
int ret;
|
||||
|
||||
lasi = kmalloc(sizeof(*lasi), GFP_KERNEL);
|
||||
lasi = kzalloc(sizeof(*lasi), GFP_KERNEL);
|
||||
if (!lasi)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -222,7 +223,7 @@ lasi_init_chip(struct parisc_device *dev)
|
|||
* ensure that only the first LASI (the one controlling the power off)
|
||||
* should set the HPA here */
|
||||
lasi_power_off_hpa = lasi->hpa;
|
||||
pm_power_off = lasi_power_off;
|
||||
chassis_power_off = lasi_power_off;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1565,7 +1565,7 @@ lba_driver_probe(struct parisc_device *dev)
|
|||
} else if (IS_MERCURY(dev) || IS_QUICKSILVER(dev)) {
|
||||
func_class &= 0xff;
|
||||
version = kmalloc(6, GFP_KERNEL);
|
||||
sprintf(version,"TR%d.%d",(func_class >> 4),(func_class & 0xf));
|
||||
snprintf(version, 6, "TR%d.%d",(func_class >> 4),(func_class & 0xf));
|
||||
/* We could use one printk for both Elroy and Mercury,
|
||||
* but for the mask for func_class.
|
||||
*/
|
||||
|
@ -1586,14 +1586,12 @@ lba_driver_probe(struct parisc_device *dev)
|
|||
** 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) {
|
||||
printk(KERN_ERR "lba_init_chip - couldn't alloc lba_device\n");
|
||||
return(1);
|
||||
}
|
||||
|
||||
memset(lba_dev, 0, sizeof(struct lba_device));
|
||||
|
||||
|
||||
/* ---------- First : initialize data we already have --------- */
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* 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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,11 +26,19 @@
|
|||
*
|
||||
* 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
|
||||
* 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
|
||||
* 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
|
||||
* 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
|
||||
|
@ -50,13 +58,15 @@
|
|||
#include <linux/kobject.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/uaccess.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_OSID 0x40
|
||||
|
@ -70,10 +80,12 @@ MODULE_DESCRIPTION("sysfs interface to HP PDC Stable Storage data");
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(PDCS_VERSION);
|
||||
|
||||
/* holds Stable Storage size. Initialized once and for all, no lock needed */
|
||||
static unsigned long pdcs_size __read_mostly;
|
||||
|
||||
/* This struct defines what we need to deal with a parisc pdc path entry */
|
||||
struct pdcspath_entry {
|
||||
rwlock_t rw_lock; /* to protect path entry access */
|
||||
short ready; /* entry record is valid if != 0 */
|
||||
unsigned long addr; /* entry address in stable storage */
|
||||
char *name; /* entry name */
|
||||
|
@ -121,6 +133,8 @@ struct pdcspath_attribute paths_attr_##_name = { \
|
|||
* 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
|
||||
* 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
|
||||
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.
|
||||
* 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
|
||||
*
|
||||
* This function expects to be called with @entry->rw_lock write-hold.
|
||||
*/
|
||||
static int
|
||||
static void
|
||||
pdcspath_store(struct pdcspath_entry *entry)
|
||||
{
|
||||
struct device_path *devpath;
|
||||
|
||||
if (!entry)
|
||||
return -EINVAL;
|
||||
BUG_ON(!entry);
|
||||
|
||||
devpath = &entry->devpath;
|
||||
|
||||
|
@ -176,10 +191,8 @@ pdcspath_store(struct pdcspath_entry *entry)
|
|||
First case, we don't have a preset hwpath... */
|
||||
if (!entry->ready) {
|
||||
/* ...but we have a device, map it */
|
||||
if (entry->dev)
|
||||
device_to_hwpath(entry->dev, (struct hardware_path *)devpath);
|
||||
else
|
||||
return -EINVAL;
|
||||
BUG_ON(!entry->dev);
|
||||
device_to_hwpath(entry->dev, (struct hardware_path *)devpath);
|
||||
}
|
||||
/* else, we expect the provided hwpath to be valid. */
|
||||
|
||||
|
@ -191,15 +204,13 @@ pdcspath_store(struct pdcspath_entry *entry)
|
|||
printk(KERN_ERR "%s: an error occured when writing to PDC.\n"
|
||||
"It is likely that the Stable Storage data has been corrupted.\n"
|
||||
"Please check it carefully upon next reboot.\n", __func__);
|
||||
return -EIO;
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
||||
/* kobject is already registered */
|
||||
entry->ready = 2;
|
||||
|
||||
DPRINTK("%s: device: 0x%p\n", __func__, entry->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -214,14 +225,17 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf)
|
|||
{
|
||||
char *out = buf;
|
||||
struct device_path *devpath;
|
||||
unsigned short i;
|
||||
short i;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
read_lock(&entry->rw_lock);
|
||||
devpath = &entry->devpath;
|
||||
i = entry->ready;
|
||||
read_unlock(&entry->rw_lock);
|
||||
|
||||
if (!entry->ready)
|
||||
if (!i) /* entry is not ready */
|
||||
return -ENODATA;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
|
@ -242,7 +256,7 @@ pdcspath_hwpath_read(struct pdcspath_entry *entry, char *buf)
|
|||
*
|
||||
* We will call this function to change the current hardware path.
|
||||
* 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
|
||||
* PCI bridge or even a CPU...
|
||||
* 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
|
|||
}
|
||||
|
||||
/* So far so good, let's get in deep */
|
||||
write_lock(&entry->rw_lock);
|
||||
entry->ready = 0;
|
||||
entry->dev = dev;
|
||||
|
||||
/* 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 */
|
||||
sysfs_remove_link(&entry->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);
|
||||
|
||||
return count;
|
||||
|
@ -326,14 +342,17 @@ pdcspath_layer_read(struct pdcspath_entry *entry, char *buf)
|
|||
{
|
||||
char *out = buf;
|
||||
struct device_path *devpath;
|
||||
unsigned short i;
|
||||
short i;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
read_lock(&entry->rw_lock);
|
||||
devpath = &entry->devpath;
|
||||
i = entry->ready;
|
||||
read_unlock(&entry->rw_lock);
|
||||
|
||||
if (!entry->ready)
|
||||
if (!i) /* entry is not ready */
|
||||
return -ENODATA;
|
||||
|
||||
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
|
|||
}
|
||||
|
||||
/* 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
|
||||
the hardware path. */
|
||||
memcpy(&entry->devpath.layers, &layers, sizeof(layers));
|
||||
|
||||
/* 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);
|
||||
|
||||
return count;
|
||||
|
@ -415,9 +436,6 @@ pdcspath_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
|||
struct pdcspath_attribute *pdcs_attr = to_pdcspath_attribute(attr);
|
||||
ssize_t ret = 0;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EACCES;
|
||||
|
||||
if (pdcs_attr->show)
|
||||
ret = pdcs_attr->show(entry, buf);
|
||||
|
||||
|
@ -454,8 +472,8 @@ static struct sysfs_ops pdcspath_attr_ops = {
|
|||
};
|
||||
|
||||
/* These are the two attributes of any PDC path. */
|
||||
static PATHS_ATTR(hwpath, 0600, pdcspath_hwpath_read, pdcspath_hwpath_write);
|
||||
static PATHS_ATTR(layer, 0600, pdcspath_layer_read, pdcspath_layer_write);
|
||||
static PATHS_ATTR(hwpath, 0644, pdcspath_hwpath_read, pdcspath_hwpath_write);
|
||||
static PATHS_ATTR(layer, 0644, pdcspath_layer_read, pdcspath_layer_write);
|
||||
|
||||
static struct attribute *paths_subsys_attrs[] = {
|
||||
&paths_attr_hwpath.attr,
|
||||
|
@ -484,36 +502,119 @@ static struct pdcspath_entry *pdcspath_entries[] = {
|
|||
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.
|
||||
* @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
|
||||
pdcs_info_read(struct subsystem *entry, char *buf)
|
||||
pdcs_size_read(struct subsystem *entry, char *buf)
|
||||
{
|
||||
char *out = buf;
|
||||
__u32 result;
|
||||
struct device_path devpath;
|
||||
char *tmpstr = NULL;
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
/* 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 */
|
||||
if (pdc_stable_read(PDCS_ADDR_PPRI, &devpath, sizeof(devpath)) != PDC_OK)
|
||||
return -EIO;
|
||||
return out - buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
out += sprintf(out, "Autoboot: %s\n", (devpath.flags & PF_AUTOBOOT) ? "On" : "Off");
|
||||
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);
|
||||
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);
|
||||
|
||||
return out - buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 */
|
||||
if (pdc_stable_read(PDCS_ADDR_OSID, &result, sizeof(result)) != PDC_OK)
|
||||
|
@ -529,13 +630,31 @@ pdcs_info_read(struct subsystem *entry, char *buf)
|
|||
case 0x0005: tmpstr = "Novell Netware dependent data"; 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 */
|
||||
if (pdc_stable_read(PDCS_ADDR_FSIZ, &result, sizeof(result)) != PDC_OK)
|
||||
return -EIO;
|
||||
|
||||
out += sprintf(out, "Memory tested: ");
|
||||
if ((result & 0x0F) < 0x0E)
|
||||
out += sprintf(out, "%d kB", (1<<(result & 0x0F))*256);
|
||||
else
|
||||
|
@ -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.
|
||||
* @buf: The input buffer to read from.
|
||||
* @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:
|
||||
* \"n n\" (n == 0 or 1) to toggle respectively AutoBoot and AutoSearch
|
||||
*
|
||||
* 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...
|
||||
* \"n\" (n == 0 or 1) to toggle AutoBoot Off or On
|
||||
*/
|
||||
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;
|
||||
unsigned char flags;
|
||||
|
@ -582,7 +697,9 @@ pdcs_info_write(struct subsystem *entry, const char *buf, size_t count)
|
|||
pathentry = &pdcspath_entry_primary;
|
||||
|
||||
/* Be nice to the existing flag record */
|
||||
read_lock(&pathentry->rw_lock);
|
||||
flags = pathentry->devpath.flags;
|
||||
read_unlock(&pathentry->rw_lock);
|
||||
|
||||
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)
|
|||
if ((c != 0) && (c != 1))
|
||||
goto parse_error;
|
||||
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
|
||||
flags |= PF_AUTOSEARCH;
|
||||
flags |= knob;
|
||||
|
||||
DPRINTK("%s: flags after: 0x%X\n", __func__, flags);
|
||||
|
||||
/* So far so good, let's get in deep */
|
||||
write_lock(&pathentry->rw_lock);
|
||||
|
||||
/* Change the path entry flags first */
|
||||
pathentry->devpath.flags = flags;
|
||||
|
||||
/* 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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* 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[] = {
|
||||
&pdcs_attr_info,
|
||||
NULL, /* maybe more in the future? */
|
||||
&pdcs_attr_size,
|
||||
&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(pdc, NULL, NULL);
|
||||
static decl_subsys(stable, NULL, NULL);
|
||||
|
||||
/**
|
||||
* pdcs_register_pathentries - Prepares path entries kobjects for sysfs usage.
|
||||
|
@ -656,8 +808,16 @@ pdcs_register_pathentries(void)
|
|||
struct pdcspath_entry *entry;
|
||||
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++) {
|
||||
if (pdcspath_fetch(entry) < 0)
|
||||
write_lock(&entry->rw_lock);
|
||||
err = pdcspath_fetch(entry);
|
||||
write_unlock(&entry->rw_lock);
|
||||
|
||||
if (err < 0)
|
||||
continue;
|
||||
|
||||
if ((err = kobject_set_name(&entry->kobj, "%s", entry->name)))
|
||||
|
@ -667,13 +827,14 @@ pdcs_register_pathentries(void)
|
|||
return err;
|
||||
|
||||
/* kobject is now registered */
|
||||
write_lock(&entry->rw_lock);
|
||||
entry->ready = 2;
|
||||
|
||||
if (!entry->dev)
|
||||
continue;
|
||||
|
||||
/* Add a nice symlink to the real device */
|
||||
sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device");
|
||||
if (entry->dev)
|
||||
sysfs_create_link(&entry->kobj, &entry->dev->kobj, "device");
|
||||
|
||||
write_unlock(&entry->rw_lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -688,14 +849,17 @@ pdcs_unregister_pathentries(void)
|
|||
unsigned short i;
|
||||
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)
|
||||
kobject_unregister(&entry->kobj);
|
||||
kobject_unregister(&entry->kobj);
|
||||
read_unlock(&entry->rw_lock);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* For now we register the pdc subsystem with the firmware subsystem
|
||||
* and the paths subsystem with the pdc subsystem
|
||||
* For now we register the stable subsystem with the firmware subsystem
|
||||
* and the paths subsystem with the stable subsystem
|
||||
*/
|
||||
static int __init
|
||||
pdc_stable_init(void)
|
||||
|
@ -707,19 +871,23 @@ pdc_stable_init(void)
|
|||
if (pdc_stable_get_size(&pdcs_size) != PDC_OK)
|
||||
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;
|
||||
|
||||
/* For now we'll register the pdc subsys within this driver */
|
||||
if ((rc = firmware_register(&pdc_subsys)))
|
||||
printk(KERN_INFO PDCS_PREFIX " facility v%s\n", PDCS_VERSION);
|
||||
|
||||
/* For now we'll register the stable subsys within this driver */
|
||||
if ((rc = firmware_register(&stable_subsys)))
|
||||
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++)
|
||||
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 */
|
||||
kset_set_kset_s(&paths_subsys, pdc_subsys);
|
||||
/* register the paths subsys as a subsystem of stable subsys */
|
||||
kset_set_kset_s(&paths_subsys, stable_subsys);
|
||||
if ((rc= subsystem_register(&paths_subsys)))
|
||||
goto fail_subsysreg;
|
||||
|
||||
|
@ -734,10 +902,10 @@ pdc_stable_init(void)
|
|||
subsystem_unregister(&paths_subsys);
|
||||
|
||||
fail_subsysreg:
|
||||
firmware_unregister(&pdc_subsys);
|
||||
firmware_unregister(&stable_subsys);
|
||||
|
||||
fail_firmreg:
|
||||
printk(KERN_INFO "PDC Stable Storage bailing out\n");
|
||||
printk(KERN_INFO PDCS_PREFIX " bailing out\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -747,7 +915,7 @@ pdc_stable_exit(void)
|
|||
pdcs_unregister_pathentries();
|
||||
subsystem_unregister(&paths_subsys);
|
||||
|
||||
firmware_unregister(&pdc_subsys);
|
||||
firmware_unregister(&stable_subsys);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -2064,14 +2064,13 @@ sba_driver_callback(struct parisc_device *dev)
|
|||
printk(KERN_INFO "%s found %s at 0x%lx\n",
|
||||
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) {
|
||||
printk(KERN_ERR MODULE_NAME " - couldn't alloc sba_device\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
parisc_set_drvdata(dev, sba_dev);
|
||||
memset(sba_dev, 0, sizeof(struct sba_device));
|
||||
|
||||
for(i=0; i<MAX_IOC; i++)
|
||||
spin_lock_init(&(sba_dev->ioc[i].res_lock));
|
||||
|
|
|
@ -89,6 +89,9 @@ static struct superio_device sio_dev;
|
|||
#define DBG_INIT(x...)
|
||||
#endif
|
||||
|
||||
#define SUPERIO "SuperIO"
|
||||
#define PFX SUPERIO ": "
|
||||
|
||||
static irqreturn_t
|
||||
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;
|
||||
|
||||
if (local_irq == 2 || local_irq > 7) {
|
||||
printk(KERN_ERR "SuperIO: slave interrupted!\n");
|
||||
printk(KERN_ERR PFX "slave interrupted!\n");
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -128,7 +131,7 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
|
|||
outb(OCW3_ISR,IC_PIC1+0);
|
||||
results = inb(IC_PIC1+0);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -163,27 +166,27 @@ superio_init(struct pci_dev *pcidev)
|
|||
/* ...then properly fixup the USB to point at suckyio PIC */
|
||||
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_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
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_PIC2, 0x1f, "pic2");
|
||||
|
@ -263,14 +266,14 @@ superio_init(struct pci_dev *pcidev)
|
|||
/* Setup USB power regulation */
|
||||
outb(1, sio->acpi_base + USB_REG_CR);
|
||||
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
|
||||
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,
|
||||
"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();
|
||||
return;
|
||||
}
|
||||
|
@ -284,7 +287,7 @@ static void superio_disable_irq(unsigned int irq)
|
|||
u8 r8;
|
||||
|
||||
if ((irq < 1) || (irq == 2) || (irq > 7)) {
|
||||
printk(KERN_ERR "SuperIO: Illegal irq number.\n");
|
||||
printk(KERN_ERR PFX "Illegal irq number.\n");
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
|
@ -301,7 +304,7 @@ static void superio_enable_irq(unsigned int irq)
|
|||
u8 r8;
|
||||
|
||||
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();
|
||||
return;
|
||||
}
|
||||
|
@ -319,7 +322,7 @@ static unsigned int superio_startup_irq(unsigned int irq)
|
|||
}
|
||||
|
||||
static struct hw_interrupt_type superio_interrupt_type = {
|
||||
.typename = "SuperIO",
|
||||
.typename = SUPERIO,
|
||||
.startup = superio_startup_irq,
|
||||
.shutdown = superio_disable_irq,
|
||||
.enable = superio_enable_irq,
|
||||
|
@ -413,7 +416,7 @@ static void __devinit superio_serial_init(void)
|
|||
|
||||
retval = early_serial_setup(&serial[0]);
|
||||
if (retval < 0) {
|
||||
printk(KERN_WARNING "SuperIO: Register Serial #0 failed.\n");
|
||||
printk(KERN_WARNING PFX "Register Serial #0 failed.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -423,7 +426,7 @@ static void __devinit superio_serial_init(void)
|
|||
retval = early_serial_setup(&serial[1]);
|
||||
|
||||
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 */
|
||||
}
|
||||
|
||||
|
@ -437,7 +440,7 @@ static void __devinit superio_parport_init(void)
|
|||
PARPORT_DMA_NONE /* dma */,
|
||||
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 */
|
||||
}
|
||||
|
||||
|
@ -499,7 +502,7 @@ static struct pci_device_id superio_tbl[] = {
|
|||
};
|
||||
|
||||
static struct pci_driver superio_driver = {
|
||||
.name = "SuperIO",
|
||||
.name = SUPERIO,
|
||||
.id_table = superio_tbl,
|
||||
.probe = superio_probe,
|
||||
};
|
||||
|
|
|
@ -76,7 +76,7 @@ wax_init_chip(struct parisc_device *dev)
|
|||
struct gsc_irq gsc_irq;
|
||||
int ret;
|
||||
|
||||
wax = kmalloc(sizeof(*wax), GFP_KERNEL);
|
||||
wax = kzalloc(sizeof(*wax), GFP_KERNEL);
|
||||
if (!wax)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -249,7 +249,7 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base,
|
|||
struct parport 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) {
|
||||
printk (KERN_DEBUG "parport (0x%lx): no memory!\n", base);
|
||||
return NULL;
|
||||
|
|
|
@ -30,10 +30,11 @@
|
|||
|
||||
#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 */
|
||||
static struct sti_struct *sti_roms[MAX_STI_ROMS]; /* ptr to each sti_struct */
|
||||
/* number of STI ROMS found and their ptrs to each 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
|
||||
|
@ -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
|
||||
static int __init sti_setup(char *str)
|
||||
|
@ -414,10 +415,10 @@ sti_init_glob_cfg(struct sti_struct *sti,
|
|||
if (!sti->sti_mem_request)
|
||||
sti->sti_mem_request = 256; /* STI default */
|
||||
|
||||
glob_cfg = kmalloc(sizeof(*sti->glob_cfg), GFP_KERNEL);
|
||||
glob_cfg_ext = kmalloc(sizeof(*glob_cfg_ext), GFP_KERNEL);
|
||||
save_addr = kmalloc(save_addr_size, GFP_KERNEL);
|
||||
sti_mem_addr = kmalloc(sti->sti_mem_request, GFP_KERNEL);
|
||||
glob_cfg = kzalloc(sizeof(*sti->glob_cfg), GFP_KERNEL);
|
||||
glob_cfg_ext = kzalloc(sizeof(*glob_cfg_ext), GFP_KERNEL);
|
||||
save_addr = kzalloc(save_addr_size, GFP_KERNEL);
|
||||
sti_mem_addr = kzalloc(sti->sti_mem_request, GFP_KERNEL);
|
||||
|
||||
if (!(glob_cfg && glob_cfg_ext && save_addr && sti_mem_addr)) {
|
||||
kfree(glob_cfg);
|
||||
|
@ -427,11 +428,6 @@ sti_init_glob_cfg(struct sti_struct *sti,
|
|||
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->save_addr = STI_PTR(save_addr);
|
||||
for (i=0; i<8; i++) {
|
||||
|
@ -502,9 +498,9 @@ sti_init_glob_cfg(struct sti_struct *sti,
|
|||
|
||||
#ifdef CONFIG_FB
|
||||
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;
|
||||
void *dest;
|
||||
struct sti_rom_font *nf;
|
||||
|
@ -525,10 +521,9 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
|
|||
size = bpc * 256;
|
||||
size += sizeof(struct sti_rom_font);
|
||||
|
||||
nf = kmalloc(size, GFP_KERNEL);
|
||||
nf = kzalloc(size, GFP_KERNEL);
|
||||
if (!nf)
|
||||
return NULL;
|
||||
memset(nf, 0, size);
|
||||
|
||||
nf->first_char = 0;
|
||||
nf->last_char = 255;
|
||||
|
@ -544,7 +539,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
|
|||
dest += sizeof(struct sti_rom_font);
|
||||
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) {
|
||||
kfree(nf);
|
||||
return NULL;
|
||||
|
@ -559,7 +554,7 @@ sti_select_fbfont( struct sti_cooked_rom *cooked_rom, char *fbfont_name )
|
|||
}
|
||||
#else
|
||||
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;
|
||||
}
|
||||
|
@ -617,7 +612,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
|
|||
struct sti_rom_font *raw_font, *font_start;
|
||||
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)
|
||||
return 0;
|
||||
|
||||
|
@ -631,7 +626,7 @@ sti_cook_fonts(struct sti_cooked_rom *cooked_rom,
|
|||
while (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)
|
||||
return 1;
|
||||
|
||||
|
@ -668,10 +663,9 @@ sti_bmode_font_raw(struct sti_cooked_font *f)
|
|||
unsigned char *n, *p, *q;
|
||||
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)
|
||||
return NULL;
|
||||
memset (n, 0, 4*size);
|
||||
p = n + 3;
|
||||
q = (unsigned char *)f->raw;
|
||||
while (size--) {
|
||||
|
@ -816,13 +810,12 @@ sti_try_rom_generic(unsigned long address, unsigned long hpa, struct pci_dev *pd
|
|||
return NULL;
|
||||
}
|
||||
|
||||
sti = kmalloc(sizeof(*sti), GFP_KERNEL);
|
||||
sti = kzalloc(sizeof(*sti), GFP_KERNEL);
|
||||
if (!sti) {
|
||||
printk(KERN_ERR "Not enough memory !\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(sti, 0, sizeof(*sti));
|
||||
spin_lock_init(&sti->lock);
|
||||
|
||||
test_rom:
|
||||
|
@ -1035,7 +1028,7 @@ static struct parisc_driver pa_sti_driver = {
|
|||
* 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)
|
||||
{
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
/* Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
|
||||
* Copyright (C) 2006 Kyle McMartin <kyle@parisc-linux.org>
|
||||
*/
|
||||
|
||||
#ifndef _ASM_PARISC_ATOMIC_H_
|
||||
#define _ASM_PARISC_ATOMIC_H_
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/system.h>
|
||||
/* Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>. */
|
||||
|
||||
/*
|
||||
* 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;
|
|||
# define _atomic_spin_unlock_irqrestore(l,f) do { local_irq_restore(f); } while (0)
|
||||
#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.
|
||||
** Or get a link error if xchg is used "wrong".
|
||||
*/
|
||||
|
@ -69,10 +64,9 @@ extern unsigned long __xchg64(unsigned long, unsigned long *);
|
|||
#endif
|
||||
|
||||
/* optimizer better get rid of switch since size is a constant */
|
||||
static __inline__ unsigned long __xchg(unsigned long x, __volatile__ void * ptr,
|
||||
int size)
|
||||
static __inline__ unsigned long
|
||||
__xchg(unsigned long x, __volatile__ void * ptr, int size)
|
||||
{
|
||||
|
||||
switch(size) {
|
||||
#ifdef __LP64__
|
||||
case 8: return __xchg64(x,(unsigned long *) ptr);
|
||||
|
@ -129,7 +123,13 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new_, int size)
|
|||
(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
|
||||
* __atomic_add_return, atomic_set and atomic_read (the latter
|
||||
|
@ -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_INIT(i) { (i) }
|
||||
#define ATOMIC_INIT(i) ((atomic_t) { (i) })
|
||||
|
||||
#define smp_mb__before_atomic_dec() smp_mb()
|
||||
#define smp_mb__after_atomic_dec() smp_mb()
|
||||
#define smp_mb__before_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>
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_PARISC_ATOMIC_H_ */
|
||||
|
|
|
@ -183,4 +183,10 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long
|
|||
__flush_cache_page(vma, vmaddr);
|
||||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_RODATA
|
||||
void mark_rodata_ro(void);
|
||||
#endif
|
||||
|
||||
#endif /* _PARISC_CACHEFLUSH_H */
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
#ifndef _ASM_PARISC_COMPAT_UCONTEXT_H
|
||||
#define _ASM_PARISC_COMPAT_UCONTEXT_H
|
||||
|
||||
#include<linux/compat.h>
|
||||
#include<asm/compat_signal.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
/* 32-bit ucontext as seen from an 64-bit kernel */
|
||||
struct compat_ucontext {
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
#define CRT_ID_ELK_1024DB 0x27849CA5 /* Elk 1024x768 double buffer */
|
||||
#define CRT_ID_ELK_GS S9000_ID_A1924A /* Elk 1280x1024 GreyScale */
|
||||
#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_THUNDER2 0x2F8D570E /* Thunder 2 VISUALIZE 48 XP*/
|
||||
#define CRT_ID_HCRX S9000_ID_HCRX /* Hyperdrive HCRX */
|
||||
|
|
|
@ -18,6 +18,18 @@
|
|||
*/
|
||||
#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)
|
||||
**
|
||||
|
@ -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.
|
||||
** 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
|
||||
** (1) PA_VIEW - IO_VIEW = lmmio_offset for both LMMIO and ELMMIO
|
||||
|
@ -191,9 +203,6 @@ struct pci_bios_ops {
|
|||
*/
|
||||
extern struct pci_port_ops *pci_port;
|
||||
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
|
||||
extern void pcibios_register_hba(struct pci_hba_data *);
|
||||
|
|
|
@ -137,7 +137,6 @@ static inline void pte_free_kernel(pte_t *pte)
|
|||
|
||||
#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)
|
||||
|
||||
#endif
|
||||
|
|
|
@ -213,7 +213,7 @@ extern void *vmalloc_start;
|
|||
#define PAGE_COPY PAGE_EXECREAD
|
||||
#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_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_GATEWAY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_GATEWAY| _PAGE_READ)
|
||||
#define PAGE_FLUSH __pgprot(_PAGE_FLUSH)
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
#ifndef _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 SIGRESTARTBLOCK_TRAMP 5
|
||||
#define TRAMP_SIZE (SIGRETURN_TRAMP + SIGRESTARTBLOCK_TRAMP)
|
||||
|
|
|
@ -761,8 +761,27 @@
|
|||
#define __NR_keyctl (__NR_Linux + 266)
|
||||
#define __NR_ioprio_set (__NR_Linux + 267)
|
||||
#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 LINUX_GATEWAY_ADDR 0x100
|
||||
|
|
Loading…
Reference in a new issue