mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
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 ...
This commit is contained in:
commit
76babde121
@ -719,6 +719,11 @@ address which can extend beyond that limit.
|
||||
- model : this is your board name/model
|
||||
- #address-cells : address 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:
|
||||
|
||||
|
@ -491,7 +491,7 @@ config PPC601_SYNC_FIX
|
||||
If in doubt, say Y here.
|
||||
|
||||
config TAU
|
||||
bool "Thermal Management Support"
|
||||
bool "On-chip CPU temperature sensor support"
|
||||
depends on 6xx
|
||||
help
|
||||
G3 and G4 processors have an on-chip temperature sensor called the
|
||||
@ -500,7 +500,7 @@ config TAU
|
||||
on-die temperature in /proc/cpuinfo if the cpu supports it.
|
||||
|
||||
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.
|
||||
|
||||
config TAU_INT
|
||||
|
@ -110,11 +110,6 @@ config SERIAL_TEXT_DEBUG
|
||||
depends on 4xx || LOPEC || MV64X60 || PPLUS || PRPMC800 || \
|
||||
PPC_GEN550 || PPC_MPC52xx
|
||||
|
||||
config PPC_OCP
|
||||
bool
|
||||
depends on IBM_OCP || XILINX_OCP
|
||||
default y
|
||||
|
||||
choice
|
||||
prompt "Early debugging (dangerous)"
|
||||
bool
|
||||
|
@ -129,13 +129,8 @@ core-y += arch/powerpc/kernel/ \
|
||||
arch/powerpc/lib/ \
|
||||
arch/powerpc/sysdev/ \
|
||||
arch/powerpc/platforms/
|
||||
core-$(CONFIG_PPC32) += arch/ppc/kernel/
|
||||
core-$(CONFIG_MATH_EMULATION) += arch/ppc/math-emu/
|
||||
core-$(CONFIG_MATH_EMULATION) += arch/powerpc/math-emu/
|
||||
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/
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc6
|
||||
# Wed Mar 15 16:19:48 2006
|
||||
# Linux kernel version: 2.6.16
|
||||
# Thu Mar 23 20:48:09 2006
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
@ -30,6 +30,7 @@ CONFIG_POWER4=y
|
||||
CONFIG_PPC_FPU=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=4
|
||||
|
||||
@ -51,7 +52,8 @@ CONFIG_SYSVIPC=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
@ -85,7 +87,7 @@ CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_KMOD is not set
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
|
||||
#
|
||||
@ -130,7 +132,8 @@ CONFIG_CELL_IIC=y
|
||||
#
|
||||
# Cell Broadband Engine options
|
||||
#
|
||||
CONFIG_SPU_FS=y
|
||||
CONFIG_SPU_FS=m
|
||||
CONFIG_SPUFS_MMAP=y
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
@ -144,7 +147,7 @@ CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_PREEMPT_BKL=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||
# CONFIG_IOMMU_VMERGE is not set
|
||||
CONFIG_KEXEC=y
|
||||
@ -155,13 +158,16 @@ CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_SPARSEMEM_MANUAL=y
|
||||
CONFIG_SPARSEMEM=y
|
||||
CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
# CONFIG_MEMORY_HOTPLUG is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_MIGRATION=y
|
||||
# CONFIG_PPC_64K_PAGES is not set
|
||||
CONFIG_SCHED_SMT=y
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
@ -232,6 +238,7 @@ CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IP_VS is not set
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_IPV6_ROUTER_PREF is not set
|
||||
CONFIG_INET6_AH=m
|
||||
CONFIG_INET6_ESP=m
|
||||
CONFIG_INET6_IPCOMP=m
|
||||
@ -244,25 +251,7 @@ CONFIG_NETFILTER=y
|
||||
# Core Netfilter Configuration
|
||||
#
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
CONFIG_NETFILTER_XTABLES=m
|
||||
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
|
||||
# CONFIG_NETFILTER_XTABLES is not set
|
||||
|
||||
#
|
||||
# IP: Netfilter Configuration
|
||||
@ -278,51 +267,13 @@ CONFIG_IP_NF_IRC=m
|
||||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
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)
|
||||
#
|
||||
# CONFIG_IP6_NF_QUEUE is not set
|
||||
# CONFIG_IP6_NF_IPTABLES is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
@ -355,7 +306,6 @@ CONFIG_IP_NF_ARP_MANGLE=m
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
CONFIG_NET_CLS_ROUTE=y
|
||||
|
||||
#
|
||||
# Network testing
|
||||
@ -408,7 +358,7 @@ CONFIG_FW_LOADER=y
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
# 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_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
@ -484,7 +434,23 @@ CONFIG_IDEDMA_AUTO=y
|
||||
#
|
||||
# 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
|
||||
@ -548,7 +514,7 @@ CONFIG_MII=y
|
||||
# CONFIG_ACENIC is not set
|
||||
# CONFIG_DL2K is not set
|
||||
CONFIG_E1000=m
|
||||
# CONFIG_E1000_NAPI is not set
|
||||
CONFIG_E1000_NAPI=y
|
||||
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
@ -560,7 +526,7 @@ CONFIG_SKGE=m
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
CONFIG_SPIDER_NET=y
|
||||
CONFIG_SPIDER_NET=m
|
||||
# CONFIG_MV643XX_ETH is not set
|
||||
|
||||
#
|
||||
@ -678,6 +644,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_HVC_DRIVER=y
|
||||
CONFIG_HVC_RTAS=y
|
||||
|
||||
#
|
||||
# IPMI
|
||||
@ -694,14 +662,13 @@ CONFIG_WATCHDOG=y
|
||||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
# CONFIG_WATCHDOG_RTAS is not set
|
||||
CONFIG_WATCHDOG_RTAS=y
|
||||
|
||||
#
|
||||
# PCI-based Watchdog Cards
|
||||
#
|
||||
# CONFIG_PCIPCWATCHDOG is not set
|
||||
# CONFIG_WDTPCI is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_DTLK is not set
|
||||
@ -833,6 +800,7 @@ CONFIG_DUMMY_CONSOLE=y
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
@ -852,7 +820,14 @@ CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
#
|
||||
# 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)
|
||||
@ -1037,10 +1012,6 @@ CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=m
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_TEXTSEARCH=y
|
||||
CONFIG_TEXTSEARCH_KMP=m
|
||||
CONFIG_TEXTSEARCH_BM=m
|
||||
CONFIG_TEXTSEARCH_FSM=m
|
||||
|
||||
#
|
||||
# Instrumentation Support
|
||||
@ -1058,7 +1029,7 @@ CONFIG_LOG_BUF_SHIFT=15
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS 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_SLEEP=y
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version:
|
||||
# Sat Jan 14 15:57:54 2006
|
||||
# Linux kernel version: 2.6.16
|
||||
# Mon Mar 27 23:37:36 2006
|
||||
#
|
||||
# CONFIG_PPC64 is not set
|
||||
CONFIG_PPC32=y
|
||||
@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
@ -18,6 +19,7 @@ CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_PPC_OF=y
|
||||
CONFIG_PPC_UDBG_16550=y
|
||||
# CONFIG_GENERIC_TBSYNC is not set
|
||||
CONFIG_DEFAULT_UIMAGE=y
|
||||
|
||||
#
|
||||
# Processor support
|
||||
@ -42,7 +44,6 @@ CONFIG_SPE=y
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
@ -58,6 +59,7 @@ CONFIG_SYSVIPC=y
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
@ -72,10 +74,6 @@ CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
@ -90,6 +88,8 @@ CONFIG_BASE_SMALL=0
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
@ -183,6 +183,7 @@ CONFIG_NET=y
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_NETDEBUG is not set
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
@ -220,6 +221,11 @@ CONFIG_TCP_CONG_BIC=y
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
@ -229,11 +235,6 @@ CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
|
||||
#
|
||||
# TIPC Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
@ -486,6 +487,12 @@ CONFIG_GEN_RTC=y
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
@ -496,16 +503,13 @@ CONFIG_GEN_RTC=y
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
@ -531,6 +535,7 @@ CONFIG_HWMON=y
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD 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'
|
||||
@ -551,7 +556,7 @@ CONFIG_HWMON=y
|
||||
#
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
@ -603,7 +608,6 @@ CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
@ -658,6 +662,7 @@ CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
|
||||
#
|
||||
@ -695,6 +700,8 @@ CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS 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_DEBUGGER is not set
|
||||
# CONFIG_BDI_SWITCH is not set
|
||||
|
@ -12,12 +12,12 @@ endif
|
||||
|
||||
obj-y := semaphore.o cputable.o ptrace.o syscalls.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-$(CONFIG_PPC64) += setup_64.o binfmt_elf32.o sys_ppc32.o \
|
||||
signal_64.o ptrace32.o \
|
||||
paca.o cpu_setup_power4.o \
|
||||
firmware.o sysfs.o idle_64.o
|
||||
firmware.o sysfs.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
|
||||
obj-$(CONFIG_POWER4) += idle_power4.o
|
||||
@ -34,6 +34,11 @@ obj-$(CONFIG_IBMEBUS) += ibmebus.o
|
||||
obj-$(CONFIG_GENERIC_TBSYNC) += smp-tbsync.o
|
||||
obj64-$(CONFIG_PPC_MULTIPLATFORM) += nvram_64.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)
|
||||
|
||||
@ -51,7 +56,6 @@ obj-$(CONFIG_PPC64) += misc_64.o dma_64.o iommu.o
|
||||
obj-$(CONFIG_PPC_MULTIPLATFORM) += prom_init.o
|
||||
obj-$(CONFIG_MODULES) += ppc_ksyms.o
|
||||
obj-$(CONFIG_BOOTX_TEXT) += btext.o
|
||||
obj-$(CONFIG_6xx) += idle_6xx.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o
|
||||
obj-$(CONFIG_PPC_UDBG_16550) += legacy_serial.o udbg_16550.o
|
||||
@ -77,6 +81,7 @@ smpobj-$(CONFIG_SMP) += smp.o
|
||||
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PPC32) += $(obj32-y)
|
||||
obj-$(CONFIG_PPC64) += $(obj64-y)
|
||||
|
||||
extra-$(CONFIG_PPC_FPU) += fpu.o
|
||||
|
@ -105,8 +105,6 @@ int main(void)
|
||||
DEFINE(ICACHEL1LINESIZE, offsetof(struct ppc64_caches, iline_size));
|
||||
DEFINE(ICACHEL1LOGLINESIZE, offsetof(struct ppc64_caches, log_iline_size));
|
||||
DEFINE(ICACHEL1LINESPERPAGE, offsetof(struct ppc64_caches, ilines_per_page));
|
||||
DEFINE(PLATFORM_LPAR, PLATFORM_LPAR);
|
||||
|
||||
/* paca */
|
||||
DEFINE(PACA_SIZE, sizeof(struct paca_struct));
|
||||
DEFINE(PACAPACAINDEX, offsetof(struct paca_struct, paca_index));
|
||||
|
@ -135,10 +135,10 @@ transfer_to_handler:
|
||||
mfspr r11,SPRN_HID0
|
||||
mtcr r11
|
||||
BEGIN_FTR_SECTION
|
||||
bt- 8,power_save_6xx_restore /* Check DOZE */
|
||||
bt- 8,4f /* Check DOZE */
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE)
|
||||
BEGIN_FTR_SECTION
|
||||
bt- 9,power_save_6xx_restore /* Check NAP */
|
||||
bt- 9,4f /* Check NAP */
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
|
||||
#endif /* CONFIG_6xx */
|
||||
.globl transfer_to_handler_cont
|
||||
@ -157,6 +157,10 @@ transfer_to_handler_cont:
|
||||
SYNC
|
||||
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
|
||||
* and call StackOverflow(regs), which should not return.
|
||||
|
@ -617,6 +617,12 @@ _GLOBAL(enter_rtas)
|
||||
mfsrr1 r10
|
||||
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,
|
||||
* check it with the asm equivalent of WARN_ON
|
||||
*/
|
||||
|
@ -14,7 +14,9 @@
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.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)
|
||||
mr r28,r6
|
||||
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
|
||||
|
||||
/* Make sure we are running in 64 bits mode */
|
||||
@ -1847,21 +1851,6 @@ _STATIC(start_here_multiplatform)
|
||||
bl .__save_cpu_setup
|
||||
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,
|
||||
* stab and slb setup before we turn on relocation. */
|
||||
|
||||
@ -1930,6 +1919,17 @@ _STATIC(start_here_common)
|
||||
/* Not reached */
|
||||
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.
|
||||
* This stuff goes at the beginning of the bss, which is page-aligned.
|
||||
|
@ -2,13 +2,17 @@
|
||||
* Idle daemon for PowerPC. Idle daemon will handle any action
|
||||
* 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>
|
||||
*
|
||||
* Additional shared processor, SMT, and firmware support
|
||||
* 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
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
@ -29,18 +33,43 @@
|
||||
#include <asm/machdep.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)
|
||||
ppc_md.idle_loop(); /* doesn't return */
|
||||
|
||||
set_thread_flag(TIF_POLLING_NRFLAG);
|
||||
|
||||
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
|
||||
* low power mode.
|
||||
@ -48,46 +77,18 @@ void default_idle(void)
|
||||
HMT_low();
|
||||
HMT_very_low();
|
||||
}
|
||||
|
||||
HMT_medium();
|
||||
}
|
||||
|
||||
HMT_medium();
|
||||
ppc64_runlatch_on();
|
||||
if (cpu_should_die())
|
||||
cpu_die();
|
||||
preempt_enable_no_resched();
|
||||
schedule();
|
||||
preempt_disable();
|
||||
if (cpu_is_offline(cpu) && system_state == SYSTEM_RUNNING)
|
||||
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();
|
||||
schedule();
|
||||
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;
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
@ -87,19 +87,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
|
||||
cmpwi 0,r3,0
|
||||
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 */
|
||||
andis. r0,r3,HID0_NAP@h
|
||||
beq 2f
|
||||
@ -157,7 +144,8 @@ BEGIN_FTR_SECTION
|
||||
DSSALL
|
||||
sync
|
||||
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
|
||||
sync
|
||||
isync
|
||||
@ -220,8 +208,6 @@ _GLOBAL(nap_save_msscr0)
|
||||
_GLOBAL(nap_save_hid1)
|
||||
.space 4*NR_CPUS
|
||||
|
||||
_GLOBAL(powersave_nap)
|
||||
.long 0
|
||||
_GLOBAL(powersave_lowspeed)
|
||||
.long 0
|
||||
|
||||
|
@ -1,11 +1,5 @@
|
||||
/*
|
||||
* This file contains the power_save function for 6xx & 7xxx 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 file contains the power_save function for 970-family CPUs.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@ -26,49 +20,23 @@
|
||||
|
||||
.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)
|
||||
BEGIN_FTR_SECTION
|
||||
blr
|
||||
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 */
|
||||
LOAD_REG_ADDRBASE(r3,powersave_nap)
|
||||
lwz r4,ADDROFF(powersave_nap)(r3)
|
||||
cmpwi 0,r4,0
|
||||
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 */
|
||||
BEGIN_FTR_SECTION
|
||||
DSSALL
|
||||
sync
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
||||
mfmsr r7
|
||||
ori r7,r7,MSR_EE
|
||||
oris r7,r7,MSR_POW@h
|
||||
sync
|
||||
isync
|
||||
|
@ -379,7 +379,7 @@ void irq_ctx_init(void)
|
||||
struct thread_info *tp;
|
||||
int i;
|
||||
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
memset((void *)softirq_ctx[i], 0, THREAD_SIZE);
|
||||
tp = softirq_ctx[i];
|
||||
tp->cpu = i;
|
||||
|
@ -37,7 +37,7 @@ static int legacy_serial_console = -1;
|
||||
static int __init add_legacy_port(struct device_node *np, int want_index,
|
||||
int iotype, phys_addr_t base,
|
||||
phys_addr_t taddr, unsigned long irq,
|
||||
unsigned int flags)
|
||||
upf_t flags)
|
||||
{
|
||||
u32 *clk, *spd, clock = BASE_BAUD * 16;
|
||||
int index;
|
||||
@ -113,7 +113,7 @@ static int __init add_legacy_soc_port(struct device_node *np,
|
||||
{
|
||||
phys_addr_t addr;
|
||||
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
|
||||
* encoded in the device-tree.
|
||||
@ -236,6 +236,23 @@ static int __init add_legacy_pci_port(struct device_node *np,
|
||||
}
|
||||
#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
|
||||
* setup_arch(), basically before anything else in this file. This function
|
||||
@ -318,25 +335,8 @@ void __init find_legacy_serial_ports(void)
|
||||
#endif
|
||||
|
||||
DBG("legacy_serial_console = %d\n", legacy_serial_console);
|
||||
|
||||
/* udbg is 64 bits only for now, that will change soon though ... */
|
||||
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;
|
||||
}
|
||||
|
||||
if (legacy_serial_console >= 0)
|
||||
setup_legacy_serial_console(legacy_serial_console);
|
||||
DBG(" <- find_legacy_serial_port()\n");
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ static unsigned long get_purr(void)
|
||||
unsigned long sum_purr = 0;
|
||||
int cpu;
|
||||
|
||||
for_each_cpu(cpu) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
sum_purr += lppaca[cpu].emulated_time_base;
|
||||
|
||||
#ifdef PURR_DEBUG
|
||||
@ -222,7 +222,7 @@ static unsigned long get_purr(void)
|
||||
int cpu;
|
||||
struct cpu_usage *cu;
|
||||
|
||||
for_each_cpu(cpu) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
cu = &per_cpu(cpu_usage_array, cpu);
|
||||
sum_purr += cu->current_tb;
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file,
|
||||
case IOC_NVRAM_GET_OFFSET: {
|
||||
int part, offset;
|
||||
|
||||
if (_machine != PLATFORM_POWERMAC)
|
||||
if (!machine_is(powermac))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&part, (void __user*)arg, sizeof(part)) != 0)
|
||||
return -EFAULT;
|
||||
@ -174,8 +174,9 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file,
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct file_operations nvram_fops = {
|
||||
@ -443,7 +444,7 @@ static int nvram_setup_partition(void)
|
||||
* in our nvram, as Apple defined partitions use pretty much
|
||||
* all of the space
|
||||
*/
|
||||
if (_machine == PLATFORM_POWERMAC)
|
||||
if (machine_is(powermac))
|
||||
return -ENOSPC;
|
||||
|
||||
/* see if we have an OS partition that meets our needs.
|
||||
|
@ -56,14 +56,11 @@ struct lppaca lppaca[] = {
|
||||
* processors. The processor VPD array needs one entry per physical
|
||||
* processor (not thread).
|
||||
*/
|
||||
#define PACA_INIT_COMMON(number, start, asrr, asrv) \
|
||||
#define PACA_INIT_COMMON(number) \
|
||||
.lppaca_ptr = &lppaca[number], \
|
||||
.lock_token = 0x8000, \
|
||||
.paca_index = (number), /* Paca Index */ \
|
||||
.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,
|
||||
|
||||
#ifdef CONFIG_PPC_ISERIES
|
||||
@ -72,30 +69,20 @@ struct lppaca lppaca[] = {
|
||||
|
||||
#define PACA_INIT(number) \
|
||||
{ \
|
||||
PACA_INIT_COMMON(number, 0, 0, 0) \
|
||||
PACA_INIT_ISERIES(number) \
|
||||
}
|
||||
|
||||
#define BOOTCPU_PACA_INIT(number) \
|
||||
{ \
|
||||
PACA_INIT_COMMON(number, 1, 0, (u64)&initial_stab) \
|
||||
PACA_INIT_COMMON(number) \
|
||||
PACA_INIT_ISERIES(number) \
|
||||
}
|
||||
|
||||
#else
|
||||
#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
|
||||
|
||||
struct paca_struct paca[] = {
|
||||
BOOTCPU_PACA_INIT(0),
|
||||
PACA_INIT(0),
|
||||
#if NR_CPUS > 1
|
||||
PACA_INIT( 1), PACA_INIT( 2), PACA_INIT( 3),
|
||||
#if NR_CPUS > 4
|
||||
|
@ -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
|
||||
* filling the pci_to_OF map. --BenH
|
||||
*/
|
||||
if (_machine == _MACH_Pmac && busnr >= 0xf0)
|
||||
if (machine_is(powermac) && busnr >= 0xf0)
|
||||
busnr -= 0xf0;
|
||||
else
|
||||
#endif
|
||||
@ -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.
|
||||
*/
|
||||
#ifdef CONFIG_PPC_PMAC
|
||||
if (_machine == _MACH_Pmac && machine_is_compatible("MacRISC4"))
|
||||
if (machine_is(powermac) && machine_is_compatible("MacRISC4"))
|
||||
if (bus == 0)
|
||||
bus = 0xf0;
|
||||
#endif /* CONFIG_PPC_PMAC */
|
||||
|
@ -78,6 +78,7 @@ int global_phb_number; /* Global phb counter */
|
||||
|
||||
/* Cached ISA bridge dev. */
|
||||
struct pci_dev *ppc64_isabridge_dev = NULL;
|
||||
EXPORT_SYMBOL_GPL(ppc64_isabridge_dev);
|
||||
|
||||
static void fixup_broken_pcnet32(struct pci_dev* dev)
|
||||
{
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/rtas.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -51,7 +52,7 @@ static int __init proc_ppc64_create(void)
|
||||
if (!root)
|
||||
return 1;
|
||||
|
||||
if (!(platform_is_pseries() || _machine == PLATFORM_CELL))
|
||||
if (!machine_is(pseries) && !machine_is(cell))
|
||||
return 0;
|
||||
|
||||
if (!proc_mkdir("rtas", root))
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/syscalls.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/firmware.h>
|
||||
#endif
|
||||
@ -362,7 +363,11 @@ static void show_instructions(struct pt_regs *regs)
|
||||
if (!(i % 8))
|
||||
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 ");
|
||||
} else {
|
||||
if (regs->nip == pc)
|
||||
@ -765,7 +770,7 @@ out:
|
||||
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 stack_page = (unsigned long)task_stack_page(p);
|
||||
@ -803,6 +808,8 @@ static int validate_sp(unsigned long sp, struct task_struct *p,
|
||||
#define FRAME_MARKER 2
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(validate_sp);
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p)
|
||||
{
|
||||
unsigned long ip, sp;
|
||||
|
@ -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
|
||||
* only keep the real sense bit on macs
|
||||
*/
|
||||
if (_machine == PLATFORM_POWERMAC)
|
||||
if (machine_is(powermac))
|
||||
sense &= 0x1;
|
||||
np->intrs[intrcount].sense = map_mpic_senses[sense];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* 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);
|
||||
if (name && !strcmp(name, "u3"))
|
||||
np->intrs[intrcount].line += 128;
|
||||
@ -570,6 +570,18 @@ int __init of_scan_flat_dt(int (*it)(unsigned long node,
|
||||
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
|
||||
* access to properties
|
||||
@ -612,6 +624,25 @@ void* __init of_get_flat_dt_prop(unsigned long node, const char *name,
|
||||
} 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,
|
||||
unsigned long align)
|
||||
{
|
||||
@ -686,7 +717,7 @@ static unsigned long __init unflatten_dt_node(unsigned long mem,
|
||||
#ifdef DEBUG
|
||||
if ((strlen(p) + l + 1) != allocl) {
|
||||
DBG("%s: p: %d, l: %d, a: %d\n",
|
||||
pathp, strlen(p), l, allocl);
|
||||
pathp, (int)strlen(p), l, allocl);
|
||||
}
|
||||
#endif
|
||||
p += strlen(p);
|
||||
@ -854,35 +885,73 @@ void __init unflatten_device_tree(void)
|
||||
DBG(" <- unflatten_device_tree()\n");
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
unsigned long size;
|
||||
char *type = of_get_flat_dt_prop(node, "device_type", &size);
|
||||
#endif
|
||||
u32 *intserv;
|
||||
int i, nthreads;
|
||||
unsigned long len;
|
||||
int found = 0;
|
||||
|
||||
/* We are scanning "cpu" nodes only */
|
||||
if (type == NULL || strcmp(type, "cpu") != 0)
|
||||
return 0;
|
||||
|
||||
boot_cpuid = 0;
|
||||
boot_cpuid_phys = 0;
|
||||
if (initial_boot_params && initial_boot_params->version >= 2) {
|
||||
/* version 2 of the kexec param format adds the phys cpuid
|
||||
* of booted proc.
|
||||
*/
|
||||
boot_cpuid_phys = initial_boot_params->boot_cpuid_phys;
|
||||
/* Get physical cpuid */
|
||||
intserv = of_get_flat_dt_prop(node, "ibm,ppc-interrupt-server#s", &len);
|
||||
if (intserv) {
|
||||
nthreads = len / sizeof(int);
|
||||
} else {
|
||||
/* Check if it's the boot-cpu, set it's hw index now */
|
||||
if (of_get_flat_dt_prop(node,
|
||||
"linux,boot-cpu", NULL) != NULL) {
|
||||
prop = of_get_flat_dt_prop(node, "reg", NULL);
|
||||
if (prop != NULL)
|
||||
boot_cpuid_phys = *prop;
|
||||
}
|
||||
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.
|
||||
*/
|
||||
if (initial_boot_params && initial_boot_params->version >= 2) {
|
||||
if (intserv[i] ==
|
||||
initial_boot_params->boot_cpuid_phys) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* 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,
|
||||
"linux,boot-cpu", NULL) != NULL) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#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]);
|
||||
}
|
||||
set_hard_smp_processor_id(0, boot_cpuid_phys);
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* 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,
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
/*
|
||||
* 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))
|
||||
if (nthreads > 1)
|
||||
cur_cpu_spec->cpu_features |= CPU_FTR_SMT;
|
||||
else
|
||||
cur_cpu_spec->cpu_features &= ~CPU_FTR_SMT;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@ -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,
|
||||
const char *uname, int depth, void *data)
|
||||
{
|
||||
u32 *prop;
|
||||
unsigned long *lprop;
|
||||
unsigned long l;
|
||||
char *p;
|
||||
@ -930,14 +992,6 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
|
||||
(strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 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
|
||||
/* check if iommu is forced on or off */
|
||||
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,
|
||||
* 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);
|
||||
entryp = of_get_flat_dt_prop(node, "linux,rtas-entry", NULL);
|
||||
prop = of_get_flat_dt_prop(node, "linux,rtas-size", NULL);
|
||||
if (basep && entryp && prop) {
|
||||
sizep = of_get_flat_dt_prop(node, "linux,rtas-size", NULL);
|
||||
if (basep && entryp && sizep) {
|
||||
rtas.base = *basep;
|
||||
rtas.entry = *entryp;
|
||||
rtas.size = *prop;
|
||||
rtas.size = *sizep;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PPC_RTAS */
|
||||
@ -1001,25 +1055,13 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
|
||||
|
||||
if (strstr(cmd_line, "mem=")) {
|
||||
char *p, *q;
|
||||
unsigned long maxmem = 0;
|
||||
|
||||
for (q = cmd_line; (p = strstr(q, "mem=")) != 0; ) {
|
||||
q = p + 4;
|
||||
if (p > cmd_line && p[-1] != ' ')
|
||||
continue;
|
||||
maxmem = simple_strtoul(q, &q, 0);
|
||||
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 = memparse(q, &q);
|
||||
}
|
||||
memory_limit = maxmem;
|
||||
}
|
||||
|
||||
/* break now */
|
||||
@ -1755,7 +1797,7 @@ static int of_finish_dynamic_node(struct device_node *node)
|
||||
/* We don't support that function on PowerMac, at least
|
||||
* not yet
|
||||
*/
|
||||
if (_machine == PLATFORM_POWERMAC)
|
||||
if (machine_is(powermac))
|
||||
return -ENODEV;
|
||||
|
||||
/* fix up new node's linux_phandle field */
|
||||
|
@ -180,6 +180,16 @@ static unsigned long __initdata prom_tce_alloc_start;
|
||||
static unsigned long __initdata prom_tce_alloc_end;
|
||||
#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 char __initdata prom_cmd_line[COMMAND_LINE_SIZE];
|
||||
@ -397,6 +407,11 @@ static void __init __attribute__((noreturn)) prom_panic(const char *reason)
|
||||
reason = PTRRELOC(reason);
|
||||
#endif
|
||||
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 */
|
||||
call_prom("exit", 0, 0);
|
||||
|
||||
@ -1487,7 +1502,10 @@ static int __init prom_find_machine_type(void)
|
||||
int len, i = 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
phandle rtas;
|
||||
int x;
|
||||
#endif
|
||||
|
||||
/* Look for a PowerMac */
|
||||
len = prom_getprop(_prom->root, "compatible",
|
||||
compat, sizeof(compat)-1);
|
||||
if (len > 0) {
|
||||
@ -1500,28 +1518,36 @@ static int __init prom_find_machine_type(void)
|
||||
if (strstr(p, RELOC("Power Macintosh")) ||
|
||||
strstr(p, RELOC("MacRISC")))
|
||||
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;
|
||||
}
|
||||
}
|
||||
#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 */
|
||||
rtas = call_prom("finddevice", 1, 1, ADDR("/rtas"));
|
||||
if (PHANDLE_VALID(rtas)) {
|
||||
int x = prom_getproplen(rtas, "ibm,hypertas-functions");
|
||||
if (x != PROM_ERROR) {
|
||||
prom_printf("Hypertas detected, assuming LPAR !\n");
|
||||
return PLATFORM_PSERIES_LPAR;
|
||||
}
|
||||
if (!PHANDLE_VALID(rtas))
|
||||
return PLATFORM_GENERIC;
|
||||
x = prom_getproplen(rtas, "ibm,hypertas-functions");
|
||||
if (x != PROM_ERROR) {
|
||||
prom_printf("Hypertas detected, assuming LPAR !\n");
|
||||
return PLATFORM_PSERIES_LPAR;
|
||||
}
|
||||
return PLATFORM_PSERIES;
|
||||
#else
|
||||
return PLATFORM_CHRP;
|
||||
return PLATFORM_GENERIC;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -2029,7 +2055,6 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
|
||||
{
|
||||
struct prom_t *_prom;
|
||||
unsigned long hdr;
|
||||
u32 getprop_rval;
|
||||
unsigned long offset = reloc_offset();
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
@ -2060,6 +2085,12 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
|
||||
*/
|
||||
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. */
|
||||
if (PHYSICAL_START > 0)
|
||||
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,
|
||||
*/
|
||||
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
|
||||
/*
|
||||
* On pSeries, inform the firmware about our capabilities
|
||||
|
@ -257,7 +257,7 @@ static int __init proc_rtas_init(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
if (_machine != PLATFORM_PSERIES && _machine != PLATFORM_PSERIES_LPAR)
|
||||
if (!machine_is(pseries))
|
||||
return 1;
|
||||
|
||||
rtas_node = of_find_node_by_name(NULL, "rtas");
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <asm/hvcall.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/param.h>
|
||||
#include <asm/system.h>
|
||||
@ -32,6 +33,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/lmb.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/syscalls.h>
|
||||
|
||||
struct rtas_t rtas = {
|
||||
.lock = SPIN_LOCK_UNLOCKED
|
||||
@ -591,7 +593,7 @@ static void rtas_percpu_suspend_me(void *info)
|
||||
data->waiting = 0;
|
||||
data->args->args[data->args->nargs] =
|
||||
rtas_call(ibm_suspend_me_token, 0, 1, NULL);
|
||||
for_each_cpu(i)
|
||||
for_each_possible_cpu(i)
|
||||
plpar_hcall_norets(H_PROD,i);
|
||||
} else {
|
||||
data->waiting = -EBUSY;
|
||||
@ -624,7 +626,7 @@ static int rtas_ibm_suspend_me(struct rtas_args *args)
|
||||
/* Prod each CPU. This won't hurt, and will wake
|
||||
* anyone we successfully put to sleep with H_Join
|
||||
*/
|
||||
for_each_cpu(i)
|
||||
for_each_possible_cpu(i)
|
||||
plpar_hcall_norets(H_PROD, i);
|
||||
|
||||
return data.waiting;
|
||||
@ -767,7 +769,7 @@ void __init rtas_initialize(void)
|
||||
* the stop-self token if any
|
||||
*/
|
||||
#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);
|
||||
ibm_suspend_me_token = rtas_token("ibm,suspend-me");
|
||||
}
|
||||
|
@ -9,6 +9,9 @@
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
@ -41,6 +44,7 @@
|
||||
#include <asm/time.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/btext.h>
|
||||
#include <asm/nvram.h>
|
||||
#include <asm/setup.h>
|
||||
@ -56,8 +60,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <asm/udbg.h>
|
||||
#define DBG(fmt...) udbg_printf(fmt)
|
||||
@ -65,10 +67,12 @@
|
||||
#define DBG(fmt...)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
int _machine = 0;
|
||||
EXPORT_SYMBOL(_machine);
|
||||
#endif
|
||||
/* The main machine-dep calls structure
|
||||
*/
|
||||
struct machdep_calls ppc_md;
|
||||
EXPORT_SYMBOL(ppc_md);
|
||||
struct machdep_calls *machine_id;
|
||||
EXPORT_SYMBOL(machine_id);
|
||||
|
||||
unsigned long klimit = (unsigned long) _end;
|
||||
|
||||
@ -168,7 +172,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
|
||||
bogosum/(500000/HZ), bogosum/(5000/HZ) % 100);
|
||||
#endif /* CONFIG_SMP && CONFIG_PPC32 */
|
||||
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)
|
||||
ppc_md.show_cpuinfo(m);
|
||||
|
||||
@ -352,12 +357,13 @@ void __init check_for_initrd(void)
|
||||
* must be called before using this.
|
||||
*
|
||||
* 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)
|
||||
{
|
||||
struct device_node *dn = NULL;
|
||||
int cpu = 0;
|
||||
int swap_cpuid = 0;
|
||||
|
||||
while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
|
||||
int *intserv;
|
||||
@ -376,30 +382,17 @@ void __init smp_setup_cpu_maps(void)
|
||||
for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
set_hard_smp_processor_id(cpu, intserv[j]);
|
||||
|
||||
if (intserv[j] == boot_cpuid_phys)
|
||||
swap_cpuid = cpu;
|
||||
cpu_set(cpu, cpu_possible_map);
|
||||
cpu++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Swap CPU id 0 with boot_cpuid_phys, so we can always assume that
|
||||
* boot cpu is logical 0.
|
||||
*/
|
||||
if (boot_cpuid_phys != get_hard_smp_processor_id(0)) {
|
||||
u32 tmp;
|
||||
tmp = get_hard_smp_processor_id(0);
|
||||
set_hard_smp_processor_id(0, boot_cpuid_phys);
|
||||
set_hard_smp_processor_id(swap_cpuid, tmp);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* On pSeries LPAR, we need to know how many cpus
|
||||
* could possibly be added to this partition.
|
||||
*/
|
||||
if (_machine == PLATFORM_PSERIES_LPAR &&
|
||||
if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) &&
|
||||
(dn = of_find_node_by_path("/rtas"))) {
|
||||
int num_addr_cell, num_size_cell, maxcpus;
|
||||
unsigned int *ireg;
|
||||
@ -438,7 +431,7 @@ void __init smp_setup_cpu_maps(void)
|
||||
/*
|
||||
* 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]);
|
||||
if (cpu_has_feature(CPU_FTR_SMT))
|
||||
cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
|
||||
@ -468,3 +461,34 @@ static int __init early_xmon(char *p)
|
||||
}
|
||||
early_param("xmon", early_xmon);
|
||||
#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 @@
|
||||
extern void platform_init(void);
|
||||
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;
|
||||
struct ide_machdep_calls ppc_ide_md;
|
||||
|
||||
@ -70,10 +67,6 @@ unsigned int DMA_MODE_WRITE;
|
||||
int have_of = 1;
|
||||
|
||||
#ifdef CONFIG_PPC_MULTIPLATFORM
|
||||
extern void prep_init(void);
|
||||
extern void pmac_init(void);
|
||||
extern void chrp_init(void);
|
||||
|
||||
dev_t boot_dev;
|
||||
#endif /* CONFIG_PPC_MULTIPLATFORM */
|
||||
|
||||
@ -85,9 +78,6 @@ unsigned long SYSRQ_KEY = 0x54;
|
||||
unsigned long vgacon_remap_base;
|
||||
#endif
|
||||
|
||||
struct machdep_calls ppc_md;
|
||||
EXPORT_SYMBOL(ppc_md);
|
||||
|
||||
/*
|
||||
* These are used in binfmt_elf.c to put aux entries on the stack
|
||||
* for each elf executable being started.
|
||||
@ -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
|
||||
* 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
|
||||
@ -123,48 +113,6 @@ unsigned long __init early_init(unsigned long dt_ptr)
|
||||
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
|
||||
@ -190,11 +138,17 @@ void __init machine_init(unsigned long dt_ptr, unsigned long phys)
|
||||
strlcpy(cmd_line, CONFIG_CMDLINE, sizeof(cmd_line));
|
||||
#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();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_6xx
|
||||
ppc_md.power_save = ppc6xx_idle;
|
||||
if (cpu_has_feature(CPU_FTR_CAN_DOZE) ||
|
||||
cpu_has_feature(CPU_FTR_CAN_NAP))
|
||||
ppc_md.power_save = ppc6xx_idle;
|
||||
#endif
|
||||
|
||||
if (ppc_md.progress)
|
||||
@ -272,7 +226,7 @@ int __init ppc_init(void)
|
||||
if ( ppc_md.progress ) ppc_md.progress(" ", 0xffff);
|
||||
|
||||
/* register CPU devices */
|
||||
for_each_cpu(i)
|
||||
for_each_possible_cpu(i)
|
||||
register_cpu(&cpu_devices[i], i, NULL);
|
||||
|
||||
/* call platform init */
|
||||
@ -352,12 +306,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
do_init_bootmem();
|
||||
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
|
||||
conswitchp = &dummy_con;
|
||||
#endif
|
||||
@ -366,7 +314,4 @@ void __init setup_arch(char **cmdline_p)
|
||||
if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
|
||||
|
||||
paging_init();
|
||||
|
||||
/* this is for modules since _machine can be a define -- Cort */
|
||||
ppc_md.ppc_machine = _machine;
|
||||
}
|
||||
|
@ -73,7 +73,6 @@
|
||||
|
||||
int have_of = 1;
|
||||
int boot_cpuid = 0;
|
||||
int boot_cpuid_phys = 0;
|
||||
dev_t boot_dev;
|
||||
u64 ppc64_pft_size;
|
||||
|
||||
@ -96,11 +95,6 @@ int dcache_bsize;
|
||||
int icache_bsize;
|
||||
int ucache_bsize;
|
||||
|
||||
/* The main machine-dep calls structure
|
||||
*/
|
||||
struct machdep_calls ppc_md;
|
||||
EXPORT_SYMBOL(ppc_md);
|
||||
|
||||
#ifdef CONFIG_MAGIC_SYSRQ
|
||||
unsigned long SYSRQ_KEY;
|
||||
#endif /* CONFIG_MAGIC_SYSRQ */
|
||||
@ -161,32 +155,6 @@ early_param("smt-enabled", early_smt_enabled);
|
||||
#define check_smt_enabled()
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
extern struct machdep_calls pSeries_md;
|
||||
extern struct machdep_calls pmac_md;
|
||||
extern struct machdep_calls maple_md;
|
||||
extern struct machdep_calls 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
|
||||
* with MMU translation disabled. We rely on the "feature" of
|
||||
@ -208,13 +176,10 @@ static struct machdep_calls __initdata *machines[] = {
|
||||
|
||||
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) */
|
||||
udbg_early_init();
|
||||
|
||||
DBG(" -> early_setup()\n");
|
||||
DBG(" -> early_setup(), dt_ptr: 0x%lx\n", dt_ptr);
|
||||
|
||||
/*
|
||||
* Do early initializations using the flattened device
|
||||
@ -223,22 +188,16 @@ void __init early_setup(unsigned long dt_ptr)
|
||||
*/
|
||||
early_init_devtree(__va(dt_ptr));
|
||||
|
||||
/*
|
||||
* Iterate all ppc_md structures until we find the proper
|
||||
* one for the current machine type
|
||||
*/
|
||||
DBG("Probing machine type for platform %x...\n", _machine);
|
||||
/* Now we know the logical id of our boot cpu, setup the paca. */
|
||||
setup_boot_paca();
|
||||
|
||||
for (mach = machines; *mach; mach++) {
|
||||
if ((*mach)->probe(_machine))
|
||||
break;
|
||||
}
|
||||
/* What can we do if we didn't find ? */
|
||||
if (*mach == NULL) {
|
||||
DBG("No suitable machine found !\n");
|
||||
for (;;);
|
||||
}
|
||||
ppc_md = **mach;
|
||||
/* Fix up paca fields required for the boot cpu */
|
||||
get_paca()->cpu_start = 1;
|
||||
get_paca()->stab_real = __pa((u64)&initial_stab);
|
||||
get_paca()->stab_addr = (u64)&initial_stab;
|
||||
|
||||
/* Probe the machine type */
|
||||
probe_machine();
|
||||
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
kdump_setup();
|
||||
@ -260,7 +219,7 @@ void __init early_setup(unsigned long dt_ptr)
|
||||
if (cpu_has_feature(CPU_FTR_SLB))
|
||||
slb_initialize();
|
||||
else
|
||||
stab_initialize(lpaca->stab_real);
|
||||
stab_initialize(get_paca()->stab_real);
|
||||
}
|
||||
|
||||
DBG(" <- early_setup()\n");
|
||||
@ -340,7 +299,7 @@ static void __init initialize_cache_info(void)
|
||||
const char *dc, *ic;
|
||||
|
||||
/* Then read cache informations */
|
||||
if (_machine == PLATFORM_POWERMAC) {
|
||||
if (machine_is(powermac)) {
|
||||
dc = "d-cache-block-size";
|
||||
ic = "i-cache-block-size";
|
||||
} else {
|
||||
@ -484,7 +443,6 @@ void __init setup_system(void)
|
||||
printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size);
|
||||
printk("ppc64_interrupt_controller = 0x%ld\n",
|
||||
ppc64_interrupt_controller);
|
||||
printk("platform = 0x%x\n", _machine);
|
||||
printk("physicalMemorySize = 0x%lx\n", lmb_phys_mem_size());
|
||||
printk("ppc64_caches.dcache_line_size = 0x%x\n",
|
||||
ppc64_caches.dline_size);
|
||||
@ -516,7 +474,7 @@ static void __init irqstack_early_init(void)
|
||||
* interrupt stacks must be under 256MB, we cannot afford to take
|
||||
* SLB misses on them.
|
||||
*/
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
softirq_ctx[i] = (struct thread_info *)
|
||||
__va(lmb_alloc_base(THREAD_SIZE,
|
||||
THREAD_SIZE, 0x10000000));
|
||||
@ -549,7 +507,7 @@ static void __init emergency_stack_init(void)
|
||||
*/
|
||||
limit = min(0x10000000UL, lmb.rmo_size);
|
||||
|
||||
for_each_cpu(i)
|
||||
for_each_possible_cpu(i)
|
||||
paca[i].emergency_sp =
|
||||
__va(lmb_alloc_base(HW_PAGE_SIZE, 128, limit)) + HW_PAGE_SIZE;
|
||||
}
|
||||
@ -602,12 +560,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
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();
|
||||
ppc64_boot_msg(0x15, "Setup Done");
|
||||
}
|
||||
@ -672,7 +624,7 @@ void __init setup_per_cpu_areas(void)
|
||||
size = PERCPU_ENOUGH_ROOM;
|
||||
#endif
|
||||
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
ptr = alloc_bootmem_node(NODE_DATA(cpu_to_node(i)), size);
|
||||
if (!ptr)
|
||||
panic("Cannot allocate cpu data for CPU %d\n", i);
|
||||
|
@ -42,6 +42,7 @@
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/syscalls.h>
|
||||
#include <asm/sigcontext.h>
|
||||
#include <asm/vdso.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/syscalls.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
#define DEBUG_SIG 0
|
||||
@ -211,7 +212,7 @@ static inline void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs
|
||||
/* Default to using normal stack */
|
||||
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]))
|
||||
newsp = (current->sas_ss_sp + current->sas_ss_size);
|
||||
}
|
||||
|
@ -362,7 +362,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
|
||||
smp_space_timers(max_cpus);
|
||||
|
||||
for_each_cpu(cpu)
|
||||
for_each_possible_cpu(cpu)
|
||||
if (cpu != boot_cpuid)
|
||||
smp_create_idle(cpu);
|
||||
}
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/ipc.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/syscalls.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
|
@ -65,20 +65,20 @@ static int __init smt_setup(void)
|
||||
unsigned int cpu;
|
||||
|
||||
if (!cpu_has_feature(CPU_FTR_SMT))
|
||||
return 1;
|
||||
return -ENODEV;
|
||||
|
||||
options = find_path_device("/options");
|
||||
if (!options)
|
||||
return 1;
|
||||
return -ENODEV;
|
||||
|
||||
val = (unsigned int *)get_property(options, "ibm,smt-snooze-delay",
|
||||
NULL);
|
||||
if (!smt_snooze_cmdline && val) {
|
||||
for_each_cpu(cpu)
|
||||
for_each_possible_cpu(cpu)
|
||||
per_cpu(smt_snooze_delay, cpu) = *val;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
__initcall(smt_setup);
|
||||
|
||||
@ -93,7 +93,7 @@ static int __init setup_smt_snooze_delay(char *str)
|
||||
smt_snooze_cmdline = 1;
|
||||
|
||||
if (get_option(&str, &snooze)) {
|
||||
for_each_cpu(cpu)
|
||||
for_each_possible_cpu(cpu)
|
||||
per_cpu(smt_snooze_delay, cpu) = snooze;
|
||||
}
|
||||
|
||||
@ -347,7 +347,7 @@ static int __init topology_init(void)
|
||||
|
||||
register_cpu_notifier(&sysfs_cpu_nb);
|
||||
|
||||
for_each_cpu(cpu) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct cpu *c = &per_cpu(cpu_devices, cpu);
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
@ -261,7 +261,7 @@ void snapshot_timebases(void)
|
||||
|
||||
if (!cpu_has_feature(CPU_FTR_PURR))
|
||||
return;
|
||||
for_each_cpu(cpu)
|
||||
for_each_possible_cpu(cpu)
|
||||
spin_lock_init(&per_cpu(cpu_purr_data, cpu).lock);
|
||||
on_each_cpu(snapshot_tb_and_purr, NULL, 0, 1);
|
||||
}
|
||||
@ -751,7 +751,7 @@ void __init smp_space_timers(unsigned int max_cpus)
|
||||
* systems works better if the two threads' timebase interrupts
|
||||
* are staggered by half a jiffy with respect to each other.
|
||||
*/
|
||||
for_each_cpu(i) {
|
||||
for_each_possible_cpu(i) {
|
||||
if (i == boot_cpuid)
|
||||
continue;
|
||||
if (i == (boot_cpuid ^ 1))
|
||||
|
@ -97,7 +97,6 @@ static DEFINE_SPINLOCK(die_lock);
|
||||
int die(const char *str, struct pt_regs *regs, long err)
|
||||
{
|
||||
static int die_counter, crash_dump_start = 0;
|
||||
int nl = 0;
|
||||
|
||||
if (debugger(regs))
|
||||
return 1;
|
||||
@ -106,7 +105,7 @@ int die(const char *str, struct pt_regs *regs, long err)
|
||||
spin_lock_irq(&die_lock);
|
||||
bust_spinlocks(1);
|
||||
#ifdef CONFIG_PMAC_BACKLIGHT
|
||||
if (_machine == _MACH_Pmac) {
|
||||
if (machine_is(powermac)) {
|
||||
set_backlight_enable(1);
|
||||
set_backlight_level(BACKLIGHT_MAX);
|
||||
}
|
||||
@ -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);
|
||||
#ifdef CONFIG_PREEMPT
|
||||
printk("PREEMPT ");
|
||||
nl = 1;
|
||||
#endif
|
||||
#ifdef CONFIG_SMP
|
||||
printk("SMP NR_CPUS=%d ", NR_CPUS);
|
||||
nl = 1;
|
||||
#endif
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
printk("DEBUG_PAGEALLOC ");
|
||||
nl = 1;
|
||||
#endif
|
||||
#ifdef CONFIG_NUMA
|
||||
printk("NUMA ");
|
||||
nl = 1;
|
||||
#endif
|
||||
#ifdef CONFIG_PPC64
|
||||
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");
|
||||
printk("%s\n", ppc_md.name ? "" : ppc_md.name);
|
||||
|
||||
print_modules();
|
||||
show_regs(regs);
|
||||
bust_spinlocks(0);
|
||||
|
@ -33,6 +33,7 @@
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
|
||||
@ -667,7 +668,13 @@ void __init vdso_init(void)
|
||||
vdso_data->version.major = SYSTEMCFG_MAJOR;
|
||||
vdso_data->version.minor = SYSTEMCFG_MINOR;
|
||||
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->dcache_size = ppc64_caches.dsize;
|
||||
vdso_data->dcache_line_size = ppc64_caches.dline_size;
|
||||
|
@ -1,9 +1,11 @@
|
||||
#include <linux/config.h>
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/page.h>
|
||||
#define PROVIDE32(x) PROVIDE(__unused__##x)
|
||||
#else
|
||||
#define PAGE_SIZE 4096
|
||||
#define KERNELBASE CONFIG_KERNEL_START
|
||||
#define PROVIDE32(x) PROVIDE(x)
|
||||
#endif
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
|
||||
@ -18,43 +20,42 @@ jiffies = jiffies_64 + 4;
|
||||
#endif
|
||||
SECTIONS
|
||||
{
|
||||
/* Sections to be discarded. */
|
||||
/DISCARD/ : {
|
||||
*(.exitcall.exit)
|
||||
*(.exit.data)
|
||||
}
|
||||
/* Sections to be discarded. */
|
||||
/DISCARD/ : {
|
||||
*(.exitcall.exit)
|
||||
*(.exit.data)
|
||||
}
|
||||
|
||||
. = KERNELBASE;
|
||||
. = KERNELBASE;
|
||||
|
||||
/*
|
||||
* Text, read only data and other permanent read-only sections
|
||||
*/
|
||||
|
||||
/* Text and gots */
|
||||
.text : {
|
||||
*(.text .text.*)
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
*(.fixup)
|
||||
|
||||
/* Read-only sections, merged into text segment: */
|
||||
.text : {
|
||||
*(.text .text.*)
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
*(.fixup)
|
||||
#ifdef CONFIG_PPC32
|
||||
*(.got1)
|
||||
__got2_start = .;
|
||||
*(.got2)
|
||||
__got2_end = .;
|
||||
#else
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .;
|
||||
#endif
|
||||
}
|
||||
#ifdef CONFIG_PPC32
|
||||
_etext = .;
|
||||
PROVIDE (etext = .);
|
||||
*(.got1)
|
||||
__got2_start = .;
|
||||
*(.got2)
|
||||
__got2_end = .;
|
||||
#endif /* CONFIG_PPC32 */
|
||||
|
||||
RODATA
|
||||
.fini : { *(.fini) } =0
|
||||
.ctors : { *(.ctors) }
|
||||
.dtors : { *(.dtors) }
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_etext = .;
|
||||
PROVIDE32 (etext = .);
|
||||
}
|
||||
|
||||
.fixup : { *(.fixup) }
|
||||
#endif
|
||||
/* Read-only data */
|
||||
RODATA
|
||||
|
||||
/* Exception & bug tables */
|
||||
__ex_table : {
|
||||
__start___ex_table = .;
|
||||
*(__ex_table)
|
||||
@ -67,192 +68,172 @@ SECTIONS
|
||||
__stop___bug_table = .;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* Init sections discarded at runtime
|
||||
*/
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_begin = .;
|
||||
|
||||
.init.text : {
|
||||
_sinittext = .;
|
||||
*(.init.text)
|
||||
_einittext = .;
|
||||
}
|
||||
|
||||
/* .exit.text is discarded at runtime, not link time,
|
||||
* to deal with references from __bug_table
|
||||
*/
|
||||
.exit.text : { *(.exit.text) }
|
||||
|
||||
.init.data : {
|
||||
*(.init.data);
|
||||
__vtop_table_begin = .;
|
||||
*(.vtop_fixup);
|
||||
__vtop_table_end = .;
|
||||
__ptov_table_begin = .;
|
||||
*(.ptov_fixup);
|
||||
__ptov_table_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(16);
|
||||
.init.setup : {
|
||||
__setup_start = .;
|
||||
*(.init.setup)
|
||||
__setup_end = .;
|
||||
}
|
||||
|
||||
.initcall.init : {
|
||||
__initcall_start = .;
|
||||
*(.initcall1.init)
|
||||
*(.initcall2.init)
|
||||
*(.initcall3.init)
|
||||
*(.initcall4.init)
|
||||
*(.initcall5.init)
|
||||
*(.initcall6.init)
|
||||
*(.initcall7.init)
|
||||
__initcall_end = .;
|
||||
}
|
||||
|
||||
.con_initcall.init : {
|
||||
__con_initcall_start = .;
|
||||
*(.con_initcall.init)
|
||||
__con_initcall_end = .;
|
||||
}
|
||||
|
||||
SECURITY_INIT
|
||||
|
||||
. = ALIGN(8);
|
||||
__ftr_fixup : {
|
||||
__start___ftr_fixup = .;
|
||||
*(__ftr_fixup)
|
||||
__stop___ftr_fixup = .;
|
||||
}
|
||||
|
||||
RODATA
|
||||
#endif
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.init.ramfs : {
|
||||
__initramfs_start = .;
|
||||
*(.init.ramfs)
|
||||
__initramfs_end = .;
|
||||
}
|
||||
|
||||
#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);
|
||||
__init_begin = .;
|
||||
.init.text : {
|
||||
_sinittext = .;
|
||||
*(.init.text)
|
||||
_einittext = .;
|
||||
}
|
||||
#ifdef CONFIG_PPC32
|
||||
/* .exit.text is discarded at runtime, not link time,
|
||||
to deal with references from __bug_table */
|
||||
.exit.text : { *(.exit.text) }
|
||||
#endif
|
||||
.init.data : {
|
||||
*(.init.data);
|
||||
__vtop_table_begin = .;
|
||||
*(.vtop_fixup);
|
||||
__vtop_table_end = .;
|
||||
__ptov_table_begin = .;
|
||||
*(.ptov_fixup);
|
||||
__ptov_table_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(16);
|
||||
.init.setup : {
|
||||
__setup_start = .;
|
||||
*(.init.setup)
|
||||
__setup_end = .;
|
||||
}
|
||||
|
||||
.initcall.init : {
|
||||
__initcall_start = .;
|
||||
*(.initcall1.init)
|
||||
*(.initcall2.init)
|
||||
*(.initcall3.init)
|
||||
*(.initcall4.init)
|
||||
*(.initcall5.init)
|
||||
*(.initcall6.init)
|
||||
*(.initcall7.init)
|
||||
__initcall_end = .;
|
||||
}
|
||||
|
||||
.con_initcall.init : {
|
||||
__con_initcall_start = .;
|
||||
*(.con_initcall.init)
|
||||
__con_initcall_end = .;
|
||||
}
|
||||
|
||||
SECURITY_INIT
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
__start___ftr_fixup = .;
|
||||
__ftr_fixup : { *(__ftr_fixup) }
|
||||
__stop___ftr_fixup = .;
|
||||
. = ALIGN(32);
|
||||
#else
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.init.ramfs : {
|
||||
__initramfs_start = .;
|
||||
*(.init.ramfs)
|
||||
__initramfs_end = .;
|
||||
}
|
||||
. = ALIGN(128);
|
||||
#endif
|
||||
.data.percpu : {
|
||||
__per_cpu_start = .;
|
||||
*(.data.percpu)
|
||||
__per_cpu_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(8);
|
||||
.machine.desc : {
|
||||
__machine_desc_start = . ;
|
||||
*(.machine.desc)
|
||||
__machine_desc_end = . ;
|
||||
}
|
||||
|
||||
/* freed after init ends here */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_end = .;
|
||||
|
||||
/*
|
||||
* And now the various read/write data
|
||||
*/
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_sdata = .;
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
. = ALIGN(32);
|
||||
#endif
|
||||
.data.percpu : {
|
||||
__per_cpu_start = .;
|
||||
*(.data.percpu)
|
||||
__per_cpu_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
#ifdef CONFIG_PPC64
|
||||
. = ALIGN(16384);
|
||||
__init_end = .;
|
||||
/* freed after init ends here */
|
||||
|
||||
/* Read/write sections */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
. = ALIGN(16384);
|
||||
_sdata = .;
|
||||
/* The initial task and kernel stack */
|
||||
.data.init_task : {
|
||||
*(.data.init_task)
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data.page_aligned : {
|
||||
*(.data.page_aligned)
|
||||
}
|
||||
|
||||
.data.cacheline_aligned : {
|
||||
*(.data.cacheline_aligned)
|
||||
}
|
||||
|
||||
.data : {
|
||||
*(.data .data.rel* .toc1)
|
||||
*(.branch_lt)
|
||||
}
|
||||
|
||||
.opd : {
|
||||
*(.opd)
|
||||
}
|
||||
|
||||
.got : {
|
||||
__toc_start = .;
|
||||
*(.got)
|
||||
*(.toc)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_edata = .;
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.sdata)
|
||||
*(.got.plt) *(.got)
|
||||
}
|
||||
#else
|
||||
__initramfs_start = .;
|
||||
.init.ramfs : {
|
||||
*(.init.ramfs)
|
||||
}
|
||||
__initramfs_end = .;
|
||||
.data : {
|
||||
*(.data .data.rel* .toc1)
|
||||
*(.branch_lt)
|
||||
}
|
||||
|
||||
. = ALIGN(4096);
|
||||
__init_end = .;
|
||||
.opd : {
|
||||
*(.opd)
|
||||
}
|
||||
|
||||
. = ALIGN(4096);
|
||||
_sextratext = .;
|
||||
_eextratext = .;
|
||||
|
||||
__bss_start = .;
|
||||
.got : {
|
||||
__toc_start = .;
|
||||
*(.got)
|
||||
*(.toc)
|
||||
}
|
||||
#endif
|
||||
|
||||
.bss : {
|
||||
__bss_start = .;
|
||||
*(.sbss) *(.scommon)
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
__bss_stop = .;
|
||||
}
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_edata = .;
|
||||
PROVIDE32 (edata = .);
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
#endif
|
||||
_end = . ;
|
||||
/* The initial task and kernel stack */
|
||||
#ifdef CONFIG_PPC32
|
||||
PROVIDE (end = .);
|
||||
. = ALIGN(8192);
|
||||
#else
|
||||
. = ALIGN(16384);
|
||||
#endif
|
||||
.data.init_task : {
|
||||
*(.data.init_task)
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data.page_aligned : {
|
||||
*(.data.page_aligned)
|
||||
}
|
||||
|
||||
.data.cacheline_aligned : {
|
||||
*(.data.cacheline_aligned)
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__data_nosave : {
|
||||
__nosave_begin = .;
|
||||
*(.data.nosave)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
}
|
||||
|
||||
/*
|
||||
* And finally the bss
|
||||
*/
|
||||
|
||||
.bss : {
|
||||
__bss_start = .;
|
||||
*(.sbss) *(.scommon)
|
||||
*(.dynbss)
|
||||
*(.bss)
|
||||
*(COMMON)
|
||||
__bss_stop = .;
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
_end = . ;
|
||||
PROVIDE32 (end = .);
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ extern char system_call_common[];
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/* Bits in SRR1 that are copied from MSR */
|
||||
#define MSR_MASK 0xffffffff87c0ffff
|
||||
#define MSR_MASK 0xffffffff87c0ffffUL
|
||||
#else
|
||||
#define MSR_MASK 0x87c0ffff
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user