Commit 76babde1 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc

* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (67 commits)
  [PATCH] powerpc: Remove oprofile spinlock backtrace code
  [PATCH] powerpc: Add oprofile calltrace support to all powerpc cpus
  [PATCH] powerpc: Add oprofile calltrace support
  [PATCH] for_each_possible_cpu: ppc
  [PATCH] for_each_possible_cpu: powerpc
  [PATCH] lock PTE before updating it in 440/BookE page fault handler
  [PATCH] powerpc: Kill _machine and hard-coded platform numbers
  ppc: Fix compile error in arch/ppc/lib/strcase.c
  [PATCH] git-powerpc: WARN was a dumb idea
  [PATCH] powerpc: a couple of trivial compile warning fixes
  powerpc: remove OCP references
  powerpc: Make uImage default build output for MPC8540 ADS
  powerpc: move math-emu over to arch/powerpc
  powerpc: use memparse() for mem= command line parsing
  ppc: fix strncasecmp prototype
  [PATCH] powerpc: make ISA floppies work again
  [PATCH] powerpc: Fix some initcall return values
  [PATCH] powerpc: Workaround for pSeries RTAS bug
  [PATCH] spufs: fix __init/__exit annotations
  [PATCH] powerpc: add hvc backend for rtas
  ...
parents e71ac603 15e812ad
...@@ -719,6 +719,11 @@ address which can extend beyond that limit. ...@@ -719,6 +719,11 @@ address which can extend beyond that limit.
- model : this is your board name/model - model : this is your board name/model
- #address-cells : address representation for "root" devices - #address-cells : address representation for "root" devices
- #size-cells: the size representation for "root" devices - #size-cells: the size representation for "root" devices
- device_type : This property shouldn't be necessary. However, if
you decide to create a device_type for your root node, make sure it
is _not_ "chrp" unless your platform is a pSeries or PAPR compliant
one for 64-bit, or a CHRP-type machine for 32-bit as this will
matched by the kernel this way.
Additionally, some recommended properties are: Additionally, some recommended properties are:
......
...@@ -491,7 +491,7 @@ config PPC601_SYNC_FIX ...@@ -491,7 +491,7 @@ config PPC601_SYNC_FIX
If in doubt, say Y here. If in doubt, say Y here.
config TAU config TAU
bool "Thermal Management Support" bool "On-chip CPU temperature sensor support"
depends on 6xx depends on 6xx
help help
G3 and G4 processors have an on-chip temperature sensor called the G3 and G4 processors have an on-chip temperature sensor called the
...@@ -500,7 +500,7 @@ config TAU ...@@ -500,7 +500,7 @@ config TAU
on-die temperature in /proc/cpuinfo if the cpu supports it. on-die temperature in /proc/cpuinfo if the cpu supports it.
Unfortunately, on some chip revisions, this sensor is very inaccurate Unfortunately, on some chip revisions, this sensor is very inaccurate
and in some cases, does not work at all, so don't assume the cpu and in many cases, does not work at all, so don't assume the cpu
temp is actually what /proc/cpuinfo says it is. temp is actually what /proc/cpuinfo says it is.
config TAU_INT config TAU_INT
......
...@@ -110,11 +110,6 @@ config SERIAL_TEXT_DEBUG ...@@ -110,11 +110,6 @@ config SERIAL_TEXT_DEBUG
depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \ depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \
PPC_GEN550 || PPC_MPC52xx PPC_GEN550 || PPC_MPC52xx
config PPC_OCP
bool
depends on IBM_OCP || XILINX_OCP
default y
choice choice
prompt "Early debugging (dangerous)" prompt "Early debugging (dangerous)"
bool bool
......
...@@ -129,13 +129,8 @@ core-y += arch/powerpc/kernel/ \ ...@@ -129,13 +129,8 @@ core-y += arch/powerpc/kernel/ \
arch/powerpc/lib/ \ arch/powerpc/lib/ \
arch/powerpc/sysdev/ \ arch/powerpc/sysdev/ \
arch/powerpc/platforms/ arch/powerpc/platforms/
core-$(CONFIG_PPC32) += arch/ppc/kernel/ core-$(CONFIG_MATH_EMULATION) += arch/powerpc/math-emu/
core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/
core-$(CONFIG_XMON) += arch/powerpc/xmon/ core-$(CONFIG_XMON) += arch/powerpc/xmon/
core-$(CONFIG_APUS) += arch/ppc/amiga/
drivers-$(CONFIG_8xx) += arch/ppc/8xx_io/
drivers-$(CONFIG_4xx) += arch/ppc/4xx_io/
drivers-$(CONFIG_CPM2) += arch/ppc/8260_io/
drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/
......
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.16-rc6 # Linux kernel version: 2.6.16
# Wed Mar 15 16:19:48 2006 # Thu Mar 23 20:48:09 2006
# #
CONFIG_PPC64=y CONFIG_PPC64=y
CONFIG_64BIT=y CONFIG_64BIT=y
...@@ -30,6 +30,7 @@ CONFIG_POWER4=y ...@@ -30,6 +30,7 @@ CONFIG_POWER4=y
CONFIG_PPC_FPU=y CONFIG_PPC_FPU=y
CONFIG_ALTIVEC=y CONFIG_ALTIVEC=y
CONFIG_PPC_STD_MMU=y CONFIG_PPC_STD_MMU=y
CONFIG_VIRT_CPU_ACCOUNTING=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=4 CONFIG_NR_CPUS=4
...@@ -51,7 +52,8 @@ CONFIG_SYSVIPC=y ...@@ -51,7 +52,8 @@ CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
# CONFIG_IKCONFIG is not set CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
# CONFIG_CPUSETS is not set # CONFIG_CPUSETS is not set
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_CC_OPTIMIZE_FOR_SIZE=y
...@@ -85,7 +87,7 @@ CONFIG_MODULE_UNLOAD=y ...@@ -85,7 +87,7 @@ CONFIG_MODULE_UNLOAD=y
CONFIG_OBSOLETE_MODPARM=y CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set # CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set # CONFIG_MODULE_SRCVERSION_ALL is not set
# CONFIG_KMOD is not set CONFIG_KMOD=y
CONFIG_STOP_MACHINE=y CONFIG_STOP_MACHINE=y
# #
...@@ -130,7 +132,8 @@ CONFIG_CELL_IIC=y ...@@ -130,7 +132,8 @@ CONFIG_CELL_IIC=y
# #
# Cell Broadband Engine options # Cell Broadband Engine options
# #
CONFIG_SPU_FS=y CONFIG_SPU_FS=m
CONFIG_SPUFS_MMAP=y
# #
# Kernel options # Kernel options
...@@ -144,7 +147,7 @@ CONFIG_PREEMPT_NONE=y ...@@ -144,7 +147,7 @@ CONFIG_PREEMPT_NONE=y
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
CONFIG_PREEMPT_BKL=y CONFIG_PREEMPT_BKL=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set CONFIG_BINFMT_MISC=m
CONFIG_FORCE_MAX_ZONEORDER=13 CONFIG_FORCE_MAX_ZONEORDER=13
# CONFIG_IOMMU_VMERGE is not set # CONFIG_IOMMU_VMERGE is not set
CONFIG_KEXEC=y CONFIG_KEXEC=y
...@@ -155,13 +158,16 @@ CONFIG_ARCH_SELECT_MEMORY_MODEL=y ...@@ -155,13 +158,16 @@ CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_FLATMEM_ENABLE=y CONFIG_ARCH_FLATMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y # CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_DISCONTIGMEM_MANUAL is not set
# CONFIG_SPARSEMEM_MANUAL is not set CONFIG_SPARSEMEM_MANUAL=y
CONFIG_FLATMEM=y CONFIG_SPARSEMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_HAVE_MEMORY_PRESENT=y
# CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPARSEMEM_EXTREME=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_MIGRATION=y
# CONFIG_PPC_64K_PAGES is not set # CONFIG_PPC_64K_PAGES is not set
CONFIG_SCHED_SMT=y CONFIG_SCHED_SMT=y
CONFIG_PROC_DEVICETREE=y CONFIG_PROC_DEVICETREE=y
...@@ -232,6 +238,7 @@ CONFIG_TCP_CONG_BIC=y ...@@ -232,6 +238,7 @@ CONFIG_TCP_CONG_BIC=y
# CONFIG_IP_VS is not set # CONFIG_IP_VS is not set
CONFIG_IPV6=y CONFIG_IPV6=y
# CONFIG_IPV6_PRIVACY is not set # CONFIG_IPV6_PRIVACY is not set
# CONFIG_IPV6_ROUTER_PREF is not set
CONFIG_INET6_AH=m CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m CONFIG_INET6_IPCOMP=m
...@@ -244,25 +251,7 @@ CONFIG_NETFILTER=y ...@@ -244,25 +251,7 @@ CONFIG_NETFILTER=y
# Core Netfilter Configuration # Core Netfilter Configuration
# #
# CONFIG_NETFILTER_NETLINK is not set # CONFIG_NETFILTER_NETLINK is not set
CONFIG_NETFILTER_XTABLES=m # CONFIG_NETFILTER_XTABLES is not set
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
# #
# IP: Netfilter Configuration # IP: Netfilter Configuration
...@@ -278,51 +267,13 @@ CONFIG_IP_NF_IRC=m ...@@ -278,51 +267,13 @@ CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_TFTP=m
CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_AMANDA=m
# CONFIG_IP_NF_PPTP is not set # CONFIG_IP_NF_PPTP is not set
# CONFIG_IP_NF_H323 is not set
CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_IPRANGE=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_TTL=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_MATCH_ADDRTYPE=m
CONFIG_IP_NF_MATCH_HASHLIMIT=m
CONFIG_IP_NF_MATCH_POLICY=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_SAME=m
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_NAT_TFTP=m
CONFIG_IP_NF_NAT_AMANDA=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
# #
# IPv6: Netfilter Configuration (EXPERIMENTAL) # IPv6: Netfilter Configuration (EXPERIMENTAL)
# #
# CONFIG_IP6_NF_QUEUE is not set # CONFIG_IP6_NF_QUEUE is not set
# CONFIG_IP6_NF_IPTABLES is not set
# #
# DCCP Configuration (EXPERIMENTAL) # DCCP Configuration (EXPERIMENTAL)
...@@ -355,7 +306,6 @@ CONFIG_IP_NF_ARP_MANGLE=m ...@@ -355,7 +306,6 @@ CONFIG_IP_NF_ARP_MANGLE=m
# QoS and/or fair queueing # QoS and/or fair queueing
# #
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
CONFIG_NET_CLS_ROUTE=y
# #
# Network testing # Network testing
...@@ -408,7 +358,7 @@ CONFIG_FW_LOADER=y ...@@ -408,7 +358,7 @@ CONFIG_FW_LOADER=y
# CONFIG_BLK_DEV_COW_COMMON is not set # CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_CRYPTOLOOP is not set
CONFIG_BLK_DEV_NBD=y # CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_SX8 is not set
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_COUNT=16
...@@ -484,7 +434,23 @@ CONFIG_IDEDMA_AUTO=y ...@@ -484,7 +434,23 @@ CONFIG_IDEDMA_AUTO=y
# #
# Multi-device support (RAID and LVM) # Multi-device support (RAID and LVM)
# #
# CONFIG_MD is not set CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
# CONFIG_MD_RAID10 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_MD_RAID6 is not set
# CONFIG_MD_MULTIPATH is not set
# CONFIG_MD_FAULTY is not set
CONFIG_BLK_DEV_DM=m
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_MIRROR=m
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
# CONFIG_DM_MULTIPATH_EMC is not set
# #
# Fusion MPT device support # Fusion MPT device support
...@@ -548,7 +514,7 @@ CONFIG_MII=y ...@@ -548,7 +514,7 @@ CONFIG_MII=y
# CONFIG_ACENIC is not set # CONFIG_ACENIC is not set
# CONFIG_DL2K is not set # CONFIG_DL2K is not set
CONFIG_E1000=m CONFIG_E1000=m
# CONFIG_E1000_NAPI is not set CONFIG_E1000_NAPI=y
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
# CONFIG_NS83820 is not set # CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set # CONFIG_HAMACHI is not set
...@@ -560,7 +526,7 @@ CONFIG_SKGE=m ...@@ -560,7 +526,7 @@ CONFIG_SKGE=m
# CONFIG_SK98LIN is not set # CONFIG_SK98LIN is not set
# CONFIG_TIGON3 is not set # CONFIG_TIGON3 is not set
# CONFIG_BNX2 is not set # CONFIG_BNX2 is not set
CONFIG_SPIDER_NET=y CONFIG_SPIDER_NET=m
# CONFIG_MV643XX_ETH is not set # CONFIG_MV643XX_ETH is not set
# #
...@@ -678,6 +644,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y ...@@ -678,6 +644,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
# CONFIG_LEGACY_PTYS is not set # CONFIG_LEGACY_PTYS is not set
CONFIG_HVC_DRIVER=y
CONFIG_HVC_RTAS=y
# #
# IPMI # IPMI
...@@ -694,14 +662,13 @@ CONFIG_WATCHDOG=y ...@@ -694,14 +662,13 @@ CONFIG_WATCHDOG=y
# Watchdog Device Drivers # Watchdog Device Drivers
# #
# CONFIG_SOFT_WATCHDOG is not set # CONFIG_SOFT_WATCHDOG is not set
# CONFIG_WATCHDOG_RTAS is not set CONFIG_WATCHDOG_RTAS=y
# #
# PCI-based Watchdog Cards # PCI-based Watchdog Cards
# #
# CONFIG_PCIPCWATCHDOG is not set # CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set # CONFIG_WDTPCI is not set
# CONFIG_RTC is not set
CONFIG_GEN_RTC=y CONFIG_GEN_RTC=y
# CONFIG_GEN_RTC_X is not set # CONFIG_GEN_RTC_X is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
...@@ -833,6 +800,7 @@ CONFIG_DUMMY_CONSOLE=y ...@@ -833,6 +800,7 @@ CONFIG_DUMMY_CONSOLE=y
# #
CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
# CONFIG_USB is not set # CONFIG_USB is not set
# #
...@@ -852,7 +820,14 @@ CONFIG_USB_ARCH_HAS_OHCI=y ...@@ -852,7 +820,14 @@ CONFIG_USB_ARCH_HAS_OHCI=y
# #
# InfiniBand support # InfiniBand support
# #
# CONFIG_INFINIBAND is not set CONFIG_INFINIBAND=y
CONFIG_INFINIBAND_USER_MAD=m
CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_INFINIBAND_MTHCA=m
CONFIG_INFINIBAND_MTHCA_DEBUG=y
CONFIG_INFINIBAND_IPOIB=m
CONFIG_INFINIBAND_IPOIB_DEBUG=y
CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=y
# #
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) # EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
...@@ -1037,10 +1012,6 @@ CONFIG_CRC32=y ...@@ -1037,10 +1012,6 @@ CONFIG_CRC32=y
# CONFIG_LIBCRC32C is not set # CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_INFLATE=m
CONFIG_ZLIB_DEFLATE=m CONFIG_ZLIB_DEFLATE=m
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
# #
# Instrumentation Support # Instrumentation Support
...@@ -1058,7 +1029,7 @@ CONFIG_LOG_BUF_SHIFT=15 ...@@ -1058,7 +1029,7 @@ CONFIG_LOG_BUF_SHIFT=15
CONFIG_DETECT_SOFTLOCKUP=y CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_MUTEXES is not set CONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
......
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: # Linux kernel version: 2.6.16
# Sat Jan 14 15:57:54 2006 # Mon Mar 27 23:37:36 2006
# #
# CONFIG_PPC64 is not set # CONFIG_PPC64 is not set
CONFIG_PPC32=y CONFIG_PPC32=y
...@@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y ...@@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_HARDIRQS=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_PPC=y CONFIG_PPC=y
CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK=y
...@@ -18,6 +19,7 @@ CONFIG_ARCH_MAY_HAVE_PC_FDC=y ...@@ -18,6 +19,7 @@ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_PPC_OF=y CONFIG_PPC_OF=y
CONFIG_PPC_UDBG_16550=y CONFIG_PPC_UDBG_16550=y
# CONFIG_GENERIC_TBSYNC is not set # CONFIG_GENERIC_TBSYNC is not set
CONFIG_DEFAULT_UIMAGE=y
# #
# Processor support # Processor support
...@@ -42,7 +44,6 @@ CONFIG_SPE=y ...@@ -42,7 +44,6 @@ CONFIG_SPE=y
# Code maturity level options # Code maturity level options
# #
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_INIT_ENV_ARG_LIMIT=32
...@@ -58,6 +59,7 @@ CONFIG_SYSVIPC=y ...@@ -58,6 +59,7 @@ CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
# CONFIG_RELAY is not set
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_EMBEDDED=y CONFIG_EMBEDDED=y
...@@ -72,10 +74,6 @@ CONFIG_BASE_FULL=y ...@@ -72,10 +74,6 @@ CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_SHMEM=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_SLAB=y CONFIG_SLAB=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
...@@ -90,6 +88,8 @@ CONFIG_BASE_SMALL=0 ...@@ -90,6 +88,8 @@ CONFIG_BASE_SMALL=0
# Block layer # Block layer
# #
# CONFIG_LBD is not set # CONFIG_LBD is not set
# CONFIG_BLK_DEV_IO_TRACE is not set
# CONFIG_LSF is not set
# #
# IO Schedulers # IO Schedulers
...@@ -183,6 +183,7 @@ CONFIG_NET=y ...@@ -183,6 +183,7 @@ CONFIG_NET=y
# #
# Networking options # Networking options
# #
# CONFIG_NETDEBUG is not set
CONFIG_PACKET=y CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set # CONFIG_PACKET_MMAP is not set
CONFIG_UNIX=y CONFIG_UNIX=y
...@@ -220,6 +221,11 @@ CONFIG_TCP_CONG_BIC=y ...@@ -220,6 +221,11 @@ CONFIG_TCP_CONG_BIC=y
# SCTP Configuration (EXPERIMENTAL) # SCTP Configuration (EXPERIMENTAL)
# #
# CONFIG_IP_SCTP is not set # CONFIG_IP_SCTP is not set
#
# TIPC Configuration (EXPERIMENTAL)
#
# CONFIG_TIPC is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_BRIDGE is not set # CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
...@@ -229,11 +235,6 @@ CONFIG_TCP_CONG_BIC=y ...@@ -229,11 +235,6 @@ CONFIG_TCP_CONG_BIC=y
# CONFIG_ATALK is not set # CONFIG_ATALK is not set
# CONFIG_X25 is not set # CONFIG_X25 is not set
# CONFIG_LAPB is not set # CONFIG_LAPB is not set
#
# TIPC Configuration (EXPERIMENTAL)
#
# CONFIG_TIPC is not set
# CONFIG_NET_DIVERT is not set # CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set # CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set # CONFIG_WAN_ROUTER is not set
...@@ -486,6 +487,12 @@ CONFIG_GEN_RTC=y ...@@ -486,6 +487,12 @@ CONFIG_GEN_RTC=y
# #
# CONFIG_I2C is not set # CONFIG_I2C is not set
#
# SPI support
#
# CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set
# #
# Dallas's 1-wire bus # Dallas's 1-wire bus
# #
...@@ -496,16 +503,13 @@ CONFIG_GEN_RTC=y ...@@ -496,16 +503,13 @@ CONFIG_GEN_RTC=y
# #
CONFIG_HWMON=y CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set # CONFIG_HWMON_VID is not set
# CONFIG_SENSORS_F71805F is not set
# CONFIG_HWMON_DEBUG_CHIP is not set # CONFIG_HWMON_DEBUG_CHIP is not set
# #
# Misc devices # Misc devices
# #
#
# Multimedia Capabilities Port drivers
#
# #
# Multimedia devices # Multimedia devices
# #
...@@ -531,6 +535,7 @@ CONFIG_HWMON=y ...@@ -531,6 +535,7 @@ CONFIG_HWMON=y
# #
# CONFIG_USB_ARCH_HAS_HCD is not set # CONFIG_USB_ARCH_HAS_HCD is not set
# CONFIG_USB_ARCH_HAS_OHCI is not set # CONFIG_USB_ARCH_HAS_OHCI is not set
# CONFIG_USB_ARCH_HAS_EHCI is not set
# #
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
...@@ -551,7 +556,7 @@ CONFIG_HWMON=y ...@@ -551,7 +556,7 @@ CONFIG_HWMON=y
# #
# #
# SN Devices # EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
# #
# #
...@@ -603,7 +608,6 @@ CONFIG_SYSFS=y ...@@ -603,7 +608,6 @@ CONFIG_SYSFS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set # CONFIG_CONFIGFS_FS is not set
# #
...@@ -658,6 +662,7 @@ CONFIG_PARTITION_ADVANCED=y ...@@ -658,6 +662,7 @@ CONFIG_PARTITION_ADVANCED=y
# CONFIG_SGI_PARTITION is not set # CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set # CONFIG_SUN_PARTITION is not set
# CONFIG_KARMA_PARTITION is not set
# CONFIG_EFI_PARTITION is not set # CONFIG_EFI_PARTITION is not set
# #
...@@ -695,6 +700,8 @@ CONFIG_DEBUG_MUTEXES=y ...@@ -695,6 +700,8 @@ CONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
# CONFIG_UNWIND_INFO is not set
CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_DEBUGGER is not set # CONFIG_DEBUGGER is not set
# CONFIG_BDI_SWITCH is not set # CONFIG_BDI_SWITCH is not set
......
...@@ -12,12 +12,12 @@ endif ...@@ -12,12 +12,12 @@ endif
obj-y := semaphore.o cputable.o ptrace.o syscalls.o \ obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
irq.o align.o signal_32.o pmc.o vdso.o \ irq.o align.o signal_32.o pmc.o vdso.o \
init_task.o process.o systbl.o init_task.o process.o systbl.o idle.o
obj-y += vdso32/ obj-y += vdso32/
obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \ obj-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
signal_64.o ptrace32.o \ signal_64.o ptrace32.o \
paca.o cpu_setup_power4.o \ paca.o cpu_setup_power4.o \
firmware.o sysfs.o idle_64.o firmware.o sysfs.o
obj-$(CONFIG_PPC64) += vdso64/ obj-$(CONFIG_PPC64) += vdso64/
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
obj-$(CONFIG_POWER4) += idle_power4.o obj-$(CONFIG_POWER4) += idle_power4.o
...@@ -34,6 +34,11 @@ obj-$(CONFIG_IBMEBUS) += ibmebus.o ...@@ -34,6 +34,11 @@ obj-$(CONFIG_IBMEBUS) += ibmebus.o
obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o
obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.o
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
obj-$(CONFIG_6xx) += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o
obj-$(CONFIG_TAU) += tau_6xx.o
obj32-$(CONFIG_SOFTWARE_SUSPEND) += swsusp_32.o
obj32-$(CONFIG_MODULES) += module_32.o
obj-$(CONFIG_E500) += perfmon_fsl_booke.o
ifeq ($(CONFIG_PPC_MERGE),y) ifeq ($(CONFIG_PPC_MERGE),y)
...@@ -51,7 +56,6 @@ obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o ...@@ -51,7 +56,6 @@ obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o
obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
obj-$(CONFIG_MODULES) += ppc_ksyms.o obj-$(CONFIG_MODULES) += ppc_ksyms.o
obj-$(CONFIG_BOOTX_TEXT) += btext.o obj-$(CONFIG_BOOTX_TEXT) += btext.o
obj-$(CONFIG_6xx) += idle_6xx.o
obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KPROBES) += kprobes.o
obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o
...@@ -77,6 +81,7 @@ smpobj-$(CONFIG_SMP) += smp.o ...@@ -77,6 +81,7 @@ smpobj-$(CONFIG_SMP) += smp.o
endif endif
obj-$(CONFIG_PPC32) += $(obj32-y)
obj-$(CONFIG_PPC64) += $(obj64-y) obj-$(CONFIG_PPC64) += $(obj64-y)
extra-$(CONFIG_PPC_FPU) += fpu.o extra-$(CONFIG_PPC_FPU) += fpu.o
......
...@@ -105,8 +105,6 @@ int main(void) ...@@ -105,8 +105,6 @@ int main(void)
DEFINE(ICACHEL1LINESIZE, offsetof(struct ppc64_caches, iline_size)); DEFINE(ICACHEL1LINESIZE, offsetof(struct ppc64_caches, iline_size));
DEFINE(ICACHEL1LOGLINESIZE, offsetof(struct ppc64_caches, log_iline_size)); DEFINE(ICACHEL1LOGLINESIZE, offsetof(struct ppc64_caches, log_iline_size));
DEFINE(ICACHEL1LINESPERPAGE, offsetof(struct ppc64_caches, ilines_per_page)); DEFINE(ICACHEL1LINESPERPAGE, offsetof(struct ppc64_caches, ilines_per_page));
DEFINE(PLATFORM_LPAR, PLATFORM_LPAR);
/* paca */ /* paca */
DEFINE(PACA_SIZE, sizeof(struct paca_struct)); DEFINE(PACA_SIZE, sizeof(struct paca_struct));
DEFINE(PACAPACAINDEX, offsetof(struct paca_struct, paca_index)); DEFINE(PACAPACAINDEX, offsetof(struct paca_struct, paca_index));
......
...@@ -135,10 +135,10 @@ transfer_to_handler: ...@@ -135,10 +135,10 @@ transfer_to_handler:
mfspr r11,SPRN_HID0 mfspr r11,SPRN_HID0
mtcr r11 mtcr r11
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
bt- 8,power_save_6xx_restore /* Check DOZE */ bt- 8,4f /* Check DOZE */
END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE) END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
bt- 9,power_save_6xx_restore /* Check NAP */ bt- 9,4f /* Check NAP */
END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
#endif /* CONFIG_6xx */ #endif /* CONFIG_6xx */
.globl transfer_to_handler_cont .globl transfer_to_handler_cont
...@@ -157,6 +157,10 @@ transfer_to_handler_cont: ...@@ -157,6 +157,10 @@ transfer_to_handler_cont:
SYNC SYNC
RFI /* jump to handler, enable MMU */ RFI /* jump to handler, enable MMU */
#ifdef CONFIG_6xx
4: b power_save_6xx_restore
#endif
/* /*
* On kernel stack overflow, load up an initial stack pointer * On kernel stack overflow, load up an initial stack pointer
* and call StackOverflow(regs), which should not return. * and call StackOverflow(regs), which should not return.
......
...@@ -617,6 +617,12 @@ _GLOBAL(enter_rtas) ...@@ -617,6 +617,12 @@ _GLOBAL(enter_rtas)
mfsrr1 r10 mfsrr1 r10
std r10,_SRR1(r1) std r10,_SRR1(r1)
/* Temporary workaround to clear CR until RTAS can be modified to
* ignore all bits.
*/
li r0,0
mtcr r0
/* There is no way it is acceptable to get here with interrupts enabled, /* There is no way it is acceptable to get here with interrupts enabled,
* check it with the asm equivalent of WARN_ON * check it with the asm equivalent of WARN_ON
*/ */
......
...@@ -14,7 +14,9 @@ ...@@ -14,7 +14,9 @@
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h>
#include <asm/firmware.h> #include <asm/firmware.h>
unsigned long ppc64_firmware_features; unsigned long powerpc_firmware_features;
EXPORT_SYMBOL_GPL(powerpc_firmware_features);
...@@ -1544,7 +1544,11 @@ _STATIC(__boot_from_prom) ...@@ -1544,7 +1544,11 @@ _STATIC(__boot_from_prom)
mr r28,r6 mr r28,r6
mr r27,r7 mr r27,r7
/* Align the stack to 16-byte boundary for broken yaboot */ /*
* Align the stack to 16-byte boundary
* Depending on the size and layout of the ELF sections in the initial
* boot binary, the stack pointer will be unalignet on PowerMac
*/
rldicr r1,r1,0,59 rldicr r1,r1,0,59
/* Make sure we are running in 64 bits mode */ /* Make sure we are running in 64 bits mode */
...@@ -1847,21 +1851,6 @@ _STATIC(start_here_multiplatform) ...@@ -1847,21 +1851,6 @@ _STATIC(start_here_multiplatform)
bl .__save_cpu_setup bl .__save_cpu_setup
sync sync
/* Setup a valid physical PACA pointer in SPRG3 for early_setup
* note that boot_cpuid can always be 0 nowadays since there is
* nowhere it can be initialized differently before we reach this
* code
*/
LOAD_REG_IMMEDIATE(r27, boot_cpuid)
add r27,r27,r26
lwz r27,0(r27)
LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */
mulli r13,r27,PACA_SIZE /* Calculate vaddr of right paca */
add r13,r13,r24 /* for this processor. */
add r13,r13,r26 /* convert to physical addr */
mtspr SPRN_SPRG3,r13
/* Do very early kernel initializations, including initial hash table, /* Do very early kernel initializations, including initial hash table,
* stab and slb setup before we turn on relocation. */ * stab and slb setup before we turn on relocation. */
...@@ -1930,6 +1919,17 @@ _STATIC(start_here_common) ...@@ -1930,6 +1919,17 @@ _STATIC(start_here_common)
/* Not reached */ /* Not reached */
BUG_OPCODE BUG_OPCODE
/* Put the paca pointer into r13 and SPRG3 */
_GLOBAL(setup_boot_paca)
LOAD_REG_IMMEDIATE(r3, boot_cpuid)
lwz r3,0(r3)
LOAD_REG_IMMEDIATE(r4, paca) /* Get base vaddr of paca array */
mulli r3,r3,PACA_SIZE /* Calculate vaddr of right paca */
add r13,r3,r4 /* for this processor. */
mtspr SPRN_SPRG3,r13
blr
/* /*
* We put a few things here that have to be page-aligned. * 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. * This stuff goes at the beginning of the bss, which is page-aligned.
......
...@@ -2,13 +2,17 @@ ...@@ -2,13 +2,17 @@
* Idle daemon for PowerPC. Idle daemon will handle any action * Idle daemon for PowerPC. Idle daemon will handle any action
* that needs to be taken when the system becomes idle. * that needs to be taken when the system becomes idle.
* *
* Originally Written by Cort Dougan (cort@cs.nmt.edu) * Originally written by Cort Dougan (cort@cs.nmt.edu).
* Subsequent 32-bit hacking by Tom Rini, Armin Kuster,
* Paul Mackerras and others.
* *
* iSeries supported added by Mike Corrigan <mikejc@us.ibm.com> * iSeries supported added by Mike Corrigan <mikejc@us.ibm.com>
* *
* Additional shared processor, SMT, and firmware support * Additional shared processor, SMT, and firmware support
* Copyright (c) 2003 Dave Engebretsen <engebret@us.ibm.com> * Copyright (c) 2003 Dave Engebretsen <engebret@us.ibm.com>
* *
* 32-bit and 64-bit versions merged by Paul Mackerras <paulus@samba.org>
*
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version * as published by the Free Software Foundation; either version
...@@ -29,18 +33,43 @@ ...@@ -29,18 +33,43 @@
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/smp.h> #include <asm/smp.h>
extern void power4_idle(void); #ifdef CONFIG_HOTPLUG_CPU
#define cpu_should_die() (cpu_is_offline(smp_processor_id()) && \
system_state == SYSTEM_RUNNING)
#else
#define cpu_should_die() 0
#endif
void default_idle(void) /*
* The body of the idle task.
*/
void cpu_idle(void)
{ {
unsigned int cpu = smp_processor_id(); if (ppc_md.idle_loop)
set_thread_flag(TIF_POLLING_NRFLAG); ppc_md.idle_loop(); /* doesn't return */
set_thread_flag(TIF_POLLING_NRFLAG);
while (1) { while (1) {
if (!need_resched()) {
while (!need_resched() && !cpu_is_offline(cpu)) {
ppc64_runlatch_off(); ppc64_runlatch_off();
while (!need_resched() && !cpu_should_die()) {
if (ppc_md.power_save) {
clear_thread_flag(TIF_POLLING_NRFLAG);
/*
* smp_mb is so clearing of TIF_POLLING_NRFLAG
* is ordered w.r.t. need_resched() test.
*/
smp_mb();
local_irq_disable();
/* check again after disabling irqs */
if (!need_resched() && !cpu_should_die())
ppc_md.power_save();
local_irq_enable();
set_thread_flag(TIF_POLLING_NRFLAG);
} else {
/* /*
* Go into low thread priority and possibly * Go into low thread priority and possibly
* low power mode. * low power mode.
...@@ -48,44 +77,16 @@ void default_idle(void) ...@@ -48,44 +77,16 @@ void default_idle(void)
HMT_low(); HMT_low();
HMT_very_low(); HMT_very_low();
} }
HMT_medium();
} }
HMT_medium();
ppc64_runlatch_on(); ppc64_runlatch_on();
preempt_enable_no_resched(); if (cpu_should_die())
schedule();
preempt_disable();
if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING)
cpu_die(); cpu_die();
}
}
void native_idle(void)
{
while (1) {
ppc64_runlatch_off();
if (!need_resched())
power4_idle();
if (need_resched()) {
ppc64_runlatch_on();
preempt_enable_no_resched(); preempt_enable_no_resched();
schedule(); schedule();
preempt_disable(); preempt_disable();
} }
if (cpu_is_offline(smp_processor_id()) &&
system_state == SYSTEM_RUNNING)
cpu_die();
}
}
void cpu_idle(void)
{
BUG_ON(NULL == ppc_md.idle_loop);
ppc_md.idle_loop();
} }
int powersave_nap; int powersave_nap;
......
...@@ -87,19 +87,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP) ...@@ -87,19 +87,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
cmpwi 0,r3,0 cmpwi 0,r3,0
beqlr beqlr
/* Clear MSR:EE */
mfmsr r7
rlwinm r0,r7,0,17,15
mtmsr r0
/* Check current_thread_info()->flags */
rlwinm r4,r1,0,0,18
lwz r4,TI_FLAGS(r4)
andi. r0,r4,_TIF_NEED_RESCHED
beq 1f
mtmsr r7 /* out of line this ? */
blr
1:
/* Some pre-nap cleanups needed on some CPUs */ /* Some pre-nap cleanups needed on some CPUs */
andis. r0,r3,HID0_NAP@h andis. r0,r3,HID0_NAP@h
beq 2f beq 2f
...@@ -157,7 +144,8 @@ BEGIN_FTR_SECTION ...@@ -157,7 +144,8 @@ BEGIN_FTR_SECTION
DSSALL DSSALL
sync sync
END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
ori r7,r7,MSR_EE /* Could be ommited (already set) */ mfmsr r7
ori r7,r7,MSR_EE
oris r7,r7,MSR_POW@h oris r7,r7,MSR_POW@h
sync sync
isync isync
...@@ -220,8 +208,6 @@ _GLOBAL(nap_save_msscr0) ...@@ -220,8 +208,6 @@ _GLOBAL(nap_save_msscr0)
_GLOBAL(nap_save_hid1) _GLOBAL(nap_save_hid1)
.space 4*NR_CPUS .space 4*NR_CPUS
_GLOBAL(powersave_nap)
.long 0
_GLOBAL(powersave_lowspeed) _GLOBAL(powersave_lowspeed)
.long 0 .long 0
......
/* /*
* This file contains the power_save function for 6xx & 7xxx CPUs * This file contains the power_save function for 970-family CPUs.
* rewritten in assembler
*
* Warning ! This code assumes that if your machine has a 750fx
* it will have PLL 1 set to low speed mode (used during NAP/DOZE).
* if this is not the case some additional changes will have to
* be done to check a runtime var (a bit like powersave-nap)
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -26,49 +20,23 @@ ...@@ -26,49 +20,23 @@
.text .text
/*
* Here is the power_save_6xx function. This could eventually be
* split into several functions & changing the function pointer
* depending on the various features.
*/
_GLOBAL(power4_idle) _GLOBAL(power4_idle)
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
blr blr
END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP) END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
/* We must dynamically check for the NAP feature as it
* can be cleared by CPU init after the fixups are done
*/
LOAD_REG_ADDRBASE(r3,cur_cpu_spec)
ld r4,ADDROFF(cur_cpu_spec)(r3)
ld r4,CPU_SPEC_FEATURES(r4)
andi. r0,r4,CPU_FTR_CAN_NAP
beqlr
/* Now check if user or arch enabled NAP mode */ /* Now check if user or arch enabled NAP mode */
LOAD_REG_ADDRBASE(r3,powersave_nap) LOAD_REG_ADDRBASE(r3,powersave_nap)
lwz r4,ADDROFF(powersave_nap)(r3) lwz r4,ADDROFF(powersave_nap)(r3)
cmpwi 0,r4,0 cmpwi 0,r4,0
beqlr beqlr
/* Clear MSR:EE */
mfmsr r7
li r4,0
ori r4,r4,MSR_EE
andc r0,r7,r4
mtmsrd r0
/* Check current_thread_info()->flags */
clrrdi r4,r1,THREAD_SHIFT
ld r4,TI_FLAGS(r4)
andi. r0,r4,_TIF_NEED_RESCHED
beq 1f
mtmsrd r7 /* out of line this ? */
blr
1:
/* Go to NAP now */ /* Go to NAP now */
BEGIN_FTR_SECTION BEGIN_FTR_SECTION
DSSALL DSSALL
sync sync
END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
mfmsr r7
ori r7,r7,MSR_EE
oris r7,r7,MSR_POW@h oris r7,r7,MSR_POW@h
sync sync
isync isync
......
...@@ -379,7 +379,7 @@ void irq_ctx_init(void) ...@@ -379,7 +379,7 @@ void irq_ctx_init(void)
struct thread_info *tp; struct thread_info *tp;
int i; int i;
for_each_cpu(i) { for_each_possible_cpu(i) {
memset((void *)softirq_ctx[i], 0, THREAD_SIZE); memset((void *)softirq_ctx[i], 0, THREAD_SIZE);
tp = softirq_ctx[i]; tp = softirq_ctx[i];
tp->cpu = i; tp->cpu = i;
......
...@@ -37,7 +37,7 @@ static int legacy_serial_console = -1; ...@@ -37,7 +37,7 @@ static int legacy_serial_console = -1;
static int __init add_legacy_port(struct device_node *np, int want_index, static int __init add_legacy_port(struct device_node *np, int want_index,
int iotype, phys_addr_t base, int iotype, phys_addr_t base,
phys_addr_t taddr, unsigned long irq, phys_addr_t taddr, unsigned long irq,
unsigned int flags) upf_t flags)
{ {
u32 *clk, *spd, clock = BASE_BAUD * 16; u32 *clk, *spd, clock = BASE_BAUD * 16;
int index; int index;
...@@ -113,7 +113,7 @@ static int __init add_legacy_soc_port(struct device_node *np, ...@@ -113,7 +113,7 @@ static int __init add_legacy_soc_port(struct device_node *np,
{ {
phys_addr_t addr; phys_addr_t addr;
u32 *addrp; u32 *addrp;
unsigned int flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
/* We only support ports that have a clock frequency properly /* We only support ports that have a clock frequency properly
* encoded in the device-tree. * encoded in the device-tree.
...@@ -236,6 +236,23 @@ static int __init add_legacy_pci_port(struct device_node *np, ...@@ -236,6 +236,23 @@ static int __init add_legacy_pci_port(struct device_node *np,
} }
#endif #endif
static void __init setup_legacy_serial_console(int console)
{
struct legacy_serial_info *info =
&legacy_serial_infos[console];
void __iomem *addr;
if (info->taddr == 0)
return;
addr = ioremap(info->taddr, 0x1000);
if (addr == NULL)
return;
if (info->speed == 0)
info->speed = udbg_probe_uart_speed(addr, info->clock);
DBG("default console speed = %d\n", info->speed);
udbg_init_uart(addr, info->speed, info->clock);
}
/* /*
* This is called very early, as part of setup_system() or eventually * This is called very early, as part of setup_system() or eventually
* setup_arch(), basically before anything else in this file. This function * setup_arch(), basically before anything else in this file. This function
...@@ -318,25 +335,8 @@ void __init find_legacy_serial_ports(void) ...@@ -318,25 +335,8 @@ void __init find_legacy_serial_ports(void)
#endif #endif
DBG("legacy_serial_console = %d\n", legacy_serial_console); DBG("legacy_serial_console = %d\n", legacy_serial_console);
if (legacy_serial_console >= 0)
/* udbg is 64 bits only for now, that will change soon though ... */ setup_legacy_serial_console(legacy_serial_console);
while (legacy_serial_console >= 0) {
struct legacy_serial_info *info =
&legacy_serial_infos[legacy_serial_console];
void __iomem *addr;
if (info->taddr == 0)
break;
addr = ioremap(info->taddr, 0x1000);
if (addr == NULL)
break;
if (info->speed == 0)
info->speed = udbg_probe_uart_speed(addr, info->clock);
DBG("default console speed = %d\n", info->speed);
udbg_init_uart(addr, info->speed, info->clock);
break;
}
DBG(" <- find_legacy_serial_port()\n"); DBG(" <- find_legacy_serial_port()\n");
} }
......
...@@ -56,7 +56,7 @@ static unsigned long get_purr(void) ...@@ -56,7 +56,7 @@ static unsigned long get_purr(void)
unsigned long sum_purr = 0; unsigned long sum_purr = 0;
int cpu; int cpu;
for_each_cpu(cpu) { for_each_possible_cpu(cpu) {
sum_purr += lppaca[cpu].emulated_time_base; sum_purr += lppaca[cpu].emulated_time_base;
#ifdef PURR_DEBUG #ifdef PURR_DEBUG
...@@ -222,7 +222,7 @@ static unsigned long get_purr(void) ...@@ -222,7 +222,7 @@ static unsigned long get_purr(void)
int cpu; int cpu;
struct cpu_usage *cu; struct cpu_usage *cu;
for_each_cpu(cpu) { for_each_possible_cpu(cpu) {
cu = &per_cpu(cpu_usage_array, cpu); cu = &per_cpu(cpu_usage_array, cpu);
sum_purr += cu->current_tb; sum_purr += cu->current_tb;
} }
......
...@@ -160,7 +160,7 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file, ...@@ -160,7 +160,7 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file,
case IOC_NVRAM_GET_OFFSET: { case IOC_NVRAM_GET_OFFSET: {
int part, offset; int part, offset;
if (_machine != PLATFORM_POWERMAC) if (!machine_is(powermac))
return -EINVAL; return -EINVAL;
if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0) if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0)
return -EFAULT; return -EFAULT;
...@@ -174,8 +174,9 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file, ...@@ -174,8 +174,9 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file,
return 0; return 0;
} }
#endif /* CONFIG_PPC_PMAC */ #endif /* CONFIG_PPC_PMAC */
} default:
return -EINVAL; return -EINVAL;
}
} }
struct file_operations nvram_fops = { struct file_operations nvram_fops = {
...@@ -443,7 +444,7 @@ static int nvram_setup_partition(void) ...@@ -443,7 +444,7 @@ static int nvram_setup_partition(void)
* in our nvram, as Apple defined partitions use pretty much * in our nvram, as Apple defined partitions use pretty much
* all of the space * all of the space
*/ */
if (_machine == PLATFORM_POWERMAC) if (machine_is(powermac))
return -ENOSPC; return -ENOSPC;
/* see if we have an OS partition that meets our needs. /* see if we have an OS partition that meets our needs.
......
...@@ -56,14 +56,11 @@ struct lppaca lppaca[] = { ...@@ -56,14 +56,11 @@ struct lppaca lppaca[] = {
* processors. The processor VPD array needs one entry per physical * processors. The processor VPD array needs one entry per physical
* processor (not thread). * processor (not thread).
*/ */
#define PACA_INIT_COMMON(number, start, asrr, asrv) \ #define PACA_INIT_COMMON(number) \
.lppaca_ptr = &lppaca[number], \ .lppaca_ptr = &lppaca[number], \
.lock_token = 0x8000, \ .lock_token = 0x8000, \
.paca_index = (number), /* Paca Index */ \ .paca_index = (number), /* Paca Index */ \
.kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL, \ .kernel_toc = (unsigned long)(&__toc_start) + 0x8000UL, \
.stab_real = (asrr), /* Real pointer to segment table */ \
.stab_addr = (asrv), /* Virt pointer to segment table */ \
.cpu_start = (start), /* Processor start */ \
.hw_cpu_id = 0xffff, .hw_cpu_id = 0xffff,
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
...@@ -72,30 +69,20 @@ struct lppaca lppaca[] = { ...@@ -72,30 +69,20 @@ struct lppaca lppaca[] = {
#define PACA_INIT(number) \ #define PACA_INIT(number) \
{ \ { \
PACA_INIT_COMMON(number, 0, 0, 0) \ PACA_INIT_COMMON(number) \
PACA_INIT_ISERIES(number) \
}
#define BOOTCPU_PACA_INIT(number) \
{ \
PACA_INIT_COMMON(number, 1, 0, (u64)&initial_stab) \
PACA_INIT_ISERIES(number) \ PACA_INIT_ISERIES(number) \
} }
#else #else
#define PACA_INIT(number) \ #define PACA_INIT(number) \
{ \ { \
PACA_INIT_COMMON(number, 0, 0, 0) \ PACA_INIT_COMMON(number) \
} }
#define BOOTCPU_PACA_INIT(number) \
{ \
PACA_INIT_COMMON(number, 1, STAB0_PHYS_ADDR, (u64)&initial_stab) \
}
#endif #endif
struct paca_struct paca[] = { struct paca_struct paca[] = {
BOOTCPU_PACA_INIT(0), PACA_INIT(0),
#if NR_CPUS > 1 #if NR_CPUS > 1
PACA_INIT( 1), PACA_INIT( 2), PACA_INIT( 3), PACA_INIT( 1), PACA_INIT( 2), PACA_INIT( 3),
#if NR_CPUS > 4 #if NR_CPUS > 4
......
...@@ -787,7 +787,7 @@ pci_busdev_to_OF_node(struct pci_bus *bus, int devfn) ...@@ -787,7 +787,7 @@ pci_busdev_to_OF_node(struct pci_bus *bus, int devfn)
* fix has to be done by making the remapping per-host and always * fix has to be done by making the remapping per-host and always
* filling the pci_to_OF map. --BenH * filling the pci_to_OF map. --BenH
*/ */
if (_machine == _MACH_Pmac && busnr >= 0xf0) if (machine_is(powermac) && busnr >= 0xf0)
busnr -= 0xf0; busnr -= 0xf0;
else else
#endif #endif
...@@ -1728,7 +1728,7 @@ long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn) ...@@ -1728,7 +1728,7 @@ long sys_pciconfig_iobase(long which, unsigned long bus, unsigned long devfn)
* (bus 0 is HT root), we return the AGP one instead. * (bus 0 is HT root), we return the AGP one instead.
*/ */
#ifdef CONFIG_PPC_PMAC #ifdef CONFIG_PPC_PMAC
if (_machine == _MACH_Pmac && machine_is_compatible("MacRISC4")) if (machine_is(powermac) && machine_is_compatible("MacRISC4"))
if (bus == 0) if (bus == 0)
bus = 0xf0; bus = 0xf0;
#endif /* CONFIG_PPC_PMAC */ #endif /* CONFIG_PPC_PMAC */
......
...@@ -78,6 +78,7 @@ int global_phb_number; /* Global phb counter */ ...@@ -78,6 +78,7 @@ int global_phb_number; /* Global phb counter */
/* Cached ISA bridge dev. */ /* Cached ISA bridge dev. */
struct pci_dev *ppc64_isabridge_dev = NULL; struct pci_dev *ppc64_isabridge_dev = NULL;
EXPORT_SYMBOL_GPL(ppc64_isabridge_dev);
static void fixup_broken_pcnet32(struct pci_dev* dev) static void fixup_broken_pcnet32(struct pci_dev* dev)
{ {
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <asm/machdep.h>
#include <asm/vdso_datapage.h> #include <asm/vdso_datapage.h>
#include <asm/rtas.h> #include <asm/rtas.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -51,7 +52,7 @@ static int __init proc_ppc64_create(void) ...@@ -51,7 +52,7 @@ static int __init proc_ppc64_create(void)
if (!root) if (!root)
return 1; return 1;
if (!(platform_is_pseries() || _machine == PLATFORM_CELL)) if (!machine_is(pseries) && !machine_is(cell))
return 0; return 0;
if (!proc_mkdir("rtas", root)) if (!proc_mkdir("rtas", root))
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/syscalls.h>
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#include <asm/firmware.h> #include <asm/firmware.h>
#endif #endif
...@@ -362,7 +363,11 @@ static void show_instructions(struct pt_regs *regs) ...@@ -362,7 +363,11 @@ static void show_instructions(struct pt_regs *regs)
if (!(i % 8)) if (!(i % 8))
printk("\n"); printk("\n");
if (BAD_PC(pc) || __get_user(instr, (unsigned int *)pc)) { /* We use __get_user here *only* to avoid an OOPS on a
* bad address because the pc *should* only be a
* kernel address.
*/
if (BAD_PC(pc) || __get_user(instr, (unsigned int __user *)pc)) {
printk("XXXXXXXX "); printk("XXXXXXXX ");
} else { } else {
if (regs->nip == pc) if (regs->nip == pc)
...@@ -765,7 +770,7 @@ int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2, ...@@ -765,7 +770,7 @@ int sys_execve(unsigned long a0, unsigned long a1, unsigned long a2,
return error; return error;
} }
static int validate_sp(unsigned long sp, struct task_struct *p, int validate_sp(unsigned long sp, struct task_struct *p,
unsigned long nbytes) unsigned long nbytes)
{ {
unsigned long stack_page = (unsigned long)task_stack_page(p); unsigned long stack_page = (unsigned long)task_stack_page(p);
...@@ -803,6 +808,8 @@ static int validate_sp(unsigned long sp, struct task_struct *p, ...@@ -803,6 +808,8 @@ static int validate_sp(unsigned long sp, struct task_struct *p,
#define FRAME_MARKER 2 #define FRAME_MARKER 2
#endif #endif
EXPORT_SYMBOL(validate_sp);
unsigned long get_wchan(struct task_struct *p) unsigned long get_wchan(struct task_struct *p)
{ {
unsigned long ip, sp; unsigned long ip, sp;
......
...@@ -383,14 +383,14 @@ static int __devinit finish_node_interrupts(struct device_node *np, ...@@ -383,14 +383,14 @@ static int __devinit finish_node_interrupts(struct device_node *np,
/* Apple uses bits in there in a different way, let's /* Apple uses bits in there in a different way, let's
* only keep the real sense bit on macs * only keep the real sense bit on macs
*/ */
if (_machine == PLATFORM_POWERMAC) if (machine_is(powermac))
sense &= 0x1; sense &= 0x1;
np->intrs[intrcount].sense = map_mpic_senses[sense]; np->intrs[intrcount].sense = map_mpic_senses[sense];
} }
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* We offset irq numbers for the u3 MPIC by 128 in PowerMac */ /* We offset irq numbers for the u3 MPIC by 128 in PowerMac */
if (_machine == PLATFORM_POWERMAC && ic && ic->parent) { if (machine_is(powermac) && ic && ic->parent) {
char *name = get_property(ic->parent, "name", NULL); char *name = get_property(ic->parent, "name", NULL);
if (name && !strcmp(name, "u3")) if (name && !strcmp(name, "u3"))
np->intrs[intrcount].line += 128; np->intrs[intrcount].line += 128;
...@@ -570,6 +570,18 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node, ...@@ -570,6 +570,18 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
return rc; return rc;
} }
unsigned long __init of_get_flat_dt_root(void)
{
unsigned long p = ((unsigned long)initial_boot_params) +
initial_boot_params->off_dt_struct;
while(*((u32 *)p) == OF_DT_NOP)
p += 4;
BUG_ON (*((u32 *)p) != OF_DT_BEGIN_NODE);
p += 4;
return _ALIGN(p + strlen((char *)p) + 1, 4);
}
/** /**
* This function can be used within scan_flattened_dt callback to get * This function can be used within scan_flattened_dt callback to get
* access to properties * access to properties
...@@ -612,6 +624,25 @@ void* __init of_get_flat_dt_prop(unsigned long node, const char *name, ...@@ -612,6 +624,25 @@ void* __init of_get_flat_dt_prop(unsigned long node, const char *name,
} while(1); } while(1);
} }
int __init of_flat_dt_is_compatible(unsigned long node, const char *compat)
{
const char* cp;
unsigned long cplen, l;
cp = of_get_flat_dt_prop(node, "compatible", &cplen);
if (cp == NULL)
return 0;
while (cplen > 0) {
if (strncasecmp(cp, compat, strlen(compat)) == 0)
return 1;
l = strlen(cp) + 1;
cp += l;
cplen -= l;
}
return 0;
}
static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size, static void *__init unflatten_dt_alloc(unsigned long *mem, unsigned long size,
unsigned long align) unsigned long align)
{ {
...@@ -686,7 +717,7 @@ static unsigned long __init unflatten_dt_node(unsigned long mem, ...@@ -686,7 +717,7 @@ static unsigned long __init unflatten_dt_node(unsigned long mem,
#ifdef DEBUG #ifdef DEBUG
if ((strlen(p) + l + 1) != allocl) { if ((strlen(p) + l + 1) != allocl) {
DBG("%s: p: %d, l: %d, a: %d\n", DBG("%s: p: %d, l: %d, a: %d\n",
pathp, strlen(p), l, allocl); pathp, (int)strlen(p), l, allocl);
} }
#endif #endif
p += strlen(p); p += strlen(p);
...@@ -854,35 +885,73 @@ void __init unflatten_device_tree(void) ...@@ -854,35 +885,73 @@ void __init unflatten_device_tree(void)
DBG(" <- unflatten_device_tree()\n"); DBG(" <- unflatten_device_tree()\n");
} }
static int __init early_init_dt_scan_cpus(unsigned long node, static int __init early_init_dt_scan_cpus(unsigned long node,
const char *uname, int depth, void *data) const char *uname, int depth,
void *data)
{ {
static int logical_cpuid = 0;
char *type = of_get_flat_dt_prop(node, "device_type", NULL);
#ifdef CONFIG_ALTIVEC
u32 *prop; u32 *prop;
unsigned long size; #endif
char *type = of_get_flat_dt_prop(node, "device_type", &size); u32 *intserv;
int i, nthreads;
unsigned long len;
int found = 0;
/* We are scanning "cpu" nodes only */ /* We are scanning "cpu" nodes only */
if (type == NULL || strcmp(type, "cpu") != 0) if (type == NULL || strcmp(type, "cpu") != 0)
return 0; return 0;
boot_cpuid = 0; /* Get physical cpuid */
boot_cpuid_phys = 0; intserv = of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", &len);
if (initial_boot_params && initial_boot_params->version >= 2) { if (intserv) {
/* version 2 of the kexec param format adds the phys cpuid nthreads = len / sizeof(int);
* of booted proc. } else {
intserv = of_get_flat_dt_prop(node, "reg", NULL);
nthreads = 1;
}
/*
* Now see if any of these threads match our boot cpu.
* NOTE: This must match the parsing done in smp_setup_cpu_maps.
*/
for (i = 0; i < nthreads; i++) {
/*
* version 2 of the kexec param format adds the phys cpuid of
* booted proc.
*/ */
boot_cpuid_phys = initial_boot_params->boot_cpuid_phys; if (initial_boot_params && initial_boot_params->version >= 2) {
if (intserv[i] ==
initial_boot_params->boot_cpuid_phys) {
found = 1;
break;
}
} else { } else {
/* Check if it's the boot-cpu, set it's hw index now */ /*
* Check if it's the boot-cpu, set it's hw index now,
* unfortunately this format did not support booting
* off secondary threads.
*/
if (of_get_flat_dt_prop(node, if (of_get_flat_dt_prop(node,
"linux,boot-cpu", NULL) != NULL) { "linux,boot-cpu", NULL) != NULL) {
prop = of_get_flat_dt_prop(node, "reg", NULL); found = 1;
if (prop != NULL) break;
boot_cpuid_phys = *prop;
} }
} }
set_hard_smp_processor_id(0, boot_cpuid_phys);
#ifdef CONFIG_SMP
/* logical cpu id is always 0 on UP kernels */
logical_cpuid++;
#endif
}
if (found) {
DBG("boot cpu: logical %d physical %d\n", logical_cpuid,
intserv[i]);
boot_cpuid = logical_cpuid;
set_hard_smp_processor_id(boot_cpuid, intserv[i]);
}
#ifdef CONFIG_ALTIVEC #ifdef CONFIG_ALTIVEC
/* Check if we have a VMX and eventually update CPU features */ /* Check if we have a VMX and eventually update CPU features */
...@@ -901,16 +970,10 @@ static int __init early_init_dt_scan_cpus(unsigned long node, ...@@ -901,16 +970,10 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
#endif /* CONFIG_ALTIVEC */ #endif /* CONFIG_ALTIVEC */
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
/* if (nthreads > 1)
* Check for an SMT capable CPU and set the CPU feature. We do
* this by looking at the size of the ibm,ppc-interrupt-server#s
* property
*/
prop = (u32 *)of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s",
&size);
cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
if (prop && ((size / sizeof(u32)) > 1))
cur_cpu_spec->cpu_features |= CPU_FTR_SMT; cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
else
cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
#endif #endif
return 0; return 0;
...@@ -919,7 +982,6 @@ static int __init early_init_dt_scan_cpus(unsigned long node, ...@@ -919,7 +982,6 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
static int __init early_init_dt_scan_chosen(unsigned long node, static int __init early_init_dt_scan_chosen(unsigned long node,
const char *uname, int depth, void *data) const char *uname, int depth, void *data)
{ {
u32 *prop;
unsigned long *lprop; unsigned long *lprop;
unsigned long l; unsigned long l;
char *p; char *p;
...@@ -930,14 +992,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node, ...@@ -930,14 +992,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
(strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0)) (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
return 0; return 0;
/* get platform type */
prop = (u32 *)of_get_flat_dt_prop(node, "linux,platform", NULL);
if (prop == NULL)
return 0;
#ifdef CONFIG_PPC_MULTIPLATFORM
_machine = *prop;
#endif
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* check if iommu is forced on or off */ /* check if iommu is forced on or off */
if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL) if (of_get_flat_dt_prop(node, "linux,iommu-off", NULL) != NULL)
...@@ -964,15 +1018,15 @@ static int __init early_init_dt_scan_chosen(unsigned long node, ...@@ -964,15 +1018,15 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
* set of RTAS infos now if available * set of RTAS infos now if available
*/ */
{ {
u64 *basep, *entryp; u64 *basep, *entryp, *sizep;
basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL); basep = of_get_flat_dt_prop(node, "linux,rtas-base", NULL);
entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL); entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL);
prop = of_get_flat_dt_prop(node, "linux,rtas-size", NULL); sizep = of_get_flat_dt_prop(node, "linux,rtas-size", NULL);
if (basep && entryp && prop) { if (basep && entryp && sizep) {
rtas.base = *basep; rtas.base = *basep;
rtas.entry = *entryp; rtas.entry = *entryp;
rtas.size = *prop; rtas.size = *sizep;
} }
} }
#endif /* CONFIG_PPC_RTAS */ #endif /* CONFIG_PPC_RTAS */
...@@ -1001,25 +1055,13 @@ static int __init early_init_dt_scan_chosen(unsigned long node, ...@@ -1001,25 +1055,13 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
if (strstr(cmd_line, "mem=")) { if (strstr(cmd_line, "mem=")) {
char *p, *q; char *p, *q;
unsigned long maxmem = 0;
for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) { for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) {
q = p + 4; q = p + 4;
if (p > cmd_line && p[-1] != ' ') if (p > cmd_line && p[-1] != ' ')
continue; continue;
maxmem = simple_strtoul(q, &q, 0); memory_limit = memparse(q, &q);
if (*q == 'k' || *q == 'K') {
maxmem <<= 10;
++q;
} else if (*q == 'm' || *q == 'M') {
maxmem <<= 20;
++q;
} else if (*q == 'g' || *q == 'G') {
maxmem <<= 30;
++q;
}
} }
memory_limit = maxmem;
} }
/* break now */ /* break now */
...@@ -1755,7 +1797,7 @@ static int of_finish_dynamic_node(struct device_node *node) ...@@ -1755,7 +1797,7 @@ static int of_finish_dynamic_node(struct device_node *node)
/* We don't support that function on PowerMac, at least /* We don't support that function on PowerMac, at least
* not yet * not yet
*/ */
if (_machine == PLATFORM_POWERMAC) if (machine_is(powermac))
return -ENODEV; return -ENODEV;
/* fix up new node's linux_phandle field */ /* fix up new node's linux_phandle field */
......
...@@ -180,6 +180,16 @@ static unsigned long __initdata prom_tce_alloc_start; ...@@ -180,6 +180,16 @@ static unsigned long __initdata prom_tce_alloc_start;
static unsigned long __initdata prom_tce_alloc_end; static unsigned long __initdata prom_tce_alloc_end;
#endif #endif
/* Platforms codes are now obsolete in the kernel. Now only used within this
* file and ultimately gone too. Feel free to change them if you need, they
* are not shared with anything outside of this file anymore
*/
#define PLATFORM_PSERIES 0x0100
#define PLATFORM_PSERIES_LPAR 0x0101
#define PLATFORM_LPAR 0x0001
#define PLATFORM_POWERMAC 0x0400
#define PLATFORM_GENERIC 0x0500
static int __initdata of_platform; static int __initdata of_platform;
static char __initdata prom_cmd_line[COMMAND_LINE_SIZE]; static char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
...@@ -397,6 +407,11 @@ static void __init __attribute__((noreturn)) prom_panic(const char *reason) ...@@ -397,6 +407,11 @@ static void __init __attribute__((noreturn)) prom_panic(const char *reason)
reason = PTRRELOC(reason); reason = PTRRELOC(reason);
#endif #endif
prom_print(reason); prom_print(reason);
/* Do not call exit because it clears the screen on pmac
* it also causes some sort of double-fault on early pmacs */
if (RELOC(of_platform) == PLATFORM_POWERMAC)
asm("trap\n");
/* ToDo: should put up an SRC here on p/iSeries */ /* ToDo: should put up an SRC here on p/iSeries */
call_prom("exit", 0, 0); call_prom("exit", 0, 0);
...@@ -1487,7 +1502,10 @@ static int __init prom_find_machine_type(void) ...@@ -1487,7 +1502,10 @@ static int __init prom_find_machine_type(void)
int len, i = 0; int len, i = 0;
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
phandle rtas; phandle rtas;
int x;
#endif #endif
/* Look for a PowerMac */
len = prom_getprop(_prom->root, "compatible", len = prom_getprop(_prom->root, "compatible",
compat, sizeof(compat)-1); compat, sizeof(compat)-1);
if (len > 0) { if (len > 0) {
...@@ -1500,28 +1518,36 @@ static int __init prom_find_machine_type(void) ...@@ -1500,28 +1518,36 @@ static int __init prom_find_machine_type(void)
if (strstr(p, RELOC("Power Macintosh")) || if (strstr(p, RELOC("Power Macintosh")) ||
strstr(p, RELOC("MacRISC"))) strstr(p, RELOC("MacRISC")))
return PLATFORM_POWERMAC; return PLATFORM_POWERMAC;
#ifdef CONFIG_PPC64
if (strstr(p, RELOC("Momentum,Maple")))
return PLATFORM_MAPLE;
if (strstr(p, RELOC("IBM,CPB")))
return PLATFORM_CELL;
#endif
i += sl + 1; i += sl + 1;
} }
} }
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* If not a mac, try to figure out if it's an IBM pSeries or any other
* PAPR compliant platform. We assume it is if :
* - /device_type is "chrp" (please, do NOT use that for future
* non-IBM designs !
* - it has /rtas
*/
len = prom_getprop(_prom->root, "model",
compat, sizeof(compat)-1);
if (len <= 0)
return PLATFORM_GENERIC;
compat[len] = 0;
if (strcmp(compat, "chrp"))
return PLATFORM_GENERIC;
/* Default to pSeries. We need to know if we are running LPAR */ /* Default to pSeries. We need to know if we are running LPAR */
rtas = call_prom("finddevice", 1, 1, ADDR("/rtas")); rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
if (PHANDLE_VALID(rtas)) { if (!PHANDLE_VALID(rtas))
int x = prom_getproplen(rtas, "ibm,hypertas-functions"); return PLATFORM_GENERIC;
x = prom_getproplen(rtas, "ibm,hypertas-functions");
if (x != PROM_ERROR) { if (x != PROM_ERROR) {
prom_printf("Hypertas detected, assuming LPAR !\n"); prom_printf("Hypertas detected, assuming LPAR !\n");
return PLATFORM_PSERIES_LPAR; return PLATFORM_PSERIES_LPAR;
} }
}
return PLATFORM_PSERIES; return PLATFORM_PSERIES;
#else #else
return PLATFORM_CHRP; return PLATFORM_GENERIC;
#endif #endif
} }
...@@ -2029,7 +2055,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, ...@@ -2029,7 +2055,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
{ {
struct prom_t *_prom; struct prom_t *_prom;
unsigned long hdr; unsigned long hdr;
u32 getprop_rval;
unsigned long offset = reloc_offset(); unsigned long offset = reloc_offset();
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
...@@ -2060,6 +2085,12 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, ...@@ -2060,6 +2085,12 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
*/ */
prom_init_stdout(); prom_init_stdout();
/*
* Get default machine type. At this point, we do not differentiate
* between pSeries SMP and pSeries LPAR
*/
RELOC(of_platform) = prom_find_machine_type();
/* Bail if this is a kdump kernel. */ /* Bail if this is a kdump kernel. */
if (PHYSICAL_START > 0) if (PHYSICAL_START > 0)
prom_panic("Error: You can't boot a kdump kernel from OF!\n"); prom_panic("Error: You can't boot a kdump kernel from OF!\n");
...@@ -2069,15 +2100,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4, ...@@ -2069,15 +2100,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
*/ */
prom_check_initrd(r3, r4); prom_check_initrd(r3, r4);
/*
* Get default machine type. At this point, we do not differentiate
* between pSeries SMP and pSeries LPAR
*/
RELOC(of_platform) = prom_find_machine_type();
getprop_rval = RELOC(of_platform);
prom_setprop(_prom->chosen, "/chosen", "linux,platform",
&getprop_rval, sizeof(getprop_rval));
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
/* /*
* On pSeries, inform the firmware about our capabilities * On pSeries, inform the firmware about our capabilities
......
...@@ -257,7 +257,7 @@ static int __init proc_rtas_init(void) ...@@ -257,7 +257,7 @@ static int __init proc_rtas_init(void)
{ {
struct proc_dir_entry *entry; struct proc_dir_entry *entry;
if (_machine != PLATFORM_PSERIES && _machine != PLATFORM_PSERIES_LPAR) if (!machine_is(pseries))
return 1; return 1;
rtas_node = of_find_node_by_name(NULL, "rtas"); rtas_node = of_find_node_by_name(NULL, "rtas");
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <asm/hvcall.h> #include <asm/hvcall.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/firmware.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/param.h> #include <asm/param.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -32,6 +33,7 @@ ...@@ -32,6 +33,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/lmb.h> #include <asm/lmb.h>
#include <asm/udbg.h> #include <asm/udbg.h>
#include <asm/syscalls.h>
struct rtas_t rtas = { struct rtas_t rtas = {
.lock = SPIN_LOCK_UNLOCKED .lock = SPIN_LOCK_UNLOCKED
...@@ -591,7 +593,7 @@ static void rtas_percpu_suspend_me(void *info) ...@@ -591,7 +593,7 @@ static void rtas_percpu_suspend_me(void *info)
data->waiting = 0; data->waiting = 0;
data->args->args[data->args->nargs] = data->args->args[data->args->nargs] =
rtas_call(ibm_suspend_me_token, 0, 1, NULL); rtas_call(ibm_suspend_me_token, 0, 1, NULL);
for_each_cpu(i) for_each_possible_cpu(i)
plpar_hcall_norets(H_PROD,i); plpar_hcall_norets(H_PROD,i);
} else { } else {
data->waiting = -EBUSY; data->waiting = -EBUSY;
...@@ -624,7 +626,7 @@ static int rtas_ibm_suspend_me(struct rtas_args *args) ...@@ -624,7 +626,7 @@ static int rtas_ibm_suspend_me(struct rtas_args *args)
/* Prod each CPU. This won't hurt, and will wake /* Prod each CPU. This won't hurt, and will wake
* anyone we successfully put to sleep with H_Join * anyone we successfully put to sleep with H_Join
*/ */
for_each_cpu(i) for_each_possible_cpu(i)
plpar_hcall_norets(H_PROD, i); plpar_hcall_norets(H_PROD, i);
return data.waiting; return data.waiting;
...@@ -767,7 +769,7 @@ void __init rtas_initialize(void) ...@@ -767,7 +769,7 @@ void __init rtas_initialize(void)
* the stop-self token if any * the stop-self token if any
*/ */
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
if (_machine == PLATFORM_PSERIES_LPAR) { if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR)) {
rtas_region = min(lmb.rmo_size, RTAS_INSTANTIATE_MAX); rtas_region = min(lmb.rmo_size, RTAS_INSTANTIATE_MAX);
ibm_suspend_me_token = rtas_token("ibm,suspend-me"); ibm_suspend_me_token = rtas_token("ibm,suspend-me");
} }
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
* as published by the Free Software Foundation; either version * as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version. * 2 of the License, or (at your option) any later version.
*/ */
#undef DEBUG
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/string.h> #include <linux/string.h>
...@@ -41,6 +44,7 @@ ...@@ -41,6 +44,7 @@
#include <asm/time.h> #include <asm/time.h>
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/firmware.h>
#include <asm/btext.h> #include <asm/btext.h>
#include <asm/nvram.h> #include <asm/nvram.h>
#include <asm/setup.h> #include <asm/setup.h>
...@@ -56,8 +60,6 @@ ...@@ -56,8 +60,6 @@
#include "setup.h" #include "setup.h"
#undef DEBUG
#ifdef DEBUG #ifdef DEBUG
#include <asm/udbg.h> #include <asm/udbg.h>
#define DBG(fmt...) udbg_printf(fmt) #define DBG(fmt...) udbg_printf(fmt)
...@@ -65,10 +67,12 @@ ...@@ -65,10 +67,12 @@
#define DBG(fmt...) #define DBG(fmt...)
#endif #endif
#ifdef CONFIG_PPC_MULTIPLATFORM /* The main machine-dep calls structure
int _machine = 0; */
EXPORT_SYMBOL(_machine); struct machdep_calls ppc_md;
#endif EXPORT_SYMBOL(ppc_md);
struct machdep_calls *machine_id;
EXPORT_SYMBOL(machine_id);
unsigned long klimit = (unsigned long) _end; unsigned long klimit = (unsigned long) _end;
...@@ -168,7 +172,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -168,7 +172,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
bogosum/(500000/HZ), bogosum/(5000/HZ) % 100); bogosum/(500000/HZ), bogosum/(5000/HZ) % 100);
#endif /* CONFIG_SMP && CONFIG_PPC32 */ #endif /* CONFIG_SMP && CONFIG_PPC32 */
seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq); seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq);
if (ppc_md.name)
seq_printf(m, "platform\t: %s\n", ppc_md.name);
if (ppc_md.show_cpuinfo != NULL) if (ppc_md.show_cpuinfo != NULL)
ppc_md.show_cpuinfo(m); ppc_md.show_cpuinfo(m);
...@@ -352,12 +357,13 @@ void __init check_for_initrd(void) ...@@ -352,12 +357,13 @@ void __init check_for_initrd(void)
* must be called before using this. * must be called before using this.
* *
* While we're here, we may as well set the "physical" cpu ids in the paca. * While we're here, we may as well set the "physical" cpu ids in the paca.
*
* NOTE: This must match the parsing done in early_init_dt_scan_cpus.
*/ */
void __init smp_setup_cpu_maps(void) void __init smp_setup_cpu_maps(void)
{ {
struct device_node *dn = NULL; struct device_node *dn = NULL;
int cpu = 0; int cpu = 0;
int swap_cpuid = 0;
while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) { while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
int *intserv; int *intserv;
...@@ -376,30 +382,17 @@ void __init smp_setup_cpu_maps(void) ...@@ -376,30 +382,17 @@ void __init smp_setup_cpu_maps(void)
for (j = 0; j < nthreads && cpu < NR_CPUS; j++) { for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
cpu_set(cpu, cpu_present_map); cpu_set(cpu, cpu_present_map);
set_hard_smp_processor_id(cpu, intserv[j]); set_hard_smp_processor_id(cpu, intserv[j]);
if (intserv[j] == boot_cpuid_phys)
swap_cpuid = cpu;
cpu_set(cpu, cpu_possible_map); cpu_set(cpu, cpu_possible_map);
cpu++; 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 #ifdef CONFIG_PPC64
/* /*
* On pSeries LPAR, we need to know how many cpus * On pSeries LPAR, we need to know how many cpus
* could possibly be added to this partition. * could possibly be added to this partition.
*/ */
if (_machine == PLATFORM_PSERIES_LPAR && if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) &&
(dn = of_find_node_by_path("/rtas"))) { (dn = of_find_node_by_path("/rtas"))) {
int num_addr_cell, num_size_cell, maxcpus; int num_addr_cell, num_size_cell, maxcpus;
unsigned int *ireg; unsigned int *ireg;
...@@ -438,7 +431,7 @@ void __init smp_setup_cpu_maps(void) ...@@ -438,7 +431,7 @@ void __init smp_setup_cpu_maps(void)
/* /*
* Do the sibling map; assume only two threads per processor. * Do the sibling map; assume only two threads per processor.
*/ */
for_each_cpu(cpu) { for_each_possible_cpu(cpu) {
cpu_set(cpu, cpu_sibling_map[cpu]); cpu_set(cpu, cpu_sibling_map[cpu]);
if (cpu_has_feature(CPU_FTR_SMT)) if (cpu_has_feature(CPU_FTR_SMT))
cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]); cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
...@@ -468,3 +461,34 @@ static int __init early_xmon(char *p) ...@@ -468,3 +461,34 @@ static int __init early_xmon(char *p)
} }
early_param("xmon", early_xmon); early_param("xmon", early_xmon);
#endif #endif
void probe_machine(void)
{
extern struct machdep_calls __machine_desc_start;
extern struct machdep_calls __machine_desc_end;
/*
* Iterate all ppc_md structures until we find the proper
* one for the current machine type
*/
DBG("Probing machine type ...\n");
for (machine_id = &__machine_desc_start;
machine_id < &__machine_desc_end;
machine_id++) {
DBG(" %s ...", machine_id->name);
memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls));
if (ppc_md.probe()) {
DBG(" match !\n");
break;
}
DBG("\n");
}
/* What can we do if we didn't find ? */
if (machine_id >= &__machine_desc_end) {
DBG("No suitable machine found !\n");
for (;;);
}
printk(KERN_INFO "Using %s machine description\n", ppc_md.name);
}
...@@ -53,9 +53,6 @@ ...@@ -53,9 +53,6 @@
extern void platform_init(void); extern void platform_init(void);
extern void bootx_init(unsigned long r4, unsigned long phys); extern void bootx_init(unsigned long r4, unsigned long phys);
extern void ppc6xx_idle(void);
extern void power4_idle(void);
boot_infos_t *boot_infos; boot_infos_t *boot_infos;
struct ide_machdep_calls ppc_ide_md; struct ide_machdep_calls ppc_ide_md;
...@@ -70,10 +67,6 @@ unsigned int DMA_MODE_WRITE; ...@@ -70,10 +67,6 @@ unsigned int DMA_MODE_WRITE;
int have_of = 1; int have_of = 1;
#ifdef CONFIG_PPC_MULTIPLATFORM #ifdef CONFIG_PPC_MULTIPLATFORM
extern void prep_init(void);
extern void pmac_init(void);
extern void chrp_init(void);
dev_t boot_dev; dev_t boot_dev;
#endif /* CONFIG_PPC_MULTIPLATFORM */ #endif /* CONFIG_PPC_MULTIPLATFORM */
...@@ -85,9 +78,6 @@ unsigned long SYSRQ_KEY = 0x54; ...@@ -85,9 +78,6 @@ unsigned long SYSRQ_KEY = 0x54;
unsigned long vgacon_remap_base; unsigned long vgacon_remap_base;
#endif #endif
struct machdep_calls ppc_md;
EXPORT_SYMBOL(ppc_md);
/* /*
* These are used in binfmt_elf.c to put aux entries on the stack * These are used in binfmt_elf.c to put aux entries on the stack
* for each elf executable being started. * for each elf executable being started.
...@@ -111,7 +101,7 @@ unsigned long __init early_init(unsigned long dt_ptr) ...@@ -111,7 +101,7 @@ unsigned long __init early_init(unsigned long dt_ptr)
/* First zero the BSS -- use memset_io, some platforms don't have /* First zero the BSS -- use memset_io, some platforms don't have
* caches on yet */ * caches on yet */
memset_io(PTRRELOC(&__bss_start), 0, _end - __bss_start); memset_io((void __iomem *)PTRRELOC(&__bss_start), 0, _end - __bss_start);
/* /*
* Identify the CPU type and fix up code sections * Identify the CPU type and fix up code sections
...@@ -123,48 +113,6 @@ unsigned long __init early_init(unsigned long dt_ptr) ...@@ -123,48 +113,6 @@ unsigned long __init early_init(unsigned long dt_ptr)
return KERNELBASE + offset; return KERNELBASE + offset;
} }
#ifdef CONFIG_PPC_MULTIPLATFORM
/*
* The PPC_MULTIPLATFORM version of platform_init...
*/
void __init platform_init(void)
{
/* if we didn't get any bootinfo telling us what we are... */
if (_machine == 0) {
/* prep boot loader tells us if we're prep or not */
if ( *(unsigned long *)(KERNELBASE) == (0xdeadc0de) )
_machine = _MACH_prep;
}
#ifdef CONFIG_PPC_PREP
/* not much more to do here, if prep */
if (_machine == _MACH_prep) {
prep_init();
return;
}
#endif
#ifdef CONFIG_ADB
if (strstr(cmd_line, "adb_sync")) {
extern int __adb_probe_sync;
__adb_probe_sync = 1;
}
#endif /* CONFIG_ADB */
switch (_machine) {
#ifdef CONFIG_PPC_PMAC
case _MACH_Pmac:
pmac_init();
break;
#endif
#ifdef CONFIG_PPC_CHRP
case _MACH_chrp:
chrp_init();
break;
#endif
}
}
#endif
/* /*
* Find out what kind of machine we're on and save any data we need * Find out what kind of machine we're on and save any data we need
...@@ -190,10 +138,16 @@ void __init machine_init(unsigned long dt_ptr, unsigned long phys) ...@@ -190,10 +138,16 @@ void __init machine_init(unsigned long dt_ptr, unsigned long phys)
strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line)); strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line));
#endif /* CONFIG_CMDLINE */ #endif /* CONFIG_CMDLINE */
/* Base init based on machine type */ #ifdef CONFIG_PPC_MULTIPLATFORM
probe_machine();
#else
/* Base init based on machine type. Obsoloete, please kill ! */
platform_init(); platform_init();
#endif
#ifdef CONFIG_6xx #ifdef CONFIG_6xx
if (cpu_has_feature(CPU_FTR_CAN_DOZE) ||
cpu_has_feature(CPU_FTR_CAN_NAP))
ppc_md.power_save = ppc6xx_idle; ppc_md.power_save = ppc6xx_idle;
#endif #endif
...@@ -272,7 +226,7 @@ int __init ppc_init(void) ...@@ -272,7 +226,7 @@ int __init ppc_init(void)
if ( ppc_md.progress ) ppc_md.progress(" ", 0xffff); if ( ppc_md.progress ) ppc_md.progress(" ", 0xffff);
/* register CPU devices */ /* register CPU devices */
for_each_cpu(i) for_each_possible_cpu(i)
register_cpu(&cpu_devices[i], i, NULL); register_cpu(&cpu_devices[i], i, NULL);
/* call platform init */ /* call platform init */
...@@ -352,12 +306,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -352,12 +306,6 @@ void __init setup_arch(char **cmdline_p)
do_init_bootmem(); do_init_bootmem();
if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab); if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
#ifdef CONFIG_PPC_OCP
/* Initialize OCP device list */
ocp_early_init();
if ( ppc_md.progress ) ppc_md.progress("ocp: exit", 0x3eab);
#endif
#ifdef CONFIG_DUMMY_CONSOLE #ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif #endif
...@@ -366,7 +314,4 @@ void __init setup_arch(char **cmdline_p) ...@@ -366,7 +314,4 @@ void __init setup_arch(char **cmdline_p)
if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab); if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
paging_init(); paging_init();
/* this is for modules since _machine can be a define -- Cort */
ppc_md.ppc_machine = _machine;
} }
...@@ -73,7 +73,6 @@ ...@@ -73,7 +73,6 @@
int have_of = 1; int have_of = 1;
int boot_cpuid = 0; int boot_cpuid = 0;
int boot_cpuid_phys = 0;
dev_t boot_dev; dev_t boot_dev;
u64 ppc64_pft_size; u64 ppc64_pft_size;
...@@ -96,11 +95,6 @@ int dcache_bsize; ...@@ -96,11 +95,6 @@ int dcache_bsize;
int icache_bsize; int icache_bsize;
int ucache_bsize; int ucache_bsize;
/* The main machine-dep calls structure
*/
struct machdep_calls ppc_md;
EXPORT_SYMBOL(ppc_md);
#ifdef CONFIG_MAGIC_SYSRQ #ifdef CONFIG_MAGIC_SYSRQ
unsigned long SYSRQ_KEY; unsigned long SYSRQ_KEY;
#endif /* CONFIG_MAGIC_SYSRQ */ #endif /* CONFIG_MAGIC_SYSRQ */
...@@ -161,32 +155,6 @@ early_param("smt-enabled", early_smt_enabled); ...@@ -161,32 +155,6 @@ early_param("smt-enabled", early_smt_enabled);
#define check_smt_enabled() #define check_smt_enabled()
#endif /* CONFIG_SMP */ #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 cell_md;
extern struct machdep_calls iseries_md;
/* Ultimately, stuff them in an elf section like initcalls... */
static struct machdep_calls __initdata *machines[] = {
#ifdef CONFIG_PPC_PSERIES
&pSeries_md,
#endif /* CONFIG_PPC_PSERIES */
#ifdef CONFIG_PPC_PMAC
&pmac_md,
#endif /* CONFIG_PPC_PMAC */
#ifdef CONFIG_PPC_MAPLE
&maple_md,
#endif /* CONFIG_PPC_MAPLE */
#ifdef CONFIG_PPC_CELL
&cell_md,
#endif
#ifdef CONFIG_PPC_ISERIES
&iseries_md,
#endif
NULL
};
/* /*
* Early initialization entry point. This is called by head.S * Early initialization entry point. This is called by head.S
* with MMU translation disabled. We rely on the "feature" of * with MMU translation disabled. We rely on the "feature" of
...@@ -208,13 +176,10 @@ static struct machdep_calls __initdata *machines[] = { ...@@ -208,13 +176,10 @@ static struct machdep_calls __initdata *machines[] = {
void __init early_setup(unsigned long dt_ptr) void __init early_setup(unsigned long dt_ptr)
{ {
struct paca_struct *lpaca = get_paca();
static struct machdep_calls **mach;
/* Enable early debugging if any specified (see udbg.h) */ /* Enable early debugging if any specified (see udbg.h) */
udbg_early_init(); udbg_early_init();
DBG(" -> early_setup()\n"); DBG(" -> early_setup(), dt_ptr: 0x%lx\n", dt_ptr);
/* /*
* Do early initializations using the flattened device * Do early initializations using the flattened device
...@@ -223,22 +188,16 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -223,22 +188,16 @@ void __init early_setup(unsigned long dt_ptr)
*/ */
early_init_devtree(__va(dt_ptr)); early_init_devtree(__va(dt_ptr));
/* /* Now we know the logical id of our boot cpu, setup the paca. */
* Iterate all ppc_md structures until we find the proper setup_boot_paca();
* one for the current machine type
*/
DBG("Probing machine type for platform %x...\n", _machine);
for (mach = machines; *mach; mach++) { /* Fix up paca fields required for the boot cpu */
if ((*mach)->probe(_machine)) get_paca()->cpu_start = 1;
break; get_paca()->stab_real = __pa((u64)&initial_stab);
} get_paca()->stab_addr = (u64)&initial_stab;
/* What can we do if we didn't find ? */
if (*mach == NULL) { /* Probe the machine type */
DBG("No suitable machine found !\n"); probe_machine();
for (;;);
}
ppc_md = **mach;
#ifdef CONFIG_CRASH_DUMP #ifdef CONFIG_CRASH_DUMP
kdump_setup(); kdump_setup();
...@@ -260,7 +219,7 @@ void __init early_setup(unsigned long dt_ptr) ...@@ -260,7 +219,7 @@ void __init early_setup(unsigned long dt_ptr)
if (cpu_has_feature(CPU_FTR_SLB)) if (cpu_has_feature(CPU_FTR_SLB))
slb_initialize(); slb_initialize();
else else
stab_initialize(lpaca->stab_real); stab_initialize(get_paca()->stab_real);
} }
DBG(" <- early_setup()\n"); DBG(" <- early_setup()\n");
...@@ -340,7 +299,7 @@ static void __init initialize_cache_info(void) ...@@ -340,7 +299,7 @@ static void __init initialize_cache_info(void)
const char *dc, *ic; const char *dc, *ic;
/* Then read cache informations */ /* Then read cache informations */
if (_machine == PLATFORM_POWERMAC) { if (machine_is(powermac)) {
dc = "d-cache-block-size"; dc = "d-cache-block-size";
ic = "i-cache-block-size"; ic = "i-cache-block-size";
} else { } else {
...@@ -484,7 +443,6 @@ void __init setup_system(void) ...@@ -484,7 +443,6 @@ void __init setup_system(void)
printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size); printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size);
printk("ppc64_interrupt_controller = 0x%ld\n", printk("ppc64_interrupt_controller = 0x%ld\n",
ppc64_interrupt_controller); ppc64_interrupt_controller);
printk("platform = 0x%x\n", _machine);
printk("physicalMemorySize = 0x%lx\n", lmb_phys_mem_size()); printk("physicalMemorySize = 0x%lx\n", lmb_phys_mem_size());
printk("ppc64_caches.dcache_line_size = 0x%x\n", printk("ppc64_caches.dcache_line_size = 0x%x\n",
ppc64_caches.dline_size); ppc64_caches.dline_size);
...@@ -516,7 +474,7 @@ static void __init irqstack_early_init(void) ...@@ -516,7 +474,7 @@ static void __init irqstack_early_init(void)
* interrupt stacks must be under 256MB, we cannot afford to take * interrupt stacks must be under 256MB, we cannot afford to take
* SLB misses on them. * SLB misses on them.
*/ */
for_each_cpu(i) { for_each_possible_cpu(i) {
softirq_ctx[i] = (struct thread_info *) softirq_ctx[i] = (struct thread_info *)
__va(lmb_alloc_base(THREAD_SIZE, __va(lmb_alloc_base(THREAD_SIZE,
THREAD_SIZE, 0x10000000)); THREAD_SIZE, 0x10000000));
...@@ -549,7 +507,7 @@ static void __init emergency_stack_init(void) ...@@ -549,7 +507,7 @@ static void __init emergency_stack_init(void)
*/ */
limit = min(0x10000000UL, lmb.rmo_size); limit = min(0x10000000UL, lmb.rmo_size);
for_each_cpu(i) for_each_possible_cpu(i)
paca[i].emergency_sp = paca[i].emergency_sp =
__va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE; __va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE;
} }
...@@ -602,12 +560,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -602,12 +560,6 @@ void __init setup_arch(char **cmdline_p)
ppc_md.setup_arch(); ppc_md.setup_arch();
/* Use the default idle loop if the platform hasn't provided one. */
if (NULL == ppc_md.idle_loop) {
ppc_md.idle_loop = default_idle;
printk(KERN_INFO "Using default idle loop\n");
}
paging_init(); paging_init();
ppc64_boot_msg(0x15, "Setup Done"); ppc64_boot_msg(0x15, "Setup Done");
} }
...@@ -672,7 +624,7 @@ void __init setup_per_cpu_areas(void) ...@@ -672,7 +624,7 @@ void __init setup_per_cpu_areas(void)
size = PERCPU_ENOUGH_ROOM; size = PERCPU_ENOUGH_ROOM;
#endif #endif
for_each_cpu(i) { for_each_possible_cpu(i) {
ptr = alloc_bootmem_node(NODE_DATA(cpu_to_node(i)), size); ptr = alloc_bootmem_node(NODE_DATA(cpu_to_node(i)), size);
if (!ptr) if (!ptr)
panic("Cannot allocate cpu data for CPU %d\n", i); panic("Cannot allocate cpu data for CPU %d\n", i);
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/syscalls.h>
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#include <asm/vdso.h> #include <asm/vdso.h>
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/syscalls.h>
#include <asm/vdso.h> #include <asm/vdso.h>
#define DEBUG_SIG 0 #define DEBUG_SIG 0
...@@ -211,7 +212,7 @@ static inline void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs ...@@ -211,7 +212,7 @@ static inline void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs
/* Default to using normal stack */ /* Default to using normal stack */
newsp = regs->gpr[1]; newsp = regs->gpr[1];
if (ka->sa.sa_flags & SA_ONSTACK) { if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size) {
if (! on_sig_stack(regs->gpr[1])) if (! on_sig_stack(regs->gpr[1]))
newsp = (current->sas_ss_sp + current->sas_ss_size); newsp = (current->sas_ss_sp + current->sas_ss_size);
} }
......
...@@ -362,7 +362,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) ...@@ -362,7 +362,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
smp_space_timers(max_cpus); smp_space_timers(max_cpus);
for_each_cpu(cpu) for_each_possible_cpu(cpu)
if (cpu != boot_cpuid) if (cpu != boot_cpuid)
smp_create_idle(cpu); smp_create_idle(cpu);
} }
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/ipc.h> #include <asm/ipc.h>
#include <asm/semaphore.h> #include <asm/semaphore.h>
#include <asm/syscalls.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/unistd.h> #include <asm/unistd.h>
......
...@@ -65,20 +65,20 @@ static int __init smt_setup(void) ...@@ -65,20 +65,20 @@ static int __init smt_setup(void)
unsigned int cpu; unsigned int cpu;
if (!cpu_has_feature(CPU_FTR_SMT)) if (!cpu_has_feature(CPU_FTR_SMT))
return 1; return -ENODEV;
options = find_path_device("/options"); options = find_path_device("/options");
if (!options) if (!options)
return 1; return -ENODEV;
val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay", val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay",
NULL); NULL);
if (!smt_snooze_cmdline && val) { if (!smt_snooze_cmdline && val) {
for_each_cpu(cpu) for_each_possible_cpu(cpu)
per_cpu(smt_snooze_delay, cpu) = *val; per_cpu(smt_snooze_delay, cpu) = *val;
} }
return 1; return 0;
} }
__initcall(smt_setup); __initcall(smt_setup);
...@@ -93,7 +93,7 @@ static int __init setup_smt_snooze_delay(char *str) ...@@ -93,7 +93,7 @@ static int __init setup_smt_snooze_delay(char *str)
smt_snooze_cmdline = 1; smt_snooze_cmdline = 1;
if (get_option(&str, &snooze)) { if (get_option(&str, &snooze)) {
for_each_cpu(cpu) for_each_possible_cpu(cpu)
per_cpu(smt_snooze_delay, cpu) = snooze; per_cpu(smt_snooze_delay, cpu) = snooze;
} }
...@@ -347,7 +347,7 @@ static int __init topology_init(void) ...@@ -347,7 +347,7 @@ static int __init topology_init(void)
register_cpu_notifier(&sysfs_cpu_nb); register_cpu_notifier(&sysfs_cpu_nb);
for_each_cpu(cpu) { for_each_possible_cpu(cpu) {
struct cpu *c = &per_cpu(cpu_devices, cpu); struct cpu *c = &per_cpu(cpu_devices, cpu);
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
......
...@@ -261,7 +261,7 @@ void snapshot_timebases(void) ...@@ -261,7 +261,7 @@ void snapshot_timebases(void)
if (!cpu_has_feature(CPU_FTR_PURR)) if (!cpu_has_feature(CPU_FTR_PURR))
return; return;
for_each_cpu(cpu) for_each_possible_cpu(cpu)
spin_lock_init(&per_cpu(cpu_purr_data, cpu).lock); spin_lock_init(&per_cpu(cpu_purr_data, cpu).lock);
on_each_cpu(snapshot_tb_and_purr, NULL, 0, 1); on_each_cpu(snapshot_tb_and_purr, NULL, 0, 1);
} }
...@@ -751,7 +751,7 @@ void __init smp_space_timers(unsigned int max_cpus) ...@@ -751,7 +751,7 @@ void __init smp_space_timers(unsigned int max_cpus)
* systems works better if the two threads' timebase interrupts * systems works better if the two threads' timebase interrupts
* are staggered by half a jiffy with respect to each other. * are staggered by half a jiffy with respect to each other.
*/ */
for_each_cpu(i) { for_each_possible_cpu(i) {
if (i == boot_cpuid) if (i == boot_cpuid)
continue; continue;
if (i == (boot_cpuid ^ 1)) if (i == (boot_cpuid ^ 1))
......
...@@ -97,7 +97,6 @@ static DEFINE_SPINLOCK(die_lock); ...@@ -97,7 +97,6 @@ static DEFINE_SPINLOCK(die_lock);
int die(const char *str, struct pt_regs *regs, long err) int die(const char *str, struct pt_regs *regs, long err)
{ {
static int die_counter, crash_dump_start = 0; static int die_counter, crash_dump_start = 0;
int nl = 0;
if (debugger(regs)) if (debugger(regs))
return 1; return 1;
...@@ -106,7 +105,7 @@ int die(const char *str, struct pt_regs *regs, long err) ...@@ -106,7 +105,7 @@ int die(const char *str, struct pt_regs *regs, long err)
spin_lock_irq(&die_lock); spin_lock_irq(&die_lock);
bust_spinlocks(1); bust_spinlocks(1);
#ifdef CONFIG_PMAC_BACKLIGHT #ifdef CONFIG_PMAC_BACKLIGHT
if (_machine == _MACH_Pmac) { if (machine_is(powermac)) {
set_backlight_enable(1); set_backlight_enable(1);
set_backlight_level(BACKLIGHT_MAX); set_backlight_level(BACKLIGHT_MAX);
} }
...@@ -114,46 +113,18 @@ int die(const char *str, struct pt_regs *regs, long err) ...@@ -114,46 +113,18 @@ int die(const char *str, struct pt_regs *regs, long err)
printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter); printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter);
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
printk("PREEMPT "); printk("PREEMPT ");
nl = 1;
#endif #endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
printk("SMP NR_CPUS=%d ", NR_CPUS); printk("SMP NR_CPUS=%d ", NR_CPUS);
nl = 1;
#endif #endif
#ifdef CONFIG_DEBUG_PAGEALLOC #ifdef CONFIG_DEBUG_PAGEALLOC
printk("DEBUG_PAGEALLOC "); printk("DEBUG_PAGEALLOC ");
nl = 1;
#endif #endif
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
printk("NUMA "); printk("NUMA ");
nl = 1;
#endif #endif
#ifdef CONFIG_PPC64 printk("%s\n", ppc_md.name ? "" : ppc_md.name);
switch (_machine) {
case PLATFORM_PSERIES:
printk("PSERIES ");
nl = 1;
break;
case PLATFORM_PSERIES_LPAR:
printk("PSERIES LPAR ");
nl = 1;
break;
case PLATFORM_ISERIES_LPAR:
printk("ISERIES LPAR ");
nl = 1;
break;
case PLATFORM_POWERMAC:
printk("POWERMAC ");
nl = 1;
break;
case PLATFORM_CELL:
printk("CELL ");
nl = 1;
break;
}
#endif
if (nl)
printk("\n");
print_modules(); print_modules();
show_regs(regs); show_regs(regs);
bust_spinlocks(0); bust_spinlocks(0);
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/firmware.h>
#include <asm/vdso.h> #include <asm/vdso.h>
#include <asm/vdso_datapage.h> #include <asm/vdso_datapage.h>
...@@ -667,7 +668,13 @@ void __init vdso_init(void) ...@@ -667,7 +668,13 @@ void __init vdso_init(void)
vdso_data->version.major = SYSTEMCFG_MAJOR; vdso_data->version.major = SYSTEMCFG_MAJOR;
vdso_data->version.minor = SYSTEMCFG_MINOR; vdso_data->version.minor = SYSTEMCFG_MINOR;
vdso_data->processor = mfspr(SPRN_PVR); vdso_data->processor = mfspr(SPRN_PVR);
vdso_data->platform = _machine; /*
* Fake the old platform number for pSeries and iSeries and add
* in LPAR bit if necessary
*/
vdso_data->platform = machine_is(iseries) ? 0x200 : 0x100;
if (firmware_has_feature(FW_FEATURE_LPAR))
vdso_data->platform |= 1;
vdso_data->physicalMemorySize = lmb_phys_mem_size(); vdso_data->physicalMemorySize = lmb_phys_mem_size();
vdso_data->dcache_size = ppc64_caches.dsize; vdso_data->dcache_size = ppc64_caches.dsize;
vdso_data->dcache_line_size = ppc64_caches.dline_size; vdso_data->dcache_line_size = ppc64_caches.dline_size;
......
#include <linux/config.h> #include <linux/config.h>
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
#include <asm/page.h> #include <asm/page.h>
#define PROVIDE32(x) PROVIDE(__unused__##x)
#else #else
#define PAGE_SIZE 4096 #define PAGE_SIZE 4096
#define KERNELBASE CONFIG_KERNEL_START #define KERNELBASE CONFIG_KERNEL_START
#define PROVIDE32(x) PROVIDE(x)
#endif #endif
#include <asm-generic/vmlinux.lds.h> #include <asm-generic/vmlinux.lds.h>
...@@ -26,35 +28,34 @@ SECTIONS ...@@ -26,35 +28,34 @@ SECTIONS
. = KERNELBASE; . = KERNELBASE;
/* Read-only sections, merged into text segment: */ /*
* Text, read only data and other permanent read-only sections
*/
/* Text and gots */
.text : { .text : {
*(.text .text.*) *(.text .text.*)
SCHED_TEXT SCHED_TEXT
LOCK_TEXT LOCK_TEXT
KPROBES_TEXT KPROBES_TEXT
*(.fixup) *(.fixup)
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
*(.got1) *(.got1)
__got2_start = .; __got2_start = .;
*(.got2) *(.got2)
__got2_end = .; __got2_end = .;
#else #endif /* CONFIG_PPC32 */
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
_etext = .; _etext = .;
#endif PROVIDE32 (etext = .);
} }
#ifdef CONFIG_PPC32
_etext = .;
PROVIDE (etext = .);
/* Read-only data */
RODATA RODATA
.fini : { *(.fini) } =0
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
.fixup : { *(.fixup) }
#endif
/* Exception & bug tables */
__ex_table : { __ex_table : {
__start___ex_table = .; __start___ex_table = .;
*(__ex_table) *(__ex_table)
...@@ -67,60 +68,23 @@ SECTIONS ...@@ -67,60 +68,23 @@ SECTIONS
__stop___bug_table = .; __stop___bug_table = .;
} }
#ifdef CONFIG_PPC64 /*
__ftr_fixup : { * Init sections discarded at runtime
__start___ftr_fixup = .; */
*(__ftr_fixup)
__stop___ftr_fixup = .;
}
RODATA
#endif
#ifdef CONFIG_PPC32
/* Read-write section, merged into data segment: */
. = ALIGN(PAGE_SIZE);
_sdata = .;
.data :
{
*(.data)
*(.data1)
*(.sdata)
*(.sdata2)
*(.got.plt) *(.got)
*(.dynamic)
CONSTRUCTORS
}
. = ALIGN(PAGE_SIZE);
__nosave_begin = .;
.data_nosave : { *(.data.nosave) }
. = ALIGN(PAGE_SIZE);
__nosave_end = .;
. = ALIGN(32);
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
_edata = .;
PROVIDE (edata = .);
. = ALIGN(8192);
.data.init_task : { *(.data.init_task) }
#endif
/* will be freed after init */
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
__init_begin = .; __init_begin = .;
.init.text : { .init.text : {
_sinittext = .; _sinittext = .;
*(.init.text) *(.init.text)
_einittext = .; _einittext = .;
} }
#ifdef CONFIG_PPC32
/* .exit.text is discarded at runtime, not link time, /* .exit.text is discarded at runtime, not link time,
to deal with references from __bug_table */ * to deal with references from __bug_table
*/
.exit.text : { *(.exit.text) } .exit.text : { *(.exit.text) }
#endif
.init.data : { .init.data : {
*(.init.data); *(.init.data);
__vtop_table_begin = .; __vtop_table_begin = .;
...@@ -158,21 +122,24 @@ SECTIONS ...@@ -158,21 +122,24 @@ SECTIONS
SECURITY_INIT SECURITY_INIT
#ifdef CONFIG_PPC32 . = ALIGN(8);
__ftr_fixup : {
__start___ftr_fixup = .; __start___ftr_fixup = .;
__ftr_fixup : { *(__ftr_fixup) } *(__ftr_fixup)
__stop___ftr_fixup = .; __stop___ftr_fixup = .;
#else }
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
.init.ramfs : { .init.ramfs : {
__initramfs_start = .; __initramfs_start = .;
*(.init.ramfs) *(.init.ramfs)
__initramfs_end = .; __initramfs_end = .;
} }
#endif
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
. = ALIGN(32); . = ALIGN(32);
#else
. = ALIGN(128);
#endif #endif
.data.percpu : { .data.percpu : {
__per_cpu_start = .; __per_cpu_start = .;
...@@ -180,30 +147,32 @@ SECTIONS ...@@ -180,30 +147,32 @@ SECTIONS
__per_cpu_end = .; __per_cpu_end = .;
} }
. = ALIGN(8);
.machine.desc : {
__machine_desc_start = . ;
*(.machine.desc)
__machine_desc_end = . ;
}
/* freed after init ends here */
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
#ifdef CONFIG_PPC64
. = ALIGN(16384);
__init_end = .; __init_end = .;
/* freed after init ends here */
/* Read/write sections */ /*
. = ALIGN(PAGE_SIZE); * And now the various read/write data
. = ALIGN(16384); */
_sdata = .;
/* The initial task and kernel stack */
.data.init_task : {
*(.data.init_task)
}
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
.data.page_aligned : { _sdata = .;
*(.data.page_aligned)
}
.data.cacheline_aligned : { #ifdef CONFIG_PPC32
*(.data.cacheline_aligned) .data :
{
*(.data)
*(.sdata)
*(.got.plt) *(.got)
} }
#else
.data : { .data : {
*(.data .data.rel* .toc1) *(.data .data.rel* .toc1)
*(.branch_lt) *(.branch_lt)
...@@ -217,27 +186,43 @@ SECTIONS ...@@ -217,27 +186,43 @@ SECTIONS
__toc_start = .; __toc_start = .;
*(.got) *(.got)
*(.toc) *(.toc)
}
#endif
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
_edata = .; _edata = .;
PROVIDE32 (edata = .);
/* The initial task and kernel stack */
#ifdef CONFIG_PPC32
. = ALIGN(8192);
#else
. = ALIGN(16384);
#endif
.data.init_task : {
*(.data.init_task)
} }
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
#else .data.page_aligned : {
__initramfs_start = .; *(.data.page_aligned)
.init.ramfs : {
*(.init.ramfs)
} }
__initramfs_end = .;
. = ALIGN(4096); .data.cacheline_aligned : {
__init_end = .; *(.data.cacheline_aligned)
}
. = ALIGN(4096); . = ALIGN(PAGE_SIZE);
_sextratext = .; __data_nosave : {
_eextratext = .; __nosave_begin = .;
*(.data.nosave)
. = ALIGN(PAGE_SIZE);
__nosave_end = .;
}
__bss_start = .; /*
#endif * And finally the bss
*/
.bss : { .bss : {
__bss_start = .; __bss_start = .;
...@@ -248,11 +233,7 @@ SECTIONS ...@@ -248,11 +233,7 @@ SECTIONS
__bss_stop = .; __bss_stop = .;
} }
#ifdef CONFIG_PPC64
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
#endif
_end = . ; _end = . ;
#ifdef CONFIG_PPC32 PROVIDE32 (end = .);
PROVIDE (end = .);
#endif
} }
...@@ -18,7 +18,7 @@ extern char system_call_common[]; ...@@ -18,7 +18,7 @@ extern char system_call_common[];
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
/* Bits in SRR1 that are copied from MSR */ /* Bits in SRR1 that are copied from MSR */
#define MSR_MASK 0xffffffff87c0ffff #define MSR_MASK 0xffffffff87c0ffffUL
#else #else
#define MSR_MASK 0x87c0ffff #define MSR_MASK 0x87c0ffff
#endif #endif
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment