Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@g5.osdl.org>
Thu, 23 Mar 2006 06:20:46 +0000 (22:20 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Thu, 23 Mar 2006 06:20:46 +0000 (22:20 -0800)
* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (78 commits)
  [PATCH] powerpc: Add FSL SEC node to documentation
  [PATCH] macintosh: tidy-up driver_register() return values
  [PATCH] powerpc: tidy-up of_register_driver()/driver_register() return values
  [PATCH] powerpc: via-pmu warning fix
  [PATCH] macintosh: cleanup the use of i2c headers
  [PATCH] powerpc: dont allow old RTC to be selected
  [PATCH] powerpc: make powerbook_sleep_grackle static
  [PATCH] powerpc: Fix warning in add_memory
  [PATCH] powerpc: update mailing list addresses
  [PATCH] powerpc: Remove calculation of io hole
  [PATCH] powerpc: iseries: Add bootargs to /chosen
  [PATCH] powerpc: iseries: Add /system-id, /model and /compatible
  [PATCH] powerpc: Add strne2a() to convert a string from EBCDIC to ASCII
  [PATCH] powerpc: iseries: Make more stuff static in platforms/iseries/mf.c
  [PATCH] powerpc: iseries: Remove pointless iSeries_(restart|power_off|halt)
  [PATCH] powerpc: iseries: mf related cleanups
  [PATCH] powerpc: Replace platform_is_lpar() with a firmware feature
  [PATCH] powerpc: trivial: Cleanup whitespace in cputable.h
  [PATCH] powerpc: Remove unused iommu_off logic from pSeries_init_early()
  [PATCH] powerpc: Unconfuse htab_bolt_mapping() callers
  ...

366 files changed:
Documentation/powerpc/booting-without-of.txt
Documentation/powerpc/eeh-pci-error-recovery.txt
Documentation/powerpc/hvcs.txt
MAINTAINERS
arch/powerpc/Kconfig
arch/powerpc/Makefile
arch/powerpc/boot/install.sh
arch/powerpc/boot/main.c
arch/powerpc/configs/mpc8540_ads_defconfig [new file with mode: 0644]
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/firmware.c
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/head_8xx.S
arch/powerpc/kernel/head_booke.h [new file with mode: 0644]
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/kernel/iomap.c
arch/powerpc/kernel/iommu.c
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/kprobes.c
arch/powerpc/kernel/of_device.c
arch/powerpc/kernel/pci_iommu.c
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/ptrace-common.h
arch/powerpc/kernel/rtas-proc.c
arch/powerpc/kernel/rtas_pci.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/signal_64.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/vdso.c
arch/powerpc/lib/copypage_64.S
arch/powerpc/lib/copyuser_64.S
arch/powerpc/lib/e2a.c
arch/powerpc/lib/memcpy_64.S
arch/powerpc/lib/rheap.c
arch/powerpc/mm/fault.c
arch/powerpc/mm/hash_low_32.S
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/init_64.c
arch/powerpc/mm/lmb.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/mmap.c
arch/powerpc/mm/numa.c
arch/powerpc/mm/slb_low.S
arch/powerpc/mm/stab.c
arch/powerpc/mm/tlb_64.c
arch/powerpc/oprofile/op_model_power4.c
arch/powerpc/platforms/83xx/Makefile
arch/powerpc/platforms/83xx/misc.c [new file with mode: 0644]
arch/powerpc/platforms/83xx/mpc834x_sys.c
arch/powerpc/platforms/83xx/mpc834x_sys.h
arch/powerpc/platforms/83xx/mpc83xx.h
arch/powerpc/platforms/83xx/pci.c
arch/powerpc/platforms/85xx/Kconfig
arch/powerpc/platforms/85xx/Makefile
arch/powerpc/platforms/85xx/misc.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/mpc8540_ads.h [new file with mode: 0644]
arch/powerpc/platforms/85xx/mpc85xx.h [new file with mode: 0644]
arch/powerpc/platforms/85xx/mpc85xx_ads.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/pci.c [new file with mode: 0644]
arch/powerpc/platforms/Makefile
arch/powerpc/platforms/chrp/pegasos_eth.c
arch/powerpc/platforms/chrp/setup.c
arch/powerpc/platforms/chrp/time.c
arch/powerpc/platforms/iseries/mf.c
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/maple/time.c
arch/powerpc/platforms/powermac/cpufreq_32.c
arch/powerpc/platforms/powermac/feature.c
arch/powerpc/platforms/powermac/nvram.c
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/pseries/Makefile
arch/powerpc/platforms/pseries/firmware.c [new file with mode: 0644]
arch/powerpc/platforms/pseries/firmware.h [new file with mode: 0644]
arch/powerpc/platforms/pseries/hvCall.S
arch/powerpc/platforms/pseries/iommu.c
arch/powerpc/platforms/pseries/pci.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/platforms/pseries/xics.c
arch/powerpc/sysdev/dart_iommu.c
arch/powerpc/sysdev/dcr.S
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/ipic.h
arch/powerpc/xmon/xmon.c
arch/ppc/4xx_io/serial_sicc.c
arch/ppc/8xx_io/commproc.c
arch/ppc/Kconfig
arch/ppc/Kconfig.debug
arch/ppc/amiga/amiints.c
arch/ppc/amiga/bootinfo.c
arch/ppc/amiga/cia.c
arch/ppc/amiga/config.c
arch/ppc/amiga/ints.c
arch/ppc/boot/Makefile
arch/ppc/boot/common/Makefile
arch/ppc/boot/common/bootinfo.c
arch/ppc/boot/common/misc-common.c
arch/ppc/boot/common/ns16550.c
arch/ppc/boot/common/serial_stub.c
arch/ppc/boot/common/util.S
arch/ppc/boot/include/mpc10x.h
arch/ppc/boot/simple/Makefile
arch/ppc/boot/simple/cpc700_memory.c
arch/ppc/boot/simple/embed_config.c
arch/ppc/boot/simple/head.S
arch/ppc/boot/simple/misc-chestnut.c
arch/ppc/boot/simple/misc-cpci690.c
arch/ppc/boot/simple/misc-ev64260.c
arch/ppc/boot/simple/misc-ev64360.c
arch/ppc/boot/simple/misc-katana.c
arch/ppc/boot/simple/misc-mv64x60.c
arch/ppc/boot/simple/misc-prep.c
arch/ppc/boot/simple/misc-radstone_ppc7d.c
arch/ppc/boot/simple/misc-spruce.c
arch/ppc/boot/simple/misc.c
arch/ppc/boot/simple/mpc10x_memory.c
arch/ppc/boot/simple/mpc52xx_tty.c
arch/ppc/boot/simple/mv64x60_tty.c
arch/ppc/boot/simple/openbios.c
arch/ppc/boot/simple/relocate.S
arch/ppc/boot/utils/mkbugboot.c
arch/ppc/configs/ml300_defconfig [new file with mode: 0644]
arch/ppc/configs/ml403_defconfig [new file with mode: 0644]
arch/ppc/kernel/head_44x.S
arch/ppc/kernel/head_8xx.S
arch/ppc/kernel/head_fsl_booke.S
arch/ppc/kernel/smp-tbsync.c
arch/ppc/kernel/traps.c
arch/ppc/lib/rheap.c
arch/ppc/math-emu/math.c
arch/ppc/mm/44x_mmu.c
arch/ppc/mm/fault.c
arch/ppc/mm/hashtable.S
arch/ppc/platforms/4xx/Kconfig
arch/ppc/platforms/4xx/Makefile
arch/ppc/platforms/4xx/bamboo.c
arch/ppc/platforms/4xx/bamboo.h
arch/ppc/platforms/4xx/bubinga.h
arch/ppc/platforms/4xx/cpci405.c
arch/ppc/platforms/4xx/ebony.c
arch/ppc/platforms/4xx/ebony.h
arch/ppc/platforms/4xx/ep405.c
arch/ppc/platforms/4xx/ep405.h
arch/ppc/platforms/4xx/ibm405ep.c
arch/ppc/platforms/4xx/ibm405ep.h
arch/ppc/platforms/4xx/ibm405gp.h
arch/ppc/platforms/4xx/ibm405gpr.c
arch/ppc/platforms/4xx/ibm405gpr.h
arch/ppc/platforms/4xx/ibm440ep.c
arch/ppc/platforms/4xx/ibm440ep.h
arch/ppc/platforms/4xx/ibm440gp.c
arch/ppc/platforms/4xx/ibm440gp.h
arch/ppc/platforms/4xx/ibm440gx.c
arch/ppc/platforms/4xx/ibm440gx.h
arch/ppc/platforms/4xx/ibm440sp.c
arch/ppc/platforms/4xx/ibm440sp.h
arch/ppc/platforms/4xx/ibmnp405h.c
arch/ppc/platforms/4xx/ibmnp405h.h
arch/ppc/platforms/4xx/ibmstb4.c
arch/ppc/platforms/4xx/ibmstb4.h
arch/ppc/platforms/4xx/ibmstbx25.c
arch/ppc/platforms/4xx/ibmstbx25.h
arch/ppc/platforms/4xx/luan.c
arch/ppc/platforms/4xx/luan.h
arch/ppc/platforms/4xx/ocotea.c
arch/ppc/platforms/4xx/ocotea.h
arch/ppc/platforms/4xx/ppc440spe.c
arch/ppc/platforms/4xx/ppc440spe.h
arch/ppc/platforms/4xx/redwood5.c
arch/ppc/platforms/4xx/redwood5.h
arch/ppc/platforms/4xx/redwood6.c
arch/ppc/platforms/4xx/redwood6.h
arch/ppc/platforms/4xx/sycamore.c
arch/ppc/platforms/4xx/sycamore.h
arch/ppc/platforms/4xx/virtex-ii_pro.c [deleted file]
arch/ppc/platforms/4xx/virtex-ii_pro.h [deleted file]
arch/ppc/platforms/4xx/virtex.c [new file with mode: 0644]
arch/ppc/platforms/4xx/virtex.h [new file with mode: 0644]
arch/ppc/platforms/4xx/walnut.c
arch/ppc/platforms/4xx/walnut.h
arch/ppc/platforms/4xx/xilinx_ml300.c
arch/ppc/platforms/4xx/xilinx_ml300.h
arch/ppc/platforms/4xx/xilinx_ml403.c [new file with mode: 0644]
arch/ppc/platforms/4xx/xilinx_ml403.h [new file with mode: 0644]
arch/ppc/platforms/4xx/xparameters/xparameters.h [new file with mode: 0644]
arch/ppc/platforms/4xx/xparameters/xparameters_ml403.h [new file with mode: 0644]
arch/ppc/platforms/4xx/yucca.c
arch/ppc/platforms/4xx/yucca.h
arch/ppc/platforms/83xx/mpc834x_sys.c
arch/ppc/platforms/83xx/mpc834x_sys.h
arch/ppc/platforms/85xx/mpc8540_ads.c
arch/ppc/platforms/85xx/mpc8540_ads.h
arch/ppc/platforms/85xx/mpc8555_cds.h
arch/ppc/platforms/85xx/mpc8560_ads.c
arch/ppc/platforms/85xx/mpc8560_ads.h
arch/ppc/platforms/85xx/mpc85xx_ads_common.c
arch/ppc/platforms/85xx/mpc85xx_ads_common.h
arch/ppc/platforms/85xx/mpc85xx_cds_common.c
arch/ppc/platforms/85xx/mpc85xx_cds_common.h
arch/ppc/platforms/85xx/sbc8560.c
arch/ppc/platforms/85xx/sbc8560.h
arch/ppc/platforms/85xx/sbc85xx.c
arch/ppc/platforms/85xx/sbc85xx.h
arch/ppc/platforms/85xx/stx_gp3.c
arch/ppc/platforms/85xx/stx_gp3.h
arch/ppc/platforms/85xx/tqm85xx.c
arch/ppc/platforms/85xx/tqm85xx.h
arch/ppc/platforms/Makefile
arch/ppc/platforms/apus_setup.c
arch/ppc/platforms/chestnut.c
arch/ppc/platforms/chestnut.h
arch/ppc/platforms/chrp_pegasos_eth.c
arch/ppc/platforms/chrp_setup.c
arch/ppc/platforms/chrp_time.c
arch/ppc/platforms/cpci690.c
arch/ppc/platforms/cpci690.h
arch/ppc/platforms/ev64260.c
arch/ppc/platforms/ev64260.h
arch/ppc/platforms/ev64360.c
arch/ppc/platforms/ev64360.h
arch/ppc/platforms/fads.h
arch/ppc/platforms/gemini.h
arch/ppc/platforms/gemini_prom.S
arch/ppc/platforms/gemini_setup.c
arch/ppc/platforms/hdpu.c
arch/ppc/platforms/hdpu.h
arch/ppc/platforms/katana.c
arch/ppc/platforms/katana.h
arch/ppc/platforms/lite5200.c
arch/ppc/platforms/lite5200.h
arch/ppc/platforms/lopec.c
arch/ppc/platforms/mpc8272ads_setup.c [new file with mode: 0644]
arch/ppc/platforms/mpc866ads_setup.c [new file with mode: 0644]
arch/ppc/platforms/mpc885ads_setup.c [new file with mode: 0644]
arch/ppc/platforms/mvme5100.c
arch/ppc/platforms/pal4.h
arch/ppc/platforms/pal4_pci.c
arch/ppc/platforms/pal4_serial.h
arch/ppc/platforms/pal4_setup.c
arch/ppc/platforms/powerpmc250.c
arch/ppc/platforms/pplus.c
arch/ppc/platforms/pplus.h
arch/ppc/platforms/pq2ads.c
arch/ppc/platforms/pq2ads.h
arch/ppc/platforms/pq2ads_pd.h [new file with mode: 0644]
arch/ppc/platforms/prep_setup.c
arch/ppc/platforms/prpmc750.c
arch/ppc/platforms/prpmc800.c
arch/ppc/platforms/radstone_ppc7d.c
arch/ppc/platforms/radstone_ppc7d.h
arch/ppc/platforms/sandpoint.c
arch/ppc/platforms/sandpoint.h
arch/ppc/platforms/sbc82xx.c
arch/ppc/platforms/spruce.c
arch/ppc/platforms/tqm8260_setup.c
arch/ppc/syslib/Makefile
arch/ppc/syslib/cpc700.h
arch/ppc/syslib/cpc700_pic.c
arch/ppc/syslib/cpc710.h
arch/ppc/syslib/gen550.h
arch/ppc/syslib/gen550_dbg.c
arch/ppc/syslib/gen550_kgdb.c
arch/ppc/syslib/gt64260_pic.c
arch/ppc/syslib/harrier.c
arch/ppc/syslib/hawk_common.c
arch/ppc/syslib/ibm440gp_common.c
arch/ppc/syslib/ibm440gp_common.h
arch/ppc/syslib/ibm440gx_common.c
arch/ppc/syslib/ibm440gx_common.h
arch/ppc/syslib/ibm440sp_common.c
arch/ppc/syslib/ibm440sp_common.h
arch/ppc/syslib/ibm44x_common.c
arch/ppc/syslib/ibm44x_common.h
arch/ppc/syslib/m8260_pci_erratum9.c
arch/ppc/syslib/m8260_setup.c
arch/ppc/syslib/m8xx_setup.c
arch/ppc/syslib/m8xx_wdt.c
arch/ppc/syslib/mpc10x_common.c
arch/ppc/syslib/mpc52xx_devices.c
arch/ppc/syslib/mpc52xx_pci.c
arch/ppc/syslib/mpc52xx_pci.h
arch/ppc/syslib/mpc52xx_pic.c
arch/ppc/syslib/mpc52xx_setup.c
arch/ppc/syslib/mpc52xx_sys.c
arch/ppc/syslib/mpc83xx_devices.c
arch/ppc/syslib/mpc83xx_sys.c
arch/ppc/syslib/mpc85xx_devices.c
arch/ppc/syslib/mpc85xx_sys.c
arch/ppc/syslib/mpc8xx_devices.c
arch/ppc/syslib/mpc8xx_sys.c
arch/ppc/syslib/mv64360_pic.c
arch/ppc/syslib/mv64x60.c
arch/ppc/syslib/mv64x60_dbg.c
arch/ppc/syslib/mv64x60_win.c
arch/ppc/syslib/ocp.c
arch/ppc/syslib/open_pic.c
arch/ppc/syslib/open_pic2.c
arch/ppc/syslib/open_pic_defs.h
arch/ppc/syslib/pci_auto.c
arch/ppc/syslib/ppc4xx_dma.c
arch/ppc/syslib/ppc4xx_pic.c
arch/ppc/syslib/ppc4xx_pm.c [deleted file]
arch/ppc/syslib/ppc4xx_sgdma.c
arch/ppc/syslib/ppc83xx_setup.c
arch/ppc/syslib/ppc83xx_setup.h
arch/ppc/syslib/ppc85xx_common.c
arch/ppc/syslib/ppc85xx_common.h
arch/ppc/syslib/ppc85xx_setup.c
arch/ppc/syslib/ppc85xx_setup.h
arch/ppc/syslib/ppc_sys.c
arch/ppc/syslib/pq2_devices.c
arch/ppc/syslib/pq2_sys.c
arch/ppc/syslib/prep_nvram.c
arch/ppc/syslib/todc_time.c
arch/ppc/syslib/xilinx_pic.c
drivers/char/Kconfig
drivers/char/hvcs.c
drivers/macintosh/macio_asic.c
drivers/macintosh/smu.c
drivers/macintosh/therm_pm72.c
drivers/macintosh/via-pmu.c
drivers/macintosh/windfarm_lm75_sensor.c
drivers/macintosh/windfarm_max6690_sensor.c
drivers/macintosh/windfarm_smu_sat.c
drivers/net/Kconfig
include/asm-powerpc/atomic.h
include/asm-powerpc/cputable.h
include/asm-powerpc/cputime.h
include/asm-powerpc/firmware.h
include/asm-powerpc/irq.h
include/asm-powerpc/iseries/mf.h
include/asm-powerpc/lmb.h
include/asm-powerpc/mmu.h
include/asm-powerpc/paca.h
include/asm-powerpc/pgtable-4k.h
include/asm-powerpc/pgtable.h
include/asm-powerpc/ppc_asm.h
include/asm-powerpc/processor.h
include/asm-powerpc/prom.h
include/asm-powerpc/rwsem.h
include/asm-powerpc/synch.h
include/asm-powerpc/system.h
include/asm-powerpc/time.h
include/asm-ppc/harrier.h
include/asm-ppc/ibm44x.h
include/asm-ppc/ibm4xx.h
include/asm-ppc/io.h
include/asm-ppc/mpc10x.h
include/asm-ppc/mpc52xx.h
include/asm-ppc/mpc8260.h
include/asm-ppc/mpc83xx.h
include/asm-ppc/mpc85xx.h
include/asm-ppc/mpc8xx.h
include/asm-ppc/pgtable.h
include/asm-ppc/ppc_sys.h
include/asm-ppc/time.h
include/asm-ppc/todc.h
include/asm-ppc/xparameters.h [deleted file]
kernel/auditsc.c
lib/extable.c

index d02c64953dcdb63443a653cdf79691823368f694..ee551c6ea235a6f63f2df48bf35e9cb97a49a5a9 100644 (file)
@@ -1365,6 +1365,78 @@ platforms are moved over to use the flattened-device-tree model.
        };
 
 
+   g) Freescale SOC SEC Security Engines
+
+   Required properties:
+
+    - device_type : Should be "crypto"
+    - model : Model of the device.  Should be "SEC1" or "SEC2"
+    - compatible : Should be "talitos"
+    - reg : Offset and length of the register set for the device
+    - interrupts : <a b> where a is the interrupt number and b is a
+      field that represents an encoding of the sense and level
+      information for the interrupt.  This should be encoded based on
+      the information in section 2) depending on the type of interrupt
+      controller you have.
+    - interrupt-parent : the phandle for the interrupt controller that
+      services interrupts for this device.
+    - num-channels : An integer representing the number of channels
+      available.
+    - channel-fifo-len : An integer representing the number of
+      descriptor pointers each channel fetch fifo can hold.
+    - exec-units-mask : The bitmask representing what execution units
+      (EUs) are available. It's a single 32 bit cell. EU information
+      should be encoded following the SEC's Descriptor Header Dword
+      EU_SEL0 field documentation, i.e. as follows:
+
+        bit 0 = reserved - should be 0
+        bit 1 = set if SEC has the ARC4 EU (AFEU)
+        bit 2 = set if SEC has the DES/3DES EU (DEU)
+        bit 3 = set if SEC has the message digest EU (MDEU)
+        bit 4 = set if SEC has the random number generator EU (RNG)
+        bit 5 = set if SEC has the public key EU (PKEU)
+        bit 6 = set if SEC has the AES EU (AESU)
+        bit 7 = set if SEC has the Kasumi EU (KEU)
+
+      bits 8 through 31 are reserved for future SEC EUs.
+
+    - descriptor-types-mask : The bitmask representing what descriptors
+      are available. It's a single 32 bit cell. Descriptor type
+      information should be encoded following the SEC's Descriptor
+      Header Dword DESC_TYPE field documentation, i.e. as follows:
+
+        bit 0  = set if SEC supports the aesu_ctr_nonsnoop desc. type
+        bit 1  = set if SEC supports the ipsec_esp descriptor type
+        bit 2  = set if SEC supports the common_nonsnoop desc. type
+        bit 3  = set if SEC supports the 802.11i AES ccmp desc. type
+        bit 4  = set if SEC supports the hmac_snoop_no_afeu desc. type
+        bit 5  = set if SEC supports the srtp descriptor type
+        bit 6  = set if SEC supports the non_hmac_snoop_no_afeu desc.type
+        bit 7  = set if SEC supports the pkeu_assemble descriptor type
+        bit 8  = set if SEC supports the aesu_key_expand_output desc.type
+        bit 9  = set if SEC supports the pkeu_ptmul descriptor type
+        bit 10 = set if SEC supports the common_nonsnoop_afeu desc. type
+        bit 11 = set if SEC supports the pkeu_ptadd_dbl descriptor type
+
+      ..and so on and so forth.
+
+   Example:
+
+       /* MPC8548E */
+       crypto@30000 {
+               device_type = "crypto";
+               model = "SEC2";
+               compatible = "talitos";
+               reg = <30000 10000>;
+               interrupts = <1d 3>;
+               interrupt-parent = <40000>;
+               num-channels = <4>;
+               channel-fifo-len = <24>;
+               exec-units-mask = <000000fe>;
+               descriptor-types-mask = <073f1127>;
+       };
+
+
    More devices will be defined as this spec matures.
 
 
index 67a11a36270ca05c8761e3b339577fe364dda085..3764dd4b12cbac8f1d5a224faca4f2f5894ed889 100644 (file)
@@ -121,7 +121,7 @@ accomplished.
 
 EEH must be enabled in the PHB's very early during the boot process,
 and if a PCI slot is hot-plugged. The former is performed by
-eeh_init() in arch/ppc64/kernel/eeh.c, and the later by
+eeh_init() in arch/powerpc/platforms/pseries/eeh.c, and the later by
 drivers/pci/hotplug/pSeries_pci.c calling in to the eeh.c code.
 EEH must be enabled before a PCI scan of the device can proceed.
 Current Power5 hardware will not work unless EEH is enabled;
@@ -133,7 +133,7 @@ error.  Given an arbitrary address, the routine
 pci_get_device_by_addr() will find the pci device associated
 with that address (if any).
 
-The default include/asm-ppc64/io.h macros readb(), inb(), insb(),
+The default include/asm-powerpc/io.h macros readb(), inb(), insb(),
 etc. include a check to see if the i/o read returned all-0xff's.
 If so, these make a call to eeh_dn_check_failure(), which in turn
 asks the firmware if the all-ff's value is the sign of a true EEH
@@ -143,11 +143,12 @@ seen in /proc/ppc64/eeh (subject to change).  Normally, almost
 all of these occur during boot, when the PCI bus is scanned, where
 a large number of 0xff reads are part of the bus scan procedure.
 
-If a frozen slot is detected, code in arch/ppc64/kernel/eeh.c will
-print a stack trace to syslog (/var/log/messages).  This stack trace
-has proven to be very useful to device-driver authors for finding
-out at what point the EEH error was detected, as the error itself
-usually occurs slightly beforehand.
+If a frozen slot is detected, code in 
+arch/powerpc/platforms/pseries/eeh.c will print a stack trace to 
+syslog (/var/log/messages).  This stack trace has proven to be very 
+useful to device-driver authors for finding out at what point the EEH 
+error was detected, as the error itself usually occurs slightly 
+beforehand.
 
 Next, it uses the Linux kernel notifier chain/work queue mechanism to
 allow any interested parties to find out about the failure.  Device
index dca75cbda6f8abc144afb9efcdea77b7b5f21eac..1e38166f4e54b1d83cf5cb86c68394826c2e5fa9 100644 (file)
@@ -558,9 +558,9 @@ partitions.
 
 The proper channel for reporting bugs is either through the Linux OS
 distribution company that provided your OS or by posting issues to the
-ppc64 development mailing list at:
+PowerPC development mailing list at:
 
-linuxppc64-dev@lists.linuxppc.org
+linuxppc-dev@ozlabs.org
 
 This request is to provide a documented and searchable public exchange
 of the problems and solutions surrounding this driver for the benefit of
index dd1351dc32b895b5298fabe7c0c37062af9489c4..bfd7fbfe90ab4642e6913e261c34aa57dbf8c76b 100644 (file)
@@ -534,7 +534,7 @@ S:   Supported
 BROADBAND PROCESSOR ARCHITECTURE
 P:     Arnd Bergmann
 M:     arnd@arndb.de
-L:     linuxppc64-dev@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 W:     http://linuxppc64.org
 S:     Supported
 
@@ -1624,7 +1624,7 @@ P:        Anton Blanchard
 M:     anton@samba.org
 M:     anton@au.ibm.com
 W:     http://linuxppc64.org
-L:     linuxppc64-dev@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 S:     Supported
 
 LINUX SECURITY MODULE (LSM) FRAMEWORK
index dfba81719dec066b66078a37e48878622cb025fd..fae42da7468d0b82b1c6f3ab911d3ec3e05c1414 100644 (file)
@@ -127,6 +127,12 @@ config PPC_83xx
        select 83xx
        select PPC_FPU
 
+config PPC_85xx
+       bool "Freescale 85xx"
+       select E500
+       select FSL_SOC
+       select 85xx
+
 config 40x
        bool "AMCC 40x"
 
@@ -139,8 +145,6 @@ config 8xx
 config E200
        bool "Freescale e200"
 
-config E500
-       bool "Freescale e500"
 endchoice
 
 config POWER4_ONLY
@@ -168,6 +172,13 @@ config 6xx
 config 83xx
        bool
 
+# this is temp to handle compat with arch=ppc
+config 85xx
+       bool
+
+config E500
+       bool
+
 config PPC_FPU
        bool
        default y if PPC64
@@ -217,6 +228,7 @@ config ALTIVEC
 config SPE
        bool "SPE Support"
        depends on E200 || E500
+       default y
        ---help---
          This option enables kernel support for the Signal Processing
          Extensions (SPE) to the PowerPC processor. The kernel currently
@@ -238,6 +250,21 @@ config PPC_STD_MMU_32
        def_bool y
        depends on PPC_STD_MMU && PPC32
 
+config VIRT_CPU_ACCOUNTING
+       bool "Deterministic task and CPU time accounting"
+       depends on PPC64
+       default y
+       help
+         Select this option to enable more accurate task and CPU time
+         accounting.  This is done by reading a CPU counter on each
+         kernel entry and exit and on transitions within the kernel
+         between system, softirq and hardirq state, so there is a
+         small performance impact.  This also enables accounting of
+         stolen time on logically-partitioned systems running on
+         IBM POWER5-based machines.
+
+         If in doubt, say Y here.
+
 config SMP
        depends on PPC_STD_MMU
        bool "Symmetric multi-processing support"
@@ -734,13 +761,12 @@ config GENERIC_ISA_DMA
 
 config PPC_I8259
        bool
-       default y if 85xx
        default n
 
 config PPC_INDIRECT_PCI
        bool
        depends on PCI
-       default y if 40x || 44x || 85xx
+       default y if 40x || 44x
        default n
 
 config EISA
@@ -757,8 +783,8 @@ config MCA
        bool
 
 config PCI
-       bool "PCI support" if 40x || CPM2 || PPC_83xx || 85xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES)
-       default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !85xx
+       bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_MPC52xx || (EMBEDDED && PPC_ISERIES)
+       default y if !40x && !CPM2 && !8xx && !APUS && !PPC_83xx && !PPC_85xx
        default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
        default PCI_QSPAN if !4xx && !CPM2 && 8xx
        help
index 5500ab55d042840db244abf496d7b66a7087f825..a3fc7a23158fadac51e13609e5c3c232e02d5ed8 100644 (file)
@@ -148,7 +148,7 @@ all: $(KBUILD_IMAGE)
 
 CPPFLAGS_vmlinux.lds   := -Upowerpc
 
-BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage
+BOOT_TARGETS = zImage zImage.initrd znetboot znetboot.initrd vmlinux.sm uImage vmlinux.bin
 
 .PHONY: $(BOOT_TARGETS)
 
index eacce9590816db61686cd20f3ef5d4f23a2c2cfb..b002bfd56786bd4d174e38f62a9d8cd59bd5f2c0 100644 (file)
@@ -1,7 +1,5 @@
 #!/bin/sh
 #
-# arch/ppc64/boot/install.sh
-#
 # This file is subject to the terms and conditions of the GNU General Public
 # License.  See the file "COPYING" in the main directory of this archive
 # for more details.
index 55ec5986725079c24c56bef079c5f822700b9f0b..816446f0e497a64dda37c15f27ce0b6e4560a698 100644 (file)
@@ -152,7 +152,7 @@ static int is_elf64(void *hdr)
        elf64ph = (Elf64_Phdr *)((unsigned long)elf64 +
                                 (unsigned long)elf64->e_phoff);
        for (i = 0; i < (unsigned int)elf64->e_phnum; i++, elf64ph++)
-               if (elf64ph->p_type == PT_LOAD && elf64ph->p_offset != 0)
+               if (elf64ph->p_type == PT_LOAD)
                        break;
        if (i >= (unsigned int)elf64->e_phnum)
                return 0;
@@ -193,7 +193,7 @@ static int is_elf32(void *hdr)
        elf32 = (Elf32_Ehdr *)elfheader;
        elf32ph = (Elf32_Phdr *) ((unsigned long)elf32 + elf32->e_phoff);
        for (i = 0; i < elf32->e_phnum; i++, elf32ph++)
-               if (elf32ph->p_type == PT_LOAD && elf32ph->p_offset != 0)
+               if (elf32ph->p_type == PT_LOAD)
                        break;
        if (i >= elf32->e_phnum)
                return 0;
diff --git a/arch/powerpc/configs/mpc8540_ads_defconfig b/arch/powerpc/configs/mpc8540_ads_defconfig
new file mode 100644 (file)
index 0000000..2a8290e
--- /dev/null
@@ -0,0 +1,721 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 
+# Sat Jan 14 15:57:54 2006
+#
+# CONFIG_PPC64 is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_52xx is not set
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+CONFIG_PPC_85xx=y
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_8xx is not set
+# CONFIG_E200 is not set
+CONFIG_85xx=y
+CONFIG_E500=y
+CONFIG_BOOKE=y
+CONFIG_FSL_BOOKE=y
+# CONFIG_PHYS_64BIT is not set
+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
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+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
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_MPIC=y
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Platform support
+#
+CONFIG_MPC8540_ADS=y
+CONFIG_MPC8540=y
+CONFIG_PPC_INDIRECT_PCI_BE=y
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_MISC=y
+CONFIG_MATH_EMULATION=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+# CONFIG_SOFTWARE_SUSPEND is not set
+# CONFIG_SECCOMP is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_BOOT_LOAD=0x00800000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE is not set
+# CONFIG_ARPD is not set
+CONFIG_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
+# CONFIG_IPV6 is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# 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
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=32768
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+# CONFIG_WINDFARM is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# PHY device support
+#
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_GIANFAR=y
+CONFIG_GFAR_NAPI=y
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_AGP is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# InfiniBand support
+#
+
+#
+# SN Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+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
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+# CONFIG_MSDOS_PARTITION is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_BOOTX_TEXT is not set
+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS is not set
+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Hardware crypto devices
+#
index c9a660e4c2db24d4dd03c46b9ecf0065e405e027..882889b15926780f6eeff803a8029ad38248127c 100644 (file)
@@ -136,6 +136,9 @@ int main(void)
        DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp));
        DEFINE(PACALPPACAPTR, offsetof(struct paca_struct, lppaca_ptr));
        DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id));
+       DEFINE(PACA_STARTPURR, offsetof(struct paca_struct, startpurr));
+       DEFINE(PACA_USER_TIME, offsetof(struct paca_struct, user_time));
+       DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
 
        DEFINE(LPPACASRR0, offsetof(struct lppaca, saved_srr0));
        DEFINE(LPPACASRR1, offsetof(struct lppaca, saved_srr1));
index e4e81374cb9a48011191a85cc75995430e64817f..39e348a3ade2451cdeb01663b81eaec332c80850 100644 (file)
@@ -894,7 +894,7 @@ struct cpu_spec     cpu_specs[] = {
                .platform               = "ppc405",
        },
        {       /* Xilinx Virtex-II Pro  */
-               .pvr_mask               = 0xffff0000,
+               .pvr_mask               = 0xfffff000,
                .pvr_value              = 0x20010000,
                .cpu_name               = "Virtex-II Pro",
                .cpu_features           = CPU_FTRS_40X,
@@ -904,6 +904,16 @@ struct cpu_spec    cpu_specs[] = {
                .dcache_bsize           = 32,
                .platform               = "ppc405",
        },
+       {       /* Xilinx Virtex-4 FX */
+               .pvr_mask               = 0xfffff000,
+               .pvr_value              = 0x20011000,
+               .cpu_name               = "Virtex-4 FX",
+               .cpu_features           = CPU_FTRS_40X,
+               .cpu_user_features      = PPC_FEATURE_32 |
+                       PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+       },
        {       /* 405EP */
                .pvr_mask               = 0xffff0000,
                .pvr_value              = 0x51210000,
index 24be0cf86d7f75635de6cd81047f06ca832e5c6c..1060155d84c3f3aa035fad42097f49ca37d7c100 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc64/kernel/entry.S
- *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
  *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
@@ -63,6 +61,7 @@ system_call_common:
        std     r12,_MSR(r1)
        std     r0,GPR0(r1)
        std     r10,GPR1(r1)
+       ACCOUNT_CPU_USER_ENTRY(r10, r11)
        std     r2,GPR2(r1)
        std     r3,GPR3(r1)
        std     r4,GPR4(r1)
@@ -170,8 +169,9 @@ syscall_error_cont:
        stdcx.  r0,0,r1                 /* to clear the reservation */
        andi.   r6,r8,MSR_PR
        ld      r4,_LINK(r1)
-       beq-    1f                      /* only restore r13 if */
-       ld      r13,GPR13(r1)           /* returning to usermode */
+       beq-    1f
+       ACCOUNT_CPU_USER_EXIT(r11, r12)
+       ld      r13,GPR13(r1)   /* only restore r13 if returning to usermode */
 1:     ld      r2,GPR2(r1)
        li      r12,MSR_RI
        andc    r11,r10,r12
@@ -322,7 +322,7 @@ _GLOBAL(ret_from_fork)
  * the fork code also.
  *
  * The code which creates the new task context is in 'copy_thread'
- * in arch/ppc64/kernel/process.c
+ * in arch/powerpc/kernel/process.c 
  */
        .align  7
 _GLOBAL(_switch)
@@ -486,6 +486,7 @@ restore:
         * userspace
         */
        beq     1f
+       ACCOUNT_CPU_USER_EXIT(r3, r4)
        REST_GPR(13, r1)
 1:
        ld      r3,_CTR(r1)
index 65eae752a527ca9a3346c78826ffa7d15949b002..4d37a3cb80f64c786ac0cbf21f27f1318c1821c0 100644 (file)
 #include <asm/firmware.h>
 
 unsigned long ppc64_firmware_features;
-
-#ifdef CONFIG_PPC_PSERIES
-firmware_feature_t firmware_features_table[FIRMWARE_MAX_FEATURES] = {
-       {FW_FEATURE_PFT,                "hcall-pft"},
-       {FW_FEATURE_TCE,                "hcall-tce"},
-       {FW_FEATURE_SPRG0,              "hcall-sprg0"},
-       {FW_FEATURE_DABR,               "hcall-dabr"},
-       {FW_FEATURE_COPY,               "hcall-copy"},
-       {FW_FEATURE_ASR,                "hcall-asr"},
-       {FW_FEATURE_DEBUG,              "hcall-debug"},
-       {FW_FEATURE_PERF,               "hcall-perf"},
-       {FW_FEATURE_DUMP,               "hcall-dump"},
-       {FW_FEATURE_INTERRUPT,          "hcall-interrupt"},
-       {FW_FEATURE_MIGRATE,            "hcall-migrate"},
-       {FW_FEATURE_PERFMON,            "hcall-perfmon"},
-       {FW_FEATURE_CRQ,                "hcall-crq"},
-       {FW_FEATURE_VIO,                "hcall-vio"},
-       {FW_FEATURE_RDMA,               "hcall-rdma"},
-       {FW_FEATURE_LLAN,               "hcall-lLAN"},
-       {FW_FEATURE_BULK,               "hcall-bulk"},
-       {FW_FEATURE_XDABR,              "hcall-xdabr"},
-       {FW_FEATURE_MULTITCE,           "hcall-multi-tce"},
-       {FW_FEATURE_SPLPAR,             "hcall-splpar"},
-};
-#endif
index 8b49679fad549f7810a597f34857576d98d82bca..47c7fa148c9a999dfbe38f8a1c62eb12e2236b5c 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc/kernel/head_44x.S
- *
  * Kernel execution entry point code.
  *
  *    Copyright (c) 1995-1996 Gary Thomas <gdt@linuxppc.org>
index 9b65029dd2a32a4ea0ac17facfcbfda7eb8987d3..35084f3a841b91fbf49a12ac3167d93d8fe690a6 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc64/kernel/head.S
- *
  *  PowerPC version
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
  *
@@ -279,6 +277,7 @@ exception_marker:
        std     r10,0(r1);              /* make stack chain pointer     */ \
        std     r0,GPR0(r1);            /* save r0 in stackframe        */ \
        std     r10,GPR1(r1);           /* save r1 in stackframe        */ \
+       ACCOUNT_CPU_USER_ENTRY(r9, r10);                                   \
        std     r2,GPR2(r1);            /* save r2 in stackframe        */ \
        SAVE_4GPRS(3, r1);              /* save r3 - r6 in stackframe   */ \
        SAVE_2GPRS(7, r1);              /* save r7, r8 in stackframe    */ \
@@ -846,6 +845,14 @@ fast_exception_return:
        ld      r11,_NIP(r1)
        andi.   r3,r12,MSR_RI           /* check if RI is set */
        beq-    unrecov_fer
+
+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
+       andi.   r3,r12,MSR_PR
+       beq     2f
+       ACCOUNT_CPU_USER_EXIT(r3, r4)
+2:
+#endif
+
        ld      r3,_CCR(r1)
        ld      r4,_LINK(r1)
        ld      r5,_CTR(r1)
index bc6d1ac55235aa80ecedcf8f70eb5cec8b213f24..28941f5ce6732cf91e28d2b40ba52133f34d0dc5 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/kernel/except_8xx.S
- *
  *  PowerPC version
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
  *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h
new file mode 100644 (file)
index 0000000..8536e76
--- /dev/null
@@ -0,0 +1,363 @@
+#ifndef __HEAD_BOOKE_H__
+#define __HEAD_BOOKE_H__
+
+/*
+ * Macros used for common Book-e exception handling
+ */
+
+#define SET_IVOR(vector_number, vector_label)          \
+               li      r26,vector_label@l;             \
+               mtspr   SPRN_IVOR##vector_number,r26;   \
+               sync
+
+#define NORMAL_EXCEPTION_PROLOG                                                     \
+       mtspr   SPRN_SPRG0,r10;         /* save two registers to work with */\
+       mtspr   SPRN_SPRG1,r11;                                              \
+       mtspr   SPRN_SPRG4W,r1;                                              \
+       mfcr    r10;                    /* save CR in r10 for now          */\
+       mfspr   r11,SPRN_SRR1;          /* check whether user or kernel    */\
+       andi.   r11,r11,MSR_PR;                                              \
+       beq     1f;                                                          \
+       mfspr   r1,SPRN_SPRG3;          /* if from user, start at top of   */\
+       lwz     r1,THREAD_INFO-THREAD(r1); /* this thread's kernel stack   */\
+       addi    r1,r1,THREAD_SIZE;                                           \
+1:     subi    r1,r1,INT_FRAME_SIZE;   /* Allocate an exception frame     */\
+       mr      r11,r1;                                                      \
+       stw     r10,_CCR(r11);          /* save various registers          */\
+       stw     r12,GPR12(r11);                                              \
+       stw     r9,GPR9(r11);                                                \
+       mfspr   r10,SPRN_SPRG0;                                              \
+       stw     r10,GPR10(r11);                                              \
+       mfspr   r12,SPRN_SPRG1;                                              \
+       stw     r12,GPR11(r11);                                              \
+       mflr    r10;                                                         \
+       stw     r10,_LINK(r11);                                              \
+       mfspr   r10,SPRN_SPRG4R;                                             \
+       mfspr   r12,SPRN_SRR0;                                               \
+       stw     r10,GPR1(r11);                                               \
+       mfspr   r9,SPRN_SRR1;                                                \
+       stw     r10,0(r11);                                                  \
+       rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
+       stw     r0,GPR0(r11);                                                \
+       SAVE_4GPRS(3, r11);                                                  \
+       SAVE_2GPRS(7, r11)
+
+/* To handle the additional exception priority levels on 40x and Book-E
+ * processors we allocate a 4k stack per additional priority level. The various
+ * head_xxx.S files allocate space (exception_stack_top) for each priority's
+ * stack times the number of CPUs
+ *
+ * On 40x critical is the only additional level
+ * On 44x/e500 we have critical and machine check
+ * On e200 we have critical and debug (machine check occurs via critical)
+ *
+ * Additionally we reserve a SPRG for each priority level so we can free up a
+ * GPR to use as the base for indirect access to the exception stacks.  This
+ * is necessary since the MMU is always on, for Book-E parts, and the stacks
+ * are offset from KERNELBASE.
+ *
+ */
+#define BOOKE_EXCEPTION_STACK_SIZE     (8192)
+
+/* CRIT_SPRG only used in critical exception handling */
+#define CRIT_SPRG      SPRN_SPRG2
+/* MCHECK_SPRG only used in machine check exception handling */
+#define MCHECK_SPRG    SPRN_SPRG6W
+
+#define MCHECK_STACK_TOP       (exception_stack_top - 4096)
+#define CRIT_STACK_TOP         (exception_stack_top)
+
+/* only on e200 for now */
+#define DEBUG_STACK_TOP                (exception_stack_top - 4096)
+#define DEBUG_SPRG             SPRN_SPRG6W
+
+#ifdef CONFIG_SMP
+#define BOOKE_LOAD_EXC_LEVEL_STACK(level)              \
+       mfspr   r8,SPRN_PIR;                            \
+       mulli   r8,r8,BOOKE_EXCEPTION_STACK_SIZE;       \
+       neg     r8,r8;                                  \
+       addis   r8,r8,level##_STACK_TOP@ha;             \
+       addi    r8,r8,level##_STACK_TOP@l
+#else
+#define BOOKE_LOAD_EXC_LEVEL_STACK(level)              \
+       lis     r8,level##_STACK_TOP@h;                 \
+       ori     r8,r8,level##_STACK_TOP@l
+#endif
+
+/*
+ * Exception prolog for critical/machine check exceptions.  This is a
+ * little different from the normal exception prolog above since a
+ * critical/machine check exception can potentially occur at any point
+ * during normal exception processing. Thus we cannot use the same SPRG
+ * registers as the normal prolog above. Instead we use a portion of the
+ * critical/machine check exception stack at low physical addresses.
+ */
+#define EXC_LEVEL_EXCEPTION_PROLOG(exc_level, exc_level_srr0, exc_level_srr1) \
+       mtspr   exc_level##_SPRG,r8;                                         \
+       BOOKE_LOAD_EXC_LEVEL_STACK(exc_level);/* r8 points to the exc_level stack*/ \
+       stw     r10,GPR10-INT_FRAME_SIZE(r8);                                \
+       stw     r11,GPR11-INT_FRAME_SIZE(r8);                                \
+       mfcr    r10;                    /* save CR in r10 for now          */\
+       mfspr   r11,exc_level_srr1;     /* check whether user or kernel    */\
+       andi.   r11,r11,MSR_PR;                                              \
+       mr      r11,r8;                                                      \
+       mfspr   r8,exc_level##_SPRG;                                         \
+       beq     1f;                                                          \
+       /* COMING FROM USER MODE */                                          \
+       mfspr   r11,SPRN_SPRG3;         /* if from user, start at top of   */\
+       lwz     r11,THREAD_INFO-THREAD(r11); /* this thread's kernel stack */\
+       addi    r11,r11,THREAD_SIZE;                                         \
+1:     subi    r11,r11,INT_FRAME_SIZE; /* Allocate an exception frame     */\
+       stw     r10,_CCR(r11);          /* save various registers          */\
+       stw     r12,GPR12(r11);                                              \
+       stw     r9,GPR9(r11);                                                \
+       mflr    r10;                                                         \
+       stw     r10,_LINK(r11);                                              \
+       mfspr   r12,SPRN_DEAR;          /* save DEAR and ESR in the frame  */\
+       stw     r12,_DEAR(r11);         /* since they may have had stuff   */\
+       mfspr   r9,SPRN_ESR;            /* in them at the point where the  */\
+       stw     r9,_ESR(r11);           /* exception was taken             */\
+       mfspr   r12,exc_level_srr0;                                          \
+       stw     r1,GPR1(r11);                                                \
+       mfspr   r9,exc_level_srr1;                                           \
+       stw     r1,0(r11);                                                   \
+       mr      r1,r11;                                                      \
+       rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
+       stw     r0,GPR0(r11);                                                \
+       SAVE_4GPRS(3, r11);                                                  \
+       SAVE_2GPRS(7, r11)
+
+#define CRITICAL_EXCEPTION_PROLOG \
+               EXC_LEVEL_EXCEPTION_PROLOG(CRIT, SPRN_CSRR0, SPRN_CSRR1)
+#define DEBUG_EXCEPTION_PROLOG \
+               EXC_LEVEL_EXCEPTION_PROLOG(DEBUG, SPRN_DSRR0, SPRN_DSRR1)
+#define MCHECK_EXCEPTION_PROLOG \
+               EXC_LEVEL_EXCEPTION_PROLOG(MCHECK, SPRN_MCSRR0, SPRN_MCSRR1)
+
+/*
+ * Exception vectors.
+ */
+#define        START_EXCEPTION(label)                                               \
+        .align 5;                                                                   \
+label:
+
+#define FINISH_EXCEPTION(func)                                 \
+       bl      transfer_to_handler_full;                       \
+       .long   func;                                           \
+       .long   ret_from_except_full
+
+#define EXCEPTION(n, label, hdlr, xfer)                                \
+       START_EXCEPTION(label);                                 \
+       NORMAL_EXCEPTION_PROLOG;                                \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       xfer(n, hdlr)
+
+#define CRITICAL_EXCEPTION(n, label, hdlr)                     \
+       START_EXCEPTION(label);                                 \
+       CRITICAL_EXCEPTION_PROLOG;                              \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
+                         NOCOPY, crit_transfer_to_handler, \
+                         ret_from_crit_exc)
+
+#define MCHECK_EXCEPTION(n, label, hdlr)                       \
+       START_EXCEPTION(label);                                 \
+       MCHECK_EXCEPTION_PROLOG;                                \
+       mfspr   r5,SPRN_ESR;                                    \
+       stw     r5,_ESR(r11);                                   \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
+                         NOCOPY, mcheck_transfer_to_handler,   \
+                         ret_from_mcheck_exc)
+
+#define EXC_XFER_TEMPLATE(hdlr, trap, msr, copyee, tfer, ret)  \
+       li      r10,trap;                                       \
+       stw     r10,_TRAP(r11);                                 \
+       lis     r10,msr@h;                                      \
+       ori     r10,r10,msr@l;                                  \
+       copyee(r10, r9);                                        \
+       bl      tfer;                                           \
+       .long   hdlr;                                           \
+       .long   ret
+
+#define COPY_EE(d, s)          rlwimi d,s,0,16,16
+#define NOCOPY(d, s)
+
+#define EXC_XFER_STD(n, hdlr)          \
+       EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, NOCOPY, transfer_to_handler_full, \
+                         ret_from_except_full)
+
+#define EXC_XFER_LITE(n, hdlr)         \
+       EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \
+                         ret_from_except)
+
+#define EXC_XFER_EE(n, hdlr)           \
+       EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \
+                         ret_from_except_full)
+
+#define EXC_XFER_EE_LITE(n, hdlr)      \
+       EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, COPY_EE, transfer_to_handler, \
+                         ret_from_except)
+
+/* Check for a single step debug exception while in an exception
+ * handler before state has been saved.  This is to catch the case
+ * where an instruction that we are trying to single step causes
+ * an exception (eg ITLB/DTLB miss) and thus the first instruction of
+ * the exception handler generates a single step debug exception.
+ *
+ * If we get a debug trap on the first instruction of an exception handler,
+ * we reset the MSR_DE in the _exception handler's_ MSR (the debug trap is
+ * a critical exception, so we are using SPRN_CSRR1 to manipulate the MSR).
+ * The exception handler was handling a non-critical interrupt, so it will
+ * save (and later restore) the MSR via SPRN_CSRR1, which will still have
+ * the MSR_DE bit set.
+ */
+#ifdef CONFIG_E200
+#define DEBUG_EXCEPTION                                                              \
+       START_EXCEPTION(Debug);                                               \
+       DEBUG_EXCEPTION_PROLOG;                                               \
+                                                                             \
+       /*                                                                    \
+        * If there is a single step or branch-taken exception in an          \
+        * exception entry sequence, it was probably meant to apply to        \
+        * the code where the exception occurred (since exception entry       \
+        * doesn't turn off DE automatically).  We simulate the effect        \
+        * of turning off DE on entry to an exception handler by turning      \
+        * off DE in the CSRR1 value and clearing the debug status.           \
+        */                                                                   \
+       mfspr   r10,SPRN_DBSR;          /* check single-step/branch taken */  \
+       andis.  r10,r10,DBSR_IC@h;                                            \
+       beq+    2f;                                                           \
+                                                                             \
+       lis     r10,KERNELBASE@h;       /* check if exception in vectors */   \
+       ori     r10,r10,KERNELBASE@l;                                         \
+       cmplw   r12,r10;                                                      \
+       blt+    2f;                     /* addr below exception vectors */    \
+                                                                             \
+       lis     r10,Debug@h;                                                  \
+       ori     r10,r10,Debug@l;                                              \
+       cmplw   r12,r10;                                                      \
+       bgt+    2f;                     /* addr above exception vectors */    \
+                                                                             \
+       /* here it looks like we got an inappropriate debug exception. */     \
+1:     rlwinm  r9,r9,0,~MSR_DE;        /* clear DE in the CDRR1 value */     \
+       lis     r10,DBSR_IC@h;          /* clear the IC event */              \
+       mtspr   SPRN_DBSR,r10;                                                \
+       /* restore state and get out */                                       \
+       lwz     r10,_CCR(r11);                                                \
+       lwz     r0,GPR0(r11);                                                 \
+       lwz     r1,GPR1(r11);                                                 \
+       mtcrf   0x80,r10;                                                     \
+       mtspr   SPRN_DSRR0,r12;                                               \
+       mtspr   SPRN_DSRR1,r9;                                                \
+       lwz     r9,GPR9(r11);                                                 \
+       lwz     r12,GPR12(r11);                                               \
+       mtspr   DEBUG_SPRG,r8;                                                \
+       BOOKE_LOAD_EXC_LEVEL_STACK(DEBUG); /* r8 points to the debug stack */ \
+       lwz     r10,GPR10-INT_FRAME_SIZE(r8);                                 \
+       lwz     r11,GPR11-INT_FRAME_SIZE(r8);                                 \
+       mfspr   r8,DEBUG_SPRG;                                                \
+                                                                             \
+       RFDI;                                                                 \
+       b       .;                                                            \
+                                                                             \
+       /* continue normal handling for a critical exception... */            \
+2:     mfspr   r4,SPRN_DBSR;                                                 \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                                   \
+       EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, debug_transfer_to_handler, ret_from_debug_exc)
+#else
+#define DEBUG_EXCEPTION                                                              \
+       START_EXCEPTION(Debug);                                               \
+       CRITICAL_EXCEPTION_PROLOG;                                            \
+                                                                             \
+       /*                                                                    \
+        * If there is a single step or branch-taken exception in an          \
+        * exception entry sequence, it was probably meant to apply to        \
+        * the code where the exception occurred (since exception entry       \
+        * doesn't turn off DE automatically).  We simulate the effect        \
+        * of turning off DE on entry to an exception handler by turning      \
+        * off DE in the CSRR1 value and clearing the debug status.           \
+        */                                                                   \
+       mfspr   r10,SPRN_DBSR;          /* check single-step/branch taken */  \
+       andis.  r10,r10,DBSR_IC@h;                                            \
+       beq+    2f;                                                           \
+                                                                             \
+       lis     r10,KERNELBASE@h;       /* check if exception in vectors */   \
+       ori     r10,r10,KERNELBASE@l;                                         \
+       cmplw   r12,r10;                                                      \
+       blt+    2f;                     /* addr below exception vectors */    \
+                                                                             \
+       lis     r10,Debug@h;                                                  \
+       ori     r10,r10,Debug@l;                                              \
+       cmplw   r12,r10;                                                      \
+       bgt+    2f;                     /* addr above exception vectors */    \
+                                                                             \
+       /* here it looks like we got an inappropriate debug exception. */     \
+1:     rlwinm  r9,r9,0,~MSR_DE;        /* clear DE in the CSRR1 value */     \
+       lis     r10,DBSR_IC@h;          /* clear the IC event */              \
+       mtspr   SPRN_DBSR,r10;                                                \
+       /* restore state and get out */                                       \
+       lwz     r10,_CCR(r11);                                                \
+       lwz     r0,GPR0(r11);                                                 \
+       lwz     r1,GPR1(r11);                                                 \
+       mtcrf   0x80,r10;                                                     \
+       mtspr   SPRN_CSRR0,r12;                                               \
+       mtspr   SPRN_CSRR1,r9;                                                \
+       lwz     r9,GPR9(r11);                                                 \
+       lwz     r12,GPR12(r11);                                               \
+       mtspr   CRIT_SPRG,r8;                                                 \
+       BOOKE_LOAD_EXC_LEVEL_STACK(CRIT); /* r8 points to the debug stack */  \
+       lwz     r10,GPR10-INT_FRAME_SIZE(r8);                                 \
+       lwz     r11,GPR11-INT_FRAME_SIZE(r8);                                 \
+       mfspr   r8,CRIT_SPRG;                                                 \
+                                                                             \
+       rfci;                                                                 \
+       b       .;                                                            \
+                                                                             \
+       /* continue normal handling for a critical exception... */            \
+2:     mfspr   r4,SPRN_DBSR;                                                 \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                                   \
+       EXC_XFER_TEMPLATE(DebugException, 0x2002, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), NOCOPY, crit_transfer_to_handler, ret_from_crit_exc)
+#endif
+
+#define INSTRUCTION_STORAGE_EXCEPTION                                        \
+       START_EXCEPTION(InstructionStorage)                                   \
+       NORMAL_EXCEPTION_PROLOG;                                              \
+       mfspr   r5,SPRN_ESR;            /* Grab the ESR and save it */        \
+       stw     r5,_ESR(r11);                                                 \
+       mr      r4,r12;                 /* Pass SRR0 as arg2 */               \
+       li      r5,0;                   /* Pass zero as arg3 */               \
+       EXC_XFER_EE_LITE(0x0400, handle_page_fault)
+
+#define ALIGNMENT_EXCEPTION                                                  \
+       START_EXCEPTION(Alignment)                                            \
+       NORMAL_EXCEPTION_PROLOG;                                              \
+       mfspr   r4,SPRN_DEAR;           /* Grab the DEAR and save it */       \
+       stw     r4,_DEAR(r11);                                                \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                                   \
+       EXC_XFER_EE(0x0600, alignment_exception)
+
+#define PROGRAM_EXCEPTION                                                    \
+       START_EXCEPTION(Program)                                              \
+       NORMAL_EXCEPTION_PROLOG;                                              \
+       mfspr   r4,SPRN_ESR;            /* Grab the ESR and save it */        \
+       stw     r4,_ESR(r11);                                                 \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                                   \
+       EXC_XFER_STD(0x0700, program_check_exception)
+
+#define DECREMENTER_EXCEPTION                                                \
+       START_EXCEPTION(Decrementer)                                          \
+       NORMAL_EXCEPTION_PROLOG;                                              \
+       lis     r0,TSR_DIS@h;           /* Setup the DEC interrupt mask */    \
+       mtspr   SPRN_TSR,r0;            /* Clear the DEC interrupt */         \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                                   \
+       EXC_XFER_LITE(0x0900, timer_interrupt)
+
+#define FP_UNAVAILABLE_EXCEPTION                                             \
+       START_EXCEPTION(FloatingPointUnavailable)                             \
+       NORMAL_EXCEPTION_PROLOG;                                              \
+       bne     load_up_fpu;            /* if from user, just load it up */   \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                                   \
+       EXC_XFER_EE_LITE(0x800, kernel_fp_unavailable_exception)
+
+#endif /* __HEAD_BOOKE_H__ */
index 8d60fa99fc4b992a402ec73dfa516b139f049d08..dd86bbed76271120c4f64ea39912e1e07d65a9e8 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc/kernel/head_fsl_booke.S
- *
  * Kernel execution entry point code.
  *
  *    Copyright (c) 1995-1996 Gary Thomas <gdt@linuxppc.org>
@@ -316,6 +314,7 @@ skpinv:     addi    r6,r6,1                         /* Increment */
         */
        lis     r2,DBCR0_IDM@h
        mtspr   SPRN_DBCR0,r2
+       isync
        /* clear any residual debug events */
        li      r2,-1
        mtspr   SPRN_DBSR,r2
@@ -1002,12 +1001,15 @@ _GLOBAL(giveup_fpu)
 _GLOBAL(abort)
        li      r13,0
         mtspr   SPRN_DBCR0,r13         /* disable all debug events */
+       isync
        mfmsr   r13
        ori     r13,r13,MSR_DE@l        /* Enable Debug Events */
        mtmsr   r13
+       isync
         mfspr   r13,SPRN_DBCR0
         lis    r13,(DBCR0_IDM|DBCR0_RST_CHIP)@h
         mtspr   SPRN_DBCR0,r13
+       isync
 
 _GLOBAL(set_context)
 
index 6160c8dbb7c50245a682f028514a6bb1a73b1f97..fd8214caedeedcdcfc4b44a660669ee2a9cda543 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/kernel/iomap.c
- *
  * ppc64 "iomap" interface implementation.
  *
  * (C) Copyright 2004 Linus Torvalds
index 946f3219fd29fc2b79c789cd423e9ecd129db154..d9a7fdef59b98234b3cbfddd378a84c12f9c7286 100644 (file)
@@ -1,5 +1,4 @@
 /*
- * arch/ppc64/kernel/iommu.c
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
  * 
  * Rewrite, cleanup, new allocation schemes, virtual merging: 
index d1fffce86df920799cad33996d51035b0bc3ebe0..24dc8117b822e5228098438711c2b1f6ae420025 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/kernel/irq.c
- *
  *  Derived from arch/i386/kernel/irq.c
  *    Copyright (C) 1992 Linus Torvalds
  *  Adapted from arch/i386 by Gary Thomas
@@ -371,6 +369,7 @@ unsigned int real_irq_to_virt_slowpath(unsigned int real_irq)
        return NO_IRQ;
 
 }
+#endif /* CONFIG_PPC64 */
 
 #ifdef CONFIG_IRQSTACKS
 struct thread_info *softirq_ctx[NR_CPUS];
@@ -394,10 +393,24 @@ void irq_ctx_init(void)
        }
 }
 
+static inline void do_softirq_onstack(void)
+{
+       struct thread_info *curtp, *irqtp;
+
+       curtp = current_thread_info();
+       irqtp = softirq_ctx[smp_processor_id()];
+       irqtp->task = curtp->task;
+       call_do_softirq(irqtp);
+       irqtp->task = NULL;
+}
+
+#else
+#define do_softirq_onstack()   __do_softirq()
+#endif /* CONFIG_IRQSTACKS */
+
 void do_softirq(void)
 {
        unsigned long flags;
-       struct thread_info *curtp, *irqtp;
 
        if (in_interrupt())
                return;
@@ -405,19 +418,18 @@ void do_softirq(void)
        local_irq_save(flags);
 
        if (local_softirq_pending()) {
-               curtp = current_thread_info();
-               irqtp = softirq_ctx[smp_processor_id()];
-               irqtp->task = curtp->task;
-               call_do_softirq(irqtp);
-               irqtp->task = NULL;
+               account_system_vtime(current);
+               local_bh_disable();
+               do_softirq_onstack();
+               account_system_vtime(current);
+               __local_bh_enable();
        }
 
        local_irq_restore(flags);
 }
 EXPORT_SYMBOL(do_softirq);
 
-#endif /* CONFIG_IRQSTACKS */
-
+#ifdef CONFIG_PPC64
 static int __init setup_noirqdistrib(char *str)
 {
        distribute_irqs = 0;
index cfab48566db1306c3e8f47b5034ca703a67f471b..258039fb301642d70057192f0ca443fbc9621e48 100644 (file)
@@ -1,6 +1,5 @@
 /*
  *  Kernel Probes (KProbes)
- *  arch/ppc64/kernel/kprobes.c
  *
  * 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
index 22d83d4d1af5f6ce33d3ba0b9cce8b26ed30b1e8..9feeeef5a87535a298b90e95f145b4664862277f 100644 (file)
@@ -147,15 +147,12 @@ postcore_initcall(of_bus_driver_init);
 
 int of_register_driver(struct of_platform_driver *drv)
 {
-       int count = 0;
-
        /* initialize common driver fields */
        drv->driver.name = drv->name;
        drv->driver.bus = &of_platform_bus_type;
 
        /* register with core */
-       count = driver_register(&drv->driver);
-       return count ? count : 1;
+       return driver_register(&drv->driver);
 }
 
 void of_unregister_driver(struct of_platform_driver *drv)
index bdf15dbbf4f0c4eb74f06e111b2da51dae5891b4..c336f3e31cff3d7579886aa5fbabe76b5fc482c0 100644 (file)
@@ -1,5 +1,4 @@
 /*
- * arch/ppc64/kernel/pci_iommu.c
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
  *
  * Rewrite, cleanup, new allocation schemes:
index 63ecbec05202c1170b1c7b9f0aecaa9189e3cd20..dfa5398ab3c8d68edfd2c65602f71d3858b161e8 100644 (file)
@@ -57,7 +57,6 @@ extern void machine_check_exception(struct pt_regs *regs);
 extern void alignment_exception(struct pt_regs *regs);
 extern void program_check_exception(struct pt_regs *regs);
 extern void single_step_exception(struct pt_regs *regs);
-extern int pmac_newworld;
 extern int sys_sigreturn(struct pt_regs *regs);
 
 EXPORT_SYMBOL(clear_pages);
index c225cf154bfeb0f415a4f46cd83cf169c0dfd184..1770a066c2176f71afa3e736904d8744bf0e0b84 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/kernel/process.c
- *
  *  Derived from "arch/i386/kernel/process.c"
  *    Copyright (C) 1995  Linus Torvalds
  *
@@ -47,9 +45,9 @@
 #include <asm/mmu.h>
 #include <asm/prom.h>
 #include <asm/machdep.h>
+#include <asm/time.h>
 #ifdef CONFIG_PPC64
 #include <asm/firmware.h>
-#include <asm/time.h>
 #endif
 
 extern unsigned long _get_SP(void);
@@ -330,6 +328,11 @@ struct task_struct *__switch_to(struct task_struct *prev,
 #endif
 
        local_irq_save(flags);
+
+       account_system_vtime(current);
+       account_process_vtime(current);
+       calculate_steal_time();
+
        last = _switch(old_thread, new_thread);
 
        local_irq_restore(flags);
index 6dbd21726770c2b02524126593cb8111f945c00c..d63cd562d9d5e0bbccbba98ac6fd118f8ff515f0 100644 (file)
@@ -829,10 +829,6 @@ void __init unflatten_device_tree(void)
 
        /* Allocate memory for the expanded device tree */
        mem = lmb_alloc(size + 4, __alignof__(struct device_node));
-       if (!mem) {
-               DBG("Couldn't allocate memory with lmb_alloc()!\n");
-               panic("Couldn't allocate memory with lmb_alloc()!\n");
-       }
        mem = (unsigned long) __va(mem);
 
        ((u32 *)mem)[size / 4] = 0xdeadbeef;
index 5ccbdbe0d5c96c9e063a99ccbf66e20ecb53f83e..c42a860c8d25fd9fda90122b8aa1dd32655136b7 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/arch/ppc64/kernel/ptrace-common.h
- *
  *    Copyright (c) 2002 Stephen Rothwell, IBM Coproration
  *    Extracted from ptrace.c and ptrace32.c
  *
index 7a95b8a283548cfca73e75f76ad74c1a77744ca4..1f03fb28cc0af580f8345fcdb80328df16389f77 100644 (file)
@@ -1,5 +1,4 @@
 /*
- *   arch/ppc64/kernel/rtas-proc.c
  *   Copyright (C) 2000 Tilmann Bitterberg
  *   (tilmann@bitterberg.de)
  *
index 7442775ef2a1dd864a01b515d79b611bd075fcaf..57b539a03fa963833661855b6c6b40b73c17d727 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/kernel/rtas_pci.c
- *
  * Copyright (C) 2001 Dave Engebretsen, IBM Corporation
  * Copyright (C) 2003 Anton Blanchard <anton@au.ibm.com>, IBM
  *
index f96c49b03ba05f9cf58afe80649bdafb5f129c5d..2f3fdad35594335818fc2842aac001506b26029f 100644 (file)
@@ -497,8 +497,6 @@ void __init setup_system(void)
 #endif
        printk("-----------------------------------------------------\n");
 
-       mm_init_ppc64();
-
        DBG(" <- setup_system()\n");
 }
 
index 4324f8a8ba247cf4e24f765d44d0217b28c175d4..47f910380a6a5960d267ce9f3f3041a283871e3c 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/arch/ppc64/kernel/signal.c
- *
  *  PowerPC version 
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
  *
index 13595a64f013a2c1b31f2ce0d7cf86be2b1c3ae9..805eaedbc3084e3ea1c22d594705c6acb24fb514 100644 (file)
@@ -541,7 +541,7 @@ int __devinit start_secondary(void *unused)
                smp_ops->take_timebase();
 
        if (system_state > SYSTEM_BOOTING)
-               per_cpu(last_jiffy, cpu) = get_tb();
+               snapshot_timebase();
 
        spin_lock(&call_lock);
        cpu_set(cpu, cpu_online_map);
@@ -573,6 +573,8 @@ void __init smp_cpus_done(unsigned int max_cpus)
 
        set_cpus_allowed(current, old_mask);
 
+       snapshot_timebases();
+
        dump_numa_cpu_topology();
 }
 
index 86f7e3d154d8a11065e16064d4dc083fa99d115c..4a27218a086cb018bd5a6c31d8cfdf96b5434c98 100644 (file)
@@ -51,6 +51,7 @@
 #include <linux/percpu.h>
 #include <linux/rtc.h>
 #include <linux/jiffies.h>
+#include <linux/posix-timers.h>
 
 #include <asm/io.h>
 #include <asm/processor.h>
@@ -98,6 +99,7 @@ unsigned long tb_ticks_per_jiffy;
 unsigned long tb_ticks_per_usec = 100; /* sane default */
 EXPORT_SYMBOL(tb_ticks_per_usec);
 unsigned long tb_ticks_per_sec;
+EXPORT_SYMBOL(tb_ticks_per_sec);       /* for cputime_t conversions */
 u64 tb_to_xs;
 unsigned tb_to_us;
 
@@ -135,6 +137,224 @@ unsigned long tb_last_stamp;
  */
 DEFINE_PER_CPU(unsigned long, last_jiffy);
 
+#ifdef CONFIG_VIRT_CPU_ACCOUNTING
+/*
+ * Factors for converting from cputime_t (timebase ticks) to
+ * jiffies, milliseconds, seconds, and clock_t (1/USER_HZ seconds).
+ * These are all stored as 0.64 fixed-point binary fractions.
+ */
+u64 __cputime_jiffies_factor;
+EXPORT_SYMBOL(__cputime_jiffies_factor);
+u64 __cputime_msec_factor;
+EXPORT_SYMBOL(__cputime_msec_factor);
+u64 __cputime_sec_factor;
+EXPORT_SYMBOL(__cputime_sec_factor);
+u64 __cputime_clockt_factor;
+EXPORT_SYMBOL(__cputime_clockt_factor);
+
+static void calc_cputime_factors(void)
+{
+       struct div_result res;
+
+       div128_by_32(HZ, 0, tb_ticks_per_sec, &res);
+       __cputime_jiffies_factor = res.result_low;
+       div128_by_32(1000, 0, tb_ticks_per_sec, &res);
+       __cputime_msec_factor = res.result_low;
+       div128_by_32(1, 0, tb_ticks_per_sec, &res);
+       __cputime_sec_factor = res.result_low;
+       div128_by_32(USER_HZ, 0, tb_ticks_per_sec, &res);
+       __cputime_clockt_factor = res.result_low;
+}
+
+/*
+ * Read the PURR on systems that have it, otherwise the timebase.
+ */
+static u64 read_purr(void)
+{
+       if (cpu_has_feature(CPU_FTR_PURR))
+               return mfspr(SPRN_PURR);
+       return mftb();
+}
+
+/*
+ * Account time for a transition between system, hard irq
+ * or soft irq state.
+ */
+void account_system_vtime(struct task_struct *tsk)
+{
+       u64 now, delta;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       now = read_purr();
+       delta = now - get_paca()->startpurr;
+       get_paca()->startpurr = now;
+       if (!in_interrupt()) {
+               delta += get_paca()->system_time;
+               get_paca()->system_time = 0;
+       }
+       account_system_time(tsk, 0, delta);
+       local_irq_restore(flags);
+}
+
+/*
+ * Transfer the user and system times accumulated in the paca
+ * by the exception entry and exit code to the generic process
+ * user and system time records.
+ * Must be called with interrupts disabled.
+ */
+void account_process_vtime(struct task_struct *tsk)
+{
+       cputime_t utime;
+
+       utime = get_paca()->user_time;
+       get_paca()->user_time = 0;
+       account_user_time(tsk, utime);
+}
+
+static void account_process_time(struct pt_regs *regs)
+{
+       int cpu = smp_processor_id();
+
+       account_process_vtime(current);
+       run_local_timers();
+       if (rcu_pending(cpu))
+               rcu_check_callbacks(cpu, user_mode(regs));
+       scheduler_tick();
+       run_posix_cpu_timers(current);
+}
+
+#ifdef CONFIG_PPC_SPLPAR
+/*
+ * Stuff for accounting stolen time.
+ */
+struct cpu_purr_data {
+       int     initialized;                    /* thread is running */
+       u64     tb0;                    /* timebase at origin time */
+       u64     purr0;                  /* PURR at origin time */
+       u64     tb;                     /* last TB value read */
+       u64     purr;                   /* last PURR value read */
+       u64     stolen;                 /* stolen time so far */
+       spinlock_t lock;
+};
+
+static DEFINE_PER_CPU(struct cpu_purr_data, cpu_purr_data);
+
+static void snapshot_tb_and_purr(void *data)
+{
+       struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data);
+
+       p->tb0 = mftb();
+       p->purr0 = mfspr(SPRN_PURR);
+       p->tb = p->tb0;
+       p->purr = 0;
+       wmb();
+       p->initialized = 1;
+}
+
+/*
+ * Called during boot when all cpus have come up.
+ */
+void snapshot_timebases(void)
+{
+       int cpu;
+
+       if (!cpu_has_feature(CPU_FTR_PURR))
+               return;
+       for_each_cpu(cpu)
+               spin_lock_init(&per_cpu(cpu_purr_data, cpu).lock);
+       on_each_cpu(snapshot_tb_and_purr, NULL, 0, 1);
+}
+
+void calculate_steal_time(void)
+{
+       u64 tb, purr, t0;
+       s64 stolen;
+       struct cpu_purr_data *p0, *pme, *phim;
+       int cpu;
+
+       if (!cpu_has_feature(CPU_FTR_PURR))
+               return;
+       cpu = smp_processor_id();
+       pme = &per_cpu(cpu_purr_data, cpu);
+       if (!pme->initialized)
+               return;         /* this can happen in early boot */
+       p0 = &per_cpu(cpu_purr_data, cpu & ~1);
+       phim = &per_cpu(cpu_purr_data, cpu ^ 1);
+       spin_lock(&p0->lock);
+       tb = mftb();
+       purr = mfspr(SPRN_PURR) - pme->purr0;
+       if (!phim->initialized || !cpu_online(cpu ^ 1)) {
+               stolen = (tb - pme->tb) - (purr - pme->purr);
+       } else {
+               t0 = pme->tb0;
+               if (phim->tb0 < t0)
+                       t0 = phim->tb0;
+               stolen = phim->tb - t0 - phim->purr - purr - p0->stolen;
+       }
+       if (stolen > 0) {
+               account_steal_time(current, stolen);
+               p0->stolen += stolen;
+       }
+       pme->tb = tb;
+       pme->purr = purr;
+       spin_unlock(&p0->lock);
+}
+
+/*
+ * Must be called before the cpu is added to the online map when
+ * a cpu is being brought up at runtime.
+ */
+static void snapshot_purr(void)
+{
+       int cpu;
+       u64 purr;
+       struct cpu_purr_data *p0, *pme, *phim;
+       unsigned long flags;
+
+       if (!cpu_has_feature(CPU_FTR_PURR))
+               return;
+       cpu = smp_processor_id();
+       pme = &per_cpu(cpu_purr_data, cpu);
+       p0 = &per_cpu(cpu_purr_data, cpu & ~1);
+       phim = &per_cpu(cpu_purr_data, cpu ^ 1);
+       spin_lock_irqsave(&p0->lock, flags);
+       pme->tb = pme->tb0 = mftb();
+       purr = mfspr(SPRN_PURR);
+       if (!phim->initialized) {
+               pme->purr = 0;
+               pme->purr0 = purr;
+       } else {
+               /* set p->purr and p->purr0 for no change in p0->stolen */
+               pme->purr = phim->tb - phim->tb0 - phim->purr - p0->stolen;
+               pme->purr0 = purr - pme->purr;
+       }
+       pme->initialized = 1;
+       spin_unlock_irqrestore(&p0->lock, flags);
+}
+
+#endif /* CONFIG_PPC_SPLPAR */
+
+#else /* ! CONFIG_VIRT_CPU_ACCOUNTING */
+#define calc_cputime_factors()
+#define account_process_time(regs)     update_process_times(user_mode(regs))
+#define calculate_steal_time()         do { } while (0)
+#endif
+
+#if !(defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(CONFIG_PPC_SPLPAR))
+#define snapshot_purr()                        do { } while (0)
+#endif
+
+/*
+ * Called when a cpu comes up after the system has finished booting,
+ * i.e. as a result of a hotplug cpu action.
+ */
+void snapshot_timebase(void)
+{
+       __get_cpu_var(last_jiffy) = get_tb();
+       snapshot_purr();
+}
+
 void __delay(unsigned long loops)
 {
        unsigned long start;
@@ -392,6 +612,7 @@ static void iSeries_tb_recal(void)
                                                new_tb_ticks_per_jiffy, sign, tick_diff );
                                tb_ticks_per_jiffy = new_tb_ticks_per_jiffy;
                                tb_ticks_per_sec   = new_tb_ticks_per_sec;
+                               calc_cputime_factors();
                                div128_by_32( XSEC_PER_SEC, 0, tb_ticks_per_sec, &divres );
                                do_gtod.tb_ticks_per_sec = tb_ticks_per_sec;
                                tb_to_xs = divres.result_low;
@@ -440,6 +661,7 @@ void timer_interrupt(struct pt_regs * regs)
        irq_enter();
 
        profile_tick(CPU_PROFILING, regs);
+       calculate_steal_time();
 
 #ifdef CONFIG_PPC_ISERIES
        get_lppaca()->int_dword.fields.decr_int = 0;
@@ -461,7 +683,7 @@ void timer_interrupt(struct pt_regs * regs)
                 * is the case.
                 */
                if (!cpu_is_offline(cpu))
-                       update_process_times(user_mode(regs));
+                       account_process_time(regs);
 
                /*
                 * No need to check whether cpu is offline here; boot_cpuid
@@ -518,13 +740,27 @@ void wakeup_decrementer(void)
 void __init smp_space_timers(unsigned int max_cpus)
 {
        int i;
+       unsigned long half = tb_ticks_per_jiffy / 2;
        unsigned long offset = tb_ticks_per_jiffy / max_cpus;
        unsigned long previous_tb = per_cpu(last_jiffy, boot_cpuid);
 
        /* make sure tb > per_cpu(last_jiffy, cpu) for all cpus always */
        previous_tb -= tb_ticks_per_jiffy;
+       /*
+        * The stolen time calculation for POWER5 shared-processor LPAR
+        * systems works better if the two threads' timebase interrupts
+        * are staggered by half a jiffy with respect to each other.
+        */
        for_each_cpu(i) {
-               if (i != boot_cpuid) {
+               if (i == boot_cpuid)
+                       continue;
+               if (i == (boot_cpuid ^ 1))
+                       per_cpu(last_jiffy, i) =
+                               per_cpu(last_jiffy, boot_cpuid) - half;
+               else if (i & 1)
+                       per_cpu(last_jiffy, i) =
+                               per_cpu(last_jiffy, i ^ 1) + half;
+               else {
                        previous_tb += offset;
                        per_cpu(last_jiffy, i) = previous_tb;
                }
@@ -720,6 +956,7 @@ void __init time_init(void)
        tb_ticks_per_sec = ppc_tb_freq;
        tb_ticks_per_usec = ppc_tb_freq / 1000000;
        tb_to_us = mulhwu_scale_factor(ppc_tb_freq, 1000000);
+       calc_cputime_factors();
 
        /*
         * Calculate the length of each tick in ns.  It will not be
index 04f7df39ffbb7fc5b595dfff76a63f640bee4afc..ec837036842398bc52a0326810c8b3ed87a8cdc8 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/arch/ppc64/kernel/vdso.c
- *
  *    Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp.
  *                      <benh@kernel.crashing.org>
  *
index 40523b140109e6455eaa162542fa98b4b4bfbf7b..f9837f44ac0bac2c2ba8d6c81b5f9eeb735b431b 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/lib/copypage.S
- *
  * Copyright (C) 2002 Paul Mackerras, IBM Corp.
  *
  * This program is free software; you can redistribute it and/or
index 6d69ef39b7df7ca6ed0ac621f0d1b86deb717a0a..a6b54cb97c4912a60a85bb41f8a7ce05a93becfb 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/lib/copyuser.S
- *
  * Copyright (C) 2002 Paul Mackerras, IBM Corp.
  *
  * This program is free software; you can redistribute it and/or
index d2b834887920ac2f63c7fe40166364a88000464d..4b72ed8fd50e1da6325f9634ac705f73ebf93791 100644 (file)
@@ -1,9 +1,7 @@
 /*
- *  arch/ppc64/lib/e2a.c
- *
  *  EBCDIC to ASCII conversion
  *
- * This function moved here from arch/ppc64/kernel/viopath.c
+ * This function moved here from arch/powerpc/platforms/iseries/viopath.c 
  *
  * (C) Copyright 2000-2004 IBM Corporation
  *
@@ -105,4 +103,14 @@ unsigned char e2a(unsigned char x)
 }
 EXPORT_SYMBOL(e2a);
 
+unsigned char* strne2a(unsigned char *dest, const unsigned char *src, size_t n)
+{
+       int i;
+
+       n = strnlen(src, n);
 
+       for (i = 0; i < n; i++)
+               dest[i] = e2a(src[i]);
+
+       return dest;
+}
index 9ccacdf5bcb952f6a2664cd44b38fc5dee15dafd..fd66acfd3e3e1224ec75c5b0658db5f9e06c0e20 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/lib/memcpy.S
- *
  * Copyright (C) 2002 Paul Mackerras, IBM Corp.
  *
  * This program is free software; you can redistribute it and/or
index 42c5de2c898f28aaae69db9b370f3db0899ec8ef..31e511856dc58bc2b819e80c32a35840db5bd9ca 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc/syslib/rheap.c
- *
  * A Remote Heap.  Remote means that we don't touch the memory that the
  * heap points to. Normal heap implementations use the memory they manage
  * to place their list. We cannot do that because the memory we manage may
index a4815d316722cddcf9c614b4524f57238f7a4c9f..ec4adcb4bc28c6192590b901aa2c3a04d0792bdf 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/mm/fault.c
- *
  *  PowerPC version
  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
  *
index 12ccd7155bacc514da6dae7d9af3a1e032329d91..ea469eefa14603b82070efc9a7cf2cf18e52f96a 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/kernel/hashtable.S
- *
  *  $Id: hashtable.S,v 1.6 1999/10/08 01:56:15 paulus Exp $
  *
  *  PowerPC version
index e9d589eefc14ce07aa5f670c036b35bfc3124328..89b35c1813141c41172295325d8684c4d88c568b 100644 (file)
@@ -169,7 +169,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
 #ifdef CONFIG_PPC_ISERIES
                if (_machine == PLATFORM_ISERIES_LPAR)
                        ret = iSeries_hpte_insert(hpteg, va,
-                                                 __pa(vaddr),
+                                                 paddr,
                                                  tmp_mode,
                                                  HPTE_V_BOLTED,
                                                  psize);
@@ -178,7 +178,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
 #ifdef CONFIG_PPC_PSERIES
                if (_machine & PLATFORM_LPAR)
                        ret = pSeries_lpar_hpte_insert(hpteg, va,
-                                                      virt_to_abs(paddr),
+                                                      paddr,
                                                       tmp_mode,
                                                       HPTE_V_BOLTED,
                                                       psize);
@@ -186,7 +186,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
 #endif
 #ifdef CONFIG_PPC_MULTIPLATFORM
                        ret = native_hpte_insert(hpteg, va,
-                                                virt_to_abs(paddr),
+                                                paddr,
                                                 tmp_mode, HPTE_V_BOLTED,
                                                 psize);
 #endif
@@ -392,7 +392,7 @@ static unsigned long __init htab_get_table_size(void)
 #ifdef CONFIG_MEMORY_HOTPLUG
 void create_section_mapping(unsigned long start, unsigned long end)
 {
-               BUG_ON(htab_bolt_mapping(start, end, start,
+               BUG_ON(htab_bolt_mapping(start, end, __pa(start),
                        _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
                        mmu_linear_psize));
 }
@@ -422,7 +422,7 @@ void __init htab_initialize(void)
 
        htab_hash_mask = pteg_count - 1;
 
-       if (platform_is_lpar()) {
+       if (firmware_has_feature(FW_FEATURE_LPAR)) {
                /* Using a hypervisor which owns the htab */
                htab_address = NULL;
                _SDR1 = 0; 
@@ -431,7 +431,6 @@ void __init htab_initialize(void)
                 * the absolute address space.
                 */
                table = lmb_alloc(htab_size_bytes, htab_size_bytes);
-               BUG_ON(table == 0);
 
                DBG("Hash table allocated at %lx, size: %lx\n", table,
                    htab_size_bytes);
@@ -474,21 +473,22 @@ void __init htab_initialize(void)
 
                if (dart_tablebase != 0 && dart_tablebase >= base
                    && dart_tablebase < (base + size)) {
+                       unsigned long dart_table_end = dart_tablebase + 16 * MB;
                        if (base != dart_tablebase)
                                BUG_ON(htab_bolt_mapping(base, dart_tablebase,
-                                                        base, mode_rw,
-                                                        mmu_linear_psize));
-                       if ((base + size) > (dart_tablebase + 16*MB))
+                                                       __pa(base), mode_rw,
+                                                       mmu_linear_psize));
+                       if ((base + size) > dart_table_end)
                                BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
-                                                        base + size,
-                                                        dart_tablebase+16*MB,
+                                                       base + size,
+                                                       __pa(dart_table_end),
                                                         mode_rw,
                                                         mmu_linear_psize));
                        continue;
                }
 #endif /* CONFIG_U3_DART */
-               BUG_ON(htab_bolt_mapping(base, base + size, base,
-                                        mode_rw, mmu_linear_psize));
+               BUG_ON(htab_bolt_mapping(base, base + size, __pa(base),
+                                       mode_rw, mmu_linear_psize));
        }
 
        /*
@@ -505,8 +505,8 @@ void __init htab_initialize(void)
                if (base + size >= tce_alloc_start)
                        tce_alloc_start = base + size + 1;
 
-               BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end,
-                                        tce_alloc_start, mode_rw,
+               BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end,
+                                        __pa(tce_alloc_start), mode_rw,
                                         mmu_linear_psize));
        }
 
@@ -517,7 +517,7 @@ void __init htab_initialize(void)
 
 void htab_initialize_secondary(void)
 {
-       if (!platform_is_lpar())
+       if (!firmware_has_feature(FW_FEATURE_LPAR))
                mtspr(SPRN_SDR1, _SDR1);
 }
 
index bacb71c89811b27c48f8e5f05b8dbf3dbe27fd3f..babebd15bdc49d7dc1fd905c8450948673c35876 100644 (file)
 /* max amount of RAM to use */
 unsigned long __max_memory;
 
-/* info on what we think the IO hole is */
-unsigned long  io_hole_start;
-unsigned long  io_hole_size;
-
-/*
- * Do very early mm setup.
- */
-void __init mm_init_ppc64(void)
-{
-#ifndef CONFIG_PPC_ISERIES
-       unsigned long i;
-#endif
-
-       ppc64_boot_msg(0x100, "MM Init");
-
-       /* This is the story of the IO hole... please, keep seated,
-        * unfortunately, we are out of oxygen masks at the moment.
-        * So we need some rough way to tell where your big IO hole
-        * is. On pmac, it's between 2G and 4G, on POWER3, it's around
-        * that area as well, on POWER4 we don't have one, etc...
-        * We need that as a "hint" when sizing the TCE table on POWER3
-        * So far, the simplest way that seem work well enough for us it
-        * to just assume that the first discontinuity in our physical
-        * RAM layout is the IO hole. That may not be correct in the future
-        * (and isn't on iSeries but then we don't care ;)
-        */
-
-#ifndef CONFIG_PPC_ISERIES
-       for (i = 1; i < lmb.memory.cnt; i++) {
-               unsigned long base, prevbase, prevsize;
-
-               prevbase = lmb.memory.region[i-1].base;
-               prevsize = lmb.memory.region[i-1].size;
-               base = lmb.memory.region[i].base;
-               if (base > (prevbase + prevsize)) {
-                       io_hole_start = prevbase + prevsize;
-                       io_hole_size = base  - (prevbase + prevsize);
-                       break;
-               }
-       }
-#endif /* CONFIG_PPC_ISERIES */
-       if (io_hole_start)
-               printk("IO Hole assumed to be %lx -> %lx\n",
-                      io_hole_start, io_hole_start + io_hole_size - 1);
-
-       ppc64_boot_msg(0x100, "MM Init Done");
-}
-
 void free_initmem(void)
 {
        unsigned long addr;
index bbe3eac918e8001338aa84ba2ede420ec2478b20..417d58518558bd0ab31975df7e7d864d6aea3a05 100644 (file)
@@ -31,6 +31,8 @@
 #define DBG(fmt...)
 #endif
 
+#define LMB_ALLOC_ANYWHERE     0
+
 struct lmb lmb;
 
 void lmb_dump_all(void)
@@ -225,6 +227,20 @@ unsigned long __init lmb_alloc(unsigned long size, unsigned long align)
 
 unsigned long __init lmb_alloc_base(unsigned long size, unsigned long align,
                                    unsigned long max_addr)
+{
+       unsigned long alloc;
+
+       alloc = __lmb_alloc_base(size, align, max_addr);
+
+       if (alloc == 0)
+               panic("ERROR: Failed to allocate 0x%lx bytes below 0x%lx.\n",
+                               size, max_addr);
+
+       return alloc;
+}
+
+unsigned long __init __lmb_alloc_base(unsigned long size, unsigned long align,
+                                   unsigned long max_addr)
 {
        long i, j;
        unsigned long base = 0;
index 454cac01d8cc0667dfee9314372153d32adeefbf..badac10d700c2949de742b8d1544a9793f5cac86 100644 (file)
@@ -125,7 +125,7 @@ int __devinit add_memory(u64 start, u64 size)
        nid = hot_add_scn_to_nid(start);
        pgdata = NODE_DATA(nid);
 
-       start = __va(start);
+       start = (unsigned long)__va(start);
        create_section_mapping(start, start + size);
 
        /* this should work for most non-highmem platforms */
@@ -249,7 +249,6 @@ void __init do_init_bootmem(void)
        bootmap_pages = bootmem_bootmap_pages(total_pages);
 
        start = lmb_alloc(bootmap_pages << PAGE_SHIFT, PAGE_SIZE);
-       BUG_ON(!start);
 
        boot_mapsize = init_bootmem(start >> PAGE_SHIFT, total_pages);
 
index fe65f522aff3a888645901de71f4d4360e58c29a..972a8e884b9aecac1856c7c86340eeb11000ab09 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  linux/arch/ppc64/mm/mmap.c
- *
  *  flexible mmap layout support
  *
  * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
index 2863a912bcd0950d3841d62c035110aa0f5b8d3a..e89b22aa539e477e79ad9dc26181d09aa19e859a 100644 (file)
@@ -129,10 +129,12 @@ void __init get_region(unsigned int nid, unsigned long *start_pfn,
                *start_pfn = 0;
 }
 
-static inline void map_cpu_to_node(int cpu, int node)
+static void __cpuinit map_cpu_to_node(int cpu, int node)
 {
        numa_cpu_lookup_table[cpu] = node;
 
+       dbg("adding cpu %d to node %d\n", cpu, node);
+
        if (!(cpu_isset(cpu, numa_cpumask_lookup_table[node])))
                cpu_set(cpu, numa_cpumask_lookup_table[node]);
 }
@@ -153,7 +155,7 @@ static void unmap_cpu_from_node(unsigned long cpu)
 }
 #endif /* CONFIG_HOTPLUG_CPU */
 
-static struct device_node *find_cpu_node(unsigned int cpu)
+static struct device_node * __cpuinit find_cpu_node(unsigned int cpu)
 {
        unsigned int hw_cpuid = get_hard_smp_processor_id(cpu);
        struct device_node *cpu_node = NULL;
@@ -189,23 +191,29 @@ static int *of_get_associativity(struct device_node *dev)
        return (unsigned int *)get_property(dev, "ibm,associativity", NULL);
 }
 
-static int of_node_numa_domain(struct device_node *device)
+/* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
+ * info is found.
+ */
+static int of_node_to_nid(struct device_node *device)
 {
-       int numa_domain;
+       int nid = -1;
        unsigned int *tmp;
 
        if (min_common_depth == -1)
-               return 0;
+               goto out;
 
        tmp = of_get_associativity(device);
-       if (tmp && (tmp[0] >= min_common_depth)) {
-               numa_domain = tmp[min_common_depth];
-       } else {
-               dbg("WARNING: no NUMA information for %s\n",
-                   device->full_name);
-               numa_domain = 0;
-       }
-       return numa_domain;
+       if (!tmp)
+               goto out;
+
+       if (tmp[0] >= min_common_depth)
+               nid = tmp[min_common_depth];
+
+       /* POWER4 LPAR uses 0xffff as invalid node */
+       if (nid == 0xffff || nid >= MAX_NUMNODES)
+               nid = -1;
+out:
+       return nid;
 }
 
 /*
@@ -246,8 +254,7 @@ static int __init find_min_common_depth(void)
        if ((len >= 1) && ref_points) {
                depth = ref_points[1];
        } else {
-               dbg("WARNING: could not find NUMA "
-                   "associativity reference point\n");
+               dbg("NUMA: ibm,associativity-reference-points not found.\n");
                depth = -1;
        }
        of_node_put(rtas_root);
@@ -283,9 +290,9 @@ static unsigned long __devinit read_n_cells(int n, unsigned int **buf)
  * Figure out to which domain a cpu belongs and stick it there.
  * Return the id of the domain used.
  */
-static int numa_setup_cpu(unsigned long lcpu)
+static int __cpuinit numa_setup_cpu(unsigned long lcpu)
 {
-       int numa_domain = 0;
+       int nid = 0;
        struct device_node *cpu = find_cpu_node(lcpu);
 
        if (!cpu) {
@@ -293,27 +300,16 @@ static int numa_setup_cpu(unsigned long lcpu)
                goto out;
        }
 
-       numa_domain = of_node_numa_domain(cpu);
+       nid = of_node_to_nid(cpu);
 
-       if (numa_domain >= num_online_nodes()) {
-               /*
-                * POWER4 LPAR uses 0xffff as invalid node,
-                * dont warn in this case.
-                */
-               if (numa_domain != 0xffff)
-                       printk(KERN_ERR "WARNING: cpu %ld "
-                              "maps to invalid NUMA node %d\n",
-                              lcpu, numa_domain);
-               numa_domain = 0;
-       }
+       if (nid < 0 || !node_online(nid))
+               nid = any_online_node(NODE_MASK_ALL);
 out:
-       node_set_online(numa_domain);
-
-       map_cpu_to_node(lcpu, numa_domain);
+       map_cpu_to_node(lcpu, nid);
 
        of_node_put(cpu);
 
-       return numa_domain;
+       return nid;
 }
 
 static int cpu_numa_callback(struct notifier_block *nfb,
@@ -325,10 +321,7 @@ static int cpu_numa_callback(struct notifier_block *nfb,
 
        switch (action) {
        case CPU_UP_PREPARE:
-               if (min_common_depth == -1 || !numa_enabled)
-                       map_cpu_to_node(lcpu, 0);
-               else
-                       numa_setup_cpu(lcpu);
+               numa_setup_cpu(lcpu);
                ret = NOTIFY_OK;
                break;
 #ifdef CONFIG_HOTPLUG_CPU
@@ -375,7 +368,7 @@ static int __init parse_numa_properties(void)
 {
        struct device_node *cpu = NULL;
        struct device_node *memory = NULL;
-       int max_domain;
+       int default_nid = 0;
        unsigned long i;
 
        if (numa_enabled == 0) {
@@ -385,32 +378,32 @@ static int __init parse_numa_properties(void)
 
        min_common_depth = find_min_common_depth();
 
-       dbg("NUMA associativity depth for CPU/Memory: %d\n", min_common_depth);
        if (min_common_depth < 0)
                return min_common_depth;
 
-       max_domain = numa_setup_cpu(boot_cpuid);
+       dbg("NUMA associativity depth for CPU/Memory: %d\n", min_common_depth);
 
        /*
-        * Even though we connect cpus to numa domains later in SMP init,
-        * we need to know the maximum node id now. This is because each
-        * node id must have NODE_DATA etc backing it.
-        * As a result of hotplug we could still have cpus appear later on
-        * with larger node ids. In that case we force the cpu into node 0.
+        * Even though we connect cpus to numa domains later in SMP
+        * init, we need to know the node ids now. This is because
+        * each node to be onlined must have NODE_DATA etc backing it.
         */
-       for_each_cpu(i) {
-               int numa_domain;
+       for_each_present_cpu(i) {
+               int nid;
 
                cpu = find_cpu_node(i);
+               BUG_ON(!cpu);
+               nid = of_node_to_nid(cpu);
+               of_node_put(cpu);
 
-               if (cpu) {
-                       numa_domain = of_node_numa_domain(cpu);
-                       of_node_put(cpu);
-
-                       if (numa_domain < MAX_NUMNODES &&
-                           max_domain < numa_domain)
-                               max_domain = numa_domain;
-               }
+               /*
+                * Don't fall back to default_nid yet -- we will plug
+                * cpus into nodes once the memory scan has discovered
+                * the topology.
+                */
+               if (nid < 0)
+                       continue;
+               node_set_online(nid);
        }
 
        get_n_mem_cells(&n_mem_addr_cells, &n_mem_size_cells);
@@ -418,7 +411,7 @@ static int __init parse_numa_properties(void)
        while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
                unsigned long start;
                unsigned long size;
-               int numa_domain;
+               int nid;
                int ranges;
                unsigned int *memcell_buf;
                unsigned int len;
@@ -439,18 +432,15 @@ new_range:
                start = read_n_cells(n_mem_addr_cells, &memcell_buf);
                size = read_n_cells(n_mem_size_cells, &memcell_buf);
 
-               numa_domain = of_node_numa_domain(memory);
-
-               if (numa_domain >= MAX_NUMNODES) {
-                       if (numa_domain != 0xffff)
-                               printk(KERN_ERR "WARNING: memory at %lx maps "
-                                      "to invalid NUMA node %d\n", start,
-                                      numa_domain);
-                       numa_domain = 0;
-               }
-
-               if (max_domain < numa_domain)
-                       max_domain = numa_domain;
+               /*
+                * Assumption: either all memory nodes or none will
+                * have associativity properties.  If none, then
+                * everything goes to default_nid.
+                */
+               nid = of_node_to_nid(memory);
+               if (nid < 0)
+                       nid = default_nid;
+               node_set_online(nid);
 
                if (!(size = numa_enforce_memory_limit(start, size))) {
                        if (--ranges)
@@ -459,16 +449,13 @@ new_range:
                                continue;
                }
 
-               add_region(numa_domain, start >> PAGE_SHIFT,
+               add_region(nid, start >> PAGE_SHIFT,
                           size >> PAGE_SHIFT);
 
                if (--ranges)
                        goto new_range;
        }
 
-       for (i = 0; i <= max_domain; i++)
-               node_set_online(i);
-
        return 0;
 }
 
@@ -483,7 +470,6 @@ static void __init setup_nonnuma(void)
        printk(KERN_INFO "Memory hole size: %ldMB\n",
               (top_of_ram - total_ram) >> 20);
 
-       map_cpu_to_node(boot_cpuid, 0);
        for (i = 0; i < lmb.memory.cnt; ++i)
                add_region(0, lmb.memory.region[i].base >> PAGE_SHIFT,
                           lmb_size_pages(&lmb.memory, i));
@@ -570,11 +556,11 @@ static void __init *careful_allocation(int nid, unsigned long size,
                                       unsigned long end_pfn)
 {
        int new_nid;
-       unsigned long ret = lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
+       unsigned long ret = __lmb_alloc_base(size, align, end_pfn << PAGE_SHIFT);
 
        /* retry over all memory */
        if (!ret)
-               ret = lmb_alloc_base(size, align, lmb_end_of_DRAM());
+               ret = __lmb_alloc_base(size, align, lmb_end_of_DRAM());
 
        if (!ret)
                panic("numa.c: cannot allocate %lu bytes on node %d",
@@ -620,6 +606,8 @@ void __init do_init_bootmem(void)
                dump_numa_memory_topology();
 
        register_cpu_notifier(&ppc64_numa_nb);
+       cpu_numa_callback(&ppc64_numa_nb, CPU_UP_PREPARE,
+                         (void *)(unsigned long)boot_cpuid);
 
        for_each_online_node(nid) {
                unsigned long start_pfn, end_pfn, pages_present;
@@ -767,10 +755,10 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
 {
        struct device_node *memory = NULL;
        nodemask_t nodes;
-       int numa_domain = 0;
+       int default_nid = any_online_node(NODE_MASK_ALL);
 
        if (!numa_enabled || (min_common_depth < 0))
-               return numa_domain;
+               return default_nid;
 
        while ((memory = of_find_node_by_type(memory, "memory")) != NULL) {
                unsigned long start, size;
@@ -787,15 +775,15 @@ int hot_add_scn_to_nid(unsigned long scn_addr)
 ha_new_range:
                start = read_n_cells(n_mem_addr_cells, &memcell_buf);
                size = read_n_cells(n_mem_size_cells, &memcell_buf);
-               numa_domain = of_node_numa_domain(memory);
+               nid = of_node_to_nid(memory);
 
                /* Domains not present at boot default to 0 */
-               if (!node_online(numa_domain))
-                       numa_domain = any_online_node(NODE_MASK_ALL);
+               if (nid < 0 || !node_online(nid))
+                       nid = default_nid;
 
                if ((scn_addr >= start) && (scn_addr < (start + size))) {
                        of_node_put(memory);
-                       goto got_numa_domain;
+                       goto got_nid;
                }
 
                if (--ranges)           /* process all ranges in cell */
@@ -804,12 +792,12 @@ ha_new_range:
        BUG();  /* section address should be found above */
 
        /* Temporary code to ensure that returned node is not empty */
-got_numa_domain:
+got_nid:
        nodes_setall(nodes);
-       while (NODE_DATA(numa_domain)->node_spanned_pages == 0) {
-               node_clear(numa_domain, nodes);
-               numa_domain = any_online_node(nodes);
+       while (NODE_DATA(nid)->node_spanned_pages == 0) {
+               node_clear(nid, nodes);
+               nid = any_online_node(nodes);
        }
-       return numa_domain;
+       return nid;
 }
 #endif /* CONFIG_MEMORY_HOTPLUG */
index d1acee38f16326c55e615626be75cdef5daef049..abfaabf667bfb414b117429b9c6b9b101758c527 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/mm/slb_low.S
- *
  * Low-level SLB routines
  *
  * Copyright (C) 2004 David Gibson <dwg@au.ibm.com>, IBM
index 82e4951826bc7985869687a449a9a818e56d9803..91d25fb27f8940973fe15d67ff6f76a3c28acaa2 100644 (file)
@@ -247,10 +247,6 @@ void stabs_alloc(void)
 
                newstab = lmb_alloc_base(HW_PAGE_SIZE, HW_PAGE_SIZE,
                                         1<<SID_SHIFT);
-               if (! newstab)
-                       panic("Unable to allocate segment table for CPU %d.\n",
-                             cpu);
-
                newstab = (unsigned long)__va(newstab);
 
                memset((void *)newstab, 0, HW_PAGE_SIZE);
index bb3afb6e631778f64e0ccb8dc6d1801b5ac3ea60..f734b11566c2a6a94ea0268149a6fafb153cc7f8 100644 (file)
@@ -36,7 +36,7 @@
 DEFINE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
 
 /* This is declared as we are using the more or less generic
- * include/asm-ppc64/tlb.h file -- tgall
+ * include/asm-powerpc/tlb.h file -- tgall
  */
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 DEFINE_PER_CPU(struct pte_freelist_batch *, pte_freelist_cur);
index 659a021da0c7b35ab9005c57dd981fce81f04996..4b06e53eb9b4bb0d4b7c521cc2fa0fdd97abb62b 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/oprofile.h>
 #include <linux/init.h>
 #include <linux/smp.h>
+#include <asm/firmware.h>
 #include <asm/ptrace.h>
 #include <asm/system.h>
 #include <asm/processor.h>
@@ -232,7 +233,7 @@ static unsigned long get_pc(struct pt_regs *regs)
        mmcra = mfspr(SPRN_MMCRA);
 
        /* Were we in the hypervisor? */
-       if (platform_is_lpar() && (mmcra & MMCRA_SIHV))
+       if (firmware_has_feature(FW_FEATURE_LPAR) && (mmcra & MMCRA_SIHV))
                /* function descriptor madness */
                return *((unsigned long *)hypervisor_bucket);
 
index 9d8b28ef33435a8c613ea8ae004ae5a2b7be9bd1..5c72367441a83dbc2c2e753bc204bdcb0f30484e 100644 (file)
@@ -1,4 +1,6 @@
 #
 # Makefile for the PowerPC 83xx linux kernel.
 #
-obj-$(CONFIG_MPC834x_SYS)      += mpc834x_sys.o pci.o
+obj-y                          := misc.o
+obj-$(CONFIG_PCI)              += pci.o
+obj-$(CONFIG_MPC834x_SYS)      += mpc834x_sys.o
diff --git a/arch/powerpc/platforms/83xx/misc.c b/arch/powerpc/platforms/83xx/misc.c
new file mode 100644 (file)
index 0000000..1455bce
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * misc setup functions for MPC83xx
+ *
+ * Maintainer: Kumar Gala <galak@kernel.crashing.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 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+
+#include <asm/io.h>
+#include <asm/hw_irq.h>
+#include <sysdev/fsl_soc.h>
+
+#include "mpc83xx.h"
+
+void mpc83xx_restart(char *cmd)
+{
+#define RST_OFFSET     0x00000900
+#define RST_PROT_REG   0x00000018
+#define RST_CTRL_REG   0x0000001c
+       __be32 __iomem *reg;
+
+       /* map reset register space */
+       reg = ioremap(get_immrbase() + 0x900, 0xff);
+
+       local_irq_disable();
+
+       /* enable software reset "RSTE" */
+       out_be32(reg + (RST_PROT_REG >> 2), 0x52535445);
+
+       /* set software hard reset */
+       out_be32(reg + (RST_CTRL_REG >> 2), 0x2);
+       for (;;) ;
+}
+
+long __init mpc83xx_time_init(void)
+{
+#define SPCR_OFFSET    0x00000110
+#define SPCR_TBEN      0x00400000
+       __be32 __iomem *spcr = ioremap(get_immrbase() + SPCR_OFFSET, 4);
+       __be32 tmp;
+
+       tmp = in_be32(spcr);
+       out_be32(spcr, tmp | SPCR_TBEN);
+
+       iounmap(spcr);
+
+       return 0;
+}
index 2098dd05a773c1def834ced9f349556029973b48..7c18b4cd5db43724b304ad786b655e3b29db3fb6 100644 (file)
 #include <linux/delay.h>
 #include <linux/seq_file.h>
 #include <linux/root_dev.h>
-#include <linux/module.h>
-#include <linux/fsl_devices.h>
 
 #include <asm/system.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
 #include <asm/atomic.h>
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
 #include <asm/ipic.h>
 #include <asm/bootinfo.h>
-#include <asm/pci-bridge.h>
-#include <asm/mpc83xx.h>
 #include <asm/irq.h>
-#include <mm/mmu_decl.h>
 #include <asm/prom.h>
 #include <asm/udbg.h>
 #include <sysdev/fsl_soc.h>
@@ -52,8 +45,6 @@ unsigned long isa_mem_base = 0;
 #endif
 
 #ifdef CONFIG_PCI
-extern int mpc83xx_pci2_busno;
-
 static int
 mpc83xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
 {
@@ -78,26 +69,14 @@ mpc83xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
        const long min_idsel = 0x11, max_idsel = 0x20, irqs_per_slot = 4;
        return PCI_IRQ_TABLE_LOOKUP;
 }
-
-static int
-mpc83xx_exclude_device(u_char bus, u_char devfn)
-{
-       if (bus == 0 && PCI_SLOT(devfn) == 0)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       if (mpc83xx_pci2_busno)
-               if (bus == (mpc83xx_pci2_busno) && PCI_SLOT(devfn) == 0)
-                       return PCIBIOS_DEVICE_NOT_FOUND;
-       return PCIBIOS_SUCCESSFUL;
-}
-#endif /* CONFIG_PCI */
+#endif                         /* CONFIG_PCI */
 
 /* ************************************************************************
  *
  * Setup the architecture
  *
  */
-static void __init
-mpc834x_sys_setup_arch(void)
+static void __init mpc834x_sys_setup_arch(void)
 {
        struct device_node *np;
 
@@ -106,14 +85,14 @@ mpc834x_sys_setup_arch(void)
 
        np = of_find_node_by_type(NULL, "cpu");
        if (np != 0) {
-               unsigned int *fp = (int *) get_property(np, "clock-frequency", NULL);
+               unsigned int *fp =
+                   (int *)get_property(np, "clock-frequency", NULL);
                if (fp != 0)
                        loops_per_jiffy = *fp / HZ;
                else
                        loops_per_jiffy = 50000000 / HZ;
                of_node_put(np);
        }
-
 #ifdef CONFIG_PCI
        for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
                add_bridge(np);
@@ -124,14 +103,13 @@ mpc834x_sys_setup_arch(void)
 #endif
 
 #ifdef  CONFIG_ROOT_NFS
-               ROOT_DEV = Root_NFS;
+       ROOT_DEV = Root_NFS;
 #else
-               ROOT_DEV = Root_HDA1;
+       ROOT_DEV = Root_HDA1;
 #endif
 }
 
-void __init
-mpc834x_sys_init_IRQ(void)
+void __init mpc834x_sys_init_IRQ(void)
 {
        u8 senses[8] = {
                0,                      /* EXT 0 */
@@ -160,64 +138,27 @@ mpc834x_sys_init_IRQ(void)
 }
 
 #if defined(CONFIG_I2C_MPC) && defined(CONFIG_SENSORS_DS1374)
-extern ulong   ds1374_get_rtc_time(void);
-extern int     ds1374_set_rtc_time(ulong);
+extern ulong ds1374_get_rtc_time(void);
+extern int ds1374_set_rtc_time(ulong);
 
-static int __init
-mpc834x_rtc_hookup(void)
+static int __init mpc834x_rtc_hookup(void)
 {
-       struct timespec tv;
+       struct timespec tv;
 
        ppc_md.get_rtc_time = ds1374_get_rtc_time;
        ppc_md.set_rtc_time = ds1374_set_rtc_time;
 
        tv.tv_nsec = 0;
-       tv.tv_sec = (ppc_md.get_rtc_time)();
+       tv.tv_sec = (ppc_md.get_rtc_time) ();
        do_settimeofday(&tv);
 
        return 0;
 }
+
 late_initcall(mpc834x_rtc_hookup);
 #endif
 
-static void
-mpc83xx_restart(char *cmd)
-{
-#define RST_OFFSET     0x00000900
-#define RST_PROT_REG   0x00000018
-#define RST_CTRL_REG   0x0000001c
-       __be32 __iomem *reg;
-
-       // map reset register space
-       reg = ioremap(get_immrbase() + 0x900, 0xff);
-
-       local_irq_disable();
-
-       /* enable software reset "RSTE" */
-       out_be32(reg + (RST_PROT_REG >> 2), 0x52535445);
-
-       /* set software hard reset */
-       out_be32(reg + (RST_CTRL_REG >> 2), 0x52535445);
-       for(;;);
-}
-
-static long __init
-mpc83xx_time_init(void)
-{
-#define SPCR_OFFSET    0x00000110
-#define SPCR_TBEN      0x00400000
-       __be32 __iomem *spcr = ioremap(get_immrbase() + SPCR_OFFSET, 4);
-       __be32 tmp;
-
-       tmp = in_be32(spcr);
-       out_be32(spcr, tmp|SPCR_TBEN);
-
-       iounmap(spcr);
-
-       return 0;
-}
-void __init
-platform_init(void)
+void __init platform_init(void)
 {
        /* setup the PowerPC module struct */
        ppc_md.setup_arch = mpc834x_sys_setup_arch;
@@ -239,5 +180,3 @@ platform_init(void)
 
        return;
 }
-
-
index e4ca39f6a86205ac6154775299958e5b3e4f6a42..fedecb73f7ffc84a3e9b110c4a245acd14191a89 100644 (file)
@@ -20,4 +20,4 @@
 #define PIRQC  MPC83xx_IRQ_EXT6
 #define PIRQD  MPC83xx_IRQ_EXT7
 
-#endif                /* __MACH_MPC83XX_SYS_H__ */
+#endif                         /* __MACH_MPC83XX_SYS_H__ */
index ce9e66abef24ac92ddb8a48e0378580ffab9792d..01cae106912bec714d4df34105c3305971970554 100644 (file)
@@ -10,5 +10,8 @@
  */
 
 extern int add_bridge(struct device_node *dev);
+extern int mpc83xx_exclude_device(u_char bus, u_char devfn);
+extern void mpc83xx_restart(char *cmd);
+extern long mpc83xx_time_init(void);
 
-#endif /* __MPC83XX_H__ */
+#endif                         /* __MPC83XX_H__ */
index 469cdacc5bd418657602b17cb0ab22b598e7930e..16f7d3b30e1dbf023e0229fe946441516fc3c845 100644 (file)
 
 int mpc83xx_pci2_busno;
 
-#ifdef CONFIG_PCI
+int mpc83xx_exclude_device(u_char bus, u_char devfn)
+{
+       if (bus == 0 && PCI_SLOT(devfn) == 0)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       if (mpc83xx_pci2_busno)
+               if (bus == (mpc83xx_pci2_busno) && PCI_SLOT(devfn) == 0)
+                       return PCIBIOS_DEVICE_NOT_FOUND;
+       return PCIBIOS_SUCCESSFUL;
+}
+
 int __init add_bridge(struct device_node *dev)
 {
        int len;
@@ -52,7 +61,7 @@ int __init add_bridge(struct device_node *dev)
        has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
 
        /* Get bus range if any */
-       bus_range = (int *) get_property(dev, "bus-range", &len);
+       bus_range = (int *)get_property(dev, "bus-range", &len);
        if (bus_range == NULL || len < 2 * sizeof(int)) {
                printk(KERN_WARNING "Can't get bus-range for %s, assume"
                       " bus 0\n", dev->full_name);
@@ -74,7 +83,7 @@ int __init add_bridge(struct device_node *dev)
        if ((rsrc.start & 0xfffff) == 0x8500) {
                setup_indirect_pci(hose, immr + 0x8300, immr + 0x8304);
        }
-       /* PCI 2*/
+       /* PCI 2 */
        if ((rsrc.start & 0xfffff) == 0x8600) {
                setup_indirect_pci(hose, immr + 0x8380, immr + 0x8384);
                primary = 0;
@@ -84,10 +93,10 @@ int __init add_bridge(struct device_node *dev)
 
        printk(KERN_INFO "Found MPC83xx PCI host bridge at 0x%08lx. "
               "Firmware bus number: %d->%d\n",
-               rsrc.start, hose->first_busno, hose->last_busno);
+              rsrc.start, hose->first_busno, hose->last_busno);
 
        DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n",
-               hose, hose->cfg_addr, hose->cfg_data);
+           hose, hose->cfg_addr, hose->cfg_data);
 
        /* Interpret the "ranges" property */
        /* This also maps the I/O region and sets isa_io/mem_base */
@@ -95,5 +104,3 @@ int __init add_bridge(struct device_node *dev)
 
        return 0;
 }
-
-#endif
index c5bc2821d99162c673aac9a2d1558d4e950a8502..d3d0ff745e8428c7e823ed5dbdccc6a9ed926e50 100644 (file)
@@ -1,86 +1,30 @@
-config 85xx
-       bool
-       depends on E500
-       default y
-
-config PPC_INDIRECT_PCI_BE
-       bool
-       depends on 85xx
-       default y
-
-menu "Freescale 85xx options"
-       depends on E500
+menu "Platform support"
+       depends on PPC_85xx
 
 choice
        prompt "Machine Type"
-       depends on 85xx
        default MPC8540_ADS
 
 config MPC8540_ADS
        bool "Freescale MPC8540 ADS"
        help
-         This option enables support for the MPC 8540 ADS evaluation board.
-
-config MPC8548_CDS
-       bool "Freescale MPC8548 CDS"
-       help
-         This option enablese support for the MPC8548 CDS evaluation board.
-
-config MPC8555_CDS
-       bool "Freescale MPC8555 CDS"
-       help
-         This option enablese support for the MPC8555 CDS evaluation board.
-
-config MPC8560_ADS
-       bool "Freescale MPC8560 ADS"
-       help
-         This option enables support for the MPC 8560 ADS evaluation board.
-
-config SBC8560
-       bool "WindRiver PowerQUICC III SBC8560"
-       help
-         This option enables support for the WindRiver PowerQUICC III 
-         SBC8560 board.
-
-config STX_GP3
-       bool "Silicon Turnkey Express GP3"
-       help
-         This option enables support for the Silicon Turnkey Express GP3
-         board.
+         This option enables support for the MPC 8540 ADS board
 
 endchoice
 
-# It's often necessary to know the specific 85xx processor type.
-# Fortunately, it is implied (so far) from the board type, so we
-# don't need to ask more redundant questions.
 config MPC8540
        bool
-       depends on MPC8540_ADS
-       default y
-
-config MPC8548
-       bool
-       depends on MPC8548_CDS
-       default y
+       select PPC_UDBG_16550
+       select PPC_INDIRECT_PCI
+       default y if MPC8540_ADS
 
-config MPC8555
-       bool
-       depends on MPC8555_CDS
-       default y
-
-config MPC8560
+config PPC_INDIRECT_PCI_BE
        bool
-       depends on SBC8560 || MPC8560_ADS || STX_GP3
-       default y
-
-config 85xx_PCI2
-       bool "Supprt for 2nd PCI host controller"
-       depends on MPC8555_CDS
+       depends on PPC_85xx
        default y
 
-config PPC_GEN550
+config MPIC
        bool
-       depends on MPC8540 || SBC8560 || MPC8555
        default y
 
 endmenu
index 6407197ffd89399769cce3c116959a2096f70cdc..ffc4139cb214378984636b6cf0ea60eb82e07aca 100644 (file)
@@ -1 +1,5 @@
-# empty makefile so make clean works
+#
+# Makefile for the PowerPC 85xx linux kernel.
+#
+obj-$(CONFIG_PPC_85xx) += misc.o pci.o
+obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o
diff --git a/arch/powerpc/platforms/85xx/misc.c b/arch/powerpc/platforms/85xx/misc.c
new file mode 100644 (file)
index 0000000..26c5e82
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * MPC85xx generic code.
+ *
+ * Maintained by Kumar Gala (see MAINTAINERS for contact information)
+ *
+ * Copyright 2005 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+#include <linux/irq.h>
+#include <linux/module.h>
+#include <asm/irq.h>
+
+extern void abort(void);
+
+void mpc85xx_restart(char *cmd)
+{
+       local_irq_disable();
+       abort();
+}
+
+/* For now this is a pass through */
+phys_addr_t fixup_bigphys_addr(phys_addr_t addr, phys_addr_t size)
+{
+       return addr;
+};
+
+EXPORT_SYMBOL(fixup_bigphys_addr);
diff --git a/arch/powerpc/platforms/85xx/mpc8540_ads.h b/arch/powerpc/platforms/85xx/mpc8540_ads.h
new file mode 100644 (file)
index 0000000..f770cad
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * arch/ppc/platforms/85xx/mpc8540_ads.h
+ *
+ * MPC8540ADS board definitions
+ *
+ * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ *
+ * Copyright 2004 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+#ifndef __MACH_MPC8540ADS_H__
+#define __MACH_MPC8540ADS_H__
+
+#include <linux/config.h>
+#include <linux/initrd.h>
+
+#define BOARD_CCSRBAR          ((uint)0xe0000000)
+#define BCSR_ADDR              ((uint)0xf8000000)
+#define BCSR_SIZE              ((uint)(32 * 1024))
+
+/* PCI interrupt controller */
+#define PIRQA          MPC85xx_IRQ_EXT1
+#define PIRQB          MPC85xx_IRQ_EXT2
+#define PIRQC          MPC85xx_IRQ_EXT3
+#define PIRQD          MPC85xx_IRQ_EXT4
+
+/* Offset of CPM register space */
+#define CPM_MAP_ADDR   (CCSRBAR + MPC85xx_CPM_OFFSET)
+
+#endif                         /* __MACH_MPC8540ADS_H__ */
diff --git a/arch/powerpc/platforms/85xx/mpc85xx.h b/arch/powerpc/platforms/85xx/mpc85xx.h
new file mode 100644 (file)
index 0000000..b44db62
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * arch/ppc/platforms/85xx/mpc85xx.h
+ *
+ * MPC85xx soc definitions/function decls
+ *
+ * Maintainer: Kumar Gala <kumar.gala@freescale.com>
+ *
+ * Copyright 2005 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+extern void mpc85xx_restart(char *);
+extern int add_bridge(struct device_node *dev);
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ads.c b/arch/powerpc/platforms/85xx/mpc85xx_ads.c
new file mode 100644 (file)
index 0000000..b7821db
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * MPC85xx setup and early boot code plus other random bits.
+ *
+ * Maintained by Kumar Gala (see MAINTAINERS for contact information)
+ *
+ * Copyright 2005 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/kdev_t.h>
+#include <linux/delay.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+
+#include <asm/system.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <asm/mpc85xx.h>
+#include <asm/prom.h>
+#include <asm/mpic.h>
+#include <mm/mmu_decl.h>
+#include <asm/udbg.h>
+
+#include <sysdev/fsl_soc.h>
+#include "mpc85xx.h"
+
+#ifndef CONFIG_PCI
+unsigned long isa_io_base = 0;
+unsigned long isa_mem_base = 0;
+#endif
+
+/*
+ * Internal interrupts are all Level Sensitive, and Positive Polarity
+ *
+ * Note:  Likely, this table and the following function should be
+ *        obtained and derived from the OF Device Tree.
+ */
+static u_char mpc85xx_ads_openpic_initsenses[] __initdata = {
+       MPC85XX_INTERNAL_IRQ_SENSES,
+       0x0,                    /* External  0: */
+#if defined(CONFIG_PCI)
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 1: PCI slot 0 */
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 2: PCI slot 1 */
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 3: PCI slot 2 */
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* Ext 4: PCI slot 3 */
+#else
+       0x0,                    /* External  1: */
+       0x0,                    /* External  2: */
+       0x0,                    /* External  3: */
+       0x0,                    /* External  4: */
+#endif
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 5: PHY */
+       0x0,                    /* External  6: */
+       (IRQ_SENSE_LEVEL | IRQ_POLARITY_NEGATIVE),      /* External 7: PHY */
+       0x0,                    /* External  8: */
+       0x0,                    /* External  9: */
+       0x0,                    /* External 10: */
+       0x0,                    /* External 11: */
+};
+
+#ifdef CONFIG_PCI
+/*
+ * interrupt routing
+ */
+
+int
+mpc85xx_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
+{
+       static char pci_irq_table[][4] =
+           /*
+            * This is little evil, but works around the fact
+            * that revA boards have IDSEL starting at 18
+            * and others boards (older) start at 12
+            *
+            *      PCI IDSEL/INTPIN->INTLINE
+            *       A      B      C      D
+            */
+       {
+               {PIRQA, PIRQB, PIRQC, PIRQD},   /* IDSEL 2 */
+               {PIRQD, PIRQA, PIRQB, PIRQC},
+               {PIRQC, PIRQD, PIRQA, PIRQB},
+               {PIRQB, PIRQC, PIRQD, PIRQA},   /* IDSEL 5 */
+               {0, 0, 0, 0},   /* -- */
+               {0, 0, 0, 0},   /* -- */
+               {0, 0, 0, 0},   /* -- */
+               {0, 0, 0, 0},   /* -- */
+               {0, 0, 0, 0},   /* -- */
+               {0, 0, 0, 0},   /* -- */
+               {PIRQA, PIRQB, PIRQC, PIRQD},   /* IDSEL 12 */
+               {PIRQD, PIRQA, PIRQB, PIRQC},
+               {PIRQC, PIRQD, PIRQA, PIRQB},
+               {PIRQB, PIRQC, PIRQD, PIRQA},   /* IDSEL 15 */
+               {0, 0, 0, 0},   /* -- */
+               {0, 0, 0, 0},   /* -- */
+               {PIRQA, PIRQB, PIRQC, PIRQD},   /* IDSEL 18 */
+               {PIRQD, PIRQA, PIRQB, PIRQC},
+               {PIRQC, PIRQD, PIRQA, PIRQB},
+               {PIRQB, PIRQC, PIRQD, PIRQA},   /* IDSEL 21 */
+       };
+
+       const long min_idsel = 2, max_idsel = 21, irqs_per_slot = 4;
+       return PCI_IRQ_TABLE_LOOKUP;
+}
+
+int
+mpc85xx_exclude_device(u_char bus, u_char devfn)
+{
+       if (bus == 0 && PCI_SLOT(devfn) == 0)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       else
+               return PCIBIOS_SUCCESSFUL;
+}
+
+#endif /* CONFIG_PCI */
+
+
+void __init mpc85xx_ads_pic_init(void)
+{
+       struct mpic *mpic1;
+       phys_addr_t OpenPIC_PAddr;
+
+       /* Determine the Physical Address of the OpenPIC regs */
+       OpenPIC_PAddr = get_immrbase() + MPC85xx_OPENPIC_OFFSET;
+
+       mpic1 = mpic_alloc(OpenPIC_PAddr,
+                          MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
+                          4, MPC85xx_OPENPIC_IRQ_OFFSET, 0, 250,
+                          mpc85xx_ads_openpic_initsenses,
+                          sizeof(mpc85xx_ads_openpic_initsenses),
+                          " OpenPIC  ");
+       BUG_ON(mpic1 == NULL);
+       mpic_assign_isu(mpic1, 0, OpenPIC_PAddr + 0x10200);
+       mpic_assign_isu(mpic1, 1, OpenPIC_PAddr + 0x10280);
+       mpic_assign_isu(mpic1, 2, OpenPIC_PAddr + 0x10300);
+       mpic_assign_isu(mpic1, 3, OpenPIC_PAddr + 0x10380);
+       mpic_assign_isu(mpic1, 4, OpenPIC_PAddr + 0x10400);
+       mpic_assign_isu(mpic1, 5, OpenPIC_PAddr + 0x10480);
+       mpic_assign_isu(mpic1, 6, OpenPIC_PAddr + 0x10500);
+       mpic_assign_isu(mpic1, 7, OpenPIC_PAddr + 0x10580);
+
+       /* dummy mappings to get to 48 */
+       mpic_assign_isu(mpic1, 8, OpenPIC_PAddr + 0x10600);
+       mpic_assign_isu(mpic1, 9, OpenPIC_PAddr + 0x10680);
+       mpic_assign_isu(mpic1, 10, OpenPIC_PAddr + 0x10700);
+       mpic_assign_isu(mpic1, 11, OpenPIC_PAddr + 0x10780);
+
+       /* External ints */
+       mpic_assign_isu(mpic1, 12, OpenPIC_PAddr + 0x10000);
+       mpic_assign_isu(mpic1, 13, OpenPIC_PAddr + 0x10080);
+       mpic_assign_isu(mpic1, 14, OpenPIC_PAddr + 0x10100);
+       mpic_init(mpic1);
+}
+
+/*
+ * Setup the architecture
+ */
+static void __init mpc85xx_ads_setup_arch(void)
+{
+       struct device_node *cpu;
+       struct device_node *np;
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc85xx_ads_setup_arch()", 0);
+
+       cpu = of_find_node_by_type(NULL, "cpu");
+       if (cpu != 0) {
+               unsigned int *fp;
+
+               fp = (int *)get_property(cpu, "clock-frequency", NULL);
+               if (fp != 0)
+                       loops_per_jiffy = *fp / HZ;
+               else
+                       loops_per_jiffy = 50000000 / HZ;
+               of_node_put(cpu);
+       }
+
+#ifdef CONFIG_PCI
+       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+               add_bridge(np);
+
+       ppc_md.pci_swizzle = common_swizzle;
+       ppc_md.pci_map_irq = mpc85xx_map_irq;
+       ppc_md.pci_exclude_device = mpc85xx_exclude_device;
+#endif
+
+#ifdef  CONFIG_ROOT_NFS
+       ROOT_DEV = Root_NFS;
+#else
+       ROOT_DEV = Root_HDA1;
+#endif
+}
+
+void mpc85xx_ads_show_cpuinfo(struct seq_file *m)
+{
+       uint pvid, svid, phid1;
+       uint memsize = total_memory;
+
+       pvid = mfspr(SPRN_PVR);
+       svid = mfspr(SPRN_SVR);
+
+       seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n");
+       seq_printf(m, "Machine\t\t: mpc85xx\n");
+       seq_printf(m, "PVR\t\t: 0x%x\n", pvid);
+       seq_printf(m, "SVR\t\t: 0x%x\n", svid);
+
+       /* Display cpu Pll setting */
+       phid1 = mfspr(SPRN_HID1);
+       seq_printf(m, "PLL setting\t: 0x%x\n", ((phid1 >> 24) & 0x3f));
+
+       /* Display the amount of memory */
+       seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
+}
+
+void __init platform_init(void)
+{
+       ppc_md.setup_arch = mpc85xx_ads_setup_arch;
+       ppc_md.show_cpuinfo = mpc85xx_ads_show_cpuinfo;
+
+       ppc_md.init_IRQ = mpc85xx_ads_pic_init;
+       ppc_md.get_irq = mpic_get_irq;
+
+       ppc_md.restart = mpc85xx_restart;
+       ppc_md.power_off = NULL;
+       ppc_md.halt = NULL;
+
+       ppc_md.time_init = NULL;
+       ppc_md.set_rtc_time = NULL;
+       ppc_md.get_rtc_time = NULL;
+       ppc_md.calibrate_decr = generic_calibrate_decr;
+
+       ppc_md.progress = udbg_progress;
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc85xx_ads platform_init(): exit", 0);
+}
diff --git a/arch/powerpc/platforms/85xx/pci.c b/arch/powerpc/platforms/85xx/pci.c
new file mode 100644 (file)
index 0000000..bad2901
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * FSL SoC setup code
+ *
+ * Maintained by Kumar Gala (see MAINTAINERS for contact information)
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/pci.h>
+#include <linux/delay.h>
+#include <linux/irq.h>
+#include <linux/module.h>
+
+#include <asm/system.h>
+#include <asm/atomic.h>
+#include <asm/io.h>
+#include <asm/pci-bridge.h>
+#include <asm/prom.h>
+#include <sysdev/fsl_soc.h>
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define DBG(x...) printk(x)
+#else
+#define DBG(x...)
+#endif
+
+int mpc85xx_pci2_busno = 0;
+
+#ifdef CONFIG_PCI
+int __init add_bridge(struct device_node *dev)
+{
+       int len;
+       struct pci_controller *hose;
+       struct resource rsrc;
+       int *bus_range;
+       int primary = 1, has_address = 0;
+       phys_addr_t immr = get_immrbase();
+
+       DBG("Adding PCI host bridge %s\n", dev->full_name);
+
+       /* Fetch host bridge registers address */
+       has_address = (of_address_to_resource(dev, 0, &rsrc) == 0);
+
+       /* Get bus range if any */
+       bus_range = (int *) get_property(dev, "bus-range", &len);
+       if (bus_range == NULL || len < 2 * sizeof(int)) {
+               printk(KERN_WARNING "Can't get bus-range for %s, assume"
+                      " bus 0\n", dev->full_name);
+       }
+
+       hose = pcibios_alloc_controller();
+       if (!hose)
+               return -ENOMEM;
+       hose->arch_data = dev;
+       hose->set_cfg_type = 1;
+
+       hose->first_busno = bus_range ? bus_range[0] : 0;
+       hose->last_busno = bus_range ? bus_range[1] : 0xff;
+
+       /* PCI 1 */
+       if ((rsrc.start & 0xfffff) == 0x8000) {
+               setup_indirect_pci(hose, immr + 0x8000, immr + 0x8004);
+       }
+       /* PCI 2 */
+       if ((rsrc.start & 0xfffff) == 0x9000) {
+               setup_indirect_pci(hose, immr + 0x9000, immr + 0x9004);
+               primary = 0;
+               hose->bus_offset = hose->first_busno;
+               mpc85xx_pci2_busno = hose->first_busno;
+       }
+
+       printk(KERN_INFO "Found MPC85xx PCI host bridge at 0x%08lx. "
+              "Firmware bus number: %d->%d\n",
+               rsrc.start, hose->first_busno, hose->last_busno);
+
+       DBG(" ->Hose at 0x%p, cfg_addr=0x%p,cfg_data=0x%p\n",
+               hose, hose->cfg_addr, hose->cfg_data);
+
+       /* Interpret the "ranges" property */
+       /* This also maps the I/O region and sets isa_io/mem_base */
+       pci_process_bridge_OF_ranges(hose, dev, primary);
+
+       return 0;
+}
+
+#endif
index 04073fd987ec465d11686ab047ec7456cc24b72a..c4f6b0d2d140002f69a58d3625afd1be6c2617d2 100644 (file)
@@ -8,7 +8,7 @@ endif
 obj-$(CONFIG_PPC_CHRP)         += chrp/
 obj-$(CONFIG_4xx)              += 4xx/
 obj-$(CONFIG_PPC_83xx)         += 83xx/
-obj-$(CONFIG_85xx)             += 85xx/
+obj-$(CONFIG_PPC_85xx)         += 85xx/
 obj-$(CONFIG_PPC_PSERIES)      += pseries/
 obj-$(CONFIG_PPC_ISERIES)      += iseries/
 obj-$(CONFIG_PPC_MAPLE)                += maple/
index 29c86781c49365e0ca1e05ecf8fe388f4f7f425c..6ad4b1a72c96b9e5aa838305e413a12b212394eb 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/platforms/chrp_pegasos_eth.c
- *
  *  Copyright (C) 2005 Sven Luther <sl@bplan-gmbh.de>
  *  Thanks to :
  *     Dale Farnsworth <dale@farnsworth.org>
index e1fadbf49150d333b780ef3b2b6f757fd6db020c..8bf4307e323df5c58c5dc7f27204101829f8690b 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/platforms/setup.c
- *
  *  Copyright (C) 1995  Linus Torvalds
  *  Adapted from 'alpha' version by Gary Thomas
  *  Modified by Cort Dougan (cort@cs.nmt.edu)
index 78df2e7ca88a1c9d5edc76e54ad7f9102420dd2e..12c6f689b1aa443af167344a4bc976b27caba44f 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/platforms/chrp_time.c
- *
  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
  *
  * Adapted for PowerPC (PReP) by Gary Thomas
index a41d8b78c0cd6e15b8e83c57321eff84fb26dbe9..d771b8ee857d59462af2a5dde6c870dfa6e52b13 100644 (file)
@@ -46,6 +46,7 @@
 #include "setup.h"
 
 extern int piranha_simulator;
+static int mf_initialized;
 
 /*
  * This is the structure layout for the Machine Facilites LPAR event
@@ -143,7 +144,8 @@ static spinlock_t pending_event_spinlock;
 static struct pending_event *pending_event_head;
 static struct pending_event *pending_event_tail;
 static struct pending_event *pending_event_avail;
-static struct pending_event pending_event_prealloc[16];
+#define PENDING_EVENT_PREALLOC_LEN 16
+static struct pending_event pending_event_prealloc[PENDING_EVENT_PREALLOC_LEN];
 
 /*
  * Put a pending event onto the available queue, so it can get reused.
@@ -597,7 +599,7 @@ void mf_power_off(void)
  * Global kernel interface to tell the VSP object in the primary
  * partition to reboot this partition.
  */
-void mf_reboot(void)
+void mf_reboot(char *cmd)
 {
        printk(KERN_INFO "mf.c: Preparing to bounce...\n");
        signal_ce_msg_simple(0x4e, NULL);
@@ -625,7 +627,7 @@ void mf_display_src(u32 word)
 /*
  * Display a single word SRC of the form "PROGXXXX" on the VSP control panel.
  */
-void mf_display_progress(u16 value)
+static __init void mf_display_progress_src(u16 value)
 {
        u8 ce[12];
        u8 src[72];
@@ -649,30 +651,42 @@ void mf_display_progress(u16 value)
  * Clear the VSP control panel.  Used to "erase" an SRC that was
  * previously displayed.
  */
-void mf_clear_src(void)
+static void mf_clear_src(void)
 {
        signal_ce_msg_simple(0x4b, NULL);
 }
 
+void __init mf_display_progress(u16 value)
+{
+       if (piranha_simulator || !mf_initialized)
+               return;
+
+       if (0xFFFF == value)
+               mf_clear_src();
+       else
+               mf_display_progress_src(value);
+}
+
 /*
  * Initialization code here.
  */
-void mf_init(void)
+void __init mf_init(void)
 {
        int i;
 
-       /* initialize */
        spin_lock_init(&pending_event_spinlock);
-       for (i = 0;
-            i < sizeof(pending_event_prealloc) / sizeof(*pending_event_prealloc);
-            ++i)
+
+       for (i = 0; i < PENDING_EVENT_PREALLOC_LEN; i++)
                free_pending_event(&pending_event_prealloc[i]);
+
        HvLpEvent_registerHandler(HvLpEvent_Type_MachineFac, &hv_handler);
 
        /* virtual continue ack */
        signal_ce_msg_simple(0x57, NULL);
 
-       /* initialization complete */
+       mf_initialized = 1;
+       mb();
+
        printk(KERN_NOTICE "mf.c: iSeries Linux LPAR Machine Facilities "
                        "initialized\n");
 }
@@ -692,6 +706,43 @@ static void get_rtc_time_complete(void *token, struct ce_msg_data *ce_msg)
        complete(&rtc->com);
 }
 
+static int mf_set_rtc(struct rtc_time *tm)
+{
+       char ce_time[12];
+       u8 day, mon, hour, min, sec, y1, y2;
+       unsigned year;
+
+       year = 1900 + tm->tm_year;
+       y1 = year / 100;
+       y2 = year % 100;
+
+       sec = tm->tm_sec;
+       min = tm->tm_min;
+       hour = tm->tm_hour;
+       day = tm->tm_mday;
+       mon = tm->tm_mon + 1;
+
+       BIN_TO_BCD(sec);
+       BIN_TO_BCD(min);
+       BIN_TO_BCD(hour);
+       BIN_TO_BCD(mon);
+       BIN_TO_BCD(day);
+       BIN_TO_BCD(y1);
+       BIN_TO_BCD(y2);
+
+       memset(ce_time, 0, sizeof(ce_time));
+       ce_time[3] = 0x41;
+       ce_time[4] = y1;
+       ce_time[5] = y2;
+       ce_time[6] = sec;
+       ce_time[7] = min;
+       ce_time[8] = hour;
+       ce_time[10] = day;
+       ce_time[11] = mon;
+
+       return signal_ce_msg(ce_time, NULL);
+}
+
 static int rtc_set_tm(int rc, u8 *ce_msg, struct rtc_time *tm)
 {
        tm->tm_wday = 0;
@@ -747,7 +798,7 @@ static int rtc_set_tm(int rc, u8 *ce_msg, struct rtc_time *tm)
        return 0;
 }
 
-int mf_get_rtc(struct rtc_time *tm)
+static int mf_get_rtc(struct rtc_time *tm)
 {
        struct ce_msg_comp_data ce_complete;
        struct rtc_time_data rtc_data;
@@ -780,7 +831,7 @@ static void get_boot_rtc_time_complete(void *token, struct ce_msg_data *ce_msg)
        rtc->busy = 0;
 }
 
-int mf_get_boot_rtc(struct rtc_time *tm)
+static int mf_get_boot_rtc(struct rtc_time *tm)
 {
        struct ce_msg_comp_data ce_complete;
        struct boot_rtc_time_data rtc_data;
@@ -802,43 +853,6 @@ int mf_get_boot_rtc(struct rtc_time *tm)
        return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm);
 }
 
-int mf_set_rtc(struct rtc_time *tm)
-{
-       char ce_time[12];
-       u8 day, mon, hour, min, sec, y1, y2;
-       unsigned year;
-
-       year = 1900 + tm->tm_year;
-       y1 = year / 100;
-       y2 = year % 100;
-
-       sec = tm->tm_sec;
-       min = tm->tm_min;
-       hour = tm->tm_hour;
-       day = tm->tm_mday;
-       mon = tm->tm_mon + 1;
-
-       BIN_TO_BCD(sec);
-       BIN_TO_BCD(min);
-       BIN_TO_BCD(hour);
-       BIN_TO_BCD(mon);
-       BIN_TO_BCD(day);
-       BIN_TO_BCD(y1);
-       BIN_TO_BCD(y2);
-
-       memset(ce_time, 0, sizeof(ce_time));
-       ce_time[3] = 0x41;
-       ce_time[4] = y1;
-       ce_time[5] = y2;
-       ce_time[6] = sec;
-       ce_time[7] = min;
-       ce_time[8] = hour;
-       ce_time[10] = day;
-       ce_time[11] = mon;
-
-       return signal_ce_msg(ce_time, NULL);
-}
-
 #ifdef CONFIG_PROC_FS
 
 static int proc_mf_dump_cmdline(char *page, char **start, off_t off,
index 3ecc4a652d82e55425f6d3c3b8441266e389e316..fa4550611c118b91234b5690f206df7dcdc3487d 100644 (file)
@@ -50,6 +50,7 @@
 #include <asm/iseries/hv_call_xm.h>
 #include <asm/iseries/it_lp_queue.h>
 #include <asm/iseries/mf.h>
+#include <asm/iseries/it_exp_vpd_panel.h>
 #include <asm/iseries/hv_lp_event.h>
 #include <asm/iseries/lpar_map.h>
 #include <asm/udbg.h>
@@ -89,8 +90,6 @@ extern unsigned long embedded_sysmap_end;
 extern unsigned long iSeries_recal_tb;
 extern unsigned long iSeries_recal_titan;
 
-static int mf_initialized;
-
 static unsigned long cmd_mem_limit;
 
 struct MemoryBlock {
@@ -303,8 +302,6 @@ static void __init iSeries_init_early(void)
 {
        DBG(" -> iSeries_init_early()\n");
 
-       ppc64_firmware_features = FW_FEATURE_ISERIES;
-
        ppc64_interrupt_controller = IC_ISERIES;
 
 #if defined(CONFIG_BLK_DEV_INITRD)
@@ -349,8 +346,6 @@ static void __init iSeries_init_early(void)
        HvCallEvent_setLpEventQueueInterruptProc(0, 0);
 
        mf_init();
-       mf_initialized = 1;
-       mb();
 
        /* If we were passed an initrd, set the ROOT_DEV properly if the values
         * look sensible. If not, clear initrd reference.
@@ -560,39 +555,10 @@ static void iSeries_show_cpuinfo(struct seq_file *m)
        seq_printf(m, "machine\t\t: 64-bit iSeries Logical Partition\n");
 }
 
-/*
- * Document me.
- */
-static void iSeries_restart(char *cmd)
-{
-       mf_reboot();
-}
-
-/*
- * Document me.
- */
-static void iSeries_power_off(void)
-{
-       mf_power_off();
-}
-
-/*
- * Document me.
- */
-static void iSeries_halt(void)
-{
-       mf_power_off();
-}
-
 static void __init iSeries_progress(char * st, unsigned short code)
 {
        printk("Progress: [%04x] - %s\n", (unsigned)code, st);
-       if (!piranha_simulator && mf_initialized) {
-               if (code != 0xffff)
-                       mf_display_progress(code);
-               else
-                       mf_clear_src();
-       }
+       mf_display_progress(code);
 }
 
 static void __init iSeries_fixup_klimit(void)
@@ -711,7 +677,13 @@ void __init iSeries_init_IRQ(void) { }
 
 static int __init iseries_probe(int platform)
 {
-       return PLATFORM_ISERIES_LPAR == platform;
+       if (PLATFORM_ISERIES_LPAR != platform)
+               return 0;
+
+       ppc64_firmware_features |= FW_FEATURE_ISERIES;
+       ppc64_firmware_features |= FW_FEATURE_LPAR;
+
+       return 1;
 }
 
 struct machdep_calls __initdata iseries_md = {
@@ -721,9 +693,9 @@ struct machdep_calls __initdata iseries_md = {
        .get_irq        = iSeries_get_irq,
        .init_early     = iSeries_init_early,
        .pcibios_fixup  = iSeries_pci_final_fixup,
-       .restart        = iSeries_restart,
-       .power_off      = iSeries_power_off,
-       .halt           = iSeries_halt,
+       .restart        = mf_reboot,
+       .power_off      = mf_power_off,
+       .halt           = mf_power_off,
        .get_boot_time  = iSeries_get_boot_time,
        .set_rtc_time   = iSeries_set_rtc_time,
        .get_rtc_time   = iSeries_get_rtc_time,
@@ -917,6 +889,24 @@ void dt_cpus(struct iseries_flat_dt *dt)
        dt_end_node(dt);
 }
 
+void dt_model(struct iseries_flat_dt *dt)
+{
+       char buf[16] = "IBM,";
+
+       /* "IBM," + mfgId[2:3] + systemSerial[1:5] */
+       strne2a(buf + 4, xItExtVpdPanel.mfgID + 2, 2);
+       strne2a(buf + 6, xItExtVpdPanel.systemSerial + 1, 5);
+       buf[11] = '\0';
+       dt_prop_str(dt, "system-id", buf);
+
+       /* "IBM," + machineType[0:4] */
+       strne2a(buf + 4, xItExtVpdPanel.machineType, 4);
+       buf[8] = '\0';
+       dt_prop_str(dt, "model", buf);
+
+       dt_prop_str(dt, "compatible", "IBM,iSeries");
+}
+
 void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size)
 {
        u64 tmp[2];
@@ -927,6 +917,7 @@ void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size)
 
        dt_prop_u32(dt, "#address-cells", 2);
        dt_prop_u32(dt, "#size-cells", 2);
+       dt_model(dt);
 
        /* /memory */
        dt_start_node(dt, "memory@0");
@@ -940,6 +931,7 @@ void build_flat_dt(struct iseries_flat_dt *dt, unsigned long phys_mem_size)
        /* /chosen */
        dt_start_node(dt, "chosen");
        dt_prop_u32(dt, "linux,platform", PLATFORM_ISERIES_LPAR);
+       dt_prop_str(dt, "bootargs", cmd_line);
        if (cmd_mem_limit)
                dt_prop_u64(dt, "linux,memory-limit", cmd_mem_limit);
        dt_end_node(dt);
index 50bc4eb853535bca3e78eae519dbf98367b7f294..5e6981d17379351ccf5bdf60f3b84bc7d843a8e1 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc64/kernel/maple_time.c
- *
  *  (c) Copyright 2004 Benjamin Herrenschmidt (benh@kernel.crashing.org),
  *                     IBM Corp. 
  *
index 56fd4e05fede95b68d05e91b075e91f2c2ab535b..cfd6527a0d7e0799ec140bb5688481b2322112f7 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/platforms/pmac_cpufreq.c
- *
  *  Copyright (C) 2002 - 2005 Benjamin Herrenschmidt <benh@kernel.crashing.org>
  *  Copyright (C) 2004        John Steele Scott <toojays@toojays.net>
  *
index bbe794891a2076c22dc7b361b79b95451b0b6f1a..e49eddd5042d0d0847b89b0d14bf63a31564d58a 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/platforms/pmac_feature.c
- *
  *  Copyright (C) 1996-2001 Paul Mackerras (paulus@cs.anu.edu.au)
  *                          Ben. Herrenschmidt (benh@kernel.crashing.org)
  *
index 3ebd045a335048a954cc401bd9dc135df0473103..5fd28995c74ceabb01f0c35792138918003c036a 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/platforms/pmac_nvram.c
- *
  *  Copyright (C) 2002 Benjamin Herrenschmidt (benh@kernel.crashing.org)
  *
  *  This program is free software; you can redistribute it and/or
index 29c2946f1c77e5f00dfb68fd686221d37b7f36f4..385aab90c4d264bfa3a4353d6144c8dbf86cafb7 100644 (file)
@@ -86,11 +86,10 @@ int ppc_override_l2cr = 0;
 int ppc_override_l2cr_value;
 int has_l2cache = 0;
 
-int pmac_newworld = 1;
+int pmac_newworld;
 
 static int current_root_goodness = -1;
 
-extern int pmac_newworld;
 extern struct machdep_calls pmac_md;
 
 #define DEFAULT_ROOT_DEVICE Root_SDA1  /* sda1 - slightly silly choice */
@@ -308,9 +307,10 @@ static void __init pmac_setup_arch(void)
        for (ic = NULL; (ic = of_find_all_nodes(ic)) != NULL; )
                if (get_property(ic, "interrupt-controller", NULL))
                        break;
-       pmac_newworld = (ic != NULL);
-       if (ic)
+       if (ic) {
+               pmac_newworld = 1;
                of_node_put(ic);
+       }
 
        /* Lookup PCI hosts */
        pmac_pci_init();
index 61616d1440729371060f711226672852addf82b4..930898635c9ffa2c25d6d8afb04221768f36ce43 100644 (file)
@@ -1,5 +1,6 @@
 obj-y                  := pci.o lpar.o hvCall.o nvram.o reconfig.o \
-                          setup.o iommu.o ras.o rtasd.o pci_dlpar.o
+                          setup.o iommu.o ras.o rtasd.o pci_dlpar.o \
+                          firmware.o
 obj-$(CONFIG_SMP)      += smp.o
 obj-$(CONFIG_IBMVIO)   += vio.o
 obj-$(CONFIG_XICS)     += xics.o
diff --git a/arch/powerpc/platforms/pseries/firmware.c b/arch/powerpc/platforms/pseries/firmware.c
new file mode 100644 (file)
index 0000000..989f4bc
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ *  pSeries firmware setup code.
+ *
+ *  Portions from arch/powerpc/platforms/pseries/setup.c:
+ *   Copyright (C) 1995  Linus Torvalds
+ *   Adapted from 'alpha' version by Gary Thomas
+ *   Modified by Cort Dougan (cort@cs.nmt.edu)
+ *   Modified by PPC64 Team, IBM Corp
+ *
+ *  Portions from arch/powerpc/kernel/firmware.c
+ *   Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
+ *   Modifications for ppc64:
+ *    Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
+ *    Copyright (C) 2005 Stephen Rothwell, IBM Corporation
+ *
+ *  Copyright 2006 IBM Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#undef DEBUG
+
+#include <asm/firmware.h>
+#include <asm/prom.h>
+
+#ifdef DEBUG
+#define DBG(fmt...) udbg_printf(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+typedef struct {
+    unsigned long val;
+    char * name;
+} firmware_feature_t;
+
+static __initdata firmware_feature_t
+firmware_features_table[FIRMWARE_MAX_FEATURES] = {
+       {FW_FEATURE_PFT,                "hcall-pft"},
+       {FW_FEATURE_TCE,                "hcall-tce"},
+       {FW_FEATURE_SPRG0,              "hcall-sprg0"},
+       {FW_FEATURE_DABR,               "hcall-dabr"},
+       {FW_FEATURE_COPY,               "hcall-copy"},
+       {FW_FEATURE_ASR,                "hcall-asr"},
+       {FW_FEATURE_DEBUG,              "hcall-debug"},
+       {FW_FEATURE_PERF,               "hcall-perf"},
+       {FW_FEATURE_DUMP,               "hcall-dump"},
+       {FW_FEATURE_INTERRUPT,          "hcall-interrupt"},
+       {FW_FEATURE_MIGRATE,            "hcall-migrate"},
+       {FW_FEATURE_PERFMON,            "hcall-perfmon"},
+       {FW_FEATURE_CRQ,                "hcall-crq"},
+       {FW_FEATURE_VIO,                "hcall-vio"},
+       {FW_FEATURE_RDMA,               "hcall-rdma"},
+       {FW_FEATURE_LLAN,               "hcall-lLAN"},
+       {FW_FEATURE_BULK,               "hcall-bulk"},
+       {FW_FEATURE_XDABR,              "hcall-xdabr"},
+       {FW_FEATURE_MULTITCE,           "hcall-multi-tce"},
+       {FW_FEATURE_SPLPAR,             "hcall-splpar"},
+};
+
+/* Build up the firmware features bitmask using the contents of
+ * device-tree/ibm,hypertas-functions.  Ultimately this functionality may
+ * be moved into prom.c prom_init().
+ */
+void __init fw_feature_init(void)
+{
+       struct device_node *dn;
+       char *hypertas, *s;
+       int len, i;
+
+       DBG(" -> fw_feature_init()\n");
+
+       dn = of_find_node_by_path("/rtas");
+       if (dn == NULL) {
+               printk(KERN_ERR "WARNING! Cannot find RTAS in device-tree!\n");
+               goto out;
+       }
+
+       hypertas = get_property(dn, "ibm,hypertas-functions", &len);
+       if (hypertas == NULL)
+               goto out;
+
+       for (s = hypertas; s < hypertas + len; s += strlen(s) + 1) {
+               for (i = 0; i < FIRMWARE_MAX_FEATURES; i++) {
+                       /* check value against table of strings */
+                       if (!firmware_features_table[i].name ||
+                           strcmp(firmware_features_table[i].name, s))
+                               continue;
+
+                       /* we have a match */
+                       ppc64_firmware_features |=
+                               firmware_features_table[i].val;
+                       break;
+               }
+       }
+
+out:
+       of_node_put(dn);
+       DBG(" <- fw_feature_init()\n");
+}
diff --git a/arch/powerpc/platforms/pseries/firmware.h b/arch/powerpc/platforms/pseries/firmware.h
new file mode 100644 (file)
index 0000000..714f56f
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2006 IBM Corporation.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version
+ *  2 of the License, or (at your option) any later version.
+ */
+
+#ifndef _PSERIES_FIRMWARE_H
+#define _PSERIES_FIRMWARE_H
+
+#include <asm/firmware.h>
+
+extern void __init fw_feature_init(void);
+
+#endif /* _PSERIES_FIRMWARE_H */
index 176e8da764669c4c0c712fe819ed74b3e45c8ae6..db7c19fe92972ccb3fc750e2d53a71737c608552 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/kernel/pSeries_hvCall.S
- *
  * This file contains the generic code to perform a call to the
  * pSeries LPAR hypervisor.
  * NOTE: this file will go away when we move to inline this work.
index 48cfbfc43f9921df42965ade250cf84887b68304..2643078433f0123f8997c7f98823934e7b1feadb 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/kernel/pSeries_iommu.c
- *
  * Copyright (C) 2001 Mike Corrigan & Dave Engebretsen, IBM Corporation
  *
  * Rewrite, cleanup: 
@@ -582,7 +580,7 @@ void iommu_init_early_pSeries(void)
                return;
        }
 
-       if (platform_is_lpar()) {
+       if (firmware_has_feature(FW_FEATURE_LPAR)) {
                if (firmware_has_feature(FW_FEATURE_MULTITCE)) {
                        ppc_md.tce_build = tce_buildmulti_pSeriesLP;
                        ppc_md.tce_free  = tce_freemulti_pSeriesLP;
index 999a9620b5ce0f13f89cc08a8d75895ca46cad97..946ad59e3352047eb86728e76f619308bdc92859 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc64/kernel/pSeries_pci.c
- *
  * Copyright (C) 2001 Dave Engebretsen, IBM Corporation
  * Copyright (C) 2003 Anton Blanchard <anton@au.ibm.com>, IBM
  *
index 9edeca83f43463e3ca5e0d1fba5fbc829bdd262e..44d5c7fdcd9704d1b294f070799ae4d7409cf521 100644 (file)
@@ -60,7 +60,6 @@
 #include <asm/time.h>
 #include <asm/nvram.h>
 #include "xics.h"
-#include <asm/firmware.h>
 #include <asm/pmc.h>
 #include <asm/mpic.h>
 #include <asm/ppc-pci.h>
@@ -70,6 +69,7 @@
 
 #include "plpar_wrappers.h"
 #include "ras.h"
+#include "firmware.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -246,7 +246,7 @@ static void __init pSeries_setup_arch(void)
                ppc_md.idle_loop = default_idle;
        }
 
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
        else
                ppc_md.enable_pmcs = power4_enable_pmcs;
@@ -262,53 +262,6 @@ static int __init pSeries_init_panel(void)
 }
 arch_initcall(pSeries_init_panel);
 
-
-/* Build up the ppc64_firmware_features bitmask field
- * using contents of device-tree/ibm,hypertas-functions.
- * Ultimately this functionality may be moved into prom.c prom_init().
- */
-static void __init fw_feature_init(void)
-{
-       struct device_node * dn;
-       char * hypertas;
-       unsigned int len;
-
-       DBG(" -> fw_feature_init()\n");
-
-       ppc64_firmware_features = 0;
-       dn = of_find_node_by_path("/rtas");
-       if (dn == NULL) {
-               printk(KERN_ERR "WARNING ! Cannot find RTAS in device-tree !\n");
-               goto no_rtas;
-       }
-
-       hypertas = get_property(dn, "ibm,hypertas-functions", &len);
-       if (hypertas) {
-               while (len > 0){
-                       int i, hypertas_len;
-                       /* check value against table of strings */
-                       for(i=0; i < FIRMWARE_MAX_FEATURES ;i++) {
-                               if ((firmware_features_table[i].name) &&
-                                   (strcmp(firmware_features_table[i].name,hypertas))==0) {
-                                       /* we have a match */
-                                       ppc64_firmware_features |= 
-                                               (firmware_features_table[i].val);
-                                       break;
-                               } 
-                       }
-                       hypertas_len = strlen(hypertas);
-                       len -= hypertas_len +1;
-                       hypertas+= hypertas_len +1;
-               }
-       }
-
-       of_node_put(dn);
-no_rtas:
-
-       DBG(" <- fw_feature_init()\n");
-}
-
-
 static  void __init pSeries_discover_pic(void)
 {
        struct device_node *np;
@@ -367,21 +320,16 @@ static int pseries_set_xdabr(unsigned long dabr)
  */
 static void __init pSeries_init_early(void)
 {
-       int iommu_off = 0;
-
        DBG(" -> pSeries_init_early()\n");
 
        fw_feature_init();
        
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                hpte_init_lpar();
-       else {
+       else
                hpte_init_native();
-               iommu_off = (of_chosen &&
-                            get_property(of_chosen, "linux,iommu-off", NULL));
-       }
 
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                find_udbg_vterm();
 
        if (firmware_has_feature(FW_FEATURE_DABR))
@@ -437,6 +385,9 @@ static int __init pSeries_probe(int platform)
         * it here ...
         */
 
+       if (platform == PLATFORM_PSERIES_LPAR)
+               ppc64_firmware_features |= FW_FEATURE_LPAR;
+
        return 1;
 }
 
@@ -576,7 +527,7 @@ static void pseries_shared_idle(void)
 
 static int pSeries_pci_probe_mode(struct pci_bus *bus)
 {
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                return PCI_PROBE_DEVTREE;
        return PCI_PROBE_NORMAL;
 }
index 8d710af50756602f10c0c37480f70285d54008af..3cf78a6cd27c32d55659cec05350ed28f8835a86 100644 (file)
@@ -443,7 +443,7 @@ void __init smp_init_pSeries(void)
        smp_ops->cpu_die = pSeries_cpu_die;
 
        /* Processors can be added/removed only on LPAR */
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                pSeries_reconfig_notifier_register(&pSeries_smp_nb);
 #endif
 
index fd823c7c9ac88e6db77d9d912750819df682ccd3..eb86cdb9b80248a5f1b77b6e07298119583d4966 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/gfp.h>
 #include <linux/radix-tree.h>
 #include <linux/cpu.h>
+#include <asm/firmware.h>
 #include <asm/prom.h>
 #include <asm/io.h>
 #include <asm/pgtable.h>
@@ -536,7 +537,7 @@ nextnode:
                of_node_put(np);
        }
 
-       if (platform_is_lpar())
+       if (firmware_has_feature(FW_FEATURE_LPAR))
                ops = &pSeriesLP_ops;
        else {
 #ifdef CONFIG_SMP
index 6298264efe36110bdc8318001180d3d8eb751fba..61d317428610ab3d953211366d2e938284f0d72a 100644 (file)
@@ -194,8 +194,6 @@ static int dart_init(struct device_node *dart_node)
         * prefetching into invalid pages and corrupting data
         */
        tmp = lmb_alloc(DART_PAGE_SIZE, DART_PAGE_SIZE);
-       if (!tmp)
-               panic("DART: Cannot allocate spare page!");
        dart_emptyval = DARTMAP_VALID | ((tmp >> DART_PAGE_SHIFT) &
                                         DARTMAP_RPNMASK);
 
index 895f10243a43a9341e662c9e8a68d8119725b846..2078f39e2f179a2341b4916bb79d5b32ab6930ae 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc/syslib/dcr.S
- *
  * "Indirect" DCR access
  *
  * Copyright (c) 2004 Eugene Surovegin <ebs@ebshome.net>
index 064c9de47732166e915c0ddc39b79c8cdfcd62a2..ceb584682fa30f64d9c7bbc3d84af53db5d2d8f0 100644 (file)
@@ -40,7 +40,7 @@ phys_addr_t get_immrbase(void)
                return immrbase;
 
        soc = of_find_node_by_type(NULL, "soc");
-       if (soc != 0) {
+       if (soc) {
                unsigned int size;
                void *prop = get_property(soc, "reg", &size);
                immrbase = of_translate_address(soc, prop);
@@ -49,21 +49,20 @@ phys_addr_t get_immrbase(void)
 
        return immrbase;
 }
-EXPORT_SYMBOL(get_immrbase);
 
-static const char * gfar_tx_intr = "tx";
-static const char * gfar_rx_intr = "rx";
-static const char * gfar_err_intr = "error";
+EXPORT_SYMBOL(get_immrbase);
 
-static int __init gfar_of_init(void)
+static int __init gfar_mdio_of_init(void)
 {
        struct device_node *np;
        unsigned int i;
-       struct platform_device *mdio_dev, *gfar_dev;
+       struct platform_device *mdio_dev;
        struct resource res;
        int ret;
 
-       for (np = NULL, i = 0; (np = of_find_compatible_node(np, "mdio", "gianfar")) != NULL; i++) {
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "mdio", "gianfar")) != NULL;
+            i++) {
                int k;
                struct device_node *child = NULL;
                struct gianfar_mdio_data mdio_data;
@@ -73,12 +72,14 @@ static int __init gfar_of_init(void)
 
                ret = of_address_to_resource(np, 0, &res);
                if (ret)
-                       goto mdio_err;
+                       goto err;
 
-               mdio_dev = platform_device_register_simple("fsl-gianfar_mdio", res.start, &res, 1);
+               mdio_dev =
+                   platform_device_register_simple("fsl-gianfar_mdio",
+                                                   res.start, &res, 1);
                if (IS_ERR(mdio_dev)) {
                        ret = PTR_ERR(mdio_dev);
-                       goto mdio_err;
+                       goto err;
                }
 
                for (k = 0; k < 32; k++)
@@ -86,17 +87,44 @@ static int __init gfar_of_init(void)
 
                while ((child = of_get_next_child(np, child)) != NULL) {
                        if (child->n_intrs) {
-                               u32 *id = (u32 *) get_property(child, "reg", NULL);
+                               u32 *id =
+                                   (u32 *) get_property(child, "reg", NULL);
                                mdio_data.irq[*id] = child->intrs[0].line;
                        }
                }
 
-               ret = platform_device_add_data(mdio_dev, &mdio_data, sizeof(struct gianfar_mdio_data));
+               ret =
+                   platform_device_add_data(mdio_dev, &mdio_data,
+                                            sizeof(struct gianfar_mdio_data));
                if (ret)
-                       goto mdio_unreg;
+                       goto unreg;
        }
 
-       for (np = NULL, i = 0; (np = of_find_compatible_node(np, "network", "gianfar")) != NULL; i++) {
+       return 0;
+
+unreg:
+       platform_device_unregister(mdio_dev);
+err:
+       return ret;
+}
+
+arch_initcall(gfar_mdio_of_init);
+
+static const char *gfar_tx_intr = "tx";
+static const char *gfar_rx_intr = "rx";
+static const char *gfar_err_intr = "error";
+
+static int __init gfar_of_init(void)
+{
+       struct device_node *np;
+       unsigned int i;
+       struct platform_device *gfar_dev;
+       struct resource res;
+       int ret;
+
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "network", "gianfar")) != NULL;
+            i++) {
                struct resource r[4];
                struct device_node *phy, *mdio;
                struct gianfar_platform_data gfar_data;
@@ -110,7 +138,7 @@ static int __init gfar_of_init(void)
 
                ret = of_address_to_resource(np, 0, &r[0]);
                if (ret)
-                       goto gfar_err;
+                       goto err;
 
                r[1].start = np->intrs[0].line;
                r[1].end = np->intrs[0].line;
@@ -133,11 +161,13 @@ static int __init gfar_of_init(void)
                        r[3].flags = IORESOURCE_IRQ;
                }
 
-               gfar_dev = platform_device_register_simple("fsl-gianfar", i, &r[0], np->n_intrs + 1);
+               gfar_dev =
+                   platform_device_register_simple("fsl-gianfar", i, &r[0],
+                                                   np->n_intrs + 1);
 
                if (IS_ERR(gfar_dev)) {
                        ret = PTR_ERR(gfar_dev);
-                       goto gfar_err;
+                       goto err;
                }
 
                mac_addr = get_property(np, "address", NULL);
@@ -145,26 +175,26 @@ static int __init gfar_of_init(void)
 
                if (model && !strcasecmp(model, "TSEC"))
                        gfar_data.device_flags =
-                               FSL_GIANFAR_DEV_HAS_GIGABIT |
-                               FSL_GIANFAR_DEV_HAS_COALESCE |
-                               FSL_GIANFAR_DEV_HAS_RMON |
-                               FSL_GIANFAR_DEV_HAS_MULTI_INTR;
+                           FSL_GIANFAR_DEV_HAS_GIGABIT |
+                           FSL_GIANFAR_DEV_HAS_COALESCE |
+                           FSL_GIANFAR_DEV_HAS_RMON |
+                           FSL_GIANFAR_DEV_HAS_MULTI_INTR;
                if (model && !strcasecmp(model, "eTSEC"))
                        gfar_data.device_flags =
-                               FSL_GIANFAR_DEV_HAS_GIGABIT |
-                               FSL_GIANFAR_DEV_HAS_COALESCE |
-                               FSL_GIANFAR_DEV_HAS_RMON |
-                               FSL_GIANFAR_DEV_HAS_MULTI_INTR |
-                               FSL_GIANFAR_DEV_HAS_CSUM |
-                               FSL_GIANFAR_DEV_HAS_VLAN |
-                               FSL_GIANFAR_DEV_HAS_EXTENDED_HASH;
+                           FSL_GIANFAR_DEV_HAS_GIGABIT |
+                           FSL_GIANFAR_DEV_HAS_COALESCE |
+                           FSL_GIANFAR_DEV_HAS_RMON |
+                           FSL_GIANFAR_DEV_HAS_MULTI_INTR |
+                           FSL_GIANFAR_DEV_HAS_CSUM |
+                           FSL_GIANFAR_DEV_HAS_VLAN |
+                           FSL_GIANFAR_DEV_HAS_EXTENDED_HASH;
 
                ph = (phandle *) get_property(np, "phy-handle", NULL);
                phy = of_find_node_by_phandle(*ph);
 
                if (phy == NULL) {
                        ret = -ENODEV;
-                       goto gfar_unreg;
+                       goto unreg;
                }
 
                mdio = of_get_parent(phy);
@@ -174,7 +204,7 @@ static int __init gfar_of_init(void)
                if (ret) {
                        of_node_put(phy);
                        of_node_put(mdio);
-                       goto gfar_unreg;
+                       goto unreg;
                }
 
                gfar_data.phy_id = *id;
@@ -183,23 +213,22 @@ static int __init gfar_of_init(void)
                of_node_put(phy);
                of_node_put(mdio);
 
-               ret = platform_device_add_data(gfar_dev, &gfar_data, sizeof(struct gianfar_platform_data));
+               ret =
+                   platform_device_add_data(gfar_dev, &gfar_data,
+                                            sizeof(struct
+                                                   gianfar_platform_data));
                if (ret)
-                       goto gfar_unreg;
+                       goto unreg;
        }
 
        return 0;
 
-mdio_unreg:
-       platform_device_unregister(mdio_dev);
-mdio_err:
-       return ret;
-
-gfar_unreg:
+unreg:
        platform_device_unregister(gfar_dev);
-gfar_err:
+err:
        return ret;
 }
+
 arch_initcall(gfar_of_init);
 
 static int __init fsl_i2c_of_init(void)
@@ -209,17 +238,19 @@ static int __init fsl_i2c_of_init(void)
        struct platform_device *i2c_dev;
        int ret;
 
-       for (np = NULL, i = 0; (np = of_find_compatible_node(np, "i2c", "fsl-i2c")) != NULL; i++) {
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "i2c", "fsl-i2c")) != NULL;
+            i++) {
                struct resource r[2];
                struct fsl_i2c_platform_data i2c_data;
-               unsigned char * flags = NULL;
+               unsigned char *flags = NULL;
 
                memset(&r, 0, sizeof(r));
                memset(&i2c_data, 0, sizeof(i2c_data));
 
                ret = of_address_to_resource(np, 0, &r[0]);
                if (ret)
-                       goto i2c_err;
+                       goto err;
 
                r[1].start = np->intrs[0].line;
                r[1].end = np->intrs[0].line;
@@ -228,7 +259,7 @@ static int __init fsl_i2c_of_init(void)
                i2c_dev = platform_device_register_simple("fsl-i2c", i, r, 2);
                if (IS_ERR(i2c_dev)) {
                        ret = PTR_ERR(i2c_dev);
-                       goto i2c_err;
+                       goto err;
                }
 
                i2c_data.device_flags = 0;
@@ -240,18 +271,22 @@ static int __init fsl_i2c_of_init(void)
                if (flags)
                        i2c_data.device_flags |= FSL_I2C_DEV_CLOCK_5200;
 
-               ret = platform_device_add_data(i2c_dev, &i2c_data, sizeof(struct fsl_i2c_platform_data));
+               ret =
+                   platform_device_add_data(i2c_dev, &i2c_data,
+                                            sizeof(struct
+                                                   fsl_i2c_platform_data));
                if (ret)
-                       goto i2c_unreg;
+                       goto unreg;
        }
 
        return 0;
 
-i2c_unreg:
+unreg:
        platform_device_unregister(i2c_dev);
-i2c_err:
+err:
        return ret;
 }
+
 arch_initcall(fsl_i2c_of_init);
 
 #ifdef CONFIG_PPC_83xx
@@ -267,51 +302,192 @@ static int __init mpc83xx_wdt_init(void)
 
        if (!np) {
                ret = -ENODEV;
-               goto mpc83xx_wdt_nodev;
+               goto nodev;
        }
 
        soc = of_find_node_by_type(NULL, "soc");
 
        if (!soc) {
                ret = -ENODEV;
-               goto mpc83xx_wdt_nosoc;
+               goto nosoc;
        }
 
        freq = (unsigned int *)get_property(soc, "bus-frequency", NULL);
        if (!freq) {
                ret = -ENODEV;
-               goto mpc83xx_wdt_err;
+               goto err;
        }
 
        memset(&r, 0, sizeof(r));
 
        ret = of_address_to_resource(np, 0, &r);
        if (ret)
-               goto mpc83xx_wdt_err;
+               goto err;
 
        dev = platform_device_register_simple("mpc83xx_wdt", 0, &r, 1);
        if (IS_ERR(dev)) {
                ret = PTR_ERR(dev);
-               goto mpc83xx_wdt_err;
+               goto err;
        }
 
        ret = platform_device_add_data(dev, freq, sizeof(int));
        if (ret)
-               goto mpc83xx_wdt_unreg;
+               goto unreg;
 
        of_node_put(soc);
        of_node_put(np);
 
        return 0;
 
-mpc83xx_wdt_unreg:
+unreg:
        platform_device_unregister(dev);
-mpc83xx_wdt_err:
+err:
        of_node_put(soc);
-mpc83xx_wdt_nosoc:
+nosoc:
        of_node_put(np);
-mpc83xx_wdt_nodev:
+nodev:
        return ret;
 }
+
 arch_initcall(mpc83xx_wdt_init);
 #endif
+
+static enum fsl_usb2_phy_modes determine_usb_phy(char * phy_type)
+{
+       if (!phy_type)
+               return FSL_USB2_PHY_NONE;
+       if (!strcasecmp(phy_type, "ulpi"))
+               return FSL_USB2_PHY_ULPI;
+       if (!strcasecmp(phy_type, "utmi"))
+               return FSL_USB2_PHY_UTMI;
+       if (!strcasecmp(phy_type, "utmi_wide"))
+               return FSL_USB2_PHY_UTMI_WIDE;
+       if (!strcasecmp(phy_type, "serial"))
+               return FSL_USB2_PHY_SERIAL;
+
+       return FSL_USB2_PHY_NONE;
+}
+
+static int __init fsl_usb_of_init(void)
+{
+       struct device_node *np;
+       unsigned int i;
+       struct platform_device *usb_dev;
+       int ret;
+
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL;
+            i++) {
+               struct resource r[2];
+               struct fsl_usb2_platform_data usb_data;
+               unsigned char *prop = NULL;
+
+               memset(&r, 0, sizeof(r));
+               memset(&usb_data, 0, sizeof(usb_data));
+
+               ret = of_address_to_resource(np, 0, &r[0]);
+               if (ret)
+                       goto err;
+
+               r[1].start = np->intrs[0].line;
+               r[1].end = np->intrs[0].line;
+               r[1].flags = IORESOURCE_IRQ;
+
+               usb_dev =
+                   platform_device_register_simple("fsl-usb2-mph", i, r, 2);
+               if (IS_ERR(usb_dev)) {
+                       ret = PTR_ERR(usb_dev);
+                       goto err;
+               }
+
+               usb_dev->dev.coherent_dma_mask = 0xffffffffUL;
+               usb_dev->dev.dma_mask = &usb_dev->dev.coherent_dma_mask;
+
+               usb_data.operating_mode = FSL_USB2_MPH_HOST;
+
+               prop = get_property(np, "port0", NULL);
+               if (prop)
+                       usb_data.port_enables |= FSL_USB2_PORT0_ENABLED;
+
+               prop = get_property(np, "port1", NULL);
+               if (prop)
+                       usb_data.port_enables |= FSL_USB2_PORT1_ENABLED;
+
+               prop = get_property(np, "phy_type", NULL);
+               usb_data.phy_mode = determine_usb_phy(prop);
+
+               ret =
+                   platform_device_add_data(usb_dev, &usb_data,
+                                            sizeof(struct
+                                                   fsl_usb2_platform_data));
+               if (ret)
+                       goto unreg;
+       }
+
+       return 0;
+
+unreg:
+       platform_device_unregister(usb_dev);
+err:
+       return ret;
+}
+
+arch_initcall(fsl_usb_of_init);
+
+static int __init fsl_usb_dr_of_init(void)
+{
+       struct device_node *np;
+       unsigned int i;
+       struct platform_device *usb_dev;
+       int ret;
+
+       for (np = NULL, i = 0;
+            (np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL;
+            i++) {
+               struct resource r[2];
+               struct fsl_usb2_platform_data usb_data;
+               unsigned char *prop = NULL;
+
+               memset(&r, 0, sizeof(r));
+               memset(&usb_data, 0, sizeof(usb_data));
+
+               ret = of_address_to_resource(np, 0, &r[0]);
+               if (ret)
+                       goto err;
+
+               r[1].start = np->intrs[0].line;
+               r[1].end = np->intrs[0].line;
+               r[1].flags = IORESOURCE_IRQ;
+
+               usb_dev =
+                   platform_device_register_simple("fsl-usb2-dr", i, r, 2);
+               if (IS_ERR(usb_dev)) {
+                       ret = PTR_ERR(usb_dev);
+                       goto err;
+               }
+
+               usb_dev->dev.coherent_dma_mask = 0xffffffffUL;
+               usb_dev->dev.dma_mask = &usb_dev->dev.coherent_dma_mask;
+
+               usb_data.operating_mode = FSL_USB2_DR_HOST;
+
+               prop = get_property(np, "phy_type", NULL);
+               usb_data.phy_mode = determine_usb_phy(prop);
+
+               ret =
+                   platform_device_add_data(usb_dev, &usb_data,
+                                            sizeof(struct
+                                                   fsl_usb2_platform_data));
+               if (ret)
+                       goto unreg;
+       }
+
+       return 0;
+
+unreg:
+       platform_device_unregister(usb_dev);
+err:
+       return ret;
+}
+
+arch_initcall(fsl_usb_dr_of_init);
index a7ce7da8785c4c2ef256dd8144f9e2aa4cff7126..a60c9d18bb7f2e8cae30dc9bd789d3b610e34fd4 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/ppc/kernel/ipic.h
- *
  * IPIC private definitions and structure.
  *
  * Maintainer: Kumar Gala <galak@kernel.crashing.org>
index 7d02fa2a899029d3df4023ef804f4b14588b539c..4735b41c113c7d7814a1ecff82451cb69d2f05b2 100644 (file)
@@ -191,6 +191,7 @@ Commands:\n\
   di   dump instructions\n\
   df   dump float values\n\
   dd   dump double values\n\
+  dr   dump stream of raw bytes\n\
   e    print exception information\n\
   f    flush cache\n\
   la   lookup symbol+offset of specified address\n\
@@ -1938,6 +1939,28 @@ bsesc(void)
        return c;
 }
 
+static void xmon_rawdump (unsigned long adrs, long ndump)
+{
+       long n, m, r, nr;
+       unsigned char temp[16];
+
+       for (n = ndump; n > 0;) {
+               r = n < 16? n: 16;
+               nr = mread(adrs, temp, r);
+               adrs += nr;
+               for (m = 0; m < r; ++m) {
+                       if (m < nr)
+                               printf("%.2x", temp[m]);
+                       else
+                               printf("%s", fault_chars[fault_type]);
+               }
+               n -= r;
+               if (nr < r)
+                       break;
+       }
+       printf("\n");
+}
+
 #define isxdigit(c)    (('0' <= (c) && (c) <= '9') \
                         || ('a' <= (c) && (c) <= 'f') \
                         || ('A' <= (c) && (c) <= 'F'))
@@ -1960,6 +1983,13 @@ dump(void)
                        nidump = MAX_DUMP;
                adrs += ppc_inst_dump(adrs, nidump, 1);
                last_cmd = "di\n";
+       } else if (c == 'r') {
+               scanhex(&ndump);
+               if (ndump == 0)
+                       ndump = 64;
+               xmon_rawdump(adrs, ndump);
+               adrs += ndump;
+               last_cmd = "dr\n";
        } else {
                scanhex(&ndump);
                if (ndump == 0)
index 8ace2a1f3b488f1c3b3dcfbf1b2a22da613e395b..98b25fa0049a2cbf561bee7400046f23b7976c1a 100644 (file)
@@ -1,6 +1,4 @@
 /*
- *  arch/ppc/4xx_io/serial_sicc.c
- *
  *  Driver for IBM STB3xxx SICC serial port
  *
  *  Based on drivers/char/serial_amba.c, by ARM Ltd.
@@ -1639,9 +1637,8 @@ static struct SICC_info *siccuart_get(int line)
     state->count++;
     if (state->info)
         return state->info;
-    info = kmalloc(sizeof(struct SICC_info), GFP_KERNEL);
+    info = kzalloc(sizeof(struct SICC_info), GFP_KERNEL);
     if (info) {
-        memset(info, 0, sizeof(struct SICC_info));
         init_waitqueue_head(&info->open_wait);
         init_waitqueue_head(&info->close_wait);
         init_waitqueue_head(&info->delta_msr_wait);
index 579cd40258b97750d61413246af840bc75c4ad6b..12b84ca51327f570d8becc0696c0cd405f2edadc 100644 (file)
@@ -73,7 +73,7 @@ cpm_mask_irq(unsigned int irq)
 {
        int cpm_vec = irq - CPM_IRQ_OFFSET;
 
-       out_be32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cimr, in_be32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cimr) & ~(1 << cpm_vec));
+       clrbits32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cimr, (1 << cpm_vec));
 }
 
 static void
@@ -81,7 +81,7 @@ cpm_unmask_irq(unsigned int irq)
 {
        int cpm_vec = irq - CPM_IRQ_OFFSET;
 
-       out_be32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cimr, in_be32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cimr) | (1 << cpm_vec));
+       setbits32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cimr, (1 << cpm_vec));
 }
 
 static void
@@ -198,7 +198,7 @@ cpm_interrupt_init(void)
        if (setup_irq(CPM_IRQ_OFFSET + CPMVEC_ERROR, &cpm_error_irqaction))
                panic("Could not allocate CPM error IRQ!");
 
-       out_be32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cicr, in_be32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cicr) | CICR_IEN);
+       setbits32(&((immap_t *)IMAP_ADDR)->im_cpic.cpic_cicr, CICR_IEN);
 }
 
 /*
index 11899f06bf06b4657d1a6983d68867013acc577c..54a0a9bb12ddd1d6dfbbd790dce465e2226d162d 100644 (file)
@@ -481,6 +481,53 @@ config WINCEPT
 
 endchoice
 
+menu "Freescale Ethernet driver platform-specific options"
+       depends on FS_ENET
+
+       config MPC8xx_SECOND_ETH
+       bool "Second Ethernet channel"
+       depends on (MPC885ADS || MPC86XADS)
+       default y
+       help
+         This enables support for second Ethernet on MPC885ADS and MPC86xADS boards.
+         The latter will use SCC1, for 885ADS you can select it below.
+
+       choice
+               prompt "Second Ethernet channel"
+               depends on MPC8xx_SECOND_ETH
+               default MPC8xx_SECOND_ETH_FEC2
+
+               config MPC8xx_SECOND_ETH_FEC2
+               bool "FEC2"
+               depends on MPC885ADS
+               help
+                 Enable FEC2 to serve as 2-nd Ethernet channel. Note that SMC2
+                 (often 2-nd UART) will not work if this is enabled.
+
+               config MPC8xx_SECOND_ETH_SCC1
+               bool "SCC1"
+               depends on MPC86XADS
+               select MPC8xx_SCC_ENET_FIXED
+               help
+                 Enable SCC1 to serve as 2-nd Ethernet channel. Note that SMC1
+                 (often 1-nd UART) will not work if this is enabled.
+
+               config MPC8xx_SECOND_ETH_SCC3
+               bool "SCC3"
+               depends on MPC885ADS
+               help
+       &nbs