Merge master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc-merge
This commit is contained in:
commit
602d4a7e2f
|
@ -300,6 +300,7 @@ config PPC_PMAC64
|
|||
bool
|
||||
depends on PPC_PMAC && POWER4
|
||||
select U3_DART
|
||||
select GENERIC_TBSYNC
|
||||
default y
|
||||
|
||||
config PPC_PREP
|
||||
|
@ -314,15 +315,17 @@ config PPC_MAPLE
|
|||
bool " Maple 970FX Evaluation Board"
|
||||
select U3_DART
|
||||
select MPIC_BROKEN_U3
|
||||
select GENERIC_TBSYNC
|
||||
default n
|
||||
help
|
||||
This option enables support for the Maple 970FX Evaluation Board.
|
||||
For more informations, refer to <http://www.970eval.com>
|
||||
|
||||
config PPC_BPA
|
||||
bool " Broadband Processor Architecture"
|
||||
config PPC_CELL
|
||||
bool " Cell Broadband Processor Architecture"
|
||||
depends on PPC_MULTIPLATFORM && PPC64
|
||||
select PPC_RTAS
|
||||
select MMIO_NVRAM
|
||||
|
||||
config PPC_OF
|
||||
bool
|
||||
|
@ -353,13 +356,26 @@ config RTAS_ERROR_LOGGING
|
|||
depends on PPC_RTAS
|
||||
default n
|
||||
|
||||
config RTAS_PROC
|
||||
bool "Proc interface to RTAS"
|
||||
depends on PPC_RTAS
|
||||
default y
|
||||
|
||||
config RTAS_FLASH
|
||||
tristate "Firmware flash interface"
|
||||
depends on PPC64 && RTAS_PROC
|
||||
|
||||
config MMIO_NVRAM
|
||||
bool
|
||||
default n
|
||||
|
||||
config MPIC_BROKEN_U3
|
||||
bool
|
||||
depends on PPC_MAPLE
|
||||
default y
|
||||
|
||||
config BPA_IIC
|
||||
depends on PPC_BPA
|
||||
config CELL_IIC
|
||||
depends on PPC_CELL
|
||||
bool
|
||||
default y
|
||||
|
||||
|
@ -372,6 +388,11 @@ config PPC_MPC106
|
|||
bool
|
||||
default n
|
||||
|
||||
config GENERIC_TBSYNC
|
||||
bool
|
||||
default y if CONFIG_PPC32 && CONFIG_SMP
|
||||
default n
|
||||
|
||||
source "drivers/cpufreq/Kconfig"
|
||||
|
||||
config CPU_FREQ_PMAC
|
||||
|
|
|
@ -12,9 +12,6 @@
|
|||
# Rewritten by Cort Dougan and Paul Mackerras
|
||||
#
|
||||
|
||||
# This must match PAGE_OFFSET in include/asm-powerpc/page.h.
|
||||
KERNELLOAD := $(CONFIG_KERNEL_START)
|
||||
|
||||
HAS_BIARCH := $(call cc-option-yn, -m32)
|
||||
|
||||
ifeq ($(CONFIG_PPC64),y)
|
||||
|
@ -59,7 +56,7 @@ override LD += -m elf$(SZ)ppc
|
|||
override CC += -m$(SZ)
|
||||
endif
|
||||
|
||||
LDFLAGS_vmlinux := -Ttext $(KERNELLOAD) -Bstatic -e $(KERNELLOAD)
|
||||
LDFLAGS_vmlinux := -Bstatic
|
||||
|
||||
# The -Iarch/$(ARCH)/include is temporary while we are merging
|
||||
CPPFLAGS += -Iarch/$(ARCH) -Iarch/$(ARCH)/include
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,998 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc4
|
||||
# Thu Oct 20 08:30:56 2005
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_ISA_DMA=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_COMPAT=y
|
||||
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_AUDIT=y
|
||||
CONFIG_AUDITSYSCALL=y
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_SYSVIPC_COMPAT=y
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
CONFIG_PPC_ISERIES=y
|
||||
# CONFIG_PPC_MULTIPLATFORM is not set
|
||||
CONFIG_PPC=y
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_IBMVIO=y
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_IOMMU_VMERGE=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_NUMA is not set
|
||||
# CONFIG_SCHED_SMT is not set
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_PREEMPT_BKL is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=250
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_LPARCFG=y
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# Bus Options
|
||||
#
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
#
|
||||
# CONFIG_HOTPLUG_PCI is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM=y
|
||||
CONFIG_XFRM_USER=m
|
||||
CONFIG_NET_KEY=m
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
CONFIG_NET_IPIP=y
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
CONFIG_INET_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
|
||||
#
|
||||
# IP: Virtual Server Configuration
|
||||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
#
|
||||
CONFIG_IP_NF_CONNTRACK=m
|
||||
CONFIG_IP_NF_CT_ACCT=y
|
||||
CONFIG_IP_NF_CONNTRACK_MARK=y
|
||||
CONFIG_IP_NF_CONNTRACK_EVENTS=y
|
||||
CONFIG_IP_NF_CT_PROTO_SCTP=m
|
||||
CONFIG_IP_NF_FTP=m
|
||||
CONFIG_IP_NF_IRC=m
|
||||
# CONFIG_IP_NF_NETBIOS_NS is not set
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_LIMIT=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
CONFIG_IP_NF_MATCH_MAC=m
|
||||
CONFIG_IP_NF_MATCH_PKTTYPE=m
|
||||
CONFIG_IP_NF_MATCH_MARK=m
|
||||
CONFIG_IP_NF_MATCH_MULTIPORT=m
|
||||
CONFIG_IP_NF_MATCH_TOS=m
|
||||
CONFIG_IP_NF_MATCH_RECENT=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_DSCP=m
|
||||
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||
CONFIG_IP_NF_MATCH_LENGTH=m
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_MATCH_TCPMSS=m
|
||||
CONFIG_IP_NF_MATCH_HELPER=m
|
||||
CONFIG_IP_NF_MATCH_STATE=m
|
||||
CONFIG_IP_NF_MATCH_CONNTRACK=m
|
||||
CONFIG_IP_NF_MATCH_OWNER=m
|
||||
CONFIG_IP_NF_MATCH_ADDRTYPE=m
|
||||
CONFIG_IP_NF_MATCH_REALM=m
|
||||
CONFIG_IP_NF_MATCH_SCTP=m
|
||||
# CONFIG_IP_NF_MATCH_DCCP is not set
|
||||
CONFIG_IP_NF_MATCH_COMMENT=m
|
||||
CONFIG_IP_NF_MATCH_CONNMARK=m
|
||||
CONFIG_IP_NF_MATCH_CONNBYTES=m
|
||||
CONFIG_IP_NF_MATCH_HASHLIMIT=m
|
||||
CONFIG_IP_NF_MATCH_STRING=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_LOG=m
|
||||
CONFIG_IP_NF_TARGET_ULOG=m
|
||||
CONFIG_IP_NF_TARGET_TCPMSS=m
|
||||
CONFIG_IP_NF_TARGET_NFQUEUE=m
|
||||
CONFIG_IP_NF_NAT=m
|
||||
CONFIG_IP_NF_NAT_NEEDED=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=m
|
||||
CONFIG_IP_NF_TARGET_REDIRECT=m
|
||||
CONFIG_IP_NF_TARGET_NETMAP=m
|
||||
CONFIG_IP_NF_TARGET_SAME=m
|
||||
CONFIG_IP_NF_NAT_SNMP_BASIC=m
|
||||
CONFIG_IP_NF_NAT_IRC=m
|
||||
CONFIG_IP_NF_NAT_FTP=m
|
||||
CONFIG_IP_NF_NAT_TFTP=m
|
||||
CONFIG_IP_NF_NAT_AMANDA=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_TARGET_TOS=m
|
||||
CONFIG_IP_NF_TARGET_ECN=m
|
||||
CONFIG_IP_NF_TARGET_DSCP=m
|
||||
CONFIG_IP_NF_TARGET_MARK=m
|
||||
CONFIG_IP_NF_TARGET_CLASSIFY=m
|
||||
CONFIG_IP_NF_TARGET_TTL=m
|
||||
CONFIG_IP_NF_TARGET_CONNMARK=m
|
||||
CONFIG_IP_NF_TARGET_CLUSTERIP=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_IP_NF_TARGET_NOTRACK=m
|
||||
CONFIG_IP_NF_ARPTABLES=m
|
||||
CONFIG_IP_NF_ARPFILTER=m
|
||||
CONFIG_IP_NF_ARP_MANGLE=m
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
CONFIG_LLC=y
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
CONFIG_NET_CLS_ROUTE=y
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=m
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_FD is not set
|
||||
# CONFIG_BLK_CPQ_DA is not set
|
||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||
# CONFIG_BLK_DEV_DAC960 is not set
|
||||
# CONFIG_BLK_DEV_UMEM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
# CONFIG_BLK_DEV_SX8 is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=65536
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transport Attributes
|
||||
#
|
||||
CONFIG_SCSI_SPI_ATTRS=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
# CONFIG_SCSI_AACRAID is not set
|
||||
# CONFIG_SCSI_AIC7XXX is not set
|
||||
# CONFIG_SCSI_AIC7XXX_OLD is not set
|
||||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
# CONFIG_MEGARAID_SAS is not set
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_BUSLOGIC is not set
|
||||
# CONFIG_SCSI_DMX3191D is not set
|
||||
# CONFIG_SCSI_EATA is not set
|
||||
# CONFIG_SCSI_FUTURE_DOMAIN is not set
|
||||
# CONFIG_SCSI_GDTH is not set
|
||||
# CONFIG_SCSI_IPS is not set
|
||||
CONFIG_SCSI_IBMVSCSI=m
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_IPR 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_LPFC is not set
|
||||
# CONFIG_SCSI_DC395x is not set
|
||||
# CONFIG_SCSI_DC390T is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_LINEAR=y
|
||||
CONFIG_MD_RAID0=y
|
||||
CONFIG_MD_RAID1=y
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=y
|
||||
CONFIG_MD_RAID6=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
CONFIG_DM_CRYPT=m
|
||||
CONFIG_DM_SNAPSHOT=m
|
||||
CONFIG_DM_MIRROR=m
|
||||
CONFIG_DM_ZERO=m
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
# CONFIG_I2O is not set
|
||||
|
||||
#
|
||||
# Macintosh device drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
# CONFIG_EQUALIZER is not set
|
||||
CONFIG_TUN=m
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
#
|
||||
# CONFIG_ARCNET is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
# CONFIG_NET_VENDOR_3COM is not set
|
||||
|
||||
#
|
||||
# Tulip family network device support
|
||||
#
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
CONFIG_PCNET32=y
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_DGRS is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
CONFIG_E100=y
|
||||
# CONFIG_FEALNX is not set
|
||||
# CONFIG_NATSEMI is not set
|
||||
# CONFIG_NE2K_PCI is not set
|
||||
# CONFIG_8139CP is not set
|
||||
# CONFIG_8139TOO is not set
|
||||
# CONFIG_SIS900 is not set
|
||||
# CONFIG_EPIC100 is not set
|
||||
# CONFIG_SUNDANCE is not set
|
||||
# CONFIG_VIA_RHINE is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
CONFIG_ACENIC=m
|
||||
# CONFIG_ACENIC_OMIT_TIGON_I is not set
|
||||
# CONFIG_DL2K is not set
|
||||
CONFIG_E1000=m
|
||||
# CONFIG_E1000_NAPI is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
# CONFIG_R8169 is not set
|
||||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
CONFIG_TR=y
|
||||
CONFIG_IBMOL=y
|
||||
# CONFIG_3C359 is not set
|
||||
# CONFIG_TMS380TR is not set
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
CONFIG_ISERIES_VETH=y
|
||||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
CONFIG_PPP=m
|
||||
# CONFIG_PPP_MULTILINK is not set
|
||||
# CONFIG_PPP_FILTER is not set
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_BSDCOMP=m
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
CONFIG_NETCONSOLE=y
|
||||
CONFIG_NETPOLL=y
|
||||
CONFIG_NETPOLL_RX=y
|
||||
CONFIG_NETPOLL_TRAP=y
|
||||
CONFIG_NET_POLL_CONTROLLER=y
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=m
|
||||
CONFIG_SERIAL_ICOM=m
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_AGP is not set
|
||||
# CONFIG_DRM is not set
|
||||
CONFIG_RAW_DRIVER=y
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
# CONFIG_HANGCHECK_TIMER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
#
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
CONFIG_EXT2_FS_SECURITY=y
|
||||
CONFIG_EXT2_FS_XIP=y
|
||||
CONFIG_FS_XIP=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
CONFIG_EXT3_FS_SECURITY=y
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_REISERFS_FS=y
|
||||
# CONFIG_REISERFS_CHECK is not set
|
||||
# CONFIG_REISERFS_PROC_INFO is not set
|
||||
CONFIG_REISERFS_FS_XATTR=y
|
||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
||||
CONFIG_REISERFS_FS_SECURITY=y
|
||||
CONFIG_JFS_FS=m
|
||||
CONFIG_JFS_POSIX_ACL=y
|
||||
CONFIG_JFS_SECURITY=y
|
||||
# CONFIG_JFS_DEBUG is not set
|
||||
# CONFIG_JFS_STATISTICS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_XFS_FS=m
|
||||
CONFIG_XFS_EXPORT=y
|
||||
# CONFIG_XFS_QUOTA is not set
|
||||
CONFIG_XFS_SECURITY=y
|
||||
CONFIG_XFS_POSIX_ACL=y
|
||||
# CONFIG_XFS_RT is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_AUTOFS_FS=m
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
CONFIG_ISO9660_FS=y
|
||||
CONFIG_JOLIET=y
|
||||
CONFIG_ZISOFS=y
|
||||
CONFIG_ZISOFS_FS=y
|
||||
CONFIG_UDF_FS=m
|
||||
CONFIG_UDF_NLS=y
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V2_ACL=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=m
|
||||
CONFIG_NFS_ACL_SUPPORT=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
CONFIG_RPCSEC_GSS_SPKM3=m
|
||||
# CONFIG_SMB_FS is not set
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
CONFIG_CIFS_XATTR=y
|
||||
CONFIG_CIFS_POSIX=y
|
||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# iSeries device drivers
|
||||
#
|
||||
CONFIG_VIOCONS=y
|
||||
CONFIG_VIODASD=y
|
||||
CONFIG_VIOCD=m
|
||||
CONFIG_VIOTAPE=m
|
||||
CONFIG_VIOPATH=y
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB 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_FS=y
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_DEBUG_STACK_USAGE=y
|
||||
# CONFIG_DEBUGGER is not set
|
||||
# CONFIG_PPCDBG is not set
|
||||
CONFIG_IRQSTACKS=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_NULL=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_SHA1=m
|
||||
CONFIG_CRYPTO_SHA256=m
|
||||
CONFIG_CRYPTO_SHA512=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_AES=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
CONFIG_CRYPTO_CAST6=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_DEFLATE=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_CRC32C=m
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_TEXTSEARCH=y
|
||||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_TEXTSEARCH_BM=m
|
||||
CONFIG_TEXTSEARCH_FSM=m
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -13,12 +13,15 @@ endif
|
|||
obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
|
||||
signal_32.o pmc.o
|
||||
obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
|
||||
ptrace32.o systbl.o
|
||||
signal_64.o ptrace32.o systbl.o
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
|
||||
obj-$(CONFIG_POWER4) += idle_power4.o
|
||||
obj-$(CONFIG_PPC_OF) += of_device.o
|
||||
obj-$(CONFIG_PPC_RTAS) += rtas.o
|
||||
obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o
|
||||
obj-$(CONFIG_RTAS_PROC) += rtas-proc.o
|
||||
obj-$(CONFIG_IBMVIO) += vio.o
|
||||
obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o
|
||||
|
||||
ifeq ($(CONFIG_PPC_MERGE),y)
|
||||
|
||||
|
@ -38,6 +41,7 @@ obj-$(CONFIG_PPC_OF) += prom_init.o
|
|||
obj-$(CONFIG_MODULES) += ppc_ksyms.o
|
||||
obj-$(CONFIG_BOOTX_TEXT) += btext.o
|
||||
obj-$(CONFIG_6xx) += idle_6xx.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
|
||||
ifeq ($(CONFIG_PPC_ISERIES),y)
|
||||
$(obj)/head_64.o: $(obj)/lparmap.s
|
||||
|
@ -46,8 +50,9 @@ endif
|
|||
|
||||
else
|
||||
# stuff used from here for ARCH=ppc or ARCH=ppc64
|
||||
smpobj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_PPC64) += traps.o process.o init_task.o time.o \
|
||||
setup-common.o
|
||||
setup-common.o $(smpobj-y)
|
||||
|
||||
|
||||
endif
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iSeries/HvLpEvent.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/compat.h>
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <asm/cputable.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/iSeries/LparMap.h>
|
||||
#include <asm/iseries/lpar_map.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
|
@ -1914,24 +1914,6 @@ _GLOBAL(hmt_start_secondary)
|
|||
blr
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
|
||||
_GLOBAL(smp_release_cpus)
|
||||
/* All secondary cpus are spinning on a common
|
||||
* spinloop, release them all now so they can start
|
||||
* to spin on their individual paca spinloops.
|
||||
* For non SMP kernels, the secondary cpus never
|
||||
* get out of the common spinloop.
|
||||
* XXX This does nothing useful on iSeries, secondaries are
|
||||
* already waiting on their paca.
|
||||
*/
|
||||
li r3,1
|
||||
LOADADDR(r5,__secondary_hold_spinloop)
|
||||
std r3,0(r5)
|
||||
sync
|
||||
blr
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
||||
/*
|
||||
* We put a few things here that have to be page-aligned.
|
||||
* This stuff goes at the beginning of the bss, which is page-aligned.
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
*/
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/iSeries/LparMap.h>
|
||||
#include <asm/iseries/lpar_map.h>
|
||||
|
||||
const struct LparMap __attribute__((__section__(".text"))) xLparMap = {
|
||||
.xNumberEsids = HvEsidsToMap,
|
||||
|
|
|
@ -91,6 +91,22 @@ typedef struct sigaltstack_32 {
|
|||
compat_size_t ss_size;
|
||||
} stack_32_t;
|
||||
|
||||
struct pt_regs32 {
|
||||
unsigned int gpr[32];
|
||||
unsigned int nip;
|
||||
unsigned int msr;
|
||||
unsigned int orig_gpr3; /* Used for restarting system calls */
|
||||
unsigned int ctr;
|
||||
unsigned int link;
|
||||
unsigned int xer;
|
||||
unsigned int ccr;
|
||||
unsigned int mq; /* 601 only (not used at present) */
|
||||
unsigned int trap; /* Reason for being here */
|
||||
unsigned int dar; /* Fault registers */
|
||||
unsigned int dsisr;
|
||||
unsigned int result; /* Result of a system call */
|
||||
};
|
||||
|
||||
struct sigcontext32 {
|
||||
unsigned int _unused[4];
|
||||
int signal;
|
|
@ -81,15 +81,6 @@ EXPORT_SYMBOL(_prep_type);
|
|||
EXPORT_SYMBOL(ucSystemType);
|
||||
#endif
|
||||
|
||||
#if !defined(__INLINE_BITOPS)
|
||||
EXPORT_SYMBOL(set_bit);
|
||||
EXPORT_SYMBOL(clear_bit);
|
||||
EXPORT_SYMBOL(change_bit);
|
||||
EXPORT_SYMBOL(test_and_set_bit);
|
||||
EXPORT_SYMBOL(test_and_clear_bit);
|
||||
EXPORT_SYMBOL(test_and_change_bit);
|
||||
#endif /* __INLINE_BITOPS */
|
||||
|
||||
EXPORT_SYMBOL(strcpy);
|
||||
EXPORT_SYMBOL(strncpy);
|
||||
EXPORT_SYMBOL(strcat);
|
||||
|
|
|
@ -48,8 +48,8 @@
|
|||
#include <asm/prom.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/machdep.h>
|
||||
#endif
|
||||
|
||||
extern unsigned long _get_SP(void);
|
||||
|
@ -201,27 +201,15 @@ int dump_spe(struct pt_regs *regs, elf_vrregset_t *evrregs)
|
|||
}
|
||||
#endif /* CONFIG_SPE */
|
||||
|
||||
static void set_dabr_spr(unsigned long val)
|
||||
{
|
||||
mtspr(SPRN_DABR, val);
|
||||
}
|
||||
|
||||
int set_dabr(unsigned long dabr)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
if (firmware_has_feature(FW_FEATURE_XDABR)) {
|
||||
/* We want to catch accesses from kernel and userspace */
|
||||
unsigned long flags = H_DABRX_KERNEL|H_DABRX_USER;
|
||||
ret = plpar_set_xdabr(dabr, flags);
|
||||
} else if (firmware_has_feature(FW_FEATURE_DABR)) {
|
||||
ret = plpar_set_dabr(dabr);
|
||||
} else
|
||||
if (ppc_md.set_dabr)
|
||||
return ppc_md.set_dabr(dabr);
|
||||
#endif
|
||||
set_dabr_spr(dabr);
|
||||
|
||||
return ret;
|
||||
mtspr(SPRN_DABR, dabr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
|
|
|
@ -1285,7 +1285,7 @@ static int __init early_init_dt_scan_memory(unsigned long node,
|
|||
|
||||
endp = reg + (l / sizeof(cell_t));
|
||||
|
||||
DBG("memory scan node %s ..., reg size %ld, data: %x %x %x %x, ...\n",
|
||||
DBG("memory scan node %s, reg size %ld, data: %x %x %x %x,\n",
|
||||
uname, l, reg[0], reg[1], reg[2], reg[3]);
|
||||
|
||||
while ((endp - reg) >= (dt_root_addr_cells + dt_root_size_cells)) {
|
||||
|
|
|
@ -2000,7 +2000,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
|
|||
#endif
|
||||
|
||||
/*
|
||||
* On pSeries and BPA, copy the CPU hold code
|
||||
* Copy the CPU hold code
|
||||
*/
|
||||
if (RELOC(of_platform) != PLATFORM_POWERMAC)
|
||||
copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
|
||||
|
|
|
@ -42,6 +42,13 @@ DEFINE_SPINLOCK(rtas_data_buf_lock);
|
|||
char rtas_data_buf[RTAS_DATA_BUF_SIZE] __cacheline_aligned;
|
||||
unsigned long rtas_rmo_buf;
|
||||
|
||||
/*
|
||||
* If non-NULL, this gets called when the kernel terminates.
|
||||
* This is done like this so rtas_flash can be a module.
|
||||
*/
|
||||
void (*rtas_flash_term_hook)(int);
|
||||
EXPORT_SYMBOL(rtas_flash_term_hook);
|
||||
|
||||
/*
|
||||
* call_rtas_display_status and call_rtas_display_status_delay
|
||||
* are designed only for very early low-level debugging, which
|
||||
|
@ -206,6 +213,7 @@ void rtas_progress(char *s, unsigned short hex)
|
|||
|
||||
spin_unlock(&progress_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */
|
||||
|
||||
int rtas_token(const char *service)
|
||||
{
|
||||
|
@ -492,6 +500,8 @@ int rtas_set_indicator(int indicator, int index, int new_value)
|
|||
|
||||
void rtas_restart(char *cmd)
|
||||
{
|
||||
if (rtas_flash_term_hook)
|
||||
rtas_flash_term_hook(SYS_RESTART);
|
||||
printk("RTAS system-reboot returned %d\n",
|
||||
rtas_call(rtas_token("system-reboot"), 0, 1, NULL));
|
||||
for (;;);
|
||||
|
@ -499,6 +509,8 @@ void rtas_restart(char *cmd)
|
|||
|
||||
void rtas_power_off(void)
|
||||
{
|
||||
if (rtas_flash_term_hook)
|
||||
rtas_flash_term_hook(SYS_POWER_OFF);
|
||||
/* allow power on only with power button press */
|
||||
printk("RTAS power-off returned %d\n",
|
||||
rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1));
|
||||
|
@ -507,7 +519,12 @@ void rtas_power_off(void)
|
|||
|
||||
void rtas_halt(void)
|
||||
{
|
||||
rtas_power_off();
|
||||
if (rtas_flash_term_hook)
|
||||
rtas_flash_term_hook(SYS_HALT);
|
||||
/* allow power on only with power button press */
|
||||
printk("RTAS power-off returned %d\n",
|
||||
rtas_call(rtas_token("power-off"), 2, 1, NULL, -1, -1));
|
||||
for (;;);
|
||||
}
|
||||
|
||||
/* Must be in the RMO region, so we place it here */
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <asm/delay.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/abs_addr.h>
|
||||
|
||||
#define MODULE_VERS "1.0"
|
||||
#define MODULE_NAME "rtas_flash"
|
||||
|
@ -71,10 +72,36 @@
|
|||
#define VALIDATE_BUF_SIZE 4096
|
||||
#define RTAS_MSG_MAXLEN 64
|
||||
|
||||
struct flash_block {
|
||||
char *data;
|
||||
unsigned long length;
|
||||
};
|
||||
|
||||
/* This struct is very similar but not identical to
|
||||
* that needed by the rtas flash update.
|
||||
* All we need to do for rtas is rewrite num_blocks
|
||||
* into a version/length and translate the pointers
|
||||
* to absolute.
|
||||
*/
|
||||
#define FLASH_BLOCKS_PER_NODE ((PAGE_SIZE - 16) / sizeof(struct flash_block))
|
||||
struct flash_block_list {
|
||||
unsigned long num_blocks;
|
||||
struct flash_block_list *next;
|
||||
struct flash_block blocks[FLASH_BLOCKS_PER_NODE];
|
||||
};
|
||||
struct flash_block_list_header { /* just the header of flash_block_list */
|
||||
unsigned long num_blocks;
|
||||
struct flash_block_list *next;
|
||||
};
|
||||
|
||||
static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL};
|
||||
|
||||
#define FLASH_BLOCK_LIST_VERSION (1UL)
|
||||
|
||||
/* Local copy of the flash block list.
|
||||
* We only allow one open of the flash proc file and create this
|
||||
* list as we go. This list will be put in the kernel's
|
||||
* rtas_firmware_flash_list global var once it is fully read.
|
||||
* list as we go. This list will be put in the
|
||||
* rtas_firmware_flash_list var once it is fully read.
|
||||
*
|
||||
* For convenience as we build the list we use virtual addrs,
|
||||
* we do not fill in the version number, and the length field
|
||||
|
@ -562,6 +589,86 @@ static int validate_flash_release(struct inode *inode, struct file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void rtas_flash_firmware(int reboot_type)
|
||||
{
|
||||
unsigned long image_size;
|
||||
struct flash_block_list *f, *next, *flist;
|
||||
unsigned long rtas_block_list;
|
||||
int i, status, update_token;
|
||||
|
||||
if (rtas_firmware_flash_list.next == NULL)
|
||||
return; /* nothing to do */
|
||||
|
||||
if (reboot_type != SYS_RESTART) {
|
||||
printk(KERN_ALERT "FLASH: firmware flash requires a reboot\n");
|
||||
printk(KERN_ALERT "FLASH: the firmware image will NOT be flashed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
update_token = rtas_token("ibm,update-flash-64-and-reboot");
|
||||
if (update_token == RTAS_UNKNOWN_SERVICE) {
|
||||
printk(KERN_ALERT "FLASH: ibm,update-flash-64-and-reboot "
|
||||
"is not available -- not a service partition?\n");
|
||||
printk(KERN_ALERT "FLASH: firmware will not be flashed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* NOTE: the "first" block list is a global var with no data
|
||||
* blocks in the kernel data segment. We do this because
|
||||
* we want to ensure this block_list addr is under 4GB.
|
||||
*/
|
||||
rtas_firmware_flash_list.num_blocks = 0;
|
||||
flist = (struct flash_block_list *)&rtas_firmware_flash_list;
|
||||
rtas_block_list = virt_to_abs(flist);
|
||||
if (rtas_block_list >= 4UL*1024*1024*1024) {
|
||||
printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n");
|
||||
/* Update the block_list in place. */
|
||||
image_size = 0;
|
||||
for (f = flist; f; f = next) {
|
||||
/* Translate data addrs to absolute */
|
||||
for (i = 0; i < f->num_blocks; i++) {
|
||||
f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data);
|
||||
image_size += f->blocks[i].length;
|
||||
}
|
||||
next = f->next;
|
||||
/* Don't translate NULL pointer for last entry */
|
||||
if (f->next)
|
||||
f->next = (struct flash_block_list *)virt_to_abs(f->next);
|
||||
else
|
||||
f->next = NULL;
|
||||
/* make num_blocks into the version/length field */
|
||||
f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16);
|
||||
}
|
||||
|
||||
printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size);
|
||||
printk(KERN_ALERT "FLASH: performing flash and reboot\n");
|
||||
rtas_progress("Flashing \n", 0x0);
|
||||
rtas_progress("Please Wait... ", 0x0);
|
||||
printk(KERN_ALERT "FLASH: this will take several minutes. Do not power off!\n");
|
||||
status = rtas_call(update_token, 1, 1, NULL, rtas_block_list);
|
||||
switch (status) { /* should only get "bad" status */
|
||||
case 0:
|
||||
printk(KERN_ALERT "FLASH: success\n");
|
||||
break;
|
||||
case -1:
|
||||
printk(KERN_ALERT "FLASH: hardware error. Firmware may not be not flashed\n");
|
||||
break;
|
||||
case -3:
|
||||
printk(KERN_ALERT "FLASH: image is corrupt or not correct for this platform. Firmware not flashed\n");
|
||||
break;
|
||||
case -4:
|
||||
printk(KERN_ALERT "FLASH: flash failed when partially complete. System may not reboot\n");
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void remove_flash_pde(struct proc_dir_entry *dp)
|
||||
{
|
||||
if (dp) {
|
||||
|
@ -701,6 +808,7 @@ int __init rtas_flash_init(void)
|
|||
if (rc != 0)
|
||||
goto cleanup;
|
||||
|
||||
rtas_flash_term_hook = rtas_flash_firmware;
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
|
@ -714,6 +822,7 @@ cleanup:
|
|||
|
||||
void __exit rtas_flash_cleanup(void)
|
||||
{
|
||||
rtas_flash_term_hook = NULL;
|
||||
remove_flash_pde(firmware_flash_pde);
|
||||
remove_flash_pde(firmware_update_pde);
|
||||
remove_flash_pde(validate_pde);
|
|
@ -170,11 +170,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#ifdef CONFIG_PPC64 /* XXX for now */
|
||||
pvr = per_cpu(pvr, cpu_id);
|
||||
#else
|
||||
pvr = cpu_data[cpu_id].pvr;
|
||||
#endif
|
||||
#else
|
||||
pvr = mfspr(SPRN_PVR);
|
||||
#endif
|
||||
|
@ -201,11 +197,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
|||
#ifdef CONFIG_TAU_AVERAGE
|
||||
/* more straightforward, but potentially misleading */
|
||||
seq_printf(m, "temperature \t: %u C (uncalibrated)\n",
|
||||
cpu_temp(i));
|
||||
cpu_temp(cpu_id));
|
||||
#else
|
||||
/* show the actual temp sensor range */
|
||||
u32 temp;
|
||||
temp = cpu_temp_both(i);
|
||||
temp = cpu_temp_both(cpu_id);
|
||||
seq_printf(m, "temperature \t: %u-%u C (uncalibrated)\n",
|
||||
temp & 0xff, temp >> 16);
|
||||
#endif
|
||||
|
@ -408,3 +404,118 @@ static int __init set_preferred_console(void)
|
|||
}
|
||||
console_initcall(set_preferred_console);
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
/**
|
||||
* setup_cpu_maps - initialize the following cpu maps:
|
||||
* cpu_possible_map
|
||||
* cpu_present_map
|
||||
* cpu_sibling_map
|
||||
*
|
||||
* Having the possible map set up early allows us to restrict allocations
|
||||
* of things like irqstacks to num_possible_cpus() rather than NR_CPUS.
|
||||
*
|
||||
* We do not initialize the online map here; cpus set their own bits in
|
||||
* cpu_online_map as they come up.
|
||||
*
|
||||
* This function is valid only for Open Firmware systems. finish_device_tree
|
||||
* must be called before using this.
|
||||
*
|
||||
* While we're here, we may as well set the "physical" cpu ids in the paca.
|
||||
*/
|
||||
void __init smp_setup_cpu_maps(void)
|
||||
{
|
||||
struct device_node *dn = NULL;
|
||||
int cpu = 0;
|
||||
int swap_cpuid = 0;
|
||||
|
||||
while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
|
||||
int *intserv;
|
||||
int j, len = sizeof(u32), nthreads = 1;
|
||||
|
||||
intserv = (int *)get_property(dn, "ibm,ppc-interrupt-server#s",
|
||||
&len);
|
||||
if (intserv)
|
||||
nthreads = len / sizeof(int);
|
||||
else {
|
||||
intserv = (int *) get_property(dn, "reg", NULL);
|
||||
if (!intserv)
|
||||
intserv = &cpu; /* assume logical == phys */
|
||||
}
|
||||
|
||||
for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
set_hard_smp_processor_id(cpu, intserv[j]);
|
||||
|
||||
if (intserv[j] == boot_cpuid_phys)
|
||||
swap_cpuid = cpu;
|
||||
cpu_set(cpu, cpu_possible_map);
|
||||
cpu++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Swap CPU id 0 with boot_cpuid_phys, so we can always assume that
|
||||
* boot cpu is logical 0.
|
||||
*/
|
||||
if (boot_cpuid_phys != get_hard_smp_processor_id(0)) {
|
||||
u32 tmp;
|
||||
tmp = get_hard_smp_processor_id(0);
|
||||
set_hard_smp_processor_id(0, boot_cpuid_phys);
|
||||
set_hard_smp_processor_id(swap_cpuid, tmp);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* On pSeries LPAR, we need to know how many cpus
|
||||
* could possibly be added to this partition.
|
||||
*/
|
||||
if (systemcfg->platform == PLATFORM_PSERIES_LPAR &&
|
||||
(dn = of_find_node_by_path("/rtas"))) {
|
||||
int num_addr_cell, num_size_cell, maxcpus;
|
||||
unsigned int *ireg;
|
||||
|
||||
num_addr_cell = prom_n_addr_cells(dn);
|
||||
num_size_cell = prom_n_size_cells(dn);
|
||||
|
||||
ireg = (unsigned int *)
|
||||
get_property(dn, "ibm,lrdr-capacity", NULL);
|
||||
|
||||
if (!ireg)
|
||||
goto out;
|
||||
|
||||
maxcpus = ireg[num_addr_cell + num_size_cell];
|
||||
|
||||
/* Double maxcpus for processors which have SMT capability */
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
maxcpus *= 2;
|
||||
|
||||
if (maxcpus > NR_CPUS) {
|
||||
printk(KERN_WARNING
|
||||
"Partition configured for %d cpus, "
|
||||
"operating system maximum is %d.\n",
|
||||
maxcpus, NR_CPUS);
|
||||
maxcpus = NR_CPUS;
|
||||
} else
|
||||
printk(KERN_INFO "Partition configured for %d cpus.\n",
|
||||
maxcpus);
|
||||
|
||||
for (cpu = 0; cpu < maxcpus; cpu++)
|
||||
cpu_set(cpu, cpu_possible_map);
|
||||
out:
|
||||
of_node_put(dn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the sibling map; assume only two threads per processor.
|
||||
*/
|
||||
for_each_cpu(cpu) {
|
||||
cpu_set(cpu, cpu_sibling_map[cpu]);
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
|
||||
}
|
||||
|
||||
systemcfg->processorCount = num_present_cpus();
|
||||
#endif /* CONFIG_PPC64 */
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
|
|
@ -288,6 +288,8 @@ void __init setup_arch(char **cmdline_p)
|
|||
unflatten_device_tree();
|
||||
finish_device_tree();
|
||||
|
||||
smp_setup_cpu_maps();
|
||||
|
||||
#ifdef CONFIG_BOOTX_TEXT
|
||||
init_boot_display();
|
||||
#endif
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
#include <asm/page.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/lmb.h>
|
||||
#include <asm/iSeries/ItLpNaca.h>
|
||||
#include <asm/iseries/it_lp_naca.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/xmon.h>
|
||||
|
@ -103,8 +103,6 @@ extern void htab_initialize(void);
|
|||
extern void early_init_devtree(void *flat_dt);
|
||||
extern void unflatten_device_tree(void);
|
||||
|
||||
extern void smp_release_cpus(void);
|
||||
|
||||
int have_of = 1;
|
||||
int boot_cpuid = 0;
|
||||
int boot_cpuid_phys = 0;
|
||||
|
@ -183,120 +181,14 @@ static int __init early_smt_enabled(char *p)
|
|||
}
|
||||
early_param("smt-enabled", early_smt_enabled);
|
||||
|
||||
/**
|
||||
* setup_cpu_maps - initialize the following cpu maps:
|
||||
* cpu_possible_map
|
||||
* cpu_present_map
|
||||
* cpu_sibling_map
|
||||
*
|
||||
* Having the possible map set up early allows us to restrict allocations
|
||||
* of things like irqstacks to num_possible_cpus() rather than NR_CPUS.
|
||||
*
|
||||
* We do not initialize the online map here; cpus set their own bits in
|
||||
* cpu_online_map as they come up.
|
||||
*
|
||||
* This function is valid only for Open Firmware systems. finish_device_tree
|
||||
* must be called before using this.
|
||||
*
|
||||
* While we're here, we may as well set the "physical" cpu ids in the paca.
|
||||
*/
|
||||
static void __init setup_cpu_maps(void)
|
||||
{
|
||||
struct device_node *dn = NULL;
|
||||
int cpu = 0;
|
||||
int swap_cpuid = 0;
|
||||
|
||||
check_smt_enabled();
|
||||
|
||||
while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
|
||||
u32 *intserv;
|
||||
int j, len = sizeof(u32), nthreads;
|
||||
|
||||
intserv = (u32 *)get_property(dn, "ibm,ppc-interrupt-server#s",
|
||||
&len);
|
||||
if (!intserv)
|
||||
intserv = (u32 *)get_property(dn, "reg", NULL);
|
||||
|
||||
nthreads = len / sizeof(u32);
|
||||
|
||||
for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
set_hard_smp_processor_id(cpu, intserv[j]);
|
||||
|
||||
if (intserv[j] == boot_cpuid_phys)
|
||||
swap_cpuid = cpu;
|
||||
cpu_set(cpu, cpu_possible_map);
|
||||
cpu++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Swap CPU id 0 with boot_cpuid_phys, so we can always assume that
|
||||
* boot cpu is logical 0.
|
||||
*/
|
||||
if (boot_cpuid_phys != get_hard_smp_processor_id(0)) {
|
||||
u32 tmp;
|
||||
tmp = get_hard_smp_processor_id(0);
|
||||
set_hard_smp_processor_id(0, boot_cpuid_phys);
|
||||
set_hard_smp_processor_id(swap_cpuid, tmp);
|
||||
}
|
||||
|
||||
/*
|
||||
* On pSeries LPAR, we need to know how many cpus
|
||||
* could possibly be added to this partition.
|
||||
*/
|
||||
if (systemcfg->platform == PLATFORM_PSERIES_LPAR &&
|
||||
(dn = of_find_node_by_path("/rtas"))) {
|
||||
int num_addr_cell, num_size_cell, maxcpus;
|
||||
unsigned int *ireg;
|
||||
|
||||
num_addr_cell = prom_n_addr_cells(dn);
|
||||
num_size_cell = prom_n_size_cells(dn);
|
||||
|
||||
ireg = (unsigned int *)
|
||||
get_property(dn, "ibm,lrdr-capacity", NULL);
|
||||
|
||||
if (!ireg)
|
||||
goto out;
|
||||
|
||||
maxcpus = ireg[num_addr_cell + num_size_cell];
|
||||
|
||||
/* Double maxcpus for processors which have SMT capability */
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
maxcpus *= 2;
|
||||
|
||||
if (maxcpus > NR_CPUS) {
|
||||
printk(KERN_WARNING
|
||||
"Partition configured for %d cpus, "
|
||||
"operating system maximum is %d.\n",
|
||||
maxcpus, NR_CPUS);
|
||||
maxcpus = NR_CPUS;
|
||||
} else
|
||||
printk(KERN_INFO "Partition configured for %d cpus.\n",
|
||||
maxcpus);
|
||||
|
||||
for (cpu = 0; cpu < maxcpus; cpu++)
|
||||
cpu_set(cpu, cpu_possible_map);
|
||||
out:
|
||||
of_node_put(dn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do the sibling map; assume only two threads per processor.
|
||||
*/
|
||||
for_each_cpu(cpu) {
|
||||
cpu_set(cpu, cpu_sibling_map[cpu]);
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
|
||||
}
|
||||
|
||||
systemcfg->processorCount = num_present_cpus();
|
||||
}
|
||||
#else
|
||||
#define check_smt_enabled()
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
extern struct machdep_calls pSeries_md;
|
||||
extern struct machdep_calls pmac_md;
|
||||
extern struct machdep_calls maple_md;
|
||||
extern struct machdep_calls bpa_md;
|
||||
extern struct machdep_calls cell_md;
|
||||
extern struct machdep_calls iseries_md;
|
||||
|
||||
/* Ultimately, stuff them in an elf section like initcalls... */
|
||||
|
@ -310,8 +202,8 @@ static struct machdep_calls __initdata *machines[] = {
|
|||
#ifdef CONFIG_PPC_MAPLE
|
||||
&maple_md,
|
||||
#endif /* CONFIG_PPC_MAPLE */
|
||||
#ifdef CONFIG_PPC_BPA
|
||||
&bpa_md,
|
||||
#ifdef CONFIG_PPC_CELL
|
||||
&cell_md,
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
&iseries_md,
|
||||
|
@ -400,6 +292,29 @@ void __init early_setup(unsigned long dt_ptr)
|
|||
}
|
||||
|
||||
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
|
||||
void smp_release_cpus(void)
|
||||
{
|
||||
extern unsigned long __secondary_hold_spinloop;
|
||||
|
||||
DBG(" -> smp_release_cpus()\n");
|
||||
|
||||
/* All secondary cpus are spinning on a common spinloop, release them
|
||||
* all now so they can start to spin on their individual paca
|
||||
* spinloops. For non SMP kernels, the secondary cpus never get out
|
||||
* of the common spinloop.
|
||||
* This is useless but harmless on iSeries, secondaries are already
|
||||
* waiting on their paca spinloops. */
|
||||
|
||||
__secondary_hold_spinloop = 1;
|
||||
mb();
|
||||
|
||||
DBG(" <- smp_release_cpus()\n");
|
||||
}
|
||||
#else
|
||||
#define smp_release_cpus()
|
||||
#endif /* CONFIG_SMP || CONFIG_KEXEC */
|
||||
|
||||
/*
|
||||
* Initialize some remaining members of the ppc64_caches and systemcfg structures
|
||||
* (at least until we get rid of them completely). This is mostly some
|
||||
|
@ -589,17 +504,13 @@ void __init setup_system(void)
|
|||
|
||||
parse_early_param();
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/*
|
||||
* iSeries has already initialized the cpu maps at this point.
|
||||
*/
|
||||
setup_cpu_maps();
|
||||
check_smt_enabled();
|
||||
smp_setup_cpu_maps();
|
||||
|
||||
/* Release secondary cpus out of their spinloops at 0x60 now that
|
||||
* we can map physical -> logical CPU ids
|
||||
*/
|
||||
smp_release_cpus();
|
||||
#endif
|
||||
|
||||
printk("Starting Linux PPC64 %s\n", system_utsname.version);
|
||||
|
||||
|
@ -631,23 +542,6 @@ static int ppc64_panic_event(struct notifier_block *this,
|
|||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
/*
|
||||
* On iSeries we just parse the mem=X option from the command line.
|
||||
* On pSeries it's a bit more complicated, see prom_init_mem()
|
||||
*/
|
||||
static int __init early_parsemem(char *p)
|
||||
{
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
memory_limit = ALIGN(memparse(p, &p), PAGE_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
early_param("mem", early_parsemem);
|
||||
#endif /* CONFIG_PPC_ISERIES */
|
||||
|
||||
#ifdef CONFIG_IRQSTACKS
|
||||
static void __init irqstack_early_init(void)
|
||||
{
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/ppc32.h>
|
||||
#include "ppc32.h"
|
||||
#include <asm/ppcdebug.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vdso.h>
|
||||
|
|
|
@ -22,11 +22,11 @@ enum {
|
|||
};
|
||||
|
||||
static struct {
|
||||
volatile long tb;
|
||||
volatile long mark;
|
||||
volatile u64 tb;
|
||||
volatile u64 mark;
|
||||
volatile int cmd;
|
||||
volatile int handshake;
|
||||
int filler[3];
|
||||
int filler[2];
|
||||
|
||||
volatile int ack;
|
||||
int filler2[7];
|
||||
|
@ -36,89 +36,80 @@ static struct {
|
|||
|
||||
static volatile int running;
|
||||
|
||||
static void __devinit
|
||||
enter_contest( long mark, long add )
|
||||
static void __devinit enter_contest(u64 mark, long add)
|
||||
{
|
||||
while( (long)(mftb() - mark) < 0 )
|
||||
while (get_tb() < mark)
|
||||
tbsync->race_result = add;
|
||||
}
|
||||
|
||||
void __devinit
|
||||
smp_generic_take_timebase( void )
|
||||
void __devinit smp_generic_take_timebase(void)
|
||||
{
|
||||
int cmd;
|
||||
long tb;
|
||||
u64 tb;
|
||||
|
||||
local_irq_disable();
|
||||
while( !running )
|
||||
;
|
||||
while (!running)
|
||||
barrier();
|
||||
rmb();
|
||||
|
||||
for( ;; ) {
|
||||
for (;;) {
|
||||
tbsync->ack = 1;
|
||||
while( !tbsync->handshake )
|
||||
;
|
||||
while (!tbsync->handshake)
|
||||
barrier();
|
||||
rmb();
|
||||
|
||||
cmd = tbsync->cmd;
|
||||
tb = tbsync->tb;
|
||||
mb();
|
||||
tbsync->ack = 0;
|
||||
if( cmd == kExit )
|
||||
return;
|
||||
if (cmd == kExit)
|
||||
break;
|
||||
|
||||
if( cmd == kSetAndTest ) {
|
||||
while( tbsync->handshake )
|
||||
;
|
||||
asm volatile ("mttbl %0" :: "r" (tb & 0xfffffffful) );
|
||||
asm volatile ("mttbu %0" :: "r" (tb >> 32) );
|
||||
} else {
|
||||
while( tbsync->handshake )
|
||||
;
|
||||
}
|
||||
enter_contest( tbsync->mark, -1 );
|
||||
while (tbsync->handshake)
|
||||
barrier();
|
||||
if (cmd == kSetAndTest)
|
||||
set_tb(tb >> 32, tb & 0xfffffffful);
|
||||
enter_contest(tbsync->mark, -1);
|
||||
}
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
static int __devinit
|
||||
start_contest( int cmd, long offset, long num )
|
||||
static int __devinit start_contest(int cmd, long offset, int num)
|
||||
{
|
||||
int i, score=0;
|
||||
long tb, mark;
|
||||
u64 tb;
|
||||
long mark;
|
||||
|
||||
tbsync->cmd = cmd;
|
||||
|
||||
local_irq_disable();
|
||||
for( i=-3; i<num; ) {
|
||||
tb = (long)mftb() + 400;
|
||||
for (i = -3; i < num; ) {
|
||||
tb = get_tb() + 400;
|
||||
tbsync->tb = tb + offset;
|
||||
tbsync->mark = mark = tb + 400;
|
||||
|
||||
wmb();
|
||||
|
||||
tbsync->handshake = 1;
|
||||
while( tbsync->ack )
|
||||
;
|
||||
while (tbsync->ack)
|
||||
barrier();
|
||||
|
||||
while( (long)(mftb() - tb) <= 0 )
|
||||
;
|
||||
while (get_tb() <= tb)
|
||||
barrier();
|
||||
tbsync->handshake = 0;
|
||||
enter_contest( mark, 1 );
|
||||
enter_contest(mark, 1);
|
||||
|
||||
while( !tbsync->ack )
|
||||
;
|
||||
while (!tbsync->ack)
|
||||
barrier();
|
||||
|
||||
if ((tbsync->tb ^ (long)mftb()) & 0x8000000000000000ul)
|
||||
continue;
|
||||
if( i++ > 0 )
|
||||
if (i++ > 0)
|
||||
score += tbsync->race_result;
|
||||
}
|
||||
local_irq_enable();
|
||||
return score;
|
||||
}
|
||||
|
||||
void __devinit
|
||||
smp_generic_give_timebase( void )
|
||||
void __devinit smp_generic_give_timebase(void)
|
||||
{
|
||||
int i, score, score2, old, min=0, max=5000, offset=1000;
|
||||
|
||||
|
@ -130,14 +121,14 @@ smp_generic_give_timebase( void )
|
|||
mb();
|
||||
running = 1;
|
||||
|
||||
while( !tbsync->ack )
|
||||
;
|
||||
while (!tbsync->ack)
|
||||
barrier();
|
||||
|
||||
printk("Got ack\n");
|
||||
|
||||
/* binary search */
|
||||
for( old=-1 ; old != offset ; offset=(min+max)/2 ) {
|
||||
score = start_contest( kSetAndTest, offset, NUM_ITER );
|
||||
for (old = -1; old != offset ; offset = (min+max) / 2) {
|
||||
score = start_contest(kSetAndTest, offset, NUM_ITER);
|
||||
|
||||
printk("score %d, offset %d\n", score, offset );
|
||||
|
||||
|
@ -147,21 +138,22 @@ smp_generic_give_timebase( void )
|
|||
min = offset;
|
||||
old = offset;
|
||||
}
|
||||
score = start_contest( kSetAndTest, min, NUM_ITER );
|
||||
score2 = start_contest( kSetAndTest, max, NUM_ITER );
|
||||
score = start_contest(kSetAndTest, min, NUM_ITER);
|
||||
score2 = start_contest(kSetAndTest, max, NUM_ITER);
|
||||
|
||||
printk( "Min %d (score %d), Max %d (score %d)\n", min, score, max, score2 );
|
||||
score = abs( score );
|
||||
score2 = abs( score2 );
|
||||
printk("Min %d (score %d), Max %d (score %d)\n",
|
||||
min, score, max, score2);
|
||||
score = abs(score);
|
||||
score2 = abs(score2);
|
||||
offset = (score < score2) ? min : max;
|
||||
|
||||
/* guard against inaccurate mttb */
|
||||
for( i=0; i<10; i++ ) {
|
||||
start_contest( kSetAndTest, offset, NUM_ITER/10 );
|
||||
for (i = 0; i < 10; i++) {
|
||||
start_contest(kSetAndTest, offset, NUM_ITER/10);
|
||||
|
||||
if( (score2=start_contest(kTest, offset, NUM_ITER)) < 0 )
|
||||
if ((score2 = start_contest(kTest, offset, NUM_ITER)) < 0)
|
||||
score2 = -score2;
|
||||
if( score2 <= score || score2 < 20 )
|
||||
if (score2 <= score || score2 < 20)
|
||||
break;
|
||||
}
|
||||
printk("Final offset: %d (%d/%d)\n", offset, score2, NUM_ITER );
|
||||
|
@ -170,10 +162,10 @@ smp_generic_give_timebase( void )
|
|||
tbsync->cmd = kExit;
|
||||
wmb();
|
||||
tbsync->handshake = 1;
|
||||
while( tbsync->ack )
|
||||
;
|
||||
while (tbsync->ack)
|
||||
barrier();
|
||||
tbsync->handshake = 0;
|
||||
kfree( tbsync );
|
||||
kfree(tbsync);
|
||||
tbsync = NULL;
|
||||
running = 0;
|
||||
}
|
|
@ -39,13 +39,18 @@
|
|||
#include <asm/pgtable.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/xmon.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/mpic.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
#endif
|
||||
|
||||
int smp_hw_index[NR_CPUS];
|
||||
struct thread_info *secondary_ti;
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
|
@ -60,6 +65,7 @@ cpumask_t cpu_sibling_map[NR_CPUS] = { [0 ... NR_CPUS-1] = CPU_MASK_NONE };
|
|||
EXPORT_SYMBOL(cpu_online_map);
|
||||
EXPORT_SYMBOL(cpu_possible_map);
|
||||
|
||||
/* SMP operations for this machine */
|
||||
struct smp_ops_t *smp_ops;
|
||||
|
||||
static volatile unsigned int cpu_callin_map[NR_CPUS];
|
||||
|
@ -89,7 +95,9 @@ void __devinit smp_mpic_setup_cpu(int cpu)
|
|||
{
|
||||
mpic_setup_this_cpu();
|
||||
}
|
||||
#endif /* CONFIG_MPIC */
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
void __devinit smp_generic_kick_cpu(int nr)
|
||||
{
|
||||
BUG_ON(nr < 0 || nr >= NR_CPUS);
|
||||
|
@ -102,8 +110,7 @@ void __devinit smp_generic_kick_cpu(int nr)
|
|||
paca[nr].cpu_start = 1;
|
||||
smp_mb();
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MPIC */
|
||||
#endif
|
||||
|
||||
void smp_message_recv(int msg, struct pt_regs *regs)
|
||||
{
|
||||
|
@ -111,15 +118,10 @@ void smp_message_recv(int msg, struct pt_regs *regs)
|
|||
case PPC_MSG_CALL_FUNCTION:
|
||||
smp_call_function_interrupt();
|
||||
break;
|
||||
case PPC_MSG_RESCHEDULE:
|
||||
case PPC_MSG_RESCHEDULE:
|
||||
/* XXX Do we have to do this? */
|
||||
set_need_resched();
|
||||
break;
|
||||
#if 0
|
||||
case PPC_MSG_MIGRATE_TASK:
|
||||
/* spare */
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_DEBUGGER
|
||||
case PPC_MSG_DEBUGGER_BREAK:
|
||||
debugger_ipi(regs);
|
||||
|
@ -171,8 +173,8 @@ static struct call_data_struct {
|
|||
int wait;
|
||||
} *call_data;
|
||||
|
||||
/* delay of at least 8 seconds on 1GHz cpu */
|
||||
#define SMP_CALL_TIMEOUT (1UL << (30 + 3))
|
||||
/* delay of at least 8 seconds */
|
||||
#define SMP_CALL_TIMEOUT 8
|
||||
|
||||
/*
|
||||
* This function sends a 'generic call function' IPI to all other CPUs
|
||||
|
@ -194,7 +196,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
{
|
||||
struct call_data_struct data;
|
||||
int ret = -1, cpus;
|
||||
unsigned long timeout;
|
||||
u64 timeout;
|
||||
|
||||
/* Can deadlock when called with interrupts disabled */
|
||||
WARN_ON(irqs_disabled());
|
||||
|
@ -220,11 +222,12 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
/* Send a message to all other CPUs and wait for them to respond */
|
||||
smp_ops->message_pass(MSG_ALL_BUT_SELF, PPC_MSG_CALL_FUNCTION);
|
||||
|
||||
timeout = get_tb() + (u64) SMP_CALL_TIMEOUT * tb_ticks_per_sec;
|
||||
|
||||
/* Wait for response */
|
||||
timeout = SMP_CALL_TIMEOUT;
|
||||
while (atomic_read(&data.started) != cpus) {
|
||||
HMT_low();
|
||||
if (--timeout == 0) {
|
||||
if (get_tb() >= timeout) {
|
||||
printk("smp_call_function on cpu %d: other cpus not "
|
||||
"responding (%d)\n", smp_processor_id(),
|
||||
atomic_read(&data.started));
|
||||
|
@ -234,10 +237,9 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
}
|
||||
|
||||
if (wait) {
|
||||
timeout = SMP_CALL_TIMEOUT;
|
||||
while (atomic_read(&data.finished) != cpus) {
|
||||
HMT_low();
|
||||
if (--timeout == 0) {
|
||||
if (get_tb() >= timeout) {
|
||||
printk("smp_call_function on cpu %d: other "
|
||||
"cpus not finishing (%d/%d)\n",
|
||||
smp_processor_id(),
|
||||
|
@ -251,7 +253,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
|
|||
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
out:
|
||||
call_data = NULL;
|
||||
HMT_medium();
|
||||
spin_unlock(&call_lock);
|
||||
|
@ -313,8 +315,11 @@ static void __init smp_create_idle(unsigned int cpu)
|
|||
p = fork_idle(cpu);
|
||||
if (IS_ERR(p))
|
||||
panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
|
||||
#ifdef CONFIG_PPC64
|
||||
paca[cpu].__current = p;
|
||||
#endif
|
||||
current_set[cpu] = p->thread_info;
|
||||
p->thread_info->cpu = cpu;
|
||||
}
|
||||
|
||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
|
@ -333,18 +338,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
smp_store_cpu_info(boot_cpuid);
|
||||
cpu_callin_map[boot_cpuid] = 1;
|
||||
|
||||
#ifndef CONFIG_PPC_ISERIES
|
||||
paca[boot_cpuid].next_jiffy_update_tb = tb_last_stamp = get_tb();
|
||||
|
||||
/*
|
||||
* Should update do_gtod.stamp_xsec.
|
||||
* For now we leave it which means the time can be some
|
||||
* number of msecs off until someone does a settimeofday()
|
||||
*/
|
||||
do_gtod.varp->tb_orig_stamp = tb_last_stamp;
|
||||
systemcfg->tb_orig_stamp = tb_last_stamp;
|
||||
#endif
|
||||
|
||||
max_cpus = smp_ops->probe();
|
||||
|
||||
smp_space_timers(max_cpus);
|
||||
|
@ -359,8 +352,9 @@ void __devinit smp_prepare_boot_cpu(void)
|
|||
BUG_ON(smp_processor_id() != boot_cpuid);
|
||||
|
||||
cpu_set(boot_cpuid, cpu_online_map);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
paca[boot_cpuid].__current = current;
|
||||
#endif
|
||||
current_set[boot_cpuid] = current->thread_info;
|
||||
}
|
||||
|
||||
|
@ -444,13 +438,16 @@ int __devinit __cpu_up(unsigned int cpu)
|
|||
{
|
||||
int c;
|
||||
|
||||
secondary_ti = current_set[cpu];
|
||||
if (!cpu_enable(cpu))
|
||||
return 0;
|
||||
|
||||
if (smp_ops->cpu_bootable && !smp_ops->cpu_bootable(cpu))
|
||||
return -EINVAL;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
paca[cpu].default_decr = tb_ticks_per_jiffy;
|
||||
#endif
|
||||
|
||||
/* Make sure callin-map entry is 0 (can be leftover a CPU
|
||||
* hotplug
|
||||
|
@ -513,7 +510,7 @@ int __devinit start_secondary(void *unused)
|
|||
current->active_mm = &init_mm;
|
||||
|
||||
smp_store_cpu_info(cpu);
|
||||
set_dec(paca[cpu].default_decr);
|
||||
set_dec(tb_ticks_per_jiffy);
|
||||
cpu_callin_map[cpu] = 1;
|
||||
|
||||
smp_ops->setup_cpu(cpu);
|
|
@ -66,8 +66,8 @@
|
|||
#include <asm/firmware.h>
|
||||
#endif
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
#endif
|
||||
|
||||
/* keep track of when we need to update the rtc */
|
||||
|
|
|
@ -147,8 +147,8 @@ int die(const char *str, struct pt_regs *regs, long err)
|
|||
printk("POWERMAC ");
|
||||
nl = 1;
|
||||
break;
|
||||
case PLATFORM_BPA:
|
||||
printk("BPA ");
|
||||
case PLATFORM_CELL:
|
||||
printk("CELL ");
|
||||
nl = 1;
|
||||
break;
|
||||
}
|
||||
|
@ -749,22 +749,22 @@ static int check_bug_trap(struct pt_regs *regs)
|
|||
if (bug->line & BUG_WARNING_TRAP) {
|
||||
/* this is a WARN_ON rather than BUG/BUG_ON */
|
||||
#ifdef CONFIG_XMON
|
||||
xmon_printf(KERN_ERR "Badness in %s at %s:%d\n",
|
||||
xmon_printf(KERN_ERR "Badness in %s at %s:%ld\n",
|
||||
bug->function, bug->file,
|
||||
bug->line & ~BUG_WARNING_TRAP);
|
||||
#endif /* CONFIG_XMON */
|
||||
printk(KERN_ERR "Badness in %s at %s:%d\n",
|
||||
printk(KERN_ERR "Badness in %s at %s:%ld\n",
|
||||
bug->function, bug->file,
|
||||
bug->line & ~BUG_WARNING_TRAP);
|
||||
dump_stack();
|
||||
return 1;
|
||||
}
|
||||
#ifdef CONFIG_XMON
|
||||
xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%d!\n",
|
||||
xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
|
||||
bug->function, bug->file, bug->line);
|
||||
xmon(regs);
|
||||
#endif /* CONFIG_XMON */
|
||||
printk(KERN_CRIT "kernel BUG in %s at %s:%d!\n",
|
||||
printk(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
|
||||
bug->function, bug->file, bug->line);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -3,9 +3,12 @@
|
|||
#include <asm/page.h>
|
||||
#else
|
||||
#define PAGE_SIZE 4096
|
||||
#define KERNELBASE CONFIG_KERNEL_START
|
||||
#endif
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
|
||||
ENTRY(_stext)
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
OUTPUT_ARCH(powerpc:common64)
|
||||
jiffies = jiffies_64;
|
||||
|
@ -21,33 +24,9 @@ SECTIONS
|
|||
*(.exit.data)
|
||||
}
|
||||
|
||||
. = KERNELBASE;
|
||||
|
||||
/* Read-only sections, merged into text segment: */
|
||||
#ifdef CONFIG_PPC32
|
||||
. = + SIZEOF_HEADERS;
|
||||
.interp : { *(.interp) }
|
||||
.hash : { *(.hash) }
|
||||
.dynsym : { *(.dynsym) }
|
||||
.dynstr : { *(.dynstr) }
|
||||
.rel.text : { *(.rel.text) }
|
||||
.rela.text : { *(.rela.text) }
|
||||
.rel.data : { *(.rel.data) }
|
||||
.rela.data : { *(.rela.data) }
|
||||
.rel.rodata : { *(.rel.rodata) }
|
||||
.rela.rodata : { *(.rela.rodata) }
|
||||
.rel.got : { *(.rel.got) }
|
||||
.rela.got : { *(.rela.got) }
|
||||
.rel.ctors : { *(.rel.ctors) }
|
||||
.rela.ctors : { *(.rela.ctors) }
|
||||
.rel.dtors : { *(.rel.dtors) }
|
||||
.rela.dtors : { *(.rela.dtors) }
|
||||
.rel.bss : { *(.rel.bss) }
|
||||
.rela.bss : { *(.rela.bss) }
|
||||
.rel.plt : { *(.rel.plt) }
|
||||
.rela.plt : { *(.rela.plt) }
|
||||
/* .init : { *(.init) } =0*/
|
||||
.plt : { *(.plt) }
|
||||
#endif
|
||||
.text : {
|
||||
*(.text .text.*)
|
||||
SCHED_TEXT
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
#
|
||||
|
||||
ifeq ($(CONFIG_PPC_MERGE),y)
|
||||
obj-y := string.o
|
||||
obj-y := string.o strcase.o
|
||||
obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o
|
||||
endif
|
||||
|
||||
obj-y += strcase.o
|
||||
obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o
|
||||
obj-y += bitops.o
|
||||
obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
|
||||
memcpy_64.o usercopy_64.o mem_64.o
|
||||
memcpy_64.o usercopy_64.o mem_64.o string.o \
|
||||
strcase.o
|
||||
obj-$(CONFIG_PPC_ISERIES) += e2a.o
|
||||
obj-$(CONFIG_XMON) += sstep.o
|
||||
|
||||
|
|
|
@ -1,79 +1,40 @@
|
|||
/*
|
||||
* These are too big to be inlined.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <asm/byteorder.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
|
||||
unsigned long offset)
|
||||
{
|
||||
const unsigned long *p = addr + (offset >> 6);
|
||||
unsigned long result = offset & ~63UL;
|
||||
unsigned long tmp;
|
||||
|
||||
if (offset >= size)
|
||||
return size;
|
||||
size -= result;
|
||||
offset &= 63UL;
|
||||
if (offset) {
|
||||
tmp = *(p++);
|
||||
tmp |= ~0UL >> (64 - offset);
|
||||
if (size < 64)
|
||||
goto found_first;
|
||||
if (~tmp)
|
||||
goto found_middle;
|
||||
size -= 64;
|
||||
result += 64;
|
||||
}
|
||||
while (size & ~63UL) {
|
||||
if (~(tmp = *(p++)))
|
||||
goto found_middle;
|
||||
result += 64;
|
||||
size -= 64;
|
||||
}
|
||||
if (!size)
|
||||
return result;
|
||||
tmp = *p;
|
||||
|
||||
found_first:
|
||||
tmp |= ~0UL << size;
|
||||
if (tmp == ~0UL) /* Are any bits zero? */
|
||||
return result + size; /* Nope. */
|
||||
found_middle:
|
||||
return result + ffz(tmp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(find_next_zero_bit);
|
||||
|
||||
/**
|
||||
* find_next_bit - find the next set bit in a memory region
|
||||
* @addr: The address to base the search on
|
||||
* @offset: The bitnumber to start searching at
|
||||
* @size: The maximum size to search
|
||||
*/
|
||||
unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
|
||||
unsigned long offset)
|
||||
{
|
||||
const unsigned long *p = addr + (offset >> 6);
|
||||
unsigned long result = offset & ~63UL;
|
||||
const unsigned long *p = addr + BITOP_WORD(offset);
|
||||
unsigned long result = offset & ~(BITS_PER_LONG-1);
|
||||
unsigned long tmp;
|
||||
|
||||
if (offset >= size)
|
||||
return size;
|
||||
size -= result;
|
||||
offset &= 63UL;
|
||||
offset %= BITS_PER_LONG;
|
||||
if (offset) {
|
||||
tmp = *(p++);
|
||||
tmp &= (~0UL << offset);
|
||||
if (size < 64)
|
||||
if (size < BITS_PER_LONG)
|
||||
goto found_first;
|
||||
if (tmp)
|
||||
goto found_middle;
|
||||
size -= 64;
|
||||
result += 64;
|
||||
size -= BITS_PER_LONG;
|
||||
result += BITS_PER_LONG;
|
||||
}
|
||||
while (size & ~63UL) {
|
||||
while (size & ~(BITS_PER_LONG-1)) {
|
||||
if ((tmp = *(p++)))
|
||||
goto found_middle;
|
||||
result += 64;
|
||||
size -= 64;
|
||||
result += BITS_PER_LONG;
|
||||
size -= BITS_PER_LONG;
|
||||
}
|
||||
if (!size)
|
||||
return result;
|
||||
|
@ -86,9 +47,52 @@ found_first:
|
|||
found_middle:
|
||||
return result + __ffs(tmp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(find_next_bit);
|
||||
|
||||
/*
|
||||
* This implementation of find_{first,next}_zero_bit was stolen from
|
||||
* Linus' asm-alpha/bitops.h.
|
||||
*/
|
||||
unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
|
||||
unsigned long offset)
|
||||
{
|
||||
const unsigned long *p = addr + BITOP_WORD(offset);
|
||||
unsigned long result = offset & ~(BITS_PER_LONG-1);
|
||||
unsigned long tmp;
|
||||
|
||||
if (offset >= size)
|
||||
return size;
|
||||
size -= result;
|
||||
offset %= BITS_PER_LONG;
|
||||
if (offset) {
|
||||
tmp = *(p++);
|
||||
tmp |= ~0UL >> (BITS_PER_LONG - offset);
|
||||
if (size < BITS_PER_LONG)
|
||||
goto found_first;
|
||||
if (~tmp)
|
||||
goto found_middle;
|
||||
size -= BITS_PER_LONG;
|
||||
result += BITS_PER_LONG;
|
||||
}
|
||||
while (size & ~(BITS_PER_LONG-1)) {
|
||||
if (~(tmp = *(p++)))
|
||||
goto found_middle;
|
||||
result += BITS_PER_LONG;
|
||||
size -= BITS_PER_LONG;
|
||||
}
|
||||
if (!size)
|
||||
return result;
|
||||
tmp = *p;
|
||||
|
||||
found_first:
|
||||
tmp |= ~0UL << size;
|
||||
if (tmp == ~0UL) /* Are any bits zero? */
|
||||
return result + size; /* Nope. */
|
||||
found_middle:
|
||||
return result + ffz(tmp);
|
||||
}
|
||||
EXPORT_SYMBOL(find_next_zero_bit);
|
||||
|
||||
static inline unsigned int ext2_ilog2(unsigned int x)
|
||||
{
|
||||
int lz;
|
||||
|
@ -106,8 +110,8 @@ static inline unsigned int ext2_ffz(unsigned int x)
|
|||
return rc;
|
||||
}
|
||||
|
||||
unsigned long find_next_zero_le_bit(const unsigned long *addr, unsigned long size,
|
||||
unsigned long offset)
|
||||
unsigned long find_next_zero_le_bit(const unsigned long *addr,
|
||||
unsigned long size, unsigned long offset)
|
||||
{
|
||||
const unsigned int *p = ((const unsigned int *)addr) + (offset >> 5);
|
||||
unsigned int result = offset & ~31;
|
||||
|
@ -143,5 +147,4 @@ found_first:
|
|||
found_middle:
|
||||
return result + ext2_ffz(tmp);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(find_next_zero_le_bit);
|
|
@ -22,7 +22,7 @@
|
|||
/* waiting for a spinlock... */
|
||||
#if defined(CONFIG_PPC_SPLPAR) || defined(CONFIG_PPC_ISERIES)
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/iSeries/HvCall.h>
|
||||
#include <asm/iseries/hv_call.h>
|
||||
|
||||
void __spin_yield(raw_spinlock_t *lock)
|
||||
{
|
||||
|
|
|
@ -11,3 +11,4 @@ obj-$(CONFIG_85xx) += 85xx/
|
|||
obj-$(CONFIG_PPC_PSERIES) += pseries/
|
||||
obj-$(CONFIG_PPC_ISERIES) += iseries/
|
||||
obj-$(CONFIG_PPC_MAPLE) += maple/
|
||||
obj-$(CONFIG_PPC_CELL) += cell/
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
obj-y += interrupt.o iommu.o setup.o spider-pic.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* BPA Internal Interrupt Controller
|
||||
* Cell Internal Interrupt Controller
|
||||
*
|
||||
* (C) Copyright IBM Deutschland Entwicklung GmbH 2005
|
||||
*
|
||||
|
@ -31,7 +31,7 @@
|
|||
#include <asm/prom.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#include "bpa_iic.h"
|
||||
#include "interrupt.h"
|
||||
|
||||
struct iic_pending_bits {
|
||||
u32 data;
|
||||
|
@ -89,7 +89,7 @@ static void iic_end(unsigned int irq)
|
|||
}
|
||||
|
||||
static struct hw_interrupt_type iic_pic = {
|
||||
.typename = " BPA-IIC ",
|
||||
.typename = " CELL-IIC ",
|
||||
.startup = iic_startup,
|
||||
.enable = iic_enable,
|
||||
.disable = iic_disable,
|
||||
|
@ -106,7 +106,7 @@ static int iic_external_get_irq(struct iic_pending_bits pending)
|
|||
irq = -1;
|
||||
|
||||
/*
|
||||
* This mapping is specific to the Broadband
|
||||
* This mapping is specific to the Cell Broadband
|
||||
* Engine. We might need to get the numbers
|
||||
* from the device tree to support future CPUs.
|
||||
*/
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef ASM_BPA_IIC_H
|
||||
#define ASM_BPA_IIC_H
|
||||
#ifndef ASM_CELL_PIC_H
|
||||
#define ASM_CELL_PIC_H
|
||||
#ifdef __KERNEL__
|
||||
/*
|
||||
* Mapping of IIC pending bits into per-node
|
||||
|
@ -21,7 +21,7 @@
|
|||
* + node number
|
||||
* * don't care
|
||||
*
|
||||
* A node consists of a Broadband Engine and an optional
|
||||
* A node consists of a Cell Broadband Engine and an optional
|
||||
* south bridge device providing a maximum of 64 IRQs.
|
||||
* The south bridge may be connected to either IOIF0
|
||||
* or IOIF1.
|
||||
|
@ -59,4 +59,4 @@ extern void spider_init_IRQ(void);
|
|||
extern int spider_get_irq(unsigned long int_pending);
|
||||
|
||||
#endif
|
||||
#endif /* ASM_BPA_IIC_H */
|
||||
#endif /* ASM_CELL_PIC_H */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* IOMMU implementation for Broadband Processor Architecture
|
||||
* IOMMU implementation for Cell Broadband Processor Architecture
|
||||
* We just establish a linear mapping at boot by setting all the
|
||||
* IOPT cache entries in the CPU.
|
||||
* The mapping functions should be identical to pci_direct_iommu,
|
||||
|
@ -41,7 +41,7 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/ppc-pci.h>
|
||||
|
||||
#include "bpa_iommu.h"
|
||||
#include "iommu.h"
|
||||
|
||||
static inline unsigned long
|
||||
get_iopt_entry(unsigned long real_address, unsigned long ioid,
|
||||
|
@ -276,7 +276,7 @@ static void iommu_dev_setup_null(struct pci_dev *d) { }
|
|||
* for each DMA window used by any device. For now, we
|
||||
* happen to know that there is only one DMA window in use,
|
||||
* starting at iopt_phys_offset. */
|
||||
static void bpa_map_iommu(void)
|
||||
static void cell_map_iommu(void)
|
||||
{
|
||||
unsigned long address;
|
||||
void __iomem *base;
|
||||
|
@ -309,7 +309,7 @@ static void bpa_map_iommu(void)
|
|||
}
|
||||
|
||||
|
||||
static void *bpa_alloc_coherent(struct device *hwdev, size_t size,
|
||||
static void *cell_alloc_coherent(struct device *hwdev, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
void *ret;
|
||||
|
@ -317,65 +317,65 @@ static void *bpa_alloc_coherent(struct device *hwdev, size_t size,
|
|||
ret = (void *)__get_free_pages(flag, get_order(size));
|
||||
if (ret != NULL) {
|
||||
memset(ret, 0, size);
|
||||
*dma_handle = virt_to_abs(ret) | BPA_DMA_VALID;
|
||||
*dma_handle = virt_to_abs(ret) | CELL_DMA_VALID;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void bpa_free_coherent(struct device *hwdev, size_t size,
|
||||
static void cell_free_coherent(struct device *hwdev, size_t size,
|
||||
void *vaddr, dma_addr_t dma_handle)
|
||||
{
|
||||
free_pages((unsigned long)vaddr, get_order(size));
|
||||
}
|
||||
|
||||
static dma_addr_t bpa_map_single(struct device *hwdev, void *ptr,
|
||||
static dma_addr_t cell_map_single(struct device *hwdev, void *ptr,
|
||||
size_t size, enum dma_data_direction direction)
|
||||
{
|
||||
return virt_to_abs(ptr) | BPA_DMA_VALID;
|
||||
return virt_to_abs(ptr) | CELL_DMA_VALID;
|
||||
}
|
||||
|
||||
static void bpa_unmap_single(struct device *hwdev, dma_addr_t dma_addr,
|
||||
static void cell_unmap_single(struct device *hwdev, dma_addr_t dma_addr,
|
||||
size_t size, enum dma_data_direction direction)
|
||||
{
|
||||
}
|
||||
|
||||
static int bpa_map_sg(struct device *hwdev, struct scatterlist *sg,
|
||||
static int cell_map_sg(struct device *hwdev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction direction)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nents; i++, sg++) {
|
||||
sg->dma_address = (page_to_phys(sg->page) + sg->offset)
|
||||
| BPA_DMA_VALID;
|
||||
| CELL_DMA_VALID;
|
||||
sg->dma_length = sg->length;
|
||||
}
|
||||
|
||||
return nents;
|
||||
}
|
||||
|
||||
static void bpa_unmap_sg(struct device *hwdev, struct scatterlist *sg,
|
||||
static void cell_unmap_sg(struct device *hwdev, struct scatterlist *sg,
|
||||
int nents, enum dma_data_direction direction)
|
||||
{
|
||||
}
|
||||
|
||||
static int bpa_dma_supported(struct device *dev, u64 mask)
|
||||
static int cell_dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
return mask < 0x100000000ull;
|
||||
}
|
||||
|
||||
void bpa_init_iommu(void)
|
||||
void cell_init_iommu(void)
|
||||
{
|
||||
bpa_map_iommu();
|
||||
cell_map_iommu();
|
||||
|
||||
/* Direct I/O, IOMMU off */
|
||||
ppc_md.iommu_dev_setup = iommu_dev_setup_null;
|
||||
ppc_md.iommu_bus_setup = iommu_bus_setup_null;
|
||||
|
||||
pci_dma_ops.alloc_coherent = bpa_alloc_coherent;
|
||||
pci_dma_ops.free_coherent = bpa_free_coherent;
|
||||
pci_dma_ops.map_single = bpa_map_single;
|
||||
pci_dma_ops.unmap_single = bpa_unmap_single;
|
||||
pci_dma_ops.map_sg = bpa_map_sg;
|
||||
pci_dma_ops.unmap_sg = bpa_unmap_sg;
|
||||
pci_dma_ops.dma_supported = bpa_dma_supported;
|
||||
pci_dma_ops.alloc_coherent = cell_alloc_coherent;
|
||||
pci_dma_ops.free_coherent = cell_free_coherent;
|
||||
pci_dma_ops.map_single = cell_map_single;
|
||||
pci_dma_ops.unmap_single = cell_unmap_single;
|
||||
pci_dma_ops.map_sg = cell_map_sg;
|
||||
pci_dma_ops.unmap_sg = cell_unmap_sg;
|
||||
pci_dma_ops.dma_supported = cell_dma_supported;
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef BPA_IOMMU_H
|
||||
#define BPA_IOMMU_H
|
||||
#ifndef CELL_IOMMU_H
|
||||
#define CELL_IOMMU_H
|
||||
|
||||
/* some constants */
|
||||
enum {
|
||||
|
@ -55,11 +55,11 @@ enum {
|
|||
|
||||
/* The high bit needs to be set on every DMA address,
|
||||
only 2GB are addressable */
|
||||
BPA_DMA_VALID = 0x80000000,
|
||||
BPA_DMA_MASK = 0x7fffffff,
|
||||
CELL_DMA_VALID = 0x80000000,
|
||||
CELL_DMA_MASK = 0x7fffffff,
|
||||
};
|
||||
|
||||
|
||||
void bpa_init_iommu(void);
|
||||
void cell_init_iommu(void);
|
||||
|
||||
#endif
|
|
@ -1,11 +1,11 @@
|
|||
/*
|
||||
* linux/arch/ppc/kernel/bpa_setup.c
|
||||
* linux/arch/powerpc/platforms/cell/cell_setup.c
|
||||
*
|
||||
* Copyright (C) 1995 Linus Torvalds
|
||||
* Adapted from 'alpha' version by Gary Thomas
|
||||
* Modified by Cort Dougan (cort@cs.nmt.edu)
|
||||
* Modified by PPC64 Team, IBM Corp
|
||||
* Modified by BPA Team, IBM Deutschland Entwicklung GmbH
|
||||
* Modified by Cell Team, IBM Deutschland Entwicklung GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -46,8 +46,8 @@
|
|||
#include <asm/ppc-pci.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include "bpa_iic.h"
|
||||
#include "bpa_iommu.h"
|
||||
#include "interrupt.h"
|
||||
#include "iommu.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
|
@ -55,7 +55,7 @@
|
|||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
void bpa_show_cpuinfo(struct seq_file *m)
|
||||
void cell_show_cpuinfo(struct seq_file *m)
|
||||
{
|
||||
struct device_node *root;
|
||||
const char *model = "";
|
||||
|
@ -63,22 +63,22 @@ void bpa_show_cpuinfo(struct seq_file *m)
|
|||
root = of_find_node_by_path("/");
|
||||
if (root)
|
||||
model = get_property(root, "model", NULL);
|
||||
seq_printf(m, "machine\t\t: BPA %s\n", model);
|
||||
seq_printf(m, "machine\t\t: CHRP %s\n", model);
|
||||
of_node_put(root);
|
||||
}
|
||||
|
||||
static void bpa_progress(char *s, unsigned short hex)
|
||||
static void cell_progress(char *s, unsigned short hex)
|
||||
{
|
||||
printk("*** %04x : %s\n", hex, s ? s : "");
|
||||
}
|
||||
|
||||
static void __init bpa_setup_arch(void)
|
||||
static void __init cell_setup_arch(void)
|
||||
{
|
||||
ppc_md.init_IRQ = iic_init_IRQ;
|
||||
ppc_md.get_irq = iic_get_irq;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
smp_init_pSeries();
|
||||
smp_init_cell();
|
||||
#endif
|
||||
|
||||
/* init to some ~sane value until calibrate_delay() runs */
|
||||
|
@ -97,39 +97,39 @@ static void __init bpa_setup_arch(void)
|
|||
conswitchp = &dummy_con;
|
||||
#endif
|
||||
|
||||
bpa_nvram_init();
|
||||
mmio_nvram_init();
|
||||
}
|
||||
|
||||
/*
|
||||
* Early initialization. Relocation is on but do not reference unbolted pages
|
||||
*/
|
||||
static void __init bpa_init_early(void)
|
||||
static void __init cell_init_early(void)
|
||||
{
|
||||
DBG(" -> bpa_init_early()\n");
|
||||
DBG(" -> cell_init_early()\n");
|
||||
|
||||
hpte_init_native();
|
||||
|
||||
bpa_init_iommu();
|
||||
cell_init_iommu();
|
||||
|
||||
ppc64_interrupt_controller = IC_BPA_IIC;
|
||||
ppc64_interrupt_controller = IC_CELL_PIC;
|
||||
|
||||
DBG(" <- bpa_init_early()\n");
|
||||
DBG(" <- cell_init_early()\n");
|
||||
}
|
||||
|
||||
|
||||
static int __init bpa_probe(int platform)
|
||||
static int __init cell_probe(int platform)
|
||||
{
|
||||
if (platform != PLATFORM_BPA)
|
||||
if (platform != PLATFORM_CELL)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct machdep_calls __initdata bpa_md = {
|
||||
.probe = bpa_probe,
|
||||
.setup_arch = bpa_setup_arch,
|
||||
.init_early = bpa_init_early,
|
||||
.show_cpuinfo = bpa_show_cpuinfo,
|
||||
struct machdep_calls __initdata cell_md = {
|
||||
.probe = cell_probe,
|
||||
.setup_arch = cell_setup_arch,
|
||||
.init_early = cell_init_early,
|
||||
.show_cpuinfo = cell_show_cpuinfo,
|
||||
.restart = rtas_restart,
|
||||
.power_off = rtas_power_off,
|
||||
.halt = rtas_halt,
|
||||
|
@ -137,5 +137,5 @@ struct machdep_calls __initdata bpa_md = {
|
|||
.get_rtc_time = rtas_get_rtc_time,
|
||||
.set_rtc_time = rtas_set_rtc_time,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.progress = bpa_progress,
|
||||
.progress = cell_progress,
|
||||
};
|
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
* SMP support for BPA machines.
|
||||
*
|
||||
* Dave Engebretsen, Peter Bergner, and
|
||||
* Mike Corrigan {engebret|bergner|mikec}@us.ibm.com
|
||||
*
|
||||
* Plus various changes from other IBM teams...
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/cache.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/rtas.h>
|
||||
|
||||
#include "interrupt.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
#else
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The primary thread of each non-boot processor is recorded here before
|
||||
* smp init.
|
||||
*/
|
||||
static cpumask_t of_spin_map;
|
||||
|
||||
extern void pSeries_secondary_smp_init(unsigned long);
|
||||
|
||||
/**
|
||||
* smp_startup_cpu() - start the given cpu
|
||||
*
|
||||
* At boot time, there is nothing to do for primary threads which were
|
||||
* started from Open Firmware. For anything else, call RTAS with the
|
||||
* appropriate start location.
|
||||
*
|
||||
* Returns:
|
||||
* 0 - failure
|
||||
* 1 - success
|
||||
*/
|
||||
static inline int __devinit smp_startup_cpu(unsigned int lcpu)
|
||||
{
|
||||
int status;
|
||||
unsigned long start_here = __pa((u32)*((unsigned long *)
|
||||
pSeries_secondary_smp_init));
|
||||
unsigned int pcpu;
|
||||
int start_cpu;
|
||||
|
||||
if (cpu_isset(lcpu, of_spin_map))
|
||||
/* Already started by OF and sitting in spin loop */
|
||||
return 1;
|
||||
|
||||
pcpu = get_hard_smp_processor_id(lcpu);
|
||||
|
||||
/* Fixup atomic count: it exited inside IRQ handler. */
|
||||
paca[lcpu].__current->thread_info->preempt_count = 0;
|
||||
|
||||
/*
|
||||
* If the RTAS start-cpu token does not exist then presume the
|
||||
* cpu is already spinning.
|
||||
*/
|
||||
start_cpu = rtas_token("start-cpu");
|
||||
if (start_cpu == RTAS_UNKNOWN_SERVICE)
|
||||
return 1;
|
||||
|
||||
status = rtas_call(start_cpu, 3, 1, NULL, pcpu, start_here, lcpu);
|
||||
if (status != 0) {
|
||||
printk(KERN_ERR "start-cpu failed: %i\n", status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void smp_iic_message_pass(int target, int msg)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (target < NR_CPUS) {
|
||||
iic_cause_IPI(target, msg);
|
||||
} else {
|
||||
for_each_online_cpu(i) {
|
||||
if (target == MSG_ALL_BUT_SELF
|
||||
&& i == smp_processor_id())
|
||||
continue;
|
||||
iic_cause_IPI(i, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int __init smp_iic_probe(void)
|
||||
{
|
||||
iic_request_IPIs();
|
||||
|
||||
return cpus_weight(cpu_possible_map);
|
||||
}
|
||||
|
||||
static void __devinit smp_iic_setup_cpu(int cpu)
|
||||
{
|
||||
if (cpu != boot_cpuid)
|
||||
iic_setup_cpu();
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(timebase_lock);
|
||||
static unsigned long timebase = 0;
|
||||
|
||||
static void __devinit cell_give_timebase(void)
|
||||
{
|
||||
spin_lock(&timebase_lock);
|
||||
rtas_call(rtas_token("freeze-time-base"), 0, 1, NULL);
|
||||
timebase = get_tb();
|
||||
spin_unlock(&timebase_lock);
|
||||
|
||||
while (timebase)
|
||||
barrier();
|
||||
rtas_call(rtas_token("thaw-time-base"), 0, 1, NULL);
|
||||
}
|
||||
|
||||
static void __devinit cell_take_timebase(void)
|
||||
{
|
||||
while (!timebase)
|
||||
barrier();
|
||||
spin_lock(&timebase_lock);
|
||||
set_tb(timebase >> 32, timebase & 0xffffffff);
|
||||
timebase = 0;
|
||||
spin_unlock(&timebase_lock);
|
||||
}
|
||||
|
||||
static void __devinit smp_cell_kick_cpu(int nr)
|
||||
{
|
||||
BUG_ON(nr < 0 || nr >= NR_CPUS);
|
||||
|
||||
if (!smp_startup_cpu(nr))
|
||||
return;
|
||||
|
||||
/*
|
||||
* The processor is currently spinning, waiting for the
|
||||
* cpu_start field to become non-zero After we set cpu_start,
|
||||
* the processor will continue on to secondary_start
|
||||
*/
|
||||
paca[nr].cpu_start = 1;
|
||||
}
|
||||
|
||||
static int smp_cell_cpu_bootable(unsigned int nr)
|
||||
{
|
||||
/* Special case - we inhibit secondary thread startup
|
||||
* during boot if the user requests it. Odd-numbered
|
||||
* cpus are assumed to be secondary threads.
|
||||
*/
|
||||
if (system_state < SYSTEM_RUNNING &&
|
||||
cpu_has_feature(CPU_FTR_SMT) &&
|
||||
!smt_enabled_at_boot && nr % 2 != 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
static struct smp_ops_t bpa_iic_smp_ops = {
|
||||
.message_pass = smp_iic_message_pass,
|
||||
.probe = smp_iic_probe,
|
||||
.kick_cpu = smp_cell_kick_cpu,
|
||||
.setup_cpu = smp_iic_setup_cpu,
|
||||
.cpu_bootable = smp_cell_cpu_bootable,
|
||||
};
|
||||
|
||||
/* This is called very early */
|
||||
void __init smp_init_cell(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
DBG(" -> smp_init_cell()\n");
|
||||
|
||||
smp_ops = &bpa_iic_smp_ops;
|
||||
|
||||
/* Mark threads which are still spinning in hold loops. */
|
||||
if (cpu_has_feature(CPU_FTR_SMT)) {
|
||||
for_each_present_cpu(i) {
|
||||
if (i % 2 == 0)
|
||||
/*
|
||||
* Even-numbered logical cpus correspond to
|
||||
* primary threads.
|
||||
*/
|
||||
cpu_set(i, of_spin_map);
|
||||
}
|
||||
} else {
|
||||
of_spin_map = cpu_present_map;
|
||||
}
|
||||
|
||||
cpu_clear(boot_cpuid, of_spin_map);
|
||||
|
||||
/* Non-lpar has additional take/give timebase */
|
||||
if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) {
|
||||
smp_ops->give_timebase = cell_give_timebase;
|
||||
smp_ops->take_timebase = cell_take_timebase;
|
||||
}
|
||||
|
||||
DBG(" <- smp_init_cell()\n");
|
||||
}
|
|
@ -27,7 +27,7 @@
|
|||
#include <asm/prom.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "bpa_iic.h"
|
||||
#include "interrupt.h"
|
||||
|
||||
/* register layout taken from Spider spec, table 7.4-4 */
|
||||
enum {
|
|
@ -17,6 +17,7 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/rtas.h>
|
||||
#include "chrp.h"
|
||||
|
||||
static unsigned int nvram_size;
|
||||
|
@ -25,7 +26,8 @@ static DEFINE_SPINLOCK(nvram_lock);
|
|||
|
||||
static unsigned char chrp_nvram_read(int addr)
|
||||
{
|
||||
unsigned long done, flags;
|
||||
unsigned int done;
|
||||
unsigned long flags;
|
||||
unsigned char ret;
|
||||
|
||||
if (addr >= nvram_size) {
|
||||
|
@ -34,7 +36,8 @@ static unsigned char chrp_nvram_read(int addr)
|
|||
return 0xff;
|
||||
}
|
||||
spin_lock_irqsave(&nvram_lock, flags);
|
||||
if ((call_rtas("nvram-fetch", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done)
|
||||
if ((rtas_call(rtas_token("nvram-fetch"), 3, 2, &done, addr,
|
||||
__pa(nvram_buf), 1) != 0) || 1 != done)
|
||||
ret = 0xff;
|
||||
else
|
||||
ret = nvram_buf[0];
|
||||
|
@ -45,7 +48,8 @@ static unsigned char chrp_nvram_read(int addr)
|
|||
|
||||
static void chrp_nvram_write(int addr, unsigned char val)
|
||||
{
|
||||
unsigned long done, flags;
|
||||
unsigned int done;
|
||||
unsigned long flags;
|
||||
|
||||
if (addr >= nvram_size) {
|
||||
printk(KERN_DEBUG "%s: write addr %d > nvram_size %u\n",
|
||||
|
@ -54,7 +58,8 @@ static void chrp_nvram_write(int addr, unsigned char val)
|
|||
}
|
||||
spin_lock_irqsave(&nvram_lock, flags);
|
||||
nvram_buf[0] = val;
|
||||
if ((call_rtas("nvram-store", 3, 2, &done, addr, __pa(nvram_buf), 1) != 0) || 1 != done)
|
||||
if ((rtas_call(rtas_token("nvram-store"), 3, 2, &done, addr,
|
||||
__pa(nvram_buf), 1) != 0) || 1 != done)
|
||||
printk(KERN_DEBUG "rtas IO error storing 0x%02x at %d", val, addr);
|
||||
spin_unlock_irqrestore(&nvram_lock, flags);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mv643xx.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
|
|
|
@ -35,43 +35,6 @@
|
|||
#include <asm/smp.h>
|
||||
#include <asm/mpic.h>
|
||||
|
||||
extern unsigned long smp_chrp_cpu_nr;
|
||||
|
||||
static int __init smp_chrp_probe(void)
|
||||
{
|
||||
struct device_node *cpus = NULL;
|
||||
unsigned int *reg;
|
||||
int reglen;
|
||||
int ncpus = 0;
|
||||
int cpuid;
|
||||
unsigned int phys;
|
||||
|
||||
/* Count CPUs in the device-tree */
|
||||
cpuid = 1; /* the boot cpu is logical cpu 0 */
|
||||
while ((cpus = of_find_node_by_type(cpus, "cpu")) != NULL) {
|
||||
phys = ncpus;
|
||||
reg = (unsigned int *) get_property(cpus, "reg", ®len);
|
||||
if (reg && reglen >= sizeof(unsigned int))
|
||||
/* hmmm, not having a reg property would be bad */
|
||||
phys = *reg;
|
||||
if (phys != boot_cpuid_phys) {
|
||||
set_hard_smp_processor_id(cpuid, phys);
|
||||
++cpuid;
|
||||
}
|
||||
++ncpus;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "CHRP SMP probe found %d cpus\n", ncpus);
|
||||
|
||||
/* Nothing more to do if less than 2 of them */
|
||||
if (ncpus <= 1)
|
||||
return 1;
|
||||
|
||||
mpic_request_ipis();
|
||||
|
||||
return ncpus;
|
||||
}
|
||||
|
||||
static void __devinit smp_chrp_kick_cpu(int nr)
|
||||
{
|
||||
*(unsigned long *)KERNELBASE = nr;
|
||||
|
@ -114,7 +77,7 @@ void __devinit smp_chrp_take_timebase(void)
|
|||
/* CHRP with openpic */
|
||||
struct smp_ops_t chrp_smp_ops = {
|
||||
.message_pass = smp_mpic_message_pass,
|
||||
.probe = smp_chrp_probe,
|
||||
.probe = smp_mpic_probe,
|
||||
.kick_cpu = smp_chrp_kick_cpu,
|
||||
.setup_cpu = smp_chrp_setup_cpu,
|
||||
.give_timebase = smp_chrp_give_timebase,
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
* drive the hypervisor from the OS.
|
||||
*/
|
||||
|
||||
#include <asm/iSeries/HvCallSc.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
#define HvCallHptGetHptAddress HvCallHpt + 0
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
#ifndef _PLATFORMS_ISERIES_CALL_PCI_H
|
||||
#define _PLATFORMS_ISERIES_CALL_PCI_H
|
||||
|
||||
#include <asm/iSeries/HvCallSc.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
|
||||
/*
|
||||
* DSA == Direct Select Address
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
* drive the hypervisor from the OS.
|
||||
*/
|
||||
|
||||
#include <asm/iSeries/HvCallSc.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
|
||||
#define HvCallSmGet64BitsOfAccessMap HvCallSm + 11
|
||||
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
|
||||
#include <asm/page.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/iSeries/HvCall.h>
|
||||
#include <asm/iSeries/HvCallSc.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iseries/hv_call.h>
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
|
||||
|
||||
void HvCall_writeLogBuffer(const void *buffer, u64 len)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <asm/iSeries/HvLpConfig.h>
|
||||
#include <asm/iseries/hv_lp_config.h>
|
||||
|
||||
HvLpIndex HvLpConfig_getLpIndex_outline(void)
|
||||
{
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <asm/machdep.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
|
||||
extern struct list_head iSeries_Global_Device_List;
|
||||
|
||||
|
|
|
@ -36,9 +36,9 @@
|
|||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/ppcdebug.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iSeries/HvLpEvent.h>
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
|
||||
#include "irq.h"
|
||||
#include "call_pci.h"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include <linux/module.h>
|
||||
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/iSeries/HvCallSc.h>
|
||||
#include <asm/iseries/hv_call_sc.h>
|
||||
|
||||
EXPORT_SYMBOL(HvCall0);
|
||||
EXPORT_SYMBOL(HvCall1);
|
||||
|
|
|
@ -13,16 +13,16 @@
|
|||
#include <linux/bitops.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/naca.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/iSeries/ItLpNaca.h>
|
||||
#include <asm/iseries/it_lp_naca.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iSeries/ItLpRegSave.h>
|
||||
#include <asm/iseries/it_lp_reg_save.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/iSeries/LparMap.h>
|
||||
#include <asm/iSeries/ItExtVpdPanel.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iseries/lpar_map.h>
|
||||
#include <asm/iseries/it_exp_vpd_panel.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
|
||||
#include "naca.h"
|
||||
#include "vpd_areas.h"
|
||||
#include "spcomm_area.h"
|
||||
#include "ipl_parms.h"
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
|
||||
#include <asm/system.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iSeries/HvLpEvent.h>
|
||||
#include <asm/iSeries/HvCallEvent.h>
|
||||
#include <asm/iSeries/ItLpNaca.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/iseries/hv_call_event.h>
|
||||
#include <asm/iseries/it_lp_naca.h>
|
||||
|
||||
/*
|
||||
* The LpQueue is used to pass event data from the hypervisor to
|
||||
|
|
|
@ -38,10 +38,10 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/iSeries/vio.h>
|
||||
#include <asm/iSeries/mf.h>
|
||||
#include <asm/iSeries/HvLpConfig.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iseries/vio.h>
|
||||
#include <asm/iseries/mf.h>
|
||||
#include <asm/iseries/hv_lp_config.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef _NACA_H
|
||||
#define _NACA_H
|
||||
#ifndef _PLATFORMS_ISERIES_NACA_H
|
||||
#define _PLATFORMS_ISERIES_NACA_H
|
||||
|
||||
/*
|
||||
/*
|
||||
* c 2001 PPC 64 Team, IBM Corp
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@ -21,4 +21,4 @@ struct naca_struct {
|
|||
|
||||
extern struct naca_struct naca;
|
||||
|
||||
#endif /* _NACA_H */
|
||||
#endif /* _PLATFORMS_ISERIES_NACA_H */
|
|
@ -36,8 +36,8 @@
|
|||
#include <asm/iommu.h>
|
||||
#include <asm/abs_addr.h>
|
||||
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iSeries/mf.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
#include <asm/iseries/mf.h>
|
||||
|
||||
#include <asm/ppc-pci.h>
|
||||
|
||||
|
|
|
@ -24,8 +24,8 @@
|
|||
#include <asm/processor.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
|
||||
#include "processor_vpd.h"
|
||||
#include "main_store.h"
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
* address of the OS's NACA).
|
||||
*/
|
||||
#include <asm/types.h>
|
||||
#include <asm/naca.h>
|
||||
#include "naca.h"
|
||||
|
||||
/*
|
||||
* When we IPL a secondary partition, we will check if if the
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/kdev_t.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/root_dev.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/machdep.h>
|
||||
|
@ -40,19 +41,19 @@
|
|||
#include <asm/firmware.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/naca.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/iSeries/HvLpConfig.h>
|
||||
#include <asm/iSeries/HvCallEvent.h>
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iSeries/mf.h>
|
||||
#include <asm/iSeries/HvLpEvent.h>
|
||||
#include <asm/iSeries/LparMap.h>
|
||||
#include <asm/iseries/hv_lp_config.h>
|
||||
#include <asm/iseries/hv_call_event.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/iseries/mf.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/iseries/lpar_map.h>
|
||||
|
||||
#include "naca.h"
|
||||
#include "setup.h"
|
||||
#include "irq.h"
|
||||
#include "vpd_areas.h"
|
||||
|
@ -94,6 +95,8 @@ extern unsigned long iSeries_recal_titan;
|
|||
|
||||
static int mf_initialized;
|
||||
|
||||
static unsigned long cmd_mem_limit;
|
||||
|
||||
struct MemoryBlock {
|
||||
unsigned long absStart;
|
||||
unsigned long absEnd;
|
||||
|
@ -341,23 +344,6 @@ static void __init iSeries_init_early(void)
|
|||
*/
|
||||
iommu_init_early_iSeries();
|
||||
|
||||
iSeries_get_cmdline();
|
||||
|
||||
/* Save unparsed command line copy for /proc/cmdline */
|
||||
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
||||
|
||||
/* Parse early parameters, in particular mem=x */
|
||||
parse_early_param();
|
||||
|
||||
if (memory_limit) {
|
||||
if (memory_limit < systemcfg->physicalMemorySize)
|
||||
systemcfg->physicalMemorySize = memory_limit;
|
||||
else {
|
||||
printk("Ignoring mem=%lu >= ram_top.\n", memory_limit);
|
||||
memory_limit = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize machine-dependency vectors */
|
||||
#ifdef CONFIG_SMP
|
||||
smp_init_iSeries();
|
||||
|
@ -971,6 +957,8 @@ void build_flat_dt(struct iseries_flat_dt *dt)
|
|||
/* /chosen */
|
||||
dt_start_node(dt, "chosen");
|
||||
dt_prop_u32(dt, "linux,platform", PLATFORM_ISERIES_LPAR);
|
||||
if (cmd_mem_limit)
|
||||
dt_prop_u64(dt, "linux,memory-limit", cmd_mem_limit);
|
||||
dt_end_node(dt);
|
||||
|
||||
dt_cpus(dt);
|
||||
|
@ -990,7 +978,27 @@ void * __init iSeries_early_setup(void)
|
|||
*/
|
||||
build_iSeries_Memory_Map();
|
||||
|
||||
iSeries_get_cmdline();
|
||||
|
||||
/* Save unparsed command line copy for /proc/cmdline */
|
||||
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
||||
|
||||
/* Parse early parameters, in particular mem=x */
|
||||
parse_early_param();
|
||||
|
||||
build_flat_dt(&iseries_dt);
|
||||
|
||||
return (void *) __pa(&iseries_dt);
|
||||
}
|
||||
|
||||
/*
|
||||
* On iSeries we just parse the mem=X option from the command line.
|
||||
* On pSeries it's a bit more complicated, see prom_init_mem()
|
||||
*/
|
||||
static int __init early_parsemem(char *p)
|
||||
{
|
||||
if (p)
|
||||
cmd_mem_limit = ALIGN(memparse(p, &p), PAGE_SIZE);
|
||||
return 0;
|
||||
}
|
||||
early_param("mem", early_parsemem);
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/paca.h>
|
||||
#include <asm/iSeries/HvCall.h>
|
||||
#include <asm/iseries/hv_call.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/ppcdebug.h>
|
||||
#include <asm/machdep.h>
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
#include <asm/tce.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/iSeries/vio.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iSeries/HvLpConfig.h>
|
||||
#include <asm/iSeries/HvCallXm.h>
|
||||
#include <asm/iseries/vio.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/iseries/hv_lp_config.h>
|
||||
#include <asm/iseries/hv_call_xm.h>
|
||||
|
||||
struct device *iSeries_vio_dev = &vio_bus_device.dev;
|
||||
EXPORT_SYMBOL(iSeries_vio_dev);
|
||||
|
|
|
@ -41,12 +41,12 @@
|
|||
|
||||
#include <asm/system.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iSeries/ItExtVpdPanel.h>
|
||||
#include <asm/iSeries/HvLpEvent.h>
|
||||
#include <asm/iSeries/HvLpConfig.h>
|
||||
#include <asm/iSeries/mf.h>
|
||||
#include <asm/iSeries/vio.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
#include <asm/iseries/it_exp_vpd_panel.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/iseries/hv_lp_config.h>
|
||||
#include <asm/iseries/mf.h>
|
||||
#include <asm/iseries/vio.h>
|
||||
|
||||
/* Status of the path to each other partition in the system.
|
||||
* This is overkill, since we will only ever establish connections
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <asm/resource.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/pci-bridge.h>
|
||||
#include <asm/iSeries/HvTypes.h>
|
||||
#include <asm/iseries/hv_types.h>
|
||||
|
||||
#include "pci.h"
|
||||
#include "call_pci.h"
|
||||
|
|
|
@ -576,7 +576,7 @@ void __init pmac_pic_init(void)
|
|||
#endif /* CONFIG_PPC32 */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#if defined(CONFIG_PM) && defined(CONFIG_PPC32)
|
||||
/*
|
||||
* These procedures are used in implementing sleep on the powerbooks.
|
||||
* sleep_save_intrs() saves the states of all interrupt enables
|
||||
|
@ -643,7 +643,7 @@ static int pmacpic_resume(struct sys_device *sysdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PM */
|
||||
#endif /* CONFIG_PM && CONFIG_PPC32 */
|
||||
|
||||
static struct sysdev_class pmacpic_sysclass = {
|
||||
set_kset_name("pmac_pic"),
|
||||
|
@ -655,10 +655,10 @@ static struct sys_device device_pmacpic = {
|
|||
};
|
||||
|
||||
static struct sysdev_driver driver_pmacpic = {
|
||||
#ifdef CONFIG_PM
|
||||
#if defined(CONFIG_PM) && defined(CONFIG_PPC32)
|
||||
.suspend = &pmacpic_suspend,
|
||||
.resume = &pmacpic_resume,
|
||||
#endif /* CONFIG_PM */
|
||||
#endif /* CONFIG_PM && CONFIG_PPC32 */
|
||||
};
|
||||
|
||||
static int __init init_pmacpic_sysfs(void)
|
||||
|
|
|
@ -75,6 +75,7 @@
|
|||
#include <asm/smu.h>
|
||||
#include <asm/pmc.h>
|
||||
#include <asm/mpic.h>
|
||||
#include <asm/lmb.h>
|
||||
|
||||
#include "pmac.h"
|
||||
|
||||
|
@ -350,7 +351,7 @@ void __init pmac_setup_arch(void)
|
|||
find_via_pmu();
|
||||
smu_init();
|
||||
|
||||
#ifdef CONFIG_NVRAM
|
||||
#if defined(CONFIG_NVRAM) || defined(CONFIG_PPC64)
|
||||
pmac_nvram_init();
|
||||
#endif
|
||||
|
||||
|
|
|
@ -21,15 +21,6 @@ config EEH
|
|||
depends on PPC_PSERIES
|
||||
default y if !EMBEDDED
|
||||
|
||||
config RTAS_PROC
|
||||
bool "Proc interface to RTAS"
|
||||
depends on PPC_RTAS
|
||||
default y
|
||||
|
||||
config RTAS_FLASH
|
||||
tristate "Firmware flash interface"
|
||||
depends on PPC64 && RTAS_PROC
|
||||
|
||||
config SCANLOG
|
||||
tristate "Scanlog dump interface"
|
||||
depends on RTAS_PROC && PPC_PSERIES
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
obj-y := pci.o lpar.o hvCall.o nvram.o reconfig.o \
|
||||
setup.o iommu.o rtas-fw.o ras.o
|
||||
setup.o iommu.o ras.o rtasd.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_IBMVIO) += vio.o
|
||||
obj-$(CONFIG_XICS) += xics.o
|
||||
|
|
|
@ -42,13 +42,14 @@
|
|||
#include <asm/pci-bridge.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
#include <asm/pSeries_reconfig.h>
|
||||
#include <asm/systemcfg.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/tce.h>
|
||||
#include <asm/ppc-pci.h>
|
||||
|
||||
#include "plpar_wrappers.h"
|
||||
|
||||
#define DBG(fmt...)
|
||||
|
||||
extern int is_python(struct device_node *);
|
||||
|
@ -498,7 +499,7 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti
|
|||
|
||||
switch (action) {
|
||||
case PSERIES_RECONFIG_REMOVE:
|
||||
if (pci->iommu_table &&
|
||||
if (pci && pci->iommu_table &&
|
||||
get_property(np, "ibm,dma-window", NULL))
|
||||
iommu_free_table(np);
|
||||
break;
|
||||
|
|
|
@ -38,7 +38,8 @@
|
|||
#include <asm/prom.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
|
||||
#include "plpar_wrappers.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
|
@ -260,22 +261,18 @@ out:
|
|||
void vpa_init(int cpu)
|
||||
{
|
||||
int hwcpu = get_hard_smp_processor_id(cpu);
|
||||
unsigned long vpa = (unsigned long)&(paca[cpu].lppaca);
|
||||
unsigned long vpa = __pa(&paca[cpu].lppaca);
|
||||
long ret;
|
||||
unsigned long flags;
|
||||
|
||||
/* Register the Virtual Processor Area (VPA) */
|
||||
flags = 1UL << (63 - 18);
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_ALTIVEC))
|
||||
paca[cpu].lppaca.vmxregs_in_use = 1;
|
||||
|
||||
ret = register_vpa(flags, hwcpu, __pa(vpa));
|
||||
ret = register_vpa(hwcpu, vpa);
|
||||
|
||||
if (ret)
|
||||
printk(KERN_ERR "WARNING: vpa_init: VPA registration for "
|
||||
"cpu %d (hw %d) of area %lx returns %ld\n",
|
||||
cpu, hwcpu, __pa(vpa), ret);
|
||||
cpu, hwcpu, vpa, ret);
|
||||
}
|
||||
|
||||
long pSeries_lpar_hpte_insert(unsigned long hpte_group,
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
#ifndef _PSERIES_PLPAR_WRAPPERS_H
|
||||
#define _PSERIES_PLPAR_WRAPPERS_H
|
||||
|
||||
#include <asm/hvcall.h>
|
||||
|
||||
static inline long poll_pending(void)
|
||||
{
|
||||
unsigned long dummy;
|
||||
return plpar_hcall(H_POLL_PENDING, 0, 0, 0, 0, &dummy, &dummy, &dummy);
|
||||
}
|
||||
|
||||
static inline long prod_processor(void)
|
||||
{
|
||||
plpar_hcall_norets(H_PROD);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long cede_processor(void)
|
||||
{
|
||||
plpar_hcall_norets(H_CEDE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline long vpa_call(unsigned long flags, unsigned long cpu,
|
||||
unsigned long vpa)
|
||||
{
|
||||
/* flags are in bits 16-18 (counting from most significant bit) */
|
||||
flags = flags << (63 - 18);
|
||||
|
||||
return plpar_hcall_norets(H_REGISTER_VPA, flags, cpu, vpa);
|
||||
}
|
||||
|
||||
static inline long unregister_vpa(unsigned long cpu, unsigned long vpa)
|
||||
{
|
||||
return vpa_call(0x5, cpu, vpa);
|
||||
}
|
||||
|
||||
static inline long register_vpa(unsigned long cpu, unsigned long vpa)
|
||||
{
|
||||
return vpa_call(0x1, cpu, vpa);
|
||||
}
|
||||
|
||||
extern void vpa_init(int cpu);
|
||||
|
||||
static inline long plpar_pte_remove(unsigned long flags, unsigned long ptex,
|
||||
unsigned long avpn, unsigned long *old_pteh_ret,
|
||||
unsigned long *old_ptel_ret)
|
||||
{
|
||||
unsigned long dummy;
|
||||
return plpar_hcall(H_REMOVE, flags, ptex, avpn, 0, old_pteh_ret,
|
||||
old_ptel_ret, &dummy);
|
||||
}
|
||||
|
||||
static inline long plpar_pte_read(unsigned long flags, unsigned long ptex,
|
||||
unsigned long *old_pteh_ret, unsigned long *old_ptel_ret)
|
||||
{
|
||||
unsigned long dummy;
|
||||
return plpar_hcall(H_READ, flags, ptex, 0, 0, old_pteh_ret,
|
||||
old_ptel_ret, &dummy);
|
||||
}
|
||||
|
||||
static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
|
||||
unsigned long avpn)
|
||||
{
|
||||
return plpar_hcall_norets(H_PROTECT, flags, ptex, avpn);
|
||||
}
|
||||
|
||||
static inline long plpar_tce_get(unsigned long liobn, unsigned long ioba,
|
||||
unsigned long *tce_ret)
|
||||
{
|
||||
unsigned long dummy;
|
||||
return plpar_hcall(H_GET_TCE, liobn, ioba, 0, 0, tce_ret, &dummy,
|
||||
&dummy);
|
||||
}
|
||||
|
||||
static inline long plpar_tce_put(unsigned long liobn, unsigned long ioba,
|
||||
unsigned long tceval)
|
||||
{
|
||||
return plpar_hcall_norets(H_PUT_TCE, liobn, ioba, tceval);
|
||||
}
|
||||
|
||||
static inline long plpar_tce_put_indirect(unsigned long liobn,
|
||||
unsigned long ioba, unsigned long page, unsigned long count)
|
||||
{
|
||||
return plpar_hcall_norets(H_PUT_TCE_INDIRECT, liobn, ioba, page, count);
|
||||
}
|
||||
|
||||
static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
|
||||
unsigned long tceval, unsigned long count)
|
||||
{
|
||||
return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
|
||||
}
|
||||
|
||||
static inline long plpar_get_term_char(unsigned long termno,
|
||||
unsigned long *len_ret, char *buf_ret)
|
||||
{
|
||||
unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
|
||||
return plpar_hcall(H_GET_TERM_CHAR, termno, 0, 0, 0, len_ret,
|
||||
lbuf + 0, lbuf + 1);
|
||||
}
|
||||
|
||||
static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
|
||||
const char *buffer)
|
||||
{
|
||||
unsigned long *lbuf = (unsigned long *)buffer; /* TODO: alignment? */
|
||||
return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
|
||||
lbuf[1]);
|
||||
}
|
||||
|
||||
static inline long plpar_set_xdabr(unsigned long address, unsigned long flags)
|
||||
{
|
||||
return plpar_hcall_norets(H_SET_XDABR, address, flags);
|
||||
}
|
||||
|
||||
static inline long plpar_set_dabr(unsigned long val)
|
||||
{
|
||||
return plpar_hcall_norets(H_SET_DABR, val);
|
||||
}
|
||||
|
||||
#endif /* _PSERIES_PLPAR_WRAPPERS_H */
|
|
@ -1,138 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* Procedures for firmware flash updates on pSeries systems.
|
||||
*
|
||||
* Peter Bergner, IBM March 2001.
|
||||
* Copyright (C) 2001 IBM.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/prom.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/param.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/abs_addr.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/delay.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/systemcfg.h>
|
||||
|
||||
#include "rtas-fw.h"
|
||||
|
||||
struct flash_block_list_header rtas_firmware_flash_list = {0, NULL};
|
||||
|
||||
#define FLASH_BLOCK_LIST_VERSION (1UL)
|
||||
|
||||
static void rtas_flash_firmware(void)
|
||||
{
|
||||
unsigned long image_size;
|
||||
struct flash_block_list *f, *next, *flist;
|
||||
unsigned long rtas_block_list;
|
||||
int i, status, update_token;
|
||||
|
||||
update_token = rtas_token("ibm,update-flash-64-and-reboot");
|
||||
if (update_token == RTAS_UNKNOWN_SERVICE) {
|
||||
printk(KERN_ALERT "FLASH: ibm,update-flash-64-and-reboot is not available -- not a service partition?\n");
|
||||
printk(KERN_ALERT "FLASH: firmware will not be flashed\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* NOTE: the "first" block list is a global var with no data
|
||||
* blocks in the kernel data segment. We do this because
|
||||
* we want to ensure this block_list addr is under 4GB.
|
||||
*/
|
||||
rtas_firmware_flash_list.num_blocks = 0;
|
||||
flist = (struct flash_block_list *)&rtas_firmware_flash_list;
|
||||
rtas_block_list = virt_to_abs(flist);
|
||||
if (rtas_block_list >= 4UL*1024*1024*1024) {
|
||||
printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n");
|
||||
/* Update the block_list in place. */
|
||||
image_size = 0;
|
||||
for (f = flist; f; f = next) {
|
||||
/* Translate data addrs to absolute */
|
||||
for (i = 0; i < f->num_blocks; i++) {
|
||||
f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data);
|
||||
image_size += f->blocks[i].length;
|
||||
}
|
||||
next = f->next;
|
||||
/* Don't translate NULL pointer for last entry */
|
||||
if (f->next)
|
||||
f->next = (struct flash_block_list *)virt_to_abs(f->next);
|
||||
else
|
||||
f->next = NULL;
|
||||
/* make num_blocks into the version/length field */
|
||||
f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16);
|
||||
}
|
||||
|
||||
printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size);
|
||||
printk(KERN_ALERT "FLASH: performing flash and reboot\n");
|
||||
rtas_progress("Flashing \n", 0x0);
|
||||
rtas_progress("Please Wait... ", 0x0);
|
||||
printk(KERN_ALERT "FLASH: this will take several minutes. Do not power off!\n");
|
||||
status = rtas_call(update_token, 1, 1, NULL, rtas_block_list);
|
||||
switch (status) { /* should only get "bad" status */
|
||||
case 0:
|
||||
printk(KERN_ALERT "FLASH: success\n");
|
||||
break;
|
||||
case -1:
|
||||
printk(KERN_ALERT "FLASH: hardware error. Firmware may not be not flashed\n");
|
||||
break;
|
||||
case -3:
|
||||
printk(KERN_ALERT "FLASH: image is corrupt or not correct for this platform. Firmware not flashed\n");
|
||||
break;
|
||||
case -4:
|
||||
printk(KERN_ALERT "FLASH: flash failed when partially complete. System may not reboot\n");
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void rtas_flash_bypass_warning(void)
|
||||
{
|
||||
printk(KERN_ALERT "FLASH: firmware flash requires a reboot\n");
|
||||
printk(KERN_ALERT "FLASH: the firmware image will NOT be flashed\n");
|
||||
}
|
||||
|
||||
|
||||
void rtas_fw_restart(char *cmd)
|
||||
{
|
||||
if (rtas_firmware_flash_list.next)
|
||||
rtas_flash_firmware();
|
||||
rtas_restart(cmd);
|
||||
}
|
||||
|
||||
void rtas_fw_power_off(void)
|
||||
{
|
||||
if (rtas_firmware_flash_list.next)
|
||||
rtas_flash_bypass_warning();
|
||||
rtas_power_off();
|
||||
}
|
||||
|
||||
void rtas_fw_halt(void)
|
||||
{
|
||||
if (rtas_firmware_flash_list.next)
|
||||
rtas_flash_bypass_warning();
|
||||
rtas_halt();
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(rtas_firmware_flash_list);
|
|
@ -1,3 +0,0 @@
|
|||
void rtas_fw_restart(char *cmd);
|
||||
void rtas_fw_power_off(void);
|
||||
void rtas_fw_halt(void);
|
|
@ -58,7 +58,6 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/nvram.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
#include "xics.h"
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/pmc.h>
|
||||
|
@ -67,7 +66,7 @@
|
|||
#include <asm/i8259.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
#include "rtas-fw.h"
|
||||
#include "plpar_wrappers.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
|
@ -352,6 +351,16 @@ static void pSeries_mach_cpu_die(void)
|
|||
for(;;);
|
||||
}
|
||||
|
||||
static int pseries_set_dabr(unsigned long dabr)
|
||||
{
|
||||
if (firmware_has_feature(FW_FEATURE_XDABR)) {
|
||||
/* We want to catch accesses from kernel and userspace */
|
||||
return plpar_set_xdabr(dabr, H_DABRX_KERNEL | H_DABRX_USER);
|
||||
}
|
||||
|
||||
return plpar_set_dabr(dabr);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Early initialization. Relocation is on but do not reference unbolted pages
|
||||
|
@ -387,6 +396,8 @@ static void __init pSeries_init_early(void)
|
|||
DBG("Hello World !\n");
|
||||
}
|
||||
|
||||
if (firmware_has_feature(FW_FEATURE_XDABR | FW_FEATURE_DABR))
|
||||
ppc_md.set_dabr = pseries_set_dabr;
|
||||
|
||||
iommu_init_early_pSeries();
|
||||
|
||||
|
@ -591,9 +602,9 @@ struct machdep_calls __initdata pSeries_md = {
|
|||
.pcibios_fixup = pSeries_final_fixup,
|
||||
.pci_probe_mode = pSeries_pci_probe_mode,
|
||||
.irq_bus_setup = pSeries_irq_bus_setup,
|
||||
.restart = rtas_fw_restart,
|
||||
.power_off = rtas_fw_power_off,
|
||||
.halt = rtas_fw_halt,
|
||||
.restart = rtas_restart,
|
||||
.power_off = rtas_power_off,
|
||||
.halt = rtas_halt,
|
||||
.panic = rtas_os_term,
|
||||
.cpu_die = pSeries_mach_cpu_die,
|
||||
.get_boot_time = rtas_get_boot_time,
|
||||
|
|
|
@ -44,10 +44,11 @@
|
|||
#include <asm/firmware.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
#include <asm/pSeries_reconfig.h>
|
||||
#include <asm/mpic.h>
|
||||
|
||||
#include "plpar_wrappers.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
#else
|
||||
|
|
|
@ -5,3 +5,4 @@ obj-$(CONFIG_PPC_MPC106) += grackle.o
|
|||
obj-$(CONFIG_BOOKE) += dcr.o
|
||||
obj-$(CONFIG_40x) += dcr.o
|
||||
obj-$(CONFIG_U3_DART) += u3_iommu.o
|
||||
obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _ASM_DART_H
|
||||
#define _ASM_DART_H
|
||||
#ifndef _POWERPC_SYSDEV_DART_H
|
||||
#define _POWERPC_SYSDEV_DART_H
|
||||
|
||||
|
||||
/* physical base of DART registers */
|
||||
|
@ -56,4 +56,4 @@
|
|||
#define DART_PAGE_FACTOR (PAGE_SHIFT - DART_PAGE_SHIFT)
|
||||
|
||||
|
||||
#endif
|
||||
#endif /* _POWERPC_SYSDEV_DART_H */
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* NVRAM for CPBW
|
||||
* memory mapped NVRAM
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2005
|
||||
*
|
||||
|
@ -30,54 +30,54 @@
|
|||
#include <asm/nvram.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
static void __iomem *bpa_nvram_start;
|
||||
static long bpa_nvram_len;
|
||||
static spinlock_t bpa_nvram_lock = SPIN_LOCK_UNLOCKED;
|
||||
static void __iomem *mmio_nvram_start;
|
||||
static long mmio_nvram_len;
|
||||
static spinlock_t mmio_nvram_lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
static ssize_t bpa_nvram_read(char *buf, size_t count, loff_t *index)
|
||||
static ssize_t mmio_nvram_read(char *buf, size_t count, loff_t *index)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (*index >= bpa_nvram_len)
|
||||
if (*index >= mmio_nvram_len)
|
||||
return 0;
|
||||
if (*index + count > bpa_nvram_len)
|
||||
count = bpa_nvram_len - *index;
|
||||
if (*index + count > mmio_nvram_len)
|
||||
count = mmio_nvram_len - *index;
|
||||
|
||||
spin_lock_irqsave(&bpa_nvram_lock, flags);
|
||||
spin_lock_irqsave(&mmio_nvram_lock, flags);
|
||||
|
||||
memcpy_fromio(buf, bpa_nvram_start + *index, count);
|
||||
memcpy_fromio(buf, mmio_nvram_start + *index, count);
|
||||
|
||||
spin_unlock_irqrestore(&bpa_nvram_lock, flags);
|
||||
spin_unlock_irqrestore(&mmio_nvram_lock, flags);
|
||||
|
||||
*index += count;
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t bpa_nvram_write(char *buf, size_t count, loff_t *index)
|
||||
static ssize_t mmio_nvram_write(char *buf, size_t count, loff_t *index)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (*index >= bpa_nvram_len)
|
||||
if (*index >= mmio_nvram_len)
|
||||
return 0;
|
||||
if (*index + count > bpa_nvram_len)
|
||||
count = bpa_nvram_len - *index;
|
||||
if (*index + count > mmio_nvram_len)
|
||||
count = mmio_nvram_len - *index;
|
||||
|
||||
spin_lock_irqsave(&bpa_nvram_lock, flags);
|
||||
spin_lock_irqsave(&mmio_nvram_lock, flags);
|
||||
|
||||
memcpy_toio(bpa_nvram_start + *index, buf, count);
|
||||
memcpy_toio(mmio_nvram_start + *index, buf, count);
|
||||
|
||||
spin_unlock_irqrestore(&bpa_nvram_lock, flags);
|
||||
spin_unlock_irqrestore(&mmio_nvram_lock, flags);
|
||||
|
||||
*index += count;
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t bpa_nvram_get_size(void)
|
||||
static ssize_t mmio_nvram_get_size(void)
|
||||
{
|
||||
return bpa_nvram_len;
|
||||
return mmio_nvram_len;
|
||||
}
|
||||
|
||||
int __init bpa_nvram_init(void)
|
||||
int __init mmio_nvram_init(void)
|
||||
{
|
||||
struct device_node *nvram_node;
|
||||
unsigned long *buffer;
|
||||
|
@ -97,20 +97,20 @@ int __init bpa_nvram_init(void)
|
|||
|
||||
ret = -ENODEV;
|
||||
nvram_addr = buffer[0];
|
||||
bpa_nvram_len = buffer[1];
|
||||
if ( (!bpa_nvram_len) || (!nvram_addr) )
|
||||
mmio_nvram_len = buffer[1];
|
||||
if ( (!mmio_nvram_len) || (!nvram_addr) )
|
||||
goto out;
|
||||
|
||||
bpa_nvram_start = ioremap(nvram_addr, bpa_nvram_len);
|
||||
if (!bpa_nvram_start)
|
||||
mmio_nvram_start = ioremap(nvram_addr, mmio_nvram_len);
|
||||
if (!mmio_nvram_start)
|
||||
goto out;
|
||||
|
||||
printk(KERN_INFO "BPA NVRAM, %luk mapped to %p\n",
|
||||
bpa_nvram_len >> 10, bpa_nvram_start);
|
||||
printk(KERN_INFO "mmio NVRAM, %luk mapped to %p\n",
|
||||
mmio_nvram_len >> 10, mmio_nvram_start);
|
||||
|
||||
ppc_md.nvram_read = bpa_nvram_read;
|
||||
ppc_md.nvram_write = bpa_nvram_write;
|
||||
ppc_md.nvram_size = bpa_nvram_get_size;
|
||||
ppc_md.nvram_read = mmio_nvram_read;
|
||||
ppc_md.nvram_write = mmio_nvram_write;
|
||||
ppc_md.nvram_size = mmio_nvram_get_size;
|
||||
|
||||
out:
|
||||
of_node_put(nvram_node);
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/ppc64/kernel/u3_iommu.c
|
||||
* arch/powerpc/sysdev/u3_iommu.c
|
||||
*
|
||||
* Copyright (C) 2004 Olof Johansson <olof@austin.ibm.com>, IBM Corporation
|
||||
*
|
||||
|
@ -44,9 +44,10 @@
|
|||
#include <asm/abs_addr.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/lmb.h>
|
||||
#include <asm/dart.h>
|
||||
#include <asm/ppc-pci.h>
|
||||
|
||||
#include "dart.h"
|
||||
|
||||
extern int iommu_force_on;
|
||||
|
||||
/* Physical base address and size of the DART table */
|
||||
|
|
|
@ -388,9 +388,8 @@ void m8xx_cpm_dpinit(void)
|
|||
|
||||
/*
|
||||
* Allocate the requested size worth of DP memory.
|
||||
* This function used to return an index into the DPRAM area.
|
||||
* Now it returns the actuall physical address of that area.
|
||||
* use m8xx_cpm_dpram_offset() to get the index
|
||||
* This function returns an offset into the DPRAM area.
|
||||
* Use cpm_dpram_addr() to get the virtual address of the area.
|
||||
*/
|
||||
uint cpm_dpalloc(uint size, uint align)
|
||||
{
|
||||
|
|
|
@ -66,7 +66,8 @@ head-$(CONFIG_PPC_FPU) += arch/powerpc/kernel/fpu.o
|
|||
core-y += arch/ppc/kernel/ arch/powerpc/kernel/ \
|
||||
arch/ppc/platforms/ \
|
||||
arch/ppc/mm/ arch/ppc/lib/ \
|
||||
arch/ppc/syslib/ arch/powerpc/sysdev/
|
||||
arch/ppc/syslib/ arch/powerpc/sysdev/ \
|
||||
arch/powerpc/lib/
|
||||
core-$(CONFIG_4xx) += arch/ppc/platforms/4xx/
|
||||
core-$(CONFIG_83xx) += arch/ppc/platforms/83xx/
|
||||
core-$(CONFIG_85xx) += arch/ppc/platforms/85xx/
|
||||
|
|
|
@ -45,7 +45,6 @@ obj-$(CONFIG_MODULES) += module.o
|
|||
obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-mapping.o
|
||||
obj-$(CONFIG_PCI) += pci.o
|
||||
obj-$(CONFIG_KGDB) += ppc-stub.o
|
||||
obj-$(CONFIG_SMP) += smp.o smp-tbsync.o
|
||||
obj-$(CONFIG_TAU) += temp.o
|
||||
ifndef CONFIG_E200
|
||||
obj-$(CONFIG_FSL_BOOKE) += perfmon_fsl_booke.o
|
||||
|
|
|
@ -1,126 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 1996 Paul Mackerras.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/*
|
||||
* If the bitops are not inlined in bitops.h, they are defined here.
|
||||
* -- paulus
|
||||
*/
|
||||
#if !__INLINE_BITOPS
|
||||
void set_bit(int nr, volatile void * addr)
|
||||
{
|
||||
unsigned long old;
|
||||
unsigned long mask = 1 << (nr & 0x1f);
|
||||
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
|
||||
|
||||
__asm__ __volatile__(SMP_WMB "\n\
|
||||
1: lwarx %0,0,%3 \n\
|
||||
or %0,%0,%2 \n"
|
||||
PPC405_ERR77(0,%3)
|
||||
" stwcx. %0,0,%3 \n\
|
||||
bne 1b"
|
||||
SMP_MB
|
||||
: "=&r" (old), "=m" (*p)
|
||||
: "r" (mask), "r" (p), "m" (*p)
|
||||
: "cc" );
|
||||
}
|
||||
|
||||
void clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
unsigned long old;
|
||||
unsigned long mask = 1 << (nr & 0x1f);
|
||||
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
|
||||
|
||||
__asm__ __volatile__(SMP_WMB "\n\
|
||||
1: lwarx %0,0,%3 \n\
|
||||
andc %0,%0,%2 \n"
|
||||
PPC405_ERR77(0,%3)
|
||||
" stwcx. %0,0,%3 \n\
|
||||
bne 1b"
|
||||
SMP_MB
|
||||
: "=&r" (old), "=m" (*p)
|
||||
: "r" (mask), "r" (p), "m" (*p)
|
||||
: "cc");
|
||||
}
|
||||
|
||||
void change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
unsigned long old;
|
||||
unsigned long mask = 1 << (nr & 0x1f);
|
||||
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
|
||||
|
||||
__asm__ __volatile__(SMP_WMB "\n\
|
||||
1: lwarx %0,0,%3 \n\
|
||||
xor %0,%0,%2 \n"
|
||||
PPC405_ERR77(0,%3)
|
||||
" stwcx. %0,0,%3 \n\
|
||||
bne 1b"
|
||||
SMP_MB
|
||||
: "=&r" (old), "=m" (*p)
|
||||
: "r" (mask), "r" (p), "m" (*p)
|
||||
: "cc");
|
||||
}
|
||||
|
||||
int test_and_set_bit(int nr, volatile void *addr)
|
||||
{
|
||||
unsigned int old, t;
|
||||
unsigned int mask = 1 << (nr & 0x1f);
|
||||
volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);
|
||||
|
||||
__asm__ __volatile__(SMP_WMB "\n\
|
||||
1: lwarx %0,0,%4 \n\
|
||||
or %1,%0,%3 \n"
|
||||
PPC405_ERR77(0,%4)
|
||||
" stwcx. %1,0,%4 \n\
|
||||
bne 1b"
|
||||
SMP_MB
|
||||
: "=&r" (old), "=&r" (t), "=m" (*p)
|
||||
: "r" (mask), "r" (p), "m" (*p)
|
||||
: "cc");
|
||||
|
||||
return (old & mask) != 0;
|
||||
}
|
||||
|
||||
int test_and_clear_bit(int nr, volatile void *addr)
|
||||
{
|
||||
unsigned int old, t;
|
||||
unsigned int mask = 1 << (nr & 0x1f);
|
||||
volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);
|
||||
|
||||
__asm__ __volatile__(SMP_WMB "\n\
|
||||
1: lwarx %0,0,%4 \n\
|
||||
andc %1,%0,%3 \n"
|
||||
PPC405_ERR77(0,%4)
|
||||
" stwcx. %1,0,%4 \n\
|
||||
bne 1b"
|
||||
SMP_MB
|
||||
: "=&r" (old), "=&r" (t), "=m" (*p)
|
||||
: "r" (mask), "r" (p), "m" (*p)
|
||||
: "cc");
|
||||
|
||||
return (old & mask) != 0;
|
||||
}
|
||||
|
||||
int test_and_change_bit(int nr, volatile void *addr)
|
||||
{
|
||||
unsigned int old, t;
|
||||
unsigned int mask = 1 << (nr & 0x1f);
|
||||
volatile unsigned int *p = ((volatile unsigned int *)addr) + (nr >> 5);
|
||||
|
||||
__asm__ __volatile__(SMP_WMB "\n\
|
||||
1: lwarx %0,0,%4 \n\
|
||||
xor %1,%0,%3 \n"
|
||||
PPC405_ERR77(0,%4)
|
||||
" stwcx. %1,0,%4 \n\
|
||||
bne 1b"
|
||||
SMP_MB
|
||||
: "=&r" (old), "=&r" (t), "=m" (*p)
|
||||
: "r" (mask), "r" (p), "m" (*p)
|
||||
: "cc");
|
||||
|
||||
return (old & mask) != 0;
|
||||
}
|
||||
#endif /* !__INLINE_BITOPS */
|
|
@ -126,7 +126,7 @@ skip:
|
|||
seq_puts(p, " PowerPC Thermal Assist (cpu temp)\n");
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_SMP
|
||||
#if defined(CONFIG_SMP) && !defined(CONFIG_PPC_MERGE)
|
||||
/* should this be per processor send/receive? */
|
||||
seq_printf(p, "IPI (recv/sent): %10u/%u\n",
|
||||
atomic_read(&ipi_recv), atomic_read(&ipi_sent));
|
||||
|
|
|
@ -32,7 +32,7 @@ const extern unsigned int relocate_new_kernel_size;
|
|||
* Provide a dummy crash_notes definition while crash dump arrives to ppc.
|
||||
* This prevents breakage of crash_notes attribute in kernel/ksysfs.c.
|
||||
*/
|
||||
void *crash_notes = NULL;
|
||||
note_buf_t crash_notes[NR_CPUS];
|
||||
|
||||
void machine_shutdown(void)
|
||||
{
|
||||
|
|
|
@ -131,6 +131,11 @@ EXPORT_SYMBOL(outw);
|
|||
EXPORT_SYMBOL(outl);
|
||||
EXPORT_SYMBOL(outsl);*/
|
||||
|
||||
EXPORT_SYMBOL(__ide_mm_insl);
|
||||
EXPORT_SYMBOL(__ide_mm_outsw);
|
||||
EXPORT_SYMBOL(__ide_mm_insw);
|
||||
EXPORT_SYMBOL(__ide_mm_outsl);
|
||||
|
||||
EXPORT_SYMBOL(_insb);
|
||||
EXPORT_SYMBOL(_outsb);
|
||||
EXPORT_SYMBOL(_insw);
|
||||
|
|
|
@ -606,22 +606,22 @@ int check_bug_trap(struct pt_regs *regs)
|
|||
if (bug->line & BUG_WARNING_TRAP) {
|
||||
/* this is a WARN_ON rather than BUG/BUG_ON */
|
||||
#ifdef CONFIG_XMON
|
||||
xmon_printf(KERN_ERR "Badness in %s at %s:%d\n",
|
||||
xmon_printf(KERN_ERR "Badness in %s at %s:%ld\n",
|
||||
bug->function, bug->file,
|
||||
bug->line & ~BUG_WARNING_TRAP);
|
||||
#endif /* CONFIG_XMON */
|
||||
printk(KERN_ERR "Badness in %s at %s:%d\n",
|
||||
printk(KERN_ERR "Badness in %s at %s:%ld\n",
|
||||
bug->function, bug->file,
|
||||
bug->line & ~BUG_WARNING_TRAP);
|
||||
dump_stack();
|
||||
return 1;
|
||||
}
|
||||
#ifdef CONFIG_XMON
|
||||
xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%d!\n",
|
||||
xmon_printf(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
|
||||
bug->function, bug->file, bug->line);
|
||||
xmon(regs);
|
||||
#endif /* CONFIG_XMON */
|
||||
printk(KERN_CRIT "kernel BUG in %s at %s:%d!\n",
|
||||
printk(KERN_CRIT "kernel BUG in %s at %s:%ld!\n",
|
||||
bug->function, bug->file, bug->line);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include <asm/bootinfo.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/xmon.h>
|
||||
#include <asm/ppc_sys.h>
|
||||
|
||||
#include "ppc8xx_pic.h"
|
||||
|
||||
|
|
|
@ -89,12 +89,14 @@ config PPC_PMAC
|
|||
bool " Apple G5 based machines"
|
||||
default y
|
||||
select U3_DART
|
||||
select GENERIC_TBSYNC
|
||||
|
||||
config PPC_MAPLE
|
||||
depends on PPC_MULTIPLATFORM
|
||||
bool " Maple 970FX Evaluation Board"
|
||||
select U3_DART
|
||||
select MPIC_BROKEN_U3
|
||||
select GENERIC_TBSYNC
|
||||
default n
|
||||
help
|
||||
This option enables support for the Maple 970FX Evaluation Board.
|
||||
|
@ -182,6 +184,9 @@ config MPIC_BROKEN_U3
|
|||
depends on PPC_MAPLE
|
||||
default y
|
||||
|
||||
config GENERIC_TBSYNC
|
||||
def_bool n
|
||||
|
||||
config PPC_PMAC64
|
||||
bool
|
||||
depends on PPC_PMAC
|
||||
|
|
|
@ -86,7 +86,6 @@ head-y := arch/ppc64/kernel/head.o
|
|||
head-y += arch/powerpc/kernel/fpu.o
|
||||
head-y += arch/powerpc/kernel/entry_64.o
|
||||
|
||||
libs-y += arch/ppc64/lib/
|
||||
core-y += arch/ppc64/kernel/ arch/powerpc/kernel/
|
||||
core-y += arch/powerpc/mm/
|
||||
core-y += arch/powerpc/sysdev/
|
||||
|
|
|
@ -12,8 +12,7 @@ obj-y := misc.o prom.o
|
|||
endif
|
||||
|
||||
obj-y += irq.o idle.o dma.o \
|
||||
signal.o \
|
||||
align.o bitops.o pacaData.o \
|
||||
align.o pacaData.o \
|
||||
udbg.o ioctl32.o \
|
||||
rtc.o \
|
||||
cpu_setup_power4.o \
|
||||
|
@ -29,22 +28,16 @@ ifneq ($(CONFIG_PPC_MERGE),y)
|
|||
obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PPC_PSERIES) += rtasd.o udbg_16550.o
|
||||
|
||||
obj-$(CONFIG_PPC_BPA) += bpa_setup.o bpa_iommu.o bpa_nvram.o \
|
||||
bpa_iic.o spider-pic.o
|
||||
obj-$(CONFIG_PPC_PSERIES) += udbg_16550.o
|
||||
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o
|
||||
obj-$(CONFIG_EEH) += eeh.o
|
||||
obj-$(CONFIG_PROC_FS) += proc_ppc64.o
|
||||
obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
ifneq ($(CONFIG_PPC_MERGE),y)
|
||||
obj-$(CONFIG_MODULES) += ppc_ksyms.o
|
||||
endif
|
||||
obj-$(CONFIG_PPC_RTAS) += rtas_pci.o
|
||||
obj-$(CONFIG_RTAS_PROC) += rtas-proc.o
|
||||
obj-$(CONFIG_SCANLOG) += scanlog.o
|
||||
obj-$(CONFIG_LPARCFG) += lparcfg.o
|
||||
obj-$(CONFIG_HVC_CONSOLE) += hvconsole.o
|
||||
|
@ -57,11 +50,6 @@ obj-$(CONFIG_PPC_PMAC) += udbg_scc.o
|
|||
|
||||
obj-$(CONFIG_PPC_MAPLE) += udbg_16550.o
|
||||
|
||||
ifdef CONFIG_SMP
|
||||
obj-$(CONFIG_PPC_PMAC) += smp-tbsync.o
|
||||
obj-$(CONFIG_PPC_MAPLE) += smp-tbsync.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
|
||||
CFLAGS_ioctl32.o += -Ifs/
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
#include <asm/paca.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iSeries/HvLpEvent.h>
|
||||
#include <asm/iseries/hv_lp_event.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/cache.h>
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <asm/cputable.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/iSeries/LparMap.h>
|
||||
#include <asm/iseries/lpar_map.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
|
@ -1914,24 +1914,6 @@ _GLOBAL(hmt_start_secondary)
|
|||
blr
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
|
||||
_GLOBAL(smp_release_cpus)
|
||||
/* All secondary cpus are spinning on a common
|
||||
* spinloop, release them all now so they can start
|
||||
* to spin on their individual paca spinloops.
|
||||
* For non SMP kernels, the secondary cpus never
|
||||
* get out of the common spinloop.
|
||||
* XXX This does nothing useful on iSeries, secondaries are
|
||||
* already waiting on their paca.
|
||||
*/
|
||||
li r3,1
|
||||
LOADADDR(r5,__secondary_hold_spinloop)
|
||||
std r3,0(r5)
|
||||
sync
|
||||
blr
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
||||
/*
|
||||
* We put a few things here that have to be page-aligned.
|
||||
* This stuff goes at the beginning of the bss, which is page-aligned.
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
#include <asm/cache.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/paca.h>
|
||||
|
||||
|
@ -392,7 +392,7 @@ int virt_irq_create_mapping(unsigned int real_irq)
|
|||
if (ppc64_interrupt_controller == IC_OPEN_PIC)
|
||||
return real_irq; /* no mapping for openpic (for now) */
|
||||
|
||||
if (ppc64_interrupt_controller == IC_BPA_IIC)
|
||||
if (ppc64_interrupt_controller == IC_CELL_PIC)
|
||||
return real_irq; /* no mapping for iic either */
|
||||
|
||||
/* don't map interrupts < MIN_VIRT_IRQ */
|
||||
|
|
|
@ -26,14 +26,14 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/iSeries/HvLpConfig.h>
|
||||
#include <asm/iseries/hv_lp_config.h>
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/iSeries/ItExtVpdPanel.h>
|
||||
#include <asm/iseries/it_exp_vpd_panel.h>
|
||||
#include <asm/prom.h>
|
||||
|
||||
#define MODULE_VERS "1.6"
|
||||
|
|
|
@ -244,7 +244,6 @@ static void kexec_prepare_cpus(void)
|
|||
|
||||
static void kexec_prepare_cpus(void)
|
||||
{
|
||||
extern void smp_release_cpus(void);
|
||||
/*
|
||||
* move the secondarys to us so that we can copy
|
||||
* the new kernel 0-0x100 safely
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
#include <asm/page.h>
|
||||
|
||||
#include <asm/lppaca.h>
|
||||
#include <asm/iSeries/ItLpQueue.h>
|
||||
#include <asm/iseries/it_lp_queue.h>
|
||||
#include <asm/paca.h>
|
||||
|
||||
static union {
|
||||
|
|
|
@ -181,13 +181,14 @@ EXPORT_SYMBOL(fetch_dev_dn);
|
|||
static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node)
|
||||
{
|
||||
struct device_node *np = node;
|
||||
struct pci_dn *pci;
|
||||
struct pci_dn *pci = NULL;
|
||||
int err = NOTIFY_OK;
|
||||
|
||||
switch (action) {
|
||||
case PSERIES_RECONFIG_ADD:
|
||||
pci = np->parent->data;
|
||||
update_dn_pci_info(np, pci->phb);
|
||||
if (pci)
|
||||
update_dn_pci_info(np, pci->phb);
|
||||
break;
|
||||
default:
|
||||
err = NOTIFY_DONE;
|
||||
|
|
|
@ -53,7 +53,7 @@ static int __init proc_ppc64_create(void)
|
|||
if (!root)
|
||||
return 1;
|
||||
|
||||
if (!(systemcfg->platform & (PLATFORM_PSERIES | PLATFORM_BPA)))
|
||||
if (!(systemcfg->platform & (PLATFORM_PSERIES | PLATFORM_CELL)))
|
||||
return 0;
|
||||
|
||||
if (!proc_mkdir("rtas", root))
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue