Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 12 Oct 2007 04:55:47 +0000 (21:55 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Fri, 12 Oct 2007 04:55:47 +0000 (21:55 -0700)
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (408 commits)
  [POWERPC] Add memchr() to the bootwrapper
  [POWERPC] Implement logging of unhandled signals
  [POWERPC] Add legacy serial support for OPB with flattened device tree
  [POWERPC] Use 1TB segments
  [POWERPC] XilinxFB: Allow fixed framebuffer base address
  [POWERPC] XilinxFB: Add support for custom screen resolution
  [POWERPC] XilinxFB: Use pdata to pass around framebuffer parameters
  [POWERPC] PCI: Add 64-bit physical address support to setup_indirect_pci
  [POWERPC] 4xx: Kilauea defconfig file
  [POWERPC] 4xx: Kilauea DTS
  [POWERPC] 4xx: Add AMCC Kilauea eval board support to platforms/40x
  [POWERPC] 4xx: Add AMCC 405EX support to cputable.c
  [POWERPC] Adjust TASK_SIZE on ppc32 systems to 3GB that are capable
  [POWERPC] Use PAGE_OFFSET to tell if an address is user/kernel in SW TLB handlers
  [POWERPC] 85xx: Enable FP emulation in MPC8560 ADS defconfig
  [POWERPC] 85xx: Killed <asm/mpc85xx.h>
  [POWERPC] 85xx: Add cpm nodes for 8541/8555 CDS
  [POWERPC] 85xx: Convert mpc8560ads to the new CPM binding.
  [POWERPC] mpc8272ads: Remove muram from the CPM reg property.
  [POWERPC] Make clockevents work on PPC601 processors
  ...

Fixed up conflict in Documentation/powerpc/booting-without-of.txt manually.

535 files changed:
Documentation/powerpc/booting-without-of.txt
MAINTAINERS
arch/powerpc/Kconfig
arch/powerpc/Kconfig.debug
arch/powerpc/Makefile
arch/powerpc/boot/.gitignore
arch/powerpc/boot/44x.c [deleted file]
arch/powerpc/boot/44x.h
arch/powerpc/boot/4xx.c [new file with mode: 0644]
arch/powerpc/boot/4xx.h [new file with mode: 0644]
arch/powerpc/boot/Makefile
arch/powerpc/boot/bamboo.c [new file with mode: 0644]
arch/powerpc/boot/cpm-serial.c [new file with mode: 0644]
arch/powerpc/boot/cuboot-52xx.c [new file with mode: 0644]
arch/powerpc/boot/cuboot-83xx.c
arch/powerpc/boot/cuboot-85xx.c
arch/powerpc/boot/cuboot-8xx.c [new file with mode: 0644]
arch/powerpc/boot/cuboot-bamboo.c [new file with mode: 0644]
arch/powerpc/boot/cuboot-hpc2.c [new file with mode: 0644]
arch/powerpc/boot/cuboot-pq2.c [new file with mode: 0644]
arch/powerpc/boot/cuboot-sequoia.c [new file with mode: 0644]
arch/powerpc/boot/cuboot.c
arch/powerpc/boot/dcr.h
arch/powerpc/boot/devtree.c
arch/powerpc/boot/dts/bamboo.dts [new file with mode: 0644]
arch/powerpc/boot/dts/ebony.dts
arch/powerpc/boot/dts/ep88xc.dts [new file with mode: 0644]
arch/powerpc/boot/dts/holly.dts
arch/powerpc/boot/dts/kilauea.dts [new file with mode: 0644]
arch/powerpc/boot/dts/kuroboxHD.dts
arch/powerpc/boot/dts/kuroboxHG.dts
arch/powerpc/boot/dts/lite5200.dts
arch/powerpc/boot/dts/lite5200b.dts
arch/powerpc/boot/dts/mpc7448hpc2.dts
arch/powerpc/boot/dts/mpc8272ads.dts
arch/powerpc/boot/dts/mpc8313erdb.dts
arch/powerpc/boot/dts/mpc832x_mds.dts
arch/powerpc/boot/dts/mpc832x_rdb.dts
arch/powerpc/boot/dts/mpc8349emitx.dts
arch/powerpc/boot/dts/mpc8349emitxgp.dts
arch/powerpc/boot/dts/mpc834x_mds.dts
arch/powerpc/boot/dts/mpc836x_mds.dts
arch/powerpc/boot/dts/mpc8540ads.dts
arch/powerpc/boot/dts/mpc8541cds.dts
arch/powerpc/boot/dts/mpc8544ds.dts
arch/powerpc/boot/dts/mpc8548cds.dts
arch/powerpc/boot/dts/mpc8555cds.dts
arch/powerpc/boot/dts/mpc8560ads.dts
arch/powerpc/boot/dts/mpc8568mds.dts
arch/powerpc/boot/dts/mpc8572ds.dts [new file with mode: 0644]
arch/powerpc/boot/dts/mpc8610_hpcd.dts [new file with mode: 0644]
arch/powerpc/boot/dts/mpc8641_hpcn.dts
arch/powerpc/boot/dts/mpc866ads.dts
arch/powerpc/boot/dts/mpc885ads.dts
arch/powerpc/boot/dts/pq2fads.dts [new file with mode: 0644]
arch/powerpc/boot/dts/prpmc2800.dts
arch/powerpc/boot/dts/sequoia.dts [new file with mode: 0644]
arch/powerpc/boot/dts/walnut.dts [new file with mode: 0644]
arch/powerpc/boot/ebony.c
arch/powerpc/boot/ep88xc.c [new file with mode: 0644]
arch/powerpc/boot/fixed-head.S [new file with mode: 0644]
arch/powerpc/boot/flatdevtree.c
arch/powerpc/boot/flatdevtree.h
arch/powerpc/boot/flatdevtree_env.h
arch/powerpc/boot/flatdevtree_misc.c
arch/powerpc/boot/fsl-soc.c [new file with mode: 0644]
arch/powerpc/boot/fsl-soc.h [new file with mode: 0644]
arch/powerpc/boot/gunzip_util.c
arch/powerpc/boot/holly.c
arch/powerpc/boot/io.h
arch/powerpc/boot/main.c
arch/powerpc/boot/mpc52xx-psc.c [new file with mode: 0644]
arch/powerpc/boot/mpc8xx.c [new file with mode: 0644]
arch/powerpc/boot/mpc8xx.h [new file with mode: 0644]
arch/powerpc/boot/mpsc.c
arch/powerpc/boot/mv64x60_i2c.c
arch/powerpc/boot/of.c
arch/powerpc/boot/ops.h
arch/powerpc/boot/planetcore.c [new file with mode: 0644]
arch/powerpc/boot/planetcore.h [new file with mode: 0644]
arch/powerpc/boot/ppcboot.h
arch/powerpc/boot/pq2.c [new file with mode: 0644]
arch/powerpc/boot/pq2.h [new file with mode: 0644]
arch/powerpc/boot/prpmc2800.c
arch/powerpc/boot/ps3.c
arch/powerpc/boot/serial.c
arch/powerpc/boot/stdlib.c [new file with mode: 0644]
arch/powerpc/boot/stdlib.h [new file with mode: 0644]
arch/powerpc/boot/string.S
arch/powerpc/boot/string.h
arch/powerpc/boot/treeboot-bamboo.c [new file with mode: 0644]
arch/powerpc/boot/treeboot-ebony.c
arch/powerpc/boot/treeboot-walnut.c [new file with mode: 0644]
arch/powerpc/boot/uartlite.c [new file with mode: 0644]
arch/powerpc/boot/wrapper
arch/powerpc/configs/bamboo_defconfig [new file with mode: 0644]
arch/powerpc/configs/ebony_defconfig
arch/powerpc/configs/ep88xc_defconfig [new file with mode: 0644]
arch/powerpc/configs/kilauea_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc8272_ads_defconfig
arch/powerpc/configs/mpc8544_ds_defconfig
arch/powerpc/configs/mpc8560_ads_defconfig
arch/powerpc/configs/mpc8572_ds_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc8610_hpcd_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc885_ads_defconfig
arch/powerpc/configs/pq2fads_defconfig [new file with mode: 0644]
arch/powerpc/configs/sequoia_defconfig [new file with mode: 0644]
arch/powerpc/configs/walnut_defconfig [new file with mode: 0644]
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/align.c
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/btext.c
arch/powerpc/kernel/clock.c [new file with mode: 0644]
arch/powerpc/kernel/cpu_setup_44x.S [new file with mode: 0644]
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/crash.c
arch/powerpc/kernel/crash_dump.c
arch/powerpc/kernel/entry_32.S
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/head_32.S
arch/powerpc/kernel/head_40x.S [new file with mode: 0644]
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_4xx.S [deleted file]
arch/powerpc/kernel/head_64.S
arch/powerpc/kernel/head_8xx.S
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/kernel/ibmebus.c
arch/powerpc/kernel/idle.c
arch/powerpc/kernel/iomap.c
arch/powerpc/kernel/iommu.c
arch/powerpc/kernel/irq.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/lparmap.c [deleted file]
arch/powerpc/kernel/nvram_64.c
arch/powerpc/kernel/of_platform.c
arch/powerpc/kernel/pci-common.c
arch/powerpc/kernel/pci_32.c
arch/powerpc/kernel/pci_64.c
arch/powerpc/kernel/pci_dn.c
arch/powerpc/kernel/ppc_ksyms.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/ptrace.c
arch/powerpc/kernel/ptrace32.c
arch/powerpc/kernel/rtas_pci.c
arch/powerpc/kernel/setup-common.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/kernel/signal.c
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/signal_64.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/softemu8xx.c [new file with mode: 0644]
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/systbl.S
arch/powerpc/kernel/time.c
arch/powerpc/kernel/traps.c
arch/powerpc/kernel/udbg.c
arch/powerpc/kernel/udbg_16550.c
arch/powerpc/kernel/vdso.c
arch/powerpc/kernel/vdso32/.gitignore
arch/powerpc/kernel/vdso32/Makefile
arch/powerpc/kernel/vdso64/.gitignore
arch/powerpc/kernel/vdso64/Makefile
arch/powerpc/kernel/vio.c
arch/powerpc/kernel/vmlinux.lds.S
arch/powerpc/lib/Makefile
arch/powerpc/lib/alloc.c [new file with mode: 0644]
arch/powerpc/mm/40x_mmu.c [new file with mode: 0644]
arch/powerpc/mm/4xx_mmu.c [deleted file]
arch/powerpc/mm/Makefile
arch/powerpc/mm/fsl_booke_mmu.c
arch/powerpc/mm/hash_low_64.S
arch/powerpc/mm/hash_native_64.c
arch/powerpc/mm/hash_utils_64.c
arch/powerpc/mm/hugetlbpage.c
arch/powerpc/mm/init_32.c
arch/powerpc/mm/init_64.c
arch/powerpc/mm/mem.c
arch/powerpc/mm/mmu_context_64.c
arch/powerpc/mm/pgtable_64.c
arch/powerpc/mm/slb.c
arch/powerpc/mm/slb_low.S
arch/powerpc/mm/slice.c
arch/powerpc/mm/stab.c
arch/powerpc/mm/tlb_64.c
arch/powerpc/oprofile/cell/pr_util.h
arch/powerpc/oprofile/op_model_cell.c
arch/powerpc/platforms/40x/Kconfig [new file with mode: 0644]
arch/powerpc/platforms/40x/Makefile [new file with mode: 0644]
arch/powerpc/platforms/40x/kilauea.c [new file with mode: 0644]
arch/powerpc/platforms/40x/virtex.c [new file with mode: 0644]
arch/powerpc/platforms/40x/walnut.c [new file with mode: 0644]
arch/powerpc/platforms/44x/Kconfig
arch/powerpc/platforms/44x/Makefile
arch/powerpc/platforms/44x/bamboo.c [new file with mode: 0644]
arch/powerpc/platforms/44x/ebony.c
arch/powerpc/platforms/44x/sequoia.c [new file with mode: 0644]
arch/powerpc/platforms/4xx/Kconfig [deleted file]
arch/powerpc/platforms/4xx/Makefile [deleted file]
arch/powerpc/platforms/52xx/Kconfig
arch/powerpc/platforms/52xx/Makefile
arch/powerpc/platforms/52xx/efika.c
arch/powerpc/platforms/52xx/lite5200.c
arch/powerpc/platforms/52xx/lite5200_pm.c [new file with mode: 0644]
arch/powerpc/platforms/52xx/lite5200_sleep.S [new file with mode: 0644]
arch/powerpc/platforms/52xx/mpc52xx_common.c
arch/powerpc/platforms/52xx/mpc52xx_pic.c
arch/powerpc/platforms/82xx/Kconfig
arch/powerpc/platforms/82xx/Makefile
arch/powerpc/platforms/82xx/m82xx_pci.h
arch/powerpc/platforms/82xx/mpc8272_ads.c [new file with mode: 0644]
arch/powerpc/platforms/82xx/mpc82xx.c [deleted file]
arch/powerpc/platforms/82xx/mpc82xx_ads.c [deleted file]
arch/powerpc/platforms/82xx/pq2.c [new file with mode: 0644]
arch/powerpc/platforms/82xx/pq2.h [new file with mode: 0644]
arch/powerpc/platforms/82xx/pq2ads-pci-pic.c [new file with mode: 0644]
arch/powerpc/platforms/82xx/pq2ads.h
arch/powerpc/platforms/82xx/pq2fads.c [new file with mode: 0644]
arch/powerpc/platforms/83xx/mpc8313_rdb.c
arch/powerpc/platforms/83xx/mpc832x_mds.c
arch/powerpc/platforms/83xx/mpc832x_rdb.c
arch/powerpc/platforms/83xx/mpc834x_itx.c
arch/powerpc/platforms/83xx/mpc834x_mds.c
arch/powerpc/platforms/83xx/mpc836x_mds.c
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 [deleted file]
arch/powerpc/platforms/85xx/mpc8540_ads.h [deleted file]
arch/powerpc/platforms/85xx/mpc8544_ds.c [deleted file]
arch/powerpc/platforms/85xx/mpc85xx.h [deleted file]
arch/powerpc/platforms/85xx/mpc85xx_ads.c
arch/powerpc/platforms/85xx/mpc85xx_ads.h [deleted file]
arch/powerpc/platforms/85xx/mpc85xx_cds.c
arch/powerpc/platforms/85xx/mpc85xx_cds.h [deleted file]
arch/powerpc/platforms/85xx/mpc85xx_ds.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/mpc85xx_mds.c
arch/powerpc/platforms/86xx/Kconfig
arch/powerpc/platforms/86xx/Makefile
arch/powerpc/platforms/86xx/mpc8610_hpcd.c [new file with mode: 0644]
arch/powerpc/platforms/86xx/mpc8641_hpcn.h [deleted file]
arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
arch/powerpc/platforms/8xx/Kconfig
arch/powerpc/platforms/8xx/Makefile
arch/powerpc/platforms/8xx/ep88xc.c [new file with mode: 0644]
arch/powerpc/platforms/8xx/m8xx_setup.c
arch/powerpc/platforms/8xx/mpc86xads.h
arch/powerpc/platforms/8xx/mpc86xads_setup.c
arch/powerpc/platforms/8xx/mpc885ads.h
arch/powerpc/platforms/8xx/mpc885ads_setup.c
arch/powerpc/platforms/Kconfig
arch/powerpc/platforms/Kconfig.cputype
arch/powerpc/platforms/Makefile
arch/powerpc/platforms/cell/Makefile
arch/powerpc/platforms/cell/axon_msi.c
arch/powerpc/platforms/cell/cbe_cpufreq.c
arch/powerpc/platforms/cell/cbe_cpufreq_pervasive.c
arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
arch/powerpc/platforms/cell/cbe_regs.c
arch/powerpc/platforms/cell/cbe_regs.h [deleted file]
arch/powerpc/platforms/cell/cbe_thermal.c
arch/powerpc/platforms/cell/interrupt.c
arch/powerpc/platforms/cell/iommu.c
arch/powerpc/platforms/cell/pervasive.c
arch/powerpc/platforms/cell/pmu.c
arch/powerpc/platforms/cell/ras.c
arch/powerpc/platforms/cell/setup.c
arch/powerpc/platforms/cell/spider-pic.c
arch/powerpc/platforms/cell/spu_base.c
arch/powerpc/platforms/cell/spu_callbacks.c
arch/powerpc/platforms/cell/spu_coredump.c [deleted file]
arch/powerpc/platforms/cell/spu_manage.c
arch/powerpc/platforms/cell/spu_syscalls.c
arch/powerpc/platforms/cell/spufs/coredump.c
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/inode.c
arch/powerpc/platforms/cell/spufs/run.c
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/cell/spufs/spufs.h
arch/powerpc/platforms/cell/spufs/switch.c
arch/powerpc/platforms/cell/spufs/syscalls.c
arch/powerpc/platforms/celleb/Kconfig
arch/powerpc/platforms/celleb/Makefile
arch/powerpc/platforms/celleb/beat.c
arch/powerpc/platforms/celleb/beat.h
arch/powerpc/platforms/celleb/beat_syscall.h
arch/powerpc/platforms/celleb/beat_wrapper.h
arch/powerpc/platforms/celleb/htab.c
arch/powerpc/platforms/celleb/interrupt.c
arch/powerpc/platforms/celleb/io-workarounds.c [new file with mode: 0644]
arch/powerpc/platforms/celleb/pci.c
arch/powerpc/platforms/celleb/pci.h
arch/powerpc/platforms/celleb/scc.h
arch/powerpc/platforms/celleb/scc_epci.c
arch/powerpc/platforms/celleb/scc_sio.c
arch/powerpc/platforms/celleb/setup.c
arch/powerpc/platforms/chrp/gg2.h [new file with mode: 0644]
arch/powerpc/platforms/chrp/pci.c
arch/powerpc/platforms/chrp/setup.c
arch/powerpc/platforms/chrp/smp.c
arch/powerpc/platforms/embedded6xx/Kconfig
arch/powerpc/platforms/embedded6xx/holly.c
arch/powerpc/platforms/embedded6xx/linkstation.c
arch/powerpc/platforms/embedded6xx/ls_uart.c
arch/powerpc/platforms/embedded6xx/mpc10x.h [new file with mode: 0644]
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.h [deleted file]
arch/powerpc/platforms/embedded6xx/prpmc2800.c
arch/powerpc/platforms/iseries/Makefile
arch/powerpc/platforms/iseries/dt.c
arch/powerpc/platforms/iseries/exception.S [new file with mode: 0644]
arch/powerpc/platforms/iseries/exception.h [new file with mode: 0644]
arch/powerpc/platforms/iseries/htab.c
arch/powerpc/platforms/iseries/iommu.c
arch/powerpc/platforms/iseries/irq.c
arch/powerpc/platforms/iseries/it_lp_naca.h
arch/powerpc/platforms/iseries/mf.c
arch/powerpc/platforms/iseries/setup.c
arch/powerpc/platforms/iseries/vio.c [new file with mode: 0644]
arch/powerpc/platforms/iseries/viopath.c
arch/powerpc/platforms/maple/pci.c
arch/powerpc/platforms/pasemi/Kconfig
arch/powerpc/platforms/pasemi/gpio_mdio.c
arch/powerpc/platforms/pasemi/idle.c
arch/powerpc/platforms/pasemi/iommu.c
arch/powerpc/platforms/pasemi/pasemi.h
arch/powerpc/platforms/pasemi/pci.c
arch/powerpc/platforms/pasemi/setup.c
arch/powerpc/platforms/powermac/bootx_init.c
arch/powerpc/platforms/powermac/low_i2c.c
arch/powerpc/platforms/powermac/pci.c
arch/powerpc/platforms/powermac/pic.c
arch/powerpc/platforms/powermac/pmac.h
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/powermac/udbg_adb.c
arch/powerpc/platforms/ps3/device-init.c
arch/powerpc/platforms/ps3/htab.c
arch/powerpc/platforms/ps3/interrupt.c
arch/powerpc/platforms/ps3/os-area.c
arch/powerpc/platforms/ps3/platform.h
arch/powerpc/platforms/ps3/setup.c
arch/powerpc/platforms/ps3/time.c
arch/powerpc/platforms/pseries/eeh.c
arch/powerpc/platforms/pseries/eeh_cache.c
arch/powerpc/platforms/pseries/hotplug-cpu.c
arch/powerpc/platforms/pseries/lpar.c
arch/powerpc/platforms/pseries/msi.c
arch/powerpc/platforms/pseries/rtasd.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/xics.c
arch/powerpc/sysdev/Makefile
arch/powerpc/sysdev/axonram.c
arch/powerpc/sysdev/commproc.c
arch/powerpc/sysdev/commproc.h [new file with mode: 0644]
arch/powerpc/sysdev/cpm2_common.c
arch/powerpc/sysdev/cpm2_pic.c
arch/powerpc/sysdev/cpm_common.c [new file with mode: 0644]
arch/powerpc/sysdev/dart_iommu.c
arch/powerpc/sysdev/dcr.c
arch/powerpc/sysdev/fsl_pci.c
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/fsl_soc.h
arch/powerpc/sysdev/i8259.c
arch/powerpc/sysdev/indirect_pci.c
arch/powerpc/sysdev/ipic.c
arch/powerpc/sysdev/ipic.h
arch/powerpc/sysdev/mpc8xx_pic.c
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/mpic.h
arch/powerpc/sysdev/mpic_msi.c
arch/powerpc/sysdev/mpic_u3msi.c
arch/powerpc/sysdev/mv64x60.h
arch/powerpc/sysdev/mv64x60_pic.c
arch/powerpc/sysdev/mv64x60_udbg.c [new file with mode: 0644]
arch/powerpc/sysdev/pmi.c
arch/powerpc/sysdev/qe_lib/qe.c
arch/powerpc/sysdev/qe_lib/qe_ic.c
arch/powerpc/sysdev/qe_lib/qe_ic.h
arch/powerpc/sysdev/qe_lib/qe_io.c
arch/powerpc/sysdev/qe_lib/ucc.c
arch/powerpc/sysdev/qe_lib/ucc_fast.c
arch/powerpc/sysdev/qe_lib/ucc_slow.c
arch/powerpc/sysdev/timer.c [deleted file]
arch/powerpc/sysdev/tsi108_pci.c
arch/powerpc/sysdev/uic.c
arch/powerpc/sysdev/xilinx_intc.c [new file with mode: 0644]
arch/ppc/.gitignore
arch/ppc/8xx_io/enet.c
arch/ppc/Kconfig
arch/ppc/Makefile
arch/ppc/amiga/Makefile [deleted file]
arch/ppc/amiga/amiga_ksyms.c [deleted file]
arch/ppc/amiga/amiints.c [deleted file]
arch/ppc/amiga/amisound.c [deleted file]
arch/ppc/amiga/bootinfo.c [deleted file]
arch/ppc/amiga/chipram.c [deleted file]
arch/ppc/amiga/cia.c [deleted file]
arch/ppc/amiga/config.c [deleted file]
arch/ppc/amiga/ints.c [deleted file]
arch/ppc/amiga/pcmcia.c [deleted file]
arch/ppc/amiga/time.c [deleted file]
arch/ppc/boot/simple/embed_config.c
arch/ppc/boot/simple/misc-embedded.c
arch/ppc/boot/simple/uartlite_tty.c
arch/ppc/configs/apus_defconfig [deleted file]
arch/ppc/kernel/head.S
arch/ppc/kernel/head_44x.S
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/kernel/setup.c
arch/ppc/kernel/vmlinux.lds.S
arch/ppc/mm/pgtable.c
arch/ppc/platforms/Makefile
arch/ppc/platforms/apus_pci.c [deleted file]
arch/ppc/platforms/apus_pci.h [deleted file]
arch/ppc/platforms/apus_setup.c [deleted file]
arch/ppc/platforms/ev64360.c
arch/ppc/platforms/katana.c
arch/ppc/syslib/ocp.c
arch/ppc/syslib/virtex_devices.h
drivers/block/viodasd.c
drivers/cdrom/viocd.c
drivers/char/hvc_beat.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/viotape.c
drivers/macintosh/adb-iop.c
drivers/macintosh/adbhid.c
drivers/macintosh/ans-lcd.c
drivers/macintosh/ans-lcd.h [new file with mode: 0644]
drivers/macintosh/therm_adt746x.c
drivers/macintosh/via-pmu.c
drivers/macintosh/windfarm_smu_sat.c
drivers/misc/hdpuftrs/hdpu_cpustate.c
drivers/misc/hdpuftrs/hdpu_nexus.c
drivers/mtd/maps/Kconfig
drivers/mtd/maps/physmap_of.c
drivers/net/ucc_geth.c
drivers/net/ucc_geth.h
drivers/net/ucc_geth_mii.c
drivers/serial/Kconfig
drivers/serial/cpm_uart/cpm_uart.h
drivers/serial/cpm_uart/cpm_uart_core.c
drivers/serial/cpm_uart/cpm_uart_cpm1.c
drivers/serial/cpm_uart/cpm_uart_cpm1.h
drivers/serial/cpm_uart/cpm_uart_cpm2.c
drivers/serial/cpm_uart/cpm_uart_cpm2.h
drivers/serial/mpc52xx_uart.c
drivers/serial/pmac_zilog.c
drivers/serial/uartlite.c
drivers/video/platinumfb.c
drivers/video/xilinxfb.c
fs/binfmt_elf.c
include/asm-powerpc/8xx_immap.h [new file with mode: 0644]
include/asm-powerpc/atomic.h
include/asm-powerpc/cell-regs.h [new file with mode: 0644]
include/asm-powerpc/clk_interface.h [new file with mode: 0644]
include/asm-powerpc/commproc.h [new file with mode: 0644]
include/asm-powerpc/cpm.h [new file with mode: 0644]
include/asm-powerpc/cpm2.h [new file with mode: 0644]
include/asm-powerpc/cputable.h
include/asm-powerpc/dcr-mmio.h
include/asm-powerpc/dcr-native.h
include/asm-powerpc/dma-mapping.h
include/asm-powerpc/elf.h
include/asm-powerpc/exception.h [new file with mode: 0644]
include/asm-powerpc/fs_pd.h
include/asm-powerpc/highmem.h [new file with mode: 0644]
include/asm-powerpc/hydra.h [new file with mode: 0644]
include/asm-powerpc/ide.h
include/asm-powerpc/immap_86xx.h
include/asm-powerpc/immap_cpm2.h [new file with mode: 0644]
include/asm-powerpc/immap_qe.h
include/asm-powerpc/io.h
include/asm-powerpc/irq.h
include/asm-powerpc/iseries/hv_call_event.h
include/asm-powerpc/iseries/iommu.h
include/asm-powerpc/iseries/lpar_map.h
include/asm-powerpc/iseries/vio.h
include/asm-powerpc/kgdb.h [new file with mode: 0644]
include/asm-powerpc/lmb.h
include/asm-powerpc/machdep.h
include/asm-powerpc/mmu-40x.h [new file with mode: 0644]
include/asm-powerpc/mmu-hash64.h
include/asm-powerpc/mmu.h
include/asm-powerpc/mpc52xx.h
include/asm-powerpc/mpc52xx_psc.h [new file with mode: 0644]
include/asm-powerpc/mpc85xx.h [deleted file]
include/asm-powerpc/mpic.h
include/asm-powerpc/nvram.h
include/asm-powerpc/paca.h
include/asm-powerpc/page_64.h
include/asm-powerpc/pci-bridge.h
include/asm-powerpc/percpu.h
include/asm-powerpc/pgtable-4k.h
include/asm-powerpc/pgtable-64k.h
include/asm-powerpc/ppc_asm.h
include/asm-powerpc/processor.h
include/asm-powerpc/prom.h
include/asm-powerpc/ps3.h
include/asm-powerpc/qe.h
include/asm-powerpc/qe_ic.h
include/asm-powerpc/reg.h
include/asm-powerpc/rwsem.h
include/asm-powerpc/smp.h
include/asm-powerpc/spu.h
include/asm-powerpc/system.h
include/asm-powerpc/time.h
include/asm-powerpc/tlb.h
include/asm-powerpc/tlbflush.h
include/asm-powerpc/types.h
include/asm-powerpc/ucc.h
include/asm-powerpc/ucc_slow.h
include/asm-powerpc/udbg.h
include/asm-powerpc/vio.h
include/asm-powerpc/xilinx_intc.h [new file with mode: 0644]
include/asm-ppc/amigahw.h [deleted file]
include/asm-ppc/amigaints.h [deleted file]
include/asm-ppc/amigappc.h [deleted file]
include/asm-ppc/ans-lcd.h [deleted file]
include/asm-ppc/bootinfo.h
include/asm-ppc/io.h
include/asm-ppc/machdep.h
include/asm-ppc/ocp.h
include/asm-ppc/page.h
include/asm-ppc/pgtable.h
include/asm-ppc/prom.h
include/linux/elf.h
include/linux/of.h
include/linux/pci_ids.h
include/linux/xilinxfb.h [new file with mode: 0644]
kernel/sysctl.c
lib/Kconfig.debug

index 838fd323e79762f6d910a630a29970713c371fbe..a96e85397eb792cb10e5e5cc066664846a1b289e 100644 (file)
@@ -50,7 +50,7 @@ Table of Contents
       g) Freescale SOC SEC Security Engines
       h) Board Control and Status (BCSR)
       i) Freescale QUICC Engine module (QE)
-      j) Flash chip nodes
+      j) CFI or JEDEC memory-mapped NOR flash
       k) Global Utilities Block
 
   VII - Specifying interrupt information for devices
@@ -1510,7 +1510,10 @@ platforms are moved over to use the flattened-device-tree model.
 
    i) Freescale QUICC Engine module (QE)
    This represents qe module that is installed on PowerQUICC II Pro.
-   Hopefully it will merge backward compatibility with CPM/CPM2.
+
+   NOTE:  This is an interim binding; it should be updated to fit
+   in with the CPM binding later in this document.
+
    Basically, it is a bus of devices, that could act more or less
    as a complete entity (UCC, USB etc ). All of them should be siblings on
    the "root" qe node, using the common properties from there.
@@ -1548,7 +1551,7 @@ platforms are moved over to use the flattened-device-tree model.
    Required properties:
    - device_type : should be "spi".
    - compatible : should be "fsl_spi".
-   - mode : the SPI operation mode, it can be "cpu" or "qe".
+   - mode : the SPI operation mode, it can be "cpu" or "cpu-qe".
    - 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
@@ -1757,45 +1760,69 @@ platforms are moved over to use the flattened-device-tree model.
                };
        };
 
-    j) Flash chip nodes
+   j) CFI or JEDEC memory-mapped NOR flash
 
     Flash chips (Memory Technology Devices) are often used for solid state
     file systems on embedded devices.
 
-    Required properties:
-
-     - device_type : has to be "rom"
-     - compatible : Should specify what this flash device is compatible with.
-       Currently, this is most likely to be "direct-mapped" (which
-       corresponds to the MTD physmap mapping driver).
-     - reg : Offset and length of the register set (or memory mapping) for
-       the device.
-     - bank-width : Width of the flash data bus in bytes. Required
-       for the NOR flashes (compatible == "direct-mapped" and others) ONLY.
-
-    Recommended properties :
-
-     - partitions : Several pairs of 32-bit values where the first value is
-       partition's offset from the start of the device and the second one is
-       partition size in bytes with LSB used to signify a read only
-       partition (so, the partition size should always be an even number).
-     - partition-names : The list of concatenated zero terminated strings
-       representing the partition names.
-     - probe-type : The type of probe which should be done for the chip
-       (JEDEC vs CFI actually). Valid ONLY for NOR flashes.
+     - compatible : should contain the specific model of flash chip(s)
+       used, if known, followed by either "cfi-flash" or "jedec-flash"
+     - reg : Address range of the flash chip
+     - bank-width : Width (in bytes) of the flash bank.  Equal to the
+       device width times the number of interleaved chips.
+     - device-width : (optional) Width of a single flash chip.  If
+       omitted, assumed to be equal to 'bank-width'.
+     - #address-cells, #size-cells : Must be present if the flash has
+       sub-nodes representing partitions (see below).  In this case
+       both #address-cells and #size-cells must be equal to 1.
+
+    For JEDEC compatible devices, the following additional properties
+    are defined:
+
+     - vendor-id : Contains the flash chip's vendor id (1 byte).
+     - device-id : Contains the flash chip's device id (1 byte).
+
+    In addition to the information on the flash bank itself, the
+    device tree may optionally contain additional information
+    describing partitions of the flash address space.  This can be
+    used on platforms which have strong conventions about which
+    portions of the flash are used for what purposes, but which don't
+    use an on-flash partition table such as RedBoot.
+
+    Each partition is represented as a sub-node of the flash device.
+    Each node's name represents the name of the corresponding
+    partition of the flash device.
+
+    Flash partitions
+     - reg : The partition's offset and size within the flash bank.
+     - label : (optional) The label / name for this flash partition.
+       If omitted, the label is taken from the node name (excluding
+       the unit address).
+     - read-only : (optional) This parameter, if present, is a hint to
+       Linux that this flash partition should only be mounted
+       read-only.  This is usually used for flash partitions
+       containing early-boot firmware images or data which should not
+       be clobbered.
 
-   Example:
+    Example:
 
-       flash@ff000000 {
-               device_type = "rom";
-               compatible = "direct-mapped";
-               probe-type = "CFI";
-               reg = <ff000000 01000000>;
-               bank-width = <4>;
-               partitions = <00000000 00f80000
-                             00f80000 00080001>;
-               partition-names = "fs\0firmware";
-       };
+       flash@ff000000 {
+               compatible = "amd,am29lv128ml", "cfi-flash";
+               reg = <ff000000 01000000>;
+               bank-width = <4>;
+               device-width = <1>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               fs@0 {
+                       label = "fs";
+                       reg = <0 f80000>;
+               };
+               firmware@f80000 {
+                       label ="firmware";
+                       reg = <f80000 80000>;
+                       read-only;
+               };
+       };
 
    k) Global Utilities Block
 
@@ -1824,8 +1851,243 @@ platforms are moved over to use the flattened-device-tree model.
                fsl,has-rstcr;
        };
 
+   l) Freescale Communications Processor Module
+
+   NOTE: This is an interim binding, and will likely change slightly,
+   as more devices are supported.  The QE bindings especially are
+   incomplete.
+
+   i) Root CPM node
+
+   Properties:
+   - compatible : "fsl,cpm1", "fsl,cpm2", or "fsl,qe".
+   - reg : A 48-byte region beginning with CPCR.
+
+   Example:
+       cpm@119c0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               compatible = "fsl,mpc8272-cpm", "fsl,cpm2";
+               reg = <119c0 30>;
+       }
+
+   ii) Properties common to mulitple CPM/QE devices
+
+   - fsl,cpm-command : This value is ORed with the opcode and command flag
+                       to specify the device on which a CPM command operates.
+
+   - fsl,cpm-brg : Indicates which baud rate generator the device
+                   is associated with.  If absent, an unused BRG
+                   should be dynamically allocated.  If zero, the
+                   device uses an external clock rather than a BRG.
+
+   - reg : Unless otherwise specified, the first resource represents the
+           scc/fcc/ucc registers, and the second represents the device's
+           parameter RAM region (if it has one).
+
+   iii) Serial
+
+   Currently defined compatibles:
+   - fsl,cpm1-smc-uart
+   - fsl,cpm2-smc-uart
+   - fsl,cpm1-scc-uart
+   - fsl,cpm2-scc-uart
+   - fsl,qe-uart
+
+   Example:
+
+       serial@11a00 {
+               device_type = "serial";
+               compatible = "fsl,mpc8272-scc-uart",
+                            "fsl,cpm2-scc-uart";
+               reg = <11a00 20 8000 100>;
+               interrupts = <28 8>;
+               interrupt-parent = <&PIC>;
+               fsl,cpm-brg = <1>;
+               fsl,cpm-command = <00800000>;
+       };
+
+   iii) Network
+
+   Currently defined compatibles:
+   - fsl,cpm1-scc-enet
+   - fsl,cpm2-scc-enet
+   - fsl,cpm1-fec-enet
+   - fsl,cpm2-fcc-enet (third resource is GFEMR)
+   - fsl,qe-enet
+
+   Example:
+
+       ethernet@11300 {
+               device_type = "network";
+               compatible = "fsl,mpc8272-fcc-enet",
+                            "fsl,cpm2-fcc-enet";
+               reg = <11300 20 8400 100 11390 1>;
+               local-mac-address = [ 00 00 00 00 00 00 ];
+               interrupts = <20 8>;
+               interrupt-parent = <&PIC>;
+               phy-handle = <&PHY0>;
+               linux,network-index = <0>;
+               fsl,cpm-command = <12000300>;
+       };
+
+   iv) MDIO
+
+   Currently defined compatibles:
+   fsl,pq1-fec-mdio (reg is same as first resource of FEC device)
+   fsl,cpm2-mdio-bitbang (reg is port C registers)
+
+   Properties for fsl,cpm2-mdio-bitbang:
+   fsl,mdio-pin : pin of port C controlling mdio data
+   fsl,mdc-pin : pin of port C controlling mdio clock
+
+   Example:
+
+       mdio@10d40 {
+               device_type = "mdio";
+               compatible = "fsl,mpc8272ads-mdio-bitbang",
+                            "fsl,mpc8272-mdio-bitbang",
+                            "fsl,cpm2-mdio-bitbang";
+               reg = <10d40 14>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               fsl,mdio-pin = <12>;
+               fsl,mdc-pin = <13>;
+       };
+
+   v) Baud Rate Generators
+
+   Currently defined compatibles:
+   fsl,cpm-brg
+   fsl,cpm1-brg
+   fsl,cpm2-brg
+
+   Properties:
+   - reg : There may be an arbitrary number of reg resources; BRG
+     numbers are assigned to these in order.
+   - clock-frequency : Specifies the base frequency driving
+     the BRG.
+
+   Example:
+
+       brg@119f0 {
+               compatible = "fsl,mpc8272-brg",
+                            "fsl,cpm2-brg",
+                            "fsl,cpm-brg";
+               reg = <119f0 10 115f0 10>;
+               clock-frequency = <d#25000000>;
+       };
+
+   vi) Interrupt Controllers
+
+   Currently defined compatibles:
+   - fsl,cpm1-pic
+     - only one interrupt cell
+   - fsl,pq1-pic
+   - fsl,cpm2-pic
+     - second interrupt cell is level/sense:
+       - 2 is falling edge
+       - 8 is active low
+
+   Example:
+
+       interrupt-controller@10c00 {
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <10c00 80>;
+               compatible = "mpc8272-pic", "fsl,cpm2-pic";
+       };
+
+   vii) USB (Universal Serial Bus Controller)
+
+   Properties:
+   - compatible : "fsl,cpm1-usb", "fsl,cpm2-usb", "fsl,qe-usb"
+
+   Example:
+       usb@11bc0 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "fsl,cpm2-usb";
+               reg = <11b60 18 8b00 100>;
+               interrupts = <b 8>;
+               interrupt-parent = <&PIC>;
+               fsl,cpm-command = <2e600000>;
+       };
+
+   viii) Multi-User RAM (MURAM)
+
+   The multi-user/dual-ported RAM is expressed as a bus under the CPM node.
+
+   Ranges must be set up subject to the following restrictions:
+
+   - Children's reg nodes must be offsets from the start of all muram, even
+     if the user-data area does not begin at zero.
+   - If multiple range entries are used, the difference between the parent
+     address and the child address must be the same in all, so that a single
+     mapping can cover them all while maintaining the ability to determine
+     CPM-side offsets with pointer subtraction.  It is recommended that
+     multiple range entries not be used.
+   - A child address of zero must be translatable, even if no reg resources
+     contain it.
+
+   A child "data" node must exist, compatible with "fsl,cpm-muram-data", to
+   indicate the portion of muram that is usable by the OS for arbitrary
+   purposes.  The data node may have an arbitrary number of reg resources,
+   all of which contribute to the allocatable muram pool.
+
+   Example, based on mpc8272:
+
+       muram@0 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0 0 10000>;
+
+               data@0 {
+                       compatible = "fsl,cpm-muram-data";
+                       reg = <0 2000 9800 800>;
+               };
+       };
+
+   m) Chipselect/Local Bus
+
+   Properties:
+   - name : Should be localbus
+   - #address-cells : Should be either two or three.  The first cell is the
+                      chipselect number, and the remaining cells are the
+                      offset into the chipselect.
+   - #size-cells : Either one or two, depending on how large each chipselect
+                   can be.
+   - ranges : Each range corresponds to a single chipselect, and cover
+              the entire access window as configured.
+
+   Example:
+       localbus@f0010100 {
+               compatible = "fsl,mpc8272ads-localbus",
+                            "fsl,mpc8272-localbus",
+                            "fsl,pq2-localbus";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               reg = <f0010100 40>;
+
+               ranges = <0 0 fe000000 02000000
+                         1 0 f4500000 00008000>;
+
+               flash@0,0 {
+                       compatible = "jedec-flash";
+                       reg = <0 0 2000000>;
+                       bank-width = <4>;
+                       device-width = <1>;
+               };
+
+               board-control@1,0 {
+                       reg = <1 0 20>;
+                       compatible = "fsl,mpc8272ads-bcsr";
+               };
+       };
+
 
-    h) 4xx/Axon EMAC ethernet nodes
+    n) 4xx/Axon EMAC ethernet nodes
 
     The EMAC ethernet controller in IBM and AMCC 4xx chips, and also
     the Axon bridge.  To operate this needs to interact with a ths
index 8a1360045c2d65024b5cc5ff14db6ca214148bbe..c4eca56ed5bf75d7ca1626adc247853a75bf6a22 100644 (file)
@@ -1535,7 +1535,7 @@ P:        Pantelis Antoniou
 M:     pantelis.antoniou@gmail.com
 P:     Vitaly Bordug
 M:     vbordug@ru.mvista.com
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 L:     netdev@vger.kernel.org
 S:     Maintained
 
@@ -1543,14 +1543,14 @@ FREESCALE HIGHSPEED USB DEVICE DRIVER
 P:     Li Yang
 M:     leoli@freescale.com
 L:     linux-usb-devel@lists.sourceforge.net
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 S:     Maintained
 
 FREESCALE QUICC ENGINE UCC ETHERNET DRIVER
 P:     Li Yang
 M:     leoli@freescale.com
 L:     netdev@vger.kernel.org
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 S:     Maintained
 
 FILE LOCKING (flock() and fcntl()/lockf())
@@ -2297,38 +2297,49 @@ S:      Maintained
 LINUX FOR POWERPC EMBEDDED MPC52XX
 P:     Sylvain Munaut
 M:     tnt@246tNt.com
+P:     Grant Likely
+M:     grant.likely@secretlab.ca
 W:     http://www.246tNt.com/mpc52xx/
 W:     http://www.penguinppc.org/
 L:     linuxppc-dev@ozlabs.org
-L:     linuxppc-embedded@ozlabs.org
 S:     Maintained
 
 LINUX FOR POWERPC EMBEDDED PPC4XX
+P:     Josh Boyer
+M:     jwboyer@linux.vnet.ibm.com
 P:     Matt Porter
 M:     mporter@kernel.crashing.org
 W:     http://www.penguinppc.org/
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
+T:     git kernel.org:/pub/scm/linux/kernel/git/jwboyer/powerpc.git
+S:     Maintained
+
+LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
+P:     Grant Likely
+M:     grant.likely@secretlab.ca
+W:     http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex
+L:     linuxppc-dev@ozlabs.org
 S:     Maintained
 
 LINUX FOR POWERPC BOOT CODE
 P:     Tom Rini
 M:     trini@kernel.crashing.org
 W:     http://www.penguinppc.org/
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 S:     Maintained
 
 LINUX FOR POWERPC EMBEDDED PPC8XX
 P:     Marcelo Tosatti
 M:     marcelo@kvack.org
 W:     http://www.penguinppc.org/
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 S:     Maintained
 
 LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
 P:     Kumar Gala
 M:     galak@kernel.crashing.org
 W:     http://www.penguinppc.org/
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 S:     Maintained
 
 LINUX FOR POWERPC PA SEMI PWRFICIENT
@@ -2990,7 +3001,7 @@ POWERPC 4xx EMAC DRIVER
 P:     Eugene Surovegin
 M:     ebs@ebshome.net
 W:     http://kernel.ebshome.net/emac/
-L:     linuxppc-embedded@ozlabs.org
+L:     linuxppc-dev@ozlabs.org
 L:     netdev@vger.kernel.org
 S:     Maintained
 
index 00099efe0e9f8e79c21d6eec9aae86858e6fb080..037664d496d7dffb72c78f54c47be83d130bb628 100644 (file)
@@ -14,6 +14,11 @@ config 64BIT
        bool
        default y if PPC64
 
+config WORD_SIZE
+       int
+       default 64 if PPC64
+       default 32 if !PPC64
+
 config PPC_MERGE
        def_bool y
 
@@ -21,6 +26,18 @@ config MMU
        bool
        default y
 
+config GENERIC_CMOS_UPDATE
+       def_bool y
+
+config GENERIC_TIME
+       def_bool y
+
+config GENERIC_TIME_VSYSCALL
+       def_bool y
+
+config GENERIC_CLOCKEVENTS
+       def_bool y
+
 config GENERIC_HARDIRQS
        bool
        default y
@@ -156,6 +173,7 @@ config HIGHMEM
        bool "High memory support"
        depends on PPC32
 
+source kernel/time/Kconfig
 source kernel/Kconfig.hz
 source kernel/Kconfig.preempt
 source "fs/Kconfig.binfmt"
@@ -180,17 +198,29 @@ config MATH_EMULATION
          unit, which will allow programs that use floating-point
          instructions to run.
 
+config 8XX_MINIMAL_FPEMU
+       bool "Minimal math emulation for 8xx"
+       depends on 8xx && !MATH_EMULATION
+       help
+         Older arch/ppc kernels still emulated a few floating point
+         instructions such as load and store, even when full math
+         emulation is disabled.  Say "Y" here if you want to preserve
+         this behavior.
+
+         It is recommended that you build a soft-float userspace instead.
+
 config IOMMU_VMERGE
-       bool "Enable IOMMU virtual merging (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && PPC64
-       default n
+       bool "Enable IOMMU virtual merging"
+       depends on PPC64
+       default y
        help
          Cause IO segments sent to a device for DMA to be merged virtually
          by the IOMMU when they happen to have been allocated contiguously.
          This doesn't add pressure to the IOMMU allocator. However, some
          drivers don't support getting large merged segments coming back
-         from *_map_sg(). Say Y if you know the drivers you are using are
-         properly handling this case.
+         from *_map_sg().
+
+         Most drivers don't have this problem; it is safe to say Y here.
 
 config HOTPLUG_CPU
        bool "Support for enabling/disabling CPUs"
@@ -465,7 +495,7 @@ config PCI_8260
 
 config 8260_PCI9
        bool "Enable workaround for MPC826x erratum PCI 9"
-       depends on PCI_8260 && !ADS8272
+       depends on PCI_8260 && !8272
        default y
 
 choice
@@ -569,7 +599,8 @@ config TASK_SIZE_BOOL
 
 config TASK_SIZE
        hex "Size of user task space" if TASK_SIZE_BOOL
-       default "0x80000000"
+       default "0x80000000" if PPC_PREP || PPC_8xx
+       default "0xc0000000"
 
 config CONSISTENT_START_BOOL
        bool "Set custom consistent memory pool address"
@@ -581,6 +612,7 @@ config CONSISTENT_START_BOOL
 
 config CONSISTENT_START
        hex "Base virtual address of consistent memory pool" if CONSISTENT_START_BOOL
+       default "0xfd000000" if (NOT_COHERENT_CACHE && 8xx)
        default "0xff100000" if NOT_COHERENT_CACHE
 
 config CONSISTENT_SIZE_BOOL
@@ -662,3 +694,7 @@ config KEYS_COMPAT
        default y
 
 source "crypto/Kconfig"
+
+config PPC_CLOCK
+       bool
+       default n
index 22acece95b118d5c6055fed0f72ff7c5a1cbe18b..464f9b4b3169ba6ad1b2f5669f38e13f46a9c02a 100644 (file)
@@ -124,6 +124,16 @@ config IRQSTACKS
          for handling hard and soft interrupts.  This can help avoid
          overflowing the process kernel stacks.
 
+config VIRQ_DEBUG
+       bool "Expose hardware/virtual IRQ mapping via debugfs"
+       depends on DEBUG_FS && PPC_MERGE
+       help
+         This option will show the mapping relationship between hardware irq
+         numbers and virtual irq numbers. The mapping is exposed via debugfs
+         in the file powerpc/virq_mapping.
+
+         If you don't know what this means you don't need it.
+
 config BDI_SWITCH
        bool "Include BDI-2000 user context switcher"
        depends on DEBUG_KERNEL && PPC32
@@ -211,6 +221,15 @@ config PPC_EARLY_DEBUG_44x
          Select this to enable early debugging for IBM 44x chips via the
          inbuilt serial port.
 
+config PPC_EARLY_DEBUG_CPM
+       bool "Early serial debugging for Freescale CPM-based serial ports"
+       depends on SERIAL_CPM
+       select PIN_TLB if PPC_8xx
+       help
+         Select this to enable early debugging for Freescale chips
+         using a CPM-based serial port.  This assumes that the bootwrapper
+         has run, and set up the CPM in a particular way.
+
 endchoice
 
 config PPC_EARLY_DEBUG_44x_PHYSLOW
@@ -223,4 +242,16 @@ config PPC_EARLY_DEBUG_44x_PHYSHIGH
        depends PPC_EARLY_DEBUG_44x
        default "0x1"
 
+config PPC_EARLY_DEBUG_CPM_ADDR
+       hex "CPM UART early debug transmit descriptor address"
+       depends on PPC_EARLY_DEBUG_CPM
+       default "0xfa202008" if PPC_EP88XC
+       default "0xf0000008" if CPM2
+       default "0xff002008" if CPM1
+       help
+         This specifies the address of the transmit descriptor
+         used for early debug output.  Because it is needed before
+         platform probing is done, all platforms selected must
+         share the same address.
+
 endmenu
index 6c1e36c33faa1bd536d5f75cd75ba8d9022174a2..643839a3f5d82d484bd77b651711b93781a36c1b 100644 (file)
@@ -35,11 +35,14 @@ endif
 
 export CROSS32CC CROSS32AS CROSS32LD CROSS32AR CROSS32OBJCOPY
 
+ifeq ($(CROSS_COMPILE),)
 KBUILD_DEFCONFIG := $(shell uname -m)_defconfig
+else
+KBUILD_DEFCONFIG := ppc64_defconfig
+endif
 
 ifeq ($(CONFIG_PPC64),y)
 OLDARCH        := ppc64
-SZ     := 64
 
 new_nm := $(shell if $(NM) --help 2>&1 | grep -- '--synthetic' > /dev/null; then echo y; else echo n; fi)
 
@@ -49,22 +52,26 @@ endif
 
 else
 OLDARCH        := ppc
-SZ     := 32
+endif
+
+# It seems there are times we use this Makefile without
+# including the config file, but this replicates the old behaviour
+ifeq ($(CONFIG_WORD_SIZE),)
+CONFIG_WORD_SIZE := 32
 endif
 
 UTS_MACHINE := $(OLDARCH)
 
 ifeq ($(HAS_BIARCH),y)
-override AS    += -a$(SZ)
-override LD    += -m elf$(SZ)ppc
-override CC    += -m$(SZ)
-override AR    := GNUTARGET=elf$(SZ)-powerpc $(AR)
+override AS    += -a$(CONFIG_WORD_SIZE)
+override LD    += -m elf$(CONFIG_WORD_SIZE)ppc
+override CC    += -m$(CONFIG_WORD_SIZE)
+override AR    := GNUTARGET=elf$(CONFIG_WORD_SIZE)-powerpc $(AR)
 endif
 
 LDFLAGS_vmlinux        := -Bstatic
 
-# The -Iarch/$(ARCH)/include is temporary while we are merging
-CPPFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH) -Iarch/$(ARCH)/include
+CPPFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH)
 AFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH)
 CFLAGS-$(CONFIG_PPC64) := -mminimal-toc -mtraceback=none  -mcall-aixdesc
 CFLAGS-$(CONFIG_PPC32) := -Iarch/$(ARCH) -ffixed-r2 -mmultiple
@@ -72,11 +79,8 @@ CPPFLAGS     += $(CPPFLAGS-y)
 AFLAGS         += $(AFLAGS-y)
 CFLAGS         += -msoft-float -pipe $(CFLAGS-y)
 CPP            = $(CC) -E $(CFLAGS)
-# Temporary hack until we have migrated to asm-powerpc
-LINUXINCLUDE-$(CONFIG_PPC32)   := -Iarch/$(ARCH)/include
-LINUXINCLUDE    += $(LINUXINCLUDE-y)
 
-CHECKFLAGS     += -m$(SZ) -D__powerpc__ -D__powerpc$(SZ)__
+CHECKFLAGS     += -m$(CONFIG_WORD_SIZE) -D__powerpc__ -D__powerpc$(CONFIG_WORD_SIZE)__
 
 ifeq ($(CONFIG_PPC64),y)
 GCC_BROKEN_VEC := $(shell if [ $(call cc-version) -lt 0400 ] ; then echo "y"; fi)
@@ -96,6 +100,10 @@ else
 endif
 endif
 
+ifeq ($(CONFIG_TUNE_CELL),y)
+       CFLAGS += $(call cc-option,-mtune=cell)
+endif
+
 # No AltiVec instruction when building kernel
 CFLAGS += $(call cc-option,-mno-altivec)
 
@@ -120,10 +128,9 @@ cpu-as-$(CONFIG_E200)              += -Wa,-me200
 AFLAGS += $(cpu-as-y)
 CFLAGS += $(cpu-as-y)
 
-head-y                         := arch/powerpc/kernel/head_32.o
-head-$(CONFIG_PPC64)           := arch/powerpc/kernel/head_64.o
+head-y                         := arch/powerpc/kernel/head_$(CONFIG_WORD_SIZE).o
 head-$(CONFIG_8xx)             := arch/powerpc/kernel/head_8xx.o
-head-$(CONFIG_4xx)             := arch/powerpc/kernel/head_4xx.o
+head-$(CONFIG_40x)             := arch/powerpc/kernel/head_40x.o
 head-$(CONFIG_44x)             := arch/powerpc/kernel/head_44x.o
 head-$(CONFIG_FSL_BOOKE)       := arch/powerpc/kernel/head_fsl_booke.o
 
@@ -166,25 +173,20 @@ define archhelp
   @echo '  *_defconfig     - Select default config from arch/$(ARCH)/configs'
 endef
 
-install:
+install: vdso_install
        $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
 
+vdso_install:
+ifeq ($(CONFIG_PPC64),y)
+       $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso64 $@
+endif
+       $(Q)$(MAKE) $(build)=arch/$(ARCH)/kernel/vdso32 $@
+
 archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
 
-archmrproper:
-       $(Q)rm -rf arch/$(ARCH)/include
-
 archprepare: checkbin
 
-ifeq ($(CONFIG_PPC32),y)
-# Temporary hack until we have migrated to asm-powerpc
-include/asm: arch/$(ARCH)/include/asm
-arch/$(ARCH)/include/asm: FORCE
-       $(Q)if [ ! -d arch/$(ARCH)/include ]; then mkdir -p arch/$(ARCH)/include; fi
-       $(Q)ln -fsn $(srctree)/include/asm-$(OLDARCH) arch/$(ARCH)/include/asm
-endif
-
 # Use the file '.tmp_gas_check' for binutils tests, as gas won't output
 # to stdout and these checks are run even on install targets.
 TOUT   := .tmp_gas_check
index eec7af7e5993c8e8cf3c9d2f2a10d1122e5fa69c..65f4118cbe78b9f852820f2963498341fb3b6a57 100644 (file)
@@ -18,14 +18,15 @@ kernel-vmlinux.strip.c
 kernel-vmlinux.strip.gz
 mktree
 uImage
-cuImage
-cuImage.bin.gz
-cuImage.elf
+cuImage.*
+treeImage.*
 zImage
+zImage.bin.*
 zImage.chrp
 zImage.coff
 zImage.coff.lds
-zImage.lds
+zImage.ep*
+zImage.*lds
 zImage.miboot
 zImage.pmac
 zImage.pseries
diff --git a/arch/powerpc/boot/44x.c b/arch/powerpc/boot/44x.c
deleted file mode 100644 (file)
index 9f64e84..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright 2007 David Gibson, IBM Corporation.
- *
- * Based on earlier code:
- *   Matt Porter <mporter@kernel.crashing.org>
- *   Copyright 2002-2005 MontaVista Software Inc.
- *
- *   Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
- *   Copyright (c) 2003, 2004 Zultys Technologies
- *
- * 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 <stddef.h>
-#include "types.h"
-#include "string.h"
-#include "stdio.h"
-#include "ops.h"
-#include "reg.h"
-#include "dcr.h"
-
-/* Read the 44x memory controller to get size of system memory. */
-void ibm44x_fixup_memsize(void)
-{
-       int i;
-       unsigned long memsize, bank_config;
-
-       memsize = 0;
-       for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
-               mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
-               bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
-
-               if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
-                       memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
-       }
-
-       dt_fixup_memory(0, memsize);
-}
-
-#define SPRN_DBCR0             0x134
-#define   DBCR0_RST_SYSTEM     0x30000000
-
-void ibm44x_dbcr_reset(void)
-{
-       unsigned long tmp;
-
-       asm volatile (
-               "mfspr  %0,%1\n"
-               "oris   %0,%0,%2@h\n"
-               "mtspr  %1,%0"
-               : "=&r"(tmp) : "i"(SPRN_DBCR0), "i"(DBCR0_RST_SYSTEM)
-               );
-
-}
-
-/* Read 4xx EBC bus bridge registers to get mappings of the peripheral
- * banks into the OPB address space */
-void ibm4xx_fixup_ebc_ranges(const char *ebc)
-{
-       void *devp;
-       u32 bxcr;
-       u32 ranges[EBC_NUM_BANKS*4];
-       u32 *p = ranges;
-       int i;
-
-       for (i = 0; i < EBC_NUM_BANKS; i++) {
-               mtdcr(DCRN_EBC0_CFGADDR, EBC_BXCR(i));
-               bxcr = mfdcr(DCRN_EBC0_CFGDATA);
-
-               if ((bxcr & EBC_BXCR_BU) != EBC_BXCR_BU_OFF) {
-                       *p++ = i;
-                       *p++ = 0;
-                       *p++ = bxcr & EBC_BXCR_BAS;
-                       *p++ = EBC_BXCR_BANK_SIZE(bxcr);
-               }
-       }
-
-       devp = finddevice(ebc);
-       if (! devp)
-               fatal("Couldn't locate EBC node %s\n\r", ebc);
-
-       setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32));
-}
index 577982c9a3cd6f5de9653c8ee4f5e669cc74998d..02563443788afd09e187b6c8f9bdb8badc40bd98 100644 (file)
 #ifndef _PPC_BOOT_44X_H_
 #define _PPC_BOOT_44X_H_
 
-void ibm44x_fixup_memsize(void);
-void ibm4xx_fixup_ebc_ranges(const char *ebc);
-
-void ibm44x_dbcr_reset(void);
 void ebony_init(void *mac0, void *mac1);
+void bamboo_init(void *mac0, void *mac1);
 
 #endif /* _PPC_BOOT_44X_H_ */
diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c
new file mode 100644 (file)
index 0000000..ebf9e21
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * Copyright 2007 David Gibson, IBM Corporation.
+ *
+ * Based on earlier code:
+ *   Matt Porter <mporter@kernel.crashing.org>
+ *   Copyright 2002-2005 MontaVista Software Inc.
+ *
+ *   Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
+ *   Copyright (c) 2003, 2004 Zultys Technologies
+ *
+ * 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 <stddef.h>
+#include "types.h"
+#include "string.h"
+#include "stdio.h"
+#include "ops.h"
+#include "reg.h"
+#include "dcr.h"
+
+/* Read the 4xx SDRAM controller to get size of system memory. */
+void ibm4xx_fixup_memsize(void)
+{
+       int i;
+       unsigned long memsize, bank_config;
+
+       memsize = 0;
+       for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
+               mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
+               bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
+
+               if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
+                       memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
+       }
+
+       dt_fixup_memory(0, memsize);
+}
+
+/* 4xx DDR1/2 Denali memory controller support */
+/* DDR0 registers */
+#define DDR0_02                        2
+#define DDR0_08                        8
+#define DDR0_10                        10
+#define DDR0_14                        14
+#define DDR0_42                        42
+#define DDR0_43                        43
+
+/* DDR0_02 */
+#define DDR_START              0x1
+#define DDR_START_SHIFT                0
+#define DDR_MAX_CS_REG         0x3
+#define DDR_MAX_CS_REG_SHIFT   24
+#define DDR_MAX_COL_REG                0xf
+#define DDR_MAX_COL_REG_SHIFT  16
+#define DDR_MAX_ROW_REG                0xf
+#define DDR_MAX_ROW_REG_SHIFT  8
+/* DDR0_08 */
+#define DDR_DDR2_MODE          0x1
+#define DDR_DDR2_MODE_SHIFT    0
+/* DDR0_10 */
+#define DDR_CS_MAP             0x3
+#define DDR_CS_MAP_SHIFT       8
+/* DDR0_14 */
+#define DDR_REDUC              0x1
+#define DDR_REDUC_SHIFT                16
+/* DDR0_42 */
+#define DDR_APIN               0x7
+#define DDR_APIN_SHIFT         24
+/* DDR0_43 */
+#define DDR_COL_SZ             0x7
+#define DDR_COL_SZ_SHIFT       8
+#define DDR_BANK8              0x1
+#define DDR_BANK8_SHIFT                0
+
+#define DDR_GET_VAL(val, mask, shift)  (((val) >> (shift)) & (mask))
+
+static inline u32 mfdcr_sdram0(u32 reg)
+{
+        mtdcr(DCRN_SDRAM0_CFGADDR, reg);
+        return mfdcr(DCRN_SDRAM0_CFGDATA);
+}
+
+void ibm4xx_denali_fixup_memsize(void)
+{
+       u32 val, max_cs, max_col, max_row;
+       u32 cs, col, row, bank, dpath;
+       unsigned long memsize;
+
+       val = mfdcr_sdram0(DDR0_02);
+       if (!DDR_GET_VAL(val, DDR_START, DDR_START_SHIFT))
+               fatal("DDR controller is not initialized\n");
+
+       /* get maximum cs col and row values */
+       max_cs  = DDR_GET_VAL(val, DDR_MAX_CS_REG, DDR_MAX_CS_REG_SHIFT);
+       max_col = DDR_GET_VAL(val, DDR_MAX_COL_REG, DDR_MAX_COL_REG_SHIFT);
+       max_row = DDR_GET_VAL(val, DDR_MAX_ROW_REG, DDR_MAX_ROW_REG_SHIFT);
+
+       /* get CS value */
+       val = mfdcr_sdram0(DDR0_10);
+
+       val = DDR_GET_VAL(val, DDR_CS_MAP, DDR_CS_MAP_SHIFT);
+       cs = 0;
+       while (val) {
+               if (val && 0x1)
+                       cs++;
+               val = val >> 1;
+       }
+
+       if (!cs)
+               fatal("No memory installed\n");
+       if (cs > max_cs)
+               fatal("DDR wrong CS configuration\n");
+
+       /* get data path bytes */
+       val = mfdcr_sdram0(DDR0_14);
+
+       if (DDR_GET_VAL(val, DDR_REDUC, DDR_REDUC_SHIFT))
+               dpath = 8; /* 64 bits */
+       else
+               dpath = 4; /* 32 bits */
+
+       /* get adress pins (rows) */
+       val = mfdcr_sdram0(DDR0_42);
+
+       row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT);
+       if (row > max_row)
+               fatal("DDR wrong APIN configuration\n");
+       row = max_row - row;
+
+       /* get collomn size and banks */
+       val = mfdcr_sdram0(DDR0_43);
+
+       col = DDR_GET_VAL(val, DDR_COL_SZ, DDR_COL_SZ_SHIFT);
+       if (col > max_col)
+               fatal("DDR wrong COL configuration\n");
+       col = max_col - col;
+
+       if (DDR_GET_VAL(val, DDR_BANK8, DDR_BANK8_SHIFT))
+               bank = 8; /* 8 banks */
+       else
+               bank = 4; /* 4 banks */
+
+       memsize = cs * (1 << (col+row)) * bank * dpath;
+       dt_fixup_memory(0, memsize);
+}
+
+#define SPRN_DBCR0_40X 0x3F2
+#define SPRN_DBCR0_44X 0x134
+#define DBCR0_RST_SYSTEM 0x30000000
+
+void ibm44x_dbcr_reset(void)
+{
+       unsigned long tmp;
+
+       asm volatile (
+               "mfspr  %0,%1\n"
+               "oris   %0,%0,%2@h\n"
+               "mtspr  %1,%0"
+               : "=&r"(tmp) : "i"(SPRN_DBCR0_44X), "i"(DBCR0_RST_SYSTEM)
+               );
+
+}
+
+void ibm40x_dbcr_reset(void)
+{
+       unsigned long tmp;
+
+       asm volatile (
+               "mfspr  %0,%1\n"
+               "oris   %0,%0,%2@h\n"
+               "mtspr  %1,%0"
+               : "=&r"(tmp) : "i"(SPRN_DBCR0_40X), "i"(DBCR0_RST_SYSTEM)
+               );
+}
+
+#define EMAC_RESET 0x20000000
+void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1)
+{
+       /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't do this for us */
+       if (emac0)
+               *emac0 = EMAC_RESET;
+       if (emac1)
+               *emac1 = EMAC_RESET;
+
+       mtdcr(DCRN_MAL0_CFG, MAL_RESET);
+}
+
+/* Read 4xx EBC bus bridge registers to get mappings of the peripheral
+ * banks into the OPB address space */
+void ibm4xx_fixup_ebc_ranges(const char *ebc)
+{
+       void *devp;
+       u32 bxcr;
+       u32 ranges[EBC_NUM_BANKS*4];
+       u32 *p = ranges;
+       int i;
+
+       for (i = 0; i < EBC_NUM_BANKS; i++) {
+               mtdcr(DCRN_EBC0_CFGADDR, EBC_BXCR(i));
+               bxcr = mfdcr(DCRN_EBC0_CFGDATA);
+
+               if ((bxcr & EBC_BXCR_BU) != EBC_BXCR_BU_OFF) {
+                       *p++ = i;
+                       *p++ = 0;
+                       *p++ = bxcr & EBC_BXCR_BAS;
+                       *p++ = EBC_BXCR_BANK_SIZE(bxcr);
+               }
+       }
+
+       devp = finddevice(ebc);
+       if (! devp)
+               fatal("Couldn't locate EBC node %s\n\r", ebc);
+
+       setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32));
+}
+
+#define SPRN_CCR1 0x378
+void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
+{
+       u32 cpu, plb, opb, ebc, tb, uart0, m, vco;
+       u32 reg;
+       u32 fwdva, fwdvb, fbdv, lfbdv, opbdv0, perdv0, spcid0, prbdv0, tmp;
+
+       mtdcr(DCRN_CPR0_ADDR, CPR0_PLLD0);
+       reg = mfdcr(DCRN_CPR0_DATA);
+       tmp = (reg & 0x000F0000) >> 16;
+       fwdva = tmp ? tmp : 16;
+       tmp = (reg & 0x00000700) >> 8;
+       fwdvb = tmp ? tmp : 8;
+       tmp = (reg & 0x1F000000) >> 24;
+       fbdv = tmp ? tmp : 32;
+       lfbdv = (reg & 0x0000007F);
+
+       mtdcr(DCRN_CPR0_ADDR, CPR0_OPBD0);
+       reg = mfdcr(DCRN_CPR0_DATA);
+       tmp = (reg & 0x03000000) >> 24;
+       opbdv0 = tmp ? tmp : 4;
+
+       mtdcr(DCRN_CPR0_ADDR, CPR0_PERD0);
+       reg = mfdcr(DCRN_CPR0_DATA);
+       tmp = (reg & 0x07000000) >> 24;
+       perdv0 = tmp ? tmp : 8;
+
+       mtdcr(DCRN_CPR0_ADDR, CPR0_PRIMBD0);
+       reg = mfdcr(DCRN_CPR0_DATA);
+       tmp = (reg & 0x07000000) >> 24;
+       prbdv0 = tmp ? tmp : 8;
+
+       mtdcr(DCRN_CPR0_ADDR, CPR0_SCPID);
+       reg = mfdcr(DCRN_CPR0_DATA);
+       tmp = (reg & 0x03000000) >> 24;
+       spcid0 = tmp ? tmp : 4;
+
+       /* Calculate M */
+       mtdcr(DCRN_CPR0_ADDR, CPR0_PLLC0);
+       reg = mfdcr(DCRN_CPR0_DATA);
+       tmp = (reg & 0x03000000) >> 24;
+       if (tmp == 0) { /* PLL output */
+               tmp = (reg & 0x20000000) >> 29;
+               if (!tmp) /* PLLOUTA */
+                       m = fbdv * lfbdv * fwdva;
+               else
+                       m = fbdv * lfbdv * fwdvb;
+       }
+       else if (tmp == 1) /* CPU output */
+               m = fbdv * fwdva;
+       else
+               m = perdv0 * opbdv0 * fwdvb;
+
+       vco = (m * sysclk) + (m >> 1);
+       cpu = vco / fwdva;
+       plb = vco / fwdvb / prbdv0;
+       opb = plb / opbdv0;
+       ebc = plb / perdv0;
+
+       /* FIXME */
+       uart0 = ser_clk;
+
+       /* Figure out timebase.  Either CPU or default TmrClk */
+       asm volatile (
+                       "mfspr  %0,%1\n"
+                       :
+                       "=&r"(reg) : "i"(SPRN_CCR1));
+       if (reg & 0x0080)
+               tb = 25000000; /* TmrClk is 25MHz */
+       else
+               tb = cpu;
+
+       dt_fixup_cpu_clocks(cpu, tb, 0);
+       dt_fixup_clock("/plb", plb);
+       dt_fixup_clock("/plb/opb", opb);
+       dt_fixup_clock("/plb/opb/ebc", ebc);
+       dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
+       dt_fixup_clock("/plb/opb/serial@ef600400", uart0);
+       dt_fixup_clock("/plb/opb/serial@ef600500", uart0);
+       dt_fixup_clock("/plb/opb/serial@ef600600", uart0);
+}
diff --git a/arch/powerpc/boot/4xx.h b/arch/powerpc/boot/4xx.h
new file mode 100644 (file)
index 0000000..adba6a5
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * PowerPC 4xx related functions
+ *
+ * Copyright 2007 IBM Corporation.
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+#ifndef _POWERPC_BOOT_4XX_H_
+#define _POWERPC_BOOT_4XX_H_
+
+void ibm4xx_fixup_memsize(void);
+void ibm4xx_denali_fixup_memsize(void);
+void ibm44x_dbcr_reset(void);
+void ibm40x_dbcr_reset(void);
+void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1);
+void ibm4xx_fixup_ebc_ranges(const char *ebc);
+void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk);
+
+#endif /* _POWERPC_BOOT_4XX_H_ */
index 61a6f34ca5ed944045cfe73016cbb443505448dd..18e32719d0ed4544202bae47cc9c1361e6116649 100644 (file)
@@ -25,14 +25,19 @@ BOOTCFLAGS    := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                 -isystem $(shell $(CROSS32CC) -print-file-name=include)
 BOOTAFLAGS     := -D__ASSEMBLY__ $(BOOTCFLAGS) -traditional -nostdinc
 
+ifdef CONFIG_DEBUG_INFO
+BOOTCFLAGS     += -g
+endif
+
 ifeq ($(call cc-option-yn, -fstack-protector),y)
 BOOTCFLAGS     += -fno-stack-protector
 endif
 
 BOOTCFLAGS     += -I$(obj) -I$(srctree)/$(obj)
 
-$(obj)/44x.o: BOOTCFLAGS += -mcpu=440
+$(obj)/4xx.o: BOOTCFLAGS += -mcpu=440
 $(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
+$(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
 
 zlib       := inffast.c inflate.c inftrees.c
 zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
@@ -44,10 +49,14 @@ $(addprefix $(obj)/,$(zlib) gunzip_util.o main.o): \
 src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
                ns16550.c serial.c simple_alloc.c div64.S util.S \
                gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
-               44x.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c
-src-plat := of.c cuboot-83xx.c cuboot-85xx.c holly.c \
+               4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
+               cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
+               fsl-soc.c mpc8xx.c pq2.c
+src-plat := of.c cuboot-52xx.c cuboot-83xx.c cuboot-85xx.c holly.c \
                cuboot-ebony.c treeboot-ebony.c prpmc2800.c \
-               ps3-head.S ps3-hvcall.S ps3.c
+               ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
+               cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c cuboot-bamboo.c \
+               fixed-head.S ep88xc.c cuboot-hpc2.c
 src-boot := $(src-wlib) $(src-plat) empty.c
 
 src-boot := $(addprefix $(obj)/, $(src-boot))
@@ -139,9 +148,17 @@ image-$(CONFIG_PPC_ISERIES)                += zImage.iseries
 image-$(CONFIG_DEFAULT_UIMAGE)         += uImage
 
 ifneq ($(CONFIG_DEVICE_TREE),"")
+image-$(CONFIG_PPC_8xx)                        += cuImage.8xx
+image-$(CONFIG_PPC_EP88XC)             += zImage.ep88xc
+image-$(CONFIG_8260)                   += cuImage.pq2
+image-$(CONFIG_PPC_MPC52xx)            += cuImage.52xx
 image-$(CONFIG_PPC_83xx)               += cuImage.83xx
 image-$(CONFIG_PPC_85xx)               += cuImage.85xx
+image-$(CONFIG_MPC7448HPC2)            += cuImage.hpc2
 image-$(CONFIG_EBONY)                  += treeImage.ebony cuImage.ebony
+image-$(CONFIG_BAMBOO)                 += treeImage.bamboo cuImage.bamboo
+image-$(CONFIG_SEQUOIA)                        += cuImage.sequoia
+image-$(CONFIG_WALNUT)                 += treeImage.walnut
 endif
 
 # For 32-bit powermacs, build the COFF and miboot images
diff --git a/arch/powerpc/boot/bamboo.c b/arch/powerpc/boot/bamboo.c
new file mode 100644 (file)
index 0000000..f61fcda
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright IBM Corporation, 2007
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * Based on ebony wrapper:
+ * Copyright 2007 David Gibson, IBM Corporation.
+ *
+ * Clocking code based on code by:
+ * Stefan Roese <sr@denx.de>
+ *
+ * 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; version 2 of the License
+ */
+#include <stdarg.h>
+#include <stddef.h>
+#include "types.h"
+#include "elf.h"
+#include "string.h"
+#include "stdio.h"
+#include "page.h"
+#include "ops.h"
+#include "dcr.h"
+#include "4xx.h"
+#include "44x.h"
+
+static u8 *bamboo_mac0, *bamboo_mac1;
+
+static void bamboo_fixups(void)
+{
+       unsigned long sysclk = 33333333;
+
+       ibm440ep_fixup_clocks(sysclk, 11059200);
+       ibm4xx_fixup_memsize();
+       ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
+       dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
+}
+
+void bamboo_init(void *mac0, void *mac1)
+{
+       platform_ops.fixups = bamboo_fixups;
+       platform_ops.exit = ibm44x_dbcr_reset;
+       bamboo_mac0 = mac0;
+       bamboo_mac1 = mac1;
+       ft_init(_dtb_start, 0, 32);
+       serial_console_init();
+}
diff --git a/arch/powerpc/boot/cpm-serial.c b/arch/powerpc/boot/cpm-serial.c
new file mode 100644 (file)
index 0000000..28296fa
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * CPM serial console support.
+ *
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * It is assumed that the firmware (or the platform file) has already set
+ * up the port.
+ */
+
+#include "types.h"
+#include "io.h"
+#include "ops.h"
+
+struct cpm_scc {
+       u32 gsmrl;
+       u32 gsmrh;
+       u16 psmr;
+       u8 res1[2];
+       u16 todr;
+       u16 dsr;
+       u16 scce;
+       u8 res2[2];
+       u16 sccm;
+       u8 res3;
+       u8 sccs;
+       u8 res4[8];
+};
+
+struct cpm_smc {
+       u8 res1[2];
+       u16 smcmr;
+       u8 res2[2];
+       u8 smce;
+       u8 res3[3];
+       u8 smcm;
+       u8 res4[5];
+};
+
+struct cpm_param {
+       u16 rbase;
+       u16 tbase;
+       u8 rfcr;
+       u8 tfcr;
+};
+
+struct cpm_bd {
+       u16 sc;   /* Status and Control */
+       u16 len;  /* Data length in buffer */
+       u8 *addr; /* Buffer address in host memory */
+};
+
+static void *cpcr;
+static struct cpm_param *param;
+static struct cpm_smc *smc;
+static struct cpm_scc *scc;
+struct cpm_bd *tbdf, *rbdf;
+static u32 cpm_cmd;
+static u8 *muram_start;
+static u32 muram_offset;
+
+static void (*do_cmd)(int op);
+static void (*enable_port)(void);
+static void (*disable_port)(void);
+
+#define CPM_CMD_STOP_TX     4
+#define CPM_CMD_RESTART_TX  6
+#define CPM_CMD_INIT_RX_TX  0
+
+static void cpm1_cmd(int op)
+{
+       while (in_be16(cpcr) & 1)
+               ;
+
+       out_be16(cpcr, (op << 8) | cpm_cmd | 1);
+
+       while (in_be16(cpcr) & 1)
+               ;
+}
+
+static void cpm2_cmd(int op)
+{
+       while (in_be32(cpcr) & 0x10000)
+               ;
+
+       out_be32(cpcr, op | cpm_cmd | 0x10000);
+
+       while (in_be32(cpcr) & 0x10000)
+               ;
+}
+
+static void smc_disable_port(void)
+{
+       do_cmd(CPM_CMD_STOP_TX);
+       out_be16(&smc->smcmr, in_be16(&smc->smcmr) & ~3);
+}
+
+static void scc_disable_port(void)
+{
+       do_cmd(CPM_CMD_STOP_TX);
+       out_be32(&scc->gsmrl, in_be32(&scc->gsmrl) & ~0x30);
+}
+
+static void smc_enable_port(void)
+{
+       out_be16(&smc->smcmr, in_be16(&smc->smcmr) | 3);
+       do_cmd(CPM_CMD_RESTART_TX);
+}
+
+static void scc_enable_port(void)
+{
+       out_be32(&scc->gsmrl, in_be32(&scc->gsmrl) | 0x30);
+       do_cmd(CPM_CMD_RESTART_TX);
+}
+
+static int cpm_serial_open(void)
+{
+       disable_port();
+
+       out_8(&param->rfcr, 0x10);
+       out_8(&param->tfcr, 0x10);
+
+       rbdf = (struct cpm_bd *)muram_start;
+       rbdf->addr = (u8 *)(rbdf + 2);
+       rbdf->sc = 0xa000;
+       rbdf->len = 1;
+
+       tbdf = rbdf + 1;
+       tbdf->addr = (u8 *)(rbdf + 2) + 1;
+       tbdf->sc = 0x2000;
+       tbdf->len = 1;
+
+       sync();
+       out_be16(&param->rbase, muram_offset);
+       out_be16(&param->tbase, muram_offset + sizeof(struct cpm_bd));
+
+       do_cmd(CPM_CMD_INIT_RX_TX);
+
+       enable_port();
+       return 0;
+}
+
+static void cpm_serial_putc(unsigned char c)
+{
+       while (tbdf->sc & 0x8000)
+               barrier();
+
+       sync();
+
+       tbdf->addr[0] = c;
+       eieio();
+       tbdf->sc |= 0x8000;
+}
+
+static unsigned char cpm_serial_tstc(void)
+{
+       barrier();
+       return !(rbdf->sc & 0x8000);
+}
+
+static unsigned char cpm_serial_getc(void)
+{
+       unsigned char c;
+
+       while (!cpm_serial_tstc())
+               ;
+
+       sync();
+       c = rbdf->addr[0];
+       eieio();
+       rbdf->sc |= 0x8000;
+
+       return c;
+}
+
+int cpm_console_init(void *devp, struct serial_console_data *scdp)
+{
+       void *reg_virt[2];
+       int is_smc = 0, is_cpm2 = 0, n;
+       unsigned long reg_phys;
+       void *parent, *muram;
+
+       if (dt_is_compatible(devp, "fsl,cpm1-smc-uart")) {
+               is_smc = 1;
+       } else if (dt_is_compatible(devp, "fsl,cpm2-scc-uart")) {
+               is_cpm2 = 1;
+       } else if (dt_is_compatible(devp, "fsl,cpm2-smc-uart")) {
+               is_cpm2 = 1;
+               is_smc = 1;
+       }
+
+       if (is_smc) {
+               enable_port = smc_enable_port;
+               disable_port = smc_disable_port;
+       } else {
+               enable_port = scc_enable_port;
+               disable_port = scc_disable_port;
+       }
+
+       if (is_cpm2)
+               do_cmd = cpm2_cmd;
+       else
+               do_cmd = cpm1_cmd;
+
+       n = getprop(devp, "fsl,cpm-command", &cpm_cmd, 4);
+       if (n < 4)
+               return -1;
+
+       n = getprop(devp, "virtual-reg", reg_virt, sizeof(reg_virt));
+       if (n < (int)sizeof(reg_virt)) {
+               for (n = 0; n < 2; n++) {
+                       if (!dt_xlate_reg(devp, n, &reg_phys, NULL))
+                               return -1;
+
+                       reg_virt[n] = (void *)reg_phys;
+               }
+       }
+
+       if (is_smc)
+               smc = reg_virt[0];
+       else
+               scc = reg_virt[0];
+
+       param = reg_virt[1];
+
+       parent = get_parent(devp);
+       if (!parent)
+               return -1;
+
+       n = getprop(parent, "virtual-reg", reg_virt, sizeof(reg_virt));
+       if (n < (int)sizeof(reg_virt)) {
+               if (!dt_xlate_reg(parent, 0, &reg_phys, NULL))
+                       return -1;
+
+               reg_virt[0] = (void *)reg_phys;
+       }
+
+       cpcr = reg_virt[0];
+
+       muram = finddevice("/soc/cpm/muram/data");
+       if (!muram)
+               return -1;
+
+       /* For bootwrapper-compatible device trees, we assume that the first
+        * entry has at least 18 bytes, and that #address-cells/#data-cells
+        * is one for both parent and child.
+        */
+
+       n = getprop(muram, "virtual-reg", reg_virt, sizeof(reg_virt));
+       if (n < (int)sizeof(reg_virt)) {
+               if (!dt_xlate_reg(muram, 0, &reg_phys, NULL))
+                       return -1;
+
+               reg_virt[0] = (void *)reg_phys;
+       }
+
+       muram_start = reg_virt[0];
+
+       n = getprop(muram, "reg", &muram_offset, 4);
+       if (n < 4)
+               return -1;
+
+       scdp->open = cpm_serial_open;
+       scdp->putc = cpm_serial_putc;
+       scdp->getc = cpm_serial_getc;
+       scdp->tstc = cpm_serial_tstc;
+
+       return 0;
+}
diff --git a/arch/powerpc/boot/cuboot-52xx.c b/arch/powerpc/boot/cuboot-52xx.c
new file mode 100644 (file)
index 0000000..9256a26
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Old U-boot compatibility for MPC5200
+ *
+ * Author: Grant Likely <grant.likely@secretlab.ca>
+ *
+ * Copyright (c) 2007 Secret Lab Technologies Ltd.
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "io.h"
+#include "cuboot.h"
+
+#define TARGET_PPC_MPC52xx
+#include "ppcboot.h"
+
+static bd_t bd;
+
+static void platform_fixups(void)
+{
+       void *soc, *reg;
+       int div;
+       u32 sysfreq;
+
+
+       dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
+       dt_fixup_mac_addresses(bd.bi_enetaddr);
+       dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
+
+       /* Unfortunately, the specific model number is encoded in the
+        * soc node name in existing dts files -- once that is fixed,
+        * this can do a simple path lookup.
+        */
+       soc = find_node_by_devtype(NULL, "soc");
+       if (soc) {
+               setprop(soc, "bus-frequency", &bd.bi_ipbfreq,
+                       sizeof(bd.bi_ipbfreq));
+
+               if (!dt_xlate_reg(soc, 0, (void*)&reg, NULL))
+                       return;
+               div = in_8(reg + 0x204) & 0x0020 ? 8 : 4;
+               sysfreq = bd.bi_busfreq * div;
+               setprop(soc, "system-frequency", &sysfreq, sizeof(sysfreq));
+       }
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+                   unsigned long r6, unsigned long r7)
+{
+       CUBOOT_INIT();
+       ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
+       serial_console_init();
+       platform_ops.fixups = platform_fixups;
+}
index 296025d8b295a3cb0f8a1219bbfd765c7afd85f6..a0505509abcc40ed3eff8121e8a8b56f4e40bdf0 100644 (file)
@@ -18,7 +18,6 @@
 #include "ppcboot.h"
 
 static bd_t bd;
-extern char _dtb_start[], _dtb_end[];
 
 static void platform_fixups(void)
 {
index 10f0f697c9359e9c33787a1728396f8bd4e73255..345dcbecef0fc81d14a41e1d14bf85bec2410afb 100644 (file)
@@ -18,7 +18,6 @@
 #include "ppcboot.h"
 
 static bd_t bd;
-extern char _dtb_start[], _dtb_end[];
 
 static void platform_fixups(void)
 {
diff --git a/arch/powerpc/boot/cuboot-8xx.c b/arch/powerpc/boot/cuboot-8xx.c
new file mode 100644 (file)
index 0000000..0e82015
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Old U-boot compatibility for 8xx
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "cuboot.h"
+
+#define TARGET_8xx
+#define TARGET_HAS_ETH1
+#include "ppcboot.h"
+
+static bd_t bd;
+
+static void platform_fixups(void)
+{
+       void *node;
+
+       dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
+       dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
+       dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 16, bd.bi_busfreq);
+
+       node = finddevice("/soc/cpm");
+       if (node)
+               setprop(node, "clock-frequency", &bd.bi_busfreq, 4);
+
+       node = finddevice("/soc/cpm/brg");
+       if (node)
+               setprop(node, "clock-frequency",  &bd.bi_busfreq, 4);
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+                   unsigned long r6, unsigned long r7)
+{
+       CUBOOT_INIT();
+       ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
+       serial_console_init();
+       platform_ops.fixups = platform_fixups;
+}
diff --git a/arch/powerpc/boot/cuboot-bamboo.c b/arch/powerpc/boot/cuboot-bamboo.c
new file mode 100644 (file)
index 0000000..900c7ff
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Old U-boot compatibility for Bamboo
+ *
+ * Author: Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * Copyright 2007 IBM Corporation
+ *
+ * Based on cuboot-ebony.c
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "44x.h"
+#include "cuboot.h"
+
+#define TARGET_44x
+#include "ppcboot.h"
+
+static bd_t bd;
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+               unsigned long r6, unsigned long r7)
+{
+       CUBOOT_INIT();
+       bamboo_init(&bd.bi_enetaddr, &bd.bi_enet1addr);
+}
diff --git a/arch/powerpc/boot/cuboot-hpc2.c b/arch/powerpc/boot/cuboot-hpc2.c
new file mode 100644 (file)
index 0000000..d333898
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
+ *
+ * Author: Roy Zang <tie-fei.zang@freescale.com>
+ *
+ * Description:
+ * Old U-boot compatibility for mpc7448hpc2 board
+ * Based on the code of Scott Wood <scottwood@freescale.com>
+ * for 83xx and 85xx.
+ *
+ * This 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 "ops.h"
+#include "stdio.h"
+#include "cuboot.h"
+
+#define TARGET_HAS_ETH1
+#include "ppcboot.h"
+
+static bd_t bd;
+extern char _dtb_start[], _dtb_end[];
+
+static void platform_fixups(void)
+{
+       void *tsi;
+
+       dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
+       dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
+       dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
+       tsi = find_node_by_devtype(NULL, "tsi-bridge");
+       if (tsi)
+               setprop(tsi, "bus-frequency", &bd.bi_busfreq,
+                       sizeof(bd.bi_busfreq));
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+               unsigned long r6, unsigned long r7)
+{
+       CUBOOT_INIT();
+       ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
+       serial_console_init();
+       platform_ops.fixups = platform_fixups;
+}
diff --git a/arch/powerpc/boot/cuboot-pq2.c b/arch/powerpc/boot/cuboot-pq2.c
new file mode 100644 (file)
index 0000000..61574f3
--- /dev/null
@@ -0,0 +1,261 @@
+/*
+ * Old U-boot compatibility for PowerQUICC II
+ * (a.k.a. 82xx with CPM, not the 8240 family of chips)
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "cuboot.h"
+#include "io.h"
+#include "fsl-soc.h"
+
+#define TARGET_CPM2
+#define TARGET_HAS_ETH1
+#include "ppcboot.h"
+
+static bd_t bd;
+
+struct cs_range {
+       u32 csnum;
+       u32 base; /* must be zero */
+       u32 addr;
+       u32 size;
+};
+
+struct pci_range {
+       u32 flags;
+       u32 pci_addr[2];
+       u32 phys_addr;
+       u32 size[2];
+};
+
+struct cs_range cs_ranges_buf[MAX_PROP_LEN / sizeof(struct cs_range)];
+struct pci_range pci_ranges_buf[MAX_PROP_LEN / sizeof(struct pci_range)];
+
+/* Different versions of u-boot put the BCSR in different places, and
+ * some don't set up the PCI PIC at all, so we assume the device tree is
+ * sane and update the BRx registers appropriately.
+ *
+ * For any node defined as compatible with fsl,pq2-localbus,
+ * #address/#size must be 2/1 for the localbus, and 1/1 for the parent bus.
+ * Ranges must be for whole chip selects.
+ */
+static void update_cs_ranges(void)
+{
+       void *bus_node, *parent_node;
+       u32 *ctrl_addr;
+       unsigned long ctrl_size;
+       u32 naddr, nsize;
+       int len;
+       int i;
+
+       bus_node = finddevice("/localbus");
+       if (!bus_node || !dt_is_compatible(bus_node, "fsl,pq2-localbus"))
+               return;
+
+       dt_get_reg_format(bus_node, &naddr, &nsize);
+       if (naddr != 2 || nsize != 1)
+               goto err;
+
+       parent_node = get_parent(bus_node);
+       if (!parent_node)
+               goto err;
+
+       dt_get_reg_format(parent_node, &naddr, &nsize);
+       if (naddr != 1 || nsize != 1)
+               goto err;
+
+       if (!dt_xlate_reg(bus_node, 0, (unsigned long *)&ctrl_addr,
+                         &ctrl_size))
+               goto err;
+
+       len = getprop(bus_node, "ranges", cs_ranges_buf, sizeof(cs_ranges_buf));
+
+       for (i = 0; i < len / sizeof(struct cs_range); i++) {
+               u32 base, option;
+               int cs = cs_ranges_buf[i].csnum;
+               if (cs >= ctrl_size / 8)
+                       goto err;
+
+               if (cs_ranges_buf[i].base != 0)
+                       goto err;
+
+               base = in_be32(&ctrl_addr[cs * 2]);
+
+               /* If CS is already valid, use the existing flags.
+                * Otherwise, guess a sane default.
+                */
+               if (base & 1) {
+                       base &= 0x7fff;
+                       option = in_be32(&ctrl_addr[cs * 2 + 1]) & 0x7fff;
+               } else {
+                       base = 0x1801;
+                       option = 0x10;
+               }
+
+               out_be32(&ctrl_addr[cs * 2], 0);
+               out_be32(&ctrl_addr[cs * 2 + 1],
+                        option | ~(cs_ranges_buf[i].size - 1));
+               out_be32(&ctrl_addr[cs * 2], base | cs_ranges_buf[i].addr);
+       }
+
+       return;
+
+err:
+       printf("Bad /localbus node\r\n");
+}
+
+/* Older u-boots don't set PCI up properly.  Update the hardware to match
+ * the device tree.  The prefetch mem region and non-prefetch mem region
+ * must be contiguous in the host bus.  As required by the PCI binding,
+ * PCI #addr/#size must be 3/2.  The parent bus must be 1/1.  Only
+ * 32-bit PCI is supported.  All three region types (prefetchable mem,
+ * non-prefetchable mem, and I/O) must be present.
+ */
+static void fixup_pci(void)
+{
+       struct pci_range *mem = NULL, *mmio = NULL,
+                        *io = NULL, *mem_base = NULL;
+       u32 *pci_regs[3];
+       u8 *soc_regs;
+       int i, len;
+       void *node, *parent_node;
+       u32 naddr, nsize, mem_log2;
+
+       node = finddevice("/pci");
+       if (!node || !dt_is_compatible(node, "fsl,pq2-pci"))
+               return;
+
+       for (i = 0; i < 3; i++)
+               if (!dt_xlate_reg(node, i,
+                                 (unsigned long *)&pci_regs[i], NULL))
+                       goto err;
+
+       soc_regs = (u8 *)fsl_get_immr();
+       if (!soc_regs)
+               goto err;
+
+       dt_get_reg_format(node, &naddr, &nsize);
+       if (naddr != 3 || nsize != 2)
+               goto err;
+
+       parent_node = get_parent(node);
+       if (!parent_node)
+               goto err;
+
+       dt_get_reg_format(parent_node, &naddr, &nsize);
+       if (naddr != 1 || nsize != 1)
+               goto err;
+
+       len = getprop(node, "ranges", pci_ranges_buf,
+                     sizeof(pci_ranges_buf));
+
+       for (i = 0; i < len / sizeof(struct pci_range); i++) {
+               u32 flags = pci_ranges_buf[i].flags & 0x43000000;
+
+               if (flags == 0x42000000)
+                       mem = &pci_ranges_buf[i];
+               else if (flags == 0x02000000)
+                       mmio = &pci_ranges_buf[i];
+               else if (flags == 0x01000000)
+                       io = &pci_ranges_buf[i];
+       }
+
+       if (!mem || !mmio || !io)
+               goto err;
+
+       if (mem->phys_addr + mem->size[1] == mmio->phys_addr)
+               mem_base = mem;
+       else if (mmio->phys_addr + mmio->size[1] == mem->phys_addr)
+               mem_base = mmio;
+       else
+               goto err;
+
+       out_be32(&pci_regs[1][0], mem_base->phys_addr | 1);
+       out_be32(&pci_regs[2][0], ~(mem->size[1] + mmio->size[1] - 1));
+
+       out_be32(&pci_regs[1][1], io->phys_addr | 1);
+       out_be32(&pci_regs[2][1], ~(io->size[1] - 1));
+
+       out_le32(&pci_regs[0][0], mem->pci_addr[1] >> 12);
+       out_le32(&pci_regs[0][2], mem->phys_addr >> 12);
+       out_le32(&pci_regs[0][4], (~(mem->size[1] - 1) >> 12) | 0xa0000000);
+
+       out_le32(&pci_regs[0][6], mmio->pci_addr[1] >> 12);
+       out_le32(&pci_regs[0][8], mmio->phys_addr >> 12);
+       out_le32(&pci_regs[0][10], (~(mmio->size[1] - 1) >> 12) | 0x80000000);
+
+       out_le32(&pci_regs[0][12], io->pci_addr[1] >> 12);
+       out_le32(&pci_regs[0][14], io->phys_addr >> 12);
+       out_le32(&pci_regs[0][16], (~(io->size[1] - 1) >> 12) | 0xc0000000);
+
+       /* Inbound translation */
+       out_le32(&pci_regs[0][58], 0);
+       out_le32(&pci_regs[0][60], 0);
+
+       mem_log2 = 1 << (__ilog2_u32(bd.bi_memsize - 1) + 1);
+       out_le32(&pci_regs[0][62], 0xa0000000 | ~((1 << (mem_log2 - 12)) - 1));
+
+       /* If PCI is disabled, drive RST high to enable. */
+       if (!(in_le32(&pci_regs[0][32]) & 1)) {
+                /* Tpvrh (Power valid to RST# high) 100 ms */
+               udelay(100000);
+
+               out_le32(&pci_regs[0][32], 1);
+
+               /* Trhfa (RST# high to first cfg access) 2^25 clocks */
+               udelay(1020000);
+       }
+
+       /* Enable bus master and memory access */
+       out_le32(&pci_regs[0][64], 0x80000004);
+       out_le32(&pci_regs[0][65], in_le32(&pci_regs[0][65]) | 6);
+
+       /* Park the bus on PCI, and elevate PCI's arbitration priority,
+        * as required by section 9.6 of the user's manual.
+        */
+       out_8(&soc_regs[0x10028], 3);
+       out_be32((u32 *)&soc_regs[0x1002c], 0x01236745);
+
+       return;
+
+err:
+       printf("Bad PCI node\r\n");
+}
+
+static void pq2_platform_fixups(void)
+{
+       void *node;
+
+       dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
+       dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
+       dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
+
+       node = finddevice("/soc/cpm");
+       if (node)
+               setprop(node, "clock-frequency", &bd.bi_cpmfreq, 4);
+
+       node = finddevice("/soc/cpm/brg");
+       if (node)
+               setprop(node, "clock-frequency",  &bd.bi_brgfreq, 4);
+
+       update_cs_ranges();
+       fixup_pci();
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+                   unsigned long r6, unsigned long r7)
+{
+       CUBOOT_INIT();
+       ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
+       serial_console_init();
+       platform_ops.fixups = pq2_platform_fixups;
+}
diff --git a/arch/powerpc/boot/cuboot-sequoia.c b/arch/powerpc/boot/cuboot-sequoia.c
new file mode 100644 (file)
index 0000000..ec635e0
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Old U-boot compatibility for Sequoia
+ *
+ * Valentine Barshak <vbarshak@ru.mvista.com>
+ * Copyright 2007 MontaVista Software, Inc
+ *
+ * Based on Ebony code by David Gibson <david@gibson.dropbear.id.au>
+ * Copyright IBM Corporation, 2007
+ *
+ * Based on Bamboo code by Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ * Copyright IBM Corporation, 2007
+ *
+ * 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; version 2 of the License
+ */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include "types.h"
+#include "elf.h"
+#include "string.h"
+#include "stdio.h"
+#include "page.h"
+#include "ops.h"
+#include "dcr.h"
+#include "4xx.h"
+#include "44x.h"
+#include "cuboot.h"
+
+#define TARGET_4xx
+#define TARGET_44x
+#include "ppcboot.h"
+
+static bd_t bd;
+
+
+static void sequoia_fixups(void)
+{
+       unsigned long sysclk = 33333333;
+
+       ibm440ep_fixup_clocks(sysclk, 11059200);
+       ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
+       ibm4xx_denali_fixup_memsize();
+       dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+                   unsigned long r6, unsigned long r7)
+{
+       CUBOOT_INIT();
+       platform_ops.fixups = sequoia_fixups;
+       platform_ops.exit = ibm44x_dbcr_reset;
+       ft_init(_dtb_start, 0, 32);
+       serial_console_init();
+}
index 65795468ad6f662ec23accf71e0d812b1397e144..7768b2306b7a42c745d4894af576da79e84b88d8 100644 (file)
@@ -17,9 +17,6 @@
 
 #include "ppcboot.h"
 
-extern char _end[];
-extern char _dtb_start[], _dtb_end[];
-
 void cuboot_init(unsigned long r4, unsigned long r5,
                 unsigned long r6, unsigned long r7,
                 unsigned long end_of_ram)
index 14b44aa96feaabb42de57f51f87f3d64501488e4..83b88aa92888eced19d6f154848fddb43411562c 100644 (file)
@@ -121,4 +121,22 @@ static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR, SDRAM0_B2C
 #define DCRN_CPC0_MIRQ1                                        0x0ed
 #define DCRN_CPC0_JTAGID                               0x0ef
 
+#define DCRN_MAL0_CFG                                  0x180
+#define MAL_RESET 0x80000000
+
+/* 440EP Clock/Power-on Reset regs */
+#define DCRN_CPR0_ADDR 0xc
+#define DCRN_CPR0_DATA 0xd
+#define CPR0_PLLD0     0x60
+#define CPR0_OPBD0     0xc0
+#define CPR0_PERD0     0xe0
+#define CPR0_PRIMBD0   0xa0
+#define CPR0_SCPID     0x120
+#define CPR0_PLLC0     0x40
+
+/* 405GP Clocking/Power Management/Chip Control regs */
+#define DCRN_CPC0_PLLMR 0xb0
+#define DCRN_405_CPC0_CR0 0xb1
+#define DCRN_405_CPC0_CR1 0xb2
+
 #endif /* _PPC_BOOT_DCR_H_ */
index c9951550ed2c48ce26c1ef9e8028196be2cb4eb3..e5dfe449731393cb7aec718b4fd169964309def0 100644 (file)
@@ -74,6 +74,8 @@ void dt_fixup_cpu_clocks(u32 cpu, u32 tb, u32 bus)
                if (bus > 0)
                        setprop_val(devp, "bus-frequency", bus);
        }
+
+       timebase_period_ns = 1000000000 / tb;
 }
 
 void dt_fixup_clock(const char *path, u32 freq)
@@ -86,34 +88,38 @@ void dt_fixup_clock(const char *path, u32 freq)
        }
 }
 
+void dt_fixup_mac_address(u32 index, const u8 *addr)
+{
+       void *devp = find_node_by_prop_value(NULL, "linux,network-index",
+                                            (void*)&index, sizeof(index));
+
+       if (devp) {
+               printf("ENET%d: local-mac-address <-"
+                      " %02x:%02x:%02x:%02x:%02x:%02x\n\r", index,
+                      addr[0], addr[1], addr[2],
+                      addr[3], addr[4], addr[5]);
+
+               setprop(devp, "local-mac-address", addr, 6);
+       }
+}
+
 void __dt_fixup_mac_addresses(u32 startindex, ...)
 {
        va_list ap;
        u32 index = startindex;
-       void *devp;
        const u8 *addr;
 
        va_start(ap, startindex);
-       while ((addr = va_arg(ap, const u8 *))) {
-               devp = find_node_by_prop_value(NULL, "linux,network-index",
-                                              (void*)&index, sizeof(index));
-
-               printf("ENET%d: local-mac-address <-"
-                      " %02x:%02x:%02x:%02x:%02x:%02x\n\r", index,
-                      addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
 
-               if (devp)
-                       setprop(devp, "local-mac-address", addr, 6);
+       while ((addr = va_arg(ap, const u8 *)))
+               dt_fixup_mac_address(index++, addr);
 
-               index++;
-       }
        va_end(ap);
 }
 
 #define MAX_ADDR_CELLS 4
-#define MAX_RANGES 8
 
-static void get_reg_format(void *node, u32 *naddr, u32 *nsize)
+void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize)
 {
        if (getprop(node, "#address-cells", naddr, 4) != 4)
                *naddr = 2;
@@ -207,7 +213,7 @@ static int find_range(u32 *reg, u32 *ranges, int nregaddr,
  * In particular, PCI is not supported.  Also, only the beginning of the
  * reg block is tracked; size is ignored except in ranges.
  */
-static u32 dt_xlate_buf[MAX_ADDR_CELLS * MAX_RANGES * 3];
+static u32 prop_buf[MAX_PROP_LEN / 4];
 
 static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
                unsigned long *size)
@@ -216,14 +222,14 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
        u32 this_addr[MAX_ADDR_CELLS];
        void *parent;
        u64 ret_addr, ret_size;
-       u32 naddr, nsize, prev_naddr;
+       u32 naddr, nsize, prev_naddr, prev_nsize;
        int buflen, offset;
 
        parent = get_parent(node);
        if (!parent)
                return 0;
 
-       get_reg_format(parent, &naddr, &nsize);
+       dt_get_reg_format(parent, &naddr, &nsize);
 
        if (nsize > 2)
                return 0;
@@ -231,41 +237,47 @@ static int dt_xlate(void *node, int res, int reglen, unsigned long *addr,
        offset = (naddr + nsize) * res;
 
        if (reglen < offset + naddr + nsize ||
-           sizeof(dt_xlate_buf) < offset + naddr + nsize)
+           MAX_PROP_LEN < (offset + naddr + nsize) * 4)
                return 0;
 
-       copy_val(last_addr, dt_xlate_buf + offset, naddr);
+       copy_val(last_addr, prop_buf + offset, naddr);
 
-       ret_size = dt_xlate_buf[offset + naddr];
+       ret_size = prop_buf[offset + naddr];
        if (nsize == 2) {
                ret_size <<= 32;
-               ret_size |= dt_xlate_buf[offset + naddr + 1];
+               ret_size |= prop_buf[offset + naddr + 1];
        }
 
-       while ((node = get_parent(node))) {
+       for (;;) {
                prev_naddr = naddr;
+               prev_nsize = nsize;
+               node = parent;
+
+               parent = get_parent(node);
+               if (!parent)
+                       break;
 
-               get_reg_format(node, &naddr, &nsize);
+               dt_get_reg_format(parent, &naddr, &nsize);
 
-               buflen = getprop(node, "ranges", dt_xlate_buf,
-                               sizeof(dt_xlate_buf));
-               if (buflen < 0)
+               buflen = getprop(node, "ranges", prop_buf,
+                               sizeof(prop_buf));
+               if (buflen == 0)
                        continue;
-               if (buflen > sizeof(dt_xlate_buf))
+               if (buflen < 0 || buflen > sizeof(prop_buf))
                        return 0;
 
-               offset = find_range(last_addr, dt_xlate_buf, prev_naddr,
-                                   naddr, nsize, buflen / 4);
+               offset = find_range(last_addr, prop_buf, prev_naddr,
+                                   naddr, prev_nsize, buflen / 4);
 
                if (offset < 0)
                        return 0;
 
-               copy_val(this_addr, dt_xlate_buf + offset, prev_naddr);
+               copy_val(this_addr, prop_buf + offset, prev_naddr);
 
                if (!sub_reg(last_addr, this_addr))
                        return 0;
 
-               copy_val(this_addr, dt_xlate_buf + offset + prev_naddr, naddr);
+               copy_val(this_addr, prop_buf + offset + prev_naddr, naddr);
 
                if (!add_reg(last_addr, this_addr, naddr))
                        return 0;
@@ -292,16 +304,35 @@ int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size)
 {
        int reglen;
 
-       reglen = getprop(node, "reg", dt_xlate_buf, sizeof(dt_xlate_buf)) / 4;
+       reglen = getprop(node, "reg", prop_buf, sizeof(prop_buf)) / 4;
        return dt_xlate(node, res, reglen, addr, size);
 }
 
 int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr)
 {
 
-       if (buflen > sizeof(dt_xlate_buf))
+       if (buflen > sizeof(prop_buf))
                return 0;
 
-       memcpy(dt_xlate_buf, buf, buflen);
+       memcpy(prop_buf, buf, buflen);
        return dt_xlate(node, 0, buflen / 4, xlated_addr, NULL);
 }
+
+int dt_is_compatible(void *node, const char *compat)
+{
+       char *buf = (char *)prop_buf;
+       int len, pos;
+
+       len = getprop(node, "compatible", buf, MAX_PROP_LEN);
+       if (len < 0)
+               return 0;
+
+       for (pos = 0; pos < len; pos++) {
+               if (!strcmp(buf + pos, compat))
+                       return 1;
+
+               pos += strnlen(&buf[pos], len - pos);
+       }
+
+       return 0;
+}
diff --git a/arch/powerpc/boot/dts/bamboo.dts b/arch/powerpc/boot/dts/bamboo.dts
new file mode 100644 (file)
index 0000000..a88ae3d
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * Device Tree Source for AMCC Bamboo
+ *
+ * Copyright (c) 2006, 2007 IBM Corp.
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * FIXME: Draft only!
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without
+ * any warranty of any kind, whether express or implied.
+ */
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <1>;
+       model = "amcc,bamboo";
+       compatible = "amcc,bamboo";
+       dcr-parent = <&/cpus/PowerPC,440EP@0>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,440EP@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       clock-frequency = <0>; /* Filled in by zImage */
+                       timebase-frequency = <0>; /* Filled in by zImage */
+                       i-cache-line-size = <20>;
+                       d-cache-line-size = <20>;
+                       i-cache-size = <8000>;
+                       d-cache-size = <8000>;
+                       dcr-controller;
+                       dcr-access-method = "native";
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0 0>; /* Filled in by zImage */
+       };
+
+       UIC0: interrupt-controller0 {
+               compatible = "ibm,uic-440ep","ibm,uic";
+               interrupt-controller;
+               cell-index = <0>;
+               dcr-reg = <0c0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+       };
+
+       UIC1: interrupt-controller1 {
+               compatible = "ibm,uic-440ep","ibm,uic";
+               interrupt-controller;
+               cell-index = <1>;
+               dcr-reg = <0d0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+               interrupts = <1e 4 1f 4>; /* cascade */
+               interrupt-parent = <&UIC0>;
+       };
+
+       SDR0: sdr {
+               compatible = "ibm,sdr-440ep";
+               dcr-reg = <00e 002>;
+       };
+
+       CPR0: cpr {
+               compatible = "ibm,cpr-440ep";
+               dcr-reg = <00c 002>;
+       };
+
+       plb {
+               compatible = "ibm,plb-440ep", "ibm,plb-440gp", "ibm,plb4";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               ranges;
+               clock-frequency = <0>; /* Filled in by zImage */
+
+               SDRAM0: sdram {
+                       compatible = "ibm,sdram-440ep", "ibm,sdram-405gp";
+                       dcr-reg = <010 2>;
+               };
+
+               DMA0: dma {
+                       compatible = "ibm,dma-440ep", "ibm,dma-440gp";
+                       dcr-reg = <100 027>;
+               };
+
+               MAL0: mcmal {
+                       compatible = "ibm,mcmal-440ep", "ibm,mcmal-440gp", "ibm,mcmal";
+                       dcr-reg = <180 62>;
+                       num-tx-chans = <4>;
+                       num-rx-chans = <2>;
+                       interrupt-parent = <&MAL0>;
+                       interrupts = <0 1 2 3 4>;
+                       #interrupt-cells = <1>;
+                       interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
+                                       /*RXEOB*/ 1 &UIC0 b 4
+                                       /*SERR*/  2 &UIC1 0 4
+                                       /*TXDE*/  3 &UIC1 1 4
+                                       /*RXDE*/  4 &UIC1 3 4>;
+               };
+
+               POB0: opb {
+                       compatible = "ibm,opb-440ep", "ibm,opb-440gp", "ibm,opb";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       /* Bamboo is oddball in the 44x world and doesn't use the ERPN
+                        * bits.
+                        */
+                       ranges = <00000000 0 00000000 80000000
+                                 80000000 0 80000000 80000000>;
+                       interrupt-parent = <&UIC1>;
+                       interrupts = <7 4>;
+                       clock-frequency = <0>; /* Filled in by zImage */
+
+                       EBC0: ebc {
+                               compatible = "ibm,ebc-440ep", "ibm,ebc-440gp", "ibm,ebc";
+                               dcr-reg = <012 2>;
+                               #address-cells = <2>;
+                               #size-cells = <1>;
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               ranges;
+                               interrupts = <5 1>;
+                               interrupt-parent = <&UIC1>;
+                       };
+
+                       UART0: serial@ef600300 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600300 8>;
+                               virtual-reg = <ef600300>;
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               current-speed = <1c200>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <0 4>;
+                       };
+
+                       UART1: serial@ef600400 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600400 8>;
+                               virtual-reg = <ef600400>;
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <1 4>;
+                       };
+
+                       UART2: serial@ef600500 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600500 8>;
+                               virtual-reg = <ef600500>;
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <3 4>;
+                       };
+
+                       UART3: serial@ef600600 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600600 8>;
+                               virtual-reg = <ef600600>;
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <4 4>;
+                       };
+
+                       IIC0: i2c@ef600700 {
+                               device_type = "i2c";
+                               compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
+                               reg = <ef600700 14>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <2 4>;
+                       };
+
+                       IIC1: i2c@ef600800 {
+                               device_type = "i2c";
+                               compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
+                               reg = <ef600800 14>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <7 4>;
+                       };
+
+                       ZMII0: emac-zmii@ef600d00 {
+                               device_type = "zmii-interface";
+                               compatible = "ibm,zmii-440ep", "ibm,zmii-440gp", "ibm,zmii";
+                               reg = <ef600d00 c>;
+                       };
+
+                       EMAC0: ethernet@ef600e00 {
+                               device_type = "network";
+                               compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
+                               interrupt-parent = <&UIC1>;
+                               interrupts = <1c 4 1d 4>;
+                               reg = <ef600e00 70>;
+                               local-mac-address = [000000000000];
+                               mal-device = <&MAL0>;
+                               mal-tx-channel = <0 1>;
+                               mal-rx-channel = <0>;
+                               cell-index = <0>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rmii";
+                               phy-map = <00000001>;
+                               zmii-device = <&ZMII0>;
+                               zmii-channel = <0>;
+                       };
+
+                       EMAC1: ethernet@ef600f00 {
+                               device_type = "network";
+                               compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
+                               interrupt-parent = <&UIC1>;
+                               interrupts = <1e 4 1f 4>;
+                               reg = <ef600f00 70>;
+                               local-mac-address = [000000000000];
+                               mal-device = <&MAL0>;
+                               mal-tx-channel = <2 3>;
+                               mal-rx-channel = <1>;
+                               cell-index = <1>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rmii";
+                               phy-map = <00000001>;
+                               zmii-device = <&ZMII0>;
+                               zmii-channel = <1>;
+                       };
+               };
+       };
+
+       chosen {
+               linux,stdout-path = "/plb/opb/serial@ef600300";
+               bootargs = "console=ttyS0,115200";
+       };
+};
index c5f99613fc7bab5a8b2358717681a4a48bb49480..bc259972aaa061170e40f4ce27b0dd34e5c9df04 100644 (file)
@@ -9,10 +9,6 @@
  * This file is licensed under the terms of the GNU General Public
  * License version 2.  This program is licensed "as is" without
  * any warranty of any kind, whether express or implied.
- *
- * To build:
- *   dtc -I dts -O asm -o ebony.S -b 0 ebony.dts
- *   dtc -I dts -O dtb -o ebony.dtb -b 0 ebony.dts
  */
 
 / {
                                interrupt-parent = <&UIC1>;
 
                                small-flash@0,80000 {
-                                       device_type = "rom";
-                                       compatible = "direct-mapped";
-                                       probe-type = "JEDEC";
+                                       compatible = "jedec-flash";
                                        bank-width = <1>;
-                                       partitions = <0 80000>;
-                                       partition-names = "OpenBIOS";
                                        reg = <0 80000 80000>;
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       partition@0 {
+                                               label = "OpenBIOS";
+                                               reg = <0 80000>;
+                                               read-only;
+                                       };
                                };
 
                                ds1743@1,0 {
                                };
 
                                large-flash@2,0 {
-                                       device_type = "rom";
-                                       compatible = "direct-mapped";
-                                       probe-type = "JEDEC";
+                                       compatible = "jedec-flash";
                                        bank-width = <1>;
-                                       partitions = <0 380000
-                                                     380000 80000>;
-                                       partition-names = "fs", "firmware";
                                        reg = <2 0 400000>;
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       partition@0 {
+                                               label = "fs";
+                                               reg = <0 380000>;
+                                       };
+                                       partition@380000 {
+                                               label = "firmware";
+                                               reg = <380000 80000>;
+                                       };
                                };
 
                                ir@3,0 {
                                fpga@7,0 {
                                        compatible = "Ebony-FPGA";
                                        reg = <7 0 10>;
+                                       virtual-reg = <e8300000>;
                                };
                        };
 
diff --git a/arch/powerpc/boot/dts/ep88xc.dts b/arch/powerpc/boot/dts/ep88xc.dts
new file mode 100644 (file)
index 0000000..02705f2
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * EP88xC Device Tree Source
+ *
+ * Copyright 2006 MontaVista Software, Inc.
+ * Copyright 2007 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.
+ */
+
+
+/ {
+       model = "EP88xC";
+       compatible = "fsl,ep88xc";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,885@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <d#16>;
+                       i-cache-line-size = <d#16>;
+                       d-cache-size = <d#8192>;
+                       i-cache-size = <d#8192>;
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+                       interrupts = <f 2>;     // decrementer interrupt
+                       interrupt-parent = <&PIC>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0>;
+       };
+
+       localbus@fa200100 {
+               compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               reg = <fa200100 40>;
+
+               ranges = <
+                       0 0 fc000000 04000000
+                       3 0 fa000000 01000000
+               >;
+
+               flash@0,2000000 {
+                       compatible = "cfi-flash";
+                       reg = <0 2000000 2000000>;
+                       bank-width = <4>;
+                       device-width = <2>;
+               };
+
+               board-control@3,400000 {
+                       reg = <3 400000 10>;
+                       compatible = "fsl,ep88xc-bcsr";
+               };
+       };
+
+       soc@fa200000 {
+               compatible = "fsl,mpc885", "fsl,pq1-soc";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               ranges = <0 fa200000 00004000>;
+               bus-frequency = <0>;
+
+               // Temporary -- will go away once kernel uses ranges for get_immrbase().
+               reg = <fa200000 4000>;
+
+               mdio@e00 {
+                       compatible = "fsl,mpc885-fec-mdio", "fsl,pq1-fec-mdio";
+                       reg = <e00 188>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       PHY0: ethernet-phy@0 {
+                               reg = <0>;
+                               device_type = "ethernet-phy";
+                       };
+
+                       PHY1: ethernet-phy@1 {
+                               reg = <1>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               ethernet@e00 {
+                       device_type = "network";
+                       compatible = "fsl,mpc885-fec-enet",
+                                    "fsl,pq1-fec-enet";
+                       reg = <e00 188>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <3 1>;
+                       interrupt-parent = <&PIC>;
+                       phy-handle = <&PHY0>;
+                       linux,network-index = <0>;
+               };
+
+               ethernet@1e00 {
+                       device_type = "network";
+                       compatible = "fsl,mpc885-fec-enet",
+                                    "fsl,pq1-fec-enet";
+                       reg = <1e00 188>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <7 1>;
+                       interrupt-parent = <&PIC>;
+                       phy-handle = <&PHY1>;
+                       linux,network-index = <1>;
+               };
+
+               PIC: interrupt-controller@0 {
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+                       reg = <0 24>;
+                       compatible = "fsl,mpc885-pic", "fsl,pq1-pic";
+               };
+
+               pcmcia@80 {
+                       #address-cells = <3>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       compatible = "fsl,pq-pcmcia";
+                       device_type = "pcmcia";
+                       reg = <80 80>;
+                       interrupt-parent = <&PIC>;
+                       interrupts = <d 1>;
+               };
+
+               cpm@9c0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,mpc885-cpm", "fsl,cpm1";
+                       command-proc = <9c0>;
+                       interrupts = <0>;       // cpm error interrupt
+                       interrupt-parent = <&CPM_PIC>;
+                       reg = <9c0 40>;
+                       ranges;
+
+                       muram@2000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 2000 2000>;
+
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 1c00>;
+                               };
+                       };
+
+                       brg@9f0 {
+                               compatible = "fsl,mpc885-brg",
+                                            "fsl,cpm1-brg",
+                                            "fsl,cpm-brg";
+                               reg = <9f0 10>;
+                       };
+
+                       CPM_PIC: interrupt-controller@930 {
+                               interrupt-controller;
+                               #interrupt-cells = <1>;
+                               interrupts = <5 2 0 2>;
+                               interrupt-parent = <&PIC>;
+                               reg = <930 20>;
+                               compatible = "fsl,mpc885-cpm-pic",
+                                            "fsl,cpm1-pic";
+                       };
+
+                       // MON-1
+                       serial@a80 {
+                               device_type = "serial";
+                               compatible = "fsl,mpc885-smc-uart",
+                                            "fsl,cpm1-smc-uart";
+                               reg = <a80 10 3e80 40>;
+                               interrupts = <4>;
+                               interrupt-parent = <&CPM_PIC>;
+                               fsl,cpm-brg = <1>;
+                               fsl,cpm-command = <0090>;
+                               linux,planetcore-label = "SMC1";
+                       };
+
+                       // SER-1
+                       serial@a20 {
+                               device_type = "serial";
+                               compatible = "fsl,mpc885-scc-uart",
+                                            "fsl,cpm1-scc-uart";
+                               reg = <a20 20 3d00 80>;
+                               interrupts = <1d>;
+                               interrupt-parent = <&CPM_PIC>;
+                               fsl,cpm-brg = <2>;
+                               fsl,cpm-command = <0040>;
+                               linux,planetcore-label = "SCC2";
+                       };
+
+                       usb@a00 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,mpc885-usb",
+                                            "fsl,cpm1-usb";
+                               reg = <a00 18 1c00 80>;
+                               interrupt-parent = <&CPM_PIC>;
+                               interrupts = <1e>;
+                               fsl,cpm-command = <0000>;
+                       };
+               };
+       };
+};
index 80a4fab8ee3780f5a52bd5cadd720f67f5f3a8ba..b5d87895fe060977fe8f9ff6e05c4ee726bcb9ed 100644 (file)
@@ -8,10 +8,6 @@
  * This file is licensed under the terms of the GNU General Public
  * License version 2.  This program is licensed "as is" without
  * any warranty of any kind, whether express or implied.
- *
- * To build:
- *   dtc -I dts -O asm -o holly.S -b 0 holly.dts
- *   dtc -I dts -O dtb -o holly.dtb -b 0 holly.dts
  */
 
 / {
@@ -35,7 +31,6 @@
                        timebase-frequency = <2faf080>;
                        clock-frequency = <23c34600>;
                        bus-frequency = <bebc200>;
-                       32-bit;
                };
        };
 
diff --git a/arch/powerpc/boot/dts/kilauea.dts b/arch/powerpc/boot/dts/kilauea.dts
new file mode 100644 (file)
index 0000000..c824e8f
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * Device Tree Source for AMCC Kilauea (405EX)
+ *
+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without
+ * any warranty of any kind, whether express or implied.
+ */
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       model = "amcc,kilauea";
+       compatible = "amcc,kilauea";
+       dcr-parent = <&/cpus/PowerPC,405EX@0>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,405EX@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       clock-frequency = <0>; /* Filled in by U-Boot */
+                       timebase-frequency = <0>; /* Filled in by U-Boot */
+                       i-cache-line-size = <20>;
+                       d-cache-line-size = <20>;
+                       i-cache-size = <4000>; /* 16 kB */
+                       d-cache-size = <4000>; /* 16 kB */
+                       dcr-controller;
+                       dcr-access-method = "native";
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0>; /* Filled in by U-Boot */
+       };
+
+       UIC0: interrupt-controller {
+               compatible = "ibm,uic-405ex", "ibm,uic";
+               interrupt-controller;
+               cell-index = <0>;
+               dcr-reg = <0c0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+       };
+
+       UIC1: interrupt-controller1 {
+               compatible = "ibm,uic-405ex","ibm,uic";
+               interrupt-controller;
+               cell-index = <1>;
+               dcr-reg = <0d0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+               interrupts = <1e 4 1f 4>; /* cascade */
+               interrupt-parent = <&UIC0>;
+       };
+
+       UIC2: interrupt-controller2 {
+               compatible = "ibm,uic-405ex","ibm,uic";
+               interrupt-controller;
+               cell-index = <2>;
+               dcr-reg = <0e0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+               interrupts = <1c 4 1d 4>; /* cascade */
+               interrupt-parent = <&UIC0>;
+       };
+
+       plb {
+               compatible = "ibm,plb-405ex", "ibm,plb4";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               clock-frequency = <0>; /* Filled in by U-Boot */
+
+               SDRAM0: memory-controller {
+                       compatible = "ibm,sdram-405ex";
+                       dcr-reg = <010 2>;
+               };
+
+               MAL0: mcmal {
+                       compatible = "ibm,mcmal-405ex", "ibm,mcmal2";
+                       dcr-reg = <180 62>;
+                       num-tx-chans = <2>;
+                       num-rx-chans = <2>;
+                       interrupt-parent = <&MAL0>;
+                       interrupts = <0 1 2 3 4>;
+                       #interrupt-cells = <1>;
+                       #address-cells = <0>;
+                       #size-cells = <0>;
+                       interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
+                                       /*RXEOB*/ 1 &UIC0 b 4
+                                       /*SERR*/  2 &UIC1 0 4
+                                       /*TXDE*/  3 &UIC1 1 4
+                                       /*RXDE*/  4 &UIC1 2 4>;
+                       interrupt-map-mask = <ffffffff>;
+               };
+
+               POB0: opb {
+                       compatible = "ibm,opb-405ex", "ibm,opb";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <80000000 80000000 10000000
+                                 ef600000 ef600000 a00000
+                                 f0000000 f0000000 10000000>;
+                       dcr-reg = <0a0 5>;
+                       clock-frequency = <0>; /* Filled in by U-Boot */
+
+                       EBC0: ebc {
+                               compatible = "ibm,ebc-405ex", "ibm,ebc";
+                               dcr-reg = <012 2>;
+                               #address-cells = <2>;
+                               #size-cells = <1>;
+                               clock-frequency = <0>; /* Filled in by U-Boot */
+                               /* ranges property is supplied by U-Boot */
+                               interrupts = <5 1>;
+                               interrupt-parent = <&UIC1>;
+
+                               nor_flash@0,0 {
+                                       compatible = "amd,s29gl512n", "cfi-flash";
+                                       bank-width = <2>;
+                                       reg = <0 000000 4000000>;
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       partition@0 {
+                                               label = "kernel";
+                                               reg = <0 200000>;
+                                       };
+                                       partition@200000 {
+                                               label = "root";
+                                               reg = <200000 200000>;
+                                       };
+                                       partition@400000 {
+                                               label = "user";
+                                               reg = <400000 3b60000>;
+                                       };
+                                       partition@3f60000 {
+                                               label = "env";
+                                               reg = <3f60000 40000>;
+                                       };
+                                       partition@3fa0000 {
+                                               label = "u-boot";
+                                               reg = <3fa0000 60000>;
+                                       };
+                               };
+                       };
+
+                       UART0: serial@ef600200 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600200 8>;
+                               virtual-reg = <ef600200>;
+                               clock-frequency = <0>; /* Filled in by U-Boot */
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <1a 4>;
+                       };
+
+                       UART1: serial@ef600300 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600300 8>;
+                               virtual-reg = <ef600300>;
+                               clock-frequency = <0>; /* Filled in by U-Boot */
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <1 4>;
+                       };
+
+                       IIC0: i2c@ef600400 {
+                               device_type = "i2c";
+                               compatible = "ibm,iic-405ex", "ibm,iic";
+                               reg = <ef600400 14>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <2 4>;
+                       };
+
+                       IIC1: i2c@ef600500 {
+                               device_type = "i2c";
+                               compatible = "ibm,iic-405ex", "ibm,iic";
+                               reg = <ef600500 14>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <7 4>;
+                       };
+
+
+                       RGMII0: emac-rgmii@ef600b00 {
+                               device_type = "rgmii-interface";
+                               compatible = "ibm,rgmii-405ex", "ibm,rgmii";
+                               reg = <ef600b00 104>;
+                       };
+
+                       EMAC0: ethernet@ef600900 {
+                               linux,network-index = <0>;
+                               device_type = "network";
+                               compatible = "ibm,emac-405ex", "ibm,emac4";
+                               interrupt-parent = <&EMAC0>;
+                               interrupts = <0 1>;
+                               #interrupt-cells = <1>;
+                               #address-cells = <0>;
+                               #size-cells = <0>;
+                               interrupt-map = </*Status*/ 0 &UIC0 18 4
+                                               /*Wake*/  1 &UIC1 1d 4>;
+                               reg = <ef600900 70>;
+                               local-mac-address = [000000000000]; /* Filled in by U-Boot */
+                               mal-device = <&MAL0>;
+                               mal-tx-channel = <0>;
+                               mal-rx-channel = <0>;
+                               cell-index = <0>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rgmii";
+                               phy-map = <00000000>;
+                               rgmii-device = <&RGMII0>;
+                               rgmii-channel = <0>;
+                       };
+
+                       EMAC1: ethernet@ef600a00 {
+                               linux,network-index = <1>;
+                               device_type = "network";
+                               compatible = "ibm,emac-405ex", "ibm,emac4";
+                               interrupt-parent = <&EMAC1>;
+                               interrupts = <0 1>;
+                               #interrupt-cells = <1>;
+                               #address-cells = <0>;
+                               #size-cells = <0>;
+                               interrupt-map = </*Status*/ 0 &UIC0 19 4
+                                               /*Wake*/  1 &UIC1 1f 4>;
+                               reg = <ef600a00 70>;
+                               local-mac-address = [000000000000]; /* Filled in by U-Boot */
+                               mal-device = <&MAL0>;
+                               mal-tx-channel = <1>;
+                               mal-rx-channel = <1>;
+                               cell-index = <1>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rgmii";
+                               phy-map = <00000000>;
+                               rgmii-device = <&RGMII0>;
+                               rgmii-channel = <1>;
+                       };
+               };
+       };
+};
index 122537419d9f75d9f99cde8fb25c9ff35f69bc0b..ec71ab819fee8a21522a35fe24a96bfbb481626b 100644 (file)
@@ -15,9 +15,6 @@
 
 XXXX add flash parts, rtc, ??
 
-build with: "dtc -f -I dts -O dtb -o kuroboxHD.dtb -V 16 kuroboxHD.dts"
-
-
  */
 
 / {
@@ -50,7 +47,6 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHD.dtb -V 16 kuroboxHD.dts"
        soc10x { /* AFAICT need to make soc for 8245's uarts to be defined */
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                compatible = "mpc10x";
                store-gathering = <0>; /* 0 == off, !0 == on */
@@ -72,7 +68,7 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHD.dtb -V 16 kuroboxHD.dts"
 
                        rtc@32 {
                                device_type = "rtc";
-                               compatible = "ricoh,rs5c372b";
+                               compatible = "ricoh,rs5c372a";
                                reg = <32>;
                        };
                };
@@ -83,7 +79,7 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHD.dtb -V 16 kuroboxHD.dts"
                        reg = <80004500 8>;
                        clock-frequency = <5d08d88>;
                        current-speed = <2580>;
-                       interrupts = <9 2>;
+                       interrupts = <9 0>;
                        interrupt-parent = <&mpic>;
                };
 
@@ -104,7 +100,6 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHD.dtb -V 16 kuroboxHD.dts"
                        compatible = "chrp,open-pic";
                        interrupt-controller;
                        reg = <80040000 40000>;
-                       built-in;
                };
 
                pci@fec00000 {
index 579aa8b967d94be8c6b28a7aa7530ec143f6b8e2..32ecd23199285bed81435759dfc86e54b60386e1 100644 (file)
@@ -15,9 +15,6 @@
 
 XXXX add flash parts, rtc, ??
 
-build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16 kuroboxHG.dts"
-
-
  */
 
 / {
@@ -50,7 +47,6 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16 kuroboxHG.dts"
        soc10x { /* AFAICT need to make soc for 8245's uarts to be defined */
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                compatible = "mpc10x";
                store-gathering = <0>; /* 0 == off, !0 == on */
@@ -72,7 +68,7 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16 kuroboxHG.dts"
 
                        rtc@32 {
                                device_type = "rtc";
-                               compatible = "ricoh,rs5c372b";
+                               compatible = "ricoh,rs5c372a";
                                reg = <32>;
                        };
                };
@@ -83,7 +79,7 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16 kuroboxHG.dts"
                        reg = <80004500 8>;
                        clock-frequency = <7c044a8>;
                        current-speed = <2580>;
-                       interrupts = <9 2>;
+                       interrupts = <9 0>;
                        interrupt-parent = <&mpic>;
                };
 
@@ -104,7 +100,6 @@ build with: "dtc -f -I dts -O dtb -o kuroboxHG.dtb -V 16 kuroboxHG.dts"
                        compatible = "chrp,open-pic";
                        interrupt-controller;
                        reg = <80040000 40000>;
-                       built-in;
                };
 
                pci@fec00000 {
index d29308fe4c24d35e4fefd9ecff0e45c1a965b904..bc45f5fbb0609f924fbb9a92c9211b1cdc0c47e0 100644 (file)
@@ -19,7 +19,7 @@
 / {
        model = "fsl,lite5200";
        // revision = "1.0";
-       compatible = "fsl,lite5200\0generic-mpc5200";
+       compatible = "fsl,lite5200","generic-mpc5200";
        #address-cells = <1>;
        #size-cells = <1>;
 
@@ -37,7 +37,6 @@
                        timebase-frequency = <0>;       // from bootloader
                        bus-frequency = <0>;            // from bootloader
                        clock-frequency = <0>;          // from bootloader
-                       32-bit;
                };
        };
 
                model = "fsl,mpc5200";
                compatible = "mpc5200";
                revision = "";                  // from bootloader
-               #interrupt-cells = <3>;
                device_type = "soc";
-               ranges = <0 f0000000 f0010000>;
-               reg = <f0000000 00010000>;
+               ranges = <0 f0000000 0000c000>;
+               reg = <f0000000 00000100>;
                bus-frequency = <0>;            // from bootloader
                system-frequency = <0>;         // from bootloader
 
@@ -69,7 +67,6 @@
                        device_type = "interrupt-controller";
                        compatible = "mpc5200-pic";
                        reg = <500 80>;
-                       built-in;
                };
 
                gpt@600 {       // General Purpose Timer
                        interrupt-parent = <&mpc5200_pic>;
                };
 
-               pci@0d00 {
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       device_type = "pci";
-                       compatible = "mpc5200-pci";
-                       reg = <d00 100>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3
-                                        c000 0 0 2 &mpc5200_pic 0 0 3
-                                        c000 0 0 3 &mpc5200_pic 0 0 3
-                                        c000 0 0 4 &mpc5200_pic 0 0 3>;
-                       clock-frequency = <0>; // From boot loader
-                       interrupts = <2 8 0 2 9 0 2 a 0>;
-                       interrupt-parent = <&mpc5200_pic>;
-                       bus-range = <0 0>;
-                       ranges = <42000000 0 80000000 80000000 0 20000000
-                                 02000000 0 a0000000 a0000000 0 10000000
-                                 01000000 0 00000000 b0000000 0 01000000>;
-               };
-
                spi@f00 {
                        device_type = "spi";
                        compatible = "mpc5200-spi";
 
                usb@1000 {
                        device_type = "usb-ohci-be";
-                       compatible = "mpc5200-ohci\0ohci-be";
+                       compatible = "mpc5200-ohci","ohci-be";
                        reg = <1000 ff>;
                        interrupts = <2 6 0>;
                        interrupt-parent = <&mpc5200_pic>;
 
                i2c@3d00 {
                        device_type = "i2c";
-                       compatible = "mpc5200-i2c\0fsl-i2c";
+                       compatible = "mpc5200-i2c","fsl-i2c";
                        cell-index = <0>;
                        reg = <3d00 40>;
                        interrupts = <2 f 0>;
 
                i2c@3d40 {
                        device_type = "i2c";
-                       compatible = "mpc5200-i2c\0fsl-i2c";
+                       compatible = "mpc5200-i2c","fsl-i2c";
                        cell-index = <1>;
                        reg = <3d40 40>;
                        interrupts = <2 10 0>;
                };
                sram@8000 {
                        device_type = "sram";
-                       compatible = "mpc5200-sram\0sram";
+                       compatible = "mpc5200-sram","sram";
                        reg = <8000 4000>;
                };
        };
+
+       pci@f0000d00 {
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               device_type = "pci";
+               compatible = "mpc5200-pci";
+               reg = <f0000d00 100>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3
+                                c000 0 0 2 &mpc5200_pic 0 0 3
+                                c000 0 0 3 &mpc5200_pic 0 0 3
+                                c000 0 0 4 &mpc5200_pic 0 0 3>;
+               clock-frequency = <0>; // From boot loader
+               interrupts = <2 8 0 2 9 0 2 a 0>;
+               interrupt-parent = <&mpc5200_pic>;
+               bus-range = <0 0>;
+               ranges = <42000000 0 80000000 80000000 0 20000000
+                         02000000 0 a0000000 a0000000 0 10000000
+                         01000000 0 00000000 b0000000 0 01000000>;
+       };
 };
index f242531f04514a56668e0f3ea525e086e442fb5b..a6bb1d0558ef838cf281e14aa8de66d8f00d5776 100644 (file)
@@ -19,7 +19,7 @@
 / {
        model = "fsl,lite5200b";
        // revision = "1.0";
-       compatible = "fsl,lite5200b\0generic-mpc5200";
+       compatible = "fsl,lite5200b","generic-mpc5200";
        #address-cells = <1>;
        #size-cells = <1>;
 
@@ -37,7 +37,6 @@
                        timebase-frequency = <0>;       // from bootloader
                        bus-frequency = <0>;            // from bootloader
                        clock-frequency = <0>;          // from bootloader
-                       32-bit;
                };
        };
 
                model = "fsl,mpc5200b";
                compatible = "mpc5200";
                revision = "";                  // from bootloader
-               #interrupt-cells = <3>;
                device_type = "soc";
-               ranges = <0 f0000000 f0010000>;
-               reg = <f0000000 00010000>;
+               ranges = <0 f0000000 0000c000>;
+               reg = <f0000000 00000100>;
                bus-frequency = <0>;            // from bootloader
                system-frequency = <0>;         // from bootloader
 
                cdm@200 {
-                       compatible = "mpc5200b-cdm\0mpc5200-cdm";
+                       compatible = "mpc5200b-cdm","mpc5200-cdm";
                        reg = <200 38>;
                };
 
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        device_type = "interrupt-controller";
-                       compatible = "mpc5200b-pic\0mpc5200-pic";
+                       compatible = "mpc5200b-pic","mpc5200-pic";
                        reg = <500 80>;
-                       built-in;
                };
 
                gpt@600 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <0>;
                        reg = <600 10>;
@@ -83,7 +80,7 @@
                };
 
                gpt@610 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <1>;
                        reg = <610 10>;
@@ -92,7 +89,7 @@
                };
 
                gpt@620 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <2>;
                        reg = <620 10>;
                };
 
                gpt@630 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <3>;
                        reg = <630 10>;
                };
 
                gpt@640 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <4>;
                        reg = <640 10>;
                };
 
                gpt@650 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <5>;
                        reg = <650 10>;
                };
 
                gpt@660 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <6>;
                        reg = <660 10>;
                };
 
                gpt@670 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
+                       compatible = "mpc5200b-gpt","mpc5200-gpt";
                        device_type = "gpt";
                        cell-index = <7>;
                        reg = <670 10>;
                };
 
                rtc@800 {       // Real time clock
-                       compatible = "mpc5200b-rtc\0mpc5200-rtc";
+                       compatible = "mpc5200b-rtc","mpc5200-rtc";
                        device_type = "rtc";
                        reg = <800 100>;
                        interrupts = <1 5 0 1 6 0>;
 
                mscan@900 {
                        device_type = "mscan";
-                       compatible = "mpc5200b-mscan\0mpc5200-mscan";
+                       compatible = "mpc5200b-mscan","mpc5200-mscan";
                        cell-index = <0>;
                        interrupts = <2 11 0>;
                        interrupt-parent = <&mpc5200_pic>;
 
                mscan@980 {
                        device_type = "mscan";
-                       compatible = "mpc5200b-mscan\0mpc5200-mscan";
+                       compatible = "mpc5200b-mscan","mpc5200-mscan";
                        cell-index = <1>;
                        interrupts = <2 12 0>;
                        interrupt-parent = <&mpc5200_pic>;
                };
 
                gpio@b00 {
-                       compatible = "mpc5200b-gpio\0mpc5200-gpio";
+                       compatible = "mpc5200b-gpio","mpc5200-gpio";
                        reg = <b00 40>;
                        interrupts = <1 7 0>;
                        interrupt-parent = <&mpc5200_pic>;
                };
 
                gpio-wkup@c00 {
-                       compatible = "mpc5200b-gpio-wkup\0mpc5200-gpio-wkup";
+                       compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
                        reg = <c00 40>;
                        interrupts = <1 8 0 0 3 0>;
                        interrupt-parent = <&mpc5200_pic>;
                };
 
-               pci@0d00 {
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       device_type = "pci";
-                       compatible = "mpc5200b-pci\0mpc5200-pci";
-                       reg = <d00 100>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot
-                                        c000 0 0 2 &mpc5200_pic 1 1 3
-                                        c000 0 0 3 &mpc5200_pic 1 2 3
-                                        c000 0 0 4 &mpc5200_pic 1 3 3
-
-                                        c800 0 0 1 &mpc5200_pic 1 1 3 // 2nd slot
-                                        c800 0 0 2 &mpc5200_pic 1 2 3
-                                        c800 0 0 3 &mpc5200_pic 1 3 3
-                                        c800 0 0 4 &mpc5200_pic 0 0 3>;
-                       clock-frequency = <0>; // From boot loader
-                       interrupts = <2 8 0 2 9 0 2 a 0>;
-                       interrupt-parent = <&mpc5200_pic>;
-                       bus-range = <0 0>;
-                       ranges = <42000000 0 80000000 80000000 0 20000000
-                                 02000000 0 a0000000 a0000000 0 10000000
-                                 01000000 0 00000000 b0000000 0 01000000>;
-               };
-
                spi@f00 {
                        device_type = "spi";
-                       compatible = "mpc5200b-spi\0mpc5200-spi";
+                       compatible = "mpc5200b-spi","mpc5200-spi";
                        reg = <f00 20>;
                        interrupts = <2 d 0 2 e 0>;
                        interrupt-parent = <&mpc5200_pic>;
 
                usb@1000 {
                        device_type = "usb-ohci-be";
-                       compatible = "mpc5200b-ohci\0mpc5200-ohci\0ohci-be";
+                       compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
                        reg = <1000 ff>;
                        interrupts = <2 6 0>;
                        interrupt-parent = <&mpc5200_pic>;
 
                bestcomm@1200 {
                        device_type = "dma-controller";
-                       compatible = "mpc5200b-bestcomm\0mpc5200-bestcomm";
+                       compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
                        reg = <1200 80>;
                        interrupts = <3 0 0  3 1 0  3 2 0  3 3 0
                                      3 4 0  3 5 0  3 6 0  3 7 0
                };
 
                xlb@1f00 {
-                       compatible = "mpc5200b-xlb\0mpc5200-xlb";
+                       compatible = "mpc5200b-xlb","mpc5200-xlb";
                        reg = <1f00 100>;
                };
 
                serial@2000 {           // PSC1
                        device_type = "serial";
-                       compatible = "mpc5200b-psc-uart\0mpc5200-psc-uart";
+                       compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
                        port-number = <0>;  // Logical port assignment
                        cell-index = <0>;
                        reg = <2000 100>;
                // PSC2 in ac97 mode example
                //ac97@2200 {           // PSC2
                //      device_type = "sound";
-               //      compatible = "mpc5200b-psc-ac97\0mpc5200-psc-ac97";
+               //      compatible = "mpc5200b-psc-ac97","mpc5200-psc-ac97";
                //      cell-index = <1>;
                //      reg = <2200 100>;
                //      interrupts = <2 2 0>;
                // PSC4 in uart mode example
                //serial@2600 {         // PSC4
                //      device_type = "serial";
-               //      compatible = "mpc5200b-psc-uart\0mpc5200-psc-uart";
+               //      compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
                //      cell-index = <3>;
                //      reg = <2600 100>;
                //      interrupts = <2 b 0>;
                // PSC5 in uart mode example
                //serial@2800 {         // PSC5
                //      device_type = "serial";
-               //      compatible = "mpc5200b-psc-uart\0mpc5200-psc-uart";
+               //      compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
                //      cell-index = <4>;
                //      reg = <2800 100>;
                //      interrupts = <2 c 0>;
                // PSC6 in spi mode example
                //spi@2c00 {            // PSC6
                //      device_type = "spi";
-               //      compatible = "mpc5200b-psc-spi\0mpc5200-psc-spi";
+               //      compatible = "mpc5200b-psc-spi","mpc5200-psc-spi";
                //      cell-index = <5>;
                //      reg = <2c00 100>;
                //      interrupts = <2 4 0>;
 
                ethernet@3000 {
                        device_type = "network";
-                       compatible = "mpc5200b-fec\0mpc5200-fec";
+                       compatible = "mpc5200b-fec","mpc5200-fec";
                        reg = <3000 800>;
                        mac-address = [ 02 03 04 05 06 07 ]; // Bad!
                        interrupts = <2 5 0>;
 
                ata@3a00 {
                        device_type = "ata";
-                       compatible = "mpc5200b-ata\0mpc5200-ata";
+                       compatible = "mpc5200b-ata","mpc5200-ata";
                        reg = <3a00 100>;
                        interrupts = <2 7 0>;
                        interrupt-parent = <&mpc5200_pic>;
 
                i2c@3d00 {
                        device_type = "i2c";
-                       compatible = "mpc5200b-i2c\0mpc5200-i2c\0fsl-i2c";
+                       compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
                        cell-index = <0>;
                        reg = <3d00 40>;
                        interrupts = <2 f 0>;
 
                i2c@3d40 {
                        device_type = "i2c";
-                       compatible = "mpc5200b-i2c\0mpc5200-i2c\0fsl-i2c";
+                       compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
                        cell-index = <1>;
                        reg = <3d40 40>;
                        interrupts = <2 10 0>;
                };
                sram@8000 {
                        device_type = "sram";
-                       compatible = "mpc5200b-sram\0mpc5200-sram\0sram";
+                       compatible = "mpc5200b-sram","mpc5200-sram","sram";
                        reg = <8000 4000>;
                };
        };
+
+       pci@f0000d00 {
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               device_type = "pci";
+               compatible = "mpc5200b-pci","mpc5200-pci";
+               reg = <f0000d00 100>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot
+                                c000 0 0 2 &mpc5200_pic 1 1 3
+                                c000 0 0 3 &mpc5200_pic 1 2 3
+                                c000 0 0 4 &mpc5200_pic 1 3 3
+
+                                c800 0 0 1 &mpc5200_pic 1 1 3 // 2nd slot
+                                c800 0 0 2 &mpc5200_pic 1 2 3
+                                c800 0 0 3 &mpc5200_pic 1 3 3
+                                c800 0 0 4 &mpc5200_pic 0 0 3>;
+               clock-frequency = <0>; // From boot loader
+               interrupts = <2 8 0 2 9 0 2 a 0>;
+               interrupt-parent = <&mpc5200_pic>;
+               bus-range = <0 0>;
+               ranges = <42000000 0 80000000 80000000 0 20000000
+                         02000000 0 a0000000 a0000000 0 10000000
+                         01000000 0 00000000 b0000000 0 01000000>;
+       };
 };
index b9158eb2797ea4e3e42b07b042a2e916227c5320..8fb5423874365da12ca167cb5fbe10c11bbbdae8 100644 (file)
@@ -31,7 +31,6 @@
                        timebase-frequency = <0>;       // 33 MHz, from uboot
                        clock-frequency = <0>;          // From U-Boot
                        bus-frequency = <0>;            // From U-Boot
-                       32-bit;
                };
        };
 
@@ -44,7 +43,6 @@
        tsi108@c0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "tsi-bridge";
                ranges = <00000000 c0000000 00010000>;
                reg = <c0000000 00010000>;
@@ -80,6 +78,7 @@
                };
 
                ethernet@6200 {
+                       linux,network-index = <0>;
                        #size-cells = <0>;
                        device_type = "network";
                        compatible = "tsi108-ethernet";
@@ -92,6 +91,7 @@
                };
 
                ethernet@6600 {
+                       linux,network-index = <1>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        device_type = "network";
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <7400 400>;
-                       built-in;
                        compatible = "chrp,open-pic";
                        device_type = "open-pic";
                                big-endian;
                                device_type = "pic-router";
                                #address-cells = <0>;
                                #interrupt-cells = <2>;
-                               built-in;
                                big-endian;
                                interrupts = <17 2>;
                                interrupt-parent = <&mpic>;
                        };
                };
        };
+       chosen {
+               linux,stdout-path = "/tsi108@c0000000/serial@7808";
+       };
 
 };
index 1934b800278e06d42d47d21ce94fd2490483f2f6..7285ca1325fdeb8892306e6cc44ae6f3f2c43525 100644 (file)
  */
 
 / {
-       model = "MPC8272ADS";
-       compatible = "MPC8260ADS";
-       #address-cells = <1>;
-       #size-cells = <1>;
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               PowerPC,8272@0 {
-                       device_type = "cpu";
-                       reg = <0>;
-                       d-cache-line-size = <20>;       // 32 bytes
-                       i-cache-line-size = <20>;       // 32 bytes
-                       d-cache-size = <4000>;          // L1, 16K
-                       i-cache-size = <4000>;          // L1, 16K
-                       timebase-frequency = <0>;
-                       bus-frequency = <0>;
-                       clock-frequency = <0>;
-                       32-bit;
-               };
-       };
-
-               pci_pic: interrupt-controller@f8200000 {
-               #address-cells = <0>;
-               #interrupt-cells = <2>;
-               interrupt-controller;
-               reg = <f8200000 f8200004>;
-               built-in;
-               device_type = "pci-pic";
-       };
-       memory {
-               device_type = "memory";
-               reg = <00000000 4000000 f4500000 00000020>;
-       };
-
-       chosen {
-               name = "chosen";
-               linux,platform = <0>;
-               interrupt-controller = <&Cpm_pic>;
-       };
-
-       soc8272@f0000000 {
-               #address-cells = <1>;
-               #size-cells = <1>;
-               #interrupt-cells = <2>;
-               device_type = "soc";
-               ranges = <00000000 f0000000 00053000>;
-               reg = <f0000000 10000>;
-
-               mdio@0 {
-                       device_type = "mdio";
-                       compatible = "fs_enet";
-                       reg = <0 0>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       phy0:ethernet-phy@0 {
-                               interrupt-parent = <&Cpm_pic>;
-                               interrupts = <17 4>;
-                               reg = <0>;
-                               bitbang = [ 12 12 13 02 02 01 ];
-                               device_type = "ethernet-phy";
-                       };
-                       phy1:ethernet-phy@1 {
-                               interrupt-parent = <&Cpm_pic>;
-                               interrupts = <17 4>;
-                               bitbang = [ 12 12 13 02 02 01 ];
-                               reg = <3>;
-                               device_type = "ethernet-phy";
-                       };
-               };
-
-               ethernet@24000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       device_type = "network";
-                       device-id = <1>;
-                       compatible = "fs_enet";
-                       model = "FCC";
-                       reg = <11300 20 8400 100 11380 30>;
-                       mac-address = [ 00 11 2F 99 43 54 ];
-                       interrupts = <20 2>;
-                       interrupt-parent = <&Cpm_pic>;
-                       phy-handle = <&Phy0>;
-                       rx-clock = <13>;
-                       tx-clock = <12>;
-               };
-
-               ethernet@25000 {
-                       device_type = "network";
-                       device-id = <2>;
-                       compatible = "fs_enet";
-                       model = "FCC";
-                       reg = <11320 20 8500 100 113b0 30>;
-                       mac-address = [ 00 11 2F 99 44 54 ];
-                       interrupts = <21 2>;
-                       interrupt-parent = <&Cpm_pic>;
-                       phy-handle = <&Phy1>;
-                       rx-clock = <17>;
-                       tx-clock = <18>;
-               };
-
-               cpm@f0000000 {
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       #interrupt-cells = <2>;
-                       device_type = "cpm";
-                       model = "CPM2";
-                       ranges = <00000000 00000000 20000>;
-                       reg = <0 20000>;
-                       command-proc = <119c0>;
-                       brg-frequency = <17D7840>;
-                       cpm_clk = <BEBC200>;
-
-                       scc@11a00 {
-                               device_type = "serial";
-                               compatible = "cpm_uart";
-                               model = "SCC";
-                               device-id = <1>;
-                               reg = <11a00 20 8000 100>;
-                               current-speed = <1c200>;
-                               interrupts = <28 2>;
-                               interrupt-parent = <&Cpm_pic>;
-                               clock-setup = <0 00ffffff>;
-                               rx-clock = <1>;
-                               tx-clock = <1>;
-                       };
-
-                       scc@11a60 {
-                               device_type = "serial";
-                               compatible = "cpm_uart";
-                               model = "SCC";
-                               device-id = <4>;
-                               reg = <11a60 20 8300 100>;
-                               current-speed = <1c200>;
-                               interrupts = <2b 2>;
-                               interrupt-parent = <&Cpm_pic>;
-                               clock-setup = <1b ffffff00>;
-                               rx-clock = <4>;
-                               tx-clock = <4>;
-                       };
-
-               };
-                       cpm_pic:interrupt-controller@10c00 {
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       interrupt-controller;
-                       reg = <10c00 80>;
-                       built-in;
-                       device_type = "cpm-pic";
-                      compatible = "CPM2";
-               };
-               pci@0500 {
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       compatible = "8272";
-                       device_type = "pci";
-                       reg = <10430 4dc>;
-                       clock-frequency = <3f940aa>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                                       /* IDSEL 0x16 */
-                                        b000 0 0 1 f8200000 40 8
-                                        b000 0 0 2 f8200000 41 8
-                                        b000 0 0 3 f8200000 42 8
-                                        b000 0 0 4 f8200000 43 8
-
-                                       /* IDSEL 0x17 */
-                                        b800 0 0 1 f8200000 43 8
-                                        b800 0 0 2 f8200000 40 8
-                                        b800 0 0 3 f8200000 41 8
-                                        b800 0 0 4 f8200000 42 8
-
-                                       /* IDSEL 0x18 */
-                                        c000 0 0 1 f8200000 42 8
-                                        c000 0 0 2 f8200000 43 8
-                                        c000 0 0 3 f8200000 40 8
-                                        c000 0 0 4 f8200000 41 8>;
-                       interrupt-parent = <&Cpm_pic>;
-                       interrupts = <14 8>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 80000000 80000000 0 40000000
-                                 01000000 0 00000000 f6000000 0 02000000>;
-               };
+       model = "MPC8272ADS";
+       compatible = "fsl,mpc8272ads";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8272@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <d#32>;
+                       i-cache-line-size = <d#32>;
+                       d-cache-size = <d#16384>;
+                       i-cache-size = <d#16384>;
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0>;
+       };
+
+       localbus@f0010100 {
+               compatible = "fsl,mpc8272-localbus",
+                            "fsl,pq2-localbus";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               reg = <f0010100 40>;
+
+               ranges = <0 0 fe000000 02000000
+                         1 0 f4500000 00008000
+                         3 0 f8200000 00008000>;
+
+               flash@0,0 {
+                       compatible = "jedec-flash";
+                       reg = <0 0 2000000>;
+                       bank-width = <4>;
+                       device-width = <1>;
+               };
+
+               board-control@1,0 {
+                       reg = <1 0 20>;
+                       compatible = "fsl,mpc8272ads-bcsr";
+               };
+
+               PCI_PIC: interrupt-controller@3,0 {
+                       compatible = "fsl,mpc8272ads-pci-pic",
+                                    "fsl,pq2ads-pci-pic";
+                       #interrupt-cells = <1>;
+                       interrupt-controller;
+                       reg = <3 0 8>;
+                       interrupt-parent = <&PIC>;
+                       interrupts = <14 8>;
+               };
+       };
+
+
+       pci@f0010800 {
+               device_type = "pci";
+               reg = <f0010800 10c f00101ac 8 f00101c4 8>;
+               compatible = "fsl,mpc8272-pci", "fsl,pq2-pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               clock-frequency = <d#66666666>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                                /* IDSEL 0x16 */
+                                b000 0 0 1 &PCI_PIC 0
+                                b000 0 0 2 &PCI_PIC 1
+                                b000 0 0 3 &PCI_PIC 2
+                                b000 0 0 4 &PCI_PIC 3
+
+                                /* IDSEL 0x17 */
+                                b800 0 0 1 &PCI_PIC 4
+                                b800 0 0 2 &PCI_PIC 5
+                                b800 0 0 3 &PCI_PIC 6
+                                b800 0 0 4 &PCI_PIC 7
+
+                                /* IDSEL 0x18 */
+                                c000 0 0 1 &PCI_PIC 8
+                                c000 0 0 2 &PCI_PIC 9
+                                c000 0 0 3 &PCI_PIC a
+                                c000 0 0 4 &PCI_PIC b>;
+
+               interrupt-parent = <&PIC>;
+               interrupts = <12 8>;
+               ranges = <42000000 0 80000000 80000000 0 20000000
+                         02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 f6000000 0 02000000>;
+       };
+
+       soc@f0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "fsl,mpc8272", "fsl,pq2-soc";
+               ranges = <00000000 f0000000 00053000>;
+
+               // Temporary -- will go away once kernel uses ranges for get_immrbase().
+               reg = <f0000000 00053000>;
+
+               cpm@119c0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,mpc8272-cpm", "fsl,cpm2";
+                       reg = <119c0 30>;
+                       ranges;
+
+                       muram@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0 10000>;
+
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 2000 9800 800>;
+                               };
+                       };
+
+                       brg@119f0 {
+                               compatible = "fsl,mpc8272-brg",
+                                            "fsl,cpm2-brg",
+                                            "fsl,cpm-brg";
+                               reg = <119f0 10 115f0 10>;
+                       };
+
+                       serial@11a00 {
+                               device_type = "serial";
+                               compatible = "fsl,mpc8272-scc-uart",
+                                            "fsl,cpm2-scc-uart";
+                               reg = <11a00 20 8000 100>;
+                               interrupts = <28 8>;
+                               interrupt-parent = <&PIC>;
+                               fsl,cpm-brg = <1>;
+                               fsl,cpm-command = <00800000>;
+                       };
+
+                       serial@11a60 {
+                               device_type = "serial";
+                               compatible = "fsl,mpc8272-scc-uart",
+                                            "fsl,cpm2-scc-uart";
+                               reg = <11a60 20 8300 100>;
+                               interrupts = <2b 8>;
+                               interrupt-parent = <&PIC>;
+                               fsl,cpm-brg = <4>;
+                               fsl,cpm-command = <0ce00000>;
+                       };
+
+                       mdio@10d40 {
+                               device_type = "mdio";
+                               compatible = "fsl,mpc8272ads-mdio-bitbang",
+                                            "fsl,mpc8272-mdio-bitbang",
+                                            "fsl,cpm2-mdio-bitbang";
+                               reg = <10d40 14>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               fsl,mdio-pin = <12>;
+                               fsl,mdc-pin = <13>;
+
+                               PHY0: ethernet-phy@0 {
+                                       interrupt-parent = <&PIC>;
+                                       interrupts = <17 8>;
+                                       reg = <0>;
+                                       device_type = "ethernet-phy";
+                               };
+
+                               PHY1: ethernet-phy@1 {
+                                       interrupt-parent = <&PIC>;
+                                       interrupts = <17 8>;
+                                       reg = <3>;
+                                       device_type = "ethernet-phy";
+                               };
+                       };
+
+                       ethernet@11300 {
+                               device_type = "network";
+                               compatible = "fsl,mpc8272-fcc-enet",
+                                            "fsl,cpm2-fcc-enet";
+                               reg = <11300 20 8400 100 11390 1>;
+                               local-mac-address = [ 00 00 00 00 00 00 ];
+                               interrupts = <20 8>;
+                               interrupt-parent = <&PIC>;
+                               phy-handle = <&PHY0>;
+                               linux,network-index = <0>;
+                               fsl,cpm-command = <12000300>;
+                       };
+
+                       ethernet@11320 {
+                               device_type = "network";
+                               compatible = "fsl,mpc8272-fcc-enet",
+                                            "fsl,cpm2-fcc-enet";
+                               reg = <11320 20 8500 100 113b0 1>;
+                               local-mac-address = [ 00 00 00 00 00 00 ];
+                               interrupts = <21 8>;
+                               interrupt-parent = <&PIC>;
+                               phy-handle = <&PHY1>;
+                               linux,network-index = <1>;
+                               fsl,cpm-command = <16200300>;
+                       };
+               };
+
+               PIC: interrupt-controller@10c00 {
+                       #interrupt-cells = <2>;
+                       interrupt-controller;
+                       reg = <10c00 80>;
+                       compatible = "fsl,mpc8272-pic", "fsl,cpm2-pic";
+               };
 
 /* May need to remove if on a part without crypto engine */
-               crypto@30000 {
-                       device_type = "crypto";
-                       model = "SEC2";
-                       compatible = "talitos";
-                       reg = <30000 10000>;
-                       interrupts = <b 2>;
-                       interrupt-parent = <&Cpm_pic>;
-                       num-channels = <4>;
-                       channel-fifo-len = <18>;
-                       exec-units-mask = <0000007e>;
+               crypto@30000 {
+                       device_type = "crypto";
+                       model = "SEC2";
+                       compatible = "fsl,mpc8272-talitos-sec2",
+                                    "fsl,talitos-sec2",
+                                    "fsl,talitos",
+                                    "talitos";
+                       reg = <30000 10000>;
+                       interrupts = <b 8>;
+                       interrupt-parent = <&PIC>;
+                       num-channels = <4>;
+                       channel-fifo-len = <18>;
+                       exec-units-mask = <0000007e>;
 /* desc mask is for rev1.x, we need runtime fixup for >=2.x */
-                       descriptor-types-mask = <01010ebf>;
-               };
+                       descriptor-types-mask = <01010ebf>;
+               };
+       };
 
-       };
+       chosen {
+               linux,stdout-path = "/soc/cpm/serial@11a00";
+       };
 };
index c5adbe40364efd8e0b40e78004b60eae8261827d..9e7eba973262405fa00ea6b3facdb7f72b71f0b2 100644 (file)
@@ -29,7 +29,6 @@
                        timebase-frequency = <0>;       // from bootloader
                        bus-frequency = <0>;            // from bootloader
                        clock-frequency = <0>;          // from bootloader
-                       32-bit;
                };
        };
 
@@ -41,7 +40,6 @@
        soc8313@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
 
                spi@7000 {
                        device_type = "spi";
-                       compatible = "mpc83xx_spi";
+                       compatible = "fsl_spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
-                       mode = <0>;
+                       mode = "cpu";
                };
 
                /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
                        interrupt-parent = < &ipic >;
                };
 
-               pci@8500 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                                       /* IDSEL 0x0E -mini PCI */
-                                        7000 0 0 1 &ipic 12 8
-                                        7000 0 0 2 &ipic 12 8
-                                        7000 0 0 3 &ipic 12 8
-                                        7000 0 0 4 &ipic 12 8
-
-                                       /* IDSEL 0x0F - PCI slot */
-                                        7800 0 0 1 &ipic 11 8
-                                        7800 0 0 2 &ipic 12 8
-                                        7800 0 0 3 &ipic 11 8
-                                        7800 0 0 4 &ipic 12 8>;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 90000000 90000000 0 10000000
-                                 42000000 0 80000000 80000000 0 10000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8500 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                crypto@30000 {
                        device_type = "crypto";
                        model = "SEC2";
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
        };
+
+       pci@e0008500 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                               /* IDSEL 0x0E -mini PCI */
+                                7000 0 0 1 &ipic 12 8
+                                7000 0 0 2 &ipic 12 8
+                                7000 0 0 3 &ipic 12 8
+                                7000 0 0 4 &ipic 12 8
+
+                               /* IDSEL 0x0F - PCI slot */
+                                7800 0 0 1 &ipic 11 8
+                                7800 0 0 2 &ipic 12 8
+                                7800 0 0 3 &ipic 11 8
+                                7800 0 0 4 &ipic 12 8>;
+               interrupt-parent = < &ipic >;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 90000000 90000000 0 10000000
+                         42000000 0 80000000 80000000 0 10000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008500 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
 };
index f158ed781ba8250db6540dcc3209c51d7a06f2e7..fcd333c391ec15c285b1c23e370b5c24cf289c0d 100644 (file)
@@ -29,7 +29,6 @@
                        timebase-frequency = <0>;
                        bus-frequency = <0>;
                        clock-frequency = <0>;
-                       32-bit;
                };
        };
 
@@ -46,7 +45,6 @@
        soc8323@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
                        descriptor-types-mask = <0122003f>;
                };
 
-               pci@8500 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                                       /* IDSEL 0x11 AD17 */
-                                        8800 0 0 1 &ipic 14 8
-                                        8800 0 0 2 &ipic 15 8
-                                        8800 0 0 3 &ipic 16 8
-                                        8800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x12 AD18 */
-                                        9000 0 0 1 &ipic 16 8
-                                        9000 0 0 2 &ipic 17 8
-                                        9000 0 0 3 &ipic 14 8
-                                        9000 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x13 AD19 */
-                                        9800 0 0 1 &ipic 17 8
-                                        9800 0 0 2 &ipic 14 8
-                                        9800 0 0 3 &ipic 15 8
-                                        9800 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x15 AD21*/
-                                        a800 0 0 1 &ipic 14 8
-                                        a800 0 0 2 &ipic 15 8
-                                        a800 0 0 3 &ipic 16 8
-                                        a800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x16 AD22*/
-                                        b000 0 0 1 &ipic 17 8
-                                        b000 0 0 2 &ipic 14 8
-                                        b000 0 0 3 &ipic 15 8
-                                        b000 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x17 AD23*/
-                                        b800 0 0 1 &ipic 16 8
-                                        b800 0 0 2 &ipic 17 8
-                                        b800 0 0 3 &ipic 14 8
-                                        b800 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x18 AD24*/
-                                        c000 0 0 1 &ipic 15 8
-                                        c000 0 0 2 &ipic 16 8
-                                        c000 0 0 3 &ipic 17 8
-                                        c000 0 0 4 &ipic 14 8>;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 90000000 90000000 0 10000000
-                                 42000000 0 80000000 80000000 0 10000000
-                                 01000000 0 00000000 d0000000 0 00100000>;
-                       clock-frequency = <0>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8500 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                ipic: pic@700 {
                        interrupt-controller;
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
                
                        #address-cells = <0>;
                        #interrupt-cells = <1>;
                        reg = <80 80>;
-                       built-in;
                        big-endian;
                        interrupts = <20 8 21 8>; //high:32 low:33
                        interrupt-parent = < &ipic >;
                };
        };
+
+       pci@e0008500 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                               /* IDSEL 0x11 AD17 */
+                                8800 0 0 1 &ipic 14 8
+                                8800 0 0 2 &ipic 15 8
+                                8800 0 0 3 &ipic 16 8
+                                8800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x12 AD18 */
+                                9000 0 0 1 &ipic 16 8
+                                9000 0 0 2 &ipic 17 8
+                                9000 0 0 3 &ipic 14 8
+                                9000 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x13 AD19 */
+                                9800 0 0 1 &ipic 17 8
+                                9800 0 0 2 &ipic 14 8
+                                9800 0 0 3 &ipic 15 8
+                                9800 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x15 AD21*/
+                                a800 0 0 1 &ipic 14 8
+                                a800 0 0 2 &ipic 15 8
+                                a800 0 0 3 &ipic 16 8
+                                a800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x16 AD22*/
+                                b000 0 0 1 &ipic 17 8
+                                b000 0 0 2 &ipic 14 8
+                                b000 0 0 3 &ipic 15 8
+                                b000 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x17 AD23*/
+                                b800 0 0 1 &ipic 16 8
+                                b800 0 0 2 &ipic 17 8
+                                b800 0 0 3 &ipic 14 8
+                                b800 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x18 AD24*/
+                                c000 0 0 1 &ipic 15 8
+                                c000 0 0 2 &ipic 16 8
+                                c000 0 0 3 &ipic 17 8
+                                c000 0 0 4 &ipic 14 8>;
+               interrupt-parent = < &ipic >;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 90000000 90000000 0 10000000
+                         42000000 0 80000000 80000000 0 10000000
+                         01000000 0 00000000 d0000000 0 00100000>;
+               clock-frequency = <0>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008500 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
 };
index 7c4beff3e20005784870c1e9bfb572b1ef907b9c..388c8a7012e138910626babe9675bbe26b05abb6 100644 (file)
@@ -29,7 +29,6 @@
                        timebase-frequency = <0>;
                        bus-frequency = <0>;
                        clock-frequency = <0>;
-                       32-bit;
                };
        };
 
@@ -41,7 +40,6 @@
        soc8323@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
                        descriptor-types-mask = <0122003f>;
                };
 
-               pci@8500 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                                       /* IDSEL 0x10 AD16 (USB) */
-                                        8000 0 0 1 &pic 11 8
-
-                                       /* IDSEL 0x11 AD17 (Mini1)*/
-                                        8800 0 0 1 &pic 12 8
-                                        8800 0 0 2 &pic 13 8
-                                        8800 0 0 3 &pic 14 8
-                                        8800 0 0 4 &pic 30 8
-
-                                       /* IDSEL 0x12 AD18 (PCI/Mini2) */
-                                        9000 0 0 1 &pic 13 8
-                                        9000 0 0 2 &pic 14 8
-                                        9000 0 0 3 &pic 30 8
-                                        9000 0 0 4 &pic 11 8>;
-
-                       interrupt-parent = <&pic>;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <42000000 0 80000000 80000000 0 10000000
-                                 02000000 0 90000000 90000000 0 10000000
-                                 01000000 0 d0000000 d0000000 0 04000000>;
-                       clock-frequency = <0>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8500 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                pic:pic@700 {
                        interrupt-controller;
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
 
                        reg = <4c0 40>;
                        interrupts = <2>;
                        interrupt-parent = <&qeic>;
-                       mode = "cpu";
+                       mode = "cpu-qe";
                };
 
                spi@500 {
                        #address-cells = <0>;
                        #interrupt-cells = <1>;
                        reg = <80 80>;
-                       built-in;
                        big-endian;
                        interrupts = <20 8 21 8>; //high:32 low:33
                        interrupt-parent = <&pic>;
                };
        };
+
+       pci@e0008500 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                               /* IDSEL 0x10 AD16 (USB) */
+                                8000 0 0 1 &pic 11 8
+
+                               /* IDSEL 0x11 AD17 (Mini1)*/
+                                8800 0 0 1 &pic 12 8
+                                8800 0 0 2 &pic 13 8
+                                8800 0 0 3 &pic 14 8
+                                8800 0 0 4 &pic 30 8
+
+                               /* IDSEL 0x12 AD18 (PCI/Mini2) */
+                                9000 0 0 1 &pic 13 8
+                                9000 0 0 2 &pic 14 8
+                                9000 0 0 3 &pic 30 8
+                                9000 0 0 4 &pic 11 8>;
+
+               interrupt-parent = <&pic>;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <42000000 0 80000000 80000000 0 10000000
+                         02000000 0 90000000 90000000 0 10000000
+                         01000000 0 d0000000 d0000000 0 04000000>;
+               clock-frequency = <0>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008500 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
 };
index 44c065a6b5e71a2ea1fe318a5062a2d8d79f3ff8..5072f6d0a46d3a9631591b85f920cb2ed4668e8e 100644 (file)
@@ -28,7 +28,6 @@
                        timebase-frequency = <0>;       // from bootloader
                        bus-frequency = <0>;            // from bootloader
                        clock-frequency = <0>;          // from bootloader
-                       32-bit;
                };
        };
 
@@ -40,7 +39,6 @@
        soc8349@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
 
                spi@7000 {
                        device_type = "spi";
-                       compatible = "mpc83xx_spi";
+                       compatible = "fsl_spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
-                       mode = <0>;
+                       mode = "cpu";
                };
 
                usb@22000 {
                        interrupts = <20 8 21 8 22 8>;
                        interrupt-parent = < &ipic >;
                        phy-handle = < &phy1c >;
+                       linux,network-index = <0>;
                };
 
                ethernet@25000 {
                        interrupts = <23 8 24 8 25 8>;
                        interrupt-parent = < &ipic >;
                        phy-handle = < &phy1f >;
+                       linux,network-index = <1>;
                };
 
                serial@4500 {
                        interrupt-parent = < &ipic >;
                };
 
-               pci@8500 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                                       /* IDSEL 0x10 - SATA */
-                                       8000 0 0 1 &ipic 16 8 /* SATA_INTA */
-                                       >;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <42000000 0 80000000 80000000 0 10000000
-                                 02000000 0 90000000 90000000 0 10000000
-                                 01000000 0 00000000 e2000000 0 01000000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8500 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
-               pci@8600 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                                       /* IDSEL 0x0E - MiniPCI Slot */
-                                       7000 0 0 1 &ipic 15 8 /* PCI_INTA */
-
-                                       /* IDSEL 0x0F - PCI Slot */
-                                       7800 0 0 1 &ipic 14 8 /* PCI_INTA */
-                                       7800 0 0 2 &ipic 15 8 /* PCI_INTB */
-                                        >;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <43 8>;
-                       bus-range = <1 1>;
-                       ranges = <42000000 0 a0000000 a0000000 0 10000000
-                                 02000000 0 b0000000 b0000000 0 10000000
-                                 01000000 0 00000000 e3000000 0 01000000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8600 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                crypto@30000 {
                        device_type = "crypto";
                        model = "SEC2";
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
        };
+
+       pci@e0008500 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                               /* IDSEL 0x10 - SATA */
+                               8000 0 0 1 &ipic 16 8 /* SATA_INTA */
+                               >;
+               interrupt-parent = < &ipic >;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <42000000 0 80000000 80000000 0 10000000
+                         02000000 0 90000000 90000000 0 10000000
+                         01000000 0 00000000 e2000000 0 01000000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008500 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
+
+       pci@e0008600 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                               /* IDSEL 0x0E - MiniPCI Slot */
+                               7000 0 0 1 &ipic 15 8 /* PCI_INTA */
+
+                               /* IDSEL 0x0F - PCI Slot */
+                               7800 0 0 1 &ipic 14 8 /* PCI_INTA */
+                               7800 0 0 2 &ipic 15 8 /* PCI_INTB */
+                                >;
+               interrupt-parent = < &ipic >;
+               interrupts = <43 8>;
+               bus-range = <0 0>;
+               ranges = <42000000 0 a0000000 a0000000 0 10000000
+                         02000000 0 b0000000 b0000000 0 10000000
+                         01000000 0 00000000 e3000000 0 01000000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008600 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
+
+
+
 };
index 0b8387141d8881e31d638de1293b82a7c1f1ea48..074f7a2ab7e4ccd97d5d425afe6d009ff4f3f443 100644 (file)
@@ -28,7 +28,6 @@
                        timebase-frequency = <0>;       // from bootloader
                        bus-frequency = <0>;            // from bootloader
                        clock-frequency = <0>;          // from bootloader
-                       32-bit;
                };
        };
 
@@ -40,7 +39,6 @@
        soc8349@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
 
                spi@7000 {
                        device_type = "spi";
-                       compatible = "mpc83xx_spi";
+                       compatible = "fsl_spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
-                       mode = <0>;
+                       mode = "cpu";
                };
 
                usb@23000 {
                        interrupts = <20 8 21 8 22 8>;
                        interrupt-parent = < &ipic >;
                        phy-handle = < &phy1c >;
+                       linux,network-index = <0>;
                };
 
                serial@4500 {
                        interrupt-parent = < &ipic >;
                };
 
-               pci@8600 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                                       /* IDSEL 0x0F - PCI Slot */
-                                       7800 0 0 1 &ipic 14 8 /* PCI_INTA */
-                                       7800 0 0 2 &ipic 15 8 /* PCI_INTB */
-                                        >;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <43 8>;
-                       bus-range = <1 1>;
-                       ranges = <42000000 0 a0000000 a0000000 0 10000000
-                                 02000000 0 b0000000 b0000000 0 10000000
-                                 01000000 0 00000000 e3000000 0 01000000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8600 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                crypto@30000 {
                        device_type = "crypto";
                        model = "SEC2";
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
        };
+
+       pci@e0008600 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                               /* IDSEL 0x0F - PCI Slot */
+                               7800 0 0 1 &ipic 14 8 /* PCI_INTA */
+                               7800 0 0 2 &ipic 15 8 /* PCI_INTB */
+                                >;
+               interrupt-parent = < &ipic >;
+               interrupts = <43 8>;
+               bus-range = <1 1>;
+               ranges = <42000000 0 a0000000 a0000000 0 10000000
+                         02000000 0 b0000000 b0000000 0 10000000
+                         01000000 0 00000000 e3000000 0 01000000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008600 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
 };
index 481099756e44af714a84fa57a4f2234f2c101302..e5a84ef9f4b074318bf14e41fef517261a13d7c0 100644 (file)
@@ -29,7 +29,6 @@
                        timebase-frequency = <0>;       // from bootloader
                        bus-frequency = <0>;            // from bootloader
                        clock-frequency = <0>;          // from bootloader
-                       32-bit;
                };
        };
 
@@ -46,7 +45,6 @@
        soc8349@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
 
                spi@7000 {
                        device_type = "spi";
-                       compatible = "mpc83xx_spi";
+                       compatible = "fsl_spi";
                        reg = <7000 1000>;
                        interrupts = <10 8>;
                        interrupt-parent = < &ipic >;
-                       mode = <0>;
+                       mode = "cpu";
                };
 
                /* phy type (ULPI or SERIAL) are only types supportted for MPH */
                        interrupts = <20 8 21 8 22 8>;
                        interrupt-parent = < &ipic >;
                        phy-handle = < &phy0 >;
+                       linux,network-index = <0>;
                };
 
                ethernet@25000 {
                        interrupts = <23 8 24 8 25 8>;
                        interrupt-parent = < &ipic >;
                        phy-handle = < &phy1 >;
+                       linux,network-index = <1>;
                };
 
                serial@4500 {
                        interrupt-parent = < &ipic >;
                };
 
-               pci@8500 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                                       /* IDSEL 0x11 */
-                                        8800 0 0 1 &ipic 14 8
-                                        8800 0 0 2 &ipic 15 8
-                                        8800 0 0 3 &ipic 16 8
-                                        8800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x12 */
-                                        9000 0 0 1 &ipic 16 8
-                                        9000 0 0 2 &ipic 17 8
-                                        9000 0 0 3 &ipic 14 8
-                                        9000 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x13 */
-                                        9800 0 0 1 &ipic 17 8
-                                        9800 0 0 2 &ipic 14 8
-                                        9800 0 0 3 &ipic 15 8
-                                        9800 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x15 */
-                                        a800 0 0 1 &ipic 14 8
-                                        a800 0 0 2 &ipic 15 8
-                                        a800 0 0 3 &ipic 16 8
-                                        a800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x16 */
-                                        b000 0 0 1 &ipic 17 8
-                                        b000 0 0 2 &ipic 14 8
-                                        b000 0 0 3 &ipic 15 8
-                                        b000 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x17 */
-                                        b800 0 0 1 &ipic 16 8
-                                        b800 0 0 2 &ipic 17 8
-                                        b800 0 0 3 &ipic 14 8
-                                        b800 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x18 */
-                                        c000 0 0 1 &ipic 15 8
-                                        c000 0 0 2 &ipic 16 8
-                                        c000 0 0 3 &ipic 17 8
-                                        c000 0 0 4 &ipic 14 8>;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 90000000 90000000 0 10000000
-                                 42000000 0 80000000 80000000 0 10000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8500 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
-               pci@8600 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                                       /* IDSEL 0x11 */
-                                        8800 0 0 1 &ipic 14 8
-                                        8800 0 0 2 &ipic 15 8
-                                        8800 0 0 3 &ipic 16 8
-                                        8800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x12 */
-                                        9000 0 0 1 &ipic 16 8
-                                        9000 0 0 2 &ipic 17 8
-                                        9000 0 0 3 &ipic 14 8
-                                        9000 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x13 */
-                                        9800 0 0 1 &ipic 17 8
-                                        9800 0 0 2 &ipic 14 8
-                                        9800 0 0 3 &ipic 15 8
-                                        9800 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x15 */
-                                        a800 0 0 1 &ipic 14 8
-                                        a800 0 0 2 &ipic 15 8
-                                        a800 0 0 3 &ipic 16 8
-                                        a800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x16 */
-                                        b000 0 0 1 &ipic 17 8
-                                        b000 0 0 2 &ipic 14 8
-                                        b000 0 0 3 &ipic 15 8
-                                        b000 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x17 */
-                                        b800 0 0 1 &ipic 16 8
-                                        b800 0 0 2 &ipic 17 8
-                                        b800 0 0 3 &ipic 14 8
-                                        b800 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x18 */
-                                        c000 0 0 1 &ipic 15 8
-                                        c000 0 0 2 &ipic 16 8
-                                        c000 0 0 3 &ipic 17 8
-                                        c000 0 0 4 &ipic 14 8>;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 b0000000 b0000000 0 10000000
-                                 42000000 0 a0000000 a0000000 0 10000000
-                                 01000000 0 00000000 e2100000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8600 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                /* May need to remove if on a part without crypto engine */
                crypto@30000 {
                        device_type = "crypto";
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
        };
+
+       pci@e0008500 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                               /* IDSEL 0x11 */
+                                8800 0 0 1 &ipic 14 8
+                                8800 0 0 2 &ipic 15 8
+                                8800 0 0 3 &ipic 16 8
+                                8800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x12 */
+                                9000 0 0 1 &ipic 16 8
+                                9000 0 0 2 &ipic 17 8
+                                9000 0 0 3 &ipic 14 8
+                                9000 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x13 */
+                                9800 0 0 1 &ipic 17 8
+                                9800 0 0 2 &ipic 14 8
+                                9800 0 0 3 &ipic 15 8
+                                9800 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x15 */
+                                a800 0 0 1 &ipic 14 8
+                                a800 0 0 2 &ipic 15 8
+                                a800 0 0 3 &ipic 16 8
+                                a800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x16 */
+                                b000 0 0 1 &ipic 17 8
+                                b000 0 0 2 &ipic 14 8
+                                b000 0 0 3 &ipic 15 8
+                                b000 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x17 */
+                                b800 0 0 1 &ipic 16 8
+                                b800 0 0 2 &ipic 17 8
+                                b800 0 0 3 &ipic 14 8
+                                b800 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x18 */
+                                c000 0 0 1 &ipic 15 8
+                                c000 0 0 2 &ipic 16 8
+                                c000 0 0 3 &ipic 17 8
+                                c000 0 0 4 &ipic 14 8>;
+               interrupt-parent = < &ipic >;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 90000000 90000000 0 10000000
+                         42000000 0 80000000 80000000 0 10000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008500 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
+
+       pci@e0008600 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                               /* IDSEL 0x11 */
+                                8800 0 0 1 &ipic 14 8
+                                8800 0 0 2 &ipic 15 8
+                                8800 0 0 3 &ipic 16 8
+                                8800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x12 */
+                                9000 0 0 1 &ipic 16 8
+                                9000 0 0 2 &ipic 17 8
+                                9000 0 0 3 &ipic 14 8
+                                9000 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x13 */
+                                9800 0 0 1 &ipic 17 8
+                                9800 0 0 2 &ipic 14 8
+                                9800 0 0 3 &ipic 15 8
+                                9800 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x15 */
+                                a800 0 0 1 &ipic 14 8
+                                a800 0 0 2 &ipic 15 8
+                                a800 0 0 3 &ipic 16 8
+                                a800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x16 */
+                                b000 0 0 1 &ipic 17 8
+                                b000 0 0 2 &ipic 14 8
+                                b000 0 0 3 &ipic 15 8
+                                b000 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x17 */
+                                b800 0 0 1 &ipic 16 8
+                                b800 0 0 2 &ipic 17 8
+                                b800 0 0 3 &ipic 14 8
+                                b800 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x18 */
+                                c000 0 0 1 &ipic 15 8
+                                c000 0 0 2 &ipic 16 8
+                                c000 0 0 3 &ipic 17 8
+                                c000 0 0 4 &ipic 14 8>;
+               interrupt-parent = < &ipic >;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 b0000000 b0000000 0 10000000
+                         42000000 0 a0000000 a0000000 0 10000000
+                         01000000 0 00000000 e2100000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008600 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
+       };
 };
index e3f7c128206889b7ae4c6cc8c82f9705b769e19f..fbd1573c348b5601bab89a5cbca5b15d7b1521ca 100644 (file)
@@ -34,7 +34,6 @@
                        timebase-frequency = <3EF1480>;
                        bus-frequency = <FBC5200>;
                        clock-frequency = <1F78A400>;
-                       32-bit;
                };
        };
 
@@ -51,7 +50,6 @@
        soc8360@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
                        descriptor-types-mask = <01010ebf>;
                };
 
-               pci@8500 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                                       /* IDSEL 0x11 AD17 */
-                                        8800 0 0 1 &ipic 14 8
-                                        8800 0 0 2 &ipic 15 8
-                                        8800 0 0 3 &ipic 16 8
-                                        8800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x12 AD18 */
-                                        9000 0 0 1 &ipic 16 8
-                                        9000 0 0 2 &ipic 17 8
-                                        9000 0 0 3 &ipic 14 8
-                                        9000 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x13 AD19 */
-                                        9800 0 0 1 &ipic 17 8
-                                        9800 0 0 2 &ipic 14 8
-                                        9800 0 0 3 &ipic 15 8
-                                        9800 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x15 AD21*/
-                                        a800 0 0 1 &ipic 14 8
-                                        a800 0 0 2 &ipic 15 8
-                                        a800 0 0 3 &ipic 16 8
-                                        a800 0 0 4 &ipic 17 8
-
-                                       /* IDSEL 0x16 AD22*/
-                                        b000 0 0 1 &ipic 17 8
-                                        b000 0 0 2 &ipic 14 8
-                                        b000 0 0 3 &ipic 15 8
-                                        b000 0 0 4 &ipic 16 8
-
-                                       /* IDSEL 0x17 AD23*/
-                                        b800 0 0 1 &ipic 16 8
-                                        b800 0 0 2 &ipic 17 8
-                                        b800 0 0 3 &ipic 14 8
-                                        b800 0 0 4 &ipic 15 8
-
-                                       /* IDSEL 0x18 AD24*/
-                                        c000 0 0 1 &ipic 15 8
-                                        c000 0 0 2 &ipic 16 8
-                                        c000 0 0 3 &ipic 17 8
-                                        c000 0 0 4 &ipic 14 8>;
-                       interrupt-parent = < &ipic >;
-                       interrupts = <42 8>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 a0000000 a0000000 0 10000000
-                                 42000000 0 80000000 80000000 0 10000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8500 100>;
-                       compatible = "fsl,mpc8349-pci";
-                       device_type = "pci";
-               };
-
                ipic: pic@700 {
                        interrupt-controller;
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <700 100>;
-                       built-in;
                        device_type = "ipic";
                };
 
                        #address-cells = <0>;
                        #interrupt-cells = <1>;
                        reg = <80 80>;
-                       built-in;
                        big-endian;
                        interrupts = <20 8 21 8>; //high:32 low:33
                        interrupt-parent = < &ipic >;
                };
+       };
 
+       pci@e0008500 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                               /* IDSEL 0x11 AD17 */
+                                8800 0 0 1 &ipic 14 8
+                                8800 0 0 2 &ipic 15 8
+                                8800 0 0 3 &ipic 16 8
+                                8800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x12 AD18 */
+                                9000 0 0 1 &ipic 16 8
+                                9000 0 0 2 &ipic 17 8
+                                9000 0 0 3 &ipic 14 8
+                                9000 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x13 AD19 */
+                                9800 0 0 1 &ipic 17 8
+                                9800 0 0 2 &ipic 14 8
+                                9800 0 0 3 &ipic 15 8
+                                9800 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x15 AD21*/
+                                a800 0 0 1 &ipic 14 8
+                                a800 0 0 2 &ipic 15 8
+                                a800 0 0 3 &ipic 16 8
+                                a800 0 0 4 &ipic 17 8
+
+                               /* IDSEL 0x16 AD22*/
+                                b000 0 0 1 &ipic 17 8
+                                b000 0 0 2 &ipic 14 8
+                                b000 0 0 3 &ipic 15 8
+                                b000 0 0 4 &ipic 16 8
+
+                               /* IDSEL 0x17 AD23*/
+                                b800 0 0 1 &ipic 16 8
+                                b800 0 0 2 &ipic 17 8
+                                b800 0 0 3 &ipic 14 8
+                                b800 0 0 4 &ipic 15 8
+
+                               /* IDSEL 0x18 AD24*/
+                                c000 0 0 1 &ipic 15 8
+                                c000 0 0 2 &ipic 16 8
+                                c000 0 0 3 &ipic 17 8
+                                c000 0 0 4 &ipic 14 8>;
+               interrupt-parent = < &ipic >;
+               interrupts = <42 8>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 a0000000 a0000000 0 10000000
+                         42000000 0 80000000 80000000 0 10000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008500 100>;
+               compatible = "fsl,mpc8349-pci";
+               device_type = "pci";
        };
 };
index fc8dff9f6201e334a55b02bcc99fafad677f0f8c..6442a717ec3bf7532477372b9fd74b5f8a92d167 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;       //  33 MHz, from uboot
                        bus-frequency = <0>;    // 166 MHz
                        clock-frequency = <0>;  // 825 MHz, from uboot
-                       32-bit;
                };
        };
 
@@ -42,7 +41,6 @@
        soc8540@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00100000>;      // CCSRBAR 1M
                        interrupts = <2a 2>;
                        interrupt-parent = <&mpic>;
                };
-               pci@8000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                       big-endian;
+               };
+       };
 
-                               /* IDSEL 0x02 */
-                               1000 0 0 1 &mpic 1 1
-                               1000 0 0 2 &mpic 2 1
-                               1000 0 0 3 &mpic 3 1
-                               1000 0 0 4 &mpic 4 1
+       pci@e0008000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
 
-                               /* IDSEL 0x03 */
-                               1800 0 0 1 &mpic 4 1
-                               1800 0 0 2 &mpic 1 1
-                               1800 0 0 3 &mpic 2 1
-                               1800 0 0 4 &mpic 3 1
+                       /* IDSEL 0x02 */
+                       1000 0 0 1 &mpic 1 1
+                       1000 0 0 2 &mpic 2 1
+                       1000 0 0 3 &mpic 3 1
+                       1000 0 0 4 &mpic 4 1
 
-                               /* IDSEL 0x04 */
-                               2000 0 0 1 &mpic 3 1
-                               2000 0 0 2 &mpic 4 1
-                               2000 0 0 3 &mpic 1 1
-                               2000 0 0 4 &mpic 2 1
+                       /* IDSEL 0x03 */
+                       1800 0 0 1 &mpic 4 1
+                       1800 0 0 2 &mpic 1 1
+                       1800 0 0 3 &mpic 2 1
+                       1800 0 0 4 &mpic 3 1
 
-                               /* IDSEL 0x05 */
-                               2800 0 0 1 &mpic 2 1
-                               2800 0 0 2 &mpic 3 1
-                               2800 0 0 3 &mpic 4 1
-                               2800 0 0 4 &mpic 1 1
+                       /* IDSEL 0x04 */
+                       2000 0 0 1 &mpic 3 1
+                       2000 0 0 2 &mpic 4 1
+                       2000 0 0 3 &mpic 1 1
+                       2000 0 0 4 &mpic 2 1
 
-                               /* IDSEL 0x0c */
-                               6000 0 0 1 &mpic 1 1
-                               6000 0 0 2 &mpic 2 1
-                               6000 0 0 3 &mpic 3 1
-                               6000 0 0 4 &mpic 4 1
+                       /* IDSEL 0x05 */
+                       2800 0 0 1 &mpic 2 1
+                       2800 0 0 2 &mpic 3 1
+                       2800 0 0 3 &mpic 4 1
+                       2800 0 0 4 &mpic 1 1
 
-                               /* IDSEL 0x0d */
-                               6800 0 0 1 &mpic 4 1
-                               6800 0 0 2 &mpic 1 1
-                               6800 0 0 3 &mpic 2 1
-                               6800 0 0 4 &mpic 3 1
+                       /* IDSEL 0x0c */
+                       6000 0 0 1 &mpic 1 1
+                       6000 0 0 2 &mpic 2 1
+                       6000 0 0 3 &mpic 3 1
+                       6000 0 0 4 &mpic 4 1
 
-                               /* IDSEL 0x0e */
-                               7000 0 0 1 &mpic 3 1
-                               7000 0 0 2 &mpic 4 1
-                               7000 0 0 3 &mpic 1 1
-                               7000 0 0 4 &mpic 2 1
+                       /* IDSEL 0x0d */
+                       6800 0 0 1 &mpic 4 1
+                       6800 0 0 2 &mpic 1 1
+                       6800 0 0 3 &mpic 2 1
+                       6800 0 0 4 &mpic 3 1
 
-                               /* IDSEL 0x0f */
-                               7800 0 0 1 &mpic 2 1
-                               7800 0 0 2 &mpic 3 1
-                               7800 0 0 3 &mpic 4 1
-                               7800 0 0 4 &mpic 1 1
+                       /* IDSEL 0x0e */
+                       7000 0 0 1 &mpic 3 1
+                       7000 0 0 2 &mpic 4 1
+                       7000 0 0 3 &mpic 1 1
+                       7000 0 0 4 &mpic 2 1
 
-                               /* IDSEL 0x12 */
-                               9000 0 0 1 &mpic 1 1
-                               9000 0 0 2 &mpic 2 1
-                               9000 0 0 3 &mpic 3 1
-                               9000 0 0 4 &mpic 4 1
+                       /* IDSEL 0x0f */
+                       7800 0 0 1 &mpic 2 1
+                       7800 0 0 2 &mpic 3 1
+                       7800 0 0 3 &mpic 4 1
+                       7800 0 0 4 &mpic 1 1
 
-                               /* IDSEL 0x13 */
-                               9800 0 0 1 &mpic 4 1
-                               9800 0 0 2 &mpic 1 1
-                               9800 0 0 3 &mpic 2 1
-                               9800 0 0 4 &mpic 3 1
+                       /* IDSEL 0x12 */
+                       9000 0 0 1 &mpic 1 1
+                       9000 0 0 2 &mpic 2 1
+                       9000 0 0 3 &mpic 3 1
+                       9000 0 0 4 &mpic 4 1
 
-                               /* IDSEL 0x14 */
-                               a000 0 0 1 &mpic 3 1
-                               a000 0 0 2 &mpic 4 1
-                               a000 0 0 3 &mpic 1 1
-                               a000 0 0 4 &mpic 2 1
+                       /* IDSEL 0x13 */
+                       9800 0 0 1 &mpic 4 1
+                       9800 0 0 2 &mpic 1 1
+                       9800 0 0 3 &mpic 2 1
+                       9800 0 0 4 &mpic 3 1
 
-                               /* IDSEL 0x15 */
-                               a800 0 0 1 &mpic 2 1
-                               a800 0 0 2 &mpic 3 1
-                               a800 0 0 3 &mpic 4 1
-                               a800 0 0 4 &mpic 1 1>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8000 1000>;
-                       compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
-                       device_type = "pci";
-               };
+                       /* IDSEL 0x14 */
+                       a000 0 0 1 &mpic 3 1
+                       a000 0 0 2 &mpic 4 1
+                       a000 0 0 3 &mpic 1 1
+                       a000 0 0 4 &mpic 2 1
 
-               mpic: pic@40000 {
-                       clock-frequency = <0>;
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <40000 40000>;
-                       built-in;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-                       big-endian;
-               };
+                       /* IDSEL 0x15 */
+                       a800 0 0 1 &mpic 2 1
+                       a800 0 0 2 &mpic 3 1
+                       a800 0 0 3 &mpic 4 1
+                       a800 0 0 4 &mpic 1 1>;
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+               compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
+               device_type = "pci";
        };
 };
index fb0b647f8c2a69966e21ae36418a19fbddc8a144..f3f4d79deb636f3442b58cd87f206e269e3b8e01 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;       //  33 MHz, from uboot
                        bus-frequency = <0>;    // 166 MHz
                        clock-frequency = <0>;  // 825 MHz, from uboot
-                       32-bit;
                };
        };
 
        soc8541@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
-               reg = <e0000000 00100000>;      // CCSRBAR 1M
+               reg = <e0000000 00001000>;      // CCSRBAR 1M
                bus-frequency = <0>;
 
                memory-controller@2000 {
                        interrupt-parent = <&mpic>;
                };
 
-               pci1: pci@8000 {
-                       interrupt-map-mask = <1f800 0 0 7>;
-                       interrupt-map = <
-
-                               /* IDSEL 0x10 */
-                               08000 0 0 1 &mpic 0 1
-                               08000 0 0 2 &mpic 1 1
-                               08000 0 0 3 &mpic 2 1
-                               08000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x11 */
-                               08800 0 0 1 &mpic 0 1
-                               08800 0 0 2 &mpic 1 1
-                               08800 0 0 3 &mpic 2 1
-                               08800 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x12 (Slot 1) */
-                               09000 0 0 1 &mpic 0 1
-                               09000 0 0 2 &mpic 1 1
-                               09000 0 0 3 &mpic 2 1
-                               09000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x13 (Slot 2) */
-                               09800 0 0 1 &mpic 1 1
-                               09800 0 0 2 &mpic 2 1
-                               09800 0 0 3 &mpic 3 1
-                               09800 0 0 4 &mpic 0 1
-
-                               /* IDSEL 0x14 (Slot 3) */
-                               0a000 0 0 1 &mpic 2 1
-                               0a000 0 0 2 &mpic 3 1
-                               0a000 0 0 3 &mpic 0 1
-                               0a000 0 0 4 &mpic 1 1
-
-                               /* IDSEL 0x15 (Slot 4) */
-                               0a800 0 0 1 &mpic 3 1
-                               0a800 0 0 2 &mpic 0 1
-                               0a800 0 0 3 &mpic 1 1
-                               0a800 0 0 4 &mpic 2 1
-
-                               /* Bus 1 (Tundra Bridge) */
-                               /* IDSEL 0x12 (ISA bridge) */
-                               19000 0 0 1 &mpic 0 1
-                               19000 0 0 2 &mpic 1 1
-                               19000 0 0 3 &mpic 2 1
-                               19000 0 0 4 &mpic 3 1>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8000 1000>;
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
-
-                       i8259@19000 {
-                               clock-frequency = <0>;
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                        big-endian;
+               };
+
+               cpm@919c0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,mpc8541-cpm", "fsl,cpm2";
+                       reg = <919c0 30>;
+                       ranges;
+
+                       muram@80000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 80000 10000>;
+
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 2000 9000 1000>;
+                               };
+                       };
+
+                       brg@919f0 {
+                               compatible = "fsl,mpc8541-brg",
+                                            "fsl,cpm2-brg",
+                                            "fsl,cpm-brg";
+                               reg = <919f0 10 915f0 10>;
+                       };
+
+                       cpmpic: pic@90c00 {
                                interrupt-controller;
-                               device_type = "interrupt-controller";
-                               reg = <19000 0 0 0 1>;
                                #address-cells = <0>;
                                #interrupt-cells = <2>;
-                               built-in;
-                               compatible = "chrp,iic";
-                               big-endian;
-                               interrupts = <1>;
-                               interrupt-parent = <&pci1>;
+                               interrupts = <2e 2>;
+                               interrupt-parent = <&mpic>;
+                               reg = <90c00 80>;
+                               compatible = "fsl,mpc8541-cpm-pic", "fsl,cpm2-pic";
                        };
                };
+       };
 
-               pci@9000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
+       pci1: pci@e0008000 {
+               interrupt-map-mask = <1f800 0 0 7>;
+               interrupt-map = <
 
-                               /* IDSEL 0x15 */
-                               a800 0 0 1 &mpic b 1
-                               a800 0 0 2 &mpic b 1
-                               a800 0 0 3 &mpic b 1
-                               a800 0 0 4 &mpic b 1>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <19 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 a0000000 a0000000 0 20000000
-                                 01000000 0 00000000 e3000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <9000 1000>;
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
-               };
+                       /* IDSEL 0x10 */
+                       08000 0 0 1 &mpic 0 1
+                       08000 0 0 2 &mpic 1 1
+                       08000 0 0 3 &mpic 2 1
+                       08000 0 0 4 &mpic 3 1
 
-               mpic: pic@40000 {
-                       clock-frequency = <0>;
+                       /* IDSEL 0x11 */
+                       08800 0 0 1 &mpic 0 1
+                       08800 0 0 2 &mpic 1 1
+                       08800 0 0 3 &mpic 2 1
+                       08800 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x12 (Slot 1) */
+                       09000 0 0 1 &mpic 0 1
+                       09000 0 0 2 &mpic 1 1
+                       09000 0 0 3 &mpic 2 1
+                       09000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x13 (Slot 2) */
+                       09800 0 0 1 &mpic 1 1
+                       09800 0 0 2 &mpic 2 1
+                       09800 0 0 3 &mpic 3 1
+                       09800 0 0 4 &mpic 0 1
+
+                       /* IDSEL 0x14 (Slot 3) */
+                       0a000 0 0 1 &mpic 2 1
+                       0a000 0 0 2 &mpic 3 1
+                       0a000 0 0 3 &mpic 0 1
+                       0a000 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x15 (Slot 4) */
+                       0a800 0 0 1 &mpic 3 1
+                       0a800 0 0 2 &mpic 0 1
+                       0a800 0 0 3 &mpic 1 1
+                       0a800 0 0 4 &mpic 2 1
+
+                       /* Bus 1 (Tundra Bridge) */
+                       /* IDSEL 0x12 (ISA bridge) */
+                       19000 0 0 1 &mpic 0 1
+                       19000 0 0 2 &mpic 1 1
+                       19000 0 0 3 &mpic 2 1
+                       19000 0 0 4 &mpic 3 1>;
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+
+               i8259@19000 {
                        interrupt-controller;
+                       device_type = "interrupt-controller";
+                       reg = <19000 0 0 0 1>;
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
-                       reg = <40000 40000>;
-                       built-in;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-                        big-endian;
+                       compatible = "chrp,iic";
+                       interrupts = <1>;
+                       interrupt-parent = <&pci1>;
                };
        };
+
+       pci@e0009000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                       /* IDSEL 0x15 */
+                       a800 0 0 1 &mpic b 1
+                       a800 0 0 2 &mpic b 1
+                       a800 0 0 3 &mpic b 1
+                       a800 0 0 4 &mpic b 1>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 e3000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0009000 1000>;
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+       };
 };
index 3e79bf0a3159c8422281f73d99a1586ee5f072f2..3f9d15cf13e0121e919a037b8d686ea6425b9360 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;
                        bus-frequency = <0>;
                        clock-frequency = <0>;
-                       32-bit;
                };
        };
 
        soc8544@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
 
-
-               ranges = <00001000 e0001000 000ff000
-                         80000000 80000000 20000000
-                         a0000000 a0000000 10000000
-                         b0000000 b0000000 00100000
-                         c0000000 c0000000 20000000
-                         b0100000 b0100000 00100000
-                         e1000000 e1000000 00010000
-                         e1010000 e1010000 00010000
-                         e1020000 e1020000 00010000>;
+               ranges = <00000000 e0000000 00100000>;
                reg = <e0000000 00001000>;      // CCSRBAR 1M
                bus-frequency = <0>;            // Filled out by uboot.
 
                        interrupt-parent = <&mpic>;
                };
 
-               pci@8000 {
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                               /* IDSEL 0x11 J17 Slot 1 */
-                               8800 0 0 1 &mpic 2 1
-                               8800 0 0 2 &mpic 3 1
-                               8800 0 0 3 &mpic 4 1
-                               8800 0 0 4 &mpic 1 1
+               global-utilities@e0000 {        //global utilities block
+                       compatible = "fsl,mpc8548-guts";
+                       reg = <e0000 1000>;
+                       fsl,has-rstcr;
+               };
 
-                               /* IDSEL 0x12 J16 Slot 2 */
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                       big-endian;
+               };
+       };
 
-                               9000 0 0 1 &mpic 3 1
-                               9000 0 0 2 &mpic 4 1
-                               9000 0 0 3 &mpic 2 1
-                               9000 0 0 4 &mpic 1 1>;
+       pci@e0008000 {
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                       /* IDSEL 0x11 J17 Slot 1 */
+                       8800 0 0 1 &mpic 2 1
+                       8800 0 0 2 &mpic 3 1
+                       8800 0 0 3 &mpic 4 1
+                       8800 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x12 J16 Slot 2 */
+
+                       9000 0 0 1 &mpic 3 1
+                       9000 0 0 2 &mpic 4 1
+                       9000 0 0 3 &mpic 2 1
+                       9000 0 0 4 &mpic 1 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 c0000000 c0000000 0 20000000
+                         01000000 0 00000000 e1000000 0 00010000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+       };
 
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 c0000000 c0000000 0 20000000
-                                 01000000 0 00000000 e1000000 0 00010000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
+       pcie@e0009000 {
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0009000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e1010000 0 00010000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <1a 2>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0 0 1 &mpic 4 1
+                       0000 0 0 2 &mpic 5 1
+                       0000 0 0 3 &mpic 6 1
+                       0000 0 0 4 &mpic 7 1
+                       >;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <8000 1000>;
-               };
-
-               pcie@9000 {
-                       compatible = "fsl,mpc8548-pcie";
                        device_type = "pci";
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <9000 1000>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e1010000 0 00010000>;
-                       clock-frequency = <1fca055>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <1a 2>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                               /* IDSEL 0x0 */
-                               0000 0 0 1 &mpic 4 1
-                               0000 0 0 2 &mpic 5 1
-                               0000 0 0 3 &mpic 6 1
-                               0000 0 0 4 &mpic 7 1
-                               >;
+                       ranges = <02000000 0 80000000
+                                 02000000 0 80000000
+                                 0 20000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00010000>;
                };
+       };
 
-               pcie@a000 {
-                       compatible = "fsl,mpc8548-pcie";
-                       device_type = "pci";
-                       #interrupt-cells = <1>;
+       pcie@e000a000 {
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e000a000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 a0000000 a0000000 0 10000000
+                         01000000 0 00000000 e1020000 0 00010000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0 0 1 &mpic 0 1
+                       0000 0 0 2 &mpic 1 1
+                       0000 0 0 3 &mpic 2 1
+                       0000 0 0 4 &mpic 3 1
+                       >;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <a000 1000>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 a0000000 a0000000 0 10000000
-                                 01000000 0 00000000 e1020000 0 00010000>;
-                       clock-frequency = <1fca055>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <19 2>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                               /* IDSEL 0x0 */
-                               0000 0 0 1 &mpic 0 1
-                               0000 0 0 2 &mpic 1 1
-                               0000 0 0 3 &mpic 2 1
-                               0000 0 0 4 &mpic 3 1
-                               >;
+                       device_type = "pci";
+                       ranges = <02000000 0 a0000000
+                                 02000000 0 a0000000
+                                 0 10000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00010000>;
                };
+       };
 
-               pcie@b000 {
-                       compatible = "fsl,mpc8548-pcie";
-                       device_type = "pci";
-                       #interrupt-cells = <1>;
+       pcie@e000b000 {
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e000b000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 b0000000 b0000000 0 00100000
+                         01000000 0 00000000 b0100000 0 00100000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <1b 2>;
+               interrupt-map-mask = <fb00 0 0 0>;
+               interrupt-map = <
+                       // IDSEL 0x1c  USB
+                       e000 0 0 0 &i8259 c 2
+                       e100 0 0 0 &i8259 9 2
+                       e200 0 0 0 &i8259 a 2
+                       e300 0 0 0 &i8259 b 2
+
+                       // IDSEL 0x1d  Audio
+                       e800 0 0 0 &i8259 6 2
+
+                       // IDSEL 0x1e Legacy
+                       f000 0 0 0 &i8259 7 2
+                       f100 0 0 0 &i8259 7 2
+
+                       // IDSEL 0x1f IDE/SATA
+                       f800 0 0 0 &i8259 e 2
+                       f900 0 0 0 &i8259 5 2
+               >;
+
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <b000 1000>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 b0000000 b0000000 0 00100000
-                                 01000000 0 00000000 b0100000 0 00100000>;
-                       clock-frequency = <1fca055>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <1b 2>;
-                       interrupt-map-mask = <fb00 0 0 0>;
-                       interrupt-map = <
-                               // IDSEL 0x1c  USB
-                               e000 0 0 0 &i8259 c 2
-                               e100 0 0 0 &i8259 9 2
-                               e200 0 0 0 &i8259 a 2
-                               e300 0 0 0 &i8259 b 2
-
-                               // IDSEL 0x1d  Audio
-                               e800 0 0 0 &i8259 6 2
-
-                               // IDSEL 0x1e Legacy
-                               f000 0 0 0 &i8259 7 2
-                               f100 0 0 0 &i8259 7 2
-
-                               // IDSEL 0x1f IDE/SATA
-                               f800 0 0 0 &i8259 e 2
-                               f900 0 0 0 &i8259 5 2
-                       >;
+                       device_type = "pci";
+                       ranges = <02000000 0 b0000000
+                                 02000000 0 b0000000
+                                 0 00100000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
+
                        uli1575@0 {
                                reg = <0 0 0 0 0>;
                                #size-cells = <2>;
                                ranges = <02000000 0 b0000000
                                          02000000 0 b0000000
                                          0 00100000
+
                                          01000000 0 00000000
                                          01000000 0 00000000
                                          0 00100000>;
-
-                               pci_bridge@0 {
-                                       reg = <0 0 0 0 0>;
-                                       #size-cells = <2>;
-                                       #address-cells = <3>;
-                                       ranges = <02000000 0 b0000000
-                                                 02000000 0 b0000000
-                                                 0 00100000
-                                                 01000000 0 00000000
-                                                 01000000 0 00000000
-                                                 0 00100000>; 
-
-                                       isa@1e {
-                                               device_type = "isa";
+                               isa@1e {
+                                       device_type = "isa";
+                                       #interrupt-cells = <2>;
+                                       #size-cells = <1>;
+                                       #address-cells = <2>;
+                                       reg = <f000 0 0 0 0>;
+                                       ranges = <1 0
+                                                 01000000 0 0
+                                                 00001000>;
+                                       interrupt-parent = <&i8259>;
+
+                                       i8259: interrupt-controller@20 {
+                                               reg = <1 20 2
+                                                      1 a0 2
+                                                      1 4d0 2>;
+                                               interrupt-controller;
+                                               device_type = "interrupt-controller";
+                                               #address-cells = <0>;
                                                #interrupt-cells = <2>;
-                                               #size-cells = <1>;
-                                               #address-cells = <2>;
-                                               reg = <f000 0 0 0 0>;
-                                               ranges = <1 0
-                                                         01000000 0 0
-                                                         00001000>;
+                                               compatible = "chrp,iic";
+                                               interrupts = <9 2>;
+                                               interrupt-parent = <&mpic>;
+                                       };
+
+                                       i8042@60 {
+                                               #size-cells = <0>;
+                                               #address-cells = <1>;
+                                               reg = <1 60 1 1 64 1>;
+                                               interrupts = <1 3 c 3>;
                                                interrupt-parent = <&i8259>;
 
-                                               i8259: interrupt-controller@20 {
-                                                       reg = <1 20 2
-                                                              1 a0 2
-                                                              1 4d0 2>;
-                                                       clock-frequency = <0>;
-                                                       interrupt-controller;
-                                                       device_type = "interrupt-controller";
-                                                       #address-cells = <0>;
-                                                       #interrupt-cells = <2>;
-                                                       built-in;
-                                                       compatible = "chrp,iic";
-                                                       interrupts = <9 2>;
-                                                       interrupt-parent = <&mpic>;
+                                               keyboard@0 {
+                                                       reg = <0>;
+                                                       compatible = "pnpPNP,303";
                                                };
 
-                                               i8042@60 {
-                                                       #size-cells = <0>;
-                                                       #address-cells = <1>;
-                                                       reg = <1 60 1 1 64 1>;
-                                                       interrupts = <1 3 c 3>;
-                                                       interrupt-parent = <&i8259>;
-
-                                                       keyboard@0 {
-                                                               reg = <0>;
-                                                               compatible = "pnpPNP,303";
-                                                       };
-
-                                                       mouse@1 {
-                                                               reg = <1>;
-                                                               compatible = "pnpPNP,f03";
-                                                       };
+                                               mouse@1 {
+                                                       reg = <1>;
+                                                       compatible = "pnpPNP,f03";
                                                };
+                                       };
 
-                                               rtc@70 {
-                                                       compatible = "pnpPNP,b00";
-                                                       reg = <1 70 2>;
-                                               };
+                                       rtc@70 {
+                                               compatible = "pnpPNP,b00";
+                                               reg = <1 70 2>;
+                                       };
 
-                                               gpio@400 {
-                                                       reg = <1 400 80>;
-                                               };
+                                       gpio@400 {
+                                               reg = <1 400 80>;
                                        };
                                };
                        };
-
                };
 
-               global-utilities@e0000 {        //global utilities block
-                       compatible = "fsl,mpc8548-guts";
-                       reg = <e0000 1000>;
-                       fsl,has-rstcr;
-               };
-
-               mpic: pic@40000 {
-                       clock-frequency = <0>;
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <40000 40000>;
-                       built-in;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-                       big-endian;
-               };
        };
 };
index d215d21fff42bdb01ffd7a09f881d379987d6ba0..69ca5025d9723cc143b2e0e711c4ba50d6f0304f 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;       //  33 MHz, from uboot
                        bus-frequency = <0>;    // 166 MHz
                        clock-frequency = <0>;  // 825 MHz, from uboot
-                       32-bit;
                };
        };
 
        soc8548@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
-               ranges = <00001000 e0001000 000ff000
-                         80000000 80000000 10000000
-                         e2000000 e2000000 00800000
-                         90000000 90000000 10000000
-                         e2800000 e2800000 00800000
-                         a0000000 a0000000 20000000
-                         e3000000 e3000000 01000000>;
+               ranges = <00000000 e0000000 00100000>;
                reg = <e0000000 00001000>;      // CCSRBAR
                bus-frequency = <0>;
 
                        fsl,has-rstcr;
                };
 
-               pci@8000 {
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                        big-endian;
+               };
+       };
+
+       pci@e0008000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x4 (PCIX Slot 2) */
+                       02000 0 0 1 &mpic 0 1
+                       02000 0 0 2 &mpic 1 1
+                       02000 0 0 3 &mpic 2 1
+                       02000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x5 (PCIX Slot 3) */
+                       02800 0 0 1 &mpic 1 1
+                       02800 0 0 2 &mpic 2 1
+                       02800 0 0 3 &mpic 3 1
+                       02800 0 0 4 &mpic 0 1
+
+                       /* IDSEL 0x6 (PCIX Slot 4) */
+                       03000 0 0 1 &mpic 2 1
+                       03000 0 0 2 &mpic 3 1
+                       03000 0 0 3 &mpic 0 1
+                       03000 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x8 (PCIX Slot 5) */
+                       04000 0 0 1 &mpic 0 1
+                       04000 0 0 2 &mpic 1 1
+                       04000 0 0 3 &mpic 2 1
+                       04000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0xC (Tsi310 bridge) */
+                       06000 0 0 1 &mpic 0 1
+                       06000 0 0 2 &mpic 1 1
+                       06000 0 0 3 &mpic 2 1
+                       06000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x14 (Slot 2) */
+                       0a000 0 0 1 &mpic 0 1
+                       0a000 0 0 2 &mpic 1 1
+                       0a000 0 0 3 &mpic 2 1
+                       0a000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x15 (Slot 3) */
+                       0a800 0 0 1 &mpic 1 1
+                       0a800 0 0 2 &mpic 2 1
+                       0a800 0 0 3 &mpic 3 1
+                       0a800 0 0 4 &mpic 0 1
+
+                       /* IDSEL 0x16 (Slot 4) */
+                       0b000 0 0 1 &mpic 2 1
+                       0b000 0 0 2 &mpic 3 1
+                       0b000 0 0 3 &mpic 0 1
+                       0b000 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x18 (Slot 5) */
+                       0c000 0 0 1 &mpic 0 1
+                       0c000 0 0 2 &mpic 1 1
+                       0c000 0 0 3 &mpic 2 1
+                       0c000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x1C (Tsi310 bridge PCI primary) */
+                       0E000 0 0 1 &mpic 0 1
+                       0E000 0 0 2 &mpic 1 1
+                       0E000 0 0 3 &mpic 2 1
+                       0E000 0 0 4 &mpic 3 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 80000000 80000000 0 10000000
+                         01000000 0 00000000 e2000000 0 00800000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+               compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
+               device_type = "pci";
+
+               pci_bridge@1c {
                        interrupt-map-mask = <f800 0 0 7>;
                        interrupt-map = <
-                               /* IDSEL 0x4 (PCIX Slot 2) */
-                               02000 0 0 1 &mpic 0 1
-                               02000 0 0 2 &mpic 1 1
-                               02000 0 0 3 &mpic 2 1
-                               02000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x5 (PCIX Slot 3) */
-                               02800 0 0 1 &mpic 1 1
-                               02800 0 0 2 &mpic 2 1
-                               02800 0 0 3 &mpic 3 1
-                               02800 0 0 4 &mpic 0 1
-
-                               /* IDSEL 0x6 (PCIX Slot 4) */
-                               03000 0 0 1 &mpic 2 1
-                               03000 0 0 2 &mpic 3 1
-                               03000 0 0 3 &mpic 0 1
-                               03000 0 0 4 &mpic 1 1
-
-                               /* IDSEL 0x8 (PCIX Slot 5) */
-                               04000 0 0 1 &mpic 0 1
-                               04000 0 0 2 &mpic 1 1
-                               04000 0 0 3 &mpic 2 1
-                               04000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0xC (Tsi310 bridge) */
-                               06000 0 0 1 &mpic 0 1
-                               06000 0 0 2 &mpic 1 1
-                               06000 0 0 3 &mpic 2 1
-                               06000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x14 (Slot 2) */
-                               0a000 0 0 1 &mpic 0 1
-                               0a000 0 0 2 &mpic 1 1
-                               0a000 0 0 3 &mpic 2 1
-                               0a000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x15 (Slot 3) */
-                               0a800 0 0 1 &mpic 1 1
-                               0a800 0 0 2 &mpic 2 1
-                               0a800 0 0 3 &mpic 3 1
-                               0a800 0 0 4 &mpic 0 1
-
-                               /* IDSEL 0x16 (Slot 4) */
-                               0b000 0 0 1 &mpic 2 1
-                               0b000 0 0 2 &mpic 3 1
-                               0b000 0 0 3 &mpic 0 1
-                               0b000 0 0 4 &mpic 1 1
-
-                               /* IDSEL 0x18 (Slot 5) */
-                               0c000 0 0 1 &mpic 0 1
-                               0c000 0 0 2 &mpic 1 1
-                               0c000 0 0 3 &mpic 2 1
-                               0c000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x1C (Tsi310 bridge PCI primary) */
-                               0E000 0 0 1 &mpic 0 1
-                               0E000 0 0 2 &mpic 1 1
-                               0E000 0 0 3 &mpic 2 1
-                               0E000 0 0 4 &mpic 3 1>;
 
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 80000000 80000000 0 10000000
-                                 01000000 0 00000000 e2000000 0 00800000>;
-                       clock-frequency = <3f940aa>;
+                               /* IDSEL 0x00 (PrPMC Site) */
+                               0000 0 0 1 &mpic 0 1
+                               0000 0 0 2 &mpic 1 1
+                               0000 0 0 3 &mpic 2 1
+                               0000 0 0 4 &mpic 3 1
+
+                               /* IDSEL 0x04 (VIA chip) */
+                               2000 0 0 1 &mpic 0 1
+                               2000 0 0 2 &mpic 1 1
+                               2000 0 0 3 &mpic 2 1
+                               2000 0 0 4 &mpic 3 1
+
+                               /* IDSEL 0x05 (8139) */
+                               2800 0 0 1 &mpic 1 1
+
+                               /* IDSEL 0x06 (Slot 6) */
+                               3000 0 0 1 &mpic 2 1
+                               3000 0 0 2 &mpic 3 1
+                               3000 0 0 3 &mpic 0 1
+                               3000 0 0 4 &mpic 1 1
+
+                               /* IDESL 0x07 (Slot 7) */
+                               3800 0 0 1 &mpic 3 1
+                               3800 0 0 2 &mpic 0 1
+                               3800 0 0 3 &mpic 1 1
+                               3800 0 0 4 &mpic 2 1>;
+
+                       reg = <e000 0 0 0 0>;
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <8000 1000>;
-                       compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
-                       device_type = "pci";
+                       ranges = <02000000 0 80000000
+                                 02000000 0 80000000
+                                 0 20000000
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00080000>;
+                       clock-frequency = <1fca055>;
 
-                       pci_bridge@1c {
-                               interrupt-map-mask = <f800 0 0 7>;
-                               interrupt-map = <
-
-                                       /* IDSEL 0x00 (PrPMC Site) */
-                                       0000 0 0 1 &mpic 0 1
-                                       0000 0 0 2 &mpic 1 1
-                                       0000 0 0 3 &mpic 2 1
-                                       0000 0 0 4 &mpic 3 1
-
-                                       /* IDSEL 0x04 (VIA chip) */
-                                       2000 0 0 1 &mpic 0 1
-                                       2000 0 0 2 &mpic 1 1
-                                       2000 0 0 3 &mpic 2 1
-                                       2000 0 0 4 &mpic 3 1
-
-                                       /* IDSEL 0x05 (8139) */
-                                       2800 0 0 1 &mpic 1 1
-
-                                       /* IDSEL 0x06 (Slot 6) */
-                                       3000 0 0 1 &mpic 2 1
-                                       3000 0 0 2 &mpic 3 1
-                                       3000 0 0 3 &mpic 0 1
-                                       3000 0 0 4 &mpic 1 1
-
-                                       /* IDESL 0x07 (Slot 7) */
-                                       3800 0 0 1 &mpic 3 1
-                                       3800 0 0 2 &mpic 0 1
-                                       3800 0 0 3 &mpic 1 1
-                                       3800 0 0 4 &mpic 2 1>;
-
-                               reg = <e000 0 0 0 0>;
-                               #interrupt-cells = <1>;
-                               #size-cells = <2>;
-                               #address-cells = <3>;
-                               ranges = <02000000 0 80000000
-                                         02000000 0 80000000
-                                         0 20000000
-                                         01000000 0 00000000
-                                         01000000 0 00000000
-                                         0 00080000>;
-                               clock-frequency = <1fca055>;
-
-                               isa@4 {
-                                       device_type = "isa";
+                       isa@4 {
+                               device_type = "isa";
+                               #interrupt-cells = <2>;
+                               #size-cells = <1>;
+                               #address-cells = <2>;
+                               reg = <2000 0 0 0 0>;
+                               ranges = <1 0 01000000 0 0 00001000>;
+                               interrupt-parent = <&i8259>;
+
+                               i8259: interrupt-controller@20 {
+                                       interrupt-controller;
+                                       device_type = "interrupt-controller";
+                                       reg = <1 20 2
+                                              1 a0 2
+                                              1 4d0 2>;
+                                       #address-cells = <0>;
                                        #interrupt-cells = <2>;
-                                       #size-cells = <1>;
-                                       #address-cells = <2>;
-                                       reg = <2000 0 0 0 0>;
-                                       ranges = <1 0 01000000 0 0 00001000>;
-                                       interrupt-parent = <&i8259>;
-
-                                       i8259: interrupt-controller@20 {
-                                               clock-frequency = <0>;
-                                               interrupt-controller;
-                                               device_type = "interrupt-controller";
-                                               reg = <1 20 2
-                                                      1 a0 2
-                                                      1 4d0 2>;
-                                               #address-cells = <0>;
-                                               #interrupt-cells = <2>;
-                                               built-in;
-                                               compatible = "chrp,iic";
-                                               interrupts = <0 1>;
-                                               interrupt-parent = <&mpic>;
-                                       };
-
-                                       rtc@70 {
-                                               compatible = "pnpPNP,b00";
-                                               reg = <1 70 2>;
-                                       };
+                                       compatible = "chrp,iic";
+                                       interrupts = <0 1>;
+                                       interrupt-parent = <&mpic>;
                                };
-                       };
-               };
 
-               pci@9000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                               /* IDSEL 0x15 */
-                               a800 0 0 1 &mpic b 1
-                               a800 0 0 2 &mpic 1 1
-                               a800 0 0 3 &mpic 2 1
-                               a800 0 0 4 &mpic 3 1>;
-
-                       interrupt-parent = <&mpic>;
-                       interrupts = <19 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 90000000 90000000 0 10000000
-                                 01000000 0 00000000 e2800000 0 00800000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <9000 1000>;
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
+                               rtc@70 {
+                                       compatible = "pnpPNP,b00";
+                                       reg = <1 70 2>;
+                               };
+                       };
                };
-               /* PCI Express */
-               pcie@a000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
+       };
 
-                               /* IDSEL 0x0 (PEX) */
-                               00000 0 0 1 &mpic 0 1
-                               00000 0 0 2 &mpic 1 1
-                               00000 0 0 3 &mpic 2 1
-                               00000 0 0 4 &mpic 3 1>;
+       pci@e0009000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                       /* IDSEL 0x15 */
+                       a800 0 0 1 &mpic b 1
+                       a800 0 0 2 &mpic 1 1
+                       a800 0 0 3 &mpic 2 1
+                       a800 0 0 4 &mpic 3 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 90000000 90000000 0 10000000
+                         01000000 0 00000000 e2800000 0 00800000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0009000 1000>;
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+       };
 
-                       interrupt-parent = <&mpic>;
-                       interrupts = <1a 2>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 a0000000 a0000000 0 20000000
-                                 01000000 0 00000000 e3000000 0 08000000>;
-                       clock-frequency = <1fca055>;
-                       #interrupt-cells = <1>;
+       pcie@e000a000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                       /* IDSEL 0x0 (PEX) */
+                       00000 0 0 1 &mpic 0 1
+                       00000 0 0 2 &mpic 1 1
+                       00000 0 0 3 &mpic 2 1
+                       00000 0 0 4 &mpic 3 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <1a 2>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 e3000000 0 08000000>;
+               clock-frequency = <1fca055>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e000a000 1000>;
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <a000 1000>;
-                       compatible = "fsl,mpc8548-pcie";
                        device_type = "pci";
-               };
+                       ranges = <02000000 0 a0000000
+                                 02000000 0 a0000000
+                                 0 20000000
 
-               mpic: pic@40000 {
-                       clock-frequency = <0>;
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <40000 40000>;
-                       built-in;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-                        big-endian;
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 08000000>;
                };
        };
 };
index c3c8882521216eb8e9abb3f86af968a56a02aaf0..57029cca32b2de2d4aa0e17a5039d3ab63ae9032 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;       //  33 MHz, from uboot
                        bus-frequency = <0>;    // 166 MHz
                        clock-frequency = <0>;  // 825 MHz, from uboot
-                       32-bit;
                };
        };
 
        soc8555@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
-               reg = <e0000000 00100000>;      // CCSRBAR 1M
+               reg = <e0000000 00001000>;      // CCSRBAR 1M
                bus-frequency = <0>;
 
                memory-controller@2000 {
                        interrupt-parent = <&mpic>;
                };
 
-               pci1: pci@8000 {
-                       interrupt-map-mask = <1f800 0 0 7>;
-                       interrupt-map = <
-
-                               /* IDSEL 0x10 */
-                               08000 0 0 1 &mpic 0 1
-                               08000 0 0 2 &mpic 1 1
-                               08000 0 0 3 &mpic 2 1
-                               08000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x11 */
-                               08800 0 0 1 &mpic 0 1
-                               08800 0 0 2 &mpic 1 1
-                               08800 0 0 3 &mpic 2 1
-                               08800 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x12 (Slot 1) */
-                               09000 0 0 1 &mpic 0 1
-                               09000 0 0 2 &mpic 1 1
-                               09000 0 0 3 &mpic 2 1
-                               09000 0 0 4 &mpic 3 1
-
-                               /* IDSEL 0x13 (Slot 2) */
-                               09800 0 0 1 &mpic 1 1
-                               09800 0 0 2 &mpic 2 1
-                               09800 0 0 3 &mpic 3 1
-                               09800 0 0 4 &mpic 0 1
-
-                               /* IDSEL 0x14 (Slot 3) */
-                               0a000 0 0 1 &mpic 2 1
-                               0a000 0 0 2 &mpic 3 1
-                               0a000 0 0 3 &mpic 0 1
-                               0a000 0 0 4 &mpic 1 1
-
-                               /* IDSEL 0x15 (Slot 4) */
-                               0a800 0 0 1 &mpic 3 1
-                               0a800 0 0 2 &mpic 0 1
-                               0a800 0 0 3 &mpic 1 1
-                               0a800 0 0 4 &mpic 2 1
-
-                               /* Bus 1 (Tundra Bridge) */
-                               /* IDSEL 0x12 (ISA bridge) */
-                               19000 0 0 1 &mpic 0 1
-                               19000 0 0 2 &mpic 1 1
-                               19000 0 0 3 &mpic 2 1
-                               19000 0 0 4 &mpic 3 1>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8000 1000>;
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
-
-                       i8259@19000 {
-                               clock-frequency = <0>;
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                        big-endian;
+               };
+
+               cpm@919c0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       compatible = "fsl,mpc8555-cpm", "fsl,cpm2";
+                       reg = <919c0 30>;
+                       ranges;
+
+                       muram@80000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 80000 10000>;
+
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 2000 9000 1000>;
+                               };
+                       };
+
+                       brg@919f0 {
+                               compatible = "fsl,mpc8555-brg",
+                                            "fsl,cpm2-brg",
+                                            "fsl,cpm-brg";
+                               reg = <919f0 10 915f0 10>;
+                       };
+
+                       cpmpic: pic@90c00 {
                                interrupt-controller;
-                               device_type = "interrupt-controller";
-                               reg = <19000 0 0 0 1>;
                                #address-cells = <0>;
                                #interrupt-cells = <2>;
-                               built-in;
-                               compatible = "chrp,iic";
-                               big-endian;
-                               interrupts = <1>;
-                               interrupt-parent = <&pci1>;
+                               interrupts = <2e 2>;
+                               interrupt-parent = <&mpic>;
+                               reg = <90c00 80>;
+                               compatible = "fsl,mpc8555-cpm-pic", "fsl,cpm2-pic";
                        };
                };
+       };
 
-               pci@9000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
+       pci1: pci@e0008000 {
+               interrupt-map-mask = <1f800 0 0 7>;
+               interrupt-map = <
 
-                               /* IDSEL 0x15 */
-                               a800 0 0 1 &mpic b 1
-                               a800 0 0 2 &mpic b 1
-                               a800 0 0 3 &mpic b 1
-                               a800 0 0 4 &mpic b 1>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <19 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 a0000000 a0000000 0 20000000
-                                 01000000 0 00000000 e3000000 0 00100000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <9000 1000>;
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
-               };
+                       /* IDSEL 0x10 */
+                       08000 0 0 1 &mpic 0 1
+                       08000 0 0 2 &mpic 1 1
+                       08000 0 0 3 &mpic 2 1
+                       08000 0 0 4 &mpic 3 1
 
-               mpic: pic@40000 {
-                       clock-frequency = <0>;
+                       /* IDSEL 0x11 */
+                       08800 0 0 1 &mpic 0 1
+                       08800 0 0 2 &mpic 1 1
+                       08800 0 0 3 &mpic 2 1
+                       08800 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x12 (Slot 1) */
+                       09000 0 0 1 &mpic 0 1
+                       09000 0 0 2 &mpic 1 1
+                       09000 0 0 3 &mpic 2 1
+                       09000 0 0 4 &mpic 3 1
+
+                       /* IDSEL 0x13 (Slot 2) */
+                       09800 0 0 1 &mpic 1 1
+                       09800 0 0 2 &mpic 2 1
+                       09800 0 0 3 &mpic 3 1
+                       09800 0 0 4 &mpic 0 1
+
+                       /* IDSEL 0x14 (Slot 3) */
+                       0a000 0 0 1 &mpic 2 1
+                       0a000 0 0 2 &mpic 3 1
+                       0a000 0 0 3 &mpic 0 1
+                       0a000 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x15 (Slot 4) */
+                       0a800 0 0 1 &mpic 3 1
+                       0a800 0 0 2 &mpic 0 1
+                       0a800 0 0 3 &mpic 1 1
+                       0a800 0 0 4 &mpic 2 1
+
+                       /* Bus 1 (Tundra Bridge) */
+                       /* IDSEL 0x12 (ISA bridge) */
+                       19000 0 0 1 &mpic 0 1
+                       19000 0 0 2 &mpic 1 1
+                       19000 0 0 3 &mpic 2 1
+                       19000 0 0 4 &mpic 3 1>;
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+
+               i8259@19000 {
                        interrupt-controller;
+                       device_type = "interrupt-controller";
+                       reg = <19000 0 0 0 1>;
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
-                       reg = <40000 40000>;
-                       built-in;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-                        big-endian;
+                       compatible = "chrp,iic";
+                       interrupts = <1>;
+                       interrupt-parent = <&pci1>;
                };
        };
+
+       pci@e0009000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                       /* IDSEL 0x15 */
+                       a800 0 0 1 &mpic b 1
+                       a800 0 0 2 &mpic b 1
+                       a800 0 0 3 &mpic b 1
+                       a800 0 0 4 &mpic b 1>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 e3000000 0 00100000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0009000 1000>;
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+       };
 };
index 16dbe848cecf26db2d1b055cc5a92c1333f05ba0..6b362f8222c15173bca7b1f6af6a0cb637bba883 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <04ead9a0>;
                        bus-frequency = <13ab6680>;
                        clock-frequency = <312c8040>;
-                       32-bit;
                };
        };
 
@@ -42,7 +41,6 @@
        soc8560@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
                reg = <e0000000 00000200>;
                        phy-handle = <&phy1>;
                };
 
-               pci@8000 {
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
-                       device_type = "pci";
-                       reg = <8000 1000>;
-                       clock-frequency = <3f940aa>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                                       /* IDSEL 0x2 */
-                                        1000 0 0 1 &mpic 1 1
-                                        1000 0 0 2 &mpic 2 1
-                                        1000 0 0 3 &mpic 3 1
-                                        1000 0 0 4 &mpic 4 1
-
-                                       /* IDSEL 0x3 */
-                                        1800 0 0 1 &mpic 4 1
-                                        1800 0 0 2 &mpic 1 1
-                                        1800 0 0 3 &mpic 2 1
-                                        1800 0 0 4 &mpic 3 1
-
-                                       /* IDSEL 0x4 */
-                                        2000 0 0 1 &mpic 3 1
-                                        2000 0 0 2 &mpic 4 1
-                                        2000 0 0 3 &mpic 1 1
-                                        2000 0 0 4 &mpic 2 1
-
-                                       /* IDSEL 0x5  */
-                                        2800 0 0 1 &mpic 2 1
-                                        2800 0 0 2 &mpic 3 1
-                                        2800 0 0 3 &mpic 4 1
-                                        2800 0 0 4 &mpic 1 1
-
-                                       /* IDSEL 12 */
-                                        6000 0 0 1 &mpic 1 1
-                                        6000 0 0 2 &mpic 2 1
-                                        6000 0 0 3 &mpic 3 1
-                                        6000 0 0 4 &mpic 4 1
-
-                                       /* IDSEL 13 */
-                                        6800 0 0 1 &mpic 4 1
-                                        6800 0 0 2 &mpic 1 1
-                                        6800 0 0 3 &mpic 2 1
-                                        6800 0 0 4 &mpic 3 1
-
-                                       /* IDSEL 14*/
-                                        7000 0 0 1 &mpic 3 1
-                                        7000 0 0 2 &mpic 4 1
-                                        7000 0 0 3 &mpic 1 1
-                                        7000 0 0 4 &mpic 2 1
-
-                                       /* IDSEL 15 */
-                                        7800 0 0 1 &mpic 2 1
-                                        7800 0 0 2 &mpic 3 1
-                                        7800 0 0 3 &mpic 4 1
-                                        7800 0 0 4 &mpic 1 1
-
-                                       /* IDSEL 18 */
-                                        9000 0 0 1 &mpic 1 1
-                                        9000 0 0 2 &mpic 2 1
-                                        9000 0 0 3 &mpic 3 1
-                                        9000 0 0 4 &mpic 4 1
-
-                                       /* IDSEL 19 */
-                                        9800 0 0 1 &mpic 4 1
-                                        9800 0 0 2 &mpic 1 1
-                                        9800 0 0 3 &mpic 2 1
-                                        9800 0 0 4 &mpic 3 1
-
-                                       /* IDSEL 20 */
-                                        a000 0 0 1 &mpic 3 1
-                                        a000 0 0 2 &mpic 4 1
-                                        a000 0 0 3 &mpic 1 1
-                                        a000 0 0 4 &mpic 2 1
-
-                                       /* IDSEL 21 */
-                                        a800 0 0 1 &mpic 2 1
-                                        a800 0 0 2 &mpic 3 1
-                                        a800 0 0 3 &mpic 4 1
-                                        a800 0 0 4 &mpic 1 1>;
-
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 0>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e2000000 0 01000000>;
-               };
-
                mpic: pic@40000 {
                        interrupt-controller;
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <40000 40000>;
-                       built-in;
                        device_type = "open-pic";
                };
 
-               cpm@e0000000 {
+               cpm@919c0 {
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       #interrupt-cells = <2>;
-                       device_type = "cpm";
-                       model = "CPM2";
-                       ranges = <0 0 c0000>;
-                       reg = <80000 40000>;
-                       command-proc = <919c0>;
-                       brg-frequency = <9d5b340>;
+                       compatible = "fsl,mpc8560-cpm", "fsl,cpm2";
+                       reg = <919c0 30>;
+                       ranges;
+
+                       muram@80000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 80000 10000>;
+
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 4000 9000 2000>;
+                               };
+                       };
+
+                       brg@919f0 {
+                               compatible = "fsl,mpc8560-brg",
+                                            "fsl,cpm2-brg",
+                                            "fsl,cpm-brg";
+                               reg = <919f0 10 915f0 10>;
+                               clock-frequency = <d#165000000>;
+                       };
 
                        cpmpic: pic@90c00 {
                                interrupt-controller;
                                interrupts = <2e 2>;
                                interrupt-parent = <&mpic>;
                                reg = <90c00 80>;
-                               built-in;
-                               device_type = "cpm-pic";
+                               compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic";
                        };
 
-                       scc@91a00 {
+                       serial@91a00 {
                                device_type = "serial";
-                               compatible = "cpm_uart";
-                               model = "SCC";
-                               device-id = <1>;
+                               compatible = "fsl,mpc8560-scc-uart",
+                                            "fsl,cpm2-scc-uart";
                                reg = <91a00 20 88000 100>;
-                               clock-setup = <00ffffff 0>;
-                               rx-clock = <1>;
-                               tx-clock = <1>;
+                               fsl,cpm-brg = <1>;
+                               fsl,cpm-command = <00800000>;
                                current-speed = <1c200>;
                                interrupts = <28 8>;
                                interrupt-parent = <&cpmpic>;
                        };
 
-                       scc@91a20 {
+                       serial@91a20 {
                                device_type = "serial";
-                               compatible = "cpm_uart";
-                               model = "SCC";
-                               device-id = <2>;
+                               compatible = "fsl,mpc8560-scc-uart",
+                                            "fsl,cpm2-scc-uart";
                                reg = <91a20 20 88100 100>;
-                               clock-setup = <ff00ffff 90000>;
-                               rx-clock = <2>;
-                               tx-clock = <2>;
+                               fsl,cpm-brg = <2>;
+                               fsl,cpm-command = <04a00000>;
                                current-speed = <1c200>;
                                interrupts = <29 8>;
                                interrupt-parent = <&cpmpic>;
                        };
 
-                       fcc@91320 {
+                       ethernet@91320 {
                                device_type = "network";
-                               compatible = "fs_enet";
-                               model = "FCC";
-                               device-id = <2>;
-                               reg = <91320 20 88500 100 913a0 30>;
+                               compatible = "fsl,mpc8560-fcc-enet",
+                                            "fsl,cpm2-fcc-enet";
+                               reg = <91320 20 88500 100 913b0 1>;
                                /*
                                 * mac-address is deprecated and will be removed
                                 * in 2.6.25.  Only recent versions of
                                 */
                                mac-address = [ 00 00 00 00 00 00 ];
                                local-mac-address = [ 00 00 00 00 00 00 ];
-                               clock-setup = <ff00ffff 250000>;
-                               rx-clock = <15>;
-                               tx-clock = <16>;
+                               fsl,cpm-command = <16200300>;
                                interrupts = <21 8>;
                                interrupt-parent = <&cpmpic>;
                                phy-handle = <&phy2>;
                        };
 
-                       fcc@91340 {
+                       ethernet@91340 {
                                device_type = "network";
-                               compatible = "fs_enet";
-                               model = "FCC";
-                               device-id = <3>;
-                               reg = <91340 20 88600 100 913d0 30>;
+                               compatible = "fsl,mpc8560-fcc-enet",
+                                            "fsl,cpm2-fcc-enet";
+                               reg = <91340 20 88600 100 913d0 1>;
                                /*
                                 * mac-address is deprecated and will be removed
                                 * in 2.6.25.  Only recent versions of
                                 */
                                mac-address = [ 00 00 00 00 00 00 ];
                                local-mac-address = [ 00 00 00 00 00 00 ];
-                               clock-setup = <ffff00ff 3700>;
-                               rx-clock = <17>;
-                               tx-clock = <18>;
+                               fsl,cpm-command = <1a400300>;
                                interrupts = <22 8>;
                                interrupt-parent = <&cpmpic>;
                                phy-handle = <&phy3>;
                        };
                };
        };
+
+       pci@e0008000 {
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               compatible = "fsl,mpc8540-pcix", "fsl,mpc8540-pci";
+               device_type = "pci";
+               reg = <e0008000 1000>;
+               clock-frequency = <3f940aa>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                               /* IDSEL 0x2 */
+                                1000 0 0 1 &mpic 1 1
+                                1000 0 0 2 &mpic 2 1
+                                1000 0 0 3 &mpic 3 1
+                                1000 0 0 4 &mpic 4 1
+
+                               /* IDSEL 0x3 */
+                                1800 0 0 1 &mpic 4 1
+                                1800 0 0 2 &mpic 1 1
+                                1800 0 0 3 &mpic 2 1
+                                1800 0 0 4 &mpic 3 1
+
+                               /* IDSEL 0x4 */
+                                2000 0 0 1 &mpic 3 1
+                                2000 0 0 2 &mpic 4 1
+                                2000 0 0 3 &mpic 1 1
+                                2000 0 0 4 &mpic 2 1
+
+                               /* IDSEL 0x5  */
+                                2800 0 0 1 &mpic 2 1
+                                2800 0 0 2 &mpic 3 1
+                                2800 0 0 3 &mpic 4 1
+                                2800 0 0 4 &mpic 1 1
+
+                               /* IDSEL 12 */
+                                6000 0 0 1 &mpic 1 1
+                                6000 0 0 2 &mpic 2 1
+                                6000 0 0 3 &mpic 3 1
+                                6000 0 0 4 &mpic 4 1
+
+                               /* IDSEL 13 */
+                                6800 0 0 1 &mpic 4 1
+                                6800 0 0 2 &mpic 1 1
+                                6800 0 0 3 &mpic 2 1
+                                6800 0 0 4 &mpic 3 1
+
+                               /* IDSEL 14*/
+                                7000 0 0 1 &mpic 3 1
+                                7000 0 0 2 &mpic 4 1
+                                7000 0 0 3 &mpic 1 1
+                                7000 0 0 4 &mpic 2 1
+
+                               /* IDSEL 15 */
+                                7800 0 0 1 &mpic 2 1
+                                7800 0 0 2 &mpic 3 1
+                                7800 0 0 3 &mpic 4 1
+                                7800 0 0 4 &mpic 1 1
+
+                               /* IDSEL 18 */
+                                9000 0 0 1 &mpic 1 1
+                                9000 0 0 2 &mpic 2 1
+                                9000 0 0 3 &mpic 3 1
+                                9000 0 0 4 &mpic 4 1
+
+                               /* IDSEL 19 */
+                                9800 0 0 1 &mpic 4 1
+                                9800 0 0 2 &mpic 1 1
+                                9800 0 0 3 &mpic 2 1
+                                9800 0 0 4 &mpic 3 1
+
+                               /* IDSEL 20 */
+                                a000 0 0 1 &mpic 3 1
+                                a000 0 0 2 &mpic 4 1
+                                a000 0 0 3 &mpic 1 1
+                                a000 0 0 4 &mpic 2 1
+
+                               /* IDSEL 21 */
+                                a800 0 0 1 &mpic 2 1
+                                a800 0 0 2 &mpic 3 1
+                                a800 0 0 3 &mpic 4 1
+                                a800 0 0 4 &mpic 1 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e2000000 0 01000000>;
+       };
 };
index b1dcfbe8c1f8632b636ea1fe89215bc551862646..54394372b12afb5db116318e63f688272166d137 100644 (file)
@@ -34,7 +34,6 @@
                        timebase-frequency = <0>;
                        bus-frequency = <0>;
                        clock-frequency = <0>;
-                       32-bit;
                };
        };
 
        soc8568@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 e0000000 00100000>;
-               reg = <e0000000 00100000>;
+               reg = <e0000000 00001000>;
                bus-frequency = <0>;
 
                memory-controller@2000 {
                };
 
                i2c@3000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        device_type = "i2c";
                        compatible = "fsl-i2c";
                        reg = <3000 100>;
                        interrupts = <2b 2>;
                        interrupt-parent = <&mpic>;
                        dfsrr;
+
+                       rtc@68 {
+                               compatible = "dallas,ds1374";
+                               reg = <68>;
+                       };
                };
 
                i2c@3100 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
                        device_type = "i2c";
                        compatible = "fsl-i2c";
                        reg = <3100 100>;
                        device_type = "mdio";
                        compatible = "gianfar";
                        reg = <24520 20>;
-                       phy0: ethernet-phy@0 {
+                       phy0: ethernet-phy@7 {
                                interrupt-parent = <&mpic>;
                                interrupts = <1 1>;
-                               reg = <0>;
+                               reg = <7>;
                                device_type = "ethernet-phy";
                        };
                        phy1: ethernet-phy@1 {
                        fsl,has-rstcr;
                };
 
-               pci@8000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                               /* IDSEL 0x12 AD18 */
-                               9000 0 0 1 &mpic 5 1
-                               9000 0 0 2 &mpic 6 1
-                               9000 0 0 3 &mpic 7 1
-                               9000 0 0 4 &mpic 4 1
-
-                               /* IDSEL 0x13 AD19 */
-                               9800 0 0 1 &mpic 6 1
-                               9800 0 0 2 &mpic 7 1
-                               9800 0 0 3 &mpic 4 1
-                               9800 0 0 4 &mpic 5 1>;
-
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e2000000 0 00800000>;
-                       clock-frequency = <3f940aa>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <8000 1000>;
-                       compatible = "fsl,mpc8540-pci";
-                       device_type = "pci";
-               };
-
-               /* PCI Express */
-               pcie@a000 {
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-
-                               /* IDSEL 0x0 (PEX) */
-                               00000 0 0 1 &mpic 0 1
-                               00000 0 0 2 &mpic 1 1
-                               00000 0 0 3 &mpic 2 1
-                               00000 0 0 4 &mpic 3 1>;
-
-                       interrupt-parent = <&mpic>;
-                       interrupts = <1a 2>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 a0000000 a0000000 0 20000000
-                                 01000000 0 00000000 e3000000 0 08000000>;
-                       clock-frequency = <1fca055>;
-                       #interrupt-cells = <1>;
-                       #size-cells = <2>;
-                       #address-cells = <3>;
-                       reg = <a000 1000>;
-                       compatible = "fsl,mpc8548-pcie";
-                       device_type = "pci";
-               };
-
                serial@4600 {
                        device_type = "serial";
                        compatible = "ns16550";
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <40000 40000>;
-                       built-in;
                        compatible = "chrp,open-pic";
                        device_type = "open-pic";
                         big-endian;
                };
+
                par_io@e0100 {
                        reg = <e0100 100>;
                        device_type = "par_io";
                                        4  1a  2  0  2  0       /* RxD7 */
                                        4  0b  1  0  2  0       /* TX_EN */
                                        4  18  1  0  2  0       /* TX_ER */
-                                       4  0f  2  0  2  0       /* RX_DV */
+                                       4  10  2  0  2  0       /* RX_DV */
                                        4  1e  2  0  2  0       /* RX_ER */
                                        4  11  2  0  2  0       /* RX_CLK */
                                        4  13  1  0  2  0       /* GTX_CLK */
                                        1  1f  2  0  3  0>;     /* GTX125 */
                        };
+
                        pio2: ucc_pin@02 {
                                pio-map = <
                        /* port  pin  dir  open_drain  assignment  has_irq */
                        mac-address = [ 00 00 00 00 00 00 ];
                        local-mac-address = [ 00 00 00 00 00 00 ];
                        rx-clock = <0>;
-                       tx-clock = <19>;
-                       phy-handle = <&qe_phy0>;
-                       phy-connection-type = "gmii";
+                       tx-clock = <20>;
                        pio-handle = <&pio1>;
+                       phy-handle = <&phy0>;
+                       phy-connection-type = "rgmii-id";
                };
 
                ucc@3000 {
                        mac-address = [ 00 00 00 00 00 00 ];
                        local-mac-address = [ 00 00 00 00 00 00 ];
                        rx-clock = <0>;
-                       tx-clock = <14>;
-                       phy-handle = <&qe_phy1>;
-                       phy-connection-type = "gmii";
+                       tx-clock = <20>;
                        pio-handle = <&pio2>;
+                       phy-handle = <&phy1>;
+                       phy-connection-type = "rgmii-id";
                };
 
                mdio@2120 {
 
                        /* These are the same PHYs as on
                         * gianfar's MDIO bus */
-                       qe_phy0: ethernet-phy@00 {
+                       qe_phy0: ethernet-phy@07 {
                                interrupt-parent = <&mpic>;
                                interrupts = <1 1>;
-                               reg = <0>;
+                               reg = <7>;
                                device_type = "ethernet-phy";
                        };
                        qe_phy1: ethernet-phy@01 {
                        #address-cells = <0>;
                        #interrupt-cells = <1>;
                        reg = <80 80>;
-                       built-in;
                        big-endian;
                        interrupts = <2e 2 2e 2>; //high:30 low:30
                        interrupt-parent = <&mpic>;
                };
 
        };
+
+       pci@e0008000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x12 AD18 */
+                       9000 0 0 1 &mpic 5 1
+                       9000 0 0 2 &mpic 6 1
+                       9000 0 0 3 &mpic 7 1
+                       9000 0 0 4 &mpic 4 1
+
+                       /* IDSEL 0x13 AD19 */
+                       9800 0 0 1 &mpic 6 1
+                       9800 0 0 2 &mpic 7 1
+                       9800 0 0 3 &mpic 4 1
+                       9800 0 0 4 &mpic 5 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e2000000 0 00800000>;
+               clock-frequency = <3f940aa>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+               compatible = "fsl,mpc8540-pci";
+               device_type = "pci";
+       };
+
+       /* PCI Express */
+       pcie@e000a000 {
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+
+                       /* IDSEL 0x0 (PEX) */
+                       00000 0 0 1 &mpic 0 1
+                       00000 0 0 2 &mpic 1 1
+                       00000 0 0 3 &mpic 2 1
+                       00000 0 0 4 &mpic 3 1>;
+
+               interrupt-parent = <&mpic>;
+               interrupts = <1a 2>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 a0000000 a0000000 0 10000000
+                         01000000 0 00000000 e2800000 0 00800000>;
+               clock-frequency = <1fca055>;
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e000a000 1000>;
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       ranges = <02000000 0 a0000000
+                                 02000000 0 a0000000
+                                 0 10000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00800000>;
+               };
+       };
 };
diff --git a/arch/powerpc/boot/dts/mpc8572ds.dts b/arch/powerpc/boot/dts/mpc8572ds.dts
new file mode 100644 (file)
index 0000000..d638dee
--- /dev/null
@@ -0,0 +1,404 @@
+/*
+ * MPC8572 DS Device Tree Source
+ *
+ * Copyright 2007 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.
+ */
+
+/ {
+       model = "fsl,MPC8572DS";
+       compatible = "fsl,MPC8572DS";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8572@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;       // 32 bytes
+                       i-cache-line-size = <20>;       // 32 bytes
+                       d-cache-size = <8000>;          // L1, 32K
+                       i-cache-size = <8000>;          // L1, 32K
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <00000000 00000000>;      // Filled by U-Boot
+       };
+
+       soc8572@ffe00000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               ranges = <00000000 ffe00000 00100000>;
+               reg = <ffe00000 00001000>;      // CCSRBAR & soc regs, remove once parse code for immrbase fixed
+               bus-frequency = <0>;            // Filled out by uboot.
+
+               memory-controller@2000 {
+                       compatible = "fsl,mpc8572-memory-controller";
+                       reg = <2000 1000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <12 2>;
+               };
+
+               memory-controller@6000 {
+                       compatible = "fsl,mpc8572-memory-controller";
+                       reg = <6000 1000>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <12 2>;
+               };
+
+               l2-cache-controller@20000 {
+                       compatible = "fsl,mpc8572-l2-cache-controller";
+                       reg = <20000 1000>;
+                       cache-line-size = <20>; // 32 bytes
+                       cache-size = <80000>;   // L2, 512K
+                       interrupt-parent = <&mpic>;
+                       interrupts = <10 2>;
+               };
+
+               i2c@3000 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3000 100>;
+                       interrupts = <2b 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               i2c@3100 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3100 100>;
+                       interrupts = <2b 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               mdio@24520 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "mdio";
+                       compatible = "gianfar";
+                       reg = <24520 20>;
+                       phy0: ethernet-phy@0 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <a 1>;
+                               reg = <0>;
+                       };
+                       phy1: ethernet-phy@1 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <a 1>;
+                               reg = <1>;
+                       };
+                       phy2: ethernet-phy@2 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <a 1>;
+                               reg = <2>;
+                       };
+                       phy3: ethernet-phy@3 {
+                               interrupt-parent = <&mpic>;
+                               interrupts = <a 1>;
+                               reg = <3>;
+                       };
+               };
+
+               ethernet@24000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <24000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <1d 2 1e 2 22 2>;
+                       interrupt-parent = <&mpic>;
+                       phy-handle = <&phy0>;
+                       phy-connection-type = "rgmii-id";
+               };
+
+               ethernet@25000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <25000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <23 2 24 2 28 2>;
+                       interrupt-parent = <&mpic>;
+                       phy-handle = <&phy1>;
+                       phy-connection-type = "rgmii-id";
+               };
+
+               ethernet@26000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <26000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <1f 2 20 2 21 2>;
+                       interrupt-parent = <&mpic>;
+                       phy-handle = <&phy2>;
+                       phy-connection-type = "rgmii-id";
+               };
+
+               ethernet@27000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <27000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <25 2 26 2 27 2>;
+                       interrupt-parent = <&mpic>;
+                       phy-handle = <&phy3>;
+                       phy-connection-type = "rgmii-id";
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;
+                       interrupts = <2a 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               serial@4600 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4600 100>;
+                       clock-frequency = <0>;
+                       interrupts = <2a 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               global-utilities@e0000 {        //global utilities block
+                       compatible = "fsl,mpc8572-guts";
+                       reg = <e0000 1000>;
+                       fsl,has-rstcr;
+               };
+
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                       big-endian;
+               };
+       };
+
+       pcie@ffe08000 {
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <ffe08000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 ffc00000 0 00010000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               interrupt-map-mask = <fb00 0 0 0>;
+               interrupt-map = <
+                       /* IDSEL 0x11 - PCI slot 1 */
+                       8800 0 0 1 &mpic 2 1
+                       8800 0 0 2 &mpic 3 1
+                       8800 0 0 3 &mpic 4 1
+                       8800 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x12 - PCI slot 2 */
+                       9000 0 0 1 &mpic 3 1
+                       9000 0 0 2 &mpic 4 1
+                       9000 0 0 3 &mpic 1 1
+                       9000 0 0 4 &mpic 2 1
+
+                       // IDSEL 0x1c  USB
+                       e000 0 0 0 &i8259 c 2
+                       e100 0 0 0 &i8259 9 2
+                       e200 0 0 0 &i8259 a 2
+                       e300 0 0 0 &i8259 b 2
+
+                       // IDSEL 0x1d  Audio
+                       e800 0 0 0 &i8259 6 2
+
+                       // IDSEL 0x1e Legacy
+                       f000 0 0 0 &i8259 7 2
+                       f100 0 0 0 &i8259 7 2
+
+                       // IDSEL 0x1f IDE/SATA
+                       f800 0 0 0 &i8259 e 2
+                       f900 0 0 0 &i8259 5 2
+
+                       >;
+
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       ranges = <02000000 0 80000000
+                                 02000000 0 80000000
+                                 0 20000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
+                       uli1575@0 {
+                               reg = <0 0 0 0 0>;
+                               #size-cells = <2>;
+                               #address-cells = <3>;
+                               ranges = <02000000 0 80000000
+                                         02000000 0 80000000
+                                         0 20000000
+
+                                         01000000 0 00000000
+                                         01000000 0 00000000
+                                         0 00100000>;
+                               isa@1e {
+                                       device_type = "isa";
+                                       #interrupt-cells = <2>;
+                                       #size-cells = <1>;
+                                       #address-cells = <2>;
+                                       reg = <f000 0 0 0 0>;
+                                       ranges = <1 0 01000000 0 0
+                                                 00001000>;
+                                       interrupt-parent = <&i8259>;
+
+                                       i8259: interrupt-controller@20 {
+                                               reg = <1 20 2
+                                                      1 a0 2
+                                                      1 4d0 2>;
+                                               interrupt-controller;
+                                               device_type = "interrupt-controller";
+                                               #address-cells = <0>;
+                                               #interrupt-cells = <2>;
+                                               compatible = "chrp,iic";
+                                               interrupts = <9 2>;
+                                               interrupt-parent = <&mpic>;
+                                       };
+
+                                       i8042@60 {
+                                               #size-cells = <0>;
+                                               #address-cells = <1>;
+                                               reg = <1 60 1 1 64 1>;
+                                               interrupts = <1 3 c 3>;
+                                               interrupt-parent =
+                                                       <&i8259>;
+
+                                               keyboard@0 {
+                                                       reg = <0>;
+                                                       compatible = "pnpPNP,303";
+                                               };
+
+                                               mouse@1 {
+                                                       reg = <1>;
+                                                       compatible = "pnpPNP,f03";
+                                               };
+                                       };
+
+                                       rtc@70 {
+                                               compatible = "pnpPNP,b00";
+                                               reg = <1 70 2>;
+                                       };
+
+                                       gpio@400 {
+                                               reg = <1 400 80>;
+                                       };
+                               };
+                       };
+               };
+
+       };
+
+       pcie@ffe09000 {
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <ffe09000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 ffc10000 0 00010000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <1a 2>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0 0 1 &mpic 4 1
+                       0000 0 0 2 &mpic 5 1
+                       0000 0 0 3 &mpic 6 1
+                       0000 0 0 4 &mpic 7 1
+                       >;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       ranges = <02000000 0 a0000000
+                                 02000000 0 a0000000
+                                 0 20000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
+               };
+       };
+
+       pcie@ffe0a000 {
+               compatible = "fsl,mpc8548-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <ffe0a000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 c0000000 c0000000 0 20000000
+                         01000000 0 00000000 ffc20000 0 00010000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <1b 2>;
+               interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0 0 1 &mpic 0 1
+                       0000 0 0 2 &mpic 1 1
+                       0000 0 0 3 &mpic 2 1
+                       0000 0 0 4 &mpic 3 1
+                       >;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       ranges = <02000000 0 c0000000
+                                 02000000 0 c0000000
+                                 0 20000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/mpc8610_hpcd.dts b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
new file mode 100644 (file)
index 0000000..966edf1
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * MPC8610 HPCD Device Tree Source
+ *
+ * Copyright 2007 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 Version 2 as published
+ * by the Free Software Foundation.
+ */
+
+
+/ {
+       model = "MPC8610HPCD";
+       compatible = "fsl,MPC8610HPCD";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8610@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <d# 32>;    // bytes
+                       i-cache-line-size = <d# 32>;    // bytes
+                       d-cache-size = <8000>;          // L1, 32K
+                       i-cache-size = <8000>;          // L1, 32K
+                       timebase-frequency = <0>;       // 33 MHz, from uboot
+                       bus-frequency = <0>;            // From uboot
+                       clock-frequency = <0>;          // From uboot
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <00000000 20000000>;      // 512M at 0x0
+       };
+
+       soc@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 e0000000 00100000>;
+               reg = <e0000000 1000>;
+               bus-frequency = <0>;
+
+               i2c@3000 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3000 100>;
+                       interrupts = <2b 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               i2c@3100 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <3100 100>;
+                       interrupts = <2b 2>;
+                       interrupt-parent = <&mpic>;
+                       dfsrr;
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;
+                       interrupts = <2a 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+               serial@4600 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4600 100>;
+                       clock-frequency = <0>;
+                       interrupts = <1c 2>;
+                       interrupt-parent = <&mpic>;
+               };
+
+
+               mpic: interrupt-controller@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                       big-endian;
+               };
+
+               global-utilities@e0000 {
+                       compatible = "fsl,mpc8610-guts";
+                       reg = <e0000 1000>;
+                       fsl,has-rstcr;
+               };
+       };
+
+       pci@e0008000 {
+               compatible = "fsl,mpc8610-pci";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e0008000 1000>;
+               bus-range = <0 0>;
+               ranges = <02000000 0 80000000 80000000 0 10000000
+                         01000000 0 00000000 e1000000 0 00100000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x11 */
+                       8800 0 0 1 &mpic 4 1
+                       8800 0 0 2 &mpic 5 1
+                       8800 0 0 3 &mpic 6 1
+                       8800 0 0 4 &mpic 7 1
+
+                       /* IDSEL 0x12 */
+                       9000 0 0 1 &mpic 5 1
+                       9000 0 0 2 &mpic 6 1
+                       9000 0 0 3 &mpic 7 1
+                       9000 0 0 4 &mpic 4 1
+                       >;
+       };
+
+       pcie@e000a000 {
+               compatible = "fsl,mpc8641-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <e000a000 1000>;
+               bus-range = <1 3>;
+               ranges = <02000000 0 a0000000 a0000000 0 10000000
+                         01000000 0 00000000 e3000000 0 00100000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <1a 2>;
+               interrupt-map-mask = <f800 0 0 7>;
+
+               interrupt-map = <
+                       /* IDSEL 0x1b */
+                       d800 0 0 1 &mpic 2 1
+
+                       /* IDSEL 0x1c*/
+                       e000 0 0 1 &mpic 1 1
+                       e000 0 0 2 &mpic 1 1
+                       e000 0 0 3 &mpic 1 1
+                       e000 0 0 4 &mpic 1 1
+
+                       /* IDSEL 0x1f */
+                       f800 0 0 1 &mpic 3 0
+                       f800 0 0 2 &mpic 0 1
+               >;
+
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       device_type = "pci";
+                       ranges = <02000000 0 a0000000
+                                 02000000 0 a0000000
+                                 0 10000000
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
+                       uli1575@0 {
+                               reg = <0 0 0 0 0>;
+                               #size-cells = <2>;
+                               #address-cells = <3>;
+                               ranges = <02000000 0 a0000000
+                                         02000000 0 a0000000
+                                         0 10000000
+                                         01000000 0 00000000
+                                         01000000 0 00000000
+                                         0 00100000>;
+                       };
+               };
+       };
+};
index b0166e5c177e49d499ce4deab88a1eaa9c457a4c..367765937a06eb37c0aa026344911e58a7d76209 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;       // 33 MHz, from uboot
                        bus-frequency = <0>;            // From uboot
                        clock-frequency = <0>;          // From uboot
-                       32-bit;
                };
                PowerPC,8641@1 {
                        device_type = "cpu";
@@ -42,7 +41,6 @@
                        timebase-frequency = <0>;       // 33 MHz, from uboot
                        bus-frequency = <0>;            // From uboot
                        clock-frequency = <0>;          // From uboot
-                       32-bit;
                };
        };
 
        soc8641@f8000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
-               ranges = <00001000 f8001000 000ff000
-                         80000000 80000000 20000000
-                         e2000000 e2000000 00100000
-                         a0000000 a0000000 20000000
-                         e3000000 e3000000 00100000>;
+               ranges = <00000000 f8000000 00100000>;
                reg = <f8000000 00001000>;      // CCSRBAR
                bus-frequency = <0>;
 
                        interrupt-parent = <&mpic>;
                };
 
-               pcie@8000 {
-                       compatible = "fsl,mpc8641-pcie";
-                       device_type = "pci";
-                       #interrupt-cells = <1>;
+               mpic: pic@40000 {
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                       big-endian;
+               };
+
+               global-utilities@e0000 {
+                       compatible = "fsl,mpc8641-guts";
+                       reg = <e0000 1000>;
+                       fsl,has-rstcr;
+               };
+       };
+
+       pcie@f8008000 {
+               compatible = "fsl,mpc8641-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <f8008000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 80000000 80000000 0 20000000
+                         01000000 0 00000000 e2000000 0 00100000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <18 2>;
+               interrupt-map-mask = <fb00 0 0 0>;
+               interrupt-map = <
+                       /* IDSEL 0x11 */
+                       8800 0 0 1 &i8259 9 2
+                       8800 0 0 2 &i8259 a 2
+                       8800 0 0 3 &i8259 b 2
+                       8800 0 0 4 &i8259 c 2
+
+                       /* IDSEL 0x12 */
+                       9000 0 0 1 &i8259 a 2
+                       9000 0 0 2 &i8259 b 2
+                       9000 0 0 3 &i8259 c 2
+                       9000 0 0 4 &i8259 9 2
+
+                       // IDSEL 0x1c  USB
+                       e000 0 0 0 &i8259 c 2
+                       e100 0 0 0 &i8259 9 2
+                       e200 0 0 0 &i8259 a 2
+                       e300 0 0 0 &i8259 b 2
+
+                       // IDSEL 0x1d  Audio
+                       e800 0 0 0 &i8259 6 2
+
+                       // IDSEL 0x1e Legacy
+                       f000 0 0 0 &i8259 7 2
+                       f100 0 0 0 &i8259 7 2
+
+                       // IDSEL 0x1f IDE/SATA
+                       f800 0 0 0 &i8259 e 2
+                       f900 0 0 0 &i8259 5 2
+                       >;
+
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <8000 1000>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 80000000 80000000 0 20000000
-                                 01000000 0 00000000 e2000000 0 00100000>;
-                       clock-frequency = <1fca055>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <18 2>;
-                       interrupt-map-mask = <fb00 0 0 0>;
-                       interrupt-map = <
-                               /* IDSEL 0x11 */
-                               8800 0 0 1 &i8259 9 2
-                               8800 0 0 2 &i8259 a 2
-                               8800 0 0 3 &i8259 b 2
-                               8800 0 0 4 &i8259 c 2
-
-                               /* IDSEL 0x12 */
-                               9000 0 0 1 &i8259 a 2
-                               9000 0 0 2 &i8259 b 2
-                               9000 0 0 3 &i8259 c 2
-                               9000 0 0 4 &i8259 9 2
-
-                               // IDSEL 0x1c  USB
-                               e000 0 0 0 &i8259 c 2
-                               e100 0 0 0 &i8259 9 2
-                               e200 0 0 0 &i8259 a 2
-                               e300 0 0 0 &i8259 b 2
-
-                               // IDSEL 0x1d  Audio
-                               e800 0 0 0 &i8259 6 2
-
-                               // IDSEL 0x1e Legacy
-                               f000 0 0 0 &i8259 7 2
-                               f100 0 0 0 &i8259 7 2
-
-                               // IDSEL 0x1f IDE/SATA
-                               f800 0 0 0 &i8259 e 2
-                               f900 0 0 0 &i8259 5 2
-                               >;
+                       device_type = "pci";
+                       ranges = <02000000 0 80000000
+                                 02000000 0 80000000
+                                 0 20000000
+
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
                        uli1575@0 {
                                reg = <0 0 0 0 0>;
                                #size-cells = <2>;
                                          01000000 0 00000000
                                          01000000 0 00000000
                                          0 00100000>;
+                               isa@1e {
+                                       device_type = "isa";
+                                       #interrupt-cells = <2>;
+                                       #size-cells = <1>;
+                                       #address-cells = <2>;
+                                       reg = <f000 0 0 0 0>;
+                                       ranges = <1 0 01000000 0 0
+                                                 00001000>;
+                                       interrupt-parent = <&i8259>;
 
-                               pci_bridge@0 {
-                                       reg = <0 0 0 0 0>;
-                                       #size-cells = <2>;
-                                       #address-cells = <3>;
-                                       ranges = <02000000 0 80000000
-                                                 02000000 0 80000000
-                                                 0 20000000
-                                                 01000000 0 00000000
-                                                 01000000 0 00000000
-                                                 0 00100000>;
-
-                                       isa@1e {
-                                               device_type = "isa";
+                                       i8259: interrupt-controller@20 {
+                                               reg = <1 20 2
+                                                      1 a0 2
+                                                      1 4d0 2>;
+                                               interrupt-controller;
+                                               device_type = "interrupt-controller";
+                                               #address-cells = <0>;
                                                #interrupt-cells = <2>;
-                                               #size-cells = <1>;
-                                               #address-cells = <2>;
-                                               reg = <f000 0 0 0 0>;
-                                               ranges = <1 0 01000000 0 0
-                                                         00001000>;
-                                               interrupt-parent = <&i8259>;
-
-                                               i8259: interrupt-controller@20 {
-                                                       reg = <1 20 2
-                                                              1 a0 2
-                                                              1 4d0 2>;
-                                                       clock-frequency = <0>;
-                                                       interrupt-controller;
-                                                       device_type = "interrupt-controller";
-                                                       #address-cells = <0>;
-                                                       #interrupt-cells = <2>;
-                                                       built-in;
-                                                       compatible = "chrp,iic";
-                                                       interrupts = <9 2>;
-                                                       interrupt-parent =
-                                                               <&mpic>;
-                                               };
+                                               compatible = "chrp,iic";
+                                               interrupts = <9 2>;
+                                               interrupt-parent = <&mpic>;
+                                       };
 
-                                               i8042@60 {
-                                                       #size-cells = <0>;
-                                                       #address-cells = <1>;
-                                                       reg = <1 60 1 1 64 1>;
-                                                       interrupts = <1 3 c 3>;
-                                                       interrupt-parent =
-                                                               <&i8259>;
-
-                                                       keyboard@0 {
-                                                               reg = <0>;
-                                                               compatible = "pnpPNP,303";
-                                                       };
-
-                                                       mouse@1 {
-                                                               reg = <1>;
-                                                               compatible = "pnpPNP,f03";
-                                                       };
-                                               };
+                                       i8042@60 {
+                                               #size-cells = <0>;
+                                               #address-cells = <1>;
+                                               reg = <1 60 1 1 64 1>;
+                                               interrupts = <1 3 c 3>;
+                                               interrupt-parent =
+                                                       <&i8259>;
 
-                                               rtc@70 {
-                                                       compatible =
-                                                               "pnpPNP,b00";
-                                                       reg = <1 70 2>;
+                                               keyboard@0 {
+                                                       reg = <0>;
+                                                       compatible = "pnpPNP,303";
                                                };
 
-                                               gpio@400 {
-                                                       reg = <1 400 80>;
+                                               mouse@1 {
+                                                       reg = <1>;
+                                                       compatible = "pnpPNP,f03";
                                                };
                                        };
+
+                                       rtc@70 {
+                                               compatible =
+                                                       "pnpPNP,b00";
+                                               reg = <1 70 2>;
+                                       };
+
+                                       gpio@400 {
+                                               reg = <1 400 80>;
+                                       };
                                };
                        };
-
                };
 
-               pcie@9000 {
-                       compatible = "fsl,mpc8641-pcie";
-                       device_type = "pci";
-                       #interrupt-cells = <1>;
+       };
+
+       pcie@f8009000 {
+               compatible = "fsl,mpc8641-pcie";
+               device_type = "pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <f8009000 1000>;
+               bus-range = <0 ff>;
+               ranges = <02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 e3000000 0 00100000>;
+               clock-frequency = <1fca055>;
+               interrupt-parent = <&mpic>;
+               interrupts = <19 2>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                       /* IDSEL 0x0 */
+                       0000 0 0 1 &mpic 4 1
+                       0000 0 0 2 &mpic 5 1
+                       0000 0 0 3 &mpic 6 1
+                       0000 0 0 4 &mpic 7 1
+                       >;
+               pcie@0 {
+                       reg = <0 0 0 0 0>;
                        #size-cells = <2>;
                        #address-cells = <3>;
-                       reg = <9000 1000>;
-                       bus-range = <0 ff>;
-                       ranges = <02000000 0 a0000000 a0000000 0 20000000
-                                 01000000 0 00000000 e3000000 0 00100000>;
-                       clock-frequency = <1fca055>;
-                       interrupt-parent = <&mpic>;
-                       interrupts = <19 2>;
-                       interrupt-map-mask = <f800 0 0 7>;
-                       interrupt-map = <
-                               /* IDSEL 0x0 */
-                               0000 0 0 1 &mpic 4 1
-                               0000 0 0 2 &mpic 5 1
-                               0000 0 0 3 &mpic 6 1
-                               0000 0 0 4 &mpic 7 1
-                               >;
-               };
+                       device_type = "pci";
+                       ranges = <02000000 0 a0000000
+                                 02000000 0 a0000000
+                                 0 20000000
 
-               mpic: pic@40000 {
-                       clock-frequency = <0>;
-                       interrupt-controller;
-                       #address-cells = <0>;
-                       #interrupt-cells = <2>;
-                       reg = <40000 40000>;
-                       built-in;
-                       compatible = "chrp,open-pic";
-                       device_type = "open-pic";
-                       big-endian;
+                                 01000000 0 00000000
+                                 01000000 0 00000000
+                                 0 00100000>;
                };
        };
 };
index e5e7726ddb0345ea1212e8d1806b05266ba7f866..90f2293ed3cde4b221136a0eaba5dad51b7bf6f7 100644 (file)
@@ -30,7 +30,6 @@
                        timebase-frequency = <0>;
                        bus-frequency = <0>;
                        clock-frequency = <0>;
-                       32-bit;
                        interrupts = <f 2>;     // decrementer interrupt
                        interrupt-parent = <&Mpc8xx_pic>;
                };
@@ -44,7 +43,6 @@
        soc866@ff000000 {
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
                ranges = <0 ff000000 00100000>;
                reg = <ff000000 00000200>;
@@ -78,7 +76,6 @@
                        #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <0 24>;
-                       built-in;
                        device_type = "mpc8xx-pic";
                        compatible = "CPM";
                };
@@ -86,7 +83,6 @@
                cpm@ff000000 {
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       #interrupt-cells = <2>;
                        device_type = "cpm";
                        model = "CPM";
                        ranges = <0 0 4000>;
                                interrupts = <5 2 0 2>;
                                interrupt-parent = <&Mpc8xx_pic>;
                                reg = <930 20>;
-                               built-in;
                                device_type = "cpm-pic";
                                compatible = "CPM";
                        };
index dc7ab9c80611567baa497dffbe42d89e040e68e8..8848e637293e64244cf629ce11220202569dd997 100644 (file)
@@ -2,6 +2,7 @@
  * MPC885 ADS Device Tree Source
  *
  * Copyright 2006 MontaVista Software, Inc.
+ * Copyright 2007 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
@@ -12,7 +13,7 @@
 
 / {
        model = "MPC885ADS";
-       compatible = "mpc8xx";
+       compatible = "fsl,mpc885ads";
        #address-cells = <1>;
        #size-cells = <1>;
 
                PowerPC,885@0 {
                        device_type = "cpu";
                        reg = <0>;
-                       d-cache-line-size = <20>;       // 32 bytes
-                       i-cache-line-size = <20>;       // 32 bytes
-                       d-cache-size = <2000>;          // L1, 8K
-                       i-cache-size = <2000>;          // L1, 8K
+                       d-cache-line-size = <d#16>;
+                       i-cache-line-size = <d#16>;
+                       d-cache-size = <d#8192>;
+                       i-cache-size = <d#8192>;
                        timebase-frequency = <0>;
                        bus-frequency = <0>;
                        clock-frequency = <0>;
-                       32-bit;
                        interrupts = <f 2>;     // decrementer interrupt
-                       interrupt-parent = <&Mpc8xx_pic>;
+                       interrupt-parent = <&PIC>;
                };
        };
 
        memory {
                device_type = "memory";
-               reg = <00000000 800000>;
+               reg = <0 0>;
        };
 
-       soc885@ff000000 {
+       localbus@ff000100 {
+               compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               reg = <ff000100 40>;
+
+               ranges = <
+                       0 0 fe000000 00800000
+                       1 0 ff080000 00008000
+                       5 0 ff0a0000 00008000
+               >;
+
+               flash@0,0 {
+                       compatible = "jedec-flash";
+                       reg = <0 0 800000>;
+                       bank-width = <4>;
+                       device-width = <1>;
+               };
+
+               board-control@1,0 {
+                       reg = <1 0 20 5 300 4>;
+                       compatible = "fsl,mpc885ads-bcsr";
+               };
+       };
+
+       soc@ff000000 {
+               compatible = "fsl,mpc885", "fsl,pq1-soc";
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <2>;
                device_type = "soc";
-               ranges = <0 ff000000 00100000>;
-               reg = <ff000000 00000200>;
+               ranges = <0 ff000000 00004000>;
                bus-frequency = <0>;
-               mdio@e80 {
-                       device_type = "mdio";
-                       compatible = "fs_enet";
-                       reg = <e80 8>;
+
+               // Temporary -- will go away once kernel uses ranges for get_immrbase().
+               reg = <ff000000 4000>;
+
+               mdio@e00 {
+                       compatible = "fsl,mpc885-fec-mdio", "fsl,pq1-fec-mdio";
+                       reg = <e00 188>;
                        #address-cells = <1>;
                        #size-cells = <0>;
-                       Phy0: ethernet-phy@0 {
+
+                       PHY0: ethernet-phy@0 {
                                reg = <0>;
                                device_type = "ethernet-phy";
                        };
-                       Phy1: ethernet-phy@1 {
+
+                       PHY1: ethernet-phy@1 {
                                reg = <1>;
                                device_type = "ethernet-phy";
                        };
-                       Phy2: ethernet-phy@2 {
+
+                       PHY2: ethernet-phy@2 {
                                reg = <2>;
                                device_type = "ethernet-phy";
                        };
                };
 
-               fec@e00 {
+               ethernet@e00 {
                        device_type = "network";
-                       compatible = "fs_enet";
-                       model = "FEC";
-                       device-id = <1>;
+                       compatible = "fsl,mpc885-fec-enet",
+                                    "fsl,pq1-fec-enet";
                        reg = <e00 188>;
-                       mac-address = [ 00 00 0C 00 01 FD ];
+                       local-mac-address = [ 00 00 00 00 00 00 ];
                        interrupts = <3 1>;
-                       interrupt-parent = <&Mpc8xx_pic>;
-                       phy-handle = <&Phy1>;
+                       interrupt-parent = <&PIC>;
+                       phy-handle = <&PHY0>;
+                       linux,network-index = <0>;
                };
 
-               fec@1e00 {
+               ethernet@1e00 {
                        device_type = "network";
-                       compatible = "fs_enet";
-                       model = "FEC";
-                       device-id = <2>;
+                       compatible = "fsl,mpc885-fec-enet",
+                                    "fsl,pq1-fec-enet";
                        reg = <1e00 188>;
-                       mac-address = [ 00 00 0C 00 02 FD ];
+                       local-mac-address = [ 00 00 00 00 00 00 ];
                        interrupts = <7 1>;
-                       interrupt-parent = <&Mpc8xx_pic>;
-                       phy-handle = <&Phy2>;
+                       interrupt-parent = <&PIC>;
+                       phy-handle = <&PHY1>;
+                       linux,network-index = <1>;
                };
 
-               Mpc8xx_pic: pic@ff000000 {
+               PIC: interrupt-controller@0 {
                        interrupt-controller;
-                       #address-cells = <0>;
                        #interrupt-cells = <2>;
                        reg = <0 24>;
-                       built-in;
-                       device_type = "mpc8xx-pic";
-                       compatible = "CPM";
+                       compatible = "fsl,mpc885-pic", "fsl,pq1-pic";
                };
 
-               pcmcia@0080 {
+               pcmcia@80 {
                        #address-cells = <3>;
                        #interrupt-cells = <1>;
                        #size-cells = <2>;
                        compatible = "fsl,pq-pcmcia";
                        device_type = "pcmcia";
                        reg = <80 80>;
-                       interrupt-parent = <&Mpc8xx_pic>;
+                       interrupt-parent = <&PIC>;
                        interrupts = <d 1>;
                };
 
-               cpm@ff000000 {
+               cpm@9c0 {
                        #address-cells = <1>;
                        #size-cells = <1>;
-                       #interrupt-cells = <2>;
-                       device_type = "cpm";
-                       model = "CPM";
-                       ranges = <0 0 4000>;
-                       reg = <860 f0>;
+                       compatible = "fsl,mpc885-cpm", "fsl,cpm1";
                        command-proc = <9c0>;
-                       brg-frequency = <0>;
-                       interrupts = <0 2>;     // cpm error interrupt
-                       interrupt-parent = <&Cpm_pic>;
+                       interrupts = <0>;       // cpm error interrupt
+                       interrupt-parent = <&CPM_PIC>;
+                       reg = <9c0 40>;
+                       ranges;
+
+                       muram@2000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 2000 2000>;
 
-                       Cpm_pic: pic@930 {
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 1c00>;
+                               };
+                       };
+
+                       brg@9f0 {
+                               compatible = "fsl,mpc885-brg",
+                                            "fsl,cpm1-brg",
+                                            "fsl,cpm-brg";
+                               reg = <9f0 10>;
+                       };
+
+                       CPM_PIC: interrupt-controller@930 {
                                interrupt-controller;
-                               #address-cells = <0>;
-                               #interrupt-cells = <2>;
+                               #interrupt-cells = <1>;
                                interrupts = <5 2 0 2>;
-                               interrupt-parent = <&Mpc8xx_pic>;
+                               interrupt-parent = <&PIC>;
                                reg = <930 20>;
-                               built-in;
-                               device_type = "cpm-pic";
-                               compatible = "CPM";
+                               compatible = "fsl,mpc885-cpm-pic",
+                                            "fsl,cpm1-pic";
                        };
 
-                       smc@a80 {
+                       serial@a80 {
                                device_type = "serial";
-                               compatible = "cpm_uart";
-                               model = "SMC";
-                               device-id = <1>;
+                               compatible = "fsl,mpc885-smc-uart",
+                                            "fsl,cpm1-smc-uart";
                                reg = <a80 10 3e80 40>;
-                               clock-setup = <00ffffff 0>;
-                               rx-clock = <1>;
-                               tx-clock = <1>;
-                               current-speed = <0>;
-                               interrupts = <4 3>;
-                               interrupt-parent = <&Cpm_pic>;
+                               interrupts = <4>;
+                               interrupt-parent = <&CPM_PIC>;
+                               fsl,cpm-brg = <1>;
+                               fsl,cpm-command = <0090>;
                        };
 
-                       smc@a90 {
+                       serial@a90 {
                                device_type = "serial";
-                               compatible = "cpm_uart";
-                               model = "SMC";
-                               device-id = <2>;
-                               reg = <a90 20 3f80 40>;
-                               clock-setup = <ff00ffff 90000>;
-                               rx-clock = <2>;
-                               tx-clock = <2>;
-                               current-speed = <0>;
-                               interrupts = <3 3>;
-                               interrupt-parent = <&Cpm_pic>;
+                               compatible = "fsl,mpc885-smc-uart",
+                                            "fsl,cpm1-smc-uart";
+                               reg = <a90 10 3f80 40>;
+                               interrupts = <3>;
+                               interrupt-parent = <&CPM_PIC>;
+                               fsl,cpm-brg = <2>;
+                               fsl,cpm-command = <00d0>;
                        };
 
-                       scc@a40 {
+                       ethernet@a40 {
                                device_type = "network";
-                               compatible = "fs_enet";
-                               model = "SCC";
-                               device-id = <3>;
-                               reg = <a40 18 3e00 80>;
-                               mac-address = [ 00 00 0C 00 03 FD ];
-                               interrupts = <1c 3>;
-                               interrupt-parent = <&Cpm_pic>;
-                               phy-handle = <&Phy2>;
+                               compatible = "fsl,mpc885-scc-enet",
+                                            "fsl,cpm1-scc-enet";
+                               reg = <a40 18 3e00 100>;
+                               local-mac-address = [ 00 00 00 00 00 00 ];
+                               interrupts = <1c>;
+                               interrupt-parent = <&CPM_PIC>;
+                               phy-handle = <&PHY2>;
+                               fsl,cpm-command = <0080>;
+                               linux,network-index = <2>;
                        };
                };
        };
+
+       chosen {
+               linux,stdout-path = "/soc/cpm/serial@a80";
+       };
 };
diff --git a/arch/powerpc/boot/dts/pq2fads.dts b/arch/powerpc/boot/dts/pq2fads.dts
new file mode 100644 (file)
index 0000000..2d56492
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Device Tree for the PQ2FADS-ZU board with an MPC8280 chip.
+ *
+ * Copyright 2007 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.
+ */
+
+/ {
+       model = "pq2fads";
+       compatible = "fsl,pq2fads";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <d#32>;
+                       i-cache-line-size = <d#32>;
+                       d-cache-size = <d#16384>;
+                       i-cache-size = <d#16384>;
+                       timebase-frequency = <0>;
+                       clock-frequency = <0>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0>;
+       };
+
+       localbus@f0010100 {
+               compatible = "fsl,mpc8280-localbus",
+                            "fsl,pq2-localbus";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               reg = <f0010100 60>;
+
+               ranges = <0 0 fe000000 00800000
+                         1 0 f4500000 00008000
+                         8 0 f8200000 00008000>;
+
+               flash@0,0 {
+                       compatible = "jedec-flash";
+                       reg = <0 0 800000>;
+                       bank-width = <4>;
+                       device-width = <1>;
+               };
+
+               bcsr@1,0 {
+                       reg = <1 0 20>;
+                       compatible = "fsl,pq2fads-bcsr";
+               };
+
+               PCI_PIC: pic@8,0 {
+                       #interrupt-cells = <1>;
+                       interrupt-controller;
+                       reg = <8 0 8>;
+                       compatible = "fsl,pq2ads-pci-pic";
+                       interrupt-parent = <&PIC>;
+                       interrupts = <18 8>;
+               };
+       };
+
+       pci@f0010800 {
+               device_type = "pci";
+               reg = <f0010800 10c f00101ac 8 f00101c4 8>;
+               compatible = "fsl,mpc8280-pci", "fsl,pq2-pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               clock-frequency = <d#66000000>;
+               interrupt-map-mask = <f800 0 0 7>;
+               interrupt-map = <
+                               /* IDSEL 0x16 */
+                                b000 0 0 1 &PCI_PIC 0
+                                b000 0 0 2 &PCI_PIC 1
+                                b000 0 0 3 &PCI_PIC 2
+                                b000 0 0 4 &PCI_PIC 3
+
+                               /* IDSEL 0x17 */
+                                b800 0 0 1 &PCI_PIC 4
+                                b800 0 0 2 &PCI_PIC 5
+                                b800 0 0 3 &PCI_PIC 6
+                                b800 0 0 4 &PCI_PIC 7
+
+                               /* IDSEL 0x18 */
+                                c000 0 0 1 &PCI_PIC 8
+                                c000 0 0 2 &PCI_PIC 9
+                                c000 0 0 3 &PCI_PIC a
+                                c000 0 0 4 &PCI_PIC b>;
+
+               interrupt-parent = <&PIC>;
+               interrupts = <12 8>;
+               ranges = <42000000 0 80000000 80000000 0 20000000
+                         02000000 0 a0000000 a0000000 0 20000000
+                         01000000 0 00000000 f6000000 0 02000000>;
+       };
+
+       soc@f0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "soc";
+               compatible = "fsl,mpc8280", "fsl,pq2-soc";
+               ranges = <00000000 f0000000 00053000>;
+
+               // Temporary -- will go away once kernel uses ranges for get_immrbase().
+               reg = <f0000000 00053000>;
+
+               cpm@119c0 {
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       #interrupt-cells = <2>;
+                       compatible = "fsl,mpc8280-cpm", "fsl,cpm2";
+                       reg = <119c0 30>;
+                       ranges;
+
+                       muram@0 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0 0 10000>;
+
+                               data@0 {
+                                       compatible = "fsl,cpm-muram-data";
+                                       reg = <0 2000 9800 800>;
+                               };
+                       };
+
+                       brg@119f0 {
+                               compatible = "fsl,mpc8280-brg",
+                                            "fsl,cpm2-brg",
+                                            "fsl,cpm-brg";
+                               reg = <119f0 10 115f0 10>;
+                       };
+
+                       serial@11a00 {
+                               device_type = "serial";
+                               compatible = "fsl,mpc8280-scc-uart",
+                                            "fsl,cpm2-scc-uart";
+                               reg = <11a00 20 8000 100>;
+                               interrupts = <28 8>;
+                               interrupt-parent = <&PIC>;
+                               fsl,cpm-brg = <1>;
+                               fsl,cpm-command = <00800000>;
+                       };
+
+                       serial@11a20 {
+                               device_type = "serial";
+                               compatible = "fsl,mpc8280-scc-uart",
+                                            "fsl,cpm2-scc-uart";
+                               reg = <11a20 20 8100 100>;
+                               interrupts = <29 8>;
+                               interrupt-parent = <&PIC>;
+                               fsl,cpm-brg = <2>;
+                               fsl,cpm-command = <04a00000>;
+                       };
+
+                       ethernet@11320 {
+                               device_type = "network";
+                               compatible = "fsl,mpc8280-fcc-enet",
+                                            "fsl,cpm2-fcc-enet";
+                               reg = <11320 20 8500 100 113b0 1>;
+                               interrupts = <21 8>;
+                               interrupt-parent = <&PIC>;
+                               phy-handle = <&PHY0>;
+                               linux,network-index = <0>;
+                               fsl,cpm-command = <16200300>;
+                       };
+
+                       ethernet@11340 {
+                               device_type = "network";
+                               compatible = "fsl,mpc8280-fcc-enet",
+                                            "fsl,cpm2-fcc-enet";
+                               reg = <11340 20 8600 100 113d0 1>;
+                               interrupts = <22 8>;
+                               interrupt-parent = <&PIC>;
+                               phy-handle = <&PHY1>;
+                               linux,network-index = <1>;
+                               fsl,cpm-command = <1a400300>;
+                               local-mac-address = [00 e0 0c 00 79 01];
+                       };
+
+                       mdio@10d40 {
+                               device_type = "mdio";
+                               compatible = "fsl,pq2fads-mdio-bitbang",
+                                            "fsl,mpc8280-mdio-bitbang",
+                                            "fsl,cpm2-mdio-bitbang";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               reg = <10d40 14>;
+                               fsl,mdio-pin = <9>;
+                               fsl,mdc-pin = <a>;
+
+                               PHY0: ethernet-phy@0 {
+                                       interrupt-parent = <&PIC>;
+                                       interrupts = <19 2>;
+                                       reg = <0>;
+                                       device_type = "ethernet-phy";
+                               };
+
+                               PHY1: ethernet-phy@1 {
+                                       interrupt-parent = <&PIC>;
+                                       interrupts = <19 2>;
+                                       reg = <3>;
+                                       device_type = "ethernet-phy";
+                               };
+                       };
+
+                       usb@11b60 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,mpc8280-usb",
+                                            "fsl,cpm2-usb";
+                               reg = <11b60 18 8b00 100>;
+                               interrupt-parent = <&PIC>;
+                               interrupts = <b 8>;
+                               fsl,cpm-command = <2e600000>;
+                       };
+               };
+
+               PIC: interrupt-controller@10c00 {
+                       #interrupt-cells = <2>;
+                       interrupt-controller;
+                       reg = <10c00 80>;
+                       compatible = "fsl,mpc8280-pic", "fsl,cpm2-pic";
+               };
+
+       };
+
+       chosen {
+               linux,stdout-path = "/soc/cpm/serial@11a00";
+       };
+};
index 5300b50cdc2f8ce2bddf32d17e67ffe34d787b1b..297dfa53fe9e488be0c5532c50987dc711b25257 100644 (file)
@@ -9,10 +9,6 @@
  *
  * Property values that are labeled as "Default" will be updated by bootwrapper
  * if it can determine the exact PrPMC type.
- *
- * To build:
- *   dtc -I dts -O asm -o prpmc2800.S -b 0 prpmc2800.dts
- *   dtc -I dts -O dtb -o prpmc2800.dtb -b 0 prpmc2800.dts
  */
 
 / {
@@ -47,7 +43,6 @@
        mv64x60@f1000000 { /* Marvell Discovery */
                #address-cells = <1>;
                #size-cells = <1>;
-               #interrupt-cells = <1>;
                model = "mv64360";                      /* Default */
                compatible = "marvell,mv64x60";
                clock-frequency = <7f28155>;            /* 133.333333 MHz */
diff --git a/arch/powerpc/boot/dts/sequoia.dts b/arch/powerpc/boot/dts/sequoia.dts
new file mode 100644 (file)
index 0000000..36be75b
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * Device Tree Source for AMCC Sequoia
+ *
+ * Based on Bamboo code by Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ * Copyright (c) 2006, 2007 IBM Corp.
+ *
+ * FIXME: Draft only!
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without
+ * any warranty of any kind, whether express or implied.
+ *
+ */
+
+/ {
+       #address-cells = <2>;
+       #size-cells = <1>;
+       model = "amcc,sequoia";
+       compatible = "amcc,sequoia";
+       dcr-parent = <&/cpus/PowerPC,440EPx@0>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,440EPx@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       clock-frequency = <0>; /* Filled in by zImage */
+                       timebase-frequency = <0>; /* Filled in by zImage */
+                       i-cache-line-size = <20>;
+                       d-cache-line-size = <20>;
+                       i-cache-size = <8000>;
+                       d-cache-size = <8000>;
+                       dcr-controller;
+                       dcr-access-method = "native";
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0 0>; /* Filled in by zImage */
+       };
+
+       UIC0: interrupt-controller0 {
+               compatible = "ibm,uic-440epx","ibm,uic";
+               interrupt-controller;
+               cell-index = <0>;
+               dcr-reg = <0c0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+       };
+
+       UIC1: interrupt-controller1 {
+               compatible = "ibm,uic-440epx","ibm,uic";
+               interrupt-controller;
+               cell-index = <1>;
+               dcr-reg = <0d0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+               interrupts = <1e 4 1f 4>; /* cascade */
+               interrupt-parent = <&UIC0>;
+       };
+
+       UIC2: interrupt-controller2 {
+               compatible = "ibm,uic-440epx","ibm,uic";
+               interrupt-controller;
+               cell-index = <2>;
+               dcr-reg = <0e0 009>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+               interrupts = <1c 4 1d 4>; /* cascade */
+               interrupt-parent = <&UIC0>;
+       };
+
+       SDR0: sdr {
+               compatible = "ibm,sdr-440epx", "ibm,sdr-440ep";
+               dcr-reg = <00e 002>;
+       };
+
+       CPR0: cpr {
+               compatible = "ibm,cpr-440epx", "ibm,cpr-440ep";
+               dcr-reg = <00c 002>;
+       };
+
+       plb {
+               compatible = "ibm,plb-440epx", "ibm,plb4";
+               #address-cells = <2>;
+               #size-cells = <1>;
+               ranges;
+               clock-frequency = <0>; /* Filled in by zImage */
+
+               SDRAM0: sdram {
+                       device_type = "memory-controller";
+                       compatible = "ibm,sdram-440epx", "ibm,sdram-44x-ddr2denali";
+                       dcr-reg = <010 2>;
+               };
+
+               DMA0: dma {
+                       compatible = "ibm,dma-440epx", "ibm,dma-4xx";
+                       dcr-reg = <100 027>;
+               };
+
+               MAL0: mcmal {
+                       compatible = "ibm,mcmal-440epx", "ibm,mcmal2";
+                       dcr-reg = <180 62>;
+                       num-tx-chans = <2>;
+                       num-rx-chans = <2>;
+                       interrupt-parent = <&MAL0>;
+                       interrupts = <0 1 2 3 4>;
+                       #interrupt-cells = <1>;
+                       #address-cells = <0>;
+                       #size-cells = <0>;
+                       interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
+                                       /*RXEOB*/ 1 &UIC0 b 4
+                                       /*SERR*/  2 &UIC1 0 4
+                                       /*TXDE*/  3 &UIC1 1 4
+                                       /*RXDE*/  4 &UIC1 2 4>;
+                       interrupt-map-mask = <ffffffff>;
+               };
+
+               POB0: opb {
+                       compatible = "ibm,opb-440epx", "ibm,opb";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <00000000 1 00000000 80000000
+                                 80000000 1 80000000 80000000>;
+                       interrupt-parent = <&UIC1>;
+                       interrupts = <7 4>;
+                       clock-frequency = <0>; /* Filled in by zImage */
+
+                       EBC0: ebc {
+                               compatible = "ibm,ebc-440epx", "ibm,ebc";
+                               dcr-reg = <012 2>;
+                               #address-cells = <2>;
+                               #size-cells = <1>;
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               interrupts = <5 1>;
+                               interrupt-parent = <&UIC1>;
+
+                               nor_flash@0,0 {
+                                       compatible = "amd,s29gl256n", "cfi-flash";
+                                       bank-width = <2>;
+                                       reg = <0 000000 4000000>;
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       partition@0 {
+                                               label = "Kernel";
+                                               reg = <0 180000>;
+                                       };
+                                       partition@180000 {
+                                               label = "ramdisk";
+                                               reg = <180000 200000>;
+                                       };
+                                       partition@380000 {
+                                               label = "file system";
+                                               reg = <380000 3aa0000>;
+                                       };
+                                       partition@3e20000 {
+                                               label = "kozio";
+                                               reg = <3e20000 140000>;
+                                       };
+                                       partition@3f60000 {
+                                               label = "env";
+                                               reg = <3f60000 40000>;
+                                       };
+                                       partition@3fa0000 {
+                                               label = "u-boot";
+                                               reg = <3fa0000 60000>;
+                                       };
+                               };
+
+                       };
+
+                       UART0: serial@ef600300 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600300 8>;
+                               virtual-reg = <ef600300>;
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               current-speed = <1c200>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <0 4>;
+                       };
+
+                       UART1: serial@ef600400 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600400 8>;
+                               virtual-reg = <ef600400>;
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <1 4>;
+                       };
+
+                       UART2: serial@ef600500 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600500 8>;
+                               virtual-reg = <ef600500>;
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC1>;
+                               interrupts = <3 4>;
+                       };
+
+                       UART3: serial@ef600600 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600600 8>;
+                               virtual-reg = <ef600600>;
+                               clock-frequency = <0>;
+                               current-speed = <0>;
+                               interrupt-parent = <&UIC1>;
+                               interrupts = <4 4>;
+                       };
+
+                       IIC0: i2c@ef600700 {
+                               device_type = "i2c";
+                               compatible = "ibm,iic-440epx", "ibm,iic";
+                               reg = <ef600700 14>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <2 4>;
+                       };
+
+                       IIC1: i2c@ef600800 {
+                               device_type = "i2c";
+                               compatible = "ibm,iic-440epx", "ibm,iic";
+                               reg = <ef600800 14>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <7 4>;
+                       };
+
+                       ZMII0: emac-zmii@ef600d00 {
+                               device_type = "zmii-interface";
+                               compatible = "ibm,zmii-440epx", "ibm,zmii";
+                               reg = <ef600d00 c>;
+                       };
+
+                       EMAC0: ethernet@ef600e00 {
+                               linux,network-index = <0>;
+                               device_type = "network";
+                               compatible = "ibm,emac-440epx", "ibm,emac4";
+                               interrupt-parent = <&EMAC0>;
+                               interrupts = <0 1>;
+                               #interrupt-cells = <1>;
+                               #address-cells = <0>;
+                               #size-cells = <0>;
+                               interrupt-map = </*Status*/ 0 &UIC0 18 4
+                                               /*Wake*/  1 &UIC1 1d 4>;
+                               reg = <ef600e00 70>;
+                               local-mac-address = [000000000000];
+                               mal-device = <&MAL0>;
+                               mal-tx-channel = <0>;
+                               mal-rx-channel = <0>;
+                               cell-index = <0>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rmii";
+                               phy-map = <00000000>;
+                               zmii-device = <&ZMII0>;
+                               zmii-channel = <0>;
+                       };
+
+                       EMAC1: ethernet@ef600f00 {
+                               linux,network-index = <1>;
+                               device_type = "network";
+                               compatible = "ibm,emac-440epx", "ibm,emac4";
+                               interrupt-parent = <&EMAC1>;
+                               interrupts = <0 1>;
+                               #interrupt-cells = <1>;
+                               #address-cells = <0>;
+                               #size-cells = <0>;
+                               interrupt-map = </*Status*/ 0 &UIC0 19 4
+                                               /*Wake*/  1 &UIC1 1f 4>;
+                               reg = <ef600f00 70>;
+                               local-mac-address = [000000000000];
+                               mal-device = <&MAL0>;
+                               mal-tx-channel = <1>;
+                               mal-rx-channel = <1>;
+                               cell-index = <1>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rmii";
+                               phy-map = <00000000>;
+                               zmii-device = <&ZMII0>;
+                               zmii-channel = <1>;
+                       };
+               };
+       };
+
+       chosen {
+               linux,stdout-path = "/plb/opb/serial@ef600300";
+               bootargs = "console=ttyS0,115200";
+       };
+};
diff --git a/arch/powerpc/boot/dts/walnut.dts b/arch/powerpc/boot/dts/walnut.dts
new file mode 100644 (file)
index 0000000..ec54f4e
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ * Device Tree Source for IBM Walnut
+ *
+ * Copyright 2007 IBM Corp.
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without
+ * any warranty of any kind, whether express or implied.
+ */
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+       model = "ibm,walnut";
+       compatible = "ibm,walnut";
+       dcr-parent = <&/cpus/PowerPC,405GP@0>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,405GP@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       clock-frequency = <bebc200>; /* Filled in by zImage */
+                       timebase-frequency = <0>; /* Filled in by zImage */
+                       i-cache-line-size = <20>;
+                       d-cache-line-size = <20>;
+                       i-cache-size = <4000>;
+                       d-cache-size = <4000>;
+                       dcr-controller;
+                       dcr-access-method = "native";
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <0 0>; /* Filled in by zImage */
+       };
+
+       UIC0: interrupt-controller {
+               compatible = "ibm,uic";
+               interrupt-controller;
+               cell-index = <0>;
+               dcr-reg = <0c0 9>;
+               #address-cells = <0>;
+               #size-cells = <0>;
+               #interrupt-cells = <2>;
+       };
+
+       plb {
+               compatible = "ibm,plb3";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               clock-frequency = <0>; /* Filled in by zImage */
+
+               SDRAM0: memory-controller {
+                       compatible = "ibm,sdram-405gp";
+                       dcr-reg = <010 2>;
+               };
+
+               MAL: mcmal {
+                       compatible = "ibm,mcmal-405gp", "ibm,mcmal";
+                       dcr-reg = <180 62>;
+                       num-tx-chans = <2>;
+                       num-rx-chans = <1>;
+                       interrupt-parent = <&UIC0>;
+                       interrupts = <a 4 b 4 c 4 d 4 e 4>;
+               };
+
+               POB0: opb {
+                       compatible = "ibm,opb-405gp", "ibm,opb";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <ef600000 ef600000 a00000>;
+                       dcr-reg = <0a0 5>;
+                       clock-frequency = <0>; /* Filled in by zImage */
+
+                       UART0: serial@ef600300 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600300 8>;
+                               virtual-reg = <ef600300>;
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               current-speed = <2580>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <0 4>;
+                       };
+
+                       UART1: serial@ef600400 {
+                               device_type = "serial";
+                               compatible = "ns16550";
+                               reg = <ef600400 8>;
+                               virtual-reg = <ef600400>;
+                               clock-frequency = <0>; /* Filled in by zImage */
+                               current-speed = <2580>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <1 4>;
+                       };
+
+                       IIC: i2c@ef600500 {
+                               compatible = "ibm,iic-405gp", "ibm,iic";
+                               reg = <ef600500 11>;
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <2 4>;
+                       };
+
+                       GPIO: gpio@ef600700 {
+                               compatible = "ibm,gpio-405gp";
+                               reg = <ef600700 20>;
+                       };
+
+                       EMAC: ethernet@ef600800 {
+                               linux,network-index = <0>;
+                               device_type = "network";
+                               compatible = "ibm,emac-405gp", "ibm,emac";
+                               interrupt-parent = <&UIC0>;
+                               interrupts = <9 4 f 4>;
+                               reg = <ef600800 70>;
+                               mal-device = <&MAL>;
+                               mal-tx-channel = <0 1>;
+                               mal-rx-channel = <0>;
+                               cell-index = <0>;
+                               max-frame-size = <5dc>;
+                               rx-fifo-size = <1000>;
+                               tx-fifo-size = <800>;
+                               phy-mode = "rmii";
+                               phy-map = <00000001>;
+                       };
+
+               };
+
+               EBC0: ebc {
+                       compatible = "ibm,ebc-405gp", "ibm,ebc";
+                       dcr-reg = <012 2>;
+                       #address-cells = <2>;
+                       #size-cells = <1>;
+                       /* The ranges property is supplied by the bootwrapper
+                        * and is based on the firmware's configuration of the
+                        * EBC bridge
+                        */
+                       clock-frequency = <0>; /* Filled in by zImage */
+
+                       sram@0,0 {
+                               reg = <0 0 80000>;
+                       };
+
+                       flash@0,80000 {
+                               compatible = "jedec-flash";
+                               bank-width = <1>;
+                               reg = <0 80000 80000>;
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               partition@0 {
+                                       label = "OpenBIOS";
+                                       reg = <0 80000>;
+                                       read-only;
+                               };
+                       };
+
+                       ds1743@1,0 {
+                               /* NVRAM and RTC */
+                               compatible = "ds1743";
+                               reg = <1 0 2000>;
+                       };
+
+                       keyboard@2,0 {
+                               compatible = "intel,82C42PC";
+                               reg = <2 0 2>;
+                       };
+
+                       ir@3,0 {
+                               compatible = "ti,TIR2000PAG";
+                               reg = <3 0 10>;
+                       };
+
+                       fpga@7,0 {
+                               compatible = "Walnut-FPGA";
+                               reg = <7 0 10>;
+                               virtual-reg = <f0300005>;
+                       };
+               };
+       };
+
+       chosen {
+               linux,stdout-path = "/plb/opb/serial@ef600300";
+       };
+};
index 75daedafd0a4d3c48f6924d54e7f6c8fbd3d656a..86c0f5df0a86358925d3d0b8c19b91c79a3fa5e5 100644 (file)
 #include "page.h"
 #include "ops.h"
 #include "reg.h"
+#include "io.h"
 #include "dcr.h"
+#include "4xx.h"
 #include "44x.h"
 
-extern char _dtb_start[];
-extern char _dtb_end[];
-
 static u8 *ebony_mac0, *ebony_mac1;
 
 /* Calculate 440GP clocks */
@@ -92,15 +91,53 @@ void ibm440gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
        dt_fixup_clock("/plb/opb/serial@40000300", uart1);
 }
 
+#define EBONY_FPGA_PATH                "/plb/opb/ebc/fpga"
+#define        EBONY_FPGA_FLASH_SEL    0x01
+#define EBONY_SMALL_FLASH_PATH "/plb/opb/ebc/small-flash"
+
+static void ebony_flashsel_fixup(void)
+{
+       void *devp;
+       u32 reg[3] = {0x0, 0x0, 0x80000};
+       u8 *fpga;
+       u8 fpga_reg0 = 0x0;
+
+       devp = finddevice(EBONY_FPGA_PATH);
+       if (!devp)
+               fatal("Couldn't locate FPGA node %s\n\r", EBONY_FPGA_PATH);
+
+       if (getprop(devp, "virtual-reg", &fpga, sizeof(fpga)) != sizeof(fpga))
+               fatal("%s has missing or invalid virtual-reg property\n\r",
+                     EBONY_FPGA_PATH);
+
+       fpga_reg0 = in_8(fpga);
+
+       devp = finddevice(EBONY_SMALL_FLASH_PATH);
+       if (!devp)
+               fatal("Couldn't locate small flash node %s\n\r",
+                     EBONY_SMALL_FLASH_PATH);
+
+       if (getprop(devp, "reg", reg, sizeof(reg)) != sizeof(reg))
+               fatal("%s has reg property of unexpected size\n\r",
+                     EBONY_SMALL_FLASH_PATH);
+
+       /* Invert address bit 14 (IBM-endian) if FLASH_SEL fpga bit is set */
+       if (fpga_reg0 & EBONY_FPGA_FLASH_SEL)
+               reg[1] ^= 0x80000;
+
+       setprop(devp, "reg", reg, sizeof(reg));
+}
+
 static void ebony_fixups(void)
 {
        // FIXME: sysclk should be derived by reading the FPGA registers
        unsigned long sysclk = 33000000;
 
        ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
-       ibm44x_fixup_memsize();
+       ibm4xx_fixup_memsize();
        dt_fixup_mac_addresses(ebony_mac0, ebony_mac1);
        ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
+       ebony_flashsel_fixup();
 }
 
 void ebony_init(void *mac0, void *mac1)
diff --git a/arch/powerpc/boot/ep88xc.c b/arch/powerpc/boot/ep88xc.c
new file mode 100644 (file)
index 0000000..6b87cdc
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Embedded Planet EP88xC with PlanetCore firmware
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "planetcore.h"
+#include "mpc8xx.h"
+
+static char *table;
+static u64 mem_size;
+
+static void platform_fixups(void)
+{
+       u64 val;
+
+       dt_fixup_memory(0, mem_size);
+       planetcore_set_mac_addrs(table);
+
+       if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
+               printf("No PlanetCore crystal frequency key.\r\n");
+               return;
+       }
+
+       mpc885_fixup_clocks(val);
+}
+
+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
+                   unsigned long r6, unsigned long r7)
+{
+       table = (char *)r3;
+       planetcore_prepare_table(table);
+
+       if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
+               return;
+
+       mem_size *= 1024 * 1024;
+       simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
+
+       ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
+
+       planetcore_set_stdout_path(table);
+
+       serial_console_init();
+       platform_ops.fixups = platform_fixups;
+}
diff --git a/arch/powerpc/boot/fixed-head.S b/arch/powerpc/boot/fixed-head.S
new file mode 100644 (file)
index 0000000..8e14cd9
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+       .global _zimage_start
+_zimage_start:
+       b       _zimage_start_lib
index 13761bf160c406c4b4e29fb9fa8b869db35886f5..cf30675c61166cb666d5e14f89cdd5b55315f190 100644 (file)
@@ -354,16 +354,21 @@ static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz)
        cxt->p += sza;
 }
 
-int ft_begin_node(struct ft_cxt *cxt, const char *name)
+char *ft_begin_node(struct ft_cxt *cxt, const char *name)
 {
        unsigned long nlen = strlen(name) + 1;
        unsigned long len = 8 + _ALIGN(nlen, 4);
+       char *ret;
 
        if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
-               return -1;
+               return NULL;
+
+       ret = cxt->p;
+
        ft_put_word(cxt, OF_DT_BEGIN_NODE);
        ft_put_bin(cxt, name, strlen(name) + 1);
-       return 0;
+
+       return ret;
 }
 
 void ft_end_node(struct ft_cxt *cxt)
@@ -625,25 +630,17 @@ void ft_end_tree(struct ft_cxt *cxt)
        bph->dt_strings_size = cpu_to_be32(ssize);
 }
 
-void *ft_find_device(struct ft_cxt *cxt, const char *srch_path)
-{
-       char *node;
-
-       /* require absolute path */
-       if (srch_path[0] != '/')
-               return NULL;
-       node = ft_find_descendent(cxt, ft_root_node(cxt), srch_path);
-       return ft_get_phandle(cxt, node);
-}
-
-void *ft_find_device_rel(struct ft_cxt *cxt, const void *top,
-                         const char *srch_path)
+void *ft_find_device(struct ft_cxt *cxt, const void *top, const char *srch_path)
 {
        char *node;
 
-       node = ft_node_ph2node(cxt, top);
-       if (node == NULL)
-               return NULL;
+       if (top) {
+               node = ft_node_ph2node(cxt, top);
+               if (node == NULL)
+                       return NULL;
+       } else {
+               node = ft_root_node(cxt);
+       }
 
        node = ft_find_descendent(cxt, node, srch_path);
        return ft_get_phandle(cxt, node);
@@ -945,7 +942,7 @@ int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname)
 void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
 {
        struct ft_atom atom;
-       char *p, *next;
+       char *p, *next, *ret;
        int depth = 0;
 
        if (parent) {
@@ -970,11 +967,70 @@ void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
                                break;
                        /* end of node, insert here */
                        cxt->p = p;
-                       ft_begin_node(cxt, name);
+                       ret = ft_begin_node(cxt, name);
                        ft_end_node(cxt);
-                       return p;
+                       return ft_get_phandle(cxt, ret);
                }
                p = next;
        }
        return NULL;
 }
+
+/* Returns the start of the path within the provided buffer, or NULL on
+ * error.
+ */
+char *ft_get_path(struct ft_cxt *cxt, const void *phandle,
+                  char *buf, int len)
+{
+       const char *path_comp[FT_MAX_DEPTH];
+       struct ft_atom atom;
+       char *p, *next, *pos;
+       int depth = 0, i;
+       void *node;
+
+       node = ft_node_ph2node(cxt, phandle);
+       if (node == NULL)
+               return NULL;
+
+       p = ft_root_node(cxt);
+
+       while ((next = ft_next(cxt, p, &atom)) != NULL) {
+               switch (atom.tag) {
+               case OF_DT_BEGIN_NODE:
+                       path_comp[depth++] = atom.name;
+                       if (p == node)
+                               goto found;
+
+                       break;
+
+               case OF_DT_END_NODE:
+                       if (--depth == 0)
+                               return NULL;
+               }
+
+               p = next;
+       }
+
+found:
+       pos = buf;
+       for (i = 1; i < depth; i++) {
+               int this_len;
+
+               if (len <= 1)
+                       return NULL;
+
+               *pos++ = '/';
+               len--;
+
+               strncpy(pos, path_comp[i], len);
+
+               if (pos[len - 1] != 0)
+                       return NULL;
+
+               this_len = strlen(pos);
+               len -= this_len;
+               pos += this_len;
+       }
+
+       return buf;
+}
index cb26325d72db9cc84562199819af862f0f2ec76c..b0957a2d967f34f57986023204b8344b22f52d54 100644 (file)
@@ -76,7 +76,7 @@ struct ft_cxt {
        unsigned int nodes_used;
 };
 
-int ft_begin_node(struct ft_cxt *cxt, const char *name);
+char *ft_begin_node(struct ft_cxt *cxt, const char *name);
 void ft_end_node(struct ft_cxt *cxt);
 
 void ft_begin_tree(struct ft_cxt *cxt);
@@ -96,9 +96,8 @@ int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
 
 void ft_dump_blob(const void *bphp);
 void ft_merge_blob(struct ft_cxt *cxt, void *blob);
-void *ft_find_device(struct ft_cxt *cxt, const char *srch_path);
-void *ft_find_device_rel(struct ft_cxt *cxt, const void *top,
-                         const char *srch_path);
+void *ft_find_device(struct ft_cxt *cxt, const void *top,
+                     const char *srch_path);
 void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path);
 int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
                void *buf, const unsigned int buflen);
@@ -109,5 +108,6 @@ void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
                                  const char *propname, const char *propval,
                                  int proplen);
 void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name);
+char *ft_get_path(struct ft_cxt *cxt, const void *phandle, char *buf, int len);
 
 #endif /* FLATDEVTREE_H */
index 83bc1c718836f8d80a525aca082e971c9cedcdb6..ad0420da8921616f3c74c668a3c862b9048530a4 100644 (file)
 #define be64_to_cpu(x)         (x)
 #define cpu_to_be64(x)         (x)
 
-static inline int strncmp(const char *cs, const char *ct, size_t count)
-{
-       signed char __res = 0;
-
-       while (count) {
-               if ((__res = *cs - *ct++) != 0 || !*cs++)
-                       break;
-               count--;
-       }
-       return __res;
-}
-
-static inline char *strchr(const char *s, int c)
-{
-       for (; *s != (char)c; ++s)
-               if (*s == '\0')
-                       return NULL;
-       return (char *)s;
-}
-
 #endif /* _PPC_BOOT_FLATDEVTREE_ENV_H_ */
index 4341e6558c1a73f4e4eced0416c4471c9cbb6d01..b3670096fa719fec1b3a8c50db7e7bc24d12478e 100644 (file)
@@ -18,7 +18,7 @@ static struct ft_cxt cxt;
 
 static void *fdtm_finddevice(const char *name)
 {
-       return ft_find_device(&cxt, name);
+       return ft_find_device(&cxt, NULL, name);
 }
 
 static int fdtm_getprop(const void *phandle, const char *propname,
@@ -58,6 +58,11 @@ static unsigned long fdtm_finalize(void)
        return (unsigned long)cxt.bph;
 }
 
+static char *fdtm_get_path(const void *phandle, char *buf, int len)
+{
+       return ft_get_path(&cxt, phandle, buf, len);
+}
+
 int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device)
 {
        dt_ops.finddevice = fdtm_finddevice;
@@ -67,6 +72,7 @@ int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device)
        dt_ops.create_node = fdtm_create_node;
        dt_ops.find_node_by_prop_value = fdtm_find_node_by_prop_value;
        dt_ops.finalize = fdtm_finalize;
+       dt_ops.get_path = fdtm_get_path;
 
        return ft_open(&cxt, dt_blob, max_size, max_find_device,
                        platform_ops.realloc);
diff --git a/arch/powerpc/boot/fsl-soc.c b/arch/powerpc/boot/fsl-soc.c
new file mode 100644 (file)
index 0000000..b835ed6
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Freescale SOC support functions
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "types.h"
+#include "fsl-soc.h"
+#include "stdio.h"
+
+static u32 prop_buf[MAX_PROP_LEN / 4];
+
+u32 *fsl_get_immr(void)
+{
+       void *soc;
+       unsigned long ret = 0;
+
+       soc = find_node_by_devtype(NULL, "soc");
+       if (soc) {
+               int size;
+               u32 naddr;
+
+               size = getprop(soc, "#address-cells", prop_buf, MAX_PROP_LEN);
+               if (size == 4)
+                       naddr = prop_buf[0];
+               else
+                       naddr = 2;
+
+               if (naddr != 1 && naddr != 2)
+                       goto err;
+
+               size = getprop(soc, "ranges", prop_buf, MAX_PROP_LEN);
+
+               if (size < 12)
+                       goto err;
+               if (prop_buf[0] != 0)
+                       goto err;
+               if (naddr == 2 && prop_buf[1] != 0)
+                       goto err;
+
+               if (!dt_xlate_addr(soc, prop_buf + naddr, 8, &ret))
+                       ret = 0;
+       }
+
+err:
+       if (!ret)
+               printf("fsl_get_immr: Failed to find immr base\r\n");
+
+       return (u32 *)ret;
+}
diff --git a/arch/powerpc/boot/fsl-soc.h b/arch/powerpc/boot/fsl-soc.h
new file mode 100644 (file)
index 0000000..5da26fc
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _PPC_BOOT_FSL_SOC_H_
+#define _PPC_BOOT_FSL_SOC_H_
+
+#include "types.h"
+
+u32 *fsl_get_immr(void);
+
+#endif
index df8ab07e9ff46242749deda96f21b7de015bad46..ef2aed0f63ca8c6eb9523495513b0fc008fa96fa 100644 (file)
@@ -78,6 +78,7 @@ void gunzip_start(struct gunzip_state *state, void *src, int srclen)
                        fatal("inflateInit2 returned %d\n\r", r);
        }
 
+       state->s.total_in = hdrlen;
        state->s.next_in = src + hdrlen;
        state->s.avail_in = srclen - hdrlen;
 }
@@ -193,13 +194,10 @@ int gunzip_finish(struct gunzip_state *state, void *dst, int dstlen)
 {
        int len;
 
+       len = gunzip_partial(state, dst, dstlen);
+
        if (state->s.workspace) {
-               len = gunzip_partial(state, dst, dstlen);
                zlib_inflateEnd(&state->s);
-       } else {
-               /* uncompressed image */
-               len = min(state->s.avail_in, (unsigned)dstlen);
-               memcpy(dst, state->s.next_in, len);
        }
 
        return len;
index 7d6539f5e22c2e00bc9a8af066ba9945e843a203..199e783aea4d3c3fa4a71ef995203f86174a88ed 100644 (file)
 #include "ops.h"
 #include "io.h"
 
-extern char _start[];
-extern char _end[];
-extern char _dtb_start[];
-extern char _dtb_end[];
-
 BSS_STACK(4096);
 
 void platform_init(unsigned long r3, unsigned long r4, unsigned long r5)
index 32974ed49e02eac1163905566f6c88a2ca78cc43..ccaedaec50d59cc6e530c3973939e3e5eb4771fa 100644 (file)
@@ -1,5 +1,8 @@
 #ifndef _IO_H
 #define __IO_H
+
+#include "types.h"
+
 /*
  * Low-level I/O routines.
  *
@@ -20,6 +23,37 @@ static inline void out_8(volatile unsigned char *addr, int val)
                             : "=m" (*addr) : "r" (val));
 }
 
+static inline unsigned in_le16(const volatile u16 *addr)
+{
+       unsigned ret;
+
+       __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "r" (addr), "m" (*addr));
+
+       return ret;
+}
+
+static inline unsigned in_be16(const volatile u16 *addr)
+{
+       unsigned ret;
+
+       __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
+                            : "=r" (ret) : "m" (*addr));
+       return ret;
+}
+
+static inline void out_le16(volatile u16 *addr, int val)
+{
+       __asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
+                            : "r" (val), "r" (addr));
+}
+
+static inline void out_be16(volatile u16 *addr, int val)
+{
+       __asm__ __volatile__("sth%U0%X0 %1,%0; sync"
+                            : "=m" (*addr) : "r" (val));
+}
+
 static inline unsigned in_le32(const volatile unsigned *addr)
 {
        unsigned ret;
@@ -50,4 +84,19 @@ static inline void out_be32(volatile unsigned *addr, int val)
                             : "=m" (*addr) : "r" (val));
 }
 
+static inline void sync(void)
+{
+       asm volatile("sync" : : : "memory");
+}
+
+static inline void eieio(void)
+{
+       asm volatile("eieio" : : : "memory");
+}
+
+static inline void barrier(void)
+{
+       asm volatile("" : : : "memory");
+}
+
 #endif /* _IO_H */
index 416dc3857bfe8dcc468c8f6c3d0953970a31de40..1b496b37eca0b8efc1230e20f02ea2344d530b28 100644 (file)
 #include "flatdevtree.h"
 #include "reg.h"
 
-extern char _start[];
-extern char __bss_start[];
-extern char _end[];
-extern char _vmlinux_start[];
-extern char _vmlinux_end[];
-extern char _initrd_start[];
-extern char _initrd_end[];
-extern char _dtb_start[];
-extern char _dtb_end[];
-
 static struct gunzip_state gzstate;
 
 struct addr_range {
diff --git a/arch/powerpc/boot/mpc52xx-psc.c b/arch/powerpc/boot/mpc52xx-psc.c
new file mode 100644 (file)
index 0000000..1074626
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * MPC5200 PSC serial console support.
+ *
+ * Author: Grant Likely <grant.likely@secretlab.ca>
+ *
+ * Copyright (c) 2007 Secret Lab Technologies Ltd.
+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
+ *
+ * It is assumed that the firmware (or the platform file) has already set
+ * up the port.
+ */
+
+#include "types.h"
+#include "io.h"
+#include "ops.h"
+
+/* Programmable Serial Controller (PSC) status register bits */
+#define MPC52xx_PSC_SR         0x04
+#define MPC52xx_PSC_SR_RXRDY           0x0100
+#define MPC52xx_PSC_SR_RXFULL          0x0200
+#define MPC52xx_PSC_SR_TXRDY           0x0400
+#define MPC52xx_PSC_SR_TXEMP           0x0800
+
+#define MPC52xx_PSC_BUFFER     0x0C
+
+static void *psc;
+
+static int psc_open(void)
+{
+       /* Assume the firmware has already configured the PSC into
+        * uart mode */
+       return 0;
+}
+
+static void psc_putc(unsigned char c)
+{
+       while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_TXRDY)) ;
+       out_8(psc + MPC52xx_PSC_BUFFER, c);
+}
+
+static unsigned char psc_tstc(void)
+{
+       return (in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY) != 0;
+}
+
+static unsigned char psc_getc(void)
+{
+       while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY)) ;
+       return in_8(psc + MPC52xx_PSC_BUFFER);
+}
+
+int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp)
+{
+       int n;
+
+       /* Get the base address of the psc registers */
+       n = getprop(devp, "virtual-reg", &psc, sizeof(psc));
+       if (n != sizeof(psc)) {
+               if (!dt_xlate_reg(devp, 0, (void *)&psc, NULL))
+                       return -1;
+       }
+
+       scdp->open = psc_open;
+       scdp->putc = psc_putc;
+       scdp->getc = psc_getc;
+       scdp->tstc = psc_tstc;
+
+       return 0;
+}
diff --git a/arch/powerpc/boot/mpc8xx.c b/arch/powerpc/boot/mpc8xx.c
new file mode 100644 (file)
index 0000000..add55a7
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * MPC8xx support functions
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "types.h"
+#include "fsl-soc.h"
+#include "mpc8xx.h"
+#include "stdio.h"
+#include "io.h"
+
+#define MPC8XX_PLPRCR (0x284/4) /* PLL and Reset Control Register */
+
+/* Return system clock from crystal frequency */
+u32 mpc885_get_clock(u32 crystal)
+{
+       u32 *immr;
+       u32 plprcr;
+       int mfi, mfn, mfd, pdf, div;
+       u32 ret;
+
+       immr = fsl_get_immr();
+       if (!immr) {
+               printf("mpc885_get_clock: Couldn't get IMMR base.\r\n");
+               return 0;
+       }
+
+       plprcr = in_be32(&immr[MPC8XX_PLPRCR]);
+
+       mfi = (plprcr >> 16) & 15;
+       if (mfi < 5) {
+               printf("Warning: PLPRCR[MFI] value of %d out-of-bounds\r\n",
+                      mfi);
+               mfi = 5;
+       }
+
+       pdf = (plprcr >> 1) & 0xf;
+       div = (plprcr >> 20) & 3;
+       mfd = (plprcr >> 22) & 0x1f;
+       mfn = (plprcr >> 27) & 0x1f;
+
+       ret = crystal * mfi;
+
+       if (mfn != 0)
+               ret += crystal * mfn / (mfd + 1);
+
+       return ret / (pdf + 1);
+}
+
+/* Set common device tree fields based on the given clock frequencies. */
+void mpc8xx_set_clocks(u32 sysclk)
+{
+       void *node;
+
+       dt_fixup_cpu_clocks(sysclk, sysclk / 16, sysclk);
+
+       node = finddevice("/soc/cpm");
+       if (node)
+               setprop(node, "clock-frequency", &sysclk, 4);
+
+       node = finddevice("/soc/cpm/brg");
+       if (node)
+               setprop(node, "clock-frequency", &sysclk, 4);
+}
+
+int mpc885_fixup_clocks(u32 crystal)
+{
+       u32 sysclk = mpc885_get_clock(crystal);
+       if (!sysclk)
+               return 0;
+
+       mpc8xx_set_clocks(sysclk);
+       return 1;
+}
diff --git a/arch/powerpc/boot/mpc8xx.h b/arch/powerpc/boot/mpc8xx.h
new file mode 100644 (file)
index 0000000..3f59901
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _PPC_BOOT_MPC8xx_H_
+#define _PPC_BOOT_MPC8xx_H_
+
+#include "types.h"
+
+void mpc8xx_set_clocks(u32 sysclk);
+
+u32 mpc885_get_clock(u32 crystal);
+int mpc885_fixup_clocks(u32 crystal);
+
+#endif
index f1c0e965e5ceb74acdb850c2a8b8c67aab0a66d5..802ea53790d8ca7ec4373761fcc8440b17e204f4 100644 (file)
@@ -17,7 +17,6 @@
 #include "io.h"
 #include "ops.h"
 
-extern void udelay(long delay);
 
 #define MPSC_CHR_1             0x000c
 
index 435fe85286801c7a6cb2037d66566316cb154b72..d085377be3bc86ae41de8d6ed4b88d42697004ab 100644 (file)
@@ -21,8 +21,6 @@
 #include "ops.h"
 #include "mv64x60.h"
 
-extern void udelay(long);
-
 /* Register defines */
 #define MV64x60_I2C_REG_SLAVE_ADDR                     0x00
 #define MV64x60_I2C_REG_DATA                           0x04
index 385e08b83b7e8070831a305bb66ce48ad024f42c..61d9899aa0d09d371c99ec70b7959693f8bfab36 100644 (file)
@@ -17,8 +17,6 @@
 
 #include "of.h"
 
-extern char _end[];
-
 /* Value picked to match that used by yaboot */
 #define PROG_START     0x01400000      /* only used on 64-bit systems */
 #define RAM_END                (512<<20)       /* Fixme: use OF */
index 86077066cd7cae1a8c42f0f679f44431ebd241a7..a180b6505f477c8e1422be0ba64eadeeed1d5ff5 100644 (file)
@@ -47,6 +47,7 @@ struct dt_ops {
                                         const char *propname,
                                         const char *propval, int proplen);
        unsigned long (*finalize)(void);
+       char *(*get_path)(const void *phandle, char *buf, int len);
 };
 extern struct dt_ops dt_ops;
 
@@ -82,11 +83,16 @@ int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
 int serial_console_init(void);
 int ns16550_console_init(void *devp, struct serial_console_data *scdp);
 int mpsc_console_init(void *devp, struct serial_console_data *scdp);
+int cpm_console_init(void *devp, struct serial_console_data *scdp);
+int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp);
+int uartlite_console_init(void *devp, struct serial_console_data *scdp);
 void *simple_alloc_init(char *base, unsigned long heap_size,
                        unsigned long granularity, unsigned long max_allocs);
 extern void flush_cache(void *, unsigned long);
 int dt_xlate_reg(void *node, int res, unsigned long *addr, unsigned long *size);
 int dt_xlate_addr(void *node, u32 *buf, int buflen, unsigned long *xlated_addr);
+int dt_is_compatible(void *node, const char *compat);
+void dt_get_reg_format(void *node, u32 *naddr, u32 *nsize);
 
 static inline void *finddevice(const char *name)
 {
@@ -156,6 +162,7 @@ static inline void *find_node_by_devtype(const void *prev,
 void dt_fixup_memory(u64 start, u64 size);
 void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq);
 void dt_fixup_clock(const char *path, u32 freq);
+void dt_fixup_mac_address(u32 index, const u8 *addr);
 void __dt_fixup_mac_addresses(u32 startindex, ...);
 #define dt_fixup_mac_addresses(...) \
        __dt_fixup_mac_addresses(0, __VA_ARGS__, NULL)
@@ -167,6 +174,14 @@ static inline void *find_node_by_linuxphandle(const u32 linuxphandle)
                        (char *)&linuxphandle, sizeof(u32));
 }
 
+static inline char *get_path(const void *phandle, char *buf, int len)
+{
+       if (dt_ops.get_path)
+               return dt_ops.get_path(phandle, buf, len);
+
+       return NULL;
+}
+
 static inline void *malloc(unsigned long size)
 {
        return (platform_ops.malloc) ? platform_ops.malloc(size) : NULL;
@@ -191,4 +206,25 @@ static inline void exit(void)
        static char _bss_stack[size]; \
        void *_platform_stack_top = _bss_stack + sizeof(_bss_stack);
 
+extern unsigned long timebase_period_ns;
+void udelay(long delay);
+
+extern char _start[];
+extern char __bss_start[];
+extern char _end[];
+extern char _vmlinux_start[];
+extern char _vmlinux_end[];
+extern char _initrd_start[];
+extern char _initrd_end[];
+extern char _dtb_start[];
+extern char _dtb_end[];
+
+static inline __attribute__((const))
+int __ilog2_u32(u32 n)
+{
+       int bit;
+       asm ("cntlzw %0,%1" : "=r" (bit) : "r" (n));
+       return 31 - bit;
+}
+
 #endif /* _PPC_BOOT_OPS_H_ */
diff --git a/arch/powerpc/boot/planetcore.c b/arch/powerpc/boot/planetcore.c
new file mode 100644 (file)
index 0000000..0d8558a
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * PlanetCore configuration data support functions
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "stdio.h"
+#include "stdlib.h"
+#include "ops.h"
+#include "planetcore.h"
+#include "io.h"
+
+/* PlanetCore passes information to the OS in the form of
+ * a table of key=value strings, separated by newlines.
+ *
+ * The list is terminated by an empty string (i.e. two
+ * consecutive newlines).
+ *
+ * To make it easier to parse, we first convert all the
+ * newlines into null bytes.
+ */
+
+void planetcore_prepare_table(char *table)
+{
+       do {
+               if (*table == '\n')
+                       *table = 0;
+
+               table++;
+       } while (*(table - 1) || *table != '\n');
+
+       *table = 0;
+}
+
+const char *planetcore_get_key(const char *table, const char *key)
+{
+       int keylen = strlen(key);
+
+       do {
+               if (!strncmp(table, key, keylen) && table[keylen] == '=')
+                       return table + keylen + 1;
+
+               table += strlen(table) + 1;
+       } while (strlen(table) != 0);
+
+       return NULL;
+}
+
+int planetcore_get_decimal(const char *table, const char *key, u64 *val)
+{
+       const char *str = planetcore_get_key(table, key);
+       if (!str)
+               return 0;
+
+       *val = strtoull(str, NULL, 10);
+       return 1;
+}
+
+int planetcore_get_hex(const char *table, const char *key, u64 *val)
+{
+       const char *str = planetcore_get_key(table, key);
+       if (!str)
+               return 0;
+
+       *val = strtoull(str, NULL, 16);
+       return 1;
+}
+
+static u64 mac_table[4] = {
+       0x000000000000,
+       0x000000800000,
+       0x000000400000,
+       0x000000c00000,
+};
+
+void planetcore_set_mac_addrs(const char *table)
+{
+       u8 addr[4][6];
+       u64 int_addr;
+       u32 i;
+       int j;
+
+       if (!planetcore_get_hex(table, PLANETCORE_KEY_MAC_ADDR, &int_addr))
+               return;
+
+       for (i = 0; i < 4; i++) {
+               u64 this_dev_addr = (int_addr & ~0x000000c00000) |
+                                   mac_table[i];
+
+               for (j = 5; j >= 0; j--) {
+                       addr[i][j] = this_dev_addr & 0xff;
+                       this_dev_addr >>= 8;
+               }
+
+               dt_fixup_mac_address(i, addr[i]);
+       }
+}
+
+static char prop_buf[MAX_PROP_LEN];
+
+void planetcore_set_stdout_path(const char *table)
+{
+       char *path;
+       const char *label;
+       void *node, *chosen;
+
+       label = planetcore_get_key(table, PLANETCORE_KEY_SERIAL_PORT);
+       if (!label)
+               return;
+
+       node = find_node_by_prop_value_str(NULL, "linux,planetcore-label",
+                                          label);
+       if (!node)
+               return;
+
+       path = get_path(node, prop_buf, MAX_PROP_LEN);
+       if (!path)
+               return;
+
+       chosen = finddevice("/chosen");
+       if (!chosen)
+               chosen = create_node(NULL, "chosen");
+       if (!chosen)
+               return;
+
+       setprop_str(chosen, "linux,stdout-path", path);
+}
+
+void planetcore_set_serial_speed(const char *table)
+{
+       void *chosen, *stdout;
+       u64 baud;
+       u32 baud32;
+       int len;
+
+       chosen = finddevice("/chosen");
+       if (!chosen)
+               return;
+
+       len = getprop(chosen, "linux,stdout-path", prop_buf, MAX_PROP_LEN);
+       if (len <= 0)
+               return;
+
+       stdout = finddevice(prop_buf);
+       if (!stdout) {
+               printf("planetcore_set_serial_speed: "
+                      "Bad /chosen/linux,stdout-path.\r\n");
+
+               return;
+       }
+
+       if (!planetcore_get_decimal(table, PLANETCORE_KEY_SERIAL_BAUD,
+                                   &baud)) {
+               printf("planetcore_set_serial_speed: No SB tag.\r\n");
+               return;
+       }
+
+       baud32 = baud;
+       setprop(stdout, "current-speed", &baud32, 4);
+}
diff --git a/arch/powerpc/boot/planetcore.h b/arch/powerpc/boot/planetcore.h
new file mode 100644 (file)
index 0000000..0d4094f
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef _PPC_BOOT_PLANETCORE_H_
+#define _PPC_BOOT_PLANETCORE_H_
+
+#include "types.h"
+
+#define PLANETCORE_KEY_BOARD_TYPE   "BO"
+#define PLANETCORE_KEY_BOARD_REV    "BR"
+#define PLANETCORE_KEY_MB_RAM       "D1"
+#define PLANETCORE_KEY_MAC_ADDR     "EA"
+#define PLANETCORE_KEY_FLASH_SPEED  "FS"
+#define PLANETCORE_KEY_IP_ADDR      "IP"
+#define PLANETCORE_KEY_KB_NVRAM     "NV"
+#define PLANETCORE_KEY_PROCESSOR    "PR"
+#define PLANETCORE_KEY_PROC_VARIANT "PV"
+#define PLANETCORE_KEY_SERIAL_BAUD  "SB"
+#define PLANETCORE_KEY_SERIAL_PORT  "SP"
+#define PLANETCORE_KEY_SWITCH       "SW"
+#define PLANETCORE_KEY_TEMP_OFFSET  "TC"
+#define PLANETCORE_KEY_TARGET_IP    "TIP"
+#define PLANETCORE_KEY_CRYSTAL_HZ   "XT"
+
+/* Prepare the table for processing, by turning all newlines
+ * into NULL bytes.
+ */
+void planetcore_prepare_table(char *table);
+
+/* Return the value associated with a given key in text,
+ * decimal, or hex format.
+ *
+ * Returns zero/NULL on failure, non-zero on success.
+ */
+const char *planetcore_get_key(const char *table, const char *key);
+int planetcore_get_decimal(const char *table, const char *key, u64 *val);
+int planetcore_get_hex(const char *table, const char *key, u64 *val);
+
+/* Updates the device tree local-mac-address properties based
+ * on the EA tag.
+ */
+void planetcore_set_mac_addrs(const char *table);
+
+/* Sets the linux,stdout-path in the /chosen node.  This requires the
+ * linux,planetcore-label property in each serial node.
+ */
+void planetcore_set_stdout_path(const char *table);
+
+/* Sets the current-speed property in the serial node. */
+void planetcore_set_serial_speed(const char *table);
+
+#endif
index 5290ff2c2b2b71bfb90470da1d4c4f39c1e22a1e..6ae6f906395239f016ae6dc10db7c99886e5c8fd 100644 (file)
@@ -78,17 +78,18 @@ typedef struct bd_info {
        hymod_conf_t    bi_hymod_conf;  /* hymod configuration information */
 #endif
 #if defined(TARGET_EVB64260) || defined(TARGET_405EP) || defined(TARGET_44x) || \
-       defined(TARGET_85xx) || defined(TARGET_83xx)
+       defined(TARGET_85xx) || defined(TARGET_83xx) || defined(TARGET_HAS_ETH1)
        /* second onboard ethernet port */
        unsigned char   bi_enet1addr[6];
 #define HAVE_ENET1ADDR
 #endif
-#if defined(TARGET_EVB64260) || defined(TARGET_440GX) || defined(TARGET_85xx)
+#if defined(TARGET_EVB64260) || defined(TARGET_440GX) || \
+    defined(TARGET_85xx) || defined(TARGET_HAS_ETH2)
        /* third onboard ethernet ports */
        unsigned char   bi_enet2addr[6];
 #define HAVE_ENET2ADDR
 #endif
-#if defined(TARGET_440GX)
+#if defined(TARGET_440GX) || defined(TARGET_HAS_ETH3)
        /* fourth onboard ethernet ports */
        unsigned char   bi_enet3addr[6];
 #define HAVE_ENET3ADDR
diff --git a/arch/powerpc/boot/pq2.c b/arch/powerpc/boot/pq2.c
new file mode 100644 (file)
index 0000000..f6d1185
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * PowerQUICC II support functions
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "types.h"
+#include "fsl-soc.h"
+#include "pq2.h"
+#include "stdio.h"
+#include "io.h"
+
+#define PQ2_SCCR (0x10c80/4) /* System Clock Configuration Register */
+#define PQ2_SCMR (0x10c88/4) /* System Clock Mode Register */
+
+static int pq2_corecnf_map[] = {
+       3, 2, 2, 2, 4, 4, 5, 9, 6, 11, 8, 10, 3, 12, 7, -1,
+       6, 5, 13, 2, 14, 4, 15, 9, 0, 11, 8, 10, 16, 12, 7, -1
+};
+
+/* Get various clocks from crystal frequency.
+ * Returns zero on failure and non-zero on success.
+ */
+int pq2_get_clocks(u32 crystal, u32 *sysfreq, u32 *corefreq,
+                   u32 *timebase, u32 *brgfreq)
+{
+       u32 *immr;
+       u32 sccr, scmr, mainclk, busclk;
+       int corecnf, busdf, plldf, pllmf, dfbrg;
+
+       immr = fsl_get_immr();
+       if (!immr) {
+               printf("pq2_get_clocks: Couldn't get IMMR base.\r\n");
+               return 0;
+       }
+
+       sccr = in_be32(&immr[PQ2_SCCR]);
+       scmr = in_be32(&immr[PQ2_SCMR]);
+
+       dfbrg = sccr & 3;
+       corecnf = (scmr >> 24) & 0x1f;
+       busdf = (scmr >> 20) & 0xf;
+       plldf = (scmr >> 12) & 1;
+       pllmf = scmr & 0xfff;
+
+       mainclk = crystal * (pllmf + 1) / (plldf + 1);
+       busclk = mainclk / (busdf + 1);
+
+       if (sysfreq)
+               *sysfreq = mainclk / 2;
+       if (timebase)
+               *timebase = busclk / 4;
+       if (brgfreq)
+               *brgfreq = mainclk / (1 << ((dfbrg + 1) * 2));
+
+       if (corefreq) {
+               int coremult = pq2_corecnf_map[corecnf];
+
+               if (coremult < 0)
+                       *corefreq = mainclk / 2;
+               else if (coremult == 0)
+                       return 0;
+               else
+                       *corefreq = busclk * coremult / 2;
+       }
+
+       return 1;
+}
+
+/* Set common device tree fields based on the given clock frequencies. */
+void pq2_set_clocks(u32 sysfreq, u32 corefreq, u32 timebase, u32 brgfreq)
+{
+       void *node;
+
+       dt_fixup_cpu_clocks(corefreq, timebase, sysfreq);
+
+       node = finddevice("/soc/cpm");
+       if (node)
+               setprop(node, "clock-frequency", &sysfreq, 4);
+
+       node = finddevice("/soc/cpm/brg");
+       if (node)
+               setprop(node, "clock-frequency", &brgfreq, 4);
+}
+
+int pq2_fixup_clocks(u32 crystal)
+{
+       u32 sysfreq, corefreq, timebase, brgfreq;
+
+       if (!pq2_get_clocks(crystal, &sysfreq, &corefreq, &timebase, &brgfreq))
+               return 0;
+
+       pq2_set_clocks(sysfreq, corefreq, timebase, brgfreq);
+       return 1;
+}
diff --git a/arch/powerpc/boot/pq2.h b/arch/powerpc/boot/pq2.h
new file mode 100644 (file)
index 0000000..481698c
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _PPC_BOOT_PQ2_H_
+#define _PPC_BOOT_PQ2_H_
+
+#include "types.h"
+
+int pq2_get_clocks(u32 crystal, u32 *sysfreq, u32 *corefreq,
+                   u32 *timebase, u32 *brgfreq);
+void pq2_set_clocks(u32 sysfreq, u32 corefreq, u32 timebase, u32 brgfreq);
+int pq2_fixup_clocks(u32 crystal);
+
+#endif
index f428bac10d4a6cf4c820de81b63de9393ef182f3..9614e1db9daec7fca76586d8fd252ce556bd86ed 100644 (file)
 #include "gunzip_util.h"
 #include "mv64x60.h"
 
-extern char _end[];
-extern char _vmlinux_start[], _vmlinux_end[];
-extern char _dtb_start[], _dtb_end[];
-
-extern void udelay(long delay);
-
 #define KB     1024U
 #define MB     (KB*KB)
 #define GB     (KB*MB)
index 893d59339c266f6fc210ab278cfe04cdf1bf9cf2..d6661151b49426b86256e6d932b051f0129a27a1 100644 (file)
@@ -120,10 +120,6 @@ void ps3_copy_vectors(void)
 
 void platform_init(void)
 {
-       extern char _end[];
-       extern char _dtb_start[];
-       extern char _initrd_start[];
-       extern char _initrd_end[];
        const u32 heapsize = 0x1000000 - (u32)_end; /* 16MiB */
        void *chosen;
        unsigned long ft_addr;
index eaa0d3ae351861957ec2fbe7cad0debce1a2a779..cafeece20ac7c2675e3945457e26eb86e2269a10 100644 (file)
@@ -19,8 +19,6 @@
 #include "io.h"
 #include "ops.h"
 
-extern void udelay(long delay);
-
 static int serial_open(void)
 {
        struct serial_console_data *scdp = console_ops.data;
@@ -114,29 +112,36 @@ int serial_console_init(void)
 {
        void *devp;
        int rc = -1;
-       char compat[MAX_PROP_LEN];
 
        devp = serial_get_stdout_devp();
        if (devp == NULL)
                goto err_out;
 
-       if (getprop(devp, "compatible", compat, sizeof(compat)) < 0)
-               goto err_out;
-
-       if (!strcmp(compat, "ns16550"))
+       if (dt_is_compatible(devp, "ns16550"))
                rc = ns16550_console_init(devp, &serial_cd);
-       else if (!strcmp(compat, "marvell,mpsc"))
+       else if (dt_is_compatible(devp, "marvell,mpsc"))
                rc = mpsc_console_init(devp, &serial_cd);
+       else if (dt_is_compatible(devp, "fsl,cpm1-scc-uart") ||
+                dt_is_compatible(devp, "fsl,cpm1-smc-uart") ||
+                dt_is_compatible(devp, "fsl,cpm2-scc-uart") ||
+                dt_is_compatible(devp, "fsl,cpm2-smc-uart"))
+               rc = cpm_console_init(devp, &serial_cd);
+       else if (dt_is_compatible(devp, "mpc5200-psc-uart"))
+               rc = mpc5200_psc_console_init(devp, &serial_cd);
+       else if (dt_is_compatible(devp, "xilinx,uartlite"))
+               rc = uartlite_console_init(devp, &serial_cd);
 
        /* Add other serial console driver calls here */
 
        if (!rc) {
                console_ops.open = serial_open;
                console_ops.write = serial_write;
-               console_ops.edit_cmdline = serial_edit_cmdline;
                console_ops.close = serial_close;
                console_ops.data = &serial_cd;
 
+               if (serial_cd.getc)
+                       console_ops.edit_cmdline = serial_edit_cmdline;
+
                return 0;
        }
 err_out:
diff --git a/arch/powerpc/boot/stdlib.c b/arch/powerpc/boot/stdlib.c
new file mode 100644 (file)
index 0000000..e00d58c
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * stdlib functions
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "stdlib.h"
+
+/* Not currently supported: leading whitespace, sign, 0x prefix, zero base */
+unsigned long long int strtoull(const char *ptr, char **end, int base)
+{
+       unsigned long long ret = 0;
+
+       if (base > 36)
+               goto out;
+
+       while (*ptr) {
+               int digit;
+
+               if (*ptr >= '0' && *ptr <= '9' && *ptr < '0' + base)
+                       digit = *ptr - '0';
+               else if (*ptr >= 'A' && *ptr < 'A' + base - 10)
+                       digit = *ptr - 'A' + 10;
+               else if (*ptr >= 'a' && *ptr < 'a' + base - 10)
+                       digit = *ptr - 'a' + 10;
+               else
+                       break;
+
+               ret *= base;
+               ret += digit;
+               ptr++;
+       }
+
+out:
+       if (end)
+               *end = (char *)ptr;
+
+       return ret;
+}
diff --git a/arch/powerpc/boot/stdlib.h b/arch/powerpc/boot/stdlib.h
new file mode 100644 (file)
index 0000000..1bf01ac
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef _PPC_BOOT_STDLIB_H_
+#define _PPC_BOOT_STDLIB_H_
+
+unsigned long long int strtoull(const char *ptr, char **end, int base);
+
+#endif
index ac3d43b6a324c97549d8c181e2896ee2f41d377f..643e4cb2f11da67f3c55f237ff68fbda5b07687f 100644 (file)
@@ -49,6 +49,17 @@ strcat:
        bne     1b
        blr
 
+       .globl  strchr
+strchr:
+       addi    r3,r3,-1
+1:     lbzu    r0,1(r3)
+       cmpw    0,r0,r4
+       beqlr
+       cmpwi   0,r0,0
+       bne     1b
+       li      r3,0
+       blr
+
        .globl  strcmp
 strcmp:
        addi    r5,r3,-1
@@ -61,6 +72,19 @@ strcmp:
        beq     1b
        blr
 
+       .globl  strncmp
+strncmp:
+       mtctr   r5
+       addi    r5,r3,-1
+       addi    r4,r4,-1
+1:     lbzu    r3,1(r5)
+       cmpwi   1,r3,0
+       lbzu    r0,1(r4)
+       subf.   r3,r0,r3
+       beqlr   1
+       bdnzt   eq,1b
+       blr
+
        .globl  strlen
 strlen:
        addi    r4,r3,-1
@@ -195,6 +219,19 @@ backwards_memcpy:
        mtctr   r7
        b       1b
 
+       .globl  memchr
+memchr:
+       cmpwi   0,r5,0
+       blelr
+       mtctr   r5
+       addi    r3,r3,-1
+1:     lbzu    r0,1(r3)
+       cmpw    r0,r4
+       beqlr
+       bdnz    1b
+       li      r3,0
+       blr
+
        .globl  memcmp
 memcmp:
        cmpwi   0,r5,0
index 9fdff1cc0d70fd6e77e3f069db72e123ab901bdc..50091cc0eed97a3ba8b384c6a88a11ba64265bef 100644 (file)
@@ -5,13 +5,16 @@
 extern char *strcpy(char *dest, const char *src);
 extern char *strncpy(char *dest, const char *src, size_t n);
 extern char *strcat(char *dest, const char *src);
+extern char *strchr(const char *s, int c);
 extern int strcmp(const char *s1, const char *s2);
+extern int strncmp(const char *s1, const char *s2, size_t n);
 extern size_t strlen(const char *s);
 extern size_t strnlen(const char *s, size_t count);
 
 extern void *memset(void *s, int c, size_t n);
 extern void *memmove(void *dest, const void *src, unsigned long n);
 extern void *memcpy(void *dest, const void *src, unsigned long n);
+extern void *memchr(const void *s, int c, size_t n);
 extern int memcmp(const void *s1, const void *s2, size_t n);
 
 #endif /* _PPC_BOOT_STRING_H_ */
diff --git a/arch/powerpc/boot/treeboot-bamboo.c b/arch/powerpc/boot/treeboot-bamboo.c
new file mode 100644 (file)
index 0000000..9eee48f
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright IBM Corporation, 2007
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * Based on ebony wrapper:
+ * Copyright 2007 David Gibson, 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; version 2 of the License
+ */
+#include "ops.h"
+#include "stdio.h"
+#include "44x.h"
+#include "stdlib.h"
+
+BSS_STACK(4096);
+
+#define PIBS_MAC0 0xfffc0400
+#define PIBS_MAC1 0xfffc0500
+char pibs_mac0[6];
+char pibs_mac1[6];
+
+static void read_pibs_mac(void)
+{
+       unsigned long long mac64;
+
+       mac64 = strtoull((char *)PIBS_MAC0, 0, 16);
+       memcpy(&pibs_mac0, (char *)&mac64+2, 6);
+
+       mac64 = strtoull((char *)PIBS_MAC1, 0, 16);
+       memcpy(&pibs_mac1, (char *)&mac64+2, 6);
+}
+
+void platform_init(void)
+{
+       unsigned long end_of_ram = 0x8000000;
+       unsigned long avail_ram = end_of_ram - (unsigned long)_end;
+
+       simple_alloc_init(_end, avail_ram, 32, 64);
+       read_pibs_mac();
+       bamboo_init((u8 *)&pibs_mac0, (u8 *)&pibs_mac1);
+}
index 8436a9c55192577558ee5103eec59ede65f7e4cb..21cc4834a384b459ac40865eb0a77076f68546a8 100644 (file)
@@ -16,8 +16,6 @@
 #include "stdio.h"
 #include "44x.h"
 
-extern char _end[];
-
 BSS_STACK(4096);
 
 #define OPENBIOS_MAC_BASE      0xfffffe0c
diff --git a/arch/powerpc/boot/treeboot-walnut.c b/arch/powerpc/boot/treeboot-walnut.c
new file mode 100644 (file)
index 0000000..3adf2d0
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Old U-boot compatibility for Walnut
+ *
+ * Author: Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * Copyright 2007 IBM Corporation
+ *   Based on cuboot-83xx.c, which is:
+ * Copyright (c) 2007 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 version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include "ops.h"
+#include "stdio.h"
+#include "dcr.h"
+#include "4xx.h"
+#include "io.h"
+
+BSS_STACK(4096);
+
+void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
+{
+       u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
+       u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
+       u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
+       u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
+       u32 fwdv, fbdv, cbdv, opdv, epdv, udiv;
+
+       fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
+       fbdv = (pllmr & 0x1e000000) >> 25;
+       cbdv = ((pllmr & 0x00060000) >> 17) + 1;
+       opdv = ((pllmr & 0x00018000) >> 15) + 1;
+       epdv = ((pllmr & 0x00001800) >> 13) + 2;
+       udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
+
+       m = fwdv * fbdv * cbdv;
+
+       cpu = sysclk * m / fwdv;
+       plb = cpu / cbdv;
+       opb = plb / opdv;
+       ebc = plb / epdv;
+
+       if (cpc0_cr0 & 0x80) {
+               /* uart0 uses the external clock */
+               uart0 = ser_clk;
+       } else {
+               uart0 = cpu / udiv;
+       }
+
+       if (cpc0_cr0 & 0x40) {
+               /* uart1 uses the external clock */
+               uart1 = ser_clk;
+       } else {
+               uart1 = cpu / udiv;
+       }
+
+       /* setup the timebase clock to tick at the cpu frequency */
+       cpc0_cr1 = cpc0_cr1 & ~ 0x00800000;
+       mtdcr(DCRN_CPC0_CR1, cpc0_cr1);
+       tb = cpu;
+
+       dt_fixup_cpu_clocks(cpu, tb, 0);
+       dt_fixup_clock("/plb", plb);
+       dt_fixup_clock("/plb/opb", opb);
+       dt_fixup_clock("/plb/ebc", ebc);
+       dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
+       dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
+}
+
+static void walnut_flashsel_fixup(void)
+{
+       void *devp, *sram;
+       u32 reg_flash[3] = {0x0, 0x0, 0x80000};
+       u32 reg_sram[3] = {0x0, 0x0, 0x80000};
+       u8 *fpga;
+       u8 fpga_brds1 = 0x0;
+
+       devp = finddevice("/plb/ebc/fpga");
+       if (!devp)
+               fatal("Couldn't locate FPGA node\n\r");
+
+       if (getprop(devp, "virtual-reg", &fpga, sizeof(fpga)) != sizeof(fpga))
+               fatal("no virtual-reg property\n\r");
+
+       fpga_brds1 = in_8(fpga);
+
+       devp = finddevice("/plb/ebc/flash");
+       if (!devp)
+               fatal("Couldn't locate flash node\n\r");
+
+       if (getprop(devp, "reg", reg_flash, sizeof(reg_flash)) != sizeof(reg_flash))
+               fatal("flash reg property has unexpected size\n\r");
+
+       sram = finddevice("/plb/ebc/sram");
+       if (!sram)
+               fatal("Couldn't locate sram node\n\r");
+
+       if (getprop(sram, "reg", reg_sram, sizeof(reg_sram)) != sizeof(reg_sram))
+               fatal("sram reg property has unexpected size\n\r");
+
+       if (fpga_brds1 & 0x1) {
+               reg_flash[1] ^= 0x80000;
+               reg_sram[1] ^= 0x80000;
+       }
+
+       setprop(devp, "reg", reg_flash, sizeof(reg_flash));
+       setprop(sram, "reg", reg_sram, sizeof(reg_sram));
+}
+
+static void walnut_fixups(void)
+{
+       ibm4xx_fixup_memsize();
+       ibm405gp_fixup_clocks(33330000, 0xa8c000);
+       ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
+       ibm4xx_fixup_ebc_ranges("/plb/ebc");
+       walnut_flashsel_fixup();
+}
+
+void platform_init(void)
+{
+       unsigned long end_of_ram = 0x2000000;
+       unsigned long avail_ram = end_of_ram - (unsigned long) _end;
+
+       simple_alloc_init(_end, avail_ram, 32, 32);
+       platform_ops.fixups = walnut_fixups;
+       platform_ops.exit = ibm40x_dbcr_reset;
+       ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
+       serial_console_init();
+}
diff --git a/arch/powerpc/boot/uartlite.c b/arch/powerpc/boot/uartlite.c
new file mode 100644 (file)
index 0000000..46bed69
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Xilinx UARTLITE bootloader driver
+ *
+ * Copyright (C) 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <stdarg.h>
+#include <stddef.h>
+#include "types.h"
+#include "string.h"
+#include "stdio.h"
+#include "io.h"
+#include "ops.h"
+
+#define ULITE_RX               0x00
+#define ULITE_TX               0x04
+#define ULITE_STATUS           0x08
+#define ULITE_CONTROL          0x0c
+
+#define ULITE_STATUS_RXVALID   0x01
+#define ULITE_STATUS_TXFULL    0x08
+
+#define ULITE_CONTROL_RST_RX   0x02
+
+static void * reg_base;
+
+static int uartlite_open(void)
+{
+       /* Clear the RX FIFO */
+       out_be32(reg_base + ULITE_CONTROL, ULITE_CONTROL_RST_RX);
+       return 0;
+}
+
+static void uartlite_putc(unsigned char c)
+{
+       u32 reg = ULITE_STATUS_TXFULL;
+       while (reg & ULITE_STATUS_TXFULL) /* spin on TXFULL bit */
+               reg = in_be32(reg_base + ULITE_STATUS);
+       out_be32(reg_base + ULITE_TX, c);
+}
+
+static unsigned char uartlite_getc(void)
+{
+       u32 reg = 0;
+       while (!(reg & ULITE_STATUS_RXVALID)) /* spin waiting for RXVALID bit */
+               reg = in_be32(reg_base + ULITE_STATUS);
+       return in_be32(reg_base + ULITE_RX);
+}
+
+static u8 uartlite_tstc(void)
+{
+       u32 reg = in_be32(reg_base + ULITE_STATUS);
+       return reg & ULITE_STATUS_RXVALID;
+}
+
+int uartlite_console_init(void *devp, struct serial_console_data *scdp)
+{
+       int n;
+       unsigned long reg_phys;
+
+       n = getprop(devp, "virtual-reg", &reg_base, sizeof(reg_base));
+       if (n != sizeof(reg_base)) {
+               if (!dt_xlate_reg(devp, 0, &reg_phys, NULL))
+                       return -1;
+
+               reg_base = (void *)reg_phys;
+       }
+
+       scdp->open = uartlite_open;
+       scdp->putc = uartlite_putc;
+       scdp->getc = uartlite_getc;
+       scdp->tstc = uartlite_tstc;
+       scdp->close = NULL;
+       return 0;
+}
index 65f685479175a354d357b087c5456b414492153c..39b27e5ef6c19a840d4b2a9fc0f87d621e72d789 100755 (executable)
@@ -29,6 +29,7 @@ initrd=
 dtb=
 dts=
 cacheit=
+binary=
 gzip=.gz
 
 # cross-compilation prefix
@@ -142,17 +143,23 @@ miboot|uboot)
     isection=initrd
     ;;
 cuboot*)
+    binary=y
     gzip=
     ;;
 ps3)
     platformo="$object/ps3-head.o $object/ps3-hvcall.o $object/ps3.o"
     lds=$object/zImage.ps3.lds
+    binary=y
     gzip=
     ext=bin
     objflags="-O binary --set-section-flags=.bss=contents,alloc,load,data"
     ksection=.kernel:vmlinux.bin
     isection=.kernel:initrd
     ;;
+ep88xc)
+    platformo="$object/fixed-head.o $object/$platform.o"
+    binary=y
+    ;;
 esac
 
 vmz="$tmpdir/`basename \"$kernel\"`.$ext"
@@ -224,6 +231,11 @@ fi
 base=0x`${CROSS}nm "$ofile" | grep ' _start$' | cut -d' ' -f1`
 entry=`${CROSS}objdump -f "$ofile" | grep '^start address ' | cut -d' ' -f3`
 
+if [ -n "$binary" ]; then
+    mv "$ofile" "$ofile".elf
+    ${CROSS}objcopy -O binary "$ofile".elf "$ofile".bin
+fi
+
 # post-processing needed for some platforms
 case "$platform" in
 pseries|chrp)
@@ -234,8 +246,6 @@ coff)
     $object/hack-coff "$ofile"
     ;;
 cuboot*)
-    mv "$ofile" "$ofile".elf
-    ${CROSS}objcopy -O binary "$ofile".elf "$ofile".bin
     gzip -f -9 "$ofile".bin
     mkimage -A ppc -O linux -T kernel -C gzip -a "$base" -e "$entry" \
             $uboot_version -d "$ofile".bin.gz "$ofile"
@@ -259,11 +269,11 @@ ps3)
     # then copied to offset 0x100.  At runtime the bootwrapper program
     # copies the 0x100 bytes at __system_reset_kernel to addr 0x100.
 
-    system_reset_overlay=0x`${CROSS}nm "$ofile" \
+    system_reset_overlay=0x`${CROSS}nm "$ofile".elf \
         | grep ' __system_reset_overlay$'       \
         | cut -d' ' -f1`
     system_reset_overlay=`printf "%d" $system_reset_overlay`
-    system_reset_kernel=0x`${CROSS}nm "$ofile" \
+    system_reset_kernel=0x`${CROSS}nm "$ofile".elf \
         | grep ' __system_reset_kernel$'       \
         | cut -d' ' -f1`
     system_reset_kernel=`printf "%d" $system_reset_kernel`
@@ -272,8 +282,6 @@ ps3)
 
     rm -f "$object/otheros.bld"
 
-    ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
-
     msg=$(dd if="$ofile.bin" of="$ofile.bin" conv=notrunc \
         skip=$overlay_dest seek=$system_reset_kernel      \
         count=$overlay_size bs=1 2>&1)
diff --git a/arch/powerpc/configs/bamboo_defconfig b/arch/powerpc/configs/bamboo_defconfig
new file mode 100644 (file)
index 0000000..b592dec
--- /dev/null
@@ -0,0 +1,775 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc1
+# Fri Aug  3 10:46:53 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_6xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+CONFIG_44x=y
+# CONFIG_E200 is not set
+CONFIG_PPC_FPU=y
+CONFIG_4xx=y
+CONFIG_BOOKE=y
+CONFIG_PTE_64BIT=y
+CONFIG_PHYS_64BIT=y
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+CONFIG_PPC_DCR_NATIVE=y
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_DCR=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG 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"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+CONFIG_BAMBOO=y
+# CONFIG_EBONY is not set
+CONFIG_440EP=y
+CONFIG_IBM440EP_ERR42=y
+# CONFIG_MPIC is not set
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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 is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE=""
+CONFIG_SECCOMP=y
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="bamboo.dts"
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+# CONFIG_PCIEPORTBUS is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+# CONFIG_PCI_MSI is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# 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_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x01000000
+
+#
+# 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 is not set
+# 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_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+# CONFIG_MTD is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=35000
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_XILINX_SYSACE is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
+CONFIG_MACINTOSH_DRIVERS=y
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ARCNET is not set
+# CONFIG_NET_ETHERNET is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT 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_PCI is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_DEVPORT=y
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=m
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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_GFS2_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_INOTIFY_USER=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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# 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=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL 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_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
+# 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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+CONFIG_DEBUGGER=y
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
+# CONFIG_BDI_SWITCH is not set
+CONFIG_PPC_EARLY_DEBUG=y
+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
+CONFIG_PPC_EARLY_DEBUG_44x=y
+CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
+CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x0
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_HW=y
index ebb8167608b8f9adb60e1f41beab2a3b6d6c491e..3a50467b1f7524a7eee326106ea32282671598bc 100644 (file)
@@ -313,7 +313,80 @@ CONFIG_FW_LOADER=y
 # CONFIG_SYS_HYPERVISOR is not set
 CONFIG_CONNECTOR=y
 CONFIG_PROC_EVENTS=y
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
 CONFIG_OF_DEVICE=y
 # CONFIG_PARPORT is not set
 CONFIG_BLK_DEV=y
@@ -607,6 +680,15 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
 CONFIG_CRAMFS=y
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -665,6 +747,7 @@ CONFIG_CRC32=y
 # CONFIG_CRC7 is not set
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
 CONFIG_PLIST=y
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_IOPORT=y
diff --git a/arch/powerpc/configs/ep88xc_defconfig b/arch/powerpc/configs/ep88xc_defconfig
new file mode 100644 (file)
index 0000000..d8ee3c0
--- /dev/null
@@ -0,0 +1,751 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc6
+# Fri Sep 14 14:59:56 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_6xx is not set
+# CONFIG_PPC_85xx is not set
+CONFIG_PPC_8xx=y
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_8xx=y
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_SYSCTL_SYSCALL is not set
+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 is not set
+# CONFIG_BASE_FULL is not set
+# CONFIG_FUTEX is not set
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+# CONFIG_VM_EVENT_COUNTERS is not set
+CONFIG_SLUB_DEBUG=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=1
+# CONFIG_MODULES is not set
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+CONFIG_CPM1=y
+# CONFIG_MPC8XXFADS is not set
+# CONFIG_MPC86XADS is not set
+# CONFIG_MPC885ADS is not set
+CONFIG_PPC_EP88XC=y
+
+#
+# MPC8xx CPM Options
+#
+
+#
+# Generic MPC8xx Options
+#
+CONFIG_8xx_COPYBACK=y
+# CONFIG_8xx_CPU6 is not set
+CONFIG_8xx_CPU15=y
+CONFIG_NO_UCODE_PATCH=y
+# CONFIG_USB_SOF_UCODE_PATCH is not set
+# CONFIG_I2C_SPI_UCODE_PATCH is not set
+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
+# CONFIG_PQ2ADS is not set
+# CONFIG_MPIC is not set
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+CONFIG_PPC_CPM_NEW_BINDING=y
+# CONFIG_FSL_ULI1575 is not set
+CONFIG_CPM=y
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+CONFIG_HZ_100=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SUSPEND_UP_POSSIBLE=y
+CONFIG_HIBERNATION_UP_POSSIBLE=y
+# CONFIG_SECCOMP is not set
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="ep88xc.dts"
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+CONFIG_FSL_SOC=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_PCI_QSPAN is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# 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_CONSISTENT_START=0xfd000000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# 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 is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# 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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P 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
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_CFI_FLAGADM is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+# CONFIG_BLK_DEV is not set
+# CONFIG_MISC_DEVICES is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+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=y
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_FS_ENET=y
+# CONFIG_FS_ENET_HAS_SCC is not set
+CONFIG_FS_ENET_HAS_FEC=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT 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 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_CPM=y
+CONFIG_SERIAL_CPM_CONSOLE=y
+# CONFIG_SERIAL_CPM_SCC1 is not set
+# CONFIG_SERIAL_CPM_SCC2 is not set
+# CONFIG_SERIAL_CPM_SCC3 is not set
+# CONFIG_SERIAL_CPM_SCC4 is not set
+CONFIG_SERIAL_CPM_SMC1=y
+CONFIG_SERIAL_CPM_SMC2=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+CONFIG_GEN_RTC=y
+# CONFIG_GEN_RTC_X is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_EDAC is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_DNOTIFY is not set
+# 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 is not set
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# 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_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL 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_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
+# 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
+
+#
+# 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=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL 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_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC32 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_CRYPTO is not set
diff --git a/arch/powerpc/configs/kilauea_defconfig b/arch/powerpc/configs/kilauea_defconfig
new file mode 100644 (file)
index 0000000..31790d3
--- /dev/null
@@ -0,0 +1,768 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc9
+# Thu Oct 11 19:05:15 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_6xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_8xx is not set
+CONFIG_40x=y
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_4xx=y
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_PPC32=y
+CONFIG_WORD_SIZE=32
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+CONFIG_PPC_DCR_NATIVE=y
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_DCR=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG 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"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+CONFIG_KILAUEA=y
+# CONFIG_WALNUT is not set
+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
+# CONFIG_MPIC is not set
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+# CONFIG_FSL_ULI1575 is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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 is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SUSPEND_UP_POSSIBLE=y
+CONFIG_HIBERNATION_UP_POSSIBLE=y
+CONFIG_SECCOMP=y
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="kilauea.dts"
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# 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_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# 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 is not set
+# 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_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP 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=35000
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_XILINX_SYSACE is not set
+# CONFIG_MISC_DEVICES is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_ETHERNET is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT 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=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_EDAC is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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_GFS2_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_INOTIFY_USER=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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# 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_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL 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_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
+# 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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_PPC_CLOCK is not set
index 4b68032588fff368ef84fef69e4e0edcdf2049cd..6b7951ec941a7129f9a0b36af982ce9e622bcae3 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.23-rc4
-# Tue Aug 28 21:24:39 2007
+# Wed Sep  5 12:43:23 2007
 #
 # CONFIG_PPC64 is not set
 
@@ -52,7 +52,7 @@ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 # CONFIG_EXPERIMENTAL is not set
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
-CONFIG_LOCALVERSION="powerpc8272"
+CONFIG_LOCALVERSION=""
 CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
@@ -71,7 +71,7 @@ CONFIG_EMBEDDED=y
 CONFIG_SYSCTL_SYSCALL=y
 CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
-CONFIG_KALLSYMS_EXTRA_PASS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
 CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
@@ -122,10 +122,11 @@ CONFIG_PPC_82xx=y
 # CONFIG_PPC_MPC5200 is not set
 # CONFIG_PPC_CELL is not set
 # CONFIG_PPC_CELL_NATIVE is not set
-CONFIG_MPC82xx_ADS=y
+CONFIG_MPC8272_ADS=y
 CONFIG_PQ2ADS=y
 CONFIG_8260=y
 CONFIG_8272=y
+CONFIG_PQ2_ADS_PCI_PIC=y
 # CONFIG_MPIC is not set
 # CONFIG_MPIC_WEIRD is not set
 # CONFIG_PPC_I8259 is not set
@@ -137,7 +138,9 @@ CONFIG_8272=y
 # CONFIG_GENERIC_IOMAP is not set
 # CONFIG_CPU_FREQ is not set
 CONFIG_CPM2=y
+CONFIG_PPC_CPM_NEW_BINDING=y
 # CONFIG_FSL_ULI1575 is not set
+CONFIG_CPM=y
 
 #
 # Kernel options
@@ -168,18 +171,25 @@ CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
 CONFIG_SECCOMP=y
-# CONFIG_WANT_DEVICE_TREE is not set
+CONFIG_WANT_DEVICE_TREE=y
+# CONFIG_BUILD_RAW_IMAGE is not set
+CONFIG_DEVICE_TREE="mpc8272ads.dts"
 CONFIG_ISA_DMA_API=y
 
 #
 # Bus options
 #
 CONFIG_ZONE_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
 CONFIG_FSL_SOC=y
-# CONFIG_PCI is not set
-# CONFIG_PCI_DOMAINS is not set
-# CONFIG_PCI_SYSCALL is not set
-# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+CONFIG_PCI_8260=y
+# CONFIG_PCIEPORTBUS is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+# CONFIG_PCI_MSI is not set
+# CONFIG_PCI_DEBUG is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -313,43 +323,101 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
 # CONFIG_CONNECTOR is not set
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+# CONFIG_MTD_CFI_I1 is not set
+# CONFIG_MTD_CFI_I2 is not set
+CONFIG_MTD_CFI_I4=y
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_SBC8240 is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
 CONFIG_OF_DEVICE=y
 # CONFIG_PARPORT is not set
 CONFIG_BLK_DEV=y
 # CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
 # CONFIG_BLK_DEV_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_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
-CONFIG_MISC_DEVICES=y
-# CONFIG_EEPROM_93CX6 is not set
-CONFIG_IDE=y
-CONFIG_IDE_MAX_HWIFS=4
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_BLK_DEV_IDECD is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-CONFIG_IDE_PROC_FS=y
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# CONFIG_IDEPCI_PCIBUS_ORDER is not set
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_BLK_DEV_HD is not set
+# CONFIG_MISC_DEVICES is not set
+# CONFIG_IDE is not set
 
 #
 # SCSI device support
@@ -360,6 +428,21 @@ CONFIG_IDE_PROC_FS=y
 # CONFIG_SCSI_NETLINK is not set
 # CONFIG_ATA is not set
 # CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# An alternative FireWire stack is available with EXPERIMENTAL=y
+#
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
 # CONFIG_MACINTOSH_DRIVERS is not set
 CONFIG_NETDEVICES=y
 # CONFIG_NETDEVICES_MULTIQUEUE is not set
@@ -367,6 +450,7 @@ CONFIG_NETDEVICES=y
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 CONFIG_TUN=y
+# CONFIG_ARCNET is not set
 CONFIG_PHYLIB=y
 
 #
@@ -382,13 +466,42 @@ CONFIG_DAVICOM_PHY=y
 # CONFIG_BROADCOM_PHY is not set
 # CONFIG_ICPLUS_PHY is not set
 # CONFIG_FIXED_PHY is not set
+CONFIG_MDIO_BITBANG=y
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
 CONFIG_FS_ENET=y
 # CONFIG_FS_ENET_HAS_SCC is not set
 CONFIG_FS_ENET_HAS_FCC=y
 CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
 CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
 
 #
 # Wireless LAN
@@ -396,6 +509,7 @@ CONFIG_NETDEV_10000=y
 # CONFIG_WLAN_PRE80211 is not set
 # CONFIG_WLAN_80211 is not set
 # CONFIG_WAN is not set
+# CONFIG_FDDI is not set
 CONFIG_PPP=y
 # CONFIG_PPP_FILTER is not set
 CONFIG_PPP_ASYNC=y
@@ -459,6 +573,7 @@ CONFIG_MOUSE_PS2_TRACKPOINT=y
 CONFIG_SERIO=y
 # CONFIG_SERIO_I8042 is not set
 CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PCIPS2 is not set
 CONFIG_SERIO_LIBPS2=y
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
@@ -488,6 +603,7 @@ CONFIG_SERIAL_CPM_SCC1=y
 CONFIG_SERIAL_CPM_SCC4=y
 # CONFIG_SERIAL_CPM_SMC1 is not set
 # CONFIG_SERIAL_CPM_SMC2 is not set
+# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -497,7 +613,11 @@ CONFIG_HW_RANDOM=y
 # CONFIG_NVRAM is not set
 # CONFIG_GEN_RTC is not set
 # CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
+CONFIG_DEVPORT=y
 # CONFIG_I2C is not set
 
 #
@@ -531,7 +651,7 @@ CONFIG_DAB=y
 #
 # CONFIG_DISPLAY_SUPPORT is not set
 # CONFIG_VGASTATE is not set
-CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
 # CONFIG_FB is not set
 # CONFIG_FB_IBM_GXT4500 is not set
 
@@ -539,45 +659,11 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y
 # Sound
 #
 # CONFIG_SOUND is not set
-CONFIG_HID_SUPPORT=y
-CONFIG_HID=y
-# CONFIG_HID_DEBUG is not set
-CONFIG_USB_SUPPORT=y
-# CONFIG_USB_ARCH_HAS_HCD is not set
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=y
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_AMD5536UDC is not set
-# CONFIG_USB_GADGET_FSL_USB2 is not set
-# CONFIG_USB_GADGET_NET2280 is not set
-# CONFIG_USB_GADGET_PXA2XX is not set
-CONFIG_USB_GADGET_M66592=y
-CONFIG_USB_M66592=y
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-# CONFIG_USB_GADGET_S3C2410 is not set
-# CONFIG_USB_GADGET_AT91 is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-CONFIG_USB_GADGET_DUALSPEED=y
-# CONFIG_USB_ZERO is not set
-CONFIG_USB_ETH=y
-# CONFIG_USB_GADGETFS is not set
-# CONFIG_USB_FILE_STORAGE is not set
-# CONFIG_USB_G_SERIAL is not set
-# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
 # CONFIG_MMC is not set
 # CONFIG_NEW_LEDS is not set
+# CONFIG_INFINIBAND is not set
 # CONFIG_RTC_CLASS is not set
 
 #
@@ -614,11 +700,7 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
-CONFIG_XFS_FS=y
-# CONFIG_XFS_QUOTA is not set
-# CONFIG_XFS_SECURITY is not set
-# CONFIG_XFS_POSIX_ACL is not set
-# CONFIG_XFS_RT 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
@@ -659,6 +741,7 @@ CONFIG_RAMFS=y
 # Miscellaneous filesystems
 #
 # CONFIG_HFSPLUS_FS is not set
+# CONFIG_JFFS2_FS is not set
 CONFIG_CRAMFS=y
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -680,8 +763,7 @@ CONFIG_LOCKD_V4=y
 CONFIG_NFS_ACL_SUPPORT=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
-CONFIG_SMB_FS=y
-# CONFIG_SMB_NLS_DEFAULT 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
@@ -775,7 +857,7 @@ CONFIG_HAS_DMA=y
 #
 # CONFIG_PRINTK_TIME is not set
 CONFIG_ENABLE_MUST_CHECK=y
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_FS is not set
 # CONFIG_HEADERS_CHECK is not set
@@ -793,7 +875,7 @@ CONFIG_SCHED_DEBUG=y
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_BUGVERBOSE=y
 CONFIG_DEBUG_INFO=y
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_LIST is not set
@@ -845,4 +927,4 @@ CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
 # CONFIG_CRYPTO_CRC32C is not set
 # CONFIG_CRYPTO_CAMELLIA is not set
-CONFIG_CRYPTO_HW=y
+# CONFIG_CRYPTO_HW is not set
index 86582aefab9379e43202b62d4922b04793f520e1..150221f6f723e02317ad6919cd834028a6bf4376 100644 (file)
@@ -136,7 +136,7 @@ CONFIG_DEFAULT_IOSCHED="cfq"
 # CONFIG_MPC8560_ADS is not set
 # CONFIG_MPC85xx_CDS is not set
 # CONFIG_MPC85xx_MDS is not set
-CONFIG_MPC8544_DS=y
+CONFIG_MPC85xx_DS=y
 CONFIG_MPC85xx=y
 CONFIG_MPIC=y
 # CONFIG_MPIC_WEIRD is not set
index 0fb54c775cf928ca1448ac710e3f25e430f6f1a0..3d68c65212cff1a42583a7bb1908a22766d4eea4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.23-rc4
-# Tue Aug 28 21:24:43 2007
+# Linux kernel version: 2.6.23-rc9
+# Thu Oct 11 09:16:32 2007
 #
 # CONFIG_PPC64 is not set
 
@@ -22,8 +22,13 @@ CONFIG_FSL_BOOKE=y
 CONFIG_SPE=y
 # CONFIG_PPC_MM_SLICES is not set
 CONFIG_PPC32=y
+CONFIG_WORD_SIZE=32
 CONFIG_PPC_MERGE=y
 CONFIG_MMU=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_IRQ_PER_CPU=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
@@ -86,7 +91,6 @@ CONFIG_FUTEX=y
 CONFIG_ANON_INODES=y
 CONFIG_EPOLL=y
 CONFIG_SIGNALFD=y
-CONFIG_TIMERFD=y
 CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
 CONFIG_VM_EVENT_COUNTERS=y
@@ -128,7 +132,7 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
 CONFIG_MPC8560_ADS=y
 # CONFIG_MPC85xx_CDS is not set
 # CONFIG_MPC85xx_MDS is not set
-# CONFIG_MPC8544_DS is not set
+# CONFIG_MPC85xx_DS is not set
 CONFIG_MPC8560=y
 CONFIG_MPC85xx=y
 CONFIG_MPIC=y
@@ -142,12 +146,17 @@ CONFIG_MPIC=y
 # CONFIG_GENERIC_IOMAP is not set
 # CONFIG_CPU_FREQ is not set
 CONFIG_CPM2=y
+CONFIG_PPC_CPM_NEW_BINDING=y
 # CONFIG_FSL_ULI1575 is not set
+CONFIG_CPM=y
 
 #
 # Kernel options
 #
 # CONFIG_HIGHMEM is not set
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
 # CONFIG_HZ_300 is not set
@@ -158,7 +167,7 @@ CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT is not set
 CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=y
-# CONFIG_MATH_EMULATION is not set
+CONFIG_MATH_EMULATION=y
 CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_ARCH_POPULATES_NODE_MAP=y
@@ -177,6 +186,8 @@ CONFIG_VIRT_TO_BUS=y
 # CONFIG_PROC_DEVICETREE is not set
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
+CONFIG_SUSPEND_UP_POSSIBLE=y
+CONFIG_HIBERNATION_UP_POSSIBLE=y
 # CONFIG_SECCOMP is not set
 CONFIG_WANT_DEVICE_TREE=y
 CONFIG_DEVICE_TREE=""
@@ -415,6 +426,7 @@ CONFIG_E1000_NAPI=y
 # CONFIG_SIS190 is not set
 # CONFIG_SKGE is not set
 # CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
 # CONFIG_VIA_VELOCITY is not set
 # CONFIG_TIGON3 is not set
 # CONFIG_BNX2 is not set
@@ -807,3 +819,4 @@ CONFIG_FORCED_INLINING=y
 # CONFIG_KEYS is not set
 # CONFIG_SECURITY is not set
 # CONFIG_CRYPTO is not set
+# CONFIG_PPC_CLOCK is not set
diff --git a/arch/powerpc/configs/mpc8572_ds_defconfig b/arch/powerpc/configs/mpc8572_ds_defconfig
new file mode 100644 (file)
index 0000000..7f1a3e9
--- /dev/null
@@ -0,0 +1,1496 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc4
+# Tue Sep 11 01:19:35 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_6xx is not set
+CONFIG_PPC_85xx=y
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x 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
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+CONFIG_AUDIT=y
+# CONFIG_AUDITSYSCALL is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+# CONFIG_MPC8540_ADS is not set
+# CONFIG_MPC8560_ADS is not set
+# CONFIG_MPC85xx_CDS is not set
+# CONFIG_MPC85xx_MDS is not set
+CONFIG_MPC85xx_DS=y
+CONFIG_MPC85xx=y
+CONFIG_MPIC=y
+# CONFIG_MPIC_WEIRD is not set
+CONFIG_PPC_I8259=y
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+CONFIG_FSL_ULI1575=y
+
+#
+# Kernel options
+#
+CONFIG_HIGHMEM=y
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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=m
+CONFIG_MATH_EMULATION=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE=""
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_FSL_PCI=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+# CONFIG_PCIEPORTBUS is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+# CONFIG_PCI_MSI is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# 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_XFRM=y
+CONFIG_XFRM_USER=y
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=m
+# CONFIG_NET_KEY_MIGRATE is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_IP_PNP_RARP=y
+CONFIG_NET_IPIP=y
+CONFIG_NET_IPGRE=y
+CONFIG_NET_IPGRE_BROADCAST=y
+CONFIG_IP_MROUTE=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_ARPD=y
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=131072
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=y
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=y
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+# CONFIG_SCSI_CONSTANTS is not set
+CONFIG_SCSI_LOGGING=y
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_SATA_AHCI=y
+# CONFIG_SATA_SVW is not set
+# CONFIG_ATA_PIIX is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
+CONFIG_PATA_ALI=y
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+CONFIG_DUMMY=y
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ARCNET is not set
+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
+CONFIG_VITESSE_PHY=y
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_FIXED_PHY is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+CONFIG_GIANFAR=y
+CONFIG_GFAR_NAPI=y
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# 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_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_OF_PLATFORM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+CONFIG_NVRAM=y
+CONFIG_GEN_RTC=y
+CONFIG_GEN_RTC_X=y
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_DEVPORT=y
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_I801 is not set
+# CONFIG_I2C_I810 is not set
+# CONFIG_I2C_PIIX4 is not set
+CONFIG_I2C_MPC=y
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_TINY_USB is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2C_VOODOO3 is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
+# CONFIG_DS1682 is not set
+CONFIG_SENSORS_EEPROM=y
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_M41T00 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+CONFIG_DVB_CORE=m
+# CONFIG_DVB_CORE_ATTACH is not set
+CONFIG_DVB_CAPTURE_DRIVERS=y
+
+#
+# Supported SAA7146 based PCI Adapters
+#
+
+#
+# Supported USB Adapters
+#
+# CONFIG_DVB_USB is not set
+# CONFIG_DVB_TTUSB_BUDGET is not set
+# CONFIG_DVB_TTUSB_DEC is not set
+# CONFIG_DVB_CINERGYT2 is not set
+
+#
+# Supported FlexCopII (B2C2) Adapters
+#
+# CONFIG_DVB_B2C2_FLEXCOP is not set
+
+#
+# Supported BT878 Adapters
+#
+
+#
+# Supported Pluto2 Adapters
+#
+# CONFIG_DVB_PLUTO2 is not set
+
+#
+# Supported DVB Frontends
+#
+
+#
+# Customise DVB Frontends
+#
+# CONFIG_DVB_FE_CUSTOMISE is not set
+
+#
+# DVB-S (satellite) frontends
+#
+# CONFIG_DVB_STV0299 is not set
+# CONFIG_DVB_CX24110 is not set
+# CONFIG_DVB_CX24123 is not set
+# CONFIG_DVB_TDA8083 is not set
+# CONFIG_DVB_MT312 is not set
+# CONFIG_DVB_VES1X93 is not set
+# CONFIG_DVB_S5H1420 is not set
+# CONFIG_DVB_TDA10086 is not set
+
+#
+# DVB-T (terrestrial) frontends
+#
+# CONFIG_DVB_SP8870 is not set
+# CONFIG_DVB_SP887X is not set
+# CONFIG_DVB_CX22700 is not set
+# CONFIG_DVB_CX22702 is not set
+# CONFIG_DVB_L64781 is not set
+# CONFIG_DVB_TDA1004X is not set
+# CONFIG_DVB_NXT6000 is not set
+# CONFIG_DVB_MT352 is not set
+# CONFIG_DVB_ZL10353 is not set
+# CONFIG_DVB_DIB3000MB is not set
+# CONFIG_DVB_DIB3000MC is not set
+# CONFIG_DVB_DIB7000M is not set
+# CONFIG_DVB_DIB7000P is not set
+
+#
+# DVB-C (cable) frontends
+#
+# CONFIG_DVB_VES1820 is not set
+# CONFIG_DVB_TDA10021 is not set
+# CONFIG_DVB_TDA10023 is not set
+# CONFIG_DVB_STV0297 is not set
+
+#
+# ATSC (North American/Korean Terrestrial/Cable DTV) frontends
+#
+# CONFIG_DVB_NXT200X is not set
+# CONFIG_DVB_OR51211 is not set
+# CONFIG_DVB_OR51132 is not set
+# CONFIG_DVB_BCM3510 is not set
+# CONFIG_DVB_LGDT330X is not set
+
+#
+# Tuners/PLL support
+#
+# CONFIG_DVB_PLL is not set
+# CONFIG_DVB_TDA826X is not set
+# CONFIG_DVB_TDA827X is not set
+# CONFIG_DVB_TUNER_QT1010 is not set
+# CONFIG_DVB_TUNER_MT2060 is not set
+
+#
+# Miscellaneous devices
+#
+# CONFIG_DVB_LNBP21 is not set
+# CONFIG_DVB_ISL6421 is not set
+# CONFIG_DVB_TUA6100 is not set
+CONFIG_DAB=y
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+# CONFIG_SND_SEQUENCER is not set
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_PCM_OSS is not set
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_AC97_CODEC=y
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# PCI devices
+#
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS5530 is not set
+# CONFIG_SND_DARLA20 is not set
+# CONFIG_SND_GINA20 is not set
+# CONFIG_SND_LAYLA20 is not set
+# CONFIG_SND_DARLA24 is not set
+# CONFIG_SND_GINA24 is not set
+# CONFIG_SND_LAYLA24 is not set
+# CONFIG_SND_MONA is not set
+# CONFIG_SND_MIA is not set
+# CONFIG_SND_ECHO3G is not set
+# CONFIG_SND_INDIGO is not set
+# CONFIG_SND_INDIGOIO is not set
+# CONFIG_SND_INDIGODJ is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_HDA_INTEL is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+CONFIG_SND_INTEL8X0=y
+# CONFIG_SND_INTEL8X0M is not set
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RIPTIDE is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_SONICVIBES is not set
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SND_AC97_POWER_SAVE is not set
+
+#
+# ALSA PowerMac devices
+#
+
+#
+# ALSA PowerPC devices
+#
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_USX2Y is not set
+# CONFIG_SND_USB_CAIAQ is not set
+
+#
+# System on Chip audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# SoC Audio support for SuperH
+#
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=y
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=y
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_DEVICE_CLASS=y
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_SPLIT_ISO is not set
+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+CONFIG_USB_OHCI_HCD_PPC_OF=y
+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
+CONFIG_USB_OHCI_HCD_PCI=y
+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_UHCI_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_BERRY_CHARGE is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+CONFIG_RTC_DRV_CMOS=y
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# 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_EXT4DEV_FS 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_GFS2_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_INOTIFY_USER=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=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=y
+# CONFIG_NTFS_DEBUG is not set
+# CONFIG_NTFS_RW is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+CONFIG_ADFS_FS=m
+# CONFIG_ADFS_FS_RW is not set
+CONFIG_AFFS_FS=m
+CONFIG_HFS_FS=m
+CONFIG_HFSPLUS_FS=m
+CONFIG_BEFS_FS=m
+# CONFIG_BEFS_DEBUG is not set
+CONFIG_BFS_FS=m
+CONFIG_EFS_FS=m
+CONFIG_CRAMFS=y
+CONFIG_VXFS_FS=m
+CONFIG_HPFS_FS=m
+CONFIG_QNX4FS_FS=m
+CONFIG_SYSV_FS=m
+CONFIG_UFS_FS=m
+# CONFIG_UFS_FS_WRITE is not set
+# CONFIG_UFS_DEBUG is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V4=y
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+# CONFIG_NFSD_V3 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+# CONFIG_SUNRPC_BIND34 is not set
+CONFIG_RPCSEC_GSS_KRB5=y
+# 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
+
+#
+# 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=y
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL 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_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_ECB is not set
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_HW=y
diff --git a/arch/powerpc/configs/mpc8610_hpcd_defconfig b/arch/powerpc/configs/mpc8610_hpcd_defconfig
new file mode 100644 (file)
index 0000000..de19b78
--- /dev/null
@@ -0,0 +1,1023 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc6
+# Tue Oct  2 11:42:56 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+CONFIG_6xx=y
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_PPC_FPU=y
+CONFIG_ALTIVEC=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_PPC_STD_MMU_32=y
+# CONFIG_PPC_MM_SLICES is not set
+# CONFIG_SMP is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+# CONFIG_SWAP is not set
+# CONFIG_SYSVIPC is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_MODULES is not set
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MULTIPLATFORM is not set
+# CONFIG_EMBEDDED6xx is not set
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+CONFIG_PPC_86xx=y
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+# CONFIG_MPC8641_HPCN is not set
+CONFIG_MPC8610_HPCD=y
+CONFIG_MPC8610=y
+CONFIG_MPIC=y
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+# CONFIG_FSL_ULI1575 is not set
+
+#
+# Kernel options
+#
+CONFIG_HIGHMEM=y
+# CONFIG_HZ_100 is not set
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+CONFIG_HZ_1000=y
+CONFIG_HZ=1000
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SUSPEND_UP_POSSIBLE=y
+CONFIG_HIBERNATION_UP_POSSIBLE=y
+# CONFIG_SECCOMP is not set
+# CONFIG_WANT_DEVICE_TREE is not set
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_FSL_PCI=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_PCIEAER=y
+CONFIG_ARCH_SUPPORTS_MSI=y
+# CONFIG_PCI_MSI is not set
+CONFIG_PCI_DEBUG=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# 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_XFRM=y
+CONFIG_XFRM_USER=y
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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=y
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=131072
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+# CONFIG_BLK_DEV_IDE is not set
+# CONFIG_BLK_DEV_HD_ONLY is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+CONFIG_SCSI_TGT=y
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+CONFIG_CHR_DEV_SG=y
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_BUSLOGIC is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_EATA is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GDTH is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_SATA_AHCI=y
+# CONFIG_SATA_SVW is not set
+# CONFIG_ATA_PIIX is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
+CONFIG_PATA_ALI=y
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+CONFIG_DUMMY=y
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ARCNET is not set
+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
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_FIXED_PHY is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=y
+# CONFIG_TULIP_MWI is not set
+CONFIG_TULIP_MMIO=y
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+# CONFIG_ULI526X is not set
+# CONFIG_HP100 is not set
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_B44 is not set
+# CONFIG_FORCEDETH is not set
+# CONFIG_DGRS is not set
+# CONFIG_EEPRO100 is not set
+# CONFIG_E100 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+# CONFIG_8139CP is not set
+CONFIG_8139TOO=y
+CONFIG_8139TOO_PIO=y
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139TOO_8129 is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_GIANFAR is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# 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_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_DEVPORT=y
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+CONFIG_DUMMY_CONSOLE=y
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# 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_EXT4DEV_FS 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_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_DNOTIFY is not set
+# 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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# 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=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+# CONFIG_NFSD_V3 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
+# 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
+
+#
+# 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=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+CONFIG_LDM_PARTITION=y
+# CONFIG_LDM_DEBUG is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_SHIRQ=y
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_CRYPTO is not set
index d27e1f8c38fa8cb0a4099e96541e7f0d383adab4..482d99db68705184b9d838fd02251b635f427df8 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.23-rc4
-# Tue Aug 28 21:24:45 2007
+# Linux kernel version: 2.6.23-rc3
+# Mon Aug 27 15:23:16 2007
 #
 # CONFIG_PPC64 is not set
 
@@ -38,6 +38,7 @@ CONFIG_OF=y
 # CONFIG_PPC_UDBG_16550 is not set
 # CONFIG_GENERIC_TBSYNC is not set
 CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
 # CONFIG_DEFAULT_UIMAGE is not set
 # CONFIG_PPC_DCR_NATIVE is not set
 # CONFIG_PPC_DCR_MMIO is not set
@@ -69,24 +70,25 @@ CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
 # CONFIG_SYSCTL_SYSCALL is not set
 CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
-# CONFIG_HOTPLUG is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
-# CONFIG_BUG is not set
-CONFIG_ELF_CORE=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
 # CONFIG_BASE_FULL is not set
-CONFIG_FUTEX=y
+# CONFIG_FUTEX is not set
 CONFIG_ANON_INODES=y
-# CONFIG_EPOLL is not set
+CONFIG_EPOLL=y
 CONFIG_SIGNALFD=y
 CONFIG_TIMERFD=y
 CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
 # CONFIG_VM_EVENT_COUNTERS is not set
-CONFIG_SLAB=y
-# CONFIG_SLUB is not set
+CONFIG_SLUB_DEBUG=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
 # CONFIG_SLOB is not set
-CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=1
 # CONFIG_MODULES is not set
@@ -100,14 +102,14 @@ CONFIG_BLOCK=y
 # IO Schedulers
 #
 CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_AS is not set
 CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
 # CONFIG_DEFAULT_CFQ is not set
 # CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
+CONFIG_DEFAULT_IOSCHED="deadline"
 
 #
 # Platform support
@@ -120,6 +122,7 @@ CONFIG_CPM1=y
 # CONFIG_MPC8XXFADS is not set
 # CONFIG_MPC86XADS is not set
 CONFIG_MPC885ADS=y
+# CONFIG_PPC_EP88XC is not set
 
 #
 # Freescale Ethernet driver platform-specific options
@@ -137,6 +140,7 @@ CONFIG_MPC8xx_SECOND_ETH_FEC2=y
 #
 CONFIG_8xx_COPYBACK=y
 # CONFIG_8xx_CPU6 is not set
+CONFIG_8xx_CPU15=y
 CONFIG_NO_UCODE_PATCH=y
 # CONFIG_USB_SOF_UCODE_PATCH is not set
 # CONFIG_I2C_SPI_UCODE_PATCH is not set
@@ -153,23 +157,23 @@ CONFIG_NO_UCODE_PATCH=y
 # CONFIG_GENERIC_IOMAP is not set
 # CONFIG_CPU_FREQ is not set
 # CONFIG_CPM2 is not set
-# CONFIG_FSL_ULI1575 is not set
+CONFIG_PPC_CPM_NEW_BINDING=y
 
 #
 # Kernel options
 #
 # CONFIG_HIGHMEM is not set
-# CONFIG_HZ_100 is not set
+CONFIG_HZ_100=y
 # CONFIG_HZ_250 is not set
 # CONFIG_HZ_300 is not set
-CONFIG_HZ_1000=y
-CONFIG_HZ=1000
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=100
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
-CONFIG_MATH_EMULATION=y
+# CONFIG_MATH_EMULATION is not set
 CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
 CONFIG_ARCH_FLATMEM_ENABLE=y
 CONFIG_ARCH_POPULATES_NODE_MAP=y
@@ -185,11 +189,12 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_ZONE_DMA_FLAG=1
 CONFIG_BOUNCE=y
 CONFIG_VIRT_TO_BUS=y
-# CONFIG_PROC_DEVICETREE is not set
+CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
 # CONFIG_SECCOMP is not set
-# CONFIG_WANT_DEVICE_TREE is not set
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="mpc885ads.dts"
 CONFIG_ISA_DMA_API=y
 
 #
@@ -206,6 +211,7 @@ CONFIG_FSL_SOC=y
 #
 # PCCARD (PCMCIA/CardBus) support
 #
+# CONFIG_PCCARD is not set
 
 #
 # Advanced setup
@@ -234,10 +240,6 @@ CONFIG_NET=y
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
 CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_MIGRATE is not set
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
@@ -257,9 +259,9 @@ CONFIG_SYN_COOKIES=y
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_XFRM_TUNNEL is not set
 # CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
@@ -319,22 +321,91 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
 # CONFIG_CONNECTOR is not set
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+# CONFIG_MTD_CFI_I1 is not set
+# CONFIG_MTD_CFI_I2 is not set
+CONFIG_MTD_CFI_I4=y
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
 CONFIG_OF_DEVICE=y
 # CONFIG_PARPORT is not set
-CONFIG_BLK_DEV=y
-# 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 is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-CONFIG_MISC_DEVICES=y
-# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_BLK_DEV is not set
+# CONFIG_MISC_DEVICES is not set
 # CONFIG_IDE is not set
 
 #
@@ -368,16 +439,15 @@ CONFIG_DAVICOM_PHY=y
 # CONFIG_SMSC_PHY is not set
 # CONFIG_BROADCOM_PHY is not set
 # CONFIG_ICPLUS_PHY is not set
-CONFIG_FIXED_PHY=y
-CONFIG_FIXED_MII_10_FDX=y
-# CONFIG_FIXED_MII_100_FDX is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 CONFIG_FS_ENET=y
-CONFIG_FS_ENET_HAS_SCC=y
+# CONFIG_FS_ENET_HAS_SCC is not set
 CONFIG_FS_ENET_HAS_FEC=y
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEV_10000=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
 
 #
 # Wireless LAN
@@ -397,55 +467,12 @@ CONFIG_NETDEV_10000=y
 #
 # Input device support
 #
-CONFIG_INPUT=y
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_POLLDEV is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
-# CONFIG_INPUT_EVBUG is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-CONFIG_MOUSE_PS2_ALPS=y
-CONFIG_MOUSE_PS2_LOGIPS2PP=y
-CONFIG_MOUSE_PS2_SYNAPTICS=y
-CONFIG_MOUSE_PS2_LIFEBOOK=y
-CONFIG_MOUSE_PS2_TRACKPOINT=y
-# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TABLET is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
+# CONFIG_INPUT is not set
 
 #
 # Hardware I/O ports
 #
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-CONFIG_SERIO_SERPORT=y
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO is not set
 # CONFIG_GAMEPORT is not set
 
 #
@@ -493,20 +520,7 @@ CONFIG_GEN_RTC=y
 # CONFIG_SPI_MASTER is not set
 # CONFIG_W1 is not set
 # CONFIG_POWER_SUPPLY is not set
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ABITUGURU3 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
+# CONFIG_HWMON is not set
 
 #
 # Multifunction device drivers
@@ -530,7 +544,7 @@ CONFIG_DAB=y
 #
 # CONFIG_DISPLAY_SUPPORT is not set
 # CONFIG_VGASTATE is not set
-CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
 # CONFIG_FB is not set
 # CONFIG_FB_IBM_GXT4500 is not set
 
@@ -538,22 +552,7 @@ CONFIG_VIDEO_OUTPUT_CONTROL=y
 # Sound
 #
 # CONFIG_SOUND is not set
-CONFIG_HID_SUPPORT=y
-CONFIG_HID=y
-# CONFIG_HID_DEBUG is not set
-CONFIG_USB_SUPPORT=y
-# CONFIG_USB_ARCH_HAS_HCD is not set
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
+# CONFIG_USB_SUPPORT is not set
 # CONFIG_MMC is not set
 # CONFIG_NEW_LEDS is not set
 # CONFIG_EDAC is not set
@@ -580,19 +579,9 @@ CONFIG_USB_SUPPORT=y
 #
 # File systems
 #
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-# CONFIG_EXT2_FS_POSIX_ACL is not set
-# CONFIG_EXT2_FS_SECURITY 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_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
 # CONFIG_EXT4DEV_FS 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
@@ -601,10 +590,9 @@ CONFIG_FS_MBCACHE=y
 # CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
-CONFIG_INOTIFY=y
-CONFIG_INOTIFY_USER=y
+# CONFIG_INOTIFY is not set
 # CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
+# CONFIG_DNOTIFY is not set
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
 # CONFIG_FUSE_FS is not set
@@ -645,6 +633,7 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 CONFIG_CRAMFS=y
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -711,15 +700,13 @@ CONFIG_MSDOS_PARTITION=y
 #
 # Library routines
 #
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
+# CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
 # CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
+# CONFIG_CRC32 is not set
 # CONFIG_CRC7 is not set
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
-CONFIG_PLIST=y
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_IOPORT=y
 CONFIG_HAS_DMA=y
@@ -734,11 +721,33 @@ CONFIG_HAS_DMA=y
 #
 # CONFIG_PRINTK_TIME is not set
 CONFIG_ENABLE_MUST_CHECK=y
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_FS is not set
 # CONFIG_HEADERS_CHECK is not set
-# CONFIG_DEBUG_KERNEL is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
 # CONFIG_PPC_EARLY_DEBUG is not set
 
 #
diff --git a/arch/powerpc/configs/pq2fads_defconfig b/arch/powerpc/configs/pq2fads_defconfig
new file mode 100644 (file)
index 0000000..a51fc39
--- /dev/null
@@ -0,0 +1,1003 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc4
+# Thu Aug 30 11:58:17 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+CONFIG_6xx=y
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_PPC_FPU=y
+CONFIG_PPC_STD_MMU=y
+CONFIG_PPC_STD_MMU_32=y
+# CONFIG_PPC_MM_SLICES is not set
+# CONFIG_SMP is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+# 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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_MODULES is not set
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MULTIPLATFORM is not set
+# CONFIG_EMBEDDED6xx is not set
+CONFIG_PPC_82xx=y
+# CONFIG_PPC_83xx is not set
+# CONFIG_PPC_86xx is not set
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_MPC8272_ADS is not set
+CONFIG_PQ2FADS=y
+# CONFIG_EP8248E is not set
+CONFIG_PQ2ADS=y
+CONFIG_8260=y
+CONFIG_PQ2_ADS_PCI_PIC=y
+# CONFIG_MPIC is not set
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+CONFIG_CPM2=y
+CONFIG_PPC_CPM_NEW_BINDING=y
+# CONFIG_FSL_ULI1575 is not set
+CONFIG_CPM=y
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="pq2fads.dts"
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+CONFIG_PCI_8260=y
+# CONFIG_8260_PCI9 is not set
+# CONFIG_PCIEPORTBUS is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+# CONFIG_PCI_MSI is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# 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=0x00400000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# 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_SYN_COOKIES=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+CONFIG_INET_TUNNEL=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
+CONFIG_INET6_XFRM_MODE_TUNNEL=y
+CONFIG_INET6_XFRM_MODE_BEET=y
+CONFIG_IPV6_SIT=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NETFILTER_XTABLES is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES 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
+
+#
+# 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
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL 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
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+# CONFIG_MTD_CFI_I1 is not set
+# CONFIG_MTD_CFI_I2 is not set
+CONFIG_MTD_CFI_I4=y
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_SBC8240 is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_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_SX8 is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_SGI_IOC4 is not set
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+CONFIG_IDE_PROC_FS=y
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_IDE_GENERIC is not set
+# CONFIG_BLK_DEV_IDEPCI is not set
+# CONFIG_IDEPCI_PCIBUS_ORDER is not set
+# CONFIG_IDE_ARM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# An alternative FireWire stack is available with EXPERIMENTAL=y
+#
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=y
+# CONFIG_ARCNET is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+CONFIG_DAVICOM_PHY=y
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_FIXED_PHY is not set
+CONFIG_MDIO_BITBANG=y
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
+CONFIG_FS_ENET=y
+# CONFIG_FS_ENET_HAS_SCC is not set
+CONFIG_FS_ENET_HAS_FCC=y
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+CONFIG_PPP=y
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_SYNC_TTY=y
+CONFIG_PPP_DEFLATE=y
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_LIFEBOOK=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW 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 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_CPM=y
+CONFIG_SERIAL_CPM_CONSOLE=y
+CONFIG_SERIAL_CPM_SCC1=y
+# CONFIG_SERIAL_CPM_SCC2 is not set
+# CONFIG_SERIAL_CPM_SCC3 is not set
+CONFIG_SERIAL_CPM_SCC4=y
+# CONFIG_SERIAL_CPM_SMC1 is not set
+# CONFIG_SERIAL_CPM_SMC2 is not set
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+CONFIG_DEVPORT=y
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_AMD5536UDC is not set
+# CONFIG_USB_GADGET_FSL_USB2 is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_M66592=y
+CONFIG_USB_M66592=y
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+CONFIG_USB_GADGET_DUALSPEED=y
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# 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=y
+# 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_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=y
+# 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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_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=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL 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_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_KGDB_CONSOLE is not set
+CONFIG_BDI_SWITCH=y
+# CONFIG_PPC_EARLY_DEBUG is not set
+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
+# CONFIG_PPC_EARLY_DEBUG_44x is not set
+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+CONFIG_CRYPTO_HW=y
diff --git a/arch/powerpc/configs/sequoia_defconfig b/arch/powerpc/configs/sequoia_defconfig
new file mode 100644 (file)
index 0000000..bc7f508
--- /dev/null
@@ -0,0 +1,861 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc6
+# Fri Sep 14 13:20:06 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_6xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+CONFIG_44x=y
+# CONFIG_E200 is not set
+CONFIG_PPC_FPU=y
+CONFIG_4xx=y
+CONFIG_BOOKE=y
+CONFIG_PTE_64BIT=y
+CONFIG_PHYS_64BIT=y
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+CONFIG_PPC_DCR_NATIVE=y
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_DCR=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG 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"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+# CONFIG_BAMBOO is not set
+# CONFIG_EBONY is not set
+CONFIG_SEQUOIA=y
+CONFIG_440EPX=y
+CONFIG_440A=y
+# CONFIG_MPIC is not set
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+# CONFIG_FSL_ULI1575 is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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 is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE=""
+CONFIG_SECCOMP=y
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="sequoia.dts"
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_SYSCALL=y
+# CONFIG_PCIEPORTBUS is not set
+CONFIG_ARCH_SUPPORTS_MSI=y
+# CONFIG_PCI_MSI is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# 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_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x01000000
+
+#
+# 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 is not set
+# 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_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=35000
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_XILINX_SYSACE is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_PHANTOM is not set
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_IEEE1394 is not set
+# CONFIG_I2O is not set
+CONFIG_MACINTOSH_DRIVERS=y
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ARCNET is not set
+# CONFIG_NET_ETHERNET is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+# CONFIG_R8169 is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT 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_PCI is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_DEVPORT=y
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=m
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_INFINIBAND is not set
+# CONFIG_EDAC is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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_GFS2_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_INOTIFY_USER=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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# 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_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL 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_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
+# 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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+CONFIG_DEBUGGER=y
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
+# CONFIG_BDI_SWITCH is not set
+CONFIG_PPC_EARLY_DEBUG=y
+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
+CONFIG_PPC_EARLY_DEBUG_44x=y
+CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
+CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_HW=y
diff --git a/arch/powerpc/configs/walnut_defconfig b/arch/powerpc/configs/walnut_defconfig
new file mode 100644 (file)
index 0000000..766bf84
--- /dev/null
@@ -0,0 +1,773 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.23-rc4
+# Wed Sep  5 12:06:37 2007
+#
+# CONFIG_PPC64 is not set
+
+#
+# Processor support
+#
+# CONFIG_6xx is not set
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_8xx is not set
+CONFIG_40x=y
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_4xx=y
+# CONFIG_PPC_MM_SLICES is not set
+CONFIG_NOT_COHERENT_CACHE=y
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
+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_OF=y
+# CONFIG_PPC_UDBG_16550 is not set
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+# CONFIG_DEFAULT_UIMAGE is not set
+CONFIG_PPC_DCR_NATIVE=y
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_DCR=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+# CONFIG_BLK_DEV_BSG 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"
+
+#
+# Platform support
+#
+# CONFIG_PPC_MPC52xx is not set
+# CONFIG_PPC_MPC5200 is not set
+# CONFIG_PPC_CELL is not set
+# CONFIG_PPC_CELL_NATIVE is not set
+# CONFIG_PQ2ADS is not set
+CONFIG_WALNUT=y
+CONFIG_405GP=y
+CONFIG_IBM405_ERR77=y
+CONFIG_IBM405_ERR51=y
+# CONFIG_MPIC is not set
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+# CONFIG_PPC_RTAS is not set
+# CONFIG_MMIO_NVRAM is not set
+# CONFIG_PPC_MPC106 is not set
+# CONFIG_PPC_970_NAP is not set
+# CONFIG_PPC_INDIRECT_IO is not set
+# CONFIG_GENERIC_IOMAP is not set
+# CONFIG_CPU_FREQ is not set
+# CONFIG_CPM2 is not set
+# CONFIG_FSL_ULI1575 is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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 is not set
+# CONFIG_MATH_EMULATION is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BOUNCE=y
+CONFIG_VIRT_TO_BUS=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_PM is not set
+CONFIG_SECCOMP=y
+CONFIG_WANT_DEVICE_TREE=y
+CONFIG_DEVICE_TREE="walnut.dts"
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# 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_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x00400000
+
+#
+# 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 is not set
+# 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_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC 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
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=y
+CONFIG_PROC_EVENTS=y
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+CONFIG_MTD_PHYSMAP_OF=y
+# CONFIG_MTD_WALNUT is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+CONFIG_OF_DEVICE=y
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP 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=35000
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_XILINX_SYSACE is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_EEPROM_93CX6 is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+CONFIG_NETDEVICES=y
+# CONFIG_NETDEVICES_MULTIQUEUE is not set
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_ETHERNET is not set
+CONFIG_NETDEV_1000=y
+CONFIG_NETDEV_10000=y
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# 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
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT 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=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_OF_PLATFORM=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=m
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+CONFIG_USB_SUPPORT=y
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_EDAC is not set
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Userspace I/O
+#
+# CONFIG_UIO is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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_GFS2_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_INOTIFY_USER=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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# 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_JFFS2_FS is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL 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_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_BIND34 is not set
+# 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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+# CONFIG_UCC_SLOW is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_HW=y
index b0cb2e662c25a6e14f3b8e708a46993422c5e19f..ca51f0cf27ab3a77661ca9ff02e1e1de03196d12 100644 (file)
@@ -24,6 +24,7 @@ obj-$(CONFIG_PPC64)           += vdso64/
 obj-$(CONFIG_ALTIVEC)          += vecemu.o vector.o
 obj-$(CONFIG_PPC_970_NAP)      += idle_power4.o
 obj-$(CONFIG_PPC_OF)           += of_device.o of_platform.o prom_parse.o
+obj-$(CONFIG_PPC_CLOCK)                += clock.o
 procfs-$(CONFIG_PPC64)         := proc_ppc64.o
 obj-$(CONFIG_PROC_FS)          += $(procfs-y)
 rtaspci-$(CONFIG_PPC64)-$(CONFIG_PCI)  := rtas_pci.o
@@ -37,25 +38,27 @@ obj-$(CONFIG_GENERIC_TBSYNC)        += smp-tbsync.o
 obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
 obj-$(CONFIG_6xx)              += idle_6xx.o l2cr_6xx.o cpu_setup_6xx.o
 obj-$(CONFIG_TAU)              += tau_6xx.o
-obj-$(CONFIG_HIBERNATION)      += swsusp.o suspend.o
-obj32-$(CONFIG_HIBERNATION) += swsusp_32.o
-obj64-$(CONFIG_HIBERNATION) += swsusp_64.o swsusp_asm64.o
-obj32-$(CONFIG_MODULES)                += module_32.o
+obj-$(CONFIG_HIBERNATION)      += swsusp.o suspend.o \
+                                  swsusp_$(CONFIG_WORD_SIZE).o
+obj64-$(CONFIG_HIBERNATION)    += swsusp_asm64.o
+obj-$(CONFIG_MODULES)          += module_$(CONFIG_WORD_SIZE).o
+obj-$(CONFIG_44x)              += cpu_setup_44x.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
 
 extra-$(CONFIG_PPC_STD_MMU)    := head_32.o
 extra-$(CONFIG_PPC64)          := head_64.o
-extra-$(CONFIG_40x)            := head_4xx.o
+extra-$(CONFIG_40x)            := head_40x.o
 extra-$(CONFIG_44x)            := head_44x.o
 extra-$(CONFIG_FSL_BOOKE)      := head_fsl_booke.o
 extra-$(CONFIG_8xx)            := head_8xx.o
 extra-y                                += vmlinux.lds
 
 obj-y                          += time.o prom.o traps.o setup-common.o \
-                                  udbg.o misc.o io.o
-obj-$(CONFIG_PPC32)            += entry_32.o setup_32.o misc_32.o
-obj-$(CONFIG_PPC64)            += misc_64.o dma_64.o iommu.o
+                                  udbg.o misc.o io.o \
+                                  misc_$(CONFIG_WORD_SIZE).o
+obj-$(CONFIG_PPC32)            += entry_32.o setup_32.o
+obj-$(CONFIG_PPC64)            += dma_64.o iommu.o
 obj-$(CONFIG_PPC_MULTIPLATFORM)        += prom_init.o
 obj-$(CONFIG_MODULES)          += ppc_ksyms.o
 obj-$(CONFIG_BOOTX_TEXT)       += btext.o
@@ -63,37 +66,27 @@ obj-$(CONFIG_SMP)           += smp.o
 obj-$(CONFIG_KPROBES)          += kprobes.o
 obj-$(CONFIG_PPC_UDBG_16550)   += legacy_serial.o udbg_16550.o
 
-module-$(CONFIG_PPC64)         += module_64.o
-obj-$(CONFIG_MODULES)          += $(module-y)
-
-pci64-$(CONFIG_PPC64)          += pci_64.o pci_dn.o isa-bridge.o
-pci32-$(CONFIG_PPC32)          := pci_32.o
-obj-$(CONFIG_PCI)              += $(pci64-y) $(pci32-y) pci-common.o
+pci64-$(CONFIG_PPC64)          += pci_dn.o isa-bridge.o
+obj-$(CONFIG_PCI)              += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \
+                                  pci-common.o
 obj-$(CONFIG_PCI_MSI)          += msi.o
-kexec-$(CONFIG_PPC64)          := machine_kexec_64.o
-kexec-$(CONFIG_PPC32)          := machine_kexec_32.o
-obj-$(CONFIG_KEXEC)            += machine_kexec.o crash.o $(kexec-y)
+obj-$(CONFIG_KEXEC)            += machine_kexec.o crash.o \
+                                  machine_kexec_$(CONFIG_WORD_SIZE).o
 obj-$(CONFIG_AUDIT)            += audit.o
 obj64-$(CONFIG_AUDIT)          += compat_audit.o
 
+obj-$(CONFIG_8XX_MINIMAL_FPEMU) += softemu8xx.o
+
 ifneq ($(CONFIG_PPC_INDIRECT_IO),y)
 obj-y                          += iomap.o
 endif
 
-ifeq ($(CONFIG_PPC_ISERIES),y)
-CFLAGS_lparmap.s               += -g0
-extra-y += lparmap.s
-$(obj)/head_64.o:      $(obj)/lparmap.s
-AFLAGS_head_64.o += -I$(obj)
-endif
-
 else
 # stuff used from here for ARCH=ppc
 smpobj-$(CONFIG_SMP)           += smp.o
 
 endif
 
-obj-$(CONFIG_PPC32)            += $(obj32-y)
 obj-$(CONFIG_PPC64)            += $(obj64-y)
 
 extra-$(CONFIG_PPC_FPU)                += fpu.o
index 5c9ff7f5c44ef903822ee04585e1d47789c6282c..e06f75daeba368ca231ec3d8af43db2285e68aba 100644 (file)
@@ -38,7 +38,7 @@ struct aligninfo {
 /* Bits in the flags field */
 #define LD     0       /* load */
 #define ST     1       /* store */
-#define        SE      2       /* sign-extend value */
+#define SE     2       /* sign-extend value, or FP ld/st as word */
 #define F      4       /* to/from fp regs */
 #define U      8       /* update index register */
 #define M      0x10    /* multiple load/store */
@@ -46,6 +46,8 @@ struct aligninfo {
 #define S      0x40    /* single-precision fp or... */
 #define SX     0x40    /* ... byte count in XER */
 #define HARD   0x80    /* string, stwcx. */
+#define E4     0x40    /* SPE endianness is word */
+#define E8     0x80    /* SPE endianness is double word */
 
 /* DSISR bits reported for a DCBZ instruction: */
 #define DCBZ   0x5f    /* 8xx/82xx dcbz faults when cache not enabled */
@@ -87,9 +89,9 @@ static struct aligninfo aligninfo[128] = {
        { 8, LD+F+U },          /* 00 1 1001: lfdu */
        { 4, ST+F+S+U },        /* 00 1 1010: stfsu */
        { 8, ST+F+U },          /* 00 1 1011: stfdu */
-       INVALID,                /* 00 1 1100 */
+       { 16, LD+F },           /* 00 1 1100: lfdp */
        INVALID,                /* 00 1 1101 */
-       INVALID,                /* 00 1 1110 */
+       { 16, ST+F },           /* 00 1 1110: stfdp */
        INVALID,                /* 00 1 1111 */
        { 8, LD },              /* 01 0 0000: ldx */
        INVALID,                /* 01 0 0001 */
@@ -167,10 +169,10 @@ static struct aligninfo aligninfo[128] = {
        { 8, LD+F },            /* 11 0 1001: lfdx */
        { 4, ST+F+S },          /* 11 0 1010: stfsx */
        { 8, ST+F },            /* 11 0 1011: stfdx */
-       INVALID,                /* 11 0 1100 */
-       { 8, LD+M },            /* 11 0 1101: lmd */
-       INVALID,                /* 11 0 1110 */
-       { 8, ST+M },            /* 11 0 1111: stmd */
+       { 16, LD+F },           /* 11 0 1100: lfdpx */
+       { 4, LD+F+SE },         /* 11 0 1101: lfiwax */
+       { 16, ST+F },           /* 11 0 1110: stfdpx */
+       { 4, ST+F },            /* 11 0 1111: stfiwx */
        { 4, LD+U },            /* 11 1 0000: lwzux */
        INVALID,                /* 11 1 0001 */
        { 4, ST+U },            /* 11 1 0010: stwux */
@@ -356,6 +358,284 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
        return 1;
 }
 
+/*
+ * Emulate floating-point pair loads and stores.
+ * Only POWER6 has these instructions, and it does true little-endian,
+ * so we don't need the address swizzling.
+ */
+static int emulate_fp_pair(struct pt_regs *regs, unsigned char __user *addr,
+                          unsigned int reg, unsigned int flags)
+{
+       char *ptr = (char *) &current->thread.fpr[reg];
+       int i, ret;
+
+       if (!(flags & F))
+               return 0;
+       if (reg & 1)
+               return 0;       /* invalid form: FRS/FRT must be even */
+       if (!(flags & SW)) {
+               /* not byte-swapped - easy */
+               if (!(flags & ST))
+                       ret = __copy_from_user(ptr, addr, 16);
+               else
+                       ret = __copy_to_user(addr, ptr, 16);
+       } else {
+               /* each FPR value is byte-swapped separately */
+               ret = 0;
+               for (i = 0; i < 16; ++i) {
+                       if (!(flags & ST))
+                               ret |= __get_user(ptr[i^7], addr + i);
+                       else
+                               ret |= __put_user(ptr[i^7], addr + i);
+               }
+       }
+       if (ret)
+               return -EFAULT;
+       return 1;       /* exception handled and fixed up */
+}
+
+#ifdef CONFIG_SPE
+
+static struct aligninfo spe_aligninfo[32] = {
+       { 8, LD+E8 },           /* 0 00 00: evldd[x] */
+       { 8, LD+E4 },           /* 0 00 01: evldw[x] */
+       { 8, LD },              /* 0 00 10: evldh[x] */
+       INVALID,                /* 0 00 11 */
+       { 2, LD },              /* 0 01 00: evlhhesplat[x] */
+       INVALID,                /* 0 01 01 */
+       { 2, LD },              /* 0 01 10: evlhhousplat[x] */
+       { 2, LD+SE },           /* 0 01 11: evlhhossplat[x] */
+       { 4, LD },              /* 0 10 00: evlwhe[x] */
+       INVALID,                /* 0 10 01 */
+       { 4, LD },              /* 0 10 10: evlwhou[x] */
+       { 4, LD+SE },           /* 0 10 11: evlwhos[x] */
+       { 4, LD+E4 },           /* 0 11 00: evlwwsplat[x] */
+       INVALID,                /* 0 11 01 */
+       { 4, LD },              /* 0 11 10: evlwhsplat[x] */
+       INVALID,                /* 0 11 11 */
+
+       { 8, ST+E8 },           /* 1 00 00: evstdd[x] */
+       { 8, ST+E4 },           /* 1 00 01: evstdw[x] */
+       { 8, ST },              /* 1 00 10: evstdh[x] */
+       INVALID,                /* 1 00 11 */
+       INVALID,                /* 1 01 00 */
+       INVALID,                /* 1 01 01 */
+       INVALID,                /* 1 01 10 */
+       INVALID,                /* 1 01 11 */
+       { 4, ST },              /* 1 10 00: evstwhe[x] */
+       INVALID,                /* 1 10 01 */
+       { 4, ST },              /* 1 10 10: evstwho[x] */
+       INVALID,                /* 1 10 11 */
+       { 4, ST+E4 },           /* 1 11 00: evstwwe[x] */
+       INVALID,                /* 1 11 01 */
+       { 4, ST+E4 },           /* 1 11 10: evstwwo[x] */
+       INVALID,                /* 1 11 11 */
+};
+
+#define        EVLDD           0x00
+#define        EVLDW           0x01
+#define        EVLDH           0x02
+#define        EVLHHESPLAT     0x04
+#define        EVLHHOUSPLAT    0x06
+#define        EVLHHOSSPLAT    0x07
+#define        EVLWHE          0x08
+#define        EVLWHOU         0x0A
+#define        EVLWHOS         0x0B
+#define        EVLWWSPLAT      0x0C
+#define        EVLWHSPLAT      0x0E
+#define        EVSTDD          0x10
+#define        EVSTDW          0x11
+#define        EVSTDH          0x12
+#define        EVSTWHE         0x18
+#define        EVSTWHO         0x1A
+#define        EVSTWWE         0x1C
+#define        EVSTWWO         0x1E
+
+/*
+ * Emulate SPE loads and stores.
+ * Only Book-E has these instructions, and it does true little-endian,
+ * so we don't need the address swizzling.
+ */
+static int emulate_spe(struct pt_regs *regs, unsigned int reg,
+                      unsigned int instr)
+{
+       int t, ret;
+       union {
+               u64 ll;
+               u32 w[2];
+               u16 h[4];
+               u8 v[8];
+       } data, temp;
+       unsigned char __user *p, *addr;
+       unsigned long *evr = &current->thread.evr[reg];
+       unsigned int nb, flags;
+
+       instr = (instr >> 1) & 0x1f;
+
+       /* DAR has the operand effective address */
+       addr = (unsigned char __user *)regs->dar;
+
+       nb = spe_aligninfo[instr].len;
+       flags = spe_aligninfo[instr].flags;
+
+       /* Verify the address of the operand */
+       if (unlikely(user_mode(regs) &&
+                    !access_ok((flags & ST ? VERIFY_WRITE : VERIFY_READ),
+                               addr, nb)))
+               return -EFAULT;
+
+       /* userland only */
+       if (unlikely(!user_mode(regs)))
+               return 0;
+
+       flush_spe_to_thread(current);
+
+       /* If we are loading, get the data from user space, else
+        * get it from register values
+        */
+       if (flags & ST) {
+               data.ll = 0;
+               switch (instr) {
+               case EVSTDD:
+               case EVSTDW:
+               case EVSTDH:
+                       data.w[0] = *evr;
+                       data.w[1] = regs->gpr[reg];
+                       break;
+               case EVSTWHE:
+                       data.h[2] = *evr >> 16;
+                       data.h[3] = regs->gpr[reg] >> 16;
+                       break;
+               case EVSTWHO:
+                       data.h[2] = *evr & 0xffff;
+                       data.h[3] = regs->gpr[reg] & 0xffff;
+                       break;
+               case EVSTWWE:
+                       data.w[1] = *evr;
+                       break;
+               case EVSTWWO:
+                       data.w[1] = regs->gpr[reg];
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       } else {
+               temp.ll = data.ll = 0;
+               ret = 0;
+               p = addr;
+
+               switch (nb) {
+               case 8:
+                       ret |= __get_user_inatomic(temp.v[0], p++);
+                       ret |= __get_user_inatomic(temp.v[1], p++);
+                       ret |= __get_user_inatomic(temp.v[2], p++);
+                       ret |= __get_user_inatomic(temp.v[3], p++);
+               case 4:
+                       ret |= __get_user_inatomic(temp.v[4], p++);
+                       ret |= __get_user_inatomic(temp.v[5], p++);
+               case 2:
+                       ret |= __get_user_inatomic(temp.v[6], p++);
+                       ret |= __get_user_inatomic(temp.v[7], p++);
+                       if (unlikely(ret))
+                               return -EFAULT;
+               }
+
+               switch (instr) {
+               case EVLDD:
+               case EVLDW:
+               case EVLDH:
+                       data.ll = temp.ll;
+                       break;
+               case EVLHHESPLAT:
+                       data.h[0] = temp.h[3];
+                       data.h[2] = temp.h[3];
+                       break;
+               case EVLHHOUSPLAT:
+               case EVLHHOSSPLAT:
+                       data.h[1] = temp.h[3];
+                       data.h[3] = temp.h[3];
+                       break;
+               case EVLWHE:
+                       data.h[0] = temp.h[2];
+                       data.h[2] = temp.h[3];
+                       break;
+               case EVLWHOU:
+               case EVLWHOS:
+                       data.h[1] = temp.h[2];
+                       data.h[3] = temp.h[3];
+                       break;
+               case EVLWWSPLAT:
+                       data.w[0] = temp.w[1];
+                       data.w[1] = temp.w[1];
+                       break;
+               case EVLWHSPLAT:
+                       data.h[0] = temp.h[2];
+                       data.h[1] = temp.h[2];
+                       data.h[2] = temp.h[3];
+                       data.h[3] = temp.h[3];
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       }
+
+       if (flags & SW) {
+               switch (flags & 0xf0) {
+               case E8:
+                       SWAP(data.v[0], data.v[7]);
+                       SWAP(data.v[1], data.v[6]);
+                       SWAP(data.v[2], data.v[5]);
+                       SWAP(data.v[3], data.v[4]);
+                       break;
+               case E4:
+
+                       SWAP(data.v[0], data.v[3]);
+                       SWAP(data.v[1], data.v[2]);
+                       SWAP(data.v[4], data.v[7]);
+                       SWAP(data.v[5], data.v[6]);
+                       break;
+               /* Its half word endian */
+               default:
+                       SWAP(data.v[0], data.v[1]);
+                       SWAP(data.v[2], data.v[3]);
+                       SWAP(data.v[4], data.v[5]);
+                       SWAP(data.v[6], data.v[7]);
+                       break;
+               }
+       }
+
+       if (flags & SE) {
+               data.w[0] = (s16)data.h[1];
+               data.w[1] = (s16)data.h[3];
+       }
+
+       /* Store result to memory or update registers */
+       if (flags & ST) {
+               ret = 0;
+               p = addr;
+               switch (nb) {
+               case 8:
+                       ret |= __put_user_inatomic(data.v[0], p++);
+                       ret |= __put_user_inatomic(data.v[1], p++);
+                       ret |= __put_user_inatomic(data.v[2], p++);
+                       ret |= __put_user_inatomic(data.v[3], p++);
+               case 4:
+                       ret |= __put_user_inatomic(data.v[4], p++);
+                       ret |= __put_user_inatomic(data.v[5], p++);
+               case 2:
+                       ret |= __put_user_inatomic(data.v[6], p++);
+                       ret |= __put_user_inatomic(data.v[7], p++);
+               }
+               if (unlikely(ret))
+                       return -EFAULT;
+       } else {
+               *evr = data.w[0];
+               regs->gpr[reg] = data.w[1];
+       }
+
+       return 1;
+}
+#endif /* CONFIG_SPE */
 
 /*
  * Called on alignment exception. Attempts to fixup
@@ -414,6 +694,12 @@ int fix_alignment(struct pt_regs *regs)
        /* extract the operation and registers from the dsisr */
        reg = (dsisr >> 5) & 0x1f;      /* source/dest register */
        areg = dsisr & 0x1f;            /* register to update */
+
+#ifdef CONFIG_SPE
+       if ((instr >> 26) == 0x4)
+               return emulate_spe(regs, reg, instr);
+#endif
+
        instr = (dsisr >> 10) & 0x7f;
        instr |= (dsisr >> 13) & 0x60;
 
@@ -471,6 +757,10 @@ int fix_alignment(struct pt_regs *regs)
                flush_fp_to_thread(current);
        }
 
+       /* Special case for 16-byte FP loads and stores */
+       if (nb == 16)
+               return emulate_fp_pair(regs, addr, reg, flags);
+
        /* If we are loading, get the data from user space, else
         * get it from register values
         */
@@ -531,7 +821,8 @@ int fix_alignment(struct pt_regs *regs)
         * or floating point single precision conversion
         */
        switch (flags & ~(U|SW)) {
-       case LD+SE:     /* sign extend */
+       case LD+SE:     /* sign extending integer loads */
+       case LD+F+SE:   /* sign extend for lfiwax */
                if ( nb == 2 )
                        data.ll = data.x16.low16;
                else    /* nb must be 4 */
index 2cb1d948779614040ec6ae3f303a7627c8dbee66..0ae5d57b93681fdea060bce6c6a78dc8bcd61569 100644 (file)
@@ -312,5 +312,17 @@ int main(void)
 #ifdef CONFIG_BUG
        DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry));
 #endif
+
+#ifdef CONFIG_PPC_ISERIES
+       /* the assembler miscalculates the VSID values */
+       DEFINE(PAGE_OFFSET_ESID, GET_ESID(PAGE_OFFSET));
+       DEFINE(PAGE_OFFSET_VSID, KERNEL_VSID(PAGE_OFFSET));
+       DEFINE(VMALLOC_START_ESID, GET_ESID(VMALLOC_START));
+       DEFINE(VMALLOC_START_VSID, KERNEL_VSID(VMALLOC_START));
+#endif
+
+#ifdef CONFIG_PPC64
+       DEFINE(PGD_TABLE_SIZE, PGD_TABLE_SIZE);
+#endif
        return 0;
 }
index e7b684689e0479336b8670835a7bb69421415089..3ef51fb6f107a57d3ca82f4c18ddfd84f689ce3a 100644 (file)
@@ -11,7 +11,6 @@
 #include <asm/sections.h>
 #include <asm/prom.h>
 #include <asm/btext.h>
-#include <asm/prom.h>
 #include <asm/page.h>
 #include <asm/mmu.h>
 #include <asm/pgtable.h>
diff --git a/arch/powerpc/kernel/clock.c b/arch/powerpc/kernel/clock.c
new file mode 100644 (file)
index 0000000..ce668f5
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Dummy clk implementations for powerpc.
+ * These need to be overridden in platform code.
+ */
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <asm/clk_interface.h>
+
+struct clk_interface clk_functions;
+
+struct clk *clk_get(struct device *dev, const char *id)
+{
+       if (clk_functions.clk_get)
+               return clk_functions.clk_get(dev, id);
+       return ERR_PTR(-ENOSYS);
+}
+EXPORT_SYMBOL(clk_get);
+
+void clk_put(struct clk *clk)
+{
+       if (clk_functions.clk_put)
+               clk_functions.clk_put(clk);
+}
+EXPORT_SYMBOL(clk_put);
+
+int clk_enable(struct clk *clk)
+{
+       if (clk_functions.clk_enable)
+               return clk_functions.clk_enable(clk);
+       return -ENOSYS;
+}
+EXPORT_SYMBOL(clk_enable);
+
+void clk_disable(struct clk *clk)
+{
+       if (clk_functions.clk_disable)
+               clk_functions.clk_disable(clk);
+}
+EXPORT_SYMBOL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+       if (clk_functions.clk_get_rate)
+               return clk_functions.clk_get_rate(clk);
+       return 0;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+long clk_round_rate(struct clk *clk, unsigned long rate)
+{
+       if (clk_functions.clk_round_rate)
+               return clk_functions.clk_round_rate(clk, rate);
+       return -ENOSYS;
+}
+EXPORT_SYMBOL(clk_round_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       if (clk_functions.clk_set_rate)
+               return clk_functions.clk_set_rate(clk, rate);
+       return -ENOSYS;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+       if (clk_functions.clk_get_parent)
+               return clk_functions.clk_get_parent(clk);
+       return ERR_PTR(-ENOSYS);
+}
+EXPORT_SYMBOL(clk_get_parent);
+
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+       if (clk_functions.clk_set_parent)
+               return clk_functions.clk_set_parent(clk, parent);
+       return -ENOSYS;
+}
+EXPORT_SYMBOL(clk_set_parent);
diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S
new file mode 100644 (file)
index 0000000..8e1812e
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * This file contains low level CPU setup functions.
+ * Valentine Barshak <vbarshak@ru.mvista.com>
+ * MontaVista Software, Inc (c) 2007
+ *
+ * Based on cpu_setup_6xx code by 
+ * Benjamin Herrenschmidt <benh@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 <asm/processor.h>
+#include <asm/cputable.h>
+#include <asm/ppc_asm.h>
+
+_GLOBAL(__setup_cpu_440ep)
+       b       __init_fpu_44x
+_GLOBAL(__setup_cpu_440epx)
+       mflr    r4
+       bl      __init_fpu_44x
+       bl      __plb_disable_wrp
+       mtlr    r4
+       blr
+_GLOBAL(__setup_cpu_440grx)
+       b       __plb_disable_wrp
+
+
+/* enable APU between CPU and FPU */
+_GLOBAL(__init_fpu_44x)
+       mfspr   r3,SPRN_CCR0
+       /* Clear DAPUIB flag in CCR0 */
+       rlwinm  r3,r3,0,12,10
+       mtspr   SPRN_CCR0,r3
+       isync
+       blr
+
+/*
+ * Workaround for the incorrect write to DDR SDRAM errata.
+ * The write address can be corrupted during writes to
+ * DDR SDRAM when write pipelining is enabled on PLB0.
+ * Disable write pipelining here.
+ */
+#define DCRN_PLB4A0_ACR        0x81
+
+_GLOBAL(__plb_disable_wrp)
+       mfdcr   r3,DCRN_PLB4A0_ACR
+       /* clear WRP bit in PLB4A0_ACR */
+       rlwinm  r3,r3,0,8,6
+       mtdcr   DCRN_PLB4A0_ACR,r3
+       isync
+       blr
+
index b1f8000952f3460912a65206cd44dd064884c614..d3fb7d0c6c1c255b3569dc845a671962d0e5393f 100644 (file)
@@ -31,6 +31,9 @@ EXPORT_SYMBOL(cur_cpu_spec);
  * and ppc64
  */
 #ifdef CONFIG_PPC32
+extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
+extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
+extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
@@ -68,16 +71,7 @@ extern void __restore_cpu_ppc970(void);
 #define COMMON_USER_BOOKE      (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
                                 PPC_FEATURE_BOOKE)
 
-/* We only set the spe features if the kernel was compiled with
- * spe support
- */
-#ifdef CONFIG_SPE
-#define PPC_FEATURE_SPE_COMP   PPC_FEATURE_HAS_SPE
-#else
-#define PPC_FEATURE_SPE_COMP   0
-#endif
-
-static struct cpu_spec cpu_specs[] = {
+static struct cpu_spec __initdata cpu_specs[] = {
 #ifdef CONFIG_PPC64
        {       /* Power3 */
                .pvr_mask               = 0xffff0000,
@@ -333,14 +327,6 @@ static struct cpu_spec cpu_specs[] = {
                .cpu_user_features      = COMMON_USER_POWER5_PLUS,
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
-               .num_pmcs               = 6,
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/power6",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-               .oprofile_mmcra_sihv    = POWER6_MMCRA_SIHV,
-               .oprofile_mmcra_sipr    = POWER6_MMCRA_SIPR,
-               .oprofile_mmcra_clear   = POWER6_MMCRA_THRM |
-                       POWER6_MMCRA_OTHER,
                .platform               = "power5+",
        },
        {       /* Power6 */
@@ -370,14 +356,6 @@ static struct cpu_spec cpu_specs[] = {
                .cpu_user_features      = COMMON_USER_POWER6,
                .icache_bsize           = 128,
                .dcache_bsize           = 128,
-               .num_pmcs               = 6,
-               .pmc_type               = PPC_PMC_IBM,
-               .oprofile_cpu_type      = "ppc64/power6",
-               .oprofile_type          = PPC_OPROFILE_POWER4,
-               .oprofile_mmcra_sihv    = POWER6_MMCRA_SIHV,
-               .oprofile_mmcra_sipr    = POWER6_MMCRA_SIPR,
-               .oprofile_mmcra_clear   = POWER6_MMCRA_THRM |
-                       POWER6_MMCRA_OTHER,
                .platform               = "power6",
        },
        {       /* Cell Broadband Engine */
@@ -1109,6 +1087,17 @@ static struct cpu_spec cpu_specs[] = {
                .dcache_bsize           = 32,
                .platform               = "ppc405",
        },
+       {       /* 405EX */
+               .pvr_mask               = 0xffff0000,
+               .pvr_value              = 0x12910000,
+               .cpu_name               = "405EX",
+               .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,
+               .platform               = "ppc405",
+       },
 
 #endif /* CONFIG_40x */
 #ifdef CONFIG_44x
@@ -1120,6 +1109,7 @@ static struct cpu_spec cpu_specs[] = {
                .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
+               .cpu_setup              = __setup_cpu_440ep,
                .platform               = "ppc440",
        },
        {
@@ -1130,6 +1120,29 @@ static struct cpu_spec cpu_specs[] = {
                .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
+               .cpu_setup              = __setup_cpu_440ep,
+               .platform               = "ppc440",
+       },
+       { /* 440EPX */
+               .pvr_mask               = 0xf0000ffb,
+               .pvr_value              = 0x200008D0,
+               .cpu_name               = "440EPX",
+               .cpu_features           = CPU_FTRS_44X,
+               .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+               .cpu_setup              = __setup_cpu_440epx,
+               .platform               = "ppc440",
+       },
+       { /* 440GRX */
+               .pvr_mask               = 0xf0000ffb,
+               .pvr_value              = 0x200008D8,
+               .cpu_name               = "440GRX",
+               .cpu_features           = CPU_FTRS_44X,
+               .cpu_user_features      = COMMON_USER_BOOKE,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+               .cpu_setup              = __setup_cpu_440grx,
                .platform               = "ppc440",
        },
        {       /* 440GP Rev. B */
@@ -1243,8 +1256,8 @@ static struct cpu_spec cpu_specs[] = {
                /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
                .cpu_features           = CPU_FTRS_E200,
                .cpu_user_features      = COMMON_USER_BOOKE |
-                       PPC_FEATURE_SPE_COMP |
-                       PPC_FEATURE_HAS_EFP_SINGLE |
+                       PPC_FEATURE_HAS_SPE_COMP |
+                       PPC_FEATURE_HAS_EFP_SINGLE_COMP |
                        PPC_FEATURE_UNIFIED_CACHE,
                .dcache_bsize           = 32,
                .platform               = "ppc5554",
@@ -1256,8 +1269,8 @@ static struct cpu_spec cpu_specs[] = {
                /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
                .cpu_features           = CPU_FTRS_E500,
                .cpu_user_features      = COMMON_USER_BOOKE |
-                       PPC_FEATURE_SPE_COMP |
-                       PPC_FEATURE_HAS_EFP_SINGLE,
+                       PPC_FEATURE_HAS_SPE_COMP |
+                       PPC_FEATURE_HAS_EFP_SINGLE_COMP,
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
@@ -1272,9 +1285,9 @@ static struct cpu_spec cpu_specs[] = {
                /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
                .cpu_features           = CPU_FTRS_E500_2,
                .cpu_user_features      = COMMON_USER_BOOKE |
-                       PPC_FEATURE_SPE_COMP |
-                       PPC_FEATURE_HAS_EFP_SINGLE |
-                       PPC_FEATURE_HAS_EFP_DOUBLE,
+                       PPC_FEATURE_HAS_SPE_COMP |
+                       PPC_FEATURE_HAS_EFP_SINGLE_COMP |
+                       PPC_FEATURE_HAS_EFP_DOUBLE_COMP,
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
@@ -1298,29 +1311,49 @@ static struct cpu_spec cpu_specs[] = {
 #endif /* CONFIG_PPC32 */
 };
 
-struct cpu_spec *identify_cpu(unsigned long offset, unsigned int pvr)
+static struct cpu_spec the_cpu_spec;
+
+struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
 {
        struct cpu_spec *s = cpu_specs;
-       struct cpu_spec **cur = &cur_cpu_spec;
+       struct cpu_spec *t = &the_cpu_spec;
        int i;
 
        s = PTRRELOC(s);
-       cur = PTRRELOC(cur);
+       t = PTRRELOC(t);
 
        for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
                if ((pvr & s->pvr_mask) == s->pvr_value) {
-                       *cur = cpu_specs + i;
-#ifdef CONFIG_PPC64
-                       /* ppc64 expects identify_cpu to also call setup_cpu
-                        * for that processor. I will consolidate that at a
-                        * later time, for now, just use our friend #ifdef.
+                       /*
+                        * If we are overriding a previous value derived
+                        * from the real PVR with a new value obtained
+                        * using a logical PVR value, don't modify the
+                        * performance monitor fields.
+                        */
+                       if (t->num_pmcs && !s->num_pmcs) {
+                               t->cpu_name = s->cpu_name;
+                               t->cpu_features = s->cpu_features;
+                               t->cpu_user_features = s->cpu_user_features;
+                               t->icache_bsize = s->icache_bsize;
+                               t->dcache_bsize = s->dcache_bsize;
+                               t->cpu_setup = s->cpu_setup;
+                               t->cpu_restore = s->cpu_restore;
+                               t->platform = s->platform;
+                       } else
+                               *t = *s;
+                       *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
+#if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
+                       /* ppc64 and booke expect identify_cpu to also call 
+                        * setup_cpu for that processor. I will consolidate
+                        * that at a later time, for now, just use #ifdef.
                         * we also don't need to PTRRELOC the function pointer
-                        * on ppc64 as we are running at 0 in real mode.
+                        * on ppc64 and booke as we are running at 0 in real
+                        * mode on ppc64 and reloc_offset is always 0 on booke.
                         */
                        if (s->cpu_setup) {
                                s->cpu_setup(offset, s);
                        }
-#endif /* CONFIG_PPC64 */
+#endif /* CONFIG_PPC64 || CONFIG_BOOKE */
                        return s;
                }
        BUG();
index 37658ea417fa923b280ef92858209a303b85bb73..77c749a1337818190d56d9bbf04dcf36864951b8 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/types.h>
-#include <linux/irq.h>
 
 #include <asm/processor.h>
 #include <asm/machdep.h>
index 2f6f5a7bc69edc578bd617396b18b598046f6c7d..29ff77c468ac77a3f8d3afdf81722aa46054673e 100644 (file)
@@ -25,7 +25,7 @@
 #define DBG(fmt...)
 #endif
 
-void reserve_kdump_trampoline(void)
+void __init reserve_kdump_trampoline(void)
 {
        lmb_reserve(0, KDUMP_RESERVE_LIMIT);
 }
@@ -54,8 +54,10 @@ void __init setup_kdump_trampoline(void)
                create_trampoline(i);
        }
 
+#ifdef CONFIG_PPC_PSERIES
        create_trampoline(__pa(system_reset_fwnmi) - PHYSICAL_START);
        create_trampoline(__pa(machine_check_fwnmi) - PHYSICAL_START);
+#endif /* CONFIG_PPC_PSERIES */
 
        DBG(" <- setup_kdump_trampoline()\n");
 }
index 4074c0b314537acfa1970815eecdcc5db010e050..21d889e63e87520d9e49112a99d20fc8d887da90 100644 (file)
@@ -504,9 +504,11 @@ BEGIN_FTR_SECTION
 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 #endif /* CONFIG_ALTIVEC */
 #ifdef CONFIG_SPE
+BEGIN_FTR_SECTION
        oris    r0,r0,MSR_SPE@h  /* Disable SPE */
        mfspr   r12,SPRN_SPEFSCR /* save spefscr register value */
        stw     r12,THREAD+THREAD_SPEFSCR(r2)
+END_FTR_SECTION_IFSET(CPU_FTR_SPE)
 #endif /* CONFIG_SPE */
        and.    r0,r0,r11       /* FP or altivec or SPE enabled? */
        beq+    1f
@@ -542,8 +544,10 @@ BEGIN_FTR_SECTION
 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 #endif /* CONFIG_ALTIVEC */
 #ifdef CONFIG_SPE
+BEGIN_FTR_SECTION
        lwz     r0,THREAD+THREAD_SPEFSCR(r2)
        mtspr   SPRN_SPEFSCR,r0         /* restore SPEFSCR reg */
+END_FTR_SECTION_IFSET(CPU_FTR_SPE)
 #endif /* CONFIG_SPE */
 
        lwz     r0,_CCR(r1)
index 952eba6701f404c2d8ec1a69b2a6595d26250f94..0ec13403489906a5a8b2309facf0ad8b00f414d0 100644 (file)
@@ -372,9 +372,17 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
        std     r6,PACACURRENT(r13)     /* Set new 'current' */
 
        ld      r8,KSP(r4)      /* new stack pointer */
+BEGIN_FTR_SECTION
+       b       2f
+END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
 BEGIN_FTR_SECTION
        clrrdi  r6,r8,28        /* get its ESID */
        clrrdi  r9,r1,28        /* get current sp ESID */
+END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT)
+BEGIN_FTR_SECTION
+       clrrdi  r6,r8,40        /* get its 1T ESID */
+       clrrdi  r9,r1,40        /* get current sp 1T ESID */
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
        clrldi. r0,r6,2         /* is new ESID c00000000? */
        cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
        cror    eq,4*cr1+eq,eq
@@ -384,16 +392,21 @@ BEGIN_FTR_SECTION
        ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
        oris    r0,r6,(SLB_ESID_V)@h
        ori     r0,r0,(SLB_NUM_BOLTED-1)@l
-
-       /* Update the last bolted SLB */
+BEGIN_FTR_SECTION
+       li      r9,MMU_SEGSIZE_1T       /* insert B field */
+       oris    r6,r6,(MMU_SEGSIZE_1T << SLBIE_SSIZE_SHIFT)@h
+       rldimi  r7,r9,SLB_VSID_SSIZE_SHIFT,0
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
+
+       /* Update the last bolted SLB.  No write barriers are needed
+        * here, provided we only update the current CPU's SLB shadow
+        * buffer.
+        */
        ld      r9,PACA_SLBSHADOWPTR(r13)
        li      r12,0
        std     r12,SLBSHADOW_STACKESID(r9) /* Clear ESID */
-       eieio
        std     r7,SLBSHADOW_STACKVSID(r9)  /* Save VSID */
-       eieio
        std     r0,SLBSHADOW_STACKESID(r9)  /* Save ESID */
-       eieio
 
        slbie   r6
        slbie   r6              /* Workaround POWER5 < DD2.1 issue */
@@ -401,7 +414,6 @@ BEGIN_FTR_SECTION
        isync
 
 2:
-END_FTR_SECTION_IFSET(CPU_FTR_SLB)
        clrrdi  r7,r8,THREAD_SHIFT      /* base of new stack */
        /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
           because we don't need to leave the 288-byte ABI gap at the
index 7d73a13450b060b37623176df2d2f455476c758f..a5b13ae7fd20d6a225cee77942c7b26f19ab8f58 100644 (file)
        mtspr   SPRN_DBAT##n##L,RB;     \
 1:
 
-       .text
+       .section        .text.head, "ax"
        .stabs  "arch/powerpc/kernel/",N_SO,0,0,0f
        .stabs  "head_32.S",N_SO,0,0,0f
 0:
-       .globl  _stext
-_stext:
+_ENTRY(_stext);
 
 /*
  * _start is defined this way because the XCOFF loader in the OpenFirmware
  * on the powermac expects the entry point to be a procedure descriptor.
  */
-       .text
-       .globl  _start
-_start:
+_ENTRY(_start);
        /*
         * These are here for legacy reasons, the kernel used to
         * need to look like a coff function entry for the pmac
@@ -152,6 +149,9 @@ __after_mmu_off:
 #if defined(CONFIG_BOOTX_TEXT)
        bl      setup_disp_bat
 #endif
+#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
+       bl      setup_cpm_bat
+#endif
 
 /*
  * Call setup_cpu for CPU 0 and initialize 6xx Idle
@@ -469,16 +469,16 @@ InstructionTLBMiss:
        mfctr   r0
        /* Get PTE (linux-style) and check access */
        mfspr   r3,SPRN_IMISS
-       lis     r1,KERNELBASE@h         /* check if kernel address */
-       cmplw   0,r3,r1
+       lis     r1,PAGE_OFFSET@h                /* check if kernel address */
+       cmplw   0,r1,r3
        mfspr   r2,SPRN_SPRG3
        li      r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */
        lwz     r2,PGDIR(r2)
-       blt+    112f
+       bge-    112f
+       mfspr   r2,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
+       rlwimi  r1,r2,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
        lis     r2,swapper_pg_dir@ha    /* if kernel address, use */
        addi    r2,r2,swapper_pg_dir@l  /* kernel page table */
-       mfspr   r1,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
-       rlwinm  r1,r1,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
 112:   tophys(r2,r2)
        rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
        lwz     r2,0(r2)                /* get pmd entry */
@@ -543,16 +543,16 @@ DataLoadTLBMiss:
        mfctr   r0
        /* Get PTE (linux-style) and check access */
        mfspr   r3,SPRN_DMISS
-       lis     r1,KERNELBASE@h         /* check if kernel address */
-       cmplw   0,r3,r1
+       lis     r1,PAGE_OFFSET@h                /* check if kernel address */
+       cmplw   0,r1,r3
        mfspr   r2,SPRN_SPRG3
        li      r1,_PAGE_USER|_PAGE_PRESENT /* low addresses tested as user */
        lwz     r2,PGDIR(r2)
-       blt+    112f
+       bge-    112f
+       mfspr   r2,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
+       rlwimi  r1,r2,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
        lis     r2,swapper_pg_dir@ha    /* if kernel address, use */
        addi    r2,r2,swapper_pg_dir@l  /* kernel page table */
-       mfspr   r1,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
-       rlwinm  r1,r1,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
 112:   tophys(r2,r2)
        rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
        lwz     r2,0(r2)                /* get pmd entry */
@@ -615,16 +615,16 @@ DataStoreTLBMiss:
        mfctr   r0
        /* Get PTE (linux-style) and check access */
        mfspr   r3,SPRN_DMISS
-       lis     r1,KERNELBASE@h         /* check if kernel address */
-       cmplw   0,r3,r1
+       lis     r1,PAGE_OFFSET@h                /* check if kernel address */
+       cmplw   0,r1,r3
        mfspr   r2,SPRN_SPRG3
        li      r1,_PAGE_RW|_PAGE_USER|_PAGE_PRESENT /* access flags */
        lwz     r2,PGDIR(r2)
-       blt+    112f
+       bge-    112f
+       mfspr   r2,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
+       rlwimi  r1,r2,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
        lis     r2,swapper_pg_dir@ha    /* if kernel address, use */
        addi    r2,r2,swapper_pg_dir@l  /* kernel page table */
-       mfspr   r1,SPRN_SRR1            /* and MSR_PR bit from SRR1 */
-       rlwinm  r1,r1,32-12,29,29       /* shift MSR_PR to _PAGE_USER posn */
 112:   tophys(r2,r2)
        rlwimi  r2,r3,12,20,29          /* insert top 10 bits of address */
        lwz     r2,0(r2)                /* get pmd entry */
@@ -841,7 +841,7 @@ relocate_kernel:
  * r3 = dest addr, r4 = source addr, r5 = copy limit, r6 = start offset
  * on exit, r3, r4, r5 are unchanged, r6 is updated to be >= r5.
  */
-_GLOBAL(copy_and_flush)
+_ENTRY(copy_and_flush)
        addi    r5,r5,-4
        addi    r6,r6,-4
 4:     li      r0,L1_CACHE_BYTES/4
@@ -954,9 +954,9 @@ __secondary_start:
  * included in CONFIG_6xx
  */
 #if !defined(CONFIG_6xx)
-_GLOBAL(__save_cpu_setup)
+_ENTRY(__save_cpu_setup)
        blr
-_GLOBAL(__restore_cpu_setup)
+_ENTRY(__restore_cpu_setup)
        blr
 #endif /* !defined(CONFIG_6xx) */
 
@@ -1080,7 +1080,7 @@ start_here:
 /*
  * Set up the segment registers for a new context.
  */
-_GLOBAL(set_context)
+_ENTRY(set_context)
        mulli   r3,r3,897       /* multiply context by skew factor */
        rlwinm  r3,r3,4,8,27    /* VSID = (context & 0xfffff) << 4 */
        addis   r3,r3,0x6000    /* Set Ks, Ku bits */
@@ -1248,6 +1248,19 @@ setup_disp_bat:
        blr
 #endif /* CONFIG_BOOTX_TEXT */
 
+#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
+setup_cpm_bat:
+       lis     r8, 0xf000
+       ori     r8, r8, 0x002a
+       mtspr   SPRN_DBAT1L, r8
+
+       lis     r11, 0xf000
+       ori     r11, r11, (BL_1M << 2) | 2
+       mtspr   SPRN_DBAT1U, r11
+
+       blr
+#endif
+
 #ifdef CONFIG_8260
 /* Jump into the system reset for the rom.
  * We first disable the MMU, and then jump to the ROM reset address.
@@ -1300,14 +1313,6 @@ empty_zero_page:
 swapper_pg_dir:
        .space  4096
 
-/*
- * This space gets a copy of optional info passed to us by the bootstrap
- * Used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  512
-
        .globl intercept_table
 intercept_table:
        .long 0, 0, i0x200, i0x300, i0x400, 0, i0x600, i0x700
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
new file mode 100644 (file)
index 0000000..cfefc2d
--- /dev/null
@@ -0,0 +1,1013 @@
+/*
+ *    Copyright (c) 1995-1996 Gary Thomas <gdt@linuxppc.org>
+ *      Initial PowerPC version.
+ *    Copyright (c) 1996 Cort Dougan <cort@cs.nmt.edu>
+ *      Rewritten for PReP
+ *    Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
+ *      Low-level exception handers, MMU support, and rewrite.
+ *    Copyright (c) 1997 Dan Malek <dmalek@jlc.net>
+ *      PowerPC 8xx modifications.
+ *    Copyright (c) 1998-1999 TiVo, Inc.
+ *      PowerPC 403GCX modifications.
+ *    Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
+ *      PowerPC 403GCX/405GP modifications.
+ *    Copyright 2000 MontaVista Software Inc.
+ *     PPC405 modifications
+ *      PowerPC 403GCX/405GP modifications.
+ *     Author: MontaVista Software, Inc.
+ *             frank_rowand@mvista.com or source@mvista.com
+ *             debbie_chu@mvista.com
+ *
+ *
+ *    Module name: head_4xx.S
+ *
+ *    Description:
+ *      Kernel execution entry point code.
+ *
+ *    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 <asm/processor.h>
+#include <asm/page.h>
+#include <asm/mmu.h>
+#include <asm/pgtable.h>
+#include <asm/cputable.h>
+#include <asm/thread_info.h>
+#include <asm/ppc_asm.h>
+#include <asm/asm-offsets.h>
+
+/* As with the other PowerPC ports, it is expected that when code
+ * execution begins here, the following registers contain valid, yet
+ * optional, information:
+ *
+ *   r3 - Board info structure pointer (DRAM, frequency, MAC address, etc.)
+ *   r4 - Starting address of the init RAM disk
+ *   r5 - Ending address of the init RAM disk
+ *   r6 - Start of kernel command line string (e.g. "mem=96m")
+ *   r7 - End of kernel command line string
+ *
+ * This is all going to change RSN when we add bi_recs.......  -- Dan
+ */
+       .section        .text.head, "ax"
+_ENTRY(_stext);
+_ENTRY(_start);
+
+       /* Save parameters we are passed.
+       */
+       mr      r31,r3
+       mr      r30,r4
+       mr      r29,r5
+       mr      r28,r6
+       mr      r27,r7
+
+       /* We have to turn on the MMU right away so we get cache modes
+        * set correctly.
+        */
+       bl      initial_mmu
+
+/* We now have the lower 16 Meg mapped into TLB entries, and the caches
+ * ready to work.
+ */
+turn_on_mmu:
+       lis     r0,MSR_KERNEL@h
+       ori     r0,r0,MSR_KERNEL@l
+       mtspr   SPRN_SRR1,r0
+       lis     r0,start_here@h
+       ori     r0,r0,start_here@l
+       mtspr   SPRN_SRR0,r0
+       SYNC
+       rfi                             /* enables MMU */
+       b       .                       /* prevent prefetch past rfi */
+
+/*
+ * This area is used for temporarily saving registers during the
+ * critical exception prolog.
+ */
+       . = 0xc0
+crit_save:
+_ENTRY(crit_r10)
+       .space  4
+_ENTRY(crit_r11)
+       .space  4
+
+/*
+ * Exception vector entry code. This code runs with address translation
+ * turned off (i.e. using physical addresses). We assume SPRG3 has the
+ * physical address of the current task thread_struct.
+ * Note that we have to have decremented r1 before we write to any fields
+ * of the exception frame, since a critical interrupt could occur at any
+ * time, and it will write to the area immediately below the current r1.
+ */
+#define NORMAL_EXCEPTION_PROLOG                                                     \
+       mtspr   SPRN_SPRG0,r10;         /* save two registers to work with */\
+       mtspr   SPRN_SPRG1,r11;                                              \
+       mtspr   SPRN_SPRG2,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     */\
+       tophys(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_SPRG2;                                              \
+       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)
+
+/*
+ * Exception prolog for critical exceptions.  This is a little different
+ * from the normal exception prolog above since a critical 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 couple of words of memory at low physical addresses.
+ * This is OK since we don't support SMP on these processors.
+ */
+#define CRITICAL_EXCEPTION_PROLOG                                           \
+       stw     r10,crit_r10@l(0);      /* save two registers to work with */\
+       stw     r11,crit_r11@l(0);                                           \
+       mfcr    r10;                    /* save CR in r10 for now          */\
+       mfspr   r11,SPRN_SRR3;          /* check whether user or kernel    */\
+       andi.   r11,r11,MSR_PR;                                              \
+       lis     r11,critical_stack_top@h;                                    \
+       ori     r11,r11,critical_stack_top@l;                                \
+       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     */\
+       tophys(r11,r11);                                                     \
+       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,SPRN_SRR2;                                               \
+       stw     r1,GPR1(r11);                                                \
+       mfspr   r9,SPRN_SRR3;                                                \
+       stw     r1,0(r11);                                                   \
+       tovirt(r1,r11);                                                      \
+       rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
+       stw     r0,GPR0(r11);                                                \
+       SAVE_4GPRS(3, r11);                                                  \
+       SAVE_2GPRS(7, r11)
+
+       /*
+        * State at this point:
+        * r9 saved in stack frame, now saved SRR3 & ~MSR_WE
+        * r10 saved in crit_r10 and in stack frame, trashed
+        * r11 saved in crit_r11 and in stack frame,
+        *      now phys stack/exception frame pointer
+        * r12 saved in stack frame, now saved SRR2
+        * CR saved in stack frame, CR0.EQ = !SRR3.PR
+        * LR, DEAR, ESR in stack frame
+        * r1 saved in stack frame, now virt stack/excframe pointer
+        * r0, r3-r8 saved in stack frame
+        */
+
+/*
+ * Exception vectors.
+ */
+#define        START_EXCEPTION(n, label)                                            \
+       . = n;                                                               \
+label:
+
+#define EXCEPTION(n, label, hdlr, xfer)                                \
+       START_EXCEPTION(n, label);                              \
+       NORMAL_EXCEPTION_PROLOG;                                \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
+       xfer(n, hdlr)
+
+#define CRITICAL_EXCEPTION(n, label, hdlr)                     \
+       START_EXCEPTION(n, 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 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)
+
+
+/*
+ * 0x0100 - Critical Interrupt Exception
+ */
+       CRITICAL_EXCEPTION(0x0100, CriticalInterrupt, unknown_exception)
+
+/*
+ * 0x0200 - Machine Check Exception
+ */
+       CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
+
+/*
+ * 0x0300 - Data Storage Exception
+ * This happens for just a few reasons.  U0 set (but we don't do that),
+ * or zone protection fault (user violation, write to protected page).
+ * If this is just an update of modified status, we do that quickly
+ * and exit.  Otherwise, we call heavywight functions to do the work.
+ */
+       START_EXCEPTION(0x0300, DataStorage)
+       mtspr   SPRN_SPRG0, r10         /* Save some working registers */
+       mtspr   SPRN_SPRG1, r11
+#ifdef CONFIG_403GCX
+       stw     r12, 0(r0)
+       stw     r9, 4(r0)
+       mfcr    r11
+       mfspr   r12, SPRN_PID
+       stw     r11, 8(r0)
+       stw     r12, 12(r0)
+#else
+       mtspr   SPRN_SPRG4, r12
+       mtspr   SPRN_SPRG5, r9
+       mfcr    r11
+       mfspr   r12, SPRN_PID
+       mtspr   SPRN_SPRG7, r11
+       mtspr   SPRN_SPRG6, r12
+#endif
+
+       /* First, check if it was a zone fault (which means a user
+       * tried to access a kernel or read-protected page - always
+       * a SEGV).  All other faults here must be stores, so no
+       * need to check ESR_DST as well. */
+       mfspr   r10, SPRN_ESR
+       andis.  r10, r10, ESR_DIZ@h
+       bne     2f
+
+       mfspr   r10, SPRN_DEAR          /* Get faulting address */
+
+       /* If we are faulting a kernel address, we have to use the
+        * kernel page tables.
+        */
+       lis     r11, PAGE_OFFSET@h
+       cmplw   r10, r11
+       blt+    3f
+       lis     r11, swapper_pg_dir@h
+       ori     r11, r11, swapper_pg_dir@l
+       li      r9, 0
+       mtspr   SPRN_PID, r9            /* TLB will have 0 TID */
+       b       4f
+
+       /* Get the PGD for the current thread.
+        */
+3:
+       mfspr   r11,SPRN_SPRG3
+       lwz     r11,PGDIR(r11)
+4:
+       tophys(r11, r11)
+       rlwimi  r11, r10, 12, 20, 29    /* Create L1 (pgdir/pmd) address */
+       lwz     r11, 0(r11)             /* Get L1 entry */
+       rlwinm. r12, r11, 0, 0, 19      /* Extract L2 (pte) base address */
+       beq     2f                      /* Bail if no table */
+
+       rlwimi  r12, r10, 22, 20, 29    /* Compute PTE address */
+       lwz     r11, 0(r12)             /* Get Linux PTE */
+
+       andi.   r9, r11, _PAGE_RW       /* Is it writeable? */
+       beq     2f                      /* Bail if not */
+
+       /* Update 'changed'.
+       */
+       ori     r11, r11, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE
+       stw     r11, 0(r12)             /* Update Linux page table */
+
+       /* Most of the Linux PTE is ready to load into the TLB LO.
+        * We set ZSEL, where only the LS-bit determines user access.
+        * We set execute, because we don't have the granularity to
+        * properly set this at the page level (Linux problem).
+        * If shared is set, we cause a zero PID->TID load.
+        * Many of these bits are software only.  Bits we don't set
+        * here we (properly should) assume have the appropriate value.
+        */
+       li      r12, 0x0ce2
+       andc    r11, r11, r12           /* Make sure 20, 21 are zero */
+
+       /* find the TLB index that caused the fault.  It has to be here.
+       */
+       tlbsx   r9, 0, r10
+
+       tlbwe   r11, r9, TLB_DATA               /* Load TLB LO */
+
+       /* Done...restore registers and get out of here.
+       */
+#ifdef CONFIG_403GCX
+       lwz     r12, 12(r0)
+       lwz     r11, 8(r0)
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       lwz     r9, 4(r0)
+       lwz     r12, 0(r0)
+#else
+       mfspr   r12, SPRN_SPRG6
+       mfspr   r11, SPRN_SPRG7
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       mfspr   r9, SPRN_SPRG5
+       mfspr   r12, SPRN_SPRG4
+#endif
+       mfspr   r11, SPRN_SPRG1
+       mfspr   r10, SPRN_SPRG0
+       PPC405_ERR77_SYNC
+       rfi                     /* Should sync shadow TLBs */
+       b       .               /* prevent prefetch past rfi */
+
+2:
+       /* The bailout.  Restore registers to pre-exception conditions
+        * and call the heavyweights to help us out.
+        */
+#ifdef CONFIG_403GCX
+       lwz     r12, 12(r0)
+       lwz     r11, 8(r0)
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       lwz     r9, 4(r0)
+       lwz     r12, 0(r0)
+#else
+       mfspr   r12, SPRN_SPRG6
+       mfspr   r11, SPRN_SPRG7
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       mfspr   r9, SPRN_SPRG5
+       mfspr   r12, SPRN_SPRG4
+#endif
+       mfspr   r11, SPRN_SPRG1
+       mfspr   r10, SPRN_SPRG0
+       b       DataAccess
+
+/*
+ * 0x0400 - Instruction Storage Exception
+ * This is caused by a fetch from non-execute or guarded pages.
+ */
+       START_EXCEPTION(0x0400, InstructionAccess)
+       NORMAL_EXCEPTION_PROLOG
+       mr      r4,r12                  /* Pass SRR0 as arg2 */
+       li      r5,0                    /* Pass zero as arg3 */
+       EXC_XFER_EE_LITE(0x400, handle_page_fault)
+
+/* 0x0500 - External Interrupt Exception */
+       EXCEPTION(0x0500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
+
+/* 0x0600 - Alignment Exception */
+       START_EXCEPTION(0x0600, 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(0x600, alignment_exception)
+
+/* 0x0700 - Program Exception */
+       START_EXCEPTION(0x0700, ProgramCheck)
+       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(0x700, program_check_exception)
+
+       EXCEPTION(0x0800, Trap_08, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x0900, Trap_09, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x0A00, Trap_0A, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x0B00, Trap_0B, unknown_exception, EXC_XFER_EE)
+
+/* 0x0C00 - System Call Exception */
+       START_EXCEPTION(0x0C00, SystemCall)
+       NORMAL_EXCEPTION_PROLOG
+       EXC_XFER_EE_LITE(0xc00, DoSyscall)
+
+       EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_EE)
+
+/* 0x1000 - Programmable Interval Timer (PIT) Exception */
+       START_EXCEPTION(0x1000, Decrementer)
+       NORMAL_EXCEPTION_PROLOG
+       lis     r0,TSR_PIS@h
+       mtspr   SPRN_TSR,r0             /* Clear the PIT exception */
+       addi    r3,r1,STACK_FRAME_OVERHEAD
+       EXC_XFER_LITE(0x1000, timer_interrupt)
+
+#if 0
+/* NOTE:
+ * FIT and WDT handlers are not implemented yet.
+ */
+
+/* 0x1010 - Fixed Interval Timer (FIT) Exception
+*/
+       STND_EXCEPTION(0x1010,  FITException,           unknown_exception)
+
+/* 0x1020 - Watchdog Timer (WDT) Exception
+*/
+#ifdef CONFIG_BOOKE_WDT
+       CRITICAL_EXCEPTION(0x1020, WDTException, WatchdogException)
+#else
+       CRITICAL_EXCEPTION(0x1020, WDTException, unknown_exception)
+#endif
+#endif
+
+/* 0x1100 - Data TLB Miss Exception
+ * As the name implies, translation is not in the MMU, so search the
+ * page tables and fix it.  The only purpose of this function is to
+ * load TLB entries from the page table if they exist.
+ */
+       START_EXCEPTION(0x1100, DTLBMiss)
+       mtspr   SPRN_SPRG0, r10         /* Save some working registers */
+       mtspr   SPRN_SPRG1, r11
+#ifdef CONFIG_403GCX
+       stw     r12, 0(r0)
+       stw     r9, 4(r0)
+       mfcr    r11
+       mfspr   r12, SPRN_PID
+       stw     r11, 8(r0)
+       stw     r12, 12(r0)
+#else
+       mtspr   SPRN_SPRG4, r12
+       mtspr   SPRN_SPRG5, r9
+       mfcr    r11
+       mfspr   r12, SPRN_PID
+       mtspr   SPRN_SPRG7, r11
+       mtspr   SPRN_SPRG6, r12
+#endif
+       mfspr   r10, SPRN_DEAR          /* Get faulting address */
+
+       /* If we are faulting a kernel address, we have to use the
+        * kernel page tables.
+        */
+       lis     r11, PAGE_OFFSET@h
+       cmplw   r10, r11
+       blt+    3f
+       lis     r11, swapper_pg_dir@h
+       ori     r11, r11, swapper_pg_dir@l
+       li      r9, 0
+       mtspr   SPRN_PID, r9            /* TLB will have 0 TID */
+       b       4f
+
+       /* Get the PGD for the current thread.
+        */
+3:
+       mfspr   r11,SPRN_SPRG3
+       lwz     r11,PGDIR(r11)
+4:
+       tophys(r11, r11)
+       rlwimi  r11, r10, 12, 20, 29    /* Create L1 (pgdir/pmd) address */
+       lwz     r12, 0(r11)             /* Get L1 entry */
+       andi.   r9, r12, _PMD_PRESENT   /* Check if it points to a PTE page */
+       beq     2f                      /* Bail if no table */
+
+       rlwimi  r12, r10, 22, 20, 29    /* Compute PTE address */
+       lwz     r11, 0(r12)             /* Get Linux PTE */
+       andi.   r9, r11, _PAGE_PRESENT
+       beq     5f
+
+       ori     r11, r11, _PAGE_ACCESSED
+       stw     r11, 0(r12)
+
+       /* Create TLB tag.  This is the faulting address plus a static
+        * set of bits.  These are size, valid, E, U0.
+       */
+       li      r12, 0x00c0
+       rlwimi  r10, r12, 0, 20, 31
+
+       b       finish_tlb_load
+
+2:     /* Check for possible large-page pmd entry */
+       rlwinm. r9, r12, 2, 22, 24
+       beq     5f
+
+       /* Create TLB tag.  This is the faulting address, plus a static
+        * set of bits (valid, E, U0) plus the size from the PMD.
+        */
+       ori     r9, r9, 0x40
+       rlwimi  r10, r9, 0, 20, 31
+       mr      r11, r12
+
+       b       finish_tlb_load
+
+5:
+       /* The bailout.  Restore registers to pre-exception conditions
+        * and call the heavyweights to help us out.
+        */
+#ifdef CONFIG_403GCX
+       lwz     r12, 12(r0)
+       lwz     r11, 8(r0)
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       lwz     r9, 4(r0)
+       lwz     r12, 0(r0)
+#else
+       mfspr   r12, SPRN_SPRG6
+       mfspr   r11, SPRN_SPRG7
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       mfspr   r9, SPRN_SPRG5
+       mfspr   r12, SPRN_SPRG4
+#endif
+       mfspr   r11, SPRN_SPRG1
+       mfspr   r10, SPRN_SPRG0
+       b       DataAccess
+
+/* 0x1200 - Instruction TLB Miss Exception
+ * Nearly the same as above, except we get our information from different
+ * registers and bailout to a different point.
+ */
+       START_EXCEPTION(0x1200, ITLBMiss)
+       mtspr   SPRN_SPRG0, r10         /* Save some working registers */
+       mtspr   SPRN_SPRG1, r11
+#ifdef CONFIG_403GCX
+       stw     r12, 0(r0)
+       stw     r9, 4(r0)
+       mfcr    r11
+       mfspr   r12, SPRN_PID
+       stw     r11, 8(r0)
+       stw     r12, 12(r0)
+#else
+       mtspr   SPRN_SPRG4, r12
+       mtspr   SPRN_SPRG5, r9
+       mfcr    r11
+       mfspr   r12, SPRN_PID
+       mtspr   SPRN_SPRG7, r11
+       mtspr   SPRN_SPRG6, r12
+#endif
+       mfspr   r10, SPRN_SRR0          /* Get faulting address */
+
+       /* If we are faulting a kernel address, we have to use the
+        * kernel page tables.
+        */
+       lis     r11, PAGE_OFFSET@h
+       cmplw   r10, r11
+       blt+    3f
+       lis     r11, swapper_pg_dir@h
+       ori     r11, r11, swapper_pg_dir@l
+       li      r9, 0
+       mtspr   SPRN_PID, r9            /* TLB will have 0 TID */
+       b       4f
+
+       /* Get the PGD for the current thread.
+        */
+3:
+       mfspr   r11,SPRN_SPRG3
+       lwz     r11,PGDIR(r11)
+4:
+       tophys(r11, r11)
+       rlwimi  r11, r10, 12, 20, 29    /* Create L1 (pgdir/pmd) address */
+       lwz     r12, 0(r11)             /* Get L1 entry */
+       andi.   r9, r12, _PMD_PRESENT   /* Check if it points to a PTE page */
+       beq     2f                      /* Bail if no table */
+
+       rlwimi  r12, r10, 22, 20, 29    /* Compute PTE address */
+       lwz     r11, 0(r12)             /* Get Linux PTE */
+       andi.   r9, r11, _PAGE_PRESENT
+       beq     5f
+
+       ori     r11, r11, _PAGE_ACCESSED
+       stw     r11, 0(r12)
+
+       /* Create TLB tag.  This is the faulting address plus a static
+        * set of bits.  These are size, valid, E, U0.
+       */
+       li      r12, 0x00c0
+       rlwimi  r10, r12, 0, 20, 31
+
+       b       finish_tlb_load
+
+2:     /* Check for possible large-page pmd entry */
+       rlwinm. r9, r12, 2, 22, 24
+       beq     5f
+
+       /* Create TLB tag.  This is the faulting address, plus a static
+        * set of bits (valid, E, U0) plus the size from the PMD.
+        */
+       ori     r9, r9, 0x40
+       rlwimi  r10, r9, 0, 20, 31
+       mr      r11, r12
+
+       b       finish_tlb_load
+
+5:
+       /* The bailout.  Restore registers to pre-exception conditions
+        * and call the heavyweights to help us out.
+        */
+#ifdef CONFIG_403GCX
+       lwz     r12, 12(r0)
+       lwz     r11, 8(r0)
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       lwz     r9, 4(r0)
+       lwz     r12, 0(r0)
+#else
+       mfspr   r12, SPRN_SPRG6
+       mfspr   r11, SPRN_SPRG7
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       mfspr   r9, SPRN_SPRG5
+       mfspr   r12, SPRN_SPRG4
+#endif
+       mfspr   r11, SPRN_SPRG1
+       mfspr   r10, SPRN_SPRG0
+       b       InstructionAccess
+
+       EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1400, Trap_14, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
+#ifdef CONFIG_IBM405_ERR51
+       /* 405GP errata 51 */
+       START_EXCEPTION(0x1700, Trap_17)
+       b DTLBMiss
+#else
+       EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_EE)
+#endif
+       EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1A00, Trap_1A, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1B00, Trap_1B, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1C00, Trap_1C, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1D00, Trap_1D, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1E00, Trap_1E, unknown_exception, EXC_XFER_EE)
+       EXCEPTION(0x1F00, Trap_1F, unknown_exception, EXC_XFER_EE)
+
+/* 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_SRR1, which will still have
+ * the MSR_DE bit set.
+ */
+       /* 0x2000 - Debug Exception */
+       START_EXCEPTION(0x2000, DebugTrap)
+       CRITICAL_EXCEPTION_PROLOG
+
+       /*
+        * If this 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 SRR3 value and clearing the debug status.
+        */
+       mfspr   r10,SPRN_DBSR           /* check single-step/branch taken */
+       andis.  r10,r10,DBSR_IC@h
+       beq+    2f
+
+       andi.   r10,r9,MSR_IR|MSR_PR    /* check supervisor + MMU off */
+       beq     1f                      /* branch and fix it up */
+
+       mfspr   r10,SPRN_SRR2           /* Faulting instruction address */
+       cmplwi  r10,0x2100
+       bgt+    2f                      /* address above exception vectors */
+
+       /* here it looks like we got an inappropriate debug exception. */
+1:     rlwinm  r9,r9,0,~MSR_DE         /* clear DE in the SRR3 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_SRR2,r12
+       mtspr   SPRN_SRR3,r9
+       lwz     r9,GPR9(r11)
+       lwz     r12,GPR12(r11)
+       lwz     r10,crit_r10@l(0)
+       lwz     r11,crit_r11@l(0)
+       PPC405_ERR77_SYNC
+       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)
+
+/*
+ * The other Data TLB exceptions bail out to this point
+ * if they can't resolve the lightweight TLB fault.
+ */
+DataAccess:
+       NORMAL_EXCEPTION_PROLOG
+       mfspr   r5,SPRN_ESR             /* Grab the ESR, save it, pass arg3 */
+       stw     r5,_ESR(r11)
+       mfspr   r4,SPRN_DEAR            /* Grab the DEAR, save it, pass arg2 */
+       EXC_XFER_EE_LITE(0x300, handle_page_fault)
+
+/* Other PowerPC processors, namely those derived from the 6xx-series
+ * have vectors from 0x2100 through 0x2F00 defined, but marked as reserved.
+ * However, for the 4xx-series processors these are neither defined nor
+ * reserved.
+ */
+
+       /* Damn, I came up one instruction too many to fit into the
+        * exception space :-).  Both the instruction and data TLB
+        * miss get to this point to load the TLB.
+        *      r10 - TLB_TAG value
+        *      r11 - Linux PTE
+        *      r12, r9 - avilable to use
+        *      PID - loaded with proper value when we get here
+        *      Upon exit, we reload everything and RFI.
+        * Actually, it will fit now, but oh well.....a common place
+        * to load the TLB.
+        */
+tlb_4xx_index:
+       .long   0
+finish_tlb_load:
+       /* load the next available TLB index.
+       */
+       lwz     r9, tlb_4xx_index@l(0)
+       addi    r9, r9, 1
+       andi.   r9, r9, (PPC40X_TLB_SIZE-1)
+       stw     r9, tlb_4xx_index@l(0)
+
+6:
+       /*
+        * Clear out the software-only bits in the PTE to generate the
+        * TLB_DATA value.  These are the bottom 2 bits of the RPM, the
+        * top 3 bits of the zone field, and M.
+        */
+       li      r12, 0x0ce2
+       andc    r11, r11, r12
+
+       tlbwe   r11, r9, TLB_DATA               /* Load TLB LO */
+       tlbwe   r10, r9, TLB_TAG                /* Load TLB HI */
+
+       /* Done...restore registers and get out of here.
+       */
+#ifdef CONFIG_403GCX
+       lwz     r12, 12(r0)
+       lwz     r11, 8(r0)
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       lwz     r9, 4(r0)
+       lwz     r12, 0(r0)
+#else
+       mfspr   r12, SPRN_SPRG6
+       mfspr   r11, SPRN_SPRG7
+       mtspr   SPRN_PID, r12
+       mtcr    r11
+       mfspr   r9, SPRN_SPRG5
+       mfspr   r12, SPRN_SPRG4
+#endif
+       mfspr   r11, SPRN_SPRG1
+       mfspr   r10, SPRN_SPRG0
+       PPC405_ERR77_SYNC
+       rfi                     /* Should sync shadow TLBs */
+       b       .               /* prevent prefetch past rfi */
+
+/* extern void giveup_fpu(struct task_struct *prev)
+ *
+ * The PowerPC 4xx family of processors do not have an FPU, so this just
+ * returns.
+ */
+_ENTRY(giveup_fpu)
+       blr
+
+/* This is where the main kernel code starts.
+ */
+start_here:
+
+       /* ptr to current */
+       lis     r2,init_task@h
+       ori     r2,r2,init_task@l
+
+       /* ptr to phys current thread */
+       tophys(r4,r2)
+       addi    r4,r4,THREAD    /* init task's THREAD */
+       mtspr   SPRN_SPRG3,r4
+
+       /* stack */
+       lis     r1,init_thread_union@ha
+       addi    r1,r1,init_thread_union@l
+       li      r0,0
+       stwu    r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
+
+       bl      early_init      /* We have to do this with MMU on */
+
+/*
+ * Decide what sort of machine this is and initialize the MMU.
+ */
+       mr      r3,r31
+       mr      r4,r30
+       mr      r5,r29
+       mr      r6,r28
+       mr      r7,r27
+       bl      machine_init
+       bl      MMU_init
+
+/* Go back to running unmapped so we can load up new values
+ * and change to using our exception vectors.
+ * On the 4xx, all we have to do is invalidate the TLB to clear
+ * the old 16M byte TLB mappings.
+ */
+       lis     r4,2f@h
+       ori     r4,r4,2f@l
+       tophys(r4,r4)
+       lis     r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@h
+       ori     r3,r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@l
+       mtspr   SPRN_SRR0,r4
+       mtspr   SPRN_SRR1,r3
+       rfi
+       b       .               /* prevent prefetch past rfi */
+
+/* Load up the kernel context */
+2:
+       sync                    /* Flush to memory before changing TLB */
+       tlbia
+       isync                   /* Flush shadow TLBs */
+
+       /* set up the PTE pointers for the Abatron bdiGDB.
+       */
+       lis     r6, swapper_pg_dir@h
+       ori     r6, r6, swapper_pg_dir@l
+       lis     r5, abatron_pteptrs@h
+       ori     r5, r5, abatron_pteptrs@l
+       stw     r5, 0xf0(r0)    /* Must match your Abatron config file */
+       tophys(r5,r5)
+       stw     r6, 0(r5)
+
+/* Now turn on the MMU for real! */
+       lis     r4,MSR_KERNEL@h
+       ori     r4,r4,MSR_KERNEL@l
+       lis     r3,start_kernel@h
+       ori     r3,r3,start_kernel@l
+       mtspr   SPRN_SRR0,r3
+       mtspr   SPRN_SRR1,r4
+       rfi                     /* enable MMU and jump to start_kernel */
+       b       .               /* prevent prefetch past rfi */
+
+/* Set up the initial MMU state so we can do the first level of
+ * kernel initialization.  This maps the first 16 MBytes of memory 1:1
+ * virtual to physical and more importantly sets the cache mode.
+ */
+initial_mmu:
+       tlbia                   /* Invalidate all TLB entries */
+       isync
+
+       /* We should still be executing code at physical address 0x0000xxxx
+        * at this point. However, start_here is at virtual address
+        * 0xC000xxxx. So, set up a TLB mapping to cover this once
+        * translation is enabled.
+        */
+
+       lis     r3,KERNELBASE@h         /* Load the kernel virtual address */
+       ori     r3,r3,KERNELBASE@l
+       tophys(r4,r3)                   /* Load the kernel physical address */
+
+       iccci   r0,r3                   /* Invalidate the i-cache before use */
+
+       /* Load the kernel PID.
+       */
+       li      r0,0
+       mtspr   SPRN_PID,r0
+       sync
+
+       /* Configure and load two entries into TLB slots 62 and 63.
+        * In case we are pinning TLBs, these are reserved in by the
+        * other TLB functions.  If not reserving, then it doesn't
+        * matter where they are loaded.
+        */
+       clrrwi  r4,r4,10                /* Mask off the real page number */
+       ori     r4,r4,(TLB_WR | TLB_EX) /* Set the write and execute bits */
+
+       clrrwi  r3,r3,10                /* Mask off the effective page number */
+       ori     r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_16M))
+
+        li      r0,63                    /* TLB slot 63 */
+
+       tlbwe   r4,r0,TLB_DATA          /* Load the data portion of the entry */
+       tlbwe   r3,r0,TLB_TAG           /* Load the tag portion of the entry */
+
+#if defined(CONFIG_SERIAL_TEXT_DEBUG) && defined(SERIAL_DEBUG_IO_BASE)
+
+       /* Load a TLB entry for the UART, so that ppc4xx_progress() can use
+        * the UARTs nice and early.  We use a 4k real==virtual mapping. */
+
+       lis     r3,SERIAL_DEBUG_IO_BASE@h
+       ori     r3,r3,SERIAL_DEBUG_IO_BASE@l
+       mr      r4,r3
+       clrrwi  r4,r4,12
+       ori     r4,r4,(TLB_WR|TLB_I|TLB_M|TLB_G)
+
+       clrrwi  r3,r3,12
+       ori     r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_4K))
+
+       li      r0,0                    /* TLB slot 0 */
+       tlbwe   r4,r0,TLB_DATA
+       tlbwe   r3,r0,TLB_TAG
+#endif /* CONFIG_SERIAL_DEBUG_TEXT && SERIAL_DEBUG_IO_BASE */
+
+       isync
+
+       /* Establish the exception vector base
+       */
+       lis     r4,KERNELBASE@h         /* EVPR only uses the high 16-bits */
+       tophys(r0,r4)                   /* Use the physical address */
+       mtspr   SPRN_EVPR,r0
+
+       blr
+
+_GLOBAL(abort)
+        mfspr   r13,SPRN_DBCR0
+        oris    r13,r13,DBCR0_RST_SYSTEM@h
+        mtspr   SPRN_DBCR0,r13
+
+_GLOBAL(set_context)
+
+#ifdef CONFIG_BDI_SWITCH
+       /* Context switch the PTE pointer for the Abatron BDI2000.
+        * The PGDIR is the second parameter.
+        */
+       lis     r5, KERNELBASE@h
+       lwz     r5, 0xf0(r5)
+       stw     r4, 0x4(r5)
+#endif
+       sync
+       mtspr   SPRN_PID,r3
+       isync                           /* Need an isync to flush shadow */
+                                       /* TLBs after changing PID */
+       blr
+
+/* We put a few things here that have to be page-aligned. This stuff
+ * goes at the beginning of the data segment, which is page-aligned.
+ */
+       .data
+       .align  12
+       .globl  sdata
+sdata:
+       .globl  empty_zero_page
+empty_zero_page:
+       .space  4096
+       .globl  swapper_pg_dir
+swapper_pg_dir:
+       .space  4096
+
+
+/* Stack for handling critical exceptions from kernel mode */
+       .section .bss
+        .align 12
+exception_stack_bottom:
+       .space  4096
+critical_stack_top:
+       .globl  exception_stack_top
+exception_stack_top:
+
+/* Room for two PTE pointers, usually the kernel and current user pointers
+ * to their respective root page table.
+ */
+abatron_pteptrs:
+       .space  8
index 88695963f5872ecc444efa6dc204d6f865b1cecb..409db6123924fde81088c3a39d40a5e520280041 100644 (file)
@@ -50,9 +50,9 @@
  *   r7 - End of kernel command line string
  *
  */
-       .text
-_GLOBAL(_stext)
-_GLOBAL(_start)
+       .section        .text.head, "ax"
+_ENTRY(_stext);
+_ENTRY(_start);
        /*
         * Reserve a word at a fixed location to store the address
         * of abatron_pteptrs
@@ -217,16 +217,6 @@ skpinv:    addi    r4,r4,1                         /* Increment */
        lis     r4,interrupt_base@h     /* IVPR only uses the high 16-bits */
        mtspr   SPRN_IVPR,r4
 
-#ifdef CONFIG_440EP
-       /* Clear DAPUIB flag in CCR0 (enable APU between CPU and FPU) */
-       mfspr   r2,SPRN_CCR0
-       lis     r3,0xffef
-       ori     r3,r3,0xffff
-       and     r2,r2,r3
-       mtspr   SPRN_CCR0,r2
-       isync
-#endif
-
        /*
         * This is where the main kernel code starts.
         */
@@ -329,7 +319,7 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       lis     r11, TASK_SIZE@h
+       lis     r11, PAGE_OFFSET@h
        cmplw   r10, r11
        blt+    3f
        lis     r11, swapper_pg_dir@h
@@ -468,7 +458,7 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       lis     r11, TASK_SIZE@h
+       lis     r11, PAGE_OFFSET@h
        cmplw   r10, r11
        blt+    3f
        lis     r11, swapper_pg_dir@h
@@ -538,7 +528,7 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       lis     r11, TASK_SIZE@h
+       lis     r11, PAGE_OFFSET@h
        cmplw   r10, r11
        blt+    3f
        lis     r11, swapper_pg_dir@h
@@ -743,14 +733,6 @@ exception_stack_bottom:
        .globl  exception_stack_top
 exception_stack_top:
 
-/*
- * This space gets a copy of optional info passed to us by the bootstrap
- * which is used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  512
-
 /*
  * Room for two PTE pointers, usually the kernel and current user pointers
  * to their respective root page table.
diff --git a/arch/powerpc/kernel/head_4xx.S b/arch/powerpc/kernel/head_4xx.S
deleted file mode 100644 (file)
index adc7f80..0000000
+++ /dev/null
@@ -1,1021 +0,0 @@
-/*
- *    Copyright (c) 1995-1996 Gary Thomas <gdt@linuxppc.org>
- *      Initial PowerPC version.
- *    Copyright (c) 1996 Cort Dougan <cort@cs.nmt.edu>
- *      Rewritten for PReP
- *    Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
- *      Low-level exception handers, MMU support, and rewrite.
- *    Copyright (c) 1997 Dan Malek <dmalek@jlc.net>
- *      PowerPC 8xx modifications.
- *    Copyright (c) 1998-1999 TiVo, Inc.
- *      PowerPC 403GCX modifications.
- *    Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
- *      PowerPC 403GCX/405GP modifications.
- *    Copyright 2000 MontaVista Software Inc.
- *     PPC405 modifications
- *      PowerPC 403GCX/405GP modifications.
- *     Author: MontaVista Software, Inc.
- *             frank_rowand@mvista.com or source@mvista.com
- *             debbie_chu@mvista.com
- *
- *
- *    Module name: head_4xx.S
- *
- *    Description:
- *      Kernel execution entry point code.
- *
- *    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 <asm/processor.h>
-#include <asm/page.h>
-#include <asm/mmu.h>
-#include <asm/pgtable.h>
-#include <asm/ibm4xx.h>
-#include <asm/cputable.h>
-#include <asm/thread_info.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-
-/* As with the other PowerPC ports, it is expected that when code
- * execution begins here, the following registers contain valid, yet
- * optional, information:
- *
- *   r3 - Board info structure pointer (DRAM, frequency, MAC address, etc.)
- *   r4 - Starting address of the init RAM disk
- *   r5 - Ending address of the init RAM disk
- *   r6 - Start of kernel command line string (e.g. "mem=96m")
- *   r7 - End of kernel command line string
- *
- * This is all going to change RSN when we add bi_recs.......  -- Dan
- */
-       .text
-_GLOBAL(_stext)
-_GLOBAL(_start)
-
-       /* Save parameters we are passed.
-       */
-       mr      r31,r3
-       mr      r30,r4
-       mr      r29,r5
-       mr      r28,r6
-       mr      r27,r7
-
-       /* We have to turn on the MMU right away so we get cache modes
-        * set correctly.
-        */
-       bl      initial_mmu
-
-/* We now have the lower 16 Meg mapped into TLB entries, and the caches
- * ready to work.
- */
-turn_on_mmu:
-       lis     r0,MSR_KERNEL@h
-       ori     r0,r0,MSR_KERNEL@l
-       mtspr   SPRN_SRR1,r0
-       lis     r0,start_here@h
-       ori     r0,r0,start_here@l
-       mtspr   SPRN_SRR0,r0
-       SYNC
-       rfi                             /* enables MMU */
-       b       .                       /* prevent prefetch past rfi */
-
-/*
- * This area is used for temporarily saving registers during the
- * critical exception prolog.
- */
-       . = 0xc0
-crit_save:
-_GLOBAL(crit_r10)
-       .space  4
-_GLOBAL(crit_r11)
-       .space  4
-
-/*
- * Exception vector entry code. This code runs with address translation
- * turned off (i.e. using physical addresses). We assume SPRG3 has the
- * physical address of the current task thread_struct.
- * Note that we have to have decremented r1 before we write to any fields
- * of the exception frame, since a critical interrupt could occur at any
- * time, and it will write to the area immediately below the current r1.
- */
-#define NORMAL_EXCEPTION_PROLOG                                                     \
-       mtspr   SPRN_SPRG0,r10;         /* save two registers to work with */\
-       mtspr   SPRN_SPRG1,r11;                                              \
-       mtspr   SPRN_SPRG2,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     */\
-       tophys(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_SPRG2;                                              \
-       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)
-
-/*
- * Exception prolog for critical exceptions.  This is a little different
- * from the normal exception prolog above since a critical 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 couple of words of memory at low physical addresses.
- * This is OK since we don't support SMP on these processors.
- */
-#define CRITICAL_EXCEPTION_PROLOG                                           \
-       stw     r10,crit_r10@l(0);      /* save two registers to work with */\
-       stw     r11,crit_r11@l(0);                                           \
-       mfcr    r10;                    /* save CR in r10 for now          */\
-       mfspr   r11,SPRN_SRR3;          /* check whether user or kernel    */\
-       andi.   r11,r11,MSR_PR;                                              \
-       lis     r11,critical_stack_top@h;                                    \
-       ori     r11,r11,critical_stack_top@l;                                \
-       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     */\
-       tophys(r11,r11);                                                     \
-       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,SPRN_SRR2;                                               \
-       stw     r1,GPR1(r11);                                                \
-       mfspr   r9,SPRN_SRR3;                                                \
-       stw     r1,0(r11);                                                   \
-       tovirt(r1,r11);                                                      \
-       rlwinm  r9,r9,0,14,12;          /* clear MSR_WE (necessary?)       */\
-       stw     r0,GPR0(r11);                                                \
-       SAVE_4GPRS(3, r11);                                                  \
-       SAVE_2GPRS(7, r11)
-
-       /*
-        * State at this point:
-        * r9 saved in stack frame, now saved SRR3 & ~MSR_WE
-        * r10 saved in crit_r10 and in stack frame, trashed
-        * r11 saved in crit_r11 and in stack frame,
-        *      now phys stack/exception frame pointer
-        * r12 saved in stack frame, now saved SRR2
-        * CR saved in stack frame, CR0.EQ = !SRR3.PR
-        * LR, DEAR, ESR in stack frame
-        * r1 saved in stack frame, now virt stack/excframe pointer
-        * r0, r3-r8 saved in stack frame
-        */
-
-/*
- * Exception vectors.
- */
-#define        START_EXCEPTION(n, label)                                            \
-       . = n;                                                               \
-label:
-
-#define EXCEPTION(n, label, hdlr, xfer)                                \
-       START_EXCEPTION(n, label);                              \
-       NORMAL_EXCEPTION_PROLOG;                                \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;                     \
-       xfer(n, hdlr)
-
-#define CRITICAL_EXCEPTION(n, label, hdlr)                     \
-       START_EXCEPTION(n, 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 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)
-
-
-/*
- * 0x0100 - Critical Interrupt Exception
- */
-       CRITICAL_EXCEPTION(0x0100, CriticalInterrupt, unknown_exception)
-
-/*
- * 0x0200 - Machine Check Exception
- */
-       CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
-
-/*
- * 0x0300 - Data Storage Exception
- * This happens for just a few reasons.  U0 set (but we don't do that),
- * or zone protection fault (user violation, write to protected page).
- * If this is just an update of modified status, we do that quickly
- * and exit.  Otherwise, we call heavywight functions to do the work.
- */
-       START_EXCEPTION(0x0300, DataStorage)
-       mtspr   SPRN_SPRG0, r10         /* Save some working registers */
-       mtspr   SPRN_SPRG1, r11
-#ifdef CONFIG_403GCX
-       stw     r12, 0(r0)
-       stw     r9, 4(r0)
-       mfcr    r11
-       mfspr   r12, SPRN_PID
-       stw     r11, 8(r0)
-       stw     r12, 12(r0)
-#else
-       mtspr   SPRN_SPRG4, r12
-       mtspr   SPRN_SPRG5, r9
-       mfcr    r11
-       mfspr   r12, SPRN_PID
-       mtspr   SPRN_SPRG7, r11
-       mtspr   SPRN_SPRG6, r12
-#endif
-
-       /* First, check if it was a zone fault (which means a user
-       * tried to access a kernel or read-protected page - always
-       * a SEGV).  All other faults here must be stores, so no
-       * need to check ESR_DST as well. */
-       mfspr   r10, SPRN_ESR
-       andis.  r10, r10, ESR_DIZ@h
-       bne     2f
-
-       mfspr   r10, SPRN_DEAR          /* Get faulting address */
-
-       /* If we are faulting a kernel address, we have to use the
-        * kernel page tables.
-        */
-       lis     r11, TASK_SIZE@h
-       cmplw   r10, r11
-       blt+    3f
-       lis     r11, swapper_pg_dir@h
-       ori     r11, r11, swapper_pg_dir@l
-       li      r9, 0
-       mtspr   SPRN_PID, r9            /* TLB will have 0 TID */
-       b       4f
-
-       /* Get the PGD for the current thread.
-        */
-3:
-       mfspr   r11,SPRN_SPRG3
-       lwz     r11,PGDIR(r11)
-4:
-       tophys(r11, r11)
-       rlwimi  r11, r10, 12, 20, 29    /* Create L1 (pgdir/pmd) address */
-       lwz     r11, 0(r11)             /* Get L1 entry */
-       rlwinm. r12, r11, 0, 0, 19      /* Extract L2 (pte) base address */
-       beq     2f                      /* Bail if no table */
-
-       rlwimi  r12, r10, 22, 20, 29    /* Compute PTE address */
-       lwz     r11, 0(r12)             /* Get Linux PTE */
-
-       andi.   r9, r11, _PAGE_RW       /* Is it writeable? */
-       beq     2f                      /* Bail if not */
-
-       /* Update 'changed'.
-       */
-       ori     r11, r11, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE
-       stw     r11, 0(r12)             /* Update Linux page table */
-
-       /* Most of the Linux PTE is ready to load into the TLB LO.
-        * We set ZSEL, where only the LS-bit determines user access.
-        * We set execute, because we don't have the granularity to
-        * properly set this at the page level (Linux problem).
-        * If shared is set, we cause a zero PID->TID load.
-        * Many of these bits are software only.  Bits we don't set
-        * here we (properly should) assume have the appropriate value.
-        */
-       li      r12, 0x0ce2
-       andc    r11, r11, r12           /* Make sure 20, 21 are zero */
-
-       /* find the TLB index that caused the fault.  It has to be here.
-       */
-       tlbsx   r9, 0, r10
-
-       tlbwe   r11, r9, TLB_DATA               /* Load TLB LO */
-
-       /* Done...restore registers and get out of here.
-       */
-#ifdef CONFIG_403GCX
-       lwz     r12, 12(r0)
-       lwz     r11, 8(r0)
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       lwz     r9, 4(r0)
-       lwz     r12, 0(r0)
-#else
-       mfspr   r12, SPRN_SPRG6
-       mfspr   r11, SPRN_SPRG7
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       mfspr   r9, SPRN_SPRG5
-       mfspr   r12, SPRN_SPRG4
-#endif
-       mfspr   r11, SPRN_SPRG1
-       mfspr   r10, SPRN_SPRG0
-       PPC405_ERR77_SYNC
-       rfi                     /* Should sync shadow TLBs */
-       b       .               /* prevent prefetch past rfi */
-
-2:
-       /* The bailout.  Restore registers to pre-exception conditions
-        * and call the heavyweights to help us out.
-        */
-#ifdef CONFIG_403GCX
-       lwz     r12, 12(r0)
-       lwz     r11, 8(r0)
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       lwz     r9, 4(r0)
-       lwz     r12, 0(r0)
-#else
-       mfspr   r12, SPRN_SPRG6
-       mfspr   r11, SPRN_SPRG7
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       mfspr   r9, SPRN_SPRG5
-       mfspr   r12, SPRN_SPRG4
-#endif
-       mfspr   r11, SPRN_SPRG1
-       mfspr   r10, SPRN_SPRG0
-       b       DataAccess
-
-/*
- * 0x0400 - Instruction Storage Exception
- * This is caused by a fetch from non-execute or guarded pages.
- */
-       START_EXCEPTION(0x0400, InstructionAccess)
-       NORMAL_EXCEPTION_PROLOG
-       mr      r4,r12                  /* Pass SRR0 as arg2 */
-       li      r5,0                    /* Pass zero as arg3 */
-       EXC_XFER_EE_LITE(0x400, handle_page_fault)
-
-/* 0x0500 - External Interrupt Exception */
-       EXCEPTION(0x0500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
-
-/* 0x0600 - Alignment Exception */
-       START_EXCEPTION(0x0600, 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(0x600, alignment_exception)
-
-/* 0x0700 - Program Exception */
-       START_EXCEPTION(0x0700, ProgramCheck)
-       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(0x700, program_check_exception)
-
-       EXCEPTION(0x0800, Trap_08, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x0900, Trap_09, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x0A00, Trap_0A, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x0B00, Trap_0B, unknown_exception, EXC_XFER_EE)
-
-/* 0x0C00 - System Call Exception */
-       START_EXCEPTION(0x0C00, SystemCall)
-       NORMAL_EXCEPTION_PROLOG
-       EXC_XFER_EE_LITE(0xc00, DoSyscall)
-
-       EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_EE)
-
-/* 0x1000 - Programmable Interval Timer (PIT) Exception */
-       START_EXCEPTION(0x1000, Decrementer)
-       NORMAL_EXCEPTION_PROLOG
-       lis     r0,TSR_PIS@h
-       mtspr   SPRN_TSR,r0             /* Clear the PIT exception */
-       addi    r3,r1,STACK_FRAME_OVERHEAD
-       EXC_XFER_LITE(0x1000, timer_interrupt)
-
-#if 0
-/* NOTE:
- * FIT and WDT handlers are not implemented yet.
- */
-
-/* 0x1010 - Fixed Interval Timer (FIT) Exception
-*/
-       STND_EXCEPTION(0x1010,  FITException,           unknown_exception)
-
-/* 0x1020 - Watchdog Timer (WDT) Exception
-*/
-#ifdef CONFIG_BOOKE_WDT
-       CRITICAL_EXCEPTION(0x1020, WDTException, WatchdogException)
-#else
-       CRITICAL_EXCEPTION(0x1020, WDTException, unknown_exception)
-#endif
-#endif
-
-/* 0x1100 - Data TLB Miss Exception
- * As the name implies, translation is not in the MMU, so search the
- * page tables and fix it.  The only purpose of this function is to
- * load TLB entries from the page table if they exist.
- */
-       START_EXCEPTION(0x1100, DTLBMiss)
-       mtspr   SPRN_SPRG0, r10         /* Save some working registers */
-       mtspr   SPRN_SPRG1, r11
-#ifdef CONFIG_403GCX
-       stw     r12, 0(r0)
-       stw     r9, 4(r0)
-       mfcr    r11
-       mfspr   r12, SPRN_PID
-       stw     r11, 8(r0)
-       stw     r12, 12(r0)
-#else
-       mtspr   SPRN_SPRG4, r12
-       mtspr   SPRN_SPRG5, r9
-       mfcr    r11
-       mfspr   r12, SPRN_PID
-       mtspr   SPRN_SPRG7, r11
-       mtspr   SPRN_SPRG6, r12
-#endif
-       mfspr   r10, SPRN_DEAR          /* Get faulting address */
-
-       /* If we are faulting a kernel address, we have to use the
-        * kernel page tables.
-        */
-       lis     r11, TASK_SIZE@h
-       cmplw   r10, r11
-       blt+    3f
-       lis     r11, swapper_pg_dir@h
-       ori     r11, r11, swapper_pg_dir@l
-       li      r9, 0
-       mtspr   SPRN_PID, r9            /* TLB will have 0 TID */
-       b       4f
-
-       /* Get the PGD for the current thread.
-        */
-3:
-       mfspr   r11,SPRN_SPRG3
-       lwz     r11,PGDIR(r11)
-4:
-       tophys(r11, r11)
-       rlwimi  r11, r10, 12, 20, 29    /* Create L1 (pgdir/pmd) address */
-       lwz     r12, 0(r11)             /* Get L1 entry */
-       andi.   r9, r12, _PMD_PRESENT   /* Check if it points to a PTE page */
-       beq     2f                      /* Bail if no table */
-
-       rlwimi  r12, r10, 22, 20, 29    /* Compute PTE address */
-       lwz     r11, 0(r12)             /* Get Linux PTE */
-       andi.   r9, r11, _PAGE_PRESENT
-       beq     5f
-
-       ori     r11, r11, _PAGE_ACCESSED
-       stw     r11, 0(r12)
-
-       /* Create TLB tag.  This is the faulting address plus a static
-        * set of bits.  These are size, valid, E, U0.
-       */
-       li      r12, 0x00c0
-       rlwimi  r10, r12, 0, 20, 31
-
-       b       finish_tlb_load
-
-2:     /* Check for possible large-page pmd entry */
-       rlwinm. r9, r12, 2, 22, 24
-       beq     5f
-
-       /* Create TLB tag.  This is the faulting address, plus a static
-        * set of bits (valid, E, U0) plus the size from the PMD.
-        */
-       ori     r9, r9, 0x40
-       rlwimi  r10, r9, 0, 20, 31
-       mr      r11, r12
-
-       b       finish_tlb_load
-
-5:
-       /* The bailout.  Restore registers to pre-exception conditions
-        * and call the heavyweights to help us out.
-        */
-#ifdef CONFIG_403GCX
-       lwz     r12, 12(r0)
-       lwz     r11, 8(r0)
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       lwz     r9, 4(r0)
-       lwz     r12, 0(r0)
-#else
-       mfspr   r12, SPRN_SPRG6
-       mfspr   r11, SPRN_SPRG7
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       mfspr   r9, SPRN_SPRG5
-       mfspr   r12, SPRN_SPRG4
-#endif
-       mfspr   r11, SPRN_SPRG1
-       mfspr   r10, SPRN_SPRG0
-       b       DataAccess
-
-/* 0x1200 - Instruction TLB Miss Exception
- * Nearly the same as above, except we get our information from different
- * registers and bailout to a different point.
- */
-       START_EXCEPTION(0x1200, ITLBMiss)
-       mtspr   SPRN_SPRG0, r10         /* Save some working registers */
-       mtspr   SPRN_SPRG1, r11
-#ifdef CONFIG_403GCX
-       stw     r12, 0(r0)
-       stw     r9, 4(r0)
-       mfcr    r11
-       mfspr   r12, SPRN_PID
-       stw     r11, 8(r0)
-       stw     r12, 12(r0)
-#else
-       mtspr   SPRN_SPRG4, r12
-       mtspr   SPRN_SPRG5, r9
-       mfcr    r11
-       mfspr   r12, SPRN_PID
-       mtspr   SPRN_SPRG7, r11
-       mtspr   SPRN_SPRG6, r12
-#endif
-       mfspr   r10, SPRN_SRR0          /* Get faulting address */
-
-       /* If we are faulting a kernel address, we have to use the
-        * kernel page tables.
-        */
-       lis     r11, TASK_SIZE@h
-       cmplw   r10, r11
-       blt+    3f
-       lis     r11, swapper_pg_dir@h
-       ori     r11, r11, swapper_pg_dir@l
-       li      r9, 0
-       mtspr   SPRN_PID, r9            /* TLB will have 0 TID */
-       b       4f
-
-       /* Get the PGD for the current thread.
-        */
-3:
-       mfspr   r11,SPRN_SPRG3
-       lwz     r11,PGDIR(r11)
-4:
-       tophys(r11, r11)
-       rlwimi  r11, r10, 12, 20, 29    /* Create L1 (pgdir/pmd) address */
-       lwz     r12, 0(r11)             /* Get L1 entry */
-       andi.   r9, r12, _PMD_PRESENT   /* Check if it points to a PTE page */
-       beq     2f                      /* Bail if no table */
-
-       rlwimi  r12, r10, 22, 20, 29    /* Compute PTE address */
-       lwz     r11, 0(r12)             /* Get Linux PTE */
-       andi.   r9, r11, _PAGE_PRESENT
-       beq     5f
-
-       ori     r11, r11, _PAGE_ACCESSED
-       stw     r11, 0(r12)
-
-       /* Create TLB tag.  This is the faulting address plus a static
-        * set of bits.  These are size, valid, E, U0.
-       */
-       li      r12, 0x00c0
-       rlwimi  r10, r12, 0, 20, 31
-
-       b       finish_tlb_load
-
-2:     /* Check for possible large-page pmd entry */
-       rlwinm. r9, r12, 2, 22, 24
-       beq     5f
-
-       /* Create TLB tag.  This is the faulting address, plus a static
-        * set of bits (valid, E, U0) plus the size from the PMD.
-        */
-       ori     r9, r9, 0x40
-       rlwimi  r10, r9, 0, 20, 31
-       mr      r11, r12
-
-       b       finish_tlb_load
-
-5:
-       /* The bailout.  Restore registers to pre-exception conditions
-        * and call the heavyweights to help us out.
-        */
-#ifdef CONFIG_403GCX
-       lwz     r12, 12(r0)
-       lwz     r11, 8(r0)
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       lwz     r9, 4(r0)
-       lwz     r12, 0(r0)
-#else
-       mfspr   r12, SPRN_SPRG6
-       mfspr   r11, SPRN_SPRG7
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       mfspr   r9, SPRN_SPRG5
-       mfspr   r12, SPRN_SPRG4
-#endif
-       mfspr   r11, SPRN_SPRG1
-       mfspr   r10, SPRN_SPRG0
-       b       InstructionAccess
-
-       EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1400, Trap_14, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
-#ifdef CONFIG_IBM405_ERR51
-       /* 405GP errata 51 */
-       START_EXCEPTION(0x1700, Trap_17)
-       b DTLBMiss
-#else
-       EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_EE)
-#endif
-       EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1A00, Trap_1A, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1B00, Trap_1B, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1C00, Trap_1C, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1D00, Trap_1D, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1E00, Trap_1E, unknown_exception, EXC_XFER_EE)
-       EXCEPTION(0x1F00, Trap_1F, unknown_exception, EXC_XFER_EE)
-
-/* 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_SRR1, which will still have
- * the MSR_DE bit set.
- */
-       /* 0x2000 - Debug Exception */
-       START_EXCEPTION(0x2000, DebugTrap)
-       CRITICAL_EXCEPTION_PROLOG
-
-       /*
-        * If this 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 SRR3 value and clearing the debug status.
-        */
-       mfspr   r10,SPRN_DBSR           /* check single-step/branch taken */
-       andis.  r10,r10,DBSR_IC@h
-       beq+    2f
-
-       andi.   r10,r9,MSR_IR|MSR_PR    /* check supervisor + MMU off */
-       beq     1f                      /* branch and fix it up */
-
-       mfspr   r10,SPRN_SRR2           /* Faulting instruction address */
-       cmplwi  r10,0x2100
-       bgt+    2f                      /* address above exception vectors */
-
-       /* here it looks like we got an inappropriate debug exception. */
-1:     rlwinm  r9,r9,0,~MSR_DE         /* clear DE in the SRR3 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_SRR2,r12
-       mtspr   SPRN_SRR3,r9
-       lwz     r9,GPR9(r11)
-       lwz     r12,GPR12(r11)
-       lwz     r10,crit_r10@l(0)
-       lwz     r11,crit_r11@l(0)
-       PPC405_ERR77_SYNC
-       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)
-
-/*
- * The other Data TLB exceptions bail out to this point
- * if they can't resolve the lightweight TLB fault.
- */
-DataAccess:
-       NORMAL_EXCEPTION_PROLOG
-       mfspr   r5,SPRN_ESR             /* Grab the ESR, save it, pass arg3 */
-       stw     r5,_ESR(r11)
-       mfspr   r4,SPRN_DEAR            /* Grab the DEAR, save it, pass arg2 */
-       EXC_XFER_EE_LITE(0x300, handle_page_fault)
-
-/* Other PowerPC processors, namely those derived from the 6xx-series
- * have vectors from 0x2100 through 0x2F00 defined, but marked as reserved.
- * However, for the 4xx-series processors these are neither defined nor
- * reserved.
- */
-
-       /* Damn, I came up one instruction too many to fit into the
-        * exception space :-).  Both the instruction and data TLB
-        * miss get to this point to load the TLB.
-        *      r10 - TLB_TAG value
-        *      r11 - Linux PTE
-        *      r12, r9 - avilable to use
-        *      PID - loaded with proper value when we get here
-        *      Upon exit, we reload everything and RFI.
-        * Actually, it will fit now, but oh well.....a common place
-        * to load the TLB.
-        */
-tlb_4xx_index:
-       .long   0
-finish_tlb_load:
-       /* load the next available TLB index.
-       */
-       lwz     r9, tlb_4xx_index@l(0)
-       addi    r9, r9, 1
-       andi.   r9, r9, (PPC4XX_TLB_SIZE-1)
-       stw     r9, tlb_4xx_index@l(0)
-
-6:
-       /*
-        * Clear out the software-only bits in the PTE to generate the
-        * TLB_DATA value.  These are the bottom 2 bits of the RPM, the
-        * top 3 bits of the zone field, and M.
-        */
-       li      r12, 0x0ce2
-       andc    r11, r11, r12
-
-       tlbwe   r11, r9, TLB_DATA               /* Load TLB LO */
-       tlbwe   r10, r9, TLB_TAG                /* Load TLB HI */
-
-       /* Done...restore registers and get out of here.
-       */
-#ifdef CONFIG_403GCX
-       lwz     r12, 12(r0)
-       lwz     r11, 8(r0)
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       lwz     r9, 4(r0)
-       lwz     r12, 0(r0)
-#else
-       mfspr   r12, SPRN_SPRG6
-       mfspr   r11, SPRN_SPRG7
-       mtspr   SPRN_PID, r12
-       mtcr    r11
-       mfspr   r9, SPRN_SPRG5
-       mfspr   r12, SPRN_SPRG4
-#endif
-       mfspr   r11, SPRN_SPRG1
-       mfspr   r10, SPRN_SPRG0
-       PPC405_ERR77_SYNC
-       rfi                     /* Should sync shadow TLBs */
-       b       .               /* prevent prefetch past rfi */
-
-/* extern void giveup_fpu(struct task_struct *prev)
- *
- * The PowerPC 4xx family of processors do not have an FPU, so this just
- * returns.
- */
-_GLOBAL(giveup_fpu)
-       blr
-
-/* This is where the main kernel code starts.
- */
-start_here:
-
-       /* ptr to current */
-       lis     r2,init_task@h
-       ori     r2,r2,init_task@l
-
-       /* ptr to phys current thread */
-       tophys(r4,r2)
-       addi    r4,r4,THREAD    /* init task's THREAD */
-       mtspr   SPRN_SPRG3,r4
-
-       /* stack */
-       lis     r1,init_thread_union@ha
-       addi    r1,r1,init_thread_union@l
-       li      r0,0
-       stwu    r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
-
-       bl      early_init      /* We have to do this with MMU on */
-
-/*
- * Decide what sort of machine this is and initialize the MMU.
- */
-       mr      r3,r31
-       mr      r4,r30
-       mr      r5,r29
-       mr      r6,r28
-       mr      r7,r27
-       bl      machine_init
-       bl      MMU_init
-
-/* Go back to running unmapped so we can load up new values
- * and change to using our exception vectors.
- * On the 4xx, all we have to do is invalidate the TLB to clear
- * the old 16M byte TLB mappings.
- */
-       lis     r4,2f@h
-       ori     r4,r4,2f@l
-       tophys(r4,r4)
-       lis     r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@h
-       ori     r3,r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@l
-       mtspr   SPRN_SRR0,r4
-       mtspr   SPRN_SRR1,r3
-       rfi
-       b       .               /* prevent prefetch past rfi */
-
-/* Load up the kernel context */
-2:
-       sync                    /* Flush to memory before changing TLB */
-       tlbia
-       isync                   /* Flush shadow TLBs */
-
-       /* set up the PTE pointers for the Abatron bdiGDB.
-       */
-       lis     r6, swapper_pg_dir@h
-       ori     r6, r6, swapper_pg_dir@l
-       lis     r5, abatron_pteptrs@h
-       ori     r5, r5, abatron_pteptrs@l
-       stw     r5, 0xf0(r0)    /* Must match your Abatron config file */
-       tophys(r5,r5)
-       stw     r6, 0(r5)
-
-/* Now turn on the MMU for real! */
-       lis     r4,MSR_KERNEL@h
-       ori     r4,r4,MSR_KERNEL@l
-       lis     r3,start_kernel@h
-       ori     r3,r3,start_kernel@l
-       mtspr   SPRN_SRR0,r3
-       mtspr   SPRN_SRR1,r4
-       rfi                     /* enable MMU and jump to start_kernel */
-       b       .               /* prevent prefetch past rfi */
-
-/* Set up the initial MMU state so we can do the first level of
- * kernel initialization.  This maps the first 16 MBytes of memory 1:1
- * virtual to physical and more importantly sets the cache mode.
- */
-initial_mmu:
-       tlbia                   /* Invalidate all TLB entries */
-       isync
-
-       /* We should still be executing code at physical address 0x0000xxxx
-        * at this point. However, start_here is at virtual address
-        * 0xC000xxxx. So, set up a TLB mapping to cover this once
-        * translation is enabled.
-        */
-
-       lis     r3,KERNELBASE@h         /* Load the kernel virtual address */
-       ori     r3,r3,KERNELBASE@l
-       tophys(r4,r3)                   /* Load the kernel physical address */
-
-       iccci   r0,r3                   /* Invalidate the i-cache before use */
-
-       /* Load the kernel PID.
-       */
-       li      r0,0
-       mtspr   SPRN_PID,r0
-       sync
-
-       /* Configure and load two entries into TLB slots 62 and 63.
-        * In case we are pinning TLBs, these are reserved in by the
-        * other TLB functions.  If not reserving, then it doesn't
-        * matter where they are loaded.
-        */
-       clrrwi  r4,r4,10                /* Mask off the real page number */
-       ori     r4,r4,(TLB_WR | TLB_EX) /* Set the write and execute bits */
-
-       clrrwi  r3,r3,10                /* Mask off the effective page number */
-       ori     r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_16M))
-
-        li      r0,63                    /* TLB slot 63 */
-
-       tlbwe   r4,r0,TLB_DATA          /* Load the data portion of the entry */
-       tlbwe   r3,r0,TLB_TAG           /* Load the tag portion of the entry */
-
-#if defined(CONFIG_SERIAL_TEXT_DEBUG) && defined(SERIAL_DEBUG_IO_BASE)
-
-       /* Load a TLB entry for the UART, so that ppc4xx_progress() can use
-        * the UARTs nice and early.  We use a 4k real==virtual mapping. */
-
-       lis     r3,SERIAL_DEBUG_IO_BASE@h
-       ori     r3,r3,SERIAL_DEBUG_IO_BASE@l
-       mr      r4,r3
-       clrrwi  r4,r4,12
-       ori     r4,r4,(TLB_WR|TLB_I|TLB_M|TLB_G)
-
-       clrrwi  r3,r3,12
-       ori     r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_4K))
-
-       li      r0,0                    /* TLB slot 0 */
-       tlbwe   r4,r0,TLB_DATA
-       tlbwe   r3,r0,TLB_TAG
-#endif /* CONFIG_SERIAL_DEBUG_TEXT && SERIAL_DEBUG_IO_BASE */
-
-       isync
-
-       /* Establish the exception vector base
-       */
-       lis     r4,KERNELBASE@h         /* EVPR only uses the high 16-bits */
-       tophys(r0,r4)                   /* Use the physical address */
-       mtspr   SPRN_EVPR,r0
-
-       blr
-
-_GLOBAL(abort)
-        mfspr   r13,SPRN_DBCR0
-        oris    r13,r13,DBCR0_RST_SYSTEM@h
-        mtspr   SPRN_DBCR0,r13
-
-_GLOBAL(set_context)
-
-#ifdef CONFIG_BDI_SWITCH
-       /* Context switch the PTE pointer for the Abatron BDI2000.
-        * The PGDIR is the second parameter.
-        */
-       lis     r5, KERNELBASE@h
-       lwz     r5, 0xf0(r5)
-       stw     r4, 0x4(r5)
-#endif
-       sync
-       mtspr   SPRN_PID,r3
-       isync                           /* Need an isync to flush shadow */
-                                       /* TLBs after changing PID */
-       blr
-
-/* We put a few things here that have to be page-aligned. This stuff
- * goes at the beginning of the data segment, which is page-aligned.
- */
-       .data
-       .align  12
-       .globl  sdata
-sdata:
-       .globl  empty_zero_page
-empty_zero_page:
-       .space  4096
-       .globl  swapper_pg_dir
-swapper_pg_dir:
-       .space  4096
-
-
-/* Stack for handling critical exceptions from kernel mode */
-       .section .bss
-        .align 12
-exception_stack_bottom:
-       .space  4096
-critical_stack_top:
-       .globl  exception_stack_top
-exception_stack_top:
-
-/* This space gets a copy of optional info passed to us by the bootstrap
- * which is used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  512
-
-/* Room for two PTE pointers, usually the kernel and current user pointers
- * to their respective root page table.
- */
-abatron_pteptrs:
-       .space  8
index 171800002ede558df462e60a6c346c8442f74f9f..97c5857faf00d830d3022fdc4bd99caeefaed974 100644 (file)
@@ -34,6 +34,8 @@
 #include <asm/iseries/lpar_map.h>
 #include <asm/thread_info.h>
 #include <asm/firmware.h>
+#include <asm/page_64.h>
+#include <asm/exception.h>
 
 #define DO_SOFT_DISABLE
 
@@ -143,344 +145,9 @@ exception_marker:
        .tc     ID_72656773_68657265[TC],0x7265677368657265
        .text
 
-/*
- * The following macros define the code that appears as
- * the prologue to each of the exception handlers.  They
- * are split into two parts to allow a single kernel binary
- * to be used for pSeries and iSeries.
- * LOL.  One day... - paulus
- */
-
-/*
- * We make as much of the exception code common between native
- * exception handlers (including pSeries LPAR) and iSeries LPAR
- * implementations as possible.
- */
-
 /*
  * This is the start of the interrupt handlers for pSeries
  * This code runs with relocation off.
- */
-#define EX_R9          0
-#define EX_R10         8
-#define EX_R11         16
-#define EX_R12         24
-#define EX_R13         32
-#define EX_SRR0                40
-#define EX_DAR         48
-#define EX_DSISR       56
-#define EX_CCR         60
-#define EX_R3          64
-#define EX_LR          72
-
-/*
- * We're short on space and time in the exception prolog, so we can't
- * use the normal SET_REG_IMMEDIATE macro. Normally we just need the
- * low halfword of the address, but for Kdump we need the whole low
- * word.
- */
-#ifdef CONFIG_CRASH_DUMP
-#define LOAD_HANDLER(reg, label)                                       \
-       oris    reg,reg,(label)@h;      /* virt addr of handler ... */  \
-       ori     reg,reg,(label)@l;      /* .. and the rest */
-#else
-#define LOAD_HANDLER(reg, label)                                       \
-       ori     reg,reg,(label)@l;      /* virt addr of handler ... */
-#endif
-
-/*
- * Equal to EXCEPTION_PROLOG_PSERIES, except that it forces 64bit mode.
- * The firmware calls the registered system_reset_fwnmi and
- * machine_check_fwnmi handlers in 32bit mode if the cpu happens to run
- * a 32bit application at the time of the event.
- * This firmware bug is present on POWER4 and JS20.
- */
-#define EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(area, label)              \
-       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
-       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
-       std     r10,area+EX_R10(r13);                                   \
-       std     r11,area+EX_R11(r13);                                   \
-       std     r12,area+EX_R12(r13);                                   \
-       mfspr   r9,SPRN_SPRG1;                                          \
-       std     r9,area+EX_R13(r13);                                    \
-       mfcr    r9;                                                     \
-       clrrdi  r12,r13,32;             /* get high part of &label */   \
-       mfmsr   r10;                                                    \
-       /* force 64bit mode */                                          \
-       li      r11,5;                  /* MSR_SF_LG|MSR_ISF_LG */      \
-       rldimi  r10,r11,61,0;           /* insert into top 3 bits */    \
-       /* done 64bit mode */                                           \
-       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
-       LOAD_HANDLER(r12,label)                                         \
-       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
-       mtspr   SPRN_SRR0,r12;                                          \
-       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
-       mtspr   SPRN_SRR1,r10;                                          \
-       rfid;                                                           \
-       b       .       /* prevent speculative execution */
-
-#define EXCEPTION_PROLOG_PSERIES(area, label)                          \
-       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
-       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
-       std     r10,area+EX_R10(r13);                                   \
-       std     r11,area+EX_R11(r13);                                   \
-       std     r12,area+EX_R12(r13);                                   \
-       mfspr   r9,SPRN_SPRG1;                                          \
-       std     r9,area+EX_R13(r13);                                    \
-       mfcr    r9;                                                     \
-       clrrdi  r12,r13,32;             /* get high part of &label */   \
-       mfmsr   r10;                                                    \
-       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
-       LOAD_HANDLER(r12,label)                                         \
-       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
-       mtspr   SPRN_SRR0,r12;                                          \
-       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
-       mtspr   SPRN_SRR1,r10;                                          \
-       rfid;                                                           \
-       b       .       /* prevent speculative execution */
-
-/*
- * This is the start of the interrupt handlers for iSeries
- * This code runs with relocation on.
- */
-#define EXCEPTION_PROLOG_ISERIES_1(area)                               \
-       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
-       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
-       std     r10,area+EX_R10(r13);                                   \
-       std     r11,area+EX_R11(r13);                                   \
-       std     r12,area+EX_R12(r13);                                   \
-       mfspr   r9,SPRN_SPRG1;                                          \
-       std     r9,area+EX_R13(r13);                                    \
-       mfcr    r9
-
-#define EXCEPTION_PROLOG_ISERIES_2                                     \
-       mfmsr   r10;                                                    \
-       ld      r12,PACALPPACAPTR(r13);                                 \
-       ld      r11,LPPACASRR0(r12);                                    \
-       ld      r12,LPPACASRR1(r12);                                    \
-       ori     r10,r10,MSR_RI;                                         \
-       mtmsrd  r10,1
-
-/*
- * The common exception prolog is used for all except a few exceptions
- * such as a segment miss on a kernel address.  We have to be prepared
- * to take another exception from the point where we first touch the
- * kernel stack onwards.
- *
- * On entry r13 points to the paca, r9-r13 are saved in the paca,
- * r9 contains the saved CR, r11 and r12 contain the saved SRR0 and
- * SRR1, and relocation is on.
- */
-#define EXCEPTION_PROLOG_COMMON(n, area)                                  \
-       andi.   r10,r12,MSR_PR;         /* See if coming from user      */ \
-       mr      r10,r1;                 /* Save r1                      */ \
-       subi    r1,r1,INT_FRAME_SIZE;   /* alloc frame on kernel stack  */ \
-       beq-    1f;                                                        \
-       ld      r1,PACAKSAVE(r13);      /* kernel stack to use          */ \
-1:     cmpdi   cr1,r1,0;               /* check if r1 is in userspace  */ \
-       bge-    cr1,2f;                 /* abort if it is               */ \
-       b       3f;                                                        \
-2:     li      r1,(n);                 /* will be reloaded later       */ \
-       sth     r1,PACA_TRAP_SAVE(r13);                                    \
-       b       bad_stack;                                                 \
-3:     std     r9,_CCR(r1);            /* save CR in stackframe        */ \
-       std     r11,_NIP(r1);           /* save SRR0 in stackframe      */ \
-       std     r12,_MSR(r1);           /* save SRR1 in stackframe      */ \
-       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    */ \
-       ld      r9,area+EX_R9(r13);     /* move r9, r10 to stackframe   */ \
-       ld      r10,area+EX_R10(r13);                                      \
-       std     r9,GPR9(r1);                                               \
-       std     r10,GPR10(r1);                                             \
-       ld      r9,area+EX_R11(r13);    /* move r11 - r13 to stackframe */ \
-       ld      r10,area+EX_R12(r13);                                      \
-       ld      r11,area+EX_R13(r13);                                      \
-       std     r9,GPR11(r1);                                              \
-       std     r10,GPR12(r1);                                             \
-       std     r11,GPR13(r1);                                             \
-       ld      r2,PACATOC(r13);        /* get kernel TOC into r2       */ \
-       mflr    r9;                     /* save LR in stackframe        */ \
-       std     r9,_LINK(r1);                                              \
-       mfctr   r10;                    /* save CTR in stackframe       */ \
-       std     r10,_CTR(r1);                                              \
-       lbz     r10,PACASOFTIRQEN(r13);                            \
-       mfspr   r11,SPRN_XER;           /* save XER in stackframe       */ \
-       std     r10,SOFTE(r1);                                             \
-       std     r11,_XER(r1);                                              \
-       li      r9,(n)+1;                                                  \
-       std     r9,_TRAP(r1);           /* set trap number              */ \
-       li      r10,0;                                                     \
-       ld      r11,exception_marker@toc(r2);                              \
-       std     r10,RESULT(r1);         /* clear regs->result           */ \
-       std     r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame      */
-
-/*
- * Exception vectors.
- */
-#define STD_EXCEPTION_PSERIES(n, label)                        \
-       . = n;                                          \
-       .globl label##_pSeries;                         \
-label##_pSeries:                                       \
-       HMT_MEDIUM;                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
-       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
-
-#define HSTD_EXCEPTION_PSERIES(n, label)               \
-       . = n;                                          \
-       .globl label##_pSeries;                         \
-label##_pSeries:                                       \
-       HMT_MEDIUM;                                     \
-       mtspr   SPRN_SPRG1,r20;         /* save r20 */  \
-       mfspr   r20,SPRN_HSRR0;         /* copy HSRR0 to SRR0 */ \
-       mtspr   SPRN_SRR0,r20;                          \
-       mfspr   r20,SPRN_HSRR1;         /* copy HSRR0 to SRR0 */ \
-       mtspr   SPRN_SRR1,r20;                          \
-       mfspr   r20,SPRN_SPRG1;         /* restore r20 */ \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
-       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
-
-
-#define MASKABLE_EXCEPTION_PSERIES(n, label)                           \
-       . = n;                                                          \
-       .globl label##_pSeries;                                         \
-label##_pSeries:                                                       \
-       HMT_MEDIUM;                                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */                  \
-       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
-       std     r9,PACA_EXGEN+EX_R9(r13);       /* save r9, r10 */      \
-       std     r10,PACA_EXGEN+EX_R10(r13);                             \
-       lbz     r10,PACASOFTIRQEN(r13);                                 \
-       mfcr    r9;                                                     \
-       cmpwi   r10,0;                                                  \
-       beq     masked_interrupt;                                       \
-       mfspr   r10,SPRN_SPRG1;                                         \
-       std     r10,PACA_EXGEN+EX_R13(r13);                             \
-       std     r11,PACA_EXGEN+EX_R11(r13);                             \
-       std     r12,PACA_EXGEN+EX_R12(r13);                             \
-       clrrdi  r12,r13,32;             /* get high part of &label */   \
-       mfmsr   r10;                                                    \
-       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
-       LOAD_HANDLER(r12,label##_common)                                \
-       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
-       mtspr   SPRN_SRR0,r12;                                          \
-       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
-       mtspr   SPRN_SRR1,r10;                                          \
-       rfid;                                                           \
-       b       .       /* prevent speculative execution */
-
-#define STD_EXCEPTION_ISERIES(n, label, area)          \
-       .globl label##_iSeries;                         \
-label##_iSeries:                                       \
-       HMT_MEDIUM;                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
-       EXCEPTION_PROLOG_ISERIES_1(area);               \
-       EXCEPTION_PROLOG_ISERIES_2;                     \
-       b       label##_common
-
-#define MASKABLE_EXCEPTION_ISERIES(n, label)                           \
-       .globl label##_iSeries;                                         \
-label##_iSeries:                                                       \
-       HMT_MEDIUM;                                                     \
-       mtspr   SPRN_SPRG1,r13;         /* save r13 */                  \
-       EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN);                         \
-       lbz     r10,PACASOFTIRQEN(r13);                                 \
-       cmpwi   0,r10,0;                                                \
-       beq-    label##_iSeries_masked;                                 \
-       EXCEPTION_PROLOG_ISERIES_2;                                     \
-       b       label##_common;                                         \
-
-#ifdef CONFIG_PPC_ISERIES
-#define DISABLE_INTS                           \
-       li      r11,0;                          \
-       stb     r11,PACASOFTIRQEN(r13);         \
-BEGIN_FW_FTR_SECTION;                          \
-       stb     r11,PACAHARDIRQEN(r13);         \
-END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES);  \
-BEGIN_FW_FTR_SECTION;                          \
-       mfmsr   r10;                            \
-       ori     r10,r10,MSR_EE;                 \
-       mtmsrd  r10,1;                          \
-END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
-
-#else
-#define DISABLE_INTS                           \
-       li      r11,0;                          \
-       stb     r11,PACASOFTIRQEN(r13);         \
-       stb     r11,PACAHARDIRQEN(r13)
-
-#endif /* CONFIG_PPC_ISERIES */
-
-#define ENABLE_INTS                            \
-       ld      r12,_MSR(r1);                   \
-       mfmsr   r11;                            \
-       rlwimi  r11,r12,0,MSR_EE;               \
-       mtmsrd  r11,1
-
-#define STD_EXCEPTION_COMMON(trap, label, hdlr)                \
-       .align  7;                                      \
-       .globl label##_common;                          \
-label##_common:                                                \
-       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
-       DISABLE_INTS;                                   \
-       bl      .save_nvgprs;                           \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
-       bl      hdlr;                                   \
-       b       .ret_from_except
-
-/*
- * Like STD_EXCEPTION_COMMON, but for exceptions that can occur
- * in the idle task and therefore need the special idle handling.
- */
-#define STD_EXCEPTION_COMMON_IDLE(trap, label, hdlr)   \
-       .align  7;                                      \
-       .globl label##_common;                          \
-label##_common:                                                \
-       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
-       FINISH_NAP;                                     \
-       DISABLE_INTS;                                   \
-       bl      .save_nvgprs;                           \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
-       bl      hdlr;                                   \
-       b       .ret_from_except
-
-#define STD_EXCEPTION_COMMON_LITE(trap, label, hdlr)   \
-       .align  7;                                      \
-       .globl label##_common;                          \
-label##_common:                                                \
-       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
-       FINISH_NAP;                                     \
-       DISABLE_INTS;                                   \
-       bl      .ppc64_runlatch_on;                     \
-       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
-       bl      hdlr;                                   \
-       b       .ret_from_except_lite
-
-/*
- * When the idle code in power4_idle puts the CPU into NAP mode,
- * it has to do so in a loop, and relies on the external interrupt
- * and decrementer interrupt entry code to get it out of the loop.
- * It sets the _TLF_NAPPING bit in current_thread_info()->local_flags
- * to signal that it is in the loop and needs help to get out.
- */
-#ifdef CONFIG_PPC_970_NAP
-#define FINISH_NAP                             \
-BEGIN_FTR_SECTION                              \
-       clrrdi  r11,r1,THREAD_SHIFT;            \
-       ld      r9,TI_LOCAL_FLAGS(r11);         \
-       andi.   r10,r9,_TLF_NAPPING;            \
-       bnel    power4_fixup_nap;               \
-END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
-#else
-#define FINISH_NAP
-#endif
-
-/*
- * Start of pSeries system interrupt routines
  */
        . = 0x100
        .globl __start_interrupts
@@ -674,6 +341,7 @@ slb_miss_user_pseries:
        b       .                               /* prevent spec. execution */
 #endif /* __DISABLED__ */
 
+#ifdef CONFIG_PPC_PSERIES
 /*
  * Vectors for the FWNMI option.  Share common code.
  */
@@ -691,191 +359,7 @@ machine_check_fwnmi:
        mtspr   SPRN_SPRG1,r13          /* save r13 */
        EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(PACA_EXMC, machine_check_common)
 
-#ifdef CONFIG_PPC_ISERIES
-/***  ISeries-LPAR interrupt handlers ***/
-
-       STD_EXCEPTION_ISERIES(0x200, machine_check, PACA_EXMC)
-
-       .globl data_access_iSeries
-data_access_iSeries:
-       mtspr   SPRN_SPRG1,r13
-BEGIN_FTR_SECTION
-       mtspr   SPRN_SPRG2,r12
-       mfspr   r13,SPRN_DAR
-       mfspr   r12,SPRN_DSISR
-       srdi    r13,r13,60
-       rlwimi  r13,r12,16,0x20
-       mfcr    r12
-       cmpwi   r13,0x2c
-       beq     .do_stab_bolted_iSeries
-       mtcrf   0x80,r12
-       mfspr   r12,SPRN_SPRG2
-END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
-       EXCEPTION_PROLOG_ISERIES_1(PACA_EXGEN)
-       EXCEPTION_PROLOG_ISERIES_2
-       b       data_access_common
-
-.do_stab_bolted_iSeries:
-       mtcrf   0x80,r12
-       mfspr   r12,SPRN_SPRG2
-       EXCEPTION_PROLOG_ISERIES_1(PACA_EXSLB)
-       EXCEPTION_PROLOG_ISERIES_2
-       b       .do_stab_bolted
-
-       .globl  data_access_slb_iSeries
-data_access_slb_iSeries:
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
-       std     r3,PACA_EXSLB+EX_R3(r13)
-       mfspr   r3,SPRN_DAR
-       std     r9,PACA_EXSLB+EX_R9(r13)
-       mfcr    r9
-#ifdef __DISABLED__
-       cmpdi   r3,0
-       bge     slb_miss_user_iseries
-#endif
-       std     r10,PACA_EXSLB+EX_R10(r13)
-       std     r11,PACA_EXSLB+EX_R11(r13)
-       std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG1
-       std     r10,PACA_EXSLB+EX_R13(r13)
-       ld      r12,PACALPPACAPTR(r13)
-       ld      r12,LPPACASRR1(r12)
-       b       .slb_miss_realmode
-
-       STD_EXCEPTION_ISERIES(0x400, instruction_access, PACA_EXGEN)
-
-       .globl  instruction_access_slb_iSeries
-instruction_access_slb_iSeries:
-       mtspr   SPRN_SPRG1,r13          /* save r13 */
-       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
-       std     r3,PACA_EXSLB+EX_R3(r13)
-       ld      r3,PACALPPACAPTR(r13)
-       ld      r3,LPPACASRR0(r3)       /* get SRR0 value */
-       std     r9,PACA_EXSLB+EX_R9(r13)
-       mfcr    r9
-#ifdef __DISABLED__
-       cmpdi   r3,0
-       bge     .slb_miss_user_iseries
-#endif
-       std     r10,PACA_EXSLB+EX_R10(r13)
-       std     r11,PACA_EXSLB+EX_R11(r13)
-       std     r12,PACA_EXSLB+EX_R12(r13)
-       mfspr   r10,SPRN_SPRG1
-       std     r10,PACA_EXSLB+EX_R13(r13)
-       ld      r12,PACALPPACAPTR(r13)
-       ld      r12,LPPACASRR1(r12)
-       b       .slb_miss_realmode
-
-#ifdef __DISABLED__
-slb_miss_user_iseries:
-       std     r10,PACA_EXGEN+EX_R10(r13)
-       std     r11,PACA_EXGEN+EX_R11(r13)
-       std     r12,PACA_EXGEN+EX_R12(r13)
-       mfspr   r10,SPRG1
-       ld      r11,PACA_EXSLB+EX_R9(r13)
-       ld      r12,PACA_EXSLB+EX_R3(r13)
-       std     r10,PACA_EXGEN+EX_R13(r13)
-       std     r11,PACA_EXGEN+EX_R9(r13)
-       std     r12,PACA_EXGEN+EX_R3(r13)
-       EXCEPTION_PROLOG_ISERIES_2
-       b       slb_miss_user_common
-#endif
-
-       MASKABLE_EXCEPTION_ISERIES(0x500, hardware_interrupt)
-       STD_EXCEPTION_ISERIES(0x600, alignment, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES(0x700, program_check, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES(0x800, fp_unavailable, PACA_EXGEN)
-       MASKABLE_EXCEPTION_ISERIES(0x900, decrementer)
-       STD_EXCEPTION_ISERIES(0xa00, trap_0a, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES(0xb00, trap_0b, PACA_EXGEN)
-
-       .globl  system_call_iSeries
-system_call_iSeries:
-       mr      r9,r13
-       mfspr   r13,SPRN_SPRG3
-       EXCEPTION_PROLOG_ISERIES_2
-       b       system_call_common
-
-       STD_EXCEPTION_ISERIES( 0xd00, single_step, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES( 0xe00, trap_0e, PACA_EXGEN)
-       STD_EXCEPTION_ISERIES( 0xf00, performance_monitor, PACA_EXGEN)
-
-       .globl system_reset_iSeries
-system_reset_iSeries:
-       mfspr   r13,SPRN_SPRG3          /* Get paca address */
-       mfmsr   r24
-       ori     r24,r24,MSR_RI
-       mtmsrd  r24                     /* RI on */
-       lhz     r24,PACAPACAINDEX(r13)  /* Get processor # */
-       cmpwi   0,r24,0                 /* Are we processor 0? */
-       bne     1f
-       b       .__start_initialization_iSeries /* Start up the first processor */
-1:     mfspr   r4,SPRN_CTRLF
-       li      r5,CTRL_RUNLATCH        /* Turn off the run light */
-       andc    r4,r4,r5
-       mtspr   SPRN_CTRLT,r4
-
-1:
-       HMT_LOW
-#ifdef CONFIG_SMP
-       lbz     r23,PACAPROCSTART(r13)  /* Test if this processor
-                                        * should start */
-       sync
-       LOAD_REG_IMMEDIATE(r3,current_set)
-       sldi    r28,r24,3               /* get current_set[cpu#] */
-       ldx     r3,r3,r28
-       addi    r1,r3,THREAD_SIZE
-       subi    r1,r1,STACK_FRAME_OVERHEAD
-
-       cmpwi   0,r23,0
-       beq     iSeries_secondary_smp_loop      /* Loop until told to go */
-       bne     __secondary_start               /* Loop until told to go */
-iSeries_secondary_smp_loop:
-       /* Let the Hypervisor know we are alive */
-       /* 8002 is a call to HvCallCfg::getLps, a harmless Hypervisor function */
-       lis     r3,0x8002
-       rldicr  r3,r3,32,15             /* r0 = (r3 << 32) & 0xffff000000000000 */
-#else /* CONFIG_SMP */
-       /* Yield the processor.  This is required for non-SMP kernels
-               which are running on multi-threaded machines. */
-       lis     r3,0x8000
-       rldicr  r3,r3,32,15             /* r3 = (r3 << 32) & 0xffff000000000000 */
-       addi    r3,r3,18                /* r3 = 0x8000000000000012 which is "yield" */
-       li      r4,0                    /* "yield timed" */
-       li      r5,-1                   /* "yield forever" */
-#endif /* CONFIG_SMP */
-       li      r0,-1                   /* r0=-1 indicates a Hypervisor call */
-       sc                              /* Invoke the hypervisor via a system call */
-       mfspr   r13,SPRN_SPRG3          /* Put r13 back ???? */
-       b       1b                      /* If SMP not configured, secondaries
-                                        * loop forever */
-
-decrementer_iSeries_masked:
-       /* We may not have a valid TOC pointer in here. */
-       li      r11,1
-       ld      r12,PACALPPACAPTR(r13)
-       stb     r11,LPPACADECRINT(r12)
-       LOAD_REG_IMMEDIATE(r12, tb_ticks_per_jiffy)
-       lwz     r12,0(r12)
-       mtspr   SPRN_DEC,r12
-       /* fall through */
-
-hardware_interrupt_iSeries_masked:
-       mtcrf   0x80,r9         /* Restore regs */
-       ld      r12,PACALPPACAPTR(r13)
-       ld      r11,LPPACASRR0(r12)
-       ld      r12,LPPACASRR1(r12)
-       mtspr   SPRN_SRR0,r11
-       mtspr   SPRN_SRR1,r12
-       ld      r9,PACA_EXGEN+EX_R9(r13)
-       ld      r10,PACA_EXGEN+EX_R10(r13)
-       ld      r11,PACA_EXGEN+EX_R11(r13)
-       ld      r12,PACA_EXGEN+EX_R12(r13)
-       ld      r13,PACA_EXGEN+EX_R13(r13)
-       rfid
-       b       .       /* prevent speculative execution */
-#endif /* CONFIG_PPC_ISERIES */
+#endif /* CONFIG_PPC_PSERIES */
 
 /*** Common interrupt handlers ***/
 
@@ -1175,7 +659,9 @@ hardware_interrupt_common:
        FINISH_NAP
 hardware_interrupt_entry:
        DISABLE_INTS
+BEGIN_FTR_SECTION
        bl      .ppc64_runlatch_on
+END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
        addi    r3,r1,STACK_FRAME_OVERHEAD
        bl      .do_IRQ
        b       .ret_from_except_lite
@@ -1449,7 +935,7 @@ _GLOBAL(do_stab_bolted)
 
        /* Calculate VSID */
        /* This is a kernel address, so protovsid = ESID */
-       ASM_VSID_SCRAMBLE(r11, r9)
+       ASM_VSID_SCRAMBLE(r11, r9, 256M)
        rldic   r9,r11,12,16    /* r9 = vsid << 12 */
 
        /* Search the primary group for a free entry */
@@ -1519,8 +1005,8 @@ _GLOBAL(do_stab_bolted)
  * Space for CPU0's segment table.
  *
  * On iSeries, the hypervisor must fill in at least one entry before
- * we get control (with relocate on).  The address is give to the hv
- * as a page number (see xLparMap in lpardata.c), so this must be at a
+ * we get control (with relocate on).  The address is given to the hv
+ * as a page number (see xLparMap below), so this must be at a
  * fixed address (the linker can't compute (u64)&initial_stab >>
  * PAGE_SHIFT).
  */
@@ -1529,6 +1015,7 @@ _GLOBAL(do_stab_bolted)
 initial_stab:
        .space  4096
 
+#ifdef CONFIG_PPC_PSERIES
 /*
  * Data area reserved for FWNMI option.
  * This address (0x7000) is fixed by the RPA.
@@ -1536,21 +1023,34 @@ initial_stab:
        .= 0x7000
        .globl fwnmi_data_area
 fwnmi_data_area:
+#endif /* CONFIG_PPC_PSERIES */
 
        /* iSeries does not use the FWNMI stuff, so it is safe to put
         * this here, even if we later allow kernels that will boot on
         * both pSeries and iSeries */
 #ifdef CONFIG_PPC_ISERIES
         . = LPARMAP_PHYS
-#include "lparmap.s"
-/*
- * This ".text" is here for old compilers that generate a trailing
- * .note section when compiling .c files to .s
- */
-       .text
+       .globl xLparMap
+xLparMap:
+       .quad   HvEsidsToMap            /* xNumberEsids */
+       .quad   HvRangesToMap           /* xNumberRanges */
+       .quad   STAB0_PAGE              /* xSegmentTableOffs */
+       .zero   40                      /* xRsvd */
+       /* xEsids (HvEsidsToMap entries of 2 quads) */
+       .quad   PAGE_OFFSET_ESID        /* xKernelEsid */
+       .quad   PAGE_OFFSET_VSID        /* xKernelVsid */
+       .quad   VMALLOC_START_ESID      /* xKernelEsid */
+       .quad   VMALLOC_START_VSID      /* xKernelVsid */
+       /* xRanges (HvRangesToMap entries of 3 quads) */
+       .quad   HvPagesToMap            /* xPages */
+       .quad   0                       /* xOffset */
+       .quad   PAGE_OFFSET_VSID << (SID_SHIFT - HW_PAGE_SHIFT) /* xVPN */
+
 #endif /* CONFIG_PPC_ISERIES */
 
+#ifdef CONFIG_PPC_PSERIES
         . = 0x8000
+#endif /* CONFIG_PPC_PSERIES */
 
 /*
  * On pSeries and most other platforms, secondary processors spin
@@ -1611,39 +1111,6 @@ _GLOBAL(generic_secondary_smp_init)
        b       __secondary_start
 #endif
 
-#ifdef CONFIG_PPC_ISERIES
-_INIT_STATIC(__start_initialization_iSeries)
-       /* Clear out the BSS */
-       LOAD_REG_IMMEDIATE(r11,__bss_stop)
-       LOAD_REG_IMMEDIATE(r8,__bss_start)
-       sub     r11,r11,r8              /* bss size                     */
-       addi    r11,r11,7               /* round up to an even double word */
-       rldicl. r11,r11,61,3            /* shift right by 3             */
-       beq     4f
-       addi    r8,r8,-8
-       li      r0,0
-       mtctr   r11                     /* zero this many doublewords   */
-3:     stdu    r0,8(r8)
-       bdnz    3b
-4:
-       LOAD_REG_IMMEDIATE(r1,init_thread_union)
-       addi    r1,r1,THREAD_SIZE
-       li      r0,0
-       stdu    r0,-STACK_FRAME_OVERHEAD(r1)
-
-       LOAD_REG_IMMEDIATE(r2,__toc_start)
-       addi    r2,r2,0x4000
-       addi    r2,r2,0x4000
-
-       bl      .iSeries_early_setup
-       bl      .early_setup
-
-       /* relocation is on at this point */
-
-       b       .start_here_common
-#endif /* CONFIG_PPC_ISERIES */
-
-
 _STATIC(__mmu_off)
        mfmsr   r3
        andi.   r0,r3,MSR_IR|MSR_DR
@@ -1891,6 +1358,7 @@ _GLOBAL(pmac_secondary_start)
  *   r13   = paca virtual address
  *   SPRG3 = paca virtual address
  */
+       .globl  __secondary_start
 __secondary_start:
        /* Set thread priority to MEDIUM */
        HMT_MEDIUM
@@ -2021,7 +1489,7 @@ _INIT_STATIC(start_here_multiplatform)
        b       .       /* prevent speculative execution */
        
        /* This is where all platforms converge execution */
-_INIT_STATIC(start_here_common)
+_INIT_GLOBAL(start_here_common)
        /* relocation is on at this point */
 
        /* The following code sets up the SP and TOC now that we are */
@@ -2078,12 +1546,4 @@ empty_zero_page:
 
        .globl  swapper_pg_dir
 swapper_pg_dir:
-       .space  PAGE_SIZE
-
-/*
- * This space gets a copy of optional info passed to us by the bootstrap
- * Used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  COMMAND_LINE_SIZE
+       .space  PGD_TABLE_SIZE
index 901be47a02a98c65350038049c3cf7ddeec4870f..f7458396cd7c022968abb231d1fdf62cb5ec2c67 100644 (file)
 #else
 #define DO_8xx_CPU6(val, reg)
 #endif
-       .text
-       .globl  _stext
-_stext:
-       .text
-       .globl  _start
-_start:
+       .section        .text.head, "ax"
+_ENTRY(_stext);
+_ENTRY(_start);
 
 /* MPC8xx
  * This port was done on an MBX board with an 860.  Right now I only
@@ -301,6 +298,12 @@ InstructionTLBMiss:
        stw     r10, 0(r0)
        stw     r11, 4(r0)
        mfspr   r10, SPRN_SRR0  /* Get effective address of fault */
+#ifdef CONFIG_8xx_CPU15
+       addi    r11, r10, 0x1000
+       tlbie   r11
+       addi    r11, r10, -0x1000
+       tlbie   r11
+#endif
        DO_8xx_CPU6(0x3780, r3)
        mtspr   SPRN_MD_EPN, r10        /* Have to use MD_EPN for walk, MI_EPN can't */
        mfspr   r10, SPRN_M_TWB /* Get level 1 table entry address */
@@ -730,13 +733,13 @@ initial_mmu:
        mtspr   SPRN_MD_TWC, r9
        li      r11, MI_BOOTINIT        /* Create RPN for address 0 */
        addis   r11, r11, 0x0080        /* Add 8M */
-       mtspr   SPRN_MD_RPN, r8
+       mtspr   SPRN_MD_RPN, r11
 
        addis   r8, r8, 0x0080          /* Add 8M */
        mtspr   SPRN_MD_EPN, r8
        mtspr   SPRN_MD_TWC, r9
        addis   r11, r11, 0x0080        /* Add 8M */
-       mtspr   SPRN_MD_RPN, r8
+       mtspr   SPRN_MD_RPN, r11
 #endif
 
        /* Since the cache is enabled according to the information we
@@ -835,14 +838,6 @@ empty_zero_page:
 swapper_pg_dir:
        .space  4096
 
-/*
- * This space gets a copy of optional info passed to us by the bootstrap
- * Used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  512
-
 /* Room for two PTE table poiners, usually the kernel and current user
  * pointer to their respective root page table (pgdir).
  */
index 1f155d399d576859ab502f0149bf2032285f3e49..4b9822728aeab30ff6c685f00c36c1e3423139f5 100644 (file)
@@ -2,27 +2,27 @@
  * Kernel execution entry point code.
  *
  *    Copyright (c) 1995-1996 Gary Thomas <gdt@linuxppc.org>
- *      Initial PowerPC version.
+ *     Initial PowerPC version.
  *    Copyright (c) 1996 Cort Dougan <cort@cs.nmt.edu>
- *      Rewritten for PReP
+ *     Rewritten for PReP
  *    Copyright (c) 1996 Paul Mackerras <paulus@cs.anu.edu.au>
- *      Low-level exception handers, MMU support, and rewrite.
+ *     Low-level exception handers, MMU support, and rewrite.
  *    Copyright (c) 1997 Dan Malek <dmalek@jlc.net>
- *      PowerPC 8xx modifications.
+ *     PowerPC 8xx modifications.
  *    Copyright (c) 1998-1999 TiVo, Inc.
- *      PowerPC 403GCX modifications.
+ *     PowerPC 403GCX modifications.
  *    Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
- *      PowerPC 403GCX/405GP modifications.
+ *     PowerPC 403GCX/405GP modifications.
  *    Copyright 2000 MontaVista Software Inc.
  *     PPC405 modifications
- *      PowerPC 403GCX/405GP modifications.
- *     Author: MontaVista Software, Inc.
- *             frank_rowand@mvista.com or source@mvista.com
- *             debbie_chu@mvista.com
+ *     PowerPC 403GCX/405GP modifications.
+ *     Author: MontaVista Software, Inc.
+ *             frank_rowand@mvista.com or source@mvista.com
+ *             debbie_chu@mvista.com
  *    Copyright 2002-2004 MontaVista Software, Inc.
- *      PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
+ *     PowerPC 44x support, Matt Porter <mporter@kernel.crashing.org>
  *    Copyright 2004 Freescale Semiconductor, Inc
- *      PowerPC e500 modifications, Kumar Gala <galak@kernel.crashing.org>
+ *     PowerPC e500 modifications, 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
@@ -52,9 +52,9 @@
  *   r7 - End of kernel command line string
  *
  */
-       .text
-_GLOBAL(_stext)
-_GLOBAL(_start)
+       .section        .text.head, "ax"
+_ENTRY(_stext);
+_ENTRY(_start);
        /*
         * Reserve a word at a fixed location to store the address
         * of abatron_pteptrs
@@ -146,13 +146,13 @@ skpinv:   addi    r6,r6,1                         /* Increment */
        bne     1b                              /* If not, repeat */
 
        /* Invalidate TLB0 */
-       li      r6,0x04
+       li      r6,0x04
        tlbivax 0,r6
 #ifdef CONFIG_SMP
        tlbsync
 #endif
        /* Invalidate TLB1 */
-       li      r6,0x0c
+       li      r6,0x0c
        tlbivax 0,r6
 #ifdef CONFIG_SMP
        tlbsync
@@ -211,7 +211,7 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        mtspr   SPRN_MAS1,r6
        tlbwe
        /* Invalidate TLB1 */
-       li      r9,0x0c
+       li      r9,0x0c
        tlbivax 0,r9
 #ifdef CONFIG_SMP
        tlbsync
@@ -254,7 +254,7 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        mtspr   SPRN_MAS1,r8
        tlbwe
        /* Invalidate TLB1 */
-       li      r9,0x0c
+       li      r9,0x0c
        tlbivax 0,r9
 #ifdef CONFIG_SMP
        tlbsync
@@ -294,7 +294,7 @@ skpinv:     addi    r6,r6,1                         /* Increment */
 #ifdef CONFIG_E200
        oris    r2,r2,MAS4_TLBSELD(1)@h
 #endif
-       mtspr   SPRN_MAS4, r2
+       mtspr   SPRN_MAS4, r2
 
 #if 0
        /* Enable DOZE */
@@ -305,7 +305,7 @@ skpinv:     addi    r6,r6,1                         /* Increment */
 #ifdef CONFIG_E200
        /* enable dedicated debug exception handling resources (Debug APU) */
        mfspr   r2,SPRN_HID0
-       ori     r2,r2,HID0_DAPUEN@l
+       ori     r2,r2,HID0_DAPUEN@l
        mtspr   SPRN_HID0,r2
 #endif
 
@@ -391,7 +391,7 @@ skpinv:     addi    r6,r6,1                         /* Increment */
 #ifdef CONFIG_PTE_64BIT
 #define PTE_FLAGS_OFFSET       4
 #define FIND_PTE       \
-       rlwinm  r12, r10, 13, 19, 29;   /* Compute pgdir/pmd offset */  \
+       rlwinm  r12, r10, 13, 19, 29;   /* Compute pgdir/pmd offset */  \
        lwzx    r11, r12, r11;          /* Get pgd/pmd entry */         \
        rlwinm. r12, r11, 0, 0, 20;     /* Extract pt base address */   \
        beq     2f;                     /* Bail if no table */          \
@@ -461,8 +461,7 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       lis     r11, TASK_SIZE@h
-       ori     r11, r11, TASK_SIZE@l
+       lis     r11, PAGE_OFFSET@h
        cmplw   0, r10, r11
        bge     2f
 
@@ -487,7 +486,7 @@ interrupt_base:
         */
        andi.   r11, r11, _PAGE_HWEXEC
        rlwimi  r11, r11, 31, 27, 27    /* SX <- _PAGE_HWEXEC */
-       ori     r11, r11, (MAS3_UW|MAS3_SW|MAS3_UR|MAS3_SR)@l /* set static perms */
+       ori     r11, r11, (MAS3_UW|MAS3_SW|MAS3_UR|MAS3_SR)@l /* set static perms */
 
        /* update search PID in MAS6, AS = 0 */
        mfspr   r12, SPRN_PID0
@@ -584,8 +583,7 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       lis     r11, TASK_SIZE@h
-       ori     r11, r11, TASK_SIZE@l
+       lis     r11, PAGE_OFFSET@h
        cmplw   5, r10, r11
        blt     5, 3f
        lis     r11, swapper_pg_dir@h
@@ -645,8 +643,7 @@ interrupt_base:
        /* If we are faulting a kernel address, we have to use the
         * kernel page tables.
         */
-       lis     r11, TASK_SIZE@h
-       ori     r11, r11, TASK_SIZE@l
+       lis     r11, PAGE_OFFSET@h
        cmplw   5, r10, r11
        blt     5, 3f
        lis     r11, swapper_pg_dir@h
@@ -694,7 +691,7 @@ interrupt_base:
        START_EXCEPTION(SPEUnavailable)
        NORMAL_EXCEPTION_PROLOG
        bne     load_up_spe
-       addi    r3,r1,STACK_FRAME_OVERHEAD
+       addi    r3,r1,STACK_FRAME_OVERHEAD
        EXC_XFER_EE_LITE(0x2010, KernelSPE)
 #else
        EXCEPTION(0x2020, SPEUnavailable, unknown_exception, EXC_XFER_EE)
@@ -741,10 +738,10 @@ data_access:
 
  * Both the instruction and data TLB miss get to this
  * point to load the TLB.
- *     r10 - EA of fault
- *     r11 - TLB (info from Linux PTE)
- *     r12, r13 - available to use
- *     CR5 - results of addr < TASK_SIZE
+ *     r10 - EA of fault
+ *     r11 - TLB (info from Linux PTE)
+ *     r12, r13 - available to use
+ *     CR5 - results of addr >= PAGE_OFFSET
  *     MAS0, MAS1 - loaded with proper value when we get here
  *     MAS2, MAS3 - will need additional info from Linux PTE
  *     Upon exit, we reload everything and RFI.
@@ -813,7 +810,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_BIG_PHYS)
        lwz     r13, tlbcam_index@l(r13)
        rlwimi  r12, r13, 0, 20, 31
 7:
-       mtspr   SPRN_MAS0,r12
+       mtspr   SPRN_MAS0,r12
 #endif /* CONFIG_E200 */
 
        tlbwe
@@ -855,17 +852,17 @@ load_up_spe:
        beq     1f
        addi    r4,r4,THREAD    /* want THREAD of last_task_used_spe */
        SAVE_32EVRS(0,r10,r4)
-       evxor   evr10, evr10, evr10     /* clear out evr10 */
+       evxor   evr10, evr10, evr10     /* clear out evr10 */
        evmwumiaa evr10, evr10, evr10   /* evr10 <- ACC = 0 * 0 + ACC */
        li      r5,THREAD_ACC
-       evstddx evr10, r4, r5           /* save off accumulator */
+       evstddx evr10, r4, r5           /* save off accumulator */
        lwz     r5,PT_REGS(r4)
        lwz     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
        lis     r10,MSR_SPE@h
        andc    r4,r4,r10       /* disable SPE for previous task */
        stw     r4,_MSR-STACK_FRAME_OVERHEAD(r5)
 1:
-#endif /* CONFIG_SMP */
+#endif /* !CONFIG_SMP */
        /* enable use of SPE after return */
        oris    r9,r9,MSR_SPE@h
        mfspr   r5,SPRN_SPRG3           /* current task's THREAD (phys) */
@@ -878,7 +875,7 @@ load_up_spe:
 #ifndef CONFIG_SMP
        subi    r4,r5,THREAD
        stw     r4,last_task_used_spe@l(r3)
-#endif /* CONFIG_SMP */
+#endif /* !CONFIG_SMP */
        /* restore registers and return */
 2:     REST_4GPRS(3, r11)
        lwz     r10,_CCR(r11)
@@ -963,10 +960,10 @@ _GLOBAL(giveup_spe)
        lwz     r5,PT_REGS(r3)
        cmpi    0,r5,0
        SAVE_32EVRS(0, r4, r3)
-       evxor   evr6, evr6, evr6        /* clear out evr6 */
+       evxor   evr6, evr6, evr6        /* clear out evr6 */
        evmwumiaa evr6, evr6, evr6      /* evr6 <- ACC = 0 * 0 + ACC */
        li      r4,THREAD_ACC
-       evstddx evr6, r4, r3            /* save off accumulator */
+       evstddx evr6, r4, r3            /* save off accumulator */
        mfspr   r6,SPRN_SPEFSCR
        stw     r6,THREAD_SPEFSCR(r3)   /* save spefscr register value */
        beq     1f
@@ -979,7 +976,7 @@ _GLOBAL(giveup_spe)
        li      r5,0
        lis     r4,last_task_used_spe@ha
        stw     r5,last_task_used_spe@l(r4)
-#endif /* CONFIG_SMP */
+#endif /* !CONFIG_SMP */
        blr
 #endif /* CONFIG_SPE */
 
@@ -1000,15 +997,15 @@ _GLOBAL(giveup_fpu)
  */
 _GLOBAL(abort)
        li      r13,0
-        mtspr   SPRN_DBCR0,r13         /* disable all debug events */
+       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
+       mfspr   r13,SPRN_DBCR0
+       lis     r13,(DBCR0_IDM|DBCR0_RST_CHIP)@h
+       mtspr   SPRN_DBCR0,r13
        isync
 
 _GLOBAL(set_context)
@@ -1043,20 +1040,12 @@ swapper_pg_dir:
 /* Reserved 4k for the critical exception stack & 4k for the machine
  * check stack per CPU for kernel mode exceptions */
        .section .bss
-        .align 12
+       .align 12
 exception_stack_bottom:
        .space  BOOKE_EXCEPTION_STACK_SIZE * NR_CPUS
        .globl  exception_stack_top
 exception_stack_top:
 
-/*
- * This space gets a copy of optional info passed to us by the bootstrap
- * which is used to pass parameters into the kernel like root=/dev/sda1, etc.
- */
-       .globl  cmd_line
-cmd_line:
-       .space  512
-
 /*
  * Room for two PTE pointers, usually the kernel and current user pointers
  * to their respective root page table.
index d6a38cd5018e11654efb2d046685da0cce3b8032..53bf64623bd891ce909f3cd177ab7a2e5df14c77 100644 (file)
@@ -371,7 +371,8 @@ static int ibmebus_match_path(struct device *dev, void *data)
 
 static char *ibmebus_chomp(const char *in, size_t count)
 {
-       char *out = (char*)kmalloc(count + 1, GFP_KERNEL);
+       char *out = kmalloc(count + 1, GFP_KERNEL);
+
        if (!out)
                return NULL;
 
@@ -396,10 +397,10 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus,
                return -ENOMEM;
 
        if (bus_find_device(&ibmebus_bus_type, NULL, path,
-                            ibmebus_match_path)) {
+                           ibmebus_match_path)) {
                printk(KERN_WARNING "%s: %s has already been probed\n",
                       __FUNCTION__, path);
-               rc = -EINVAL;
+               rc = -EEXIST;
                goto out;
        }
 
index a9e9cbd329752aa11411d7d3058f6903655a9840..abd2957fe5378ba59c4ccf6c58a9ecdd6f892798 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/smp.h>
 #include <linux/cpu.h>
 #include <linux/sysctl.h>
+#include <linux/tick.h>
 
 #include <asm/system.h>
 #include <asm/processor.h>
@@ -59,6 +60,7 @@ void cpu_idle(void)
 
        set_thread_flag(TIF_POLLING_NRFLAG);
        while (1) {
+               tick_nohz_stop_sched_tick();
                while (!need_resched() && !cpu_should_die()) {
                        ppc64_runlatch_off();
 
@@ -90,6 +92,7 @@ void cpu_idle(void)
 
                HMT_medium();
                ppc64_runlatch_on();
+               tick_nohz_restart_sched_tick();
                if (cpu_should_die())
                        cpu_die();
                preempt_enable_no_resched();
index 2a5cf868037083b6695670f5d99d1d6100daa5a4..1577434f4088599b4243c96b94a14247397f682f 100644 (file)
@@ -119,8 +119,8 @@ EXPORT_SYMBOL(ioport_unmap);
 
 void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
 {
-       unsigned long start = pci_resource_start(dev, bar);
-       unsigned long len = pci_resource_len(dev, bar);
+       resource_size_t start = pci_resource_start(dev, bar);
+       resource_size_t len = pci_resource_len(dev, bar);
        unsigned long flags = pci_resource_flags(dev, bar);
 
        if (!len)
index c08ceca6277d0ef816e7760957615d5b3b91bdda..e4ec6eee81a810d90c45faf22aa154b20f1c63a1 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/spinlock.h>
 #include <linux/string.h>
 #include <linux/dma-mapping.h>
-#include <linux/init.h>
 #include <linux/bitops.h>
 #include <asm/io.h>
 #include <asm/prom.h>
index 9bf63d5256dbeec42f0fc1a610bdac16e0fcdc12..2250f9e6c5ca0ceb517a571bebc8967a9b1dcd4f 100644 (file)
@@ -52,6 +52,7 @@
 #include <linux/mutex.h>
 #include <linux/bootmem.h>
 #include <linux/pci.h>
+#include <linux/debugfs.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -272,7 +273,7 @@ void do_IRQ(struct pt_regs *regs)
        struct thread_info *curtp, *irqtp;
 #endif
 
-        irq_enter();
+       irq_enter();
 
 #ifdef CONFIG_DEBUG_STACKOVERFLOW
        /* Debugging check for stack overflow: is there less than 2KB free? */
@@ -321,7 +322,7 @@ void do_IRQ(struct pt_regs *regs)
                /* That's not SMP safe ... but who cares ? */
                ppc_spurious_interrupts++;
 
-        irq_exit();
+       irq_exit();
        set_irq_regs(old_regs);
 
 #ifdef CONFIG_PPC_ISERIES
@@ -417,10 +418,16 @@ irq_hw_number_t virq_to_hw(unsigned int virq)
 }
 EXPORT_SYMBOL_GPL(virq_to_hw);
 
-__init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type,
-                                               unsigned int revmap_arg,
-                                               struct irq_host_ops *ops,
-                                               irq_hw_number_t inval_irq)
+static int default_irq_host_match(struct irq_host *h, struct device_node *np)
+{
+       return h->of_node != NULL && h->of_node == np;
+}
+
+struct irq_host *irq_alloc_host(struct device_node *of_node,
+                               unsigned int revmap_type,
+                               unsigned int revmap_arg,
+                               struct irq_host_ops *ops,
+                               irq_hw_number_t inval_irq)
 {
        struct irq_host *host;
        unsigned int size = sizeof(struct irq_host);
@@ -431,13 +438,7 @@ __init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type,
        /* Allocate structure and revmap table if using linear mapping */
        if (revmap_type == IRQ_HOST_MAP_LINEAR)
                size += revmap_arg * sizeof(unsigned int);
-       if (mem_init_done)
-               host = kzalloc(size, GFP_KERNEL);
-       else {
-               host = alloc_bootmem(size);
-               if (host)
-                       memset(host, 0, size);
-       }
+       host = zalloc_maybe_bootmem(size, GFP_KERNEL);
        if (host == NULL)
                return NULL;
 
@@ -445,6 +446,10 @@ __init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type,
        host->revmap_type = revmap_type;
        host->inval_irq = inval_irq;
        host->ops = ops;
+       host->of_node = of_node;
+
+       if (host->ops->match == NULL)
+               host->ops->match = default_irq_host_match;
 
        spin_lock_irqsave(&irq_big_lock, flags);
 
@@ -476,7 +481,7 @@ __init_refok struct irq_host *irq_alloc_host(unsigned int revmap_type,
                host->inval_irq = 0;
                /* setup us as the host for all legacy interrupts */
                for (i = 1; i < NUM_ISA_INTERRUPTS; i++) {
-                       irq_map[i].hwirq = 0;
+                       irq_map[i].hwirq = i;
                        smp_wmb();
                        irq_map[i].host = host;
                        smp_wmb();
@@ -520,7 +525,7 @@ struct irq_host *irq_find_host(struct device_node *node)
         */
        spin_lock_irqsave(&irq_big_lock, flags);
        list_for_each_entry(h, &irq_hosts, link)
-               if (h->ops->match == NULL || h->ops->match(h, node)) {
+               if (h->ops->match(h, node)) {
                        found = h;
                        break;
                }
@@ -995,6 +1000,68 @@ static int irq_late_init(void)
 }
 arch_initcall(irq_late_init);
 
+#ifdef CONFIG_VIRQ_DEBUG
+static int virq_debug_show(struct seq_file *m, void *private)
+{
+       unsigned long flags;
+       irq_desc_t *desc;
+       const char *p;
+       char none[] = "none";
+       int i;
+
+       seq_printf(m, "%-5s  %-7s  %-15s  %s\n", "virq", "hwirq",
+                     "chip name", "host name");
+
+       for (i = 1; i < NR_IRQS; i++) {
+               desc = get_irq_desc(i);
+               spin_lock_irqsave(&desc->lock, flags);
+
+               if (desc->action && desc->action->handler) {
+                       seq_printf(m, "%5d  ", i);
+                       seq_printf(m, "0x%05lx  ", virq_to_hw(i));
+
+                       if (desc->chip && desc->chip->typename)
+                               p = desc->chip->typename;
+                       else
+                               p = none;
+                       seq_printf(m, "%-15s  ", p);
+
+                       if (irq_map[i].host && irq_map[i].host->of_node)
+                               p = irq_map[i].host->of_node->full_name;
+                       else
+                               p = none;
+                       seq_printf(m, "%s\n", p);
+               }
+
+               spin_unlock_irqrestore(&desc->lock, flags);
+       }
+
+       return 0;
+}
+
+static int virq_debug_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, virq_debug_show, inode->i_private);
+}
+
+static const struct file_operations virq_debug_fops = {
+       .open = virq_debug_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+};
+
+static int __init irq_debugfs_init(void)
+{
+       if (debugfs_create_file("virq_mapping", S_IRUGO, powerpc_debugfs_root,
+                                NULL, &virq_debug_fops))
+               return -ENOMEM;
+
+       return 0;
+}
+__initcall(irq_debugfs_init);
+#endif /* CONFIG_VIRQ_DEBUG */
+
 #endif /* CONFIG_PPC_MERGE */
 
 #ifdef CONFIG_PPC64
index 90fa11c72e1ca5e21adcc39e149803d3102a92ad..4ed58875ee17ffe490268e6fb5f36dd14c27ae6a 100644 (file)
@@ -340,9 +340,10 @@ void __init find_legacy_serial_ports(void)
        }
 
        /* First fill our array with opb bus ports */
-       for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16750")) != NULL;) {
+       for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
                struct device_node *opb = of_get_parent(np);
-               if (opb && !strcmp(opb->type, "opb")) {
+               if (opb && (!strcmp(opb->type, "opb") ||
+                           of_device_is_compatible(opb, "ibm,opb"))) {
                        index = add_legacy_soc_port(np, np);
                        if (index >= 0 && np == stdout)
                                legacy_serial_console = index;
index 6444eaa30a2fd2c7d51d5ac14f52593436107e4a..ff781b2eddece571238831c081deee383d3092b2 100644 (file)
@@ -77,7 +77,7 @@ static int iseries_lparcfg_data(struct seq_file *m, void *v)
        int processors, max_processors;
        unsigned long purr = get_purr();
 
-       shared = (int)(get_lppaca()->shared_proc);
+       shared = (int)(local_paca->lppaca_ptr->shared_proc);
 
        seq_printf(m, "system_active_processors=%d\n",
                   (int)HvLpConfig_getSystemPhysicalProcessors());
diff --git a/arch/powerpc/kernel/lparmap.c b/arch/powerpc/kernel/lparmap.c
deleted file mode 100644 (file)
index af11285..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2005  Stephen Rothwell  IBM Corp.
- *
- * 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 <asm/mmu.h>
-#include <asm/pgtable.h>
-#include <asm/iseries/lpar_map.h>
-
-/* The # is to stop gcc trying to make .text nonexecutable */
-const struct LparMap __attribute__((__section__(".text #"))) xLparMap = {
-       .xNumberEsids = HvEsidsToMap,
-       .xNumberRanges = HvRangesToMap,
-       .xSegmentTableOffs = STAB0_PAGE,
-
-       .xEsids = {
-               { .xKernelEsid = GET_ESID(PAGE_OFFSET),
-                 .xKernelVsid = KERNEL_VSID(PAGE_OFFSET), },
-               { .xKernelEsid = GET_ESID(VMALLOC_START),
-                 .xKernelVsid = KERNEL_VSID(VMALLOC_START), },
-       },
-
-       .xRanges = {
-               { .xPages = HvPagesToMap,
-                 .xOffset = 0,
-                 .xVPN = KERNEL_VSID(PAGE_OFFSET) << (SID_SHIFT - HW_PAGE_SHIFT),
-               },
-       },
-};
index f9676f52c6d8c58ec70de146c7fd88d8e5f51db4..0ed31f2204826e2fa68315bd5bfe7be3cf3b10ba 100644 (file)
 
 #undef DEBUG_NVRAM
 
-static int nvram_scan_partitions(void);
-static int nvram_setup_partition(void);
-static int nvram_create_os_partition(void);
-static int nvram_remove_os_partition(void);
-
 static struct nvram_partition * nvram_part;
 static long nvram_error_log_index = -1;
 static long nvram_error_log_size = 0;
 
-int no_logging = 1;    /* Until we initialize everything,
-                        * make sure we don't try logging
-                        * anything */
-
-extern volatile int error_log_cnt;
-
 struct err_log_info {
        int error_type;
        unsigned int seq_num;
@@ -636,16 +625,13 @@ void __exit nvram_cleanup(void)
  * sequence #: The unique sequence # for each event. (until it wraps)
  * error log: The error log from event_scan
  */
-int nvram_write_error_log(char * buff, int length, unsigned int err_type)
+int nvram_write_error_log(char * buff, int length,
+                          unsigned int err_type, unsigned int error_log_cnt)
 {
        int rc;
        loff_t tmp_index;
        struct err_log_info info;
        
-       if (no_logging) {
-               return -EPERM;
-       }
-
        if (nvram_error_log_index == -1) {
                return -ESPIPE;
        }
@@ -678,7 +664,8 @@ int nvram_write_error_log(char * buff, int length, unsigned int err_type)
  *
  * Reads nvram for error log for at most 'length'
  */
-int nvram_read_error_log(char * buff, int length, unsigned int * err_type)
+int nvram_read_error_log(char * buff, int length,
+                         unsigned int * err_type, unsigned int * error_log_cnt)
 {
        int rc;
        loff_t tmp_index;
@@ -704,7 +691,7 @@ int nvram_read_error_log(char * buff, int length, unsigned int * err_type)
                return rc;
        }
 
-       error_log_cnt = info.seq_num;
+       *error_log_cnt = info.seq_num;
        *err_type = info.error_type;
 
        return 0;
index f70e787d556fc6d6b08ce662e8b7fec35272d920..eca8ccc3fa127065a5b10640dd08b42c8ae15cd2 100644 (file)
 #include <linux/mod_devicetable.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
 
 #include <asm/errno.h>
 #include <asm/dcr.h>
-#include <asm/of_device.h>
-#include <asm/of_platform.h>
 #include <asm/topology.h>
 #include <asm/pci-bridge.h>
 #include <asm/ppc-pci.h>
@@ -70,7 +70,10 @@ postcore_initcall(of_bus_driver_init);
 int of_register_platform_driver(struct of_platform_driver *drv)
 {
        /* initialize common driver fields */
-       drv->driver.name = drv->name;
+       if (!drv->driver.name)
+               drv->driver.name = drv->name;
+       if (!drv->driver.owner)
+               drv->driver.owner = drv->owner;
        drv->driver.bus = &of_platform_bus_type;
 
        /* register with core */
@@ -385,9 +388,11 @@ static struct of_device_id of_pci_phb_ids[] = {
 };
 
 static struct of_platform_driver of_pci_phb_driver = {
-       .name = "of-pci",
-       .match_table = of_pci_phb_ids,
-       .probe = of_pci_phb_probe,
+       .match_table = of_pci_phb_ids,
+       .probe = of_pci_phb_probe,
+       .driver = {
+               .name = "of-pci",
+       },
 };
 
 static __init int of_pci_phb_init(void)
index 083cfbdbe0b2d7ed86edeb2ab55d5a7284fd8a91..2ae3b6f778a3c4e5cff5922c10c96a705d44c2de 100644 (file)
@@ -65,14 +65,11 @@ static void __devinit pci_setup_pci_controller(struct pci_controller *hose)
        spin_unlock(&hose_spinlock);
 }
 
-__init_refok struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
+struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
 {
        struct pci_controller *phb;
 
-       if (mem_init_done)
-               phb = kmalloc(sizeof(struct pci_controller), GFP_KERNEL);
-       else
-               phb = alloc_bootmem(sizeof (struct pci_controller));
+       phb = alloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
        if (phb == NULL)
                return NULL;
        pci_setup_pci_controller(phb);
index 04a3109ae3c61e56a7ac0a815774932855484256..0e2bee46304c51fc109d0e2b899a6ce6a559f841 100644 (file)
@@ -1457,8 +1457,8 @@ null_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
 
 static struct pci_ops null_pci_ops =
 {
-       null_read_config,
-       null_write_config
+       .read = null_read_config,
+       .write = null_write_config,
 };
 
 /*
index 291ffbc360c9a023f30a6b40b4c77b9d272ebb31..9f63bdcb0bdf88f0cdabe6de30b8276070ecebaf 100644 (file)
@@ -588,7 +588,7 @@ int pci_proc_domain(struct pci_bus *bus)
                return 0;
        else {
                struct pci_controller *hose = pci_bus_to_host(bus);
-               return hose->buid;
+               return hose->buid != 0;
        }
 }
 
index d7d36df9c053fb36c7ccbf1c763d7e15234980a0..b4839038613d2232c8a2c7cc2ba9a56c95795969 100644 (file)
@@ -23,8 +23,6 @@
 #include <linux/pci.h>
 #include <linux/string.h>
 #include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/bootmem.h>
 
 #include <asm/io.h>
 #include <asm/prom.h>
@@ -45,10 +43,7 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data)
        const u32 *regs;
        struct pci_dn *pdn;
 
-       if (mem_init_done)
-               pdn = kmalloc(sizeof(*pdn), GFP_KERNEL);
-       else
-               pdn = alloc_bootmem(sizeof(*pdn));
+       pdn = alloc_maybe_bootmem(sizeof(*pdn), GFP_KERNEL);
        if (pdn == NULL)
                return NULL;
        memset(pdn, 0, sizeof(*pdn));
index a20f1951a5ce7b6141f22480c723f83a8b0062f2..c6b1aa3efbb9c7362902858ae31591135b3f50ec 100644 (file)
 #include <linux/irq.h>
 #include <linux/pci.h>
 #include <linux/delay.h>
-#include <linux/ide.h>
 #include <linux/bitops.h>
 
 #include <asm/page.h>
 #include <asm/semaphore.h>
 #include <asm/processor.h>
+#include <asm/cacheflush.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <asm/atomic.h>
@@ -95,10 +95,6 @@ EXPORT_SYMBOL(__strnlen_user);
 EXPORT_SYMBOL(copy_4K_page);
 #endif
 
-#if defined(CONFIG_PPC32) && (defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE))
-EXPORT_SYMBOL(ppc_ide_md);
-#endif
-
 #if defined(CONFIG_PCI) && defined(CONFIG_PPC32)
 EXPORT_SYMBOL(isa_io_base);
 EXPORT_SYMBOL(isa_mem_base);
@@ -180,7 +176,7 @@ EXPORT_SYMBOL(cacheable_memcpy);
 EXPORT_SYMBOL(cpm_install_handler);
 EXPORT_SYMBOL(cpm_free_handler);
 #endif /* CONFIG_8xx */
-#if defined(CONFIG_8xx) || defined(CONFIG_40x)
+#if defined(CONFIG_8xx)
 EXPORT_SYMBOL(__res);
 #endif
 
index 8a1b001d0b110fa5a31a3fb53ed215312680f04c..7949c203cb89f5df7a7b27471d1b904e9af672a0 100644 (file)
@@ -354,6 +354,14 @@ static void show_instructions(struct pt_regs *regs)
                if (!(i % 8))
                        printk("\n");
 
+#if !defined(CONFIG_BOOKE)
+               /* If executing with the IMMU off, adjust pc rather
+                * than print XXXXXXXX.
+                */
+               if (!(regs->msr & MSR_IR))
+                       pc = (unsigned long)phys_to_virt(pc);
+#endif
+
                /* We use __get_user here *only* to avoid an OOPS on a
                 * bad address because the pc *should* only be a
                 * kernel address.
@@ -556,10 +564,15 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
 
 #ifdef CONFIG_PPC64
        if (cpu_has_feature(CPU_FTR_SLB)) {
-               unsigned long sp_vsid = get_kernel_vsid(sp);
+               unsigned long sp_vsid;
                unsigned long llp = mmu_psize_defs[mmu_linear_psize].sllp;
 
-               sp_vsid <<= SLB_VSID_SHIFT;
+               if (cpu_has_feature(CPU_FTR_1T_SEGMENT))
+                       sp_vsid = get_kernel_vsid(sp, MMU_SEGSIZE_1T)
+                               << SLB_VSID_SHIFT_1T;
+               else
+                       sp_vsid = get_kernel_vsid(sp, MMU_SEGSIZE_256M)
+                               << SLB_VSID_SHIFT;
                sp_vsid |= SLB_VSID_KERNEL | llp;
                p->thread.ksp_vsid = sp_vsid;
        }
@@ -676,9 +689,13 @@ int set_fpexc_mode(struct task_struct *tsk, unsigned int val)
         * mode (asyn, precise, disabled) for 'Classic' FP. */
        if (val & PR_FP_EXC_SW_ENABLE) {
 #ifdef CONFIG_SPE
-               tsk->thread.fpexc_mode = val &
-                       (PR_FP_EXC_SW_ENABLE | PR_FP_ALL_EXCEPT);
-               return 0;
+               if (cpu_has_feature(CPU_FTR_SPE)) {
+                       tsk->thread.fpexc_mode = val &
+                               (PR_FP_EXC_SW_ENABLE | PR_FP_ALL_EXCEPT);
+                       return 0;
+               } else {
+                       return -EINVAL;
+               }
 #else
                return -EINVAL;
 #endif
@@ -704,7 +721,10 @@ int get_fpexc_mode(struct task_struct *tsk, unsigned long adr)
 
        if (tsk->thread.fpexc_mode & PR_FP_EXC_SW_ENABLE)
 #ifdef CONFIG_SPE
-               val = tsk->thread.fpexc_mode;
+               if (cpu_has_feature(CPU_FTR_SPE))
+                       val = tsk->thread.fpexc_mode;
+               else
+                       return -EINVAL;
 #else
                return -EINVAL;
 #endif
index a38197b12d3e991a22dd06850911cecdd1869cce..9f329a8928eaed27f3192e27c729e24bb73ac888 100644 (file)
@@ -52,7 +52,6 @@
 #include <asm/pSeries_reconfig.h>
 #include <asm/pci-bridge.h>
 #include <asm/kexec.h>
-#include <asm/system.h>
 
 #ifdef DEBUG
 #define DBG(fmt...) printk(KERN_ERR fmt)
@@ -431,9 +430,11 @@ static int __init early_parse_mem(char *p)
 }
 early_param("mem", early_parse_mem);
 
-/*
- * The device tree may be allocated below our memory limit, or inside the
- * crash kernel region for kdump. If so, move it out now.
+/**
+ * move_device_tree - move tree to an unused area, if needed.
+ *
+ * The device tree may be allocated beyond our memory limit, or inside the
+ * crash kernel region for kdump. If so, move it out of the way.
  */
 static void move_device_tree(void)
 {
@@ -530,10 +531,7 @@ static struct ibm_pa_feature {
        {CPU_FTR_CTRL, 0,               0, 3, 0},
        {CPU_FTR_NOEXECUTE, 0,          0, 6, 0},
        {CPU_FTR_NODSISRALIGN, 0,       1, 1, 1},
-#if 0
-       /* put this back once we know how to test if firmware does 64k IO */
        {CPU_FTR_CI_LARGE_PAGE, 0,      1, 2, 0},
-#endif
        {CPU_FTR_REAL_LE, PPC_FEATURE_TRUE_LE, 5, 0, 0},
 };
 
@@ -780,13 +778,13 @@ static int __init early_init_dt_scan_chosen(unsigned long node,
 #endif
 
 #ifdef CONFIG_KEXEC
-       lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL);
-       if (lprop)
-               crashk_res.start = *lprop;
+       lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-base", NULL);
+       if (lprop)
+               crashk_res.start = *lprop;
 
-       lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL);
-       if (lprop)
-               crashk_res.end = crashk_res.start + *lprop - 1;
+       lprop = (u64*)of_get_flat_dt_prop(node, "linux,crashkernel-size", NULL);
+       if (lprop)
+               crashk_res.end = crashk_res.start + *lprop - 1;
 #endif
 
        early_init_dt_check_for_initrd(node);
index a1d582e38627492ace142363659cac979969640f..1db10f70ae69bb0d4da938d068bb81fbd434f1b3 100644 (file)
@@ -1199,7 +1199,7 @@ static void __init prom_initialize_tce_table(void)
                if ((type[0] == 0) || (strstr(type, RELOC("pci")) == NULL))
                        continue;
 
-               /* Keep the old logic in tack to avoid regression. */
+               /* Keep the old logic intact to avoid regression. */
                if (compatible[0] != 0) {
                        if ((strstr(compatible, RELOC("python")) == NULL) &&
                            (strstr(compatible, RELOC("Speedwagon")) == NULL) &&
@@ -2046,6 +2046,7 @@ static void __init fixup_device_tree_maple(void)
 /*
  * Pegasos and BriQ lacks the "ranges" property in the isa node
  * Pegasos needs decimal IRQ 14/15, not hexadecimal
+ * Pegasos has the IDE configured in legacy mode, but advertised as native
  */
 static void __init fixup_device_tree_chrp(void)
 {
@@ -2083,9 +2084,13 @@ static void __init fixup_device_tree_chrp(void)
                prom_printf("Fixing up IDE interrupt on Pegasos...\n");
                prop[0] = 14;
                prop[1] = 0x0;
-               prop[2] = 15;
-               prop[3] = 0x0;
-               prom_setprop(ph, name, "interrupts", prop, 4*sizeof(u32));
+               prom_setprop(ph, name, "interrupts", prop, 2*sizeof(u32));
+               prom_printf("Fixing up IDE class-code on Pegasos...\n");
+               rc = prom_getprop(ph, "class-code", prop, sizeof(u32));
+               if (rc == sizeof(u32)) {
+                       prop[0] &= ~0x5;
+                       prom_setprop(ph, name, "class-code", prop, sizeof(u32));
+               }
        }
 }
 #else
@@ -2226,7 +2231,7 @@ static void __init fixup_device_tree(void)
 
 static void __init prom_find_boot_cpu(void)
 {
-               struct prom_t *_prom = &RELOC(prom);
+       struct prom_t *_prom = &RELOC(prom);
        u32 getprop_rval;
        ihandle prom_cpu;
        phandle cpu_pkg;
@@ -2246,7 +2251,7 @@ static void __init prom_find_boot_cpu(void)
 static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
 {
 #ifdef CONFIG_BLK_DEV_INITRD
-               struct prom_t *_prom = &RELOC(prom);
+       struct prom_t *_prom = &RELOC(prom);
 
        if (r3 && r4 && r4 != 0xdeadbeef) {
                unsigned long val;
@@ -2279,7 +2284,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
                               unsigned long pp,
                               unsigned long r6, unsigned long r7)
 {      
-               struct prom_t *_prom;
+       struct prom_t *_prom;
        unsigned long hdr;
        unsigned long offset = reloc_offset();
 
@@ -2338,8 +2343,8 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
        /*
         * Copy the CPU hold code
         */
-               if (RELOC(of_platform) != PLATFORM_POWERMAC)
-                       copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
+       if (RELOC(of_platform) != PLATFORM_POWERMAC)
+               copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
 
        /*
         * Do early parsing of command line
index 8a177bd9eab4ff5746963e484e22b021d9d2578d..cf7732cdd6c7e1ef65df511297dceac941e54ef5 100644 (file)
@@ -331,6 +331,7 @@ static long arch_ptrace_old(struct task_struct *child, long request, long addr,
                unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
                unsigned long __user *tmp = (unsigned long __user *)addr;
 
+               CHECK_FULL_REGS(child->thread.regs);
                for (i = 0; i < 32; i++) {
                        ret = put_user(*reg, tmp);
                        if (ret)
@@ -346,6 +347,7 @@ static long arch_ptrace_old(struct task_struct *child, long request, long addr,
                unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
                unsigned long __user *tmp = (unsigned long __user *)addr;
 
+               CHECK_FULL_REGS(child->thread.regs);
                for (i = 0; i < 32; i++) {
                        ret = get_user(*reg, tmp);
                        if (ret)
@@ -517,6 +519,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        ret = -EIO;
                        break;
                }
+               CHECK_FULL_REGS(child->thread.regs);
                ret = 0;
                for (ui = 0; ui < PT_REGS_COUNT; ui ++) {
                        ret |= __put_user(ptrace_get_reg(child, ui),
@@ -537,6 +540,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        ret = -EIO;
                        break;
                }
+               CHECK_FULL_REGS(child->thread.regs);
                ret = 0;
                for (ui = 0; ui < PT_REGS_COUNT; ui ++) {
                        ret = __get_user(tmp, (unsigned long __user *) data);
@@ -576,8 +580,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 #ifdef CONFIG_SPE
        case PTRACE_GETEVRREGS:
                /* Get the child spe register state. */
-               if (child->thread.regs->msr & MSR_SPE)
-                       giveup_spe(child);
+               flush_spe_to_thread(child);
                ret = get_evrregs((unsigned long __user *)data, child);
                break;
 
@@ -585,8 +588,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                /* Set the child spe register state. */
                /* this is to clear the MSR_SPE bit to force a reload
                 * of register state from memory */
-               if (child->thread.regs->msr & MSR_SPE)
-                       giveup_spe(child);
+               flush_spe_to_thread(child);
                ret = set_evrregs(child, (unsigned long __user *)data);
                break;
 #endif
index 9e6baeac0fb1e569e4fe35bd279d311318d93af2..fea6206ff90fd69aaf363075181a927049cb552d 100644 (file)
@@ -53,6 +53,7 @@ static long compat_ptrace_old(struct task_struct *child, long request,
                unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
                unsigned int __user *tmp = (unsigned int __user *)addr;
 
+               CHECK_FULL_REGS(child->thread.regs);
                for (i = 0; i < 32; i++) {
                        ret = put_user(*reg, tmp);
                        if (ret)
@@ -68,6 +69,7 @@ static long compat_ptrace_old(struct task_struct *child, long request,
                unsigned long *reg = &((unsigned long *)child->thread.regs)[0];
                unsigned int __user *tmp = (unsigned int __user *)addr;
 
+               CHECK_FULL_REGS(child->thread.regs);
                for (i = 0; i < 32; i++) {
                        ret = get_user(*reg, tmp);
                        if (ret)
@@ -164,6 +166,7 @@ long compat_sys_ptrace(int request, int pid, unsigned long addr,
                if ((addr & 3) || (index > PT_FPSCR32))
                        break;
 
+               CHECK_FULL_REGS(child->thread.regs);
                if (index < PT_FPR0) {
                        tmp = ptrace_get_reg(child, index);
                } else {
@@ -210,6 +213,7 @@ long compat_sys_ptrace(int request, int pid, unsigned long addr,
                if ((addr & 3) || numReg > PT_FPSCR)
                        break;
 
+               CHECK_FULL_REGS(child->thread.regs);
                if (numReg >= PT_FPR0) {
                        flush_fp_to_thread(child);
                        tmp = ((unsigned long int *)child->thread.fpr)[numReg - PT_FPR0];
@@ -270,6 +274,7 @@ long compat_sys_ptrace(int request, int pid, unsigned long addr,
                if ((addr & 3) || (index > PT_FPSCR32))
                        break;
 
+               CHECK_FULL_REGS(child->thread.regs);
                if (index < PT_FPR0) {
                        ret = ptrace_put_reg(child, index, data);
                } else {
@@ -307,6 +312,7 @@ long compat_sys_ptrace(int request, int pid, unsigned long addr,
                 */
                if ((addr & 3) || (numReg > PT_FPSCR))
                        break;
+               CHECK_FULL_REGS(child->thread.regs);
                if (numReg < PT_FPR0) {
                        unsigned long freg = ptrace_get_reg(child, numReg);
                        if (index % 2)
@@ -342,6 +348,7 @@ long compat_sys_ptrace(int request, int pid, unsigned long addr,
                        ret = -EIO;
                        break;
                }
+               CHECK_FULL_REGS(child->thread.regs);
                ret = 0;
                for (ui = 0; ui < PT_REGS_COUNT; ui ++) {
                        ret |= __put_user(ptrace_get_reg(child, ui),
@@ -359,6 +366,7 @@ long compat_sys_ptrace(int request, int pid, unsigned long addr,
                        ret = -EIO;
                        break;
                }
+               CHECK_FULL_REGS(child->thread.regs);
                ret = 0;
                for (ui = 0; ui < PT_REGS_COUNT; ui ++) {
                        ret = __get_user(tmp, (unsigned int __user *) data);
index a5de6211b97ad6b8af75dfb2611907ce8d09b689..21f14e57d1f3d848d9d7d375abf96c2a83ae1b27 100644 (file)
@@ -171,8 +171,8 @@ static int rtas_pci_write_config(struct pci_bus *bus,
 }
 
 struct pci_ops rtas_pci_ops = {
-       rtas_pci_read_config,
-       rtas_pci_write_config
+       .read = rtas_pci_read_config,
+       .write = rtas_pci_write_config,
 };
 
 int is_python(struct device_node *dev)
index 50ef38cffdbfc3db60df3b3a90827daac12aef47..36c90ba2d31269a2fa32d950c1ec812c6e94264b 100644 (file)
@@ -76,6 +76,8 @@ EXPORT_SYMBOL(machine_id);
 
 unsigned long klimit = (unsigned long) _end;
 
+char cmd_line[COMMAND_LINE_SIZE];
+
 /*
  * This still seems to be needed... -- paulus
  */ 
index 7ec6ba56d83dfcb40385f954b72b6ce40ae30475..cd870a823d18a89952d4b9d622bb080e3b5ffc5b 100644 (file)
@@ -10,7 +10,9 @@
 #include <linux/reboot.h>
 #include <linux/delay.h>
 #include <linux/initrd.h>
+#if defined(CONFIG_IDE) || defined(CONFIG_IDE_MODULE)
 #include <linux/ide.h>
+#endif
 #include <linux/tty.h>
 #include <linux/bootmem.h>
 #include <linux/seq_file.h>
 #include <linux/cpu.h>
 #include <linux/console.h>
 
-#include <asm/residual.h>
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/processor.h>
 #include <asm/pgtable.h>
 #include <asm/setup.h>
-#include <asm/amigappc.h>
 #include <asm/smp.h>
 #include <asm/elf.h>
 #include <asm/cputable.h>
 
 extern void bootx_init(unsigned long r4, unsigned long phys);
 
+#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
 struct ide_machdep_calls ppc_ide_md;
+EXPORT_SYMBOL(ppc_ide_md);
+#endif
 
 int boot_cpuid;
 EXPORT_SYMBOL_GPL(boot_cpuid);
@@ -287,7 +290,8 @@ void __init setup_arch(char **cmdline_p)
        conswitchp = &dummy_con;
 #endif
 
-       ppc_md.setup_arch();
+       if (ppc_md.setup_arch)
+               ppc_md.setup_arch();
        if ( ppc_md.progress ) ppc_md.progress("arch: exit", 0x3eab);
 
        paging_init();
index 6018178708a55f76be298d405c0fd8d76c9af6b2..008ab6823b022a1793259b62697008f15feb90d5 100644 (file)
@@ -181,9 +181,9 @@ void __init early_setup(unsigned long dt_ptr)
        DBG(" -> early_setup(), dt_ptr: 0x%lx\n", dt_ptr);
 
        /*
-        * Do early initializations using the flattened device
-        * tree, like retreiving the physical memory map or
-        * calculating/retreiving the hash table size
+        * Do early initialization using the flattened device
+        * tree, such as retrieving the physical memory map or
+        * calculating/retrieving the hash table size.
         */
        early_init_devtree(__va(dt_ptr));
 
@@ -530,7 +530,8 @@ void __init setup_arch(char **cmdline_p)
        conswitchp = &dummy_con;
 #endif
 
-       ppc_md.setup_arch();
+       if (ppc_md.setup_arch)
+               ppc_md.setup_arch();
 
        paging_init();
        ppc64_boot_msg(0x15, "Setup Done");
index c434d6c4e4e6c5d9577deb44a66d00887403bb2d..a65a44fbe52375c5b1b5ca7a8deb33305ab11536 100644 (file)
 
 #include "signal.h"
 
+/* Log an error when sending an unhandled signal to a process. Controlled
+ * through debug.exception-trace sysctl.
+ */
+
+int show_unhandled_signals = 0;
+
 /*
  * Allocate space for the signal frame
  */
index 590057e9e98779e227c52d967b776d4b1900214c..6126bca8b70a0c0ffd0d569fbd9f94782578bcd6 100644 (file)
@@ -705,11 +705,13 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
 {
        struct rt_sigframe __user *rt_sf;
        struct mcontext __user *frame;
+       void __user *addr;
        unsigned long newsp = 0;
 
        /* Set up Signal Frame */
        /* Put a Real Time Context onto stack */
        rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf));
+       addr = rt_sf;
        if (unlikely(rt_sf == NULL))
                goto badframe;
 
@@ -728,6 +730,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
 
        /* Save user registers on the stack */
        frame = &rt_sf->uc.uc_mcontext;
+       addr = frame;
        if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
                if (save_user_regs(regs, frame, 0))
                        goto badframe;
@@ -742,6 +745,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
 
        /* create a stack frame for the caller of the handler */
        newsp = ((unsigned long)rt_sf) - (__SIGNAL_FRAMESIZE + 16);
+       addr = (void __user *)regs->gpr[1];
        if (put_user(regs->gpr[1], (u32 __user *)newsp))
                goto badframe;
 
@@ -762,6 +766,12 @@ badframe:
        printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       addr, regs->nip, regs->link);
+
        force_sigsegv(sig, current);
        return 0;
 }
@@ -886,6 +896,12 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
        return 0;
 
  bad:
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       rt_sf, regs->nip, regs->link);
+
        force_sig(SIGSEGV, current);
        return 0;
 }
@@ -967,6 +983,13 @@ int sys_debug_setcontext(struct ucontext __user *ctx,
         * We kill the task with a SIGSEGV in this situation.
         */
        if (do_setcontext(ctx, regs, 1)) {
+               if (show_unhandled_signals && printk_ratelimit())
+                       printk(KERN_INFO "%s[%d]: bad frame in "
+                               "sys_debug_setcontext: %p nip %08lx "
+                               "lr %08lx\n",
+                               current->comm, current->pid,
+                               ctx, regs->nip, regs->link);
+
                force_sig(SIGSEGV, current);
                goto out;
        }
@@ -1048,6 +1071,12 @@ badframe:
        printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in handle_signal32: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       frame, regs->nip, regs->link);
+
        force_sigsegv(sig, current);
        return 0;
 }
@@ -1061,12 +1090,14 @@ long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
        struct sigcontext __user *sc;
        struct sigcontext sigctx;
        struct mcontext __user *sr;
+       void __user *addr;
        sigset_t set;
 
        /* Always make any pending restarted system calls return -EINTR */
        current_thread_info()->restart_block.fn = do_no_restart_syscall;
 
        sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
+       addr = sc;
        if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
                goto badframe;
 
@@ -1083,6 +1114,7 @@ long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
        restore_sigmask(&set);
 
        sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
+       addr = sr;
        if (!access_ok(VERIFY_READ, sr, sizeof(*sr))
            || restore_user_regs(regs, sr, 1))
                goto badframe;
@@ -1091,6 +1123,12 @@ long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
        return 0;
 
 badframe:
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(KERN_INFO "%s[%d]: bad frame in sys_sigreturn: "
+                       "%p nip %08lx lr %08lx\n",
+                       current->comm, current->pid,
+                       addr, regs->nip, regs->link);
+
        force_sig(SIGSEGV, current);
        return 0;
 }
index de895e6d8c62c03ff601bef5a030e1b792bf4cbb..faeb8f207ea48daf79c3a2a69a967edfa52ef748 100644 (file)
@@ -64,6 +64,11 @@ struct rt_sigframe {
        char abigap[288];
 } __attribute__ ((aligned (16)));
 
+static const char fmt32[] = KERN_INFO \
+       "%s[%d]: bad frame in %s: %08lx nip %08lx lr %08lx\n";
+static const char fmt64[] = KERN_INFO \
+       "%s[%d]: bad frame in %s: %016lx nip %016lx lr %016lx\n";
+
 /*
  * Set up the sigcontext for the signal frame.
  */
@@ -315,6 +320,11 @@ badframe:
        printk("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n",
               regs, uc, &uc->uc_mcontext);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(regs->msr & MSR_SF ? fmt64 : fmt32,
+                       current->comm, current->pid, "rt_sigreturn",
+                       (long)uc, regs->nip, regs->link);
+
        force_sig(SIGSEGV, current);
        return 0;
 }
@@ -398,6 +408,11 @@ badframe:
        printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n",
               regs, frame, newsp);
 #endif
+       if (show_unhandled_signals && printk_ratelimit())
+               printk(regs->msr & MSR_SF ? fmt64 : fmt32,
+                       current->comm, current->pid, "setup_rt_frame",
+                       (long)frame, regs->nip, regs->link);
+
        force_sigsegv(signr, current);
        return 0;
 }
index 1ea43160f543ea1018d99cdd88d324536c989b09..d30f08fa029772dff196d73b6177924e27aeebc4 100644 (file)
@@ -152,11 +152,6 @@ static void stop_this_cpu(void *dummy)
                ;
 }
 
-void smp_send_stop(void)
-{
-       smp_call_function(stop_this_cpu, NULL, 1, 0);
-}
-
 /*
  * Structure and data for smp_call_function(). This is designed to minimise
  * static memory requirements. It also looks cleaner.
@@ -198,9 +193,6 @@ int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
        int cpu;
        u64 timeout;
 
-       /* Can deadlock when called with interrupts disabled */
-       WARN_ON(irqs_disabled());
-
        if (unlikely(smp_ops == NULL))
                return ret;
 
@@ -270,10 +262,19 @@ int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
        return ret;
 }
 
+static int __smp_call_function(void (*func)(void *info), void *info,
+                              int nonatomic, int wait)
+{
+       return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
+}
+
 int smp_call_function(void (*func) (void *info), void *info, int nonatomic,
                        int wait)
 {
-       return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
+       /* Can deadlock when called with interrupts disabled */
+       WARN_ON(irqs_disabled());
+
+       return __smp_call_function(func, info, nonatomic, wait);
 }
 EXPORT_SYMBOL(smp_call_function);
 
@@ -283,6 +284,9 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int
        cpumask_t map = CPU_MASK_NONE;
        int ret = 0;
 
+       /* Can deadlock when called with interrupts disabled */
+       WARN_ON(irqs_disabled());
+
        if (!cpu_online(cpu))
                return -EINVAL;
 
@@ -299,6 +303,11 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int
 }
 EXPORT_SYMBOL(smp_call_function_single);
 
+void smp_send_stop(void)
+{
+       __smp_call_function(stop_this_cpu, NULL, 1, 0);
+}
+
 void smp_call_function_interrupt(void)
 {
        void (*func) (void *info);
@@ -560,6 +569,8 @@ int __devinit start_secondary(void *unused)
        if (system_state > SYSTEM_BOOTING)
                snapshot_timebase();
 
+       secondary_cpu_time_init();
+
        spin_lock(&call_lock);
        cpu_set(cpu, cpu_online_map);
        spin_unlock(&call_lock);
diff --git a/arch/powerpc/kernel/softemu8xx.c b/arch/powerpc/kernel/softemu8xx.c
new file mode 100644 (file)
index 0000000..67d6f68
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * Software emulation of some PPC instructions for the 8xx core.
+ *
+ * Copyright (C) 1998 Dan Malek (dmalek@jlc.net)
+ *
+ * Software floating emuation for the MPC8xx processor.  I did this mostly
+ * because it was easier than trying to get the libraries compiled for
+ * software floating point.  The goal is still to get the libraries done,
+ * but I lost patience and needed some hacks to at least get init and
+ * shells running.  The first problem is the setjmp/longjmp that save
+ * and restore the floating point registers.
+ *
+ * For this emulation, our working registers are found on the register
+ * save area.
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/user.h>
+#include <linux/a.out.h>
+#include <linux/interrupt.h>
+
+#include <asm/pgtable.h>
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/io.h>
+
+/* Eventually we may need a look-up table, but this works for now.
+*/
+#define LFS    48
+#define LFD    50
+#define LFDU   51
+#define STFD   54
+#define STFDU  55
+#define FMR    63
+
+void print_8xx_pte(struct mm_struct *mm, unsigned long addr)
+{
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *pte;
+
+       printk(" pte @ 0x%8lx: ", addr);
+       pgd = pgd_offset(mm, addr & PAGE_MASK);
+       if (pgd) {
+               pmd = pmd_offset(pud_offset(pgd, addr & PAGE_MASK),
+                                addr & PAGE_MASK);
+               if (pmd && pmd_present(*pmd)) {
+                       pte = pte_offset_kernel(pmd, addr & PAGE_MASK);
+                       if (pte) {
+                               printk(" (0x%08lx)->(0x%08lx)->0x%08lx\n",
+                                       (long)pgd, (long)pte, (long)pte_val(*pte));
+#define pp ((long)pte_val(*pte))
+                               printk(" RPN: %05lx PP: %lx SPS: %lx SH: %lx "
+                                      "CI: %lx v: %lx\n",
+                                      pp>>12,    /* rpn */
+                                      (pp>>10)&3, /* pp */
+                                      (pp>>3)&1, /* small */
+                                      (pp>>2)&1, /* shared */
+                                      (pp>>1)&1, /* cache inhibit */
+                                      pp&1       /* valid */
+                                      );
+#undef pp
+                       }
+                       else {
+                               printk("no pte\n");
+                       }
+               }
+               else {
+                       printk("no pmd\n");
+               }
+       }
+       else {
+               printk("no pgd\n");
+       }
+}
+
+int get_8xx_pte(struct mm_struct *mm, unsigned long addr)
+{
+       pgd_t *pgd;
+       pmd_t *pmd;
+       pte_t *pte;
+       int retval = 0;
+
+       pgd = pgd_offset(mm, addr & PAGE_MASK);
+       if (pgd) {
+               pmd = pmd_offset(pud_offset(pgd, addr & PAGE_MASK),
+                                addr & PAGE_MASK);
+               if (pmd && pmd_present(*pmd)) {
+                       pte = pte_offset_kernel(pmd, addr & PAGE_MASK);
+                       if (pte) {
+                               retval = (int)pte_val(*pte);
+                       }
+               }
+       }
+       return retval;
+}
+
+/*
+ * We return 0 on success, 1 on unimplemented instruction, and EFAULT
+ * if a load/store faulted.
+ */
+int Soft_emulate_8xx(struct pt_regs *regs)
+{
+       u32 inst, instword;
+       u32 flreg, idxreg, disp;
+       int retval;
+       s16 sdisp;
+       u32 *ea, *ip;
+
+       retval = 0;
+
+       instword = *((u32 *)regs->nip);
+       inst = instword >> 26;
+
+       flreg = (instword >> 21) & 0x1f;
+       idxreg = (instword >> 16) & 0x1f;
+       disp = instword & 0xffff;
+
+       ea = (u32 *)(regs->gpr[idxreg] + disp);
+       ip = (u32 *)&current->thread.fpr[flreg];
+
+       switch ( inst )
+       {
+       case LFD:
+               /* this is a 16 bit quantity that is sign extended
+                * so use a signed short here -- Cort
+                */
+               sdisp = (instword & 0xffff);
+               ea = (u32 *)(regs->gpr[idxreg] + sdisp);
+               if (copy_from_user(ip, ea, sizeof(double)))
+                       retval = -EFAULT;
+               break;
+
+       case LFDU:
+               if (copy_from_user(ip, ea, sizeof(double)))
+                       retval = -EFAULT;
+               else
+                       regs->gpr[idxreg] = (u32)ea;
+               break;
+       case LFS:
+               sdisp = (instword & 0xffff);
+               ea = (u32 *)(regs->gpr[idxreg] + sdisp);
+               if (copy_from_user(ip, ea, sizeof(float)))
+                       retval = -EFAULT;
+               break;
+       case STFD:
+               /* this is a 16 bit quantity that is sign extended
+                * so use a signed short here -- Cort
+                */
+               sdisp = (instword & 0xffff);
+               ea = (u32 *)(regs->gpr[idxreg] + sdisp);
+               if (copy_to_user(ea, ip, sizeof(double)))
+                       retval = -EFAULT;
+               break;
+
+       case STFDU:
+               if (copy_to_user(ea, ip, sizeof(double)))
+                       retval = -EFAULT;
+               else
+                       regs->gpr[idxreg] = (u32)ea;
+               break;
+       case FMR:
+               /* assume this is a fp move -- Cort */
+               memcpy(ip, &current->thread.fpr[(instword>>11)&0x1f],
+                      sizeof(double));
+               break;
+       default:
+               retval = 1;
+               printk("Bad emulation %s/%d\n"
+                      " NIP: %08lx instruction: %08x opcode: %x "
+                      "A: %x B: %x C: %x code: %x rc: %x\n",
+                      current->comm,current->pid,
+                      regs->nip,
+                      instword,inst,
+                      (instword>>16)&0x1f,
+                      (instword>>11)&0x1f,
+                      (instword>>6)&0x1f,
+                      (instword>>1)&0x3ff,
+                      instword&1);
+               {
+                       int pa;
+                       print_8xx_pte(current->mm,regs->nip);
+                       pa = get_8xx_pte(current->mm,regs->nip) & PAGE_MASK;
+                       pa |= (regs->nip & ~PAGE_MASK);
+                       pa = (unsigned long)__va(pa);
+                       printk("Kernel VA for NIP %x ", pa);
+                       print_8xx_pte(current->mm,pa);
+               }
+       }
+
+       if (retval == 0)
+               regs->nip += 4;
+
+       return retval;
+}
index 55d29ed4b7a0f0933c62a7c0cd730190ba59cd4a..25d9a96484ddeb914ff0d7fe63aa1b0c3baf7e8e 100644 (file)
@@ -197,6 +197,36 @@ SYSFS_PMCSETUP(pa6t_pmc3, SPRN_PA6T_PMC3);
 SYSFS_PMCSETUP(pa6t_pmc4, SPRN_PA6T_PMC4);
 SYSFS_PMCSETUP(pa6t_pmc5, SPRN_PA6T_PMC5);
 
+#ifdef CONFIG_DEBUG_KERNEL
+SYSFS_PMCSETUP(hid0, SPRN_HID0);
+SYSFS_PMCSETUP(hid1, SPRN_HID1);
+SYSFS_PMCSETUP(hid4, SPRN_HID4);
+SYSFS_PMCSETUP(hid5, SPRN_HID5);
+SYSFS_PMCSETUP(ima0, SPRN_PA6T_IMA0);
+SYSFS_PMCSETUP(ima1, SPRN_PA6T_IMA1);
+SYSFS_PMCSETUP(ima2, SPRN_PA6T_IMA2);
+SYSFS_PMCSETUP(ima3, SPRN_PA6T_IMA3);
+SYSFS_PMCSETUP(ima4, SPRN_PA6T_IMA4);
+SYSFS_PMCSETUP(ima5, SPRN_PA6T_IMA5);
+SYSFS_PMCSETUP(ima6, SPRN_PA6T_IMA6);
+SYSFS_PMCSETUP(ima7, SPRN_PA6T_IMA7);
+SYSFS_PMCSETUP(ima8, SPRN_PA6T_IMA8);
+SYSFS_PMCSETUP(ima9, SPRN_PA6T_IMA9);
+SYSFS_PMCSETUP(imaat, SPRN_PA6T_IMAAT);
+SYSFS_PMCSETUP(btcr, SPRN_PA6T_BTCR);
+SYSFS_PMCSETUP(pccr, SPRN_PA6T_PCCR);
+SYSFS_PMCSETUP(rpccr, SPRN_PA6T_RPCCR);
+SYSFS_PMCSETUP(der, SPRN_PA6T_DER);
+SYSFS_PMCSETUP(mer, SPRN_PA6T_MER);
+SYSFS_PMCSETUP(ber, SPRN_PA6T_BER);
+SYSFS_PMCSETUP(ier, SPRN_PA6T_IER);
+SYSFS_PMCSETUP(sier, SPRN_PA6T_SIER);
+SYSFS_PMCSETUP(siar, SPRN_PA6T_SIAR);
+SYSFS_PMCSETUP(tsr0, SPRN_PA6T_TSR0);
+SYSFS_PMCSETUP(tsr1, SPRN_PA6T_TSR1);
+SYSFS_PMCSETUP(tsr2, SPRN_PA6T_TSR2);
+SYSFS_PMCSETUP(tsr3, SPRN_PA6T_TSR3);
+#endif /* CONFIG_DEBUG_KERNEL */
 
 static SYSDEV_ATTR(mmcra, 0600, show_mmcra, store_mmcra);
 static SYSDEV_ATTR(spurr, 0600, show_spurr, NULL);
@@ -228,6 +258,36 @@ static struct sysdev_attribute pa6t_attrs[] = {
        _SYSDEV_ATTR(pmc3, 0600, show_pa6t_pmc3, store_pa6t_pmc3),
        _SYSDEV_ATTR(pmc4, 0600, show_pa6t_pmc4, store_pa6t_pmc4),
        _SYSDEV_ATTR(pmc5, 0600, show_pa6t_pmc5, store_pa6t_pmc5),
+#ifdef CONFIG_DEBUG_KERNEL
+       _SYSDEV_ATTR(hid0, 0600, show_hid0, store_hid0),
+       _SYSDEV_ATTR(hid1, 0600, show_hid1, store_hid1),
+       _SYSDEV_ATTR(hid4, 0600, show_hid4, store_hid4),
+       _SYSDEV_ATTR(hid5, 0600, show_hid5, store_hid5),
+       _SYSDEV_ATTR(ima0, 0600, show_ima0, store_ima0),
+       _SYSDEV_ATTR(ima1, 0600, show_ima1, store_ima1),
+       _SYSDEV_ATTR(ima2, 0600, show_ima2, store_ima2),
+       _SYSDEV_ATTR(ima3, 0600, show_ima3, store_ima3),
+       _SYSDEV_ATTR(ima4, 0600, show_ima4, store_ima4),
+       _SYSDEV_ATTR(ima5, 0600, show_ima5, store_ima5),
+       _SYSDEV_ATTR(ima6, 0600, show_ima6, store_ima6),
+       _SYSDEV_ATTR(ima7, 0600, show_ima7, store_ima7),
+       _SYSDEV_ATTR(ima8, 0600, show_ima8, store_ima8),
+       _SYSDEV_ATTR(ima9, 0600, show_ima9, store_ima9),
+       _SYSDEV_ATTR(imaat, 0600, show_imaat, store_imaat),
+       _SYSDEV_ATTR(btcr, 0600, show_btcr, store_btcr),
+       _SYSDEV_ATTR(pccr, 0600, show_pccr, store_pccr),
+       _SYSDEV_ATTR(rpccr, 0600, show_rpccr, store_rpccr),
+       _SYSDEV_ATTR(der, 0600, show_der, store_der),
+       _SYSDEV_ATTR(mer, 0600, show_mer, store_mer),
+       _SYSDEV_ATTR(ber, 0600, show_ber, store_ber),
+       _SYSDEV_ATTR(ier, 0600, show_ier, store_ier),
+       _SYSDEV_ATTR(sier, 0600, show_sier, store_sier),
+       _SYSDEV_ATTR(siar, 0600, show_siar, store_siar),
+       _SYSDEV_ATTR(tsr0, 0600, show_tsr0, store_tsr0),
+       _SYSDEV_ATTR(tsr1, 0600, show_tsr1, store_tsr1),
+       _SYSDEV_ATTR(tsr2, 0600, show_tsr2, store_tsr2),
+       _SYSDEV_ATTR(tsr3, 0600, show_tsr3, store_tsr3),
+#endif /* CONFIG_DEBUG_KERNEL */
 };
 
 
@@ -380,12 +440,14 @@ int cpu_add_sysdev_attr_group(struct attribute_group *attrs)
 {
        int cpu;
        struct sys_device *sysdev;
+       int ret;
 
        mutex_lock(&cpu_mutex);
 
        for_each_possible_cpu(cpu) {
                sysdev = get_cpu_sysdev(cpu);
-               sysfs_create_group(&sysdev->kobj, attrs);
+               ret = sysfs_create_group(&sysdev->kobj, attrs);
+               WARN_ON(ret != 0);
        }
 
        mutex_unlock(&cpu_mutex);
index 579de70e0b4dc3d32f473576ee8cc125b0406a57..93219c34af327b3e113a344485310b8f2923a879 100644 (file)
@@ -39,6 +39,8 @@
 #ifdef CONFIG_PPC64
 #define sys_sigpending sys_ni_syscall
 #define sys_old_getrlimit sys_ni_syscall
+
+       .p2align        3
 #endif
 
 _GLOBAL(sys_call_table)
index c627cf86d1e3d1c7ae4501cdb1057f8d81522f25..9368da371f3691c86af57bb34adbd1d6a995ed94 100644 (file)
 #include <asm/div64.h>
 #include <asm/smp.h>
 #include <asm/vdso_datapage.h>
-#ifdef CONFIG_PPC64
 #include <asm/firmware.h>
-#endif
 #ifdef CONFIG_PPC_ISERIES
 #include <asm/iseries/it_lp_queue.h>
 #include <asm/iseries/hv_call_xm.h>
 #endif
-#include <asm/smp.h>
 
-/* keep track of when we need to update the rtc */
-time_t last_rtc_update;
+/* powerpc clocksource/clockevent code */
+
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+
+static cycle_t rtc_read(void);
+static struct clocksource clocksource_rtc = {
+       .name         = "rtc",
+       .rating       = 400,
+       .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
+       .mask         = CLOCKSOURCE_MASK(64),
+       .shift        = 22,
+       .mult         = 0,      /* To be filled in */
+       .read         = rtc_read,
+};
+
+static cycle_t timebase_read(void);
+static struct clocksource clocksource_timebase = {
+       .name         = "timebase",
+       .rating       = 400,
+       .flags        = CLOCK_SOURCE_IS_CONTINUOUS,
+       .mask         = CLOCKSOURCE_MASK(64),
+       .shift        = 22,
+       .mult         = 0,      /* To be filled in */
+       .read         = timebase_read,
+};
+
+#define DECREMENTER_MAX        0x7fffffff
+
+static int decrementer_set_next_event(unsigned long evt,
+                                     struct clock_event_device *dev);
+static void decrementer_set_mode(enum clock_event_mode mode,
+                                struct clock_event_device *dev);
+
+static struct clock_event_device decrementer_clockevent = {
+       .name           = "decrementer",
+       .rating         = 200,
+       .shift          = 16,
+       .mult           = 0,    /* To be filled in */
+       .irq            = 0,
+       .set_next_event = decrementer_set_next_event,
+       .set_mode       = decrementer_set_mode,
+       .features       = CLOCK_EVT_FEAT_ONESHOT,
+};
+
+static DEFINE_PER_CPU(struct clock_event_device, decrementers);
+void init_decrementer_clockevent(void);
+static DEFINE_PER_CPU(u64, decrementer_next_tb);
+
 #ifdef CONFIG_PPC_ISERIES
 static unsigned long __initdata iSeries_recal_titan;
 static signed long __initdata iSeries_recal_tb;
-#endif
 
-/* The decrementer counts down by 128 every 128ns on a 601. */
-#define DECREMENTER_COUNT_601  (1000000000 / HZ)
+/* Forward declaration is only needed for iSereis compiles */
+void __init clocksource_init(void);
+#endif
 
 #define XSEC_PER_SEC (1024*1024)
 
@@ -349,98 +393,6 @@ void udelay(unsigned long usecs)
 }
 EXPORT_SYMBOL(udelay);
 
-static __inline__ void timer_check_rtc(void)
-{
-        /*
-         * update the rtc when needed, this should be performed on the
-         * right fraction of a second. Half or full second ?
-         * Full second works on mk48t59 clocks, others need testing.
-         * Note that this update is basically only used through 
-         * the adjtimex system calls. Setting the HW clock in
-         * any other way is a /dev/rtc and userland business.
-         * This is still wrong by -0.5/+1.5 jiffies because of the
-         * timer interrupt resolution and possible delay, but here we 
-         * hit a quantization limit which can only be solved by higher
-         * resolution timers and decoupling time management from timer
-         * interrupts. This is also wrong on the clocks
-         * which require being written at the half second boundary.
-         * We should have an rtc call that only sets the minutes and
-         * seconds like on Intel to avoid problems with non UTC clocks.
-         */
-        if (ppc_md.set_rtc_time && ntp_synced() &&
-           xtime.tv_sec - last_rtc_update >= 659 &&
-           abs((xtime.tv_nsec/1000) - (1000000-1000000/HZ)) < 500000/HZ) {
-               struct rtc_time tm;
-               to_tm(xtime.tv_sec + 1 + timezone_offset, &tm);
-               tm.tm_year -= 1900;
-               tm.tm_mon -= 1;
-               if (ppc_md.set_rtc_time(&tm) == 0)
-                       last_rtc_update = xtime.tv_sec + 1;
-               else
-                       /* Try again one minute later */
-                       last_rtc_update += 60;
-        }
-}
-
-/*
- * This version of gettimeofday has microsecond resolution.
- */
-static inline void __do_gettimeofday(struct timeval *tv)
-{
-       unsigned long sec, usec;
-       u64 tb_ticks, xsec;
-       struct gettimeofday_vars *temp_varp;
-       u64 temp_tb_to_xs, temp_stamp_xsec;
-
-       /*
-        * These calculations are faster (gets rid of divides)
-        * if done in units of 1/2^20 rather than microseconds.
-        * The conversion to microseconds at the end is done
-        * without a divide (and in fact, without a multiply)
-        */
-       temp_varp = do_gtod.varp;
-
-       /* Sampling the time base must be done after loading
-        * do_gtod.varp in order to avoid racing with update_gtod.
-        */
-       data_barrier(temp_varp);
-       tb_ticks = get_tb() - temp_varp->tb_orig_stamp;
-       temp_tb_to_xs = temp_varp->tb_to_xs;
-       temp_stamp_xsec = temp_varp->stamp_xsec;
-       xsec = temp_stamp_xsec + mulhdu(tb_ticks, temp_tb_to_xs);
-       sec = xsec / XSEC_PER_SEC;
-       usec = (unsigned long)xsec & (XSEC_PER_SEC - 1);
-       usec = SCALE_XSEC(usec, 1000000);
-
-       tv->tv_sec = sec;
-       tv->tv_usec = usec;
-}
-
-void do_gettimeofday(struct timeval *tv)
-{
-       if (__USE_RTC()) {
-               /* do this the old way */
-               unsigned long flags, seq;
-               unsigned int sec, nsec, usec;
-
-               do {
-                       seq = read_seqbegin_irqsave(&xtime_lock, flags);
-                       sec = xtime.tv_sec;
-                       nsec = xtime.tv_nsec + tb_ticks_since(tb_last_jiffy);
-               } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
-               usec = nsec / 1000;
-               while (usec >= 1000000) {
-                       usec -= 1000000;
-                       ++sec;
-               }
-               tv->tv_sec = sec;
-               tv->tv_usec = usec;
-               return;
-       }
-       __do_gettimeofday(tv);
-}
-
-EXPORT_SYMBOL(do_gettimeofday);
 
 /*
  * There are two copies of tb_to_xs and stamp_xsec so that no
@@ -486,56 +438,6 @@ static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
        ++(vdso_data->tb_update_count);
 }
 
-/*
- * When the timebase - tb_orig_stamp gets too big, we do a manipulation
- * between tb_orig_stamp and stamp_xsec. The goal here is to keep the
- * difference tb - tb_orig_stamp small enough to always fit inside a
- * 32 bits number. This is a requirement of our fast 32 bits userland
- * implementation in the vdso. If we "miss" a call to this function
- * (interrupt latency, CPU locked in a spinlock, ...) and we end up
- * with a too big difference, then the vdso will fallback to calling
- * the syscall
- */
-static __inline__ void timer_recalc_offset(u64 cur_tb)
-{
-       unsigned long offset;
-       u64 new_stamp_xsec;
-       u64 tlen, t2x;
-       u64 tb, xsec_old, xsec_new;
-       struct gettimeofday_vars *varp;
-
-       if (__USE_RTC())
-               return;
-       tlen = current_tick_length();
-       offset = cur_tb - do_gtod.varp->tb_orig_stamp;
-       if (tlen == last_tick_len && offset < 0x80000000u)
-               return;
-       if (tlen != last_tick_len) {
-               t2x = mulhdu(tlen << TICKLEN_SHIFT, ticklen_to_xs);
-               last_tick_len = tlen;
-       } else
-               t2x = do_gtod.varp->tb_to_xs;
-       new_stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
-       do_div(new_stamp_xsec, 1000000000);
-       new_stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
-
-       ++vdso_data->tb_update_count;
-       smp_mb();
-
-       /*
-        * Make sure time doesn't go backwards for userspace gettimeofday.
-        */
-       tb = get_tb();
-       varp = do_gtod.varp;
-       xsec_old = mulhdu(tb - varp->tb_orig_stamp, varp->tb_to_xs)
-               + varp->stamp_xsec;
-       xsec_new = mulhdu(tb - cur_tb, t2x) + new_stamp_xsec;
-       if (xsec_new < xsec_old)
-               new_stamp_xsec += xsec_old - xsec_new;
-
-       update_gtod(cur_tb, new_stamp_xsec, t2x);
-}
-
 #ifdef CONFIG_SMP
 unsigned long profile_pc(struct pt_regs *regs)
 {
@@ -607,6 +509,8 @@ static int __init iSeries_tb_recal(void)
        iSeries_recal_titan = titan;
        iSeries_recal_tb = tb;
 
+       /* Called here as now we know accurate values for the timebase */
+       clocksource_init();
        return 0;
 }
 late_initcall(iSeries_tb_recal);
@@ -636,20 +540,30 @@ void __init iSeries_time_init_early(void)
 void timer_interrupt(struct pt_regs * regs)
 {
        struct pt_regs *old_regs;
-       int next_dec;
        int cpu = smp_processor_id();
-       unsigned long ticks;
-       u64 tb_next_jiffy;
+       struct clock_event_device *evt = &per_cpu(decrementers, cpu);
+       u64 now;
+
+       /* Ensure a positive value is written to the decrementer, or else
+        * some CPUs will continuue to take decrementer exceptions */
+       set_dec(DECREMENTER_MAX);
 
 #ifdef CONFIG_PPC32
        if (atomic_read(&ppc_n_lost_interrupts) != 0)
                do_IRQ(regs);
 #endif
 
+       now = get_tb_or_rtc();
+       if (now < per_cpu(decrementer_next_tb, cpu)) {
+               /* not time for this event yet */
+               now = per_cpu(decrementer_next_tb, cpu) - now;
+               if (now <= DECREMENTER_MAX)
+                       set_dec((unsigned int)now - 1);
+               return;
+       }
        old_regs = set_irq_regs(regs);
        irq_enter();
 
-       profile_tick(CPU_PROFILING);
        calculate_steal_time();
 
 #ifdef CONFIG_PPC_ISERIES
@@ -657,46 +571,20 @@ void timer_interrupt(struct pt_regs * regs)
                get_lppaca()->int_dword.fields.decr_int = 0;
 #endif
 
-       while ((ticks = tb_ticks_since(per_cpu(last_jiffy, cpu)))
-              >= tb_ticks_per_jiffy) {
-               /* Update last_jiffy */
-               per_cpu(last_jiffy, cpu) += tb_ticks_per_jiffy;
-               /* Handle RTCL overflow on 601 */
-               if (__USE_RTC() && per_cpu(last_jiffy, cpu) >= 1000000000)
-                       per_cpu(last_jiffy, cpu) -= 1000000000;
-
-               /*
-                * We cannot disable the decrementer, so in the period
-                * between this cpu's being marked offline in cpu_online_map
-                * and calling stop-self, it is taking timer interrupts.
-                * Avoid calling into the scheduler rebalancing code if this
-                * is the case.
-                */
-               if (!cpu_is_offline(cpu))
-                       account_process_time(regs);
-
-               /*
-                * No need to check whether cpu is offline here; boot_cpuid
-                * should have been fixed up by now.
-                */
-               if (cpu != boot_cpuid)
-                       continue;
+       /*
+        * We cannot disable the decrementer, so in the period
+        * between this cpu's being marked offline in cpu_online_map
+        * and calling stop-self, it is taking timer interrupts.
+        * Avoid calling into the scheduler rebalancing code if this
+        * is the case.
+        */
+       if (!cpu_is_offline(cpu))
+               account_process_time(regs);
 
-               write_seqlock(&xtime_lock);
-               tb_next_jiffy = tb_last_jiffy + tb_ticks_per_jiffy;
-               if (__USE_RTC() && tb_next_jiffy >= 1000000000)
-                       tb_next_jiffy -= 1000000000;
-               if (per_cpu(last_jiffy, cpu) >= tb_next_jiffy) {
-                       tb_last_jiffy = tb_next_jiffy;
-                       do_timer(1);
-                       timer_recalc_offset(tb_last_jiffy);
-                       timer_check_rtc();
-               }
-               write_sequnlock(&xtime_lock);
-       }
-       
-       next_dec = tb_ticks_per_jiffy - ticks;
-       set_dec(next_dec);
+       if (evt->event_handler)
+               evt->event_handler(evt);
+       else
+               evt->set_next_event(DECREMENTER_MAX, evt);
 
 #ifdef CONFIG_PPC_ISERIES
        if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending())
@@ -762,71 +650,6 @@ unsigned long long sched_clock(void)
        return mulhdu(get_tb() - boot_tb, tb_to_ns_scale) << tb_to_ns_shift;
 }
 
-int do_settimeofday(struct timespec *tv)
-{
-       time_t wtm_sec, new_sec = tv->tv_sec;
-       long wtm_nsec, new_nsec = tv->tv_nsec;
-       unsigned long flags;
-       u64 new_xsec;
-       unsigned long tb_delta;
-
-       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-               return -EINVAL;
-
-       write_seqlock_irqsave(&xtime_lock, flags);
-
-       /*
-        * Updating the RTC is not the job of this code. If the time is
-        * stepped under NTP, the RTC will be updated after STA_UNSYNC
-        * is cleared.  Tools like clock/hwclock either copy the RTC
-        * to the system time, in which case there is no point in writing
-        * to the RTC again, or write to the RTC but then they don't call
-        * settimeofday to perform this operation.
-        */
-
-       /* Make userspace gettimeofday spin until we're done. */
-       ++vdso_data->tb_update_count;
-       smp_mb();
-
-       /*
-        * Subtract off the number of nanoseconds since the
-        * beginning of the last tick.
-        */
-       tb_delta = tb_ticks_since(tb_last_jiffy);
-       tb_delta = mulhdu(tb_delta, do_gtod.varp->tb_to_xs); /* in xsec */
-       new_nsec -= SCALE_XSEC(tb_delta, 1000000000);
-
-       wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - new_sec);
-       wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - new_nsec);
-
-       set_normalized_timespec(&xtime, new_sec, new_nsec);
-       set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-
-       /* In case of a large backwards jump in time with NTP, we want the 
-        * clock to be updated as soon as the PLL is again in lock.
-        */
-       last_rtc_update = new_sec - 658;
-
-       ntp_clear();
-
-       new_xsec = xtime.tv_nsec;
-       if (new_xsec != 0) {
-               new_xsec *= XSEC_PER_SEC;
-               do_div(new_xsec, NSEC_PER_SEC);
-       }
-       new_xsec += (u64)xtime.tv_sec * XSEC_PER_SEC;
-       update_gtod(tb_last_jiffy, new_xsec, do_gtod.varp->tb_to_xs);
-
-       vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
-       vdso_data->tz_dsttime = sys_tz.tz_dsttime;
-
-       write_sequnlock_irqrestore(&xtime_lock, flags);
-       clock_was_set();
-       return 0;
-}
-
-EXPORT_SYMBOL(do_settimeofday);
-
 static int __init get_freq(char *name, int cells, unsigned long *val)
 {
        struct device_node *cpu;
@@ -869,7 +692,7 @@ void __init generic_calibrate_decr(void)
                                "(not found)\n");
        }
 
-#ifdef CONFIG_BOOKE
+#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
        /* Set the time base to zero */
        mtspr(SPRN_TBWL, 0);
        mtspr(SPRN_TBWU, 0);
@@ -882,12 +705,35 @@ void __init generic_calibrate_decr(void)
 #endif
 }
 
-unsigned long get_boot_time(void)
+int update_persistent_clock(struct timespec now)
 {
        struct rtc_time tm;
 
-       if (ppc_md.get_boot_time)
-               return ppc_md.get_boot_time();
+       if (!ppc_md.set_rtc_time)
+               return 0;
+
+       to_tm(now.tv_sec + 1 + timezone_offset, &tm);
+       tm.tm_year -= 1900;
+       tm.tm_mon -= 1;
+
+       return ppc_md.set_rtc_time(&tm);
+}
+
+unsigned long read_persistent_clock(void)
+{
+       struct rtc_time tm;
+       static int first = 1;
+
+       /* XXX this is a litle fragile but will work okay in the short term */
+       if (first) {
+               first = 0;
+               if (ppc_md.time_init)
+                       timezone_offset = ppc_md.time_init();
+
+               /* get_boot_time() isn't guaranteed to be safe to call late */
+               if (ppc_md.get_boot_time)
+                       return ppc_md.get_boot_time() -timezone_offset;
+       }
        if (!ppc_md.get_rtc_time)
                return 0;
        ppc_md.get_rtc_time(&tm);
@@ -895,18 +741,128 @@ unsigned long get_boot_time(void)
                      tm.tm_hour, tm.tm_min, tm.tm_sec);
 }
 
+/* clocksource code */
+static cycle_t rtc_read(void)
+{
+       return (cycle_t)get_rtc();
+}
+
+static cycle_t timebase_read(void)
+{
+       return (cycle_t)get_tb();
+}
+
+void update_vsyscall(struct timespec *wall_time, struct clocksource *clock)
+{
+       u64 t2x, stamp_xsec;
+
+       if (clock != &clocksource_timebase)
+               return;
+
+       /* Make userspace gettimeofday spin until we're done. */
+       ++vdso_data->tb_update_count;
+       smp_mb();
+
+       /* XXX this assumes clock->shift == 22 */
+       /* 4611686018 ~= 2^(20+64-22) / 1e9 */
+       t2x = (u64) clock->mult * 4611686018ULL;
+       stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
+       do_div(stamp_xsec, 1000000000);
+       stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
+       update_gtod(clock->cycle_last, stamp_xsec, t2x);
+}
+
+void update_vsyscall_tz(void)
+{
+       /* Make userspace gettimeofday spin until we're done. */
+       ++vdso_data->tb_update_count;
+       smp_mb();
+       vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
+       vdso_data->tz_dsttime = sys_tz.tz_dsttime;
+       smp_mb();
+       ++vdso_data->tb_update_count;
+}
+
+void __init clocksource_init(void)
+{
+       struct clocksource *clock;
+
+       if (__USE_RTC())
+               clock = &clocksource_rtc;
+       else
+               clock = &clocksource_timebase;
+
+       clock->mult = clocksource_hz2mult(tb_ticks_per_sec, clock->shift);
+
+       if (clocksource_register(clock)) {
+               printk(KERN_ERR "clocksource: %s is already registered\n",
+                      clock->name);
+               return;
+       }
+
+       printk(KERN_INFO "clocksource: %s mult[%x] shift[%d] registered\n",
+              clock->name, clock->mult, clock->shift);
+}
+
+static int decrementer_set_next_event(unsigned long evt,
+                                     struct clock_event_device *dev)
+{
+       __get_cpu_var(decrementer_next_tb) = get_tb_or_rtc() + evt;
+       /* The decrementer interrupts on the 0 -> -1 transition */
+       if (evt)
+               --evt;
+       set_dec(evt);
+       return 0;
+}
+
+static void decrementer_set_mode(enum clock_event_mode mode,
+                                struct clock_event_device *dev)
+{
+       if (mode != CLOCK_EVT_MODE_ONESHOT)
+               decrementer_set_next_event(DECREMENTER_MAX, dev);
+}
+
+static void register_decrementer_clockevent(int cpu)
+{
+       struct clock_event_device *dec = &per_cpu(decrementers, cpu);
+
+       *dec = decrementer_clockevent;
+       dec->cpumask = cpumask_of_cpu(cpu);
+
+       printk(KERN_ERR "clockevent: %s mult[%lx] shift[%d] cpu[%d]\n",
+              dec->name, dec->mult, dec->shift, cpu);
+
+       clockevents_register_device(dec);
+}
+
+void init_decrementer_clockevent(void)
+{
+       int cpu = smp_processor_id();
+
+       decrementer_clockevent.mult = div_sc(ppc_tb_freq, NSEC_PER_SEC,
+                                            decrementer_clockevent.shift);
+       decrementer_clockevent.max_delta_ns =
+               clockevent_delta2ns(DECREMENTER_MAX, &decrementer_clockevent);
+       decrementer_clockevent.min_delta_ns = 1000;
+
+       register_decrementer_clockevent(cpu);
+}
+
+void secondary_cpu_time_init(void)
+{
+       /* FIME: Should make unrelatred change to move snapshot_timebase
+        * call here ! */
+       register_decrementer_clockevent(smp_processor_id());
+}
+
 /* This function is only called on the boot processor */
 void __init time_init(void)
 {
        unsigned long flags;
-       unsigned long tm = 0;
        struct div_result res;
        u64 scale, x;
        unsigned shift;
 
-        if (ppc_md.time_init != NULL)
-                timezone_offset = ppc_md.time_init();
-
        if (__USE_RTC()) {
                /* 601 processor: dec counts down by 128 every 128ns */
                ppc_tb_freq = 1000000000;
@@ -981,19 +937,14 @@ void __init time_init(void)
        /* Save the current timebase to pretty up CONFIG_PRINTK_TIME */
        boot_tb = get_tb_or_rtc();
 
-       tm = get_boot_time();
-
        write_seqlock_irqsave(&xtime_lock, flags);
 
        /* If platform provided a timezone (pmac), we correct the time */
         if (timezone_offset) {
                sys_tz.tz_minuteswest = -timezone_offset / 60;
                sys_tz.tz_dsttime = 0;
-               tm -= timezone_offset;
         }
 
-       xtime.tv_sec = tm;
-       xtime.tv_nsec = 0;
        do_gtod.varp = &do_gtod.vars[0];
        do_gtod.var_idx = 0;
        do_gtod.varp->tb_orig_stamp = tb_last_jiffy;
@@ -1011,13 +962,13 @@ void __init time_init(void)
 
        time_freq = 0;
 
-       last_rtc_update = xtime.tv_sec;
-       set_normalized_timespec(&wall_to_monotonic,
-                               -xtime.tv_sec, -xtime.tv_nsec);
        write_sequnlock_irqrestore(&xtime_lock, flags);
 
-       /* Not exact, but the timer interrupt takes care of this */
-       set_dec(tb_ticks_per_jiffy);
+       /* Register the clocksource, if we're not running on iSeries */
+       if (!firmware_has_feature(FW_FEATURE_ISERIES))
+               clocksource_init();
+
+       init_decrementer_clockevent();
 }
 
 
index d8502e3775188a2cb76eead66f79dca99fbe0211..bf9e39c6e296209f0f6bc8f5f08c35286df279d4 100644 (file)
@@ -172,11 +172,21 @@ int die(const char *str, struct pt_regs *regs, long err)
 void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
 {
        siginfo_t info;
+       const char fmt32[] = KERN_INFO "%s[%d]: unhandled signal %d " \
+                       "at %08lx nip %08lx lr %08lx code %x\n";
+       const char fmt64[] = KERN_INFO "%s[%d]: unhandled signal %d " \
+                       "at %016lx nip %016lx lr %016lx code %x\n";
 
        if (!user_mode(regs)) {
                if (die("Exception in kernel mode", regs, signr))
                        return;
-       }
+       } else if (show_unhandled_signals &&
+                   unhandled_signal(current, signr) &&
+                   printk_ratelimit()) {
+                       printk(regs->msr & MSR_SF ? fmt64 : fmt32,
+                               current->comm, current->pid, signr,
+                               addr, regs->nip, regs->link, code);
+               }
 
        memset(&info, 0, sizeof(info));
        info.si_signo = signr;
@@ -324,47 +334,10 @@ static inline int check_io_access(struct pt_regs *regs)
 #define clear_single_step(regs)        ((regs)->msr &= ~MSR_SE)
 #endif
 
-/*
- * This is "fall-back" implementation for configurations
- * which don't provide platform-specific machine check info
- */
-void __attribute__ ((weak))
-platform_machine_check(struct pt_regs *regs)
-{
-}
-
-void machine_check_exception(struct pt_regs *regs)
+static int generic_machine_check_exception(struct pt_regs *regs)
 {
-       int recover = 0;
        unsigned long reason = get_mc_reason(regs);
 
-       /* See if any machine dependent calls */
-       if (ppc_md.machine_check_exception)
-               recover = ppc_md.machine_check_exception(regs);
-
-       if (recover)
-               return;
-
-       if (user_mode(regs)) {
-               regs->msr |= MSR_RI;
-               _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
-               return;
-       }
-
-#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
-       /* the qspan pci read routines can cause machine checks -- Cort */
-       bad_page_fault(regs, regs->dar, SIGBUS);
-       return;
-#endif
-
-       if (debugger_fault_handler(regs)) {
-               regs->msr |= MSR_RI;
-               return;
-       }
-
-       if (check_io_access(regs))
-               return;
-
 #if defined(CONFIG_4xx) && !defined(CONFIG_440A)
        if (reason & ESR_IMCP) {
                printk("Instruction");
@@ -480,11 +453,41 @@ void machine_check_exception(struct pt_regs *regs)
        }
 #endif /* CONFIG_4xx */
 
-       /*
-        * Optional platform-provided routine to print out
-        * additional info, e.g. bus error registers.
-        */
-       platform_machine_check(regs);
+       return 0;
+}
+
+void machine_check_exception(struct pt_regs *regs)
+{
+       int recover = 0;
+
+       /* See if any machine dependent calls */
+       if (ppc_md.machine_check_exception)
+               recover = ppc_md.machine_check_exception(regs);
+       else
+               recover = generic_machine_check_exception(regs);
+
+       if (recover)
+               return;
+
+       if (user_mode(regs)) {
+               regs->msr |= MSR_RI;
+               _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
+               return;
+       }
+
+#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
+       /* the qspan pci read routines can cause machine checks -- Cort */
+       bad_page_fault(regs, regs->dar, SIGBUS);
+       return;
+#endif
+
+       if (debugger_fault_handler(regs)) {
+               regs->msr |= MSR_RI;
+               return;
+       }
+
+       if (check_io_access(regs))
+               return;
 
        if (debugger_fault_handler(regs))
                return;
@@ -913,7 +916,9 @@ void SoftwareEmulation(struct pt_regs *regs)
 {
        extern int do_mathemu(struct pt_regs *);
        extern int Soft_emulate_8xx(struct pt_regs *);
+#if defined(CONFIG_MATH_EMULATION) || defined(CONFIG_8XX_MINIMAL_FPEMU)
        int errcode;
+#endif
 
        CHECK_FULL_REGS(regs);
 
@@ -943,7 +948,7 @@ void SoftwareEmulation(struct pt_regs *regs)
                return;
        }
 
-#else
+#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
        errcode = Soft_emulate_8xx(regs);
        switch (errcode) {
        case 0:
@@ -956,6 +961,8 @@ void SoftwareEmulation(struct pt_regs *regs)
                _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
                return;
        }
+#else
+       _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
 #endif
 }
 #endif /* CONFIG_8xx */
index 0f9b4eadfbcbebaa27a60d369730f8b972284aa5..d723070c9a33aaec3774dc2444b787c6f2f75b46 100644 (file)
@@ -54,6 +54,8 @@ void __init udbg_early_init(void)
 #elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
        /* PPC44x debug */
        udbg_init_44x_as1();
+#elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
+       udbg_init_cpm();
 #endif
 }
 
index 7afab5bcd61abbba9c656ce012dd3b7b9b464375..833a3d0bcfa7ad197b71729a1bbb8058d3d0e1b9 100644 (file)
@@ -206,11 +206,22 @@ static void udbg_44x_as1_putc(char c)
        }
 }
 
+static int udbg_44x_as1_getc(void)
+{
+       if (udbg_comport) {
+               while ((as1_readb(&udbg_comport->lsr) & LSR_DR) == 0)
+                       ; /* wait for char */
+               return as1_readb(&udbg_comport->rbr);
+       }
+       return -1;
+}
+
 void __init udbg_init_44x_as1(void)
 {
        udbg_comport =
                (volatile struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
 
        udbg_putc = udbg_44x_as1_putc;
+       udbg_getc = udbg_44x_as1_getc;
 }
 #endif /* CONFIG_PPC_EARLY_DEBUG_44x */
index 213fa31ac53785155b4293536b198437e6457182..2322ba5cce4ce23c3eca48336686518671d05283 100644 (file)
@@ -766,7 +766,9 @@ static int __init vdso_init(void)
 
        return 0;
 }
+#ifdef CONFIG_PPC_MERGE
 arch_initcall(vdso_init);
+#endif
 
 int in_gate_area_no_task(unsigned long addr)
 {
index e45fba9d0ced3265e3bbffbf528959e12c225b41..fea5809857a51e20ae72aab9b3fdcff24d270227 100644 (file)
@@ -1 +1,2 @@
 vdso32.lds
+vdso32.so.dbg
index 3726358faae88444f8603c7a8cc8f0b394095846..c3d57bd01a88ab2157b5ae92ca9fd34561d9008f 100644 (file)
@@ -9,11 +9,11 @@ ifeq ($(CONFIG_PPC32),y)
 CROSS32CC := $(CC)
 endif
 
-targets := $(obj-vdso32) vdso32.so
+targets := $(obj-vdso32) vdso32.so vdso32.so.dbg
 obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
 
 
-EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
+EXTRA_CFLAGS := -shared -fno-common -fno-builtin
 EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso32.so.1 \
                $(call ld-option, -Wl$(comma)--hash-style=sysv)
 EXTRA_AFLAGS := -D__VDSO32__ -s
@@ -26,9 +26,14 @@ CPPFLAGS_vdso32.lds += -P -C -Upowerpc
 $(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
 
 # link rule for the .so file, .lds has to be first
-$(obj)/vdso32.so: $(src)/vdso32.lds $(obj-vdso32)
+$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32)
        $(call if_changed,vdso32ld)
 
+# strip rule for the .so file
+$(obj)/%.so: OBJCOPYFLAGS := -S
+$(obj)/%.so: $(obj)/%.so.dbg FORCE
+       $(call if_changed,objcopy)
+
 # assembly rules for the .S files
 $(obj-vdso32): %.o: %.S
        $(call if_changed_dep,vdso32as)
@@ -39,3 +44,12 @@ quiet_cmd_vdso32ld = VDSO32L $@
 quiet_cmd_vdso32as = VDSO32A $@
       cmd_vdso32as = $(CROSS32CC) $(a_flags) -c -o $@ $<
 
+# install commands for the unstripped file
+quiet_cmd_vdso_install = INSTALL $@
+      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
+
+vdso32.so: $(obj)/vdso32.so.dbg
+       @mkdir -p $(MODLIB)/vdso
+       $(call cmd,vdso_install)
+
+vdso_install: vdso32.so
index 3fd18cf9fec2bce4e8886a6b528f0495b365a898..77a0b423642ccf0f5144ee4dbfb0459d3a8fb142 100644 (file)
@@ -1 +1,2 @@
 vdso64.lds
+vdso64.so.dbg
index 43af9b2a6f3bd21dc8b3d4f86faa7928f041648b..fa7f1b8f3e5024c2ed705837d728694ff56f15b7 100644 (file)
@@ -4,10 +4,10 @@ obj-vdso64 = sigtramp.o gettimeofday.o datapage.o cacheflush.o note.o
 
 # Build rules
 
-targets := $(obj-vdso64) vdso64.so
+targets := $(obj-vdso64) vdso64.so vdso64.so.dbg
 obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
 
-EXTRA_CFLAGS := -shared -s -fno-common -fno-builtin
+EXTRA_CFLAGS := -shared -fno-common -fno-builtin
 EXTRA_CFLAGS += -nostdlib -Wl,-soname=linux-vdso64.so.1 \
                $(call ld-option, -Wl$(comma)--hash-style=sysv)
 EXTRA_AFLAGS := -D__VDSO64__ -s
@@ -20,9 +20,14 @@ CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
 $(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
 
 # link rule for the .so file, .lds has to be first
-$(obj)/vdso64.so: $(src)/vdso64.lds $(obj-vdso64)
+$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64)
        $(call if_changed,vdso64ld)
 
+# strip rule for the .so file
+$(obj)/%.so: OBJCOPYFLAGS := -S
+$(obj)/%.so: $(obj)/%.so.dbg FORCE
+       $(call if_changed,objcopy)
+
 # assembly rules for the .S files
 $(obj-vdso64): %.o: %.S
        $(call if_changed_dep,vdso64as)
@@ -33,4 +38,12 @@ quiet_cmd_vdso64ld = VDSO64L $@
 quiet_cmd_vdso64as = VDSO64A $@
       cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
 
+# install commands for the unstripped file
+quiet_cmd_vdso_install = INSTALL $@
+      cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
+
+vdso64.so: $(obj)/vdso64.so.dbg
+       @mkdir -p $(MODLIB)/vdso
+       $(call cmd,vdso_install)
 
+vdso_install: vdso64.so
index 62c1bc12ea39431755d2001a2b93d300068179c9..cb22a3557c4e88303535336d8859eb2f0da69a7c 100644 (file)
@@ -39,6 +39,8 @@
 
 extern struct kset devices_subsys; /* needed for vio_find_name() */
 
+static struct bus_type vio_bus_type;
+
 static struct vio_dev vio_bus_device  = { /* fake "parent" device */
        .name = vio_bus_device.dev.bus_id,
        .type = "",
@@ -46,60 +48,33 @@ static struct vio_dev vio_bus_device  = { /* fake "parent" device */
        .dev.bus = &vio_bus_type,
 };
 
-#ifdef CONFIG_PPC_ISERIES
-struct device *iSeries_vio_dev = &vio_bus_device.dev;
-EXPORT_SYMBOL(iSeries_vio_dev);
+static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev)
+{
+       const unsigned char *dma_window;
+       struct iommu_table *tbl;
+       unsigned long offset, size;
 
-static struct iommu_table veth_iommu_table;
-static struct iommu_table vio_iommu_table;
+       if (firmware_has_feature(FW_FEATURE_ISERIES))
+               return vio_build_iommu_table_iseries(dev);
 
-static void __init iommu_vio_init(void)
-{
-       iommu_table_getparms_iSeries(255, 0, 0xff, &veth_iommu_table);
-       veth_iommu_table.it_size /= 2;
-       vio_iommu_table = veth_iommu_table;
-       vio_iommu_table.it_offset += veth_iommu_table.it_size;
-
-       if (!iommu_init_table(&veth_iommu_table, -1))
-               printk("Virtual Bus VETH TCE table failed.\n");
-       if (!iommu_init_table(&vio_iommu_table, -1))
-               printk("Virtual Bus VIO TCE table failed.\n");
-}
-#endif
+       dma_window = of_get_property(dev->dev.archdata.of_node,
+                                 "ibm,my-dma-window", NULL);
+       if (!dma_window)
+               return NULL;
 
-static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev)
-{
-#ifdef CONFIG_PPC_ISERIES
-       if (firmware_has_feature(FW_FEATURE_ISERIES)) {
-               if (strcmp(dev->type, "network") == 0)
-                       return &veth_iommu_table;
-               return &vio_iommu_table;
-       } else
-#endif
-       {
-               const unsigned char *dma_window;
-               struct iommu_table *tbl;
-               unsigned long offset, size;
-
-               dma_window = of_get_property(dev->dev.archdata.of_node,
-                                         "ibm,my-dma-window", NULL);
-               if (!dma_window)
-                       return NULL;
-
-               tbl = kmalloc(sizeof(*tbl), GFP_KERNEL);
-
-               of_parse_dma_window(dev->dev.archdata.of_node, dma_window,
-                                   &tbl->it_index, &offset, &size);
-
-               /* TCE table size - measured in tce entries */
-               tbl->it_size = size >> IOMMU_PAGE_SHIFT;
-               /* offset for VIO should always be 0 */
-               tbl->it_offset = offset >> IOMMU_PAGE_SHIFT;
-               tbl->it_busno = 0;
-               tbl->it_type = TCE_VB;
-
-               return iommu_init_table(tbl, -1);
-       }
+       tbl = kmalloc(sizeof(*tbl), GFP_KERNEL);
+
+       of_parse_dma_window(dev->dev.archdata.of_node, dma_window,
+                           &tbl->it_index, &offset, &size);
+
+       /* TCE table size - measured in tce entries */
+       tbl->it_size = size >> IOMMU_PAGE_SHIFT;
+       /* offset for VIO should always be 0 */
+       tbl->it_offset = offset >> IOMMU_PAGE_SHIFT;
+       tbl->it_busno = 0;
+       tbl->it_type = TCE_VB;
+
+       return iommu_init_table(tbl, -1);
 }
 
 /**
@@ -160,16 +135,6 @@ static int vio_bus_remove(struct device *dev)
        return 1;
 }
 
-/* convert from struct device to struct vio_dev and pass to driver. */
-static void vio_bus_shutdown(struct device *dev)
-{
-       struct vio_dev *viodev = to_vio_dev(dev);
-       struct vio_driver *viodrv = to_vio_driver(dev->driver);
-
-       if (dev->driver && viodrv->shutdown)
-               viodrv->shutdown(viodev);
-}
-
 /**
  * vio_register_driver: - Register a new vio driver
  * @drv:       The vio_driver structure to be registered.
@@ -282,15 +247,6 @@ static int __init vio_bus_init(void)
        int err;
        struct device_node *node_vroot;
 
-#ifdef CONFIG_PPC_ISERIES
-       if (firmware_has_feature(FW_FEATURE_ISERIES)) {
-               iommu_vio_init();
-               vio_bus_device.dev.archdata.dma_ops = &dma_iommu_ops;
-               vio_bus_device.dev.archdata.dma_data = &vio_iommu_table;
-               iSeries_vio_dev = &vio_bus_device.dev;
-       }
-#endif /* CONFIG_PPC_ISERIES */
-
        err = bus_register(&vio_bus_type);
        if (err) {
                printk(KERN_ERR "failed to register VIO bus\n");
@@ -317,11 +273,8 @@ static int __init vio_bus_init(void)
                 * the device tree. Drivers will associate with them later.
                 */
                for (of_node = node_vroot->child; of_node != NULL;
-                               of_node = of_node->sibling) {
-                       printk(KERN_DEBUG "%s: processing %p\n",
-                                       __FUNCTION__, of_node);
+                               of_node = of_node->sibling)
                        vio_register_device_node(of_node);
-               }
                of_node_put(node_vroot);
        }
 
@@ -391,14 +344,13 @@ static int vio_hotplug(struct device *dev, char **envp, int num_envp,
        return 0;
 }
 
-struct bus_type vio_bus_type = {
+static struct bus_type vio_bus_type = {
        .name = "vio",
        .dev_attrs = vio_dev_attrs,
        .uevent = vio_hotplug,
        .match = vio_bus_match,
        .probe = vio_bus_probe,
        .remove = vio_bus_remove,
-       .shutdown = vio_bus_shutdown,
 };
 
 /**
index 0c458556399fc9bc194ca37e834fcb2d72011b70..823a8cbd60b5bffd1025cff71ee2b56e0c751f76 100644 (file)
@@ -34,6 +34,8 @@ SECTIONS
 
        /* Text and gots */
        .text : {
+               ALIGN_FUNCTION();
+               *(.text.head)
                _text = .;
                TEXT_TEXT
                SCHED_TEXT
index 0a486d4b2547e98af054799435d11c2a9de25379..65d492e316a605f5a747addfd8f7c78812175d4b 100644 (file)
@@ -7,11 +7,12 @@ EXTRA_CFLAGS          += -mno-minimal-toc
 endif
 
 ifeq ($(CONFIG_PPC_MERGE),y)
-obj-y                  := string.o
-obj-$(CONFIG_PPC32)    += div64.o copy_32.o checksum_32.o
+obj-y                  := string.o alloc.o \
+                          checksum_$(CONFIG_WORD_SIZE).o
+obj-$(CONFIG_PPC32)    += div64.o copy_32.o
 endif
 
-obj-$(CONFIG_PPC64)    += checksum_64.o copypage_64.o copyuser_64.o \
+obj-$(CONFIG_PPC64)    += copypage_64.o copyuser_64.o \
                           memcpy_64.o usercopy_64.o mem_64.o string.o
 obj-$(CONFIG_QUICC_ENGINE) += rheap.o
 obj-$(CONFIG_XMON)     += sstep.o
diff --git a/arch/powerpc/lib/alloc.c b/arch/powerpc/lib/alloc.c
new file mode 100644 (file)
index 0000000..f53e09c
--- /dev/null
@@ -0,0 +1,29 @@
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/bootmem.h>
+#include <linux/string.h>
+
+#include <asm/system.h>
+
+void * __init_refok alloc_maybe_bootmem(size_t size, gfp_t mask)
+{
+       if (mem_init_done)
+               return kmalloc(size, mask);
+       else
+               return alloc_bootmem(size);
+}
+
+void * __init_refok zalloc_maybe_bootmem(size_t size, gfp_t mask)
+{
+       void *p;
+
+       if (mem_init_done)
+               p = kzalloc(size, mask);
+       else {
+               p = alloc_bootmem(size);
+               if (p)
+                       memset(p, 0, size);
+       }
+       return p;
+}
diff --git a/arch/powerpc/mm/40x_mmu.c b/arch/powerpc/mm/40x_mmu.c
new file mode 100644 (file)
index 0000000..e067df8
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * This file contains the routines for initializing the MMU
+ * on the 4xx series of chips.
+ *  -- paulus
+ *
+ *  Derived from arch/ppc/mm/init.c:
+ *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *
+ *  Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au)
+ *  and Cort Dougan (PReP) (cort@cs.nmt.edu)
+ *    Copyright (C) 1996 Paul Mackerras
+ *
+ *  Derived from "arch/i386/mm/init.c"
+ *    Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
+ *
+ *  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/signal.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/ptrace.h>
+#include <linux/mman.h>
+#include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/stddef.h>
+#include <linux/vmalloc.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/highmem.h>
+
+#include <asm/pgalloc.h>
+#include <asm/prom.h>
+#include <asm/io.h>
+#include <asm/mmu_context.h>
+#include <asm/pgtable.h>
+#include <asm/mmu.h>
+#include <asm/uaccess.h>
+#include <asm/smp.h>
+#include <asm/bootx.h>
+#include <asm/machdep.h>
+#include <asm/setup.h>
+#include "mmu_decl.h"
+
+extern int __map_without_ltlbs;
+/*
+ * MMU_init_hw does the chip-specific initialization of the MMU hardware.
+ */
+void __init MMU_init_hw(void)
+{
+       /*
+        * The Zone Protection Register (ZPR) defines how protection will
+        * be applied to every page which is a member of a given zone. At
+        * present, we utilize only two of the 4xx's zones.
+        * The zone index bits (of ZSEL) in the PTE are used for software
+        * indicators, except the LSB.  For user access, zone 1 is used,
+        * for kernel access, zone 0 is used.  We set all but zone 1
+        * to zero, allowing only kernel access as indicated in the PTE.
+        * For zone 1, we set a 01 binary (a value of 10 will not work)
+        * to allow user access as indicated in the PTE.  This also allows
+        * kernel access as indicated in the PTE.
+        */
+
+        mtspr(SPRN_ZPR, 0x10000000);
+
+       flush_instruction_cache();
+
+       /*
+        * Set up the real-mode cache parameters for the exception vector
+        * handlers (which are run in real-mode).
+        */
+
+        mtspr(SPRN_DCWR, 0x00000000);  /* All caching is write-back */
+
+        /*
+        * Cache instruction and data space where the exception
+        * vectors and the kernel live in real-mode.
+        */
+
+        mtspr(SPRN_DCCR, 0xF0000000);  /* 512 MB of data space at 0x0. */
+        mtspr(SPRN_ICCR, 0xF0000000);  /* 512 MB of instr. space at 0x0. */
+}
+
+#define LARGE_PAGE_SIZE_16M    (1<<24)
+#define LARGE_PAGE_SIZE_4M     (1<<22)
+
+unsigned long __init mmu_mapin_ram(void)
+{
+       unsigned long v, s;
+       phys_addr_t p;
+
+       v = KERNELBASE;
+       p = PPC_MEMSTART;
+       s = 0;
+
+       if (__map_without_ltlbs) {
+               return s;
+       }
+
+       while (s <= (total_lowmem - LARGE_PAGE_SIZE_16M)) {
+               pmd_t *pmdp;
+               unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE;
+
+               pmdp = pmd_offset(pud_offset(pgd_offset_k(v), v), v);
+               pmd_val(*pmdp++) = val;
+               pmd_val(*pmdp++) = val;
+               pmd_val(*pmdp++) = val;
+               pmd_val(*pmdp++) = val;
+
+               v += LARGE_PAGE_SIZE_16M;
+               p += LARGE_PAGE_SIZE_16M;
+               s += LARGE_PAGE_SIZE_16M;
+       }
+
+       while (s <= (total_lowmem - LARGE_PAGE_SIZE_4M)) {
+               pmd_t *pmdp;
+               unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE;
+
+               pmdp = pmd_offset(pud_offset(pgd_offset_k(v), v), v);
+               pmd_val(*pmdp) = val;
+
+               v += LARGE_PAGE_SIZE_4M;
+               p += LARGE_PAGE_SIZE_4M;
+               s += LARGE_PAGE_SIZE_4M;
+       }
+
+       return s;
+}
diff --git a/arch/powerpc/mm/4xx_mmu.c b/arch/powerpc/mm/4xx_mmu.c
deleted file mode 100644 (file)
index 7ff2609..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * This file contains the routines for initializing the MMU
- * on the 4xx series of chips.
- *  -- paulus
- *
- *  Derived from arch/ppc/mm/init.c:
- *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
- *
- *  Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au)
- *  and Cort Dougan (PReP) (cort@cs.nmt.edu)
- *    Copyright (C) 1996 Paul Mackerras
- *
- *  Derived from "arch/i386/mm/init.c"
- *    Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
- *
- *  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/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/stddef.h>
-#include <linux/vmalloc.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/highmem.h>
-
-#include <asm/pgalloc.h>
-#include <asm/prom.h>
-#include <asm/io.h>
-#include <asm/mmu_context.h>
-#include <asm/pgtable.h>
-#include <asm/mmu.h>
-#include <asm/uaccess.h>
-#include <asm/smp.h>
-#include <asm/bootx.h>
-#include <asm/machdep.h>
-#include <asm/setup.h>
-#include "mmu_decl.h"
-
-extern int __map_without_ltlbs;
-/*
- * MMU_init_hw does the chip-specific initialization of the MMU hardware.
- */
-void __init MMU_init_hw(void)
-{
-       /*
-        * The Zone Protection Register (ZPR) defines how protection will
-        * be applied to every page which is a member of a given zone. At
-        * present, we utilize only two of the 4xx's zones.
-        * The zone index bits (of ZSEL) in the PTE are used for software
-        * indicators, except the LSB.  For user access, zone 1 is used,
-        * for kernel access, zone 0 is used.  We set all but zone 1
-        * to zero, allowing only kernel access as indicated in the PTE.
-        * For zone 1, we set a 01 binary (a value of 10 will not work)
-        * to allow user access as indicated in the PTE.  This also allows
-        * kernel access as indicated in the PTE.
-        */
-
-        mtspr(SPRN_ZPR, 0x10000000);
-
-       flush_instruction_cache();
-
-       /*
-        * Set up the real-mode cache parameters for the exception vector
-        * handlers (which are run in real-mode).
-        */
-
-        mtspr(SPRN_DCWR, 0x00000000);  /* All caching is write-back */
-
-        /*
-        * Cache instruction and data space where the exception
-        * vectors and the kernel live in real-mode.
-        */
-
-        mtspr(SPRN_DCCR, 0xF0000000);  /* 512 MB of data space at 0x0. */
-        mtspr(SPRN_ICCR, 0xF0000000);  /* 512 MB of instr. space at 0x0. */
-}
-
-#define LARGE_PAGE_SIZE_16M    (1<<24)
-#define LARGE_PAGE_SIZE_4M     (1<<22)
-
-unsigned long __init mmu_mapin_ram(void)
-{
-       unsigned long v, s;
-       phys_addr_t p;
-
-       v = KERNELBASE;
-       p = PPC_MEMSTART;
-       s = 0;
-
-       if (__map_without_ltlbs) {
-               return s;
-       }
-
-       while (s <= (total_lowmem - LARGE_PAGE_SIZE_16M)) {
-               pmd_t *pmdp;
-               unsigned long val = p | _PMD_SIZE_16M | _PAGE_HWEXEC | _PAGE_HWWRITE;
-
-               pmdp = pmd_offset(pgd_offset_k(v), v);
-               pmd_val(*pmdp++) = val;
-               pmd_val(*pmdp++) = val;
-               pmd_val(*pmdp++) = val;
-               pmd_val(*pmdp++) = val;
-
-               v += LARGE_PAGE_SIZE_16M;
-               p += LARGE_PAGE_SIZE_16M;
-               s += LARGE_PAGE_SIZE_16M;
-       }
-
-       while (s <= (total_lowmem - LARGE_PAGE_SIZE_4M)) {
-               pmd_t *pmdp;
-               unsigned long val = p | _PMD_SIZE_4M | _PAGE_HWEXEC | _PAGE_HWWRITE;
-
-               pmdp = pmd_offset(pgd_offset_k(v), v);
-               pmd_val(*pmdp) = val;
-
-               v += LARGE_PAGE_SIZE_4M;
-               p += LARGE_PAGE_SIZE_4M;
-               s += LARGE_PAGE_SIZE_4M;
-       }
-
-       return s;
-}
index 7e4d27ad3deec7e422181daadcbe715444f7df6c..20629ae95c50102f146190d968280edaf07a168d 100644 (file)
@@ -6,14 +6,17 @@ ifeq ($(CONFIG_PPC64),y)
 EXTRA_CFLAGS   += -mno-minimal-toc
 endif
 
-obj-y                          := fault.o mem.o lmb.o
-obj-$(CONFIG_PPC32)            += init_32.o pgtable_32.o mmu_context_32.o
+obj-y                          := fault.o mem.o lmb.o \
+                                  init_$(CONFIG_WORD_SIZE).o \
+                                  pgtable_$(CONFIG_WORD_SIZE).o \
+                                  mmu_context_$(CONFIG_WORD_SIZE).o
 hash-$(CONFIG_PPC_NATIVE)      := hash_native_64.o
-obj-$(CONFIG_PPC64)            += init_64.o pgtable_64.o mmu_context_64.o \
-                                  hash_utils_64.o hash_low_64.o tlb_64.o \
+obj-$(CONFIG_PPC64)            += hash_utils_64.o \
                                   slb_low.o slb.o stab.o mmap.o $(hash-y)
-obj-$(CONFIG_PPC_STD_MMU_32)   += ppc_mmu_32.o hash_low_32.o tlb_32.o
-obj-$(CONFIG_40x)              += 4xx_mmu.o
+obj-$(CONFIG_PPC_STD_MMU_32)   += ppc_mmu_32.o
+obj-$(CONFIG_PPC_STD_MMU)      += hash_low_$(CONFIG_WORD_SIZE).o \
+                                  tlb_$(CONFIG_WORD_SIZE).o
+obj-$(CONFIG_40x)              += 40x_mmu.o
 obj-$(CONFIG_44x)              += 44x_mmu.o
 obj-$(CONFIG_FSL_BOOKE)                += fsl_booke_mmu.o
 obj-$(CONFIG_NEED_MULTIPLE_NODES) += numa.o
index afab247d472f4f221b2e789c7373fc68c7d12314..17139daeaff461bbdd4af62db6dc0fa7d052da68 100644 (file)
@@ -59,6 +59,7 @@ unsigned int num_tlbcam_entries;
 static unsigned long __cam0, __cam1, __cam2;
 extern unsigned long total_lowmem;
 extern unsigned long __max_low_memory;
+extern unsigned long __initial_memory_limit;
 #define MAX_LOW_MEM    CONFIG_LOWMEM_SIZE
 
 #define NUM_TLBCAMS    (16)
@@ -232,4 +233,5 @@ adjust_total_lowmem(void)
                        __cam0 >> 20, __cam1 >> 20, __cam2 >> 20,
                        (total_lowmem - __cam0 - __cam1 - __cam2) >> 20);
        __max_low_memory = max_low_mem = __cam0 + __cam1 + __cam2;
+       __initial_memory_limit = __max_low_memory;
 }
index 35eabfb507231ae92e549ffa771424c31d42d9c8..ad253b959030b9720221bc2190ad4cf5b108016e 100644 (file)
@@ -54,7 +54,7 @@
 
 /*
  * _hash_page_4K(unsigned long ea, unsigned long access, unsigned long vsid,
- *              pte_t *ptep, unsigned long trap, int local)
+ *              pte_t *ptep, unsigned long trap, int local, int ssize)
  *
  * Adds a 4K page to the hash table in a segment of 4K pages only
  */
@@ -66,6 +66,7 @@ _GLOBAL(__hash_page_4K)
        /* Save all params that we need after a function call */
        std     r6,STK_PARM(r6)(r1)
        std     r8,STK_PARM(r8)(r1)
+       std     r9,STK_PARM(r9)(r1)
        
        /* Add _PAGE_PRESENT to access */
        ori     r4,r4,_PAGE_PRESENT
@@ -117,6 +118,10 @@ _GLOBAL(__hash_page_4K)
         * r4 (access) is re-useable, we use it for the new HPTE flags
         */
 
+BEGIN_FTR_SECTION
+       cmpdi   r9,0                    /* check segment size */
+       bne     3f
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
        /* Calc va and put it in r29 */
        rldicr  r29,r5,28,63-28
        rldicl  r3,r3,0,36
@@ -126,9 +131,20 @@ _GLOBAL(__hash_page_4K)
        rldicl  r5,r5,0,25              /* vsid & 0x0000007fffffffff */
        rldicl  r0,r3,64-12,48          /* (ea >> 12) & 0xffff */
        xor     r28,r5,r0
+       b       4f
+
+3:     /* Calc VA and hash in r29 and r28 for 1T segment */
+       sldi    r29,r5,40               /* vsid << 40 */
+       clrldi  r3,r3,24                /* ea & 0xffffffffff */
+       rldic   r28,r5,25,25            /* (vsid << 25) & 0x7fffffffff */
+       clrldi  r5,r5,40                /* vsid & 0xffffff */
+       rldicl  r0,r3,64-12,36          /* (ea >> 12) & 0xfffffff */
+       xor     r28,r28,r5
+       or      r29,r3,r29              /* VA */
+       xor     r28,r28,r0              /* hash */
 
        /* Convert linux PTE bits into HW equivalents */
-       andi.   r3,r30,0x1fe            /* Get basic set of flags */
+4:     andi.   r3,r30,0x1fe            /* Get basic set of flags */
        xori    r3,r3,HPTE_R_N          /* _PAGE_EXEC -> NOEXEC */
        rlwinm  r0,r30,32-9+1,30,30     /* _PAGE_RW -> _PAGE_USER (r0) */
        rlwinm  r4,r30,32-7+1,30,30     /* _PAGE_DIRTY -> _PAGE_USER (r4) */
@@ -183,6 +199,7 @@ htab_insert_pte:
        mr      r4,r29                  /* Retreive va */
        li      r7,0                    /* !bolted, !secondary */
        li      r8,MMU_PAGE_4K          /* page size */
+       ld      r9,STK_PARM(r9)(r1)     /* segment size */
 _GLOBAL(htab_call_hpte_insert1)
        bl      .                       /* Patched by htab_finish_init() */
        cmpdi   0,r3,0
@@ -205,6 +222,7 @@ _GLOBAL(htab_call_hpte_insert1)
        mr      r4,r29                  /* Retreive va */
        li      r7,HPTE_V_SECONDARY     /* !bolted, secondary */
        li      r8,MMU_PAGE_4K          /* page size */
+       ld      r9,STK_PARM(r9)(r1)     /* segment size */
 _GLOBAL(htab_call_hpte_insert2)
        bl      .                       /* Patched by htab_finish_init() */
        cmpdi   0,r3,0
@@ -273,7 +291,8 @@ htab_modify_pte:
        /* Call ppc_md.hpte_updatepp */
        mr      r5,r29                  /* va */
        li      r6,MMU_PAGE_4K          /* page size */
-       ld      r7,STK_PARM(r8)(r1)     /* get "local" param */
+       ld      r7,STK_PARM(r9)(r1)     /* segment size */
+       ld      r8,STK_PARM(r8)(r1)     /* get "local" param */
 _GLOBAL(htab_call_hpte_updatepp)
        bl      .                       /* Patched by htab_finish_init() */
 
@@ -325,6 +344,7 @@ _GLOBAL(__hash_page_4K)
        /* Save all params that we need after a function call */
        std     r6,STK_PARM(r6)(r1)
        std     r8,STK_PARM(r8)(r1)
+       std     r9,STK_PARM(r9)(r1)
 
        /* Add _PAGE_PRESENT to access */
        ori     r4,r4,_PAGE_PRESENT
@@ -383,18 +403,33 @@ _GLOBAL(__hash_page_4K)
        /* Load the hidx index */
        rldicl  r25,r3,64-12,60
 
+BEGIN_FTR_SECTION
+       cmpdi   r9,0                    /* check segment size */
+       bne     3f
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
        /* Calc va and put it in r29 */
        rldicr  r29,r5,28,63-28         /* r29 = (vsid << 28) */
        rldicl  r3,r3,0,36              /* r3 = (ea & 0x0fffffff) */
-       or      r29,r3,r29              /* r29 = va
+       or      r29,r3,r29              /* r29 = va */
 
        /* Calculate hash value for primary slot and store it in r28 */
        rldicl  r5,r5,0,25              /* vsid & 0x0000007fffffffff */
        rldicl  r0,r3,64-12,48          /* (ea >> 12) & 0xffff */
        xor     r28,r5,r0
+       b       4f
+
+3:     /* Calc VA and hash in r29 and r28 for 1T segment */
+       sldi    r29,r5,40               /* vsid << 40 */
+       clrldi  r3,r3,24                /* ea & 0xffffffffff */
+       rldic   r28,r5,25,25            /* (vsid << 25) & 0x7fffffffff */
+       clrldi  r5,r5,40                /* vsid & 0xffffff */
+       rldicl  r0,r3,64-12,36          /* (ea >> 12) & 0xfffffff */
+       xor     r28,r28,r5
+       or      r29,r3,r29              /* VA */
+       xor     r28,r28,r0              /* hash */
 
        /* Convert linux PTE bits into HW equivalents */
-       andi.   r3,r30,0x1fe            /* Get basic set of flags */
+4:     andi.   r3,r30,0x1fe            /* Get basic set of flags */
        xori    r3,r3,HPTE_R_N          /* _PAGE_EXEC -> NOEXEC */
        rlwinm  r0,r30,32-9+1,30,30     /* _PAGE_RW -> _PAGE_USER (r0) */
        rlwinm  r4,r30,32-7+1,30,30     /* _PAGE_DIRTY -> _PAGE_USER (r4) */
@@ -462,6 +497,7 @@ htab_special_pfn:
        mr      r4,r29                  /* Retreive va */
        li      r7,0                    /* !bolted, !secondary */
        li      r8,MMU_PAGE_4K          /* page size */
+       ld      r9,STK_PARM(r9)(r1)     /* segment size */
 _GLOBAL(htab_call_hpte_insert1)
        bl      .                       /* patched by htab_finish_init() */
        cmpdi   0,r3,0
@@ -488,6 +524,7 @@ _GLOBAL(htab_call_hpte_insert1)
        mr      r4,r29                  /* Retreive va */
        li      r7,HPTE_V_SECONDARY     /* !bolted, secondary */
        li      r8,MMU_PAGE_4K          /* page size */
+       ld      r9,STK_PARM(r9)(r1)     /* segment size */
 _GLOBAL(htab_call_hpte_insert2)
        bl      .                       /* patched by htab_finish_init() */
        cmpdi   0,r3,0
@@ -586,7 +623,8 @@ htab_modify_pte:
        /* Call ppc_md.hpte_updatepp */
        mr      r5,r29                  /* va */
        li      r6,MMU_PAGE_4K          /* page size */
-       ld      r7,STK_PARM(r8)(r1)     /* get "local" param */
+       ld      r7,STK_PARM(r9)(r1)     /* segment size */
+       ld      r8,STK_PARM(r8)(r1)     /* get "local" param */
 _GLOBAL(htab_call_hpte_updatepp)
        bl      .                       /* patched by htab_finish_init() */
 
@@ -634,6 +672,7 @@ _GLOBAL(__hash_page_64K)
        /* Save all params that we need after a function call */
        std     r6,STK_PARM(r6)(r1)
        std     r8,STK_PARM(r8)(r1)
+       std     r9,STK_PARM(r9)(r1)
 
        /* Add _PAGE_PRESENT to access */
        ori     r4,r4,_PAGE_PRESENT
@@ -690,6 +729,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE)
         * r4 (access) is re-useable, we use it for the new HPTE flags
         */
 
+BEGIN_FTR_SECTION
+       cmpdi   r9,0                    /* check segment size */
+       bne     3f
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
        /* Calc va and put it in r29 */
        rldicr  r29,r5,28,63-28
        rldicl  r3,r3,0,36
@@ -699,9 +742,20 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE)
        rldicl  r5,r5,0,25              /* vsid & 0x0000007fffffffff */
        rldicl  r0,r3,64-16,52          /* (ea >> 16) & 0xfff */
        xor     r28,r5,r0
+       b       4f
+
+3:     /* Calc VA and hash in r29 and r28 for 1T segment */
+       sldi    r29,r5,40               /* vsid << 40 */
+       clrldi  r3,r3,24                /* ea & 0xffffffffff */
+       rldic   r28,r5,25,25            /* (vsid << 25) & 0x7fffffffff */
+       clrldi  r5,r5,40                /* vsid & 0xffffff */
+       rldicl  r0,r3,64-16,40          /* (ea >> 16) & 0xffffff */
+       xor     r28,r28,r5
+       or      r29,r3,r29              /* VA */
+       xor     r28,r28,r0              /* hash */
 
        /* Convert linux PTE bits into HW equivalents */
-       andi.   r3,r30,0x1fe            /* Get basic set of flags */
+4:     andi.   r3,r30,0x1fe            /* Get basic set of flags */
        xori    r3,r3,HPTE_R_N          /* _PAGE_EXEC -> NOEXEC */
        rlwinm  r0,r30,32-9+1,30,30     /* _PAGE_RW -> _PAGE_USER (r0) */
        rlwinm  r4,r30,32-7+1,30,30     /* _PAGE_DIRTY -> _PAGE_USER (r4) */
@@ -756,6 +810,7 @@ ht64_insert_pte:
        mr      r4,r29                  /* Retreive va */
        li      r7,0                    /* !bolted, !secondary */
        li      r8,MMU_PAGE_64K
+       ld      r9,STK_PARM(r9)(r1)     /* segment size */
 _GLOBAL(ht64_call_hpte_insert1)
        bl      .                       /* patched by htab_finish_init() */
        cmpdi   0,r3,0
@@ -778,6 +833,7 @@ _GLOBAL(ht64_call_hpte_insert1)
        mr      r4,r29                  /* Retreive va */
        li      r7,HPTE_V_SECONDARY     /* !bolted, secondary */
        li      r8,MMU_PAGE_64K
+       ld      r9,STK_PARM(r9)(r1)     /* segment size */
 _GLOBAL(ht64_call_hpte_insert2)
        bl      .                       /* patched by htab_finish_init() */
        cmpdi   0,r3,0
@@ -846,7 +902,8 @@ ht64_modify_pte:
        /* Call ppc_md.hpte_updatepp */
        mr      r5,r29                  /* va */
        li      r6,MMU_PAGE_64K
-       ld      r7,STK_PARM(r8)(r1)     /* get "local" param */
+       ld      r7,STK_PARM(r9)(r1)     /* segment size */
+       ld      r8,STK_PARM(r8)(r1)     /* get "local" param */
 _GLOBAL(ht64_call_hpte_updatepp)
        bl      .                       /* patched by htab_finish_init() */
 
index 6ba9b47e55afbe746734761c672761dcea07e9f0..34e5c0b219b92f5792a3ecc886740c0c130ca024 100644 (file)
@@ -38,7 +38,7 @@
 
 static DEFINE_SPINLOCK(native_tlbie_lock);
 
-static inline void __tlbie(unsigned long va, unsigned int psize)
+static inline void __tlbie(unsigned long va, int psize, int ssize)
 {
        unsigned int penc;
 
@@ -48,18 +48,20 @@ static inline void __tlbie(unsigned long va, unsigned int psize)
        switch (psize) {
        case MMU_PAGE_4K:
                va &= ~0xffful;
+               va |= ssize << 8;
                asm volatile("tlbie %0,0" : : "r" (va) : "memory");
                break;
        default:
                penc = mmu_psize_defs[psize].penc;
                va &= ~((1ul << mmu_psize_defs[psize].shift) - 1);
                va |= penc << 12;
+               va |= ssize << 8;
                asm volatile("tlbie %0,1" : : "r" (va) : "memory");
                break;
        }
 }
 
-static inline void __tlbiel(unsigned long va, unsigned int psize)
+static inline void __tlbiel(unsigned long va, int psize, int ssize)
 {
        unsigned int penc;
 
@@ -69,6 +71,7 @@ static inline void __tlbiel(unsigned long va, unsigned int psize)
        switch (psize) {
        case MMU_PAGE_4K:
                va &= ~0xffful;
+               va |= ssize << 8;
                asm volatile(".long 0x7c000224 | (%0 << 11) | (0 << 21)"
                             : : "r"(va) : "memory");
                break;
@@ -76,6 +79,7 @@ static inline void __tlbiel(unsigned long va, unsigned int psize)
                penc = mmu_psize_defs[psize].penc;
                va &= ~((1ul << mmu_psize_defs[psize].shift) - 1);
                va |= penc << 12;
+               va |= ssize << 8;
                asm volatile(".long 0x7c000224 | (%0 << 11) | (1 << 21)"
                             : : "r"(va) : "memory");
                break;
@@ -83,7 +87,7 @@ static inline void __tlbiel(unsigned long va, unsigned int psize)
 
 }
 
-static inline void tlbie(unsigned long va, int psize, int local)
+static inline void tlbie(unsigned long va, int psize, int ssize, int local)
 {
        unsigned int use_local = local && cpu_has_feature(CPU_FTR_TLBIEL);
        int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE);
@@ -94,10 +98,10 @@ static inline void tlbie(unsigned long va, int psize, int local)
                spin_lock(&native_tlbie_lock);
        asm volatile("ptesync": : :"memory");
        if (use_local) {
-               __tlbiel(va, psize);
+               __tlbiel(va, psize, ssize);
                asm volatile("ptesync": : :"memory");
        } else {
-               __tlbie(va, psize);
+               __tlbie(va, psize, ssize);
                asm volatile("eieio; tlbsync; ptesync": : :"memory");
        }
        if (lock_tlbie && !use_local)
@@ -126,7 +130,7 @@ static inline void native_unlock_hpte(struct hash_pte *hptep)
 
 static long native_hpte_insert(unsigned long hpte_group, unsigned long va,
                        unsigned long pa, unsigned long rflags,
-                       unsigned long vflags, int psize)
+                       unsigned long vflags, int psize, int ssize)
 {
        struct hash_pte *hptep = htab_address + hpte_group;
        unsigned long hpte_v, hpte_r;
@@ -153,7 +157,7 @@ static long native_hpte_insert(unsigned long hpte_group, unsigned long va,
        if (i == HPTES_PER_GROUP)
                return -1;
 
-       hpte_v = hpte_encode_v(va, psize) | vflags | HPTE_V_VALID;
+       hpte_v = hpte_encode_v(va, psize, ssize) | vflags | HPTE_V_VALID;
        hpte_r = hpte_encode_r(pa, psize) | rflags;
 
        if (!(vflags & HPTE_V_BOLTED)) {
@@ -215,13 +219,14 @@ static long native_hpte_remove(unsigned long hpte_group)
 }
 
 static long native_hpte_updatepp(unsigned long slot, unsigned long newpp,
-                                unsigned long va, int psize, int local)
+                                unsigned long va, int psize, int ssize,
+                                int local)
 {
        struct hash_pte *hptep = htab_address + slot;
        unsigned long hpte_v, want_v;
        int ret = 0;
 
-       want_v = hpte_encode_v(va, psize);
+       want_v = hpte_encode_v(va, psize, ssize);
 
        DBG_LOW("    update(va=%016lx, avpnv=%016lx, hash=%016lx, newpp=%x)",
                va, want_v & HPTE_V_AVPN, slot, newpp);
@@ -243,39 +248,32 @@ static long native_hpte_updatepp(unsigned long slot, unsigned long newpp,
        native_unlock_hpte(hptep);
 
        /* Ensure it is out of the tlb too. */
-       tlbie(va, psize, local);
+       tlbie(va, psize, ssize, local);
 
        return ret;
 }
 
-static long native_hpte_find(unsigned long va, int psize)
+static long native_hpte_find(unsigned long va, int psize, int ssize)
 {
        struct hash_pte *hptep;
        unsigned long hash;
-       unsigned long i, j;
+       unsigned long i;
        long slot;
        unsigned long want_v, hpte_v;
 
-       hash = hpt_hash(va, mmu_psize_defs[psize].shift);
-       want_v = hpte_encode_v(va, psize);
+       hash = hpt_hash(va, mmu_psize_defs[psize].shift, ssize);
+       want_v = hpte_encode_v(va, psize, ssize);
 
-       for (j = 0; j < 2; j++) {
-               slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
-               for (i = 0; i < HPTES_PER_GROUP; i++) {
-                       hptep = htab_address + slot;
-                       hpte_v = hptep->v;
+       /* Bolted mappings are only ever in the primary group */
+       slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
+       for (i = 0; i < HPTES_PER_GROUP; i++) {
+               hptep = htab_address + slot;
+               hpte_v = hptep->v;
 
-                       if (HPTE_V_COMPARE(hpte_v, want_v)
-                           && (hpte_v & HPTE_V_VALID)
-                           && ( !!(hpte_v & HPTE_V_SECONDARY) == j)) {
-                               /* HPTE matches */
-                               if (j)
-                                       slot = -slot;
-                               return slot;
-                       }
-                       ++slot;
-               }
-               hash = ~hash;
+               if (HPTE_V_COMPARE(hpte_v, want_v) && (hpte_v & HPTE_V_VALID))
+                       /* HPTE matches */
+                       return slot;
+               ++slot;
        }
 
        return -1;
@@ -289,16 +287,16 @@ static long native_hpte_find(unsigned long va, int psize)
  * No need to lock here because we should be the only user.
  */
 static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
-                                      int psize)
+                                      int psize, int ssize)
 {
        unsigned long vsid, va;
        long slot;
        struct hash_pte *hptep;
 
-       vsid = get_kernel_vsid(ea);
-       va = (vsid << 28) | (ea & 0x0fffffff);
+       vsid = get_kernel_vsid(ea, ssize);
+       va = hpt_va(ea, vsid, ssize);
 
-       slot = native_hpte_find(va, psize);
+       slot = native_hpte_find(va, psize, ssize);
        if (slot == -1)
                panic("could not find page to bolt\n");
        hptep = htab_address + slot;
@@ -308,11 +306,11 @@ static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
                (newpp & (HPTE_R_PP | HPTE_R_N));
 
        /* Ensure it is out of the tlb too. */
-       tlbie(va, psize, 0);
+       tlbie(va, psize, ssize, 0);
 }
 
 static void native_hpte_invalidate(unsigned long slot, unsigned long va,
-                                  int psize, int local)
+                                  int psize, int ssize, int local)
 {
        struct hash_pte *hptep = htab_address + slot;
        unsigned long hpte_v;
@@ -323,7 +321,7 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long va,
 
        DBG_LOW("    invalidate(va=%016lx, hash: %x)\n", va, slot);
 
-       want_v = hpte_encode_v(va, psize);
+       want_v = hpte_encode_v(va, psize, ssize);
        native_lock_hpte(hptep);
        hpte_v = hptep->v;
 
@@ -335,7 +333,7 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long va,
                hptep->v = 0;
 
        /* Invalidate the TLB */
-       tlbie(va, psize, local);
+       tlbie(va, psize, ssize, local);
 
        local_irq_restore(flags);
 }
@@ -345,7 +343,7 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long va,
 #define LP_MASK(i)     ((0xFF >> (i)) << LP_SHIFT)
 
 static void hpte_decode(struct hash_pte *hpte, unsigned long slot,
-                       int *psize, unsigned long *va)
+                       int *psize, int *ssize, unsigned long *va)
 {
        unsigned long hpte_r = hpte->r;
        unsigned long hpte_v = hpte->v;
@@ -401,6 +399,7 @@ static void hpte_decode(struct hash_pte *hpte, unsigned long slot,
 
        *va = avpn;
        *psize = size;
+       *ssize = hpte_v >> HPTE_V_SSIZE_SHIFT;
 }
 
 /*
@@ -417,7 +416,7 @@ static void native_hpte_clear(void)
        struct hash_pte *hptep = htab_address;
        unsigned long hpte_v, va;
        unsigned long pteg_count;
-       int psize;
+       int psize, ssize;
 
        pteg_count = htab_hash_mask + 1;
 
@@ -443,9 +442,9 @@ static void native_hpte_clear(void)
                 * already hold the native_tlbie_lock.
                 */
                if (hpte_v & HPTE_V_VALID) {
-                       hpte_decode(hptep, slot, &psize, &va);
+                       hpte_decode(hptep, slot, &psize, &ssize, &va);
                        hptep->v = 0;
-                       __tlbie(va, psize);
+                       __tlbie(va, psize, ssize);
                }
        }
 
@@ -468,6 +467,7 @@ static void native_flush_hash_range(unsigned long number, int local)
        real_pte_t pte;
        struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
        unsigned long psize = batch->psize;
+       int ssize = batch->ssize;
        int i;
 
        local_irq_save(flags);
@@ -477,14 +477,14 @@ static void native_flush_hash_range(unsigned long number, int local)
                pte = batch->pte[i];
 
                pte_iterate_hashed_subpages(pte, psize, va, index, shift) {
-                       hash = hpt_hash(va, shift);
+                       hash = hpt_hash(va, shift, ssize);
                        hidx = __rpte_to_hidx(pte, index);
                        if (hidx & _PTEIDX_SECONDARY)
                                hash = ~hash;
                        slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
                        slot += hidx & _PTEIDX_GROUP_IX;
                        hptep = htab_address + slot;
-                       want_v = hpte_encode_v(va, psize);
+                       want_v = hpte_encode_v(va, psize, ssize);
                        native_lock_hpte(hptep);
                        hpte_v = hptep->v;
                        if (!HPTE_V_COMPARE(hpte_v, want_v) ||
@@ -504,7 +504,7 @@ static void native_flush_hash_range(unsigned long number, int local)
 
                        pte_iterate_hashed_subpages(pte, psize, va, index,
                                                    shift) {
-                               __tlbiel(va, psize);
+                               __tlbiel(va, psize, ssize);
                        } pte_iterate_hashed_end();
                }
                asm volatile("ptesync":::"memory");
@@ -521,7 +521,7 @@ static void native_flush_hash_range(unsigned long number, int local)
 
                        pte_iterate_hashed_subpages(pte, psize, va, index,
                                                    shift) {
-                               __tlbie(va, psize);
+                               __tlbie(va, psize, ssize);
                        } pte_iterate_hashed_end();
                }
                asm volatile("eieio; tlbsync; ptesync":::"memory");
index a47151e806cae072c1836b49f4c3c8630a4c2bd0..611ad084b7e7177bb212ae291d2152062086b9fb 100644 (file)
@@ -49,7 +49,6 @@
 #include <asm/tlb.h>
 #include <asm/cacheflush.h>
 #include <asm/cputable.h>
-#include <asm/abs_addr.h>
 #include <asm/sections.h>
 #include <asm/spu.h>
 
@@ -94,6 +93,8 @@ int mmu_linear_psize = MMU_PAGE_4K;
 int mmu_virtual_psize = MMU_PAGE_4K;
 int mmu_vmalloc_psize = MMU_PAGE_4K;
 int mmu_io_psize = MMU_PAGE_4K;
+int mmu_kernel_ssize = MMU_SEGSIZE_256M;
+int mmu_highuser_ssize = MMU_SEGSIZE_256M;
 #ifdef CONFIG_HUGETLB_PAGE
 int mmu_huge_psize = MMU_PAGE_16M;
 unsigned int HPAGE_SHIFT;
@@ -146,7 +147,8 @@ struct mmu_psize_def mmu_psize_defaults_gp[] = {
 
 
 int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
-                     unsigned long pstart, unsigned long mode, int psize)
+                     unsigned long pstart, unsigned long mode,
+                     int psize, int ssize)
 {
        unsigned long vaddr, paddr;
        unsigned int step, shift;
@@ -159,8 +161,8 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
        for (vaddr = vstart, paddr = pstart; vaddr < vend;
             vaddr += step, paddr += step) {
                unsigned long hash, hpteg;
-               unsigned long vsid = get_kernel_vsid(vaddr);
-               unsigned long va = (vsid << 28) | (vaddr & 0x0fffffff);
+               unsigned long vsid = get_kernel_vsid(vaddr, ssize);
+               unsigned long va = hpt_va(vaddr, vsid, ssize);
 
                tmp_mode = mode;
                
@@ -168,14 +170,14 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
                if (!in_kernel_text(vaddr))
                        tmp_mode = mode | HPTE_R_N;
 
-               hash = hpt_hash(va, shift);
+               hash = hpt_hash(va, shift, ssize);
                hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
 
                DBG("htab_bolt_mapping: calling %p\n", ppc_md.hpte_insert);
 
                BUG_ON(!ppc_md.hpte_insert);
                ret = ppc_md.hpte_insert(hpteg, va, paddr,
-                               tmp_mode, HPTE_V_BOLTED, psize);
+                               tmp_mode, HPTE_V_BOLTED, psize, ssize);
 
                if (ret < 0)
                        break;
@@ -187,6 +189,37 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
        return ret < 0 ? ret : 0;
 }
 
+static int __init htab_dt_scan_seg_sizes(unsigned long node,
+                                        const char *uname, int depth,
+                                        void *data)
+{
+       char *type = of_get_flat_dt_prop(node, "device_type", NULL);
+       u32 *prop;
+       unsigned long size = 0;
+
+       /* We are scanning "cpu" nodes only */
+       if (type == NULL || strcmp(type, "cpu") != 0)
+               return 0;
+
+       prop = (u32 *)of_get_flat_dt_prop(node, "ibm,processor-segment-sizes",
+                                         &size);
+       if (prop == NULL)
+               return 0;
+       for (; size >= 4; size -= 4, ++prop) {
+               if (prop[0] == 40) {
+                       DBG("1T segment support detected\n");
+                       cur_cpu_spec->cpu_features |= CPU_FTR_1T_SEGMENT;
+               }
+               return 1;
+       }
+       return 0;
+}
+
+static void __init htab_init_seg_sizes(void)
+{
+       of_scan_flat_dt(htab_dt_scan_seg_sizes, NULL);
+}
+
 static int __init htab_dt_scan_page_sizes(unsigned long node,
                                          const char *uname, int depth,
                                          void *data)
@@ -266,7 +299,6 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
        return 0;
 }
 
-
 static void __init htab_init_page_sizes(void)
 {
        int rc;
@@ -399,7 +431,7 @@ void create_section_mapping(unsigned long start, unsigned long end)
 {
                BUG_ON(htab_bolt_mapping(start, end, __pa(start),
                        _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
-                       mmu_linear_psize));
+                       mmu_linear_psize, mmu_kernel_ssize));
 }
 #endif /* CONFIG_MEMORY_HOTPLUG */
 
@@ -450,9 +482,18 @@ void __init htab_initialize(void)
 
        DBG(" -> htab_initialize()\n");
 
+       /* Initialize segment sizes */
+       htab_init_seg_sizes();
+
        /* Initialize page sizes */
        htab_init_page_sizes();
 
+       if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
+               mmu_kernel_ssize = MMU_SEGSIZE_1T;
+               mmu_highuser_ssize = MMU_SEGSIZE_1T;
+               printk(KERN_INFO "Using 1TB segments\n");
+       }
+
        /*
         * Calculate the required size of the htab.  We want the number of
         * PTEGs to equal one half the number of real pages.
@@ -524,18 +565,20 @@ void __init htab_initialize(void)
                        if (base != dart_tablebase)
                                BUG_ON(htab_bolt_mapping(base, dart_tablebase,
                                                        __pa(base), mode_rw,
-                                                       mmu_linear_psize));
+                                                       mmu_linear_psize,
+                                                       mmu_kernel_ssize));
                        if ((base + size) > dart_table_end)
                                BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
                                                        base + size,
                                                        __pa(dart_table_end),
                                                         mode_rw,
-                                                        mmu_linear_psize));
+                                                        mmu_linear_psize,
+                                                        mmu_kernel_ssize));
                        continue;
                }
 #endif /* CONFIG_U3_DART */
                BUG_ON(htab_bolt_mapping(base, base + size, __pa(base),
-                                       mode_rw, mmu_linear_psize));
+                               mode_rw, mmu_linear_psize, mmu_kernel_ssize));
        }
 
        /*
@@ -554,7 +597,7 @@ void __init htab_initialize(void)
 
                BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end,
                                         __pa(tce_alloc_start), mode_rw,
-                                        mmu_linear_psize));
+                                        mmu_linear_psize, mmu_kernel_ssize));
        }
 
        htab_finish_init();
@@ -602,13 +645,7 @@ static void demote_segment_4k(struct mm_struct *mm, unsigned long addr)
 {
        if (mm->context.user_psize == MMU_PAGE_4K)
                return;
-#ifdef CONFIG_PPC_MM_SLICES
        slice_set_user_psize(mm, MMU_PAGE_4K);
-#else /* CONFIG_PPC_MM_SLICES */
-       mm->context.user_psize = MMU_PAGE_4K;
-       mm->context.sllp = SLB_VSID_USER | mmu_psize_defs[MMU_PAGE_4K].sllp;
-#endif /* CONFIG_PPC_MM_SLICES */
-
 #ifdef CONFIG_SPU_BASE
        spu_flush_all_slbs(mm);
 #endif
@@ -628,7 +665,7 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
        pte_t *ptep;
        cpumask_t tmp;
        int rc, user_region = 0, local = 0;
-       int psize;
+       int psize, ssize;
 
        DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n",
                ea, access, trap);
@@ -647,20 +684,22 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
                        DBG_LOW(" user region with no mm !\n");
                        return 1;
                }
-               vsid = get_vsid(mm->context.id, ea);
 #ifdef CONFIG_PPC_MM_SLICES
                psize = get_slice_psize(mm, ea);
 #else
                psize = mm->context.user_psize;
 #endif
+               ssize = user_segment_size(ea);
+               vsid = get_vsid(mm->context.id, ea, ssize);
                break;
        case VMALLOC_REGION_ID:
                mm = &init_mm;
-               vsid = get_kernel_vsid(ea);
+               vsid = get_kernel_vsid(ea, mmu_kernel_ssize);
                if (ea < VMALLOC_END)
                        psize = mmu_vmalloc_psize;
                else
                        psize = mmu_io_psize;
+               ssize = mmu_kernel_ssize;
                break;
        default:
                /* Not a valid range
@@ -765,10 +804,10 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
 
 #ifdef CONFIG_PPC_HAS_HASH_64K
        if (psize == MMU_PAGE_64K)
-               rc = __hash_page_64K(ea, access, vsid, ptep, trap, local);
+               rc = __hash_page_64K(ea, access, vsid, ptep, trap, local, ssize);
        else
 #endif /* CONFIG_PPC_HAS_HASH_64K */
-               rc = __hash_page_4K(ea, access, vsid, ptep, trap, local);
+               rc = __hash_page_4K(ea, access, vsid, ptep, trap, local, ssize);
 
 #ifndef CONFIG_PPC_64K_PAGES
        DBG_LOW(" o-pte: %016lx\n", pte_val(*ptep));
@@ -790,6 +829,7 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
        cpumask_t mask;
        unsigned long flags;
        int local = 0;
+       int ssize;
 
        BUG_ON(REGION_ID(ea) != USER_REGION_ID);
 
@@ -822,7 +862,8 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
 #endif /* CONFIG_PPC_64K_PAGES */
 
        /* Get VSID */
-       vsid = get_vsid(mm->context.id, ea);
+       ssize = user_segment_size(ea);
+       vsid = get_vsid(mm->context.id, ea, ssize);
 
        /* Hash doesn't like irqs */
        local_irq_save(flags);
@@ -835,28 +876,29 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
        /* Hash it in */
 #ifdef CONFIG_PPC_HAS_HASH_64K
        if (mm->context.user_psize == MMU_PAGE_64K)
-               __hash_page_64K(ea, access, vsid, ptep, trap, local);
+               __hash_page_64K(ea, access, vsid, ptep, trap, local, ssize);
        else
 #endif /* CONFIG_PPC_HAS_HASH_64K */
-               __hash_page_4K(ea, access, vsid, ptep, trap, local);
+               __hash_page_4K(ea, access, vsid, ptep, trap, local, ssize);
 
        local_irq_restore(flags);
 }
 
-void flush_hash_page(unsigned long va, real_pte_t pte, int psize, int local)
+void flush_hash_page(unsigned long va, real_pte_t pte, int psize, int ssize,
+                    int local)
 {
        unsigned long hash, index, shift, hidx, slot;
 
        DBG_LOW("flush_hash_page(va=%016x)\n", va);
        pte_iterate_hashed_subpages(pte, psize, va, index, shift) {
-               hash = hpt_hash(va, shift);
+               hash = hpt_hash(va, shift, ssize);
                hidx = __rpte_to_hidx(pte, index);
                if (hidx & _PTEIDX_SECONDARY)
                        hash = ~hash;
                slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
                slot += hidx & _PTEIDX_GROUP_IX;
                DBG_LOW(" sub %d: hash=%x, hidx=%x\n", index, slot, hidx);
-               ppc_md.hpte_invalidate(slot, va, psize, local);
+               ppc_md.hpte_invalidate(slot, va, psize, ssize, local);
        } pte_iterate_hashed_end();
 }
 
@@ -871,7 +913,7 @@ void flush_hash_range(unsigned long number, int local)
 
                for (i = 0; i < number; i++)
                        flush_hash_page(batch->vaddr[i], batch->pte[i],
-                                       batch->psize, local);
+                                       batch->psize, batch->ssize, local);
        }
 }
 
@@ -897,17 +939,19 @@ void low_hash_fault(struct pt_regs *regs, unsigned long address)
 #ifdef CONFIG_DEBUG_PAGEALLOC
 static void kernel_map_linear_page(unsigned long vaddr, unsigned long lmi)
 {
-       unsigned long hash, hpteg, vsid = get_kernel_vsid(vaddr);
-       unsigned long va = (vsid << 28) | (vaddr & 0x0fffffff);
+       unsigned long hash, hpteg;
+       unsigned long vsid = get_kernel_vsid(vaddr, mmu_kernel_ssize);
+       unsigned long va = hpt_va(vaddr, vsid, mmu_kernel_ssize);
        unsigned long mode = _PAGE_ACCESSED | _PAGE_DIRTY |
                _PAGE_COHERENT | PP_RWXX | HPTE_R_N;
        int ret;
 
-       hash = hpt_hash(va, PAGE_SHIFT);
+       hash = hpt_hash(va, PAGE_SHIFT, mmu_kernel_ssize);
        hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
 
        ret = ppc_md.hpte_insert(hpteg, va, __pa(vaddr),
-                                mode, HPTE_V_BOLTED, mmu_linear_psize);
+                                mode, HPTE_V_BOLTED,
+                                mmu_linear_psize, mmu_kernel_ssize);
        BUG_ON (ret < 0);
        spin_lock(&linear_map_hash_lock);
        BUG_ON(linear_map_hash_slots[lmi] & 0x80);
@@ -917,10 +961,11 @@ static void kernel_map_linear_page(unsigned long vaddr, unsigned long lmi)
 
 static void kernel_unmap_linear_page(unsigned long vaddr, unsigned long lmi)
 {
-       unsigned long hash, hidx, slot, vsid = get_kernel_vsid(vaddr);
-       unsigned long va = (vsid << 28) | (vaddr & 0x0fffffff);
+       unsigned long hash, hidx, slot;
+       unsigned long vsid = get_kernel_vsid(vaddr, mmu_kernel_ssize);
+       unsigned long va = hpt_va(vaddr, vsid, mmu_kernel_ssize);
 
-       hash = hpt_hash(va, PAGE_SHIFT);
+       hash = hpt_hash(va, PAGE_SHIFT, mmu_kernel_ssize);
        spin_lock(&linear_map_hash_lock);
        BUG_ON(!(linear_map_hash_slots[lmi] & 0x80));
        hidx = linear_map_hash_slots[lmi] & 0x7f;
@@ -930,7 +975,7 @@ static void kernel_unmap_linear_page(unsigned long vaddr, unsigned long lmi)
                hash = ~hash;
        slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
        slot += hidx & _PTEIDX_GROUP_IX;
-       ppc_md.hpte_invalidate(slot, va, mmu_linear_psize, 0);
+       ppc_md.hpte_invalidate(slot, va, mmu_linear_psize, mmu_kernel_ssize, 0);
 }
 
 void kernel_map_pages(struct page *page, int numpages, int enable)
index 4835f73af3044b7b57d6451cfc7c777a3806f1eb..08f0d9ff7712cb64d9a2be9c69f4786db1d93216 100644 (file)
 #include <asm/mmu_context.h>
 #include <asm/machdep.h>
 #include <asm/cputable.h>
-#include <asm/tlb.h>
 #include <asm/spu.h>
 
-#include <linux/sysctl.h>
-
 #define NUM_LOW_AREAS  (0x100000000UL >> SID_SHIFT)
 #define NUM_HIGH_AREAS (PGTABLE_RANGE >> HTLB_AREA_SHIFT)
 
@@ -406,11 +403,12 @@ int hash_huge_page(struct mm_struct *mm, unsigned long access,
        unsigned long va, rflags, pa;
        long slot;
        int err = 1;
+       int ssize = user_segment_size(ea);
 
        ptep = huge_pte_offset(mm, ea);
 
        /* Search the Linux page table for a match with va */
-       va = (vsid << 28) | (ea & 0x0fffffff);
+       va = hpt_va(ea, vsid, ssize);
 
        /*
         * If no pte found or not present, send the problem up to
@@ -461,19 +459,19 @@ int hash_huge_page(struct mm_struct *mm, unsigned long access,
                /* There MIGHT be an HPTE for this pte */
                unsigned long hash, slot;
 
-               hash = hpt_hash(va, HPAGE_SHIFT);
+               hash = hpt_hash(va, HPAGE_SHIFT, ssize);
                if (old_pte & _PAGE_F_SECOND)
                        hash = ~hash;
                slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
                slot += (old_pte & _PAGE_F_GIX) >> 12;
 
                if (ppc_md.hpte_updatepp(slot, rflags, va, mmu_huge_psize,
-                                        local) == -1)
+                                        ssize, local) == -1)
                        old_pte &= ~_PAGE_HPTEFLAGS;
        }
 
        if (likely(!(old_pte & _PAGE_HASHPTE))) {
-               unsigned long hash = hpt_hash(va, HPAGE_SHIFT);
+               unsigned long hash = hpt_hash(va, HPAGE_SHIFT, ssize);
                unsigned long hpte_group;
 
                pa = pte_pfn(__pte(old_pte)) << PAGE_SHIFT;
@@ -492,7 +490,7 @@ repeat:
 
                /* Insert into the hash table, primary slot */
                slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags, 0,
-                                         mmu_huge_psize);
+                                         mmu_huge_psize, ssize);
 
                /* Primary is full, try the secondary */
                if (unlikely(slot == -1)) {
@@ -500,7 +498,7 @@ repeat:
                                      HPTES_PER_GROUP) & ~0x7UL; 
                        slot = ppc_md.hpte_insert(hpte_group, va, pa, rflags,
                                                  HPTE_V_SECONDARY,
-                                                 mmu_huge_psize);
+                                                 mmu_huge_psize, ssize);
                        if (slot == -1) {
                                if (mftb() & 0x1)
                                        hpte_group = ((hash & htab_hash_mask) *
index e1f5ded851f6ed08c40ff892af4423d7af4b7fa2..977cb1ee5e7269e353755c190cf945931a51413c 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/machdep.h>
 #include <asm/btext.h>
 #include <asm/tlb.h>
-#include <asm/prom.h>
 #include <asm/lmb.h>
 #include <asm/sections.h>
 
@@ -133,6 +132,9 @@ void __init MMU_init(void)
        /* 601 can only access 16MB at the moment */
        if (PVR_VER(mfspr(SPRN_PVR)) == 1)
                __initial_memory_limit = 0x01000000;
+       /* 8xx can only access 8MB at the moment */
+       if (PVR_VER(mfspr(SPRN_PVR)) == 0x50)
+               __initial_memory_limit = 0x00800000;
 
        /* parse args from command line */
        MMU_setup();
@@ -256,3 +258,40 @@ void free_initrd_mem(unsigned long start, unsigned long end)
        }
 }
 #endif
+
+#ifdef CONFIG_PROC_KCORE
+static struct kcore_list kcore_vmem;
+
+static int __init setup_kcore(void)
+{
+       int i;
+
+       for (i = 0; i < lmb.memory.cnt; i++) {
+               unsigned long base;
+               unsigned long size;
+               struct kcore_list *kcore_mem;
+
+               base = lmb.memory.region[i].base;
+               size = lmb.memory.region[i].size;
+
+               kcore_mem = kmalloc(sizeof(struct kcore_list), GFP_ATOMIC);
+               if (!kcore_mem)
+                       panic("%s: kmalloc failed\n", __FUNCTION__);
+
+               /* must stay under 32 bits */
+               if ( 0xfffffffful - (unsigned long)__va(base) < size) {
+                       size = 0xfffffffful - (unsigned long)(__va(base));
+                       printk(KERN_DEBUG "setup_kcore: restrict size=%lx\n",
+                                               size);
+               }
+
+               kclist_add(kcore_mem, __va(base), size);
+       }
+
+       kclist_add(&kcore_vmem, (void *)VMALLOC_START,
+               VMALLOC_END-VMALLOC_START);
+
+       return 0;
+}
+module_init(setup_kcore);
+#endif
index 9f27bb56a61dadfba5f0d644f6e4987dbb91b23b..fa90f6561b9f8fcce44f6f0377c66e02228810db 100644 (file)
@@ -113,6 +113,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)
 }
 #endif
 
+#ifdef CONFIG_PROC_KCORE
 static struct kcore_list kcore_vmem;
 
 static int __init setup_kcore(void)
@@ -139,6 +140,7 @@ static int __init setup_kcore(void)
        return 0;
 }
 module_init(setup_kcore);
+#endif
 
 static void zero_ctor(void *addr, struct kmem_cache *cache, unsigned long flags)
 {
index f0e7eedb1ba36677fe0d1d74d2d3c1dd6bf617b2..32dcfc9b00827f0a6a0bbf90f77dfc6c75948aca 100644 (file)
@@ -42,7 +42,6 @@
 #include <asm/machdep.h>
 #include <asm/btext.h>
 #include <asm/tlb.h>
-#include <asm/prom.h>
 #include <asm/lmb.h>
 #include <asm/sections.h>
 #include <asm/vdso.h>
index 7a78cdc0515a283cd13a6487b558adea435caf8b..1db38ba1f544e003a40c48a9b5652834bfa4bf27 100644 (file)
@@ -28,7 +28,6 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
 {
        int index;
        int err;
-       int new_context = (mm->context.id == 0);
 
 again:
        if (!idr_pre_get(&mmu_context_idr, GFP_KERNEL))
@@ -50,19 +49,13 @@ again:
                return -ENOMEM;
        }
 
-       mm->context.id = index;
-#ifdef CONFIG_PPC_MM_SLICES
        /* The old code would re-promote on fork, we don't do that
         * when using slices as it could cause problem promoting slices
         * that have been forced down to 4K
         */
-       if (new_context)
+       if (slice_mm_new_context(mm))
                slice_set_user_psize(mm, mmu_virtual_psize);
-#else
-       mm->context.user_psize = mmu_virtual_psize;
-       mm->context.sllp = SLB_VSID_USER |
-               mmu_psize_defs[mmu_virtual_psize].sllp;
-#endif
+       mm->context.id = index;
 
        return 0;
 }
index 3dfd10db931a47627b147a2044836d1589262538..3ef0ad2f9ca0a6f1e1edb15effa10b3c7a558ec6 100644 (file)
@@ -87,8 +87,8 @@ static int map_io_page(unsigned long ea, unsigned long pa, int flags)
                 * entry in the hardware page table.
                 *
                 */
-               if (htab_bolt_mapping(ea, (unsigned long)ea + PAGE_SIZE,
-                                     pa, flags, mmu_io_psize)) {
+               if (htab_bolt_mapping(ea, ea + PAGE_SIZE, pa, flags,
+                                     mmu_io_psize, mmu_kernel_ssize)) {
                        printk(KERN_ERR "Failed to do bolted mapping IO "
                               "memory at %016lx !\n", pa);
                        return -ENOMEM;
@@ -228,5 +228,7 @@ void iounmap(volatile void __iomem *token)
 EXPORT_SYMBOL(ioremap);
 EXPORT_SYMBOL(ioremap_flags);
 EXPORT_SYMBOL(__ioremap);
+EXPORT_SYMBOL(__ioremap_at);
 EXPORT_SYMBOL(iounmap);
 EXPORT_SYMBOL(__iounmap);
+EXPORT_SYMBOL(__iounmap_at);
index ff1811ac6c81e837be9c7c5072a364bb32d5d877..6c164cec9d2c6018865783f6d8c5fd3dc70f8cbe 100644 (file)
@@ -43,30 +43,37 @@ static void slb_allocate(unsigned long ea)
        slb_allocate_realmode(ea);
 }
 
-static inline unsigned long mk_esid_data(unsigned long ea, unsigned long slot)
+static inline unsigned long mk_esid_data(unsigned long ea, int ssize,
+                                        unsigned long slot)
 {
-       return (ea & ESID_MASK) | SLB_ESID_V | slot;
+       unsigned long mask;
+
+       mask = (ssize == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T;
+       return (ea & mask) | SLB_ESID_V | slot;
 }
 
-static inline unsigned long mk_vsid_data(unsigned long ea, unsigned long flags)
+#define slb_vsid_shift(ssize)  \
+       ((ssize) == MMU_SEGSIZE_256M? SLB_VSID_SHIFT: SLB_VSID_SHIFT_1T)
+
+static inline unsigned long mk_vsid_data(unsigned long ea, int ssize,
+                                        unsigned long flags)
 {
-       return (get_kernel_vsid(ea) << SLB_VSID_SHIFT) | flags;
+       return (get_kernel_vsid(ea, ssize) << slb_vsid_shift(ssize)) | flags |
+               ((unsigned long) ssize << SLB_VSID_SSIZE_SHIFT);
 }
 
-static inline void slb_shadow_update(unsigned long ea,
+static inline void slb_shadow_update(unsigned long ea, int ssize,
                                     unsigned long flags,
                                     unsigned long entry)
 {
        /*
         * Clear the ESID first so the entry is not valid while we are
-        * updating it.
+        * updating it.  No write barriers are needed here, provided
+        * we only update the current CPU's SLB shadow buffer.
         */
        get_slb_shadow()->save_area[entry].esid = 0;
-       smp_wmb();
-       get_slb_shadow()->save_area[entry].vsid = mk_vsid_data(ea, flags);
-       smp_wmb();
-       get_slb_shadow()->save_area[entry].esid = mk_esid_data(ea, entry);
-       smp_wmb();
+       get_slb_shadow()->save_area[entry].vsid = mk_vsid_data(ea, ssize, flags);
+       get_slb_shadow()->save_area[entry].esid = mk_esid_data(ea, ssize, entry);
 }
 
 static inline void slb_shadow_clear(unsigned long entry)
@@ -74,7 +81,8 @@ static inline void slb_shadow_clear(unsigned long entry)
        get_slb_shadow()->save_area[entry].esid = 0;
 }
 
-static inline void create_shadowed_slbe(unsigned long ea, unsigned long flags,
+static inline void create_shadowed_slbe(unsigned long ea, int ssize,
+                                       unsigned long flags,
                                        unsigned long entry)
 {
        /*
@@ -82,11 +90,11 @@ static inline void create_shadowed_slbe(unsigned long ea, unsigned long flags,
         * we don't get a stale entry here if we get preempted by PHYP
         * between these two statements.
         */
-       slb_shadow_update(ea, flags, entry);
+       slb_shadow_update(ea, ssize, flags, entry);
 
        asm volatile("slbmte  %0,%1" :
-                    : "r" (mk_vsid_data(ea, flags)),
-                      "r" (mk_esid_data(ea, entry))
+                    : "r" (mk_vsid_data(ea, ssize, flags)),
+                      "r" (mk_esid_data(ea, ssize, entry))
                     : "memory" );
 }
 
@@ -95,7 +103,7 @@ void slb_flush_and_rebolt(void)
        /* If you change this make sure you change SLB_NUM_BOLTED
         * appropriately too. */
        unsigned long linear_llp, vmalloc_llp, lflags, vflags;
-       unsigned long ksp_esid_data;
+       unsigned long ksp_esid_data, ksp_vsid_data;
 
        WARN_ON(!irqs_disabled());
 
@@ -104,13 +112,15 @@ void slb_flush_and_rebolt(void)
        lflags = SLB_VSID_KERNEL | linear_llp;
        vflags = SLB_VSID_KERNEL | vmalloc_llp;
 
-       ksp_esid_data = mk_esid_data(get_paca()->kstack, 2);
-       if ((ksp_esid_data & ESID_MASK) == PAGE_OFFSET) {
+       ksp_esid_data = mk_esid_data(get_paca()->kstack, mmu_kernel_ssize, 2);
+       if ((ksp_esid_data & ~0xfffffffUL) <= PAGE_OFFSET) {
                ksp_esid_data &= ~SLB_ESID_V;
+               ksp_vsid_data = 0;
                slb_shadow_clear(2);
        } else {
                /* Update stack entry; others don't change */
-               slb_shadow_update(get_paca()->kstack, lflags, 2);
+               slb_shadow_update(get_paca()->kstack, mmu_kernel_ssize, lflags, 2);
+               ksp_vsid_data = get_slb_shadow()->save_area[2].vsid;
        }
 
        /* We need to do this all in asm, so we're sure we don't touch
@@ -122,9 +132,9 @@ void slb_flush_and_rebolt(void)
                     /* Slot 2 - kernel stack */
                     "slbmte    %2,%3\n"
                     "isync"
-                    :: "r"(mk_vsid_data(VMALLOC_START, vflags)),
-                       "r"(mk_esid_data(VMALLOC_START, 1)),
-                       "r"(mk_vsid_data(ksp_esid_data, lflags)),
+                    :: "r"(mk_vsid_data(VMALLOC_START, mmu_kernel_ssize, vflags)),
+                       "r"(mk_esid_data(VMALLOC_START, mmu_kernel_ssize, 1)),
+                       "r"(ksp_vsid_data),
                        "r"(ksp_esid_data)
                     : "memory");
 }
@@ -134,7 +144,7 @@ void slb_vmalloc_update(void)
        unsigned long vflags;
 
        vflags = SLB_VSID_KERNEL | mmu_psize_defs[mmu_vmalloc_psize].sllp;
-       slb_shadow_update(VMALLOC_START, vflags, 1);
+       slb_shadow_update(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
        slb_flush_and_rebolt();
 }
 
@@ -142,7 +152,7 @@ void slb_vmalloc_update(void)
 void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
 {
        unsigned long offset = get_paca()->slb_cache_ptr;
-       unsigned long esid_data = 0;
+       unsigned long slbie_data = 0;
        unsigned long pc = KSTK_EIP(tsk);
        unsigned long stack = KSTK_ESP(tsk);
        unsigned long unmapped_base;
@@ -151,9 +161,12 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
                int i;
                asm volatile("isync" : : : "memory");
                for (i = 0; i < offset; i++) {
-                       esid_data = ((unsigned long)get_paca()->slb_cache[i]
-                               << SID_SHIFT) | SLBIE_C;
-                       asm volatile("slbie %0" : : "r" (esid_data));
+                       slbie_data = (unsigned long)get_paca()->slb_cache[i]
+                               << SID_SHIFT; /* EA */
+                       slbie_data |= user_segment_size(slbie_data)
+                               << SLBIE_SSIZE_SHIFT;
+                       slbie_data |= SLBIE_C; /* C set for user addresses */
+                       asm volatile("slbie %0" : : "r" (slbie_data));
                }
                asm volatile("isync" : : : "memory");
        } else {
@@ -162,7 +175,7 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
 
        /* Workaround POWER5 < DD2.1 issue */
        if (offset == 1 || offset > SLB_CACHE_ENTRIES)
-               asm volatile("slbie %0" : : "r" (esid_data));
+               asm volatile("slbie %0" : : "r" (slbie_data));
 
        get_paca()->slb_cache_ptr = 0;
        get_paca()->context = mm->context;
@@ -245,9 +258,9 @@ void slb_initialize(void)
        asm volatile("isync":::"memory");
        asm volatile("slbmte  %0,%0"::"r" (0) : "memory");
        asm volatile("isync; slbia; isync":::"memory");
-       create_shadowed_slbe(PAGE_OFFSET, lflags, 0);
+       create_shadowed_slbe(PAGE_OFFSET, mmu_kernel_ssize, lflags, 0);
 
-       create_shadowed_slbe(VMALLOC_START, vflags, 1);
+       create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
 
        /* We don't bolt the stack for the time being - we're in boot,
         * so the stack is in the bolted segment.  By the time it goes
index cd1a93d4948ca85868dd943a60667f541229a26e..1328a81a84aa16d46bb11cb9ba207a6848354f07 100644 (file)
@@ -57,7 +57,10 @@ _GLOBAL(slb_allocate_realmode)
         */
 _GLOBAL(slb_miss_kernel_load_linear)
        li      r11,0
+BEGIN_FTR_SECTION
        b       slb_finish_load
+END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT)
+       b       slb_finish_load_1T
 
 1:     /* vmalloc/ioremap mapping encoding bits, the "li" instructions below
         * will be patched by the kernel at boot
@@ -68,13 +71,16 @@ BEGIN_FTR_SECTION
        cmpldi  r11,(VMALLOC_SIZE >> 28) - 1
        bgt     5f
        lhz     r11,PACAVMALLOCSLLP(r13)
-       b       slb_finish_load
+       b       6f
 5:
 END_FTR_SECTION_IFCLR(CPU_FTR_CI_LARGE_PAGE)
 _GLOBAL(slb_miss_kernel_load_io)
        li      r11,0
+6:
+BEGIN_FTR_SECTION
        b       slb_finish_load
-
+END_FTR_SECTION_IFCLR(CPU_FTR_1T_SEGMENT)
+       b       slb_finish_load_1T
 
 0:     /* user address: proto-VSID = context << 15 | ESID. First check
         * if the address is within the boundaries of the user region
@@ -122,7 +128,13 @@ _GLOBAL(slb_miss_kernel_load_io)
 #endif /* CONFIG_PPC_MM_SLICES */
 
        ld      r9,PACACONTEXTID(r13)
+BEGIN_FTR_SECTION
+       cmpldi  r10,0x1000
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
        rldimi  r10,r9,USER_ESID_BITS,0
+BEGIN_FTR_SECTION
+       bge     slb_finish_load_1T
+END_FTR_SECTION_IFSET(CPU_FTR_1T_SEGMENT)
        b       slb_finish_load
 
 8:     /* invalid EA */
@@ -188,7 +200,7 @@ _GLOBAL(slb_allocate_user)
  * r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET
  */
 slb_finish_load:
-       ASM_VSID_SCRAMBLE(r10,r9)
+       ASM_VSID_SCRAMBLE(r10,r9,256M)
        rldimi  r11,r10,SLB_VSID_SHIFT,16       /* combine VSID and flags */
 
        /* r3 = EA, r11 = VSID data */
@@ -213,7 +225,7 @@ BEGIN_FW_FTR_SECTION
 END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
 #endif /* CONFIG_PPC_ISERIES */
 
-       ld      r10,PACASTABRR(r13)
+7:     ld      r10,PACASTABRR(r13)
        addi    r10,r10,1
        /* use a cpu feature mask if we ever change our slb size */
        cmpldi  r10,SLB_NUM_ENTRIES
@@ -259,3 +271,20 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
        crclr   4*cr0+eq                /* set result to "success" */
        blr
 
+/*
+ * Finish loading of a 1T SLB entry (for the kernel linear mapping) and return.
+ * We assume legacy iSeries will never have 1T segments.
+ *
+ * r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9
+ */
+slb_finish_load_1T:
+       srdi    r10,r10,40-28           /* get 1T ESID */
+       ASM_VSID_SCRAMBLE(r10,r9,1T)
+       rldimi  r11,r10,SLB_VSID_SHIFT_1T,16    /* combine VSID and flags */
+       li      r10,MMU_SEGSIZE_1T
+       rldimi  r11,r10,SLB_VSID_SSIZE_SHIFT,0  /* insert segment size */
+
+       /* r3 = EA, r11 = VSID data */
+       clrrdi  r3,r3,SID_SHIFT_1T      /* clear out non-ESID bits */
+       b       7b
+
index d5fd3909d13a2cb45c01b2c56d236b67ea39b9a5..319826ef164519dd301647fed86bb50c9463d80f 100644 (file)
@@ -551,6 +551,7 @@ EXPORT_SYMBOL_GPL(get_slice_psize);
  *
  * This is also called in init_new_context() to change back the user
  * psize from whatever the parent context had it set to
+ * N.B. This may be called before mm->context.id has been set.
  *
  * This function will only change the content of the {low,high)_slice_psize
  * masks, it will not flush SLBs as this shall be handled lazily by the
index 28492bbdee8e3e0fad592ed705c9f00c71ee2dba..9e85bda762166a7c16e54cabcab97114815fbbf7 100644 (file)
@@ -122,12 +122,12 @@ static int __ste_allocate(unsigned long ea, struct mm_struct *mm)
 
        /* Kernel or user address? */
        if (is_kernel_addr(ea)) {
-               vsid = get_kernel_vsid(ea);
+               vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M);
        } else {
                if ((ea >= TASK_SIZE_USER64) || (! mm))
                        return 1;
 
-               vsid = get_vsid(mm->context.id, ea);
+               vsid = get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M);
        }
 
        stab_entry = make_ste(get_paca()->stab_addr, GET_ESID(ea), vsid);
@@ -261,7 +261,7 @@ void __init stabs_alloc(void)
  */
 void stab_initialize(unsigned long stab)
 {
-       unsigned long vsid = get_kernel_vsid(PAGE_OFFSET);
+       unsigned long vsid = get_kernel_vsid(PAGE_OFFSET, MMU_SEGSIZE_256M);
        unsigned long stabreal;
 
        asm volatile("isync; slbia; isync":::"memory");
index cbd34fc813eee1ad21c39e05a1366f7bb397e9ef..eafbca52bff9ce1e4e58cc23d5ff03943434e6a0 100644 (file)
@@ -132,6 +132,7 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
        struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
        unsigned long vsid, vaddr;
        unsigned int psize;
+       int ssize;
        real_pte_t rpte;
        int i;
 
@@ -161,11 +162,14 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
 
        /* Build full vaddr */
        if (!is_kernel_addr(addr)) {
-               vsid = get_vsid(mm->context.id, addr);
+               ssize = user_segment_size(addr);
+               vsid = get_vsid(mm->context.id, addr, ssize);
                WARN_ON(vsid == 0);
-       } else
-               vsid = get_kernel_vsid(addr);
-       vaddr = (vsid << 28 ) | (addr & 0x0fffffff);
+       } else {
+               vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
+               ssize = mmu_kernel_ssize;
+       }
+       vaddr = hpt_va(addr, vsid, ssize);
        rpte = __real_pte(__pte(pte), ptep);
 
        /*
@@ -175,7 +179,7 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
         * and decide to use local invalidates instead...
         */
        if (!batch->active) {
-               flush_hash_page(vaddr, rpte, psize, 0);
+               flush_hash_page(vaddr, rpte, psize, ssize, 0);
                return;
        }
 
@@ -189,13 +193,15 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
         * We also need to ensure only one page size is present in a given
         * batch
         */
-       if (i != 0 && (mm != batch->mm || batch->psize != psize)) {
+       if (i != 0 && (mm != batch->mm || batch->psize != psize ||
+                      batch->ssize != ssize)) {
                __flush_tlb_pending(batch);
                i = 0;
        }
        if (i == 0) {
                batch->mm = mm;
                batch->psize = psize;
+               batch->ssize = ssize;
        }
        batch->pte[i] = rpte;
        batch->vaddr[i] = vaddr;
@@ -222,7 +228,7 @@ void __flush_tlb_pending(struct ppc64_tlb_batch *batch)
                local = 1;
        if (i == 1)
                flush_hash_page(batch->vaddr[0], batch->pte[0],
-                               batch->psize, local);
+                               batch->psize, batch->ssize, local);
        else
                flush_hash_range(i, local);
        batch->index = 0;
index e5704f00c8b4be2f4783a5ec7391b8a60be1853e..22e4e8d4eb2c706daa7ad3481e87e4cc10afaf2b 100644 (file)
 #include <linux/cpumask.h>
 #include <linux/oprofile.h>
 #include <asm/cell-pmu.h>
+#include <asm/cell-regs.h>
 #include <asm/spu.h>
 
-#include "../../platforms/cell/cbe_regs.h"
-
 /* Defines used for sync_start */
 #define SKIP_GENERIC_SYNC 0
 #define SYNC_START_ERROR -1
index d928b54f3a0fb9df3b03bc475b05d0f643e19429..bb6bff51ce484e6dbc4b315cc1815e3fe04b0d1c 100644 (file)
@@ -35,9 +35,9 @@
 #include <asm/reg.h>
 #include <asm/rtas.h>
 #include <asm/system.h>
+#include <asm/cell-regs.h>
 
 #include "../platforms/cell/interrupt.h"
-#include "../platforms/cell/cbe_regs.h"
 #include "cell/pr_util.h"
 
 static void cell_global_stop_spu(void);
diff --git a/arch/powerpc/platforms/40x/Kconfig b/arch/powerpc/platforms/40x/Kconfig
new file mode 100644 (file)
index 0000000..47b3b0a
--- /dev/null
@@ -0,0 +1,150 @@
+#config BUBINGA
+#      bool "Bubinga"
+#      depends on 40x
+#      default n
+#      select 405EP
+#      help
+#        This option enables support for the IBM 405EP evaluation board.
+
+#config CPCI405
+#      bool "CPCI405"
+#      depends on 40x
+#      default n
+#      select 405GP
+#      help
+#        This option enables support for the CPCI405 board.
+
+#config EP405
+#      bool "EP405/EP405PC"
+#      depends on 40x
+#      default n
+#      select 405GP
+#      help
+#        This option enables support for the EP405/EP405PC boards.
+
+#config EP405PC
+#      bool "EP405PC Support"
+#      depends on EP405
+#      default y
+#      help
+#        This option enables support for the extra features of the EP405PC board.
+
+config KILAUEA
+       bool "Kilauea"
+       depends on 40x
+       default n
+       help
+         This option enables support for the AMCC PPC405EX evaluation board.
+
+#config REDWOOD_5
+#      bool "Redwood-5"
+#      depends on 40x
+#      default n
+#      select STB03xxx
+#      help
+#        This option enables support for the IBM STB04 evaluation board.
+
+#config REDWOOD_6
+#      bool "Redwood-6"
+#      depends on 40x
+#      default n
+#      select STB03xxx
+#      help
+#        This option enables support for the IBM STBx25xx evaluation board.
+
+#config SYCAMORE
+#      bool "Sycamore"
+#      depends on 40x
+#      default n
+#      select 405GPR
+#      help
+#        This option enables support for the IBM PPC405GPr evaluation board.
+
+config WALNUT
+       bool "Walnut"
+       depends on 40x
+       default y
+       select 405GP
+       help
+         This option enables support for the IBM PPC405GP evaluation board.
+
+config XILINX_VIRTEX_GENERIC_BOARD
+       bool "Generic Xilinx Virtex board"
+       depends on 40x
+       default n
+       select XILINX_VIRTEX_II_PRO
+       select XILINX_VIRTEX_4_FX
+       help
+         This option enables generic support for Xilinx Virtex based boards.
+
+         The generic virtex board support matches any device tree which
+         specifies 'xilinx,virtex' in its compatible field.  This includes
+         the Xilinx ML3xx and ML4xx reference designs using the powerpc
+         core.
+
+         Most Virtex designs should use this unless it needs to do some
+         special configuration at board probe time.
+
+# 40x specific CPU modules, selected based on the board above.
+config NP405H
+       bool
+       #depends on ASH
+
+# OAK doesn't exist but wanted to keep this around for any future 403GCX boards
+config 403GCX
+       bool
+       #depends on OAK
+       select IBM405_ERR51
+
+config 405GP
+       bool
+       select IBM405_ERR77
+       select IBM405_ERR51
+
+config 405EP
+       bool
+
+config 405GPR
+       bool
+
+config XILINX_VIRTEX
+       bool
+
+config XILINX_VIRTEX_II_PRO
+       bool
+       select XILINX_VIRTEX
+       select IBM405_ERR77
+       select IBM405_ERR51
+
+config XILINX_VIRTEX_4_FX
+       bool
+       select XILINX_VIRTEX
+
+config STB03xxx
+       bool
+       select IBM405_ERR77
+       select IBM405_ERR51
+
+# 40x errata/workaround config symbols, selected by the CPU models above
+
+# All 405-based cores up until the 405GPR and 405EP have this errata.
+config IBM405_ERR77
+       bool
+
+# All 40x-based cores, up until the 405GPR and 405EP have this errata.
+config IBM405_ERR51
+       bool
+
+#config BIOS_FIXUP
+#      bool
+#      depends on BUBINGA || EP405 || SYCAMORE || WALNUT
+#      default y
+
+#config PPC4xx_DMA
+#      bool "PPC4xx DMA controller support"
+#      depends on 4xx
+
+#config PPC4xx_EDMA
+#      bool
+#      depends on !STB03xxx && PPC4xx_DMA
+#      default y
diff --git a/arch/powerpc/platforms/40x/Makefile b/arch/powerpc/platforms/40x/Makefile
new file mode 100644 (file)
index 0000000..51dadee
--- /dev/null
@@ -0,0 +1,3 @@
+obj-$(CONFIG_KILAUEA)                          += kilauea.o
+obj-$(CONFIG_WALNUT)                           += walnut.o
+obj-$(CONFIG_XILINX_VIRTEX_GENERIC_BOARD)      += virtex.o
diff --git a/arch/powerpc/platforms/40x/kilauea.c b/arch/powerpc/platforms/40x/kilauea.c
new file mode 100644 (file)
index 0000000..1bffdbd
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Kilauea board specific routines
+ *
+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
+ *
+ * Based on the Walnut code by
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ * Copyright 2007 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.
+ */
+#include <linux/init.h>
+#include <linux/of_platform.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/time.h>
+#include <asm/uic.h>
+
+static struct of_device_id kilauea_of_bus[] = {
+       { .compatible = "ibm,plb4", },
+       { .compatible = "ibm,opb", },
+       { .compatible = "ibm,ebc", },
+       {},
+};
+
+static int __init kilauea_device_probe(void)
+{
+       if (!machine_is(kilauea))
+               return 0;
+
+       of_platform_bus_probe(NULL, kilauea_of_bus, NULL);
+
+       return 0;
+}
+device_initcall(kilauea_device_probe);
+
+static int __init kilauea_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (!of_flat_dt_is_compatible(root, "amcc,kilauea"))
+               return 0;
+
+       return 1;
+}
+
+define_machine(kilauea) {
+       .name                           = "Kilauea",
+       .probe                          = kilauea_probe,
+       .progress                       = udbg_progress,
+       .init_IRQ                       = uic_init_tree,
+       .get_irq                        = uic_get_irq,
+       .calibrate_decr                 = generic_calibrate_decr,
+};
diff --git a/arch/powerpc/platforms/40x/virtex.c b/arch/powerpc/platforms/40x/virtex.c
new file mode 100644 (file)
index 0000000..14bbc32
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Xilinx Virtex (IIpro & 4FX) based board support
+ *
+ * Copyright 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/init.h>
+#include <linux/of_platform.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/time.h>
+#include <asm/xilinx_intc.h>
+
+static int __init virtex_device_probe(void)
+{
+       if (!machine_is(virtex))
+               return 0;
+
+       of_platform_bus_probe(NULL, NULL, NULL);
+
+       return 0;
+}
+device_initcall(virtex_device_probe);
+
+static int __init virtex_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (!of_flat_dt_is_compatible(root, "xilinx,virtex"))
+               return 0;
+
+       return 1;
+}
+
+define_machine(virtex) {
+       .name                   = "Xilinx Virtex",
+       .probe                  = virtex_probe,
+       .init_IRQ               = xilinx_intc_init_tree,
+       .get_irq                = xilinx_intc_get_irq,
+       .calibrate_decr         = generic_calibrate_decr,
+};
diff --git a/arch/powerpc/platforms/40x/walnut.c b/arch/powerpc/platforms/40x/walnut.c
new file mode 100644 (file)
index 0000000..eb0c136
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Architecture- / platform-specific boot-time initialization code for
+ * IBM PowerPC 4xx based boards. Adapted from original
+ * code by Gary Thomas, Cort Dougan <cort@fsmlabs.com>, and Dan Malek
+ * <dan@net4x.com>.
+ *
+ * Copyright(c) 1999-2000 Grant Erickson <grant@lcse.umn.edu>
+ *
+ * Rewritten and ported to the merged powerpc tree:
+ * Copyright 2007 IBM Corporation
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ *
+ * 2002 (c) MontaVista, Software, Inc.  This file is licensed under
+ * the terms of the GNU General Public License version 2.  This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+
+#include <linux/init.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/time.h>
+#include <asm/uic.h>
+#include <asm/of_platform.h>
+
+static struct of_device_id walnut_of_bus[] = {
+       { .compatible = "ibm,plb3", },
+       { .compatible = "ibm,opb", },
+       { .compatible = "ibm,ebc", },
+       {},
+};
+
+static int __init walnut_device_probe(void)
+{
+       if (!machine_is(walnut))
+               return 0;
+
+       /* FIXME: do bus probe here */
+       of_platform_bus_probe(NULL, walnut_of_bus, NULL);
+
+       return 0;
+}
+device_initcall(walnut_device_probe);
+
+static int __init walnut_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (!of_flat_dt_is_compatible(root, "ibm,walnut"))
+               return 0;
+
+       return 1;
+}
+
+define_machine(walnut) {
+       .name                   = "Walnut",
+       .probe                  = walnut_probe,
+       .progress               = udbg_progress,
+       .init_IRQ               = uic_init_tree,
+       .get_irq                = uic_get_irq,
+       .calibrate_decr = generic_calibrate_decr,
+};
index 8e66949e7c67c0b391b41e1beeafa57f5112de35..51f3ea40a285be0c24e3aadd1a24034a34857742 100644 (file)
@@ -1,10 +1,10 @@
-#config BAMBOO
-#      bool "Bamboo"
-#      depends on 44x
-#      default n
-#      select 440EP
-#      help
-#        This option enables support for the IBM PPC440EP evaluation board.
+config BAMBOO
+       bool "Bamboo"
+       depends on 44x
+       default n
+       select 440EP
+       help
+         This option enables support for the IBM PPC440EP evaluation board.
 
 config EBONY
        bool "Ebony"
@@ -14,6 +14,14 @@ config EBONY
        help
          This option enables support for the IBM PPC440GP evaluation board.
 
+config SEQUOIA
+       bool "Sequoia"
+       depends on 44x
+       default n
+       select 440EPX
+       help
+         This option enables support for the AMCC PPC440EPX evaluation board.
+
 #config LUAN
 #      bool "Luan"
 #      depends on 44x
@@ -35,6 +43,14 @@ config 440EP
        bool
        select PPC_FPU
        select IBM440EP_ERR42
+#      select IBM_NEW_EMAC_ZMII
+
+config 440EPX
+       bool
+       select PPC_FPU
+# Disabled until the new EMAC Driver is merged.
+#      select IBM_NEW_EMAC_EMAC4
+#      select IBM_NEW_EMAC_ZMII
 
 config 440GP
        bool
@@ -48,7 +64,7 @@ config 440SP
 
 config 440A
        bool
-       depends on 440GX
+       depends on 440GX || 440EPX
        default y
 
 # 44x errata/workaround config symbols, selected by the CPU models above
index 41d0a18a0e4478aff0f44e8e12bdc07042c20fcd..10ce6740cc7d021e8405020f4b0a56c7d32f542f 100644 (file)
@@ -1,2 +1,4 @@
 obj-$(CONFIG_44x)      := misc_44x.o
 obj-$(CONFIG_EBONY)    += ebony.o
+obj-$(CONFIG_BAMBOO) += bamboo.o
+obj-$(CONFIG_SEQUOIA)  += sequoia.o
diff --git a/arch/powerpc/platforms/44x/bamboo.c b/arch/powerpc/platforms/44x/bamboo.c
new file mode 100644 (file)
index 0000000..470e1a3
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Bamboo board specific routines
+ *
+ * Wade Farnsworth <wfarnsworth@mvista.com>
+ * Copyright 2004 MontaVista Software Inc.
+ *
+ * Rewritten and ported to the merged powerpc tree:
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ * Copyright 2007 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.
+ */
+#include <linux/init.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/time.h>
+#include <asm/uic.h>
+#include <asm/of_platform.h>
+#include "44x.h"
+
+static struct of_device_id bamboo_of_bus[] = {
+       { .compatible = "ibm,plb4", },
+       { .compatible = "ibm,opb", },
+       { .compatible = "ibm,ebc", },
+       {},
+};
+
+static int __init bamboo_device_probe(void)
+{
+       if (!machine_is(bamboo))
+               return 0;
+
+       of_platform_bus_probe(NULL, bamboo_of_bus, NULL);
+
+       return 0;
+}
+device_initcall(bamboo_device_probe);
+
+static int __init bamboo_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (!of_flat_dt_is_compatible(root, "amcc,bamboo"))
+               return 0;
+
+       return 1;
+}
+
+define_machine(bamboo) {
+       .name                           = "Bamboo",
+       .probe                          = bamboo_probe,
+       .progress                       = udbg_progress,
+       .init_IRQ                       = uic_init_tree,
+       .get_irq                        = uic_get_irq,
+       .restart                        = ppc44x_reset_system,
+       .calibrate_decr         = generic_calibrate_decr,
+};
index 5a7fec8d10d386628a60e40a04cd3bc972b143a7..40e18fcb666c09ba0f1d7822ded77d560182cc5c 100644 (file)
@@ -57,14 +57,9 @@ static int __init ebony_probe(void)
        return 1;
 }
 
-static void __init ebony_setup_arch(void)
-{
-}
-
 define_machine(ebony) {
        .name                   = "Ebony",
        .probe                  = ebony_probe,
-       .setup_arch             = ebony_setup_arch,
        .progress               = udbg_progress,
        .init_IRQ               = uic_init_tree,
        .get_irq                = uic_get_irq,
diff --git a/arch/powerpc/platforms/44x/sequoia.c b/arch/powerpc/platforms/44x/sequoia.c
new file mode 100644 (file)
index 0000000..30700b3
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Sequoia board specific routines
+ *
+ * Valentine Barshak <vbarshak@ru.mvista.com>
+ * Copyright 2007 MontaVista Software Inc.
+ *
+ * Based on the Bamboo code by
+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
+ * Copyright 2007 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.
+ */
+#include <linux/init.h>
+#include <asm/machdep.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/time.h>
+#include <asm/uic.h>
+#include <asm/of_platform.h>
+#include "44x.h"
+
+static struct of_device_id sequoia_of_bus[] = {
+       { .compatible = "ibm,plb4", },
+       { .compatible = "ibm,opb", },
+       { .compatible = "ibm,ebc", },
+       {},
+};
+
+static int __init sequoia_device_probe(void)
+{
+       if (!machine_is(sequoia))
+               return 0;
+
+       of_platform_bus_probe(NULL, sequoia_of_bus, NULL);
+
+       return 0;
+}
+device_initcall(sequoia_device_probe);
+
+static int __init sequoia_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (!of_flat_dt_is_compatible(root, "amcc,sequoia"))
+               return 0;
+
+       return 1;
+}
+
+define_machine(sequoia) {
+       .name                           = "Sequoia",
+       .probe                          = sequoia_probe,
+       .progress                       = udbg_progress,
+       .init_IRQ                       = uic_init_tree,
+       .get_irq                        = uic_get_irq,
+       .restart                        = ppc44x_reset_system,
+       .calibrate_decr                 = generic_calibrate_decr,
+};
diff --git a/arch/powerpc/platforms/4xx/Kconfig b/arch/powerpc/platforms/4xx/Kconfig
deleted file mode 100644 (file)
index ded357c..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-config 4xx
-       bool
-       depends on 40x || 44x
-       default y
-
-config BOOKE
-       bool
-       depends on 44x
-       default y
-
-menu "AMCC 40x options"
-       depends on 40x
-
-#config BUBINGA
-#      bool "Bubinga"
-#      depends on 40x
-#      default n
-#      select 405EP
-#      help
-#        This option enables support for the IBM 405EP evaluation board.
-
-#config CPCI405
-#      bool "CPCI405"
-#      depends on 40x
-#      default n
-#      select 405GP
-#      help
-#        This option enables support for the CPCI405 board.
-
-#config EP405
-#      bool "EP405/EP405PC"
-#      depends on 40x
-#      default n
-#      select 405GP
-#      help
-#        This option enables support for the EP405/EP405PC boards.
-
-#config EP405PC
-#      bool "EP405PC Support"
-#      depends on EP405
-#      default y
-#      help
-#        This option enables support for the extra features of the EP405PC board.
-
-#config REDWOOD_5
-#      bool "Redwood-5"
-#      depends on 40x
-#      default n
-#      select STB03xxx
-#      help
-#        This option enables support for the IBM STB04 evaluation board.
-
-#config REDWOOD_6
-#      bool "Redwood-6"
-#      depends on 40x
-#      default n
-#      select STB03xxx
-#      help
-#        This option enables support for the IBM STBx25xx evaluation board.
-
-#config SYCAMORE
-#      bool "Sycamore"
-#      depends on 40x
-#      default n
-#      select 405GPR
-#      help
-#        This option enables support for the IBM PPC405GPr evaluation board.
-
-#config WALNUT
-#      bool "Walnut"
-#      depends on 40x
-#      default y
-#      select 405GP
-#      help
-#        This option enables support for the IBM PPC405GP evaluation board.
-
-#config XILINX_ML300
-#      bool "Xilinx-ML300"
-#      depends on 40x
-#      default y
-#      select VIRTEX_II_PRO
-#      help
-#        This option enables support for the Xilinx ML300 evaluation board.
-
-endmenu
-
-# 40x specific CPU modules, selected based on the board above.
-config NP405H
-       bool
-       #depends on ASH
-
-# OAK doesn't exist but wanted to keep this around for any future 403GCX boards
-config 403GCX
-       bool
-       #depends on OAK
-       select IBM405_ERR51
-
-config 405GP
-       bool
-       select IBM405_ERR77
-       select IBM405_ERR51
-
-config 405EP
-       bool
-
-config 405GPR
-       bool
-
-config VIRTEX_II_PRO
-       bool
-       select IBM405_ERR77
-       select IBM405_ERR51
-
-config STB03xxx
-       bool
-       select IBM405_ERR77
-       select IBM405_ERR51
-
-# 40x errata/workaround config symbols, selected by the CPU models above
-
-# All 405-based cores up until the 405GPR and 405EP have this errata.
-config IBM405_ERR77
-       bool
-
-# All 40x-based cores, up until the 405GPR and 405EP have this errata.
-config IBM405_ERR51
-       bool
-
-menu "AMCC 44x options"
-       depends on 44x
-
-#config BAMBOO
-#      bool "Bamboo"
-#      depends on 44x
-#      default n
-#      select 440EP
-#      help
-#        This option enables support for the IBM PPC440EP evaluation board.
-
-config EBONY
-       bool "Ebony"
-       depends on 44x
-       default y
-       select 440GP
-       help
-         This option enables support for the IBM PPC440GP evaluation board.
-
-#config LUAN
-#      bool "Luan"
-#      depends on 44x
-#      default n
-#      select 440SP
-#      help
-#        This option enables support for the IBM PPC440SP evaluation board.
-
-#config OCOTEA
-#      bool "Ocotea"
-#      depends on 44x
-#      default n
-#      select 440GX
-#      help
-#        This option enables support for the IBM PPC440GX evaluation board.
-
-endmenu
-
-# 44x specific CPU modules, selected based on the board above.
-config 440EP
-       bool
-       select PPC_FPU
-       select IBM440EP_ERR42
-
-config 440GP
-       bool
-       select IBM_NEW_EMAC_ZMII
-
-config 440GX
-       bool
-
-config 440SP
-       bool
-
-config 440A
-       bool
-       depends on 440GX
-       default y
-
-# 44x errata/workaround config symbols, selected by the CPU models above
-config IBM440EP_ERR42
-       bool
-
-#config XILINX_OCP
-#      bool
-#      depends on XILINX_ML300
-#      default y
-
-#config BIOS_FIXUP
-#      bool
-#      depends on BUBINGA || EP405 || SYCAMORE || WALNUT
-#      default y
-
-#config PPC4xx_DMA
-#      bool "PPC4xx DMA controller support"
-#      depends on 4xx
-
-#config PPC4xx_EDMA
-#      bool
-#      depends on !STB03xxx && PPC4xx_DMA
-#      default y
diff --git a/arch/powerpc/platforms/4xx/Makefile b/arch/powerpc/platforms/4xx/Makefile
deleted file mode 100644 (file)
index 79ff6b1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-# empty makefile so make clean works
\ No newline at end of file
index 3ffaa066c2c8b5660863d76647e8500b40d84235..2938d4927b83b0e20879dbbaa84c25557362d833 100644 (file)
@@ -1,6 +1,7 @@
 config PPC_MPC52xx
        bool
        select FSL_SOC
+       select PPC_CLOCK
        default n
 
 config PPC_MPC5200
@@ -30,6 +31,7 @@ config PPC_EFIKA
 config PPC_LITE5200
        bool "Freescale Lite5200 Eval Board"
        depends on PPC_MULTIPLATFORM && PPC32
+       select WANT_DEVICE_TREE
        select PPC_MPC5200
        default n
 
index b91e39c84d4687ff5559d05e3e5721037e5458ce..307dbc178091954ef91f9afb2a0d08bbc8d301c1 100644 (file)
@@ -10,3 +10,6 @@ obj-$(CONFIG_PPC_EFIKA)               += efika.o
 obj-$(CONFIG_PPC_LITE5200)     += lite5200.o
 
 obj-$(CONFIG_PM)               += mpc52xx_sleep.o mpc52xx_pm.o
+ifeq ($(CONFIG_PPC_LITE5200),y)
+       obj-$(CONFIG_PM)        += lite5200_sleep.o lite5200_pm.o
+endif
index 4be6e7a17b66037ae0804e8dba00c67eed4cfc73..a0da70c8b502ad803fc8c36a593a765cbd09ee95 100644 (file)
@@ -9,33 +9,16 @@
  * kind, whether express or implied.
  */
 
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/utsrelease.h>
-#include <linux/seq_file.h>
-#include <linux/string.h>
-#include <linux/root_dev.h>
-#include <linux/initrd.h>
-#include <linux/timer.h>
 #include <linux/pci.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/sections.h>
-#include <asm/pci-bridge.h>
-#include <asm/pgtable.h>
+#include <linux/of.h>
 #include <asm/prom.h>
 #include <asm/time.h>
 #include <asm/machdep.h>
 #include <asm/rtas.h>
-#include <asm/of_device.h>
-#include <asm/of_platform.h>
 #include <asm/mpc52xx.h>
 
-
 #define EFIKA_PLATFORM_NAME "Efika"
 
 
@@ -78,8 +61,8 @@ static int rtas_write_config(struct pci_bus *bus, unsigned int devfn,
 }
 
 static struct pci_ops rtas_pci_ops = {
-       rtas_read_config,
-       rtas_write_config
+       .read = rtas_read_config,
+       .write = rtas_write_config,
 };
 
 
@@ -197,15 +180,6 @@ static void __init efika_setup_arch(void)
 {
        rtas_initialize();
 
-#ifdef CONFIG_BLK_DEV_INITRD
-       initrd_below_start_ok = 1;
-
-       if (initrd_start)
-               ROOT_DEV = Root_RAM0;
-       else
-#endif
-               ROOT_DEV = Root_SDA2;   /* sda2 (sda1 is for the kernel) */
-
        efika_pcisetup();
 
 #ifdef CONFIG_PM
index 5c46e898fd4526dc3a4f69681d132a26505cf1cc..0caa3d955c3b2b6948c620104c21f63fe5589ccc 100644 (file)
 
 #undef DEBUG
 
-#include <linux/stddef.h>
-#include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/reboot.h>
 #include <linux/pci.h>
-#include <linux/kdev_t.h>
-#include <linux/major.h>
-#include <linux/console.h>
-#include <linux/delay.h>
-#include <linux/seq_file.h>
-#include <linux/root_dev.h>
-#include <linux/initrd.h>
-
-#include <asm/system.h>
-#include <asm/atomic.h>
+#include <linux/of.h>
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/ipic.h>
-#include <asm/bootinfo.h>
-#include <asm/irq.h>
 #include <asm/prom.h>
-#include <asm/udbg.h>
-#include <sysdev/fsl_soc.h>
-#include <asm/of_platform.h>
-
 #include <asm/mpc52xx.h>
 
 /* ************************************************************************
  *
  */
 
+/*
+ * Fix clock configuration.
+ *
+ * Firmware is supposed to be responsible for this.  If you are creating a
+ * new board port, do *NOT* duplicate this code.  Fix your boot firmware
+ * to set it correctly in the first place
+ */
+static void __init
+lite5200_fix_clock_config(void)
+{
+       struct mpc52xx_cdm  __iomem *cdm;
+
+       /* Map zones */
+       cdm = mpc52xx_find_and_map("mpc5200-cdm");
+       if (!cdm) {
+               printk(KERN_ERR "%s() failed; expect abnormal behaviour\n",
+                      __FUNCTION__);
+               return;
+       }
+
+       /* Use internal 48 Mhz */
+       out_8(&cdm->ext_48mhz_en, 0x00);
+       out_8(&cdm->fd_enable, 0x01);
+       if (in_be32(&cdm->rstcfg) & 0x40)       /* Assumes 33Mhz clock */
+               out_be16(&cdm->fd_counters, 0x0001);
+       else
+               out_be16(&cdm->fd_counters, 0x5555);
+
+       /* Unmap the regs */
+       iounmap(cdm);
+}
+
+/*
+ * Fix setting of port_config register.
+ *
+ * Firmware is supposed to be responsible for this.  If you are creating a
+ * new board port, do *NOT* duplicate this code.  Fix your boot firmware
+ * to set it correctly in the first place
+ */
 static void __init
-lite5200_setup_cpu(void)
+lite5200_fix_port_config(void)
 {
        struct mpc52xx_gpio __iomem *gpio;
        u32 port_config;
 
-       /* Map zones */
        gpio = mpc52xx_find_and_map("mpc5200-gpio");
        if (!gpio) {
-               printk(KERN_ERR __FILE__ ": "
-                       "Error while mapping GPIO register for port config. "
-                       "Expect some abnormal behavior\n");
-               goto error;
+               printk(KERN_ERR "%s() failed. expect abnormal behavior\n",
+                      __FUNCTION__);
+               return;
        }
 
        /* Set port config */
@@ -81,12 +98,10 @@ lite5200_setup_cpu(void)
        out_be32(&gpio->port_config, port_config);
 
        /* Unmap zone */
-error:
        iounmap(gpio);
 }
 
 #ifdef CONFIG_PM
-static u32 descr_a;
 static void lite5200_suspend_prepare(void __iomem *mbar)
 {
        u8 pin = 1;     /* GPIO_WKUP_1 (GPIO_PSC2_4) */
@@ -97,42 +112,41 @@ static void lite5200_suspend_prepare(void __iomem *mbar)
         * power down usb port
         * this needs to be called before of-ohci suspend code
         */
-       descr_a = in_be32(mbar + 0x1048);
-       out_be32(mbar + 0x1048, (descr_a & ~0x200) | 0x100);
+
+       /* set ports to "power switched" and "powered at the same time"
+        * USB Rh descriptor A: NPS = 0, PSM = 0 */
+       out_be32(mbar + 0x1048, in_be32(mbar + 0x1048) & ~0x300);
+       /* USB Rh status: LPS = 1 - turn off power */
+       out_be32(mbar + 0x1050, 0x00000001);
 }
 
 static void lite5200_resume_finish(void __iomem *mbar)
 {
-       out_be32(mbar + 0x1048, descr_a);
+       /* USB Rh status: LPSC = 1 - turn on power */
+       out_be32(mbar + 0x1050, 0x00010000);
 }
 #endif
 
 static void __init lite5200_setup_arch(void)
 {
+#ifdef CONFIG_PCI
        struct device_node *np;
+#endif
 
        if (ppc_md.progress)
                ppc_md.progress("lite5200_setup_arch()", 0);
 
-       np = of_find_node_by_type(NULL, "cpu");
-       if (np) {
-               const unsigned int *fp =
-                       of_get_property(np, "clock-frequency", NULL);
-               if (fp != 0)
-                       loops_per_jiffy = *fp / HZ;
-               else
-                       loops_per_jiffy = 50000000 / HZ;
-               of_node_put(np);
-       }
+       /* Fix things that firmware should have done. */
+       lite5200_fix_clock_config();
+       lite5200_fix_port_config();
 
-       /* CPU & Port mux setup */
-       mpc52xx_setup_cpu();    /* Generic */
-       lite5200_setup_cpu();   /* Platorm specific */
+       /* Some mpc5200 & mpc5200b related configuration */
+       mpc5200_setup_xlb_arbiter();
 
 #ifdef CONFIG_PM
        mpc52xx_suspend.board_suspend_prepare = lite5200_suspend_prepare;
        mpc52xx_suspend.board_resume_finish = lite5200_resume_finish;
-       mpc52xx_pm_init();
+       lite5200_pm_init();
 #endif
 
 #ifdef CONFIG_PCI
@@ -156,20 +170,6 @@ static void __init lite5200_setup_arch(void)
 
 }
 
-static void lite5200_show_cpuinfo(struct seq_file *m)
-{
-       struct device_node* np = of_find_all_nodes(NULL);
-       const char *model = NULL;
-
-       if (np)
-               model = of_get_property(np, "model", NULL);
-
-       seq_printf(m, "vendor\t\t:      Freescale Semiconductor\n");
-       seq_printf(m, "machine\t\t:     %s\n", model ? model : "unknown");
-
-       of_node_put(np);
-}
-
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
@@ -193,6 +193,5 @@ define_machine(lite5200) {
        .init           = mpc52xx_declare_of_platform_devices,
        .init_IRQ       = mpc52xx_init_irq,
        .get_irq        = mpc52xx_get_irq,
-       .show_cpuinfo   = lite5200_show_cpuinfo,
        .calibrate_decr = generic_calibrate_decr,
 };
diff --git a/arch/powerpc/platforms/52xx/lite5200_pm.c b/arch/powerpc/platforms/52xx/lite5200_pm.c
new file mode 100644 (file)
index 0000000..f26afcd
--- /dev/null
@@ -0,0 +1,213 @@
+#include <linux/init.h>
+#include <linux/pm.h>
+#include <asm/io.h>
+#include <asm/time.h>
+#include <asm/mpc52xx.h>
+#include "mpc52xx_pic.h"
+
+/* defined in lite5200_sleep.S and only used here */
+extern void lite5200_low_power(void __iomem *sram, void __iomem *mbar);
+
+static struct mpc52xx_cdm __iomem *cdm;
+static struct mpc52xx_intr __iomem *pic;
+static struct mpc52xx_sdma __iomem *bes;
+static struct mpc52xx_xlb __iomem *xlb;
+static struct mpc52xx_gpio __iomem *gps;
+static struct mpc52xx_gpio_wkup __iomem *gpw;
+static void __iomem *sram;
+static const int sram_size = 0x4000;   /* 16 kBytes */
+static void __iomem *mbar;
+
+static int lite5200_pm_valid(suspend_state_t state)
+{
+       switch (state) {
+       case PM_SUSPEND_STANDBY:
+       case PM_SUSPEND_MEM:
+               return 1;
+       default:
+               return 0;
+       }
+}
+
+static int lite5200_pm_prepare(suspend_state_t state)
+{
+       /* deep sleep? let mpc52xx code handle that */
+       if (state == PM_SUSPEND_STANDBY)
+               return mpc52xx_pm_prepare(state);
+
+       if (state != PM_SUSPEND_MEM)
+               return -EINVAL;
+
+       /* map registers */
+       mbar = mpc52xx_find_and_map("mpc5200");
+       if (!mbar) {
+               printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
+               return -ENOSYS;
+       }
+
+       cdm = mbar + 0x200;
+       pic = mbar + 0x500;
+       gps = mbar + 0xb00;
+       gpw = mbar + 0xc00;
+       bes = mbar + 0x1200;
+       xlb = mbar + 0x1f00;
+       sram = mbar + 0x8000;
+
+       return 0;
+}
+
+/* save and restore registers not bound to any real devices */
+static struct mpc52xx_cdm scdm;
+static struct mpc52xx_intr spic;
+static struct mpc52xx_sdma sbes;
+static struct mpc52xx_xlb sxlb;
+static struct mpc52xx_gpio sgps;
+static struct mpc52xx_gpio_wkup sgpw;
+
+static void lite5200_save_regs(void)
+{
+       _memcpy_fromio(&spic, pic, sizeof(*pic));
+       _memcpy_fromio(&sbes, bes, sizeof(*bes));
+       _memcpy_fromio(&scdm, cdm, sizeof(*cdm));
+       _memcpy_fromio(&sxlb, xlb, sizeof(*xlb));
+       _memcpy_fromio(&sgps, gps, sizeof(*gps));
+       _memcpy_fromio(&sgpw, gpw, sizeof(*gpw));
+
+       _memcpy_fromio(saved_sram, sram, sram_size);
+}
+
+static void lite5200_restore_regs(void)
+{
+       int i;
+       _memcpy_toio(sram, saved_sram, sram_size);
+
+
+       /*
+        * GPIOs. Interrupt Master Enable has higher address then other
+        * registers, so just memcpy is ok.
+        */
+       _memcpy_toio(gpw, &sgpw, sizeof(*gpw));
+       _memcpy_toio(gps, &sgps, sizeof(*gps));
+
+
+       /* XLB Arbitrer */
+       out_be32(&xlb->snoop_window, sxlb.snoop_window);
+       out_be32(&xlb->master_priority, sxlb.master_priority);
+       out_be32(&xlb->master_pri_enable, sxlb.master_pri_enable);
+
+       /* enable */
+       out_be32(&xlb->int_enable, sxlb.int_enable);
+       out_be32(&xlb->config, sxlb.config);
+
+
+       /* CDM - Clock Distribution Module */
+       out_8(&cdm->ipb_clk_sel, scdm.ipb_clk_sel);
+       out_8(&cdm->pci_clk_sel, scdm.pci_clk_sel);
+
+       out_8(&cdm->ext_48mhz_en, scdm.ext_48mhz_en);
+       out_8(&cdm->fd_enable, scdm.fd_enable);
+       out_be16(&cdm->fd_counters, scdm.fd_counters);
+
+       out_be32(&cdm->clk_enables, scdm.clk_enables);
+
+       out_8(&cdm->osc_disable, scdm.osc_disable);
+
+       out_be16(&cdm->mclken_div_psc1, scdm.mclken_div_psc1);
+       out_be16(&cdm->mclken_div_psc2, scdm.mclken_div_psc2);
+       out_be16(&cdm->mclken_div_psc3, scdm.mclken_div_psc3);
+       out_be16(&cdm->mclken_div_psc6, scdm.mclken_div_psc6);
+
+
+       /* BESTCOMM */
+       out_be32(&bes->taskBar, sbes.taskBar);
+       out_be32(&bes->currentPointer, sbes.currentPointer);
+       out_be32(&bes->endPointer, sbes.endPointer);
+       out_be32(&bes->variablePointer, sbes.variablePointer);
+
+       out_8(&bes->IntVect1, sbes.IntVect1);
+       out_8(&bes->IntVect2, sbes.IntVect2);
+       out_be16(&bes->PtdCntrl, sbes.PtdCntrl);
+
+       for (i=0; i<32; i++)
+               out_8(&bes->ipr[i], sbes.ipr[i]);
+
+       out_be32(&bes->cReqSelect, sbes.cReqSelect);
+       out_be32(&bes->task_size0, sbes.task_size0);
+       out_be32(&bes->task_size1, sbes.task_size1);
+       out_be32(&bes->MDEDebug, sbes.MDEDebug);
+       out_be32(&bes->ADSDebug, sbes.ADSDebug);
+       out_be32(&bes->Value1, sbes.Value1);
+       out_be32(&bes->Value2, sbes.Value2);
+       out_be32(&bes->Control, sbes.Control);
+       out_be32(&bes->Status, sbes.Status);
+       out_be32(&bes->PTDDebug, sbes.PTDDebug);
+
+       /* restore tasks */
+       for (i=0; i<16; i++)
+               out_be16(&bes->tcr[i], sbes.tcr[i]);
+
+       /* enable interrupts */
+       out_be32(&bes->IntPend, sbes.IntPend);
+       out_be32(&bes->IntMask, sbes.IntMask);
+
+
+       /* PIC */
+       out_be32(&pic->per_pri1, spic.per_pri1);
+       out_be32(&pic->per_pri2, spic.per_pri2);
+       out_be32(&pic->per_pri3, spic.per_pri3);
+
+       out_be32(&pic->main_pri1, spic.main_pri1);
+       out_be32(&pic->main_pri2, spic.main_pri2);
+
+       out_be32(&pic->enc_status, spic.enc_status);
+
+       /* unmask and enable interrupts */
+       out_be32(&pic->per_mask, spic.per_mask);
+       out_be32(&pic->main_mask, spic.main_mask);
+       out_be32(&pic->ctrl, spic.ctrl);
+}
+
+static int lite5200_pm_enter(suspend_state_t state)
+{
+       /* deep sleep? let mpc52xx code handle that */
+       if (state == PM_SUSPEND_STANDBY) {
+               return mpc52xx_pm_enter(state);
+       }
+
+       lite5200_save_regs();
+
+       /* effectively save FP regs */
+       enable_kernel_fp();
+
+       lite5200_low_power(sram, mbar);
+
+       lite5200_restore_regs();
+
+       /* restart jiffies */
+       wakeup_decrementer();
+
+       iounmap(mbar);
+       return 0;
+}
+
+static int lite5200_pm_finish(suspend_state_t state)
+{
+       /* deep sleep? let mpc52xx code handle that */
+       if (state == PM_SUSPEND_STANDBY) {
+               return mpc52xx_pm_finish(state);
+       }
+       return 0;
+}
+
+static struct pm_ops lite5200_pm_ops = {
+       .valid          = lite5200_pm_valid,
+       .prepare        = lite5200_pm_prepare,
+       .enter          = lite5200_pm_enter,
+       .finish         = lite5200_pm_finish,
+};
+
+int __init lite5200_pm_init(void)
+{
+       pm_set_ops(&lite5200_pm_ops);
+       return 0;
+}
diff --git a/arch/powerpc/platforms/52xx/lite5200_sleep.S b/arch/powerpc/platforms/52xx/lite5200_sleep.S
new file mode 100644 (file)
index 0000000..08ab6fe
--- /dev/null
@@ -0,0 +1,412 @@
+#include <asm/reg.h>
+#include <asm/ppc_asm.h>
+#include <asm/processor.h>
+#include <asm/cache.h>
+
+
+#define SDRAM_CTRL     0x104
+#define SC_MODE_EN     (1<<31)
+#define SC_CKE         (1<<30)
+#define SC_REF_EN      (1<<28)
+#define SC_SOFT_PRE    (1<<1)
+
+#define GPIOW_GPIOE    0xc00
+#define GPIOW_DDR      0xc08
+#define GPIOW_DVO      0xc0c
+
+#define CDM_CE         0x214
+#define CDM_SDRAM      (1<<3)
+
+
+/* helpers... beware: r10 and r4 are overwritten */
+#define SAVE_SPRN(reg, addr)           \
+       mfspr   r10, SPRN_##reg;        \
+       stw     r10, ((addr)*4)(r4);
+
+#define LOAD_SPRN(reg, addr)           \
+       lwz     r10, ((addr)*4)(r4);    \
+       mtspr   SPRN_##reg, r10;        \
+       sync;                           \
+       isync;
+
+
+       .data
+registers:
+       .space 0x5c*4
+       .text
+
+/* ---------------------------------------------------------------------- */
+/* low-power mode with help of M68HLC908QT1 */
+
+       .globl lite5200_low_power
+lite5200_low_power:
+
+       mr      r7, r3  /* save SRAM va */
+       mr      r8, r4  /* save MBAR va */
+
+       /* setup wakeup address for u-boot at physical location 0x0 */
+       lis     r3, CONFIG_KERNEL_START@h
+       lis     r4, lite5200_wakeup@h
+       ori     r4, r4, lite5200_wakeup@l
+       sub     r4, r4, r3
+       stw     r4, 0(r3)
+
+
+       /*
+        * save stuff BDI overwrites
+        * 0xf0 (0xe0->0x100 gets overwritten when BDI connected;
+        *   even when CONFIG_BDI* is disabled and MMU XLAT commented; heisenbug?))
+        * WARNING: self-refresh doesn't seem to work when BDI2000 is connected,
+        *   possibly because BDI sets SDRAM registers before wakeup code does
+        */
+       lis     r4, registers@h
+       ori     r4, r4, registers@l
+       lwz     r10, 0xf0(r3)
+       stw     r10, (0x1d*4)(r4)
+
+       /* save registers to r4 [destroys r10] */
+       SAVE_SPRN(LR, 0x1c)
+       bl      save_regs
+
+       /* flush caches [destroys r3, r4] */
+       bl      flush_data_cache
+
+
+       /* copy code to sram */
+       mr      r4, r7
+       li      r3, (sram_code_end - sram_code)/4
+       mtctr   r3
+       lis     r3, sram_code@h
+       ori     r3, r3, sram_code@l
+1:
+       lwz     r5, 0(r3)
+       stw     r5, 0(r4)
+       addi    r3, r3, 4
+       addi    r4, r4, 4
+       bdnz    1b
+
+       /* get tb_ticks_per_usec */
+       lis     r3, tb_ticks_per_usec@h
+       lwz     r11, tb_ticks_per_usec@l(r3)
+
+       /* disable I and D caches */
+       mfspr   r3, SPRN_HID0
+       ori     r3, r3, HID0_ICE | HID0_DCE
+       xori    r3, r3, HID0_ICE | HID0_DCE
+       sync; isync;
+       mtspr   SPRN_HID0, r3
+       sync; isync;
+
+       /* jump to sram */
+       mtlr    r7
+       blrl
+       /* doesn't return */
+
+
+sram_code:
+       /* self refresh */
+       lwz     r4, SDRAM_CTRL(r8)
+
+       /* send NOP (precharge) */
+       oris    r4, r4, SC_MODE_EN@h    /* mode_en */
+       stw     r4, SDRAM_CTRL(r8)
+       sync
+
+       ori     r4, r4, SC_SOFT_PRE     /* soft_pre */
+       stw     r4, SDRAM_CTRL(r8)
+       sync
+       xori    r4, r4, SC_SOFT_PRE
+
+       xoris   r4, r4, SC_MODE_EN@h    /* !mode_en */
+       stw     r4, SDRAM_CTRL(r8)
+       sync
+
+       /* delay (for NOP to finish) */
+       li      r12, 1
+       bl      udelay
+
+       /*
+        * mode_en must not be set when enabling self-refresh
+        * send AR with CKE low (self-refresh)
+        */
+       oris    r4, r4, (SC_REF_EN | SC_CKE)@h
+       xoris   r4, r4, (SC_CKE)@h      /* ref_en !cke */
+       stw     r4, SDRAM_CTRL(r8)
+       sync
+
+       /* delay (after !CKE there should be two cycles) */
+       li      r12, 1
+       bl      udelay
+
+       /* disable clock */
+       lwz     r4, CDM_CE(r8)
+       ori     r4, r4, CDM_SDRAM
+       xori    r4, r4, CDM_SDRAM
+       stw     r4, CDM_CE(r8)
+       sync
+
+       /* delay a bit */
+       li      r12, 1
+       bl      udelay
+
+
+       /* turn off with QT chip */
+       li      r4, 0x02
+       stb     r4, GPIOW_GPIOE(r8)     /* enable gpio_wkup1 */
+       sync
+
+       stb     r4, GPIOW_DVO(r8)       /* "output" high */
+       sync
+       stb     r4, GPIOW_DDR(r8)       /* output */
+       sync
+       stb     r4, GPIOW_DVO(r8)       /* output high */
+       sync
+
+       /* 10uS delay */
+       li      r12, 10
+       bl      udelay
+
+       /* turn off */
+       li      r4, 0
+       stb     r4, GPIOW_DVO(r8)       /* output low */
+       sync
+
+       /* wait until we're offline */
+  1:
+       b       1b
+
+
+       /* local udelay in sram is needed */
+  udelay: /* r11 - tb_ticks_per_usec, r12 - usecs, overwrites r13 */
+       mullw   r12, r12, r11
+       mftb    r13     /* start */
+       addi    r12, r13, r12 /* end */
+    1:
+       mftb    r13     /* current */
+       cmp     cr0, r13, r12
+       blt     1b
+       blr
+
+sram_code_end:
+
+
+
+/* uboot jumps here on resume */
+lite5200_wakeup:
+       bl      restore_regs
+
+
+       /* HIDs, MSR */
+       LOAD_SPRN(HID1, 0x19)
+       LOAD_SPRN(HID2, 0x1a)
+
+
+       /* address translation is tricky (see turn_on_mmu) */
+       mfmsr   r10
+       ori     r10, r10, MSR_DR | MSR_IR
+
+
+       mtspr   SPRN_SRR1, r10
+       lis     r10, mmu_on@h
+       ori     r10, r10, mmu_on@l
+       mtspr   SPRN_SRR0, r10
+       sync
+       rfi
+mmu_on:
+       /* kernel offset (r4 is still set from restore_registers) */
+       addis   r4, r4, CONFIG_KERNEL_START@h
+
+
+       /* restore MSR */
+       lwz     r10, (4*0x1b)(r4)
+       mtmsr   r10
+       sync; isync;
+
+       /* invalidate caches */
+       mfspr   r10, SPRN_HID0
+       ori     r5, r10, HID0_ICFI | HID0_DCI
+       mtspr   SPRN_HID0, r5   /* invalidate caches */
+       sync; isync;
+       mtspr   SPRN_HID0, r10
+       sync; isync;
+
+       /* enable caches */
+       lwz     r10, (4*0x18)(r4)
+       mtspr   SPRN_HID0, r10  /* restore (enable caches, DPM) */
+       /* ^ this has to be after address translation set in MSR */
+       sync
+       isync
+
+
+       /* restore 0xf0 (BDI2000) */
+       lis     r3, CONFIG_KERNEL_START@h
+       lwz     r10, (0x1d*4)(r4)
+       stw     r10, 0xf0(r3)
+
+       LOAD_SPRN(LR, 0x1c)
+
+
+       blr
+
+
+/* ---------------------------------------------------------------------- */
+/* boring code: helpers */
+
+/* save registers */
+#define SAVE_BAT(n, addr)              \
+       SAVE_SPRN(DBAT##n##L, addr);    \
+       SAVE_SPRN(DBAT##n##U, addr+1);  \
+       SAVE_SPRN(IBAT##n##L, addr+2);  \
+       SAVE_SPRN(IBAT##n##U, addr+3);
+
+#define SAVE_SR(n, addr)               \
+       mfsr    r10, n;                 \
+       stw     r10, ((addr)*4)(r4);
+
+#define SAVE_4SR(n, addr)      \
+       SAVE_SR(n, addr);       \
+       SAVE_SR(n+1, addr+1);   \
+       SAVE_SR(n+2, addr+2);   \
+       SAVE_SR(n+3, addr+3);
+
+save_regs:
+       stw     r0, 0(r4)
+       stw     r1, 0x4(r4)
+       stw     r2, 0x8(r4)
+       stmw    r11, 0xc(r4) /* 0xc -> 0x5f, (0x18*4-1) */
+
+       SAVE_SPRN(HID0, 0x18)
+       SAVE_SPRN(HID1, 0x19)
+       SAVE_SPRN(HID2, 0x1a)
+       mfmsr   r10
+       stw     r10, (4*0x1b)(r4)
+       /*SAVE_SPRN(LR, 0x1c) have to save it before the call */
+       /* 0x1d reserved by 0xf0 */
+       SAVE_SPRN(RPA,   0x1e)
+       SAVE_SPRN(SDR1,  0x1f)
+
+       /* save MMU regs */
+       SAVE_BAT(0, 0x20)
+       SAVE_BAT(1, 0x24)
+       SAVE_BAT(2, 0x28)
+       SAVE_BAT(3, 0x2c)
+       SAVE_BAT(4, 0x30)
+       SAVE_BAT(5, 0x34)
+       SAVE_BAT(6, 0x38)
+       SAVE_BAT(7, 0x3c)
+
+       SAVE_4SR(0, 0x40)
+       SAVE_4SR(4, 0x44)
+       SAVE_4SR(8, 0x48)
+       SAVE_4SR(12, 0x4c)
+
+       SAVE_SPRN(SPRG0, 0x50)
+       SAVE_SPRN(SPRG1, 0x51)
+       SAVE_SPRN(SPRG2, 0x52)
+       SAVE_SPRN(SPRG3, 0x53)
+       SAVE_SPRN(SPRG4, 0x54)
+       SAVE_SPRN(SPRG5, 0x55)
+       SAVE_SPRN(SPRG6, 0x56)
+       SAVE_SPRN(SPRG7, 0x57)
+
+       SAVE_SPRN(IABR,  0x58)
+       SAVE_SPRN(DABR,  0x59)
+       SAVE_SPRN(TBRL,  0x5a)
+       SAVE_SPRN(TBRU,  0x5b)
+
+       blr
+
+
+/* restore registers */
+#define LOAD_BAT(n, addr)              \
+       LOAD_SPRN(DBAT##n##L, addr);    \
+       LOAD_SPRN(DBAT##n##U, addr+1);  \
+       LOAD_SPRN(IBAT##n##L, addr+2);  \
+       LOAD_SPRN(IBAT##n##U, addr+3);
+
+#define LOAD_SR(n, addr)               \
+       lwz     r10, ((addr)*4)(r4);    \
+       mtsr    n, r10;
+
+#define LOAD_4SR(n, addr)      \
+       LOAD_SR(n, addr);       \
+       LOAD_SR(n+1, addr+1);   \
+       LOAD_SR(n+2, addr+2);   \
+       LOAD_SR(n+3, addr+3);
+
+restore_regs:
+       lis     r4, registers@h
+       ori     r4, r4, registers@l
+
+       /* MMU is not up yet */
+       subis   r4, r4, CONFIG_KERNEL_START@h
+
+       lwz     r0, 0(r4)
+       lwz     r1, 0x4(r4)
+       lwz     r2, 0x8(r4)
+       lmw     r11, 0xc(r4)
+
+       /*
+        * these are a bit tricky
+        *
+        * 0x18 - HID0
+        * 0x19 - HID1
+        * 0x1a - HID2
+        * 0x1b - MSR
+        * 0x1c - LR
+        * 0x1d - reserved by 0xf0 (BDI2000)
+        */
+       LOAD_SPRN(RPA,   0x1e);
+       LOAD_SPRN(SDR1,  0x1f);
+
+       /* restore MMU regs */
+       LOAD_BAT(0, 0x20)
+       LOAD_BAT(1, 0x24)
+       LOAD_BAT(2, 0x28)
+       LOAD_BAT(3, 0x2c)
+       LOAD_BAT(4, 0x30)
+       LOAD_BAT(5, 0x34)
+       LOAD_BAT(6, 0x38)
+       LOAD_BAT(7, 0x3c)
+
+       LOAD_4SR(0, 0x40)
+       LOAD_4SR(4, 0x44)
+       LOAD_4SR(8, 0x48)
+       LOAD_4SR(12, 0x4c)
+
+       /* rest of regs */
+       LOAD_SPRN(SPRG0, 0x50);
+       LOAD_SPRN(SPRG1, 0x51);
+       LOAD_SPRN(SPRG2, 0x52);
+       LOAD_SPRN(SPRG3, 0x53);
+       LOAD_SPRN(SPRG4, 0x54);
+       LOAD_SPRN(SPRG5, 0x55);
+       LOAD_SPRN(SPRG6, 0x56);
+       LOAD_SPRN(SPRG7, 0x57);
+
+       LOAD_SPRN(IABR,  0x58);
+       LOAD_SPRN(DABR,  0x59);
+       LOAD_SPRN(TBWL,  0x5a); /* these two have separate R/W regs */
+       LOAD_SPRN(TBWU,  0x5b);
+
+       blr
+
+
+
+/* cache flushing code. copied from arch/ppc/boot/util.S */
+#define NUM_CACHE_LINES (128*8)
+
+/*
+ * Flush data cache
+ * Do this by just reading lots of stuff into the cache.
+ */
+flush_data_cache:
+       lis     r3,CONFIG_KERNEL_START@h
+       ori     r3,r3,CONFIG_KERNEL_START@l
+       li      r4,NUM_CACHE_LINES
+       mtctr   r4
+1:
+       lwz     r4,0(r3)
+       addi    r3,r3,L1_CACHE_BYTES    /* Next line, please */
+       bdnz    1b
+       blr
index 2dd415ff55a93bf90eccbf77a288e98f355b0159..3bc201e07e6b9a5a66a8b3f9011faa1b327971d9 100644 (file)
 #undef DEBUG
 
 #include <linux/kernel.h>
-
+#include <linux/of_platform.h>
 #include <asm/io.h>
 #include <asm/prom.h>
-#include <asm/of_platform.h>
 #include <asm/mpc52xx.h>
 
 
@@ -76,44 +75,33 @@ mpc52xx_find_ipb_freq(struct device_node *node)
 EXPORT_SYMBOL(mpc52xx_find_ipb_freq);
 
 
+/*
+ * Configure the XLB arbiter settings to match what Linux expects.
+ */
 void __init
-mpc52xx_setup_cpu(void)
+mpc5200_setup_xlb_arbiter(void)
 {
-       struct mpc52xx_cdm  __iomem *cdm;
        struct mpc52xx_xlb  __iomem *xlb;
 
-       /* Map zones */
-       cdm = mpc52xx_find_and_map("mpc5200-cdm");
        xlb = mpc52xx_find_and_map("mpc5200-xlb");
-
-       if (!cdm || !xlb) {
+       if (!xlb) {
                printk(KERN_ERR __FILE__ ": "
-                       "Error while mapping CDM/XLB during mpc52xx_setup_cpu. "
+                       "Error mapping XLB in mpc52xx_setup_cpu().  "
                        "Expect some abnormal behavior\n");
-               goto unmap_regs;
+               return;
        }
 
-       /* Use internal 48 Mhz */
-       out_8(&cdm->ext_48mhz_en, 0x00);
-       out_8(&cdm->fd_enable, 0x01);
-       if (in_be32(&cdm->rstcfg) & 0x40)       /* Assumes 33Mhz clock */
-               out_be16(&cdm->fd_counters, 0x0001);
-       else
-               out_be16(&cdm->fd_counters, 0x5555);
-
        /* Configure the XLB Arbiter priorities */
        out_be32(&xlb->master_pri_enable, 0xff);
        out_be32(&xlb->master_priority, 0x11111111);
 
-       /* Disable XLB pipelining */
-       /* (cfr errate 292. We could do this only just before ATA PIO
-           transaction and re-enable it afterwards ...) */
+       /* Disable XLB pipelining
+        * (cfr errate 292. We could do this only just before ATA PIO
+        *  transaction and re-enable it afterwards ...)
+        */
        out_be32(&xlb->config, in_be32(&xlb->config) | MPC52xx_XLB_CFG_PLDIS);
 
-       /* Unmap zones */
-unmap_regs:
-       if (cdm) iounmap(cdm);
-       if (xlb) iounmap(xlb);
+       iounmap(xlb);
 }
 
 void __init
index fbfff95b4437e9b92113c9f9929d123fe8ad6291..61100f270c6872a0fd6fdec0e409c701dee69427 100644 (file)
 
 #undef DEBUG
 
-#include <linux/stddef.h>
-#include <linux/init.h>
-#include <linux/sched.h>
-#include <linux/signal.h>
-#include <linux/stddef.h>
-#include <linux/delay.h>
 #include <linux/irq.h>
-#include <linux/hardirq.h>
-
+#include <linux/of.h>
 #include <asm/io.h>
-#include <asm/processor.h>
-#include <asm/system.h>
-#include <asm/irq.h>
 #include <asm/prom.h>
 #include <asm/mpc52xx.h>
 #include "mpc52xx_pic.h"
@@ -242,12 +232,6 @@ static struct irq_chip mpc52xx_sdma_irqchip = {
  * irq_host
 */
 
-static int mpc52xx_irqhost_match(struct irq_host *h, struct device_node *node)
-{
-       pr_debug("%s: node=%p\n", __func__, node);
-       return mpc52xx_irqhost->host_data == node;
-}
-
 static int mpc52xx_irqhost_xlate(struct irq_host *h, struct device_node *ct,
                                 u32 * intspec, unsigned int intsize,
                                 irq_hw_number_t * out_hwirq,
@@ -368,7 +352,6 @@ static int mpc52xx_irqhost_map(struct irq_host *h, unsigned int virq,
 }
 
 static struct irq_host_ops mpc52xx_irqhost_ops = {
-       .match = mpc52xx_irqhost_match,
        .xlate = mpc52xx_irqhost_xlate,
        .map = mpc52xx_irqhost_map,
 };
@@ -420,14 +403,13 @@ void __init mpc52xx_init_irq(void)
         * hw irq information provided by the ofw to linux virq
         */
 
-       mpc52xx_irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR,
+       mpc52xx_irqhost = irq_alloc_host(picnode, IRQ_HOST_MAP_LINEAR,
                                         MPC52xx_IRQ_HIGHTESTHWIRQ,
                                         &mpc52xx_irqhost_ops, -1);
 
        if (!mpc52xx_irqhost)
                panic(__FILE__ ": Cannot allocate the IRQ host\n");
 
-       mpc52xx_irqhost->host_data = picnode;
        printk(KERN_INFO "MPC52xx PIC is up and running!\n");
 }
 
index 89fde43895c505c678304707c7ded6b579322db9..541fbb8156313229b1e2a616e0a4e3c70e60789d 100644 (file)
@@ -1,17 +1,30 @@
 choice
        prompt "82xx Board Type"
        depends on PPC_82xx
-       default MPC82xx_ADS
+       default MPC8272_ADS
 
-config MPC82xx_ADS
-       bool "Freescale MPC82xx ADS"
+config MPC8272_ADS
+       bool "Freescale MPC8272 ADS"
        select DEFAULT_UIMAGE
        select PQ2ADS
        select 8272
        select 8260
        select FSL_SOC
+       select PQ2_ADS_PCI_PIC if PCI
+       select PPC_CPM_NEW_BINDING
        help
-       This option enables support for the MPC8272 ADS board
+         This option enables support for the MPC8272 ADS board
+
+config PQ2FADS
+       bool "Freescale PQ2FADS"
+       select DEFAULT_UIMAGE
+       select PQ2ADS
+       select 8260
+       select FSL_SOC
+       select PQ2_ADS_PCI_PIC if PCI
+       select PPC_CPM_NEW_BINDING
+       help
+         This option enables support for the PQ2FADS board
 
 endchoice
 
@@ -34,3 +47,6 @@ config 8272
        help
          The MPC8272 CPM has a different internal dpram setup than other CPM2
          devices
+
+config PQ2_ADS_PCI_PIC
+       bool
index d9fd4c84d2e051305ee2bb66812ee8e22570bb0e..68c8b0c9772ba19fff83980934394beb378393e5 100644 (file)
@@ -1,5 +1,7 @@
 #
 # Makefile for the PowerPC 82xx linux kernel.
 #
-obj-$(CONFIG_PPC_82xx) += mpc82xx.o
-obj-$(CONFIG_MPC82xx_ADS) += mpc82xx_ads.o
+obj-$(CONFIG_MPC8272_ADS) += mpc8272_ads.o
+obj-$(CONFIG_CPM2) += pq2.o
+obj-$(CONFIG_PQ2_ADS_PCI_PIC) += pq2ads-pci-pic.o
+obj-$(CONFIG_PQ2FADS) += pq2fads.o
index 9cd8893b5a32e0263f1d03d5eb35d1c6b1dfdf0e..65e38a7ff48f878fb28ab2c76634dc16cf2326b5 100644 (file)
@@ -8,8 +8,6 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#include <asm/m8260_pci.h>
-
 #define SIU_INT_IRQ1   ((uint)0x13 + CPM_IRQ_OFFSET)
 
 #ifndef _IO_BASE
diff --git a/arch/powerpc/platforms/82xx/mpc8272_ads.c b/arch/powerpc/platforms/82xx/mpc8272_ads.c
new file mode 100644 (file)
index 0000000..fd83440
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * MPC8272 ADS board support
+ *
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Based on code by Vitaly Bordug <vbordug@ru.mvista.com>
+ * Copyright (c) 2006 MontaVista Software, 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/init.h>
+#include <linux/interrupt.h>
+#include <linux/fsl_devices.h>
+#include <linux/of_platform.h>
+#include <linux/io.h>
+
+#include <asm/cpm2.h>
+#include <asm/udbg.h>
+#include <asm/machdep.h>
+#include <asm/time.h>
+
+#include <platforms/82xx/pq2.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/cpm2_pic.h>
+
+#include "pq2ads.h"
+#include "pq2.h"
+
+static void __init mpc8272_ads_pic_init(void)
+{
+       struct device_node *np = of_find_compatible_node(NULL, NULL,
+                                                        "fsl,cpm2-pic");
+       if (!np) {
+               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
+               return;
+       }
+
+       cpm2_pic_init(np);
+       of_node_put(np);
+
+       /* Initialize stuff for the 82xx CPLD IC and install demux  */
+       pq2ads_pci_init_irq();
+}
+
+struct cpm_pin {
+       int port, pin, flags;
+};
+
+static struct cpm_pin mpc8272_ads_pins[] = {
+       /* SCC1 */
+       {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* SCC4 */
+       {3, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {3, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* FCC1 */
+       {0, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {0, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {0, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {0, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {0, 18, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {0, 19, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {0, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {0, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {0, 26, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
+       {0, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
+       {0, 28, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {0, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {0, 30, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
+       {0, 31, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
+       {2, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {2, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* FCC2 */
+       {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {2, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {2, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+};
+
+static void __init init_ioports(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(mpc8272_ads_pins); i++) {
+               struct cpm_pin *pin = &mpc8272_ads_pins[i];
+               cpm2_set_pin(pin->port, pin->pin, pin->flags);
+       }
+
+       cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_SCC4, CPM_BRG4, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_SCC4, CPM_BRG4, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK11, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK10, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK15, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK16, CPM_CLK_TX);
+}
+
+static void __init mpc8272_ads_setup_arch(void)
+{
+       struct device_node *np;
+       __be32 __iomem *bcsr;
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc8272_ads_setup_arch()", 0);
+
+       cpm2_reset();
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,mpc8272ads-bcsr");
+       if (!np) {
+               printk(KERN_ERR "No bcsr in device tree\n");
+               return;
+       }
+
+       bcsr = of_iomap(np, 0);
+       if (!bcsr) {
+               printk(KERN_ERR "Cannot map BCSR registers\n");
+               return;
+       }
+
+       of_node_put(np);
+
+       clrbits32(&bcsr[1], BCSR1_RS232_EN1 | BCSR1_RS232_EN2 | BCSR1_FETHIEN);
+       setbits32(&bcsr[1], BCSR1_FETH_RST);
+
+       clrbits32(&bcsr[3], BCSR3_FETHIEN2);
+       setbits32(&bcsr[3], BCSR3_FETH2_RST);
+
+       iounmap(bcsr);
+
+       init_ioports();
+       pq2_init_pci();
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc8272_ads_setup_arch(), finish", 0);
+}
+
+static struct of_device_id __initdata of_bus_ids[] = {
+       { .name = "soc", },
+       { .name = "cpm", },
+       { .name = "localbus", },
+       {},
+};
+
+static int __init declare_of_platform_devices(void)
+{
+       if (!machine_is(mpc8272_ads))
+               return 0;
+
+       /* Publish the QE devices */
+       of_platform_bus_probe(NULL, of_bus_ids, NULL);
+       return 0;
+}
+device_initcall(declare_of_platform_devices);
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init mpc8272_ads_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+       return of_flat_dt_is_compatible(root, "fsl,mpc8272ads");
+}
+
+define_machine(mpc8272_ads)
+{
+       .name = "Freescale MPC8272 ADS",
+       .probe = mpc8272_ads_probe,
+       .setup_arch = mpc8272_ads_setup_arch,
+       .init_IRQ = mpc8272_ads_pic_init,
+       .get_irq = cpm2_get_irq,
+       .calibrate_decr = generic_calibrate_decr,
+       .restart = pq2_restart,
+       .progress = udbg_progress,
+};
diff --git a/arch/powerpc/platforms/82xx/mpc82xx.c b/arch/powerpc/platforms/82xx/mpc82xx.c
deleted file mode 100644 (file)
index cc9900d..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * MPC82xx setup and early boot code plus other random bits.
- *
- * Author: Vitaly Bordug <vbordug@ru.mvista.com>
- *
- * Copyright (c) 2006 MontaVista Software, 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/stddef.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/reboot.h>
-#include <linux/pci.h>
-#include <linux/interrupt.h>
-#include <linux/kdev_t.h>
-#include <linux/major.h>
-#include <linux/console.h>
-#include <linux/delay.h>
-#include <linux/seq_file.h>
-#include <linux/root_dev.h>
-#include <linux/initrd.h>
-#include <linux/module.h>
-#include <linux/fsl_devices.h>
-#include <linux/fs_uart_pd.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/bootinfo.h>
-#include <asm/pci-bridge.h>
-#include <asm/mpc8260.h>
-#include <asm/irq.h>
-#include <mm/mmu_decl.h>
-#include <asm/prom.h>
-#include <asm/cpm2.h>
-#include <asm/udbg.h>
-#include <asm/i8259.h>
-#include <linux/fs_enet_pd.h>
-
-#include <sysdev/fsl_soc.h>
-#include <sysdev/cpm2_pic.h>
-
-#include "pq2ads.h"
-
-static int __init get_freq(char *name, unsigned long *val)
-{
-       struct device_node *cpu;
-       const unsigned int *fp;
-       int found = 0;
-
-       /* The cpu node should have timebase and clock frequency properties */
-       cpu = of_find_node_by_type(NULL, "cpu");
-
-       if (cpu) {
-               fp = of_get_property(cpu, name, NULL);
-               if (fp) {
-                       found = 1;
-                       *val = *fp;
-               }
-
-               of_node_put(cpu);
-       }
-
-       return found;
-}
-
-void __init m82xx_calibrate_decr(void)
-{
-       ppc_tb_freq = 125000000;
-       if (!get_freq("bus-frequency", &ppc_tb_freq)) {
-               printk(KERN_ERR "WARNING: Estimating decrementer frequency "
-                               "(not found)\n");
-       }
-       ppc_tb_freq /= 4;
-       ppc_proc_freq = 1000000000;
-       if (!get_freq("clock-frequency", &ppc_proc_freq))
-               printk(KERN_ERR "WARNING: Estimating processor frequency"
-                               "(not found)\n");
-}
-
-void mpc82xx_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: %s\n", CPUINFO_MACHINE);
-       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));
-}
diff --git a/arch/powerpc/platforms/82xx/mpc82xx_ads.c b/arch/powerpc/platforms/82xx/mpc82xx_ads.c
deleted file mode 100644 (file)
index 2d1b05b..0000000
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
- * MPC82xx_ads setup and early boot code plus other random bits.
- *
- * Author: Vitaly Bordug <vbordug@ru.mvista.com>
- * m82xx_restart fix by Wade Farnsworth <wfarnsworth@mvista.com>
- *
- * Copyright (c) 2006 MontaVista Software, 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/stddef.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/errno.h>
-#include <linux/reboot.h>
-#include <linux/pci.h>
-#include <linux/interrupt.h>
-#include <linux/kdev_t.h>
-#include <linux/major.h>
-#include <linux/console.h>
-#include <linux/delay.h>
-#include <linux/seq_file.h>
-#include <linux/root_dev.h>
-#include <linux/initrd.h>
-#include <linux/module.h>
-#include <linux/fsl_devices.h>
-#include <linux/fs_uart_pd.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/bootinfo.h>
-#include <asm/pci-bridge.h>
-#include <asm/mpc8260.h>
-#include <asm/irq.h>
-#include <mm/mmu_decl.h>
-#include <asm/prom.h>
-#include <asm/cpm2.h>
-#include <asm/udbg.h>
-#include <asm/i8259.h>
-#include <linux/fs_enet_pd.h>
-
-#include <sysdev/fsl_soc.h>
-#include <sysdev/cpm2_pic.h>
-
-#include "pq2ads.h"
-
-#ifdef CONFIG_PCI
-static uint pci_clk_frq;
-static struct {
-       unsigned long *pci_int_stat_reg;
-       unsigned long *pci_int_mask_reg;
-} pci_regs;
-
-static unsigned long pci_int_base;
-static struct irq_host *pci_pic_host;
-static struct device_node *pci_pic_node;
-#endif
-
-static void __init mpc82xx_ads_pic_init(void)
-{
-       struct device_node *np = of_find_compatible_node(NULL, "cpm-pic", "CPM2");
-       struct resource r;
-       cpm2_map_t *cpm_reg;
-
-       if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find cpm-pic node\n");
-               return;
-       }
-       if (of_address_to_resource(np, 0, &r)) {
-               printk(KERN_ERR "PIC init: invalid resource\n");
-               of_node_put(np);
-               return;
-       }
-       cpm2_pic_init(np);
-       of_node_put(np);
-
-       /* Initialize the default interrupt mapping priorities,
-        * in case the boot rom changed something on us.
-        */
-       cpm_reg = (cpm2_map_t *) ioremap(get_immrbase(), sizeof(cpm2_map_t));
-       cpm_reg->im_intctl.ic_siprr = 0x05309770;
-       iounmap(cpm_reg);
-#ifdef CONFIG_PCI
-       /* Initialize stuff for the 82xx CPLD IC and install demux  */
-       m82xx_pci_init_irq();
-#endif
-}
-
-static void init_fcc1_ioports(struct fs_platform_info *fpi)
-{
-       struct io_port *io;
-       u32 tempval;
-       cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
-       struct device_node *np;
-       struct resource r;
-       u32 *bcsr;
-
-       np = of_find_node_by_type(NULL, "memory");
-       if (!np) {
-               printk(KERN_INFO "No memory node in device tree\n");
-               return;
-       }
-       if (of_address_to_resource(np, 1, &r)) {
-               printk(KERN_INFO "No memory reg property [1] in devicetree\n");
-               return;
-       }
-       of_node_put(np);
-       bcsr = ioremap(r.start + 4, sizeof(u32));
-       io = &immap->im_ioport;
-
-       /* Enable the PHY */
-       clrbits32(bcsr, BCSR1_FETHIEN);
-       setbits32(bcsr, BCSR1_FETH_RST);
-
-       /* FCC1 pins are on port A/C. */
-       /* Configure port A and C pins for FCC1 Ethernet. */
-
-       tempval = in_be32(&io->iop_pdira);
-       tempval &= ~PA1_DIRA0;
-       tempval |= PA1_DIRA1;
-       out_be32(&io->iop_pdira, tempval);
-
-       tempval = in_be32(&io->iop_psora);
-       tempval &= ~PA1_PSORA0;
-       tempval |= PA1_PSORA1;
-       out_be32(&io->iop_psora, tempval);
-
-       setbits32(&io->iop_ppara, PA1_DIRA0 | PA1_DIRA1);
-
-       /* Alter clocks */
-       tempval = PC_CLK(fpi->clk_tx - 8) | PC_CLK(fpi->clk_rx - 8);
-
-       clrbits32(&io->iop_psorc, tempval);
-       clrbits32(&io->iop_pdirc, tempval);
-       setbits32(&io->iop_pparc, tempval);
-
-       cpm2_clk_setup(CPM_CLK_FCC1, fpi->clk_rx, CPM_CLK_RX);
-       cpm2_clk_setup(CPM_CLK_FCC1, fpi->clk_tx, CPM_CLK_TX);
-
-       iounmap(bcsr);
-       iounmap(immap);
-}
-
-static void init_fcc2_ioports(struct fs_platform_info *fpi)
-{
-       cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
-       struct device_node *np;
-       struct resource r;
-       u32 *bcsr;
-
-       struct io_port *io;
-       u32 tempval;
-
-       np = of_find_node_by_type(NULL, "memory");
-       if (!np) {
-               printk(KERN_INFO "No memory node in device tree\n");
-               return;
-       }
-       if (of_address_to_resource(np, 1, &r)) {
-               printk(KERN_INFO "No memory reg property [1] in devicetree\n");
-               return;
-       }
-       of_node_put(np);
-       io = &immap->im_ioport;
-       bcsr = ioremap(r.start + 12, sizeof(u32));
-
-       /* Enable the PHY */
-       clrbits32(bcsr, BCSR3_FETHIEN2);
-       setbits32(bcsr, BCSR3_FETH2_RST);
-
-       /* FCC2 are port B/C. */
-       /* Configure port A and C pins for FCC2 Ethernet. */
-
-       tempval = in_be32(&io->iop_pdirb);
-       tempval &= ~PB2_DIRB0;
-       tempval |= PB2_DIRB1;
-       out_be32(&io->iop_pdirb, tempval);
-
-       tempval = in_be32(&io->iop_psorb);
-       tempval &= ~PB2_PSORB0;
-       tempval |= PB2_PSORB1;
-       out_be32(&io->iop_psorb, tempval);
-
-       setbits32(&io->iop_pparb, PB2_DIRB0 | PB2_DIRB1);
-
-       tempval = PC_CLK(fpi->clk_tx - 8) | PC_CLK(fpi->clk_rx - 8);
-
-       /* Alter clocks */
-       clrbits32(&io->iop_psorc, tempval);
-       clrbits32(&io->iop_pdirc, tempval);
-       setbits32(&io->iop_pparc, tempval);
-
-       cpm2_clk_setup(CPM_CLK_FCC2, fpi->clk_rx, CPM_CLK_RX);
-       cpm2_clk_setup(CPM_CLK_FCC2, fpi->clk_tx, CPM_CLK_TX);
-
-       iounmap(bcsr);
-       iounmap(immap);
-}
-
-void init_fcc_ioports(struct fs_platform_info *fpi)
-{
-       int fcc_no = fs_get_fcc_index(fpi->fs_no);
-
-       switch (fcc_no) {
-       case 0:
-               init_fcc1_ioports(fpi);
-               break;
-       case 1:
-               init_fcc2_ioports(fpi);
-               break;
-       default:
-               printk(KERN_ERR "init_fcc_ioports: invalid FCC number\n");
-               return;
-       }
-}
-
-static void init_scc1_uart_ioports(struct fs_uart_platform_info *data)
-{
-       cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
-
-       /* SCC1 is only on port D */
-       setbits32(&immap->im_ioport.iop_ppard, 0x00000003);
-       clrbits32(&immap->im_ioport.iop_psord, 0x00000001);
-       setbits32(&immap->im_ioport.iop_psord, 0x00000002);
-       clrbits32(&immap->im_ioport.iop_pdird, 0x00000001);
-       setbits32(&immap->im_ioport.iop_pdird, 0x00000002);
-
-       clrbits32(&immap->im_cpmux.cmx_scr, (0x00000007 << (4 - data->clk_tx)));
-       clrbits32(&immap->im_cpmux.cmx_scr, (0x00000038 << (4 - data->clk_rx)));
-       setbits32(&immap->im_cpmux.cmx_scr,
-                 ((data->clk_tx - 1) << (4 - data->clk_tx)));
-       setbits32(&immap->im_cpmux.cmx_scr,
-                 ((data->clk_rx - 1) << (4 - data->clk_rx)));
-
-       iounmap(immap);
-}
-
-static void init_scc4_uart_ioports(struct fs_uart_platform_info *data)
-{
-       cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
-
-       setbits32(&immap->im_ioport.iop_ppard, 0x00000600);
-       clrbits32(&immap->im_ioport.iop_psord, 0x00000600);
-       clrbits32(&immap->im_ioport.iop_pdird, 0x00000200);
-       setbits32(&immap->im_ioport.iop_pdird, 0x00000400);
-
-       clrbits32(&immap->im_cpmux.cmx_scr, (0x00000007 << (4 - data->clk_tx)));
-       clrbits32(&immap->im_cpmux.cmx_scr, (0x00000038 << (4 - data->clk_rx)));
-       setbits32(&immap->im_cpmux.cmx_scr,
-                 ((data->clk_tx - 1) << (4 - data->clk_tx)));
-       setbits32(&immap->im_cpmux.cmx_scr,
-                 ((data->clk_rx - 1) << (4 - data->clk_rx)));
-
-       iounmap(immap);
-}
-
-void init_scc_ioports(struct fs_uart_platform_info *data)
-{
-       int scc_no = fs_get_scc_index(data->fs_no);
-
-       switch (scc_no) {
-       case 0:
-               init_scc1_uart_ioports(data);
-               data->brg = data->clk_rx;
-               break;
-       case 3:
-               init_scc4_uart_ioports(data);
-               data->brg = data->clk_rx;
-               break;
-       default:
-               printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
-               return;
-       }
-}
-
-void __init m82xx_board_setup(void)
-{
-       cpm2_map_t *immap = ioremap(get_immrbase(), sizeof(cpm2_map_t));
-       struct device_node *np;
-       struct resource r;
-       u32 *bcsr;
-
-       np = of_find_node_by_type(NULL, "memory");
-       if (!np) {
-               printk(KERN_INFO "No memory node in device tree\n");
-               return;
-       }
-       if (of_address_to_resource(np, 1, &r)) {
-               printk(KERN_INFO "No memory reg property [1] in devicetree\n");
-               return;
-       }
-       of_node_put(np);
-       bcsr = ioremap(r.start + 4, sizeof(u32));
-       /* Enable the 2nd UART port */
-       clrbits32(bcsr, BCSR1_RS232_EN2);
-
-#ifdef CONFIG_SERIAL_CPM_SCC1
-       clrbits32((u32 *) & immap->im_scc[0].scc_sccm,
-                 UART_SCCM_TX | UART_SCCM_RX);
-       clrbits32((u32 *) & immap->im_scc[0].scc_gsmrl,
-                 SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-#endif
-
-#ifdef CONFIG_SERIAL_CPM_SCC2
-       clrbits32((u32 *) & immap->im_scc[1].scc_sccm,
-                 UART_SCCM_TX | UART_SCCM_RX);
-       clrbits32((u32 *) & immap->im_scc[1].scc_gsmrl,
-                 SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-#endif
-
-#ifdef CONFIG_SERIAL_CPM_SCC3
-       clrbits32((u32 *) & immap->im_scc[2].scc_sccm,
-                 UART_SCCM_TX | UART_SCCM_RX);
-       clrbits32((u32 *) & immap->im_scc[2].scc_gsmrl,
-                 SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-#endif
-
-#ifdef CONFIG_SERIAL_CPM_SCC4
-       clrbits32((u32 *) & immap->im_scc[3].scc_sccm,
-                 UART_SCCM_TX | UART_SCCM_RX);
-       clrbits32((u32 *) & immap->im_scc[3].scc_gsmrl,
-                 SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-#endif
-
-       iounmap(bcsr);
-       iounmap(immap);
-}
-
-#ifdef CONFIG_PCI
-static void m82xx_pci_mask_irq(unsigned int irq)
-{
-       int bit = irq - pci_int_base;
-
-       *pci_regs.pci_int_mask_reg |= (1 << (31 - bit));
-       return;
-}
-
-static void m82xx_pci_unmask_irq(unsigned int irq)
-{
-       int bit = irq - pci_int_base;
-
-       *pci_regs.pci_int_mask_reg &= ~(1 << (31 - bit));
-       return;
-}
-
-static void m82xx_pci_mask_and_ack(unsigned int irq)
-{
-       int bit = irq - pci_int_base;
-
-       *pci_regs.pci_int_mask_reg |= (1 << (31 - bit));
-       return;
-}
-
-static void m82xx_pci_end_irq(unsigned int irq)
-{
-       int bit = irq - pci_int_base;
-
-       *pci_regs.pci_int_mask_reg &= ~(1 << (31 - bit));
-       return;
-}
-
-struct hw_interrupt_type m82xx_pci_ic = {
-       .typename = "MPC82xx ADS PCI",
-       .name = "MPC82xx ADS PCI",
-       .enable = m82xx_pci_unmask_irq,
-       .disable = m82xx_pci_mask_irq,
-       .ack = m82xx_pci_mask_and_ack,
-       .end = m82xx_pci_end_irq,
-       .mask = m82xx_pci_mask_irq,
-       .mask_ack = m82xx_pci_mask_and_ack,
-       .unmask = m82xx_pci_unmask_irq,
-       .eoi = m82xx_pci_end_irq,
-};
-
-static void
-m82xx_pci_irq_demux(unsigned int irq, struct irq_desc *desc)
-{
-       unsigned long stat, mask, pend;
-       int bit;
-
-       for (;;) {
-               stat = *pci_regs.pci_int_stat_reg;
-               mask = *pci_regs.pci_int_mask_reg;
-               pend = stat & ~mask & 0xf0000000;
-               if (!pend)
-                       break;
-               for (bit = 0; pend != 0; ++bit, pend <<= 1) {
-                       if (pend & 0x80000000)
-                               __do_IRQ(pci_int_base + bit);
-               }
-       }
-}
-
-static int pci_pic_host_match(struct irq_host *h, struct device_node *node)
-{
-       return node == pci_pic_node;
-}
-
-static int pci_pic_host_map(struct irq_host *h, unsigned int virq,
-                           irq_hw_number_t hw)
-{
-       get_irq_desc(virq)->status |= IRQ_LEVEL;
-       set_irq_chip(virq, &m82xx_pci_ic);
-       return 0;
-}
-
-static void pci_host_unmap(struct irq_host *h, unsigned int virq)
-{
-       /* remove chip and handler */
-       set_irq_chip(virq, NULL);
-}
-
-static struct irq_host_ops pci_pic_host_ops = {
-       .match = pci_pic_host_match,
-       .map = pci_pic_host_map,
-       .unmap = pci_host_unmap,
-};
-
-void m82xx_pci_init_irq(void)
-{
-       int irq;
-       cpm2_map_t *immap;
-       struct device_node *np;
-       struct resource r;
-       const u32 *regs;
-       unsigned int size;
-       const u32 *irq_map;
-       int i;
-       unsigned int irq_max, irq_min;
-
-       if ((np = of_find_node_by_type(NULL, "soc")) == NULL) {
-               printk(KERN_INFO "No SOC node in device tree\n");
-               return;
-       }
-       memset(&r, 0, sizeof(r));
-       if (of_address_to_resource(np, 0, &r)) {
-               printk(KERN_INFO "No SOC reg property in device tree\n");
-               return;
-       }
-       immap = ioremap(r.start, sizeof(*immap));
-       of_node_put(np);
-
-       /* install the demultiplexer for the PCI cascade interrupt */
-       np = of_find_node_by_type(NULL, "pci");
-       if (!np) {
-               printk(KERN_INFO "No pci node on device tree\n");
-               iounmap(immap);
-               return;
-       }
-       irq_map = of_get_property(np, "interrupt-map", &size);
-       if ((!irq_map) || (size <= 7)) {
-               printk(KERN_INFO "No interrupt-map property of pci node\n");
-               iounmap(immap);
-               return;
-       }
-       size /= sizeof(irq_map[0]);
-       for (i = 0, irq_max = 0, irq_min = 512; i < size; i += 7, irq_map += 7) {
-               if (irq_map[5] < irq_min)
-                       irq_min = irq_map[5];
-               if (irq_map[5] > irq_max)
-                       irq_max = irq_map[5];
-       }
-       pci_int_base = irq_min;
-       irq = irq_of_parse_and_map(np, 0);
-       set_irq_chained_handler(irq, m82xx_pci_irq_demux);
-       of_node_put(np);
-       np = of_find_node_by_type(NULL, "pci-pic");
-       if (!np) {
-               printk(KERN_INFO "No pci pic node on device tree\n");
-               iounmap(immap);
-               return;
-       }
-       pci_pic_node = of_node_get(np);
-       /* PCI interrupt controller registers: status and mask */
-       regs = of_get_property(np, "reg", &size);
-       if ((!regs) || (size <= 2)) {
-               printk(KERN_INFO "No reg property in pci pic node\n");
-               iounmap(immap);
-               return;
-       }
-       pci_regs.pci_int_stat_reg =
-           ioremap(regs[0], sizeof(*pci_regs.pci_int_stat_reg));
-       pci_regs.pci_int_mask_reg =
-           ioremap(regs[1], sizeof(*pci_regs.pci_int_mask_reg));
-       of_node_put(np);
-       /* configure chip select for PCI interrupt controller */
-       immap->im_memctl.memc_br3 = regs[0] | 0x00001801;
-       immap->im_memctl.memc_or3 = 0xffff8010;
-       /* make PCI IRQ level sensitive */
-       immap->im_intctl.ic_siexr &= ~(1 << (14 - (irq - SIU_INT_IRQ1)));
-
-       /* mask all PCI interrupts */
-       *pci_regs.pci_int_mask_reg |= 0xfff00000;
-       iounmap(immap);
-       pci_pic_host =
-           irq_alloc_host(IRQ_HOST_MAP_LINEAR, irq_max - irq_min + 1,
-                          &pci_pic_host_ops, irq_max + 1);
-       return;
-}
-
-static int m82xx_pci_exclude_device(struct pci_controller *hose,
-                                   u_char bus, u_char devfn)
-{
-       if (bus == 0 && PCI_SLOT(devfn) == 0)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       else
-               return PCIBIOS_SUCCESSFUL;
-}
-
-static void __init mpc82xx_add_bridge(struct device_node *np)
-{
-       int len;
-       struct pci_controller *hose;
-       struct resource r;
-       const int *bus_range;
-       const uint *ptr;
-
-       memset(&r, 0, sizeof(r));
-       if (of_address_to_resource(np, 0, &r)) {
-               printk(KERN_INFO "No PCI reg property in device tree\n");
-               return;
-       }
-       if (!(ptr = of_get_property(np, "clock-frequency", NULL))) {
-               printk(KERN_INFO "No clock-frequency property in PCI node");
-               return;
-       }
-       pci_clk_frq = *ptr;
-       of_node_put(np);
-       bus_range = of_get_property(np, "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", np->full_name);
-       }
-
-       pci_assign_all_buses = 1;
-
-       hose = pcibios_alloc_controller(np);
-
-       if (!hose)
-               return;
-
-       hose->first_busno = bus_range ? bus_range[0] : 0;
-       hose->last_busno = bus_range ? bus_range[1] : 0xff;
-
-       setup_indirect_pci(hose,
-                          r.start + offsetof(pci_cpm2_t, pci_cfg_addr),
-                          r.start + offsetof(pci_cpm2_t, pci_cfg_data),
-                          0);
-
-       pci_process_bridge_OF_ranges(hose, np, 1);
-}
-#endif
-
-/*
- * Setup the architecture
- */
-static void __init mpc82xx_ads_setup_arch(void)
-{
-#ifdef CONFIG_PCI
-       struct device_node *np;
-#endif
-
-       if (ppc_md.progress)
-               ppc_md.progress("mpc82xx_ads_setup_arch()", 0);
-       cpm2_reset();
-
-       /* Map I/O region to a 256MB BAT */
-
-       m82xx_board_setup();
-
-#ifdef CONFIG_PCI
-       ppc_md.pci_exclude_device = m82xx_pci_exclude_device;
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
-               mpc82xx_add_bridge(np);
-
-       of_node_put(np);
-#endif
-
-#ifdef  CONFIG_ROOT_NFS
-       ROOT_DEV = Root_NFS;
-#else
-       ROOT_DEV = Root_HDA1;
-#endif
-
-       if (ppc_md.progress)
-               ppc_md.progress("mpc82xx_ads_setup_arch(), finish", 0);
-}
-
-/*
- * Called very early, device-tree isn't unflattened
- */
-static int __init mpc82xx_ads_probe(void)
-{
-       /* We always match for now, eventually we should look at
-        * the flat dev tree to ensure this is the board we are
-        * supposed to run on
-        */
-       return 1;
-}
-
-#define RMR_CSRE 0x00000001
-static void m82xx_restart(char *cmd)
-{
-       __volatile__ unsigned char dummy;
-
-       local_irq_disable();
-       ((cpm2_map_t *) cpm2_immr)->im_clkrst.car_rmr |= RMR_CSRE;
-
-       /* Clear the ME,EE,IR & DR bits in MSR to cause checkstop */
-       mtmsr(mfmsr() & ~(MSR_ME | MSR_EE | MSR_IR | MSR_DR));
-       dummy = ((cpm2_map_t *) cpm2_immr)->im_clkrst.res[0];
-       printk("Restart failed\n");
-       while (1) ;
-}
-
-static void m82xx_halt(void)
-{
-       local_irq_disable();
-       while (1) ;
-}
-
-define_machine(mpc82xx_ads)
-{
-       .name = "MPC82xx ADS",
-       .probe = mpc82xx_ads_probe,
-       .setup_arch =    mpc82xx_ads_setup_arch,
-       .init_IRQ =    mpc82xx_ads_pic_init,
-       .show_cpuinfo =    mpc82xx_ads_show_cpuinfo,
-       .get_irq =    cpm2_get_irq,
-       .calibrate_decr =    m82xx_calibrate_decr,
-       .restart = m82xx_restart,.halt = m82xx_halt,
-};
diff --git a/arch/powerpc/platforms/82xx/pq2.c b/arch/powerpc/platforms/82xx/pq2.c
new file mode 100644 (file)
index 0000000..a497cba
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Common PowerQUICC II code.
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ * Copyright (c) 2007 Freescale Semiconductor
+ *
+ * Based on code by Vitaly Bordug <vbordug@ru.mvista.com>
+ * pq2_restart fix by Wade Farnsworth <wfarnsworth@mvista.com>
+ * Copyright (c) 2006 MontaVista Software, 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 <asm/cpm2.h>
+#include <asm/io.h>
+#include <asm/pci-bridge.h>
+#include <asm/system.h>
+
+#include <platforms/82xx/pq2.h>
+
+#define RMR_CSRE 0x00000001
+
+void pq2_restart(char *cmd)
+{
+       local_irq_disable();
+       setbits32(&cpm2_immr->im_clkrst.car_rmr, RMR_CSRE);
+
+       /* Clear the ME,EE,IR & DR bits in MSR to cause checkstop */
+       mtmsr(mfmsr() & ~(MSR_ME | MSR_EE | MSR_IR | MSR_DR));
+       in_8(&cpm2_immr->im_clkrst.res[0]);
+
+       panic("Restart failed\n");
+}
+
+#ifdef CONFIG_PCI
+static int pq2_pci_exclude_device(struct pci_controller *hose,
+                                  u_char bus, u8 devfn)
+{
+       if (bus == 0 && PCI_SLOT(devfn) == 0)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       else
+               return PCIBIOS_SUCCESSFUL;
+}
+
+static void __init pq2_pci_add_bridge(struct device_node *np)
+{
+       struct pci_controller *hose;
+       struct resource r;
+
+       if (of_address_to_resource(np, 0, &r) || r.end - r.start < 0x10b)
+               goto err;
+
+       pci_assign_all_buses = 1;
+
+       hose = pcibios_alloc_controller(np);
+       if (!hose)
+               return;
+
+       hose->arch_data = np;
+
+       setup_indirect_pci(hose, r.start + 0x100, r.start + 0x104, 0);
+       pci_process_bridge_OF_ranges(hose, np, 1);
+
+       return;
+
+err:
+       printk(KERN_ERR "No valid PCI reg property in device tree\n");
+}
+
+void __init pq2_init_pci(void)
+{
+       struct device_node *np = NULL;
+
+       ppc_md.pci_exclude_device = pq2_pci_exclude_device;
+
+       while ((np = of_find_compatible_node(np, NULL, "fsl,pq2-pci")))
+               pq2_pci_add_bridge(np);
+}
+#endif
diff --git a/arch/powerpc/platforms/82xx/pq2.h b/arch/powerpc/platforms/82xx/pq2.h
new file mode 100644 (file)
index 0000000..a41f84a
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _PQ2_H
+#define _PQ2_H
+
+void pq2_restart(char *cmd);
+
+#ifdef CONFIG_PCI
+int pq2ads_pci_init_irq(void);
+void pq2_init_pci(void);
+#else
+static inline int pq2ads_pci_init_irq(void)
+{
+       return 0;
+}
+
+static inline void pq2_init_pci(void)
+{
+}
+#endif
+
+#endif
diff --git a/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c b/arch/powerpc/platforms/82xx/pq2ads-pci-pic.c
new file mode 100644 (file)
index 0000000..a801381
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * PQ2 ADS-style PCI interrupt controller
+ *
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Loosely based on mpc82xx ADS support by Vitaly Bordug <vbordug@ru.mvista.com>
+ * Copyright (c) 2006 MontaVista Software, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/spinlock.h>
+#include <linux/irq.h>
+#include <linux/types.h>
+#include <linux/bootmem.h>
+
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/cpm2.h>
+
+#include "pq2.h"
+
+static DEFINE_SPINLOCK(pci_pic_lock);
+
+struct pq2ads_pci_pic {
+       struct device_node *node;
+       struct irq_host *host;
+
+       struct {
+               u32 stat;
+               u32 mask;
+       } __iomem *regs;
+};
+
+#define NUM_IRQS 32
+
+static void pq2ads_pci_mask_irq(unsigned int virq)
+{
+       struct pq2ads_pci_pic *priv = get_irq_chip_data(virq);
+       int irq = NUM_IRQS - virq_to_hw(virq) - 1;
+
+       if (irq != -1) {
+               unsigned long flags;
+               spin_lock_irqsave(&pci_pic_lock, flags);
+
+               setbits32(&priv->regs->mask, 1 << irq);
+               mb();
+
+               spin_unlock_irqrestore(&pci_pic_lock, flags);
+       }
+}
+
+static void pq2ads_pci_unmask_irq(unsigned int virq)
+{
+       struct pq2ads_pci_pic *priv = get_irq_chip_data(virq);
+       int irq = NUM_IRQS - virq_to_hw(virq) - 1;
+
+       if (irq != -1) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&pci_pic_lock, flags);
+               clrbits32(&priv->regs->mask, 1 << irq);
+               spin_unlock_irqrestore(&pci_pic_lock, flags);
+       }
+}
+
+static struct irq_chip pq2ads_pci_ic = {
+       .typename = "PQ2 ADS PCI",
+       .name = "PQ2 ADS PCI",
+       .end = pq2ads_pci_unmask_irq,
+       .mask = pq2ads_pci_mask_irq,
+       .mask_ack = pq2ads_pci_mask_irq,
+       .ack = pq2ads_pci_mask_irq,
+       .unmask = pq2ads_pci_unmask_irq,
+       .enable = pq2ads_pci_unmask_irq,
+       .disable = pq2ads_pci_mask_irq
+};
+
+static void pq2ads_pci_irq_demux(unsigned int irq, struct irq_desc *desc)
+{
+       struct pq2ads_pci_pic *priv = desc->handler_data;
+       u32 stat, mask, pend;
+       int bit;
+
+       for (;;) {
+               stat = in_be32(&priv->regs->stat);
+               mask = in_be32(&priv->regs->mask);
+
+               pend = stat & ~mask;
+
+               if (!pend)
+                       break;
+
+               for (bit = 0; pend != 0; ++bit, pend <<= 1) {
+                       if (pend & 0x80000000) {
+                               int virq = irq_linear_revmap(priv->host, bit);
+                               generic_handle_irq(virq);
+                       }
+               }
+       }
+}
+
+static int pci_pic_host_map(struct irq_host *h, unsigned int virq,
+                           irq_hw_number_t hw)
+{
+       get_irq_desc(virq)->status |= IRQ_LEVEL;
+       set_irq_chip_data(virq, h->host_data);
+       set_irq_chip(virq, &pq2ads_pci_ic);
+       return 0;
+}
+
+static void pci_host_unmap(struct irq_host *h, unsigned int virq)
+{
+       /* remove chip and handler */
+       set_irq_chip_data(virq, NULL);
+       set_irq_chip(virq, NULL);
+}
+
+static struct irq_host_ops pci_pic_host_ops = {
+       .map = pci_pic_host_map,
+       .unmap = pci_host_unmap,
+};
+
+int __init pq2ads_pci_init_irq(void)
+{
+       struct pq2ads_pci_pic *priv;
+       struct irq_host *host;
+       struct device_node *np;
+       int ret = -ENODEV;
+       int irq;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,pq2ads-pci-pic");
+       if (!np) {
+               printk(KERN_ERR "No pci pic node in device tree.\n");
+               of_node_put(np);
+               goto out;
+       }
+
+       irq = irq_of_parse_and_map(np, 0);
+       if (irq == NO_IRQ) {
+               printk(KERN_ERR "No interrupt in pci pic node.\n");
+               of_node_put(np);
+               goto out;
+       }
+
+       priv = alloc_bootmem(sizeof(struct pq2ads_pci_pic));
+       if (!priv) {
+               of_node_put(np);
+               ret = -ENOMEM;
+               goto out_unmap_irq;
+       }
+
+       /* PCI interrupt controller registers: status and mask */
+       priv->regs = of_iomap(np, 0);
+       if (!priv->regs) {
+               printk(KERN_ERR "Cannot map PCI PIC registers.\n");
+               goto out_free_bootmem;
+       }
+
+       /* mask all PCI interrupts */
+       out_be32(&priv->regs->mask, ~0);
+       mb();
+
+       host = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR, NUM_IRQS,
+                             &pci_pic_host_ops, NUM_IRQS);
+       if (!host) {
+               ret = -ENOMEM;
+               goto out_unmap_regs;
+       }
+
+       host->host_data = priv;
+
+       priv->host = host;
+       host->host_data = priv;
+       set_irq_data(irq, priv);
+       set_irq_chained_handler(irq, pq2ads_pci_irq_demux);
+
+       of_node_put(np);
+       return 0;
+
+out_unmap_regs:
+       iounmap(priv->regs);
+out_free_bootmem:
+       free_bootmem((unsigned long)priv,
+                    sizeof(sizeof(struct pq2ads_pci_pic)));
+       of_node_put(np);
+out_unmap_irq:
+       irq_dispose_mapping(irq);
+out:
+       return ret;
+}
index 5b5cca6c8c8804d6e847a8b2a0995a9bb1b68d4a..984db42cc8e76e6e964edb7558719bb94afa1630 100644 (file)
 #define __MACH_ADS8260_DEFS
 
 #include <linux/seq_file.h>
-#include <asm/ppcboot.h>
-
-/* For our show_cpuinfo hooks. */
-#define CPUINFO_VENDOR         "Freescale Semiconductor"
-#define CPUINFO_MACHINE                "PQ2 ADS PowerPC"
 
 /* Backword-compatibility stuff for the drivers */
 #define CPM_MAP_ADDR           ((uint)0xf0000000)
@@ -58,9 +53,5 @@
 #define SIU_INT_SCC3           ((uint)0x2a+CPM_IRQ_OFFSET)
 #define SIU_INT_SCC4           ((uint)0x2b+CPM_IRQ_OFFSET)
 
-void m82xx_pci_init_irq(void);
-void mpc82xx_ads_show_cpuinfo(struct seq_file*);
-void m82xx_calibrate_decr(void);
-
 #endif /* __MACH_ADS8260_DEFS */
 #endif /* __KERNEL__ */
diff --git a/arch/powerpc/platforms/82xx/pq2fads.c b/arch/powerpc/platforms/82xx/pq2fads.c
new file mode 100644 (file)
index 0000000..4f457a9
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * PQ2FADS board support
+ *
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Loosely based on mp82xx ADS support by Vitaly Bordug <vbordug@ru.mvista.com>
+ * Copyright (c) 2006 MontaVista Software, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published
+ * by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/fsl_devices.h>
+
+#include <asm/io.h>
+#include <asm/cpm2.h>
+#include <asm/udbg.h>
+#include <asm/machdep.h>
+#include <asm/of_platform.h>
+#include <asm/time.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/cpm2_pic.h>
+
+#include "pq2ads.h"
+#include "pq2.h"
+
+static void __init pq2fads_pic_init(void)
+{
+       struct device_node *np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
+       if (!np) {
+               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
+               return;
+       }
+
+       cpm2_pic_init(np);
+       of_node_put(np);
+
+       /* Initialize stuff for the 82xx CPLD IC and install demux  */
+       pq2ads_pci_init_irq();
+}
+
+struct cpm_pin {
+       int port, pin, flags;
+};
+
+static struct cpm_pin pq2fads_pins[] = {
+       /* SCC1 */
+       {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* SCC2 */
+       {3, 27, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {3, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* FCC2 */
+       {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* FCC3 */
+       {1, 4, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 5, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 6, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 7, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 9, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 10, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 11, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 12, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 13, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 14, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 15, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {2, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {2, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+};
+
+static void __init init_ioports(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(pq2fads_pins); i++) {
+               struct cpm_pin *pin = &pq2fads_pins[i];
+               cpm2_set_pin(pin->port, pin->pin, pin->flags);
+       }
+
+       cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_FCC3, CPM_CLK15, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_FCC3, CPM_CLK16, CPM_CLK_TX);
+}
+
+static void __init pq2fads_setup_arch(void)
+{
+       struct device_node *np;
+       __be32 __iomem *bcsr;
+
+       if (ppc_md.progress)
+               ppc_md.progress("pq2fads_setup_arch()", 0);
+
+       cpm2_reset();
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,pq2fads-bcsr");
+       if (!np) {
+               printk(KERN_ERR "No fsl,pq2fads-bcsr in device tree\n");
+               return;
+       }
+
+       bcsr = of_iomap(np, 0);
+       if (!bcsr) {
+               printk(KERN_ERR "Cannot map BCSR registers\n");
+               return;
+       }
+
+       of_node_put(np);
+
+       /* Enable the serial and ethernet ports */
+
+       clrbits32(&bcsr[1], BCSR1_RS232_EN1 | BCSR1_RS232_EN2 | BCSR1_FETHIEN);
+       setbits32(&bcsr[1], BCSR1_FETH_RST);
+
+       clrbits32(&bcsr[3], BCSR3_FETHIEN2);
+       setbits32(&bcsr[3], BCSR3_FETH2_RST);
+
+       iounmap(bcsr);
+
+       init_ioports();
+
+       /* Enable external IRQs */
+       clrbits32(&cpm2_immr->im_siu_conf.siu_82xx.sc_siumcr, 0x0c000000);
+
+       pq2_init_pci();
+
+       if (ppc_md.progress)
+               ppc_md.progress("pq2fads_setup_arch(), finish", 0);
+}
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init pq2fads_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+       return of_flat_dt_is_compatible(root, "fsl,pq2fads");
+}
+
+static struct of_device_id __initdata of_bus_ids[] = {
+       { .name = "soc", },
+       { .name = "cpm", },
+       { .name = "localbus", },
+       {},
+};
+
+static int __init declare_of_platform_devices(void)
+{
+       if (!machine_is(pq2fads))
+               return 0;
+
+       /* Publish the QE devices */
+       of_platform_bus_probe(NULL, of_bus_ids, NULL);
+       return 0;
+}
+device_initcall(declare_of_platform_devices);
+
+define_machine(pq2fads)
+{
+       .name = "Freescale PQ2FADS",
+       .probe = pq2fads_probe,
+       .setup_arch = pq2fads_setup_arch,
+       .init_IRQ = pq2fads_pic_init,
+       .get_irq = cpm2_get_irq,
+       .calibrate_decr = generic_calibrate_decr,
+       .restart = pq2_restart,
+       .progress = udbg_progress,
+};
index 3edfe170a03b3881f282b847057d29c046756d49..33766b8f259445ff36682cb9b2061e6a15ce87a2 100644 (file)
@@ -43,10 +43,8 @@ static void __init mpc8313_rdb_setup_arch(void)
                ppc_md.progress("mpc8313_rdb_setup_arch()", 0);
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
                mpc83xx_add_bridge(np);
-
-       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
        mpc831x_usb_cfg();
 }
index 2c8e641a739b5ac4ef3f66a0f2f48025d27332eb..972fa8528a8c606614767ec12f2539c8c001cad6 100644 (file)
@@ -32,7 +32,6 @@
 #include <asm/io.h>
 #include <asm/machdep.h>
 #include <asm/ipic.h>
-#include <asm/bootinfo.h>
 #include <asm/irq.h>
 #include <asm/prom.h>
 #include <asm/udbg.h>
@@ -74,9 +73,8 @@ static void __init mpc832x_sys_setup_arch(void)
        }
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
                mpc83xx_add_bridge(np);
-       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
 
 #ifdef CONFIG_QUICC_ENGINE
@@ -142,7 +140,7 @@ static void __init mpc832x_sys_init_IRQ(void)
        if (!np)
                return;
 
-       qe_ic_init(np, 0);
+       qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic);
        of_node_put(np);
 #endif                         /* CONFIG_QUICC_ENGINE */
 }
index 090906170a41ebed91c8c38c06da1d0b51456ac5..fbca336aa0ae8466f0b94cd0c96adf57bca636f3 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 #include <linux/pci.h>
+#include <linux/spi/spi.h>
 
 #include <asm/of_platform.h>
 #include <asm/time.h>
@@ -22,6 +23,7 @@
 #include <asm/udbg.h>
 #include <asm/qe.h>
 #include <asm/qe_ic.h>
+#include <sysdev/fsl_soc.h>
 
 #include "mpc83xx.h"
 
 #define DBG(fmt...)
 #endif
 
+static void mpc83xx_spi_activate_cs(u8 cs, u8 polarity)
+{
+       pr_debug("%s %d %d\n", __func__, cs, polarity);
+       par_io_data_set(3, 13, polarity);
+}
+
+static void mpc83xx_spi_deactivate_cs(u8 cs, u8 polarity)
+{
+       pr_debug("%s %d %d\n", __func__, cs, polarity);
+       par_io_data_set(3, 13, !polarity);
+}
+
+static struct spi_board_info mpc832x_spi_boardinfo = {
+       .bus_num = 0x4c0,
+       .chip_select = 0,
+       .max_speed_hz = 50000000,
+       /*
+        * XXX: This is spidev (spi in userspace) stub, should
+        * be replaced by "mmc_spi" when mmc_spi will hit mainline.
+        */
+       .modalias = "spidev",
+};
+
+static int __init mpc832x_spi_init(void)
+{
+       if (!machine_is(mpc832x_rdb))
+               return 0;
+
+       par_io_config_pin(3,  0, 3, 0, 1, 0); /* SPI1 MOSI, I/O */
+       par_io_config_pin(3,  1, 3, 0, 1, 0); /* SPI1 MISO, I/O */
+       par_io_config_pin(3,  2, 3, 0, 1, 0); /* SPI1 CLK,  I/O */
+       par_io_config_pin(3,  3, 2, 0, 1, 0); /* SPI1 SEL,  I   */
+
+       par_io_config_pin(3, 13, 1, 0, 0, 0); /* !SD_CS,    O */
+       par_io_config_pin(3, 14, 2, 0, 0, 0); /* SD_INSERT, I */
+       par_io_config_pin(3, 15, 2, 0, 0, 0); /* SD_PROTECT,I */
+
+       return fsl_spi_init(&mpc832x_spi_boardinfo, 1,
+                           mpc83xx_spi_activate_cs,
+                           mpc83xx_spi_deactivate_cs);
+}
+
+device_initcall(mpc832x_spi_init);
+
 /* ************************************************************************
  *
  * Setup the architecture
@@ -47,10 +93,8 @@ static void __init mpc832x_rdb_setup_arch(void)
                ppc_md.progress("mpc832x_rdb_setup_arch()", 0);
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
                mpc83xx_add_bridge(np);
-
-       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
 
 #ifdef CONFIG_QUICC_ENGINE
@@ -107,7 +151,7 @@ void __init mpc832x_rdb_init_IRQ(void)
        if (!np)
                return;
 
-       qe_ic_init(np, 0);
+       qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic);
        of_node_put(np);
 #endif                         /* CONFIG_QUICC_ENGINE */
 }
index 47ba5446f63c8f6c4b54b88f631169072517b93b..aa768199432ddb1019e99963d3e59d1d264da9fd 100644 (file)
@@ -30,7 +30,6 @@
 #include <asm/io.h>
 #include <asm/machdep.h>
 #include <asm/ipic.h>
-#include <asm/bootinfo.h>
 #include <asm/irq.h>
 #include <asm/prom.h>
 #include <asm/udbg.h>
@@ -53,10 +52,8 @@ static void __init mpc834x_itx_setup_arch(void)
                ppc_md.progress("mpc834x_itx_setup_arch()", 0);
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
                mpc83xx_add_bridge(np);
-
-       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
 
        mpc834x_usb_cfg();
index 4c9ff9cadfe4f6d244ae3e897955bc9be579e95c..00aed7c2269ea4e56cc74950cb3ccf92736d04a8 100644 (file)
@@ -30,7 +30,6 @@
 #include <asm/io.h>
 #include <asm/machdep.h>
 #include <asm/ipic.h>
-#include <asm/bootinfo.h>
 #include <asm/irq.h>
 #include <asm/prom.h>
 #include <asm/udbg.h>
@@ -84,10 +83,8 @@ static void __init mpc834x_mds_setup_arch(void)
                ppc_md.progress("mpc834x_mds_setup_arch()", 0);
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
                mpc83xx_add_bridge(np);
-
-       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
 
        mpc834xemds_usb_cfg();
index 84b58934aafde7580cc15a118d333ec8efbfd3e1..0f3855c95ff5c6c0a4bc5d1caf78bfb2d6561be0 100644 (file)
@@ -38,7 +38,6 @@
 #include <asm/io.h>
 #include <asm/machdep.h>
 #include <asm/ipic.h>
-#include <asm/bootinfo.h>
 #include <asm/irq.h>
 #include <asm/prom.h>
 #include <asm/udbg.h>
@@ -80,9 +79,8 @@ static void __init mpc836x_mds_setup_arch(void)
        }
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
                mpc83xx_add_bridge(np);
-       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
 
 #ifdef CONFIG_QUICC_ENGINE
@@ -149,7 +147,7 @@ static void __init mpc836x_mds_init_IRQ(void)
        if (!np)
                return;
 
-       qe_ic_init(np, 0);
+       qe_ic_init(np, 0, qe_ic_cascade_low_ipic, qe_ic_cascade_high_ipic);
        of_node_put(np);
 #endif                         /* CONFIG_QUICC_ENGINE */
 }
index 589ee55730f3945ea0345d2db6c726ea8a0f9b14..b778cb4f3fb552d61dac7568d6753cc37b64b5b5 100644 (file)
@@ -49,8 +49,6 @@
  */
 
 extern int mpc83xx_add_bridge(struct device_node *dev);
-extern int mpc83xx_exclude_device(struct pci_controller *hose,
-                                 u_char bus, u_char devfn);
 extern void mpc83xx_restart(char *cmd);
 extern long mpc83xx_time_init(void);
 extern int mpc834x_usb_cfg(void);
index 92069469de206ad2e72b0077fec55bc7ec82659d..80425d7b14f8b0b24376a1de86458c61a163684e 100644 (file)
 #define DBG(x...)
 #endif
 
-int mpc83xx_exclude_device(struct pci_controller *hose, u_char bus, u_char devfn)
-{
-       if ((bus == hose->first_busno) && PCI_SLOT(devfn) == 0)
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       return PCIBIOS_SUCCESSFUL;
-}
-
 int __init mpc83xx_add_bridge(struct device_node *dev)
 {
        int len;
index f620171ad6b1ab7df47ad9c574c0062e57240139..7748a3a426db16ad4a6adc9e86da38071a34838e 100644 (file)
@@ -12,6 +12,7 @@ config MPC8540_ADS
 config MPC8560_ADS
        bool "Freescale MPC8560 ADS"
        select DEFAULT_UIMAGE
+       select PPC_CPM_NEW_BINDING
        help
          This option enables support for the MPC 8560 ADS board
 
@@ -25,17 +26,17 @@ config MPC85xx_CDS
 config MPC85xx_MDS
        bool "Freescale MPC85xx MDS"
        select DEFAULT_UIMAGE
-#      select QUICC_ENGINE
+       select QUICC_ENGINE
        help
          This option enables support for the MPC85xx MDS board
 
-config MPC8544_DS
-       bool "Freescale MPC8544 DS"
+config MPC85xx_DS
+       bool "Freescale MPC85xx DS"
        select PPC_I8259
        select DEFAULT_UIMAGE
        select FSL_ULI1575
        help
-         This option enables support for the MPC8544 DS board
+         This option enables support for the MPC85xx DS (MPC8544 DS) board
 
 endchoice
 
@@ -58,4 +59,4 @@ config MPC85xx
        select FSL_PCI if PCI
        select SERIAL_8250_SHARE_IRQ if SERIAL_8250
        default y if MPC8540_ADS || MPC85xx_CDS || MPC8560_ADS \
-               || MPC85xx_MDS || MPC8544_DS
+               || MPC85xx_MDS || MPC85xx_DS
index d70f2d0f9d367cdda63e60de88aeef0551dfe9e6..5eca92023ec8bf642d50654c55d3c68306739d85 100644 (file)
@@ -1,9 +1,8 @@
 #
 # Makefile for the PowerPC 85xx linux kernel.
 #
-obj-$(CONFIG_PPC_85xx) += misc.o
 obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o
 obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o
 obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o
-obj-$(CONFIG_MPC8544_DS)  += mpc8544_ds.o
+obj-$(CONFIG_MPC85xx_DS)  += mpc85xx_ds.o
 obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o
diff --git a/arch/powerpc/platforms/85xx/misc.c b/arch/powerpc/platforms/85xx/misc.c
deleted file mode 100644 (file)
index 4fe376e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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>
-#include <asm/io.h>
-#include <asm/prom.h>
-#include <sysdev/fsl_soc.h>
-
-static __be32 __iomem *rstcr;
-
-extern void abort(void);
-
-static int __init mpc85xx_rstcr(void)
-{
-       struct device_node *np;
-       np = of_find_node_by_name(NULL, "global-utilities");
-       if ((np && of_get_property(np, "fsl,has-rstcr", NULL))) {
-               const u32 *prop = of_get_property(np, "reg", NULL);
-               if (prop) {
-                       /* map reset control register
-                        * 0xE00B0 is offset of reset control register
-                        */
-                       rstcr = ioremap(get_immrbase() + *prop + 0xB0, 0xff);
-                       if (!rstcr)
-                               printk (KERN_EMERG "Error: reset control "
-                                               "register not mapped!\n");
-               }
-       } else
-               printk (KERN_INFO "rstcr compatible register does not exist!\n");
-       if (np)
-               of_node_put(np);
-       return 0;
-}
-
-arch_initcall(mpc85xx_rstcr);
-
-void mpc85xx_restart(char *cmd)
-{
-       local_irq_disable();
-       if (rstcr)
-               /* set reset control register */
-               out_be32(rstcr, 0x2);   /* HRESET_REQ */
-       abort();
-}
diff --git a/arch/powerpc/platforms/85xx/mpc8540_ads.h b/arch/powerpc/platforms/85xx/mpc8540_ads.h
deleted file mode 100644 (file)
index da82f4c..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * arch/powerpc/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/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/mpc8544_ds.c b/arch/powerpc/platforms/85xx/mpc8544_ds.c
deleted file mode 100644 (file)
index 48983bc..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * MPC8544 DS Board Setup
- *
- * Author Xianghua Xiao (x.xiao@freescale.com)
- * Roy Zang <tie-fei.zang@freescale.com>
- *     - Add PCI/PCI Exprees support
- * Copyright 2007 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/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/interrupt.h>
-
-#include <asm/system.h>
-#include <asm/time.h>
-#include <asm/machdep.h>
-#include <asm/pci-bridge.h>
-#include <asm/mpc85xx.h>
-#include <mm/mmu_decl.h>
-#include <asm/prom.h>
-#include <asm/udbg.h>
-#include <asm/mpic.h>
-#include <asm/i8259.h>
-
-#include <sysdev/fsl_soc.h>
-#include <sysdev/fsl_pci.h>
-#include "mpc85xx.h"
-
-#undef DEBUG
-
-#ifdef DEBUG
-#define DBG(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args)
-#else
-#define DBG(fmt, args...)
-#endif
-
-#ifdef CONFIG_PPC_I8259
-static void mpc8544_8259_cascade(unsigned int irq, struct irq_desc *desc)
-{
-       unsigned int cascade_irq = i8259_irq();
-
-       if (cascade_irq != NO_IRQ) {
-               generic_handle_irq(cascade_irq);
-       }
-       desc->chip->eoi(irq);
-}
-#endif /* CONFIG_PPC_I8259 */
-
-void __init mpc8544_ds_pic_init(void)
-{
-       struct mpic *mpic;
-       struct resource r;
-       struct device_node *np = NULL;
-#ifdef CONFIG_PPC_I8259
-       struct device_node *cascade_node = NULL;
-       int cascade_irq;
-#endif
-
-       np = of_find_node_by_type(np, "open-pic");
-
-       if (np == NULL) {
-               printk(KERN_ERR "Could not find open-pic node\n");
-               return;
-       }
-
-       if (of_address_to_resource(np, 0, &r)) {
-               printk(KERN_ERR "Failed to map mpic register space\n");
-               of_node_put(np);
-               return;
-       }
-
-       mpic = mpic_alloc(np, r.start,
-                         MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
-                       0, 256, " OpenPIC  ");
-       BUG_ON(mpic == NULL);
-
-       mpic_init(mpic);
-
-#ifdef CONFIG_PPC_I8259
-       /* Initialize the i8259 controller */
-       for_each_node_by_type(np, "interrupt-controller")
-           if (of_device_is_compatible(np, "chrp,iic")) {
-               cascade_node = np;
-               break;
-       }
-
-       if (cascade_node == NULL) {
-               printk(KERN_DEBUG "Could not find i8259 PIC\n");
-               return;
-       }
-
-       cascade_irq = irq_of_parse_and_map(cascade_node, 0);
-       if (cascade_irq == NO_IRQ) {
-               printk(KERN_ERR "Failed to map cascade interrupt\n");
-               return;
-       }
-
-       DBG("mpc8544ds: cascade mapped to irq %d\n", cascade_irq);
-
-       i8259_init(cascade_node, 0);
-       of_node_put(cascade_node);
-
-       set_irq_chained_handler(cascade_irq, mpc8544_8259_cascade);
-#endif /* CONFIG_PPC_I8259 */
-}
-
-#ifdef CONFIG_PCI
-extern int uses_fsl_uli_m1575;
-extern int uli_exclude_device(struct pci_controller *hose,
-                               u_char bus, u_char devfn);
-
-static int mpc85xx_exclude_device(struct pci_controller *hose,
-                                  u_char bus, u_char devfn)
-{
-       struct device_node* node;       
-       struct resource rsrc;
-
-       node = (struct device_node *)hose->arch_data;
-       of_address_to_resource(node, 0, &rsrc);
-
-       if ((rsrc.start & 0xfffff) == 0xb000) {
-               return uli_exclude_device(hose, bus, devfn);
-       }
-
-       return PCIBIOS_SUCCESSFUL;
-}
-#endif /* CONFIG_PCI */
-
-/*
- * Setup the architecture
- */
-static void __init mpc8544_ds_setup_arch(void)
-{
-#ifdef CONFIG_PCI
-       struct device_node *np;
-#endif
-
-       if (ppc_md.progress)
-               ppc_md.progress("mpc8544_ds_setup_arch()", 0);
-
-#ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) {
-               struct resource rsrc;
-               of_address_to_resource(np, 0, &rsrc);
-               if ((rsrc.start & 0xfffff) == 0xb000)
-                       fsl_add_bridge(np, 1);
-               else
-                       fsl_add_bridge(np, 0);
-       }
-       uses_fsl_uli_m1575 = 1;
-       ppc_md.pci_exclude_device = mpc85xx_exclude_device;
-#endif
-
-       printk("MPC8544 DS board from Freescale Semiconductor\n");
-}
-
-/*
- * Called very early, device-tree isn't unflattened
- */
-static int __init mpc8544_ds_probe(void)
-{
-       unsigned long root = of_get_flat_dt_root();
-
-       return of_flat_dt_is_compatible(root, "MPC8544DS");
-}
-
-define_machine(mpc8544_ds) {
-       .name                   = "MPC8544 DS",
-       .probe                  = mpc8544_ds_probe,
-       .setup_arch             = mpc8544_ds_setup_arch,
-       .init_IRQ               = mpc8544_ds_pic_init,
-#ifdef CONFIG_PCI
-       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
-#endif
-       .get_irq                = mpic_get_irq,
-       .restart                = mpc85xx_restart,
-       .calibrate_decr         = generic_calibrate_decr,
-       .progress               = udbg_progress,
-};
diff --git a/arch/powerpc/platforms/85xx/mpc85xx.h b/arch/powerpc/platforms/85xx/mpc85xx.h
deleted file mode 100644 (file)
index 5b34dee..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * arch/powerpc/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 *);
index 40a828675c7bd0b044f122be31a845544cf7a0a9..bccdc25f83a26873f98788f6de94643f63a616c7 100644 (file)
 #include <linux/kdev_t.h>
 #include <linux/delay.h>
 #include <linux/seq_file.h>
+#include <linux/of_platform.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 <sysdev/fsl_pci.h>
-#include "mpc85xx.h"
 
 #ifdef CONFIG_CPM2
-#include <linux/fs_enet_pd.h>
 #include <asm/cpm2.h>
 #include <sysdev/cpm2_pic.h>
-#include <asm/fs_pd.h>
 #endif
 
 #ifdef CONFIG_PCI
@@ -96,10 +92,10 @@ static void __init mpc85xx_ads_pic_init(void)
 
 #ifdef CONFIG_CPM2
        /* Setup CPM2 PIC */
-       np = of_find_node_by_type(NULL, "cpm-pic");
+       np = of_find_compatible_node(NULL, NULL, "fsl,cpm2-pic");
        if (np == NULL) {
-               printk(KERN_ERR "PIC init: can not find cpm-pic node\n");
-                return;
+               printk(KERN_ERR "PIC init: can not find fsl,cpm2-pic node\n");
+               return;
        }
        irq = irq_of_parse_and_map(np, 0);
 
@@ -112,87 +108,80 @@ static void __init mpc85xx_ads_pic_init(void)
  * Setup the architecture
  */
 #ifdef CONFIG_CPM2
-void init_fcc_ioports(struct fs_platform_info *fpi)
+struct cpm_pin {
+       int port, pin, flags;
+};
+
+static struct cpm_pin mpc8560_ads_pins[] = {
+       /* SCC1 */
+       {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* SCC2 */
+       {3, 26, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {3, 27, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {3, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+
+       /* FCC2 */
+       {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, /* CLK14 */
+       {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY}, /* CLK13 */
+
+       /* FCC3 */
+       {1, 4, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 5, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 6, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 7, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 8, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 9, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 10, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 11, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 12, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 13, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 14, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 15, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
+       {1, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {1, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
+       {2, 16, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* CLK16 */
+       {2, 17, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* CLK15 */
+};
+
+static void __init init_ioports(void)
 {
-       struct io_port *io = cpm2_map(im_ioport);
-       int fcc_no = fs_get_fcc_index(fpi->fs_no);
-       int target;
-       u32 tempval;
-
-       switch(fcc_no) {
-       case 1:
-               tempval = in_be32(&io->iop_pdirb);
-               tempval &= ~PB2_DIRB0;
-               tempval |= PB2_DIRB1;
-               out_be32(&io->iop_pdirb, tempval);
-
-               tempval = in_be32(&io->iop_psorb);
-               tempval &= ~PB2_PSORB0;
-               tempval |= PB2_PSORB1;
-               out_be32(&io->iop_psorb, tempval);
-
-               tempval = in_be32(&io->iop_pparb);
-               tempval |= (PB2_DIRB0 | PB2_DIRB1);
-               out_be32(&io->iop_pparb, tempval);
-
-               target = CPM_CLK_FCC2;
-               break;
-       case 2:
-               tempval = in_be32(&io->iop_pdirb);
-               tempval &= ~PB3_DIRB0;
-               tempval |= PB3_DIRB1;
-               out_be32(&io->iop_pdirb, tempval);
-
-               tempval = in_be32(&io->iop_psorb);
-               tempval &= ~PB3_PSORB0;
-               tempval |= PB3_PSORB1;
-               out_be32(&io->iop_psorb, tempval);
-
-               tempval = in_be32(&io->iop_pparb);
-               tempval |= (PB3_DIRB0 | PB3_DIRB1);
-               out_be32(&io->iop_pparb, tempval);
-
-               tempval = in_be32(&io->iop_pdirc);
-               tempval |= PC3_DIRC1;
-               out_be32(&io->iop_pdirc, tempval);
-
-               tempval = in_be32(&io->iop_pparc);
-               tempval |= PC3_DIRC1;
-               out_be32(&io->iop_pparc, tempval);
-
-               target = CPM_CLK_FCC3;
-               break;
-       default:
-               printk(KERN_ERR "init_fcc_ioports: invalid FCC number\n");
-               return;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(mpc8560_ads_pins); i++) {
+               struct cpm_pin *pin = &mpc8560_ads_pins[i];
+               cpm2_set_pin(pin->port, pin->pin, pin->flags);
        }
 
-       /* Port C has clocks......  */
-       tempval = in_be32(&io->iop_psorc);
-       tempval &= ~(PC_CLK(fpi->clk_rx - 8) | PC_CLK(fpi->clk_tx - 8));
-       out_be32(&io->iop_psorc, tempval);
-
-       tempval = in_be32(&io->iop_pdirc);
-       tempval &= ~(PC_CLK(fpi->clk_rx - 8) | PC_CLK(fpi->clk_tx - 8));
-       out_be32(&io->iop_pdirc, tempval);
-       tempval = in_be32(&io->iop_pparc);
-       tempval |= (PC_CLK(fpi->clk_rx - 8) | PC_CLK(fpi->clk_tx - 8));
-       out_be32(&io->iop_pparc, tempval);
-
-       cpm2_unmap(io);
-
-       /* Configure Serial Interface clock routing.
-        * First,  clear FCC bits to zero,
-        * then set the ones we want.
-        */
-       cpm2_clk_setup(target, fpi->clk_rx, CPM_CLK_RX);
-       cpm2_clk_setup(target, fpi->clk_tx, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX);
+       cpm2_clk_setup(CPM_CLK_FCC3, CPM_CLK15, CPM_CLK_RX);
+       cpm2_clk_setup(CPM_CLK_FCC3, CPM_CLK16, CPM_CLK_TX);
 }
 #endif
 
 static void __init mpc85xx_ads_setup_arch(void)
 {
-       struct device_node *cpu;
 #ifdef CONFIG_PCI
        struct device_node *np;
 #endif
@@ -200,25 +189,15 @@ static void __init mpc85xx_ads_setup_arch(void)
        if (ppc_md.progress)
                ppc_md.progress("mpc85xx_ads_setup_arch()", 0);
 
-       cpu = of_find_node_by_type(NULL, "cpu");
-       if (cpu != 0) {
-               const unsigned int *fp;
-
-               fp = of_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_CPM2
        cpm2_reset();
+       init_ioports();
 #endif
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "fsl,mpc8540-pci")
                fsl_add_bridge(np, 1);
+
        ppc_md.pci_exclude_device = mpc85xx_exclude_device;
 #endif
 }
@@ -244,6 +223,24 @@ static void mpc85xx_ads_show_cpuinfo(struct seq_file *m)
        seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
 }
 
+static struct of_device_id __initdata of_bus_ids[] = {
+       { .name = "soc", },
+       { .type = "soc", },
+       { .name = "cpm", },
+       { .name = "localbus", },
+       {},
+};
+
+static int __init declare_of_platform_devices(void)
+{
+       if (!machine_is(mpc85xx_ads))
+               return 0;
+
+       of_platform_bus_probe(NULL, of_bus_ids, NULL);
+       return 0;
+}
+device_initcall(declare_of_platform_devices);
+
 /*
  * Called very early, device-tree isn't unflattened
  */
@@ -261,7 +258,7 @@ define_machine(mpc85xx_ads) {
        .init_IRQ               = mpc85xx_ads_pic_init,
        .show_cpuinfo           = mpc85xx_ads_show_cpuinfo,
        .get_irq                = mpic_get_irq,
-       .restart                = mpc85xx_restart,
+       .restart                = fsl_rstcr_restart,
        .calibrate_decr         = generic_calibrate_decr,
        .progress               = udbg_progress,
 };
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ads.h b/arch/powerpc/platforms/85xx/mpc85xx_ads.h
deleted file mode 100644 (file)
index 46c3532..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * MPC85xx ADS board definitions
- *
- * Maintainer: Kumar Gala <galak@kernel.crashing.org>
- *
- * Copyright 2004 Freescale Semiconductor Inc.
- *
- * 2006 (c) MontaVista Software, Inc.
- * Vitaly Bordug <vbordug@ru.mvista.com>
- *
- * 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_MPC85XXADS_H
-#define __MACH_MPC85XXADS_H
-
-#include <linux/initrd.h>
-#include <sysdev/fsl_soc.h>
-
-#define BCSR_ADDR              ((uint)0xf8000000)
-#define BCSR_SIZE              ((uint)(32 * 1024))
-
-#ifdef CONFIG_CPM2
-
-#define MPC85xx_CPM_OFFSET     (0x80000)
-
-#define CPM_MAP_ADDR           (get_immrbase() + MPC85xx_CPM_OFFSET)
-#define CPM_IRQ_OFFSET         60
-
-#define SIU_INT_SMC1           ((uint)0x04+CPM_IRQ_OFFSET)
-#define SIU_INT_SMC2           ((uint)0x05+CPM_IRQ_OFFSET)
-#define SIU_INT_SCC1           ((uint)0x28+CPM_IRQ_OFFSET)
-#define SIU_INT_SCC2           ((uint)0x29+CPM_IRQ_OFFSET)
-#define SIU_INT_SCC3           ((uint)0x2a+CPM_IRQ_OFFSET)
-#define SIU_INT_SCC4           ((uint)0x2b+CPM_IRQ_OFFSET)
-
-/* FCC1 Clock Source Configuration.  These can be
- * redefined in the board specific file.
- *    Can only choose from CLK9-12 */
-#define F1_RXCLK       12
-#define F1_TXCLK       11
-
-/* FCC2 Clock Source Configuration.  These can be
- * redefined in the board specific file.
- *    Can only choose from CLK13-16 */
-#define F2_RXCLK       13
-#define F2_TXCLK       14
-
-/* FCC3 Clock Source Configuration.  These can be
- * redefined in the board specific file.
- *    Can only choose from CLK13-16 */
-#define F3_RXCLK       15
-#define F3_TXCLK       16
-
-#endif /* CONFIG_CPM2 */
-#endif /* __MACH_MPC85XXADS_H */
index 2d4cb784760423931e5150cb87f2a567f657c8ec..4d063eec62107fe6a38adfe75de5218e04af7b08 100644 (file)
@@ -35,9 +35,7 @@
 #include <asm/io.h>
 #include <asm/machdep.h>
 #include <asm/ipic.h>
-#include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
-#include <asm/mpc85xx.h>
 #include <asm/irq.h>
 #include <mm/mmu_decl.h>
 #include <asm/prom.h>
 
 #include <sysdev/fsl_soc.h>
 #include <sysdev/fsl_pci.h>
-#include "mpc85xx.h"
+
+/* CADMUS info */
+/* xxx - galak, move into device tree */
+#define CADMUS_BASE (0xf8004000)
+#define CADMUS_SIZE (256)
+#define CM_VER (0)
+#define CM_CSR (1)
+#define CM_RST (2)
+
 
 static int cds_pci_slot = 2;
 static volatile u8 *cadmus;
@@ -97,7 +103,7 @@ static void mpc85xx_cds_restart(char *cmd)
         *  If we can't find the VIA chip (maybe the P2P bridge is disabled)
         *  or the VIA chip reset didn't work, just use the default reset.
         */
-       mpc85xx_restart(NULL);
+       fsl_rstcr_restart(NULL);
 }
 
 static void __init mpc85xx_cds_pci_irq_fixup(struct pci_dev *dev)
@@ -266,7 +272,6 @@ device_initcall(mpc85xx_cds_8259_attach);
  */
 static void __init mpc85xx_cds_setup_arch(void)
 {
-       struct device_node *cpu;
 #ifdef CONFIG_PCI
        struct device_node *np;
 #endif
@@ -274,18 +279,6 @@ static void __init mpc85xx_cds_setup_arch(void)
        if (ppc_md.progress)
                ppc_md.progress("mpc85xx_cds_setup_arch()", 0);
 
-       cpu = of_find_node_by_type(NULL, "cpu");
-       if (cpu != 0) {
-               const unsigned int *fp;
-
-               fp = of_get_property(cpu, "clock-frequency", NULL);
-               if (fp != 0)
-                       loops_per_jiffy = *fp / HZ;
-               else
-                       loops_per_jiffy = 500000000 / HZ;
-               of_node_put(cpu);
-       }
-
        cadmus = ioremap(CADMUS_BASE, CADMUS_SIZE);
        cds_pci_slot = ((cadmus[CM_CSR] >> 6) & 0x3) + 1;
 
@@ -297,14 +290,18 @@ static void __init mpc85xx_cds_setup_arch(void)
        }
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) {
-               struct resource rsrc;
-               of_address_to_resource(np, 0, &rsrc);
-               if ((rsrc.start & 0xfffff) == 0x8000)
-                       fsl_add_bridge(np, 1);
-               else
-                       fsl_add_bridge(np, 0);
+       for_each_node_by_type(np, "pci") {
+               if (of_device_is_compatible(np, "fsl,mpc8540-pci") ||
+                   of_device_is_compatible(np, "fsl,mpc8548-pcie")) {
+                       struct resource rsrc;
+                       of_address_to_resource(np, 0, &rsrc);
+                       if ((rsrc.start & 0xfffff) == 0x8000)
+                               fsl_add_bridge(np, 1);
+                       else
+                               fsl_add_bridge(np, 0);
+               }
        }
+
        ppc_md.pci_irq_fixup = mpc85xx_cds_pci_irq_fixup;
        ppc_md.pci_exclude_device = mpc85xx_exclude_device;
 #endif
@@ -353,7 +350,7 @@ define_machine(mpc85xx_cds) {
        .restart        = mpc85xx_cds_restart,
        .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
 #else
-       .restart        = mpc85xx_restart,
+       .restart        = fsl_rstcr_restart,
 #endif
        .calibrate_decr = generic_calibrate_decr,
        .progress       = udbg_progress,
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.h b/arch/powerpc/platforms/85xx/mpc85xx_cds.h
deleted file mode 100644 (file)
index b251c9f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * arch/powerpc/platforms/85xx/mpc85xx_cds.h
- *
- * MPC85xx CDS board definitions
- *
- * Maintainer: Kumar Gala <galak@kernel.crashing.org>
- *
- * 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_MPC85XX_CDS_H__
-#define __MACH_MPC85XX_CDS_H__
-
-/* CADMUS info */
-#define CADMUS_BASE (0xf8004000)
-#define CADMUS_SIZE (256)
-#define CM_VER (0)
-#define CM_CSR (1)
-#define CM_RST (2)
-
-/* CDS NVRAM/RTC */
-#define CDS_RTC_ADDR   (0xf8000000)
-#define CDS_RTC_SIZE   (8 * 1024)
-
-/* PCI interrupt controller */
-#define PIRQ0A                 MPC85xx_IRQ_EXT0
-#define PIRQ0B                 MPC85xx_IRQ_EXT1
-#define PIRQ0C                 MPC85xx_IRQ_EXT2
-#define PIRQ0D                 MPC85xx_IRQ_EXT3
-#define PIRQ1A                 MPC85xx_IRQ_EXT11
-
-#define NR_8259_INTS           16
-#define CPM_IRQ_OFFSET         NR_8259_INTS
-
-#define MPC85xx_OPENPIC_IRQ_OFFSET     80
-
-#endif /* __MACH_MPC85XX_CDS_H__ */
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
new file mode 100644 (file)
index 0000000..59c121a
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * MPC85xx DS Board Setup
+ *
+ * Author Xianghua Xiao (x.xiao@freescale.com)
+ * Roy Zang <tie-fei.zang@freescale.com>
+ *     - Add PCI/PCI Exprees support
+ * Copyright 2007 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/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/interrupt.h>
+
+#include <asm/system.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <asm/mpic.h>
+#include <asm/i8259.h>
+
+#include <sysdev/fsl_soc.h>
+#include <sysdev/fsl_pci.h>
+
+#undef DEBUG
+
+#ifdef DEBUG
+#define DBG(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ## args)
+#else
+#define DBG(fmt, args...)
+#endif
+
+#ifdef CONFIG_PPC_I8259
+static void mpc85xx_8259_cascade(unsigned int irq, struct irq_desc *desc)
+{
+       unsigned int cascade_irq = i8259_irq();
+
+       if (cascade_irq != NO_IRQ) {
+               generic_handle_irq(cascade_irq);
+       }
+       desc->chip->eoi(irq);
+}
+#endif /* CONFIG_PPC_I8259 */
+
+void __init mpc85xx_ds_pic_init(void)
+{
+       struct mpic *mpic;
+       struct resource r;
+       struct device_node *np = NULL;
+#ifdef CONFIG_PPC_I8259
+       struct device_node *cascade_node = NULL;
+       int cascade_irq;
+#endif
+
+       np = of_find_node_by_type(np, "open-pic");
+
+       if (np == NULL) {
+               printk(KERN_ERR "Could not find open-pic node\n");
+               return;
+       }
+
+       if (of_address_to_resource(np, 0, &r)) {
+               printk(KERN_ERR "Failed to map mpic register space\n");
+               of_node_put(np);
+               return;
+       }
+
+       mpic = mpic_alloc(np, r.start,
+                         MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
+                       0, 256, " OpenPIC  ");
+       BUG_ON(mpic == NULL);
+
+       mpic_init(mpic);
+
+#ifdef CONFIG_PPC_I8259
+       /* Initialize the i8259 controller */
+       for_each_node_by_type(np, "interrupt-controller")
+           if (of_device_is_compatible(np, "chrp,iic")) {
+               cascade_node = np;
+               break;
+       }
+
+       if (cascade_node == NULL) {
+               printk(KERN_DEBUG "Could not find i8259 PIC\n");
+               return;
+       }
+
+       cascade_irq = irq_of_parse_and_map(cascade_node, 0);
+       if (cascade_irq == NO_IRQ) {
+               printk(KERN_ERR "Failed to map cascade interrupt\n");
+               return;
+       }
+
+       DBG("mpc85xxds: cascade mapped to irq %d\n", cascade_irq);
+
+       i8259_init(cascade_node, 0);
+       of_node_put(cascade_node);
+
+       set_irq_chained_handler(cascade_irq, mpc85xx_8259_cascade);
+#endif /* CONFIG_PPC_I8259 */
+}
+
+#ifdef CONFIG_PCI
+static int primary_phb_addr;
+extern int uses_fsl_uli_m1575;
+extern int uli_exclude_device(struct pci_controller *hose,
+                               u_char bus, u_char devfn);
+
+static int mpc85xx_exclude_device(struct pci_controller *hose,
+                                  u_char bus, u_char devfn)
+{
+       struct device_node* node;
+       struct resource rsrc;
+
+       node = (struct device_node *)hose->arch_data;
+       of_address_to_resource(node, 0, &rsrc);
+
+       if ((rsrc.start & 0xfffff) == primary_phb_addr) {
+               return uli_exclude_device(hose, bus, devfn);
+       }
+
+       return PCIBIOS_SUCCESSFUL;
+}
+#endif /* CONFIG_PCI */
+
+/*
+ * Setup the architecture
+ */
+static void __init mpc85xx_ds_setup_arch(void)
+{
+#ifdef CONFIG_PCI
+       struct device_node *np;
+#endif
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc85xx_ds_setup_arch()", 0);
+
+#ifdef CONFIG_PCI
+       for_each_node_by_type(np, "pci") {
+               if (of_device_is_compatible(np, "fsl,mpc8540-pci") ||
+                   of_device_is_compatible(np, "fsl,mpc8548-pcie")) {
+                       struct resource rsrc;
+                       of_address_to_resource(np, 0, &rsrc);
+                       if ((rsrc.start & 0xfffff) == primary_phb_addr)
+                               fsl_add_bridge(np, 1);
+                       else
+                               fsl_add_bridge(np, 0);
+               }
+       }
+
+       uses_fsl_uli_m1575 = 1;
+       ppc_md.pci_exclude_device = mpc85xx_exclude_device;
+#endif
+
+       printk("MPC85xx DS board from Freescale Semiconductor\n");
+}
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init mpc8544_ds_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (of_flat_dt_is_compatible(root, "MPC8544DS")) {
+#ifdef CONFIG_PCI
+               primary_phb_addr = 0xb000;
+#endif
+               return 1;
+       } else {
+               return 0;
+       }
+}
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init mpc8572_ds_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (of_flat_dt_is_compatible(root, "fsl,MPC8572DS")) {
+#ifdef CONFIG_PCI
+               primary_phb_addr = 0x8000;
+#endif
+               return 1;
+       } else {
+               return 0;
+       }
+}
+
+define_machine(mpc8544_ds) {
+       .name                   = "MPC8544 DS",
+       .probe                  = mpc8544_ds_probe,
+       .setup_arch             = mpc85xx_ds_setup_arch,
+       .init_IRQ               = mpc85xx_ds_pic_init,
+#ifdef CONFIG_PCI
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
+#endif
+       .get_irq                = mpic_get_irq,
+       .restart                = fsl_rstcr_restart,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+};
+
+define_machine(mpc8572_ds) {
+       .name                   = "MPC8572 DS",
+       .probe                  = mpc8572_ds_probe,
+       .setup_arch             = mpc85xx_ds_setup_arch,
+       .init_IRQ               = mpc85xx_ds_pic_init,
+#ifdef CONFIG_PCI
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
+#endif
+       .get_irq                = mpic_get_irq,
+       .restart                = fsl_rstcr_restart,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+};
index 7ca7e676f1c42cd849c9f25709f3326124038851..61b3eedf41b9920e38e1ccee0cc3c9ff94dcfda4 100644 (file)
@@ -38,9 +38,7 @@
 #include <asm/time.h>
 #include <asm/io.h>
 #include <asm/machdep.h>
-#include <asm/bootinfo.h>
 #include <asm/pci-bridge.h>
-#include <asm/mpc85xx.h>
 #include <asm/irq.h>
 #include <mm/mmu_decl.h>
 #include <asm/prom.h>
@@ -51,8 +49,6 @@
 #include <asm/qe_ic.h>
 #include <asm/mpic.h>
 
-#include "mpc85xx.h"
-
 #undef DEBUG
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -73,17 +69,6 @@ static void __init mpc85xx_mds_setup_arch(void)
        if (ppc_md.progress)
                ppc_md.progress("mpc85xx_mds_setup_arch()", 0);
 
-       np = of_find_node_by_type(NULL, "cpu");
-       if (np != NULL) {
-               const unsigned int *fp =
-                   of_get_property(np, "clock-frequency", NULL);
-               if (fp != NULL)
-                       loops_per_jiffy = *fp / HZ;
-               else
-                       loops_per_jiffy = 50000000 / HZ;
-               of_node_put(np);
-       }
-
        /* Map BCSR area */
        np = of_find_node_by_name(NULL, "bcsr");
        if (np != NULL) {
@@ -95,9 +80,17 @@ static void __init mpc85xx_mds_setup_arch(void)
        }
 
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
-               fsl_add_bridge(np, 1);
-       of_node_put(np);
+       for_each_node_by_type(np, "pci") {
+               if (of_device_is_compatible(np, "fsl,mpc8540-pci") ||
+                   of_device_is_compatible(np, "fsl,mpc8548-pcie")) {
+                       struct resource rsrc;
+                       of_address_to_resource(np, 0, &rsrc);
+                       if ((rsrc.start & 0xfffff) == 0x8000)
+                               fsl_add_bridge(np, 1);
+                       else
+                               fsl_add_bridge(np, 0);
+               }
+       }
 #endif
 
 #ifdef CONFIG_QUICC_ENGINE
@@ -119,18 +112,22 @@ static void __init mpc85xx_mds_setup_arch(void)
        }
 
        if (bcsr_regs) {
-               u8 bcsr_phy;
+#define BCSR_UCC1_GETH_EN      (0x1 << 7)
+#define BCSR_UCC2_GETH_EN      (0x1 << 7)
+#define BCSR_UCC1_MODE_MSK     (0x3 << 4)
+#define BCSR_UCC2_MODE_MSK     (0x3 << 0)
 
-               /* Reset the Ethernet PHY */
-               bcsr_phy = in_be8(&bcsr_regs[9]);
-               bcsr_phy &= ~0x20;
-               out_be8(&bcsr_regs[9], bcsr_phy);
+               /* Turn off UCC1 & UCC2 */
+               clrbits8(&bcsr_regs[8], BCSR_UCC1_GETH_EN);
+               clrbits8(&bcsr_regs[9], BCSR_UCC2_GETH_EN);
 
-               udelay(1000);
+               /* Mode is RGMII, all bits clear */
+               clrbits8(&bcsr_regs[11], BCSR_UCC1_MODE_MSK |
+                                        BCSR_UCC2_MODE_MSK);
 
-               bcsr_phy = in_be8(&bcsr_regs[9]);
-               bcsr_phy |= 0x20;
-               out_be8(&bcsr_regs[9], bcsr_phy);
+               /* Turn UCC1 & UCC2 on */
+               setbits8(&bcsr_regs[8], BCSR_UCC1_GETH_EN);
+               setbits8(&bcsr_regs[9], BCSR_UCC2_GETH_EN);
 
                iounmap(bcsr_regs);
        }
@@ -186,7 +183,7 @@ static void __init mpc85xx_mds_pic_init(void)
        if (!np)
                return;
 
-       qe_ic_init(np, 0);
+       qe_ic_init(np, 0, qe_ic_cascade_muxed_mpic, NULL);
        of_node_put(np);
 #endif                         /* CONFIG_QUICC_ENGINE */
 }
@@ -204,7 +201,7 @@ define_machine(mpc85xx_mds) {
        .setup_arch     = mpc85xx_mds_setup_arch,
        .init_IRQ       = mpc85xx_mds_pic_init,
        .get_irq        = mpic_get_irq,
-       .restart        = mpc85xx_restart,
+       .restart        = fsl_rstcr_restart,
        .calibrate_decr = generic_calibrate_decr,
        .progress       = udbg_progress,
 #ifdef CONFIG_PCI
index 685b2fbbbe007609347593cc804af34a64928005..21d113536b86bc2a723109982f05b3c04212af83 100644 (file)
@@ -11,6 +11,12 @@ config MPC8641_HPCN
        help
          This option enables support for the MPC8641 HPCN board.
 
+config MPC8610_HPCD
+       bool "Freescale MPC8610 HPCD"
+       select DEFAULT_UIMAGE
+       help
+         This option enables support for the MPC8610 HPCD board.
+
 endchoice
 
 config MPC8641
@@ -19,3 +25,10 @@ config MPC8641
        select PPC_UDBG_16550
        select MPIC
        default y if MPC8641_HPCN
+
+config MPC8610
+       bool
+       select FSL_PCI if PCI
+       select PPC_UDBG_16550
+       select MPIC
+       default y if MPC8610_HPCD
index 3376c7767f2d128510708996acb050241b86e596..c96706327eaa27777de9be39a163c8fe52e64546 100644 (file)
@@ -4,3 +4,4 @@
 
 obj-$(CONFIG_SMP)              += mpc86xx_smp.o
 obj-$(CONFIG_MPC8641_HPCN)     += mpc86xx_hpcn.o
+obj-$(CONFIG_MPC8610_HPCD)     += mpc8610_hpcd.o
diff --git a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
new file mode 100644 (file)
index 0000000..6390895
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * MPC8610 HPCD board specific routines
+ *
+ * Initial author: Xianghua Xiao <x.xiao@freescale.com>
+ * Recode: Jason Jin <jason.jin@freescale.com>
+ *
+ * Rewrite the interrupt routing. remove the 8259PIC support,
+ * All the integrated device in ULI use sideband interrupt.
+ *
+ * Copyright 2007 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/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/of.h>
+
+#include <asm/system.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <asm/mpc86xx.h>
+#include <asm/prom.h>
+#include <mm/mmu_decl.h>
+#include <asm/udbg.h>
+
+#include <asm/mpic.h>
+
+#include <sysdev/fsl_pci.h>
+#include <sysdev/fsl_soc.h>
+
+void __init
+mpc86xx_hpcd_init_irq(void)
+{
+       struct mpic *mpic1;
+       struct device_node *np;
+       struct resource res;
+
+       /* Determine PIC address. */
+       np = of_find_node_by_type(NULL, "open-pic");
+       if (np == NULL)
+               return;
+       of_address_to_resource(np, 0, &res);
+
+       /* Alloc mpic structure and per isu has 16 INT entries. */
+       mpic1 = mpic_alloc(np, res.start,
+                       MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
+                       0, 256, " MPIC     ");
+       BUG_ON(mpic1 == NULL);
+
+       mpic_init(mpic1);
+}
+
+#ifdef CONFIG_PCI
+static void __devinit quirk_uli1575(struct pci_dev *dev)
+{
+       u32 temp32;
+
+       /* Disable INTx */
+       pci_read_config_dword(dev, 0x48, &temp32);
+       pci_write_config_dword(dev, 0x48, (temp32 | 1<<26));
+
+       /* Enable sideband interrupt */
+       pci_read_config_dword(dev, 0x90, &temp32);
+       pci_write_config_dword(dev, 0x90, (temp32 | 1<<22));
+}
+
+static void __devinit quirk_uli5288(struct pci_dev *dev)
+{
+       unsigned char c;
+       unsigned short temp;
+
+       /* Interrupt Disable, Needed when SATA disabled */
+       pci_read_config_word(dev, PCI_COMMAND, &temp);
+       temp |= 1<<10;
+       pci_write_config_word(dev, PCI_COMMAND, temp);
+
+       pci_read_config_byte(dev, 0x83, &c);
+       c |= 0x80;
+       pci_write_config_byte(dev, 0x83, c);
+
+       pci_write_config_byte(dev, PCI_CLASS_PROG, 0x01);
+       pci_write_config_byte(dev, PCI_CLASS_DEVICE, 0x06);
+
+       pci_read_config_byte(dev, 0x83, &c);
+       c &= 0x7f;
+       pci_write_config_byte(dev, 0x83, c);
+}
+
+/*
+ * Since 8259PIC was disabled on the board, the IDE device can not
+ * use the legacy IRQ, we need to let the IDE device work under
+ * native mode and use the interrupt line like other PCI devices.
+ * IRQ14 is a sideband interrupt from IDE device to CPU and we use this
+ * as the interrupt for IDE device.
+ */
+static void __devinit quirk_uli5229(struct pci_dev *dev)
+{
+       unsigned char c;
+
+       pci_read_config_byte(dev, 0x4b, &c);
+       c |= 0x10;
+       pci_write_config_byte(dev, 0x4b, c);
+}
+
+/*
+ * SATA interrupt pin bug fix
+ * There's a chip bug for 5288, The interrupt pin should be 2,
+ * not the read only value 1, So it use INTB#, not INTA# which
+ * actually used by the IDE device 5229.
+ * As of this bug, during the PCI initialization, 5288 read the
+ * irq of IDE device from the device tree, this function fix this
+ * bug by re-assigning a correct irq to 5288.
+ *
+ */
+static void __devinit final_uli5288(struct pci_dev *dev)
+{
+       struct pci_controller *hose = pci_bus_to_host(dev->bus);
+       struct device_node *hosenode = hose ? hose->arch_data : NULL;
+       struct of_irq oirq;
+       int virq, pin = 2;
+       u32 laddr[3];
+
+       if (!hosenode)
+               return;
+
+       laddr[0] = (hose->first_busno << 16) | (PCI_DEVFN(31, 0) << 8);
+       laddr[1] = laddr[2] = 0;
+       of_irq_map_raw(hosenode, &pin, 1, laddr, &oirq);
+       virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
+                                    oirq.size);
+       dev->irq = virq;
+}
+
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x1575, quirk_uli1575);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5288, quirk_uli5288);
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, 0x5229, quirk_uli5229);
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, 0x5288, final_uli5288);
+#endif /* CONFIG_PCI */
+
+static void __init
+mpc86xx_hpcd_setup_arch(void)
+{
+#ifdef CONFIG_PCI
+       struct device_node *np;
+#endif
+       if (ppc_md.progress)
+               ppc_md.progress("mpc86xx_hpcd_setup_arch()", 0);
+
+#ifdef CONFIG_PCI
+       for_each_node_by_type(np, "pci") {
+               if (of_device_is_compatible(np, "fsl,mpc8610-pci")
+                   || of_device_is_compatible(np, "fsl,mpc8641-pcie")) {
+                       struct resource rsrc;
+                       of_address_to_resource(np, 0, &rsrc);
+                       if ((rsrc.start & 0xfffff) == 0xa000)
+                               fsl_add_bridge(np, 1);
+                       else
+                               fsl_add_bridge(np, 0);
+               }
+        }
+#endif
+
+       printk("MPC86xx HPCD board from Freescale Semiconductor\n");
+}
+
+/*
+ * Called very early, device-tree isn't unflattened
+ */
+static int __init mpc86xx_hpcd_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+
+       if (of_flat_dt_is_compatible(root, "fsl,MPC8610HPCD"))
+               return 1;       /* Looks good */
+
+       return 0;
+}
+
+long __init
+mpc86xx_time_init(void)
+{
+       unsigned int temp;
+
+       /* Set the time base to zero */
+       mtspr(SPRN_TBWL, 0);
+       mtspr(SPRN_TBWU, 0);
+
+       temp = mfspr(SPRN_HID0);
+       temp |= HID0_TBEN;
+       mtspr(SPRN_HID0, temp);
+       asm volatile("isync");
+
+       return 0;
+}
+
+define_machine(mpc86xx_hpcd) {
+       .name                   = "MPC86xx HPCD",
+       .probe                  = mpc86xx_hpcd_probe,
+       .setup_arch             = mpc86xx_hpcd_setup_arch,
+       .init_IRQ               = mpc86xx_hpcd_init_irq,
+       .get_irq                = mpic_get_irq,
+       .restart                = fsl_rstcr_restart,
+       .time_init              = mpc86xx_time_init,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+       .pcibios_fixup_bus      = fsl_pcibios_fixup_bus,
+};
diff --git a/arch/powerpc/platforms/86xx/mpc8641_hpcn.h b/arch/powerpc/platforms/86xx/mpc8641_hpcn.h
deleted file mode 100644 (file)
index 41e554c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * MPC8641 HPCN board definitions
- *
- * Copyright 2006 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.
- *
- * Author: Xianghua Xiao <x.xiao@freescale.com>
- */
-
-#ifndef __MPC8641_HPCN_H__
-#define __MPC8641_HPCN_H__
-
-#include <linux/init.h>
-
-#define MPC86XX_RSTCR_OFFSET   (0xe00b0)       /* Reset Control Register */
-
-#endif /* __MPC8641_HPCN_H__ */
index 47aafa76c933c01a27d66f78559483c96446dbfb..32a531aebcb78458ca1998387c29ad9441337213 100644 (file)
@@ -35,7 +35,6 @@
 #include <sysdev/fsl_soc.h>
 
 #include "mpc86xx.h"
-#include "mpc8641_hpcn.h"
 
 #undef DEBUG
 
@@ -132,25 +131,15 @@ static int mpc86xx_exclude_device(struct pci_controller *hose,
 static void __init
 mpc86xx_hpcn_setup_arch(void)
 {
+#ifdef CONFIG_PCI
        struct device_node *np;
+#endif
 
        if (ppc_md.progress)
                ppc_md.progress("mpc86xx_hpcn_setup_arch()", 0);
 
-       np = of_find_node_by_type(NULL, "cpu");
-       if (np != 0) {
-               const unsigned int *fp;
-
-               fp = of_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;) {
+       for_each_compatible_node(np, "pci", "fsl,mpc8641-pcie") {
                struct resource rsrc;
                of_address_to_resource(np, 0, &rsrc);
                if ((rsrc.start & 0xfffff) == 0x8000)
@@ -158,6 +147,7 @@ mpc86xx_hpcn_setup_arch(void)
                else
                        fsl_add_bridge(np, 0);
        }
+
        uses_fsl_uli_m1575 = 1;
        ppc_md.pci_exclude_device = mpc86xx_exclude_device;
 
@@ -205,23 +195,6 @@ static int __init mpc86xx_hpcn_probe(void)
        return 0;
 }
 
-
-void
-mpc86xx_restart(char *cmd)
-{
-       void __iomem *rstcr;
-
-       rstcr = ioremap(get_immrbase() + MPC86XX_RSTCR_OFFSET, 0x100);
-
-       local_irq_disable();
-
-       /* Assert reset request to Reset Control Register */
-       out_be32(rstcr, 0x2);
-
-       /* not reached */
-}
-
-
 long __init
 mpc86xx_time_init(void)
 {
@@ -246,7 +219,7 @@ define_machine(mpc86xx_hpcn) {
        .init_IRQ               = mpc86xx_hpcn_init_irq,
        .show_cpuinfo           = mpc86xx_hpcn_show_cpuinfo,
        .get_irq                = mpic_get_irq,
-       .restart                = mpc86xx_restart,
+       .restart                = fsl_rstcr_restart,
        .time_init              = mpc86xx_time_init,
        .calibrate_decr         = generic_calibrate_decr,
        .progress               = udbg_progress,
index 39bb8c5ebe700c30c057cf5648c3b200dcf9b05b..bd28655043a0851a74ce3c0e679fc23d39a2bc05 100644 (file)
@@ -3,6 +3,7 @@ config FADS
 
 config CPM1
        bool
+       select CPM
 
 choice
        prompt "8xx Machine Type"
@@ -25,12 +26,23 @@ config MPC86XADS
 config MPC885ADS
        bool "MPC885ADS"
        select CPM1
+       select PPC_CPM_NEW_BINDING
        help
          Freescale Semiconductor MPC885 Application Development System (ADS).
          Also known as DUET.
          The MPC885ADS is meant to serve as a platform for s/w and h/w
          development around the MPC885 processor family.
 
+config PPC_EP88XC
+       bool "Embedded Planet EP88xC (a.k.a. CWH-PPC-885XN-VE)"
+       select CPM1
+       select PPC_CPM_NEW_BINDING
+       help
+         This enables support for the Embedded Planet EP88xC board.
+
+         This board is also resold by Freescale as the QUICCStart
+         MPC885 Evaluation System and/or the CWH-PPC-885XN-VE.
+
 endchoice
 
 menu "Freescale Ethernet driver platform-specific options"
@@ -99,6 +111,22 @@ config 8xx_CPU6
 
          If in doubt, say N here.
 
+config 8xx_CPU15
+       bool "CPU15 Silicon Errata"
+       default y
+       help
+         This enables a workaround for erratum CPU15 on MPC8xx chips.
+         This bug can cause incorrect code execution under certain
+         circumstances.  This workaround adds some overhead (a TLB miss
+         every time execution crosses a page boundary), and you may wish
+         to disable it if you have worked around the bug in the compiler
+         (by not placing conditional branches or branches to LR or CTR
+         in the last word of a page, with a target of the last cache
+         line in the next page), or if you have used some other
+         workaround.
+
+         If in doubt, say Y here.
+
 choice
        prompt "Microcode patch selection"
        default NO_UCODE_PATCH
index 5e2dae3afd2f69dbfd22dd7396c534e5bb5499b1..8b7098018b591375730cb40e36ea61df2c62c3cb 100644 (file)
@@ -4,3 +4,4 @@
 obj-$(CONFIG_PPC_8xx)    += m8xx_setup.o
 obj-$(CONFIG_MPC885ADS)   += mpc885ads_setup.o
 obj-$(CONFIG_MPC86XADS)   += mpc86xads_setup.o
+obj-$(CONFIG_PPC_EP88XC)  += ep88xc.o
diff --git a/arch/powerpc/platforms/8xx/ep88xc.c b/arch/powerpc/platforms/8xx/ep88xc.c
new file mode 100644 (file)
index 0000000..c518b6c
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Platform setup for the Embedded Planet EP88xC board
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/init.h>
+#include <linux/of_platform.h>
+
+#include <asm/machdep.h>
+#include <asm/io.h>
+#include <asm/udbg.h>
+#include <asm/commproc.h>
+
+#include <sysdev/commproc.h>
+
+struct cpm_pin {
+       int port, pin, flags;
+};
+
+static struct cpm_pin ep88xc_pins[] = {
+       /* SMC1 */
+       {1, 24, CPM_PIN_INPUT}, /* RX */
+       {1, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
+
+       /* SCC2 */
+       {0, 12, CPM_PIN_INPUT}, /* TX */
+       {0, 13, CPM_PIN_INPUT}, /* RX */
+       {2, 8, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CD */
+       {2, 9, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CTS */
+       {2, 14, CPM_PIN_INPUT}, /* RTS */
+
+       /* MII1 */
+       {0, 0, CPM_PIN_INPUT},
+       {0, 1, CPM_PIN_INPUT},
+       {0, 2, CPM_PIN_INPUT},
+       {0, 3, CPM_PIN_INPUT},
+       {0, 4, CPM_PIN_OUTPUT},
+       {0, 10, CPM_PIN_OUTPUT},
+       {0, 11, CPM_PIN_OUTPUT},
+       {1, 19, CPM_PIN_INPUT},
+       {1, 31, CPM_PIN_INPUT},
+       {2, 12, CPM_PIN_INPUT},
+       {2, 13, CPM_PIN_INPUT},
+       {3, 8, CPM_PIN_INPUT},
+       {4, 30, CPM_PIN_OUTPUT},
+       {4, 31, CPM_PIN_OUTPUT},
+
+       /* MII2 */
+       {4, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {4, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {4, 16, CPM_PIN_OUTPUT},
+       {4, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {4, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {4, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {4, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {4, 21, CPM_PIN_OUTPUT},
+       {4, 22, CPM_PIN_OUTPUT},
+       {4, 23, CPM_PIN_OUTPUT},
+       {4, 24, CPM_PIN_OUTPUT},
+       {4, 25, CPM_PIN_OUTPUT},
+       {4, 26, CPM_PIN_OUTPUT},
+       {4, 27, CPM_PIN_OUTPUT},
+       {4, 28, CPM_PIN_OUTPUT},
+       {4, 29, CPM_PIN_OUTPUT},
+
+       /* USB */
+       {0, 6, CPM_PIN_INPUT},  /* CLK2 */
+       {0, 14, CPM_PIN_INPUT}, /* USBOE */
+       {0, 15, CPM_PIN_INPUT}, /* USBRXD */
+       {2, 6, CPM_PIN_OUTPUT}, /* USBTXN */
+       {2, 7, CPM_PIN_OUTPUT}, /* USBTXP */
+       {2, 10, CPM_PIN_INPUT}, /* USBRXN */
+       {2, 11, CPM_PIN_INPUT}, /* USBRXP */
+
+       /* Misc */
+       {1, 26, CPM_PIN_INPUT}, /* BRGO2 */
+       {1, 27, CPM_PIN_INPUT}, /* BRGO1 */
+};
+
+static void __init init_ioports(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ep88xc_pins); i++) {
+               struct cpm_pin *pin = &ep88xc_pins[i];
+               cpm1_set_pin(pin->port, pin->pin, pin->flags);
+       }
+
+       cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
+       cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_TX); /* USB */
+       cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX);
+       cpm1_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_TX);
+       cpm1_clk_setup(CPM_CLK_SCC2, CPM_BRG2, CPM_CLK_RX);
+}
+
+static u8 __iomem *ep88xc_bcsr;
+
+#define BCSR7_SCC2_ENABLE 0x10
+
+#define BCSR8_PHY1_ENABLE 0x80
+#define BCSR8_PHY1_POWER  0x40
+#define BCSR8_PHY2_ENABLE 0x20
+#define BCSR8_PHY2_POWER  0x10
+
+#define BCSR9_USB_ENABLE  0x80
+#define BCSR9_USB_POWER   0x40
+#define BCSR9_USB_HOST    0x20
+#define BCSR9_USB_FULL_SPEED_TARGET 0x10
+
+static void __init ep88xc_setup_arch(void)
+{
+       struct device_node *np;
+
+       cpm_reset();
+       init_ioports();
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,ep88xc-bcsr");
+       if (!np) {
+               printk(KERN_CRIT "Could not find fsl,ep88xc-bcsr node\n");
+               return;
+       }
+
+       ep88xc_bcsr = of_iomap(np, 0);
+       of_node_put(np);
+
+       if (!ep88xc_bcsr) {
+               printk(KERN_CRIT "Could not remap BCSR\n");
+               return;
+       }
+
+       setbits8(&ep88xc_bcsr[7], BCSR7_SCC2_ENABLE);
+       setbits8(&ep88xc_bcsr[8], BCSR8_PHY1_ENABLE | BCSR8_PHY1_POWER |
+                                 BCSR8_PHY2_ENABLE | BCSR8_PHY2_POWER);
+}
+
+static int __init ep88xc_probe(void)
+{
+       unsigned long root = of_get_flat_dt_root();
+       return of_flat_dt_is_compatible(root, "fsl,ep88xc");
+}
+
+static struct of_device_id __initdata of_bus_ids[] = {
+       { .name = "soc", },
+       { .name = "cpm", },
+       { .name = "localbus", },
+       {},
+};
+
+static int __init declare_of_platform_devices(void)
+{
+       /* Publish the QE devices */
+       if (machine_is(ep88xc))
+               of_platform_bus_probe(NULL, of_bus_ids, NULL);
+
+       return 0;
+}
+device_initcall(declare_of_platform_devices);
+
+define_machine(ep88xc) {
+       .name = "Embedded Planet EP88xC",
+       .probe = ep88xc_probe,
+       .setup_arch = ep88xc_setup_arch,
+       .init_IRQ = m8xx_pic_init,
+       .get_irq        = mpc8xx_get_irq,
+       .restart = mpc8xx_restart,
+       .calibrate_decr = mpc8xx_calibrate_decr,
+       .set_rtc_time = mpc8xx_set_rtc_time,
+       .get_rtc_time = mpc8xx_get_rtc_time,
+       .progress = udbg_progress,
+};
index f1693550c70c1cf7bef1672b3a1ed86c4195ba3d..d35eda80e9e62376ae882636cf0159ec19bce8a1 100644 (file)
  * bootup setup stuff..
  */
 
-#include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
 #include <linux/slab.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/tty.h>
-#include <linux/major.h>
 #include <linux/interrupt.h>
-#include <linux/reboot.h>
 #include <linux/init.h>
-#include <linux/initrd.h>
-#include <linux/ioport.h>
-#include <linux/bootmem.h>
-#include <linux/seq_file.h>
-#include <linux/root_dev.h>
 #include <linux/time.h>
 #include <linux/rtc.h>
-#include <linux/fsl_devices.h>
 
-#include <asm/mmu.h>
-#include <asm/reg.h>
-#include <asm/residual.h>
 #include <asm/io.h>
-#include <asm/pgtable.h>
 #include <asm/mpc8xx.h>
 #include <asm/8xx_immap.h>
-#include <asm/machdep.h>
-#include <asm/bootinfo.h>
-#include <asm/time.h>
 #include <asm/prom.h>
 #include <asm/fs_pd.h>
 #include <mm/mmu_decl.h>
 
-#include "sysdev/mpc8xx_pic.h"
+#include <sysdev/mpc8xx_pic.h>
+#include <sysdev/commproc.h>
 
 #ifdef CONFIG_PCMCIA_M8XX
 struct mpc8xx_pcmcia_ops m8xx_pcmcia_ops;
 #endif
 
 void m8xx_calibrate_decr(void);
-extern void m8xx_wdt_handler_install(bd_t *bp);
 extern int cpm_pic_init(void);
 extern int cpm_get_irq(void);
 
 /* A place holder for time base interrupts, if they are ever enabled. */
-irqreturn_t timebase_interrupt(int irq, void * dev)
+static irqreturn_t timebase_interrupt(int irq, void *dev)
 {
        printk ("timebase_interrupt()\n");
 
@@ -77,7 +53,7 @@ static struct irqaction tbint_irqaction = {
 void __init __attribute__ ((weak))
 init_internal_rtc(void)
 {
-       sit8xx_t *sys_tmr = (sit8xx_t *) immr_map(im_sit);
+       sit8xx_t __iomem *sys_tmr = immr_map(im_sit);
 
        /* Disable the RTC one second and alarm interrupts. */
        clrbits16(&sys_tmr->sit_rtcsc, (RTCSC_SIE | RTCSC_ALE));
@@ -89,24 +65,24 @@ init_internal_rtc(void)
 
 static int __init get_freq(char *name, unsigned long *val)
 {
-        struct device_node *cpu;
-        const unsigned int *fp;
-        int found = 0;
+       struct device_node *cpu;
+       const unsigned int *fp;
+       int found = 0;
 
-        /* The cpu node should have timebase and clock frequency properties */
-        cpu = of_find_node_by_type(NULL, "cpu");
+       /* The cpu node should have timebase and clock frequency properties */
+       cpu = of_find_node_by_type(NULL, "cpu");
 
-        if (cpu) {
-                fp = of_get_property(cpu, name, NULL);
-                if (fp) {
-                        found = 1;
-                        *val = *fp;
-                }
+       if (cpu) {
+               fp = of_get_property(cpu, name, NULL);
+               if (fp) {
+                       found = 1;
+                       *val = *fp;
+               }
 
-                of_node_put(cpu);
-        }
+               of_node_put(cpu);
+       }
 
-        return found;
+       return found;
 }
 
 /* The decrementer counts at the system (internal) clock frequency divided by
@@ -116,13 +92,13 @@ static int __init get_freq(char *name, unsigned long *val)
 void __init mpc8xx_calibrate_decr(void)
 {
        struct device_node *cpu;
-       cark8xx_t *clk_r1;
-       car8xx_t *clk_r2;
-       sitk8xx_t *sys_tmr1;
-       sit8xx_t *sys_tmr2;
+       cark8xx_t __iomem *clk_r1;
+       car8xx_t __iomem *clk_r2;
+       sitk8xx_t __iomem *sys_tmr1;
+       sit8xx_t __iomem *sys_tmr2;
        int irq, virq;
 
-        clk_r1 = (cark8xx_t *) immr_map(im_clkrstk);
+       clk_r1 = immr_map(im_clkrstk);
 
        /* Unlock the SCCR. */
        out_be32(&clk_r1->cark_sccrk, ~KAPWR_KEY);
@@ -130,24 +106,24 @@ void __init mpc8xx_calibrate_decr(void)
        immr_unmap(clk_r1);
 
        /* Force all 8xx processors to use divide by 16 processor clock. */
-        clk_r2 = (car8xx_t *) immr_map(im_clkrst);
+       clk_r2 = immr_map(im_clkrst);
        setbits32(&clk_r2->car_sccr, 0x02000000);
        immr_unmap(clk_r2);
 
        /* Processor frequency is MHz.
         */
-        ppc_tb_freq = 50000000;
-        if (!get_freq("bus-frequency", &ppc_tb_freq)) {
-                printk(KERN_ERR "WARNING: Estimating decrementer frequency "
-                                "(not found)\n");
-        }
-        ppc_tb_freq /= 16;
-        ppc_proc_freq = 50000000;
-        if (!get_freq("clock-frequency", &ppc_proc_freq))
-                printk(KERN_ERR "WARNING: Estimating processor frequency"
-                                "(not found)\n");
-
-        printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
+       ppc_tb_freq = 50000000;
+       if (!get_freq("bus-frequency", &ppc_tb_freq)) {
+               printk(KERN_ERR "WARNING: Estimating decrementer frequency "
+                               "(not found)\n");
+       }
+       ppc_tb_freq /= 16;
+       ppc_proc_freq = 50000000;
+       if (!get_freq("clock-frequency", &ppc_proc_freq))
+               printk(KERN_ERR "WARNING: Estimating processor frequency"
+                               "(not found)\n");
+
+       printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
 
        /* Perform some more timer/timebase initialization.  This used
         * to be done elsewhere, but other changes caused it to get
@@ -164,7 +140,7 @@ void __init mpc8xx_calibrate_decr(void)
         * we guarantee the registers are locked, then we unlock them
         * for our use.
         */
-        sys_tmr1 = (sitk8xx_t *) immr_map(im_sitk);
+       sys_tmr1 = immr_map(im_sitk);
        out_be32(&sys_tmr1->sitk_tbscrk, ~KAPWR_KEY);
        out_be32(&sys_tmr1->sitk_rtcsck, ~KAPWR_KEY);
        out_be32(&sys_tmr1->sitk_tbk, ~KAPWR_KEY);
@@ -180,24 +156,17 @@ void __init mpc8xx_calibrate_decr(void)
         * we have to enable the timebase).  The decrementer interrupt
         * is wired into the vector table, nothing to do here for that.
         */
-        cpu = of_find_node_by_type(NULL, "cpu");
-        virq= irq_of_parse_and_map(cpu, 0);
+       cpu = of_find_node_by_type(NULL, "cpu");
+       virq= irq_of_parse_and_map(cpu, 0);
        irq = irq_map[virq].hwirq;
 
-       sys_tmr2 = (sit8xx_t *) immr_map(im_sit);
+       sys_tmr2 = immr_map(im_sit);
        out_be16(&sys_tmr2->sit_tbscr, ((1 << (7 - (irq/2))) << 8) |
                                        (TBSCR_TBF | TBSCR_TBE));
        immr_unmap(sys_tmr2);
 
        if (setup_irq(virq, &tbint_irqaction))
                panic("Could not allocate timer IRQ!");
-
-#ifdef CONFIG_8xx_WDT
-       /* Install watchdog timer handler early because it might be
-        * already enabled by the bootloader
-        */
-       m8xx_wdt_handler_install(binfo);
-#endif
 }
 
 /* The RTC on the MPC8xx is an internal register.
@@ -207,14 +176,14 @@ void __init mpc8xx_calibrate_decr(void)
 
 int mpc8xx_set_rtc_time(struct rtc_time *tm)
 {
-       sitk8xx_t *sys_tmr1;
-       sit8xx_t *sys_tmr2;
+       sitk8xx_t __iomem *sys_tmr1;
+       sit8xx_t __iomem *sys_tmr2;
        int time;
 
-        sys_tmr1 = (sitk8xx_t *) immr_map(im_sitk);
-       sys_tmr2 = (sit8xx_t *) immr_map(im_sit);
+       sys_tmr1 = immr_map(im_sitk);
+       sys_tmr2 = immr_map(im_sit);
        time = mktime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
-                      tm->tm_hour, tm->tm_min, tm->tm_sec);
+                     tm->tm_hour, tm->tm_min, tm->tm_sec);
 
        out_be32(&sys_tmr1->sitk_rtck, KAPWR_KEY);
        out_be32(&sys_tmr2->sit_rtc, time);
@@ -228,21 +197,20 @@ int mpc8xx_set_rtc_time(struct rtc_time *tm)
 void mpc8xx_get_rtc_time(struct rtc_time *tm)
 {
        unsigned long data;
-       sit8xx_t *sys_tmr = (sit8xx_t *) immr_map(im_sit);
+       sit8xx_t __iomem *sys_tmr = immr_map(im_sit);
 
        /* Get time from the RTC. */
        data = in_be32(&sys_tmr->sit_rtc);
        to_tm(data, tm);
-        tm->tm_year -= 1900;
-        tm->tm_mon -= 1;
+       tm->tm_year -= 1900;
+       tm->tm_mon -= 1;
        immr_unmap(sys_tmr);
        return;
 }
 
 void mpc8xx_restart(char *cmd)
 {
-       __volatile__ unsigned char dummy;
-       car8xx_t * clk_r = (car8xx_t *) immr_map(im_clkrst);
+       car8xx_t __iomem *clk_r = immr_map(im_clkrst);
 
 
        local_irq_disable();
@@ -252,26 +220,8 @@ void mpc8xx_restart(char *cmd)
        */
        mtmsr(mfmsr() & ~0x1000);
 
-       dummy = in_8(&clk_r->res[0]);
-       printk("Restart failed\n");
-       while(1);
-}
-
-void mpc8xx_show_cpuinfo(struct seq_file *m)
-{
-       struct device_node *root;
-       uint memsize = total_memory;
-       const char *model = "";
-
-       seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n");
-
-       root = of_find_node_by_path("/");
-       if (root)
-               model = of_get_property(root, "model", NULL);
-       seq_printf(m, "Machine\t\t: %s\n", model);
-       of_node_put(root);
-
-       seq_printf(m, "Memory\t\t: %d MB\n", memsize / (1024 * 1024));
+       in_8(&clk_r->res[0]);
+       panic("Restart failed\n");
 }
 
 static void cpm_cascade(unsigned int irq, struct irq_desc *desc)
@@ -298,7 +248,7 @@ void __init m8xx_pic_init(void)
        int irq;
 
        if (mpc8xx_pic_init()) {
-                printk(KERN_ERR "Failed interrupt 8xx controller  initialization\n");
+               printk(KERN_ERR "Failed interrupt 8xx controller  initialization\n");
                return;
        }
 
index 59bad2f9ae51a22861157b8da92ea0f5a2fb0822..cffa194ccf1ffe014812bb026db3d2306f6f0123 100644 (file)
@@ -15,7 +15,6 @@
 #ifndef __ASM_MPC86XADS_H__
 #define __ASM_MPC86XADS_H__
 
-#include <asm/ppcboot.h>
 #include <sysdev/fsl_soc.h>
 
 /* U-Boot maps BCSR to 0xff080000 */
@@ -30,9 +29,6 @@
 #define CFG_PHYDEV_ADDR                ((uint)0xff0a0000)
 #define BCSR5                  ((uint)(CFG_PHYDEV_ADDR + 0x300))
 
-#define IMAP_ADDR              (get_immrbase())
-#define IMAP_SIZE              ((uint)(64 * 1024))
-
 #define MPC8xx_CPM_OFFSET      (0x9c0)
 #define CPM_MAP_ADDR           (get_immrbase() + MPC8xx_CPM_OFFSET)
 #define CPM_IRQ_OFFSET         16     // for compability with cpm_uart driver
index cf0e7bc8c2e77350749bc85e75480c83e743b5a5..49012835f453575619686b14b6706b1e2419b029 100644 (file)
 #include <asm/processor.h>
 #include <asm/system.h>
 #include <asm/time.h>
-#include <asm/ppcboot.h>
 #include <asm/mpc8xx.h>
 #include <asm/8xx_immap.h>
 #include <asm/commproc.h>
 #include <asm/fs_pd.h>
 #include <asm/prom.h>
 
-extern void cpm_reset(void);
-extern void mpc8xx_show_cpuinfo(struct seq_file*);
-extern void mpc8xx_restart(char *cmd);
-extern void mpc8xx_calibrate_decr(void);
-extern int mpc8xx_set_rtc_time(struct rtc_time *tm);
-extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
-extern void m8xx_pic_init(void);
-extern unsigned int mpc8xx_get_irq(void);
+#include <sysdev/commproc.h>
 
 static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi);
 static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi);
@@ -254,20 +246,6 @@ int platform_device_skip(const char *model, int id)
 
 static void __init mpc86xads_setup_arch(void)
 {
-       struct device_node *cpu;
-
-       cpu = of_find_node_by_type(NULL, "cpu");
-       if (cpu != 0) {
-               const unsigned int *fp;
-
-               fp = of_get_property(cpu, "clock-frequency", NULL);
-               if (fp != 0)
-                       loops_per_jiffy = *fp / HZ;
-               else
-                       loops_per_jiffy = 50000000 / HZ;
-               of_node_put(cpu);
-       }
-
        cpm_reset();
 
        mpc86xads_board_setup();
@@ -292,7 +270,6 @@ define_machine(mpc86x_ads) {
        .probe                  = mpc86xads_probe,
        .setup_arch             = mpc86xads_setup_arch,
        .init_IRQ               = m8xx_pic_init,
-       .show_cpuinfo           = mpc8xx_show_cpuinfo,
        .get_irq                = mpc8xx_get_irq,
        .restart                = mpc8xx_restart,
        .calibrate_decr         = mpc8xx_calibrate_decr,
index 7c31aec284c26cb575bc2a455f5007a1e37de7f7..a5076668bad63b4872ffe7f0b405e56a1279d260 100644 (file)
 #ifndef __ASM_MPC885ADS_H__
 #define __ASM_MPC885ADS_H__
 
-#include <asm/ppcboot.h>
 #include <sysdev/fsl_soc.h>
 
-/* U-Boot maps BCSR to 0xff080000 */
-#define BCSR_ADDR              ((uint)0xff080000)
-#define BCSR_SIZE              ((uint)32)
-#define BCSR0                  ((uint)(BCSR_ADDR + 0x00))
-#define BCSR1                  ((uint)(BCSR_ADDR + 0x04))
-#define BCSR2                  ((uint)(BCSR_ADDR + 0x08))
-#define BCSR3                  ((uint)(BCSR_ADDR + 0x0c))
-#define BCSR4                  ((uint)(BCSR_ADDR + 0x10))
-
-#define CFG_PHYDEV_ADDR                ((uint)0xff0a0000)
-#define BCSR5                  ((uint)(CFG_PHYDEV_ADDR + 0x300))
-
-#define IMAP_ADDR              (get_immrbase())
-#define IMAP_SIZE              ((uint)(64 * 1024))
-
 #define MPC8xx_CPM_OFFSET      (0x9c0)
 #define CPM_MAP_ADDR           (get_immrbase() + MPC8xx_CPM_OFFSET)
 #define CPM_IRQ_OFFSET         16     // for compability with cpm_uart driver
 
-#define PCMCIA_MEM_ADDR                ((uint)0xff020000)
-#define PCMCIA_MEM_SIZE                ((uint)(64 * 1024))
-
 /* Bits of interest in the BCSRs.
  */
 #define BCSR1_ETHEN            ((uint)0x20000000)
 #define BCSR5_MII1_EN          0x02
 #define BCSR5_MII1_RST         0x01
 
-/* Interrupt level assignments */
-#define PHY_INTERRUPT  SIU_IRQ7        /* PHY link change interrupt */
-#define SIU_INT_FEC1   SIU_LEVEL1      /* FEC1 interrupt */
-#define SIU_INT_FEC2   SIU_LEVEL3      /* FEC2 interrupt */
-#define FEC_INTERRUPT  SIU_INT_FEC1    /* FEC interrupt */
-
-/* We don't use the 8259 */
-#define NR_8259_INTS   0
-
-/* CPM Ethernet through SCC3 */
-#define PA_ENET_RXD    ((ushort)0x0040)
-#define PA_ENET_TXD    ((ushort)0x0080)
-#define PE_ENET_TCLK   ((uint)0x00004000)
-#define PE_ENET_RCLK   ((uint)0x00008000)
-#define PE_ENET_TENA   ((uint)0x00000010)
-#define PC_ENET_CLSN   ((ushort)0x0400)
-#define PC_ENET_RENA   ((ushort)0x0800)
-
-/* Control bits in the SICR to route TCLK (CLK5) and RCLK (CLK6) to
- * SCC3.  Also, make sure GR3 (bit 8) and SC3 (bit 9) are zero */
-#define SICR_ENET_MASK ((uint)0x00ff0000)
-#define SICR_ENET_CLKRT        ((uint)0x002c0000)
-
 #endif /* __ASM_MPC885ADS_H__ */
 #endif /* __KERNEL__ */
index 5a808d611ae3884a5e4160ffee4260cde4e3ef16..2cf1b6a75173a2955ba921dab1f955cac18c43b0 100644 (file)
@@ -1,11 +1,13 @@
-/*arch/powerpc/platforms/8xx/mpc885ads_setup.c
- *
+/*
  * Platform setup for the Freescale mpc885ads board
  *
  * Vitaly Bordug <vbordug@ru.mvista.com>
  *
  * Copyright 2005 MontaVista Software Inc.
  *
+ * Heavily modified by Scott Wood <scottwood@freescale.com>
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ *
  * This file is licensed under the terms of the GNU General Public License
  * version 2. This program is licensed "as is" without any warranty of any
  * kind, whether express or implied.
 #include <linux/ioport.h>
 #include <linux/device.h>
 #include <linux/delay.h>
-#include <linux/root_dev.h>
 
 #include <linux/fs_enet_pd.h>
 #include <linux/fs_uart_pd.h>
 #include <linux/fsl_devices.h>
 #include <linux/mii.h>
+#include <linux/of_platform.h>
 
 #include <asm/delay.h>
 #include <asm/io.h>
 #include <asm/processor.h>
 #include <asm/system.h>
 #include <asm/time.h>
-#include <asm/ppcboot.h>
 #include <asm/mpc8xx.h>
 #include <asm/8xx_immap.h>
 #include <asm/commproc.h>
 #include <asm/fs_pd.h>
-#include <asm/prom.h>
+#include <asm/udbg.h>
 
-extern void cpm_reset(void);
-extern void mpc8xx_show_cpuinfo(struct seq_file *);
-extern void mpc8xx_restart(char *cmd);
-extern void mpc8xx_calibrate_decr(void);
-extern int mpc8xx_set_rtc_time(struct rtc_time *tm);
-extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
-extern void m8xx_pic_init(void);
-extern unsigned int mpc8xx_get_irq(void);
+#include <sysdev/commproc.h>
 
-static void init_smc1_uart_ioports(struct fs_uart_platform_info *fpi);
-static void init_smc2_uart_ioports(struct fs_uart_platform_info *fpi);
-static void init_scc3_ioports(struct fs_platform_info *ptr);
+static u32 __iomem *bcsr, *bcsr5;
 
 #ifdef CONFIG_PCMCIA_M8XX
 static void pcmcia_hw_setup(int slot, int enable)
 {
-       unsigned *bcsr_io;
-
-       bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
        if (enable)
-               clrbits32(bcsr_io, BCSR1_PCCEN);
+               clrbits32(&bcsr[1], BCSR1_PCCEN);
        else
-               setbits32(bcsr_io, BCSR1_PCCEN);
-
-       iounmap(bcsr_io);
+               setbits32(&bcsr[1], BCSR1_PCCEN);
 }
 
 static int pcmcia_set_voltage(int slot, int vcc, int vpp)
 {
        u32 reg = 0;
-       unsigned *bcsr_io;
-
-       bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
 
        switch (vcc) {
        case 0:
@@ -106,344 +90,196 @@ static int pcmcia_set_voltage(int slot, int vcc, int vpp)
        }
 
        /* first, turn off all power */
-       clrbits32(bcsr_io, 0x00610000);
+       clrbits32(&bcsr[1], 0x00610000);
 
        /* enable new powersettings */
-       setbits32(bcsr_io, reg);
+       setbits32(&bcsr[1], reg);
 
-       iounmap(bcsr_io);
        return 0;
 }
 #endif
 
-void __init mpc885ads_board_setup(void)
-{
-       cpm8xx_t *cp;
-       unsigned int *bcsr_io;
-       u8 tmpval8;
-
-#ifdef CONFIG_FS_ENET
-       iop8xx_t *io_port;
-#endif
-
-       bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
-       cp = (cpm8xx_t *) immr_map(im_cpm);
-
-       if (bcsr_io == NULL) {
-               printk(KERN_CRIT "Could not remap BCSR\n");
-               return;
-       }
-#ifdef CONFIG_SERIAL_CPM_SMC1
-       clrbits32(bcsr_io, BCSR1_RS232EN_1);
-       clrbits32(&cp->cp_simode, 0xe0000000 >> 17);    /* brg1 */
-       tmpval8 = in_8(&(cp->cp_smc[0].smc_smcm)) | (SMCM_RX | SMCM_TX);
-       out_8(&(cp->cp_smc[0].smc_smcm), tmpval8);
-       clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);     /* brg1 */
-#else
-       setbits32(bcsr_io, BCSR1_RS232EN_1);
-       out_be16(&cp->cp_smc[0].smc_smcmr, 0);
-       out_8(&cp->cp_smc[0].smc_smce, 0);
-#endif
-
-#ifdef CONFIG_SERIAL_CPM_SMC2
-       clrbits32(bcsr_io, BCSR1_RS232EN_2);
-       clrbits32(&cp->cp_simode, 0xe0000000 >> 1);
-       setbits32(&cp->cp_simode, 0x20000000 >> 1);     /* brg2 */
-       tmpval8 = in_8(&(cp->cp_smc[1].smc_smcm)) | (SMCM_RX | SMCM_TX);
-       out_8(&(cp->cp_smc[1].smc_smcm), tmpval8);
-       clrbits16(&cp->cp_smc[1].smc_smcmr, SMCMR_REN | SMCMR_TEN);
+struct cpm_pin {
+       int port, pin, flags;
+};
 
-       init_smc2_uart_ioports(0);
-#else
-       setbits32(bcsr_io, BCSR1_RS232EN_2);
-       out_be16(&cp->cp_smc[1].smc_smcmr, 0);
-       out_8(&cp->cp_smc[1].smc_smce, 0);
-#endif
-       immr_unmap(cp);
-       iounmap(bcsr_io);
-
-#ifdef CONFIG_FS_ENET
-       /* use MDC for MII (common) */
-       io_port = (iop8xx_t *) immr_map(im_ioport);
-       setbits16(&io_port->iop_pdpar, 0x0080);
-       clrbits16(&io_port->iop_pddir, 0x0080);
-
-       bcsr_io = ioremap(BCSR5, sizeof(unsigned long));
-       clrbits32(bcsr_io, BCSR5_MII1_EN);
-       clrbits32(bcsr_io, BCSR5_MII1_RST);
-#ifndef CONFIG_FC_ENET_HAS_SCC
-       clrbits32(bcsr_io, BCSR5_MII2_EN);
-       clrbits32(bcsr_io, BCSR5_MII2_RST);
+static struct cpm_pin mpc885ads_pins[] = {
+       /* SMC1 */
+       {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
+       {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
 
+       /* SMC2 */
+#ifndef CONFIG_MPC8xx_SECOND_ETH_FEC2
+       {CPM_PORTE, 21, CPM_PIN_INPUT}, /* RX */
+       {CPM_PORTE, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
 #endif
-       iounmap(bcsr_io);
-       immr_unmap(io_port);
 
+       /* SCC3 */
+       {CPM_PORTA, 9, CPM_PIN_INPUT}, /* RX */
+       {CPM_PORTA, 8, CPM_PIN_INPUT}, /* TX */
+       {CPM_PORTC, 4, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */
+       {CPM_PORTC, 5, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */
+       {CPM_PORTE, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
+       {CPM_PORTE, 17, CPM_PIN_INPUT}, /* CLK5 */
+       {CPM_PORTE, 16, CPM_PIN_INPUT}, /* CLK6 */
+
+       /* MII1 */
+       {CPM_PORTA, 0, CPM_PIN_INPUT},
+       {CPM_PORTA, 1, CPM_PIN_INPUT},
+       {CPM_PORTA, 2, CPM_PIN_INPUT},
+       {CPM_PORTA, 3, CPM_PIN_INPUT},
+       {CPM_PORTA, 4, CPM_PIN_OUTPUT},
+       {CPM_PORTA, 10, CPM_PIN_OUTPUT},
+       {CPM_PORTA, 11, CPM_PIN_OUTPUT},
+       {CPM_PORTB, 19, CPM_PIN_INPUT},
+       {CPM_PORTB, 31, CPM_PIN_INPUT},
+       {CPM_PORTC, 12, CPM_PIN_INPUT},
+       {CPM_PORTC, 13, CPM_PIN_INPUT},
+       {CPM_PORTE, 30, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 31, CPM_PIN_OUTPUT},
+
+       /* MII2 */
+#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2
+       {CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {CPM_PORTE, 16, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
+       {CPM_PORTE, 21, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 22, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 23, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 24, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 25, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 26, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 27, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 28, CPM_PIN_OUTPUT},
+       {CPM_PORTE, 29, CPM_PIN_OUTPUT},
 #endif
+};
 
-#ifdef CONFIG_PCMCIA_M8XX
-       /*Set up board specific hook-ups */
-       m8xx_pcmcia_ops.hw_ctrl = pcmcia_hw_setup;
-       m8xx_pcmcia_ops.voltage_set = pcmcia_set_voltage;
-#endif
-}
-
-static void init_fec1_ioports(struct fs_platform_info *ptr)
+static void __init init_ioports(void)
 {
-       cpm8xx_t *cp = (cpm8xx_t *) immr_map(im_cpm);
-       iop8xx_t *io_port = (iop8xx_t *) immr_map(im_ioport);
-
-       /* configure FEC1 pins  */
-       setbits16(&io_port->iop_papar, 0xf830);
-       setbits16(&io_port->iop_padir, 0x0830);
-       clrbits16(&io_port->iop_padir, 0xf000);
+       int i;
 
-       setbits32(&cp->cp_pbpar, 0x00001001);
-       clrbits32(&cp->cp_pbdir, 0x00001001);
-
-       setbits16(&io_port->iop_pcpar, 0x000c);
-       clrbits16(&io_port->iop_pcdir, 0x000c);
+       for (i = 0; i < ARRAY_SIZE(mpc885ads_pins); i++) {
+               struct cpm_pin *pin = &mpc885ads_pins[i];
+               cpm1_set_pin(pin->port, pin->pin, pin->flags);
+       }
 
-       setbits32(&cp->cp_pepar, 0x00000003);
-       setbits32(&cp->cp_pedir, 0x00000003);
-       clrbits32(&cp->cp_peso, 0x00000003);
-       clrbits32(&cp->cp_cptr, 0x00000100);
+       cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
+       cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);
+       cpm1_clk_setup(CPM_CLK_SCC3, CPM_CLK5, CPM_CLK_TX);
+       cpm1_clk_setup(CPM_CLK_SCC3, CPM_CLK6, CPM_CLK_RX);
 
-       immr_unmap(io_port);
-       immr_unmap(cp);
+       /* Set FEC1 and FEC2 to MII mode */
+       clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
 }
 
-static void init_fec2_ioports(struct fs_platform_info *ptr)
+static void __init mpc885ads_setup_arch(void)
 {
-       cpm8xx_t *cp = (cpm8xx_t *) immr_map(im_cpm);
-       iop8xx_t *io_port = (iop8xx_t *) immr_map(im_ioport);
-
-       /* configure FEC2 pins */
-       setbits32(&cp->cp_pepar, 0x0003fffc);
-       setbits32(&cp->cp_pedir, 0x0003fffc);
-       clrbits32(&cp->cp_peso, 0x000087fc);
-       setbits32(&cp->cp_peso, 0x00037800);
-       clrbits32(&cp->cp_cptr, 0x00000080);
-
-       immr_unmap(io_port);
-       immr_unmap(cp);
-}
+       struct device_node *np;
 
-void init_fec_ioports(struct fs_platform_info *fpi)
-{
-       int fec_no = fs_get_fec_index(fpi->fs_no);
+       cpm_reset();
+       init_ioports();
 
-       switch (fec_no) {
-       case 0:
-               init_fec1_ioports(fpi);
-               break;
-       case 1:
-               init_fec2_ioports(fpi);
-               break;
-       default:
-               printk(KERN_ERR "init_fec_ioports: invalid FEC number\n");
+       np = of_find_compatible_node(NULL, NULL, "fsl,mpc885ads-bcsr");
+       if (!np) {
+               printk(KERN_CRIT "Could not find fsl,mpc885ads-bcsr node\n");
                return;
        }
-}
-
-static void init_scc3_ioports(struct fs_platform_info *fpi)
-{
-       unsigned *bcsr_io;
-       iop8xx_t *io_port;
-       cpm8xx_t *cp;
 
-       bcsr_io = ioremap(BCSR_ADDR, BCSR_SIZE);
-       io_port = (iop8xx_t *) immr_map(im_ioport);
-       cp = (cpm8xx_t *) immr_map(im_cpm);
+       bcsr = of_iomap(np, 0);
+       bcsr5 = of_iomap(np, 1);
+       of_node_put(np);
 
-       if (bcsr_io == NULL) {
+       if (!bcsr || !bcsr5) {
                printk(KERN_CRIT "Could not remap BCSR\n");
                return;
        }
 
-       /* Enable the PHY.
-        */
-       clrbits32(bcsr_io + 4, BCSR4_ETH10_RST);
-       udelay(1000);
-       setbits32(bcsr_io + 4, BCSR4_ETH10_RST);
-       /* Configure port A pins for Txd and Rxd.
-        */
-       setbits16(&io_port->iop_papar, PA_ENET_RXD | PA_ENET_TXD);
-       clrbits16(&io_port->iop_padir, PA_ENET_RXD | PA_ENET_TXD);
+       clrbits32(&bcsr[1], BCSR1_RS232EN_1);
+#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2
+       setbits32(&bcsr[1], BCSR1_RS232EN_2);
+#else
+       clrbits32(&bcsr[1], BCSR1_RS232EN_2);
+#endif
 
-       /* Configure port C pins to enable CLSN and RENA.
-        */
-       clrbits16(&io_port->iop_pcpar, PC_ENET_CLSN | PC_ENET_RENA);
-       clrbits16(&io_port->iop_pcdir, PC_ENET_CLSN | PC_ENET_RENA);
-       setbits16(&io_port->iop_pcso, PC_ENET_CLSN | PC_ENET_RENA);
+       clrbits32(bcsr5, BCSR5_MII1_EN);
+       setbits32(bcsr5, BCSR5_MII1_RST);
+       udelay(1000);
+       clrbits32(bcsr5, BCSR5_MII1_RST);
 
-       /* Configure port E for TCLK and RCLK.
-        */
-       setbits32(&cp->cp_pepar, PE_ENET_TCLK | PE_ENET_RCLK);
-       clrbits32(&cp->cp_pepar, PE_ENET_TENA);
-       clrbits32(&cp->cp_pedir, PE_ENET_TCLK | PE_ENET_RCLK | PE_ENET_TENA);
-       clrbits32(&cp->cp_peso, PE_ENET_TCLK | PE_ENET_RCLK);
-       setbits32(&cp->cp_peso, PE_ENET_TENA);
-
-       /* Configure Serial Interface clock routing.
-        * First, clear all SCC bits to zero, then set the ones we want.
-        */
-       clrbits32(&cp->cp_sicr, SICR_ENET_MASK);
-       setbits32(&cp->cp_sicr, SICR_ENET_CLKRT);
+#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2
+       clrbits32(bcsr5, BCSR5_MII2_EN);
+       setbits32(bcsr5, BCSR5_MII2_RST);
+       udelay(1000);
+       clrbits32(bcsr5, BCSR5_MII2_RST);
+#else
+       setbits32(bcsr5, BCSR5_MII2_EN);
+#endif
 
-       /* Disable Rx and Tx. SMC1 sshould be stopped if SCC3 eternet are used.
-        */
-       clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);
-       /* On the MPC885ADS SCC ethernet PHY is initialized in the full duplex mode
-        * by H/W setting after reset. SCC ethernet controller support only half duplex.
-        * This discrepancy of modes causes a lot of carrier lost errors.
-        */
+#ifdef CONFIG_MPC8xx_SECOND_ETH_SCC3
+       clrbits32(&bcsr[4], BCSR4_ETH10_RST);
+       udelay(1000);
+       setbits32(&bcsr[4], BCSR4_ETH10_RST);
 
-       /* In the original SCC enet driver the following code is placed at
-          the end of the initialization */
-       setbits32(&cp->cp_pepar, PE_ENET_TENA);
-       clrbits32(&cp->cp_pedir, PE_ENET_TENA);
-       setbits32(&cp->cp_peso, PE_ENET_TENA);
+       setbits32(&bcsr[1], BCSR1_ETHEN);
 
-       setbits32(bcsr_io + 4, BCSR1_ETHEN);
-       iounmap(bcsr_io);
-       immr_unmap(io_port);
-       immr_unmap(cp);
-}
+       np = of_find_node_by_path("/soc@ff000000/cpm@9c0/serial@a80");
+#else
+       np = of_find_node_by_path("/soc@ff000000/cpm@9c0/ethernet@a40");
+#endif
 
-void init_scc_ioports(struct fs_platform_info *fpi)
-{
-       int scc_no = fs_get_scc_index(fpi->fs_no);
+       /* The SCC3 enet registers overlap the SMC1 registers, so
+        * one of the two must be removed from the device tree.
+        */
 
-       switch (scc_no) {
-       case 2:
-               init_scc3_ioports(fpi);
-               break;
-       default:
-               printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
-               return;
+       if (np) {
+               of_detach_node(np);
+               of_node_put(np);
        }
-}
 
-static void init_smc1_uart_ioports(struct fs_uart_platform_info *ptr)
-{
-       unsigned *bcsr_io;
-       cpm8xx_t *cp;
-
-       cp = (cpm8xx_t *) immr_map(im_cpm);
-       setbits32(&cp->cp_pepar, 0x000000c0);
-       clrbits32(&cp->cp_pedir, 0x000000c0);
-       clrbits32(&cp->cp_peso, 0x00000040);
-       setbits32(&cp->cp_peso, 0x00000080);
-       immr_unmap(cp);
-
-       bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
-
-       if (bcsr_io == NULL) {
-               printk(KERN_CRIT "Could not remap BCSR1\n");
-               return;
-       }
-       clrbits32(bcsr_io, BCSR1_RS232EN_1);
-       iounmap(bcsr_io);
+#ifdef CONFIG_PCMCIA_M8XX
+       /* Set up board specific hook-ups.*/
+       m8xx_pcmcia_ops.hw_ctrl = pcmcia_hw_setup;
+       m8xx_pcmcia_ops.voltage_set = pcmcia_set_voltage;
+#endif
 }
 
-static void init_smc2_uart_ioports(struct fs_uart_platform_info *fpi)
+static int __init mpc885ads_probe(void)
 {
-       unsigned *bcsr_io;
-       cpm8xx_t *cp;
-
-       cp = (cpm8xx_t *) immr_map(im_cpm);
-       setbits32(&cp->cp_pepar, 0x00000c00);
-       clrbits32(&cp->cp_pedir, 0x00000c00);
-       clrbits32(&cp->cp_peso, 0x00000400);
-       setbits32(&cp->cp_peso, 0x00000800);
-       immr_unmap(cp);
-
-       bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
-
-       if (bcsr_io == NULL) {
-               printk(KERN_CRIT "Could not remap BCSR1\n");
-               return;
-       }
-       clrbits32(bcsr_io, BCSR1_RS232EN_2);
-       iounmap(bcsr_io);
+       unsigned long root = of_get_flat_dt_root();
+       return of_flat_dt_is_compatible(root, "fsl,mpc885ads");
 }
 
-void init_smc_ioports(struct fs_uart_platform_info *data)
-{
-       int smc_no = fs_uart_id_fsid2smc(data->fs_no);
+static struct of_device_id __initdata of_bus_ids[] = {
+       { .name = "soc", },
+       { .name = "cpm", },
+       { .name = "localbus", },
+       {},
+};
 
-       switch (smc_no) {
-       case 0:
-               init_smc1_uart_ioports(data);
-               data->brg = data->clk_rx;
-               break;
-       case 1:
-               init_smc2_uart_ioports(data);
-               data->brg = data->clk_rx;
-               break;
-       default:
-               printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
-               return;
-       }
-}
-
-int platform_device_skip(const char *model, int id)
+static int __init declare_of_platform_devices(void)
 {
-#ifdef CONFIG_MPC8xx_SECOND_ETH_SCC3
-       const char *dev = "FEC";
-       int n = 2;
-#else
-       const char *dev = "SCC";
-       int n = 3;
-#endif
-
-       if (!strcmp(model, dev) && n == id)
-               return 1;
+       /* Publish the QE devices */
+       if (machine_is(mpc885_ads))
+               of_platform_bus_probe(NULL, of_bus_ids, NULL);
 
        return 0;
 }
-
-static void __init mpc885ads_setup_arch(void)
-{
-       struct device_node *cpu;
-
-       cpu = of_find_node_by_type(NULL, "cpu");
-       if (cpu != 0) {
-               const unsigned int *fp;
-
-               fp = of_get_property(cpu, "clock-frequency", NULL);
-               if (fp != 0)
-                       loops_per_jiffy = *fp / HZ;
-               else
-                       loops_per_jiffy = 50000000 / HZ;
-               of_node_put(cpu);
-       }
-
-       cpm_reset();
-
-       mpc885ads_board_setup();
-
-       ROOT_DEV = Root_NFS;
-}
-
-static int __init mpc885ads_probe(void)
-{
-       char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
-                                         "model", NULL);
-       if (model == NULL)
-               return 0;
-       if (strcmp(model, "MPC885ADS"))
-               return 0;
-
-       return 1;
-}
-
-define_machine(mpc885_ads)
-{
-.name = "MPC885 ADS",.probe = mpc885ads_probe,.setup_arch =
-           mpc885ads_setup_arch,.init_IRQ =
-           m8xx_pic_init,.show_cpuinfo = mpc8xx_show_cpuinfo,.get_irq =
-           mpc8xx_get_irq,.restart = mpc8xx_restart,.calibrate_decr =
-           mpc8xx_calibrate_decr,.set_rtc_time =
-           mpc8xx_set_rtc_time,.get_rtc_time = mpc8xx_get_rtc_time,};
+device_initcall(declare_of_platform_devices);
+
+define_machine(mpc885_ads) {
+       .name                   = "Freescale MPC885 ADS",
+       .probe                  = mpc885ads_probe,
+       .setup_arch             = mpc885ads_setup_arch,
+       .init_IRQ               = m8xx_pic_init,
+       .get_irq                = mpc8xx_get_irq,
+       .restart                = mpc8xx_restart,
+       .calibrate_decr         = mpc8xx_calibrate_decr,
+       .set_rtc_time           = mpc8xx_set_rtc_time,
+       .get_rtc_time           = mpc8xx_get_rtc_time,
+       .progress               = udbg_progress,
+};
index 19d4628edf79213c9244130f4080d11f1f65d7e8..cc6013ffc29ae7957281d28406cd426f6dc13e51 100644 (file)
@@ -12,13 +12,10 @@ config PPC_MULTIPLATFORM
          RS/6000 machine, an Apple machine, or a PReP, CHRP,
          Maple or Cell-based machine.
 
-config EMBEDDED6xx
-       bool "Embedded 6xx/7xx/7xxx-based board"
-       depends on PPC32 && (BROKEN||BROKEN_ON_SMP)
-
 config PPC_82xx
        bool "Freescale 82xx"
        depends on 6xx
+       select WANT_DEVICE_TREE
 
 config PPC_83xx
        bool "Freescale 83xx"
@@ -58,7 +55,7 @@ source "arch/powerpc/platforms/85xx/Kconfig"
 source "arch/powerpc/platforms/86xx/Kconfig"
 source "arch/powerpc/platforms/embedded6xx/Kconfig"
 source "arch/powerpc/platforms/44x/Kconfig"
-#source "arch/powerpc/platforms/4xx/Kconfig
+source "arch/powerpc/platforms/40x/Kconfig"
 
 config PPC_NATIVE
        bool
@@ -136,6 +133,16 @@ config MPIC_U3_HT_IRQS
        depends on PPC_MAPLE
        default y
 
+config MPIC_BROKEN_REGREAD
+       bool
+       depends on MPIC
+       help
+         This option enables a MPIC driver workaround for some chips
+         that have a bug that causes some interrupt source information
+         to not read back properly. It is safe to use on other chips as
+         well, but enabling it uses about 8KB of memory to keep copies
+         of the register contents in software.
+
 config IBMVIO
        depends on PPC_PSERIES || PPC_ISERIES
        bool
@@ -266,12 +273,24 @@ config QUICC_ENGINE
 config CPM2
        bool
        default n
+       select CPM
        help
          The CPM2 (Communications Processor Module) is a coprocessor on
          embedded CPUs made by Freescale.  Selecting this option means that
          you wish to build a kernel for a machine with a CPM2 coprocessor
          on it (826x, 827x, 8560).
 
+config PPC_CPM_NEW_BINDING
+       bool
+       depends on CPM1 || CPM2
+       help
+         Select this if your board has been converted to use the new
+         device tree bindings for CPM, and no longer needs the
+         ioport callbacks or the platform device glue code.
+
+         The fs_enet and cpm_uart drivers will be built as
+         of_platform devices.
+
 config AXON_RAM
        tristate "Axon DDR2 memory device driver"
        depends on PPC_IBM_CELL_BLADE
@@ -291,4 +310,7 @@ config FSL_ULI1575
          Freescale reference boards. The boards all use the ULI in pretty
          much the same way.
 
+config CPM
+       bool
+
 endmenu
index e4b2aee53a73f2ce9815b5d63e19b318c44de006..4c315be250158fcfc1d1b24804f55ce76f137eb3 100644 (file)
@@ -36,10 +36,12 @@ config PPC_8xx
        bool "Freescale 8xx"
        select FSL_SOC
        select 8xx
+       select WANT_DEVICE_TREE
 
 config 40x
        bool "AMCC 40x"
        select PPC_DCR_NATIVE
+       select WANT_DEVICE_TREE
 
 config 44x
        bool "AMCC 44x"
@@ -69,6 +71,18 @@ config POWER4
        depends on PPC64
        def_bool y
 
+config TUNE_CELL
+       bool "Optimize for Cell Broadband Engine"
+       depends on PPC64
+       help
+         Cause the compiler to optimize for the PPE of the Cell Broadband
+         Engine. This will make the code run considerably faster on Cell
+         but somewhat slower on other machines. This option only changes
+         the scheduling of instructions, not the selection of instructions
+         itself, so the resulting kernel will keep running on all other
+         machines. When building a kernel that is supposed to run only
+         on Cell, you should also select the POWER4_ONLY option.
+
 config 6xx
        bool
 
index d44e832b01f2c0b3bb782c64161ade8842f6750f..6d9079da5f5a917c9357faa19f22300dab43f178 100644 (file)
@@ -9,7 +9,7 @@ obj-$(CONFIG_PPC_PMAC)          += powermac/
 endif
 endif
 obj-$(CONFIG_PPC_CHRP)         += chrp/
-#obj-$(CONFIG_4xx)             += 4xx/
+obj-$(CONFIG_40x)              += 40x/
 obj-$(CONFIG_44x)              += 44x/
 obj-$(CONFIG_PPC_MPC52xx)      += 52xx/
 obj-$(CONFIG_PPC_8xx)          += 8xx/
index f88a7c76f2964f08e8771f7670f58fd14f726496..61d12f1830364e984a63a44ecebb40863af7042c 100644 (file)
@@ -13,15 +13,13 @@ obj-$(CONFIG_PPC_CELL_NATIVE)               += smp.o
 endif
 
 # needed only when building loadable spufs.ko
-spufs-modular-$(CONFIG_SPU_FS)         += spu_syscalls.o
 spu-priv1-$(CONFIG_PPC_CELL_NATIVE)    += spu_priv1_mmio.o
 
 spu-manage-$(CONFIG_PPC_CELLEB)                += spu_manage.o
 spu-manage-$(CONFIG_PPC_CELL_NATIVE)   += spu_manage.o
 
 obj-$(CONFIG_SPU_BASE)                 += spu_callbacks.o spu_base.o \
-                                          spu_coredump.o \
-                                          $(spufs-modular-m) \
+                                          spu_syscalls.o \
                                           $(spu-priv1-y) \
                                           $(spu-manage-y) \
                                           spufs/
index 4c9ab5b70bae0e8c590021fa55d88710bc6bfa61..1245b2f517bb669eb0cec7bcbd6d641ba57f1d73 100644 (file)
 
 
 struct axon_msic {
-       struct device_node *dn;
        struct irq_host *irq_host;
        __le32 *fifo;
        dcr_host_t dcr_host;
        struct list_head list;
        u32 read_offset;
-       u32 dcr_base;
 };
 
 static LIST_HEAD(axon_msic_list);
@@ -79,12 +77,12 @@ static void msic_dcr_write(struct axon_msic *msic, unsigned int dcr_n, u32 val)
 {
        pr_debug("axon_msi: dcr_write(0x%x, 0x%x)\n", val, dcr_n);
 
-       dcr_write(msic->dcr_host, msic->dcr_base + dcr_n, val);
+       dcr_write(msic->dcr_host, msic->dcr_host.base + dcr_n, val);
 }
 
 static u32 msic_dcr_read(struct axon_msic *msic, unsigned int dcr_n)
 {
-       return dcr_read(msic->dcr_host, msic->dcr_base + dcr_n);
+       return dcr_read(msic->dcr_host, msic->dcr_host.base + dcr_n);
 }
 
 static void axon_msi_cascade(unsigned int irq, struct irq_desc *desc)
@@ -126,7 +124,7 @@ static struct axon_msic *find_msi_translator(struct pci_dev *dev)
        const phandle *ph;
        struct axon_msic *msic = NULL;
 
-       dn = pci_device_to_OF_node(dev);
+       dn = of_node_get(pci_device_to_OF_node(dev));
        if (!dn) {
                dev_dbg(&dev->dev, "axon_msi: no pci_dn found\n");
                return NULL;
@@ -183,7 +181,7 @@ static int setup_msi_msg_address(struct pci_dev *dev, struct msi_msg *msg)
        int len;
        const u32 *prop;
 
-       dn = pci_device_to_OF_node(dev);
+       dn = of_node_get(pci_device_to_OF_node(dev));
        if (!dn) {
                dev_dbg(&dev->dev, "axon_msi: no pci_dn found\n");
                return -ENODEV;
@@ -295,15 +293,7 @@ static int msic_host_map(struct irq_host *h, unsigned int virq,
        return 0;
 }
 
-static int msic_host_match(struct irq_host *host, struct device_node *dn)
-{
-       struct axon_msic *msic = host->host_data;
-
-       return msic->dn == dn;
-}
-
 static struct irq_host_ops msic_host_ops = {
-       .match  = msic_host_match,
        .map    = msic_host_map,
 };
 
@@ -314,7 +304,8 @@ static int axon_msi_notify_reboot(struct notifier_block *nb,
        u32 tmp;
 
        list_for_each_entry(msic, &axon_msic_list, list) {
-               pr_debug("axon_msi: disabling %s\n", msic->dn->full_name);
+               pr_debug("axon_msi: disabling %s\n",
+                         msic->irq_host->of_node->full_name);
                tmp  = msic_dcr_read(msic, MSIC_CTRL_REG);
                tmp &= ~MSIC_CTRL_ENABLE & ~MSIC_CTRL_IRQ_ENABLE;
                msic_dcr_write(msic, MSIC_CTRL_REG, tmp);
@@ -332,7 +323,7 @@ static int axon_msi_setup_one(struct device_node *dn)
        struct page *page;
        struct axon_msic *msic;
        unsigned int virq;
-       int dcr_len;
+       int dcr_base, dcr_len;
 
        pr_debug("axon_msi: setting up dn %s\n", dn->full_name);
 
@@ -343,17 +334,17 @@ static int axon_msi_setup_one(struct device_node *dn)
                goto out;
        }
 
-       msic->dcr_base = dcr_resource_start(dn, 0);
+       dcr_base = dcr_resource_start(dn, 0);
        dcr_len = dcr_resource_len(dn, 0);
 
-       if (msic->dcr_base == 0 || dcr_len == 0) {
+       if (dcr_base == 0 || dcr_len == 0) {
                printk(KERN_ERR
                       "axon_msi: couldn't parse dcr properties on %s\n",
                        dn->full_name);
                goto out;
        }
 
-       msic->dcr_host = dcr_map(dn, msic->dcr_base, dcr_len);
+       msic->dcr_host = dcr_map(dn, dcr_base, dcr_len);
        if (!DCR_MAP_OK(msic->dcr_host)) {
                printk(KERN_ERR "axon_msi: dcr_map failed for %s\n",
                       dn->full_name);
@@ -370,8 +361,8 @@ static int axon_msi_setup_one(struct device_node *dn)
 
        msic->fifo = page_address(page);
 
-       msic->irq_host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, NR_IRQS,
-                                       &msic_host_ops, 0);
+       msic->irq_host = irq_alloc_host(of_node_get(dn), IRQ_HOST_MAP_NOMAP,
+                                       NR_IRQS, &msic_host_ops, 0);
        if (!msic->irq_host) {
                printk(KERN_ERR "axon_msi: couldn't allocate irq_host for %s\n",
                       dn->full_name);
@@ -387,8 +378,6 @@ static int axon_msi_setup_one(struct device_node *dn)
                goto out_free_host;
        }
 
-       msic->dn = of_node_get(dn);
-
        set_irq_data(virq, msic);
        set_irq_chained_handler(virq, axon_msi_cascade);
        pr_debug("axon_msi: irq 0x%x setup for axon_msi\n", virq);
index 0b6e8ee85ab10be1faf5f9d985d3e750deff46bf..901236fa0f07bed62c1e63c191a4b5debd90fcd4 100644 (file)
@@ -24,7 +24,7 @@
 #include <asm/machdep.h>
 #include <asm/of_platform.h>
 #include <asm/prom.h>
-#include "cbe_regs.h"
+#include <asm/cell-regs.h>
 #include "cbe_cpufreq.h"
 
 static DEFINE_MUTEX(cbe_switch_mutex);
index 163263b3e1cdba667aab23ed162da2b76a6bb55c..70fa7aef5edd9a6404f0fdc7b58e57565903821e 100644 (file)
@@ -28,8 +28,8 @@
 #include <linux/time.h>
 #include <asm/machdep.h>
 #include <asm/hw_irq.h>
+#include <asm/cell-regs.h>
 
-#include "cbe_regs.h"
 #include "cbe_cpufreq.h"
 
 /* to write to MIC register */
index fc6f38982ff47cc95163fc77b9449e43e9fc5951..6a2c1b0a9a9448432fe1cc7375ca4e8665127d47 100644 (file)
 #include <asm/processor.h>
 #include <asm/prom.h>
 #include <asm/pmi.h>
+#include <asm/cell-regs.h>
 
 #ifdef DEBUG
 #include <asm/time.h>
 #endif
 
-#include "cbe_regs.h"
 #include "cbe_cpufreq.h"
 
 static u8 pmi_slow_mode_limit[MAX_CBE];
index c8f7f000742216a3a3f87852c6844e4c85b255b0..16a9b07e7b0c24b75b2a5c17b779a5f3e12f4a27 100644 (file)
@@ -16,8 +16,7 @@
 #include <asm/ptrace.h>
 #include <asm/of_device.h>
 #include <asm/of_platform.h>
-
-#include "cbe_regs.h"
+#include <asm/cell-regs.h>
 
 /*
  * Current implementation uses "cpu" nodes. We build our own mapping
diff --git a/arch/powerpc/platforms/cell/cbe_regs.h b/arch/powerpc/platforms/cell/cbe_regs.h
deleted file mode 100644 (file)
index b24025f..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * cbe_regs.h
- *
- * This file is intended to hold the various register definitions for CBE
- * on-chip system devices (memory controller, IO controller, etc...)
- *
- * (C) Copyright IBM Corporation 2001,2006
- *
- * Authors: Maximino Aguilar (maguilar@us.ibm.com)
- *          David J. Erb (djerb@us.ibm.com)
- *
- * (c) 2006 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
- */
-
-#ifndef CBE_REGS_H
-#define CBE_REGS_H
-
-#include <asm/cell-pmu.h>
-
-/*
- *
- * Some HID register definitions
- *
- */
-
-/* CBE specific HID0 bits */
-#define HID0_CBE_THERM_WAKEUP  0x0000020000000000ul
-#define HID0_CBE_SYSERR_WAKEUP 0x0000008000000000ul
-#define HID0_CBE_THERM_INT_EN  0x0000000400000000ul
-#define HID0_CBE_SYSERR_INT_EN 0x0000000200000000ul
-
-#define MAX_CBE                2
-
-/*
- *
- * Pervasive unit register definitions
- *
- */
-
-union spe_reg {
-       u64 val;
-       u8 spe[8];
-};
-
-union ppe_spe_reg {
-       u64 val;
-       struct {
-               u32 ppe;
-               u32 spe;
-       };
-};
-
-
-struct cbe_pmd_regs {
-       /* Debug Bus Control */
-       u64     pad_0x0000;                                     /* 0x0000 */
-
-       u64     group_control;                                  /* 0x0008 */
-
-       u8      pad_0x0010_0x00a8 [0x00a8 - 0x0010];            /* 0x0010 */
-
-       u64     debug_bus_control;                              /* 0x00a8 */
-
-       u8      pad_0x00b0_0x0100 [0x0100 - 0x00b0];            /* 0x00b0 */
-
-       u64     trace_aux_data;                                 /* 0x0100 */
-       u64     trace_buffer_0_63;                              /* 0x0108 */
-       u64     trace_buffer_64_127;                            /* 0x0110 */
-       u64     trace_address;                                  /* 0x0118 */
-       u64     ext_tr_timer;                                   /* 0x0120 */
-
-       u8      pad_0x0128_0x0400 [0x0400 - 0x0128];            /* 0x0128 */
-
-       /* Performance Monitor */
-       u64     pm_status;                                      /* 0x0400 */
-       u64     pm_control;                                     /* 0x0408 */
-       u64     pm_interval;                                    /* 0x0410 */
-       u64     pm_ctr[4];                                      /* 0x0418 */
-       u64     pm_start_stop;                                  /* 0x0438 */
-       u64     pm07_control[8];                                /* 0x0440 */
-
-       u8      pad_0x0480_0x0800 [0x0800 - 0x0480];            /* 0x0480 */
-
-       /* Thermal Sensor Registers */
-       union   spe_reg ts_ctsr1;                               /* 0x0800 */
-       u64     ts_ctsr2;                                       /* 0x0808 */
-       union   spe_reg ts_mtsr1;                               /* 0x0810 */
-       u64     ts_mtsr2;                                       /* 0x0818 */
-       union   spe_reg ts_itr1;                                /* 0x0820 */
-       u64     ts_itr2;                                        /* 0x0828 */
-       u64     ts_gitr;                                        /* 0x0830 */
-       u64     ts_isr;                                         /* 0x0838 */
-       u64     ts_imr;                                         /* 0x0840 */
-       union   spe_reg tm_cr1;                                 /* 0x0848 */
-       u64     tm_cr2;                                         /* 0x0850 */
-       u64     tm_simr;                                        /* 0x0858 */
-       union   ppe_spe_reg tm_tpr;                             /* 0x0860 */
-       union   spe_reg tm_str1;                                /* 0x0868 */
-       u64     tm_str2;                                        /* 0x0870 */
-       union   ppe_spe_reg tm_tsr;                             /* 0x0878 */
-
-       /* Power Management */
-       u64     pmcr;                                           /* 0x0880 */
-#define CBE_PMD_PAUSE_ZERO_CONTROL     0x10000
-       u64     pmsr;                                           /* 0x0888 */
-
-       /* Time Base Register */
-       u64     tbr;                                            /* 0x0890 */
-
-       u8      pad_0x0898_0x0c00 [0x0c00 - 0x0898];            /* 0x0898 */
-
-       /* Fault Isolation Registers */
-       u64     checkstop_fir;                                  /* 0x0c00 */
-       u64     recoverable_fir;                                /* 0x0c08 */
-       u64     spec_att_mchk_fir;                              /* 0x0c10 */
-       u32     fir_mode_reg;                                   /* 0x0c18 */
-       u8      pad_0x0c1c_0x0c20 [4];                          /* 0x0c1c */
-#define CBE_PMD_FIR_MODE_M8            0x00800
-       u64     fir_enable_mask;                                /* 0x0c20 */
-
-       u8      pad_0x0c28_0x0ca8 [0x0ca8 - 0x0c28];            /* 0x0c28 */
-       u64     ras_esc_0;                                      /* 0x0ca8 */
-       u8      pad_0x0cb0_0x1000 [0x1000 - 0x0cb0];            /* 0x0cb0 */
-};
-
-extern struct cbe_pmd_regs __iomem *cbe_get_pmd_regs(struct device_node *np);
-extern struct cbe_pmd_regs __iomem *cbe_get_cpu_pmd_regs(int cpu);
-
-/*
- * PMU shadow registers
- *
- * Many of the registers in the performance monitoring unit are write-only,
- * so we need to save a copy of what we write to those registers.
- *
- * The actual data counters are read/write. However, writing to the counters
- * only takes effect if the PMU is enabled. Otherwise the value is stored in
- * a hardware latch until the next time the PMU is enabled. So we save a copy
- * of the counter values if we need to read them back while the PMU is
- * disabled. The counter_value_in_latch field is a bitmap indicating which
- * counters currently have a value waiting to be written.
- */
-
-struct cbe_pmd_shadow_regs {
-       u32 group_control;
-       u32 debug_bus_control;
-       u32 trace_address;
-       u32 ext_tr_timer;
-       u32 pm_status;
-       u32 pm_control;
-       u32 pm_interval;
-       u32 pm_start_stop;
-       u32 pm07_control[NR_CTRS];
-
-       u32 pm_ctr[NR_PHYS_CTRS];
-       u32 counter_value_in_latch;
-};
-
-extern struct cbe_pmd_shadow_regs *cbe_get_pmd_shadow_regs(struct device_node *np);
-extern struct cbe_pmd_shadow_regs *cbe_get_cpu_pmd_shadow_regs(int cpu);
-
-/*
- *
- * IIC unit register definitions
- *
- */
-
-struct cbe_iic_pending_bits {
-       u32 data;
-       u8 flags;
-       u8 class;
-       u8 source;
-       u8 prio;
-};
-
-#define CBE_IIC_IRQ_VALID      0x80
-#define CBE_IIC_IRQ_IPI                0x40
-
-struct cbe_iic_thread_regs {
-       struct cbe_iic_pending_bits pending;
-       struct cbe_iic_pending_bits pending_destr;
-       u64 generate;
-       u64 prio;
-};
-
-struct cbe_iic_regs {
-       u8      pad_0x0000_0x0400[0x0400 - 0x0000];             /* 0x0000 */
-
-       /* IIC interrupt registers */
-       struct  cbe_iic_thread_regs thread[2];                  /* 0x0400 */
-
-       u64     iic_ir;                                         /* 0x0440 */
-#define CBE_IIC_IR_PRIO(x)      (((x) & 0xf) << 12)
-#define CBE_IIC_IR_DEST_NODE(x) (((x) & 0xf) << 4)
-#define CBE_IIC_IR_DEST_UNIT(x) ((x) & 0xf)
-#define CBE_IIC_IR_IOC_0        0x0
-#define CBE_IIC_IR_IOC_1S       0xb
-#define CBE_IIC_IR_PT_0         0xe
-#define CBE_IIC_IR_PT_1         0xf
-
-       u64     iic_is;                                         /* 0x0448 */
-#define CBE_IIC_IS_PMI         0x2
-
-       u8      pad_0x0450_0x0500[0x0500 - 0x0450];             /* 0x0450 */
-
-       /* IOC FIR */
-       u64     ioc_fir_reset;                                  /* 0x0500 */
-       u64     ioc_fir_set;                                    /* 0x0508 */
-       u64     ioc_checkstop_enable;                           /* 0x0510 */
-       u64     ioc_fir_error_mask;                             /* 0x0518 */
-       u64     ioc_syserr_enable;                              /* 0x0520 */
-       u64     ioc_fir;                                        /* 0x0528 */
-
-       u8      pad_0x0530_0x1000[0x1000 - 0x0530];             /* 0x0530 */
-};
-
-extern struct cbe_iic_regs __iomem *cbe_get_iic_regs(struct device_node *np);
-extern struct cbe_iic_regs __iomem *cbe_get_cpu_iic_regs(int cpu);
-
-
-struct cbe_mic_tm_regs {
-       u8      pad_0x0000_0x0040[0x0040 - 0x0000];             /* 0x0000 */
-
-       u64     mic_ctl_cnfg2;                                  /* 0x0040 */
-#define CBE_MIC_ENABLE_AUX_TRC         0x8000000000000000LL
-#define CBE_MIC_DISABLE_PWR_SAV_2      0x0200000000000000LL
-#define CBE_MIC_DISABLE_AUX_TRC_WRAP   0x0100000000000000LL
-#define CBE_MIC_ENABLE_AUX_TRC_INT     0x0080000000000000LL
-
-       u64     pad_0x0048;                                     /* 0x0048 */
-
-       u64     mic_aux_trc_base;                               /* 0x0050 */
-       u64     mic_aux_trc_max_addr;                           /* 0x0058 */
-       u64     mic_aux_trc_cur_addr;                           /* 0x0060 */
-       u64     mic_aux_trc_grf_addr;                           /* 0x0068 */
-       u64     mic_aux_trc_grf_data;                           /* 0x0070 */
-
-       u64     pad_0x0078;                                     /* 0x0078 */
-
-       u64     mic_ctl_cnfg_0;                                 /* 0x0080 */
-#define CBE_MIC_DISABLE_PWR_SAV_0      0x8000000000000000LL
-
-       u64     pad_0x0088;                                     /* 0x0088 */
-
-       u64     slow_fast_timer_0;                              /* 0x0090 */
-       u64     slow_next_timer_0;                              /* 0x0098 */
-
-       u8      pad_0x00a0_0x01c0[0x01c0 - 0x0a0];              /* 0x00a0 */
-
-       u64     mic_ctl_cnfg_1;                                 /* 0x01c0 */
-#define CBE_MIC_DISABLE_PWR_SAV_1      0x8000000000000000LL
-       u64     pad_0x01c8;                                     /* 0x01c8 */
-
-       u64     slow_fast_timer_1;                              /* 0x01d0 */
-       u64     slow_next_timer_1;                              /* 0x01d8 */
-
-       u8      pad_0x01e0_0x1000[0x1000 - 0x01e0];             /* 0x01e0 */
-};
-
-extern struct cbe_mic_tm_regs __iomem *cbe_get_mic_tm_regs(struct device_node *np);
-extern struct cbe_mic_tm_regs __iomem *cbe_get_cpu_mic_tm_regs(int cpu);
-
-/* some utility functions to deal with SMT */
-extern u32 cbe_get_hw_thread_id(int cpu);
-extern u32 cbe_cpu_to_node(int cpu);
-extern u32 cbe_node_to_cpu(int node);
-
-/* Init this module early */
-extern void cbe_regs_init(void);
-
-
-#endif /* CBE_REGS_H */
index fb5eda48467df8e723689c29ff1948bb6c2111a6..4852bf312d83c0d60a224eb9ab292dd832c96a64 100644 (file)
@@ -52,8 +52,8 @@
 #include <asm/spu.h>
 #include <asm/io.h>
 #include <asm/prom.h>
+#include <asm/cell-regs.h>
 
-#include "cbe_regs.h"
 #include "spu_priv1_mmio.h"
 
 #define TEMP_MIN 65
index 47264e7220295f9484f6f9adfdb4031072bf45ed..151fd8b82d63b2e0878a7ee48118b3cda0ca0576 100644 (file)
@@ -41,9 +41,9 @@
 #include <asm/prom.h>
 #include <asm/ptrace.h>
 #include <asm/machdep.h>
+#include <asm/cell-regs.h>
 
 #include "interrupt.h"
-#include "cbe_regs.h"
 
 struct iic {
        struct cbe_iic_thread_regs __iomem *regs;
@@ -381,7 +381,7 @@ static int __init setup_iic(void)
 void __init iic_init_IRQ(void)
 {
        /* Setup an irq host data structure */
-       iic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, IIC_SOURCE_COUNT,
+       iic_host = irq_alloc_host(NULL, IRQ_HOST_MAP_LINEAR, IIC_SOURCE_COUNT,
                                  &iic_host_ops, IIC_IRQ_INVALID);
        BUG_ON(iic_host == NULL);
        irq_set_default_host(iic_host);
index 760caa76841a025e35969ef58b67002f228e91e7..faabc3fdc130220ff7aeb8bd3ddc139e20157654 100644 (file)
@@ -34,8 +34,8 @@
 #include <asm/udbg.h>
 #include <asm/of_platform.h>
 #include <asm/lmb.h>
+#include <asm/cell-regs.h>
 
-#include "cbe_regs.h"
 #include "interrupt.h"
 
 /* Define CELL_IOMMU_REAL_UNMAP to actually unmap non-used pages
index 4ede22d363fa7b701e446193b6b97fb4ec7c5600..0304589c0a80550e07be726c6557538f7ee8ae03 100644 (file)
@@ -34,9 +34,9 @@
 #include <asm/prom.h>
 #include <asm/pgtable.h>
 #include <asm/reg.h>
+#include <asm/cell-regs.h>
 
 #include "pervasive.h"
-#include "cbe_regs.h"
 
 static int sysreset_hack;
 
index 66ca4b5a1dbc6cab284962aec94ac9a38f2da189..1ed3036788879d018c7dcdab5bf68925d87f9fce 100644 (file)
@@ -30,8 +30,8 @@
 #include <asm/pmc.h>
 #include <asm/reg.h>
 #include <asm/spu.h>
+#include <asm/cell-regs.h>
 
-#include "cbe_regs.h"
 #include "interrupt.h"
 
 /*
index 3961a085b432b4046bd2525c2e850c708da49ae4..b2494ebcdbe9a131beb472f2ca45d04825a509d9 100644 (file)
@@ -10,9 +10,9 @@
 #include <asm/prom.h>
 #include <asm/machdep.h>
 #include <asm/rtas.h>
+#include <asm/cell-regs.h>
 
 #include "ras.h"
-#include "cbe_regs.h"
 
 
 static void dump_fir(int cpu)
index db6654272e133112acecdc83f35ad20e5c80b914..98e7ef8e6fc66a5becd6c3cd18a676bd6ef96fdb 100644 (file)
@@ -52,9 +52,9 @@
 #include <asm/udbg.h>
 #include <asm/mpic.h>
 #include <asm/of_platform.h>
+#include <asm/cell-regs.h>
 
 #include "interrupt.h"
-#include "cbe_regs.h"
 #include "pervasive.h"
 #include "ras.h"
 
@@ -83,12 +83,22 @@ static void cell_progress(char *s, unsigned short hex)
 
 static int __init cell_publish_devices(void)
 {
+       int node;
+
        if (!machine_is(cell))
                return 0;
 
        /* Publish OF platform devices for southbridge IOs */
        of_platform_bus_probe(NULL, NULL, NULL);
 
+       /* There is no device for the MIC memory controller, thus we create
+        * a platform device for it to attach the EDAC driver to.
+        */
+       for_each_online_node(node) {
+               if (cbe_get_cpu_mic_tm_regs(cbe_node_to_cpu(node)) == NULL)
+                       continue;
+               platform_device_register_simple("cbe-mic", node, NULL, 0);
+       }
        return 0;
 }
 device_initcall(cell_publish_devices);
@@ -161,11 +171,6 @@ static void __init cell_setup_arch(void)
        /* init to some ~sane value until calibrate_delay() runs */
        loops_per_jiffy = 50000000;
 
-       if (ROOT_DEV == 0) {
-               printk("No ramdisk, default root is /dev/hda2\n");
-               ROOT_DEV = Root_HDA2;
-       }
-
        /* Find and initialize PCI host bridges */
        init_pci_config_tokens();
        find_and_init_phbs();
index 05f4b3d3d756558295a0121477da5036186b2f49..3f4b4aef756d8821139c1def2b7b666041a516ad 100644 (file)
@@ -63,7 +63,6 @@ enum {
 
 struct spider_pic {
        struct irq_host         *host;
-       struct device_node      *of_node;
        void __iomem            *regs;
        unsigned int            node_id;
 };
@@ -176,12 +175,6 @@ static struct irq_chip spider_pic = {
        .set_type = spider_set_irq_type,
 };
 
-static int spider_host_match(struct irq_host *h, struct device_node *node)
-{
-       struct spider_pic *pic = h->host_data;
-       return node == pic->of_node;
-}
-
 static int spider_host_map(struct irq_host *h, unsigned int virq,
                        irq_hw_number_t hw)
 {
@@ -208,7 +201,6 @@ static int spider_host_xlate(struct irq_host *h, struct device_node *ct,
 }
 
 static struct irq_host_ops spider_host_ops = {
-       .match = spider_host_match,
        .map = spider_host_map,
        .xlate = spider_host_xlate,
 };
@@ -247,18 +239,18 @@ static unsigned int __init spider_find_cascade_and_node(struct spider_pic *pic)
         * tree in case the device-tree is ever fixed
         */
        struct of_irq oirq;
-       if (of_irq_map_one(pic->of_node, 0, &oirq) == 0) {
+       if (of_irq_map_one(pic->host->of_node, 0, &oirq) == 0) {
                virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
                                             oirq.size);
                return virq;
        }
 
        /* Now do the horrible hacks */
-       tmp = of_get_property(pic->of_node, "#interrupt-cells", NULL);
+       tmp = of_get_property(pic->host->of_node, "#interrupt-cells", NULL);
        if (tmp == NULL)
                return NO_IRQ;
        intsize = *tmp;
-       imap = of_get_property(pic->of_node, "interrupt-map", &imaplen);
+       imap = of_get_property(pic->host->of_node, "interrupt-map", &imaplen);
        if (imap == NULL || imaplen < (intsize + 1))
                return NO_IRQ;
        iic = of_find_node_by_phandle(imap[intsize]);
@@ -308,15 +300,13 @@ static void __init spider_init_one(struct device_node *of_node, int chip,
                panic("spider_pic: can't map registers !");
 
        /* Allocate a host */
-       pic->host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, SPIDER_SRC_COUNT,
-                                  &spider_host_ops, SPIDER_IRQ_INVALID);
+       pic->host = irq_alloc_host(of_node_get(of_node), IRQ_HOST_MAP_LINEAR,
+                                  SPIDER_SRC_COUNT, &spider_host_ops,
+                                  SPIDER_IRQ_INVALID);
        if (pic->host == NULL)
                panic("spider_pic: can't allocate irq host !");
        pic->host->host_data = pic;
 
-       /* Fill out other bits */
-       pic->of_node = of_node_get(of_node);
-
        /* Go through all sources and disable them */
        for (i = 0; i < SPIDER_SRC_COUNT; i++) {
                void __iomem *cfg = pic->regs + TIR_CFGA + 8 * i;
index 106d2921e2d9f5a057337935c94d4e05ed18f3d2..c83c3e3f51784c55a3ed85f4e67e2e2513cec2f3 100644 (file)
@@ -168,7 +168,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
 #else
                psize = mm->context.user_psize;
 #endif
-               vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) |
+               vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
                                SLB_VSID_USER;
                break;
        case VMALLOC_REGION_ID:
@@ -176,12 +176,12 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
                        psize = mmu_vmalloc_psize;
                else
                        psize = mmu_io_psize;
-               vsid = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) |
+               vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
                        SLB_VSID_KERNEL;
                break;
        case KERNEL_REGION_ID:
                psize = mmu_linear_psize;
-               vsid = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) |
+               vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
                        SLB_VSID_KERNEL;
                break;
        default:
@@ -458,7 +458,7 @@ static int spu_shutdown(struct sys_device *sysdev)
        return 0;
 }
 
-struct sysdev_class spu_sysdev_class = {
+static struct sysdev_class spu_sysdev_class = {
        set_kset_name("spu"),
        .shutdown = spu_shutdown,
 };
index 47ec3be3edcd6dfae91890fe8c4100d7e2593b0d..dceb8b6a9382e9ac1a65f1987f9953c087df81d1 100644 (file)
@@ -2,7 +2,7 @@
  * System call callback functions for SPUs
  */
 
-#define DEBUG
+#undef DEBUG
 
 #include <linux/kallsyms.h>
 #include <linux/module.h>
@@ -33,7 +33,7 @@
  *     mbind, mq_open, ipc, ...
  */
 
-void *spu_syscall_table[] = {
+static void *spu_syscall_table[] = {
 #define SYSCALL(func)          sys_ni_syscall,
 #define COMPAT_SYS(func)       sys_ni_syscall,
 #define PPC_SYS(func)          sys_ni_syscall,
diff --git a/arch/powerpc/platforms/cell/spu_coredump.c b/arch/powerpc/platforms/cell/spu_coredump.c
deleted file mode 100644 (file)
index 4fd37ff..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * SPU core dump code
- *
- * (C) Copyright 2006 IBM Corp.
- *
- * Author: Dwayne Grant McConnell <decimal@us.ibm.com>
- *
- * 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, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/file.h>
-#include <linux/module.h>
-#include <linux/syscalls.h>
-
-#include <asm/spu.h>
-
-static struct spu_coredump_calls *spu_coredump_calls;
-static DEFINE_MUTEX(spu_coredump_mutex);
-
-int arch_notes_size(void)
-{
-       long ret;
-
-       ret = -ENOSYS;
-       mutex_lock(&spu_coredump_mutex);
-       if (spu_coredump_calls && try_module_get(spu_coredump_calls->owner)) {
-               ret = spu_coredump_calls->arch_notes_size();
-               module_put(spu_coredump_calls->owner);
-       }
-       mutex_unlock(&spu_coredump_mutex);
-       return ret;
-}
-
-void arch_write_notes(struct file *file)
-{
-       mutex_lock(&spu_coredump_mutex);
-       if (spu_coredump_calls && try_module_get(spu_coredump_calls->owner)) {
-               spu_coredump_calls->arch_write_notes(file);
-               module_put(spu_coredump_calls->owner);
-       }
-       mutex_unlock(&spu_coredump_mutex);
-}
-
-int register_arch_coredump_calls(struct spu_coredump_calls *calls)
-{
-       int ret = 0;
-
-
-       mutex_lock(&spu_coredump_mutex);
-       if (spu_coredump_calls)
-               ret = -EBUSY;
-       else
-               spu_coredump_calls = calls;
-       mutex_unlock(&spu_coredump_mutex);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(register_arch_coredump_calls);
-
-void unregister_arch_coredump_calls(struct spu_coredump_calls *calls)
-{
-       BUG_ON(spu_coredump_calls != calls);
-
-       mutex_lock(&spu_coredump_mutex);
-       spu_coredump_calls = NULL;
-       mutex_unlock(&spu_coredump_mutex);
-}
-EXPORT_SYMBOL_GPL(unregister_arch_coredump_calls);
index 0e14f532500e9a993c5480025cab92a58f54cfda..1b010707488d5d913cd0da6eaf5d3f26a60c6eca 100644 (file)
@@ -377,10 +377,10 @@ static int qs20_reg_memory[QS20_SPES_PER_BE] = { 1, 1, 0, 0, 0, 0, 0, 0 };
 static struct spu *spu_lookup_reg(int node, u32 reg)
 {
        struct spu *spu;
-       u32 *spu_reg;
+       const u32 *spu_reg;
 
        list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) {
-               spu_reg = (u32*)of_get_property(spu_devnode(spu), "reg", NULL);
+               spu_reg = of_get_property(spu_devnode(spu), "reg", NULL);
                if (*spu_reg == reg)
                        return spu;
        }
index 027ac32cc63659c8c2af89270041742dcb96e345..a9438b719fe8ba38e53f48f4e2106e1e81746cc0 100644 (file)
@@ -2,6 +2,7 @@
  * SPU file system -- system call stubs
  *
  * (C) Copyright IBM Deutschland Entwicklung GmbH 2005
+ * (C) Copyright 2006-2007, IBM Corporation
  *
  * Author: Arnd Bergmann <arndb@de.ibm.com>
  *
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 #include <linux/file.h>
+#include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/syscalls.h>
+#include <linux/rcupdate.h>
 
 #include <asm/spu.h>
 
-struct spufs_calls spufs_calls = {
-       .owner = NULL,
-};
+/* protected by rcu */
+static struct spufs_calls *spufs_calls;
 
-/* These stub syscalls are needed to have the actual implementation
- * within a loadable module. When spufs is built into the kernel,
- * this file is not used and the syscalls directly enter the fs code */
+#ifdef CONFIG_SPU_FS_MODULE
+
+static inline struct spufs_calls *spufs_calls_get(void)
+{
+       struct spufs_calls *calls = NULL;
+
+       rcu_read_lock();
+       calls = rcu_dereference(spufs_calls);
+       if (calls && !try_module_get(calls->owner))
+               calls = NULL;
+       rcu_read_unlock();
+
+       return calls;
+}
+
+static inline void spufs_calls_put(struct spufs_calls *calls)
+{
+       BUG_ON(calls != spufs_calls);
+
+       /* we don't need to rcu this, as we hold a reference to the module */
+       module_put(spufs_calls->owner);
+}
+
+#else /* !defined CONFIG_SPU_FS_MODULE */
+
+static inline struct spufs_calls *spufs_calls_get(void)
+{
+       return spufs_calls;
+}
+
+static inline void spufs_calls_put(struct spufs_calls *calls) { }
+
+#endif /* CONFIG_SPU_FS_MODULE */
 
 asmlinkage long sys_spu_create(const char __user *name,
                unsigned int flags, mode_t mode, int neighbor_fd)
 {
        long ret;
-       struct module *owner = spufs_calls.owner;
        struct file *neighbor;
        int fput_needed;
+       struct spufs_calls *calls;
 
-       ret = -ENOSYS;
-       if (owner && try_module_get(owner)) {
-               if (flags & SPU_CREATE_AFFINITY_SPU) {
-                       neighbor = fget_light(neighbor_fd, &fput_needed);
-                       ret = -EBADF;
-                       if (neighbor) {
-                               ret = spufs_calls.create_thread(name, flags,
-                                                               mode, neighbor);
-                               fput_light(neighbor, fput_needed);
-                       }
-               }
-               else {
-                       ret = spufs_calls.create_thread(name, flags,
-                                                       mode, NULL);
+       calls = spufs_calls_get();
+       if (!calls)
+               return -ENOSYS;
+
+       if (flags & SPU_CREATE_AFFINITY_SPU) {
+               ret = -EBADF;
+               neighbor = fget_light(neighbor_fd, &fput_needed);
+               if (neighbor) {
+                       ret = calls->create_thread(name, flags, mode, neighbor);
+                       fput_light(neighbor, fput_needed);
                }
-               module_put(owner);
-       }
+       } else
+               ret = calls->create_thread(name, flags, mode, NULL);
+
+       spufs_calls_put(calls);
        return ret;
 }
 
@@ -66,37 +96,69 @@ asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, __u32 __user *ustatus)
        long ret;
        struct file *filp;
        int fput_needed;
-       struct module *owner = spufs_calls.owner;
+       struct spufs_calls *calls;
 
-       ret = -ENOSYS;
-       if (owner && try_module_get(owner)) {
-               ret = -EBADF;
-               filp = fget_light(fd, &fput_needed);
-               if (filp) {
-                       ret = spufs_calls.spu_run(filp, unpc, ustatus);
-                       fput_light(filp, fput_needed);
-               }
-               module_put(owner);
+       calls = spufs_calls_get();
+       if (!calls)
+               return -ENOSYS;
+
+       ret = -EBADF;
+       filp = fget_light(fd, &fput_needed);
+       if (filp) {
+               ret = calls->spu_run(filp, unpc, ustatus);
+               fput_light(filp, fput_needed);
        }
+
+       spufs_calls_put(calls);
+       return ret;
+}
+
+int elf_coredump_extra_notes_size(void)
+{
+       struct spufs_calls *calls;
+       int ret;
+
+       calls = spufs_calls_get();
+       if (!calls)
+               return 0;
+
+       ret = calls->coredump_extra_notes_size();
+
+       spufs_calls_put(calls);
+
+       return ret;
+}
+
+int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset)
+{
+       struct spufs_calls *calls;
+       int ret;
+
+       calls = spufs_calls_get();
+       if (!calls)
+               return 0;
+
+       ret = calls->coredump_extra_notes_write(file, foffset);
+
+       spufs_calls_put(calls);
+
        return ret;
 }
 
 int register_spu_syscalls(struct spufs_calls *calls)
 {
-       if (spufs_calls.owner)
+       if (spufs_calls)
                return -EBUSY;
 
-       spufs_calls.create_thread = calls->create_thread;
-       spufs_calls.spu_run = calls->spu_run;
-       smp_mb();
-       spufs_calls.owner = calls->owner;
+       rcu_assign_pointer(spufs_calls, calls);
        return 0;
 }
 EXPORT_SYMBOL_GPL(register_spu_syscalls);
 
 void unregister_spu_syscalls(struct spufs_calls *calls)
 {
-       BUG_ON(spufs_calls.owner != calls->owner);
-       spufs_calls.owner = NULL;
+       BUG_ON(spufs_calls->owner != calls->owner);
+       rcu_assign_pointer(spufs_calls, NULL);
+       synchronize_rcu();
 }
 EXPORT_SYMBOL_GPL(unregister_spu_syscalls);
index 5e31799b1e3f929b77286f494215dacbb1749439..80f62363e1ce1708c19662fa003bebc9b5459a72 100644 (file)
 
 #include "spufs.h"
 
-struct spufs_ctx_info {
-       struct list_head list;
-       int dfd;
-       int memsize; /* in bytes */
-       struct spu_context *ctx;
-};
-
-static LIST_HEAD(ctx_info_list);
-
-static ssize_t do_coredump_read(int num, struct spu_context *ctx, void __user *buffer,
+static ssize_t do_coredump_read(int num, struct spu_context *ctx, void *buffer,
                                size_t size, loff_t *off)
 {
        u64 data;
@@ -50,49 +41,57 @@ static ssize_t do_coredump_read(int num, struct spu_context *ctx, void __user *b
                return spufs_coredump_read[num].read(ctx, buffer, size, off);
 
        data = spufs_coredump_read[num].get(ctx);
-       ret = copy_to_user(buffer, &data, 8);
-       return ret ? -EFAULT : 8;
+       ret = snprintf(buffer, size, "0x%.16lx", data);
+       if (ret >= size)
+               return size;
+       return ++ret; /* count trailing NULL */
 }
 
 /*
  * These are the only things you should do on a core-file: use only these
  * functions to write out all the necessary info.
  */
-static int spufs_dump_write(struct file *file, const void *addr, int nr)
+static int spufs_dump_write(struct file *file, const void *addr, int nr, loff_t *foffset)
 {
-       return file->f_op->write(file, addr, nr, &file->f_pos) == nr;
-}
+       unsigned long limit = current->signal->rlim[RLIMIT_CORE].rlim_cur;
+       ssize_t written;
 
-static int spufs_dump_seek(struct file *file, loff_t off)
-{
-       if (file->f_op->llseek) {
-               if (file->f_op->llseek(file, off, 0) != off)
-                       return 0;
-       } else
-               file->f_pos = off;
-       return 1;
+       if (*foffset + nr > limit)
+               return -EIO;
+
+       written = file->f_op->write(file, addr, nr, &file->f_pos);
+       *foffset += written;
+
+       if (written != nr)
+               return -EIO;
+
+       return 0;
 }
 
-static void spufs_fill_memsize(struct spufs_ctx_info *ctx_info)
+static int spufs_dump_align(struct file *file, char *buf, loff_t new_off,
+                           loff_t *foffset)
 {
-       struct spu_context *ctx;
-       unsigned long long lslr;
+       int rc, size;
+
+       size = min((loff_t)PAGE_SIZE, new_off - *foffset);
+       memset(buf, 0, size);
+
+       rc = 0;
+       while (rc == 0 && new_off > *foffset) {
+               size = min((loff_t)PAGE_SIZE, new_off - *foffset);
+               rc = spufs_dump_write(file, buf, size, foffset);
+       }
 
-       ctx = ctx_info->ctx;
-       lslr = ctx->csa.priv2.spu_lslr_RW;
-       ctx_info->memsize = lslr + 1;
+       return rc;
 }
 
-static int spufs_ctx_note_size(struct spufs_ctx_info *ctx_info)
+static int spufs_ctx_note_size(struct spu_context *ctx, int dfd)
 {
-       int dfd, memsize, i, sz, total = 0;
+       int i, sz, total = 0;
        char *name;
        char fullname[80];
 
-       dfd = ctx_info->dfd;
-       memsize = ctx_info->memsize;
-
-       for (i = 0; spufs_coredump_read[i].name; i++) {
+       for (i = 0; spufs_coredump_read[i].name != NULL; i++) {
                name = spufs_coredump_read[i].name;
                sz = spufs_coredump_read[i].size;
 
@@ -100,39 +99,12 @@ static int spufs_ctx_note_size(struct spufs_ctx_info *ctx_info)
 
                total += sizeof(struct elf_note);
                total += roundup(strlen(fullname) + 1, 4);
-               if (!strcmp(name, "mem"))
-                       total += roundup(memsize, 4);
-               else
-                       total += roundup(sz, 4);
+               total += roundup(sz, 4);
        }
 
        return total;
 }
 
-static int spufs_add_one_context(struct file *file, int dfd)
-{
-       struct spu_context *ctx;
-       struct spufs_ctx_info *ctx_info;
-       int size;
-
-       ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
-       if (ctx->flags & SPU_CREATE_NOSCHED)
-               return 0;
-
-       ctx_info = kzalloc(sizeof(*ctx_info), GFP_KERNEL);
-       if (unlikely(!ctx_info))
-               return -ENOMEM;
-
-       ctx_info->dfd = dfd;
-       ctx_info->ctx = ctx;
-
-       spufs_fill_memsize(ctx_info);
-
-       size = spufs_ctx_note_size(ctx_info);
-       list_add(&ctx_info->list, &ctx_info_list);
-       return size;
-}
-
 /*
  * The additional architecture-specific notes for Cell are various
  * context files in the spu context.
@@ -142,33 +114,57 @@ static int spufs_add_one_context(struct file *file, int dfd)
  * internal functionality to dump them without needing to actually
  * open the files.
  */
-static int spufs_arch_notes_size(void)
+static struct spu_context *coredump_next_context(int *fd)
 {
        struct fdtable *fdt = files_fdtable(current->files);
-       int size = 0, fd;
+       struct file *file;
+       struct spu_context *ctx = NULL;
 
-       for (fd = 0; fd < fdt->max_fds; fd++) {
-               if (FD_ISSET(fd, fdt->open_fds)) {
-                       struct file *file = fcheck(fd);
+       for (; *fd < fdt->max_fds; (*fd)++) {
+               if (!FD_ISSET(*fd, fdt->open_fds))
+                       continue;
 
-                       if (file && file->f_op == &spufs_context_fops) {
-                               int rval = spufs_add_one_context(file, fd);
-                               if (rval < 0)
-                                       break;
-                               size += rval;
-                       }
-               }
+               file = fcheck(*fd);
+
+               if (!file || file->f_op != &spufs_context_fops)
+                       continue;
+
+               ctx = SPUFS_I(file->f_dentry->d_inode)->i_ctx;
+               if (ctx->flags & SPU_CREATE_NOSCHED)
+                       continue;
+
+               /* start searching the next fd next time we're called */
+               (*fd)++;
+               break;
        }
 
-       return size;
+       return ctx;
 }
 
-static void spufs_arch_write_note(struct spufs_ctx_info *ctx_info, int i,
-                               struct file *file)
+int spufs_coredump_extra_notes_size(void)
 {
        struct spu_context *ctx;
+       int size = 0, rc, fd;
+
+       fd = 0;
+       while ((ctx = coredump_next_context(&fd)) != NULL) {
+               spu_acquire_saved(ctx);
+               rc = spufs_ctx_note_size(ctx, fd);
+               spu_release_saved(ctx);
+               if (rc < 0)
+                       break;
+
+               size += rc;
+       }
+
+       return size;
+}
+
+static int spufs_arch_write_note(struct spu_context *ctx, int i,
+                                 struct file *file, int dfd, loff_t *foffset)
+{
        loff_t pos = 0;
-       int sz, dfd, rc, total = 0;
+       int sz, rc, nread, total = 0;
        const int bufsz = PAGE_SIZE;
        char *name;
        char fullname[80], *buf;
@@ -176,64 +172,70 @@ static void spufs_arch_write_note(struct spufs_ctx_info *ctx_info, int i,
 
        buf = (void *)get_zeroed_page(GFP_KERNEL);
        if (!buf)
-               return;
+               return -ENOMEM;
 
-       dfd = ctx_info->dfd;
        name = spufs_coredump_read[i].name;
-
-       if (!strcmp(name, "mem"))
-               sz = ctx_info->memsize;
-       else
-               sz = spufs_coredump_read[i].size;
-
-       ctx = ctx_info->ctx;
-       if (!ctx)
-               goto out;
+       sz = spufs_coredump_read[i].size;
 
        sprintf(fullname, "SPU/%d/%s", dfd, name);
        en.n_namesz = strlen(fullname) + 1;
        en.n_descsz = sz;
        en.n_type = NT_SPU;
 
-       if (!spufs_dump_write(file, &en, sizeof(en)))
+       rc = spufs_dump_write(file, &en, sizeof(en), foffset);
+       if (rc)
                goto out;
-       if (!spufs_dump_write(file, fullname, en.n_namesz))
+
+       rc = spufs_dump_write(file, fullname, en.n_namesz, foffset);
+       if (rc)
                goto out;
-       if (!spufs_dump_seek(file, roundup((unsigned long)file->f_pos, 4)))
+
+       rc = spufs_dump_align(file, buf, roundup(*foffset, 4), foffset);
+       if (rc)
                goto out;
 
        do {
-               rc = do_coredump_read(i, ctx, buf, bufsz, &pos);
-               if (rc > 0) {
-                       if (!spufs_dump_write(file, buf, rc))
+               nread = do_coredump_read(i, ctx, buf, bufsz, &pos);
+               if (nread > 0) {
+                       rc = spufs_dump_write(file, buf, nread, foffset);
+                       if (rc)
                                goto out;
-                       total += rc;
+                       total += nread;
                }
-       } while (rc == bufsz && total < sz);
+       } while (nread == bufsz && total < sz);
+
+       if (nread < 0) {
+               rc = nread;
+               goto out;
+       }
+
+       rc = spufs_dump_align(file, buf, roundup(*foffset - total + sz, 4),
+                             foffset);
 
-       spufs_dump_seek(file, roundup((unsigned long)file->f_pos
-                                               - total + sz, 4));
 out:
        free_page((unsigned long)buf);
+       return rc;
 }
 
-static void spufs_arch_write_notes(struct file *file)
+int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset)
 {
-       int j;
-       struct spufs_ctx_info *ctx_info, *next;
-
-       list_for_each_entry_safe(ctx_info, next, &ctx_info_list, list) {
-               spu_acquire_saved(ctx_info->ctx);
-               for (j = 0; j < spufs_coredump_num_notes; j++)
-                       spufs_arch_write_note(ctx_info, j, file);
-               spu_release_saved(ctx_info->ctx);
-               list_del(&ctx_info->list);
-               kfree(ctx_info);
+       struct spu_context *ctx;
+       int fd, j, rc;
+
+       fd = 0;
+       while ((ctx = coredump_next_context(&fd)) != NULL) {
+               spu_acquire_saved(ctx);
+
+               for (j = 0; spufs_coredump_read[j].name != NULL; j++) {
+                       rc = spufs_arch_write_note(ctx, j, file, fd, foffset);
+                       if (rc) {
+                               spu_release_saved(ctx);
+                               return rc;
+                       }
+               }
+
+               spu_release_saved(ctx);
        }
-}
 
-struct spu_coredump_calls spufs_coredump_calls = {
-       .arch_notes_size = spufs_arch_notes_size,
-       .arch_write_notes = spufs_arch_write_notes,
-       .owner = THIS_MODULE,
-};
+       return 0;
+}
index 7de4e919687b48b717bdb6001f30c088cfe49997..d72b16d6816e065b9010ff2b51afed56d0aeb289 100644 (file)
@@ -199,9 +199,9 @@ static int spufs_mem_mmap(struct file *file, struct vm_area_struct *vma)
 }
 
 #ifdef CONFIG_SPU_FS_64K_LS
-unsigned long spufs_get_unmapped_area(struct file *file, unsigned long addr,
-                                     unsigned long len, unsigned long pgoff,
-                                     unsigned long flags)
+static unsigned long spufs_get_unmapped_area(struct file *file,
+               unsigned long addr, unsigned long len, unsigned long pgoff,
+               unsigned long flags)
 {
        struct spu_context      *ctx = file->private_data;
        struct spu_state        *csa = &ctx->csa;
@@ -1076,6 +1076,36 @@ static const struct file_operations spufs_signal2_nosched_fops = {
        .mmap = spufs_signal2_mmap,
 };
 
+/*
+ * This is a wrapper around DEFINE_SIMPLE_ATTRIBUTE which does the
+ * work of acquiring (or not) the SPU context before calling through
+ * to the actual get routine. The set routine is called directly.
+ */
+#define SPU_ATTR_NOACQUIRE     0
+#define SPU_ATTR_ACQUIRE       1
+#define SPU_ATTR_ACQUIRE_SAVED 2
+
+#define DEFINE_SPUFS_ATTRIBUTE(__name, __get, __set, __fmt, __acquire) \
+static u64 __##__get(void *data)                                       \
+{                                                                      \
+       struct spu_context *ctx = data;                                 \
+       u64 ret;                                                        \
+                                                                       \
+       if (__acquire == SPU_ATTR_ACQUIRE) {                            \
+               spu_acquire(ctx);                                       \
+               ret = __get(ctx);                                       \
+               spu_release(ctx);                                       \
+       } else if (__acquire == SPU_ATTR_ACQUIRE_SAVED) {               \
+               spu_acquire_saved(ctx);                                 \
+               ret = __get(ctx);                                       \
+               spu_release_saved(ctx);                                 \
+       } else                                                          \
+               ret = __get(ctx);                                       \
+                                                                       \
+       return ret;                                                     \
+}                                                                      \
+DEFINE_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
+
 static void spufs_signal1_type_set(void *data, u64 val)
 {
        struct spu_context *ctx = data;
@@ -1085,25 +1115,13 @@ static void spufs_signal1_type_set(void *data, u64 val)
        spu_release(ctx);
 }
 
-static u64 __spufs_signal1_type_get(void *data)
+static u64 spufs_signal1_type_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        return ctx->ops->signal1_type_get(ctx);
 }
+DEFINE_SPUFS_ATTRIBUTE(spufs_signal1_type, spufs_signal1_type_get,
+                      spufs_signal1_type_set, "%llu", SPU_ATTR_ACQUIRE);
 
-static u64 spufs_signal1_type_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret;
-
-       spu_acquire(ctx);
-       ret = __spufs_signal1_type_get(data);
-       spu_release(ctx);
-
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_signal1_type, spufs_signal1_type_get,
-                                       spufs_signal1_type_set, "%llu");
 
 static void spufs_signal2_type_set(void *data, u64 val)
 {
@@ -1114,25 +1132,12 @@ static void spufs_signal2_type_set(void *data, u64 val)
        spu_release(ctx);
 }
 
-static u64 __spufs_signal2_type_get(void *data)
+static u64 spufs_signal2_type_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        return ctx->ops->signal2_type_get(ctx);
 }
-
-static u64 spufs_signal2_type_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret;
-
-       spu_acquire(ctx);
-       ret = __spufs_signal2_type_get(data);
-       spu_release(ctx);
-
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get,
-                                       spufs_signal2_type_set, "%llu");
+DEFINE_SPUFS_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get,
+                      spufs_signal2_type_set, "%llu", SPU_ATTR_ACQUIRE);
 
 #if SPUFS_MMAP_4K
 static unsigned long spufs_mss_mmap_nopfn(struct vm_area_struct *vma,
@@ -1608,17 +1613,12 @@ static void spufs_npc_set(void *data, u64 val)
        spu_release(ctx);
 }
 
-static u64 spufs_npc_get(void *data)
+static u64 spufs_npc_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
-       u64 ret;
-       spu_acquire(ctx);
-       ret = ctx->ops->npc_read(ctx);
-       spu_release(ctx);
-       return ret;
+       return ctx->ops->npc_read(ctx);
 }
-DEFINE_SIMPLE_ATTRIBUTE(spufs_npc_ops, spufs_npc_get, spufs_npc_set,
-                       "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_npc_ops, spufs_npc_get, spufs_npc_set,
+                      "0x%llx\n", SPU_ATTR_ACQUIRE);
 
 static void spufs_decr_set(void *data, u64 val)
 {
@@ -1629,24 +1629,13 @@ static void spufs_decr_set(void *data, u64 val)
        spu_release_saved(ctx);
 }
 
-static u64 __spufs_decr_get(void *data)
+static u64 spufs_decr_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        struct spu_lscsa *lscsa = ctx->csa.lscsa;
        return lscsa->decr.slot[0];
 }
-
-static u64 spufs_decr_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret;
-       spu_acquire_saved(ctx);
-       ret = __spufs_decr_get(data);
-       spu_release_saved(ctx);
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_decr_ops, spufs_decr_get, spufs_decr_set,
-                       "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_decr_ops, spufs_decr_get, spufs_decr_set,
+                      "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED);
 
 static void spufs_decr_status_set(void *data, u64 val)
 {
@@ -1659,26 +1648,16 @@ static void spufs_decr_status_set(void *data, u64 val)
        spu_release_saved(ctx);
 }
 
-static u64 __spufs_decr_status_get(void *data)
+static u64 spufs_decr_status_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        if (ctx->csa.priv2.mfc_control_RW & MFC_CNTL_DECREMENTER_RUNNING)
                return SPU_DECR_STATUS_RUNNING;
        else
                return 0;
 }
-
-static u64 spufs_decr_status_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret;
-       spu_acquire_saved(ctx);
-       ret = __spufs_decr_status_get(data);
-       spu_release_saved(ctx);
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_decr_status_ops, spufs_decr_status_get,
-                       spufs_decr_status_set, "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_decr_status_ops, spufs_decr_status_get,
+                      spufs_decr_status_set, "0x%llx\n",
+                      SPU_ATTR_ACQUIRE_SAVED);
 
 static void spufs_event_mask_set(void *data, u64 val)
 {
@@ -1689,28 +1668,18 @@ static void spufs_event_mask_set(void *data, u64 val)
        spu_release_saved(ctx);
 }
 
-static u64 __spufs_event_mask_get(void *data)
+static u64 spufs_event_mask_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        struct spu_lscsa *lscsa = ctx->csa.lscsa;
        return lscsa->event_mask.slot[0];
 }
 
-static u64 spufs_event_mask_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret;
-       spu_acquire_saved(ctx);
-       ret = __spufs_event_mask_get(data);
-       spu_release_saved(ctx);
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_event_mask_ops, spufs_event_mask_get,
-                       spufs_event_mask_set, "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_event_mask_ops, spufs_event_mask_get,
+                      spufs_event_mask_set, "0x%llx\n",
+                      SPU_ATTR_ACQUIRE_SAVED);
 
-static u64 __spufs_event_status_get(void *data)
+static u64 spufs_event_status_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        struct spu_state *state = &ctx->csa;
        u64 stat;
        stat = state->spu_chnlcnt_RW[0];
@@ -1718,19 +1687,8 @@ static u64 __spufs_event_status_get(void *data)
                return state->spu_chnldata_RW[0];
        return 0;
 }
-
-static u64 spufs_event_status_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret = 0;
-
-       spu_acquire_saved(ctx);
-       ret = __spufs_event_status_get(data);
-       spu_release_saved(ctx);
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_event_status_ops, spufs_event_status_get,
-                       NULL, "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_event_status_ops, spufs_event_status_get,
+                      NULL, "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED)
 
 static void spufs_srr0_set(void *data, u64 val)
 {
@@ -1741,45 +1699,32 @@ static void spufs_srr0_set(void *data, u64 val)
        spu_release_saved(ctx);
 }
 
-static u64 spufs_srr0_get(void *data)
+static u64 spufs_srr0_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        struct spu_lscsa *lscsa = ctx->csa.lscsa;
-       u64 ret;
-       spu_acquire_saved(ctx);
-       ret = lscsa->srr0.slot[0];
-       spu_release_saved(ctx);
-       return ret;
+       return lscsa->srr0.slot[0];
 }
-DEFINE_SIMPLE_ATTRIBUTE(spufs_srr0_ops, spufs_srr0_get, spufs_srr0_set,
-                       "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_srr0_ops, spufs_srr0_get, spufs_srr0_set,
+                      "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED)
 
-static u64 spufs_id_get(void *data)
+static u64 spufs_id_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        u64 num;
 
-       spu_acquire(ctx);
        if (ctx->state == SPU_STATE_RUNNABLE)
                num = ctx->spu->number;
        else
                num = (unsigned int)-1;
-       spu_release(ctx);
 
        return num;
 }
-DEFINE_SIMPLE_ATTRIBUTE(spufs_id_ops, spufs_id_get, NULL, "0x%llx\n")
-
-static u64 __spufs_object_id_get(void *data)
-{
-       struct spu_context *ctx = data;
-       return ctx->object_id;
-}
+DEFINE_SPUFS_ATTRIBUTE(spufs_id_ops, spufs_id_get, NULL, "0x%llx\n",
+                      SPU_ATTR_ACQUIRE)
 
-static u64 spufs_object_id_get(void *data)
+static u64 spufs_object_id_get(struct spu_context *ctx)
 {
        /* FIXME: Should there really be no locking here? */
-       return __spufs_object_id_get(data);
+       return ctx->object_id;
 }
 
 static void spufs_object_id_set(void *data, u64 id)
@@ -1788,27 +1733,15 @@ static void spufs_object_id_set(void *data, u64 id)
        ctx->object_id = id;
 }
 
-DEFINE_SIMPLE_ATTRIBUTE(spufs_object_id_ops, spufs_object_id_get,
-               spufs_object_id_set, "0x%llx\n");
+DEFINE_SPUFS_ATTRIBUTE(spufs_object_id_ops, spufs_object_id_get,
+                      spufs_object_id_set, "0x%llx\n", SPU_ATTR_NOACQUIRE);
 
-static u64 __spufs_lslr_get(void *data)
+static u64 spufs_lslr_get(struct spu_context *ctx)
 {
-       struct spu_context *ctx = data;
        return ctx->csa.priv2.spu_lslr_RW;
 }
-
-static u64 spufs_lslr_get(void *data)
-{
-       struct spu_context *ctx = data;
-       u64 ret;
-
-       spu_acquire_saved(ctx);
-       ret = __spufs_lslr_get(data);
-       spu_release_saved(ctx);
-
-       return ret;
-}
-DEFINE_SIMPLE_ATTRIBUTE(spufs_lslr_ops, spufs_lslr_get, NULL, "0x%llx\n")
+DEFINE_SPUFS_ATTRIBUTE(spufs_lslr_ops, spufs_lslr_get, NULL, "0x%llx\n",
+                      SPU_ATTR_ACQUIRE_SAVED);
 
 static int spufs_info_open(struct inode *inode, struct file *file)
 {
@@ -2231,25 +2164,25 @@ struct tree_descr spufs_dir_nosched_contents[] = {
 };
 
 struct spufs_coredump_reader spufs_coredump_read[] = {
-       { "regs", __spufs_regs_read, NULL, 128 * 16 },
-       { "fpcr", __spufs_fpcr_read, NULL, 16 },
-       { "lslr", NULL, __spufs_lslr_get, 11 },
-       { "decr", NULL, __spufs_decr_get, 11 },
-       { "decr_status", NULL, __spufs_decr_status_get, 11 },
-       { "mem", __spufs_mem_read, NULL, 256 * 1024, },
-       { "signal1", __spufs_signal1_read, NULL, 4 },
-       { "signal1_type", NULL, __spufs_signal1_type_get, 2 },
-       { "signal2", __spufs_signal2_read, NULL, 4 },
-       { "signal2_type", NULL, __spufs_signal2_type_get, 2 },
-       { "event_mask", NULL, __spufs_event_mask_get, 8 },
-       { "event_status", NULL, __spufs_event_status_get, 8 },
-       { "mbox_info", __spufs_mbox_info_read, NULL, 4 },
-       { "ibox_info", __spufs_ibox_info_read, NULL, 4 },
-       { "wbox_info", __spufs_wbox_info_read, NULL, 16 },
-       { "dma_info", __spufs_dma_info_read, NULL, 69 * 8 },
-       { "proxydma_info", __spufs_proxydma_info_read, NULL, 35 * 8 },
-       { "object-id", NULL, __spufs_object_id_get, 19 },
-       { },
+       { "regs", __spufs_regs_read, NULL, sizeof(struct spu_reg128[128])},
+       { "fpcr", __spufs_fpcr_read, NULL, sizeof(struct spu_reg128) },
+       { "lslr", NULL, spufs_lslr_get, 19 },
+       { "decr", NULL, spufs_decr_get, 19 },
+       { "decr_status", NULL, spufs_decr_status_get, 19 },
+       { "mem", __spufs_mem_read, NULL, LS_SIZE, },
+       { "signal1", __spufs_signal1_read, NULL, sizeof(u32) },
+       { "signal1_type", NULL, spufs_signal1_type_get, 19 },
+       { "signal2", __spufs_signal2_read, NULL, sizeof(u32) },
+       { "signal2_type", NULL, spufs_signal2_type_get, 19 },
+       { "event_mask", NULL, spufs_event_mask_get, 19 },
+       { "event_status", NULL, spufs_event_status_get, 19 },
+       { "mbox_info", __spufs_mbox_info_read, NULL, sizeof(u32) },
+       { "ibox_info", __spufs_ibox_info_read, NULL, sizeof(u32) },
+       { "wbox_info", __spufs_wbox_info_read, NULL, 4 * sizeof(u32)},
+       { "dma_info", __spufs_dma_info_read, NULL, sizeof(struct spu_dma_info)},
+       { "proxydma_info", __spufs_proxydma_info_read,
+                          NULL, sizeof(struct spu_proxydma_info)},
+       { "object-id", NULL, spufs_object_id_get, 19 },
+       { "npc", NULL, spufs_npc_get, 19 },
+       { NULL },
 };
-int spufs_coredump_num_notes = ARRAY_SIZE(spufs_coredump_read) - 1;
-
index b3d0dd118dd0ededd97d842e7ab9db1408bda23e..11098747d09b42445d090423f04e82e44025be28 100644 (file)
@@ -43,6 +43,7 @@
 
 static struct kmem_cache *spufs_inode_cache;
 char *isolated_loader;
+static int isolated_loader_size;
 
 static struct inode *
 spufs_alloc_inode(struct super_block *sb)
@@ -667,7 +668,8 @@ spufs_parse_options(char *options, struct inode *root)
 
 static void spufs_exit_isolated_loader(void)
 {
-       kfree(isolated_loader);
+       free_pages((unsigned long) isolated_loader,
+                       get_order(isolated_loader_size));
 }
 
 static void
@@ -685,11 +687,12 @@ spufs_init_isolated_loader(void)
        if (!loader)
                return;
 
-       /* kmalloc should align on a 16 byte boundary..* */
-       isolated_loader = kmalloc(size, GFP_KERNEL);
+       /* the loader must be align on a 16 byte boundary */
+       isolated_loader = (char *)__get_free_pages(GFP_KERNEL, get_order(size));
        if (!isolated_loader)
                return;
 
+       isolated_loader_size = size;
        memcpy(isolated_loader, loader, size);
        printk(KERN_INFO "spufs: SPU isolation mode enabled\n");
 }
@@ -787,16 +790,11 @@ static int __init spufs_init(void)
        ret = register_spu_syscalls(&spufs_calls);
        if (ret)
                goto out_fs;
-       ret = register_arch_coredump_calls(&spufs_coredump_calls);
-       if (ret)
-               goto out_syscalls;
 
        spufs_init_isolated_loader();
 
        return 0;
 
-out_syscalls:
-       unregister_spu_syscalls(&spufs_calls);
 out_fs:
        unregister_filesystem(&spufs_type);
 out_sched:
@@ -812,7 +810,6 @@ static void __exit spufs_exit(void)
 {
        spu_sched_exit();
        spufs_exit_isolated_loader();
-       unregister_arch_coredump_calls(&spufs_coredump_calls);
        unregister_spu_syscalls(&spufs_calls);
        unregister_filesystem(&spufs_type);
        kmem_cache_destroy(spufs_inode_cache);
index 958f10e90fddf5260ba7fef36fa160f97ba0de79..1ce5e22ea5f44cfbb093b1167c4a01b60bba5e0d 100644 (file)
@@ -205,7 +205,7 @@ static int spu_reacquire_runnable(struct spu_context *ctx, u32 *npc,
  * This means we can only do a very rough approximation of POSIX
  * signal semantics.
  */
-int spu_handle_restartsys(struct spu_context *ctx, long *spu_ret,
+static int spu_handle_restartsys(struct spu_context *ctx, long *spu_ret,
                          unsigned int *npc)
 {
        int ret;
@@ -241,7 +241,7 @@ int spu_handle_restartsys(struct spu_context *ctx, long *spu_ret,
        return ret;
 }
 
-int spu_process_callback(struct spu_context *ctx)
+static int spu_process_callback(struct spu_context *ctx)
 {
        struct spu_syscall_block s;
        u32 ls_pointer, npc;
index 5bebe7fbe056de17a39a8b78d419f67580735f74..4d257b3f93364bc34b667d836153451e0e2161e4 100644 (file)
@@ -230,8 +230,6 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
 
        if (ctx->flags & SPU_CREATE_NOSCHED)
                atomic_inc(&cbe_spu_info[spu->node].reserved_spus);
-       if (!list_empty(&ctx->aff_list))
-               atomic_inc(&ctx->gang->aff_sched_count);
 
        ctx->stats.slb_flt_base = spu->stats.slb_flt;
        ctx->stats.class2_intr_base = spu->stats.class2_intr;
@@ -392,7 +390,6 @@ static int has_affinity(struct spu_context *ctx)
        if (list_empty(&ctx->aff_list))
                return 0;
 
-       mutex_lock(&gang->aff_mutex);
        if (!gang->aff_ref_spu) {
                if (!(gang->aff_flags & AFF_MERGED))
                        aff_merge_remaining_ctxs(gang);
@@ -400,7 +397,6 @@ static int has_affinity(struct spu_context *ctx)
                        aff_set_offsets(gang);
                aff_set_ref_point_location(gang);
        }
-       mutex_unlock(&gang->aff_mutex);
 
        return gang->aff_ref_spu != NULL;
 }
@@ -418,9 +414,16 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
 
        if (spu->ctx->flags & SPU_CREATE_NOSCHED)
                atomic_dec(&cbe_spu_info[spu->node].reserved_spus);
-       if (!list_empty(&ctx->aff_list))
-               if (atomic_dec_and_test(&ctx->gang->aff_sched_count))
-                       ctx->gang->aff_ref_spu = NULL;
+
+       if (ctx->gang){
+               mutex_lock(&ctx->gang->aff_mutex);
+               if (has_affinity(ctx)) {
+                       if (atomic_dec_and_test(&ctx->gang->aff_sched_count))
+                               ctx->gang->aff_ref_spu = NULL;
+               }
+               mutex_unlock(&ctx->gang->aff_mutex);
+       }
+
        spu_switch_notify(spu, NULL);
        spu_unmap_mappings(ctx);
        spu_save(&ctx->csa, spu);
@@ -511,20 +514,32 @@ static void spu_prio_wait(struct spu_context *ctx)
 
 static struct spu *spu_get_idle(struct spu_context *ctx)
 {
-       struct spu *spu;
+       struct spu *spu, *aff_ref_spu;
        int node, n;
 
-       if (has_affinity(ctx)) {
-               node = ctx->gang->aff_ref_spu->node;
+       if (ctx->gang) {
+               mutex_lock(&ctx->gang->aff_mutex);
+               if (has_affinity(ctx)) {
+                       aff_ref_spu = ctx->gang->aff_ref_spu;
+                       atomic_inc(&ctx->gang->aff_sched_count);
+                       mutex_unlock(&ctx->gang->aff_mutex);
+                       node = aff_ref_spu->node;
 
-               mutex_lock(&cbe_spu_info[node].list_mutex);
-               spu = ctx_location(ctx->gang->aff_ref_spu, ctx->aff_offset, node);
-               if (spu && spu->alloc_state == SPU_FREE)
-                       goto found;
-               mutex_unlock(&cbe_spu_info[node].list_mutex);
-               return NULL;
-       }
+                       mutex_lock(&cbe_spu_info[node].list_mutex);
+                       spu = ctx_location(aff_ref_spu, ctx->aff_offset, node);
+                       if (spu && spu->alloc_state == SPU_FREE)
+                               goto found;
+                       mutex_unlock(&cbe_spu_info[node].list_mutex);
 
+                       mutex_lock(&ctx->gang->aff_mutex);
+                       if (atomic_dec_and_test(&ctx->gang->aff_sched_count))
+                               ctx->gang->aff_ref_spu = NULL;
+                       mutex_unlock(&ctx->gang->aff_mutex);
+
+                       return NULL;
+               }
+               mutex_unlock(&ctx->gang->aff_mutex);
+       }
        node = cpu_to_node(raw_smp_processor_id());
        for (n = 0; n < MAX_NUMNODES; n++, node++) {
                node = (node < MAX_NUMNODES) ? node : 0;
index 2bfdeb8ea8bd0ab028d1f472046c643bfe7c3fc4..ca47b991bda5e3dd639d8b40b5dccf47d4a1557e 100644 (file)
@@ -200,9 +200,14 @@ extern struct tree_descr spufs_dir_contents[];
 extern struct tree_descr spufs_dir_nosched_contents[];
 
 /* system call implementation */
+extern struct spufs_calls spufs_calls;
 long spufs_run_spu(struct spu_context *ctx, u32 *npc, u32 *status);
 long spufs_create(struct nameidata *nd, unsigned int flags,
                        mode_t mode, struct file *filp);
+/* ELF coredump callbacks for writing SPU ELF notes */
+extern int spufs_coredump_extra_notes_size(void);
+extern int spufs_coredump_extra_notes_write(struct file *file, loff_t *foffset);
+
 extern const struct file_operations spufs_context_fops;
 
 /* gang management */
@@ -295,7 +300,7 @@ struct spufs_coredump_reader {
        char *name;
        ssize_t (*read)(struct spu_context *ctx,
                        char __user *buffer, size_t size, loff_t *pos);
-       u64 (*get)(void *data);
+       u64 (*get)(struct spu_context *ctx);
        size_t size;
 };
 extern struct spufs_coredump_reader spufs_coredump_read[];
index 27ffdae98e5af3cc5b6420aa926f11293e4d32f9..3d64c81cc6e2bc05bb0a0b0b41a71d7c6805830b 100644 (file)
@@ -699,7 +699,7 @@ static inline void get_kernel_slb(u64 ea, u64 slb[2])
                llp = mmu_psize_defs[mmu_linear_psize].sllp;
        else
                llp = mmu_psize_defs[mmu_virtual_psize].sllp;
-       slb[0] = (get_kernel_vsid(ea) << SLB_VSID_SHIFT) |
+       slb[0] = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
                SLB_VSID_KERNEL | llp;
        slb[1] = (ea & ESID_MASK) | SLB_ESID_V;
 }
@@ -1559,15 +1559,15 @@ static inline void restore_decr_wrapped(struct spu_state *csa, struct spu *spu)
         *     "wrapped" flag is set, OR in a '1' to
         *     CSA.SPU_Event_Status[Tm].
         */
-       if (csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED) {
-               csa->spu_chnldata_RW[0] |= 0x20;
-       }
-       if ((csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED) &&
-           (csa->spu_chnlcnt_RW[0] == 0 &&
-            ((csa->spu_chnldata_RW[2] & 0x20) == 0x0) &&
-            ((csa->spu_chnldata_RW[0] & 0x20) != 0x1))) {
+       if (!(csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED))
+               return;
+
+       if ((csa->spu_chnlcnt_RW[0] == 0) &&
+           (csa->spu_chnldata_RW[1] & 0x20) &&
+           !(csa->spu_chnldata_RW[0] & 0x20))
                csa->spu_chnlcnt_RW[0] = 1;
-       }
+
+       csa->spu_chnldata_RW[0] |= 0x20;
 }
 
 static inline void restore_ch_part1(struct spu_state *csa, struct spu *spu)
@@ -2146,19 +2146,6 @@ int spu_restore(struct spu_state *new, struct spu *spu)
 }
 EXPORT_SYMBOL_GPL(spu_restore);
 
-/**
- * spu_harvest - SPU harvest (reset) operation
- * @spu: pointer to SPU iomem structure.
- *
- * Perform SPU harvest (reset) operation.
- */
-void spu_harvest(struct spu *spu)
-{
-       acquire_spu_lock(spu);
-       harvest(NULL, spu);
-       release_spu_lock(spu);
-}
-
 static void init_prob(struct spu_state *csa)
 {
        csa->spu_chnlcnt_RW[9] = 1;
index 43f0fb88abbc0812117e44758aec94883a70d31a..2c34f717019033c6e568d4db0dc9828d47c936cb 100644 (file)
@@ -58,26 +58,8 @@ out:
        return ret;
 }
 
-#ifndef MODULE
-asmlinkage long sys_spu_run(int fd, __u32 __user *unpc, __u32 __user *ustatus)
-{
-       int fput_needed;
-       struct file *filp;
-       long ret;
-
-       ret = -EBADF;
-       filp = fget_light(fd, &fput_needed);
-       if (filp) {
-               ret = do_spu_run(filp, unpc, ustatus);
-               fput_light(filp, fput_needed);
-       }
-
-       return ret;
-}
-#endif
-
-asmlinkage long do_spu_create(const char __user *pathname, unsigned int flags,
-                               mode_t mode, struct file *neighbor)
+static long do_spu_create(const char __user *pathname, unsigned int flags,
+               mode_t mode, struct file *neighbor)
 {
        char *tmp;
        int ret;
@@ -99,32 +81,10 @@ asmlinkage long do_spu_create(const char __user *pathname, unsigned int flags,
        return ret;
 }
 
-#ifndef MODULE
-asmlinkage long sys_spu_create(const char __user *pathname, unsigned int flags,
-                               mode_t mode, int neighbor_fd)
-{
-       int fput_needed;
-       struct file *neighbor;
-       long ret;
-
-       if (flags & SPU_CREATE_AFFINITY_SPU) {
-               ret = -EBADF;
-               neighbor = fget_light(neighbor_fd, &fput_needed);
-               if (neighbor) {
-                       ret = do_spu_create(pathname, flags, mode, neighbor);
-                       fput_light(neighbor, fput_needed);
-               }
-       }
-       else {
-               ret = do_spu_create(pathname, flags, mode, NULL);
-       }
-
-       return ret;
-}
-#endif
-
 struct spufs_calls spufs_calls = {
        .create_thread = do_spu_create,
        .spu_run = do_spu_run,
+       .coredump_extra_notes_size = spufs_coredump_extra_notes_size,
+       .coredump_extra_notes_write = spufs_coredump_extra_notes_write,
        .owner = THIS_MODULE,
 };
index 2db1e293433edf4d742543d25ede4382557cae05..04748d410fc99c782f8fc0a33a8024c1b82b2196 100644 (file)
@@ -2,6 +2,7 @@ config PPC_CELLEB
        bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
        depends on PPC_MULTIPLATFORM && PPC64
        select PPC_CELL
+       select PPC_INDIRECT_IO
        select PPC_OF_PLATFORM_PCI
        select HAS_TXX9_SERIAL
        select PPC_UDBG_BEAT
index 5240046d86715275156d7adf6b41434f28b1155a..889d43f715ea85d3b63ea9d46aeaa207ea805353 100644 (file)
@@ -1,6 +1,7 @@
 obj-y                          += interrupt.o iommu.o setup.o \
-                                  htab.o beat.o pci.o \
-                                  scc_epci.o scc_uhc.o hvCall.o
+                                  htab.o beat.o hvCall.o pci.o \
+                                  scc_epci.o scc_uhc.o \
+                                  io-workarounds.o
 
 obj-$(CONFIG_SMP)              += smp.o
 obj-$(CONFIG_PPC_UDBG_BEAT)    += udbg_beat.o
index 99341ce8a6978cdcad8dd309fd277e677cd29732..93ebb7d85120fe7172f83c67e717410b61f92fdd 100644 (file)
 #include <linux/init.h>
 #include <linux/err.h>
 #include <linux/rtc.h>
+#include <linux/interrupt.h>
+#include <linux/irqreturn.h>
+#include <linux/reboot.h>
 
 #include <asm/hvconsole.h>
 #include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/firmware.h>
 
 #include "beat_wrapper.h"
 #include "beat.h"
+#include "interrupt.h"
+
+static int beat_pm_poweroff_flag;
 
 void beat_restart(char *cmd)
 {
-       beat_shutdown_logical_partition(1);
+       beat_shutdown_logical_partition(!beat_pm_poweroff_flag);
 }
 
 void beat_power_off(void)
@@ -158,6 +166,102 @@ int64_t beat_put_term_char(u64 vterm, u64 len, u64 t1, u64 t2)
        return beat_put_characters_to_console(vterm, len, (u8*)db);
 }
 
+void beat_power_save(void)
+{
+       beat_pause(0);
+}
+
+#ifdef CONFIG_KEXEC
+void beat_kexec_cpu_down(int crash, int secondary)
+{
+       beatic_deinit_IRQ();
+}
+#endif
+
+static irqreturn_t beat_power_event(int virq, void *arg)
+{
+       printk(KERN_DEBUG "Beat: power button pressed\n");
+       beat_pm_poweroff_flag = 1;
+       ctrl_alt_del();
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t beat_reset_event(int virq, void *arg)
+{
+       printk(KERN_DEBUG "Beat: reset button pressed\n");
+       beat_pm_poweroff_flag = 0;
+       ctrl_alt_del();
+       return IRQ_HANDLED;
+}
+
+static struct beat_event_list {
+       const char *typecode;
+       irq_handler_t handler;
+       unsigned int virq;
+} beat_event_list[] = {
+       { "power", beat_power_event, 0 },
+       { "reset", beat_reset_event, 0 },
+};
+
+static int __init beat_register_event(void)
+{
+       u64 path[4], data[2];
+       int rc, i;
+       unsigned int virq;
+
+       for (i = 0; i < ARRAY_SIZE(beat_event_list); i++) {
+               struct beat_event_list *ev = &beat_event_list[i];
+
+               if (beat_construct_event_receive_port(data) != 0) {
+                       printk(KERN_ERR "Beat: "
+                              "cannot construct event receive port for %s\n",
+                              ev->typecode);
+                       return -EINVAL;
+               }
+
+               virq = irq_create_mapping(NULL, data[0]);
+               if (virq == NO_IRQ) {
+                       printk(KERN_ERR "Beat: failed to get virtual IRQ"
+                              " for event receive port for %s\n",
+                              ev->typecode);
+                       beat_destruct_event_receive_port(data[0]);
+                       return -EIO;
+               }
+               ev->virq = virq;
+
+               rc = request_irq(virq, ev->handler, IRQF_DISABLED,
+                                     ev->typecode, NULL);
+               if (rc != 0) {
+                       printk(KERN_ERR "Beat: failed to request virtual IRQ"
+                              " for event receive port for %s\n",
+                              ev->typecode);
+                       beat_destruct_event_receive_port(data[0]);
+                       return rc;
+               }
+
+               path[0] = 0x1000000065780000ul; /* 1,ex */
+               path[1] = 0x627574746f6e0000ul; /* button */
+               path[2] = 0;
+               strncpy((char *)&path[2], ev->typecode, 8);
+               path[3] = 0;
+               data[1] = 0;
+
+               beat_create_repository_node(path, data);
+       }
+       return 0;
+}
+
+static int __init beat_event_init(void)
+{
+       if (!firmware_has_feature(FW_FEATURE_BEAT))
+               return -EINVAL;
+
+       beat_pm_poweroff_flag = 0;
+       return beat_register_event();
+}
+
+device_initcall(beat_event_init);
+
 EXPORT_SYMBOL(beat_get_term_char);
 EXPORT_SYMBOL(beat_put_term_char);
 EXPORT_SYMBOL(beat_halt_code);
index 2b16bf3bee893cd198aae9637c2f39b984a820e2..b2e292df13ca25792b283bc7655bce2c9486e72f 100644 (file)
@@ -36,5 +36,7 @@ ssize_t beat_nvram_get_size(void);
 ssize_t beat_nvram_read(char *, size_t, loff_t *);
 ssize_t beat_nvram_write(char *, size_t, loff_t *);
 int beat_set_xdabr(unsigned long);
+void beat_power_save(void);
+void beat_kexec_cpu_down(int, int);
 
 #endif /* _CELLEB_BEAT_H */
index 14e16974773faf026df3688a30e5261f1052b9ef..8580dc7e1798dc6a0dd8c14124bf7159167d6057 100644 (file)
 #define HV_rtc_write __BEAT_ADD_VENDOR_ID(0x191, 1)
 #define HV_eeprom_read __BEAT_ADD_VENDOR_ID(0x192, 1)
 #define HV_eeprom_write __BEAT_ADD_VENDOR_ID(0x193, 1)
+#define HV_insert_htab_entry3 __BEAT_ADD_VENDOR_ID(0x104, 1)
+#define HV_invalidate_htab_entry3 __BEAT_ADD_VENDOR_ID(0x105, 1)
+#define HV_update_htab_permission3 __BEAT_ADD_VENDOR_ID(0x106, 1)
+#define HV_clear_htab3 __BEAT_ADD_VENDOR_ID(0x107, 1)
 #endif
index 76ea0a6a90118802785e10b9b571e3f30f9b47f9..cbc1487df7def6cbb44d62d29462757eae35163f 100644 (file)
@@ -98,6 +98,37 @@ static inline s64 beat_write_htab_entry(u64 htab_id, u64 slot,
        return ret;
 }
 
+static inline s64 beat_insert_htab_entry3(u64 htab_id, u64 group,
+       u64 hpte_v, u64 hpte_r, u64 mask_v, u64 value_v, u64 *slot)
+{
+       u64 dummy[1];
+       s64 ret;
+
+       ret = beat_hcall1(HV_insert_htab_entry3, dummy, htab_id, group,
+               hpte_v, hpte_r, mask_v, value_v);
+       *slot = dummy[0];
+       return ret;
+}
+
+static inline s64 beat_invalidate_htab_entry3(u64 htab_id, u64 group,
+       u64 va, u64 pss)
+{
+       return beat_hcall_norets(HV_invalidate_htab_entry3,
+               htab_id, group, va, pss);
+}
+
+static inline s64 beat_update_htab_permission3(u64 htab_id, u64 group,
+       u64 va, u64 pss, u64 ptel_mask, u64 ptel_value)
+{
+       return beat_hcall_norets(HV_update_htab_permission3,
+               htab_id, group, va, pss, ptel_mask, ptel_value);
+}
+
+static inline s64 beat_clear_htab3(u64 htab_id)
+{
+       return beat_hcall_norets(HV_clear_htab3, htab_id);
+}
+
 static inline void beat_shutdown_logical_partition(u64 code)
 {
        (void)beat_hcall_norets(HV_shutdown_logical_partition, code);
@@ -217,4 +248,41 @@ static inline s64 beat_put_iopte(u64 ioas_id, u64 io_addr, u64 real_addr,
                ioid, flags);
 }
 
+static inline s64 beat_construct_event_receive_port(u64 *port)
+{
+       u64 dummy[1];
+       s64 ret;
+
+       ret = beat_hcall1(HV_construct_event_receive_port, dummy);
+       *port = dummy[0];
+       return ret;
+}
+
+static inline s64 beat_destruct_event_receive_port(u64 port)
+{
+       s64 ret;
+
+       ret = beat_hcall_norets(HV_destruct_event_receive_port, port);
+       return ret;
+}
+
+static inline s64 beat_create_repository_node(u64 path[4], u64 data[2])
+{
+       s64 ret;
+
+       ret = beat_hcall_norets(HV_create_repository_node2,
+               path[0], path[1], path[2], path[3], data[0], data[1]);
+       return ret;
+}
+
+static inline s64 beat_get_repository_node_value(u64 lpid, u64 path[4],
+       u64 data[2])
+{
+       s64 ret;
+
+       ret = beat_hcall2(HV_get_repository_node_value2, data,
+               lpid, path[0], path[1], path[2], path[3]);
+       return ret;
+}
+
 #endif
index 279d7339e1701a1678babb99801373485c299fbb..fbf27c74ebda04c3b0cfecd8bebfd322836699ce 100644 (file)
@@ -90,7 +90,7 @@ static inline unsigned int beat_read_mask(unsigned hpte_group)
 static long beat_lpar_hpte_insert(unsigned long hpte_group,
                                  unsigned long va, unsigned long pa,
                                  unsigned long rflags, unsigned long vflags,
-                                 int psize)
+                                 int psize, int ssize)
 {
        unsigned long lpar_rc;
        unsigned long slot;
@@ -105,7 +105,8 @@ static long beat_lpar_hpte_insert(unsigned long hpte_group,
                        "rflags=%lx, vflags=%lx, psize=%d)\n",
                hpte_group, va, pa, rflags, vflags, psize);
 
-       hpte_v = hpte_encode_v(va, psize) | vflags | HPTE_V_VALID;
+       hpte_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M) |
+               vflags | HPTE_V_VALID;
        hpte_r = hpte_encode_r(pa, psize) | rflags;
 
        if (!(vflags & HPTE_V_BOLTED))
@@ -184,12 +185,12 @@ static void beat_lpar_hptab_clear(void)
 static long beat_lpar_hpte_updatepp(unsigned long slot,
                                    unsigned long newpp,
                                    unsigned long va,
-                                   int psize, int local)
+                                   int psize, int ssize, int local)
 {
        unsigned long lpar_rc;
        unsigned long dummy0, dummy1, want_v;
 
-       want_v = hpte_encode_v(va, psize);
+       want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);
 
        DBG_LOW("    update: "
                "avpnv=%016lx, slot=%016lx, psize: %d, newpp %016lx ... ",
@@ -225,8 +226,8 @@ static long beat_lpar_hpte_find(unsigned long va, int psize)
        long slot;
        unsigned long want_v, hpte_v;
 
-       hash = hpt_hash(va, mmu_psize_defs[psize].shift);
-       want_v = hpte_encode_v(va, psize);
+       hash = hpt_hash(va, mmu_psize_defs[psize].shift, MMU_SEGSIZE_256M);
+       want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);
 
        for (j = 0; j < 2; j++) {
                slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
@@ -251,11 +252,11 @@ static long beat_lpar_hpte_find(unsigned long va, int psize)
 
 static void beat_lpar_hpte_updateboltedpp(unsigned long newpp,
                                          unsigned long ea,
-                                         int psize)
+                                         int psize, int ssize)
 {
        unsigned long lpar_rc, slot, vsid, va, dummy0, dummy1;
 
-       vsid = get_kernel_vsid(ea);
+       vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M);
        va = (vsid << 28) | (ea & 0x0fffffff);
 
        spin_lock(&beat_htab_lock);
@@ -270,7 +271,7 @@ static void beat_lpar_hpte_updateboltedpp(unsigned long newpp,
 }
 
 static void beat_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
-                                        int psize, int local)
+                                        int psize, int ssize, int local)
 {
        unsigned long want_v;
        unsigned long lpar_rc;
@@ -279,7 +280,7 @@ static void beat_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
 
        DBG_LOW("    inval : slot=%lx, va=%016lx, psize: %d, local: %d\n",
                slot, va, psize, local);
-       want_v = hpte_encode_v(va, psize);
+       want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);
 
        spin_lock_irqsave(&beat_htab_lock, flags);
        dummy1 = beat_lpar_hpte_getword0(slot);
@@ -306,3 +307,134 @@ void __init hpte_init_beat(void)
        ppc_md.hpte_remove      = beat_lpar_hpte_remove;
        ppc_md.hpte_clear_all   = beat_lpar_hptab_clear;
 }
+
+static long beat_lpar_hpte_insert_v3(unsigned long hpte_group,
+                                 unsigned long va, unsigned long pa,
+                                 unsigned long rflags, unsigned long vflags,
+                                 int psize, int ssize)
+{
+       unsigned long lpar_rc;
+       unsigned long slot;
+       unsigned long hpte_v, hpte_r;
+
+       /* same as iseries */
+       if (vflags & HPTE_V_SECONDARY)
+               return -1;
+
+       if (!(vflags & HPTE_V_BOLTED))
+               DBG_LOW("hpte_insert(group=%lx, va=%016lx, pa=%016lx, "
+                       "rflags=%lx, vflags=%lx, psize=%d)\n",
+               hpte_group, va, pa, rflags, vflags, psize);
+
+       hpte_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M) |
+               vflags | HPTE_V_VALID;
+       hpte_r = hpte_encode_r(pa, psize) | rflags;
+
+       if (!(vflags & HPTE_V_BOLTED))
+               DBG_LOW(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r);
+
+       if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE))
+               hpte_r &= ~_PAGE_COHERENT;
+
+       /* insert into not-volted entry */
+       lpar_rc = beat_insert_htab_entry3(0, hpte_group, hpte_v, hpte_r,
+               HPTE_V_BOLTED, 0, &slot);
+       /*
+        * Since we try and ioremap PHBs we don't own, the pte insert
+        * will fail. However we must catch the failure in hash_page
+        * or we will loop forever, so return -2 in this case.
+        */
+       if (unlikely(lpar_rc != 0)) {
+               if (!(vflags & HPTE_V_BOLTED))
+                       DBG_LOW(" lpar err %lx\n", lpar_rc);
+               return -2;
+       }
+       if (!(vflags & HPTE_V_BOLTED))
+               DBG_LOW(" -> slot: %lx\n", slot);
+
+       /* We have to pass down the secondary bucket bit here as well */
+       return (slot ^ hpte_group) & 15;
+}
+
+/*
+ * NOTE: for updatepp ops we are fortunate that the linux "newpp" bits and
+ * the low 3 bits of flags happen to line up.  So no transform is needed.
+ * We can probably optimize here and assume the high bits of newpp are
+ * already zero.  For now I am paranoid.
+ */
+static long beat_lpar_hpte_updatepp_v3(unsigned long slot,
+                                   unsigned long newpp,
+                                   unsigned long va,
+                                   int psize, int ssize, int local)
+{
+       unsigned long lpar_rc;
+       unsigned long want_v;
+       unsigned long pss;
+
+       want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);
+       pss = (psize == MMU_PAGE_4K) ? -1UL : mmu_psize_defs[psize].penc;
+
+       DBG_LOW("    update: "
+               "avpnv=%016lx, slot=%016lx, psize: %d, newpp %016lx ... ",
+               want_v & HPTE_V_AVPN, slot, psize, newpp);
+
+       lpar_rc = beat_update_htab_permission3(0, slot, want_v, pss, 7, newpp);
+
+       if (lpar_rc == 0xfffffff7) {
+               DBG_LOW("not found !\n");
+               return -1;
+       }
+
+       DBG_LOW("ok\n");
+
+       BUG_ON(lpar_rc != 0);
+
+       return 0;
+}
+
+static void beat_lpar_hpte_invalidate_v3(unsigned long slot, unsigned long va,
+                                        int psize, int ssize, int local)
+{
+       unsigned long want_v;
+       unsigned long lpar_rc;
+       unsigned long pss;
+
+       DBG_LOW("    inval : slot=%lx, va=%016lx, psize: %d, local: %d\n",
+               slot, va, psize, local);
+       want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);
+       pss = (psize == MMU_PAGE_4K) ? -1UL : mmu_psize_defs[psize].penc;
+
+       lpar_rc = beat_invalidate_htab_entry3(0, slot, want_v, pss);
+
+       /* E_busy can be valid output: page may be already replaced */
+       BUG_ON(lpar_rc != 0 && lpar_rc != 0xfffffff7);
+}
+
+static int64_t _beat_lpar_hptab_clear_v3(void)
+{
+       return beat_clear_htab3(0);
+}
+
+static void beat_lpar_hptab_clear_v3(void)
+{
+       _beat_lpar_hptab_clear_v3();
+}
+
+void __init hpte_init_beat_v3(void)
+{
+       if (_beat_lpar_hptab_clear_v3() == 0) {
+               ppc_md.hpte_invalidate  = beat_lpar_hpte_invalidate_v3;
+               ppc_md.hpte_updatepp    = beat_lpar_hpte_updatepp_v3;
+               ppc_md.hpte_updateboltedpp = beat_lpar_hpte_updateboltedpp;
+               ppc_md.hpte_insert      = beat_lpar_hpte_insert_v3;
+               ppc_md.hpte_remove      = beat_lpar_hpte_remove;
+               ppc_md.hpte_clear_all   = beat_lpar_hptab_clear_v3;
+       } else {
+               ppc_md.hpte_invalidate  = beat_lpar_hpte_invalidate;
+               ppc_md.hpte_updatepp    = beat_lpar_hpte_updatepp;
+               ppc_md.hpte_updateboltedpp = beat_lpar_hpte_updateboltedpp;
+               ppc_md.hpte_insert      = beat_lpar_hpte_insert;
+               ppc_md.hpte_remove      = beat_lpar_hpte_remove;
+               ppc_md.hpte_clear_all   = beat_lpar_hptab_clear;
+       }
+}
index 98e6665681d30246c3296d28a3abbace4bba6acf..c7c68ca70c82a321b3eaba1175ab0cb22a12eb8d 100644 (file)
@@ -175,11 +175,18 @@ static int beatic_pic_host_xlate(struct irq_host *h, struct device_node *ct,
        return 0;
 }
 
+static int beatic_pic_host_match(struct irq_host *h, struct device_node *np)
+{
+       /* Match all */
+       return 1;
+}
+
 static struct irq_host_ops beatic_pic_host_ops = {
        .map = beatic_pic_host_map,
        .remap = beatic_pic_host_remap,
        .unmap = beatic_pic_host_unmap,
        .xlate = beatic_pic_host_xlate,
+       .match = beatic_pic_host_match,
 };
 
 /*
@@ -242,7 +249,7 @@ void __init beatic_init_IRQ(void)
        ppc_md.get_irq = beatic_get_irq;
 
        /* Allocate an irq host */
-       beatic_host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0,
+       beatic_host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0,
                                         &beatic_pic_host_ops,
                                         0);
        BUG_ON(beatic_host == NULL);
diff --git a/arch/powerpc/platforms/celleb/io-workarounds.c b/arch/powerpc/platforms/celleb/io-workarounds.c
new file mode 100644 (file)
index 0000000..2b91214
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * Support for Celleb io workarounds
+ *
+ * (C) Copyright 2006-2007 TOSHIBA CORPORATION
+ *
+ * This file is based to arch/powerpc/platform/cell/io-workarounds.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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#undef DEBUG
+
+#include <linux/of_device.h>
+#include <linux/irq.h>
+
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/pci-bridge.h>
+#include <asm/ppc-pci.h>
+
+#include "pci.h"
+
+#define MAX_CELLEB_PCI_BUS     4
+
+void *celleb_dummy_page_va;
+
+static struct celleb_pci_bus {
+       struct pci_controller *phb;
+       void (*dummy_read)(struct pci_controller *);
+} celleb_pci_busses[MAX_CELLEB_PCI_BUS];
+
+static int celleb_pci_count = 0;
+
+static struct celleb_pci_bus *celleb_pci_find(unsigned long vaddr,
+                                             unsigned long paddr)
+{
+       int i, j;
+       struct resource *res;
+
+       for (i = 0; i < celleb_pci_count; i++) {
+               struct celleb_pci_bus *bus = &celleb_pci_busses[i];
+               struct pci_controller *phb = bus->phb;
+               if (paddr)
+                       for (j = 0; j < 3; j++) {
+                               res = &phb->mem_resources[j];
+                               if (paddr >= res->start && paddr <= res->end)
+                                       return bus;
+                       }
+               res = &phb->io_resource;
+               if (vaddr && vaddr >= res->start && vaddr <= res->end)
+                       return bus;
+       }
+       return NULL;
+}
+
+static void celleb_io_flush(const PCI_IO_ADDR addr)
+{
+       struct celleb_pci_bus *bus;
+       int token;
+
+       token = PCI_GET_ADDR_TOKEN(addr);
+
+       if (token && token <= celleb_pci_count)
+               bus = &celleb_pci_busses[token - 1];
+       else {
+               unsigned long vaddr, paddr;
+               pte_t *ptep;
+
+               vaddr = (unsigned long)PCI_FIX_ADDR(addr);
+               if (vaddr < PHB_IO_BASE || vaddr >= PHB_IO_END)
+                       return;
+
+               ptep = find_linux_pte(init_mm.pgd, vaddr);
+               if (ptep == NULL)
+                       paddr = 0;
+               else
+                       paddr = pte_pfn(*ptep) << PAGE_SHIFT;
+               bus = celleb_pci_find(vaddr, paddr);
+
+               if (bus == NULL)
+                       return;
+       }
+
+       if (bus->dummy_read)
+               bus->dummy_read(bus->phb);
+}
+
+static u8 celleb_readb(const PCI_IO_ADDR addr)
+{
+       u8 val;
+       val = __do_readb(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static u16 celleb_readw(const PCI_IO_ADDR addr)
+{
+       u16 val;
+       val = __do_readw(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static u32 celleb_readl(const PCI_IO_ADDR addr)
+{
+       u32 val;
+       val = __do_readl(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static u64 celleb_readq(const PCI_IO_ADDR addr)
+{
+       u64 val;
+       val = __do_readq(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static u16 celleb_readw_be(const PCI_IO_ADDR addr)
+{
+       u16 val;
+       val = __do_readw_be(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static u32 celleb_readl_be(const PCI_IO_ADDR addr)
+{
+       u32 val;
+       val = __do_readl_be(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static u64 celleb_readq_be(const PCI_IO_ADDR addr)
+{
+       u64 val;
+       val = __do_readq_be(addr);
+       celleb_io_flush(addr);
+       return val;
+}
+
+static void celleb_readsb(const PCI_IO_ADDR addr,
+                         void *buf, unsigned long count)
+{
+       __do_readsb(addr, buf, count);
+       celleb_io_flush(addr);
+}
+
+static void celleb_readsw(const PCI_IO_ADDR addr,
+                         void *buf, unsigned long count)
+{
+       __do_readsw(addr, buf, count);
+       celleb_io_flush(addr);
+}
+
+static void celleb_readsl(const PCI_IO_ADDR addr,
+                         void *buf, unsigned long count)
+{
+       __do_readsl(addr, buf, count);
+       celleb_io_flush(addr);
+}
+
+static void celleb_memcpy_fromio(void *dest,
+                                const PCI_IO_ADDR src,
+                                unsigned long n)
+{
+       __do_memcpy_fromio(dest, src, n);
+       celleb_io_flush(src);
+}
+
+static void __iomem *celleb_ioremap(unsigned long addr,
+                                    unsigned long size,
+                                    unsigned long flags)
+{
+       struct celleb_pci_bus *bus;
+       void __iomem *res = __ioremap(addr, size, flags);
+       int busno;
+
+       bus = celleb_pci_find(0, addr);
+       if (bus != NULL) {
+               busno = bus - celleb_pci_busses;
+               PCI_SET_ADDR_TOKEN(res, busno + 1);
+       }
+       return res;
+}
+
+static void celleb_iounmap(volatile void __iomem *addr)
+{
+       return __iounmap(PCI_FIX_ADDR(addr));
+}
+
+static struct ppc_pci_io celleb_pci_io __initdata = {
+       .readb = celleb_readb,
+       .readw = celleb_readw,
+       .readl = celleb_readl,
+       .readq = celleb_readq,
+       .readw_be = celleb_readw_be,
+       .readl_be = celleb_readl_be,
+       .readq_be = celleb_readq_be,
+       .readsb = celleb_readsb,
+       .readsw = celleb_readsw,
+       .readsl = celleb_readsl,
+       .memcpy_fromio = celleb_memcpy_fromio,
+};
+
+void __init celleb_pci_add_one(struct pci_controller *phb,
+                              void (*dummy_read)(struct pci_controller *))
+{
+       struct celleb_pci_bus *bus = &celleb_pci_busses[celleb_pci_count];
+       struct device_node *np = phb->arch_data;
+
+       if (celleb_pci_count >= MAX_CELLEB_PCI_BUS) {
+               printk(KERN_ERR "Too many pci bridges, workarounds"
+                      " disabled for %s\n", np->full_name);
+               return;
+       }
+
+       celleb_pci_count++;
+
+       bus->phb = phb;
+       bus->dummy_read = dummy_read;
+}
+
+static struct of_device_id celleb_pci_workaround_match[] __initdata = {
+       {
+               .name = "pci-pseudo",
+               .data = fake_pci_workaround_init,
+       }, {
+               .name = "epci",
+               .data = epci_workaround_init,
+       }, {
+       },
+};
+
+int __init celleb_pci_workaround_init(void)
+{
+       struct pci_controller *phb;
+       struct device_node *node;
+       const struct  of_device_id *match;
+       void (*init_func)(struct pci_controller *);
+
+       celleb_dummy_page_va = kmalloc(PAGE_SIZE, GFP_KERNEL);
+       if (!celleb_dummy_page_va) {
+               printk(KERN_ERR "Celleb: dummy read disabled."
+                       "Alloc celleb_dummy_page_va failed\n");
+               return 1;
+       }
+
+       list_for_each_entry(phb, &hose_list, list_node) {
+               node = phb->arch_data;
+               match = of_match_node(celleb_pci_workaround_match, node);
+
+               if (match) {
+                       init_func = match->data;
+                       (*init_func)(phb);
+               }
+       }
+
+       ppc_pci_io = celleb_pci_io;
+       ppc_md.ioremap = celleb_ioremap;
+       ppc_md.iounmap = celleb_iounmap;
+
+       return 0;
+}
index e9ac19c4bba411d19f34d58aeb7ffa35c959defb..6bc32fda7a6b3e51716b2d01f40b29aaf19ad695 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/init.h>
 #include <linux/bootmem.h>
 #include <linux/pci_regs.h>
+#include <linux/of_device.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -242,8 +243,8 @@ static int celleb_fake_pci_write_config(struct pci_bus *bus,
 }
 
 static struct pci_ops celleb_fake_pci_ops = {
-       celleb_fake_pci_read_config,
-       celleb_fake_pci_write_config
+       .read = celleb_fake_pci_read_config,
+       .write = celleb_fake_pci_write_config,
 };
 
 static inline void celleb_setup_pci_base_addrs(struct pci_controller *hose,
@@ -288,8 +289,8 @@ static inline void celleb_setup_pci_base_addrs(struct pci_controller *hose,
        celleb_config_write_fake(config, PCI_COMMAND, 2, val);
 }
 
-static int __devinit celleb_setup_fake_pci_device(struct device_node *node,
-                                                 struct pci_controller *hose)
+static int __init celleb_setup_fake_pci_device(struct device_node *node,
+                                              struct pci_controller *hose)
 {
        unsigned int rlen;
        int num_base_addr = 0;
@@ -327,10 +328,7 @@ static int __devinit celleb_setup_fake_pci_device(struct device_node *node,
 
        size = 256;
        config = &private->fake_config[devno][fn];
-       if (mem_init_done)
-               *config = kzalloc(size, GFP_KERNEL);
-       else
-               *config = alloc_bootmem(size);
+       *config = alloc_maybe_bootmem(size, GFP_KERNEL);
        if (*config == NULL) {
                printk(KERN_ERR "PCI: "
                       "not enough memory for fake configuration space\n");
@@ -341,10 +339,7 @@ static int __devinit celleb_setup_fake_pci_device(struct device_node *node,
 
        size = sizeof(struct celleb_pci_resource);
        res = &private->res[devno][fn];
-       if (mem_init_done)
-               *res = kzalloc(size, GFP_KERNEL);
-       else
-               *res = alloc_bootmem(size);
+       *res = alloc_maybe_bootmem(size, GFP_KERNEL);
        if (*res == NULL) {
                printk(KERN_ERR
                       "PCI: not enough memory for resource data space\n");
@@ -418,8 +413,8 @@ error:
        return 1;
 }
 
-static int __devinit phb_set_bus_ranges(struct device_node *dev,
-                                       struct pci_controller *phb)
+static int __init phb_set_bus_ranges(struct device_node *dev,
+                                    struct pci_controller *phb)
 {
        const int *bus_range;
        unsigned int len;
@@ -434,46 +429,65 @@ static int __devinit phb_set_bus_ranges(struct device_node *dev,
        return 0;
 }
 
-static void __devinit celleb_alloc_private_mem(struct pci_controller *hose)
+static void __init celleb_alloc_private_mem(struct pci_controller *hose)
 {
-       if (mem_init_done)
-               hose->private_data =
-                       kzalloc(sizeof(struct celleb_pci_private), GFP_KERNEL);
-       else
-               hose->private_data =
-                       alloc_bootmem(sizeof(struct celleb_pci_private));
+       hose->private_data =
+               alloc_maybe_bootmem(sizeof(struct celleb_pci_private),
+                       GFP_KERNEL);
 }
 
-int __devinit celleb_setup_phb(struct pci_controller *phb)
+static int __init celleb_setup_fake_pci(struct device_node *dev,
+                                       struct pci_controller *phb)
 {
-       const char *name;
-       struct device_node *dev = phb->arch_data;
        struct device_node *node;
-       unsigned int rlen;
 
-       name = of_get_property(dev, "name", &rlen);
-       if (!name)
-               return 1;
+       phb->ops = &celleb_fake_pci_ops;
+       celleb_alloc_private_mem(phb);
 
-       pr_debug("PCI: celleb_setup_phb() %s\n", name);
-       phb_set_bus_ranges(dev, phb);
-       phb->buid = 1;
+       for (node = of_get_next_child(dev, NULL);
+            node != NULL; node = of_get_next_child(dev, node))
+               celleb_setup_fake_pci_device(node, phb);
+
+       return 0;
+}
 
-       if (strcmp(name, "epci") == 0) {
-               phb->ops = &celleb_epci_ops;
-               return celleb_setup_epci(dev, phb);
+void __init fake_pci_workaround_init(struct pci_controller *phb)
+{
+       /**
+        *  We will add fake pci bus to scc_pci_bus for the purpose to improve
+        *  I/O Macro performance. But device-tree and device drivers
+        *  are not ready to use address with a token.
+        */
+
+       /* celleb_pci_add_one(phb, NULL); */
+}
 
-       } else if (strcmp(name, "pci-pseudo") == 0) {
-               phb->ops = &celleb_fake_pci_ops;
-               celleb_alloc_private_mem(phb);
-               for (node = of_get_next_child(dev, NULL);
-                    node != NULL; node = of_get_next_child(dev, node))
-                       celleb_setup_fake_pci_device(node, phb);
+static struct of_device_id celleb_phb_match[] __initdata = {
+       {
+               .name = "pci-pseudo",
+               .data = celleb_setup_fake_pci,
+       }, {
+               .name = "epci",
+               .data = celleb_setup_epci,
+       }, {
+       },
+};
 
-       } else
+int __init celleb_setup_phb(struct pci_controller *phb)
+{
+       struct device_node *dev = phb->arch_data;
+       const struct of_device_id *match;
+       int (*setup_func)(struct device_node *, struct pci_controller *);
+
+       match = of_match_node(celleb_phb_match, dev);
+       if (!match)
                return 1;
 
-       return 0;
+       phb_set_bus_ranges(dev, phb);
+       phb->buid = 1;
+
+       setup_func = match->data;
+       return (*setup_func)(dev, phb);
 }
 
 int celleb_pci_probe_mode(struct pci_bus *bus)
index 5340e348e297a3b26fad6ed6630ac805ceef9e1a..5d5544ffeddba2824638b07faadf3b7e75252bcb 100644 (file)
 
 #include <asm/pci-bridge.h>
 #include <asm/prom.h>
+#include <asm/ppc-pci.h>
 
 extern int celleb_setup_phb(struct pci_controller *);
 extern int celleb_pci_probe_mode(struct pci_bus *);
 
-extern struct pci_ops celleb_epci_ops;
 extern int celleb_setup_epci(struct device_node *, struct pci_controller *);
 
+extern void *celleb_dummy_page_va;
+extern int __init celleb_pci_workaround_init(void);
+extern void __init celleb_pci_add_one(struct pci_controller *,
+                                     void (*)(struct pci_controller *));
+extern void fake_pci_workaround_init(struct pci_controller *);
+extern void epci_workaround_init(struct pci_controller *);
+
 #endif /* _CELLEB_PCI_H */
index e9ce8a7c1882737e4b17c453dab61b47e64a9aed..6be1542a6e663daa93e759777e4b0aea057debf9 100644 (file)
@@ -53,7 +53,7 @@
 #define SCC_EPCI_STATUS         0x808
 #define SCC_EPCI_ABTSET         0x80c
 #define SCC_EPCI_WATRP          0x810
-#define SCC_EPCI_DUMMYRADR      0x814
+#define SCC_EPCI_DUMYRADR       0x814
 #define SCC_EPCI_SWRESP         0x818
 #define SCC_EPCI_CNTOPT         0x81c
 #define SCC_EPCI_ECMODE         0xf00
index c4b011094bd678a64b92a00ff70cc277e5cda5cb..9d076426676c696874375f8474f11f9a502f6819 100644 (file)
 
 #define iob()  __asm__ __volatile__("eieio; sync":::"memory")
 
-static inline volatile void __iomem *celleb_epci_get_epci_base(
+struct epci_private {
+       dma_addr_t      dummy_page_da;
+};
+
+static inline PCI_IO_ADDR celleb_epci_get_epci_base(
                                        struct pci_controller *hose)
 {
        /*
@@ -55,7 +59,7 @@ static inline volatile void __iomem *celleb_epci_get_epci_base(
        return hose->cfg_addr;
 }
 
-static inline volatile void __iomem *celleb_epci_get_epci_cfg(
+static inline PCI_IO_ADDR celleb_epci_get_epci_cfg(
                                        struct pci_controller *hose)
 {
        /*
@@ -67,20 +71,11 @@ static inline volatile void __iomem *celleb_epci_get_epci_cfg(
        return hose->cfg_data;
 }
 
-#if 0 /* test code for epci dummy read */
-static void celleb_epci_dummy_read(struct pci_dev *dev)
+static void scc_epci_dummy_read(struct pci_controller *hose)
 {
-       volatile void __iomem *epci_base;
-       struct device_node *node;
-       struct pci_controller *hose;
+       PCI_IO_ADDR epci_base;
        u32 val;
 
-       node = (struct device_node *)dev->bus->sysdata;
-       hose = pci_find_hose_for_OF_device(node);
-
-       if (!hose)
-               return;
-
        epci_base = celleb_epci_get_epci_base(hose);
 
        val = in_be32(epci_base + SCC_EPCI_WATRP);
@@ -88,21 +83,45 @@ static void celleb_epci_dummy_read(struct pci_dev *dev)
 
        return;
 }
-#endif
+
+void __init epci_workaround_init(struct pci_controller *hose)
+{
+       PCI_IO_ADDR epci_base;
+       PCI_IO_ADDR reg;
+       struct epci_private *private = hose->private_data;
+
+       BUG_ON(!private);
+
+       private->dummy_page_da = dma_map_single(hose->parent,
+               celleb_dummy_page_va, PAGE_SIZE, DMA_FROM_DEVICE);
+       if (private->dummy_page_da == DMA_ERROR_CODE) {
+               printk(KERN_ERR "EPCI: dummy read disabled."
+                      "Map dummy page failed.\n");
+               return;
+       }
+
+       celleb_pci_add_one(hose, scc_epci_dummy_read);
+       epci_base = celleb_epci_get_epci_base(hose);
+
+       reg = epci_base + SCC_EPCI_DUMYRADR;
+       out_be32(reg, private->dummy_page_da);
+}
 
 static inline void clear_and_disable_master_abort_interrupt(
                                        struct pci_controller *hose)
 {
-       volatile void __iomem *epci_base, *reg;
+       PCI_IO_ADDR epci_base;
+       PCI_IO_ADDR reg;
        epci_base = celleb_epci_get_epci_base(hose);
        reg = epci_base + PCI_COMMAND;
        out_be32(reg, in_be32(reg) | (PCI_STATUS_REC_MASTER_ABORT << 16));
 }
 
 static int celleb_epci_check_abort(struct pci_controller *hose,
-                                  volatile void __iomem *addr)
+                                  PCI_IO_ADDR addr)
 {
-       volatile void __iomem *reg, *epci_base;
+       PCI_IO_ADDR reg;
+       PCI_IO_ADDR epci_base;
        u32 val;
 
        iob();
@@ -132,12 +151,12 @@ static int celleb_epci_check_abort(struct pci_controller *hose,
        return PCIBIOS_SUCCESSFUL;
 }
 
-static volatile void __iomem *celleb_epci_make_config_addr(
+static PCI_IO_ADDR celleb_epci_make_config_addr(
                                        struct pci_bus *bus,
                                        struct pci_controller *hose,
                                        unsigned int devfn, int where)
 {
-       volatile void __iomem *addr;
+       PCI_IO_ADDR addr;
 
        if (bus != hose->bus)
                addr = celleb_epci_get_epci_cfg(hose) +
@@ -157,7 +176,8 @@ static volatile void __iomem *celleb_epci_make_config_addr(
 static int celleb_epci_read_config(struct pci_bus *bus,
                        unsigned int devfn, int where, int size, u32 * val)
 {
-       volatile void __iomem *epci_base, *addr;
+       PCI_IO_ADDR epci_base;
+       PCI_IO_ADDR addr;
        struct device_node *node;
        struct pci_controller *hose;
 
@@ -220,7 +240,8 @@ static int celleb_epci_read_config(struct pci_bus *bus,
 static int celleb_epci_write_config(struct pci_bus *bus,
                        unsigned int devfn, int where, int size, u32 val)
 {
-       volatile void __iomem *epci_base, *addr;
+       PCI_IO_ADDR epci_base;
+       PCI_IO_ADDR addr;
        struct device_node *node;
        struct pci_controller *hose;
 
@@ -278,15 +299,16 @@ static int celleb_epci_write_config(struct pci_bus *bus,
 }
 
 struct pci_ops celleb_epci_ops = {
-       celleb_epci_read_config,
-       celleb_epci_write_config,
+       .read = celleb_epci_read_config,
+       .write = celleb_epci_write_config,
 };
 
 /* to be moved in FW */
-static int __devinit celleb_epci_init(struct pci_controller *hose)
+static int __init celleb_epci_init(struct pci_controller *hose)
 {
        u32 val;
-       volatile void __iomem *reg, *epci_base;
+       PCI_IO_ADDR reg;
+       PCI_IO_ADDR epci_base;
        int hwres = 0;
 
        epci_base = celleb_epci_get_epci_base(hose);
@@ -403,7 +425,7 @@ static int __devinit celleb_epci_init(struct pci_controller *hose)
        return 0;
 }
 
-int __devinit celleb_setup_epci(struct device_node *node,
+int __init celleb_setup_epci(struct device_node *node,
                                struct pci_controller *hose)
 {
        struct resource r;
@@ -440,10 +462,24 @@ int __devinit celleb_setup_epci(struct device_node *node,
                 r.start, (unsigned long)hose->cfg_data,
                (r.end - r.start + 1));
 
+       hose->private_data = kzalloc(sizeof(struct epci_private), GFP_KERNEL);
+       if (hose->private_data == NULL) {
+               printk(KERN_ERR "EPCI: no memory for private data.\n");
+               goto error;
+       }
+
+       hose->ops = &celleb_epci_ops;
        celleb_epci_init(hose);
 
        return 0;
 
 error:
+       kfree(hose->private_data);
+
+       if (hose->cfg_addr)
+               iounmap(hose->cfg_addr);
+
+       if (hose->cfg_data)
+               iounmap(hose->cfg_data);
        return 1;
 }
index bcd25f54d9869fb7eb78254954beee07ec0427c8..610008211ca1018e8ad882fd9b3abd85a30c1233 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * setup serial port in SCC
  *
- * (C) Copyright 2006 TOSHIBA CORPORATION
+ * (C) Copyright 2006-2007 TOSHIBA 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
 
 /* sio irq0=0xb00010022 irq0=0xb00010023 irq2=0xb00010024
     mmio=0xfff000-0x1000,0xff2000-0x1000 */
-static int txx9_serial_bitmap = 0;
+static int txx9_serial_bitmap __initdata = 0;
 
 static struct {
        uint32_t offset;
        uint32_t index;
-} txx9_scc_tab[3] = {
+} txx9_scc_tab[3] __initdata = {
        { 0x300, 0 },   /* 0xFFF300 */
        { 0x400, 0 },   /* 0xFFF400 */
        { 0x800, 1 }    /* 0xFF2800 */
 };
 
-static int txx9_serial_init(void)
+static int __init txx9_serial_init(void)
 {
        extern int early_serial_txx9_setup(struct uart_port *port);
-       struct device_node *node;
+       struct device_node *node = NULL;
        int i;
        struct uart_port req;
        struct of_irq irq;
        struct resource res;
 
-       node = of_find_node_by_path("/ioif1/sio");
-       if (!node)
-               return 0;
+       while ((node = of_find_compatible_node(node,
+                               "serial", "toshiba,sio-scc")) != NULL) {
+               for (i = 0; i < ARRAY_SIZE(txx9_scc_tab); i++) {
+                       if (!(txx9_serial_bitmap & (1<<i)))
+                               continue;
 
-       for(i = 0; i < sizeof(txx9_scc_tab)/sizeof(txx9_scc_tab[0]); i++) {
-               if (!(txx9_serial_bitmap & (1<<i)))
-                       continue;
+                       if (of_irq_map_one(node, i, &irq))
+                               continue;
+                       if (of_address_to_resource(node,
+                               txx9_scc_tab[i].index, &res))
+                               continue;
 
-               if (of_irq_map_one(node, i, &irq))
-                       continue;
-               if (of_address_to_resource(node, txx9_scc_tab[i].index, &res))
-                       continue;
-
-               memset(&req, 0, sizeof(req));
-               req.line = i;
-               req.iotype = UPIO_MEM;
-               req.mapbase = res.start + txx9_scc_tab[i].offset;
+                       memset(&req, 0, sizeof(req));
+                       req.line = i;
+                       req.iotype = UPIO_MEM;
+                       req.mapbase = res.start + txx9_scc_tab[i].offset;
 #ifdef CONFIG_SERIAL_TXX9_CONSOLE
-               req.membase = ioremap(req.mapbase, 0x24);
+                       req.membase = ioremap(req.mapbase, 0x24);
 #endif
-               req.irq = irq_create_of_mapping(irq.controller,
-                       irq.specifier, irq.size);
-               req.flags |= UPF_IOREMAP | UPF_BUGGY_UART /*HAVE_CTS_LINE*/;
-               req.uartclk = 83300000;
-               early_serial_txx9_setup(&req);
+                       req.irq = irq_create_of_mapping(irq.controller,
+                               irq.specifier, irq.size);
+                       req.flags |= UPF_IOREMAP | UPF_BUGGY_UART
+                               /*HAVE_CTS_LINE*/;
+                       req.uartclk = 83300000;
+                       early_serial_txx9_setup(&req);
+               }
        }
 
-       of_node_put(node);
        return 0;
 }
 
-static int txx9_serial_config(char *ptr)
+static int __init txx9_serial_config(char *ptr)
 {
        int     i;
 
index 5e9f7f163571a36b08344e18e8e931c8035c47b1..1769d755eff30670eee5bd58f0c498b618aec4ce 100644 (file)
@@ -73,7 +73,7 @@ static void celleb_show_cpuinfo(struct seq_file *m)
        of_node_put(root);
 }
 
-static int celleb_machine_type_hack(char *ptr)
+static int __init celleb_machine_type_hack(char *ptr)
 {
        strncpy(celleb_machine_type, ptr, sizeof(celleb_machine_type));
        celleb_machine_type[sizeof(celleb_machine_type)-1] = 0;
@@ -101,21 +101,11 @@ static void __init celleb_setup_arch(void)
        /* init to some ~sane value until calibrate_delay() runs */
        loops_per_jiffy = 50000000;
 
-       if (ROOT_DEV == 0) {
-               printk("No ramdisk, default root is /dev/hda2\n");
-               ROOT_DEV = Root_HDA2;
-       }
-
 #ifdef CONFIG_DUMMY_CONSOLE
        conswitchp = &dummy_con;
 #endif
 }
 
-static void beat_power_save(void)
-{
-       beat_pause(0);
-}
-
 static int __init celleb_probe(void)
 {
        unsigned long root = of_get_flat_dt_root();
@@ -124,18 +114,11 @@ static int __init celleb_probe(void)
                return 0;
 
        powerpc_firmware_features |= FW_FEATURE_CELLEB_POSSIBLE;
-       hpte_init_beat();
+       hpte_init_beat_v3();
        return 1;
 }
 
-#ifdef CONFIG_KEXEC
-static void celleb_kexec_cpu_down(int crash, int secondary)
-{
-       beatic_deinit_IRQ();
-}
-#endif
-
-static struct of_device_id celleb_bus_ids[] = {
+static struct of_device_id celleb_bus_ids[] __initdata = {
        { .type = "scc", },
        { .type = "ioif", },    /* old style */
        {},
@@ -149,6 +132,8 @@ static int __init celleb_publish_devices(void)
        /* Publish OF platform devices for southbridge IOs */
        of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
 
+       celleb_pci_workaround_init();
+
        return 0;
 }
 device_initcall(celleb_publish_devices);
@@ -175,7 +160,7 @@ define_machine(celleb) {
        .pci_probe_mode         = celleb_pci_probe_mode,
        .pci_setup_phb          = celleb_setup_phb,
 #ifdef CONFIG_KEXEC
-       .kexec_cpu_down         = celleb_kexec_cpu_down,
+       .kexec_cpu_down         = beat_kexec_cpu_down,
        .machine_kexec          = default_machine_kexec,
        .machine_kexec_prepare  = default_machine_kexec_prepare,
        .machine_crash_shutdown = default_machine_crash_shutdown,
diff --git a/arch/powerpc/platforms/chrp/gg2.h b/arch/powerpc/platforms/chrp/gg2.h
new file mode 100644 (file)
index 0000000..341ae55
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ *  include/asm-ppc/gg2.h -- VLSI VAS96011/12 `Golden Gate 2' register definitions
+ *
+ *  Copyright (C) 1997 Geert Uytterhoeven
+ *
+ *  This file is based on the following documentation:
+ *
+ *     The VAS96011/12 Chipset, Data Book, Edition 1.0
+ *     VLSI Technology, Inc.
+ *
+ *  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.
+ */
+
+#ifndef _ASMPPC_GG2_H
+#define _ASMPPC_GG2_H
+
+    /*
+     *  Memory Map (CHRP mode)
+     */
+
+#define GG2_PCI_MEM_BASE       0xc0000000      /* Peripheral memory space */
+#define GG2_ISA_MEM_BASE       0xf7000000      /* Peripheral memory alias */
+#define GG2_ISA_IO_BASE                0xf8000000      /* Peripheral I/O space */
+#define GG2_PCI_CONFIG_BASE    0xfec00000      /* PCI configuration space */
+#define GG2_INT_ACK_SPECIAL    0xfec80000      /* Interrupt acknowledge and */
+                                               /* special PCI cycles */
+#define GG2_ROM_BASE0          0xff000000      /* ROM bank 0 */
+#define GG2_ROM_BASE1          0xff800000      /* ROM bank 1 */
+
+
+    /*
+     *  GG2 specific PCI Registers
+     */
+
+extern void __iomem *gg2_pci_config_base;      /* kernel virtual address */
+
+#define GG2_PCI_BUSNO          0x40    /* Bus number */
+#define GG2_PCI_SUBBUSNO       0x41    /* Subordinate bus number */
+#define GG2_PCI_DISCCTR                0x42    /* Disconnect counter */
+#define GG2_PCI_PPC_CTRL       0x50    /* PowerPC interface control register */
+#define GG2_PCI_ADDR_MAP       0x5c    /* Address map */
+#define GG2_PCI_PCI_CTRL       0x60    /* PCI interface control register */
+#define GG2_PCI_ROM_CTRL       0x70    /* ROM interface control register */
+#define GG2_PCI_ROM_TIME       0x74    /* ROM timing */
+#define GG2_PCI_CC_CTRL                0x80    /* Cache controller control register */
+#define GG2_PCI_DRAM_BANK0     0x90    /* Control register for DRAM bank #0 */
+#define GG2_PCI_DRAM_BANK1     0x94    /* Control register for DRAM bank #1 */
+#define GG2_PCI_DRAM_BANK2     0x98    /* Control register for DRAM bank #2 */
+#define GG2_PCI_DRAM_BANK3     0x9c    /* Control register for DRAM bank #3 */
+#define GG2_PCI_DRAM_BANK4     0xa0    /* Control register for DRAM bank #4 */
+#define GG2_PCI_DRAM_BANK5     0xa4    /* Control register for DRAM bank #5 */
+#define GG2_PCI_DRAM_TIME0     0xb0    /* Timing parameters set #0 */
+#define GG2_PCI_DRAM_TIME1     0xb4    /* Timing parameters set #1 */
+#define GG2_PCI_DRAM_CTRL      0xc0    /* DRAM control */
+#define GG2_PCI_ERR_CTRL       0xd0    /* Error control register */
+#define GG2_PCI_ERR_STATUS     0xd4    /* Error status register */
+                                       /* Cleared when read */
+
+#endif /* _ASMPPC_GG2_H */
index 28d1647b204e70b2f91462463d05f8309c136a99..e43465d34d29aac181ae728042fe3b86164358d3 100644 (file)
@@ -13,7 +13,6 @@
 #include <asm/irq.h>
 #include <asm/hydra.h>
 #include <asm/prom.h>
-#include <asm/gg2.h>
 #include <asm/machdep.h>
 #include <asm/sections.h>
 #include <asm/pci-bridge.h>
@@ -21,6 +20,7 @@
 #include <asm/rtas.h>
 
 #include "chrp.h"
+#include "gg2.h"
 
 /* LongTrail */
 void __iomem *gg2_pci_config_base;
@@ -86,8 +86,8 @@ int gg2_write_config(struct pci_bus *bus, unsigned int devfn, int off,
 
 static struct pci_ops gg2_pci_ops =
 {
-       gg2_read_config,
-       gg2_write_config
+       .read = gg2_read_config,
+       .write = gg2_write_config,
 };
 
 /*
@@ -124,8 +124,8 @@ int rtas_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
 
 static struct pci_ops rtas_pci_ops =
 {
-       rtas_read_config,
-       rtas_write_config
+       .read = rtas_read_config,
+       .write = rtas_write_config,
 };
 
 volatile struct Hydra __iomem *Hydra = NULL;
@@ -338,3 +338,32 @@ void chrp_pci_fixup_winbond_ata(struct pci_dev *sl82c105)
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
                chrp_pci_fixup_winbond_ata);
+
+/* Pegasos2 firmware version 20040810 configures the built-in IDE controller
+ * in legacy mode, but sets the PCI registers to PCI native mode.
+ * The chip can only operate in legacy mode, so force the PCI class into legacy
+ * mode as well. The same fixup must be done to the class-code property in
+ * the IDE node /pci@80000000/ide@C,1
+ */
+static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide)
+{
+       u8 progif;
+       struct pci_dev *viaisa;
+
+       if (!machine_is(chrp) || _chrp_type != _CHRP_Pegasos)
+               return;
+       if (viaide->irq != 14)
+               return;
+
+       viaisa = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
+       if (!viaisa)
+               return;
+       printk("Fixing VIA IDE, force legacy mode on '%s'\n", viaide->dev.bus_id);
+
+       pci_read_config_byte(viaide, PCI_CLASS_PROG, &progif);
+       pci_write_config_byte(viaide, PCI_CLASS_PROG, progif & ~0x5);
+       viaide->class &= ~0x5;
+
+       pci_dev_put(viaisa);
+}
+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, chrp_pci_fixup_vt8231_ata);
index 373de4c063db98638281b388dc44d9401310baf8..59306261f5b2991a329be96680c771ef134a9852 100644 (file)
 #include <linux/seq_file.h>
 #include <linux/root_dev.h>
 #include <linux/initrd.h>
-#include <linux/module.h>
 #include <linux/timer.h>
 
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/prom.h>
-#include <asm/gg2.h>
 #include <asm/pci-bridge.h>
 #include <asm/dma.h>
 #include <asm/machdep.h>
@@ -52,6 +50,7 @@
 #include <asm/xmon.h>
 
 #include "chrp.h"
+#include "gg2.h"
 
 void rtas_indicator_progress(char *, unsigned short);
 
@@ -291,16 +290,6 @@ void __init chrp_setup_arch(void)
                ppc_md.set_rtc_time     = rtas_set_rtc_time;
        }
 
-#ifdef CONFIG_BLK_DEV_INITRD
-       /* this is fine for chrp */
-       initrd_below_start_ok = 1;
-
-       if (initrd_start)
-               ROOT_DEV = Root_RAM0;
-       else
-#endif
-               ROOT_DEV = Root_SDA2; /* sda2 (sda1 is for the kernel) */
-
        /* On pegasos, enable the L2 cache if not already done by OF */
        pegasos_set_l2cr();
 
index 3ea0eb78568ed274fb590e33a07897e4a2289b45..10a4a4d063b6411b04db150f4bd00980aa67a6ee 100644 (file)
 #include <asm/io.h>
 #include <asm/prom.h>
 #include <asm/smp.h>
-#include <asm/residual.h>
 #include <asm/time.h>
 #include <asm/machdep.h>
-#include <asm/smp.h>
 #include <asm/mpic.h>
 #include <asm/rtas.h>
 
index 2d12f77e46bcbee9987213561cfe7c2c5a022db6..8924095a792888f3940b1d6a1e5340b303ddbf7b 100644 (file)
@@ -1,9 +1,10 @@
-choice
-       prompt "Machine Type"
-       depends on EMBEDDED6xx
+config EMBEDDED6xx
+       bool "Embedded 6xx/7xx/7xxx-based boards"
+       depends on PPC32 && BROKEN_ON_SMP && PPC_MULTIPLATFORM
 
 config LINKSTATION
        bool "Linkstation / Kurobox(HG) from Buffalo"
+       depends on EMBEDDED6xx
        select MPIC
        select FSL_SOC
        select PPC_UDBG_16550 if SERIAL_8250
@@ -17,15 +18,18 @@ config LINKSTATION
 
 config MPC7448HPC2
        bool "Freescale MPC7448HPC2(Taiga)"
+       depends on EMBEDDED6xx
        select TSI108_BRIDGE
        select DEFAULT_UIMAGE
        select PPC_UDBG_16550
+       select WANT_DEVICE_TREE
        help
          Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)
          platform
 
 config PPC_HOLLY
        bool "PPC750GX/CL with TSI10x bridge (Hickory/Holly)"
+       depends on EMBEDDED6xx
        select TSI108_BRIDGE
        select PPC_UDBG_16550
        select WANT_DEVICE_TREE
@@ -35,12 +39,12 @@ config PPC_HOLLY
 
 config PPC_PRPMC2800
        bool "Motorola-PrPMC2800"
+       depends on EMBEDDED6xx
        select MV64X60
        select NOT_COHERENT_CACHE
        select WANT_DEVICE_TREE
        help
          This option enables support for the Motorola PrPMC2800 board
-endchoice
 
 config TSI108_BRIDGE
        bool
index 6292e36dc57744605b6bd2e762a03ba0bab3344b..b6de2b5223dd4682b61d9c9708b68c978c782059 100644 (file)
@@ -113,23 +113,11 @@ static void holly_remap_bridge(void)
 
 static void __init holly_setup_arch(void)
 {
-       struct device_node *cpu;
        struct device_node *np;
 
        if (ppc_md.progress)
                ppc_md.progress("holly_setup_arch():set_bridge", 0);
 
-       cpu = of_find_node_by_type(NULL, "cpu");
-       if (cpu) {
-               const unsigned int *fp;
-
-               fp = of_get_property(cpu, "clock-frequency", NULL);
-               if (fp)
-                       loops_per_jiffy = *fp / HZ;
-               else
-                       loops_per_jiffy = 50000000 / HZ;
-               of_node_put(cpu);
-       }
        tsi108_csr_vir_base = get_vir_csrbase();
 
        /* setup PCI host bridge */
@@ -147,7 +135,7 @@ static void __init holly_setup_arch(void)
 }
 
 /*
- * Interrupt setup and service.  Interrrupts on the holly come
+ * Interrupt setup and service.  Interrupts on the holly come
  * from the four external INT pins, PCI interrupts are routed via
  * PCI interrupt control registers, it generates internal IRQ23
  *
index bd5ca58345a1dc0e2bea91aecadd1f58ddced273..eb5d74e26fe9d3731fad5fa7b5fad7d5bec35678 100644 (file)
  */
 
 #include <linux/kernel.h>
-#include <linux/pci.h>
 #include <linux/initrd.h>
 #include <linux/mtd/physmap.h>
 
 #include <asm/time.h>
 #include <asm/prom.h>
 #include <asm/mpic.h>
-#include <asm/mpc10x.h>
 #include <asm/pci-bridge.h>
 
+#include "mpc10x.h"
+
 static struct mtd_partition linkstation_physmap_partitions[] = {
        {
                .name   = "mtd_firmimg",
@@ -91,7 +91,7 @@ static void __init linkstation_setup_arch(void)
 #endif
 
        /* Lookup PCI host bridges */
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "mpc10x-pci")
                linkstation_add_bridge(np);
 
        printk(KERN_INFO "BUFFALO Network Attached Storage Series\n");
@@ -99,7 +99,7 @@ static void __init linkstation_setup_arch(void)
 }
 
 /*
- * Interrupt setup and service.  Interrrupts on the linkstation come
+ * Interrupt setup and service.  Interrupts on the linkstation come
  * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
  */
 static void __init linkstation_init_IRQ(void)
index d0bee9f19e4e8659140c75b0ad215baa50cac2ef..c99264cedda5e5f23e77465f2cd8a94a1614e360 100644 (file)
@@ -1,14 +1,25 @@
+/*
+ * AVR power-management chip interface for the Buffalo Linkstation /
+ * Kurobox Platform.
+ *
+ * Author: 2006 (c) G. Liakhovetski
+ *      g.liakhovetski@gmx.de
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of
+ * any kind, whether express or implied.
+ */
 #include <linux/workqueue.h>
 #include <linux/string.h>
 #include <linux/delay.h>
 #include <linux/serial_reg.h>
 #include <linux/serial_8250.h>
 #include <asm/io.h>
-#include <asm/mpc10x.h>
-#include <asm/ppc_sys.h>
 #include <asm/prom.h>
 #include <asm/termbits.h>
 
+#include "mpc10x.h"
+
 static void __iomem *avr_addr;
 static unsigned long avr_clock;
 
@@ -106,6 +117,9 @@ static int __init ls_uarts_init(void)
        phys_addr_t phys_addr;
        int len;
 
+       if (!machine_is(linkstation))
+               return 0;
+
        avr = of_find_node_by_path("/soc10x/serial@80004500");
        if (!avr)
                return -EINVAL;
diff --git a/arch/powerpc/platforms/embedded6xx/mpc10x.h b/arch/powerpc/platforms/embedded6xx/mpc10x.h
new file mode 100644 (file)
index 0000000..b30a6a3
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Common routines for the Motorola SPS MPC106/8240/107 Host bridge/Mem
+ * ctlr/EPIC/etc.
+ *
+ * Author: Mark A. Greer
+ *         mgreer@mvista.com
+ *
+ * 2001 (c) MontaVista, Software, Inc.  This file is licensed under
+ * the terms of the GNU General Public License version 2.  This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+#ifndef __PPC_KERNEL_MPC10X_H
+#define __PPC_KERNEL_MPC10X_H
+
+#include <linux/pci_ids.h>
+#include <asm/pci-bridge.h>
+
+/*
+ * The values here don't completely map everything but should work in most
+ * cases.
+ *
+ * MAP A (PReP Map)
+ *   Processor: 0x80000000 - 0x807fffff -> PCI I/O: 0x00000000 - 0x007fffff
+ *   Processor: 0xc0000000 - 0xdfffffff -> PCI MEM: 0x00000000 - 0x1fffffff
+ *   PCI MEM:   0x80000000 -> Processor System Memory: 0x00000000
+ *   EUMB mapped to: ioremap_base - 0x00100000 (ioremap_base - 1 MB)
+ *
+ * MAP B (CHRP Map)
+ *   Processor: 0xfe000000 - 0xfebfffff -> PCI I/O: 0x00000000 - 0x00bfffff
+ *   Processor: 0x80000000 - 0xbfffffff -> PCI MEM: 0x80000000 - 0xbfffffff
+ *   PCI MEM:   0x00000000 -> Processor System Memory: 0x00000000
+ *   EUMB mapped to: ioremap_base - 0x00100000 (ioremap_base - 1 MB)
+ */
+
+/*
+ * Define the vendor/device IDs for the various bridges--should be added to
+ * <linux/pci_ids.h>
+ */
+#define        MPC10X_BRIDGE_106       ((PCI_DEVICE_ID_MOTOROLA_MPC106 << 16) |  \
+                                 PCI_VENDOR_ID_MOTOROLA)
+#define        MPC10X_BRIDGE_8240      ((0x0003 << 16) | PCI_VENDOR_ID_MOTOROLA)
+#define        MPC10X_BRIDGE_107       ((0x0004 << 16) | PCI_VENDOR_ID_MOTOROLA)
+#define        MPC10X_BRIDGE_8245      ((0x0006 << 16) | PCI_VENDOR_ID_MOTOROLA)
+
+/* Define the type of map to use */
+#define        MPC10X_MEM_MAP_A                1
+#define        MPC10X_MEM_MAP_B                2
+
+/* Map A (PReP Map) Defines */
+#define        MPC10X_MAPA_CNFG_ADDR           0x80000cf8
+#define        MPC10X_MAPA_CNFG_DATA           0x80000cfc
+
+#define MPC10X_MAPA_ISA_IO_BASE                0x80000000
+#define MPC10X_MAPA_ISA_MEM_BASE       0xc0000000
+#define        MPC10X_MAPA_DRAM_OFFSET         0x80000000
+
+#define        MPC10X_MAPA_PCI_INTACK_ADDR     0xbffffff0
+#define        MPC10X_MAPA_PCI_IO_START        0x00000000
+#define        MPC10X_MAPA_PCI_IO_END         (0x00800000 - 1)
+#define        MPC10X_MAPA_PCI_MEM_START       0x00000000
+#define        MPC10X_MAPA_PCI_MEM_END        (0x20000000 - 1)
+
+#define        MPC10X_MAPA_PCI_MEM_OFFSET      (MPC10X_MAPA_ISA_MEM_BASE -     \
+                                        MPC10X_MAPA_PCI_MEM_START)
+
+/* Map B (CHRP Map) Defines */
+#define        MPC10X_MAPB_CNFG_ADDR           0xfec00000
+#define        MPC10X_MAPB_CNFG_DATA           0xfee00000
+
+#define MPC10X_MAPB_ISA_IO_BASE                0xfe000000
+#define MPC10X_MAPB_ISA_MEM_BASE       0x80000000
+#define        MPC10X_MAPB_DRAM_OFFSET         0x00000000
+
+#define        MPC10X_MAPB_PCI_INTACK_ADDR     0xfef00000
+#define        MPC10X_MAPB_PCI_IO_START        0x00000000
+#define        MPC10X_MAPB_PCI_IO_END         (0x00c00000 - 1)
+#define        MPC10X_MAPB_PCI_MEM_START       0x80000000
+#define        MPC10X_MAPB_PCI_MEM_END        (0xc0000000 - 1)
+
+#define        MPC10X_MAPB_PCI_MEM_OFFSET      (MPC10X_MAPB_ISA_MEM_BASE -     \
+                                        MPC10X_MAPB_PCI_MEM_START)
+
+/* Set hose members to values appropriate for the mem map used */
+#define        MPC10X_SETUP_HOSE(hose, map) {                                  \
+       (hose)->pci_mem_offset = MPC10X_MAP##map##_PCI_MEM_OFFSET;      \
+       (hose)->io_space.start = MPC10X_MAP##map##_PCI_IO_START;        \
+       (hose)->io_space.end = MPC10X_MAP##map##_PCI_IO_END;            \
+       (hose)->mem_space.start = MPC10X_MAP##map##_PCI_MEM_START;      \
+       (hose)->mem_space.end = MPC10X_MAP##map##_PCI_MEM_END;          \
+       (hose)->io_base_virt = (void *)MPC10X_MAP##map##_ISA_IO_BASE;   \
+}
+
+
+/* Miscellaneous Configuration register offsets */
+#define        MPC10X_CFG_PIR_REG              0x09
+#define        MPC10X_CFG_PIR_HOST_BRIDGE      0x00
+#define        MPC10X_CFG_PIR_AGENT            0x01
+
+#define        MPC10X_CFG_EUMBBAR              0x78
+
+#define        MPC10X_CFG_PICR1_REG            0xa8
+#define        MPC10X_CFG_PICR1_ADDR_MAP_MASK  0x00010000
+#define        MPC10X_CFG_PICR1_ADDR_MAP_A     0x00010000
+#define        MPC10X_CFG_PICR1_ADDR_MAP_B     0x00000000
+#define        MPC10X_CFG_PICR1_SPEC_PCI_RD    0x00000004
+#define        MPC10X_CFG_PICR1_ST_GATH_EN     0x00000040
+
+#define        MPC10X_CFG_PICR2_REG            0xac
+#define        MPC10X_CFG_PICR2_COPYBACK_OPT   0x00000001
+
+#define        MPC10X_CFG_MAPB_OPTIONS_REG     0xe0
+#define        MPC10X_CFG_MAPB_OPTIONS_CFAE    0x80    /* CPU_FD_ALIAS_EN */
+#define        MPC10X_CFG_MAPB_OPTIONS_PFAE    0x40    /* PCI_FD_ALIAS_EN */
+#define        MPC10X_CFG_MAPB_OPTIONS_DR      0x20    /* DLL_RESET */
+#define        MPC10X_CFG_MAPB_OPTIONS_PCICH   0x08    /* PCI_COMPATIBILITY_HOLE */
+#define        MPC10X_CFG_MAPB_OPTIONS_PROCCH  0x04    /* PROC_COMPATIBILITY_HOLE */
+
+/* Define offsets for the memory controller registers in the config space */
+#define MPC10X_MCTLR_MEM_START_1       0x80    /* Banks 0-3 */
+#define MPC10X_MCTLR_MEM_START_2       0x84    /* Banks 4-7 */
+#define MPC10X_MCTLR_EXT_MEM_START_1   0x88    /* Banks 0-3 */
+#define MPC10X_MCTLR_EXT_MEM_START_2   0x8c    /* Banks 4-7 */
+
+#define MPC10X_MCTLR_MEM_END_1         0x90    /* Banks 0-3 */
+#define MPC10X_MCTLR_MEM_END_2         0x94    /* Banks 4-7 */
+#define MPC10X_MCTLR_EXT_MEM_END_1     0x98    /* Banks 0-3 */
+#define MPC10X_MCTLR_EXT_MEM_END_2     0x9c    /* Banks 4-7 */
+
+#define MPC10X_MCTLR_MEM_BANK_ENABLES  0xa0
+
+/* Define some offset in the EUMB */
+#define        MPC10X_EUMB_SIZE                0x00100000 /* Total EUMB size (1MB) */
+
+#define MPC10X_EUMB_MU_OFFSET          0x00000000 /* Msg Unit reg offset */
+#define MPC10X_EUMB_MU_SIZE            0x00001000 /* Msg Unit reg size */
+#define MPC10X_EUMB_DMA_OFFSET         0x00001000 /* DMA Unit reg offset */
+#define MPC10X_EUMB_DMA_SIZE           0x00001000 /* DMA Unit reg size  */
+#define MPC10X_EUMB_ATU_OFFSET         0x00002000 /* Addr xlate reg offset */
+#define MPC10X_EUMB_ATU_SIZE           0x00001000 /* Addr xlate reg size  */
+#define MPC10X_EUMB_I2C_OFFSET         0x00003000 /* I2C Unit reg offset */
+#define MPC10X_EUMB_I2C_SIZE           0x00001000 /* I2C Unit reg size  */
+#define MPC10X_EUMB_DUART_OFFSET       0x00004000 /* DUART Unit reg offset (8245) */
+#define MPC10X_EUMB_DUART_SIZE         0x00001000 /* DUART Unit reg size (8245) */
+#define        MPC10X_EUMB_EPIC_OFFSET         0x00040000 /* EPIC offset in EUMB */
+#define        MPC10X_EUMB_EPIC_SIZE           0x00030000 /* EPIC size */
+#define MPC10X_EUMB_PM_OFFSET          0x000fe000 /* Performance Monitor reg offset (8245) */
+#define MPC10X_EUMB_PM_SIZE            0x00001000 /* Performance Monitor reg size (8245) */
+#define MPC10X_EUMB_WP_OFFSET          0x000ff000 /* Data path diagnostic, watchpoint reg offset */
+#define MPC10X_EUMB_WP_SIZE            0x00001000 /* Data path diagnostic, watchpoint reg size */
+
+/*
+ * Define some recommended places to put the EUMB regs.
+ * For both maps, recommend putting the EUMB from 0xeff00000 to 0xefffffff.
+ */
+extern unsigned long                   ioremap_base;
+#define        MPC10X_MAPA_EUMB_BASE           (ioremap_base - MPC10X_EUMB_SIZE)
+#define        MPC10X_MAPB_EUMB_BASE           MPC10X_MAPA_EUMB_BASE
+
+enum ppc_sys_devices {
+       MPC10X_IIC1,
+       MPC10X_DMA0,
+       MPC10X_DMA1,
+       MPC10X_UART0,
+       MPC10X_UART1,
+       NUM_PPC_SYS_DEVS,
+};
+
+int mpc10x_bridge_init(struct pci_controller *hose,
+                      uint current_map,
+                      uint new_map,
+                      uint phys_eumb_base);
+unsigned long mpc10x_get_mem_size(uint mem_map);
+int mpc10x_enable_store_gathering(struct pci_controller *hose);
+int mpc10x_disable_store_gathering(struct pci_controller *hose);
+
+/* For MPC107 boards that use the built-in openpic */
+void mpc10x_set_openpic(void);
+
+#endif /* __PPC_KERNEL_MPC10X_H */
index 1e3cc69487b58719665cc459ed582d6b60d39275..a2c04b9d42b1642726a4abb2ea1cc72a85e69ecb 100644 (file)
@@ -40,7 +40,6 @@
 #include <asm/pci-bridge.h>
 #include <asm/reg.h>
 #include <mm/mmu_decl.h>
-#include "mpc7448_hpc2.h"
 #include <asm/tsi108_pci.h>
 #include <asm/tsi108_irq.h>
 #include <asm/mpic.h>
@@ -75,7 +74,7 @@ static void __init mpc7448_hpc2_setup_arch(void)
 
        /* setup PCI host bridge */
 #ifdef CONFIG_PCI
-       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+       for_each_compatible_node(np, "pci", "tsi108-pci")
                tsi108_setup_pci(np, MPC7448HPC2_PCI_CFG_PHYS, 0);
 
        ppc_md.pci_exclude_device = mpc7448_hpc2_exclude_device;
@@ -91,7 +90,7 @@ static void __init mpc7448_hpc2_setup_arch(void)
 }
 
 /*
- * Interrupt setup and service.  Interrrupts on the mpc7448_hpc2 come
+ * Interrupt setup and service.  Interrupts on the mpc7448_hpc2 come
  * from the four external INT pins, PCI interrupts are routed via
  * PCI interrupt control registers, it generates internal IRQ23
  *
diff --git a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.h b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.h
deleted file mode 100644 (file)
index f7e0e0c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * mpc7448_hpc2.h
- *
- * Definitions for Freescale MPC7448_HPC2 platform
- *
- * Author: Jacob Pan
- *         jacob.pan@freescale.com
- * Maintainer: Roy Zang <roy.zang@freescale.com>
- *
- * 2006 (c) Freescale Semiconductor, Inc.  This file is licensed under
- * the terms of the GNU General Public License version 2.  This program
- * is licensed "as is" without any warranty of any kind, whether express
- * or implied.
- */
-
-#ifndef __PPC_PLATFORMS_MPC7448_HPC2_H
-#define __PPC_PLATFORMS_MPC7448_HPC2_H
-
-#include <asm/ppcboot.h>
-
-#endif                         /* __PPC_PLATFORMS_MPC7448_HPC2_H */
index 53420951dc53a52733e4f8c83aea68bf17e5ecc8..e484cac750955bbdec66800ab00fb832136dfc81 100644 (file)
@@ -44,7 +44,6 @@ static void __init prpmc2800_setup_arch(void)
        struct device_node *np;
        phys_addr_t paddr;
        const unsigned int *reg;
-       const unsigned int *prop;
 
        /*
         * ioremap mpp and gpp registers in case they are later
@@ -62,12 +61,6 @@ static void __init prpmc2800_setup_arch(void)
        of_node_put(np);
        mv64x60_gpp_reg_base = ioremap(paddr, reg[1]);
 
-       np = of_find_node_by_type(NULL, "cpu");
-       prop = of_get_property(np, "clock-frequency", NULL);
-       if (prop)
-               loops_per_jiffy = *prop / HZ;
-       of_node_put(np);
-
 #ifdef CONFIG_PCI
        mv64x60_pci_init();
 #endif
@@ -158,6 +151,7 @@ define_machine(prpmc2800){
        .name                   = prpmc2800_platform_name,
        .probe                  = prpmc2800_probe,
        .setup_arch             = prpmc2800_setup_arch,
+       .init_early             = mv64x60_init_early,
        .show_cpuinfo           = prpmc2800_show_cpuinfo,
        .init_IRQ               = mv64x60_init_irq,
        .get_irq                = mv64x60_get_irq,
index 13ac3015d91c95be313e33f344bbc0ac8d4b2a7d..a65f1b44abf85f139b93ff337445fe0de8949e73 100644 (file)
@@ -2,11 +2,12 @@ EXTRA_CFLAGS  += -mno-minimal-toc
 
 extra-y += dt.o
 
+obj-y += exception.o
 obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt_mod.o mf.o lpevents.o \
        hvcall.o proc.o htab.o iommu.o misc.o irq.o
 obj-$(CONFIG_PCI) += pci.o vpdinfo.o
 obj-$(CONFIG_SMP) += smp.o
-obj-$(CONFIG_VIOPATH) += viopath.o
+obj-$(CONFIG_VIOPATH) += viopath.o vio.o
 obj-$(CONFIG_MODULES) += ksyms.o
 
 quiet_cmd_dt_strings = DT_STR  $@
index 9e8a334a518a8cc1dd9f9224c4e88399d1a45a59..4543c4bc3a56e158cb47a3387d97c715dabc515e 100644 (file)
@@ -72,8 +72,6 @@ static char __initdata device_type_cpu[] = "cpu";
 static char __initdata device_type_memory[] = "memory";
 static char __initdata device_type_serial[] = "serial";
 static char __initdata device_type_network[] = "network";
-static char __initdata device_type_block[] = "block";
-static char __initdata device_type_byte[] = "byte";
 static char __initdata device_type_pci[] = "pci";
 static char __initdata device_type_vdevice[] = "vdevice";
 static char __initdata device_type_vscsi[] = "vscsi";
@@ -375,21 +373,6 @@ static void __init dt_vdevices(struct iseries_flat_dt *dt)
 
                dt_end_node(dt);
        }
-       reg += HVMAXARCHITECTEDVIRTUALLANS;
-
-       for (i = 0; i < HVMAXARCHITECTEDVIRTUALDISKS; i++)
-               dt_do_vdevice(dt, "viodasd", reg, i, device_type_block,
-                               "IBM,iSeries-viodasd", 1);
-       reg += HVMAXARCHITECTEDVIRTUALDISKS;
-
-       for (i = 0; i < HVMAXARCHITECTEDVIRTUALCDROMS; i++)
-               dt_do_vdevice(dt, "viocd", reg, i, device_type_block,
-                               "IBM,iSeries-viocd", 1);
-       reg += HVMAXARCHITECTEDVIRTUALCDROMS;
-
-       for (i = 0; i < HVMAXARCHITECTEDVIRTUALTAPES; i++)
-               dt_do_vdevice(dt, "viotape", reg, i, device_type_byte,
-                               "IBM,iSeries-viotape", 1);
 
        dt_end_node(dt);
 }
diff --git a/arch/powerpc/platforms/iseries/exception.S b/arch/powerpc/platforms/iseries/exception.S
new file mode 100644 (file)
index 0000000..5381038
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ *  Low level routines for legacy iSeries support.
+ *
+ *  Extracted from head_64.S
+ *
+ *  PowerPC version
+ *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *
+ *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
+ *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
+ *  Adapted for Power Macintosh by Paul Mackerras.
+ *  Low-level exception handlers and MMU support
+ *  rewritten by Paul Mackerras.
+ *    Copyright (C) 1996 Paul Mackerras.
+ *
+ *  Adapted for 64bit PowerPC by Dave Engebretsen, Peter Bergner, and
+ *    Mike Corrigan {engebret|bergner|mikejc}@us.ibm.com
+ *
+ *  This file contains the low-level support and setup for the
+ *  PowerPC-64 platform, including trap and interrupt dispatch.
+ *
+ *  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 <asm/reg.h>
+#include <asm/ppc_asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+#include <asm/ptrace.h>
+#include <asm/cputable.h>
+
+#include "exception.h"
+
+       .text
+
+       .globl system_reset_iSeries
+system_reset_iSeries:
+       mfspr   r13,SPRN_SPRG3          /* Get paca address */
+       mfmsr   r24
+       ori     r24,r24,MSR_RI
+       mtmsrd  r24                     /* RI on */
+       lhz     r24,PACAPACAINDEX(r13)  /* Get processor # */
+       cmpwi   0,r24,0                 /* Are we processor 0? */
+       bne     1f
+       b       .__start_initialization_iSeries /* Start up the first processor */
+1:     mfspr   r4,SPRN_CTRLF
+       li      r5,CTRL_RUNLATCH        /* Turn off the run light */
+       andc    r4,r4,r5
+       mtspr   SPRN_CTRLT,r4
+
+1:
+       HMT_LOW
+#ifdef CONFIG_SMP
+       lbz     r23,PACAPROCSTART(r13)  /* Test if this processor
+                                        * should start */
+       sync
+       LOAD_REG_IMMEDIATE(r3,current_set)
+       sldi    r28,r24,3               /* get current_set[cpu#] */
+       ldx     r3,r3,r28
+       addi    r1,r3,THREAD_SIZE
+       subi    r1,r1,STACK_FRAME_OVERHEAD
+
+       cmpwi   0,r23,0
+       beq     iSeries_secondary_smp_loop      /* Loop until told to go */
+       b       __secondary_start               /* Loop until told to go */
+iSeries_secondary_smp_loop:
+       /* Let the Hypervisor know we are alive */
+       /* 8002 is a call to HvCallCfg::getLps, a harmless Hypervisor function */
+       lis     r3,0x8002
+       rldicr  r3,r3,32,15             /* r0 = (r3 << 32) & 0xffff000000000000 */
+#else /* CONFIG_SMP */
+       /* Yield the processor.  This is required for non-SMP kernels
+               which are running on multi-threaded machines. */
+       lis     r3,0x8000
+       rldicr  r3,r3,32,15             /* r3 = (r3 << 32) & 0xffff000000000000 */
+       addi    r3,r3,18                /* r3 = 0x8000000000000012 which is "yield" */
+       li      r4,0                    /* "yield timed" */
+       li      r5,-1                   /* "yield forever" */
+#endif /* CONFIG_SMP */
+       li      r0,-1                   /* r0=-1 indicates a Hypervisor call */
+       sc                              /* Invoke the hypervisor via a system call */
+       mfspr   r13,SPRN_SPRG3          /* Put r13 back ???? */
+       b       1b                      /* If SMP not configured, secondaries
+                                        * loop forever */
+
+/***  ISeries-LPAR interrupt handlers ***/
+
+       STD_EXCEPTION_ISERIES(machine_check, PACA_EXMC)
+
+       .globl data_access_iSeries
+data_access_iSeries:
+       mtspr   SPRN_SPRG1,r13
+BEGIN_FTR_SECTION
+       mtspr   SPRN_SPRG2,r12
+       mfspr   r13,SPRN_DAR
+       mfspr   r12,SPRN_DSISR
+       srdi    r13,r13,60
+       rlwimi  r13,r12,16,0x20
+       mfcr    r12
+       cmpwi   r13,0x2c
+       beq     .do_stab_bolted_iSeries
+       mtcrf   0x80,r12
+       mfspr   r12,SPRN_SPRG2
+END_FTR_SECTION_IFCLR(CPU_FTR_SLB)
+       EXCEPTION_PROLOG_1(PACA_EXGEN)
+       EXCEPTION_PROLOG_ISERIES_1
+       b       data_access_common
+
+.do_stab_bolted_iSeries:
+       mtcrf   0x80,r12
+       mfspr   r12,SPRN_SPRG2
+       EXCEPTION_PROLOG_1(PACA_EXSLB)
+       EXCEPTION_PROLOG_ISERIES_1
+       b       .do_stab_bolted
+
+       .globl  data_access_slb_iSeries
+data_access_slb_iSeries:
+       mtspr   SPRN_SPRG1,r13          /* save r13 */
+       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
+       std     r3,PACA_EXSLB+EX_R3(r13)
+       mfspr   r3,SPRN_DAR
+       std     r9,PACA_EXSLB+EX_R9(r13)
+       mfcr    r9
+#ifdef __DISABLED__
+       cmpdi   r3,0
+       bge     slb_miss_user_iseries
+#endif
+       std     r10,PACA_EXSLB+EX_R10(r13)
+       std     r11,PACA_EXSLB+EX_R11(r13)
+       std     r12,PACA_EXSLB+EX_R12(r13)
+       mfspr   r10,SPRN_SPRG1
+       std     r10,PACA_EXSLB+EX_R13(r13)
+       ld      r12,PACALPPACAPTR(r13)
+       ld      r12,LPPACASRR1(r12)
+       b       .slb_miss_realmode
+
+       STD_EXCEPTION_ISERIES(instruction_access, PACA_EXGEN)
+
+       .globl  instruction_access_slb_iSeries
+instruction_access_slb_iSeries:
+       mtspr   SPRN_SPRG1,r13          /* save r13 */
+       mfspr   r13,SPRN_SPRG3          /* get paca address into r13 */
+       std     r3,PACA_EXSLB+EX_R3(r13)
+       ld      r3,PACALPPACAPTR(r13)
+       ld      r3,LPPACASRR0(r3)       /* get SRR0 value */
+       std     r9,PACA_EXSLB+EX_R9(r13)
+       mfcr    r9
+#ifdef __DISABLED__
+       cmpdi   r3,0
+       bge     slb_miss_user_iseries
+#endif
+       std     r10,PACA_EXSLB+EX_R10(r13)
+       std     r11,PACA_EXSLB+EX_R11(r13)
+       std     r12,PACA_EXSLB+EX_R12(r13)
+       mfspr   r10,SPRN_SPRG1
+       std     r10,PACA_EXSLB+EX_R13(r13)
+       ld      r12,PACALPPACAPTR(r13)
+       ld      r12,LPPACASRR1(r12)
+       b       .slb_miss_realmode
+
+#ifdef __DISABLED__
+slb_miss_user_iseries:
+       std     r10,PACA_EXGEN+EX_R10(r13)
+       std     r11,PACA_EXGEN+EX_R11(r13)
+       std     r12,PACA_EXGEN+EX_R12(r13)
+       mfspr   r10,SPRG1
+       ld      r11,PACA_EXSLB+EX_R9(r13)
+       ld      r12,PACA_EXSLB+EX_R3(r13)
+       std     r10,PACA_EXGEN+EX_R13(r13)
+       std     r11,PACA_EXGEN+EX_R9(r13)
+       std     r12,PACA_EXGEN+EX_R3(r13)
+       EXCEPTION_PROLOG_ISERIES_1
+       b       slb_miss_user_common
+#endif
+
+       MASKABLE_EXCEPTION_ISERIES(hardware_interrupt)
+       STD_EXCEPTION_ISERIES(alignment, PACA_EXGEN)
+       STD_EXCEPTION_ISERIES(program_check, PACA_EXGEN)
+       STD_EXCEPTION_ISERIES(fp_unavailable, PACA_EXGEN)
+       MASKABLE_EXCEPTION_ISERIES(decrementer)
+       STD_EXCEPTION_ISERIES(trap_0a, PACA_EXGEN)
+       STD_EXCEPTION_ISERIES(trap_0b, PACA_EXGEN)
+
+       .globl  system_call_iSeries
+system_call_iSeries:
+       mr      r9,r13
+       mfspr   r13,SPRN_SPRG3
+       EXCEPTION_PROLOG_ISERIES_1
+       b       system_call_common
+
+       STD_EXCEPTION_ISERIES(single_step, PACA_EXGEN)
+       STD_EXCEPTION_ISERIES(trap_0e, PACA_EXGEN)
+       STD_EXCEPTION_ISERIES(performance_monitor, PACA_EXGEN)
+
+decrementer_iSeries_masked:
+       /* We may not have a valid TOC pointer in here. */
+       li      r11,1
+       ld      r12,PACALPPACAPTR(r13)
+       stb     r11,LPPACADECRINT(r12)
+       LOAD_REG_IMMEDIATE(r12, tb_ticks_per_jiffy)
+       lwz     r12,0(r12)
+       mtspr   SPRN_DEC,r12
+       /* fall through */
+
+hardware_interrupt_iSeries_masked:
+       mtcrf   0x80,r9         /* Restore regs */
+       ld      r12,PACALPPACAPTR(r13)
+       ld      r11,LPPACASRR0(r12)
+       ld      r12,LPPACASRR1(r12)
+       mtspr   SPRN_SRR0,r11
+       mtspr   SPRN_SRR1,r12
+       ld      r9,PACA_EXGEN+EX_R9(r13)
+       ld      r10,PACA_EXGEN+EX_R10(r13)
+       ld      r11,PACA_EXGEN+EX_R11(r13)
+       ld      r12,PACA_EXGEN+EX_R12(r13)
+       ld      r13,PACA_EXGEN+EX_R13(r13)
+       rfid
+       b       .       /* prevent speculative execution */
+
+_INIT_STATIC(__start_initialization_iSeries)
+       /* Clear out the BSS */
+       LOAD_REG_IMMEDIATE(r11,__bss_stop)
+       LOAD_REG_IMMEDIATE(r8,__bss_start)
+       sub     r11,r11,r8              /* bss size                     */
+       addi    r11,r11,7               /* round up to an even double word */
+       rldicl. r11,r11,61,3            /* shift right by 3             */
+       beq     4f
+       addi    r8,r8,-8
+       li      r0,0
+       mtctr   r11                     /* zero this many doublewords   */
+3:     stdu    r0,8(r8)
+       bdnz    3b
+4:
+       LOAD_REG_IMMEDIATE(r1,init_thread_union)
+       addi    r1,r1,THREAD_SIZE
+       li      r0,0
+       stdu    r0,-STACK_FRAME_OVERHEAD(r1)
+
+       LOAD_REG_IMMEDIATE(r2,__toc_start)
+       addi    r2,r2,0x4000
+       addi    r2,r2,0x4000
+
+       bl      .iSeries_early_setup
+       bl      .early_setup
+
+       /* relocation is on at this point */
+
+       b       .start_here_common
diff --git a/arch/powerpc/platforms/iseries/exception.h b/arch/powerpc/platforms/iseries/exception.h
new file mode 100644 (file)
index 0000000..ced45a8
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef _ASM_POWERPC_ISERIES_EXCEPTION_H
+#define _ASM_POWERPC_ISERIES_EXCEPTION_H
+/*
+ * Extracted from head_64.S
+ *
+ *  PowerPC version
+ *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *
+ *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
+ *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
+ *  Adapted for Power Macintosh by Paul Mackerras.
+ *  Low-level exception handlers and MMU support
+ *  rewritten by Paul Mackerras.
+ *    Copyright (C) 1996 Paul Mackerras.
+ *
+ *  Adapted for 64bit PowerPC by Dave Engebretsen, Peter Bergner, and
+ *    Mike Corrigan {engebret|bergner|mikejc}@us.ibm.com
+ *
+ *  This file contains the low-level support and setup for the
+ *  PowerPC-64 platform, including trap and interrupt dispatch.
+ *
+ *  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 <asm/exception.h>
+
+#define EXCEPTION_PROLOG_ISERIES_1                                     \
+       mfmsr   r10;                                                    \
+       ld      r12,PACALPPACAPTR(r13);                                 \
+       ld      r11,LPPACASRR0(r12);                                    \
+       ld      r12,LPPACASRR1(r12);                                    \
+       ori     r10,r10,MSR_RI;                                         \
+       mtmsrd  r10,1
+
+#define STD_EXCEPTION_ISERIES(label, area)                             \
+       .globl label##_iSeries;                                         \
+label##_iSeries:                                                       \
+       HMT_MEDIUM;                                                     \
+       mtspr   SPRN_SPRG1,r13;         /* save r13 */                  \
+       EXCEPTION_PROLOG_1(area);                                       \
+       EXCEPTION_PROLOG_ISERIES_1;                                     \
+       b       label##_common
+
+#define MASKABLE_EXCEPTION_ISERIES(label)                              \
+       .globl label##_iSeries;                                         \
+label##_iSeries:                                                       \
+       HMT_MEDIUM;                                                     \
+       mtspr   SPRN_SPRG1,r13;         /* save r13 */                  \
+       EXCEPTION_PROLOG_1(PACA_EXGEN);                                 \
+       lbz     r10,PACASOFTIRQEN(r13);                                 \
+       cmpwi   0,r10,0;                                                \
+       beq-    label##_iSeries_masked;                                 \
+       EXCEPTION_PROLOG_ISERIES_1;                                     \
+       b       label##_common;                                         \
+
+#endif /* _ASM_POWERPC_ISERIES_EXCEPTION_H */
index b4e2c7a038e1b0143dfd8ffec17612e765cb460f..15a7097e5dd742ab36f368ed4cabea7467e85177 100644 (file)
@@ -86,7 +86,8 @@ long iSeries_hpte_insert(unsigned long hpte_group, unsigned long va,
        }
 
 
-       lhpte.v = hpte_encode_v(va, MMU_PAGE_4K) | vflags | HPTE_V_VALID;
+       lhpte.v = hpte_encode_v(va, MMU_PAGE_4K, MMU_SEGSIZE_256M) |
+               vflags | HPTE_V_VALID;
        lhpte.r = hpte_encode_r(phys_to_abs(pa), MMU_PAGE_4K) | rflags;
 
        /* Now fill in the actual HPTE */
@@ -142,7 +143,7 @@ static long iSeries_hpte_remove(unsigned long hpte_group)
  *     bits 61..63 : PP2,PP1,PP0
  */
 static long iSeries_hpte_updatepp(unsigned long slot, unsigned long newpp,
-                                 unsigned long va, int psize, int local)
+                       unsigned long va, int psize, int ssize, int local)
 {
        struct hash_pte hpte;
        unsigned long want_v;
@@ -150,7 +151,7 @@ static long iSeries_hpte_updatepp(unsigned long slot, unsigned long newpp,
        iSeries_hlock(slot);
 
        HvCallHpt_get(&hpte, slot);
-       want_v = hpte_encode_v(va, MMU_PAGE_4K);
+       want_v = hpte_encode_v(va, MMU_PAGE_4K, MMU_SEGSIZE_256M);
 
        if (HPTE_V_COMPARE(hpte.v, want_v) && (hpte.v & HPTE_V_VALID)) {
                /*
@@ -205,14 +206,14 @@ static long iSeries_hpte_find(unsigned long vpn)
  * No need to lock here because we should be the only user.
  */
 static void iSeries_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
-                                       int psize)
+                                       int psize, int ssize)
 {
        unsigned long vsid,va,vpn;
        long slot;
 
        BUG_ON(psize != MMU_PAGE_4K);
 
-       vsid = get_kernel_vsid(ea);
+       vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M);
        va = (vsid << 28) | (ea & 0x0fffffff);
        vpn = va >> HW_PAGE_SHIFT;
        slot = iSeries_hpte_find(vpn);
@@ -222,7 +223,7 @@ static void iSeries_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
 }
 
 static void iSeries_hpte_invalidate(unsigned long slot, unsigned long va,
-                                   int psize, int local)
+                                   int psize, int ssize, int local)
 {
        unsigned long hpte_v;
        unsigned long avpn = va >> 23;
index 3b6a9666c2c07c0407989a5a17d98e2cdcdf4179..49e9c664ea89b0745829dfd52058f620b35fdb27 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/list.h>
 #include <linux/pci.h>
+#include <linux/module.h>
 
 #include <asm/iommu.h>
+#include <asm/vio.h>
 #include <asm/tce.h>
 #include <asm/machdep.h>
 #include <asm/abs_addr.h>
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
 #include <asm/iseries/hv_call_xm.h>
+#include <asm/iseries/hv_call_event.h>
 #include <asm/iseries/iommu.h>
 
 static void tce_build_iSeries(struct iommu_table *tbl, long index, long npages,
@@ -189,6 +192,55 @@ void iommu_devnode_init_iSeries(struct pci_dev *pdev, struct device_node *dn)
 }
 #endif
 
+static struct iommu_table veth_iommu_table;
+static struct iommu_table vio_iommu_table;
+
+void *iseries_hv_alloc(size_t size, dma_addr_t *dma_handle, gfp_t flag)
+{
+       return iommu_alloc_coherent(&vio_iommu_table, size, dma_handle,
+                               DMA_32BIT_MASK, flag, -1);
+}
+EXPORT_SYMBOL_GPL(iseries_hv_alloc);
+
+void iseries_hv_free(size_t size, void *vaddr, dma_addr_t dma_handle)
+{
+       iommu_free_coherent(&vio_iommu_table, size, vaddr, dma_handle);
+}
+EXPORT_SYMBOL_GPL(iseries_hv_free);
+
+dma_addr_t iseries_hv_map(void *vaddr, size_t size,
+                       enum dma_data_direction direction)
+{
+       return iommu_map_single(&vio_iommu_table, vaddr, size,
+                               DMA_32BIT_MASK, direction);
+}
+
+void iseries_hv_unmap(dma_addr_t dma_handle, size_t size,
+                       enum dma_data_direction direction)
+{
+       iommu_unmap_single(&vio_iommu_table, dma_handle, size, direction);
+}
+
+void __init iommu_vio_init(void)
+{
+       iommu_table_getparms_iSeries(255, 0, 0xff, &veth_iommu_table);
+       veth_iommu_table.it_size /= 2;
+       vio_iommu_table = veth_iommu_table;
+       vio_iommu_table.it_offset += veth_iommu_table.it_size;
+
+       if (!iommu_init_table(&veth_iommu_table, -1))
+               printk("Virtual Bus VETH TCE table failed.\n");
+       if (!iommu_init_table(&vio_iommu_table, -1))
+               printk("Virtual Bus VIO TCE table failed.\n");
+}
+
+struct iommu_table *vio_build_iommu_table_iseries(struct vio_dev *dev)
+{
+       if (strcmp(dev->type, "network") == 0)
+               return &veth_iommu_table;
+       return &vio_iommu_table;
+}
+
 void iommu_init_early_iSeries(void)
 {
        ppc_md.tce_build = tce_build_iSeries;
index 63b33675848b01f77ef713b6224590f2a055a8b3..701d9297c207fac27848f1b96a2d9ceaa083d5cd 100644 (file)
@@ -346,8 +346,15 @@ static int iseries_irq_host_map(struct irq_host *h, unsigned int virq,
        return 0;
 }
 
+static int iseries_irq_host_match(struct irq_host *h, struct device_node *np)
+{
+       /* Match all */
+       return 1;
+}
+
 static struct irq_host_ops iseries_irq_host_ops = {
        .map = iseries_irq_host_map,
+       .match = iseries_irq_host_match,
 };
 
 /*
@@ -369,7 +376,8 @@ void __init iSeries_init_IRQ(void)
        /* Create irq host. No need for a revmap since HV will give us
         * back our virtual irq number
         */
-       host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &iseries_irq_host_ops, 0);
+       host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0,
+                             &iseries_irq_host_ops, 0);
        BUG_ON(host == NULL);
        irq_set_default_host(host);
 
index 9bbf589868191b882c4974558db9e1bc06a5abaa..cf6dcf6ef07b61d79802a84d6c83e72c908a7a7f 100644 (file)
@@ -60,7 +60,7 @@ struct ItLpNaca {
        u8      xRsvd2_0[128];          // Reserved                     x00-x7F
 
 // CACHE_LINE_3-6 0x0100 - 0x02FF Contains LP Queue indicators
-// NB: Padding required to keep xInterrruptHdlr at x300 which is required
+// NB: Padding required to keep xInterruptHdlr at x300 which is required
 // for v4r4 PLIC.
        u8      xOldLpQueue[128];       // LP Queue needed for v4r4     100-17F
        u8      xRsvd3_0[384];          // Reserved                     180-2FF
index b1187d95e3b27fc6da3a873e374babcc1d265c4b..c0f2433bc16e75c20532982c65e581902b0e5481 100644 (file)
@@ -39,9 +39,9 @@
 #include <asm/paca.h>
 #include <asm/abs_addr.h>
 #include <asm/firmware.h>
-#include <asm/iseries/vio.h>
 #include <asm/iseries/mf.h>
 #include <asm/iseries/hv_lp_config.h>
+#include <asm/iseries/hv_lp_event.h>
 #include <asm/iseries/it_lp_queue.h>
 
 #include "setup.h"
@@ -870,8 +870,7 @@ static int proc_mf_dump_cmdline(char *page, char **start, off_t off,
        if ((off + count) > 256)
                count = 256 - off;
 
-       dma_addr = dma_map_single(iSeries_vio_dev, page, off + count,
-                       DMA_FROM_DEVICE);
+       dma_addr = iseries_hv_map(page, off + count, DMA_FROM_DEVICE);
        if (dma_mapping_error(dma_addr))
                return -ENOMEM;
        memset(page, 0, off + count);
@@ -883,8 +882,7 @@ static int proc_mf_dump_cmdline(char *page, char **start, off_t off,
        vsp_cmd.sub_data.kern.length = off + count;
        mb();
        rc = signal_vsp_instruction(&vsp_cmd);
-       dma_unmap_single(iSeries_vio_dev, dma_addr, off + count,
-                       DMA_FROM_DEVICE);
+       iseries_hv_unmap(dma_addr, off + count, DMA_FROM_DEVICE);
        if (rc)
                return rc;
        if (vsp_cmd.result_code != 0)
@@ -919,8 +917,7 @@ static int mf_getVmlinuxChunk(char *buffer, int *size, int offset, u64 side)
        int len = *size;
        dma_addr_t dma_addr;
 
-       dma_addr = dma_map_single(iSeries_vio_dev, buffer, len,
-                       DMA_FROM_DEVICE);
+       dma_addr = iseries_hv_map(buffer, len, DMA_FROM_DEVICE);
        memset(buffer, 0, len);
        memset(&vsp_cmd, 0, sizeof(vsp_cmd));
        vsp_cmd.cmd = 32;
@@ -938,7 +935,7 @@ static int mf_getVmlinuxChunk(char *buffer, int *size, int offset, u64 side)
                        rc = -ENOMEM;
        }
 
-       dma_unmap_single(iSeries_vio_dev, dma_addr, len, DMA_FROM_DEVICE);
+       iseries_hv_unmap(dma_addr, len, DMA_FROM_DEVICE);
 
        return rc;
 }
@@ -1149,8 +1146,7 @@ static int proc_mf_change_cmdline(struct file *file, const char __user *buffer,
                goto out;
 
        dma_addr = 0;
-       page = dma_alloc_coherent(iSeries_vio_dev, count, &dma_addr,
-                       GFP_ATOMIC);
+       page = iseries_hv_alloc(count, &dma_addr, GFP_ATOMIC);
        ret = -ENOMEM;
        if (page == NULL)
                goto out;
@@ -1170,7 +1166,7 @@ static int proc_mf_change_cmdline(struct file *file, const char __user *buffer,
        ret = count;
 
 out_free:
-       dma_free_coherent(iSeries_vio_dev, count, page, dma_addr);
+       iseries_hv_free(count, page, dma_addr);
 out:
        return ret;
 }
@@ -1190,8 +1186,7 @@ static ssize_t proc_mf_change_vmlinux(struct file *file,
                goto out;
 
        dma_addr = 0;
-       page = dma_alloc_coherent(iSeries_vio_dev, count, &dma_addr,
-                       GFP_ATOMIC);
+       page = iseries_hv_alloc(count, &dma_addr, GFP_ATOMIC);
        rc = -ENOMEM;
        if (page == NULL) {
                printk(KERN_ERR "mf.c: couldn't allocate memory to set vmlinux chunk\n");
@@ -1219,7 +1214,7 @@ static ssize_t proc_mf_change_vmlinux(struct file *file,
        *ppos += count;
        rc = count;
 out_free:
-       dma_free_coherent(iSeries_vio_dev, count, page, dma_addr);
+       iseries_hv_free(count, page, dma_addr);
 out:
        return rc;
 }
index 13a8b1908deda3c4c733003fd649701eba0c7cce..37ae07ee54a9886944d5f15e932deac4abeb9432 100644 (file)
@@ -26,6 +26,8 @@
 #include <linux/major.h>
 #include <linux/root_dev.h>
 #include <linux/kernel.h>
+#include <linux/hrtimer.h>
+#include <linux/tick.h>
 
 #include <asm/processor.h>
 #include <asm/machdep.h>
@@ -41,7 +43,6 @@
 #include <asm/time.h>
 #include <asm/paca.h>
 #include <asm/cache.h>
-#include <asm/sections.h>
 #include <asm/abs_addr.h>
 #include <asm/iseries/hv_lp_config.h>
 #include <asm/iseries/hv_call_event.h>
@@ -562,6 +563,7 @@ static void yield_shared_processor(void)
 static void iseries_shared_idle(void)
 {
        while (1) {
+               tick_nohz_stop_sched_tick();
                while (!need_resched() && !hvlpevent_is_pending()) {
                        local_irq_disable();
                        ppc64_runlatch_off();
@@ -575,6 +577,7 @@ static void iseries_shared_idle(void)
                }
 
                ppc64_runlatch_on();
+               tick_nohz_restart_sched_tick();
 
                if (hvlpevent_is_pending())
                        process_iSeries_events();
@@ -590,6 +593,7 @@ static void iseries_dedicated_idle(void)
        set_thread_flag(TIF_POLLING_NRFLAG);
 
        while (1) {
+               tick_nohz_stop_sched_tick();
                if (!need_resched()) {
                        while (!need_resched()) {
                                ppc64_runlatch_off();
@@ -606,6 +610,7 @@ static void iseries_dedicated_idle(void)
                }
 
                ppc64_runlatch_on();
+               tick_nohz_restart_sched_tick();
                preempt_enable_no_resched();
                schedule();
                preempt_disable();
diff --git a/arch/powerpc/platforms/iseries/vio.c b/arch/powerpc/platforms/iseries/vio.c
new file mode 100644 (file)
index 0000000..910b00b
--- /dev/null
@@ -0,0 +1,553 @@
+/*
+ * Legacy iSeries specific vio initialisation
+ * that needs to be built in (not a module).
+ *
+ * Ã‚© Copyright 2007 IBM Corporation
+ *     Author: Stephen Rothwell
+ *     Some parts collected from various other files
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <linux/of.h>
+#include <linux/init.h>
+#include <linux/gfp.h>
+#include <linux/completion.h>
+#include <linux/proc_fs.h>
+#include <linux/module.h>
+
+#include <asm/firmware.h>
+#include <asm/vio.h>
+#include <asm/iseries/vio.h>
+#include <asm/iseries/iommu.h>
+#include <asm/iseries/hv_types.h>
+#include <asm/iseries/hv_lp_event.h>
+
+#define FIRST_VTY      0
+#define NUM_VTYS       1
+#define FIRST_VSCSI    (FIRST_VTY + NUM_VTYS)
+#define NUM_VSCSIS     1
+#define FIRST_VLAN     (FIRST_VSCSI + NUM_VSCSIS)
+#define NUM_VLANS      HVMAXARCHITECTEDVIRTUALLANS
+#define FIRST_VIODASD  (FIRST_VLAN + NUM_VLANS)
+#define NUM_VIODASDS   HVMAXARCHITECTEDVIRTUALDISKS
+#define FIRST_VIOCD    (FIRST_VIODASD + NUM_VIODASDS)
+#define NUM_VIOCDS     HVMAXARCHITECTEDVIRTUALCDROMS
+#define FIRST_VIOTAPE  (FIRST_VIOCD + NUM_VIOCDS)
+#define NUM_VIOTAPES   HVMAXARCHITECTEDVIRTUALTAPES
+
+struct vio_waitevent {
+       struct completion       com;
+       int                     rc;
+       u16                     sub_result;
+};
+
+struct vio_resource {
+       char    rsrcname[10];
+       char    type[4];
+       char    model[3];
+};
+
+static struct property *new_property(const char *name, int length,
+               const void *value)
+{
+       struct property *np = kzalloc(sizeof(*np) + strlen(name) + 1 + length,
+                       GFP_KERNEL);
+
+       if (!np)
+               return NULL;
+       np->name = (char *)(np + 1);
+       np->value = np->name + strlen(name) + 1;
+       strcpy(np->name, name);
+       memcpy(np->value, value, length);
+       np->length = length;
+       return np;
+}
+
+static void __init free_property(struct property *np)
+{
+       kfree(np);
+}
+
+static struct device_node *new_node(const char *path,
+               struct device_node *parent)
+{
+       struct device_node *np = kzalloc(sizeof(*np), GFP_KERNEL);
+
+       if (!np)
+               return NULL;
+       np->full_name = kmalloc(strlen(path) + 1, GFP_KERNEL);
+       if (!np->full_name) {
+               kfree(np);
+               return NULL;
+       }
+       strcpy(np->full_name, path);
+       of_node_set_flag(np, OF_DYNAMIC);
+       kref_init(&np->kref);
+       np->parent = of_node_get(parent);
+       return np;
+}
+
+static void free_node(struct device_node *np)
+{
+       struct property *next;
+       struct property *prop;
+
+       next = np->properties;
+       while (next) {
+               prop = next;
+               next = prop->next;
+               free_property(prop);
+       }
+       of_node_put(np->parent);
+       kfree(np->full_name);
+       kfree(np);
+}
+
+static int add_string_property(struct device_node *np, const char *name,
+               const char *value)
+{
+       struct property *nprop = new_property(name, strlen(value) + 1, value);
+
+       if (!nprop)
+               return 0;
+       prom_add_property(np, nprop);
+       return 1;
+}
+
+static int add_raw_property(struct device_node *np, const char *name,
+               int length, const void *value)
+{
+       struct property *nprop = new_property(name, length, value);
+
+       if (!nprop)
+               return 0;
+       prom_add_property(np, nprop);
+       return 1;
+}
+
+static struct device_node *do_device_node(struct device_node *parent,
+               const char *name, u32 reg, u32 unit, const char *type,
+               const char *compat, struct vio_resource *res)
+{
+       struct device_node *np;
+       char path[32];
+
+       snprintf(path, sizeof(path), "/vdevice/%s@%08x", name, reg);
+       np = new_node(path, parent);
+       if (!np)
+               return NULL;
+       if (!add_string_property(np, "name", name) ||
+               !add_string_property(np, "device_type", type) ||
+               !add_string_property(np, "compatible", compat) ||
+               !add_raw_property(np, "reg", sizeof(reg), &reg) ||
+               !add_raw_property(np, "linux,unit_address",
+                       sizeof(unit), &unit)) {
+               goto node_free;
+       }
+       if (res) {
+               if (!add_raw_property(np, "linux,vio_rsrcname",
+                               sizeof(res->rsrcname), res->rsrcname) ||
+                       !add_raw_property(np, "linux,vio_type",
+                               sizeof(res->type), res->type) ||
+                       !add_raw_property(np, "linux,vio_model",
+                               sizeof(res->model), res->model))
+                       goto node_free;
+       }
+       np->name = of_get_property(np, "name", NULL);
+       np->type = of_get_property(np, "device_type", NULL);
+       of_attach_node(np);
+#ifdef CONFIG_PROC_DEVICETREE
+       if (parent->pde) {
+               struct proc_dir_entry *ent;
+
+               ent = proc_mkdir(strrchr(np->full_name, '/') + 1, parent->pde);
+               if (ent)
+                       proc_device_tree_add_node(np, ent);
+       }
+#endif
+       return np;
+
+ node_free:
+       free_node(np);
+       return NULL;
+}
+
+/*
+ * This is here so that we can dynamically add viodasd
+ * devices without exposing all the above infrastructure.
+ */
+struct vio_dev *vio_create_viodasd(u32 unit)
+{
+       struct device_node *vio_root;
+       struct device_node *np;
+       struct vio_dev *vdev = NULL;
+
+       vio_root = of_find_node_by_path("/vdevice");
+       if (!vio_root)
+               return NULL;
+       np = do_device_node(vio_root, "viodasd", FIRST_VIODASD + unit, unit,
+                       "block", "IBM,iSeries-viodasd", NULL);
+       of_node_put(vio_root);
+       if (np) {
+               vdev = vio_register_device_node(np);
+               if (!vdev)
+                       free_node(np);
+       }
+       return vdev;
+}
+EXPORT_SYMBOL_GPL(vio_create_viodasd);
+
+static void __init handle_block_event(struct HvLpEvent *event)
+{
+       struct vioblocklpevent *bevent = (struct vioblocklpevent *)event;
+       struct vio_waitevent *pwe;
+
+       if (event == NULL)
+               /* Notification that a partition went away! */
+               return;
+       /* First, we should NEVER get an int here...only acks */
+       if (hvlpevent_is_int(event)) {
+               printk(KERN_WARNING "handle_viod_request: "
+                      "Yikes! got an int in viodasd event handler!\n");
+               if (hvlpevent_need_ack(event)) {
+                       event->xRc = HvLpEvent_Rc_InvalidSubtype;
+                       HvCallEvent_ackLpEvent(event);
+               }
+               return;
+       }
+
+       switch (event->xSubtype & VIOMINOR_SUBTYPE_MASK) {
+       case vioblockopen:
+               /*
+                * Handle a response to an open request.  We get all the
+                * disk information in the response, so update it.  The
+                * correlation token contains a pointer to a waitevent
+                * structure that has a completion in it.  update the
+                * return code in the waitevent structure and post the
+                * completion to wake up the guy who sent the request
+                */
+               pwe = (struct vio_waitevent *)event->xCorrelationToken;
+               pwe->rc = event->xRc;
+               pwe->sub_result = bevent->sub_result;
+               complete(&pwe->com);
+               break;
+       case vioblockclose:
+               break;
+       default:
+               printk(KERN_WARNING "handle_viod_request: unexpected subtype!");
+               if (hvlpevent_need_ack(event)) {
+                       event->xRc = HvLpEvent_Rc_InvalidSubtype;
+                       HvCallEvent_ackLpEvent(event);
+               }
+       }
+}
+
+static void __init probe_disk(struct device_node *vio_root, u32 unit)
+{
+       HvLpEvent_Rc hvrc;
+       struct vio_waitevent we;
+       u16 flags = 0;
+
+retry:
+       init_completion(&we.com);
+
+       /* Send the open event to OS/400 */
+       hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
+                       HvLpEvent_Type_VirtualIo,
+                       viomajorsubtype_blockio | vioblockopen,
+                       HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck,
+                       viopath_sourceinst(viopath_hostLp),
+                       viopath_targetinst(viopath_hostLp),
+                       (u64)(unsigned long)&we, VIOVERSION << 16,
+                       ((u64)unit << 48) | ((u64)flags<< 32),
+                       0, 0, 0);
+       if (hvrc != 0) {
+               printk(KERN_WARNING "probe_disk: bad rc on HV open %d\n",
+                       (int)hvrc);
+               return;
+       }
+
+       wait_for_completion(&we.com);
+
+       if (we.rc != 0) {
+               if (flags != 0)
+                       return;
+               /* try again with read only flag set */
+               flags = vioblockflags_ro;
+               goto retry;
+       }
+
+       /* Send the close event to OS/400.  We DON'T expect a response */
+       hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
+                       HvLpEvent_Type_VirtualIo,
+                       viomajorsubtype_blockio | vioblockclose,
+                       HvLpEvent_AckInd_NoAck, HvLpEvent_AckType_ImmediateAck,
+                       viopath_sourceinst(viopath_hostLp),
+                       viopath_targetinst(viopath_hostLp),
+                       0, VIOVERSION << 16,
+                       ((u64)unit << 48) | ((u64)flags << 32),
+                       0, 0, 0);
+       if (hvrc != 0) {
+               printk(KERN_WARNING "probe_disk: "
+                      "bad rc sending event to OS/400 %d\n", (int)hvrc);
+               return;
+       }
+
+       do_device_node(vio_root, "viodasd", FIRST_VIODASD + unit, unit,
+                       "block", "IBM,iSeries-viodasd", NULL);
+}
+
+static void __init get_viodasd_info(struct device_node *vio_root)
+{
+       int rc;
+       u32 unit;
+
+       rc = viopath_open(viopath_hostLp, viomajorsubtype_blockio, 2);
+       if (rc) {
+               printk(KERN_WARNING "get_viodasd_info: "
+                      "error opening path to host partition %d\n",
+                      viopath_hostLp);
+               return;
+       }
+
+       /* Initialize our request handler */
+       vio_setHandler(viomajorsubtype_blockio, handle_block_event);
+
+       for (unit = 0; unit < HVMAXARCHITECTEDVIRTUALDISKS; unit++)
+               probe_disk(vio_root, unit);
+
+       vio_clearHandler(viomajorsubtype_blockio);
+       viopath_close(viopath_hostLp, viomajorsubtype_blockio, 2);
+}
+
+static void __init handle_cd_event(struct HvLpEvent *event)
+{
+       struct viocdlpevent *bevent;
+       struct vio_waitevent *pwe;
+
+       if (!event)
+               /* Notification that a partition went away! */
+               return;
+
+       /* First, we should NEVER get an int here...only acks */
+       if (hvlpevent_is_int(event)) {
+               printk(KERN_WARNING "handle_cd_event: got an unexpected int\n");
+               if (hvlpevent_need_ack(event)) {
+                       event->xRc = HvLpEvent_Rc_InvalidSubtype;
+                       HvCallEvent_ackLpEvent(event);
+               }
+               return;
+       }
+
+       bevent = (struct viocdlpevent *)event;
+
+       switch (event->xSubtype & VIOMINOR_SUBTYPE_MASK) {
+       case viocdgetinfo:
+               pwe = (struct vio_waitevent *)event->xCorrelationToken;
+               pwe->rc = event->xRc;
+               pwe->sub_result = bevent->sub_result;
+               complete(&pwe->com);
+               break;
+
+       default:
+               printk(KERN_WARNING "handle_cd_event: "
+                       "message with unexpected subtype %0x04X!\n",
+                       event->xSubtype & VIOMINOR_SUBTYPE_MASK);
+               if (hvlpevent_need_ack(event)) {
+                       event->xRc = HvLpEvent_Rc_InvalidSubtype;
+                       HvCallEvent_ackLpEvent(event);
+               }
+       }
+}
+
+static void __init get_viocd_info(struct device_node *vio_root)
+{
+       HvLpEvent_Rc hvrc;
+       u32 unit;
+       struct vio_waitevent we;
+       struct vio_resource *unitinfo;
+       dma_addr_t unitinfo_dmaaddr;
+       int ret;
+
+       ret = viopath_open(viopath_hostLp, viomajorsubtype_cdio, 2);
+       if (ret) {
+               printk(KERN_WARNING
+                       "get_viocd_info: error opening path to host partition %d\n",
+                       viopath_hostLp);
+               return;
+       }
+
+       /* Initialize our request handler */
+       vio_setHandler(viomajorsubtype_cdio, handle_cd_event);
+
+       unitinfo = iseries_hv_alloc(
+                       sizeof(*unitinfo) * HVMAXARCHITECTEDVIRTUALCDROMS,
+                       &unitinfo_dmaaddr, GFP_ATOMIC);
+       if (!unitinfo) {
+               printk(KERN_WARNING
+                       "get_viocd_info: error allocating unitinfo\n");
+               goto clear_handler;
+       }
+
+       memset(unitinfo, 0, sizeof(*unitinfo) * HVMAXARCHITECTEDVIRTUALCDROMS);
+
+       init_completion(&we.com);
+
+       hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
+                       HvLpEvent_Type_VirtualIo,
+                       viomajorsubtype_cdio | viocdgetinfo,
+                       HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck,
+                       viopath_sourceinst(viopath_hostLp),
+                       viopath_targetinst(viopath_hostLp),
+                       (u64)&we, VIOVERSION << 16, unitinfo_dmaaddr, 0,
+                       sizeof(*unitinfo) * HVMAXARCHITECTEDVIRTUALCDROMS, 0);
+       if (hvrc != HvLpEvent_Rc_Good) {
+               printk(KERN_WARNING
+                       "get_viocd_info: cdrom error sending event. rc %d\n",
+                       (int)hvrc);
+               goto hv_free;
+       }
+
+       wait_for_completion(&we.com);
+
+       if (we.rc) {
+               printk(KERN_WARNING "get_viocd_info: bad rc %d:0x%04X\n",
+                       we.rc, we.sub_result);
+               goto hv_free;
+       }
+
+       for (unit = 0; (unit < HVMAXARCHITECTEDVIRTUALCDROMS) &&
+                       unitinfo[unit].rsrcname[0]; unit++) {
+               if (!do_device_node(vio_root, "viocd", FIRST_VIOCD + unit, unit,
+                               "block", "IBM,iSeries-viocd", &unitinfo[unit]))
+                       break;
+       }
+
+ hv_free:
+       iseries_hv_free(sizeof(*unitinfo) * HVMAXARCHITECTEDVIRTUALCDROMS,
+                       unitinfo, unitinfo_dmaaddr);
+ clear_handler:
+       vio_clearHandler(viomajorsubtype_cdio);
+       viopath_close(viopath_hostLp, viomajorsubtype_cdio, 2);
+}
+
+/* Handle interrupt events for tape */
+static void __init handle_tape_event(struct HvLpEvent *event)
+{
+       struct vio_waitevent *we;
+       struct viotapelpevent *tevent = (struct viotapelpevent *)event;
+
+       if (event == NULL)
+               /* Notification that a partition went away! */
+               return;
+
+       we = (struct vio_waitevent *)event->xCorrelationToken;
+       switch (event->xSubtype & VIOMINOR_SUBTYPE_MASK) {
+       case viotapegetinfo:
+               we->rc = tevent->sub_type_result;
+               complete(&we->com);
+               break;
+       default:
+               printk(KERN_WARNING "handle_tape_event: weird ack\n");
+       }
+}
+
+static void __init get_viotape_info(struct device_node *vio_root)
+{
+       HvLpEvent_Rc hvrc;
+       u32 unit;
+       struct vio_resource *unitinfo;
+       dma_addr_t unitinfo_dmaaddr;
+       size_t len = sizeof(*unitinfo) * HVMAXARCHITECTEDVIRTUALTAPES;
+       struct vio_waitevent we;
+       int ret;
+
+       ret = viopath_open(viopath_hostLp, viomajorsubtype_tape, 2);
+       if (ret) {
+               printk(KERN_WARNING "get_viotape_info: "
+                       "error on viopath_open to hostlp %d\n", ret);
+               return;
+       }
+
+       vio_setHandler(viomajorsubtype_tape, handle_tape_event);
+
+       unitinfo = iseries_hv_alloc(len, &unitinfo_dmaaddr, GFP_ATOMIC);
+       if (!unitinfo)
+               goto clear_handler;
+
+       memset(unitinfo, 0, len);
+
+       hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
+                       HvLpEvent_Type_VirtualIo,
+                       viomajorsubtype_tape | viotapegetinfo,
+                       HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck,
+                       viopath_sourceinst(viopath_hostLp),
+                       viopath_targetinst(viopath_hostLp),
+                       (u64)(unsigned long)&we, VIOVERSION << 16,
+                       unitinfo_dmaaddr, len, 0, 0);
+       if (hvrc != HvLpEvent_Rc_Good) {
+               printk(KERN_WARNING "get_viotape_info: hv error on op %d\n",
+                               (int)hvrc);
+               goto hv_free;
+       }
+
+       wait_for_completion(&we.com);
+
+       for (unit = 0; (unit < HVMAXARCHITECTEDVIRTUALTAPES) &&
+                       unitinfo[unit].rsrcname[0]; unit++) {
+               if (!do_device_node(vio_root, "viotape", FIRST_VIOTAPE + unit,
+                               unit, "byte", "IBM,iSeries-viotape",
+                               &unitinfo[unit]))
+                       break;
+       }
+
+ hv_free:
+       iseries_hv_free(len, unitinfo, unitinfo_dmaaddr);
+ clear_handler:
+       vio_clearHandler(viomajorsubtype_tape);
+       viopath_close(viopath_hostLp, viomajorsubtype_tape, 2);
+}
+
+static int __init iseries_vio_init(void)
+{
+       struct device_node *vio_root;
+
+       if (!firmware_has_feature(FW_FEATURE_ISERIES))
+               return -ENODEV;
+
+       iommu_vio_init();
+
+       vio_root = of_find_node_by_path("/vdevice");
+       if (!vio_root)
+               return -ENODEV;
+
+       if (viopath_hostLp == HvLpIndexInvalid) {
+               vio_set_hostlp();
+               /* If we don't have a host, bail out */
+               if (viopath_hostLp == HvLpIndexInvalid)
+                       goto put_node;
+       }
+
+       get_viodasd_info(vio_root);
+       get_viocd_info(vio_root);
+       get_viotape_info(vio_root);
+
+       return 0;
+
+ put_node:
+       of_node_put(vio_root);
+       return -ENODEV;
+}
+arch_initcall(iseries_vio_init);
index 6a0060a5f2ecb5178ec476f1cebff3448ec3b174..df23331eb25c2416b99fd91c137fa62675c7bbb8 100644 (file)
@@ -124,8 +124,7 @@ static int proc_viopath_show(struct seq_file *m, void *v)
        if (!buf)
                return 0;
 
-       handle = dma_map_single(iSeries_vio_dev, buf, HW_PAGE_SIZE,
-                               DMA_FROM_DEVICE);
+       handle = iseries_hv_map(buf, HW_PAGE_SIZE, DMA_FROM_DEVICE);
 
        hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
                        HvLpEvent_Type_VirtualIo,
@@ -146,8 +145,7 @@ static int proc_viopath_show(struct seq_file *m, void *v)
        buf[HW_PAGE_SIZE-1] = '\0';
        seq_printf(m, "%s", buf);
 
-       dma_unmap_single(iSeries_vio_dev, handle, HW_PAGE_SIZE,
-                        DMA_FROM_DEVICE);
+       iseries_hv_unmap(handle, HW_PAGE_SIZE, DMA_FROM_DEVICE);
        kfree(buf);
 
        seq_printf(m, "AVAILABLE_VETH=%x\n", vlanMap);
@@ -596,7 +594,7 @@ int viopath_close(HvLpIndex remoteLp, int subtype, int numReq)
                numOpen += viopathStatus[remoteLp].users[i];
 
        if ((viopathStatus[remoteLp].isOpen) && (numOpen == 0)) {
-               printk(VIOPATH_KERN_INFO "closing connection to partition %d",
+               printk(VIOPATH_KERN_INFO "closing connection to partition %d\n",
                                remoteLp);
 
                HvCallEvent_closeLpEventPath(remoteLp,
index 2542403288f92dd769e0e6d2b28d4228e649e894..771ed0cf29a5d8c0c5f8d7858ddf223913d19f5a 100644 (file)
@@ -169,15 +169,12 @@ static int u3_agp_write_config(struct pci_bus *bus, unsigned int devfn,
        switch (len) {
        case 1:
                out_8(addr, val);
-               (void) in_8(addr);
                break;
        case 2:
                out_le16(addr, val);
-               (void) in_le16(addr);
                break;
        default:
                out_le32(addr, val);
-               (void) in_le32(addr);
                break;
        }
        return PCIBIOS_SUCCESSFUL;
@@ -185,8 +182,8 @@ static int u3_agp_write_config(struct pci_bus *bus, unsigned int devfn,
 
 static struct pci_ops u3_agp_pci_ops =
 {
-       u3_agp_read_config,
-       u3_agp_write_config
+       .read = u3_agp_read_config,
+       .write = u3_agp_write_config,
 };
 
 static unsigned long u3_ht_cfa0(u8 devfn, u8 off)
@@ -268,15 +265,12 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn,
        switch (len) {
        case 1:
                out_8(addr, val);
-               (void) in_8(addr);
                break;
        case 2:
                out_le16(addr, val);
-               (void) in_le16(addr);
                break;
        default:
                out_le32(addr, val);
-               (void) in_le32(addr);
                break;
        }
        return PCIBIOS_SUCCESSFUL;
@@ -284,8 +278,8 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn,
 
 static struct pci_ops u3_ht_pci_ops =
 {
-       u3_ht_read_config,
-       u3_ht_write_config
+       .read = u3_ht_read_config,
+       .write = u3_ht_write_config,
 };
 
 static unsigned int u4_pcie_cfa0(unsigned int devfn, unsigned int off)
@@ -376,15 +370,12 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
         switch (len) {
         case 1:
                 out_8(addr, val);
-                (void) in_8(addr);
                 break;
         case 2:
                 out_le16(addr, val);
-                (void) in_le16(addr);
                 break;
         default:
                 out_le32(addr, val);
-                (void) in_le32(addr);
                 break;
         }
         return PCIBIOS_SUCCESSFUL;
@@ -392,8 +383,8 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
 
 static struct pci_ops u4_pcie_pci_ops =
 {
-        u4_pcie_read_config,
-        u4_pcie_write_config
+       .read = u4_pcie_read_config,
+       .write = u4_pcie_write_config,
 };
 
 static void __init setup_u3_agp(struct pci_controller* hose)
index e95261ef6f98e6d0c4edd28e6cc7fb2eab7f05a8..735e1536cbfc15dc93a01d517d55245190694ab6 100644 (file)
@@ -5,6 +5,7 @@ config PPC_PASEMI
        select MPIC
        select PPC_UDBG_16550
        select PPC_NATIVE
+       select MPIC_BROKEN_REGREAD
        help
          This option enables support for PA Semi's PWRficient line
          of SoC processors, including PA6T-1682M
index c91a33593bb86b9b391f5bd15b68cae2b026b9bb..dae9f658122e4ef47dffa02ba5877cd73bac2c52 100644 (file)
@@ -320,10 +320,12 @@ static struct of_device_id gpio_mdio_match[] =
 
 static struct of_platform_driver gpio_mdio_driver =
 {
-       .name           = "gpio-mdio-bitbang",
        .match_table    = gpio_mdio_match,
        .probe          = gpio_mdio_probe,
        .remove         = gpio_mdio_remove,
+       .driver         = {
+               .name   = "gpio-mdio-bitbang",
+       },
 };
 
 int gpio_mdio_init(void)
index 3c962d5757be797446c5195ff32278929f3489ab..d8e1fcc7851388b51c84b20f77f62638e4189fab 100644 (file)
@@ -72,8 +72,11 @@ static int pasemi_system_reset_exception(struct pt_regs *regs)
        return 1;
 }
 
-void __init pasemi_idle_init(void)
+static int __init pasemi_idle_init(void)
 {
+       if (!machine_is(pasemi))
+               return -ENODEV;
+
 #ifndef CONFIG_PPC_PASEMI_CPUFREQ
        printk(KERN_WARNING "No cpufreq driver, powersavings modes disabled\n");
        current_mode = 0;
@@ -82,7 +85,10 @@ void __init pasemi_idle_init(void)
        ppc_md.system_reset_exception = pasemi_system_reset_exception;
        ppc_md.power_save = modes[current_mode].entry;
        printk(KERN_INFO "Using PA6T idle loop (%s)\n", modes[current_mode].name);
+
+       return 0;
 }
+late_initcall(pasemi_idle_init);
 
 static int __init idle_param(char *p)
 {
index a1111b5c6cb467fbdabdd03c3f57ed52b9fe9347..9916a0f3e431955ba78117207e96038841b22ce6 100644 (file)
@@ -192,7 +192,7 @@ static void pci_dma_dev_setup_pasemi(struct pci_dev *dev)
 static void pci_dma_bus_setup_null(struct pci_bus *b) { }
 static void pci_dma_dev_setup_null(struct pci_dev *d) { }
 
-int iob_init(struct device_node *dn)
+int __init iob_init(struct device_node *dn)
 {
        unsigned long tmp;
        u32 regword;
@@ -238,7 +238,7 @@ int iob_init(struct device_node *dn)
 
 
 /* These are called very early. */
-void iommu_init_early_pasemi(void)
+void __init iommu_init_early_pasemi(void)
 {
        int iommu_off;
 
index be84954976116e6000bcdf44eb2d4461edee693c..516acabb4e96a4151b42e2833e907feb633c6ae2 100644 (file)
@@ -6,9 +6,9 @@ extern void pas_pci_init(void);
 extern void __devinit pas_pci_irq_fixup(struct pci_dev *dev);
 extern void __devinit pas_pci_dma_dev_setup(struct pci_dev *dev);
 
-extern void __init alloc_iobmap_l2(void);
+extern void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset);
 
-extern void __init pasemi_idle_init(void);
+extern void __init alloc_iobmap_l2(void);
 
 /* Power savings modes, implemented in asm */
 extern void idle_spin(void);
index ab1f5f62bcd871cbb6d2955b40af5b0754635d51..b6a0ec45c69554c7558ec45f478ce40b5cf1411c 100644 (file)
@@ -51,6 +51,61 @@ static void volatile __iomem *pa_pxp_cfg_addr(struct pci_controller *hose,
        return hose->cfg_data + PA_PXP_CFA(bus, devfn, offset);
 }
 
+static inline int is_root_port(int busno, int devfn)
+{
+       return ((busno == 0) && (PCI_FUNC(devfn) < 4) &&
+                ((PCI_SLOT(devfn) == 16) || (PCI_SLOT(devfn) == 17)));
+}
+
+static inline int is_5945_reg(int reg)
+{
+       return (((reg >= 0x18) && (reg < 0x34)) ||
+               ((reg >= 0x158) && (reg < 0x178)));
+}
+
+static int workaround_5945(struct pci_bus *bus, unsigned int devfn,
+                          int offset, int len, u32 *val)
+{
+       struct pci_controller *hose;
+       void volatile __iomem *addr, *dummy;
+       int byte;
+       u32 tmp;
+
+       if (!is_root_port(bus->number, devfn) || !is_5945_reg(offset))
+               return 0;
+
+       hose = pci_bus_to_host(bus);
+
+       addr = pa_pxp_cfg_addr(hose, bus->number, devfn, offset & ~0x3);
+       byte = offset & 0x3;
+
+       /* Workaround bug 5945: write 0 to a dummy register before reading,
+        * and write back what we read. We must read/write the full 32-bit
+        * contents so we need to shift and mask by hand.
+        */
+       dummy = pa_pxp_cfg_addr(hose, bus->number, devfn, 0x10);
+       out_le32(dummy, 0);
+       tmp = in_le32(addr);
+       out_le32(addr, tmp);
+
+       switch (len) {
+       case 1:
+               *val = (tmp >> (8*byte)) & 0xff;
+               break;
+       case 2:
+               if (byte == 0)
+                       *val = tmp & 0xffff;
+               else
+                       *val = (tmp >> 16) & 0xffff;
+               break;
+       default:
+               *val = tmp;
+               break;
+       }
+
+       return 1;
+}
+
 static int pa_pxp_read_config(struct pci_bus *bus, unsigned int devfn,
                              int offset, int len, u32 *val)
 {
@@ -64,6 +119,9 @@ static int pa_pxp_read_config(struct pci_bus *bus, unsigned int devfn,
        if (!pa_pxp_offset_valid(bus->number, devfn, offset))
                return PCIBIOS_BAD_REGISTER_NUMBER;
 
+       if (workaround_5945(bus, devfn, offset, len, val))
+               return PCIBIOS_SUCCESSFUL;
+
        addr = pa_pxp_cfg_addr(hose, bus->number, devfn, offset);
 
        /*
@@ -107,23 +165,20 @@ static int pa_pxp_write_config(struct pci_bus *bus, unsigned int devfn,
        switch (len) {
        case 1:
                out_8(addr, val);
-               (void) in_8(addr);
                break;
        case 2:
                out_le16(addr, val);
-               (void) in_le16(addr);
                break;
        default:
                out_le32(addr, val);
-               (void) in_le32(addr);
                break;
        }
        return PCIBIOS_SUCCESSFUL;
 }
 
 static struct pci_ops pa_pxp_ops = {
-       pa_pxp_read_config,
-       pa_pxp_write_config,
+       .read = pa_pxp_read_config,
+       .write = pa_pxp_write_config,
 };
 
 static void __init setup_pa_pxp(struct pci_controller *hose)
@@ -178,3 +233,12 @@ void __init pas_pci_init(void)
        /* Use the common resource allocation mechanism */
        pci_probe_only = 1;
 }
+
+void __iomem *pasemi_pci_getcfgaddr(struct pci_dev *dev, int offset)
+{
+       struct pci_controller *hose;
+
+       hose = pci_bus_to_host(dev->bus);
+
+       return (void __iomem *)pa_pxp_cfg_addr(hose, dev->bus->number, dev->devfn, offset);
+}
index ffe6528048b57121a6b4e8d74ee509871b3aa24b..5ddf40a66ae8f189da5fbc4f7d39bf5c3934a40d 100644 (file)
 
 #include "pasemi.h"
 
+/* SDC reset register, must be pre-mapped at reset time */
 static void __iomem *reset_reg;
 
+/* Various error status registers, must be pre-mapped at MCE time */
+
+#define MAX_MCE_REGS   32
+struct mce_regs {
+       char *name;
+       void __iomem *addr;
+};
+
+static struct mce_regs mce_regs[MAX_MCE_REGS];
+static int num_mce_regs;
+
+
 static void pas_restart(char *cmd)
 {
        printk("Restarting...\n");
@@ -50,26 +63,30 @@ static void pas_restart(char *cmd)
 
 #ifdef CONFIG_SMP
 static DEFINE_SPINLOCK(timebase_lock);
+static unsigned long timebase;
 
 static void __devinit pas_give_timebase(void)
 {
-       unsigned long tb;
-
        spin_lock(&timebase_lock);
        mtspr(SPRN_TBCTL, TBCTL_FREEZE);
-       tb = mftb();
-       mtspr(SPRN_TBCTL, TBCTL_UPDATE_LOWER | (tb & 0xffffffff));
-       mtspr(SPRN_TBCTL, TBCTL_UPDATE_UPPER | (tb >> 32));
-       mtspr(SPRN_TBCTL, TBCTL_RESTART);
+       isync();
+       timebase = get_tb();
        spin_unlock(&timebase_lock);
-       pr_debug("pas_give_timebase: cpu %d gave tb %lx\n",
-                smp_processor_id(), tb);
+
+       while (timebase)
+               barrier();
+       mtspr(SPRN_TBCTL, TBCTL_RESTART);
 }
 
 static void __devinit pas_take_timebase(void)
 {
-       pr_debug("pas_take_timebase: cpu %d has tb %lx\n",
-                smp_processor_id(), mftb());
+       while (!timebase)
+               smp_rmb();
+
+       spin_lock(&timebase_lock);
+       set_tb(timebase >> 32, timebase & 0xffffffff);
+       timebase = 0;
+       spin_unlock(&timebase_lock);
 }
 
 struct smp_ops_t pas_smp_ops = {
@@ -98,9 +115,60 @@ void __init pas_setup_arch(void)
        /* Remap SDC register for doing reset */
        /* XXXOJN This should maybe come out of the device tree */
        reset_reg = ioremap(0xfc101100, 4);
+}
+
+static int __init pas_setup_mce_regs(void)
+{
+       struct pci_dev *dev;
+       int reg;
+
+       if (!machine_is(pasemi))
+               return -ENODEV;
+
+       /* Remap various SoC status registers for use by the MCE handler */
+
+       reg = 0;
+
+       dev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa00a, NULL);
+       while (dev && reg < MAX_MCE_REGS) {
+               mce_regs[reg].name = kasprintf(GFP_KERNEL,
+                                               "mc%d_mcdebug_errsta", reg);
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0x730);
+               dev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa00a, dev);
+               reg++;
+       }
+
+       dev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa001, NULL);
+       if (dev && reg+4 < MAX_MCE_REGS) {
+               mce_regs[reg].name = "iobdbg_IntStatus1";
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0x438);
+               reg++;
+               mce_regs[reg].name = "iobdbg_IOCTbusIntDbgReg";
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0x454);
+               reg++;
+               mce_regs[reg].name = "iobiom_IntStatus";
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0xc10);
+               reg++;
+               mce_regs[reg].name = "iobiom_IntDbgReg";
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0xc1c);
+               reg++;
+       }
+
+       dev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa009, NULL);
+       if (dev && reg+2 < MAX_MCE_REGS) {
+               mce_regs[reg].name = "l2csts_IntStatus";
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0x200);
+               reg++;
+               mce_regs[reg].name = "l2csts_Cnt";
+               mce_regs[reg].addr = pasemi_pci_getcfgaddr(dev, 0x214);
+               reg++;
+       }
 
-       pasemi_idle_init();
+       num_mce_regs = reg;
+
+       return 0;
 }
+device_initcall(pas_setup_mce_regs);
 
 static __init void pas_init_IRQ(void)
 {
@@ -162,25 +230,34 @@ static int pas_machine_check_handler(struct pt_regs *regs)
 {
        int cpu = smp_processor_id();
        unsigned long srr0, srr1, dsisr;
+       int dump_slb = 0;
+       int i;
 
        srr0 = regs->nip;
        srr1 = regs->msr;
        dsisr = mfspr(SPRN_DSISR);
        printk(KERN_ERR "Machine Check on CPU %d\n", cpu);
-       printk(KERN_ERR "SRR0 0x%016lx SRR1 0x%016lx\n", srr0, srr1);
-       printk(KERN_ERR "DSISR 0x%016lx DAR 0x%016lx\n", dsisr, regs->dar);
+       printk(KERN_ERR "SRR0  0x%016lx SRR1 0x%016lx\n", srr0, srr1);
+       printk(KERN_ERR "DSISR 0x%016lx DAR  0x%016lx\n", dsisr, regs->dar);
+       printk(KERN_ERR "BER   0x%016lx MER  0x%016lx\n", mfspr(SPRN_PA6T_BER),
+               mfspr(SPRN_PA6T_MER));
+       printk(KERN_ERR "IER   0x%016lx DER  0x%016lx\n", mfspr(SPRN_PA6T_IER),
+               mfspr(SPRN_PA6T_DER));
        printk(KERN_ERR "Cause:\n");
 
        if (srr1 & 0x200000)
                printk(KERN_ERR "Signalled by SDC\n");
+
        if (srr1 & 0x100000) {
                printk(KERN_ERR "Load/Store detected error:\n");
                if (dsisr & 0x8000)
                        printk(KERN_ERR "D-cache ECC double-bit error or bus error\n");
                if (dsisr & 0x4000)
                        printk(KERN_ERR "LSU snoop response error\n");
-               if (dsisr & 0x2000)
+               if (dsisr & 0x2000) {
                        printk(KERN_ERR "MMU SLB multi-hit or invalid B field\n");
+                       dump_slb = 1;
+               }
                if (dsisr & 0x1000)
                        printk(KERN_ERR "Recoverable Duptags\n");
                if (dsisr & 0x800)
@@ -188,13 +265,40 @@ static int pas_machine_check_handler(struct pt_regs *regs)
                if (dsisr & 0x400)
                        printk(KERN_ERR "TLB parity error count overflow\n");
        }
+
        if (srr1 & 0x80000)
                printk(KERN_ERR "Bus Error\n");
-       if (srr1 & 0x40000)
+
+       if (srr1 & 0x40000) {
                printk(KERN_ERR "I-side SLB multiple hit\n");
+               dump_slb = 1;
+       }
+
        if (srr1 & 0x20000)
                printk(KERN_ERR "I-cache parity error hit\n");
 
+       if (num_mce_regs == 0)
+               printk(KERN_ERR "No MCE registers mapped yet, can't dump\n");
+       else
+               printk(KERN_ERR "SoC debug registers:\n");
+
+       for (i = 0; i < num_mce_regs; i++)
+               printk(KERN_ERR "%s: 0x%08x\n", mce_regs[i].name,
+                       in_le32(mce_regs[i].addr));
+
+       if (dump_slb) {
+               unsigned long e, v;
+               int i;
+
+               printk(KERN_ERR "slb contents:\n");
+               for (i = 0; i < SLB_NUM_ENTRIES; i++) {
+                       asm volatile("slbmfee  %0,%1" : "=r" (e) : "r" (i));
+                       asm volatile("slbmfev  %0,%1" : "=r" (v) : "r" (i));
+                       printk(KERN_ERR "%02d %016lx %016lx\n", i, e, v);
+               }
+       }
+
+
        /* SRR1[62] is from MSR[62] if recoverable, so pass that back */
        return !!(srr1 & 0x2);
 }
index 9d73d0234c5d3228cf0bd87a59d91ef83441aaef..cf660916ae0b0101ac36824fd3a2db8fd3e13997 100644 (file)
@@ -17,7 +17,6 @@
 #include <asm/prom.h>
 #include <asm/page.h>
 #include <asm/bootx.h>
-#include <asm/bootinfo.h>
 #include <asm/btext.h>
 #include <asm/io.h>
 
index efdf5eb81ecc79790f4cb72946bdb0c345814883..da2007e3db0e982c78431f38d8d07b44bef82afb 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/completion.h>
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
-#include <linux/completion.h>
 #include <linux/timer.h>
 #include <linux/mutex.h>
 #include <asm/keylargo.h>
index 92586db19754b249f34114764ff59ebd16d7cf35..ec49099830d55b0fe5c256180b3ac8b3c7f4eafb 100644 (file)
@@ -209,15 +209,12 @@ static int macrisc_write_config(struct pci_bus *bus, unsigned int devfn,
        switch (len) {
        case 1:
                out_8(addr, val);
-               (void) in_8(addr);
                break;
        case 2:
                out_le16(addr, val);
-               (void) in_le16(addr);
                break;
        default:
                out_le32(addr, val);
-               (void) in_le32(addr);
                break;
        }
        return PCIBIOS_SUCCESSFUL;
@@ -225,8 +222,8 @@ static int macrisc_write_config(struct pci_bus *bus, unsigned int devfn,
 
 static struct pci_ops macrisc_pci_ops =
 {
-       macrisc_read_config,
-       macrisc_write_config
+       .read = macrisc_read_config,
+       .write = macrisc_write_config,
 };
 
 #ifdef CONFIG_PPC32
@@ -280,8 +277,8 @@ chaos_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
 
 static struct pci_ops chaos_pci_ops =
 {
-       chaos_read_config,
-       chaos_write_config
+       .read = chaos_read_config,
+       .write = chaos_write_config,
 };
 
 static void __init setup_chaos(struct pci_controller *hose,
@@ -440,15 +437,12 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn,
        switch (len) {
        case 1:
                out_8(addr, val);
-               (void) in_8(addr);
                break;
        case 2:
                out_le16(addr, val);
-               (void) in_le16(addr);
                break;
        default:
                out_le32((u32 __iomem *)addr, val);
-               (void) in_le32(addr);
                break;
        }
        return PCIBIOS_SUCCESSFUL;
@@ -456,8 +450,8 @@ static int u3_ht_write_config(struct pci_bus *bus, unsigned int devfn,
 
 static struct pci_ops u3_ht_pci_ops =
 {
-       u3_ht_read_config,
-       u3_ht_write_config
+       .read = u3_ht_read_config,
+       .write = u3_ht_write_config,
 };
 
 #define U4_PCIE_CFA0(devfn, off)       \
@@ -545,15 +539,12 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
        switch (len) {
        case 1:
                out_8(addr, val);
-               (void) in_8(addr);
                break;
        case 2:
                out_le16(addr, val);
-               (void) in_le16(addr);
                break;
        default:
                out_le32(addr, val);
-               (void) in_le32(addr);
                break;
        }
        return PCIBIOS_SUCCESSFUL;
@@ -561,8 +552,8 @@ static int u4_pcie_write_config(struct pci_bus *bus, unsigned int devfn,
 
 static struct pci_ops u4_pcie_pci_ops =
 {
-       u4_pcie_read_config,
-       u4_pcie_write_config
+       .read = u4_pcie_read_config,
+       .write = u4_pcie_write_config,
 };
 
 #endif /* CONFIG_PPC64 */
index 87cd6805171a6bb4b4e3c7775a22d6c175098516..999f5e160897ba23ba07d7b6ae766d028fa26a7e 100644 (file)
@@ -384,7 +384,7 @@ static void __init pmac_pic_probe_oldstyle(void)
        /*
         * Allocate an irq host
         */
-       pmac_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, max_irqs,
+       pmac_pic_host = irq_alloc_host(master, IRQ_HOST_MAP_LINEAR, max_irqs,
                                       &pmac_pic_host_ops,
                                       max_irqs);
        BUG_ON(pmac_pic_host == NULL);
index 6e090a7dea83b3428d73ff05d9b0c09f942b0d53..fcde070f7054dd4d341b86f9529693e4048985f0 100644 (file)
@@ -22,9 +22,6 @@ extern void pmac_read_rtc_time(void);
 extern void pmac_calibrate_decr(void);
 extern void pmac_pci_irq_fixup(struct pci_dev *);
 extern void pmac_pci_init(void);
-extern unsigned long pmac_ide_get_base(int index);
-extern void pmac_ide_init_hwif_ports(hw_regs_t *hw,
-       unsigned long data_port, unsigned long ctrl_port, int *irq);
 
 extern void pmac_nvram_update(void);
 extern unsigned char pmac_nvram_read_byte(int addr);
@@ -33,7 +30,6 @@ extern int pmac_pci_enable_device_hook(struct pci_dev *dev, int initial);
 extern void pmac_pcibios_after_init(void);
 extern int of_show_percpuinfo(struct seq_file *m, int i);
 
-extern void pmac_pci_init(void);
 extern void pmac_setup_pci_dma(void);
 extern void pmac_check_ht_link(void);
 
index 7ccb9236e8b485580c5be98f69ed5858e4cda3a5..02c533096627851363c3864232b53d130659ed8b 100644 (file)
@@ -387,69 +387,13 @@ static void __init pmac_setup_arch(void)
 #endif /* CONFIG_ADB */
 }
 
-char *bootpath;
-char *bootdevice;
-void *boot_host;
-int boot_target;
-int boot_part;
-static dev_t boot_dev;
-
 #ifdef CONFIG_SCSI
 void note_scsi_host(struct device_node *node, void *host)
 {
-       int l;
-       char *p;
-
-       l = strlen(node->full_name);
-       if (bootpath != NULL && bootdevice != NULL
-           && strncmp(node->full_name, bootdevice, l) == 0
-           && (bootdevice[l] == '/' || bootdevice[l] == 0)) {
-               boot_host = host;
-               /*
-                * There's a bug in OF 1.0.5.  (Why am I not surprised.)
-                * If you pass a path like scsi/sd@1:0 to canon, it returns
-                * something like /bandit@F2000000/gc@10/53c94@10000/sd@0,0
-                * That is, the scsi target number doesn't get preserved.
-                * So we pick the target number out of bootpath and use that.
-                */
-               p = strstr(bootpath, "/sd@");
-               if (p != NULL) {
-                       p += 4;
-                       boot_target = simple_strtoul(p, NULL, 10);
-                       p = strchr(p, ':');
-                       if (p != NULL)
-                               boot_part = simple_strtoul(p + 1, NULL, 10);
-               }
-       }
 }
 EXPORT_SYMBOL(note_scsi_host);
 #endif
 
-#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
-static dev_t __init find_ide_boot(void)
-{
-       char *p;
-       int n;
-       dev_t __init pmac_find_ide_boot(char *bootdevice, int n);
-
-       if (bootdevice == NULL)
-               return 0;
-       p = strrchr(bootdevice, '/');
-       if (p == NULL)
-               return 0;
-       n = p - bootdevice;
-
-       return pmac_find_ide_boot(bootdevice, n);
-}
-#endif /* CONFIG_BLK_DEV_IDE && CONFIG_BLK_DEV_IDE_PMAC */
-
-static void __init find_boot_device(void)
-{
-#if defined(CONFIG_BLK_DEV_IDE) && defined(CONFIG_BLK_DEV_IDE_PMAC)
-       boot_dev = find_ide_boot();
-#endif
-}
-
 static int initializing = 1;
 
 static int pmac_late_init(void)
@@ -466,10 +410,14 @@ static int pmac_late_init(void)
 
 late_initcall(pmac_late_init);
 
-/* can't be __init - can be called whenever a disk is first accessed */
-void note_bootable_part(dev_t dev, int part, int goodness)
+/*
+ * This is __init_refok because we check for "initializing" before
+ * touching any of the __init sensitive things and "initializing"
+ * will be false after __init time. This can't be __init because it
+ * can be called whenever a disk is first accessed.
+ */
+void __init_refok note_bootable_part(dev_t dev, int part, int goodness)
 {
-       static int found_boot = 0;
        char *p;
 
        if (!initializing)
@@ -481,15 +429,8 @@ void note_bootable_part(dev_t dev, int part, int goodness)
        if (p != NULL && (p == boot_command_line || p[-1] == ' '))
                return;
 
-       if (!found_boot) {
-               find_boot_device();
-               found_boot = 1;
-       }
-       if (!boot_dev || dev == boot_dev) {
-               ROOT_DEV = dev + part;
-               boot_dev = 0;
-               current_root_goodness = goodness;
-       }
+       ROOT_DEV = dev + part;
+       current_root_goodness = goodness;
 }
 
 #ifdef CONFIG_ADB_CUDA
index 6124e59e1038153e66ba3b4c5fe770c095dd3acf..44e0b55a2a028f4227ae0b22f31791f1ac913218 100644 (file)
@@ -12,7 +12,6 @@
 #include <asm/xmon.h>
 #include <asm/prom.h>
 #include <asm/bootx.h>
-#include <asm/machdep.h>
 #include <asm/errno.h>
 #include <asm/pmac_feature.h>
 #include <asm/processor.h>
@@ -150,7 +149,7 @@ static void udbg_adb_putc(char c)
                return udbg_adb_old_putc(c);
 }
 
-void udbg_adb_init_early(void)
+void __init udbg_adb_init_early(void)
 {
 #ifdef CONFIG_BOOTX_TEXT
        if (btext_find_display(1) == 0) {
@@ -160,7 +159,7 @@ void udbg_adb_init_early(void)
 #endif
 }
 
-int udbg_adb_init(int force_btext)
+int __init udbg_adb_init(int force_btext)
 {
        struct device_node *np;
 
index ce15cada88d4ed992b478d828e8f896b0e6f85be..fd063fe0c9b382f91db12456d596e86dbf7f0ac7 100644 (file)
@@ -297,8 +297,8 @@ static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
                u64 dev_port;
        } *notify_event;
 
-       pr_debug(" -> %s:%u: bus_id %u, dev_id %u, dev_type %u\n", __func__,
-                __LINE__, repo->bus_id, repo->dev_id, repo->dev_type);
+       pr_debug(" -> %s:%u: (%u:%u:%u)\n", __func__, __LINE__, repo->bus_id,
+                repo->dev_id, repo->dev_type);
 
        buf = kzalloc(512, GFP_KERNEL);
        if (!buf)
@@ -359,6 +359,11 @@ static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
                        break;
                }
 
+               pr_debug("%s:%d: notify event (%u:%u:%u): event_type 0x%lx, "
+                        "port %lu\n", __func__, __LINE__, repo->bus_index,
+                        repo->dev_index, repo->dev_type,
+                        notify_event->event_type, notify_event->dev_port);
+
                if (notify_event->event_type != notify_region_probe ||
                    notify_event->bus_id != repo->bus_id) {
                        pr_debug("%s:%u: bad notify_event: event %lu, "
@@ -370,8 +375,9 @@ static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
 
                if (notify_event->dev_id == repo->dev_id &&
                    notify_event->dev_type == repo->dev_type) {
-                       pr_debug("%s:%u: device ready: dev_id %u\n", __func__,
-                                __LINE__, repo->dev_id);
+                       pr_debug("%s:%u: device ready (%u:%u:%u)\n", __func__,
+                                __LINE__, repo->bus_index, repo->dev_index,
+                                repo->dev_type);
                        error = 0;
                        break;
                }
@@ -412,9 +418,10 @@ static int ps3_setup_storage_dev(const struct ps3_repository_device *repo,
                return -ENODEV;
        }
 
-       pr_debug("%s:%u: index %u:%u: port %lu blk_size %lu num_blocks %lu "
+       pr_debug("%s:%u: (%u:%u:%u): port %lu blk_size %lu num_blocks %lu "
                 "num_regions %u\n", __func__, __LINE__, repo->bus_index,
-                repo->dev_index, port, blk_size, num_blocks, num_regions);
+                repo->dev_index, repo->dev_type, port, blk_size, num_blocks,
+                num_regions);
 
        p = kzalloc(sizeof(struct ps3_storage_device) +
                    num_regions * sizeof(struct ps3_storage_region),
@@ -681,8 +688,9 @@ static int ps3_probe_thread(void *data)
                                pr_debug("%s:%u: find device error.\n",
                                        __func__, __LINE__);
                        else {
-                               pr_debug("%s:%u: found device\n", __func__,
-                                       __LINE__);
+                               pr_debug("%s:%u: found device (%u:%u:%u)\n",
+                                        __func__, __LINE__, repo->bus_index,
+                                        repo->dev_index, repo->dev_type);
                                ps3_register_repository_device(repo);
                                ps3_repository_bump_device(repo);
                                ms = 250;
index 5d2e176a1b18379fb9c2bb01a8609b95674aca9a..7382f195c4f87689aac7f1e858e98c16e0dd687d 100644 (file)
@@ -60,7 +60,8 @@ static void _debug_dump_hpte(unsigned long pa, unsigned long va,
 }
 
 static long ps3_hpte_insert(unsigned long hpte_group, unsigned long va,
-       unsigned long pa, unsigned long rflags, unsigned long vflags, int psize)
+       unsigned long pa, unsigned long rflags, unsigned long vflags,
+       int psize, int ssize)
 {
        unsigned long slot;
        struct hash_pte lhpte;
@@ -72,7 +73,8 @@ static long ps3_hpte_insert(unsigned long hpte_group, unsigned long va,
 
        vflags &= ~HPTE_V_SECONDARY; /* this bit is ignored */
 
-       lhpte.v = hpte_encode_v(va, psize) | vflags | HPTE_V_VALID;
+       lhpte.v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M) |
+               vflags | HPTE_V_VALID;
        lhpte.r = hpte_encode_r(ps3_mm_phys_to_lpar(pa), psize) | rflags;
 
        p_pteg = hpte_group / HPTES_PER_GROUP;
@@ -167,14 +169,14 @@ static long ps3_hpte_remove(unsigned long hpte_group)
 }
 
 static long ps3_hpte_updatepp(unsigned long slot, unsigned long newpp,
-       unsigned long va, int psize, int local)
+       unsigned long va, int psize, int ssize, int local)
 {
        unsigned long flags;
        unsigned long result;
        unsigned long pteg, bit;
        unsigned long hpte_v, want_v;
 
-       want_v = hpte_encode_v(va, psize);
+       want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);
 
        spin_lock_irqsave(&ps3_bolttab_lock, flags);
 
@@ -205,13 +207,13 @@ static long ps3_hpte_updatepp(unsigned long slot, unsigned long newpp,
 }
 
 static void ps3_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
-       int psize)
+       int psize, int ssize)
 {
        panic("ps3_hpte_updateboltedpp() not implemented");
 }
 
 static void ps3_hpte_invalidate(unsigned long slot, unsigned long va,
-       int psize, int local)
+       int psize, int ssize, int local)
 {
        unsigned long flags;
        unsigned long result;
index 67e32ec9b37e8da948d488ced85d1f757298cd62..3a6db04aa9405a87d7098a41c945a77ba950f143 100644 (file)
@@ -673,9 +673,16 @@ static int ps3_host_map(struct irq_host *h, unsigned int virq,
        return 0;
 }
 
+static int ps3_host_match(struct irq_host *h, struct device_node *np)
+{
+       /* Match all */
+       return 1;
+}
+
 static struct irq_host_ops ps3_host_ops = {
        .map = ps3_host_map,
        .unmap = ps3_host_unmap,
+       .match = ps3_host_match,
 };
 
 void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq)
@@ -726,7 +733,7 @@ void __init ps3_init_IRQ(void)
        unsigned cpu;
        struct irq_host *host;
 
-       host = irq_alloc_host(IRQ_HOST_MAP_NOMAP, 0, &ps3_host_ops,
+       host = irq_alloc_host(NULL, IRQ_HOST_MAP_NOMAP, 0, &ps3_host_ops,
                PS3_INVALID_OUTLET);
        irq_set_default_host(host);
        irq_set_virq_count(PS3_PLUG_MAX + 1);
index b70e474014f028c9da8c938d164e7c7d4defcd26..766685ab26f82b46116c46953bb51286455c7990 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  PS3 'Other OS' area data.
+ *  PS3 flash memory os area.
  *
  *  Copyright (C) 2006 Sony Computer Entertainment Inc.
  *  Copyright 2006 Sony Corp.
@@ -20,6 +20,9 @@
 
 #include <linux/kernel.h>
 #include <linux/io.h>
+#include <linux/workqueue.h>
+#include <linux/fs.h>
+#include <linux/syscalls.h>
 
 #include <asm/lmb.h>
 
@@ -29,7 +32,7 @@ enum {
        OS_AREA_SEGMENT_SIZE = 0X200,
 };
 
-enum {
+enum os_area_ldr_format {
        HEADER_LDR_FORMAT_RAW = 0,
        HEADER_LDR_FORMAT_GZIP = 1,
 };
@@ -38,7 +41,7 @@ enum {
  * struct os_area_header - os area header segment.
  * @magic_num: Always 'cell_ext_os_area'.
  * @hdr_version: Header format version number.
- * @os_area_offset: Starting segment number of os image area.
+ * @db_area_offset: Starting segment number of other os database area.
  * @ldr_area_offset: Starting segment number of bootloader image area.
  * @ldr_format: HEADER_LDR_FORMAT flag.
  * @ldr_size: Size of bootloader image in bytes.
@@ -50,9 +53,9 @@ enum {
  */
 
 struct os_area_header {
-       s8 magic_num[16];
+       u8 magic_num[16];
        u32 hdr_version;
-       u32 os_area_offset;
+       u32 db_area_offset;
        u32 ldr_area_offset;
        u32 _reserved_1;
        u32 ldr_format;
@@ -60,12 +63,12 @@ struct os_area_header {
        u32 _reserved_2[6];
 };
 
-enum {
+enum os_area_boot_flag {
        PARAM_BOOT_FLAG_GAME_OS = 0,
        PARAM_BOOT_FLAG_OTHER_OS = 1,
 };
 
-enum {
+enum os_area_ctrl_button {
        PARAM_CTRL_BUTTON_O_IS_YES = 0,
        PARAM_CTRL_BUTTON_X_IS_YES = 1,
 };
@@ -84,6 +87,9 @@ enum {
  * @dns_primary: User preference of static primary dns server.
  * @dns_secondary: User preference of static secondary dns server.
  *
+ * The ps3 rtc maintains a read-only value that approximates seconds since
+ * 2000-01-01 00:00:00 UTC.
+ *
  * User preference of zero for static_ip_addr means use dhcp.
  */
 
@@ -108,45 +114,172 @@ struct os_area_params {
        u8 _reserved_5[8];
 };
 
+enum {
+       OS_AREA_DB_MAGIC_NUM = 0x2d64622dU,
+};
+
 /**
- * struct saved_params - Static working copies of data from the 'Other OS' area.
+ * struct os_area_db - Shared flash memory database.
+ * @magic_num: Always '-db-' = 0x2d64622d.
+ * @version: os_area_db format version number.
+ * @index_64: byte offset of the database id index for 64 bit variables.
+ * @count_64: number of usable 64 bit index entries
+ * @index_32: byte offset of the database id index for 32 bit variables.
+ * @count_32: number of usable 32 bit index entries
+ * @index_16: byte offset of the database id index for 16 bit variables.
+ * @count_16: number of usable 16 bit index entries
  *
- * For the convinience of the guest, the HV makes a copy of the 'Other OS' area
- * in flash to a high address in the boot memory region and then puts that RAM
- * address and the byte count into the repository for retreval by the guest.
- * We copy the data we want into a static variable and allow the memory setup
- * by the HV to be claimed by the lmb manager.
+ * Flash rom storage for exclusive use by guests running in the other os lpar.
+ * The current system configuration allocates 1K (two segments) for other os
+ * use.
+ */
+
+struct os_area_db {
+       u32 magic_num;
+       u16 version;
+       u16 _reserved_1;
+       u16 index_64;
+       u16 count_64;
+       u16 index_32;
+       u16 count_32;
+       u16 index_16;
+       u16 count_16;
+       u32 _reserved_2;
+       u8 _db_data[1000];
+};
+
+/**
+ * enum os_area_db_owner - Data owners.
+ */
+
+enum os_area_db_owner {
+       OS_AREA_DB_OWNER_ANY = -1,
+       OS_AREA_DB_OWNER_NONE = 0,
+       OS_AREA_DB_OWNER_PROTOTYPE = 1,
+       OS_AREA_DB_OWNER_LINUX = 2,
+       OS_AREA_DB_OWNER_PETITBOOT = 3,
+       OS_AREA_DB_OWNER_MAX = 32,
+};
+
+enum os_area_db_key {
+       OS_AREA_DB_KEY_ANY = -1,
+       OS_AREA_DB_KEY_NONE = 0,
+       OS_AREA_DB_KEY_RTC_DIFF = 1,
+       OS_AREA_DB_KEY_VIDEO_MODE = 2,
+       OS_AREA_DB_KEY_MAX = 8,
+};
+
+struct os_area_db_id {
+       int owner;
+       int key;
+};
+
+static const struct os_area_db_id os_area_db_id_empty = {
+       .owner = OS_AREA_DB_OWNER_NONE,
+       .key = OS_AREA_DB_KEY_NONE
+};
+
+static const struct os_area_db_id os_area_db_id_any = {
+       .owner = OS_AREA_DB_OWNER_ANY,
+       .key = OS_AREA_DB_KEY_ANY
+};
+
+static const struct os_area_db_id os_area_db_id_rtc_diff = {
+       .owner = OS_AREA_DB_OWNER_LINUX,
+       .key = OS_AREA_DB_KEY_RTC_DIFF
+};
+
+static const struct os_area_db_id os_area_db_id_video_mode = {
+       .owner = OS_AREA_DB_OWNER_LINUX,
+       .key = OS_AREA_DB_KEY_VIDEO_MODE
+};
+
+#define SECONDS_FROM_1970_TO_2000 946684800LL
+
+/**
+ * struct saved_params - Static working copies of data from the PS3 'os area'.
+ *
+ * The order of preference we use for the rtc_diff source:
+ *  1) The database value.
+ *  2) The game os value.
+ *  3) The number of seconds from 1970 to 2000.
  */
 
 struct saved_params {
-       /* param 0 */
+       unsigned int valid;
        s64 rtc_diff;
        unsigned int av_multi_out;
-       unsigned int ctrl_button;
-       /* param 1 */
-       u8 static_ip_addr[4];
-       u8 network_mask[4];
-       u8 default_gateway[4];
-       /* param 2 */
-       u8 dns_primary[4];
-       u8 dns_secondary[4];
 } static saved_params;
 
+static struct property property_rtc_diff = {
+       .name = "linux,rtc_diff",
+       .length = sizeof(saved_params.rtc_diff),
+       .value = &saved_params.rtc_diff,
+};
+
+static struct property property_av_multi_out = {
+       .name = "linux,av_multi_out",
+       .length = sizeof(saved_params.av_multi_out),
+       .value = &saved_params.av_multi_out,
+};
+
+/**
+ * os_area_set_property - Add or overwrite a saved_params value to the device tree.
+ *
+ * Overwrites an existing property.
+ */
+
+static void os_area_set_property(struct device_node *node,
+       struct property *prop)
+{
+       int result;
+       struct property *tmp = of_find_property(node, prop->name, NULL);
+
+       if (tmp) {
+               pr_debug("%s:%d found %s\n", __func__, __LINE__, prop->name);
+               prom_remove_property(node, tmp);
+       }
+
+       result = prom_add_property(node, prop);
+
+       if (result)
+               pr_debug("%s:%d prom_set_property failed\n", __func__,
+                       __LINE__);
+}
+
+/**
+ * os_area_get_property - Get a saved_params value from the device tree.
+ *
+ */
+
+static void __init os_area_get_property(struct device_node *node,
+       struct property *prop)
+{
+       const struct property *tmp = of_find_property(node, prop->name, NULL);
+
+       if (tmp) {
+               BUG_ON(prop->length != tmp->length);
+               memcpy(prop->value, tmp->value, prop->length);
+       } else
+               pr_debug("%s:%d not found %s\n", __func__, __LINE__,
+                       prop->name);
+}
+
 #define dump_header(_a) _dump_header(_a, __func__, __LINE__)
 static void _dump_header(const struct os_area_header *h, const char *func,
        int line)
 {
-       pr_debug("%s:%d: h.magic_num:         '%s'\n", func, line,
+       pr_debug("%s:%d: h.magic_num:       '%s'\n", func, line,
                h->magic_num);
-       pr_debug("%s:%d: h.hdr_version:       %u\n", func, line,
+       pr_debug("%s:%d: h.hdr_version:     %u\n", func, line,
                h->hdr_version);
-       pr_debug("%s:%d: h.os_area_offset:   %u\n", func, line,
-               h->os_area_offset);
+       pr_debug("%s:%d: h.db_area_offset:  %u\n", func, line,
+               h->db_area_offset);
        pr_debug("%s:%d: h.ldr_area_offset: %u\n", func, line,
                h->ldr_area_offset);
-       pr_debug("%s:%d: h.ldr_format:        %u\n", func, line,
+       pr_debug("%s:%d: h.ldr_format:      %u\n", func, line,
                h->ldr_format);
-       pr_debug("%s:%d: h.ldr_size:          %xh\n", func, line,
+       pr_debug("%s:%d: h.ldr_size:        %xh\n", func, line,
                h->ldr_size);
 }
 
@@ -176,7 +309,7 @@ static void _dump_params(const struct os_area_params *p, const char *func,
                p->dns_secondary[2], p->dns_secondary[3]);
 }
 
-static int __init verify_header(const struct os_area_header *header)
+static int verify_header(const struct os_area_header *header)
 {
        if (memcmp(header->magic_num, "cell_ext_os_area", 16)) {
                pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
@@ -188,7 +321,7 @@ static int __init verify_header(const struct os_area_header *header)
                return -1;
        }
 
-       if (header->os_area_offset > header->ldr_area_offset) {
+       if (header->db_area_offset > header->ldr_area_offset) {
                pr_debug("%s:%d offsets failed\n", __func__, __LINE__);
                return -1;
        }
@@ -196,58 +329,477 @@ static int __init verify_header(const struct os_area_header *header)
        return 0;
 }
 
-int __init ps3_os_area_init(void)
+static int db_verify(const struct os_area_db *db)
+{
+       if (db->magic_num != OS_AREA_DB_MAGIC_NUM) {
+               pr_debug("%s:%d magic_num failed\n", __func__, __LINE__);
+               return -1;
+       }
+
+       if (db->version != 1) {
+               pr_debug("%s:%d version failed\n", __func__, __LINE__);
+               return -1;
+       }
+
+       return 0;
+}
+
+struct db_index {
+       uint8_t owner:5;
+       uint8_t key:3;
+};
+
+struct db_iterator {
+       const struct os_area_db *db;
+       struct os_area_db_id match_id;
+       struct db_index *idx;
+       struct db_index *last_idx;
+       union {
+               uint64_t *value_64;
+               uint32_t *value_32;
+               uint16_t *value_16;
+       };
+};
+
+static unsigned int db_align_up(unsigned int val, unsigned int size)
+{
+       return (val + (size - 1)) & (~(size - 1));
+}
+
+/**
+ * db_for_each_64 - Iterator for 64 bit entries.
+ *
+ * A NULL value for id can be used to match all entries.
+ * OS_AREA_DB_OWNER_ANY and OS_AREA_DB_KEY_ANY can be used to match all.
+ */
+
+static int db_for_each_64(const struct os_area_db *db,
+       const struct os_area_db_id *match_id, struct db_iterator *i)
+{
+next:
+       if (!i->db) {
+               i->db = db;
+               i->match_id = match_id ? *match_id : os_area_db_id_any;
+               i->idx = (void *)db + db->index_64;
+               i->last_idx = i->idx + db->count_64;
+               i->value_64 = (void *)db + db->index_64
+                       + db_align_up(db->count_64, 8);
+       } else {
+               i->idx++;
+               i->value_64++;
+       }
+
+       if (i->idx >= i->last_idx) {
+               pr_debug("%s:%d: reached end\n", __func__, __LINE__);
+               return 0;
+       }
+
+       if (i->match_id.owner != OS_AREA_DB_OWNER_ANY
+               && i->match_id.owner != (int)i->idx->owner)
+               goto next;
+       if (i->match_id.key != OS_AREA_DB_KEY_ANY
+               && i->match_id.key != (int)i->idx->key)
+               goto next;
+
+       return 1;
+}
+
+static int db_delete_64(struct os_area_db *db, const struct os_area_db_id *id)
+{
+       struct db_iterator i;
+
+       for (i.db = NULL; db_for_each_64(db, id, &i); ) {
+
+               pr_debug("%s:%d: got (%d:%d) %llxh\n", __func__, __LINE__,
+                       i.idx->owner, i.idx->key,
+                       (unsigned long long)*i.value_64);
+
+               i.idx->owner = 0;
+               i.idx->key = 0;
+               *i.value_64 = 0;
+       }
+       return 0;
+}
+
+static int db_set_64(struct os_area_db *db, const struct os_area_db_id *id,
+       uint64_t value)
+{
+       struct db_iterator i;
+
+       pr_debug("%s:%d: (%d:%d) <= %llxh\n", __func__, __LINE__,
+               id->owner, id->key, (unsigned long long)value);
+
+       if (!id->owner || id->owner == OS_AREA_DB_OWNER_ANY
+               || id->key == OS_AREA_DB_KEY_ANY) {
+               pr_debug("%s:%d: bad id: (%d:%d)\n", __func__,
+                       __LINE__, id->owner, id->key);
+               return -1;
+       }
+
+       db_delete_64(db, id);
+
+       i.db = NULL;
+       if (db_for_each_64(db, &os_area_db_id_empty, &i)) {
+
+               pr_debug("%s:%d: got (%d:%d) %llxh\n", __func__, __LINE__,
+                       i.idx->owner, i.idx->key,
+                       (unsigned long long)*i.value_64);
+
+               i.idx->owner = id->owner;
+               i.idx->key = id->key;
+               *i.value_64 = value;
+
+               pr_debug("%s:%d: set (%d:%d) <= %llxh\n", __func__, __LINE__,
+                       i.idx->owner, i.idx->key,
+                       (unsigned long long)*i.value_64);
+               return 0;
+       }
+       pr_debug("%s:%d: database full.\n",
+               __func__, __LINE__);
+       return -1;
+}
+
+static int db_get_64(const struct os_area_db *db,
+       const struct os_area_db_id *id, uint64_t *value)
+{
+       struct db_iterator i;
+
+       i.db = NULL;
+       if (db_for_each_64(db, id, &i)) {
+               *value = *i.value_64;
+               pr_debug("%s:%d: found %lld\n", __func__, __LINE__,
+                               (long long int)*i.value_64);
+               return 0;
+       }
+       pr_debug("%s:%d: not found\n", __func__, __LINE__);
+       return -1;
+}
+
+static int db_get_rtc_diff(const struct os_area_db *db, int64_t *rtc_diff)
+{
+       return db_get_64(db, &os_area_db_id_rtc_diff, (uint64_t*)rtc_diff);
+}
+
+#define dump_db(a) _dump_db(a, __func__, __LINE__)
+static void _dump_db(const struct os_area_db *db, const char *func,
+       int line)
+{
+       pr_debug("%s:%d: db.magic_num:      '%s'\n", func, line,
+               (const char*)&db->magic_num);
+       pr_debug("%s:%d: db.version:         %u\n", func, line,
+               db->version);
+       pr_debug("%s:%d: db.index_64:        %u\n", func, line,
+               db->index_64);
+       pr_debug("%s:%d: db.count_64:        %u\n", func, line,
+               db->count_64);
+       pr_debug("%s:%d: db.index_32:        %u\n", func, line,
+               db->index_32);
+       pr_debug("%s:%d: db.count_32:        %u\n", func, line,
+               db->count_32);
+       pr_debug("%s:%d: db.index_16:        %u\n", func, line,
+               db->index_16);
+       pr_debug("%s:%d: db.count_16:        %u\n", func, line,
+               db->count_16);
+}
+
+static void os_area_db_init(struct os_area_db *db)
+{
+       enum {
+               HEADER_SIZE = offsetof(struct os_area_db, _db_data),
+               INDEX_64_COUNT = 64,
+               VALUES_64_COUNT = 57,
+               INDEX_32_COUNT = 64,
+               VALUES_32_COUNT = 57,
+               INDEX_16_COUNT = 64,
+               VALUES_16_COUNT = 57,
+       };
+
+       memset(db, 0, sizeof(struct os_area_db));
+
+       db->magic_num = OS_AREA_DB_MAGIC_NUM;
+       db->version = 1;
+       db->index_64 = HEADER_SIZE;
+       db->count_64 = VALUES_64_COUNT;
+       db->index_32 = HEADER_SIZE
+                       + INDEX_64_COUNT * sizeof(struct db_index)
+                       + VALUES_64_COUNT * sizeof(u64);
+       db->count_32 = VALUES_32_COUNT;
+       db->index_16 = HEADER_SIZE
+                       + INDEX_64_COUNT * sizeof(struct db_index)
+                       + VALUES_64_COUNT * sizeof(u64)
+                       + INDEX_32_COUNT * sizeof(struct db_index)
+                       + VALUES_32_COUNT * sizeof(u32);
+       db->count_16 = VALUES_16_COUNT;
+
+       /* Rules to check db layout. */
+
+       BUILD_BUG_ON(sizeof(struct db_index) != 1);
+       BUILD_BUG_ON(sizeof(struct os_area_db) != 2 * OS_AREA_SEGMENT_SIZE);
+       BUILD_BUG_ON(INDEX_64_COUNT & 0x7);
+       BUILD_BUG_ON(VALUES_64_COUNT > INDEX_64_COUNT);
+       BUILD_BUG_ON(INDEX_32_COUNT & 0x7);
+       BUILD_BUG_ON(VALUES_32_COUNT > INDEX_32_COUNT);
+       BUILD_BUG_ON(INDEX_16_COUNT & 0x7);
+       BUILD_BUG_ON(VALUES_16_COUNT > INDEX_16_COUNT);
+       BUILD_BUG_ON(HEADER_SIZE
+                       + INDEX_64_COUNT * sizeof(struct db_index)
+                       + VALUES_64_COUNT * sizeof(u64)
+                       + INDEX_32_COUNT * sizeof(struct db_index)
+                       + VALUES_32_COUNT * sizeof(u32)
+                       + INDEX_16_COUNT * sizeof(struct db_index)
+                       + VALUES_16_COUNT * sizeof(u16)
+                       > sizeof(struct os_area_db));
+}
+
+/**
+ * update_flash_db - Helper for os_area_queue_work_handler.
+ *
+ */
+
+static void update_flash_db(void)
+{
+       int result;
+       int file;
+       off_t offset;
+       ssize_t count;
+       static const unsigned int buf_len = 8 * OS_AREA_SEGMENT_SIZE;
+       const struct os_area_header *header;
+       struct os_area_db* db;
+
+       /* Read in header and db from flash. */
+
+       file = sys_open("/dev/ps3flash", O_RDWR, 0);
+
+       if (file < 0) {
+               pr_debug("%s:%d sys_open failed\n", __func__, __LINE__);
+               goto fail_open;
+       }
+
+       header = kmalloc(buf_len, GFP_KERNEL);
+
+       if (!header) {
+               pr_debug("%s:%d kmalloc failed\n", __func__, __LINE__);
+               goto fail_malloc;
+       }
+
+       offset = sys_lseek(file, 0, SEEK_SET);
+
+       if (offset != 0) {
+               pr_debug("%s:%d sys_lseek failed\n", __func__, __LINE__);
+               goto fail_header_seek;
+       }
+
+       count = sys_read(file, (char __user *)header, buf_len);
+
+       result = count < OS_AREA_SEGMENT_SIZE || verify_header(header)
+               || count < header->db_area_offset * OS_AREA_SEGMENT_SIZE;
+
+       if (result) {
+               pr_debug("%s:%d verify_header failed\n", __func__, __LINE__);
+               dump_header(header);
+               goto fail_header;
+       }
+
+       /* Now got a good db offset and some maybe good db data. */
+
+       db = (void*)header + header->db_area_offset * OS_AREA_SEGMENT_SIZE;
+
+       result = db_verify(db);
+
+       if (result) {
+               printk(KERN_NOTICE "%s:%d: Verify of flash database failed, "
+                       "formatting.\n", __func__, __LINE__);
+               dump_db(db);
+               os_area_db_init(db);
+       }
+
+       /* Now got good db data. */
+
+       db_set_64(db, &os_area_db_id_rtc_diff, saved_params.rtc_diff);
+
+       offset = sys_lseek(file, header->db_area_offset * OS_AREA_SEGMENT_SIZE,
+               SEEK_SET);
+
+       if (offset != header->db_area_offset * OS_AREA_SEGMENT_SIZE) {
+               pr_debug("%s:%d sys_lseek failed\n", __func__, __LINE__);
+               goto fail_db_seek;
+       }
+
+       count = sys_write(file, (const char __user *)db,
+               sizeof(struct os_area_db));
+
+       if (count < sizeof(struct os_area_db)) {
+               pr_debug("%s:%d sys_write failed\n", __func__, __LINE__);
+       }
+
+fail_db_seek:
+fail_header:
+fail_header_seek:
+       kfree(header);
+fail_malloc:
+       sys_close(file);
+fail_open:
+       return;
+}
+
+/**
+ * os_area_queue_work_handler - Asynchronous write handler.
+ *
+ * An asynchronous write for flash memory and the device tree.  Do not
+ * call directly, use os_area_queue_work().
+ */
+
+static void os_area_queue_work_handler(struct work_struct *work)
+{
+       struct device_node *node;
+
+       pr_debug(" -> %s:%d\n", __func__, __LINE__);
+
+       node = of_find_node_by_path("/");
+
+       if (node) {
+               os_area_set_property(node, &property_rtc_diff);
+               of_node_put(node);
+       } else
+               pr_debug("%s:%d of_find_node_by_path failed\n",
+                       __func__, __LINE__);
+
+#if defined(CONFIG_PS3_FLASH) || defined(CONFIG_PS3_FLASH_MODULE)
+       update_flash_db();
+#else
+       printk(KERN_WARNING "%s:%d: No flash rom driver configured.\n",
+               __func__, __LINE__);
+#endif
+       pr_debug(" <- %s:%d\n", __func__, __LINE__);
+}
+
+static void os_area_queue_work(void)
+{
+       static DECLARE_WORK(q, os_area_queue_work_handler);
+
+       wmb();
+       schedule_work(&q);
+}
+
+/**
+ * ps3_os_area_save_params - Copy data from os area mirror to @saved_params.
+ *
+ * For the convenience of the guest the HV makes a copy of the os area in
+ * flash to a high address in the boot memory region and then puts that RAM
+ * address and the byte count into the repository for retrieval by the guest.
+ * We copy the data we want into a static variable and allow the memory setup
+ * by the HV to be claimed by the lmb manager.
+ *
+ * The os area mirror will not be available to a second stage kernel, and
+ * the header verify will fail.  In this case, the saved_params values will
+ * be set from flash memory or the passed in device tree in ps3_os_area_init().
+ */
+
+void __init ps3_os_area_save_params(void)
 {
        int result;
        u64 lpar_addr;
        unsigned int size;
        struct os_area_header *header;
        struct os_area_params *params;
+       struct os_area_db *db;
+
+       pr_debug(" -> %s:%d\n", __func__, __LINE__);
 
        result = ps3_repository_read_boot_dat_info(&lpar_addr, &size);
 
        if (result) {
                pr_debug("%s:%d ps3_repository_read_boot_dat_info failed\n",
                        __func__, __LINE__);
-               return result;
+               return;
        }
 
        header = (struct os_area_header *)__va(lpar_addr);
-       params = (struct os_area_params *)__va(lpar_addr + OS_AREA_SEGMENT_SIZE);
+       params = (struct os_area_params *)__va(lpar_addr
+               + OS_AREA_SEGMENT_SIZE);
 
        result = verify_header(header);
 
        if (result) {
+               /* Second stage kernels exit here. */
                pr_debug("%s:%d verify_header failed\n", __func__, __LINE__);
                dump_header(header);
-               return -EIO;
+               return;
        }
 
+       db = (struct os_area_db *)__va(lpar_addr
+               + header->db_area_offset * OS_AREA_SEGMENT_SIZE);
+
        dump_header(header);
        dump_params(params);
+       dump_db(db);
 
-       saved_params.rtc_diff = params->rtc_diff;
+       result = db_verify(db) || db_get_rtc_diff(db, &saved_params.rtc_diff);
+       if (result)
+               saved_params.rtc_diff = params->rtc_diff ? params->rtc_diff
+                       : SECONDS_FROM_1970_TO_2000;
        saved_params.av_multi_out = params->av_multi_out;
-       saved_params.ctrl_button = params->ctrl_button;
-       memcpy(saved_params.static_ip_addr, params->static_ip_addr, 4);
-       memcpy(saved_params.network_mask, params->network_mask, 4);
-       memcpy(saved_params.default_gateway, params->default_gateway, 4);
-       memcpy(saved_params.dns_secondary, params->dns_secondary, 4);
+       saved_params.valid = 1;
+
+       memset(header, 0, sizeof(*header));
 
-       return result;
+       pr_debug(" <- %s:%d\n", __func__, __LINE__);
 }
 
 /**
- * ps3_os_area_rtc_diff - Returns the ps3 rtc diff value.
+ * ps3_os_area_init - Setup os area device tree properties as needed.
+ */
+
+void __init ps3_os_area_init(void)
+{
+       struct device_node *node;
+
+       pr_debug(" -> %s:%d\n", __func__, __LINE__);
+
+       node = of_find_node_by_path("/");
+
+       if (!saved_params.valid && node) {
+               /* Second stage kernels should have a dt entry. */
+               os_area_get_property(node, &property_rtc_diff);
+               os_area_get_property(node, &property_av_multi_out);
+       }
+
+       if(!saved_params.rtc_diff)
+               saved_params.rtc_diff = SECONDS_FROM_1970_TO_2000;
+
+       if (node) {
+               os_area_set_property(node, &property_rtc_diff);
+               os_area_set_property(node, &property_av_multi_out);
+               of_node_put(node);
+       } else
+               pr_debug("%s:%d of_find_node_by_path failed\n",
+                       __func__, __LINE__);
+
+       pr_debug(" <- %s:%d\n", __func__, __LINE__);
+}
+
+/**
+ * ps3_os_area_get_rtc_diff - Returns the rtc diff value.
+ */
+
+u64 ps3_os_area_get_rtc_diff(void)
+{
+       return saved_params.rtc_diff;
+}
+
+/**
+ * ps3_os_area_set_rtc_diff - Set the rtc diff value.
  *
- * The ps3 rtc maintains a value that approximates seconds since
- * 2000-01-01 00:00:00 UTC.  Returns the exact number of seconds from 1970 to
- * 2000 when saved_params.rtc_diff has not been properly set up.
+ * An asynchronous write is needed to support writing updates from
+ * the timer interrupt context.
  */
 
-u64 ps3_os_area_rtc_diff(void)
+void ps3_os_area_set_rtc_diff(u64 rtc_diff)
 {
-       return saved_params.rtc_diff ? saved_params.rtc_diff : 946684800UL;
+       if (saved_params.rtc_diff != rtc_diff) {
+               saved_params.rtc_diff = rtc_diff;
+               os_area_queue_work();
+       }
 }
 
 /**
index 2eb8f92704b4f1a4e2bfbdc751d655dc74174fe9..01f0c9506e11efec1ea93777abf385b24a8a61c0 100644 (file)
@@ -47,7 +47,11 @@ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq);
 /* smp */
 
 void smp_init_ps3(void);
+#ifdef CONFIG_SMP
 void ps3_smp_cleanup_cpu(int cpu);
+#else
+static inline void ps3_smp_cleanup_cpu(int cpu) { }
+#endif
 
 /* time */
 
@@ -58,8 +62,10 @@ int ps3_set_rtc_time(struct rtc_time *time);
 
 /* os area */
 
-int __init ps3_os_area_init(void);
-u64 ps3_os_area_rtc_diff(void);
+void __init ps3_os_area_save_params(void);
+void __init ps3_os_area_init(void);
+u64 ps3_os_area_get_rtc_diff(void);
+void ps3_os_area_set_rtc_diff(u64 rtc_diff);
 
 /* spu */
 
index 609945dbe39401459a1592cd5d264c3b10ad0507..5c2cbb08eb52f82a212503137ebae0cf5d8dca55 100644 (file)
@@ -206,6 +206,7 @@ static void __init ps3_setup_arch(void)
        prealloc_ps3flash_bounce_buffer();
 
        ppc_md.power_save = ps3_power_save;
+       ps3_os_area_init();
 
        DBG(" <- %s:%d\n", __func__, __LINE__);
 }
@@ -228,7 +229,7 @@ static int __init ps3_probe(void)
 
        powerpc_firmware_features |= FW_FEATURE_PS3_POSSIBLE;
 
-       ps3_os_area_init();
+       ps3_os_area_save_params();
        ps3_mm_init();
        ps3_mm_vas_create(&htab_size);
        ps3_hpte_init(htab_size);
index 802a9ccacb5ea130cecbd143616c5944adde1e2c..d0daf7d6d3b26407d5ec87c0d5caef127943c4fe 100644 (file)
@@ -50,12 +50,6 @@ static void __maybe_unused _dump_time(int time, const char *func,
        _dump_tm(&tm, func, line);
 }
 
-/**
- * rtc_shift - Difference in seconds between 1970 and the ps3 rtc value.
- */
-
-static s64 rtc_shift;
-
 void __init ps3_calibrate_decr(void)
 {
        int result;
@@ -66,8 +60,6 @@ void __init ps3_calibrate_decr(void)
 
        ppc_tb_freq = tmp;
        ppc_proc_freq = ppc_tb_freq * 40;
-
-       rtc_shift = ps3_os_area_rtc_diff();
 }
 
 static u64 read_rtc(void)
@@ -87,18 +79,18 @@ int ps3_set_rtc_time(struct rtc_time *tm)
        u64 now = mktime(tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
                tm->tm_hour, tm->tm_min, tm->tm_sec);
 
-       rtc_shift = now - read_rtc();
+       ps3_os_area_set_rtc_diff(now - read_rtc());
        return 0;
 }
 
 void ps3_get_rtc_time(struct rtc_time *tm)
 {
-       to_tm(read_rtc() + rtc_shift, tm);
+       to_tm(read_rtc() + ps3_os_area_get_rtc_diff(), tm);
        tm->tm_year -= 1900;
        tm->tm_mon -= 1;
 }
 
 unsigned long __init ps3_get_boot_time(void)
 {
-       return read_rtc() + rtc_shift;
+       return read_rtc() + ps3_os_area_get_rtc_diff();
 }
index b8770395013d9bb74304e2f848b16b7da6424b51..22322b35a0ffd1224e4e0c7c9f19c64a0b7bc12f 100644 (file)
@@ -169,6 +169,8 @@ static void rtas_slot_error_detail(struct pci_dn *pdn, int severity,
  */
 static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
 {
+       struct device_node *dn;
+       struct pci_dev *dev = pdn->pcidev;
        u32 cfg;
        int cap, i;
        int n = 0;
@@ -184,6 +186,17 @@ static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
        n += scnprintf(buf+n, len-n, "cmd/stat:%x\n", cfg);
        printk(KERN_WARNING "EEH: PCI cmd/status register: %08x\n", cfg);
 
+       /* Gather bridge-specific registers */
+       if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
+               rtas_read_config(pdn, PCI_SEC_STATUS, 2, &cfg);
+               n += scnprintf(buf+n, len-n, "sec stat:%x\n", cfg);
+               printk(KERN_WARNING "EEH: Bridge secondary status: %04x\n", cfg);
+
+               rtas_read_config(pdn, PCI_BRIDGE_CONTROL, 2, &cfg);
+               n += scnprintf(buf+n, len-n, "brdg ctl:%x\n", cfg);
+               printk(KERN_WARNING "EEH: Bridge control: %04x\n", cfg);
+       }
+
        /* Dump out the PCI-X command and status regs */
        cap = pci_find_capability(pdn->pcidev, PCI_CAP_ID_PCIX);
        if (cap) {
@@ -209,7 +222,7 @@ static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
                        printk(KERN_WARNING "EEH: PCI-E %02x: %08x\n", i, cfg);
                }
 
-               cap = pci_find_ext_capability(pdn->pcidev,PCI_EXT_CAP_ID_ERR);
+               cap = pci_find_ext_capability(pdn->pcidev, PCI_EXT_CAP_ID_ERR);
                if (cap) {
                        n += scnprintf(buf+n, len-n, "pci-e AER:\n");
                        printk(KERN_WARNING
@@ -222,6 +235,18 @@ static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
                        }
                }
        }
+
+       /* Gather status on devices under the bridge */
+       if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
+               dn = pdn->node->child;
+               while (dn) {
+                       pdn = PCI_DN(dn);
+                       if (pdn)
+                               n += gather_pci_data(pdn, buf+n, len-n);
+                       dn = dn->sibling;
+               }
+       }
+
        return n;
 }
 
@@ -750,12 +775,12 @@ int rtas_set_slot_reset(struct pci_dn *pdn)
                        return 0;
 
                if (rc < 0) {
-                       printk (KERN_ERR "EEH: unrecoverable slot failure %s\n",
-                               pdn->node->full_name);
+                       printk(KERN_ERR "EEH: unrecoverable slot failure %s\n",
+                              pdn->node->full_name);
                        return -1;
                }
-               printk (KERN_ERR "EEH: bus reset %d failed on slot %s\n",
-                       i+1, pdn->node->full_name);
+               printk(KERN_ERR "EEH: bus reset %d failed on slot %s, rc=%d\n",
+                      i+1, pdn->node->full_name, rc);
        }
 
        return -1;
@@ -930,7 +955,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
        pdn->eeh_freeze_count = 0;
        pdn->eeh_false_positives = 0;
 
-       if (status && strcmp(status, "ok") != 0)
+       if (status && strncmp(status, "ok", 2) != 0)
                return NULL;    /* ignore devices with bad status */
 
        /* Ignore bad nodes. */
@@ -944,23 +969,6 @@ static void *early_enable_eeh(struct device_node *dn, void *data)
        }
        pdn->class_code = *class_code;
 
-       /*
-        * Now decide if we are going to "Disable" EEH checking
-        * for this device.  We still run with the EEH hardware active,
-        * but we won't be checking for ff's.  This means a driver
-        * could return bad data (very bad!), an interrupt handler could
-        * hang waiting on status bits that won't change, etc.
-        * But there are a few cases like display devices that make sense.
-        */
-       enable = 1;     /* i.e. we will do checking */
-#if 0
-       if ((*class_code >> 16) == PCI_BASE_CLASS_DISPLAY)
-               enable = 0;
-#endif
-
-       if (!enable)
-               pdn->eeh_mode |= EEH_MODE_NOCHECK;
-
        /* Ok... see if this device supports EEH.  Some do, some don't,
         * and the only way to find out is to check each and every one. */
        regs = of_get_property(dn, "reg", NULL);
index e49c815eae23496a23555187a023432b4a450172..1e83fcd0df312a3a9e41d146566ade3143eafdea 100644 (file)
@@ -225,6 +225,10 @@ void pci_addr_cache_insert_device(struct pci_dev *dev)
 {
        unsigned long flags;
 
+       /* Ignore PCI bridges */
+       if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
+               return;
+
        spin_lock_irqsave(&pci_io_addr_cache_root.piar_lock, flags);
        __pci_addr_cache_insert_device(dev);
        spin_unlock_irqrestore(&pci_io_addr_cache_root.piar_lock, flags);
@@ -285,16 +289,13 @@ void __init pci_addr_cache_build(void)
        spin_lock_init(&pci_io_addr_cache_root.piar_lock);
 
        while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-               /* Ignore PCI bridges */
-               if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE)
-                       continue;
 
                pci_addr_cache_insert_device(dev);
 
                dn = pci_device_to_OF_node(dev);
                if (!dn)
                        continue;
-               pci_dev_get (dev);  /* matching put is in eeh_remove_device() */
+               pci_dev_get(dev);  /* matching put is in eeh_remove_device() */
                PCI_DN(dn)->pcidev = dev;
 
                eeh_sysfs_add_device(dev);
index 9711eb0d549645fee11f198fcb1cdf4ddc9f8860..fc48b96c81bff2ee1ec79eef9d1f13f62b6693cf 100644 (file)
@@ -252,6 +252,20 @@ static struct notifier_block pseries_smp_nb = {
 
 static int __init pseries_cpu_hotplug_init(void)
 {
+       struct device_node *np;
+       const char *typep;
+
+       for_each_node_by_name(np, "interrupt-controller") {
+               typep = of_get_property(np, "compatible", NULL);
+               if (strstr(typep, "open-pic")) {
+                       of_node_put(np);
+
+                       printk(KERN_INFO "CPU Hotplug not supported on "
+                               "systems using MPIC\n");
+                       return 0;
+               }
+       }
+
        rtas_stop_self_args.token = rtas_token("stop-self");
        qcss_tok = rtas_token("query-cpu-stopped-state");
 
index 8cc6eeeaae2f1649368fdac4ba7eebf9c1227e05..9a455d46379d525181a4278714e22304f72028db 100644 (file)
@@ -35,7 +35,6 @@
 #include <asm/tlbflush.h>
 #include <asm/tlb.h>
 #include <asm/prom.h>
-#include <asm/abs_addr.h>
 #include <asm/cputable.h>
 #include <asm/udbg.h>
 #include <asm/smp.h>
@@ -285,7 +284,7 @@ void vpa_init(int cpu)
 static long pSeries_lpar_hpte_insert(unsigned long hpte_group,
                              unsigned long va, unsigned long pa,
                              unsigned long rflags, unsigned long vflags,
-                             int psize)
+                             int psize, int ssize)
 {
        unsigned long lpar_rc;
        unsigned long flags;
@@ -297,7 +296,7 @@ static long pSeries_lpar_hpte_insert(unsigned long hpte_group,
                        "rflags=%lx, vflags=%lx, psize=%d)\n",
                hpte_group, va, pa, rflags, vflags, psize);
 
-       hpte_v = hpte_encode_v(va, psize) | vflags | HPTE_V_VALID;
+       hpte_v = hpte_encode_v(va, psize, ssize) | vflags | HPTE_V_VALID;
        hpte_r = hpte_encode_r(pa, psize) | rflags;
 
        if (!(vflags & HPTE_V_BOLTED))
@@ -392,6 +391,22 @@ static void pSeries_lpar_hptab_clear(void)
        }
 }
 
+/*
+ * This computes the AVPN and B fields of the first dword of a HPTE,
+ * for use when we want to match an existing PTE.  The bottom 7 bits
+ * of the returned value are zero.
+ */
+static inline unsigned long hpte_encode_avpn(unsigned long va, int psize,
+                                            int ssize)
+{
+       unsigned long v;
+
+       v = (va >> 23) & ~(mmu_psize_defs[psize].avpnm);
+       v <<= HPTE_V_AVPN_SHIFT;
+       v |= ((unsigned long) ssize) << HPTE_V_SSIZE_SHIFT;
+       return v;
+}
+
 /*
  * NOTE: for updatepp ops we are fortunate that the linux "newpp" bits and
  * the low 3 bits of flags happen to line up.  So no transform is needed.
@@ -401,18 +416,18 @@ static void pSeries_lpar_hptab_clear(void)
 static long pSeries_lpar_hpte_updatepp(unsigned long slot,
                                       unsigned long newpp,
                                       unsigned long va,
-                                      int psize, int local)
+                                      int psize, int ssize, int local)
 {
        unsigned long lpar_rc;
        unsigned long flags = (newpp & 7) | H_AVPN;
        unsigned long want_v;
 
-       want_v = hpte_encode_v(va, psize);
+       want_v = hpte_encode_avpn(va, psize, ssize);
 
        DBG_LOW("    update: avpnv=%016lx, hash=%016lx, f=%x, psize: %d ... ",
-               want_v & HPTE_V_AVPN, slot, flags, psize);
+               want_v, slot, flags, psize);
 
-       lpar_rc = plpar_pte_protect(flags, slot, want_v & HPTE_V_AVPN);
+       lpar_rc = plpar_pte_protect(flags, slot, want_v);
 
        if (lpar_rc == H_NOT_FOUND) {
                DBG_LOW("not found !\n");
@@ -445,32 +460,25 @@ static unsigned long pSeries_lpar_hpte_getword0(unsigned long slot)
        return dword0;
 }
 
-static long pSeries_lpar_hpte_find(unsigned long va, int psize)
+static long pSeries_lpar_hpte_find(unsigned long va, int psize, int ssize)
 {
        unsigned long hash;
-       unsigned long i, j;
+       unsigned long i;
        long slot;
        unsigned long want_v, hpte_v;
 
-       hash = hpt_hash(va, mmu_psize_defs[psize].shift);
-       want_v = hpte_encode_v(va, psize);
-
-       for (j = 0; j < 2; j++) {
-               slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
-               for (i = 0; i < HPTES_PER_GROUP; i++) {
-                       hpte_v = pSeries_lpar_hpte_getword0(slot);
-
-                       if (HPTE_V_COMPARE(hpte_v, want_v)
-                           && (hpte_v & HPTE_V_VALID)
-                           && (!!(hpte_v & HPTE_V_SECONDARY) == j)) {
-                               /* HPTE matches */
-                               if (j)
-                                       slot = -slot;
-                               return slot;
-                       }
-                       ++slot;
-               }
-               hash = ~hash;
+       hash = hpt_hash(va, mmu_psize_defs[psize].shift, ssize);
+       want_v = hpte_encode_avpn(va, psize, ssize);
+
+       /* Bolted entries are always in the primary group */
+       slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
+       for (i = 0; i < HPTES_PER_GROUP; i++) {
+               hpte_v = pSeries_lpar_hpte_getword0(slot);
+
+               if (HPTE_V_COMPARE(hpte_v, want_v) && (hpte_v & HPTE_V_VALID))
+                       /* HPTE matches */
+                       return slot;
+               ++slot;
        }
 
        return -1;
@@ -478,14 +486,14 @@ static long pSeries_lpar_hpte_find(unsigned long va, int psize)
 
 static void pSeries_lpar_hpte_updateboltedpp(unsigned long newpp,
                                             unsigned long ea,
-                                            int psize)
+                                            int psize, int ssize)
 {
        unsigned long lpar_rc, slot, vsid, va, flags;
 
-       vsid = get_kernel_vsid(ea);
-       va = (vsid << 28) | (ea & 0x0fffffff);
+       vsid = get_kernel_vsid(ea, ssize);
+       va = hpt_va(ea, vsid, ssize);
 
-       slot = pSeries_lpar_hpte_find(va, psize);
+       slot = pSeries_lpar_hpte_find(va, psize, ssize);
        BUG_ON(slot == -1);
 
        flags = newpp & 7;
@@ -495,7 +503,7 @@ static void pSeries_lpar_hpte_updateboltedpp(unsigned long newpp,
 }
 
 static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
-                                        int psize, int local)
+                                        int psize, int ssize, int local)
 {
        unsigned long want_v;
        unsigned long lpar_rc;
@@ -504,9 +512,8 @@ static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
        DBG_LOW("    inval : slot=%lx, va=%016lx, psize: %d, local: %d",
                slot, va, psize, local);
 
-       want_v = hpte_encode_v(va, psize);
-       lpar_rc = plpar_pte_remove(H_AVPN, slot, want_v & HPTE_V_AVPN,
-                                  &dummy1, &dummy2);
+       want_v = hpte_encode_avpn(va, psize, ssize);
+       lpar_rc = plpar_pte_remove(H_AVPN, slot, want_v, &dummy1, &dummy2);
        if (lpar_rc == H_NOT_FOUND)
                return;
 
@@ -534,18 +541,19 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
        unsigned long va;
        unsigned long hash, index, shift, hidx, slot;
        real_pte_t pte;
-       int psize;
+       int psize, ssize;
 
        if (lock_tlbie)
                spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags);
 
        psize = batch->psize;
+       ssize = batch->ssize;
        pix = 0;
        for (i = 0; i < number; i++) {
                va = batch->vaddr[i];
                pte = batch->pte[i];
                pte_iterate_hashed_subpages(pte, psize, va, index, shift) {
-                       hash = hpt_hash(va, shift);
+                       hash = hpt_hash(va, shift, ssize);
                        hidx = __rpte_to_hidx(pte, index);
                        if (hidx & _PTEIDX_SECONDARY)
                                hash = ~hash;
@@ -553,11 +561,11 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
                        slot += hidx & _PTEIDX_GROUP_IX;
                        if (!firmware_has_feature(FW_FEATURE_BULK_REMOVE)) {
                                pSeries_lpar_hpte_invalidate(slot, va, psize,
-                                                            local);
+                                                            ssize, local);
                        } else {
                                param[pix] = HBR_REQUEST | HBR_AVPN | slot;
-                               param[pix+1] = hpte_encode_v(va, psize) &
-                                       HPTE_V_AVPN;
+                               param[pix+1] = hpte_encode_avpn(va, psize,
+                                                               ssize);
                                pix += 2;
                                if (pix == 8) {
                                        rc = plpar_hcall9(H_BULK_REMOVE, param,
index 6063ea2f67ad1512b4ab0b44bc9a559daa97f8df..2793a1b100e64260e062eca9ca7517a78183f7b7 100644 (file)
@@ -70,11 +70,15 @@ static int rtas_change_msi(struct pci_dn *pdn, u32 func, u32 num_irqs)
                seq_num = rtas_ret[1];
        } while (rtas_busy_delay(rc));
 
-       if (rc == 0) /* Success */
-               rc = rtas_ret[0];
+       /*
+        * If the RTAS call succeeded, check the number of irqs is actually
+        * what we asked for. If not, return an error.
+        */
+       if (rc == 0 && rtas_ret[0] != num_irqs)
+               rc = -ENOSPC;
 
-       pr_debug("rtas_msi: ibm,change_msi(func=%d,num=%d) = (%d)\n",
-                func, num_irqs, rc);
+       pr_debug("rtas_msi: ibm,change_msi(func=%d,num=%d), got %d rc = %d\n",
+                func, num_irqs, rtas_ret[0], rc);
 
        return rc;
 }
@@ -87,7 +91,7 @@ static void rtas_disable_msi(struct pci_dev *pdev)
        if (!pdn)
                return;
 
-       if (rtas_change_msi(pdn, RTAS_CHANGE_FN, 0) != 0)
+       if (rtas_change_msi(pdn, RTAS_CHANGE_FN, 0))
                pr_debug("rtas_msi: Setting MSIs to 0 failed!\n");
 }
 
@@ -180,38 +184,31 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        if (type == PCI_CAP_ID_MSI) {
                rc = rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, nvec);
 
-               if (rc != nvec) {
+               if (rc) {
                        pr_debug("rtas_msi: trying the old firmware call.\n");
                        rc = rtas_change_msi(pdn, RTAS_CHANGE_FN, nvec);
                }
        } else
                rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec);
 
-       if (rc != nvec) {
+       if (rc) {
                pr_debug("rtas_msi: rtas_change_msi() failed\n");
-
-               /*
-                * In case of an error it's not clear whether the device is
-                * left with MSI enabled or not, so we explicitly disable.
-                */
-               goto out_free;
+               return rc;
        }
 
        i = 0;
        list_for_each_entry(entry, &pdev->msi_list, list) {
                hwirq = rtas_query_irq_number(pdn, i);
                if (hwirq < 0) {
-                       rc = hwirq;
                        pr_debug("rtas_msi: error (%d) getting hwirq\n", rc);
-                       goto out_free;
+                       return hwirq;
                }
 
                virq = irq_create_mapping(NULL, hwirq);
 
                if (virq == NO_IRQ) {
                        pr_debug("rtas_msi: Failed mapping hwirq %d\n", hwirq);
-                       rc = -ENOSPC;
-                       goto out_free;
+                       return -ENOSPC;
                }
 
                dev_dbg(&pdev->dev, "rtas_msi: allocated virq %d\n", virq);
@@ -220,10 +217,6 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
        }
 
        return 0;
-
- out_free:
-       rtas_teardown_msi_irqs(pdev);
-       return rc;
 }
 
 static void rtas_msi_pci_irq_fixup(struct pci_dev *pdev)
index 9797b10b29351a44ea918aac081fe52fbec33790..73401c820110a2a877f999c702e83d593e4f9f08 100644 (file)
@@ -44,15 +44,20 @@ static unsigned long rtas_log_start;
 static unsigned long rtas_log_size;
 
 static int surveillance_timeout = -1;
-static unsigned int rtas_event_scan_rate;
 static unsigned int rtas_error_log_max;
 static unsigned int rtas_error_log_buffer_max;
 
-static int full_rtas_msgs = 0;
+/* RTAS service tokens */
+static unsigned int event_scan;
+static unsigned int rtas_event_scan_rate;
 
-extern int no_logging;
+static int full_rtas_msgs = 0;
 
-volatile int error_log_cnt = 0;
+/* Stop logging to nvram after first fatal error */
+static int logging_enabled; /* Until we initialize everything,
+                             * make sure we don't try logging
+                             * anything */
+static int error_log_cnt;
 
 /*
  * Since we use 32 bit RTAS, the physical address of this must be below
@@ -61,8 +66,6 @@ volatile int error_log_cnt = 0;
  */
 static unsigned char logdata[RTAS_ERROR_LOG_MAX];
 
-static int get_eventscan_parms(void);
-
 static char *rtas_type[] = {
        "Unknown", "Retry", "TCE Error", "Internal Device Failure",
        "Timeout", "Data Parity", "Address Parity", "Cache Parity",
@@ -166,9 +169,9 @@ static int log_rtas_len(char * buf)
                len += err->extended_log_length;
        }
 
-       if (rtas_error_log_max == 0) {
-               get_eventscan_parms();
-       }
+       if (rtas_error_log_max == 0)
+               rtas_error_log_max = rtas_get_error_log_max();
+
        if (len > rtas_error_log_max)
                len = rtas_error_log_max;
 
@@ -215,8 +218,8 @@ void pSeries_log_error(char *buf, unsigned int err_type, int fatal)
        }
 
        /* Write error to NVRAM */
-       if (!no_logging && !(err_type & ERR_FLAG_BOOT))
-               nvram_write_error_log(buf, len, err_type);
+       if (logging_enabled && !(err_type & ERR_FLAG_BOOT))
+               nvram_write_error_log(buf, len, err_type, error_log_cnt);
 
        /*
         * rtas errors can occur during boot, and we do want to capture
@@ -227,8 +230,8 @@ void pSeries_log_error(char *buf, unsigned int err_type, int fatal)
                printk_log_rtas(buf, len);
 
        /* Check to see if we need to or have stopped logging */
-       if (fatal || no_logging) {
-               no_logging = 1;
+       if (fatal || !logging_enabled) {
+               logging_enabled = 0;
                spin_unlock_irqrestore(&rtasd_log_lock, s);
                return;
        }
@@ -300,7 +303,7 @@ static ssize_t rtas_log_read(struct file * file, char __user * buf,
 
        spin_lock_irqsave(&rtasd_log_lock, s);
        /* if it's 0, then we know we got the last one (the one in NVRAM) */
-       if (rtas_log_size == 0 && !no_logging)
+       if (rtas_log_size == 0 && logging_enabled)
                nvram_clear_error_log();
        spin_unlock_irqrestore(&rtasd_log_lock, s);
 
@@ -356,32 +359,7 @@ static int enable_surveillance(int timeout)
        return -1;
 }
 
-static int get_eventscan_parms(void)
-{
-       struct device_node *node;
-       const int *ip;
-
-       node = of_find_node_by_path("/rtas");
-
-       ip = of_get_property(node, "rtas-event-scan-rate", NULL);
-       if (ip == NULL) {
-               printk(KERN_ERR "rtasd: no rtas-event-scan-rate\n");
-               of_node_put(node);
-               return -1;
-       }
-       rtas_event_scan_rate = *ip;
-       DEBUG("rtas-event-scan-rate %d\n", rtas_event_scan_rate);
-
-       /* Make room for the sequence number */
-       rtas_error_log_max = rtas_get_error_log_max();
-       rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int);
-
-       of_node_put(node);
-
-       return 0;
-}
-
-static void do_event_scan(int event_scan)
+static void do_event_scan(void)
 {
        int error;
        do {
@@ -408,7 +386,7 @@ static void do_event_scan_all_cpus(long delay)
        cpu = first_cpu(cpu_online_map);
        for (;;) {
                set_cpus_allowed(current, cpumask_of_cpu(cpu));
-               do_event_scan(rtas_token("event-scan"));
+               do_event_scan();
                set_cpus_allowed(current, CPU_MASK_ALL);
 
                /* Drop hotplug lock, and sleep for the specified delay */
@@ -426,31 +404,19 @@ static void do_event_scan_all_cpus(long delay)
 static int rtasd(void *unused)
 {
        unsigned int err_type;
-       int event_scan = rtas_token("event-scan");
        int rc;
 
        daemonize("rtasd");
 
-       if (event_scan == RTAS_UNKNOWN_SERVICE || get_eventscan_parms() == -1)
-               goto error;
-
-       rtas_log_buf = vmalloc(rtas_error_log_buffer_max*LOG_NUMBER);
-       if (!rtas_log_buf) {
-               printk(KERN_ERR "rtasd: no memory\n");
-               goto error;
-       }
-
        printk(KERN_DEBUG "RTAS daemon started\n");
-
        DEBUG("will sleep for %d milliseconds\n", (30000/rtas_event_scan_rate));
 
        /* See if we have any error stored in NVRAM */
        memset(logdata, 0, rtas_error_log_max);
-
-       rc = nvram_read_error_log(logdata, rtas_error_log_max, &err_type);
-
+       rc = nvram_read_error_log(logdata, rtas_error_log_max,
+                                 &err_type, &error_log_cnt);
        /* We can use rtas_log_buf now */
-       no_logging = 0;
+       logging_enabled = 1;
 
        if (!rc) {
                if (err_type != ERR_FLAG_ALREADY_LOGGED) {
@@ -473,8 +439,6 @@ static int rtasd(void *unused)
        for (;;)
                do_event_scan_all_cpus(30000/rtas_event_scan_rate);
 
-error:
-       /* Should delete proc entries */
        return -EINVAL;
 }
 
@@ -486,11 +450,28 @@ static int __init rtas_init(void)
                return 0;
 
        /* No RTAS */
-       if (rtas_token("event-scan") == RTAS_UNKNOWN_SERVICE) {
+       event_scan = rtas_token("event-scan");
+       if (event_scan == RTAS_UNKNOWN_SERVICE) {
                printk(KERN_DEBUG "rtasd: no event-scan on system\n");
                return -ENODEV;
        }
 
+       rtas_event_scan_rate = rtas_token("rtas-event-scan-rate");
+       if (rtas_event_scan_rate == RTAS_UNKNOWN_SERVICE) {
+               printk(KERN_ERR "rtasd: no rtas-event-scan-rate on system\n");
+               return -ENODEV;
+       }
+
+       /* Make room for the sequence number */
+       rtas_error_log_max = rtas_get_error_log_max();
+       rtas_error_log_buffer_max = rtas_error_log_max + sizeof(int);
+
+       rtas_log_buf = vmalloc(rtas_error_log_buffer_max*LOG_NUMBER);
+       if (!rtas_log_buf) {
+               printk(KERN_ERR "rtasd: no memory\n");
+               return -ENOMEM;
+       }
+
        entry = create_proc_entry("ppc64/rtas/error_log", S_IRUSR, NULL);
        if (entry)
                entry->proc_fops = &proc_rtas_log_operations;
index f0b7146a110f7238abcd39d633db63dd44711481..fdb9b1c8f977e06704c714ff5d0c54366923fef4 100644 (file)
@@ -257,11 +257,6 @@ static void __init pSeries_setup_arch(void)
        /* init to some ~sane value until calibrate_delay() runs */
        loops_per_jiffy = 50000000;
 
-       if (ROOT_DEV == 0) {
-               printk("No ramdisk, default root is /dev/sda2\n");
-               ROOT_DEV = Root_SDA2;
-       }
-
        fwnmi_init();
 
        /* Find and initialize PCI host bridges */
index f0b5ff17d8609a83b2f68ed928111e13f0daf046..66e7d68ffeb101c60425d6b054ebd348d593e2df 100644 (file)
@@ -540,7 +540,7 @@ static void __init xics_init_host(void)
                ops = &xics_host_lpar_ops;
        else
                ops = &xics_host_direct_ops;
-       xics_host = irq_alloc_host(IRQ_HOST_MAP_TREE, 0, ops,
+       xics_host = irq_alloc_host(NULL, IRQ_HOST_MAP_TREE, 0, ops,
                                   XICS_IRQ_SPURIOUS);
        BUG_ON(xics_host == NULL);
        irq_set_default_host(xics_host);
index 08ce31e612c202c13d20c6820774df7d4cbe53c4..1a6f5641ebc82c16dc97ba8f9f8af57a825c8d0d 100644 (file)
@@ -6,7 +6,6 @@ mpic-msi-obj-$(CONFIG_PCI_MSI)  += mpic_msi.o mpic_u3msi.o
 obj-$(CONFIG_MPIC)             += mpic.o $(mpic-msi-obj-y)
 
 obj-$(CONFIG_PPC_MPC106)       += grackle.o
-obj-$(CONFIG_PPC_DCR)          += dcr.o
 obj-$(CONFIG_PPC_DCR_NATIVE)   += dcr-low.o
 obj-$(CONFIG_PPC_PMI)          += pmi.o
 obj-$(CONFIG_U3_DART)          += dart_iommu.o
@@ -16,25 +15,24 @@ obj-$(CONFIG_FSL_PCI)               += fsl_pci.o
 obj-$(CONFIG_TSI108_BRIDGE)    += tsi108_pci.o tsi108_dev.o
 obj-$(CONFIG_QUICC_ENGINE)     += qe_lib/
 mv64x60-$(CONFIG_PCI)          += mv64x60_pci.o
-obj-$(CONFIG_MV64X60)          += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o
+obj-$(CONFIG_MV64X60)          += $(mv64x60-y) mv64x60_pic.o mv64x60_dev.o \
+                                  mv64x60_udbg.o
 obj-$(CONFIG_RTC_DRV_CMOS)     += rtc_cmos_setup.o
 obj-$(CONFIG_AXON_RAM)         += axonram.o
 
-# contains only the suspend handler for time
-ifeq ($(CONFIG_RTC_CLASS),)
-obj-$(CONFIG_PM)               += timer.o
-endif
-
 ifeq ($(CONFIG_PPC_MERGE),y)
 obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
 obj-$(CONFIG_PPC_I8259)                += i8259.o
 obj-$(CONFIG_PPC_83xx)         += ipic.o
 obj-$(CONFIG_4xx)              += uic.o
+obj-$(CONFIG_XILINX_VIRTEX)    += xilinx_intc.o
 endif
 
 # Temporary hack until we have migrated to asm-powerpc
 ifeq ($(ARCH),powerpc)
+obj-$(CONFIG_CPM)              += cpm_common.o
 obj-$(CONFIG_CPM2)             += cpm2_common.o cpm2_pic.o
+obj-$(CONFIG_PPC_DCR)          += dcr.o
 obj-$(CONFIG_8xx)              += mpc8xx_pic.o commproc.o
 obj-$(CONFIG_UCODE_PATCH)      += micropatch.o
 endif
index ab037a3a40db196b0e01f9a15ddf878c354be3d6..4d3ba63bba79ad6ee53cb1c49d1d1cfd23944be8 100644 (file)
@@ -324,11 +324,13 @@ static struct of_device_id axon_ram_device_id[] = {
 };
 
 static struct of_platform_driver axon_ram_driver = {
-       .owner          = THIS_MODULE,
-       .name           = AXON_RAM_MODULE_NAME,
        .match_table    = axon_ram_device_id,
        .probe          = axon_ram_probe,
-       .remove         = axon_ram_remove
+       .remove         = axon_ram_remove,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = AXON_RAM_MODULE_NAME,
+       },
 };
 
 /**
index dd5417aec1b456db3fe29024eee35e7fece31167..f6a63780bbde5b3bcd7223cc34e0a85f6293f9a3 100644 (file)
 #include <asm/tlbflush.h>
 #include <asm/rheap.h>
 #include <asm/prom.h>
+#include <asm/cpm.h>
 
 #include <asm/fs_pd.h>
 
 #define CPM_MAP_SIZE    (0x4000)
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 static void m8xx_cpm_dpinit(void);
-static uint    host_buffer;    /* One page of host buffer */
-static uint    host_end;       /* end + 1 */
-cpm8xx_t       *cpmp;          /* Pointer to comm processor space */
-cpic8xx_t      *cpic_reg;
+#endif
+static uint host_buffer; /* One page of host buffer */
+static uint host_end;    /* end + 1 */
+cpm8xx_t __iomem *cpmp;  /* Pointer to comm processor space */
+immap_t __iomem *mpc8xx_immr;
+static cpic8xx_t __iomem *cpic_reg;
 
-static struct device_node *cpm_pic_node;
 static struct irq_host *cpm_pic_host;
 
 static void cpm_mask_irq(unsigned int irq)
@@ -95,11 +98,6 @@ int cpm_get_irq(void)
        return irq_linear_revmap(cpm_pic_host, cpm_vec);
 }
 
-static int cpm_pic_host_match(struct irq_host *h, struct device_node *node)
-{
-       return cpm_pic_node == node;
-}
-
 static int cpm_pic_host_map(struct irq_host *h, unsigned int virq,
                          irq_hw_number_t hw)
 {
@@ -115,7 +113,7 @@ static int cpm_pic_host_map(struct irq_host *h, unsigned int virq,
  * and return.  This is a no-op function so we don't need any special
  * tests in the interrupt handler.
  */
-static irqreturn_t cpm_error_interrupt(int irq, void *dev)
+static irqreturn_t cpm_error_interrupt(int irq, void *dev)
 {
        return IRQ_HANDLED;
 }
@@ -127,7 +125,6 @@ static struct irqaction cpm_error_irqaction = {
 };
 
 static struct irq_host_ops cpm_pic_host_ops = {
-       .match = cpm_pic_host_match,
        .map = cpm_pic_host_map,
 };
 
@@ -140,16 +137,19 @@ unsigned int cpm_pic_init(void)
 
        pr_debug("cpm_pic_init\n");
 
-       np = of_find_compatible_node(NULL, "cpm-pic", "CPM");
+       np = of_find_compatible_node(NULL, NULL, "fsl,cpm1-pic");
+       if (np == NULL)
+               np = of_find_compatible_node(NULL, "cpm-pic", "CPM");
        if (np == NULL) {
                printk(KERN_ERR "CPM PIC init: can not find cpm-pic node\n");
                return sirq;
        }
+
        ret = of_address_to_resource(np, 0, &res);
        if (ret)
                goto end;
 
-       cpic_reg = (void *)ioremap(res.start, res.end - res.start + 1);
+       cpic_reg = ioremap(res.start, res.end - res.start + 1);
        if (cpic_reg == NULL)
                goto end;
 
@@ -165,23 +165,24 @@ unsigned int cpm_pic_init(void)
 
        out_be32(&cpic_reg->cpic_cimr, 0);
 
-       cpm_pic_node = of_node_get(np);
-
-       cpm_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &cpm_pic_host_ops, 64);
+       cpm_pic_host = irq_alloc_host(of_node_get(np), IRQ_HOST_MAP_LINEAR,
+                                     64, &cpm_pic_host_ops, 64);
        if (cpm_pic_host == NULL) {
                printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
                sirq = NO_IRQ;
                goto end;
        }
-       of_node_put(np);
 
        /* Install our own error handler. */
-       np = of_find_node_by_type(NULL, "cpm");
+       np = of_find_compatible_node(NULL, NULL, "fsl,cpm1");
+       if (np == NULL)
+               np = of_find_node_by_type(NULL, "cpm");
        if (np == NULL) {
                printk(KERN_ERR "CPM PIC init: can not find cpm node\n");
                goto end;
        }
-       eirq= irq_of_parse_and_map(np, 0);
+
+       eirq = irq_of_parse_and_map(np, 0);
        if (eirq == NO_IRQ)
                goto end;
 
@@ -195,23 +196,30 @@ end:
        return sirq;
 }
 
-void cpm_reset(void)
+void __init cpm_reset(void)
 {
-       cpm8xx_t        *commproc;
-       sysconf8xx_t    *siu_conf;
+       sysconf8xx_t __iomem *siu_conf;
 
-       commproc = (cpm8xx_t *)ioremap(CPM_MAP_ADDR, CPM_MAP_SIZE);
+       mpc8xx_immr = ioremap(get_immrbase(), 0x4000);
+       if (!mpc8xx_immr) {
+               printk(KERN_CRIT "Could not map IMMR\n");
+               return;
+       }
 
-#ifdef CONFIG_UCODE_PATCH
+       cpmp = &mpc8xx_immr->im_cpm;
+
+#ifndef CONFIG_PPC_EARLY_DEBUG_CPM
        /* Perform a reset.
        */
-       out_be16(&commproc->cp_cpcr,  CPM_CR_RST | CPM_CR_FLG);
+       out_be16(&cpmp->cp_cpcr, CPM_CR_RST | CPM_CR_FLG);
 
        /* Wait for it.
        */
-       while (in_be16(&commproc->cp_cpcr) & CPM_CR_FLG);
+       while (in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG);
+#endif
 
-       cpm_load_patch(commproc);
+#ifdef CONFIG_UCODE_PATCH
+       cpm_load_patch(cpmp);
 #endif
 
        /* Set SDMA Bus Request priority 5.
@@ -220,16 +228,16 @@ void cpm_reset(void)
         * manual recommends it.
         * Bit 25, FAM can also be set to use FEC aggressive mode (860T).
         */
-       siu_conf = (sysconf8xx_t*)immr_map(im_siu_conf);
+       siu_conf = immr_map(im_siu_conf);
        out_be32(&siu_conf->sc_sdcr, 1);
        immr_unmap(siu_conf);
 
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+       cpm_muram_init();
+#else
        /* Reclaim the DP memory for our use. */
        m8xx_cpm_dpinit();
-
-       /* Tell everyone where the comm processor resides.
-       */
-       cpmp = commproc;
+#endif
 }
 
 /* We used to do this earlier, but have to postpone as long as possible
@@ -279,22 +287,23 @@ m8xx_cpm_hostalloc(uint size)
 void
 cpm_setbrg(uint brg, uint rate)
 {
-       volatile uint   *bp;
+       u32 __iomem *bp;
 
        /* This is good enough to get SMCs running.....
        */
-       bp = (uint *)&cpmp->cp_brgc1;
+       bp = &cpmp->cp_brgc1;
        bp += brg;
        /* The BRG has a 12-bit counter.  For really slow baud rates (or
         * really fast processors), we may have to further divide by 16.
         */
        if (((BRG_UART_CLK / rate) - 1) < 4096)
-               *bp = (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN;
+               out_be32(bp, (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN);
        else
-               *bp = (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) |
-                                               CPM_BRG_EN | CPM_BRG_DIV16;
+               out_be32(bp, (((BRG_UART_CLK_DIV16 / rate) - 1) << 1) |
+                            CPM_BRG_EN | CPM_BRG_DIV16);
 }
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 /*
  * dpalloc / dpfree bits.
  */
@@ -307,15 +316,15 @@ static rh_block_t cpm_boot_dpmem_rh_block[16];
 static rh_info_t cpm_dpmem_info;
 
 #define CPM_DPMEM_ALIGNMENT    8
-static u8dpram_vbase;
-static uint dpram_pbase;
+static u8 __iomem *dpram_vbase;
+static phys_addr_t dpram_pbase;
 
-void m8xx_cpm_dpinit(void)
+static void m8xx_cpm_dpinit(void)
 {
        spin_lock_init(&cpm_dpmem_lock);
 
-       dpram_vbase = immr_map_size(im_cpm.cp_dpmem, CPM_DATAONLY_BASE + CPM_DATAONLY_SIZE);
-       dpram_pbase = (uint)&((immap_t *)IMAP_ADDR)->im_cpm.cp_dpmem;
+       dpram_vbase = cpmp->cp_dpmem;
+       dpram_pbase = get_immrbase() + offsetof(immap_t, im_cpm.cp_dpmem);
 
        /* Initialize the info header */
        rh_init(&cpm_dpmem_info, CPM_DPMEM_ALIGNMENT,
@@ -391,8 +400,210 @@ void *cpm_dpram_addr(unsigned long offset)
 }
 EXPORT_SYMBOL(cpm_dpram_addr);
 
-uint cpm_dpram_phys(u8addr)
+uint cpm_dpram_phys(u8 *addr)
 {
        return (dpram_pbase + (uint)(addr - dpram_vbase));
 }
 EXPORT_SYMBOL(cpm_dpram_phys);
+#endif /* !CONFIG_PPC_CPM_NEW_BINDING */
+
+struct cpm_ioport16 {
+       __be16 dir, par, sor, dat, intr;
+       __be16 res[3];
+};
+
+struct cpm_ioport32 {
+       __be32 dir, par, sor;
+};
+
+static void cpm1_set_pin32(int port, int pin, int flags)
+{
+       struct cpm_ioport32 __iomem *iop;
+       pin = 1 << (31 - pin);
+
+       if (port == CPM_PORTB)
+               iop = (struct cpm_ioport32 __iomem *)
+                     &mpc8xx_immr->im_cpm.cp_pbdir;
+       else
+               iop = (struct cpm_ioport32 __iomem *)
+                     &mpc8xx_immr->im_cpm.cp_pedir;
+
+       if (flags & CPM_PIN_OUTPUT)
+               setbits32(&iop->dir, pin);
+       else
+               clrbits32(&iop->dir, pin);
+
+       if (!(flags & CPM_PIN_GPIO))
+               setbits32(&iop->par, pin);
+       else
+               clrbits32(&iop->par, pin);
+
+       if (port == CPM_PORTE) {
+               if (flags & CPM_PIN_SECONDARY)
+                       setbits32(&iop->sor, pin);
+               else
+                       clrbits32(&iop->sor, pin);
+
+               if (flags & CPM_PIN_OPENDRAIN)
+                       setbits32(&mpc8xx_immr->im_cpm.cp_peodr, pin);
+               else
+                       clrbits32(&mpc8xx_immr->im_cpm.cp_peodr, pin);
+       }
+}
+
+static void cpm1_set_pin16(int port, int pin, int flags)
+{
+       struct cpm_ioport16 __iomem *iop =
+               (struct cpm_ioport16 __iomem *)&mpc8xx_immr->im_ioport;
+
+       pin = 1 << (15 - pin);
+
+       if (port != 0)
+               iop += port - 1;
+
+       if (flags & CPM_PIN_OUTPUT)
+               setbits16(&iop->dir, pin);
+       else
+               clrbits16(&iop->dir, pin);
+
+       if (!(flags & CPM_PIN_GPIO))
+               setbits16(&iop->par, pin);
+       else
+               clrbits16(&iop->par, pin);
+
+       if (port == CPM_PORTC) {
+               if (flags & CPM_PIN_SECONDARY)
+                       setbits16(&iop->sor, pin);
+               else
+                       clrbits16(&iop->sor, pin);
+       }
+}
+
+void cpm1_set_pin(enum cpm_port port, int pin, int flags)
+{
+       if (port == CPM_PORTB || port == CPM_PORTE)
+               cpm1_set_pin32(port, pin, flags);
+       else
+               cpm1_set_pin16(port, pin, flags);
+}
+
+int cpm1_clk_setup(enum cpm_clk_target target, int clock, int mode)
+{
+       int shift;
+       int i, bits = 0;
+       u32 __iomem *reg;
+       u32 mask = 7;
+
+       u8 clk_map[][3] = {
+               {CPM_CLK_SCC1, CPM_BRG1, 0},
+               {CPM_CLK_SCC1, CPM_BRG2, 1},
+               {CPM_CLK_SCC1, CPM_BRG3, 2},
+               {CPM_CLK_SCC1, CPM_BRG4, 3},
+               {CPM_CLK_SCC1, CPM_CLK1, 4},
+               {CPM_CLK_SCC1, CPM_CLK2, 5},
+               {CPM_CLK_SCC1, CPM_CLK3, 6},
+               {CPM_CLK_SCC1, CPM_CLK4, 7},
+
+               {CPM_CLK_SCC2, CPM_BRG1, 0},
+               {CPM_CLK_SCC2, CPM_BRG2, 1},
+               {CPM_CLK_SCC2, CPM_BRG3, 2},
+               {CPM_CLK_SCC2, CPM_BRG4, 3},
+               {CPM_CLK_SCC2, CPM_CLK1, 4},
+               {CPM_CLK_SCC2, CPM_CLK2, 5},
+               {CPM_CLK_SCC2, CPM_CLK3, 6},
+               {CPM_CLK_SCC2, CPM_CLK4, 7},
+
+               {CPM_CLK_SCC3, CPM_BRG1, 0},
+               {CPM_CLK_SCC3, CPM_BRG2, 1},
+               {CPM_CLK_SCC3, CPM_BRG3, 2},
+               {CPM_CLK_SCC3, CPM_BRG4, 3},
+               {CPM_CLK_SCC3, CPM_CLK5, 4},
+               {CPM_CLK_SCC3, CPM_CLK6, 5},
+               {CPM_CLK_SCC3, CPM_CLK7, 6},
+               {CPM_CLK_SCC3, CPM_CLK8, 7},
+
+               {CPM_CLK_SCC4, CPM_BRG1, 0},
+               {CPM_CLK_SCC4, CPM_BRG2, 1},
+               {CPM_CLK_SCC4, CPM_BRG3, 2},
+               {CPM_CLK_SCC4, CPM_BRG4, 3},
+               {CPM_CLK_SCC4, CPM_CLK5, 4},
+               {CPM_CLK_SCC4, CPM_CLK6, 5},
+               {CPM_CLK_SCC4, CPM_CLK7, 6},
+               {CPM_CLK_SCC4, CPM_CLK8, 7},
+
+               {CPM_CLK_SMC1, CPM_BRG1, 0},
+               {CPM_CLK_SMC1, CPM_BRG2, 1},
+               {CPM_CLK_SMC1, CPM_BRG3, 2},
+               {CPM_CLK_SMC1, CPM_BRG4, 3},
+               {CPM_CLK_SMC1, CPM_CLK1, 4},
+               {CPM_CLK_SMC1, CPM_CLK2, 5},
+               {CPM_CLK_SMC1, CPM_CLK3, 6},
+               {CPM_CLK_SMC1, CPM_CLK4, 7},
+
+               {CPM_CLK_SMC2, CPM_BRG1, 0},
+               {CPM_CLK_SMC2, CPM_BRG2, 1},
+               {CPM_CLK_SMC2, CPM_BRG3, 2},
+               {CPM_CLK_SMC2, CPM_BRG4, 3},
+               {CPM_CLK_SMC2, CPM_CLK5, 4},
+               {CPM_CLK_SMC2, CPM_CLK6, 5},
+               {CPM_CLK_SMC2, CPM_CLK7, 6},
+               {CPM_CLK_SMC2, CPM_CLK8, 7},
+       };
+
+       switch (target) {
+       case CPM_CLK_SCC1:
+               reg = &mpc8xx_immr->im_cpm.cp_sicr;
+               shift = 0;
+               break;
+
+       case CPM_CLK_SCC2:
+               reg = &mpc8xx_immr->im_cpm.cp_sicr;
+               shift = 8;
+               break;
+
+       case CPM_CLK_SCC3:
+               reg = &mpc8xx_immr->im_cpm.cp_sicr;
+               shift = 16;
+               break;
+
+       case CPM_CLK_SCC4:
+               reg = &mpc8xx_immr->im_cpm.cp_sicr;
+               shift = 24;
+               break;
+
+       case CPM_CLK_SMC1:
+               reg = &mpc8xx_immr->im_cpm.cp_simode;
+               shift = 12;
+               break;
+
+       case CPM_CLK_SMC2:
+               reg = &mpc8xx_immr->im_cpm.cp_simode;
+               shift = 28;
+               break;
+
+       default:
+               printk(KERN_ERR "cpm1_clock_setup: invalid clock target\n");
+               return -EINVAL;
+       }
+
+       if (reg == &mpc8xx_immr->im_cpm.cp_sicr && mode == CPM_CLK_RX)
+               shift += 3;
+
+       for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
+               if (clk_map[i][0] == target && clk_map[i][1] == clock) {
+                       bits = clk_map[i][2];
+                       break;
+               }
+       }
+
+       if (i == ARRAY_SIZE(clk_map)) {
+               printk(KERN_ERR "cpm1_clock_setup: invalid clock combination\n");
+               return -EINVAL;
+       }
+
+       bits <<= shift;
+       mask <<= shift;
+       out_be32(reg, (in_be32(reg) & ~mask) | bits);
+
+       return 0;
+}
diff --git a/arch/powerpc/sysdev/commproc.h b/arch/powerpc/sysdev/commproc.h
new file mode 100644 (file)
index 0000000..9155ba4
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef _POWERPC_SYSDEV_COMMPROC_H
+#define _POWERPC_SYSDEV_COMMPROC_H
+
+extern void cpm_reset(void);
+extern void mpc8xx_restart(char *cmd);
+extern void mpc8xx_calibrate_decr(void);
+extern int mpc8xx_set_rtc_time(struct rtc_time *tm);
+extern void mpc8xx_get_rtc_time(struct rtc_time *tm);
+extern void m8xx_pic_init(void);
+extern unsigned int mpc8xx_get_irq(void);
+
+#endif
index c827715a50907704ad1e7d4b65d7206fa9988477..859362fecb7c659a6e546ef92dc5610b843109ea 100644 (file)
@@ -33,6 +33,8 @@
 #include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
+#include <linux/of.h>
+
 #include <asm/io.h>
 #include <asm/irq.h>
 #include <asm/mpc8260.h>
 
 #include <sysdev/fsl_soc.h>
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 static void cpm2_dpinit(void);
-cpm_cpm2_t     *cpmp;          /* Pointer to comm processor space */
+#endif
+
+cpm_cpm2_t __iomem *cpmp; /* Pointer to comm processor space */
 
 /* We allocate this here because it is used almost exclusively for
  * the communication processor devices.
  */
-cpm2_map_t *cpm2_immr;
-intctl_cpm2_t *cpm2_intctl;
+cpm2_map_t __iomem *cpm2_immr;
 
 #define CPM_MAP_SIZE   (0x40000)       /* 256k - the PQ3 reserve this amount
                                           of space for CPM as it is larger
@@ -60,12 +64,19 @@ intctl_cpm2_t *cpm2_intctl;
 void
 cpm2_reset(void)
 {
-       cpm2_immr = (cpm2_map_t *)ioremap(CPM_MAP_ADDR, CPM_MAP_SIZE);
-       cpm2_intctl = cpm2_map(im_intctl);
+#ifdef CONFIG_PPC_85xx
+       cpm2_immr = ioremap(CPM_MAP_ADDR, CPM_MAP_SIZE);
+#else
+       cpm2_immr = ioremap(get_immrbase(), CPM_MAP_SIZE);
+#endif
 
        /* Reclaim the DP memory for our use.
         */
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+       cpm_muram_init();
+#else
        cpm2_dpinit();
+#endif
 
        /* Tell everyone where the comm processor resides.
         */
@@ -91,7 +102,7 @@ cpm2_reset(void)
 void
 cpm_setbrg(uint brg, uint rate)
 {
-       volatile uint   *bp;
+       u32 __iomem *bp;
 
        /* This is good enough to get SMCs running.....
        */
@@ -113,7 +124,8 @@ cpm_setbrg(uint brg, uint rate)
 void
 cpm2_fastbrg(uint brg, uint rate, int div16)
 {
-       volatile uint   *bp;
+       u32 __iomem *bp;
+       u32 val;
 
        if (brg < 4) {
                bp = cpm2_map_size(im_brgc1, 16);
@@ -123,10 +135,11 @@ cpm2_fastbrg(uint brg, uint rate, int div16)
                brg -= 4;
        }
        bp += brg;
-       *bp = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
+       val = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
        if (div16)
-               *bp |= CPM_BRG_DIV16;
+               val |= CPM_BRG_DIV16;
 
+       out_be32(bp, val);
        cpm2_unmap(bp);
 }
 
@@ -135,10 +148,11 @@ int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
        int ret = 0;
        int shift;
        int i, bits = 0;
-       cpmux_t *im_cpmux;
-       u32 *reg;
+       cpmux_t __iomem *im_cpmux;
+       u32 __iomem *reg;
        u32 mask = 7;
-       u8 clk_map [24][3] = {
+
+       u8 clk_map[][3] = {
                {CPM_CLK_FCC1, CPM_BRG5, 0},
                {CPM_CLK_FCC1, CPM_BRG6, 1},
                {CPM_CLK_FCC1, CPM_BRG7, 2},
@@ -162,8 +176,40 @@ int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
                {CPM_CLK_FCC3, CPM_CLK13, 4},
                {CPM_CLK_FCC3, CPM_CLK14, 5},
                {CPM_CLK_FCC3, CPM_CLK15, 6},
-               {CPM_CLK_FCC3, CPM_CLK16, 7}
-               };
+               {CPM_CLK_FCC3, CPM_CLK16, 7},
+               {CPM_CLK_SCC1, CPM_BRG1, 0},
+               {CPM_CLK_SCC1, CPM_BRG2, 1},
+               {CPM_CLK_SCC1, CPM_BRG3, 2},
+               {CPM_CLK_SCC1, CPM_BRG4, 3},
+               {CPM_CLK_SCC1, CPM_CLK11, 4},
+               {CPM_CLK_SCC1, CPM_CLK12, 5},
+               {CPM_CLK_SCC1, CPM_CLK3, 6},
+               {CPM_CLK_SCC1, CPM_CLK4, 7},
+               {CPM_CLK_SCC2, CPM_BRG1, 0},
+               {CPM_CLK_SCC2, CPM_BRG2, 1},
+               {CPM_CLK_SCC2, CPM_BRG3, 2},
+               {CPM_CLK_SCC2, CPM_BRG4, 3},
+               {CPM_CLK_SCC2, CPM_CLK11, 4},
+               {CPM_CLK_SCC2, CPM_CLK12, 5},
+               {CPM_CLK_SCC2, CPM_CLK3, 6},
+               {CPM_CLK_SCC2, CPM_CLK4, 7},
+               {CPM_CLK_SCC3, CPM_BRG1, 0},
+               {CPM_CLK_SCC3, CPM_BRG2, 1},
+               {CPM_CLK_SCC3, CPM_BRG3, 2},
+               {CPM_CLK_SCC3, CPM_BRG4, 3},
+               {CPM_CLK_SCC3, CPM_CLK5, 4},
+               {CPM_CLK_SCC3, CPM_CLK6, 5},
+               {CPM_CLK_SCC3, CPM_CLK7, 6},
+               {CPM_CLK_SCC3, CPM_CLK8, 7},
+               {CPM_CLK_SCC4, CPM_BRG1, 0},
+               {CPM_CLK_SCC4, CPM_BRG2, 1},
+               {CPM_CLK_SCC4, CPM_BRG3, 2},
+               {CPM_CLK_SCC4, CPM_BRG4, 3},
+               {CPM_CLK_SCC4, CPM_CLK5, 4},
+               {CPM_CLK_SCC4, CPM_CLK6, 5},
+               {CPM_CLK_SCC4, CPM_CLK7, 6},
+               {CPM_CLK_SCC4, CPM_CLK8, 7},
+       };
 
        im_cpmux = cpm2_map(im_cpmux);
 
@@ -201,25 +247,83 @@ int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
        }
 
        if (mode == CPM_CLK_RX)
-               shift +=3;
+               shift += 3;
 
-       for (i=0; i<24; i++) {
+       for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
                if (clk_map[i][0] == target && clk_map[i][1] == clock) {
                        bits = clk_map[i][2];
                        break;
                }
        }
-       if (i == sizeof(clk_map)/3)
+       if (i == ARRAY_SIZE(clk_map))
            ret = -EINVAL;
 
        bits <<= shift;
        mask <<= shift;
+
        out_be32(reg, (in_be32(reg) & ~mask) | bits);
 
        cpm2_unmap(im_cpmux);
        return ret;
 }
 
+int cpm2_smc_clk_setup(enum cpm_clk_target target, int clock)
+{
+       int ret = 0;
+       int shift;
+       int i, bits = 0;
+       cpmux_t __iomem *im_cpmux;
+       u8 __iomem *reg;
+       u8 mask = 3;
+
+       u8 clk_map[][3] = {
+               {CPM_CLK_SMC1, CPM_BRG1, 0},
+               {CPM_CLK_SMC1, CPM_BRG7, 1},
+               {CPM_CLK_SMC1, CPM_CLK7, 2},
+               {CPM_CLK_SMC1, CPM_CLK9, 3},
+               {CPM_CLK_SMC2, CPM_BRG2, 0},
+               {CPM_CLK_SMC2, CPM_BRG8, 1},
+               {CPM_CLK_SMC2, CPM_CLK4, 2},
+               {CPM_CLK_SMC2, CPM_CLK15, 3},
+       };
+
+       im_cpmux = cpm2_map(im_cpmux);
+
+       switch (target) {
+       case CPM_CLK_SMC1:
+               reg = &im_cpmux->cmx_smr;
+               mask = 3;
+               shift = 4;
+               break;
+       case CPM_CLK_SMC2:
+               reg = &im_cpmux->cmx_smr;
+               mask = 3;
+               shift = 0;
+               break;
+       default:
+               printk(KERN_ERR "cpm2_smc_clock_setup: invalid clock target\n");
+               return -EINVAL;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
+               if (clk_map[i][0] == target && clk_map[i][1] == clock) {
+                       bits = clk_map[i][2];
+                       break;
+               }
+       }
+       if (i == ARRAY_SIZE(clk_map))
+           ret = -EINVAL;
+
+       bits <<= shift;
+       mask <<= shift;
+
+       out_8(reg, (in_8(reg) & ~mask) | bits);
+
+       cpm2_unmap(im_cpmux);
+       return ret;
+}
+
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 /*
  * dpalloc / dpfree bits.
  */
@@ -228,20 +332,20 @@ static spinlock_t cpm_dpmem_lock;
  * until the memory subsystem goes up... */
 static rh_block_t cpm_boot_dpmem_rh_block[16];
 static rh_info_t cpm_dpmem_info;
-static u8im_dprambase;
+static u8 __iomem *im_dprambase;
 
 static void cpm2_dpinit(void)
 {
        spin_lock_init(&cpm_dpmem_lock);
 
-       im_dprambase = ioremap(CPM_MAP_ADDR, CPM_DATAONLY_BASE + CPM_DATAONLY_SIZE);
-
        /* initialize the info header */
        rh_init(&cpm_dpmem_info, 1,
                        sizeof(cpm_boot_dpmem_rh_block) /
                        sizeof(cpm_boot_dpmem_rh_block[0]),
                        cpm_boot_dpmem_rh_block);
 
+       im_dprambase = cpm2_immr;
+
        /* Attach the usable dpmem area */
        /* XXX: This is actually crap. CPM_DATAONLY_BASE and
         * CPM_DATAONLY_SIZE is only a subset of the available dpram. It
@@ -306,3 +410,37 @@ void *cpm_dpram_addr(unsigned long offset)
        return (void *)(im_dprambase + offset);
 }
 EXPORT_SYMBOL(cpm_dpram_addr);
+#endif /* !CONFIG_PPC_CPM_NEW_BINDING */
+
+struct cpm2_ioports {
+       u32 dir, par, sor, odr, dat;
+       u32 res[3];
+};
+
+void cpm2_set_pin(int port, int pin, int flags)
+{
+       struct cpm2_ioports __iomem *iop =
+               (struct cpm2_ioports __iomem *)&cpm2_immr->im_ioport;
+
+       pin = 1 << (31 - pin);
+
+       if (flags & CPM_PIN_OUTPUT)
+               setbits32(&iop[port].dir, pin);
+       else
+               clrbits32(&iop[port].dir, pin);
+
+       if (!(flags & CPM_PIN_GPIO))
+               setbits32(&iop[port].par, pin);
+       else
+               clrbits32(&iop[port].par, pin);
+
+       if (flags & CPM_PIN_SECONDARY)
+               setbits32(&iop[port].sor, pin);
+       else
+               clrbits32(&iop[port].sor, pin);
+
+       if (flags & CPM_PIN_OPENDRAIN)
+               setbits32(&iop[port].odr, pin);
+       else
+               clrbits32(&iop[port].odr, pin);
+}
index eabfe06fe05c11cddd563b2e04365211a1b2759a..5fe65b2f8f3a7a2c8d9079940f2eb1fdc79dac4e 100644 (file)
@@ -48,9 +48,8 @@
 #define CPM2_IRQ_PORTC15       48
 #define CPM2_IRQ_PORTC0                63
 
-static intctl_cpm2_t *cpm2_intctl;
+static intctl_cpm2_t __iomem *cpm2_intctl;
 
-static struct device_node *cpm2_pic_node;
 static struct irq_host *cpm2_pic_host;
 #define NR_MASK_WORDS   ((NR_IRQS + 31) / 32)
 static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
@@ -206,11 +205,6 @@ unsigned int cpm2_get_irq(void)
        return irq_linear_revmap(cpm2_pic_host, irq);
 }
 
-static int cpm2_pic_host_match(struct irq_host *h, struct device_node *node)
-{
-       return cpm2_pic_node == node;
-}
-
 static int cpm2_pic_host_map(struct irq_host *h, unsigned int virq,
                          irq_hw_number_t hw)
 {
@@ -234,7 +228,6 @@ static int cpm2_pic_host_xlate(struct irq_host *h, struct device_node *ct,
 }
 
 static struct irq_host_ops cpm2_pic_host_ops = {
-       .match = cpm2_pic_host_match,
        .map = cpm2_pic_host_map,
        .xlate = cpm2_pic_host_xlate,
 };
@@ -273,8 +266,8 @@ void cpm2_pic_init(struct device_node *node)
        out_be32(&cpm2_intctl->ic_scprrl, 0x05309770);
 
        /* create a legacy host */
-       cpm2_pic_node = of_node_get(node);
-       cpm2_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &cpm2_pic_host_ops, 64);
+       cpm2_pic_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
+                                      64, &cpm2_pic_host_ops, 64);
        if (cpm2_pic_host == NULL) {
                printk(KERN_ERR "CPM2 PIC: failed to allocate irq host!\n");
                return;
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c
new file mode 100644 (file)
index 0000000..66c8ad4
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Common CPM code
+ *
+ * Author: Scott Wood <scottwood@freescale.com>
+ *
+ * Copyright 2007 Freescale Semiconductor, Inc.
+ *
+ * Some parts derived from commproc.c/cpm2_common.c, which is:
+ * Copyright (c) 1997 Dan error_act (dmalek@jlc.net)
+ * Copyright (c) 1999-2001 Dan Malek <dan@embeddedalley.com>
+ * Copyright (c) 2000 MontaVista Software, Inc (source@mvista.com)
+ * 2006 (c) MontaVista Software, Inc.
+ * Vitaly Bordug <vbordug@ru.mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/of_device.h>
+
+#include <asm/udbg.h>
+#include <asm/io.h>
+#include <asm/system.h>
+#include <asm/rheap.h>
+#include <asm/cpm.h>
+
+#include <mm/mmu_decl.h>
+
+#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
+static u32 __iomem *cpm_udbg_txdesc =
+       (u32 __iomem __force *)CONFIG_PPC_EARLY_DEBUG_CPM_ADDR;
+
+static void udbg_putc_cpm(char c)
+{
+       u8 __iomem *txbuf = (u8 __iomem __force *)in_be32(&cpm_udbg_txdesc[1]);
+
+       if (c == '\n')
+               udbg_putc('\r');
+
+       while (in_be32(&cpm_udbg_txdesc[0]) & 0x80000000)
+               ;
+
+       out_8(txbuf, c);
+       out_be32(&cpm_udbg_txdesc[0], 0xa0000001);
+}
+
+void __init udbg_init_cpm(void)
+{
+       if (cpm_udbg_txdesc) {
+#ifdef CONFIG_CPM2
+               setbat(1, 0xf0000000, 0xf0000000, 1024*1024, _PAGE_IO);
+#endif
+               udbg_putc = udbg_putc_cpm;
+               udbg_putc('X');
+       }
+}
+#endif
+
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+static spinlock_t cpm_muram_lock;
+static rh_block_t cpm_boot_muram_rh_block[16];
+static rh_info_t cpm_muram_info;
+static u8 __iomem *muram_vbase;
+static phys_addr_t muram_pbase;
+
+/* Max address size we deal with */
+#define OF_MAX_ADDR_CELLS      4
+
+int __init cpm_muram_init(void)
+{
+       struct device_node *np;
+       struct resource r;
+       u32 zero[OF_MAX_ADDR_CELLS] = {};
+       resource_size_t max = 0;
+       int i = 0;
+       int ret = 0;
+
+       printk("cpm_muram_init\n");
+
+       spin_lock_init(&cpm_muram_lock);
+       /* initialize the info header */
+       rh_init(&cpm_muram_info, 1,
+               sizeof(cpm_boot_muram_rh_block) /
+               sizeof(cpm_boot_muram_rh_block[0]),
+               cpm_boot_muram_rh_block);
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,cpm-muram-data");
+       if (!np) {
+               printk(KERN_ERR "Cannot find CPM muram data node");
+               ret = -ENODEV;
+               goto out;
+       }
+
+       muram_pbase = of_translate_address(np, zero);
+       if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
+               printk(KERN_ERR "Cannot translate zero through CPM muram node");
+               ret = -ENODEV;
+               goto out;
+       }
+
+       while (of_address_to_resource(np, i++, &r) == 0) {
+               if (r.end > max)
+                       max = r.end;
+
+               rh_attach_region(&cpm_muram_info, r.start - muram_pbase,
+                                r.end - r.start + 1);
+       }
+
+       muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
+       if (!muram_vbase) {
+               printk(KERN_ERR "Cannot map CPM muram");
+               ret = -ENOMEM;
+       }
+
+out:
+       of_node_put(np);
+       return ret;
+}
+
+/**
+ * cpm_muram_alloc - allocate the requested size worth of multi-user ram
+ * @size: number of bytes to allocate
+ * @align: requested alignment, in bytes
+ *
+ * This function returns an offset into the muram area.
+ * Use cpm_dpram_addr() to get the virtual address of the area.
+ * Use cpm_muram_free() to free the allocation.
+ */
+unsigned long cpm_muram_alloc(unsigned long size, unsigned long align)
+{
+       unsigned long start;
+       unsigned long flags;
+
+       spin_lock_irqsave(&cpm_muram_lock, flags);
+       cpm_muram_info.alignment = align;
+       start = rh_alloc(&cpm_muram_info, size, "commproc");
+       spin_unlock_irqrestore(&cpm_muram_lock, flags);
+
+       return start;
+}
+EXPORT_SYMBOL(cpm_muram_alloc);
+
+/**
+ * cpm_muram_free - free a chunk of multi-user ram
+ * @offset: The beginning of the chunk as returned by cpm_muram_alloc().
+ */
+int cpm_muram_free(unsigned long offset)
+{
+       int ret;
+       unsigned long flags;
+
+       spin_lock_irqsave(&cpm_muram_lock, flags);
+       ret = rh_free(&cpm_muram_info, offset);
+       spin_unlock_irqrestore(&cpm_muram_lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL(cpm_muram_free);
+
+/**
+ * cpm_muram_alloc_fixed - reserve a specific region of multi-user ram
+ * @offset: the offset into the muram area to reserve
+ * @size: the number of bytes to reserve
+ *
+ * This function returns "start" on success, -ENOMEM on failure.
+ * Use cpm_dpram_addr() to get the virtual address of the area.
+ * Use cpm_muram_free() to free the allocation.
+ */
+unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size)
+{
+       unsigned long start;
+       unsigned long flags;
+
+       spin_lock_irqsave(&cpm_muram_lock, flags);
+       cpm_muram_info.alignment = 1;
+       start = rh_alloc_fixed(&cpm_muram_info, offset, size, "commproc");
+       spin_unlock_irqrestore(&cpm_muram_lock, flags);
+
+       return start;
+}
+EXPORT_SYMBOL(cpm_muram_alloc_fixed);
+
+/**
+ * cpm_muram_addr - turn a muram offset into a virtual address
+ * @offset: muram offset to convert
+ */
+void __iomem *cpm_muram_addr(unsigned long offset)
+{
+       return muram_vbase + offset;
+}
+EXPORT_SYMBOL(cpm_muram_addr);
+
+/**
+ * cpm_muram_phys - turn a muram virtual address into a DMA address
+ * @offset: virtual address from cpm_muram_addr() to convert
+ */
+dma_addr_t cpm_muram_dma(void __iomem *addr)
+{
+       return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
+}
+EXPORT_SYMBOL(cpm_muram_dma);
+
+#endif /* CONFIG_PPC_CPM_NEW_BINDING */
index a1d2042bb304be44dad2188fec3365d51f91cc0b..e0e24b01e3a61c5138ff110e40c3a66c219ffa36 100644 (file)
@@ -204,7 +204,7 @@ static void dart_free(struct iommu_table *tbl, long index, long npages)
 }
 
 
-static int dart_init(struct device_node *dart_node)
+static int __init dart_init(struct device_node *dart_node)
 {
        unsigned int i;
        unsigned long tmp, base, size;
@@ -313,7 +313,7 @@ static void pci_dma_bus_setup_dart(struct pci_bus *bus)
                PCI_DN(dn)->iommu_table = &iommu_table_dart;
 }
 
-void iommu_init_early_dart(void)
+void __init iommu_init_early_dart(void)
 {
        struct device_node *dn;
 
index 574b6ef44e0bbfd59c56dbd3cf9afc28f24b9876..ab11c0b2902459a7434e0331f6741d7b82765c78 100644 (file)
@@ -33,6 +33,7 @@ unsigned int dcr_resource_start(struct device_node *np, unsigned int index)
 
        return dr[index * 2];
 }
+EXPORT_SYMBOL_GPL(dcr_resource_start);
 
 unsigned int dcr_resource_len(struct device_node *np, unsigned int index)
 {
@@ -44,6 +45,7 @@ unsigned int dcr_resource_len(struct device_node *np, unsigned int index)
 
        return dr[index * 2 + 1];
 }
+EXPORT_SYMBOL_GPL(dcr_resource_len);
 
 #ifndef CONFIG_PPC_DCR_NATIVE
 
@@ -102,7 +104,7 @@ u64 of_translate_dcr_address(struct device_node *dev,
 dcr_host_t dcr_map(struct device_node *dev, unsigned int dcr_n,
                   unsigned int dcr_c)
 {
-       dcr_host_t ret = { .token = NULL, .stride = 0 };
+       dcr_host_t ret = { .token = NULL, .stride = 0, .base = dcr_n };
        u64 addr;
 
        pr_debug("dcr_map(%s, 0x%x, 0x%x)\n",
@@ -122,6 +124,7 @@ dcr_host_t dcr_map(struct device_node *dev, unsigned int dcr_n,
        ret.token -= dcr_n * ret.stride;
        return ret;
 }
+EXPORT_SYMBOL_GPL(dcr_map);
 
 void dcr_unmap(dcr_host_t host, unsigned int dcr_n, unsigned int dcr_c)
 {
@@ -133,5 +136,6 @@ void dcr_unmap(dcr_host_t host, unsigned int dcr_n, unsigned int dcr_c)
        iounmap(h.token);
        h.token = NULL;
 }
+EXPORT_SYMBOL_GPL(dcr_unmap);
 
 #endif /* !defined(CONFIG_PPC_DCR_NATIVE) */
index 114c90f8f560e74eee8cd6560f3d5f40e4bb6221..af090c93be10e205a536e4782d96902feab862cb 100644 (file)
@@ -160,8 +160,8 @@ static void __init quirk_fsl_pcie_transparent(struct pci_dev *dev)
 
 int __init fsl_pcie_check_link(struct pci_controller *hose)
 {
-       u16 val;
-       early_read_config_word(hose, 0, 0, PCIE_LTSSM, &val);
+       u32 val;
+       early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val);
        if (val < PCIE_LTSSM_L0)
                return 1;
        return 0;
@@ -255,5 +255,8 @@ DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_transpare
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_transparent);
+DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_transparent)
+DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_transparent);
 DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_transparent);
+DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_transparent);
index 1cf29c9d4408dbb4cfa863b16abb441a15b6cc07..3ace7474809e00ba6d21be039e2d6dc21215b442 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/platform_device.h>
 #include <linux/of_platform.h>
 #include <linux/phy.h>
+#include <linux/spi/spi.h>
 #include <linux/fsl_devices.h>
 #include <linux/fs_enet_pd.h>
 #include <linux/fs_uart_pd.h>
@@ -52,13 +53,13 @@ phys_addr_t get_immrbase(void)
 
        soc = of_find_node_by_type(NULL, "soc");
        if (soc) {
-               unsigned int size;
+               int size;
                const void *prop = of_get_property(soc, "reg", &size);
 
                if (prop)
                        immrbase = of_translate_address(soc, prop);
                of_node_put(soc);
-       };
+       }
 
        return immrbase;
 }
@@ -72,20 +73,31 @@ static u32 brgfreq = -1;
 u32 get_brgfreq(void)
 {
        struct device_node *node;
+       const unsigned int *prop;
+       int size;
 
        if (brgfreq != -1)
                return brgfreq;
 
-       node = of_find_node_by_type(NULL, "cpm");
+       node = of_find_compatible_node(NULL, NULL, "fsl,cpm-brg");
        if (node) {
-               unsigned int size;
-               const unsigned int *prop = of_get_property(node,
-                                       "brg-frequency", &size);
+               prop = of_get_property(node, "clock-frequency", &size);
+               if (prop && size == 4)
+                       brgfreq = *prop;
 
-               if (prop)
+               of_node_put(node);
+               return brgfreq;
+       }
+
+       /* Legacy device binding -- will go away when no users are left. */
+       node = of_find_node_by_type(NULL, "cpm");
+       if (node) {
+               prop = of_get_property(node, "brg-frequency", &size);
+               if (prop && size == 4)
                        brgfreq = *prop;
+
                of_node_put(node);
-       };
+       }
 
        return brgfreq;
 }
@@ -103,14 +115,14 @@ u32 get_baudrate(void)
 
        node = of_find_node_by_type(NULL, "serial");
        if (node) {
-               unsigned int size;
+               int size;
                const unsigned int *prop = of_get_property(node,
                                "current-speed", &size);
 
                if (prop)
                        fs_baudrate = *prop;
                of_node_put(node);
-       };
+       }
 
        return fs_baudrate;
 }
@@ -319,34 +331,46 @@ static struct i2c_driver_device i2c_devices[] __initdata = {
        {"ricoh,rs5c372b", "rtc-rs5c372", "rs5c372b",},
        {"ricoh,rv5c386",  "rtc-rs5c372", "rv5c386",},
        {"ricoh,rv5c387a", "rtc-rs5c372", "rv5c387a",},
+       {"dallas,ds1307",  "rtc-ds1307",  "ds1307",},
+       {"dallas,ds1337",  "rtc-ds1307",  "ds1337",},
+       {"dallas,ds1338",  "rtc-ds1307",  "ds1338",},
+       {"dallas,ds1339",  "rtc-ds1307",  "ds1339",},
+       {"dallas,ds1340",  "rtc-ds1307",  "ds1340",},
+       {"stm,m41t00",     "rtc-ds1307",  "m41t00"},
+       {"dallas,ds1374",  "rtc-ds1374",  "rtc-ds1374",},
 };
 
-static int __init of_find_i2c_driver(struct device_node *node, struct i2c_board_info *info)
+static int __init of_find_i2c_driver(struct device_node *node,
+                                    struct i2c_board_info *info)
 {
        int i;
 
        for (i = 0; i < ARRAY_SIZE(i2c_devices); i++) {
                if (!of_device_is_compatible(node, i2c_devices[i].of_device))
                        continue;
-               strncpy(info->driver_name, i2c_devices[i].i2c_driver, KOBJ_NAME_LEN);
-               strncpy(info->type, i2c_devices[i].i2c_type, I2C_NAME_SIZE);
+               if (strlcpy(info->driver_name, i2c_devices[i].i2c_driver,
+                           KOBJ_NAME_LEN) >= KOBJ_NAME_LEN ||
+                   strlcpy(info->type, i2c_devices[i].i2c_type,
+                           I2C_NAME_SIZE) >= I2C_NAME_SIZE)
+                       return -ENOMEM;
                return 0;
        }
        return -ENODEV;
 }
 
-static void __init of_register_i2c_devices(struct device_node *adap_node, int bus_num)
+static void __init of_register_i2c_devices(struct device_node *adap_node,
+                                          int bus_num)
 {
        struct device_node *node = NULL;
 
        while ((node = of_get_next_child(adap_node, node))) {
-               struct i2c_board_info info;
+               struct i2c_board_info info = {};
                const u32 *addr;
                int len;
 
                addr = of_get_property(node, "reg", &len);
                if (!addr || len < sizeof(int) || *addr > (1 << 10) - 1) {
-                       printk(KERN_WARNING "fsl_ioc.c: invalid i2c device entry\n");
+                       printk(KERN_WARNING "fsl_soc.c: invalid i2c device entry\n");
                        continue;
                }
 
@@ -357,7 +381,6 @@ static void __init of_register_i2c_devices(struct device_node *adap_node, int bu
                if (of_find_i2c_driver(node, &info) < 0)
                        continue;
 
-               info.platform_data = NULL;
                info.addr = *addr;
 
                i2c_register_board_info(bus_num, &info, 1);
@@ -648,6 +671,7 @@ err:
 
 arch_initcall(fsl_usb_of_init);
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 #ifdef CONFIG_CPM2
 
 extern void init_scc_ioports(struct fs_uart_platform_info*);
@@ -1187,3 +1211,132 @@ err:
 arch_initcall(cpm_smc_uart_of_init);
 
 #endif /* CONFIG_8xx */
+#endif /* CONFIG_PPC_CPM_NEW_BINDING */
+
+int __init fsl_spi_init(struct spi_board_info *board_infos,
+                       unsigned int num_board_infos,
+                       void (*activate_cs)(u8 cs, u8 polarity),
+                       void (*deactivate_cs)(u8 cs, u8 polarity))
+{
+       struct device_node *np;
+       unsigned int i;
+       const u32 *sysclk;
+
+       /* SPI controller is either clocked from QE or SoC clock */
+       np = of_find_node_by_type(NULL, "qe");
+       if (!np)
+               np = of_find_node_by_type(NULL, "soc");
+
+       if (!np)
+               return -ENODEV;
+
+       sysclk = of_get_property(np, "bus-frequency", NULL);
+       if (!sysclk)
+               return -ENODEV;
+
+       for (np = NULL, i = 1;
+            (np = of_find_compatible_node(np, "spi", "fsl_spi")) != NULL;
+            i++) {
+               int ret = 0;
+               unsigned int j;
+               const void *prop;
+               struct resource res[2];
+               struct platform_device *pdev;
+               struct fsl_spi_platform_data pdata = {
+                       .activate_cs = activate_cs,
+                       .deactivate_cs = deactivate_cs,
+               };
+
+               memset(res, 0, sizeof(res));
+
+               pdata.sysclk = *sysclk;
+
+               prop = of_get_property(np, "reg", NULL);
+               if (!prop)
+                       goto err;
+               pdata.bus_num = *(u32 *)prop;
+
+               prop = of_get_property(np, "mode", NULL);
+               if (prop && !strcmp(prop, "cpu-qe"))
+                       pdata.qe_mode = 1;
+
+               for (j = 0; j < num_board_infos; j++) {
+                       if (board_infos[j].bus_num == pdata.bus_num)
+                               pdata.max_chipselect++;
+               }
+
+               if (!pdata.max_chipselect)
+                       goto err;
+
+               ret = of_address_to_resource(np, 0, &res[0]);
+               if (ret)
+                       goto err;
+
+               ret = of_irq_to_resource(np, 0, &res[1]);
+               if (ret == NO_IRQ)
+                       goto err;
+
+               pdev = platform_device_alloc("mpc83xx_spi", i);
+               if (!pdev)
+                       goto err;
+
+               ret = platform_device_add_data(pdev, &pdata, sizeof(pdata));
+               if (ret)
+                       goto unreg;
+
+               ret = platform_device_add_resources(pdev, res,
+                                                   ARRAY_SIZE(res));
+               if (ret)
+                       goto unreg;
+
+               ret = platform_device_register(pdev);
+               if (ret)
+                       goto unreg;
+
+               continue;
+unreg:
+               platform_device_del(pdev);
+err:
+               continue;
+       }
+
+       return spi_register_board_info(board_infos, num_board_infos);
+}
+
+#if defined(CONFIG_PPC_85xx) || defined(CONFIG_PPC_86xx)
+static __be32 __iomem *rstcr;
+
+static int __init setup_rstcr(void)
+{
+       struct device_node *np;
+       np = of_find_node_by_name(NULL, "global-utilities");
+       if ((np && of_get_property(np, "fsl,has-rstcr", NULL))) {
+               const u32 *prop = of_get_property(np, "reg", NULL);
+               if (prop) {
+                       /* map reset control register
+                        * 0xE00B0 is offset of reset control register
+                        */
+                       rstcr = ioremap(get_immrbase() + *prop + 0xB0, 0xff);
+                       if (!rstcr)
+                               printk (KERN_EMERG "Error: reset control "
+                                               "register not mapped!\n");
+               }
+       } else
+               printk (KERN_INFO "rstcr compatible register does not exist!\n");
+       if (np)
+               of_node_put(np);
+       return 0;
+}
+
+arch_initcall(setup_rstcr);
+
+void fsl_rstcr_restart(char *cmd)
+{
+       local_irq_disable();
+       if (rstcr)
+               /* set reset control register */
+               out_be32(rstcr, 0x2);   /* HRESET_REQ */
+
+       while (1) ;
+}
+#endif
index 04e145b5fc324066ebb52d2f895d8538270c3506..63e7db30a4cd5b547f6041589fcf43b88ee6568d 100644 (file)
@@ -8,5 +8,13 @@ extern phys_addr_t get_immrbase(void);
 extern u32 get_brgfreq(void);
 extern u32 get_baudrate(void);
 
+struct spi_board_info;
+
+extern int fsl_spi_init(struct spi_board_info *board_infos,
+                       unsigned int num_board_infos,
+                       void (*activate_cs)(u8 cs, u8 polarity),
+                       void (*deactivate_cs)(u8 cs, u8 polarity));
+
+extern void fsl_rstcr_restart(char *cmd);
 #endif
 #endif
index ad87adc975bcc1a6bbf0a901f8f158b6bc5610d3..7c1b27ac7d3caf70f1cc59f0b7fff3dff05fb109 100644 (file)
@@ -25,7 +25,6 @@ static unsigned char cached_8259[2] = { 0xff, 0xff };
 
 static DEFINE_SPINLOCK(i8259_lock);
 
-static struct device_node *i8259_node;
 static struct irq_host *i8259_host;
 
 /*
@@ -165,7 +164,7 @@ static struct resource pic_edgectrl_iores = {
 
 static int i8259_host_match(struct irq_host *h, struct device_node *node)
 {
-       return i8259_node == NULL || i8259_node == node;
+       return h->of_node == NULL || h->of_node == node;
 }
 
 static int i8259_host_map(struct irq_host *h, unsigned int virq,
@@ -276,9 +275,8 @@ void i8259_init(struct device_node *node, unsigned long intack_addr)
        spin_unlock_irqrestore(&i8259_lock, flags);
 
        /* create a legacy host */
-       if (node)
-               i8259_node = of_node_get(node);
-       i8259_host = irq_alloc_host(IRQ_HOST_MAP_LEGACY, 0, &i8259_host_ops, 0);
+       i8259_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LEGACY,
+                                   0, &i8259_host_ops, 0);
        if (i8259_host == NULL) {
                printk(KERN_ERR "i8259: failed to allocate irq host !\n");
                return;
index 5294560c7b00b5d65876995e8a96c10d047e3b08..cfbd2aae93e8a178e665242f415894b34fce3b41 100644 (file)
@@ -144,14 +144,16 @@ indirect_write_config(struct pci_bus *bus, unsigned int devfn, int offset,
 
 static struct pci_ops indirect_pci_ops =
 {
-       indirect_read_config,
-       indirect_write_config
+       .read = indirect_read_config,
+       .write = indirect_write_config,
 };
 
 void __init
-setup_indirect_pci(struct pci_controller* hose, u32 cfg_addr, u32 cfg_data, u32 flags)
+setup_indirect_pci(struct pci_controller* hose,
+                  resource_size_t cfg_addr,
+                  resource_size_t cfg_data, u32 flags)
 {
-       unsigned long base = cfg_addr & PAGE_MASK;
+       resource_size_t base = cfg_addr & PAGE_MASK;
        void __iomem *mbase;
 
        mbase = ioremap(base, PAGE_SIZE);
index 473c415e9e253bfd5a911274c5a5b42a90780929..05a56e55804c3ab4395671b9bd2a4713972cbf20 100644 (file)
@@ -511,10 +511,8 @@ static struct irq_chip ipic_irq_chip = {
 
 static int ipic_host_match(struct irq_host *h, struct device_node *node)
 {
-       struct ipic *ipic = h->host_data;
-
        /* Exact match, unless ipic node is NULL */
-       return ipic->of_node == NULL || ipic->of_node == node;
+       return h->of_node == NULL || h->of_node == node;
 }
 
 static int ipic_host_map(struct irq_host *h, unsigned int virq,
@@ -568,9 +566,8 @@ struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
                return NULL;
 
        memset(ipic, 0, sizeof(struct ipic));
-       ipic->of_node = of_node_get(node);
 
-       ipic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR,
+       ipic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
                                       NR_IPIC_INTS,
                                       &ipic_host_ops, 0);
        if (ipic->irqhost == NULL) {
index c28e589877eb050c201f782811d379d956978c42..bb309a501b2d475e036f8c18da88578b1617c9dc 100644 (file)
@@ -48,9 +48,6 @@ struct ipic {
 
        /* The "linux" controller struct */
        struct irq_chip         hc_irq;
-
-       /* The device node of the interrupt controller */
-       struct device_node      *of_node;
 };
 
 struct ipic_info {
index 2fc2bcd79b5efeca1ed8c4482e6751da80c3f117..7aa4ff5f5ec8fff069d3805aecce7f0a1eacc5f5 100644 (file)
 
 extern int cpm_get_irq(struct pt_regs *regs);
 
-static struct device_node *mpc8xx_pic_node;
 static struct irq_host *mpc8xx_pic_host;
 #define NR_MASK_WORDS   ((NR_IRQS + 31) / 32)
 static unsigned long ppc_cached_irq_mask[NR_MASK_WORDS];
-static sysconf8xx_t    *siu_reg;
+static sysconf8xx_t __iomem *siu_reg;
 
 int cpm_get_irq(struct pt_regs *regs);
 
@@ -120,11 +119,6 @@ unsigned int mpc8xx_get_irq(void)
 
 }
 
-static int mpc8xx_pic_host_match(struct irq_host *h, struct device_node *node)
-{
-       return mpc8xx_pic_node == node;
-}
-
 static int mpc8xx_pic_host_map(struct irq_host *h, unsigned int virq,
                          irq_hw_number_t hw)
 {
@@ -158,7 +152,6 @@ static int mpc8xx_pic_host_xlate(struct irq_host *h, struct device_node *ct,
 
 
 static struct irq_host_ops mpc8xx_pic_host_ops = {
-       .match = mpc8xx_pic_host_match,
        .map = mpc8xx_pic_host_map,
        .xlate = mpc8xx_pic_host_xlate,
 };
@@ -166,32 +159,33 @@ static struct irq_host_ops mpc8xx_pic_host_ops = {
 int mpc8xx_pic_init(void)
 {
        struct resource res;
-       struct device_node *np = NULL;
+       struct device_node *np;
        int ret;
 
-       np = of_find_node_by_type(np, "mpc8xx-pic");
-
+       np = of_find_compatible_node(NULL, NULL, "fsl,pq1-pic");
+       if (np == NULL)
+               np = of_find_node_by_type(NULL, "mpc8xx-pic");
        if (np == NULL) {
-               printk(KERN_ERR "Could not find open-pic node\n");
+               printk(KERN_ERR "Could not find fsl,pq1-pic node\n");
                return -ENOMEM;
        }
 
-       mpc8xx_pic_node = of_node_get(np);
-
        ret = of_address_to_resource(np, 0, &res);
-       of_node_put(np);
        if (ret)
-               return ret;
+               goto out;
 
-       siu_reg = (void *)ioremap(res.start, res.end - res.start + 1);
+       siu_reg = ioremap(res.start, res.end - res.start + 1);
        if (siu_reg == NULL)
                return -EINVAL;
 
-       mpc8xx_pic_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, 64, &mpc8xx_pic_host_ops, 64);
+       mpc8xx_pic_host = irq_alloc_host(of_node_get(np), IRQ_HOST_MAP_LINEAR,
+                                        64, &mpc8xx_pic_host_ops, 64);
        if (mpc8xx_pic_host == NULL) {
                printk(KERN_ERR "MPC8xx PIC: failed to allocate irq host!\n");
                ret = -ENOMEM;
        }
 
+out:
+       of_node_put(np);
        return ret;
 }
index 74c64c0d3b71d91841703f1c4b069508dca71769..893e65439e851584c0e0b46d3248de1e1fa97f00 100644 (file)
@@ -156,8 +156,7 @@ static inline u32 _mpic_read(enum mpic_reg_type type,
        switch(type) {
 #ifdef CONFIG_PPC_DCR
        case mpic_access_dcr:
-               return dcr_read(rb->dhost,
-                               rb->dbase + reg + rb->doff);
+               return dcr_read(rb->dhost, rb->dhost.base + reg);
 #endif
        case mpic_access_mmio_be:
                return in_be32(rb->base + (reg >> 2));
@@ -174,8 +173,7 @@ static inline void _mpic_write(enum mpic_reg_type type,
        switch(type) {
 #ifdef CONFIG_PPC_DCR
        case mpic_access_dcr:
-               return dcr_write(rb->dhost,
-                                rb->dbase + reg + rb->doff, value);
+               return dcr_write(rb->dhost, rb->dhost.base + reg, value);
 #endif
        case mpic_access_mmio_be:
                return out_be32(rb->base + (reg >> 2), value);
@@ -228,8 +226,13 @@ static inline u32 _mpic_irq_read(struct mpic *mpic, unsigned int src_no, unsigne
        unsigned int    isu = src_no >> mpic->isu_shift;
        unsigned int    idx = src_no & mpic->isu_mask;
 
-       return _mpic_read(mpic->reg_type, &mpic->isus[isu],
-                         reg + (idx * MPIC_INFO(IRQ_STRIDE)));
+#ifdef CONFIG_MPIC_BROKEN_REGREAD
+       if (reg == 0)
+               return mpic->isu_reg0_shadow[idx];
+       else
+#endif
+               return _mpic_read(mpic->reg_type, &mpic->isus[isu],
+                                 reg + (idx * MPIC_INFO(IRQ_STRIDE)));
 }
 
 static inline void _mpic_irq_write(struct mpic *mpic, unsigned int src_no,
@@ -240,6 +243,11 @@ static inline void _mpic_irq_write(struct mpic *mpic, unsigned int src_no,
 
        _mpic_write(mpic->reg_type, &mpic->isus[isu],
                    reg + (idx * MPIC_INFO(IRQ_STRIDE)), value);
+
+#ifdef CONFIG_MPIC_BROKEN_REGREAD
+       if (reg == 0)
+               mpic->isu_reg0_shadow[idx] = value;
+#endif
 }
 
 #define mpic_read(b,r)         _mpic_read(mpic->reg_type,&(b),(r))
@@ -269,9 +277,11 @@ static void _mpic_map_mmio(struct mpic *mpic, unsigned long phys_addr,
 static void _mpic_map_dcr(struct mpic *mpic, struct mpic_reg_bank *rb,
                          unsigned int offset, unsigned int size)
 {
-       rb->dbase = mpic->dcr_base;
-       rb->doff = offset;
-       rb->dhost = dcr_map(mpic->of_node, rb->dbase + rb->doff, size);
+       const u32 *dbasep;
+
+       dbasep = of_get_property(mpic->irqhost->of_node, "dcr-reg", NULL);
+
+       rb->dhost = dcr_map(mpic->irqhost->of_node, *dbasep + offset, size);
        BUG_ON(!DCR_MAP_OK(rb->dhost));
 }
 
@@ -758,7 +768,7 @@ static void mpic_end_ipi(unsigned int irq)
 
 #endif /* CONFIG_SMP */
 
-static void mpic_set_affinity(unsigned int irq, cpumask_t cpumask)
+void mpic_set_affinity(unsigned int irq, cpumask_t cpumask)
 {
        struct mpic *mpic = mpic_from_irq(irq);
        unsigned int src = mpic_irq_to_hw(irq);
@@ -861,10 +871,8 @@ static struct irq_chip mpic_irq_ht_chip = {
 
 static int mpic_host_match(struct irq_host *h, struct device_node *node)
 {
-       struct mpic *mpic = h->host_data;
-
        /* Exact match, unless mpic node is NULL */
-       return mpic->of_node == NULL || mpic->of_node == node;
+       return h->of_node == NULL || h->of_node == node;
 }
 
 static int mpic_host_map(struct irq_host *h, unsigned int virq,
@@ -985,10 +993,9 @@ struct mpic * __init mpic_alloc(struct device_node *node,
        
        memset(mpic, 0, sizeof(struct mpic));
        mpic->name = name;
-       mpic->of_node = of_node_get(node);
 
-       mpic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, isu_size,
-                                      &mpic_host_ops,
+       mpic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
+                                      isu_size, &mpic_host_ops,
                                       flags & MPIC_LARGE_VECTORS ? 2048 : 256);
        if (mpic->irqhost == NULL) {
                of_node_put(node);
@@ -1068,20 +1075,14 @@ struct mpic * __init mpic_alloc(struct device_node *node,
        BUG_ON(paddr == 0 && node == NULL);
 
        /* If no physical address passed in, check if it's dcr based */
-       if (paddr == 0 && of_get_property(node, "dcr-reg", NULL) != NULL)
-               mpic->flags |= MPIC_USES_DCR;
-
+       if (paddr == 0 && of_get_property(node, "dcr-reg", NULL) != NULL) {
 #ifdef CONFIG_PPC_DCR
-       if (mpic->flags & MPIC_USES_DCR) {
-               const u32 *dbasep;
-               dbasep = of_get_property(node, "dcr-reg", NULL);
-               BUG_ON(dbasep == NULL);
-               mpic->dcr_base = *dbasep;
+               mpic->flags |= MPIC_USES_DCR;
                mpic->reg_type = mpic_access_dcr;
-       }
 #else
-       BUG_ON (mpic->flags & MPIC_USES_DCR);
+               BUG();
 #endif /* CONFIG_PPC_DCR */
+       }
 
        /* If the MPIC is not DCR based, and no physical address was passed
         * in, try to obtain one
index 3a1c3d2c594d2bcfa17f7461e8d68281cc048148..1cb6bd841027d0f3a6b9d80e2fdd41778a159fdb 100644 (file)
@@ -34,5 +34,6 @@ extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
 extern void mpic_end_irq(unsigned int irq);
 extern void mpic_mask_irq(unsigned int irq);
 extern void mpic_unmask_irq(unsigned int irq);
+extern void mpic_set_affinity(unsigned int irq, cpumask_t cpumask);
 
 #endif /* _POWERPC_SYSDEV_MPIC_H */
index b076793033c2530d9e8f2513dbe4767c79c8cf5c..d272a52ecd24ace9af35e8f3758e60165fed9c49 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/irq.h>
-#include <linux/bootmem.h>
 #include <linux/bitmap.h>
 #include <linux/msi.h>
 #include <asm/mpic.h>
@@ -117,16 +116,17 @@ static int mpic_msi_reserve_dt_hwirqs(struct mpic *mpic)
        int i, len;
        const u32 *p;
 
-       p = of_get_property(mpic->of_node, "msi-available-ranges", &len);
+       p = of_get_property(mpic->irqhost->of_node,
+                           "msi-available-ranges", &len);
        if (!p) {
                pr_debug("mpic: no msi-available-ranges property found on %s\n",
-                         mpic->of_node->full_name);
+                         mpic->irqhost->of_node->full_name);
                return -ENODEV;
        }
 
        if (len % 8 != 0) {
                printk(KERN_WARNING "mpic: Malformed msi-available-ranges "
-                      "property on %s\n", mpic->of_node->full_name);
+                      "property on %s\n", mpic->irqhost->of_node->full_name);
                return -EINVAL;
        }
 
@@ -151,10 +151,7 @@ int mpic_msi_init_allocator(struct mpic *mpic)
        size = BITS_TO_LONGS(mpic->irq_count) * sizeof(long);
        pr_debug("mpic: allocator bitmap size is 0x%x bytes\n", size);
 
-       if (mem_init_done)
-               mpic->hwirq_bitmap = kmalloc(size, GFP_KERNEL);
-       else
-               mpic->hwirq_bitmap = alloc_bootmem(size);
+       mpic->hwirq_bitmap = alloc_maybe_bootmem(size, GFP_KERNEL);
 
        if (!mpic->hwirq_bitmap) {
                pr_debug("mpic: ENOMEM allocating allocator bitmap!\n");
index 305b864c25d9328ea0091080542358aba7ddea10..1d5a40899b74fac796ac814aad3d1a1c2c805a89 100644 (file)
@@ -40,6 +40,7 @@ static struct irq_chip mpic_u3msi_chip = {
        .unmask         = mpic_u3msi_unmask_irq,
        .eoi            = mpic_end_irq,
        .set_type       = mpic_set_irq_type,
+       .set_affinity   = mpic_set_affinity,
        .typename       = "MPIC-U3MSI",
 };
 
@@ -107,59 +108,46 @@ static void u3msi_teardown_msi_irqs(struct pci_dev *pdev)
        return;
 }
 
-static void u3msi_compose_msi_msg(struct pci_dev *pdev, int virq,
-                                 struct msi_msg *msg)
-{
-       u64 addr;
-
-       addr = find_ht_magic_addr(pdev);
-       msg->address_lo = addr & 0xFFFFFFFF;
-       msg->address_hi = addr >> 32;
-       msg->data = virq_to_hw(virq);
-
-       pr_debug("u3msi: allocated virq 0x%x (hw 0x%lx) at address 0x%lx\n",
-                virq, virq_to_hw(virq), addr);
-}
-
 static int u3msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
 {
        irq_hw_number_t hwirq;
-       int rc;
        unsigned int virq;
        struct msi_desc *entry;
        struct msi_msg msg;
+       u64 addr;
+
+       addr = find_ht_magic_addr(pdev);
+       msg.address_lo = addr & 0xFFFFFFFF;
+       msg.address_hi = addr >> 32;
 
        list_for_each_entry(entry, &pdev->msi_list, list) {
                hwirq = mpic_msi_alloc_hwirqs(msi_mpic, 1);
                if (hwirq < 0) {
-                       rc = hwirq;
                        pr_debug("u3msi: failed allocating hwirq\n");
-                       goto out_free;
+                       return hwirq;
                }
 
                virq = irq_create_mapping(msi_mpic->irqhost, hwirq);
                if (virq == NO_IRQ) {
                        pr_debug("u3msi: failed mapping hwirq 0x%lx\n", hwirq);
                        mpic_msi_free_hwirqs(msi_mpic, hwirq, 1);
-                       rc = -ENOSPC;
-                       goto out_free;
+                       return -ENOSPC;
                }
 
                set_irq_msi(virq, entry);
                set_irq_chip(virq, &mpic_u3msi_chip);
                set_irq_type(virq, IRQ_TYPE_EDGE_RISING);
 
-               u3msi_compose_msi_msg(pdev, virq, &msg);
+               pr_debug("u3msi: allocated virq 0x%x (hw 0x%lx) addr 0x%lx\n",
+                         virq, hwirq, addr);
+
+               msg.data = hwirq;
                write_msi_msg(virq, &msg);
 
                hwirq++;
        }
 
        return 0;
-
- out_free:
-       u3msi_teardown_msi_irqs(pdev);
-       return rc;
 }
 
 int mpic_u3msi_init(struct mpic *mpic)
index 2ff0b4ef268134d9b4948172c1ef0f84be6225f2..4f618fa465c085305d55fd6b47a75a973b4e4e05 100644 (file)
@@ -7,5 +7,6 @@ extern void __init mv64x60_init_irq(void);
 extern unsigned int mv64x60_get_irq(void);
 
 extern void __init mv64x60_pci_init(void);
+extern void __init mv64x60_init_early(void);
 
 #endif /* __MV64X60_H__ */
index 01d316287772c9f2b021da090aedec08cc0fd6a1..19e6ef26379751b6cafa9848dc6a4fdfc8ad9277 100644 (file)
@@ -202,11 +202,6 @@ static struct irq_chip mv64x60_chip_gpp = {
  * mv64x60_host_ops functions
  */
 
-static int mv64x60_host_match(struct irq_host *h, struct device_node *np)
-{
-       return mv64x60_irq_host->host_data == np;
-}
-
 static struct irq_chip *mv64x60_chips[] = {
        [MV64x60_LEVEL1_LOW]  = &mv64x60_chip_low,
        [MV64x60_LEVEL1_HIGH] = &mv64x60_chip_high,
@@ -228,7 +223,6 @@ static int mv64x60_host_map(struct irq_host *h, unsigned int virq,
 }
 
 static struct irq_host_ops mv64x60_host_ops = {
-       .match = mv64x60_host_match,
        .map   = mv64x60_host_map,
 };
 
@@ -253,14 +247,12 @@ void __init mv64x60_init_irq(void)
        np = of_find_compatible_node(NULL, NULL, "marvell,mv64x60-pic");
        reg = of_get_property(np, "reg", &size);
        paddr = of_translate_address(np, reg);
-       of_node_put(np);
        mv64x60_irq_reg_base = ioremap(paddr, reg[1]);
 
-       mv64x60_irq_host = irq_alloc_host(IRQ_HOST_MAP_LINEAR, MV64x60_NUM_IRQS,
+       mv64x60_irq_host = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR,
+                                         MV64x60_NUM_IRQS,
                                          &mv64x60_host_ops, MV64x60_NUM_IRQS);
 
-       mv64x60_irq_host->host_data = np;
-
        spin_lock_irqsave(&mv64x60_lock, flags);
        out_le32(mv64x60_gpp_reg_base + MV64x60_GPP_INTR_MASK,
                 mv64x60_cached_gpp_mask);
diff --git a/arch/powerpc/sysdev/mv64x60_udbg.c b/arch/powerpc/sysdev/mv64x60_udbg.c
new file mode 100644 (file)
index 0000000..367e7b1
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * udbg serial input/output routines for the Marvell MV64x60 (Discovery).
+ *
+ * Author: Dale Farnsworth <dale@farnsworth.org>
+ *
+ * 2007 (c) MontaVista Software, Inc.  This file is licensed under
+ * the terms of the GNU General Public License version 2.  This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+
+#include <sysdev/mv64x60.h>
+
+#define MPSC_0_CR1_OFFSET      0x000c
+
+#define MPSC_0_CR2_OFFSET      0x0010
+#define MPSC_CHR_2_TCS         (1 << 9)
+
+#define MPSC_0_CHR_10_OFFSET   0x0030
+
+#define MPSC_INTR_CAUSE_OFF_0  0x0004
+#define MPSC_INTR_CAUSE_OFF_1  0x000c
+#define MPSC_INTR_CAUSE_RCC    (1<<6)
+
+static void __iomem *mpsc_base;
+static void __iomem *mpsc_intr_cause;
+
+static void mv64x60_udbg_putc(char c)
+{
+       if (c == '\n')
+               mv64x60_udbg_putc('\r');
+
+       while(in_le32(mpsc_base + MPSC_0_CR2_OFFSET) & MPSC_CHR_2_TCS)
+               ;
+       out_le32(mpsc_base + MPSC_0_CR1_OFFSET, c);
+       out_le32(mpsc_base + MPSC_0_CR2_OFFSET, MPSC_CHR_2_TCS);
+}
+
+static int mv64x60_udbg_testc(void)
+{
+       return (in_le32(mpsc_intr_cause) & MPSC_INTR_CAUSE_RCC) != 0;
+}
+
+static int mv64x60_udbg_getc(void)
+{
+       int cause = 0;
+       int c;
+
+       while (!mv64x60_udbg_testc())
+               ;
+
+       c = in_8(mpsc_base + MPSC_0_CHR_10_OFFSET + 2);
+       out_8(mpsc_base + MPSC_0_CHR_10_OFFSET + 2, c);
+       out_le32(mpsc_intr_cause, cause & ~MPSC_INTR_CAUSE_RCC);
+       return c;
+}
+
+static int mv64x60_udbg_getc_poll(void)
+{
+       if (!mv64x60_udbg_testc())
+               return -1;
+
+       return mv64x60_udbg_getc();
+}
+
+static void mv64x60_udbg_init(void)
+{
+       struct device_node *np, *mpscintr, *stdout = NULL;
+       const char *path;
+       const phandle *ph;
+       struct resource r[2];
+       const int *block_index;
+       int intr_cause_offset;
+       int err;
+
+       path = of_get_property(of_chosen, "linux,stdout-path", NULL);
+       if (!path)
+               return;
+
+       stdout = of_find_node_by_path(path);
+       if (!stdout)
+               return;
+
+       for (np = NULL;
+            (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); )
+               if (np == stdout)
+                       break;
+
+       of_node_put(stdout);
+       if (!np)
+               return;
+
+       block_index = of_get_property(np, "block-index", NULL);
+       if (!block_index)
+               goto error;
+
+       switch (*block_index) {
+       case 0:
+               intr_cause_offset = MPSC_INTR_CAUSE_OFF_0;
+               break;
+       case 1:
+               intr_cause_offset = MPSC_INTR_CAUSE_OFF_1;
+               break;
+       default:
+               goto error;
+       }
+
+       err = of_address_to_resource(np, 0, &r[0]);
+       if (err)
+               goto error;
+
+       ph = of_get_property(np, "mpscintr", NULL);
+       mpscintr = of_find_node_by_phandle(*ph);
+       if (!mpscintr)
+               goto error;
+
+       err = of_address_to_resource(mpscintr, 0, &r[1]);
+       of_node_put(mpscintr);
+       if (err)
+               goto error;
+
+       of_node_put(np);
+
+       mpsc_base = ioremap(r[0].start, r[0].end - r[0].start + 1);
+       if (!mpsc_base)
+               return;
+
+       mpsc_intr_cause = ioremap(r[1].start, r[1].end - r[1].start + 1);
+       if (!mpsc_intr_cause) {
+               iounmap(mpsc_base);
+               return;
+       }
+       mpsc_intr_cause += intr_cause_offset;
+
+       udbg_putc = mv64x60_udbg_putc;
+       udbg_getc = mv64x60_udbg_getc;
+       udbg_getc_poll = mv64x60_udbg_getc_poll;
+
+       return;
+
+error:
+       of_node_put(np);
+}
+
+void mv64x60_init_early(void)
+{
+       mv64x60_udbg_init();
+}
index 2f91b55b775475a8c839299801b390b670c4e183..20edd1e94eff7111927fef861236f8827e002b4d 100644 (file)
@@ -205,10 +205,12 @@ static int pmi_of_remove(struct of_device *dev)
 }
 
 static struct of_platform_driver pmi_of_platform_driver = {
-       .name           = "pmi",
        .match_table    = pmi_match,
        .probe          = pmi_of_probe,
-       .remove         = pmi_of_remove
+       .remove         = pmi_of_remove,
+       .driver         = {
+               .name   = "pmi",
+       },
 };
 
 static int __init pmi_module_init(void)
index 90f87408b5d591de37347a2006432b4ba8a6d012..3d57d3835b04e1fc2167893ed773fa8be4dcc83c 100644 (file)
@@ -141,7 +141,7 @@ EXPORT_SYMBOL(qe_issue_cmd);
  * 16 BRGs, which can be connected to the QE channels or output
  * as clocks. The BRGs are in two different block of internal
  * memory mapped space.
- * The baud rate clock is the system clock divided by something.
+ * The BRG clock is the QE clock divided by 2.
  * It was set up long ago during the initial boot phase and is
  * is given to us.
  * Baud rate clocks are zero-based in the driver code (as that maps
@@ -165,28 +165,38 @@ unsigned int get_brg_clk(void)
        return brg_clk;
 }
 
-/* This function is used by UARTS, or anything else that uses a 16x
- * oversampled clock.
+/* Program the BRG to the given sampling rate and multiplier
+ *
+ * @brg: the BRG, 1-16
+ * @rate: the desired sampling rate
+ * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
+ * GUMR_L[TDCR].  E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
+ * then 'multiplier' should be 8.
+ *
+ * Also note that the value programmed into the BRGC register must be even.
  */
-void qe_setbrg(u32 brg, u32 rate)
+void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier)
 {
-       volatile u32 *bp;
        u32 divisor, tempval;
-       int div16 = 0;
+       u32 div16 = 0;
 
-       bp = &qe_immr->brg.brgc[brg];
+       divisor = get_brg_clk() / (rate * multiplier);
 
-       divisor = (get_brg_clk() / rate);
        if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
-               div16 = 1;
+               div16 = QE_BRGC_DIV16;
                divisor /= 16;
        }
 
-       tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) | QE_BRGC_ENABLE;
-       if (div16)
-               tempval |= QE_BRGC_DIV16;
+       /* Errata QE_General4, which affects some MPC832x and MPC836x SOCs, says
+          that the BRG divisor must be even if you're not using divide-by-16
+          mode. */
+       if (!div16 && (divisor & 1))
+               divisor++;
+
+       tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
+               QE_BRGC_ENABLE | div16;
 
-       out_be32(bp, tempval);
+       out_be32(&qe_immr->brg.brgc[brg - 1], tempval);
 }
 
 /* Initialize SNUMs (thread serial numbers) according to
index 4d1dcb45963d8c8605ef718c4aa6dfb798f45d6f..e1c0fd6dbc1aaf23400cc385d946602de5831d2d 100644 (file)
@@ -245,10 +245,8 @@ static struct irq_chip qe_ic_irq_chip = {
 
 static int qe_ic_host_match(struct irq_host *h, struct device_node *node)
 {
-       struct qe_ic *qe_ic = h->host_data;
-
        /* Exact match, unless qe_ic node is NULL */
-       return qe_ic->of_node == NULL || qe_ic->of_node == node;
+       return h->of_node == NULL || h->of_node == node;
 }
 
 static int qe_ic_host_map(struct irq_host *h, unsigned int virq,
@@ -323,25 +321,9 @@ unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
        return irq_linear_revmap(qe_ic->irqhost, irq);
 }
 
-void qe_ic_cascade_low(unsigned int irq, struct irq_desc *desc)
-{
-       struct qe_ic *qe_ic = desc->handler_data;
-       unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
-
-       if (cascade_irq != NO_IRQ)
-               generic_handle_irq(cascade_irq);
-}
-
-void qe_ic_cascade_high(unsigned int irq, struct irq_desc *desc)
-{
-       struct qe_ic *qe_ic = desc->handler_data;
-       unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
-
-       if (cascade_irq != NO_IRQ)
-               generic_handle_irq(cascade_irq);
-}
-
-void __init qe_ic_init(struct device_node *node, unsigned int flags)
+void __init qe_ic_init(struct device_node *node, unsigned int flags,
+               void (*low_handler)(unsigned int irq, struct irq_desc *desc),
+               void (*high_handler)(unsigned int irq, struct irq_desc *desc))
 {
        struct qe_ic *qe_ic;
        struct resource res;
@@ -352,9 +334,8 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags)
                return;
 
        memset(qe_ic, 0, sizeof(struct qe_ic));
-       qe_ic->of_node = of_node_get(node);
 
-       qe_ic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR,
+       qe_ic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
                                        NR_QE_IC_INTS, &qe_ic_host_ops, 0);
        if (qe_ic->irqhost == NULL) {
                of_node_put(node);
@@ -402,14 +383,13 @@ void __init qe_ic_init(struct device_node *node, unsigned int flags)
        qe_ic_write(qe_ic->regs, QEIC_CICR, temp);
 
        set_irq_data(qe_ic->virq_low, qe_ic);
-       set_irq_chained_handler(qe_ic->virq_low, qe_ic_cascade_low);
+       set_irq_chained_handler(qe_ic->virq_low, low_handler);
 
-       if (qe_ic->virq_high != NO_IRQ) {
+       if (qe_ic->virq_high != NO_IRQ &&
+                       qe_ic->virq_high != qe_ic->virq_low) {
                set_irq_data(qe_ic->virq_high, qe_ic);
-               set_irq_chained_handler(qe_ic->virq_high, qe_ic_cascade_high);
+               set_irq_chained_handler(qe_ic->virq_high, high_handler);
        }
-
-       printk("QEIC (%d IRQ sources) at %p\n", NR_QE_IC_INTS, qe_ic->regs);
 }
 
 void qe_ic_set_highest_priority(unsigned int virq, int high)
index 9a631adb189d8edf61da6fc3074efab5cb6ff020..c1361d005a8a124d40d2cb17263473b1b189bf96 100644 (file)
@@ -84,9 +84,6 @@ struct qe_ic {
        /* The "linux" controller struct */
        struct irq_chip hc_irq;
 
-       /* The device node of the interrupt controller */
-       struct device_node *of_node;
-
        /* VIRQ numbers of QE high/low irqs */
        unsigned int virq_high;
        unsigned int virq_low;
index e32b45bf9ff5364df15accd01b510f0f2721f5a7..e53ea4d374a03f52f57c6e9c5e036275fb207c0b 100644 (file)
@@ -36,6 +36,9 @@ struct port_regs {
        __be32  cpdir2;         /* Direction register */
        __be32  cppar1;         /* Pin assignment register */
        __be32  cppar2;         /* Pin assignment register */
+#ifdef CONFIG_PPC_85xx
+       u8      pad[8];
+#endif
 };
 
 static struct port_regs *par_io = NULL;
@@ -195,29 +198,22 @@ EXPORT_SYMBOL(par_io_of_config);
 #ifdef DEBUG
 static void dump_par_io(void)
 {
-       int i;
+       unsigned int i;
 
-       printk(KERN_INFO "PAR IO registars:\n");
-       printk(KERN_INFO "Base address: 0x%08x\n", (u32) par_io);
+       printk(KERN_INFO "%s: par_io=%p\n", __FUNCTION__, par_io);
        for (i = 0; i < num_par_io_ports; i++) {
-               printk(KERN_INFO "cpodr[%d] : addr - 0x%08x, val - 0x%08x\n",
-                      i, (u32) & par_io[i].cpodr,
-                      in_be32(&par_io[i].cpodr));
-               printk(KERN_INFO "cpdata[%d]: addr - 0x%08x, val - 0x%08x\n",
-                      i, (u32) & par_io[i].cpdata,
-                      in_be32(&par_io[i].cpdata));
-               printk(KERN_INFO "cpdir1[%d]: addr - 0x%08x, val - 0x%08x\n",
-                      i, (u32) & par_io[i].cpdir1,
-                      in_be32(&par_io[i].cpdir1));
-               printk(KERN_INFO "cpdir2[%d]: addr - 0x%08x, val - 0x%08x\n",
-                      i, (u32) & par_io[i].cpdir2,
-                      in_be32(&par_io[i].cpdir2));
-               printk(KERN_INFO "cppar1[%d]: addr - 0x%08x, val - 0x%08x\n",
-                      i, (u32) & par_io[i].cppar1,
-                      in_be32(&par_io[i].cppar1));
-               printk(KERN_INFO "cppar2[%d]: addr - 0x%08x, val - 0x%08x\n",
-                      i, (u32) & par_io[i].cppar2,
-                      in_be32(&par_io[i].cppar2));
+               printk(KERN_INFO "      cpodr[%u]=%08x\n", i,
+                       in_be32(&par_io[i].cpodr));
+               printk(KERN_INFO "      cpdata[%u]=%08x\n", i,
+                       in_be32(&par_io[i].cpdata));
+               printk(KERN_INFO "      cpdir1[%u]=%08x\n", i,
+                       in_be32(&par_io[i].cpdir1));
+               printk(KERN_INFO "      cpdir2[%u]=%08x\n", i,
+                       in_be32(&par_io[i].cpdir2));
+               printk(KERN_INFO "      cppar1[%u]=%08x\n", i,
+                       in_be32(&par_io[i].cppar1));
+               printk(KERN_INFO "      cppar2[%u]=%08x\n", i,
+                       in_be32(&par_io[i].cppar2));
        }
 
 }
index f970e5415ac00aaa13f1b9f551c9efa53f633e4e..0e348d9af8a67ba2bec9e36da49fc2c2bfb44e58 100644 (file)
 
 static DEFINE_SPINLOCK(ucc_lock);
 
-int ucc_set_qe_mux_mii_mng(int ucc_num)
+int ucc_set_qe_mux_mii_mng(unsigned int ucc_num)
 {
        unsigned long flags;
 
+       if (ucc_num > UCC_MAX_NUM - 1)
+               return -EINVAL;
+
        spin_lock_irqsave(&ucc_lock, flags);
-       out_be32(&qe_immr->qmx.cmxgcr,
-                ((in_be32(&qe_immr->qmx.cmxgcr) &
-                  ~QE_CMXGCR_MII_ENET_MNG) |
-                 (ucc_num << QE_CMXGCR_MII_ENET_MNG_SHIFT)));
+       clrsetbits_be32(&qe_immr->qmx.cmxgcr, QE_CMXGCR_MII_ENET_MNG,
+               ucc_num << QE_CMXGCR_MII_ENET_MNG_SHIFT);
        spin_unlock_irqrestore(&ucc_lock, flags);
 
        return 0;
 }
 EXPORT_SYMBOL(ucc_set_qe_mux_mii_mng);
 
-int ucc_set_type(int ucc_num, struct ucc_common *regs,
-                enum ucc_speed_type speed)
-{
-       u8 guemr = 0;
-
-       /* check if the UCC number is in range. */
-       if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0))
-               return -EINVAL;
-
-       guemr = regs->guemr;
-       guemr &= ~(UCC_GUEMR_MODE_MASK_RX | UCC_GUEMR_MODE_MASK_TX);
-       switch (speed) {
-       case UCC_SPEED_TYPE_SLOW:
-               guemr |= (UCC_GUEMR_MODE_SLOW_RX | UCC_GUEMR_MODE_SLOW_TX);
-               break;
-       case UCC_SPEED_TYPE_FAST:
-               guemr |= (UCC_GUEMR_MODE_FAST_RX | UCC_GUEMR_MODE_FAST_TX);
-               break;
-       default:
-               return -EINVAL;
-       }
-       regs->guemr = guemr;
-
-       return 0;
-}
-
-int ucc_init_guemr(struct ucc_common *regs)
+/* Configure the UCC to either Slow or Fast.
+ *
+ * A given UCC can be figured to support either "slow" devices (e.g. UART)
+ * or "fast" devices (e.g. Ethernet).
+ *
+ * 'ucc_num' is the UCC number, from 0 - 7.
+ *
+ * This function also sets the UCC_GUEMR_SET_RESERVED3 bit because that bit
+ * must always be set to 1.
+ */
+int ucc_set_type(unsigned int ucc_num, enum ucc_speed_type speed)
 {
-       u8 guemr = 0;
-
-       if (!regs)
-               return -EINVAL;
-
-       /* Set bit 3 (which is reserved in the GUEMR register) to 1 */
-       guemr = UCC_GUEMR_SET_RESERVED3;
-
-       regs->guemr = guemr;
-
-       return 0;
-}
+       u8 __iomem *guemr;
 
-static void get_cmxucr_reg(int ucc_num, volatile u32 ** p_cmxucr, u8 * reg_num,
-                          u8 * shift)
-{
+       /* The GUEMR register is at the same location for both slow and fast
+          devices, so we just use uccX.slow.guemr. */
        switch (ucc_num) {
-       case 0: *p_cmxucr = &(qe_immr->qmx.cmxucr1);
-               *reg_num = 1;
-               *shift = 16;
+       case 0: guemr = &qe_immr->ucc1.slow.guemr;
                break;
-       case 2: *p_cmxucr = &(qe_immr->qmx.cmxucr1);
-               *reg_num = 1;
-               *shift = 0;
+       case 1: guemr = &qe_immr->ucc2.slow.guemr;
                break;
-       case 4: *p_cmxucr = &(qe_immr->qmx.cmxucr2);
-               *reg_num = 2;
-               *shift = 16;
+       case 2: guemr = &qe_immr->ucc3.slow.guemr;
                break;
-       case 6: *p_cmxucr = &(qe_immr->qmx.cmxucr2);
-               *reg_num = 2;
-               *shift = 0;
+       case 3: guemr = &qe_immr->ucc4.slow.guemr;
                break;
-       case 1: *p_cmxucr = &(qe_immr->qmx.cmxucr3);
-               *reg_num = 3;
-               *shift = 16;
+       case 4: guemr = &qe_immr->ucc5.slow.guemr;
                break;
-       case 3: *p_cmxucr = &(qe_immr->qmx.cmxucr3);
-               *reg_num = 3;
-               *shift = 0;
+       case 5: guemr = &qe_immr->ucc6.slow.guemr;
                break;
-       case 5: *p_cmxucr = &(qe_immr->qmx.cmxucr4);
-               *reg_num = 4;
-               *shift = 16;
+       case 6: guemr = &qe_immr->ucc7.slow.guemr;
                break;
-       case 7: *p_cmxucr = &(qe_immr->qmx.cmxucr4);
-               *reg_num = 4;
-               *shift = 0;
+       case 7: guemr = &qe_immr->ucc8.slow.guemr;
                break;
        default:
-               break;
+               return -EINVAL;
        }
+
+       clrsetbits_8(guemr, UCC_GUEMR_MODE_MASK,
+               UCC_GUEMR_SET_RESERVED3 | speed);
+
+       return 0;
+}
+
+static void get_cmxucr_reg(unsigned int ucc_num, __be32 **cmxucr,
+       unsigned int *reg_num, unsigned int *shift)
+{
+       unsigned int cmx = ((ucc_num & 1) << 1) + (ucc_num > 3);
+
+       *reg_num = cmx + 1;
+       *cmxucr = &qe_immr->qmx.cmxucr[cmx];
+       *shift = 16 - 8 * (ucc_num & 2);
 }
 
-int ucc_mux_set_grant_tsa_bkpt(int ucc_num, int set, u32 mask)
+int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask)
 {
-       volatile u32 *p_cmxucr;
-       u8 reg_num;
-       u8 shift;
+       __be32 *cmxucr;
+       unsigned int reg_num;
+       unsigned int shift;
 
        /* check if the UCC number is in range. */
-       if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0))
+       if (ucc_num > UCC_MAX_NUM - 1)
                return -EINVAL;
 
-       get_cmxucr_reg(ucc_num, &p_cmxucr, &reg_num, &shift);
+       get_cmxucr_reg(ucc_num, &cmxucr, &reg_num, &shift);
 
        if (set)
-               out_be32(p_cmxucr, in_be32(p_cmxucr) | (mask << shift));
+               setbits32(cmxucr, mask << shift);
        else
-               out_be32(p_cmxucr, in_be32(p_cmxucr) & ~(mask << shift));
+               clrbits32(cmxucr, mask << shift);
 
        return 0;
 }
 
-int ucc_set_qe_mux_rxtx(int ucc_num, enum qe_clock clock, enum comm_dir mode)
+int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock,
+       enum comm_dir mode)
 {
-       volatile u32 *p_cmxucr;
-       u8 reg_num;
-       u8 shift;
-       u32 clock_bits;
-       u32 clock_mask;
-       int source = -1;
+       __be32 *cmxucr;
+       unsigned int reg_num;
+       unsigned int shift;
+       u32 clock_bits = 0;
 
        /* check if the UCC number is in range. */
-       if ((ucc_num > UCC_MAX_NUM - 1) || (ucc_num < 0))
+       if (ucc_num > UCC_MAX_NUM - 1)
                return -EINVAL;
 
-       if (!((mode == COMM_DIR_RX) || (mode == COMM_DIR_TX))) {
-               printk(KERN_ERR
-                      "ucc_set_qe_mux_rxtx: bad comm mode type passed.");
+       /* The communications direction must be RX or TX */
+       if (!((mode == COMM_DIR_RX) || (mode == COMM_DIR_TX)))
                return -EINVAL;
-       }
 
-       get_cmxucr_reg(ucc_num, &p_cmxucr, &reg_num, &shift);
+       get_cmxucr_reg(ucc_num, &cmxucr, &reg_num, &shift);
 
        switch (reg_num) {
        case 1:
                switch (clock) {
-               case QE_BRG1:   source = 1; break;
-               case QE_BRG2:   source = 2; break;
-               case QE_BRG7:   source = 3; break;
-               case QE_BRG8:   source = 4; break;
-               case QE_CLK9:   source = 5; break;
-               case QE_CLK10:  source = 6; break;
-               case QE_CLK11:  source = 7; break;
-               case QE_CLK12:  source = 8; break;
-               case QE_CLK15:  source = 9; break;
-               case QE_CLK16:  source = 10; break;
-               default:        source = -1; break;
+               case QE_BRG1:   clock_bits = 1; break;
+               case QE_BRG2:   clock_bits = 2; break;
+               case QE_BRG7:   clock_bits = 3; break;
+               case QE_BRG8:   clock_bits = 4; break;
+               case QE_CLK9:   clock_bits = 5; break;
+               case QE_CLK10:  clock_bits = 6; break;
+               case QE_CLK11:  clock_bits = 7; break;
+               case QE_CLK12:  clock_bits = 8; break;
+               case QE_CLK15:  clock_bits = 9; break;
+               case QE_CLK16:  clock_bits = 10; break;
+               default: break;
                }
                break;
        case 2:
                switch (clock) {
-               case QE_BRG5:   source = 1; break;
-               case QE_BRG6:   source = 2; break;
-               case QE_BRG7:   source = 3; break;
-               case QE_BRG8:   source = 4; break;
-               case QE_CLK13:  source = 5; break;
-               case QE_CLK14:  source = 6; break;
-               case QE_CLK19:  source = 7; break;
-               case QE_CLK20:  source = 8; break;
-               case QE_CLK15:  source = 9; break;
-               case QE_CLK16:  source = 10; break;
-               default:        source = -1; break;
+               case QE_BRG5:   clock_bits = 1; break;
+               case QE_BRG6:   clock_bits = 2; break;
+               case QE_BRG7:   clock_bits = 3; break;
+               case QE_BRG8:   clock_bits = 4; break;
+               case QE_CLK13:  clock_bits = 5; break;
+               case QE_CLK14:  clock_bits = 6; break;
+               case QE_CLK19:  clock_bits = 7; break;
+               case QE_CLK20:  clock_bits = 8; break;
+               case QE_CLK15:  clock_bits = 9; break;
+               case QE_CLK16:  clock_bits = 10; break;
+               default: break;
                }
                break;
        case 3:
                switch (clock) {
-               case QE_BRG9:   source = 1; break;
-               case QE_BRG10:  source = 2; break;
-               case QE_BRG15:  source = 3; break;
-               case QE_BRG16:  source = 4; break;
-               case QE_CLK3:   source = 5; break;
-               case QE_CLK4:   source = 6; break;
-               case QE_CLK17:  source = 7; break;
-               case QE_CLK18:  source = 8; break;
-               case QE_CLK7:   source = 9; break;
-               case QE_CLK8:   source = 10; break;
-               case QE_CLK16:  source = 11; break;
-               default:        source = -1; break;
+               case QE_BRG9:   clock_bits = 1; break;
+               case QE_BRG10:  clock_bits = 2; break;
+               case QE_BRG15:  clock_bits = 3; break;
+               case QE_BRG16:  clock_bits = 4; break;
+               case QE_CLK3:   clock_bits = 5; break;
+               case QE_CLK4:   clock_bits = 6; break;
+               case QE_CLK17:  clock_bits = 7; break;
+               case QE_CLK18:  clock_bits = 8; break;
+               case QE_CLK7:   clock_bits = 9; break;
+               case QE_CLK8:   clock_bits = 10; break;
+               case QE_CLK16:  clock_bits = 11; break;
+               default: break;
                }
                break;
        case 4:
                switch (clock) {
-               case QE_BRG13:  source = 1; break;
-               case QE_BRG14:  source = 2; break;
-               case QE_BRG15:  source = 3; break;
-               case QE_BRG16:  source = 4; break;
-               case QE_CLK5:   source = 5; break;
-               case QE_CLK6:   source = 6; break;
-               case QE_CLK21:  source = 7; break;
-               case QE_CLK22:  source = 8; break;
-               case QE_CLK7:   source = 9; break;
-               case QE_CLK8:   source = 10; break;
-               case QE_CLK16:  source = 11; break;
-               default:        source = -1; break;
+               case QE_BRG13:  clock_bits = 1; break;
+               case QE_BRG14:  clock_bits = 2; break;
+               case QE_BRG15:  clock_bits = 3; break;
+               case QE_BRG16:  clock_bits = 4; break;
+               case QE_CLK5:   clock_bits = 5; break;
+               case QE_CLK6:   clock_bits = 6; break;
+               case QE_CLK21:  clock_bits = 7; break;
+               case QE_CLK22:  clock_bits = 8; break;
+               case QE_CLK7:   clock_bits = 9; break;
+               case QE_CLK8:   clock_bits = 10; break;
+               case QE_CLK16:  clock_bits = 11; break;
+               default: break;
                }
                break;
-       default:
-               source = -1;
-               break;
+       default: break;
        }
 
-       if (source == -1) {
-               printk(KERN_ERR
-                    "ucc_set_qe_mux_rxtx: Bad combination of clock and UCC.");
+       /* Check for invalid combination of clock and UCC number */
+       if (!clock_bits)
                return -ENOENT;
-       }
 
-       clock_bits = (u32) source;
-       clock_mask = QE_CMXUCR_TX_CLK_SRC_MASK;
-       if (mode == COMM_DIR_RX) {
-               clock_bits <<= 4;  /* Rx field is 4 bits to left of Tx field */
-               clock_mask <<= 4;  /* Rx field is 4 bits to left of Tx field */
-       }
-       clock_bits <<= shift;
-       clock_mask <<= shift;
+       if (mode == COMM_DIR_RX)
+               shift += 4;
 
-       out_be32(p_cmxucr, (in_be32(p_cmxucr) & ~clock_mask) | clock_bits);
+       clrsetbits_be32(cmxucr, QE_CMXUCR_TX_CLK_SRC_MASK << shift,
+               clock_bits << shift);
 
        return 0;
 }
index 3df202e8d33253a4b17744ac58daea10662d8afa..3223acbc39e55af7199cb10148914d164acc8d6a 100644 (file)
 
 void ucc_fast_dump_regs(struct ucc_fast_private * uccf)
 {
-       printk(KERN_INFO "UCC%d Fast registers:", uccf->uf_info->ucc_num);
-       printk(KERN_INFO "Base address: 0x%08x", (u32) uccf->uf_regs);
-
-       printk(KERN_INFO "gumr  : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->gumr, in_be32(&uccf->uf_regs->gumr));
-       printk(KERN_INFO "upsmr : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->upsmr, in_be32(&uccf->uf_regs->upsmr));
-       printk(KERN_INFO "utodr : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->utodr, in_be16(&uccf->uf_regs->utodr));
-       printk(KERN_INFO "udsr  : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->udsr, in_be16(&uccf->uf_regs->udsr));
-       printk(KERN_INFO "ucce  : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->ucce, in_be32(&uccf->uf_regs->ucce));
-       printk(KERN_INFO "uccm  : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->uccm, in_be32(&uccf->uf_regs->uccm));
-       printk(KERN_INFO "uccs  : addr - 0x%08x, val - 0x%02x",
-                 (u32) & uccf->uf_regs->uccs, uccf->uf_regs->uccs);
-       printk(KERN_INFO "urfb  : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->urfb, in_be32(&uccf->uf_regs->urfb));
-       printk(KERN_INFO "urfs  : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->urfs, in_be16(&uccf->uf_regs->urfs));
-       printk(KERN_INFO "urfet : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->urfet, in_be16(&uccf->uf_regs->urfet));
-       printk(KERN_INFO "urfset: addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->urfset,
-                 in_be16(&uccf->uf_regs->urfset));
-       printk(KERN_INFO "utfb  : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->utfb, in_be32(&uccf->uf_regs->utfb));
-       printk(KERN_INFO "utfs  : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->utfs, in_be16(&uccf->uf_regs->utfs));
-       printk(KERN_INFO "utfet : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->utfet, in_be16(&uccf->uf_regs->utfet));
-       printk(KERN_INFO "utftt : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->utftt, in_be16(&uccf->uf_regs->utftt));
-       printk(KERN_INFO "utpt  : addr - 0x%08x, val - 0x%04x",
-                 (u32) & uccf->uf_regs->utpt, in_be16(&uccf->uf_regs->utpt));
-       printk(KERN_INFO "urtry : addr - 0x%08x, val - 0x%08x",
-                 (u32) & uccf->uf_regs->urtry, in_be32(&uccf->uf_regs->urtry));
-       printk(KERN_INFO "guemr : addr - 0x%08x, val - 0x%02x",
-                 (u32) & uccf->uf_regs->guemr, uccf->uf_regs->guemr);
+       printk(KERN_INFO "UCC%u Fast registers:\n", uccf->uf_info->ucc_num);
+       printk(KERN_INFO "Base address: 0x%p\n", uccf->uf_regs);
+
+       printk(KERN_INFO "gumr  : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->gumr, in_be32(&uccf->uf_regs->gumr));
+       printk(KERN_INFO "upsmr : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->upsmr, in_be32(&uccf->uf_regs->upsmr));
+       printk(KERN_INFO "utodr : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->utodr, in_be16(&uccf->uf_regs->utodr));
+       printk(KERN_INFO "udsr  : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->udsr, in_be16(&uccf->uf_regs->udsr));
+       printk(KERN_INFO "ucce  : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->ucce, in_be32(&uccf->uf_regs->ucce));
+       printk(KERN_INFO "uccm  : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->uccm, in_be32(&uccf->uf_regs->uccm));
+       printk(KERN_INFO "uccs  : addr=0x%p, val=0x%02x\n",
+                 &uccf->uf_regs->uccs, uccf->uf_regs->uccs);
+       printk(KERN_INFO "urfb  : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->urfb, in_be32(&uccf->uf_regs->urfb));
+       printk(KERN_INFO "urfs  : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->urfs, in_be16(&uccf->uf_regs->urfs));
+       printk(KERN_INFO "urfet : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->urfet, in_be16(&uccf->uf_regs->urfet));
+       printk(KERN_INFO "urfset: addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->urfset, in_be16(&uccf->uf_regs->urfset));
+       printk(KERN_INFO "utfb  : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->utfb, in_be32(&uccf->uf_regs->utfb));
+       printk(KERN_INFO "utfs  : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->utfs, in_be16(&uccf->uf_regs->utfs));
+       printk(KERN_INFO "utfet : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->utfet, in_be16(&uccf->uf_regs->utfet));
+       printk(KERN_INFO "utftt : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->utftt, in_be16(&uccf->uf_regs->utftt));
+       printk(KERN_INFO "utpt  : addr=0x%p, val=0x%04x\n",
+                 &uccf->uf_regs->utpt, in_be16(&uccf->uf_regs->utpt));
+       printk(KERN_INFO "urtry : addr=0x%p, val=0x%08x\n",
+                 &uccf->uf_regs->urtry, in_be32(&uccf->uf_regs->urtry));
+       printk(KERN_INFO "guemr : addr=0x%p, val=0x%02x\n",
+                 &uccf->uf_regs->guemr, uccf->uf_regs->guemr);
 }
 EXPORT_SYMBOL(ucc_fast_dump_regs);
 
@@ -149,55 +148,57 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
 
        /* check if the UCC port number is in range. */
        if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) {
-               printk(KERN_ERR "%s: illegal UCC number", __FUNCTION__);
+               printk(KERN_ERR "%s: illegal UCC number\n", __FUNCTION__);
                return -EINVAL;
        }
 
        /* Check that 'max_rx_buf_length' is properly aligned (4). */
        if (uf_info->max_rx_buf_length & (UCC_FAST_MRBLR_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: max_rx_buf_length not aligned", __FUNCTION__);
+               printk(KERN_ERR "%s: max_rx_buf_length not aligned\n",
+                       __FUNCTION__);
                return -EINVAL;
        }
 
        /* Validate Virtual Fifo register values */
        if (uf_info->urfs < UCC_FAST_URFS_MIN_VAL) {
-               printk(KERN_ERR "%s: urfs is too small", __FUNCTION__);
+               printk(KERN_ERR "%s: urfs is too small\n", __FUNCTION__);
                return -EINVAL;
        }
 
        if (uf_info->urfs & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: urfs is not aligned", __FUNCTION__);
+               printk(KERN_ERR "%s: urfs is not aligned\n", __FUNCTION__);
                return -EINVAL;
        }
 
        if (uf_info->urfet & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: urfet is not aligned.", __FUNCTION__);
+               printk(KERN_ERR "%s: urfet is not aligned.\n", __FUNCTION__);
                return -EINVAL;
        }
 
        if (uf_info->urfset & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: urfset is not aligned", __FUNCTION__);
+               printk(KERN_ERR "%s: urfset is not aligned\n", __FUNCTION__);
                return -EINVAL;
        }
 
        if (uf_info->utfs & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: utfs is not aligned", __FUNCTION__);
+               printk(KERN_ERR "%s: utfs is not aligned\n", __FUNCTION__);
                return -EINVAL;
        }
 
        if (uf_info->utfet & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: utfet is not aligned", __FUNCTION__);
+               printk(KERN_ERR "%s: utfet is not aligned\n", __FUNCTION__);
                return -EINVAL;
        }
 
        if (uf_info->utftt & (UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT - 1)) {
-               printk(KERN_ERR "%s: utftt is not aligned", __FUNCTION__);
+               printk(KERN_ERR "%s: utftt is not aligned\n", __FUNCTION__);
                return -EINVAL;
        }
 
        uccf = kzalloc(sizeof(struct ucc_fast_private), GFP_KERNEL);
        if (!uccf) {
-               printk(KERN_ERR "%s: Cannot allocate private data", __FUNCTION__);
+               printk(KERN_ERR "%s: Cannot allocate private data\n",
+                       __FUNCTION__);
                return -ENOMEM;
        }
 
@@ -206,7 +207,7 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
        /* Set the PHY base address */
        uccf->uf_regs = ioremap(uf_info->regs, sizeof(struct ucc_fast));
        if (uccf->uf_regs == NULL) {
-               printk(KERN_ERR "%s: Cannot map UCC registers", __FUNCTION__);
+               printk(KERN_ERR "%s: Cannot map UCC registers\n", __FUNCTION__);
                return -ENOMEM;
        }
 
@@ -226,18 +227,10 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
        uccf->rx_discarded = 0;
 #endif                         /* STATISTICS */
 
-       /* Init Guemr register */
-       if ((ret = ucc_init_guemr((struct ucc_common *) (uf_regs)))) {
-               printk(KERN_ERR "%s: cannot init GUEMR", __FUNCTION__);
-               ucc_fast_free(uccf);
-               return ret;
-       }
-
        /* Set UCC to fast type */
-       if ((ret = ucc_set_type(uf_info->ucc_num,
-                               (struct ucc_common *) (uf_regs),
-                               UCC_SPEED_TYPE_FAST))) {
-               printk(KERN_ERR "%s: cannot set UCC type", __FUNCTION__);
+       ret = ucc_set_type(uf_info->ucc_num, UCC_SPEED_TYPE_FAST);
+       if (ret) {
+               printk(KERN_ERR "%s: cannot set UCC type\n", __FUNCTION__);
                ucc_fast_free(uccf);
                return ret;
        }
@@ -276,7 +269,8 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
        uccf->ucc_fast_tx_virtual_fifo_base_offset =
            qe_muram_alloc(uf_info->utfs, UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
        if (IS_ERR_VALUE(uccf->ucc_fast_tx_virtual_fifo_base_offset)) {
-               printk(KERN_ERR "%s: cannot allocate MURAM for TX FIFO", __FUNCTION__);
+               printk(KERN_ERR "%s: cannot allocate MURAM for TX FIFO\n",
+                       __FUNCTION__);
                uccf->ucc_fast_tx_virtual_fifo_base_offset = 0;
                ucc_fast_free(uccf);
                return -ENOMEM;
@@ -288,7 +282,8 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
                           UCC_FAST_RECEIVE_VIRTUAL_FIFO_SIZE_FUDGE_FACTOR,
                           UCC_FAST_VIRT_FIFO_REGS_ALIGNMENT);
        if (IS_ERR_VALUE(uccf->ucc_fast_rx_virtual_fifo_base_offset)) {
-               printk(KERN_ERR "%s: cannot allocate MURAM for RX FIFO", __FUNCTION__);
+               printk(KERN_ERR "%s: cannot allocate MURAM for RX FIFO\n",
+                       __FUNCTION__);
                uccf->ucc_fast_rx_virtual_fifo_base_offset = 0;
                ucc_fast_free(uccf);
                return -ENOMEM;
@@ -318,7 +313,7 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
                if ((uf_info->rx_clock != QE_CLK_NONE) &&
                    ucc_set_qe_mux_rxtx(uf_info->ucc_num, uf_info->rx_clock,
                                        COMM_DIR_RX)) {
-                       printk(KERN_ERR "%s: illegal value for RX clock",
+                       printk(KERN_ERR "%s: illegal value for RX clock\n",
                               __FUNCTION__);
                        ucc_fast_free(uccf);
                        return -EINVAL;
@@ -327,7 +322,7 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc
                if ((uf_info->tx_clock != QE_CLK_NONE) &&
                    ucc_set_qe_mux_rxtx(uf_info->ucc_num, uf_info->tx_clock,
                                        COMM_DIR_TX)) {
-                       printk(KERN_ERR "%s: illegal value for TX clock",
+                       printk(KERN_ERR "%s: illegal value for TX clock\n",
                               __FUNCTION__);
                        ucc_fast_free(uccf);
                        return -EINVAL;
index 1f65c26ce63f8fff07ecd4ff040f0d8eadb8c0e9..0174b3aeef8f36618f48ea22bbd346db1d250b0c 100644 (file)
@@ -115,11 +115,15 @@ void ucc_slow_disable(struct ucc_slow_private * uccs, enum comm_dir mode)
        out_be32(&us_regs->gumr_l, gumr_l);
 }
 
+/* Initialize the UCC for Slow operations
+ *
+ * The caller should initialize the following us_info
+ */
 int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** uccs_ret)
 {
        struct ucc_slow_private *uccs;
        u32 i;
-       struct ucc_slow *us_regs;
+       struct ucc_slow __iomem *us_regs;
        u32 gumr;
        struct qe_bd *bd;
        u32 id;
@@ -131,7 +135,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
 
        /* check if the UCC port number is in range. */
        if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) {
-               printk(KERN_ERR "%s: illegal UCC number", __FUNCTION__);
+               printk(KERN_ERR "%s: illegal UCC number\n", __FUNCTION__);
                return -EINVAL;
        }
 
@@ -143,13 +147,14 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
         */
        if ((!us_info->rfw) &&
                (us_info->max_rx_buf_length & (UCC_SLOW_MRBLR_ALIGNMENT - 1))) {
-               printk(KERN_ERR "max_rx_buf_length not aligned.");
+               printk(KERN_ERR "max_rx_buf_length not aligned.\n");
                return -EINVAL;
        }
 
        uccs = kzalloc(sizeof(struct ucc_slow_private), GFP_KERNEL);
        if (!uccs) {
-               printk(KERN_ERR "%s: Cannot allocate private data", __FUNCTION__);
+               printk(KERN_ERR "%s: Cannot allocate private data\n",
+                       __FUNCTION__);
                return -ENOMEM;
        }
 
@@ -158,7 +163,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
        /* Set the PHY base address */
        uccs->us_regs = ioremap(us_info->regs, sizeof(struct ucc_slow));
        if (uccs->us_regs == NULL) {
-               printk(KERN_ERR "%s: Cannot map UCC registers", __FUNCTION__);
+               printk(KERN_ERR "%s: Cannot map UCC registers\n", __FUNCTION__);
                return -ENOMEM;
        }
 
@@ -182,22 +187,14 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
                return -ENOMEM;
        }
        id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
-       qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, id, QE_CR_PROTOCOL_UNSPECIFIED,
+       qe_issue_cmd(QE_ASSIGN_PAGE_TO_DEVICE, id, us_info->protocol,
                     uccs->us_pram_offset);
 
        uccs->us_pram = qe_muram_addr(uccs->us_pram_offset);
 
-       /* Init Guemr register */
-       if ((ret = ucc_init_guemr((struct ucc_common *) us_regs))) {
-               printk(KERN_ERR "%s: cannot init GUEMR", __FUNCTION__);
-               ucc_slow_free(uccs);
-               return ret;
-       }
-
        /* Set UCC to slow type */
-       if ((ret = ucc_set_type(us_info->ucc_num,
-                               (struct ucc_common *) us_regs,
-                               UCC_SPEED_TYPE_SLOW))) {
+       ret = ucc_set_type(us_info->ucc_num, UCC_SPEED_TYPE_SLOW);
+       if (ret) {
                printk(KERN_ERR "%s: cannot set UCC type", __FUNCTION__);
                ucc_slow_free(uccs);
                return ret;
@@ -212,7 +209,8 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
                qe_muram_alloc(us_info->rx_bd_ring_len * sizeof(struct qe_bd),
                                QE_ALIGNMENT_OF_BD);
        if (IS_ERR_VALUE(uccs->rx_base_offset)) {
-               printk(KERN_ERR "%s: cannot allocate RX BDs", __FUNCTION__);
+               printk(KERN_ERR "%s: cannot allocate %u RX BDs\n", __FUNCTION__,
+                       us_info->rx_bd_ring_len);
                uccs->rx_base_offset = 0;
                ucc_slow_free(uccs);
                return -ENOMEM;
@@ -292,12 +290,12 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
 
        /* if the data is in cachable memory, the 'global' */
        /* in the function code should be set. */
-       uccs->us_pram->tfcr = uccs->us_pram->rfcr =
-               us_info->data_mem_part | QE_BMR_BYTE_ORDER_BO_MOT;
+       uccs->us_pram->tbmr = UCC_BMR_BO_BE;
+       uccs->us_pram->rbmr = UCC_BMR_BO_BE;
 
        /* rbase, tbase are offsets from MURAM base */
-       out_be16(&uccs->us_pram->rbase, uccs->us_pram_offset);
-       out_be16(&uccs->us_pram->tbase, uccs->us_pram_offset);
+       out_be16(&uccs->us_pram->rbase, uccs->rx_base_offset);
+       out_be16(&uccs->us_pram->tbase, uccs->tx_base_offset);
 
        /* Mux clocking */
        /* Grant Support */
@@ -311,7 +309,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
                /* Rx clock routing */
                if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->rx_clock,
                                        COMM_DIR_RX)) {
-                       printk(KERN_ERR "%s: illegal value for RX clock",
+                       printk(KERN_ERR "%s: illegal value for RX clock\n",
                               __FUNCTION__);
                        ucc_slow_free(uccs);
                        return -EINVAL;
@@ -319,7 +317,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
                /* Tx clock routing */
                if (ucc_set_qe_mux_rxtx(us_info->ucc_num, us_info->tx_clock,
                                        COMM_DIR_TX)) {
-                       printk(KERN_ERR "%s: illegal value for TX clock",
+                       printk(KERN_ERR "%s: illegal value for TX clock\n",
                               __FUNCTION__);
                        ucc_slow_free(uccs);
                        return -EINVAL;
@@ -343,8 +341,8 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
                command = QE_INIT_TX;
        else
                command = QE_INIT_RX;   /* We know at least one is TRUE */
-       id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
-       qe_issue_cmd(command, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
+
+       qe_issue_cmd(command, id, us_info->protocol, 0);
 
        *uccs_ret = uccs;
        return 0;
diff --git a/arch/powerpc/sysdev/timer.c b/arch/powerpc/sysdev/timer.c
deleted file mode 100644 (file)
index e81e7ec..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Common code to keep time when machine suspends.
- *
- * Copyright 2007      Johannes Berg <johannes@sipsolutions.net>
- *
- * GPLv2
- */
-
-#include <linux/time.h>
-#include <linux/sysdev.h>
-#include <asm/rtc.h>
-
-static unsigned long suspend_rtc_time;
-
-/*
- * Reset the time after a sleep.
- */
-static int timer_resume(struct sys_device *dev)
-{
-       struct timeval tv;
-       struct timespec ts;
-       struct rtc_time cur_rtc_tm;
-       unsigned long cur_rtc_time, diff;
-
-       /* get current RTC time and convert to seconds */
-       get_rtc_time(&cur_rtc_tm);
-       cur_rtc_time = mktime(cur_rtc_tm.tm_year + 1900,
-                             cur_rtc_tm.tm_mon + 1,
-                             cur_rtc_tm.tm_mday,
-                             cur_rtc_tm.tm_hour,
-                             cur_rtc_tm.tm_min,
-                             cur_rtc_tm.tm_sec);
-
-       diff = cur_rtc_time - suspend_rtc_time;
-
-       /* adjust time of day by seconds that elapsed while
-        * we were suspended */
-       do_gettimeofday(&tv);
-       ts.tv_sec = tv.tv_sec + diff;
-       ts.tv_nsec = tv.tv_usec * NSEC_PER_USEC;
-       do_settimeofday(&ts);
-
-       return 0;
-}
-
-static int timer_suspend(struct sys_device *dev, pm_message_t state)
-{
-       struct rtc_time suspend_rtc_tm;
-       WARN_ON(!ppc_md.get_rtc_time);
-
-       get_rtc_time(&suspend_rtc_tm);
-       suspend_rtc_time = mktime(suspend_rtc_tm.tm_year + 1900,
-                                 suspend_rtc_tm.tm_mon + 1,
-                                 suspend_rtc_tm.tm_mday,
-                                 suspend_rtc_tm.tm_hour,
-                                 suspend_rtc_tm.tm_min,
-                                 suspend_rtc_tm.tm_sec);
-
-       return 0;
-}
-
-static struct sysdev_class timer_sysclass = {
-       .resume = timer_resume,
-       .suspend = timer_suspend,
-       set_kset_name("timer"),
-};
-
-static struct sys_device device_timer = {
-       .id = 0,
-       .cls = &timer_sysclass,
-};
-
-static int time_init_device(void)
-{
-       int error = sysdev_class_register(&timer_sysclass);
-       if (!error)
-               error = sysdev_register(&device_timer);
-       return error;
-}
-
-device_initcall(time_init_device);
index 90db8a720fedec7198c972fd2e48925a944e37db..31d3d33d91fc63ae001c32c3d90e6dcddbc65594 100644 (file)
@@ -52,7 +52,6 @@
 u32 tsi108_pci_cfg_base;
 static u32 tsi108_pci_cfg_phys;
 u32 tsi108_csr_vir_base;
-static struct device_node *pci_irq_node;
 static struct irq_host *pci_irq_host;
 
 extern u32 get_vir_csrbase(void);
@@ -193,8 +192,8 @@ void tsi108_clear_pci_cfg_error(void)
 }
 
 static struct pci_ops tsi108_direct_pci_ops = {
-       tsi108_direct_read_config,
-       tsi108_direct_write_config
+       .read = tsi108_direct_read_config,
+       .write = tsi108_direct_write_config,
 };
 
 int __init tsi108_setup_pci(struct device_node *dev, u32 cfg_phys, int primary)
@@ -405,13 +404,7 @@ static int pci_irq_host_map(struct irq_host *h, unsigned int virq,
        return 0;
 }
 
-static int pci_irq_host_match(struct irq_host *h, struct device_node *node)
-{
-       return pci_irq_node == node;
-}
-
 static struct irq_host_ops pci_irq_host_ops = {
-       .match = pci_irq_host_match,
        .map = pci_irq_host_map,
        .xlate = pci_irq_host_xlate,
 };
@@ -433,10 +426,11 @@ void __init tsi108_pci_int_init(struct device_node *node)
 {
        DBG("Tsi108_pci_int_init: initializing PCI interrupts\n");
 
-       pci_irq_node = of_node_get(node);
-       pci_irq_host = irq_alloc_host(IRQ_HOST_MAP_LEGACY, 0, &pci_irq_host_ops, 0);
+       pci_irq_host = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LEGACY,
+                                     0, &pci_irq_host_ops, 0);
        if (pci_irq_host == NULL) {
                printk(KERN_ERR "pci_irq_host: failed to allocate irq host !\n");
+               of_node_put(node);
                return;
        }
 
index 89059895a20d0ef8f8866759eae18855f43030d4..5149716c734d9cf605ed9d8cc2cff65f7c7cee9b 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/spinlock.h>
 #include <linux/irq.h>
 #include <linux/interrupt.h>
+#include <linux/kernel_stat.h>
 #include <asm/irq.h>
 #include <asm/io.h>
 #include <asm/prom.h>
@@ -55,9 +56,6 @@ struct uic {
 
        /* For secondary UICs, the cascade interrupt's irqaction */
        struct irqaction cascade;
-
-       /* The device node of the interrupt controller */
-       struct device_node *of_node;
 };
 
 static void uic_unmask_irq(unsigned int virq)
@@ -142,7 +140,7 @@ static int uic_set_irq_type(unsigned int virq, unsigned int flow_type)
 
        desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
        desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
-       if (trigger)
+       if (!trigger)
                desc->status |= IRQ_LEVEL;
 
        spin_unlock_irqrestore(&uic->lock, flags);
@@ -159,10 +157,62 @@ static struct irq_chip uic_irq_chip = {
        .set_type       = uic_set_irq_type,
 };
 
-static int uic_host_match(struct irq_host *h, struct device_node *node)
+/**
+ *     handle_uic_irq - irq flow handler for UIC
+ *     @irq:   the interrupt number
+ *     @desc:  the interrupt description structure for this irq
+ *
+ * This is modified version of the generic handle_level_irq() suitable
+ * for the UIC.  On the UIC, acking (i.e. clearing the SR bit) a level
+ * irq will have no effect if the interrupt is still asserted by the
+ * device, even if the interrupt is already masked.  Therefore, unlike
+ * the standard handle_level_irq(), we must ack the interrupt *after*
+ * invoking the ISR (which should have de-asserted the interrupt in
+ * the external source).  For edge interrupts we ack at the beginning
+ * instead of the end, to keep the window in which we can miss an
+ * interrupt as small as possible.
+ */
+void fastcall handle_uic_irq(unsigned int irq, struct irq_desc *desc)
 {
-       struct uic *uic = h->host_data;
-       return uic->of_node == node;
+       unsigned int cpu = smp_processor_id();
+       struct irqaction *action;
+       irqreturn_t action_ret;
+
+       spin_lock(&desc->lock);
+       if (desc->status & IRQ_LEVEL)
+               desc->chip->mask(irq);
+       else
+               desc->chip->mask_ack(irq);
+
+       if (unlikely(desc->status & IRQ_INPROGRESS))
+               goto out_unlock;
+       desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
+       kstat_cpu(cpu).irqs[irq]++;
+
+       /*
+        * If its disabled or no action available
+        * keep it masked and get out of here
+        */
+       action = desc->action;
+       if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
+               desc->status |= IRQ_PENDING;
+               goto out_unlock;
+       }
+
+       desc->status |= IRQ_INPROGRESS;
+       desc->status &= ~IRQ_PENDING;
+       spin_unlock(&desc->lock);
+
+       action_ret = handle_IRQ_event(irq, action);
+
+       spin_lock(&desc->lock);
+       desc->status &= ~IRQ_INPROGRESS;
+       if (desc->status & IRQ_LEVEL)
+               desc->chip->ack(irq);
+       if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
+               desc->chip->unmask(irq);
+out_unlock:
+       spin_unlock(&desc->lock);
 }
 
 static int uic_host_map(struct irq_host *h, unsigned int virq,
@@ -173,7 +223,7 @@ static int uic_host_map(struct irq_host *h, unsigned int virq,
        set_irq_chip_data(virq, uic);
        /* Despite the name, handle_level_irq() works for both level
         * and edge irqs on UIC.  FIXME: check this is correct */
-       set_irq_chip_and_handler(virq, &uic_irq_chip, handle_level_irq);
+       set_irq_chip_and_handler(virq, &uic_irq_chip, handle_uic_irq);
 
        /* Set default irq type */
        set_irq_type(virq, IRQ_TYPE_NONE);
@@ -194,7 +244,6 @@ static int uic_host_xlate(struct irq_host *h, struct device_node *ct,
 }
 
 static struct irq_host_ops uic_host_ops = {
-       .match  = uic_host_match,
        .map    = uic_host_map,
        .xlate  = uic_host_xlate,
 };
@@ -207,6 +256,9 @@ irqreturn_t uic_cascade(int virq, void *data)
        int subvirq;
 
        msr = mfdcr(uic->dcrbase + UIC_MSR);
+       if (!msr) /* spurious interrupt */
+               return IRQ_HANDLED;
+
        src = 32 - ffs(msr);
 
        subvirq = irq_linear_revmap(uic->irqhost, src);
@@ -229,7 +281,6 @@ static struct uic * __init uic_init_one(struct device_node *node)
 
        memset(uic, 0, sizeof(*uic));
        spin_lock_init(&uic->lock);
-       uic->of_node = of_node_get(node);
        indexp = of_get_property(node, "cell-index", &len);
        if (!indexp || (len != sizeof(u32))) {
                printk(KERN_ERR "uic: Device node %s has missing or invalid "
@@ -246,8 +297,8 @@ static struct uic * __init uic_init_one(struct device_node *node)
        }
        uic->dcrbase = *dcrreg;
 
-       uic->irqhost = irq_alloc_host(IRQ_HOST_MAP_LINEAR, NR_UIC_INTS,
-                                     &uic_host_ops, -1);
+       uic->irqhost = irq_alloc_host(of_node_get(node), IRQ_HOST_MAP_LINEAR,
+                                     NR_UIC_INTS, &uic_host_ops, -1);
        if (! uic->irqhost) {
                of_node_put(node);
                return NULL; /* FIXME: panic? */
diff --git a/arch/powerpc/sysdev/xilinx_intc.c b/arch/powerpc/sysdev/xilinx_intc.c
new file mode 100644 (file)
index 0000000..c2f17cc
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * Interrupt controller driver for Xilinx Virtex FPGAs
+ *
+ * Copyright (C) 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ *
+ */
+
+/*
+ * This is a driver for the interrupt controller typically found in
+ * Xilinx Virtex FPGA designs.
+ *
+ * The interrupt sense levels are hard coded into the FPGA design with
+ * typically a 1:1 relationship between irq lines and devices (no shared
+ * irq lines).  Therefore, this driver does not attempt to handle edge
+ * and level interrupts differently.
+ */
+#undef DEBUG
+
+#include <linux/kernel.h>
+#include <linux/irq.h>
+#include <linux/of.h>
+#include <asm/io.h>
+#include <asm/processor.h>
+#include <asm/irq.h>
+
+/*
+ * INTC Registers
+ */
+#define XINTC_ISR      0       /* Interrupt Status */
+#define XINTC_IPR      4       /* Interrupt Pending */
+#define XINTC_IER      8       /* Interrupt Enable */
+#define XINTC_IAR      12      /* Interrupt Acknowledge */
+#define XINTC_SIE      16      /* Set Interrupt Enable bits */
+#define XINTC_CIE      20      /* Clear Interrupt Enable bits */
+#define XINTC_IVR      24      /* Interrupt Vector */
+#define XINTC_MER      28      /* Master Enable */
+
+static struct irq_host *master_irqhost;
+
+/*
+ * IRQ Chip operations
+ */
+static void xilinx_intc_mask(unsigned int virq)
+{
+       int irq = virq_to_hw(virq);
+       void * regs = get_irq_chip_data(virq);
+       pr_debug("mask: %d\n", irq);
+       out_be32(regs + XINTC_CIE, 1 << irq);
+}
+
+static void xilinx_intc_unmask(unsigned int virq)
+{
+       int irq = virq_to_hw(virq);
+       void * regs = get_irq_chip_data(virq);
+       pr_debug("unmask: %d\n", irq);
+       out_be32(regs + XINTC_SIE, 1 << irq);
+}
+
+static void xilinx_intc_ack(unsigned int virq)
+{
+       int irq = virq_to_hw(virq);
+       void * regs = get_irq_chip_data(virq);
+       pr_debug("ack: %d\n", irq);
+       out_be32(regs + XINTC_IAR, 1 << irq);
+}
+
+static struct irq_chip xilinx_intc_irqchip = {
+       .typename = "Xilinx INTC",
+       .mask = xilinx_intc_mask,
+       .unmask = xilinx_intc_unmask,
+       .ack = xilinx_intc_ack,
+};
+
+/*
+ * IRQ Host operations
+ */
+static int xilinx_intc_map(struct irq_host *h, unsigned int virq,
+                                 irq_hw_number_t irq)
+{
+       set_irq_chip_data(virq, h->host_data);
+       set_irq_chip_and_handler(virq, &xilinx_intc_irqchip, handle_level_irq);
+       set_irq_type(virq, IRQ_TYPE_NONE);
+       return 0;
+}
+
+static struct irq_host_ops xilinx_intc_ops = {
+       .map = xilinx_intc_map,
+};
+
+struct irq_host * __init
+xilinx_intc_init(struct device_node *np)
+{
+       struct irq_host * irq;
+       struct resource res;
+       void * regs;
+       int rc;
+
+       /* Find and map the intc registers */
+       rc = of_address_to_resource(np, 0, &res);
+       if (rc) {
+               printk(KERN_ERR __FILE__ ": of_address_to_resource() failed\n");
+               return NULL;
+       }
+       regs = ioremap(res.start, 32);
+
+       printk(KERN_INFO "Xilinx intc at 0x%08X mapped to 0x%p\n",
+               res.start, regs);
+
+       /* Setup interrupt controller */
+       out_be32(regs + XINTC_IER, 0); /* disable all irqs */
+       out_be32(regs + XINTC_IAR, ~(u32) 0); /* Acknowledge pending irqs */
+       out_be32(regs + XINTC_MER, 0x3UL); /* Turn on the Master Enable. */
+
+       /* Allocate and initialize an irq_host structure. */
+       irq = irq_alloc_host(np, IRQ_HOST_MAP_LINEAR, 32, &xilinx_intc_ops, -1);
+       if (!irq)
+               panic(__FILE__ ": Cannot allocate IRQ host\n");
+       irq->host_data = regs;
+       return irq;
+}
+
+int xilinx_intc_get_irq(void)
+{
+       void * regs = master_irqhost->host_data;
+       pr_debug("get_irq:\n");
+       return irq_linear_revmap(master_irqhost, in_be32(regs + XINTC_IVR));
+}
+
+void __init xilinx_intc_init_tree(void)
+{
+       struct device_node *np;
+
+       /* find top level interrupt controller */
+       for_each_compatible_node(np, NULL, "xilinx,intc") {
+               if (!of_get_property(np, "interrupts", NULL))
+                       break;
+       }
+
+       /* xilinx interrupt controller needs to be top level */
+       BUG_ON(!np);
+
+       master_irqhost = xilinx_intc_init(np);
+       BUG_ON(!master_irqhost);
+
+       irq_set_default_host(master_irqhost);
+       of_node_put(np);
+}
index a1a869c8c840478164594a788ae5ce38dc0ee6da..1e79a0ae44737b6a2b01360d5df25b2baf04b9e4 100644 (file)
@@ -1 +1 @@
-include
+/include
index 703d47eee4362206e308f57f5d02015a3d0a7464..eace3bc118d2092252da1765699cf2e056fe5f24 100644 (file)
@@ -44,6 +44,7 @@
 #include <asm/mpc8xx.h>
 #include <asm/uaccess.h>
 #include <asm/commproc.h>
+#include <asm/cacheflush.h>
 
 /*
  *                             Theory of Operation
index 6bdeeb70b157856a00b6ce22c397a74abeb0d803..20dce4681259a0c6daf8f1ccf3af5826b33ca5d8 100644 (file)
@@ -4,6 +4,10 @@
 
 mainmenu "Linux/PowerPC Kernel Configuration"
 
+config WORD_SIZE
+       int
+       default 32
+
 config MMU
        bool
        default y
@@ -573,24 +577,9 @@ choice
 
          Select PReP if configuring for a PReP machine.
 
-         Select Gemini if configuring for a Synergy Microsystems' Gemini
-         series Single Board Computer.  More information is available at:
-         <http://www.synergymicro.com/PressRel/97_10_15.html>.
-
-         Select APUS if configuring for a PowerUP Amiga.  More information is
-         available at: <http://linux-apus.sourceforge.net/>.
-
 config PPC_PREP
        bool "PReP"
 
-config APUS
-       bool "Amiga-APUS"
-       depends on BROKEN
-       help
-         Select APUS if configuring for a PowerUP Amiga.
-         More information is available at:
-         <http://linux-apus.sourceforge.net/>.
-
 config KATANA
        bool "Artesyn-Katana"
        help
@@ -1027,133 +1016,7 @@ config CMDLINE
          some command-line options at build time by entering them here.  In
          most cases you will need to specify the root device here.
 
-config AMIGA
-       bool
-       depends on APUS
-       default y
-       help
-         This option enables support for the Amiga series of computers.
-
-config ZORRO
-       bool
-       depends on APUS
-       default y
-       help
-         This enables support for the Zorro bus in the Amiga. If you have
-         expansion cards in your Amiga that conform to the Amiga
-         AutoConfig(tm) specification, say Y, otherwise N. Note that even
-         expansion cards that do not fit in the Zorro slots but fit in e.g.
-         the CPU slot may fall in this category, so you have to say Y to let
-         Linux use these.
-
-config ABSTRACT_CONSOLE
-       bool
-       depends on APUS
-       default y
-
-config APUS_FAST_EXCEPT
-       bool
-       depends on APUS
-       default y
-
-config AMIGA_PCMCIA
-       bool "Amiga 1200/600 PCMCIA support"
-       depends on APUS && EXPERIMENTAL
-       help
-         Include support in the kernel for pcmcia on Amiga 1200 and Amiga
-         600. If you intend to use pcmcia cards say Y; otherwise say N.
-
-config AMIGA_BUILTIN_SERIAL
-       tristate "Amiga builtin serial support"
-       depends on APUS
-       help
-         If you want to use your Amiga's built-in serial port in Linux,
-         answer Y.
-
-         To compile this driver as a module, choose M here.
-
-config GVPIOEXT
-       tristate "GVP IO-Extender support"
-       depends on APUS
-       help
-         If you want to use a GVP IO-Extender serial card in Linux, say Y.
-         Otherwise, say N.
-
-config GVPIOEXT_LP
-       tristate "GVP IO-Extender parallel printer support"
-       depends on GVPIOEXT
-       help
-         Say Y to enable driving a printer from the parallel port on your
-         GVP IO-Extender card, N otherwise.
-
-config GVPIOEXT_PLIP
-       tristate "GVP IO-Extender PLIP support"
-       depends on GVPIOEXT
-       help
-         Say Y to enable doing IP over the parallel port on your GVP
-         IO-Extender card, N otherwise.
-
-config MULTIFACE_III_TTY
-       tristate "Multiface Card III serial support"
-       depends on APUS
-       help
-         If you want to use a Multiface III card's serial port in Linux,
-         answer Y.
-
-         To compile this driver as a module, choose M here.
-
-config A2232
-       tristate "Commodore A2232 serial support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && APUS
-       ---help---
-         This option supports the 2232 7-port serial card shipped with the
-         Amiga 2000 and other Zorro-bus machines, dating from 1989.  At
-         a max of 19,200 bps, the ports are served by a 6551 ACIA UART chip
-         each, plus a 8520 CIA, and a master 6502 CPU and buffer as well. The
-         ports were connected with 8 pin DIN connectors on the card bracket,
-         for which 8 pin to DB25 adapters were supplied. The card also had
-         jumpers internally to toggle various pinning configurations.
-
-         This driver can be built as a module; but then "generic_serial"
-         will also be built as a module. This has to be loaded before
-         "ser_a2232". If you want to do this, answer M here.
-
-config WHIPPET_SERIAL
-       tristate "Hisoft Whippet PCMCIA serial support"
-       depends on AMIGA_PCMCIA
-       help
-         HiSoft has a web page at <http://www.hisoft.co.uk/>, but there
-         is no listing for the Whippet in their Amiga section.
-
-config APNE
-       tristate "PCMCIA NE2000 support"
-       depends on AMIGA_PCMCIA
-       help
-         If you have a PCMCIA NE2000 compatible adapter, say Y.  Otherwise,
-         say N.
-
-         To compile this driver as a module, choose M here: the
-         module will be called apne.
-
-config SERIAL_CONSOLE
-       bool "Support for serial port console"
-       depends on APUS && (AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y)
-
-config HEARTBEAT
-       bool "Use power LED as a heartbeat"
-       depends on APUS
-       help
-         Use the power-on LED on your machine as a load meter.  The exact
-         behavior is platform-dependent, but normally the flash frequency is
-         a hyperbolic function of the 5-minute load average.
-
-config PROC_HARDWARE
-       bool "/proc/hardware support"
-       depends on APUS
-
-source "drivers/zorro/Kconfig"
-
-if !44x || BROKEN
+if BROKEN
 source kernel/power/Kconfig
 endif
 
@@ -1227,8 +1090,7 @@ config MCA
 
 config PCI
        bool "PCI support" if 40x || CPM2 || 83xx || 85xx || PPC_MPC52xx
-       default y if !40x && !CPM2 && !8xx && !APUS && !83xx && !85xx
-       default PCI_PERMEDIA if !4xx && !CPM2 && !8xx && APUS
+       default y if !40x && !CPM2 && !8xx && !83xx && !85xx
        default PCI_QSPAN if !4xx && !CPM2 && 8xx
        help
          Find out whether your system includes a PCI bus. PCI is the name of
@@ -1284,10 +1146,6 @@ config 8260_PCI9_IDMA4
 
 endchoice
 
-config PCI_PERMEDIA
-       bool "PCI for Permedia2"
-       depends on !4xx && !8xx && APUS
-
 source "drivers/pci/Kconfig"
 
 source "drivers/pcmcia/Kconfig"
index 0db66dcf072378a4deacf0ea9d8d9f4cf5884d20..eee6264e8a043a027db7d929fec792d8188c442e 100644 (file)
@@ -69,7 +69,6 @@ core-$(CONFIG_83xx)           += arch/ppc/platforms/83xx/
 core-$(CONFIG_85xx)            += arch/ppc/platforms/85xx/
 core-$(CONFIG_MATH_EMULATION)  += arch/powerpc/math-emu/
 core-$(CONFIG_XMON)            += arch/ppc/xmon/
-core-$(CONFIG_APUS)            += arch/ppc/amiga/
 drivers-$(CONFIG_8xx)          += arch/ppc/8xx_io/
 drivers-$(CONFIG_4xx)          += arch/ppc/4xx_io/
 drivers-$(CONFIG_CPM2)         += arch/ppc/8260_io/
diff --git a/arch/ppc/amiga/Makefile b/arch/ppc/amiga/Makefile
deleted file mode 100644 (file)
index 59fec0a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Makefile for Linux arch/m68k/amiga source directory
-#
-
-obj-y          := config.o amiints.o cia.o time.o bootinfo.o amisound.o \
-                       chipram.o amiga_ksyms.o
-
-obj-$(CONFIG_AMIGA_PCMCIA) += pcmcia.o
diff --git a/arch/ppc/amiga/amiga_ksyms.c b/arch/ppc/amiga/amiga_ksyms.c
deleted file mode 100644 (file)
index ec74e5b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../m68k/amiga/amiga_ksyms.c"
diff --git a/arch/ppc/amiga/amiints.c b/arch/ppc/amiga/amiints.c
deleted file mode 100644 (file)
index 265fcd3..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Amiga Linux interrupt handling code
- *
- * 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.
- *
- * 11/07/96: rewritten interrupt handling, irq lists are exists now only for
- *           this sources where it makes sense (VERTB/PORTS/EXTER) and you must
- *           be careful that dev_id for this sources is unique since this the
- *           only possibility to distinguish between different handlers for
- *           free_irq. irq lists also have different irq flags:
- *           - IRQ_FLG_FAST: handler is inserted at top of list (after other
- *                           fast handlers)
- *           - IRQ_FLG_SLOW: handler is inserted at bottom of list and before
- *                           they're executed irq level is set to the previous
- *                           one, but handlers don't need to be reentrant, if
- *                           reentrance occurred, slow handlers will be just
- *                           called again.
- *           The whole interrupt handling for CIAs is moved to cia.c
- *           /Roman Zippel
- *
- * 07/08/99: rewamp of the interrupt handling - we now have two types of
- *           interrupts, normal and fast handlers, fast handlers being
- *           marked with SA_INTERRUPT and runs with all other interrupts
- *           disabled. Normal interrupts disable their own source but
- *           run with all other interrupt sources enabled.
- *           PORTS and EXTER interrupts are always shared even if the
- *           drivers do not explicitly mark this when calling
- *           request_irq which they really should do.
- *           This is similar to the way interrupts are handled on all
- *           other architectures and makes a ton of sense besides
- *           having the advantage of making it easier to share
- *           drivers.
- *           /Jes
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kernel_stat.h>
-#include <linux/init.h>
-
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/traps.h>
-#include <asm/amigahw.h>
-#include <asm/amigaints.h>
-#include <asm/amipcmcia.h>
-
-#ifdef CONFIG_APUS
-#include <asm/amigappc.h>
-#endif
-
-extern void cia_init_IRQ(struct ciabase *base);
-
-unsigned short ami_intena_vals[AMI_STD_IRQS] = {
-       IF_VERTB, IF_COPER, IF_AUD0, IF_AUD1, IF_AUD2, IF_AUD3, IF_BLIT,
-       IF_DSKSYN, IF_DSKBLK, IF_RBF, IF_TBE, IF_SOFT, IF_PORTS, IF_EXTER
-};
-static const unsigned char ami_servers[AMI_STD_IRQS] = {
-       1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
-};
-
-static short ami_ablecount[AMI_IRQS];
-
-static void ami_badint(int irq, void *dev_id, struct pt_regs *fp)
-{
-/*     num_spurious += 1;*/
-}
-
-/*
- * void amiga_init_IRQ(void)
- *
- * Parameters: None
- *
- * Returns:    Nothing
- *
- * This function should be called during kernel startup to initialize
- * the amiga IRQ handling routines.
- */
-
-__init
-void amiga_init_IRQ(void)
-{
-       int i;
-
-       for (i = 0; i < AMI_IRQS; i++)
-               ami_ablecount[i] = 0;
-
-       /* turn off PCMCIA interrupts */
-       if (AMIGAHW_PRESENT(PCMCIA))
-               gayle.inten = GAYLE_IRQ_IDE;
-
-       /* turn off all interrupts... */
-       amiga_custom.intena = 0x7fff;
-       amiga_custom.intreq = 0x7fff;
-
-#ifdef CONFIG_APUS
-       /* Clear any inter-CPU interrupt requests. Circumvents bug in
-           Blizzard IPL emulation HW (or so it appears). */
-       APUS_WRITE(APUS_INT_LVL, INTLVL_SETRESET | INTLVL_MASK);
-
-       /* Init IPL emulation. */
-       APUS_WRITE(APUS_REG_INT, REGINT_INTMASTER | REGINT_ENABLEIPL);
-       APUS_WRITE(APUS_IPL_EMU, IPLEMU_DISABLEINT);
-       APUS_WRITE(APUS_IPL_EMU, IPLEMU_SETRESET | IPLEMU_IPLMASK);
-#endif
-       /* ... and enable the master interrupt bit */
-       amiga_custom.intena = IF_SETCLR | IF_INTEN;
-
-       cia_init_IRQ(&ciaa_base);
-       cia_init_IRQ(&ciab_base);
-}
-
-/*
- * Enable/disable a particular machine specific interrupt source.
- * Note that this may affect other interrupts in case of a shared interrupt.
- * This function should only be called for a _very_ short time to change some
- * internal data, that may not be changed by the interrupt at the same time.
- * ami_(enable|disable)_irq calls may also be nested.
- */
-
-void amiga_enable_irq(unsigned int irq)
-{
-       if (irq >= AMI_IRQS) {
-               printk("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
-               return;
-       }
-
-       ami_ablecount[irq]--;
-       if (ami_ablecount[irq]<0)
-               ami_ablecount[irq]=0;
-       else if (ami_ablecount[irq])
-               return;
-
-       /* No action for auto-vector interrupts */
-       if (irq >= IRQ_AMIGA_AUTO){
-               printk("%s: Trying to enable auto-vector IRQ %i\n",
-                      __FUNCTION__, irq - IRQ_AMIGA_AUTO);
-               return;
-       }
-
-       if (irq >= IRQ_AMIGA_CIAA) {
-               cia_set_irq(irq, 0);
-               cia_able_irq(irq, 1);
-               return;
-       }
-
-       /* enable the interrupt */
-       amiga_custom.intena = IF_SETCLR | ami_intena_vals[irq];
-}
-
-void amiga_disable_irq(unsigned int irq)
-{
-       if (irq >= AMI_IRQS) {
-               printk("%s: Unknown IRQ %d\n", __FUNCTION__, irq);
-               return;
-       }
-
-       if (ami_ablecount[irq]++)
-               return;
-
-       /* No action for auto-vector interrupts */
-       if (irq >= IRQ_AMIGA_AUTO) {
-               printk("%s: Trying to disable auto-vector IRQ %i\n",
-                      __FUNCTION__, irq - IRQ_AMIGA_AUTO);
-               return;
-       }
-
-       if (irq >= IRQ_AMIGA_CIAA) {
-               cia_able_irq(irq, 0);
-               return;
-       }
-
-       /* disable the interrupt */
-       amiga_custom.intena = ami_intena_vals[irq];
-}
-
-inline void amiga_do_irq(int irq, struct pt_regs *fp)
-{
-       irq_desc_t *desc = irq_desc + irq;
-       struct irqaction *action = desc->action;
-
-       kstat_cpu(0).irqs[irq]++;
-       action->handler(irq, action->dev_id, fp);
-}
-
-void amiga_do_irq_list(int irq, struct pt_regs *fp)
-{
-       irq_desc_t *desc = irq_desc + irq;
-       struct irqaction *action;
-
-       kstat_cpu(0).irqs[irq]++;
-
-       amiga_custom.intreq = ami_intena_vals[irq];
-
-       for (action = desc->action; action; action = action->next)
-               action->handler(irq, action->dev_id, fp);
-}
-
-/*
- * The builtin Amiga hardware interrupt handlers.
- */
-
-static void ami_int1(int irq, void *dev_id, struct pt_regs *fp)
-{
-       unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
-
-       /* if serial transmit buffer empty, interrupt */
-       if (ints & IF_TBE) {
-               amiga_custom.intreq = IF_TBE;
-               amiga_do_irq(IRQ_AMIGA_TBE, fp);
-       }
-
-       /* if floppy disk transfer complete, interrupt */
-       if (ints & IF_DSKBLK) {
-               amiga_custom.intreq = IF_DSKBLK;
-               amiga_do_irq(IRQ_AMIGA_DSKBLK, fp);
-       }
-
-       /* if software interrupt set, interrupt */
-       if (ints & IF_SOFT) {
-               amiga_custom.intreq = IF_SOFT;
-               amiga_do_irq(IRQ_AMIGA_SOFT, fp);
-       }
-}
-
-static void ami_int3(int irq, void *dev_id, struct pt_regs *fp)
-{
-       unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
-
-       /* if a blitter interrupt */
-       if (ints & IF_BLIT) {
-               amiga_custom.intreq = IF_BLIT;
-               amiga_do_irq(IRQ_AMIGA_BLIT, fp);
-       }
-
-       /* if a copper interrupt */
-       if (ints & IF_COPER) {
-               amiga_custom.intreq = IF_COPER;
-               amiga_do_irq(IRQ_AMIGA_COPPER, fp);
-       }
-
-       /* if a vertical blank interrupt */
-       if (ints & IF_VERTB)
-               amiga_do_irq_list(IRQ_AMIGA_VERTB, fp);
-}
-
-static void ami_int4(int irq, void *dev_id, struct pt_regs *fp)
-{
-       unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
-
-       /* if audio 0 interrupt */
-       if (ints & IF_AUD0) {
-               amiga_custom.intreq = IF_AUD0;
-               amiga_do_irq(IRQ_AMIGA_AUD0, fp);
-       }
-
-       /* if audio 1 interrupt */
-       if (ints & IF_AUD1) {
-               amiga_custom.intreq = IF_AUD1;
-               amiga_do_irq(IRQ_AMIGA_AUD1, fp);
-       }
-
-       /* if audio 2 interrupt */
-       if (ints & IF_AUD2) {
-               amiga_custom.intreq = IF_AUD2;
-               amiga_do_irq(IRQ_AMIGA_AUD2, fp);
-       }
-
-       /* if audio 3 interrupt */
-       if (ints & IF_AUD3) {
-               amiga_custom.intreq = IF_AUD3;
-               amiga_do_irq(IRQ_AMIGA_AUD3, fp);
-       }
-}
-
-static void ami_int5(int irq, void *dev_id, struct pt_regs *fp)
-{
-       unsigned short ints = amiga_custom.intreqr & amiga_custom.intenar;
-
-       /* if serial receive buffer full interrupt */
-       if (ints & IF_RBF) {
-               /* acknowledge of IF_RBF must be done by the serial interrupt */
-               amiga_do_irq(IRQ_AMIGA_RBF, fp);
-       }
-
-       /* if a disk sync interrupt */
-       if (ints & IF_DSKSYN) {
-               amiga_custom.intreq = IF_DSKSYN;
-               amiga_do_irq(IRQ_AMIGA_DSKSYN, fp);
-       }
-}
-
-static void ami_int7(int irq, void *dev_id, struct pt_regs *fp)
-{
-       panic ("level 7 interrupt received\n");
-}
-
-#ifdef CONFIG_APUS
-/* The PPC irq handling links all handlers requested on the same vector
-   and executes them in a loop. Having ami_badint at the end of the chain
-   is a bad idea. */
-struct irqaction amiga_sys_irqaction[AUTO_IRQS] = {
-       { .handler = ami_badint, .name = "spurious int" },
-       { .handler = ami_int1, .name = "int1 handler" },
-       { 0, /* CIAA */ },
-       { .handler = ami_int3, .name = "int3 handler" },
-       { .handler = ami_int4, .name = "int4 handler" },
-       { .handler = ami_int5, .name = "int5 handler" },
-       { 0, /* CIAB */ },
-       { .handler = ami_int7, .name = "int7 handler" },
-};
-#else
-void (*amiga_default_handler[SYS_IRQS])(int, void *, struct pt_regs *) = {
-       ami_badint, ami_int1, ami_badint, ami_int3,
-       ami_int4, ami_int5, ami_badint, ami_int7
-};
-#endif
diff --git a/arch/ppc/amiga/amisound.c b/arch/ppc/amiga/amisound.c
deleted file mode 100644 (file)
index 2b86cbe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../m68k/amiga/amisound.c"
diff --git a/arch/ppc/amiga/bootinfo.c b/arch/ppc/amiga/bootinfo.c
deleted file mode 100644 (file)
index efd869a..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Extracted from arch/m68k/kernel/setup.c.
- *  Should be properly generalized and put somewhere else.
- *                              Jesper
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/string.h>
-#include <linux/init.h>
-
-#include <asm/setup.h>
-#include <asm/bootinfo.h>
-
-extern char cmd_line[CL_SIZE];
-
-extern int num_memory;
-extern int m68k_realnum_memory;
-extern struct mem_info memory[NUM_MEMINFO];
-extern struct mem_info m68k_memory[NUM_MEMINFO];
-extern struct mem_info ramdisk;
-
-extern int amiga_parse_bootinfo(const struct bi_record *);
-extern int atari_parse_bootinfo(const struct bi_record *);
-extern int mac_parse_bootinfo(const struct bi_record *);
-
-void __init parse_bootinfo(const struct bi_record *record)
-{
-    while (record->tag != BI_LAST) {
-       int unknown = 0;
-       const u_long *data = record->data;
-       switch (record->tag) {
-           case BI_MACHTYPE:
-           case BI_CPUTYPE:
-           case BI_FPUTYPE:
-           case BI_MMUTYPE:
-               /* Already set up by head.S */
-               break;
-
-           case BI_MEMCHUNK:
-               if (num_memory < NUM_MEMINFO) {
-                   memory[num_memory].addr = data[0];
-                   memory[num_memory].size = data[1];
-                   num_memory++;
-
-                   /* FIXME: duplicate for m68k drivers. */
-                   m68k_memory[m68k_realnum_memory].addr = data[0];
-                   m68k_memory[m68k_realnum_memory].size = data[1];
-                   m68k_realnum_memory++;
-               } else
-                   printk("parse_bootinfo: too many memory chunks\n");
-               break;
-
-           case BI_RAMDISK:
-               ramdisk.addr = data[0];
-               ramdisk.size = data[1];
-               break;
-
-           case BI_COMMAND_LINE:
-               strlcpy(cmd_line, (const char *)data, sizeof(cmd_line));
-               break;
-
-           default:
-               if (MACH_IS_AMIGA)
-                   unknown = amiga_parse_bootinfo(record);
-               else if (MACH_IS_ATARI)
-                   unknown = atari_parse_bootinfo(record);
-               else if (MACH_IS_MAC)
-                   unknown = mac_parse_bootinfo(record);
-               else
-                   unknown = 1;
-       }
-       if (unknown)
-           printk("parse_bootinfo: unknown tag 0x%04x ignored\n",
-                  record->tag);
-       record = (struct bi_record *)((u_long)record+record->size);
-    }
-}
diff --git a/arch/ppc/amiga/chipram.c b/arch/ppc/amiga/chipram.c
deleted file mode 100644 (file)
index e6ab3c6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../m68k/amiga/chipram.c"
diff --git a/arch/ppc/amiga/cia.c b/arch/ppc/amiga/cia.c
deleted file mode 100644 (file)
index 9558f2f..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (C) 1996 Roman Zippel
- *
- *  The concept of some functions bases on the original Amiga OS function
- *
- * 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.
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/kernel_stat.h>
-#include <linux/init.h>
-
-#include <asm/irq.h>
-#include <asm/amigahw.h>
-#include <asm/amigaints.h>
-
-struct ciabase {
-       volatile struct CIA *cia;
-       u_char icr_mask, icr_data;
-       u_short int_mask;
-       int handler_irq, cia_irq, server_irq;
-       char *name;
-} ciaa_base = {
-       &ciaa, 0, 0, IF_PORTS,
-       IRQ_AMIGA_AUTO_2, IRQ_AMIGA_CIAA,
-       IRQ_AMIGA_PORTS,
-       "CIAA handler"
-}, ciab_base = {
-       &ciab, 0, 0, IF_EXTER,
-       IRQ_AMIGA_AUTO_6, IRQ_AMIGA_CIAB,
-       IRQ_AMIGA_EXTER,
-       "CIAB handler"
-};
-
-#define CIA_SET_BASE_ADJUST_IRQ(base, irq)     \
-do {                                           \
-       if (irq >= IRQ_AMIGA_CIAB) {            \
-               base = &ciab_base;              \
-               irq -= IRQ_AMIGA_CIAB;          \
-       } else {                                \
-               base = &ciaa_base;              \
-               irq -= IRQ_AMIGA_CIAA;          \
-       }                                       \
-} while (0)
-
-/*
- *  Cause or clear CIA interrupts, return old interrupt status.
- */
-
-static unsigned char cia_set_irq_private(struct ciabase *base,
-                                        unsigned char mask)
-{
-       u_char old;
-
-       old = (base->icr_data |= base->cia->icr);
-       if (mask & CIA_ICR_SETCLR)
-               base->icr_data |= mask;
-       else
-               base->icr_data &= ~mask;
-       if (base->icr_data & base->icr_mask)
-               amiga_custom.intreq = IF_SETCLR | base->int_mask;
-       return old & base->icr_mask;
-}
-
-unsigned char cia_set_irq(unsigned int irq, int set)
-{
-       struct ciabase *base;
-       unsigned char mask;
-
-       if (irq >= IRQ_AMIGA_CIAB)
-               mask = (1 << (irq - IRQ_AMIGA_CIAB));
-       else
-               mask = (1 << (irq - IRQ_AMIGA_CIAA));
-       mask |= (set) ? CIA_ICR_SETCLR : 0;
-
-       CIA_SET_BASE_ADJUST_IRQ(base, irq);
-
-       return cia_set_irq_private(base, mask);
-}
-
-unsigned char cia_get_irq_mask(unsigned int irq)
-{
-       struct ciabase *base;
-
-       CIA_SET_BASE_ADJUST_IRQ(base, irq);
-
-       return base->cia->icr;
-}
-
-/*
- *  Enable or disable CIA interrupts, return old interrupt mask.
- */
-
-static unsigned char cia_able_irq_private(struct ciabase *base,
-                                         unsigned char mask)
-{
-       u_char old;
-
-       old = base->icr_mask;
-       base->icr_data |= base->cia->icr;
-       base->cia->icr = mask;
-       if (mask & CIA_ICR_SETCLR)
-               base->icr_mask |= mask;
-       else
-               base->icr_mask &= ~mask;
-       base->icr_mask &= CIA_ICR_ALL;
-
-       if (base->icr_data & base->icr_mask)
-               amiga_custom.intreq = IF_SETCLR | base->int_mask;
-       return old;
-}
-
-unsigned char cia_able_irq(unsigned int irq, int enable)
-{
-       struct ciabase *base;
-       unsigned char mask;
-
-       if (irq >= IRQ_AMIGA_CIAB)
-               mask = (1 << (irq - IRQ_AMIGA_CIAB));
-       else
-               mask = (1 << (irq - IRQ_AMIGA_CIAA));
-       mask |= (enable) ? CIA_ICR_SETCLR : 0;
-
-       CIA_SET_BASE_ADJUST_IRQ(base, irq);
-
-       return cia_able_irq_private(base, mask);
-}
-
-static void cia_handler(int irq, void *dev_id, struct pt_regs *fp)
-{
-       struct ciabase *base = (struct ciabase *)dev_id;
-       irq_desc_t *desc;
-       struct irqaction *action;
-       int i;
-       unsigned char ints;
-
-       irq = base->cia_irq;
-       desc = irq_desc + irq;
-       ints = cia_set_irq_private(base, CIA_ICR_ALL);
-       amiga_custom.intreq = base->int_mask;
-       for (i = 0; i < CIA_IRQS; i++, irq++) {
-               if (ints & 1) {
-                       kstat_cpu(0).irqs[irq]++;
-                       action = desc->action;
-                       action->handler(irq, action->dev_id, fp);
-               }
-               ints >>= 1;
-               desc++;
-       }
-       amiga_do_irq_list(base->server_irq, fp);
-}
-
-void __init cia_init_IRQ(struct ciabase *base)
-{
-       extern struct irqaction amiga_sys_irqaction[AUTO_IRQS];
-       struct irqaction *action;
-
-       /* clear any pending interrupt and turn off all interrupts */
-       cia_set_irq_private(base, CIA_ICR_ALL);
-       cia_able_irq_private(base, CIA_ICR_ALL);
-
-       /* install CIA handler */
-       action = &amiga_sys_irqaction[base->handler_irq-IRQ_AMIGA_AUTO];
-       action->handler = cia_handler;
-       action->dev_id = base;
-       action->name = base->name;
-       setup_irq(base->handler_irq, &amiga_sys_irqaction[base->handler_irq-IRQ_AMIGA_AUTO]);
-
-       amiga_custom.intena = IF_SETCLR | base->int_mask;
-}
diff --git a/arch/ppc/amiga/config.c b/arch/ppc/amiga/config.c
deleted file mode 100644 (file)
index bc50ed1..0000000
+++ /dev/null
@@ -1,953 +0,0 @@
-#define m68k_debug_device debug_device
-
-/*
- *  Copyright (C) 1993 Hamish Macdonald
- *
- * 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.
- */
-
-/*
- * Miscellaneous Amiga stuff
- */
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/kd.h>
-#include <linux/tty.h>
-#include <linux/console.h>
-#include <linux/init.h>
-#ifdef CONFIG_ZORRO
-#include <linux/zorro.h>
-#endif
-
-#include <asm/bootinfo.h>
-#include <asm/setup.h>
-#include <asm/system.h>
-#include <asm/pgtable.h>
-#include <asm/amigahw.h>
-#include <asm/amigaints.h>
-#include <asm/irq.h>
-#include <asm/machdep.h>
-#include <asm/io.h>
-
-unsigned long powerup_PCI_present;
-unsigned long powerup_BPPCPLUS_present;
-unsigned long amiga_model;
-unsigned long amiga_eclock;
-unsigned long amiga_masterclock;
-unsigned long amiga_colorclock;
-unsigned long amiga_chipset;
-unsigned char amiga_vblank;
-unsigned char amiga_psfreq;
-struct amiga_hw_present amiga_hw_present;
-
-static char s_a500[] __initdata = "A500";
-static char s_a500p[] __initdata = "A500+";
-static char s_a600[] __initdata = "A600";
-static char s_a1000[] __initdata = "A1000";
-static char s_a1200[] __initdata = "A1200";
-static char s_a2000[] __initdata = "A2000";
-static char s_a2500[] __initdata = "A2500";
-static char s_a3000[] __initdata = "A3000";
-static char s_a3000t[] __initdata = "A3000T";
-static char s_a3000p[] __initdata = "A3000+";
-static char s_a4000[] __initdata = "A4000";
-static char s_a4000t[] __initdata = "A4000T";
-static char s_cdtv[] __initdata = "CDTV";
-static char s_cd32[] __initdata = "CD32";
-static char s_draco[] __initdata = "Draco";
-static char *amiga_models[] __initdata = {
-    s_a500, s_a500p, s_a600, s_a1000, s_a1200, s_a2000, s_a2500, s_a3000,
-    s_a3000t, s_a3000p, s_a4000, s_a4000t, s_cdtv, s_cd32, s_draco,
-};
-
-static char amiga_model_name[13] = "Amiga ";
-
-extern char m68k_debug_device[];
-
-static void amiga_sched_init(irqreturn_t (*handler)(int, void *, struct pt_regs *));
-/* amiga specific irq functions */
-extern void amiga_init_IRQ (void);
-extern void (*amiga_default_handler[]) (int, void *, struct pt_regs *);
-extern int amiga_request_irq (unsigned int irq,
-                             void (*handler)(int, void *, struct pt_regs *),
-                              unsigned long flags, const char *devname,
-                             void *dev_id);
-extern void amiga_free_irq (unsigned int irq, void *dev_id);
-extern void amiga_enable_irq (unsigned int);
-extern void amiga_disable_irq (unsigned int);
-static void amiga_get_model(char *model);
-static int amiga_get_hardware_list(char *buffer);
-/* amiga specific timer functions */
-static unsigned long amiga_gettimeoffset (void);
-static void a3000_gettod (int *, int *, int *, int *, int *, int *);
-static void a2000_gettod (int *, int *, int *, int *, int *, int *);
-static int amiga_hwclk (int, struct hwclk_time *);
-static int amiga_set_clock_mmss (unsigned long);
-static void amiga_reset (void);
-extern void amiga_init_sound(void);
-static void amiga_savekmsg_init(void);
-static void amiga_mem_console_write(struct console *co, const char *b,
-                                   unsigned int count);
-void amiga_serial_console_write(struct console *co, const char *s,
-                               unsigned int count);
-static void amiga_debug_init(void);
-#ifdef CONFIG_HEARTBEAT
-static void amiga_heartbeat(int on);
-#endif
-
-static struct console amiga_console_driver = {
-       .name =         "debug",
-       .flags =        CON_PRINTBUFFER,
-       .index =        -1,
-};
-
-
-    /*
-     *  Motherboard Resources present in all Amiga models
-     */
-
-static struct {
-    struct resource _ciab, _ciaa, _custom, _kickstart;
-} mb_resources = {
-//    { "Ranger Memory", 0x00c00000, 0x00c7ffff },
-    ._ciab =     { "CIA B", 0x00bfd000, 0x00bfdfff },
-    ._ciaa =     { "CIA A", 0x00bfe000, 0x00bfefff },
-    ._custom =   { "Custom I/O", 0x00dff000, 0x00dfffff },
-    ._kickstart = { "Kickstart ROM", 0x00f80000, 0x00ffffff }
-};
-
-static struct resource rtc_resource = {
-    NULL, 0x00dc0000, 0x00dcffff
-};
-
-static struct resource ram_resource[NUM_MEMINFO];
-
-
-    /*
-     *  Parse an Amiga-specific record in the bootinfo
-     */
-
-int amiga_parse_bootinfo(const struct bi_record *record)
-{
-    int unknown = 0;
-    const unsigned long *data = record->data;
-
-    switch (record->tag) {
-       case BI_AMIGA_MODEL:
-       {
-               unsigned long d = *data;
-
-               powerup_PCI_present = d & 0x100;
-               amiga_model = d & 0xff;
-       }
-       break;
-
-       case BI_AMIGA_ECLOCK:
-           amiga_eclock = *data;
-           break;
-
-       case BI_AMIGA_CHIPSET:
-           amiga_chipset = *data;
-           break;
-
-       case BI_AMIGA_CHIP_SIZE:
-           amiga_chip_size = *(const int *)data;
-           break;
-
-       case BI_AMIGA_VBLANK:
-           amiga_vblank = *(const unsigned char *)data;
-           break;
-
-       case BI_AMIGA_PSFREQ:
-           amiga_psfreq = *(const unsigned char *)data;
-           break;
-
-       case BI_AMIGA_AUTOCON:
-#ifdef CONFIG_ZORRO
-           if (zorro_num_autocon < ZORRO_NUM_AUTO) {
-               const struct ConfigDev *cd = (struct ConfigDev *)data;
-               struct zorro_dev *dev = &zorro_autocon[zorro_num_autocon++];
-               dev->rom = cd->cd_Rom;
-               dev->slotaddr = cd->cd_SlotAddr;
-               dev->slotsize = cd->cd_SlotSize;
-               dev->resource.start = (unsigned long)cd->cd_BoardAddr;
-               dev->resource.end = dev->resource.start+cd->cd_BoardSize-1;
-           } else
-               printk("amiga_parse_bootinfo: too many AutoConfig devices\n");
-#endif /* CONFIG_ZORRO */
-           break;
-
-       case BI_AMIGA_SERPER:
-           /* serial port period: ignored here */
-           break;
-
-       case BI_AMIGA_PUP_BRIDGE:
-           powerup_PCI_present = *(const unsigned short *)data;
-           break;
-
-       case BI_AMIGA_BPPC_SCSI:
-           powerup_BPPCPLUS_present = *(const unsigned short *)data;
-           break;
-
-       default:
-           unknown = 1;
-    }
-    return(unknown);
-}
-
-    /*
-     *  Identify builtin hardware
-     */
-
-static void __init amiga_identify(void)
-{
-  /* Fill in some default values, if necessary */
-  if (amiga_eclock == 0)
-    amiga_eclock = 709379;
-
-  memset(&amiga_hw_present, 0, sizeof(amiga_hw_present));
-
-  printk("Amiga hardware found: ");
-  if (amiga_model >= AMI_500 && amiga_model <= AMI_DRACO) {
-    printk("[%s] ", amiga_models[amiga_model-AMI_500]);
-    strcat(amiga_model_name, amiga_models[amiga_model-AMI_500]);
-  }
-
-  switch(amiga_model) {
-  case AMI_UNKNOWN:
-    goto Generic;
-
-  case AMI_600:
-  case AMI_1200:
-    AMIGAHW_SET(A1200_IDE);
-    AMIGAHW_SET(PCMCIA);
-  case AMI_500:
-  case AMI_500PLUS:
-  case AMI_1000:
-  case AMI_2000:
-  case AMI_2500:
-    AMIGAHW_SET(A2000_CLK);    /* Is this correct for all models? */
-    goto Generic;
-
-  case AMI_3000:
-  case AMI_3000T:
-    AMIGAHW_SET(AMBER_FF);
-    AMIGAHW_SET(MAGIC_REKICK);
-    /* fall through */
-  case AMI_3000PLUS:
-    AMIGAHW_SET(A3000_SCSI);
-    AMIGAHW_SET(A3000_CLK);
-    AMIGAHW_SET(ZORRO3);
-    goto Generic;
-
-  case AMI_4000T:
-    AMIGAHW_SET(A4000_SCSI);
-    /* fall through */
-  case AMI_4000:
-    AMIGAHW_SET(A4000_IDE);
-    AMIGAHW_SET(A3000_CLK);
-    AMIGAHW_SET(ZORRO3);
-    goto Generic;
-
-  case AMI_CDTV:
-  case AMI_CD32:
-    AMIGAHW_SET(CD_ROM);
-    AMIGAHW_SET(A2000_CLK);             /* Is this correct? */
-    goto Generic;
-
-  Generic:
-    AMIGAHW_SET(AMI_VIDEO);
-    AMIGAHW_SET(AMI_BLITTER);
-    AMIGAHW_SET(AMI_AUDIO);
-    AMIGAHW_SET(AMI_FLOPPY);
-    AMIGAHW_SET(AMI_KEYBOARD);
-    AMIGAHW_SET(AMI_MOUSE);
-    AMIGAHW_SET(AMI_SERIAL);
-    AMIGAHW_SET(AMI_PARALLEL);
-    AMIGAHW_SET(CHIP_RAM);
-    AMIGAHW_SET(PAULA);
-
-    switch(amiga_chipset) {
-    case CS_OCS:
-    case CS_ECS:
-    case CS_AGA:
-      switch (amiga_custom.deniseid & 0xf) {
-      case 0x0c:
-       AMIGAHW_SET(DENISE_HR);
-       break;
-      case 0x08:
-       AMIGAHW_SET(LISA);
-       break;
-      }
-      break;
-    default:
-      AMIGAHW_SET(DENISE);
-      break;
-    }
-    switch ((amiga_custom.vposr>>8) & 0x7f) {
-    case 0x00:
-      AMIGAHW_SET(AGNUS_PAL);
-      break;
-    case 0x10:
-      AMIGAHW_SET(AGNUS_NTSC);
-      break;
-    case 0x20:
-    case 0x21:
-      AMIGAHW_SET(AGNUS_HR_PAL);
-      break;
-    case 0x30:
-    case 0x31:
-      AMIGAHW_SET(AGNUS_HR_NTSC);
-      break;
-    case 0x22:
-    case 0x23:
-      AMIGAHW_SET(ALICE_PAL);
-      break;
-    case 0x32:
-    case 0x33:
-      AMIGAHW_SET(ALICE_NTSC);
-      break;
-    }
-    AMIGAHW_SET(ZORRO);
-    break;
-
-  case AMI_DRACO:
-    panic("No support for Draco yet");
-
-  default:
-    panic("Unknown Amiga Model");
-  }
-
-#define AMIGAHW_ANNOUNCE(name, str)                    \
-  if (AMIGAHW_PRESENT(name))                           \
-    printk(str)
-
-  AMIGAHW_ANNOUNCE(AMI_VIDEO, "VIDEO ");
-  AMIGAHW_ANNOUNCE(AMI_BLITTER, "BLITTER ");
-  AMIGAHW_ANNOUNCE(AMBER_FF, "AMBER_FF ");
-  AMIGAHW_ANNOUNCE(AMI_AUDIO, "AUDIO ");
-  AMIGAHW_ANNOUNCE(AMI_FLOPPY, "FLOPPY ");
-  AMIGAHW_ANNOUNCE(A3000_SCSI, "A3000_SCSI ");
-  AMIGAHW_ANNOUNCE(A4000_SCSI, "A4000_SCSI ");
-  AMIGAHW_ANNOUNCE(A1200_IDE, "A1200_IDE ");
-  AMIGAHW_ANNOUNCE(A4000_IDE, "A4000_IDE ");
-  AMIGAHW_ANNOUNCE(CD_ROM, "CD_ROM ");
-  AMIGAHW_ANNOUNCE(AMI_KEYBOARD, "KEYBOARD ");
-  AMIGAHW_ANNOUNCE(AMI_MOUSE, "MOUSE ");
-  AMIGAHW_ANNOUNCE(AMI_SERIAL, "SERIAL ");
-  AMIGAHW_ANNOUNCE(AMI_PARALLEL, "PARALLEL ");
-  AMIGAHW_ANNOUNCE(A2000_CLK, "A2000_CLK ");
-  AMIGAHW_ANNOUNCE(A3000_CLK, "A3000_CLK ");
-  AMIGAHW_ANNOUNCE(CHIP_RAM, "CHIP_RAM ");
-  AMIGAHW_ANNOUNCE(PAULA, "PAULA ");
-  AMIGAHW_ANNOUNCE(DENISE, "DENISE ");
-  AMIGAHW_ANNOUNCE(DENISE_HR, "DENISE_HR ");
-  AMIGAHW_ANNOUNCE(LISA, "LISA ");
-  AMIGAHW_ANNOUNCE(AGNUS_PAL, "AGNUS_PAL ");
-  AMIGAHW_ANNOUNCE(AGNUS_NTSC, "AGNUS_NTSC ");
-  AMIGAHW_ANNOUNCE(AGNUS_HR_PAL, "AGNUS_HR_PAL ");
-  AMIGAHW_ANNOUNCE(AGNUS_HR_NTSC, "AGNUS_HR_NTSC ");
-  AMIGAHW_ANNOUNCE(ALICE_PAL, "ALICE_PAL ");
-  AMIGAHW_ANNOUNCE(ALICE_NTSC, "ALICE_NTSC ");
-  AMIGAHW_ANNOUNCE(MAGIC_REKICK, "MAGIC_REKICK ");
-  AMIGAHW_ANNOUNCE(PCMCIA, "PCMCIA ");
-  if (AMIGAHW_PRESENT(ZORRO))
-    printk("ZORRO%s ", AMIGAHW_PRESENT(ZORRO3) ? "3" : "");
-  printk("\n");
-
-#undef AMIGAHW_ANNOUNCE
-}
-
-    /*
-     *  Setup the Amiga configuration info
-     */
-
-void __init config_amiga(void)
-{
-  int i;
-
-  amiga_debug_init();
-  amiga_identify();
-
-  /* Some APUS boxes may have PCI memory, but ... */
-  iomem_resource.name = "Memory";
-  for (i = 0; i < 4; i++)
-    request_resource(&iomem_resource, &((struct resource *)&mb_resources)[i]);
-
-  mach_sched_init      = amiga_sched_init;
-  mach_init_IRQ        = amiga_init_IRQ;
-#ifndef CONFIG_APUS
-  mach_default_handler = &amiga_default_handler;
-  mach_request_irq     = amiga_request_irq;
-  mach_free_irq        = amiga_free_irq;
-  enable_irq           = amiga_enable_irq;
-  disable_irq          = amiga_disable_irq;
-#endif
-  mach_get_model       = amiga_get_model;
-  mach_get_hardware_list = amiga_get_hardware_list;
-  mach_gettimeoffset   = amiga_gettimeoffset;
-  if (AMIGAHW_PRESENT(A3000_CLK)){
-    mach_gettod  = a3000_gettod;
-    rtc_resource.name = "A3000 RTC";
-    request_resource(&iomem_resource, &rtc_resource);
-  }
-  else{ /* if (AMIGAHW_PRESENT(A2000_CLK)) */
-    mach_gettod  = a2000_gettod;
-    rtc_resource.name = "A2000 RTC";
-    request_resource(&iomem_resource, &rtc_resource);
-  }
-
-  mach_max_dma_address = 0xffffffff; /*
-                                     * default MAX_DMA=0xffffffff
-                                     * on all machines. If we don't
-                                     * do so, the SCSI code will not
-                                     * be able to allocate any mem
-                                     * for transfers, unless we are
-                                     * dealing with a Z2 mem only
-                                     * system.                  /Jes
-                                     */
-
-  mach_hwclk           = amiga_hwclk;
-  mach_set_clock_mmss  = amiga_set_clock_mmss;
-  mach_reset           = amiga_reset;
-#ifdef CONFIG_HEARTBEAT
-  mach_heartbeat = amiga_heartbeat;
-#endif
-
-  /* Fill in the clock values (based on the 700 kHz E-Clock) */
-  amiga_masterclock = 40*amiga_eclock; /* 28 MHz */
-  amiga_colorclock = 5*amiga_eclock;   /* 3.5 MHz */
-
-  /* clear all DMA bits */
-  amiga_custom.dmacon = DMAF_ALL;
-  /* ensure that the DMA master bit is set */
-  amiga_custom.dmacon = DMAF_SETCLR | DMAF_MASTER;
-
-  /* request all RAM */
-  for (i = 0; i < m68k_num_memory; i++) {
-    ram_resource[i].name =
-      (m68k_memory[i].addr >= 0x01000000) ? "32-bit Fast RAM" :
-      (m68k_memory[i].addr < 0x00c00000) ? "16-bit Fast RAM" :
-      "16-bit Slow RAM";
-    ram_resource[i].start = m68k_memory[i].addr;
-    ram_resource[i].end = m68k_memory[i].addr+m68k_memory[i].size-1;
-    request_resource(&iomem_resource, &ram_resource[i]);
-  }
-
-  /* initialize chipram allocator */
-  amiga_chip_init ();
-
-  /* debugging using chipram */
-  if (!strcmp( m68k_debug_device, "mem" )){
-         if (!AMIGAHW_PRESENT(CHIP_RAM))
-                 printk("Warning: no chipram present for debugging\n");
-         else {
-                 amiga_savekmsg_init();
-                 amiga_console_driver.write = amiga_mem_console_write;
-                 register_console(&amiga_console_driver);
-         }
-  }
-
-  /* our beloved beeper */
-  if (AMIGAHW_PRESENT(AMI_AUDIO))
-         amiga_init_sound();
-
-  /*
-   * if it is an A3000, set the magic bit that forces
-   * a hard rekick
-   */
-  if (AMIGAHW_PRESENT(MAGIC_REKICK))
-         *(unsigned char *)ZTWO_VADDR(0xde0002) |= 0x80;
-}
-
-static unsigned short jiffy_ticks;
-
-static void __init amiga_sched_init(irqreturn_t (*timer_routine)(int, void *,
-                                               struct pt_regs *))
-{
-       static struct resource sched_res = {
-           "timer", 0x00bfd400, 0x00bfd5ff,
-       };
-       jiffy_ticks = (amiga_eclock+HZ/2)/HZ;
-
-       if (request_resource(&mb_resources._ciab, &sched_res))
-           printk("Cannot allocate ciab.ta{lo,hi}\n");
-       ciab.cra &= 0xC0;   /* turn off timer A, continuous mode, from Eclk */
-       ciab.talo = jiffy_ticks % 256;
-       ciab.tahi = jiffy_ticks / 256;
-
-       /* install interrupt service routine for CIAB Timer A
-        *
-        * Please don't change this to use ciaa, as it interferes with the
-        * SCSI code. We'll have to take a look at this later
-        */
-       request_irq(IRQ_AMIGA_CIAB_TA, timer_routine, 0, "timer", NULL);
-       /* start timer */
-       ciab.cra |= 0x11;
-}
-
-#define TICK_SIZE 10000
-
-extern unsigned char cia_get_irq_mask(unsigned int irq);
-
-/* This is always executed with interrupts disabled.  */
-static unsigned long amiga_gettimeoffset (void)
-{
-       unsigned short hi, lo, hi2;
-       unsigned long ticks, offset = 0;
-
-       /* read CIA B timer A current value */
-       hi  = ciab.tahi;
-       lo  = ciab.talo;
-       hi2 = ciab.tahi;
-
-       if (hi != hi2) {
-               lo = ciab.talo;
-               hi = hi2;
-       }
-
-       ticks = hi << 8 | lo;
-
-       if (ticks > jiffy_ticks / 2)
-               /* check for pending interrupt */
-               if (cia_get_irq_mask(IRQ_AMIGA_CIAB) & CIA_ICR_TA)
-                       offset = 10000;
-
-       ticks = jiffy_ticks - ticks;
-       ticks = (10000 * ticks) / jiffy_ticks;
-
-       return ticks + offset;
-}
-
-static void a3000_gettod (int *yearp, int *monp, int *dayp,
-                         int *hourp, int *minp, int *secp)
-{
-       volatile struct tod3000 *tod = TOD_3000;
-
-       tod->cntrl1 = TOD3000_CNTRL1_HOLD;
-
-       *secp  = tod->second1 * 10 + tod->second2;
-       *minp  = tod->minute1 * 10 + tod->minute2;
-       *hourp = tod->hour1   * 10 + tod->hour2;
-       *dayp  = tod->day1    * 10 + tod->day2;
-       *monp  = tod->month1  * 10 + tod->month2;
-       *yearp = tod->year1   * 10 + tod->year2;
-
-       tod->cntrl1 = TOD3000_CNTRL1_FREE;
-}
-
-static void a2000_gettod (int *yearp, int *monp, int *dayp,
-                         int *hourp, int *minp, int *secp)
-{
-       volatile struct tod2000 *tod = TOD_2000;
-
-       tod->cntrl1 = TOD2000_CNTRL1_HOLD;
-
-       while (tod->cntrl1 & TOD2000_CNTRL1_BUSY)
-               ;
-
-       *secp  = tod->second1     * 10 + tod->second2;
-       *minp  = tod->minute1     * 10 + tod->minute2;
-       *hourp = (tod->hour1 & 3) * 10 + tod->hour2;
-       *dayp  = tod->day1        * 10 + tod->day2;
-       *monp  = tod->month1      * 10 + tod->month2;
-       *yearp = tod->year1       * 10 + tod->year2;
-
-       if (!(tod->cntrl3 & TOD2000_CNTRL3_24HMODE)){
-               if (!(tod->hour1 & TOD2000_HOUR1_PM) && *hourp == 12)
-                       *hourp = 0;
-               else if ((tod->hour1 & TOD2000_HOUR1_PM) && *hourp != 12)
-                       *hourp += 12;
-       }
-
-       tod->cntrl1 &= ~TOD2000_CNTRL1_HOLD;
-}
-
-static int amiga_hwclk(int op, struct hwclk_time *t)
-{
-       if (AMIGAHW_PRESENT(A3000_CLK)) {
-               volatile struct tod3000 *tod = TOD_3000;
-
-               tod->cntrl1 = TOD3000_CNTRL1_HOLD;
-
-               if (!op) { /* read */
-                       t->sec  = tod->second1 * 10 + tod->second2;
-                       t->min  = tod->minute1 * 10 + tod->minute2;
-                       t->hour = tod->hour1   * 10 + tod->hour2;
-                       t->day  = tod->day1    * 10 + tod->day2;
-                       t->wday = tod->weekday;
-                       t->mon  = tod->month1  * 10 + tod->month2 - 1;
-                       t->year = tod->year1   * 10 + tod->year2;
-                       if (t->year <= 69)
-                               t->year += 100;
-               } else {
-                       tod->second1 = t->sec / 10;
-                       tod->second2 = t->sec % 10;
-                       tod->minute1 = t->min / 10;
-                       tod->minute2 = t->min % 10;
-                       tod->hour1   = t->hour / 10;
-                       tod->hour2   = t->hour % 10;
-                       tod->day1    = t->day / 10;
-                       tod->day2    = t->day % 10;
-                       if (t->wday != -1)
-                               tod->weekday = t->wday;
-                       tod->month1  = (t->mon + 1) / 10;
-                       tod->month2  = (t->mon + 1) % 10;
-                       if (t->year >= 100)
-                               t->year -= 100;
-                       tod->year1   = t->year / 10;
-                       tod->year2   = t->year % 10;
-               }
-
-               tod->cntrl1 = TOD3000_CNTRL1_FREE;
-       } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
-               volatile struct tod2000 *tod = TOD_2000;
-
-               tod->cntrl1 = TOD2000_CNTRL1_HOLD;
-       
-               while (tod->cntrl1 & TOD2000_CNTRL1_BUSY)
-                       ;
-
-               if (!op) { /* read */
-                       t->sec  = tod->second1     * 10 + tod->second2;
-                       t->min  = tod->minute1     * 10 + tod->minute2;
-                       t->hour = (tod->hour1 & 3) * 10 + tod->hour2;
-                       t->day  = tod->day1        * 10 + tod->day2;
-                       t->wday = tod->weekday;
-                       t->mon  = tod->month1      * 10 + tod->month2 - 1;
-                       t->year = tod->year1       * 10 + tod->year2;
-                       if (t->year <= 69)
-                               t->year += 100;
-
-                       if (!(tod->cntrl3 & TOD2000_CNTRL3_24HMODE)){
-                               if (!(tod->hour1 & TOD2000_HOUR1_PM) && t->hour == 12)
-                                       t->hour = 0;
-                               else if ((tod->hour1 & TOD2000_HOUR1_PM) && t->hour != 12)
-                                       t->hour += 12;
-                       }
-               } else {
-                       tod->second1 = t->sec / 10;
-                       tod->second2 = t->sec % 10;
-                       tod->minute1 = t->min / 10;
-                       tod->minute2 = t->min % 10;
-                       if (tod->cntrl3 & TOD2000_CNTRL3_24HMODE)
-                               tod->hour1 = t->hour / 10;
-                       else if (t->hour >= 12)
-                               tod->hour1 = TOD2000_HOUR1_PM +
-                                       (t->hour - 12) / 10;
-                       else
-                               tod->hour1 = t->hour / 10;
-                       tod->hour2   = t->hour % 10;
-                       tod->day1    = t->day / 10;
-                       tod->day2    = t->day % 10;
-                       if (t->wday != -1)
-                               tod->weekday = t->wday;
-                       tod->month1  = (t->mon + 1) / 10;
-                       tod->month2  = (t->mon + 1) % 10;
-                       if (t->year >= 100)
-                               t->year -= 100;
-                       tod->year1   = t->year / 10;
-                       tod->year2   = t->year % 10;
-               }
-
-               tod->cntrl1 &= ~TOD2000_CNTRL1_HOLD;
-       }
-
-       return 0;
-}
-
-static int amiga_set_clock_mmss (unsigned long nowtime)
-{
-       short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60;
-
-       if (AMIGAHW_PRESENT(A3000_CLK)) {
-               volatile struct tod3000 *tod = TOD_3000;
-
-               tod->cntrl1 = TOD3000_CNTRL1_HOLD;
-
-               tod->second1 = real_seconds / 10;
-               tod->second2 = real_seconds % 10;
-               tod->minute1 = real_minutes / 10;
-               tod->minute2 = real_minutes % 10;
-
-               tod->cntrl1 = TOD3000_CNTRL1_FREE;
-       } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
-               volatile struct tod2000 *tod = TOD_2000;
-
-               tod->cntrl1 = TOD2000_CNTRL1_HOLD;
-       
-               while (tod->cntrl1 & TOD2000_CNTRL1_BUSY)
-                       ;
-
-               tod->second1 = real_seconds / 10;
-               tod->second2 = real_seconds % 10;
-               tod->minute1 = real_minutes / 10;
-               tod->minute2 = real_minutes % 10;
-
-               tod->cntrl1 &= ~TOD2000_CNTRL1_HOLD;
-       }
-
-       return 0;
-}
-
-static NORET_TYPE void amiga_reset( void )
-    ATTRIB_NORET;
-
-static void amiga_reset (void)
-{
-  for (;;);
-}
-
-
-    /*
-     *  Debugging
-     */
-
-#define SAVEKMSG_MAXMEM                128*1024
-
-#define SAVEKMSG_MAGIC1                0x53415645      /* 'SAVE' */
-#define SAVEKMSG_MAGIC2                0x4B4D5347      /* 'KMSG' */
-
-struct savekmsg {
-    unsigned long magic1;              /* SAVEKMSG_MAGIC1 */
-    unsigned long magic2;              /* SAVEKMSG_MAGIC2 */
-    unsigned long magicptr;            /* address of magic1 */
-    unsigned long size;
-    char data[0];
-};
-
-static struct savekmsg *savekmsg = NULL;
-
-static void amiga_mem_console_write(struct console *co, const char *s,
-                                   unsigned int count)
-{
-    if (savekmsg->size+count <= SAVEKMSG_MAXMEM-sizeof(struct savekmsg)) {
-        memcpy(savekmsg->data+savekmsg->size, s, count);
-        savekmsg->size += count;
-    }
-}
-
-static void amiga_savekmsg_init(void)
-{
-    static struct resource debug_res = { "Debug" };
-
-    savekmsg = amiga_chip_alloc_res(SAVEKMSG_MAXMEM, &debug_res);
-    savekmsg->magic1 = SAVEKMSG_MAGIC1;
-    savekmsg->magic2 = SAVEKMSG_MAGIC2;
-    savekmsg->magicptr = virt_to_phys(savekmsg);
-    savekmsg->size = 0;
-}
-
-static void amiga_serial_putc(char c)
-{
-    amiga_custom.serdat = (unsigned char)c | 0x100;
-    mb();
-    while (!(amiga_custom.serdatr & 0x2000))
-       ;
-}
-
-void amiga_serial_console_write(struct console *co, const char *s,
-                                      unsigned int count)
-{
-#if 0 /* def CONFIG_KGDB */
-       /* FIXME:APUS GDB doesn't seem to like O-packages before it is
-           properly connected with the target. */
-       __gdb_output_string (s, count);
-#else
-       while (count--) {
-               if (*s == '\n')
-                       amiga_serial_putc('\r');
-               amiga_serial_putc(*s++);
-       }
-#endif
-}
-
-#ifdef CONFIG_SERIAL_CONSOLE
-void amiga_serial_puts(const char *s)
-{
-    amiga_serial_console_write(NULL, s, strlen(s));
-}
-
-int amiga_serial_console_wait_key(struct console *co)
-{
-    int ch;
-
-    while (!(amiga_custom.intreqr & IF_RBF))
-       barrier();
-    ch = amiga_custom.serdatr & 0xff;
-    /* clear the interrupt, so that another character can be read */
-    amiga_custom.intreq = IF_RBF;
-    return ch;
-}
-
-void amiga_serial_gets(struct console *co, char *s, int len)
-{
-    int ch, cnt = 0;
-
-    while (1) {
-       ch = amiga_serial_console_wait_key(co);
-
-       /* Check for backspace. */
-       if (ch == 8 || ch == 127) {
-           if (cnt == 0) {
-               amiga_serial_putc('\007');
-               continue;
-           }
-           cnt--;
-           amiga_serial_puts("\010 \010");
-           continue;
-       }
-
-       /* Check for enter. */
-       if (ch == 10 || ch == 13)
-           break;
-
-       /* See if line is too long. */
-       if (cnt >= len + 1) {
-           amiga_serial_putc(7);
-           cnt--;
-           continue;
-       }
-
-       /* Store and echo character. */
-       s[cnt++] = ch;
-       amiga_serial_putc(ch);
-    }
-    /* Print enter. */
-    amiga_serial_puts("\r\n");
-    s[cnt] = 0;
-}
-#endif
-
-static void __init amiga_debug_init(void)
-{
-       if (!strcmp( m68k_debug_device, "ser" )) {
-               /* no initialization required (?) */
-               amiga_console_driver.write = amiga_serial_console_write;
-               register_console(&amiga_console_driver);
-       }
-}
-
-#ifdef CONFIG_HEARTBEAT
-static void amiga_heartbeat(int on)
-{
-    if (on)
-       ciaa.pra &= ~2;
-    else
-       ciaa.pra |= 2;
-}
-#endif
-
-    /*
-     *  Amiga specific parts of /proc
-     */
-
-static void amiga_get_model(char *model)
-{
-    strcpy(model, amiga_model_name);
-}
-
-
-static int amiga_get_hardware_list(char *buffer)
-{
-    int len = 0;
-
-    if (AMIGAHW_PRESENT(CHIP_RAM))
-       len += sprintf(buffer+len, "Chip RAM:\t%ldK\n", amiga_chip_size>>10);
-    len += sprintf(buffer+len, "PS Freq:\t%dHz\nEClock Freq:\t%ldHz\n",
-                  amiga_psfreq, amiga_eclock);
-    if (AMIGAHW_PRESENT(AMI_VIDEO)) {
-       char *type;
-       switch(amiga_chipset) {
-           case CS_OCS:
-               type = "OCS";
-               break;
-           case CS_ECS:
-               type = "ECS";
-               break;
-           case CS_AGA:
-               type = "AGA";
-               break;
-           default:
-               type = "Old or Unknown";
-               break;
-       }
-       len += sprintf(buffer+len, "Graphics:\t%s\n", type);
-    }
-
-#define AMIGAHW_ANNOUNCE(name, str)                    \
-    if (AMIGAHW_PRESENT(name))                         \
-       len += sprintf (buffer+len, "\t%s\n", str)
-
-    len += sprintf (buffer + len, "Detected hardware:\n");
-
-    AMIGAHW_ANNOUNCE(AMI_VIDEO, "Amiga Video");
-    AMIGAHW_ANNOUNCE(AMI_BLITTER, "Blitter");
-    AMIGAHW_ANNOUNCE(AMBER_FF, "Amber Flicker Fixer");
-    AMIGAHW_ANNOUNCE(AMI_AUDIO, "Amiga Audio");
-    AMIGAHW_ANNOUNCE(AMI_FLOPPY, "Floppy Controller");
-    AMIGAHW_ANNOUNCE(A3000_SCSI, "SCSI Controller WD33C93 (A3000 style)");
-    AMIGAHW_ANNOUNCE(A4000_SCSI, "SCSI Controller NCR53C710 (A4000T style)");
-    AMIGAHW_ANNOUNCE(A1200_IDE, "IDE Interface (A1200 style)");
-    AMIGAHW_ANNOUNCE(A4000_IDE, "IDE Interface (A4000 style)");
-    AMIGAHW_ANNOUNCE(CD_ROM, "Internal CD ROM drive");
-    AMIGAHW_ANNOUNCE(AMI_KEYBOARD, "Keyboard");
-    AMIGAHW_ANNOUNCE(AMI_MOUSE, "Mouse Port");
-    AMIGAHW_ANNOUNCE(AMI_SERIAL, "Serial Port");
-    AMIGAHW_ANNOUNCE(AMI_PARALLEL, "Parallel Port");
-    AMIGAHW_ANNOUNCE(A2000_CLK, "Hardware Clock (A2000 style)");
-    AMIGAHW_ANNOUNCE(A3000_CLK, "Hardware Clock (A3000 style)");
-    AMIGAHW_ANNOUNCE(CHIP_RAM, "Chip RAM");
-    AMIGAHW_ANNOUNCE(PAULA, "Paula 8364");
-    AMIGAHW_ANNOUNCE(DENISE, "Denise 8362");
-    AMIGAHW_ANNOUNCE(DENISE_HR, "Denise 8373");
-    AMIGAHW_ANNOUNCE(LISA, "Lisa 8375");
-    AMIGAHW_ANNOUNCE(AGNUS_PAL, "Normal/Fat PAL Agnus 8367/8371");
-    AMIGAHW_ANNOUNCE(AGNUS_NTSC, "Normal/Fat NTSC Agnus 8361/8370");
-    AMIGAHW_ANNOUNCE(AGNUS_HR_PAL, "Fat Hires PAL Agnus 8372");
-    AMIGAHW_ANNOUNCE(AGNUS_HR_NTSC, "Fat Hires NTSC Agnus 8372");
-    AMIGAHW_ANNOUNCE(ALICE_PAL, "PAL Alice 8374");
-    AMIGAHW_ANNOUNCE(ALICE_NTSC, "NTSC Alice 8374");
-    AMIGAHW_ANNOUNCE(MAGIC_REKICK, "Magic Hard Rekick");
-    AMIGAHW_ANNOUNCE(PCMCIA, "PCMCIA Slot");
-    if (AMIGAHW_PRESENT(ZORRO))
-       len += sprintf(buffer+len, "\tZorro II%s AutoConfig: %d Expansion "
-                                  "Device%s\n",
-                      AMIGAHW_PRESENT(ZORRO3) ? "I" : "",
-                      zorro_num_autocon, zorro_num_autocon == 1 ? "" : "s");
-
-#undef AMIGAHW_ANNOUNCE
-
-    return(len);
-}
-
-#ifdef CONFIG_APUS
-int get_hardware_list(char *buffer)
-{
-       extern int get_cpuinfo(char *buffer);
-       int len = 0;
-       char model[80];
-       u_long mem;
-       int i;
-
-       if (mach_get_model)
-               mach_get_model(model);
-       else
-               strcpy(model, "Unknown PowerPC");
-
-       len += sprintf(buffer+len, "Model:\t\t%s\n", model);
-       len += get_cpuinfo(buffer+len);
-       for (mem = 0, i = 0; i < m68k_realnum_memory; i++)
-               mem += m68k_memory[i].size;
-       len += sprintf(buffer+len, "System Memory:\t%ldK\n", mem>>10);
-
-       if (mach_get_hardware_list)
-               len += mach_get_hardware_list(buffer+len);
-
-       return(len);
-}
-#endif
diff --git a/arch/ppc/amiga/ints.c b/arch/ppc/amiga/ints.c
deleted file mode 100644 (file)
index 083a174..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Linux/m68k general interrupt handling code from arch/m68k/kernel/ints.c
- *  Needed to drive the m68k emulating IRQ hardware on the PowerUp boards.
- */
-
-#include <linux/types.h>
-#include <linux/sched.h>
-#include <linux/kernel_stat.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/seq_file.h>
-
-#include <asm/setup.h>
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/traps.h>
-#include <asm/page.h>
-#include <asm/machdep.h>
-
-/* table for system interrupt handlers */
-static irq_handler_t irq_list[SYS_IRQS];
-
-static const char *default_names[SYS_IRQS] = {
-       "spurious int", "int1 handler", "int2 handler", "int3 handler",
-       "int4 handler", "int5 handler", "int6 handler", "int7 handler"
-};
-
-/* The number of spurious interrupts */
-volatile unsigned int num_spurious;
-
-#define NUM_IRQ_NODES 100
-static irq_node_t nodes[NUM_IRQ_NODES];
-
-
-/*
- * void init_IRQ(void)
- *
- * Parameters: None
- *
- * Returns:    Nothing
- *
- * This function should be called during kernel startup to initialize
- * the IRQ handling routines.
- */
-
-__init
-void m68k_init_IRQ(void)
-{
-       int i;
-
-       for (i = 0; i < SYS_IRQS; i++) {
-               if (mach_default_handler)
-                       irq_list[i].handler = (*mach_default_handler)[i];
-               irq_list[i].flags   = 0;
-               irq_list[i].dev_id  = NULL;
-               irq_list[i].devname = default_names[i];
-       }
-
-       for (i = 0; i < NUM_IRQ_NODES; i++)
-               nodes[i].handler = NULL;
-
-       mach_init_IRQ ();
-}
-
-irq_node_t *new_irq_node(void)
-{
-       irq_node_t *node;
-       short i;
-
-       for (node = nodes, i = NUM_IRQ_NODES-1; i >= 0; node++, i--)
-               if (!node->handler)
-                       return node;
-
-       printk ("new_irq_node: out of nodes\n");
-       return NULL;
-}
-
-int sys_request_irq(unsigned int irq,
-                    void (*handler)(int, void *, struct pt_regs *),
-                    unsigned long flags, const char *devname, void *dev_id)
-{
-       if (irq < IRQ1 || irq > IRQ7) {
-               printk("%s: Incorrect IRQ %d from %s\n",
-                      __FUNCTION__, irq, devname);
-               return -ENXIO;
-       }
-
-#if 0
-       if (!(irq_list[irq].flags & IRQ_FLG_STD)) {
-               if (irq_list[irq].flags & IRQ_FLG_LOCK) {
-                       printk("%s: IRQ %d from %s is not replaceable\n",
-                              __FUNCTION__, irq, irq_list[irq].devname);
-                       return -EBUSY;
-               }
-               if (!(flags & IRQ_FLG_REPLACE)) {
-                       printk("%s: %s can't replace IRQ %d from %s\n",
-                              __FUNCTION__, devname, irq, irq_list[irq].devname);
-                       return -EBUSY;
-               }
-       }
-#endif
-
-       irq_list[irq].handler = handler;
-       irq_list[irq].flags   = flags;
-       irq_list[irq].dev_id  = dev_id;
-       irq_list[irq].devname = devname;
-       return 0;
-}
-
-void sys_free_irq(unsigned int irq, void *dev_id)
-{
-       if (irq < IRQ1 || irq > IRQ7) {
-               printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
-               return;
-       }
-
-       if (irq_list[irq].dev_id != dev_id)
-               printk("%s: Removing probably wrong IRQ %d from %s\n",
-                      __FUNCTION__, irq, irq_list[irq].devname);
-
-       irq_list[irq].handler = (*mach_default_handler)[irq];
-       irq_list[irq].flags   = 0;
-       irq_list[irq].dev_id  = NULL;
-       irq_list[irq].devname = default_names[irq];
-}
-
-asmlinkage void process_int(unsigned long vec, struct pt_regs *fp)
-{
-       if (vec >= VEC_INT1 && vec <= VEC_INT7 && !MACH_IS_BVME6000) {
-               vec -= VEC_SPUR;
-               kstat_cpu(0).irqs[vec]++;
-               irq_list[vec].handler(vec, irq_list[vec].dev_id, fp);
-       } else {
-               if (mach_process_int)
-                       mach_process_int(vec, fp);
-               else
-                       panic("Can't process interrupt vector %ld\n", vec);
-               return;
-       }
-}
-
-int m68k_get_irq_list(struct seq_file *p, void *v)
-{
-       int i;
-
-       /* autovector interrupts */
-       if (mach_default_handler) {
-               for (i = 0; i < SYS_IRQS; i++) {
-                       seq_printf(p, "auto %2d: %10u ", i,
-                                      i ? kstat_cpu(0).irqs[i] : num_spurious);
-                       seq_puts(p, "  ");
-                       seq_printf(p, "%s\n", irq_list[i].devname);
-               }
-       }
-
-       mach_get_irq_list(p, v);
-       return 0;
-}
diff --git a/arch/ppc/amiga/pcmcia.c b/arch/ppc/amiga/pcmcia.c
deleted file mode 100644 (file)
index 5d29dc6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include "../../m68k/amiga/pcmcia.c"
diff --git a/arch/ppc/amiga/time.c b/arch/ppc/amiga/time.c
deleted file mode 100644 (file)
index 8c880c0..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-
-#include <asm/machdep.h>
-#include <asm/io.h>
-
-#include <linux/timex.h>
-
-unsigned long m68k_get_rtc_time(void)
-{
-       unsigned int year, mon, day, hour, min, sec;
-
-       extern void arch_gettod(int *year, int *mon, int *day, int *hour,
-                               int *min, int *sec);
-
-       arch_gettod (&year, &mon, &day, &hour, &min, &sec);
-
-       if ((year += 1900) < 1970)
-               year += 100;
-
-       return mktime(year, mon, day, hour, min, sec);
-}
-
-int m68k_set_rtc_time(unsigned long nowtime)
-{
-  if (mach_set_clock_mmss)
-    return mach_set_clock_mmss (nowtime);
-  return -1;
-}
-
-void apus_heartbeat (void)
-{
-#ifdef CONFIG_HEARTBEAT
-       static unsigned cnt = 0, period = 0, dist = 0;
-
-       if (cnt == 0 || cnt == dist)
-                mach_heartbeat( 1 );
-       else if (cnt == 7 || cnt == dist+7)
-                mach_heartbeat( 0 );
-
-       if (++cnt > period) {
-                cnt = 0;
-                /* The hyperbolic function below modifies the heartbeat period
-                 * length in dependency of the current (5min) load. It goes
-                 * through the points f(0)=126, f(1)=86, f(5)=51,
-                 * f(inf)->30. */
-                period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30;
-                dist = period / 4;
-       }
-#endif
-       /* should be made smarter */
-       ppc_md.heartbeat_count = 1;
-}
index 840bff2a45fb8bcaf2c06eb252bb0dbe769ae303..3b46792d7b8b45c66b6e302a8b4611e12b4ce23f 100644 (file)
@@ -752,7 +752,9 @@ embed_config(bd_t ** bdp)
        static const unsigned long congruence_classes = 256;
        unsigned long addr;
        unsigned long dccr;
+       uint8_t* cp;
        bd_t *bd;
+       int i;
 
        /*
         * Invalidate the data cache if the data cache is turned off.
@@ -778,6 +780,12 @@ embed_config(bd_t ** bdp)
        bd->bi_intfreq = XPAR_CORE_CLOCK_FREQ_HZ;
        bd->bi_busfreq = XPAR_PLB_CLOCK_FREQ_HZ;
        bd->bi_pci_busfreq = XPAR_PCI_0_CLOCK_FREQ_HZ;
+
+       /* Copy the default ethernet address */
+       cp = (u_char *)def_enet_addr;
+       for (i=0; i<6; i++)
+               bd->bi_enetaddr[i] = *cp++;
+
        timebase_period_ns = 1000000000 / bd->bi_tbfreq;
        /* see bi_tbfreq definition in arch/ppc/platforms/4xx/xilinx_ml300.h */
 }
index 8a08ad397ed571aadb9a04f4da28193c14bb6cea..d5a00eb0e4eb973d7ae913bcdf6b9dd306d8b7f7 100644 (file)
@@ -89,7 +89,9 @@ load_kernel(unsigned long load_addr, int num_words, unsigned long cksum, bd_t *b
         * initialize the serial console port.
         */
        embed_config(&bp);
-#if defined(CONFIG_SERIAL_CPM_CONSOLE) || defined(CONFIG_SERIAL_8250_CONSOLE)
+#if defined(CONFIG_SERIAL_CPM_CONSOLE) || \
+    defined(CONFIG_SERIAL_8250_CONSOLE) || \
+    defined(CONFIG_SERIAL_UARTLITE_CONSOLE)
        com_port = serial_init(0, bp);
 #endif
 
index 0eae1eab38d48b5bf07eb980d35ccb46dd8c226d..ca1743e3e912d5ddc1ce0ee642a80530116ca4e1 100644 (file)
 
 #define UARTLITE_BASEADDR ((void*)(XPAR_UARTLITE_0_BASEADDR))
 
+unsigned long
+serial_init(int chan, void *ignored)
+{
+       /* Clear the RX FIFO */
+       out_be32(UARTLITE_BASEADDR + 0x0C, 0x2);
+       return 0;
+}
+
 void
 serial_putc(unsigned long com_port, unsigned char c)
 {
diff --git a/arch/ppc/configs/apus_defconfig b/arch/ppc/configs/apus_defconfig
deleted file mode 100644 (file)
index e224525..0000000
+++ /dev/null
@@ -1,920 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_MMU=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_HAVE_DEC_LOCK=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-
-#
-# General setup
-#
-CONFIG_SWAP=y
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_EMBEDDED is not set
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-CONFIG_KMOD=y
-
-#
-# Platform support
-#
-CONFIG_PPC=y
-CONFIG_PPC32=y
-CONFIG_6xx=y
-# CONFIG_40x is not set
-# CONFIG_POWER3 is not set
-# CONFIG_8xx is not set
-
-#
-# IBM 4xx options
-#
-# CONFIG_8260 is not set
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_PPC_STD_MMU=y
-CONFIG_SERIAL_CONSOLE=y
-# CONFIG_PPC_MULTIPLATFORM is not set
-CONFIG_APUS=y
-# CONFIG_WILLOW_2 is not set
-# CONFIG_PCORE is not set
-# CONFIG_POWERPMC250 is not set
-# CONFIG_EV64260 is not set
-# CONFIG_SPRUCE is not set
-# CONFIG_LOPEC is not set
-# CONFIG_MCPN765 is not set
-# CONFIG_MVME5100 is not set
-# CONFIG_PPLUS is not set
-# CONFIG_PRPMC750 is not set
-# CONFIG_PRPMC800 is not set
-# CONFIG_SANDPOINT is not set
-# CONFIG_ADIR is not set
-# CONFIG_K2 is not set
-# CONFIG_PAL4 is not set
-# CONFIG_GEMINI is not set
-# CONFIG_SMP is not set
-# CONFIG_PREEMPT is not set
-# CONFIG_ALTIVEC is not set
-# CONFIG_TAU is not set
-# CONFIG_CPU_FREQ is not set
-
-#
-# General setup
-#
-# CONFIG_HIGHMEM is not set
-CONFIG_PCI=y
-CONFIG_PCI_DOMAINS=y
-CONFIG_PCI_PERMEDIA=y
-CONFIG_KCORE_ELF=y
-CONFIG_BINFMT_ELF=y
-CONFIG_KERNEL_ELF=y
-CONFIG_BINFMT_MISC=m
-CONFIG_PCI_LEGACY_PROC=y
-CONFIG_PCI_NAMES=y
-# CONFIG_HOTPLUG is not set
-
-#
-# Parallel port support
-#
-CONFIG_PARPORT=m
-# CONFIG_PARPORT_PC is not set
-CONFIG_PARPORT_AMIGA=m
-# CONFIG_PARPORT_MFC3 is not set
-# CONFIG_PARPORT_OTHER is not set
-# CONFIG_PARPORT_1284 is not set
-CONFIG_PPC601_SYNC_FIX=y
-# CONFIG_CMDLINE_BOOL is not set
-CONFIG_AMIGA=y
-CONFIG_ZORRO=y
-CONFIG_ABSTRACT_CONSOLE=y
-CONFIG_APUS_FAST_EXCEPT=y
-CONFIG_AMIGA_PCMCIA=y
-CONFIG_AMIGA_BUILTIN_SERIAL=y
-CONFIG_GVPIOEXT=y
-CONFIG_GVPIOEXT_LP=m
-CONFIG_GVPIOEXT_PLIP=m
-CONFIG_MULTIFACE_III_TTY=y
-CONFIG_A2232=y
-CONFIG_WHIPPET_SERIAL=y
-CONFIG_APNE=y
-CONFIG_HEARTBEAT=y
-CONFIG_PROC_HARDWARE=y
-CONFIG_ZORRO_NAMES=y
-
-#
-# 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
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNP is not set
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-CONFIG_AMIGA_FLOPPY=y
-CONFIG_AMIGA_Z2RAM=m
-# CONFIG_PARIDE is not set
-# CONFIG_BLK_CPQ_DA is not set
-# CONFIG_BLK_CPQ_CISS_DA is not set
-# CONFIG_BLK_DEV_DAC960 is not set
-# CONFIG_BLK_DEV_UMEM is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=m
-CONFIG_MD_LINEAR=m
-CONFIG_MD_RAID0=m
-CONFIG_MD_RAID1=m
-CONFIG_MD_RAID5=m
-# CONFIG_MD_MULTIPATH is not set
-CONFIG_BLK_DEV_DM=m
-
-#
-# ATA/IDE/MFM/RLL support
-#
-CONFIG_IDE=y
-
-#
-# IDE, ATA and ATAPI Block devices
-#
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_HD is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# CONFIG_IDEDISK_STROKE is not set
-CONFIG_BLK_DEV_IDECD=y
-CONFIG_BLK_DEV_IDEFLOPPY=y
-CONFIG_BLK_DEV_IDESCSI=m
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_BLK_DEV_IDEPCI is not set
-CONFIG_BLK_DEV_GAYLE=y
-CONFIG_BLK_DEV_IDEDOUBLER=y
-CONFIG_BLK_DEV_BUDDHA=y
-
-#
-# SCSI support
-#
-CONFIG_SCSI=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=y
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-CONFIG_BLK_DEV_SR=y
-CONFIG_BLK_DEV_SR_VENDOR=y
-CONFIG_CHR_DEV_SG=m
-
-#
-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-#
-# CONFIG_SCSI_MULTI_LUN is not set
-# CONFIG_SCSI_REPORT_LUNS is not set
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_AM53C974 is not set
-# CONFIG_SCSI_MEGARAID is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_CPQFCTS is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_EATA_PIO is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_PPA is not set
-# CONFIG_SCSI_IMM is not set
-# CONFIG_SCSI_NCR53C7xx is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_NCR53C8XX is not set
-# CONFIG_SCSI_SYM53C8XX is not set
-# CONFIG_SCSI_PCI2000 is not set
-# CONFIG_SCSI_PCI2220I is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
-# CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-CONFIG_A3000_SCSI=y
-CONFIG_A4000T_SCSI=y
-CONFIG_A2091_SCSI=y
-CONFIG_GVP11_SCSI=y
-CONFIG_CYBERSTORM_SCSI=y
-CONFIG_CYBERSTORMII_SCSI=y
-CONFIG_BLZ2060_SCSI=y
-CONFIG_BLZ1230_SCSI=y
-CONFIG_FASTLANE_SCSI=y
-CONFIG_A4091_SCSI=y
-CONFIG_WARPENGINE_SCSI=y
-CONFIG_BLZ603EPLUS_SCSI=y
-CONFIG_OKTAGON_SCSI=y
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=m
-CONFIG_PACKET_MMAP=y
-CONFIG_NETLINK_DEV=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_INET_ECN 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
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-CONFIG_IP_NF_FTP=m
-CONFIG_IP_NF_IRC=m
-CONFIG_IP_NF_TFTP=m
-CONFIG_IP_NF_AMANDA=m
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_LIMIT=m
-CONFIG_IP_NF_MATCH_MAC=m
-# CONFIG_IP_NF_MATCH_PKTTYPE is not set
-CONFIG_IP_NF_MATCH_MARK=m
-CONFIG_IP_NF_MATCH_MULTIPORT=m
-CONFIG_IP_NF_MATCH_TOS=m
-# CONFIG_IP_NF_MATCH_ECN is not set
-# CONFIG_IP_NF_MATCH_DSCP is not set
-# CONFIG_IP_NF_MATCH_AH_ESP is not set
-CONFIG_IP_NF_MATCH_LENGTH=m
-CONFIG_IP_NF_MATCH_TTL=m
-CONFIG_IP_NF_MATCH_TCPMSS=m
-CONFIG_IP_NF_MATCH_HELPER=m
-CONFIG_IP_NF_MATCH_STATE=m
-CONFIG_IP_NF_MATCH_CONNTRACK=m
-CONFIG_IP_NF_MATCH_UNCLEAN=m
-CONFIG_IP_NF_MATCH_OWNER=m
-CONFIG_IP_NF_FILTER=m
-CONFIG_IP_NF_TARGET_REJECT=m
-CONFIG_IP_NF_TARGET_MIRROR=m
-CONFIG_IP_NF_NAT=m
-CONFIG_IP_NF_NAT_NEEDED=y
-CONFIG_IP_NF_TARGET_MASQUERADE=m
-CONFIG_IP_NF_TARGET_REDIRECT=m
-CONFIG_IP_NF_NAT_SNMP_BASIC=m
-CONFIG_IP_NF_NAT_IRC=m
-CONFIG_IP_NF_NAT_FTP=m
-CONFIG_IP_NF_NAT_TFTP=m
-CONFIG_IP_NF_NAT_AMANDA=m
-CONFIG_IP_NF_MANGLE=m
-CONFIG_IP_NF_TARGET_TOS=m
-CONFIG_IP_NF_TARGET_ECN=m
-CONFIG_IP_NF_TARGET_DSCP=m
-CONFIG_IP_NF_TARGET_MARK=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
-CONFIG_IP_NF_ARPTABLES=m
-CONFIG_IP_NF_ARPFILTER=m
-CONFIG_IP_NF_COMPAT_IPCHAINS=m
-# CONFIG_IP_NF_COMPAT_IPFWADM is not set
-# CONFIG_IPV6 is not set
-# CONFIG_XFRM_USER is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IPV6_SCTP__=y
-# CONFIG_IP_SCTP is not set
-# CONFIG_ATM is not set
-# CONFIG_VLAN_8021Q is not set
-# CONFIG_LLC is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_HW_FLOWCONTROL is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-CONFIG_DUMMY=m
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
-# CONFIG_ETHERTAP is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-# CONFIG_OAKNET is not set
-CONFIG_ARIADNE=y
-# CONFIG_ZORRO8390 is not set
-CONFIG_A2065=y
-CONFIG_HYDRA=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_NET_VENDOR_3COM is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_E1000 is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_TIGON3 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_IXGB is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PLIP=m
-CONFIG_PPP=y
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=y
-CONFIG_PPP_SYNC_TTY=y
-CONFIG_PPP_DEFLATE=y
-CONFIG_PPP_BSDCOMP=y
-CONFIG_PPPOE=y
-CONFIG_SLIP=y
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-CONFIG_SLIP_MODE_SLIP6=y
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Token Ring devices (depends on LLC=y)
-#
-# CONFIG_NET_FC is not set
-# CONFIG_RCPCI is not set
-# CONFIG_SHAPER is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# Amateur Radio support
-#
-# CONFIG_HAMRADIO is not set
-
-#
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-
-#
-# ISDN subsystem
-#
-# CONFIG_ISDN_BOOL is not set
-
-#
-# Graphics support
-#
-CONFIG_FB=y
-# CONFIG_FB_CIRRUS is not set
-CONFIG_FB_PM2=y
-# CONFIG_FB_PM2_FIFO_DISCONNECT is not set
-# CONFIG_FB_PM2_PCI is not set
-CONFIG_FB_PM2_CVPPC=y
-CONFIG_FB_CYBER2000=y
-CONFIG_FB_AMIGA=y
-CONFIG_FB_AMIGA_OCS=y
-CONFIG_FB_AMIGA_ECS=y
-CONFIG_FB_AMIGA_AGA=y
-CONFIG_FB_CYBER=y
-CONFIG_FB_VIRGE=y
-CONFIG_FB_RETINAZ3=y
-CONFIG_FB_FM2=y
-# CONFIG_FB_CT65550 is not set
-# CONFIG_FB_IMSTT is not set
-# CONFIG_FB_S3TRIO is not set
-# CONFIG_FB_VGA16 is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-CONFIG_LOGO_LINUX_CLUT224=y
-
-#
-# Old CD-ROM drivers (not SCSI, not IDE)
-#
-# CONFIG_CD_NO_IDESCSI is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=m
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-CONFIG_INPUT_JOYDEV=m
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=m
-CONFIG_INPUT_EVBUG=m
-
-#
-# Input I/O drivers
-#
-# CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
-CONFIG_SERIO=y
-# CONFIG_SERIO_I8042 is not set
-CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=m
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-CONFIG_KEYBOARD_AMIGA=m
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=m
-CONFIG_MOUSE_SERIAL=m
-CONFIG_MOUSE_AMIGA=m
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_PCSPKR is not set
-CONFIG_INPUT_UINPUT=m
-
-#
-# Macintosh device drivers
-#
-
-#
-# Character devices
-#
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-# CONFIG_SERIAL_8250 is not set
-
-#
-# Non-8250 serial port support
-#
-CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-CONFIG_PRINTER=m
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
-
-#
-# I2C support
-#
-# CONFIG_I2C is not set
-
-#
-# I2C Hardware Sensors Mainboard support
-#
-
-#
-# I2C Hardware Sensors Chip support
-#
-# CONFIG_I2C_SENSOR is not set
-
-#
-# Mice
-#
-CONFIG_BUSMOUSE=y
-# CONFIG_QIC02_TAPE is not set
-
-#
-# 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
-# CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-# CONFIG_FTAPE is not set
-# CONFIG_AGP is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR 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_XFS_FS is not set
-CONFIG_MINIX_FS=y
-CONFIG_ROMFS_FS=y
-# CONFIG_QUOTA is not set
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-# CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS=y
-# CONFIG_DEVPTS_FS_XATTR is not set
-CONFIG_TMPFS=y
-CONFIG_RAMFS=y
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-CONFIG_AFFS_FS=y
-CONFIG_HFS_FS=y
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_NFS_V4 is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFSD_TCP is not set
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
-CONFIG_SMB_FS=m
-# CONFIG_SMB_NLS_DEFAULT is not set
-# CONFIG_CIFS is not set
-# CONFIG_NCP_FS is not set
-CONFIG_CODA_FS=m
-# CONFIG_INTERMEZZO_FS is not set
-# CONFIG_AFS_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=y
-CONFIG_ATARI_PARTITION=y
-# CONFIG_MAC_PARTITION is not set
-CONFIG_MSDOS_PARTITION=y
-CONFIG_BSD_DISKLABEL=y
-# CONFIG_MINIX_SUBPARTITION is not set
-CONFIG_SOLARIS_X86_PARTITION=y
-CONFIG_UNIXWARE_DISKLABEL=y
-# CONFIG_LDM_PARTITION is not set
-# CONFIG_NEC98_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
-CONFIG_SMB_NLS=y
-CONFIG_NLS=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS_DEFAULT="iso8859-1"
-CONFIG_NLS_CODEPAGE_437=m
-CONFIG_NLS_CODEPAGE_737=m
-CONFIG_NLS_CODEPAGE_775=m
-CONFIG_NLS_CODEPAGE_850=m
-CONFIG_NLS_CODEPAGE_852=m
-CONFIG_NLS_CODEPAGE_855=m
-CONFIG_NLS_CODEPAGE_857=m
-CONFIG_NLS_CODEPAGE_860=m
-CONFIG_NLS_CODEPAGE_861=m
-CONFIG_NLS_CODEPAGE_862=m
-CONFIG_NLS_CODEPAGE_863=m
-CONFIG_NLS_CODEPAGE_864=m
-CONFIG_NLS_CODEPAGE_865=m
-CONFIG_NLS_CODEPAGE_866=m
-CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_936=m
-CONFIG_NLS_CODEPAGE_950=m
-CONFIG_NLS_CODEPAGE_932=m
-CONFIG_NLS_CODEPAGE_949=m
-CONFIG_NLS_CODEPAGE_874=m
-CONFIG_NLS_ISO8859_8=m
-# CONFIG_NLS_CODEPAGE_1250 is not set
-CONFIG_NLS_CODEPAGE_1251=m
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-CONFIG_NLS_KOI8_R=m
-CONFIG_NLS_KOI8_U=m
-CONFIG_NLS_UTF8=m
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-CONFIG_DMASOUND_PAULA=m
-CONFIG_DMASOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-# CONFIG_SND is not set
-
-#
-# Open Sound System
-#
-CONFIG_SOUND_PRIME=m
-# CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_CMPCI is not set
-# CONFIG_SOUND_EMU10K1 is not set
-# CONFIG_SOUND_FUSION is not set
-# CONFIG_SOUND_CS4281 is not set
-# CONFIG_SOUND_ES1370 is not set
-# CONFIG_SOUND_ES1371 is not set
-# CONFIG_SOUND_ESSSOLO1 is not set
-# CONFIG_SOUND_MAESTRO is not set
-# CONFIG_SOUND_MAESTRO3 is not set
-# CONFIG_SOUND_ICH is not set
-# CONFIG_SOUND_RME96XX is not set
-# CONFIG_SOUND_SONICVIBES is not set
-# CONFIG_SOUND_TRIDENT is not set
-# CONFIG_SOUND_MSNDCLAS is not set
-# CONFIG_SOUND_MSNDPIN is not set
-# CONFIG_SOUND_VIA82CXXX is not set
-CONFIG_SOUND_OSS=m
-CONFIG_SOUND_TRACEINIT=y
-CONFIG_SOUND_DMAP=y
-# CONFIG_SOUND_AD1816 is not set
-# CONFIG_SOUND_SGALAXY is not set
-# CONFIG_SOUND_ADLIB is not set
-# CONFIG_SOUND_ACI_MIXER is not set
-# CONFIG_SOUND_CS4232 is not set
-# CONFIG_SOUND_SSCAPE is not set
-# CONFIG_SOUND_GUS is not set
-CONFIG_SOUND_VMIDI=m
-# CONFIG_SOUND_TRIX is not set
-# CONFIG_SOUND_MSS is not set
-# CONFIG_SOUND_MPU401 is not set
-# CONFIG_SOUND_NM256 is not set
-# CONFIG_SOUND_MAD16 is not set
-# CONFIG_SOUND_PAS is not set
-# CONFIG_SOUND_PSS is not set
-# CONFIG_SOUND_SB is not set
-# CONFIG_SOUND_AWE32_SYNTH is not set
-# CONFIG_SOUND_WAVEFRONT is not set
-# CONFIG_SOUND_MAUI is not set
-# CONFIG_SOUND_YM3812 is not set
-# CONFIG_SOUND_OPL3SA1 is not set
-# CONFIG_SOUND_OPL3SA2 is not set
-# CONFIG_SOUND_YMFPCI is not set
-# CONFIG_SOUND_UART6850 is not set
-# CONFIG_SOUND_AEDSP16 is not set
-
-#
-# USB support
-#
-# CONFIG_USB is not set
-# CONFIG_USB_GADGET is not set
-
-#
-# Bluetooth support
-#
-# CONFIG_BT is not set
-
-#
-# Library routines
-#
-# CONFIG_CRC32 is not set
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-
-#
-# Kernel hacking
-#
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_KALLSYMS is not set
-
-#
-# Security options
-#
-# CONFIG_SECURITY is not set
-
-#
-# Cryptographic options
-#
-# CONFIG_CRYPTO is not set
index c7cb9d5f24a381911a85c74f78cd1bd1bb2d5ad5..1b0ec7202dd5470a939b7c9d933618f8c2c425a4 100644 (file)
 #include <asm/ppc_asm.h>
 #include <asm/asm-offsets.h>
 
-#ifdef CONFIG_APUS
-#include <asm/amigappc.h>
-#endif
-
 /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */
 #define LOAD_BAT(n, reg, RA, RB)       \
        /* see the comment for clear_bats() -- Cort */ \
@@ -128,14 +124,6 @@ __start:
  */
        bl      early_init
 
-#ifdef CONFIG_APUS
-/* On APUS the __va/__pa constants need to be set to the correct
- * values before continuing.
- */
-       mr      r4,r30
-       bl      fix_mem_constants
-#endif /* CONFIG_APUS */
-
 /* Switch MMU off, clear BATs and flush TLB. At this point, r3 contains
  * the physical address we are running at, returned by early_init()
  */
@@ -145,7 +133,7 @@ __after_mmu_off:
        bl      flush_tlbs
 
        bl      initial_bats
-#if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT)
+#ifdef CONFIG_BOOTX_TEXT
        bl      setup_disp_bat
 #endif
 
@@ -161,7 +149,6 @@ __after_mmu_off:
 #endif /* CONFIG_6xx */
 
 
-#ifndef CONFIG_APUS
 /*
  * We need to run with _start at physical address 0.
  * If the MMU is already turned on, we copy stuff to KERNELBASE,
@@ -172,7 +159,7 @@ __after_mmu_off:
        addis   r4,r3,KERNELBASE@h      /* current address of _start */
        cmpwi   0,r4,0                  /* are we already running at 0? */
        bne     relocate_kernel
-#endif /* CONFIG_APUS */
+
 /*
  * we now have the 1st 16M of ram mapped with the bats.
  * prep needs the mmu to be turned on here, but pmac already has it on.
@@ -812,85 +799,6 @@ copy_and_flush:
        addi    r6,r6,4
        blr
 
-#ifdef CONFIG_APUS
-/*
- * On APUS the physical base address of the kernel is not known at compile
- * time, which means the __pa/__va constants used are incorrect. In the
- * __init section is recorded the virtual addresses of instructions using
- * these constants, so all that has to be done is fix these before
- * continuing the kernel boot.
- *
- * r4 = The physical address of the kernel base.
- */
-fix_mem_constants:
-       mr      r10,r4
-       addis   r10,r10,-KERNELBASE@h    /* virt_to_phys constant */
-       neg     r11,r10                  /* phys_to_virt constant */
-
-       lis     r12,__vtop_table_begin@h
-       ori     r12,r12,__vtop_table_begin@l
-       add     r12,r12,r10              /* table begin phys address */
-       lis     r13,__vtop_table_end@h
-       ori     r13,r13,__vtop_table_end@l
-       add     r13,r13,r10              /* table end phys address */
-       subi    r12,r12,4
-       subi    r13,r13,4
-1:     lwzu    r14,4(r12)               /* virt address of instruction */
-       add     r14,r14,r10              /* phys address of instruction */
-       lwz     r15,0(r14)               /* instruction, now insert top */
-       rlwimi  r15,r10,16,16,31         /* half of vp const in low half */
-       stw     r15,0(r14)               /* of instruction and restore. */
-       dcbst   r0,r14                   /* write it to memory */
-       sync
-       icbi    r0,r14                   /* flush the icache line */
-       cmpw    r12,r13
-       bne     1b
-       sync                            /* additional sync needed on g4 */
-       isync
-
-/*
- * Map the memory where the exception handlers will
- * be copied to when hash constants have been patched.
- */
-#ifdef CONFIG_APUS_FAST_EXCEPT
-       lis     r8,0xfff0
-#else
-       lis     r8,0
-#endif
-       ori     r8,r8,0x2               /* 128KB, supervisor */
-       mtspr   SPRN_DBAT3U,r8
-       mtspr   SPRN_DBAT3L,r8
-
-       lis     r12,__ptov_table_begin@h
-       ori     r12,r12,__ptov_table_begin@l
-       add     r12,r12,r10              /* table begin phys address */
-       lis     r13,__ptov_table_end@h
-       ori     r13,r13,__ptov_table_end@l
-       add     r13,r13,r10              /* table end phys address */
-       subi    r12,r12,4
-       subi    r13,r13,4
-1:     lwzu    r14,4(r12)               /* virt address of instruction */
-       add     r14,r14,r10              /* phys address of instruction */
-       lwz     r15,0(r14)               /* instruction, now insert top */
-       rlwimi  r15,r11,16,16,31         /* half of pv const in low half*/
-       stw     r15,0(r14)               /* of instruction and restore. */
-       dcbst   r0,r14                   /* write it to memory */
-       sync
-       icbi    r0,r14                   /* flush the icache line */
-       cmpw    r12,r13
-       bne     1b
-
-       sync                            /* additional sync needed on g4 */
-       isync                           /* No speculative loading until now */
-       blr
-
-/***********************************************************************
- *  Please note that on APUS the exception handlers are located at the
- *  physical address 0xfff0000. For this reason, the exception handlers
- *  cannot use relative branches to access the code below.
- ***********************************************************************/
-#endif /* CONFIG_APUS */
-
 #ifdef CONFIG_SMP
        .globl  __secondary_start_pmac_0
 __secondary_start_pmac_0:
@@ -1043,19 +951,6 @@ start_here:
        bl      machine_init
        bl      MMU_init
 
-#ifdef CONFIG_APUS
-       /* Copy exception code to exception vector base on APUS. */
-       lis     r4,KERNELBASE@h
-#ifdef CONFIG_APUS_FAST_EXCEPT
-       lis     r3,0xfff0               /* Copy to 0xfff00000 */
-#else
-       lis     r3,0                    /* Copy to 0x00000000 */
-#endif
-       li      r5,0x4000               /* # bytes of memory to copy */
-       li      r6,0
-       bl      copy_and_flush          /* copy the first 0x4000 bytes */
-#endif  /* CONFIG_APUS */
-
 /*
  * Go back to running unmapped so we can load up new values
  * for SDR1 (hash table pointer) and the segment registers
@@ -1232,11 +1127,7 @@ initial_bats:
 #else
        ori     r8,r8,2                 /* R/W access */
 #endif /* CONFIG_SMP */
-#ifdef CONFIG_APUS
-       ori     r11,r11,BL_8M<<2|0x2    /* set up 8MB BAT registers for 604 */
-#else
        ori     r11,r11,BL_256M<<2|0x2  /* set up BAT registers for 604 */
-#endif /* CONFIG_APUS */
 
        mtspr   SPRN_DBAT0L,r8          /* N.B. 6xx (not 601) have valid */
        mtspr   SPRN_DBAT0U,r11         /* bit in upper BAT register */
@@ -1245,7 +1136,7 @@ initial_bats:
        isync
        blr
 
-#if !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT)
+#ifdef CONFIG_BOOTX_TEXT
 setup_disp_bat:
        /*
         * setup the display bat prepared for us in prom.c
@@ -1268,7 +1159,7 @@ setup_disp_bat:
        mtspr   SPRN_IBAT3U,r11
        blr
 
-#endif /* !defined(CONFIG_APUS) && defined(CONFIG_BOOTX_TEXT) */
+#endif /* defined(CONFIG_BOOTX_TEXT) */
 
 #ifdef CONFIG_8260
 /* Jump into the system reset for the rom.
index 7e44de5a26db447689bf1424ce750758893fa4f0..75bbc937ed7343215fb46baf62e6c33913b1e849 100644 (file)
@@ -227,16 +227,6 @@ skpinv:    addi    r4,r4,1                         /* Increment */
        lis     r4,interrupt_base@h     /* IVPR only uses the high 16-bits */
        mtspr   SPRN_IVPR,r4
 
-#ifdef CONFIG_440EP
-       /* Clear DAPUIB flag in CCR0 (enable APU between CPU and FPU) */
-       mfspr   r2,SPRN_CCR0
-       lis     r3,0xffef
-       ori     r3,r3,0xffff
-       and     r2,r2,r3
-       mtspr   SPRN_CCR0,r2
-       isync
-#endif
-
        /*
         * This is where the main kernel code starts.
         */
index 63f0a987139b4335b2255a76f5834ea47ac5dcb5..22494ec123ea4261511e525286e9593f8a5b636c 100644 (file)
@@ -60,8 +60,6 @@ long long __ashrdi3(long long, int);
 long long __ashldi3(long long, int);
 long long __lshrdi3(long long, int);
 
-extern unsigned long mm_ptov (unsigned long paddr);
-
 EXPORT_SYMBOL(clear_pages);
 EXPORT_SYMBOL(clear_user_page);
 EXPORT_SYMBOL(transfer_to_handler);
@@ -118,7 +116,6 @@ EXPORT_SYMBOL(_outsw_ns);
 EXPORT_SYMBOL(_insl_ns);
 EXPORT_SYMBOL(_outsl_ns);
 EXPORT_SYMBOL(iopa);
-EXPORT_SYMBOL(mm_ptov);
 EXPORT_SYMBOL(ioremap);
 #ifdef CONFIG_44x
 EXPORT_SYMBOL(ioremap64);
index 967c1ef59a6bd10f91abe56c95e3f6cb97faabd0..aac88c2f3db9d7d07b9b6e63e431f4fdb6a328b1 100644 (file)
@@ -25,7 +25,6 @@
 #include <asm/pgtable.h>
 #include <asm/bootinfo.h>
 #include <asm/setup.h>
-#include <asm/amigappc.h>
 #include <asm/smp.h>
 #include <asm/elf.h>
 #include <asm/cputable.h>
index c0aac3ff9e91443672e54dfbcf1419073de60b33..98c1212674f6e76c2953c5a9a8a5344bb6b94ca1 100644 (file)
@@ -91,6 +91,8 @@ SECTIONS
   . = ALIGN(8192);
   .data.init_task : { *(.data.init_task) }
 
+  NOTES
+
   . = ALIGN(4096);
   __init_begin = .;
   .init.text : {
index 35ebb6395ae3329d5117d4d0611d21e60d12a361..1f51e6c9450718fc8d7e47660a204d6cd587b062 100644 (file)
@@ -426,41 +426,3 @@ unsigned long iopa(unsigned long addr)
        return(pa);
 }
 
-/* This is will find the virtual address for a physical one....
- * Swiped from APUS, could be dangerous :-).
- * This is only a placeholder until I really find a way to make this
- * work.  -- Dan
- */
-unsigned long
-mm_ptov (unsigned long paddr)
-{
-       unsigned long ret;
-#if 0
-       if (paddr < 16*1024*1024)
-               ret = ZTWO_VADDR(paddr);
-       else {
-               int i;
-
-               for (i = 0; i < kmap_chunk_count;){
-                       unsigned long phys = kmap_chunks[i++];
-                       unsigned long size = kmap_chunks[i++];
-                       unsigned long virt = kmap_chunks[i++];
-                       if (paddr >= phys
-                           && paddr < (phys + size)){
-                               ret = virt + paddr - phys;
-                               goto exit;
-                       }
-               }
-       
-               ret = (unsigned long) __va(paddr);
-       }
-exit:
-#ifdef DEBUGPV
-       printk ("PTOV(%lx)=%lx\n", paddr, ret);
-#endif
-#else
-       ret = (unsigned long)paddr + KERNELBASE;
-#endif
-       return ret;
-}
-
index e17fad4706218224c41a7c21cef4748568e9acec..40f53fbe6d35c5d87978e2a40cf47a416e026e91 100644 (file)
@@ -2,10 +2,6 @@
 # Makefile for the linux kernel.
 #
 
-obj-$(CONFIG_APUS)             += apus_setup.o
-ifeq ($(CONFIG_APUS),y)
-obj-$(CONFIG_PCI)              += apus_pci.o
-endif
 obj-$(CONFIG_PPC_PREP)         += prep_pci.o prep_setup.o
 obj-$(CONFIG_PREP_RESIDUAL)    += residual.o
 obj-$(CONFIG_PQ2ADS)           += pq2ads.o
diff --git a/arch/ppc/platforms/apus_pci.c b/arch/ppc/platforms/apus_pci.c
deleted file mode 100644 (file)
index dc165f0..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) Michel Dänzer <michdaen@iiic.ethz.ch>
- *
- * APUS PCI routines.
- *
- * Currently, only B/CVisionPPC cards (Permedia2) are supported.
- *
- * Thanks to Geert Uytterhoeven for the idea:
- * Read values from given config space(s) for the first devices, -1 otherwise
- *
- */
-
-#ifdef CONFIG_AMIGA
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/delay.h>
-#include <linux/string.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <asm/pci-bridge.h>
-#include <asm/machdep.h>
-
-#include "apus_pci.h"
-
-
-/* These definitions are mostly adapted from pm2fb.c */
-
-#undef APUS_PCI_MASTER_DEBUG
-#ifdef APUS_PCI_MASTER_DEBUG
-#define DPRINTK(a,b...)        printk(KERN_DEBUG "apus_pci: %s: " a, __FUNCTION__ , ## b)
-#else
-#define DPRINTK(a,b...)
-#endif
-
-/*
- * The _DEFINITIVE_ memory mapping/unmapping functions.
- * This is due to the fact that they're changing soooo often...
- */
-#define DEFW()         wmb()
-#define DEFR()         rmb()
-#define DEFRW()                mb()
-
-#define DEVNO(d)       ((d)>>3)
-#define FNNO(d)                ((d)&7)
-
-
-extern unsigned long powerup_PCI_present;
-
-static struct pci_controller *apus_hose;
-
-
-void *pci_io_base(unsigned int bus)
-{
-       return 0;
-}
-
-
-int
-apus_pcibios_read_config(struct pci_bus *bus, int devfn, int offset,
-                        int len, u32 *val)
-{
-       int fnno = FNNO(devfn);
-       int devno = DEVNO(devfn);
-       volatile unsigned char *cfg_data;
-
-       if (bus->number > 0 || devno != 1) {
-               *val = ~0;
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       }
-       /* base address + function offset + offset ^ endianness conversion */
-       /* XXX the fnno<<5 bit seems wacky  -- paulus */
-       cfg_data = apus_hose->cfg_data + (fnno<<5) + (offset ^ (len - 1));
-       switch (len) {
-       case 1:
-               *val = readb(cfg_data);
-               break;
-       case 2:
-               *val = readw(cfg_data);
-               break;
-       default:
-               *val = readl(cfg_data);
-               break;
-       }
-
-       DPRINTK("read b: 0x%x, d: 0x%x, f: 0x%x, o: 0x%x, l: %d, v: 0x%x\n",
-               bus->number, devfn>>3, devfn&7, offset, len, *val);
-       return PCIBIOS_SUCCESSFUL;
-}
-
-int
-apus_pcibios_write_config(struct pci_bus *bus, int devfn, int offset,
-                         int len, u32 *val)
-{
-       int fnno = FNNO(devfn);
-       int devno = DEVNO(devfn);
-       volatile unsigned char *cfg_data;
-
-       if (bus->number > 0 || devno != 1) {
-               return PCIBIOS_DEVICE_NOT_FOUND;
-       }
-       /* base address + function offset + offset ^ endianness conversion */
-       /* XXX the fnno<<5 bit seems wacky  -- paulus */
-       cfg_data = apus_hose->cfg_data + (fnno<<5) + (offset ^ (len - 1));
-       switch (len) {
-       case 1:
-               writeb(val, cfg_data); DEFW();
-               break;
-       case 2:
-               writew(val, cfg_data); DEFW();
-               break;
-       default:
-               writel(val, cfg_data); DEFW();
-               break;
-       }
-
-       DPRINTK("write b: 0x%x, d: 0x%x, f: 0x%x, o: 0x%x, l: %d, v: 0x%x\n",
-               bus->number, devfn>>3, devfn&7, offset, len, val);
-       return PCIBIOS_SUCCESSFUL;
-}
-
-static struct pci_ops apus_pci_ops = {
-       apus_pcibios_read_config,
-       apus_pcibios_write_config
-};
-
-static struct resource pci_mem = { "B/CVisionPPC PCI mem", CVPPC_FB_APERTURE_ONE, CVPPC_PCI_CONFIG, IORESOURCE_MEM };
-
-void __init
-apus_pcibios_fixup(void)
-{
-/*     struct pci_dev *dev = pci_find_slot(0, 1<<3);
-       unsigned int reg, val, offset;*/
-
-       /* FIXME: interrupt? */
-       /*dev->interrupt = xxx;*/
-
-        request_resource(&iomem_resource, &pci_mem);
-       printk("%s: PCI mem resource requested\n", __FUNCTION__);
-}
-
-static void __init apus_pcibios_fixup_bus(struct pci_bus *bus)
-{
-        bus->resource[1] = &pci_mem;
-}
-
-
-/*
- * This is from pm2fb.c again
- *
- * Check if PCI (B/CVisionPPC) is available, initialize it and set up
- * the pcibios_* pointers
- */
-
-
-void __init
-apus_setup_pci_ptrs(void)
-{
-       if (!powerup_PCI_present) {
-               DPRINTK("no PCI bridge detected\n");
-               return;
-       }
-       DPRINTK("Phase5 B/CVisionPPC PCI bridge detected.\n");
-
-       apus_hose = pcibios_alloc_controller();
-       if (!apus_hose) {
-               printk("apus_pci: Can't allocate PCI controller structure\n");
-               return;
-       }
-
-       if (!(apus_hose->cfg_data = ioremap(CVPPC_PCI_CONFIG, 256))) {
-               printk("apus_pci: unable to map PCI config region\n");
-               return;
-       }
-
-       if (!(apus_hose->cfg_addr = ioremap(CSPPC_PCI_BRIDGE, 256))) {
-               printk("apus_pci: unable to map PCI bridge\n");
-               return;
-       }
-
-       writel(CSPPCF_BRIDGE_BIG_ENDIAN, apus_hose->cfg_addr + CSPPC_BRIDGE_ENDIAN);
-       DEFW();
-
-       writel(CVPPC_REGS_REGION,  apus_hose->cfg_data+ PCI_BASE_ADDRESS_0);
-       DEFW();
-       writel(CVPPC_FB_APERTURE_ONE, apus_hose->cfg_data + PCI_BASE_ADDRESS_1);
-       DEFW();
-       writel(CVPPC_FB_APERTURE_TWO, apus_hose->cfg_data + PCI_BASE_ADDRESS_2);
-       DEFW();
-       writel(CVPPC_ROM_ADDRESS, apus_hose->cfg_data + PCI_ROM_ADDRESS);
-       DEFW();
-
-       writel(0xef000000 | PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-               PCI_COMMAND_MASTER, apus_hose->cfg_data + PCI_COMMAND);
-       DEFW();
-
-       apus_hose->first_busno = 0;
-       apus_hose->last_busno = 0;
-       apus_hose->ops = &apus_pci_ops;
-       ppc_md.pcibios_fixup = apus_pcibios_fixup;
-       ppc_md.pcibios_fixup_bus = apus_pcibios_fixup_bus;
-
-       return;
-}
-
-#endif /* CONFIG_AMIGA */
diff --git a/arch/ppc/platforms/apus_pci.h b/arch/ppc/platforms/apus_pci.h
deleted file mode 100644 (file)
index f15974a..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Phase5 CybervisionPPC (TVP4020) definitions for the Permedia2 framebuffer
- * driver.
- *
- * Copyright (c) 1998-1999 Ilario Nardinocchi (nardinoc@CS.UniBO.IT)
- * --------------------------------------------------------------------------
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file README.legal in the main directory of this archive
- * for more details.
- */
-
-#ifndef APUS_PCI_H
-#define APUS_PCI_H
-
-
-#define CSPPC_PCI_BRIDGE               0xfffe0000
-#define CSPPC_BRIDGE_ENDIAN            0x0000
-#define CSPPC_BRIDGE_INT               0x0010
-
-#define        CVPPC_PCI_CONFIG                0xfffc0000
-#define CVPPC_ROM_ADDRESS              0xe2000001
-#define CVPPC_REGS_REGION              0xef000000
-#define CVPPC_FB_APERTURE_ONE          0xe0000000
-#define CVPPC_FB_APERTURE_TWO          0xe1000000
-#define CVPPC_FB_SIZE                  0x00800000
-
-/* CVPPC_BRIDGE_ENDIAN */
-#define CSPPCF_BRIDGE_BIG_ENDIAN       0x02
-
-/* CVPPC_BRIDGE_INT */
-#define CSPPCF_BRIDGE_ACTIVE_INT2      0x01
-
-
-#endif /* APUS_PCI_H */
diff --git a/arch/ppc/platforms/apus_setup.c b/arch/ppc/platforms/apus_setup.c
deleted file mode 100644 (file)
index 063274d..0000000
+++ /dev/null
@@ -1,798 +0,0 @@
-/*
- *  Copyright (C) 1998, 1999  Jesper Skov
- *
- *  Basically what is needed to replace functionality found in
- *  arch/m68k allowing Amiga drivers to work under APUS.
- *  Bits of code and/or ideas from arch/m68k and arch/ppc files.
- *
- * TODO:
- *  This file needs a *really* good cleanup. Restructure and optimize.
- *  Make sure it can be compiled for non-APUS configs. Begin to move
- *  Amiga specific stuff into mach/amiga.
- */
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/initrd.h>
-#include <linux/seq_file.h>
-
-/* Needs INITSERIAL call in head.S! */
-#undef APUS_DEBUG
-
-#include <asm/bootinfo.h>
-#include <asm/setup.h>
-#include <asm/amigahw.h>
-#include <asm/amigaints.h>
-#include <asm/amigappc.h>
-#include <asm/pgtable.h>
-#include <asm/dma.h>
-#include <asm/machdep.h>
-#include <asm/time.h>
-
-unsigned long m68k_machtype;
-char debug_device[6] = "";
-
-extern void amiga_init_IRQ(void);
-
-extern void apus_setup_pci_ptrs(void);
-
-void (*mach_sched_init) (void (*handler)(int, void *, struct pt_regs *)) __initdata = NULL;
-/* machine dependent irq functions */
-void (*mach_init_IRQ) (void) __initdata = NULL;
-void (*(*mach_default_handler)[]) (int, void *, struct pt_regs *) = NULL;
-void (*mach_get_model) (char *model) = NULL;
-int (*mach_get_hardware_list) (char *buffer) = NULL;
-int (*mach_get_irq_list) (struct seq_file *, void *) = NULL;
-void (*mach_process_int) (int, struct pt_regs *) = NULL;
-/* machine dependent timer functions */
-unsigned long (*mach_gettimeoffset) (void);
-void (*mach_gettod) (int*, int*, int*, int*, int*, int*);
-int (*mach_hwclk) (int, struct hwclk_time*) = NULL;
-int (*mach_set_clock_mmss) (unsigned long) = NULL;
-void (*mach_reset)( void );
-long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */
-#ifdef CONFIG_HEARTBEAT
-void (*mach_heartbeat) (int) = NULL;
-extern void apus_heartbeat (void);
-#endif
-
-extern unsigned long amiga_model;
-extern unsigned decrementer_count;/* count value for 1e6/HZ microseconds */
-extern unsigned count_period_num; /* 1 decrementer count equals */
-extern unsigned count_period_den; /* count_period_num / count_period_den us */
-
-int num_memory = 0;
-struct mem_info memory[NUM_MEMINFO];/* memory description */
-/* FIXME: Duplicate memory data to avoid conflicts with m68k shared code. */
-int m68k_realnum_memory = 0;
-struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
-
-struct mem_info ramdisk;
-
-extern void config_amiga(void);
-
-static int __60nsram = 0;
-
-/* for cpuinfo */
-static int __bus_speed = 0;
-static int __speed_test_failed = 0;
-
-/********************************************** COMPILE PROTECTION */
-/* Provide some stubs that links to Amiga specific functions.
- * This allows CONFIG_APUS to be removed from generic PPC files while
- * preventing link errors for other PPC targets.
- */
-unsigned long apus_get_rtc_time(void)
-{
-#ifdef CONFIG_APUS
-       extern unsigned long m68k_get_rtc_time(void);
-
-       return m68k_get_rtc_time ();
-#else
-       return 0;
-#endif
-}
-
-int apus_set_rtc_time(unsigned long nowtime)
-{
-#ifdef CONFIG_APUS
-       extern int m68k_set_rtc_time(unsigned long nowtime);
-
-       return m68k_set_rtc_time (nowtime);
-#else
-       return 0;
-#endif
-}
-
-/*********************************************************** SETUP */
-/* From arch/m68k/kernel/setup.c. */
-void __init apus_setup_arch(void)
-{
-#ifdef CONFIG_APUS
-       extern char cmd_line[];
-       int i;
-       char *p, *q;
-
-       /* Let m68k-shared code know it should do the Amiga thing. */
-       m68k_machtype = MACH_AMIGA;
-
-       /* Parse the command line for arch-specific options.
-        * For the m68k, this is currently only "debug=xxx" to enable printing
-        * certain kernel messages to some machine-specific device.  */
-       for( p = cmd_line; p && *p; ) {
-           i = 0;
-           if (!strncmp( p, "debug=", 6 )) {
-                   strlcpy( debug_device, p+6, sizeof(debug_device) );
-                   if ((q = strchr( debug_device, ' ' ))) *q = 0;
-                   i = 1;
-           } else if (!strncmp( p, "60nsram", 7 )) {
-                   APUS_WRITE (APUS_REG_WAITSTATE,
-                               REGWAITSTATE_SETRESET
-                               |REGWAITSTATE_PPCR
-                               |REGWAITSTATE_PPCW);
-                   __60nsram = 1;
-                   i = 1;
-           }
-
-           if (i) {
-               /* option processed, delete it */
-               if ((q = strchr( p, ' ' )))
-                   strcpy( p, q+1 );
-               else
-                   *p = 0;
-           } else {
-               if ((p = strchr( p, ' ' ))) ++p;
-           }
-       }
-
-       config_amiga();
-
-#if 0 /* Enable for logging - also include logging.o in Makefile rule */
-       {
-#define LOG_SIZE 4096
-               void* base;
-
-               /* Throw away some memory - the P5 firmare stomps on top
-                * of CHIP memory during bootup.
-                */
-               amiga_chip_alloc(0x1000);
-
-               base = amiga_chip_alloc(LOG_SIZE+sizeof(klog_data_t));
-               LOG_INIT(base, base+sizeof(klog_data_t), LOG_SIZE);
-       }
-#endif
-#endif
-}
-
-int
-apus_show_cpuinfo(struct seq_file *m)
-{
-       extern int __map_without_bats;
-       extern unsigned long powerup_PCI_present;
-
-       seq_printf(m, "machine\t\t: Amiga\n");
-       seq_printf(m, "bus speed\t: %d%s", __bus_speed,
-                  (__speed_test_failed) ? " [failed]\n" : "\n");
-       seq_printf(m, "using BATs\t: %s\n",
-                  (__map_without_bats) ? "No" : "Yes");
-       seq_printf(m, "ram speed\t: %dns\n", (__60nsram) ? 60 : 70);
-       seq_printf(m, "PCI bridge\t: %s\n",
-                  (powerup_PCI_present) ? "Yes" : "No");
-       return 0;
-}
-
-static void get_current_tb(unsigned long long *time)
-{
-       __asm __volatile ("1:mftbu 4      \n\t"
-                         "  mftb  5      \n\t"
-                         "  mftbu 6      \n\t"
-                         "  cmpw  4,6    \n\t"
-                         "  bne   1b     \n\t"
-                         "  stw   4,0(%0)\n\t"
-                         "  stw   5,4(%0)\n\t"
-                         :
-                         : "r" (time)
-                         : "r4", "r5", "r6");
-}
-
-
-void apus_calibrate_decr(void)
-{
-#ifdef CONFIG_APUS
-       unsigned long freq;
-
-       /* This algorithm for determining the bus speed was
-           contributed by Ralph Schmidt. */
-       unsigned long long start, stop;
-       int bus_speed;
-       int speed_test_failed = 0;
-
-       {
-               unsigned long loop = amiga_eclock / 10;
-
-               get_current_tb (&start);
-               while (loop--) {
-                       unsigned char tmp;
-
-                       tmp = ciaa.pra;
-               }
-               get_current_tb (&stop);
-       }
-
-       bus_speed = (((unsigned long)(stop-start))*10*4) / 1000000;
-       if (AMI_1200 == amiga_model)
-               bus_speed /= 2;
-
-       if ((bus_speed >= 47) && (bus_speed < 53)) {
-               bus_speed = 50;
-               freq = 12500000;
-       } else if ((bus_speed >= 57) && (bus_speed < 63)) {
-               bus_speed = 60;
-               freq = 15000000;
-       } else if ((bus_speed >= 63) && (bus_speed < 69)) {
-               bus_speed = 67;
-               freq = 16666667;
-       } else {
-               printk ("APUS: Unable to determine bus speed (%d). "
-                       "Defaulting to 50MHz", bus_speed);
-               bus_speed = 50;
-               freq = 12500000;
-               speed_test_failed = 1;
-       }
-
-       /* Ease diagnostics... */
-       {
-               extern int __map_without_bats;
-               extern unsigned long powerup_PCI_present;
-
-               printk ("APUS: BATs=%d, BUS=%dMHz",
-                       (__map_without_bats) ? 0 : 1,
-                       bus_speed);
-               if (speed_test_failed)
-                       printk ("[FAILED - please report]");
-
-               printk (", RAM=%dns, PCI bridge=%d\n",
-                       (__60nsram) ? 60 : 70,
-                       (powerup_PCI_present) ? 1 : 0);
-
-               /* print a bit more if asked politely... */
-               if (!(ciaa.pra & 0x40)){
-                       extern unsigned int bat_addrs[4][3];
-                       int b;
-                       for (b = 0; b < 4; ++b) {
-                               printk ("APUS: BAT%d ", b);
-                               printk ("%08x-%08x -> %08x\n",
-                                       bat_addrs[b][0],
-                                       bat_addrs[b][1],
-                                       bat_addrs[b][2]);
-                       }
-               }
-
-       }
-
-        printk("time_init: decrementer frequency = %lu.%.6lu MHz\n",
-              freq/1000000, freq%1000000);
-       tb_ticks_per_jiffy = freq / HZ;
-       tb_to_us = mulhwu_scale_factor(freq, 1000000);
-
-       __bus_speed = bus_speed;
-       __speed_test_failed = speed_test_failed;
-#endif
-}
-
-void arch_gettod(int *year, int *mon, int *day, int *hour,
-                int *min, int *sec)
-{
-#ifdef CONFIG_APUS
-       if (mach_gettod)
-               mach_gettod(year, mon, day, hour, min, sec);
-       else
-               *year = *mon = *day = *hour = *min = *sec = 0;
-#endif
-}
-
-/* for "kbd-reset" cmdline param */
-__init
-void kbd_reset_setup(char *str, int *ints)
-{
-}
-
-/*********************************************************** MEMORY */
-#define KMAP_MAX 32
-unsigned long kmap_chunks[KMAP_MAX*3];
-int kmap_chunk_count = 0;
-
-/* From pgtable.h */
-static __inline__ pte_t *my_find_pte(struct mm_struct *mm,unsigned long va)
-{
-       pgd_t *dir = 0;
-       pmd_t *pmd = 0;
-       pte_t *pte = 0;
-
-       va &= PAGE_MASK;
-
-       dir = pgd_offset( mm, va );
-       if (dir)
-       {
-               pmd = pmd_offset(dir, va & PAGE_MASK);
-               if (pmd && pmd_present(*pmd))
-               {
-                       pte = pte_offset(pmd, va);
-               }
-       }
-       return pte;
-}
-
-
-/* Again simulating an m68k/mm/kmap.c function. */
-void kernel_set_cachemode( unsigned long address, unsigned long size,
-                          unsigned int cmode )
-{
-       unsigned long mask, flags;
-
-       switch (cmode)
-       {
-       case IOMAP_FULL_CACHING:
-               mask = ~(_PAGE_NO_CACHE | _PAGE_GUARDED);
-               flags = 0;
-               break;
-       case IOMAP_NOCACHE_SER:
-               mask = ~0;
-               flags = (_PAGE_NO_CACHE | _PAGE_GUARDED);
-               break;
-       default:
-               panic ("kernel_set_cachemode() doesn't support mode %d\n",
-                      cmode);
-               break;
-       }
-
-       size /= PAGE_SIZE;
-       address &= PAGE_MASK;
-       while (size--)
-       {
-               pte_t *pte;
-
-               pte = my_find_pte(&init_mm, address);
-               if ( !pte )
-               {
-                       printk("pte NULL in kernel_set_cachemode()\n");
-                       return;
-               }
-
-                pte_val (*pte) &= mask;
-                pte_val (*pte) |= flags;
-                flush_tlb_page(find_vma(&init_mm,address),address);
-
-               address += PAGE_SIZE;
-       }
-}
-
-unsigned long mm_ptov (unsigned long paddr)
-{
-       unsigned long ret;
-       if (paddr < 16*1024*1024)
-               ret = ZTWO_VADDR(paddr);
-       else {
-               int i;
-
-               for (i = 0; i < kmap_chunk_count;){
-                       unsigned long phys = kmap_chunks[i++];
-                       unsigned long size = kmap_chunks[i++];
-                       unsigned long virt = kmap_chunks[i++];
-                       if (paddr >= phys
-                           && paddr < (phys + size)){
-                               ret = virt + paddr - phys;
-                               goto exit;
-                       }
-               }
-
-               ret = (unsigned long) __va(paddr);
-       }
-exit:
-#ifdef DEBUGPV
-       printk ("PTOV(%lx)=%lx\n", paddr, ret);
-#endif
-       return ret;
-}
-
-int mm_end_of_chunk (unsigned long addr, int len)
-{
-       if (memory[0].addr + memory[0].size == addr + len)
-               return 1;
-       return 0;
-}
-
-/*********************************************************** CACHE */
-
-#define L1_CACHE_BYTES 32
-#define MAX_CACHE_SIZE 8192
-void cache_push(__u32 addr, int length)
-{
-       addr = mm_ptov(addr);
-
-       if (MAX_CACHE_SIZE < length)
-               length = MAX_CACHE_SIZE;
-
-       while(length > 0){
-               __asm ("dcbf 0,%0\n\t"
-                      : : "r" (addr));
-               addr += L1_CACHE_BYTES;
-               length -= L1_CACHE_BYTES;
-       }
-       /* Also flush trailing block */
-       __asm ("dcbf 0,%0\n\t"
-              "sync \n\t"
-              : : "r" (addr));
-}
-
-void cache_clear(__u32 addr, int length)
-{
-       if (MAX_CACHE_SIZE < length)
-               length = MAX_CACHE_SIZE;
-
-       addr = mm_ptov(addr);
-
-       __asm ("dcbf 0,%0\n\t"
-              "sync \n\t"
-              "icbi 0,%0 \n\t"
-              "isync \n\t"
-              : : "r" (addr));
-
-       addr += L1_CACHE_BYTES;
-       length -= L1_CACHE_BYTES;
-
-       while(length > 0){
-               __asm ("dcbf 0,%0\n\t"
-                      "sync \n\t"
-                      "icbi 0,%0 \n\t"
-                      "isync \n\t"
-                      : : "r" (addr));
-               addr += L1_CACHE_BYTES;
-               length -= L1_CACHE_BYTES;
-       }
-
-       __asm ("dcbf 0,%0\n\t"
-              "sync \n\t"
-              "icbi 0,%0 \n\t"
-              "isync \n\t"
-              : : "r" (addr));
-}
-
-/****************************************************** from setup.c */
-void
-apus_restart(char *cmd)
-{
-       local_irq_disable();
-
-       APUS_WRITE(APUS_REG_LOCK,
-                  REGLOCK_BLACKMAGICK1|REGLOCK_BLACKMAGICK2);
-       APUS_WRITE(APUS_REG_LOCK,
-                  REGLOCK_BLACKMAGICK1|REGLOCK_BLACKMAGICK3);
-       APUS_WRITE(APUS_REG_LOCK,
-                  REGLOCK_BLACKMAGICK2|REGLOCK_BLACKMAGICK3);
-       APUS_WRITE(APUS_REG_SHADOW, REGSHADOW_SELFRESET);
-       APUS_WRITE(APUS_REG_RESET, REGRESET_AMIGARESET);
-       for(;;);
-}
-
-void
-apus_power_off(void)
-{
-       for (;;);
-}
-
-void
-apus_halt(void)
-{
-   apus_restart(NULL);
-}
-
-/****************************************************** IRQ stuff */
-
-static unsigned char last_ipl[8];
-
-int apus_get_irq(void)
-{
-       unsigned char ipl_emu, mask;
-       unsigned int level;
-
-       APUS_READ(APUS_IPL_EMU, ipl_emu);
-       level = (ipl_emu >> 3) & IPLEMU_IPLMASK;
-       mask = IPLEMU_SETRESET|IPLEMU_DISABLEINT|level;
-       level ^= 7;
-
-       /* Save previous IPL value */
-       if (last_ipl[level])
-               return -2;
-       last_ipl[level] = ipl_emu;
-
-       /* Set to current IPL value */
-       APUS_WRITE(APUS_IPL_EMU, mask);
-       APUS_WRITE(APUS_IPL_EMU, IPLEMU_DISABLEINT|level);
-
-
-#ifdef __INTERRUPT_DEBUG
-       printk("<%d:%d>", level, ~ipl_emu & IPLEMU_IPLMASK);
-#endif
-       return level + IRQ_AMIGA_AUTO;
-}
-
-void apus_end_irq(unsigned int irq)
-{
-       unsigned char ipl_emu;
-       unsigned int level = irq - IRQ_AMIGA_AUTO;
-#ifdef __INTERRUPT_DEBUG
-       printk("{%d}", ~last_ipl[level] & IPLEMU_IPLMASK);
-#endif
-       /* Restore IPL to the previous value */
-       ipl_emu = last_ipl[level] & IPLEMU_IPLMASK;
-       APUS_WRITE(APUS_IPL_EMU, IPLEMU_SETRESET|IPLEMU_DISABLEINT|ipl_emu);
-       last_ipl[level] = 0;
-       ipl_emu ^= 7;
-       APUS_WRITE(APUS_IPL_EMU, IPLEMU_DISABLEINT|ipl_emu);
-}
-
-/****************************************************** debugging */
-
-/* some serial hardware definitions */
-#define SDR_OVRUN   (1<<15)
-#define SDR_RBF     (1<<14)
-#define SDR_TBE     (1<<13)
-#define SDR_TSRE    (1<<12)
-
-#define AC_SETCLR   (1<<15)
-#define AC_UARTBRK  (1<<11)
-
-#define SER_DTR     (1<<7)
-#define SER_RTS     (1<<6)
-#define SER_DCD     (1<<5)
-#define SER_CTS     (1<<4)
-#define SER_DSR     (1<<3)
-
-static __inline__ void ser_RTSon(void)
-{
-    ciab.pra &= ~SER_RTS; /* active low */
-}
-
-int __debug_ser_out( unsigned char c )
-{
-       amiga_custom.serdat = c | 0x100;
-       mb();
-       while (!(amiga_custom.serdatr & 0x2000))
-               barrier();
-       return 1;
-}
-
-unsigned char __debug_ser_in( void )
-{
-       unsigned char c;
-
-       /* XXX: is that ok?? derived from amiga_ser.c... */
-       while( !(amiga_custom.intreqr & IF_RBF) )
-               barrier();
-       c = amiga_custom.serdatr;
-       /* clear the interrupt, so that another character can be read */
-       amiga_custom.intreq = IF_RBF;
-       return c;
-}
-
-int __debug_serinit( void )
-{
-       unsigned long flags;
-
-       local_irq_save(flags);
-
-       /* turn off Rx and Tx interrupts */
-       amiga_custom.intena = IF_RBF | IF_TBE;
-
-       /* clear any pending interrupt */
-       amiga_custom.intreq = IF_RBF | IF_TBE;
-
-       local_irq_restore(flags);
-
-       /*
-        * set the appropriate directions for the modem control flags,
-        * and clear RTS and DTR
-        */
-       ciab.ddra |= (SER_DTR | SER_RTS);   /* outputs */
-       ciab.ddra &= ~(SER_DCD | SER_CTS | SER_DSR);  /* inputs */
-
-#ifdef CONFIG_KGDB
-       /* turn Rx interrupts on for GDB */
-       amiga_custom.intena = IF_SETCLR | IF_RBF;
-       ser_RTSon();
-#endif
-
-       return 0;
-}
-
-void __debug_print_hex(unsigned long x)
-{
-       int i;
-       char hexchars[] = "0123456789ABCDEF";
-
-       for (i = 0; i < 8; i++) {
-               __debug_ser_out(hexchars[(x >> 28) & 15]);
-               x <<= 4;
-       }
-       __debug_ser_out('\n');
-       __debug_ser_out('\r');
-}
-
-void __debug_print_string(char* s)
-{
-       unsigned char c;
-       while((c = *s++))
-               __debug_ser_out(c);
-       __debug_ser_out('\n');
-       __debug_ser_out('\r');
-}
-
-static void apus_progress(char *s, unsigned short value)
-{
-       __debug_print_string(s);
-}
-
-/****************************************************** init */
-
-/* The number of spurious interrupts */
-volatile unsigned int num_spurious;
-
-extern struct irqaction amiga_sys_irqaction[AUTO_IRQS];
-
-
-extern void amiga_enable_irq(unsigned int irq);
-extern void amiga_disable_irq(unsigned int irq);
-
-struct hw_interrupt_type amiga_sys_irqctrl = {
-       .typename = "Amiga IPL",
-       .end = apus_end_irq,
-};
-
-struct hw_interrupt_type amiga_irqctrl = {
-       .typename = "Amiga    ",
-       .enable = amiga_enable_irq,
-       .disable = amiga_disable_irq,
-};
-
-#define HARDWARE_MAPPED_SIZE (512*1024)
-unsigned long __init apus_find_end_of_memory(void)
-{
-       int shadow = 0;
-       unsigned long total;
-
-       /* The memory size reported by ADOS excludes the 512KB
-          reserved for PPC exception registers and possibly 512KB
-          containing a shadow of the ADOS ROM. */
-       {
-               unsigned long size = memory[0].size;
-
-               /* If 2MB aligned, size was probably user
-                   specified. We can't tell anything about shadowing
-                   in this case so skip shadow assignment. */
-               if (0 != (size & 0x1fffff)){
-                       /* Align to 512KB to ensure correct handling
-                          of both memfile and system specified
-                          sizes. */
-                       size = ((size+0x0007ffff) & 0xfff80000);
-                       /* If memory is 1MB aligned, assume
-                           shadowing. */
-                       shadow = !(size & 0x80000);
-               }
-
-               /* Add the chunk that ADOS does not see. by aligning
-                   the size to the nearest 2MB limit upwards.  */
-               memory[0].size = ((size+0x001fffff) & 0xffe00000);
-       }
-
-       ppc_memstart = memory[0].addr;
-       ppc_memoffset = PAGE_OFFSET - PPC_MEMSTART;
-       total = memory[0].size;
-
-       /* Remove the memory chunks that are controlled by special
-           Phase5 hardware. */
-
-       /* Remove the upper 512KB if it contains a shadow of
-          the ADOS ROM. FIXME: It might be possible to
-          disable this shadow HW. Check the booter
-          (ppc_boot.c) */
-       if (shadow)
-               total -= HARDWARE_MAPPED_SIZE;
-
-       /* Remove the upper 512KB where the PPC exception
-          vectors are mapped. */
-       total -= HARDWARE_MAPPED_SIZE;
-
-       /* Linux/APUS only handles one block of memory -- the one on
-          the PowerUP board. Other system memory is horrible slow in
-          comparison. The user can use other memory for swapping
-          using the z2ram device. */
-       return total;
-}
-
-static void __init
-apus_map_io(void)
-{
-       /* Map PPC exception vectors. */
-       io_block_mapping(0xfff00000, 0xfff00000, 0x00020000, _PAGE_KERNEL);
-       /* Map chip and ZorroII memory */
-       io_block_mapping(zTwoBase,   0x00000000, 0x01000000, _PAGE_IO);
-}
-
-__init
-void apus_init_IRQ(void)
-{
-       struct irqaction *action;
-       int i;
-
-#ifdef CONFIG_PCI
-        apus_setup_pci_ptrs();
-#endif
-
-       for ( i = 0 ; i < AMI_IRQS; i++ ) {
-               irq_desc[i].status = IRQ_LEVEL;
-               if (i < IRQ_AMIGA_AUTO) {
-                       irq_desc[i].chip = &amiga_irqctrl;
-               } else {
-                       irq_desc[i].chip = &amiga_sys_irqctrl;
-                       action = &amiga_sys_irqaction[i-IRQ_AMIGA_AUTO];
-                       if (action->name)
-                               setup_irq(i, action);
-               }
-       }
-
-       amiga_init_IRQ();
-
-}
-
-__init
-void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-                  unsigned long r6, unsigned long r7)
-{
-       extern int parse_bootinfo(const struct bi_record *);
-       extern char _end[];
-
-       /* Parse bootinfo. The bootinfo is located right after
-           the kernel bss */
-       parse_bootinfo((const struct bi_record *)&_end);
-#ifdef CONFIG_BLK_DEV_INITRD
-       /* Take care of initrd if we have one. Use data from
-          bootinfo to avoid the need to initialize PPC
-          registers when kernel is booted via a PPC reset. */
-       if ( ramdisk.addr ) {
-               initrd_start = (unsigned long) __va(ramdisk.addr);
-               initrd_end = (unsigned long)
-                       __va(ramdisk.size + ramdisk.addr);
-       }
-#endif /* CONFIG_BLK_DEV_INITRD */
-
-       ISA_DMA_THRESHOLD = 0x00ffffff;
-
-       ppc_md.setup_arch     = apus_setup_arch;
-       ppc_md.show_cpuinfo   = apus_show_cpuinfo;
-       ppc_md.init_IRQ       = apus_init_IRQ;
-       ppc_md.get_irq        = apus_get_irq;
-
-#ifdef CONFIG_HEARTBEAT
-       ppc_md.heartbeat      = apus_heartbeat;
-       ppc_md.heartbeat_count = 1;
-#endif
-#ifdef APUS_DEBUG
-       __debug_serinit();
-       ppc_md.progress       = apus_progress;
-#endif
-       ppc_md.init           = NULL;
-
-       ppc_md.restart        = apus_restart;
-       ppc_md.power_off      = apus_power_off;
-       ppc_md.halt           = apus_halt;
-
-       ppc_md.time_init      = NULL;
-       ppc_md.set_rtc_time   = apus_set_rtc_time;
-       ppc_md.get_rtc_time   = apus_get_rtc_time;
-       ppc_md.calibrate_decr = apus_calibrate_decr;
-
-       ppc_md.find_end_of_memory = apus_find_end_of_memory;
-       ppc_md.setup_io_mappings = apus_map_io;
-}
index f8baf05f16ce14378dd964835845d9cd1abbeda0..6765676a5c6b23b00cf918fdaba0733cbb1858fc 100644 (file)
@@ -23,9 +23,6 @@
 #include <linux/mtd/physmap.h>
 #include <linux/mv643xx.h>
 #include <linux/platform_device.h>
-#ifdef CONFIG_BOOTIMG
-#include <linux/bootimg.h>
-#endif
 #include <asm/page.h>
 #include <asm/time.h>
 #include <asm/smp.h>
index c289e9f1b251c6e83747859ee119abd07e2151d0..52f63e6f085622ec6a36eb381562f86d3d40e16e 100644 (file)
@@ -27,9 +27,6 @@
 #include <linux/mtd/physmap.h>
 #include <linux/mv643xx.h>
 #include <linux/platform_device.h>
-#ifdef CONFIG_BOOTIMG
-#include <linux/bootimg.h>
-#endif
 #include <asm/io.h>
 #include <asm/unistd.h>
 #include <asm/page.h>
index 491fe9a572293f78df894d2a7ed2c9650e649143..3f5be2c5ce99468ed0dc3586bbd5813f4851a29f 100644 (file)
 #include <linux/pm.h>
 #include <linux/bootmem.h>
 #include <linux/device.h>
+#include <linux/rwsem.h>
 
 #include <asm/io.h>
 #include <asm/ocp.h>
 #include <asm/errno.h>
-#include <asm/rwsem.h>
 #include <asm/semaphore.h>
 
 //#define DBG(x)       printk x
index 9f38d92ae53668485cabc1634789b43ef44718b8..6ebd9b4b8f1c92e0586f02a81485646883df0cee 100644 (file)
 #define __ASM_VIRTEX_DEVICES_H__
 
 #include <linux/platform_device.h>
-
-/* ML300/403 reference design framebuffer driver platform data struct */
-struct xilinxfb_platform_data {
-       u32 rotate_screen;
-       u32 screen_height_mm;
-       u32 screen_width_mm;
-};
+#include <linux/xilinxfb.h>
 
 void __init virtex_early_serial_map(void);
 
index af3969a9c96301d3ab515c44b1554c472ddcd4e3..e824b672e05a23c75473d6d2a04b4462eb709bec 100644 (file)
@@ -74,53 +74,9 @@ enum {
 static DEFINE_SPINLOCK(viodasd_spinlock);
 
 #define VIOMAXREQ              16
-#define VIOMAXBLOCKDMA         12
 
 #define DEVICE_NO(cell)        ((struct viodasd_device *)(cell) - &viodasd_devices[0])
 
-struct open_data {
-       u64     disk_size;
-       u16     max_disk;
-       u16     cylinders;
-       u16     tracks;
-       u16     sectors;
-       u16     bytes_per_sector;
-};
-
-struct rw_data {
-       u64     offset;
-       struct {
-               u32     token;
-               u32     reserved;
-               u64     len;
-       } dma_info[VIOMAXBLOCKDMA];
-};
-
-struct vioblocklpevent {
-       struct HvLpEvent        event;
-       u32                     reserved;
-       u16                     version;
-       u16                     sub_result;
-       u16                     disk;
-       u16                     flags;
-       union {
-               struct open_data        open_data;
-               struct rw_data          rw_data;
-               u64                     changed;
-       } u;
-};
-
-#define vioblockflags_ro   0x0001
-
-enum vioblocksubtype {
-       vioblockopen = 0x0001,
-       vioblockclose = 0x0002,
-       vioblockread = 0x0003,
-       vioblockwrite = 0x0004,
-       vioblockflush = 0x0005,
-       vioblockcheck = 0x0007
-};
-
 struct viodasd_waitevent {
        struct completion       com;
        int                     rc;
@@ -429,7 +385,7 @@ static void do_viodasd_request(struct request_queue *q)
  * Probe a single disk and fill in the viodasd_device structure
  * for it.
  */
-static void probe_disk(struct viodasd_device *d)
+static int probe_disk(struct viodasd_device *d)
 {
        HvLpEvent_Rc hvrc;
        struct viodasd_waitevent we;
@@ -453,14 +409,14 @@ retry:
                        0, 0, 0);
        if (hvrc != 0) {
                printk(VIOD_KERN_WARNING "bad rc on HV open %d\n", (int)hvrc);
-               return;
+               return 0;
        }
 
        wait_for_completion(&we.com);
 
        if (we.rc != 0) {
                if (flags != 0)
-                       return;
+                       return 0;
                /* try again with read only flag set */
                flags = vioblockflags_ro;
                goto retry;
@@ -490,15 +446,32 @@ retry:
        if (hvrc != 0) {
                printk(VIOD_KERN_WARNING
                       "bad rc sending event to OS/400 %d\n", (int)hvrc);
-               return;
+               return 0;
        }
+
+       if (d->dev == NULL) {
+               /* this is when we reprobe for new disks */
+               if (vio_create_viodasd(dev_no) == NULL) {
+                       printk(VIOD_KERN_WARNING
+                               "cannot allocate virtual device for disk %d\n",
+                               dev_no);
+                       return 0;
+               }
+               /*
+                * The vio_create_viodasd will have recursed into this
+                * routine with d->dev set to the new vio device and
+                * will finish the setup of the disk below.
+                */
+               return 1;
+       }
+
        /* create the request queue for the disk */
        spin_lock_init(&d->q_lock);
        q = blk_init_queue(do_viodasd_request, &d->q_lock);
        if (q == NULL) {
                printk(VIOD_KERN_WARNING "cannot allocate queue for disk %d\n",
                                dev_no);
-               return;
+               return 0;
        }
        g = alloc_disk(1 << PARTITION_SHIFT);
        if (g == NULL) {
@@ -506,7 +479,7 @@ retry:
                                "cannot allocate disk structure for disk %d\n",
                                dev_no);
                blk_cleanup_queue(q);
-               return;
+               return 0;
        }
 
        d->disk = g;
@@ -538,6 +511,7 @@ retry:
 
        /* register us in the global list */
        add_disk(g);
+       return 1;
 }
 
 /* returns the total number of scatterlist elements converted */
@@ -718,8 +692,7 @@ static int viodasd_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        struct viodasd_device *d = &viodasd_devices[vdev->unit_address];
 
        d->dev = &vdev->dev;
-       probe_disk(d);
-       if (d->disk == NULL)
+       if (!probe_disk(d))
                return -ENODEV;
        return 0;
 }
index e51550db1575acf758ba313bc207f72658547afa..880b5dce3a62b8e1acfbd3a7aab8d98e837e8629 100644 (file)
 #define VIOCD_KERN_WARNING             KERN_WARNING "viocd: "
 #define VIOCD_KERN_INFO                        KERN_INFO "viocd: "
 
-struct viocdlpevent {
-       struct HvLpEvent        event;
-       u32                     reserved;
-       u16                     version;
-       u16                     sub_result;
-       u16                     disk;
-       u16                     flags;
-       u32                     token;
-       u64                     offset;         /* On open, max number of disks */
-       u64                     len;            /* On open, size of the disk */
-       u32                     block_size;     /* Only set on open */
-       u32                     media_size;     /* Only set on open */
-};
-
-enum viocdsubtype {
-       viocdopen = 0x0001,
-       viocdclose = 0x0002,
-       viocdread = 0x0003,
-       viocdwrite = 0x0004,
-       viocdlockdoor = 0x0005,
-       viocdgetinfo = 0x0006,
-       viocdcheck = 0x0007
-};
-
 /*
  * Should probably make this a module parameter....sigh
  */
@@ -131,22 +107,13 @@ static struct capability_entry capability_table[] __initdata = {
 /* These are our internal structures for keeping track of devices */
 static int viocd_numdev;
 
-struct cdrom_info {
-       char    rsrcname[10];
-       char    type[4];
-       char    model[3];
-};
-/*
- * This needs to be allocated since it is passed to the
- * Hypervisor and we may be a module.
- */
-static struct cdrom_info *viocd_unitinfo;
-static dma_addr_t unitinfo_dmaaddr;
-
 struct disk_info {
        struct gendisk                  *viocd_disk;
        struct cdrom_device_info        viocd_info;
        struct device                   *dev;
+       const char                      *rsrcname;
+       const char                      *type;
+       const char                      *model;
 };
 static struct disk_info viocd_diskinfo[VIOCD_MAX_CD];
 
@@ -164,9 +131,9 @@ static int proc_viocd_show(struct seq_file *m, void *v)
        for (i = 0; i < viocd_numdev; i++) {
                seq_printf(m, "viocd device %d is iSeries resource %10.10s"
                                "type %4.4s, model %3.3s\n",
-                               i, viocd_unitinfo[i].rsrcname,
-                               viocd_unitinfo[i].type,
-                               viocd_unitinfo[i].model);
+                               i, viocd_diskinfo[i].rsrcname,
+                               viocd_diskinfo[i].type,
+                               viocd_diskinfo[i].model);
        }
        return 0;
 }
@@ -216,61 +183,6 @@ struct block_device_operations viocd_fops = {
        .media_changed =        viocd_blk_media_changed,
 };
 
-/* Get info on CD devices from OS/400 */
-static void __init get_viocd_info(void)
-{
-       HvLpEvent_Rc hvrc;
-       int i;
-       struct viocd_waitevent we;
-
-       viocd_unitinfo = dma_alloc_coherent(iSeries_vio_dev,
-                       sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                       &unitinfo_dmaaddr, GFP_ATOMIC);
-       if (viocd_unitinfo == NULL) {
-               printk(VIOCD_KERN_WARNING "error allocating unitinfo\n");
-               return;
-       }
-
-       memset(viocd_unitinfo, 0, sizeof(*viocd_unitinfo) * VIOCD_MAX_CD);
-
-       init_completion(&we.com);
-
-       hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
-                       HvLpEvent_Type_VirtualIo,
-                       viomajorsubtype_cdio | viocdgetinfo,
-                       HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck,
-                       viopath_sourceinst(viopath_hostLp),
-                       viopath_targetinst(viopath_hostLp),
-                       (u64)&we, VIOVERSION << 16, unitinfo_dmaaddr, 0,
-                       sizeof(*viocd_unitinfo) * VIOCD_MAX_CD, 0);
-       if (hvrc != HvLpEvent_Rc_Good) {
-               printk(VIOCD_KERN_WARNING "cdrom error sending event. rc %d\n",
-                               (int)hvrc);
-               goto error_ret;
-       }
-
-       wait_for_completion(&we.com);
-
-       if (we.rc) {
-               const struct vio_error_entry *err =
-                       vio_lookup_rc(viocd_err_table, we.sub_result);
-               printk(VIOCD_KERN_WARNING "bad rc %d:0x%04X on getinfo: %s\n",
-                               we.rc, we.sub_result, err->msg);
-               goto error_ret;
-       }
-
-       for (i = 0; (i < VIOCD_MAX_CD) && viocd_unitinfo[i].rsrcname[0]; i++)
-               viocd_numdev++;
-
-error_ret:
-       if (viocd_numdev == 0) {
-               dma_free_coherent(iSeries_vio_dev,
-                               sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                               viocd_unitinfo, unitinfo_dmaaddr);
-               viocd_unitinfo = NULL;
-       }
-}
-
 static int viocd_open(struct cdrom_device_info *cdi, int purpose)
 {
         struct disk_info *diskinfo = cdi->handle;
@@ -581,7 +493,6 @@ static void vio_handle_cd_event(struct HvLpEvent *event)
                                        bevent->block_size / 512);
                }
                /* FALLTHROUGH !! */
-       case viocdgetinfo:
        case viocdlockdoor:
                pwe = (struct viocd_waitevent *)event->xCorrelationToken;
 return_complete:
@@ -665,22 +576,30 @@ static int viocd_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        int deviceno;
        struct disk_info *d;
        struct cdrom_device_info *c;
-       struct cdrom_info *ci;
        struct request_queue *q;
+       struct device_node *node = vdev->dev.archdata.of_node;
 
        deviceno = vdev->unit_address;
-       if (deviceno >= viocd_numdev)
+       if (deviceno > VIOCD_MAX_CD)
                return -ENODEV;
+       if (!node)
+               return -ENODEV;
+
+       if (deviceno >= viocd_numdev)
+               viocd_numdev = deviceno + 1;
 
        d = &viocd_diskinfo[deviceno];
+       d->rsrcname = of_get_property(node, "linux,vio_rsrcname", NULL);
+       d->type = of_get_property(node, "linux,vio_type", NULL);
+       d->model = of_get_property(node, "linux,vio_model", NULL);
+
        c = &d->viocd_info;
-       ci = &viocd_unitinfo[deviceno];
 
        c->ops = &viocd_dops;
        c->speed = 4;
        c->capacity = 1;
        c->handle = d;
-       c->mask = ~find_capability(ci->type);
+       c->mask = ~find_capability(d->type);
        sprintf(c->name, VIOCD_DEVICE "%c", 'a' + deviceno);
 
        if (register_cdrom(c) != 0) {
@@ -690,7 +609,7 @@ static int viocd_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        }
        printk(VIOCD_KERN_INFO "cd %s is iSeries resource %10.10s "
                        "type %4.4s, model %3.3s\n",
-                       c->name, ci->rsrcname, ci->type, ci->model);
+                       c->name, d->rsrcname, d->type, d->model);
        q = blk_init_queue(do_viocd_request, &viocd_reqlock);
        if (q == NULL) {
                printk(VIOCD_KERN_WARNING "Cannot allocate queue for %s!\n",
@@ -799,8 +718,6 @@ static int __init viocd_init(void)
        /* Initialize our request handler */
        vio_setHandler(viomajorsubtype_cdio, vio_handle_cd_event);
 
-       get_viocd_info();
-
        spin_lock_init(&viocd_reqlock);
 
        ret = vio_register_driver(&viocd_driver);
@@ -816,9 +733,6 @@ static int __init viocd_init(void)
        return 0;
 
 out_free_info:
-       dma_free_coherent(iSeries_vio_dev,
-                       sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                       viocd_unitinfo, unitinfo_dmaaddr);
        vio_clearHandler(viomajorsubtype_cdio);
        viopath_close(viopath_hostLp, viomajorsubtype_cdio, MAX_CD_REQ + 2);
 out_unregister:
@@ -830,10 +744,6 @@ static void __exit viocd_exit(void)
 {
        remove_proc_entry("iSeries/viocd", NULL);
        vio_unregister_driver(&viocd_driver);
-       if (viocd_unitinfo != NULL)
-               dma_free_coherent(iSeries_vio_dev,
-                               sizeof(*viocd_unitinfo) * VIOCD_MAX_CD,
-                               viocd_unitinfo, unitinfo_dmaaddr);
        viopath_close(viopath_hostLp, viomajorsubtype_cdio, MAX_CD_REQ + 2);
        vio_clearHandler(viomajorsubtype_cdio);
        unregister_blkdev(VIOCD_MAJOR, VIOCD_DEVICE);
index 6f019f19be71bcce0fe41d8bd95a20a67e173467..e74bb949c289b30e2d43d30e9a19b9583a359400 100644 (file)
@@ -97,7 +97,7 @@ static int hvc_beat_config(char *p)
        return 0;
 }
 
-static int hvc_beat_console_init(void)
+static int __init hvc_beat_console_init(void)
 {
        if (hvc_beat_useit && machine_is_compatible("Beat")) {
                hvc_instantiate(0, 0, &hvc_beat_get_put_ops);
@@ -106,7 +106,7 @@ static int hvc_beat_console_init(void)
 }
 
 /* temp */
-static int hvc_beat_init(void)
+static int __init hvc_beat_init(void)
 {
        struct hvc_struct *hp;
 
index 7901d5f218ec95ab3751ee988a8dc4b54da85642..a2894d42515344b5e2951d96d8b0a3849a1b8b37 100644 (file)
@@ -2253,19 +2253,19 @@ static int __devinit ipmi_of_probe(struct of_device *dev,
                return ret;
        }
 
-       regsize = get_property(np, "reg-size", &proplen);
+       regsize = of_get_property(np, "reg-size", &proplen);
        if (regsize && proplen != 4) {
                dev_warn(&dev->dev, PFX "invalid regsize from OF\n");
                return -EINVAL;
        }
 
-       regspacing = get_property(np, "reg-spacing", &proplen);
+       regspacing = of_get_property(np, "reg-spacing", &proplen);
        if (regspacing && proplen != 4) {
                dev_warn(&dev->dev, PFX "invalid regspacing from OF\n");
                return -EINVAL;
        }
 
-       regshift = get_property(np, "reg-shift", &proplen);
+       regshift = of_get_property(np, "reg-shift", &proplen);
        if (regshift && proplen != 4) {
                dev_warn(&dev->dev, PFX "invalid regshift from OF\n");
                return -EINVAL;
index e12275df6ea2d271ec630f9c89945c6753bdf726..f1d60f0cef8f860b3b402a680e98f71214e975d7 100644 (file)
@@ -92,47 +92,6 @@ struct viot_devinfo_struct {
 #define VIOTAPOP_SETPART       14
 #define VIOTAPOP_UNLOAD        15
 
-struct viotapelpevent {
-       struct HvLpEvent event;
-       u32 reserved;
-       u16 version;
-       u16 sub_type_result;
-       u16 tape;
-       u16 flags;
-       u32 token;
-       u64 len;
-       union {
-               struct {
-                       u32 tape_op;
-                       u32 count;
-               } op;
-               struct {
-                       u32 type;
-                       u32 resid;
-                       u32 dsreg;
-                       u32 gstat;
-                       u32 erreg;
-                       u32 file_no;
-                       u32 block_no;
-               } get_status;
-               struct {
-                       u32 block_no;
-               } get_pos;
-       } u;
-};
-
-enum viotapesubtype {
-       viotapeopen = 0x0001,
-       viotapeclose = 0x0002,
-       viotaperead = 0x0003,
-       viotapewrite = 0x0004,
-       viotapegetinfo = 0x0005,
-       viotapeop = 0x0006,
-       viotapegetpos = 0x0007,
-       viotapesetpos = 0x0008,
-       viotapegetstatus = 0x0009
-};
-
 enum viotaperc {
        viotape_InvalidRange = 0x0601,
        viotape_InvalidToken = 0x0602,
@@ -223,14 +182,11 @@ static const struct vio_error_entry viotape_err_table[] = {
 #define VIOT_WRITING           2
 
 /* Our info on the tapes */
-struct tape_descr {
-       char rsrcname[10];
-       char type[4];
-       char model[3];
-};
-
-static struct tape_descr *viotape_unitinfo;
-static dma_addr_t viotape_unitinfo_token;
+static struct {
+       const char *rsrcname;
+       const char *type;
+       const char *model;
+} viotape_unitinfo[VIOTAPE_MAX_TAPE];
 
 static struct mtget viomtget[VIOTAPE_MAX_TAPE];
 
@@ -381,53 +337,6 @@ int tape_rc_to_errno(int tape_rc, char *operation, int tapeno)
        return -err->errno;
 }
 
-/* Get info on all tapes from OS/400 */
-static int get_viotape_info(void)
-{
-       HvLpEvent_Rc hvrc;
-       int i;
-       size_t len = sizeof(*viotape_unitinfo) * VIOTAPE_MAX_TAPE;
-       struct op_struct *op = get_op_struct();
-
-       if (op == NULL)
-               return -ENOMEM;
-
-       viotape_unitinfo = dma_alloc_coherent(iSeries_vio_dev, len,
-               &viotape_unitinfo_token, GFP_ATOMIC);
-       if (viotape_unitinfo == NULL) {
-               free_op_struct(op);
-               return -ENOMEM;
-       }
-
-       memset(viotape_unitinfo, 0, len);
-
-       hvrc = HvCallEvent_signalLpEventFast(viopath_hostLp,
-                       HvLpEvent_Type_VirtualIo,
-                       viomajorsubtype_tape | viotapegetinfo,
-                       HvLpEvent_AckInd_DoAck, HvLpEvent_AckType_ImmediateAck,
-                       viopath_sourceinst(viopath_hostLp),
-                       viopath_targetinst(viopath_hostLp),
-                       (u64) (unsigned long) op, VIOVERSION << 16,
-                       viotape_unitinfo_token, len, 0, 0);
-       if (hvrc != HvLpEvent_Rc_Good) {
-               printk(VIOTAPE_KERN_WARN "hv error on op %d\n",
-                               (int)hvrc);
-               free_op_struct(op);
-               return -EIO;
-       }
-
-       wait_for_completion(&op->com);
-
-       free_op_struct(op);
-
-       for (i = 0;
-            ((i < VIOTAPE_MAX_TAPE) && (viotape_unitinfo[i].rsrcname[0]));
-            i++)
-               viotape_numdev++;
-       return 0;
-}
-
-
 /* Write */
 static ssize_t viotap_write(struct file *file, const char *buf,
                size_t count, loff_t * ppos)
@@ -899,7 +808,6 @@ static void vioHandleTapeEvent(struct HvLpEvent *event)
        tapeminor = event->xSubtype & VIOMINOR_SUBTYPE_MASK;
        op = (struct op_struct *)event->xCorrelationToken;
        switch (tapeminor) {
-       case viotapegetinfo:
        case viotapeopen:
        case viotapeclose:
                op->rc = tevent->sub_type_result;
@@ -942,11 +850,23 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
 {
        int i = vdev->unit_address;
        int j;
+       struct device_node *node = vdev->dev.archdata.of_node;
 
-       if (i >= viotape_numdev)
+       if (i > VIOTAPE_MAX_TAPE)
+               return -ENODEV;
+       if (!node)
                return -ENODEV;
 
+       if (i >= viotape_numdev)
+               viotape_numdev = i + 1;
+
        tape_device[i] = &vdev->dev;
+       viotape_unitinfo[i].rsrcname = of_get_property(node,
+                                       "linux,vio_rsrcname", NULL);
+       viotape_unitinfo[i].type = of_get_property(node, "linux,vio_type",
+                                       NULL);
+       viotape_unitinfo[i].model = of_get_property(node, "linux,vio_model",
+                                       NULL);
 
        state[i].cur_part = 0;
        for (j = 0; j < MAX_PARTITIONS; ++j)
@@ -1044,11 +964,6 @@ int __init viotap_init(void)
                goto unreg_chrdev;
        }
 
-       if ((ret = get_viotape_info()) < 0) {
-               printk(VIOTAPE_KERN_WARN "Unable to obtain virtual device information");
-               goto unreg_class;
-       }
-
        ret = vio_register_driver(&viotape_driver);
        if (ret)
                goto unreg_class;
@@ -1102,10 +1017,6 @@ static void __exit viotap_exit(void)
        vio_unregister_driver(&viotape_driver);
        class_destroy(tape_class);
        unregister_chrdev(VIOTAPE_MAJOR, "viotape");
-       if (viotape_unitinfo)
-               dma_free_coherent(iSeries_vio_dev,
-                               sizeof(viotape_unitinfo[0]) * VIOTAPE_MAX_TAPE,
-                               viotape_unitinfo, viotape_unitinfo_token);
        viopath_close(viopath_hostLp, viomajorsubtype_tape, VIOTAPE_MAXREQ + 2);
        vio_clearHandler(viomajorsubtype_tape);
        clear_op_struct_pool();
index 17ef5d3c01b45cb1c581eec128c5ff901ce53eb1..444696625171e42a6948eb858299a8a489626510 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/init.h>
 #include <linux/proc_fs.h>
 
-#include <asm/bootinfo.h> 
 #include <asm/macintosh.h> 
 #include <asm/macints.h> 
 #include <asm/mac_iop.h>
index b46817f699f157899257907d0c77cbf113d61573..48d17bf6c927d6e8b528c48758b7c309d4c2773f 100644 (file)
@@ -70,7 +70,7 @@ static struct notifier_block adbhid_adb_notifier = {
 #define ADB_KEY_POWER_OLD      0x7e
 #define ADB_KEY_POWER          0x7f
 
-u8 adb_to_linux_keycodes[128] = {
+u16 adb_to_linux_keycodes[128] = {
        /* 0x00 */ KEY_A,               /*  30 */
        /* 0x01 */ KEY_S,               /*  31 */
        /* 0x02 */ KEY_D,               /*  32 */
@@ -134,7 +134,7 @@ u8 adb_to_linux_keycodes[128] = {
        /* 0x3c */ KEY_RIGHT,           /* 106 */
        /* 0x3d */ KEY_DOWN,            /* 108 */
        /* 0x3e */ KEY_UP,              /* 103 */
-       /* 0x3f */ 0,
+       /* 0x3f */ KEY_FN,              /* 0x1d0 */
        /* 0x40 */ 0,
        /* 0x41 */ KEY_KPDOT,           /*  83 */
        /* 0x42 */ 0,
@@ -208,7 +208,7 @@ struct adbhid {
        int original_handler_id;
        int current_handler_id;
        int mouse_kind;
-       unsigned char *keycode;
+       u16 *keycode;
        char name[64];
        char phys[32];
        int flags;
@@ -275,7 +275,7 @@ static void
 adbhid_input_keycode(int id, int keycode, int repeat)
 {
        struct adbhid *ahid = adbhid[id];
-       int up_flag;
+       int up_flag, key;
 
        up_flag = (keycode & 0x80);
        keycode &= 0x7f;
@@ -321,8 +321,7 @@ adbhid_input_keycode(int id, int keycode, int repeat)
                        }
                } else
                        ahid->flags |= FLAG_FN_KEY_PRESSED;
-               /* Swallow the key press */
-               return;
+               break;
        case ADB_KEY_DEL:
                /* Emulate Fn+delete = forward delete */
                if (ahid->flags & FLAG_FN_KEY_PRESSED) {
@@ -336,9 +335,9 @@ adbhid_input_keycode(int id, int keycode, int repeat)
 #endif /* CONFIG_PPC_PMAC */
        }
 
-       if (adbhid[id]->keycode[keycode]) {
-               input_report_key(adbhid[id]->input,
-                                adbhid[id]->keycode[keycode], !up_flag);
+       key = adbhid[id]->keycode[keycode];
+       if (key) {
+               input_report_key(adbhid[id]->input, key, !up_flag);
                input_sync(adbhid[id]->input);
        } else
                printk(KERN_INFO "Unhandled ADB key (scancode %#02x) %s.\n", keycode,
@@ -757,8 +756,8 @@ adbhid_input_register(int id, int default_id, int original_handler_id,
                input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
                input_dev->ledbit[0] = BIT(LED_SCROLLL) | BIT(LED_CAPSL) | BIT(LED_NUML);
                input_dev->event = adbhid_kbd_event;
-               input_dev->keycodemax = 127;
-               input_dev->keycodesize = 1;
+               input_dev->keycodemax = KEY_FN;
+               input_dev->keycodesize = sizeof(hid->keycode[0]);
                break;
 
        case ADB_MOUSE:
index e54c4d9f63650387649f55934b920741a1f07ccc..73c50bc02095e26b31ec61d76ee81f7f46e4e36d 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/sections.h>
 #include <asm/prom.h>
-#include <asm/ans-lcd.h>
 #include <asm/io.h>
 
+#include "ans-lcd.h"
+
 #define ANSLCD_ADDR            0xf301c000
 #define ANSLCD_CTRL_IX 0x00
 #define ANSLCD_DATA_IX 0x10
diff --git a/drivers/macintosh/ans-lcd.h b/drivers/macintosh/ans-lcd.h
new file mode 100644 (file)
index 0000000..d795b9f
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _PPC_ANS_LCD_H
+#define _PPC_ANS_LCD_H
+
+#define ANSLCD_MINOR           156
+
+#define ANSLCD_CLEAR           0x01
+#define ANSLCD_SENDCTRL                0x02
+#define ANSLCD_SETSHORTDELAY   0x03
+#define ANSLCD_SETLONGDELAY    0x04
+
+#endif
index f25685b9b7cf51a782c24faaa86bf9b896e4acca..276945d515130724e2c575b0a538aa8106b2449b 100644 (file)
@@ -379,13 +379,10 @@ static int attach_one_thermostat(struct i2c_adapter *adapter, int addr,
        if (thermostat)
                return 0;
 
-       th = (struct thermostat *)
-               kmalloc(sizeof(struct thermostat), GFP_KERNEL);
-
+       th = kzalloc(sizeof(struct thermostat), GFP_KERNEL);
        if (!th)
                return -ENOMEM;
 
-       memset(th, 0, sizeof(*th));
        th->clt.addr = addr;
        th->clt.adapter = adapter;
        th->clt.driver = &thermostat_driver;
index 04f3973e3874920bd1fa8675249141894a9931c1..f7c509b7a8ea1eaa5c25166f5ec51e3f0840e95d 100644 (file)
@@ -410,7 +410,7 @@ static int __init via_pmu_start(void)
 
        irq = irq_of_parse_and_map(vias, 0);
        if (irq == NO_IRQ) {
-               printk(KERN_ERR "via-pmu: can't map interruptn");
+               printk(KERN_ERR "via-pmu: can't map interrupt\n");
                return -ENODEV;
        }
        if (request_irq(irq, via_pmu_interrupt, 0, "VIA-PMU", (void *)0)) {
index 351982bcec1b21d3a46c767f2879202c73e1419b..f449d775cdf490a4092f08294ca2a3c222e15796 100644 (file)
@@ -380,10 +380,12 @@ static int __init sat_sensors_init(void)
        return i2c_add_driver(&wf_sat_driver);
 }
 
+#if 0  /* uncomment when module_exit() below is uncommented */
 static void __exit sat_sensors_exit(void)
 {
        i2c_del_driver(&wf_sat_driver);
 }
+#endif
 
 module_init(sat_sensors_init);
 /*module_exit(sat_sensors_exit); Uncomment when cleanup is implemented */
index 276ba3c5143fd9646e03a1e75b3e20a90b5a87fd..aa8ce7abe9221666b6e7c01dff4f7dc7321dfc84 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/miscdevice.h>
 #include <linux/proc_fs.h>
+#include <linux/hdpu_features.h>
 #include <linux/platform_device.h>
 #include <asm/uaccess.h>
-#include <linux/hdpu_features.h>
+#include <linux/seq_file.h>
+#include <asm/io.h>
 
 #define SKY_CPUSTATE_VERSION           "1.1"
 
 static int hdpu_cpustate_probe(struct platform_device *pdev);
 static int hdpu_cpustate_remove(struct platform_device *pdev);
 
-struct cpustate_t cpustate;
+static unsigned char cpustate_get_state(void);
+static int cpustate_proc_open(struct inode *inode, struct file *file);
+static int cpustate_proc_read(struct seq_file *seq, void *offset);
+
+static struct cpustate_t cpustate;
+
+static const struct file_operations proc_cpustate = {
+       .open = cpustate_proc_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .owner = THIS_MODULE,
+};
+
+static int cpustate_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, cpustate_proc_read, NULL);
+}
+
+static int cpustate_proc_read(struct seq_file *seq, void *offset)
+{
+       seq_printf(seq, "CPU State: %04x\n", cpustate_get_state());
+       return 0;
+}
 
 static int cpustate_get_ref(int excl)
 {
@@ -66,13 +91,13 @@ static int cpustate_free_ref(void)
        return 0;
 }
 
-unsigned char cpustate_get_state(void)
+static unsigned char cpustate_get_state(void)
 {
 
        return cpustate.cached_val;
 }
 
-void cpustate_set_state(unsigned char new_state)
+static void cpustate_set_state(unsigned char new_state)
 {
        unsigned int state = (new_state << 21);
 
@@ -134,29 +159,6 @@ static int cpustate_release(struct inode *inode, struct file *file)
        return cpustate_free_ref();
 }
 
-/*
- *     Info exported via "/proc/sky_cpustate".
- */
-static int cpustate_read_proc(char *page, char **start, off_t off,
-                             int count, int *eof, void *data)
-{
-       char *p = page;
-       int len = 0;
-
-       p += sprintf(p, "CPU State: %04x\n", cpustate_get_state());
-       len = p - page;
-
-       if (len <= off + count)
-               *eof = 1;
-       *start = page + off;
-       len -= off;
-       if (len > count)
-               len = count;
-       if (len < 0)
-               len = 0;
-       return len;
-}
-
 static struct platform_driver hdpu_cpustate_driver = {
        .probe = hdpu_cpustate_probe,
        .remove = hdpu_cpustate_remove,
@@ -169,22 +171,18 @@ static struct platform_driver hdpu_cpustate_driver = {
  *     The various file operations we support.
  */
 static const struct file_operations cpustate_fops = {
-      owner:THIS_MODULE,
-      open:cpustate_open,
-      release:cpustate_release,
-      read:cpustate_read,
-      write:cpustate_write,
-      fasync:NULL,
-      poll:NULL,
-      ioctl:NULL,
-      llseek:no_llseek,
-
+      .owner   = THIS_MODULE,
+      .open    = cpustate_open,
+      .release = cpustate_release,
+      .read    = cpustate_read,
+      .write   = cpustate_write,
+      .llseek  = no_llseek,
 };
 
 static struct miscdevice cpustate_dev = {
-       MISC_DYNAMIC_MINOR,
-       "sky_cpustate",
-       &cpustate_fops
+       .minor  = MISC_DYNAMIC_MINOR,
+       .name   = "sky_cpustate",
+       .fops   = &cpustate_fops,
 };
 
 static int hdpu_cpustate_probe(struct platform_device *pdev)
@@ -194,23 +192,31 @@ static int hdpu_cpustate_probe(struct platform_device *pdev)
        int ret;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               printk(KERN_ERR "sky_cpustate: "
+                      "Invalid memory resource.\n");
+               return -EINVAL;
+       }
        cpustate.set_addr = (unsigned long *)res->start;
        cpustate.clr_addr = (unsigned long *)res->end - 1;
 
        ret = misc_register(&cpustate_dev);
        if (ret) {
-               printk(KERN_WARNING "sky_cpustate: Unable to register misc "
-                                       "device.\n");
+               printk(KERN_WARNING "sky_cpustate: "
+                      "Unable to register misc device.\n");
                cpustate.set_addr = NULL;
                cpustate.clr_addr = NULL;
                return ret;
        }
 
-       proc_de = create_proc_read_entry("sky_cpustate", 0, 0,
-                                       cpustate_read_proc, NULL);
-       if (proc_de == NULL)
-               printk(KERN_WARNING "sky_cpustate: Unable to create proc "
-                                       "dir entry\n");
+       proc_de = create_proc_entry("sky_cpustate", 0666, &proc_root);
+       if (!proc_de) {
+               printk(KERN_WARNING "sky_cpustate: "
+                      "Unable to create proc entry\n");
+       } else {
+               proc_de->proc_fops = &proc_cpustate;
+               proc_de->owner = THIS_MODULE;
+       }
 
        printk(KERN_INFO "Sky CPU State Driver v" SKY_CPUSTATE_VERSION "\n");
        return 0;
@@ -218,21 +224,18 @@ static int hdpu_cpustate_probe(struct platform_device *pdev)
 
 static int hdpu_cpustate_remove(struct platform_device *pdev)
 {
-
        cpustate.set_addr = NULL;
        cpustate.clr_addr = NULL;
 
        remove_proc_entry("sky_cpustate", NULL);
        misc_deregister(&cpustate_dev);
-       return 0;
 
+       return 0;
 }
 
 static int __init cpustate_init(void)
 {
-       int rc;
-       rc = platform_driver_register(&hdpu_cpustate_driver);
-       return rc;
+       return platform_driver_register(&hdpu_cpustate_driver);
 }
 
 static void __exit cpustate_exit(void)
index 60c8b26f0678a50d7ea947857af04061b21857a2..2887b21479800669f0af10b66e7dd79ddbdb0d19 100644 (file)
 #include <linux/kernel.h>
 #include <linux/proc_fs.h>
 #include <linux/hdpu_features.h>
-
 #include <linux/platform_device.h>
+#include <linux/seq_file.h>
+#include <asm/io.h>
 
 static int hdpu_nexus_probe(struct platform_device *pdev);
 static int hdpu_nexus_remove(struct platform_device *pdev);
+static int hdpu_slot_id_open(struct inode *inode, struct file *file);
+static int hdpu_slot_id_read(struct seq_file *seq, void *offset);
+static int hdpu_chassis_id_open(struct inode *inode, struct file *file);
+static int hdpu_chassis_id_read(struct seq_file *seq, void *offset);
 
 static struct proc_dir_entry *hdpu_slot_id;
 static struct proc_dir_entry *hdpu_chassis_id;
 static int slot_id = -1;
 static int chassis_id = -1;
 
+static const struct file_operations proc_slot_id = {
+       .open = hdpu_slot_id_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .owner = THIS_MODULE,
+};
+
+static const struct file_operations proc_chassis_id = {
+       .open = hdpu_chassis_id_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+       .owner = THIS_MODULE,
+};
+
 static struct platform_driver hdpu_nexus_driver = {
        .probe = hdpu_nexus_probe,
        .remove = hdpu_nexus_remove,
@@ -37,43 +58,67 @@ static struct platform_driver hdpu_nexus_driver = {
        },
 };
 
-int hdpu_slot_id_read(char *buffer, char **buffer_location, off_t offset,
-                     int buffer_length, int *zero, void *ptr)
+static int hdpu_slot_id_open(struct inode *inode, struct file *file)
 {
+       return single_open(file, hdpu_slot_id_read, NULL);
+}
 
-       if (offset > 0)
-               return 0;
-       return sprintf(buffer, "%d\n", slot_id);
+static int hdpu_slot_id_read(struct seq_file *seq, void *offset)
+{
+       seq_printf(seq, "%d\n", slot_id);
+       return 0;
 }
 
-int hdpu_chassis_id_read(char *buffer, char **buffer_location, off_t offset,
-                        int buffer_length, int *zero, void *ptr)
+static int hdpu_chassis_id_open(struct inode *inode, struct file *file)
 {
+       return single_open(file, hdpu_chassis_id_read, NULL);
+}
 
-       if (offset > 0)
-               return 0;
-       return sprintf(buffer, "%d\n", chassis_id);
+static int hdpu_chassis_id_read(struct seq_file *seq, void *offset)
+{
+       seq_printf(seq, "%d\n", chassis_id);
+       return 0;
 }
 
 static int hdpu_nexus_probe(struct platform_device *pdev)
 {
        struct resource *res;
+       int *nexus_id_addr;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       int *nexus_id_addr;
-       nexus_id_addr =
-           ioremap(res->start, (unsigned long)(res->end - res->start));
+       if (!res) {
+               printk(KERN_ERR "sky_nexus: "
+                      "Invalid memory resource.\n");
+               return -EINVAL;
+       }
+       nexus_id_addr = ioremap(res->start,
+                               (unsigned long)(res->end - res->start));
        if (nexus_id_addr) {
                slot_id = (*nexus_id_addr >> 8) & 0x1f;
                chassis_id = *nexus_id_addr & 0xff;
                iounmap(nexus_id_addr);
-       } else
-               printk("Could not map slot id\n");
+       } else {
+               printk(KERN_ERR "sky_nexus: Could not map slot id\n");
+       }
+
        hdpu_slot_id = create_proc_entry("sky_slot_id", 0666, &proc_root);
-       hdpu_slot_id->read_proc = hdpu_slot_id_read;
+       if (!hdpu_slot_id) {
+               printk(KERN_WARNING "sky_nexus: "
+                      "Unable to create proc dir entry: sky_slot_id\n");
+       } else {
+               hdpu_slot_id->proc_fops = &proc_slot_id;
+               hdpu_slot_id->owner = THIS_MODULE;
+       }
 
        hdpu_chassis_id = create_proc_entry("sky_chassis_id", 0666, &proc_root);
-       hdpu_chassis_id->read_proc = hdpu_chassis_id_read;
+       if (!hdpu_chassis_id) {
+               printk(KERN_WARNING "sky_nexus: "
+                      "Unable to create proc dir entry: sky_chassis_id\n");
+       } else {
+               hdpu_chassis_id->proc_fops = &proc_chassis_id;
+               hdpu_chassis_id->owner = THIS_MODULE;
+       }
+
        return 0;
 }
 
@@ -81,18 +126,19 @@ static int hdpu_nexus_remove(struct platform_device *pdev)
 {
        slot_id = -1;
        chassis_id = -1;
+
        remove_proc_entry("sky_slot_id", &proc_root);
        remove_proc_entry("sky_chassis_id", &proc_root);
+
        hdpu_slot_id = 0;
        hdpu_chassis_id = 0;
+
        return 0;
 }
 
 static int __init nexus_init(void)
 {
-       int rc;
-       rc = platform_driver_register(&hdpu_nexus_driver);
-       return rc;
+       return platform_driver_register(&hdpu_nexus_driver);
 }
 
 static void __exit nexus_exit(void)
index cc6c734424350e17de559c8551a470e70f7e5639..6cd132c751877463b79fd6b16469a4f43a3b8c82 100644 (file)
@@ -362,7 +362,7 @@ config MTD_WALNUT
 
 config MTD_EBONY
        tristate "Flash devices mapped on IBM 440GP Ebony"
-       depends on MTD_JEDECPROBE && EBONY
+       depends on MTD_JEDECPROBE && EBONY && !PPC_MERGE
        help
          This enables access routines for the flash chips on the IBM 440GP
          Ebony board. If you have one of these boards and would like to
index bbb42c35b69b9df05a108f21b0d837f80ca3d7e6..cf75a566442ed790e70ef062b755bf3581db7afc 100644 (file)
@@ -1,9 +1,12 @@
 /*
- * Normal mappings of chips in physical memory for OF devices
+ * Flash mappings described by the OF (or flattened) device tree
  *
  * Copyright (C) 2006 MontaVista Software Inc.
  * Author: Vitaly Wool <vwool@ru.mvista.com>
  *
+ * Revised to handle newer style flash binding by:
+ *   Copyright (C) 2007 David Gibson, 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
 
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/slab.h>
 #include <linux/device.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/partitions.h>
-#include <linux/mtd/physmap.h>
-#include <asm/io.h>
-#include <asm/prom.h>
-#include <asm/of_device.h>
-#include <asm/of_platform.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
 
-struct physmap_flash_info {
+struct of_flash {
        struct mtd_info         *mtd;
        struct map_info         map;
        struct resource         *res;
 #ifdef CONFIG_MTD_PARTITIONS
-       int                     nr_parts;
        struct mtd_partition    *parts;
 #endif
 };
 
-static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL };
 #ifdef CONFIG_MTD_PARTITIONS
-static const char *part_probe_types[] = { "cmdlinepart", "RedBoot", NULL };
-#endif
+#define OF_FLASH_PARTS(info)   ((info)->parts)
 
-#ifdef CONFIG_MTD_PARTITIONS
-static int parse_flash_partitions(struct device_node *node,
-               struct mtd_partition **parts)
+static int parse_obsolete_partitions(struct of_device *dev,
+                                    struct of_flash *info,
+                                    struct device_node *dp)
 {
-       int i, plen, retval = -ENOMEM;
-       const  u32  *part;
-       const  char *name;
-
-       part = of_get_property(node, "partitions", &plen);
-       if (part == NULL)
-               goto err;
-
-       retval = plen / (2 * sizeof(u32));
-       *parts = kzalloc(retval * sizeof(struct mtd_partition), GFP_KERNEL);
-       if (*parts == NULL) {
-               printk(KERN_ERR "Can't allocate the flash partition data!\n");
-               goto err;
-       }
+       int i, plen, nr_parts;
+       const struct {
+               u32 offset, len;
+       } *part;
+       const char *names;
+
+       part = of_get_property(dp, "partitions", &plen);
+       if (!part)
+               return 0; /* No partitions found */
+
+       dev_warn(&dev->dev, "Device tree uses obsolete partition map binding\n");
+
+       nr_parts = plen / sizeof(part[0]);
+
+       info->parts = kzalloc(nr_parts * sizeof(*info->parts), GFP_KERNEL);
+       if (!info->parts)
+               return -ENOMEM;
 
-       name = of_get_property(node, "partition-names", &plen);
+       names = of_get_property(dp, "partition-names", &plen);
 
-       for (i = 0; i < retval; i++) {
-               (*parts)[i].offset = *part++;
-               (*parts)[i].size   = *part & ~1;
-               if (*part++ & 1) /* bit 0 set signifies read only partition */
-                       (*parts)[i].mask_flags = MTD_WRITEABLE;
+       for (i = 0; i < nr_parts; i++) {
+               info->parts[i].offset = part->offset;
+               info->parts[i].size   = part->len & ~1;
+               if (part->len & 1) /* bit 0 set signifies read only partition */
+                       info->parts[i].mask_flags = MTD_WRITEABLE;
 
-               if (name != NULL && plen > 0) {
-                       int len = strlen(name) + 1;
+               if (names && (plen > 0)) {
+                       int len = strlen(names) + 1;
 
-                       (*parts)[i].name = (char *)name;
+                       info->parts[i].name = (char *)names;
                        plen -= len;
-                       name += len;
-               } else
-                       (*parts)[i].name = "unnamed";
+                       names += len;
+               } else {
+                       info->parts[i].name = "unnamed";
+               }
+
+               part++;
        }
-err:
-       return retval;
+
+       return nr_parts;
 }
-#endif
 
-static int of_physmap_remove(struct of_device *dev)
+static int __devinit parse_partitions(struct of_flash *info,
+                                     struct of_device *dev)
+{
+       const char *partname;
+       static const char *part_probe_types[]
+               = { "cmdlinepart", "RedBoot", NULL };
+       struct device_node *dp = dev->node, *pp;
+       int nr_parts, i;
+
+       /* First look for RedBoot table or partitions on the command
+        * line, these take precedence over device tree information */
+       nr_parts = parse_mtd_partitions(info->mtd, part_probe_types,
+                                       &info->parts, 0);
+       if (nr_parts > 0) {
+               add_mtd_partitions(info->mtd, info->parts, nr_parts);
+               return 0;
+       }
+
+       /* First count the subnodes */
+       nr_parts = 0;
+       for (pp = dp->child; pp; pp = pp->sibling)
+               nr_parts++;
+
+       if (nr_parts == 0)
+               return parse_obsolete_partitions(dev, info, dp);
+
+       info->parts = kzalloc(nr_parts * sizeof(*info->parts),
+                             GFP_KERNEL);
+       if (!info->parts)
+               return -ENOMEM;
+
+       for (pp = dp->child, i = 0; pp; pp = pp->sibling, i++) {
+               const u32 *reg;
+               int len;
+
+               reg = of_get_property(pp, "reg", &len);
+               if (!reg || (len != 2*sizeof(u32))) {
+                       dev_err(&dev->dev, "Invalid 'reg' on %s\n",
+                               dp->full_name);
+                       kfree(info->parts);
+                       info->parts = NULL;
+                       return -EINVAL;
+               }
+               info->parts[i].offset = reg[0];
+               info->parts[i].size = reg[1];
+
+               partname = of_get_property(pp, "label", &len);
+               if (!partname)
+                       partname = of_get_property(pp, "name", &len);
+               info->parts[i].name = (char *)partname;
+
+               if (of_get_property(pp, "read-only", &len))
+                       info->parts[i].mask_flags = MTD_WRITEABLE;
+       }
+
+       return nr_parts;
+}
+#else /* MTD_PARTITIONS */
+#define        OF_FLASH_PARTS(info)            (0)
+#define parse_partitions(info, dev)    (0)
+#endif /* MTD_PARTITIONS */
+
+static int of_flash_remove(struct of_device *dev)
 {
-       struct physmap_flash_info *info;
+       struct of_flash *info;
 
        info = dev_get_drvdata(&dev->dev);
-       if (info == NULL)
+       if (!info)
                return 0;
        dev_set_drvdata(&dev->dev, NULL);
 
-       if (info->mtd != NULL) {
-#ifdef CONFIG_MTD_PARTITIONS
-               if (info->nr_parts) {
+       if (info->mtd) {
+               if (OF_FLASH_PARTS(info)) {
                        del_mtd_partitions(info->mtd);
-                       kfree(info->parts);
+                       kfree(OF_FLASH_PARTS(info));
                } else {
                        del_mtd_device(info->mtd);
                }
-#else
-               del_mtd_device(info->mtd);
-#endif
                map_destroy(info->mtd);
        }
 
-       if (info->map.virt != NULL)
+       if (info->map.virt)
                iounmap(info->map.virt);
 
-       if (info->res != NULL) {
+       if (info->res) {
                release_resource(info->res);
                kfree(info->res);
        }
@@ -115,48 +173,79 @@ static int of_physmap_remove(struct of_device *dev)
        return 0;
 }
 
-static int __devinit of_physmap_probe(struct of_device *dev, const struct of_device_id *match)
+/* Helper function to handle probing of the obsolete "direct-mapped"
+ * compatible binding, which has an extra "probe-type" property
+ * describing the type of flash probe necessary. */
+static struct mtd_info * __devinit obsolete_probe(struct of_device *dev,
+                                                 struct map_info *map)
 {
        struct device_node *dp = dev->node;
-       struct resource res;
-       struct physmap_flash_info *info;
-       const char **probe_type;
        const char *of_probe;
+       struct mtd_info *mtd;
+       static const char *rom_probe_types[]
+               = { "cfi_probe", "jedec_probe", "map_rom"};
+       int i;
+
+       dev_warn(&dev->dev, "Device tree uses obsolete \"direct-mapped\" "
+                "flash binding\n");
+
+       of_probe = of_get_property(dp, "probe-type", NULL);
+       if (!of_probe) {
+               for (i = 0; i < ARRAY_SIZE(rom_probe_types); i++) {
+                       mtd = do_map_probe(rom_probe_types[i], map);
+                       if (mtd)
+                               return mtd;
+               }
+               return NULL;
+       } else if (strcmp(of_probe, "CFI") == 0) {
+               return do_map_probe("cfi_probe", map);
+       } else if (strcmp(of_probe, "JEDEC") == 0) {
+               return do_map_probe("jedec_probe", map);
+       } else {
+               if (strcmp(of_probe, "ROM") != 0)
+                       dev_warn(&dev->dev, "obsolete_probe: don't know probe "
+                                "type '%s', mapping as rom\n", of_probe);
+               return do_map_probe("mtd_rom", map);
+       }
+}
+
+static int __devinit of_flash_probe(struct of_device *dev,
+                                   const struct of_device_id *match)
+{
+       struct device_node *dp = dev->node;
+       struct resource res;
+       struct of_flash *info;
+       const char *probe_type = match->data;
        const u32 *width;
        int err;
 
-
+       err = -ENXIO;
        if (of_address_to_resource(dp, 0, &res)) {
-               dev_err(&dev->dev, "Can't get the flash mapping!\n");
-               err = -EINVAL;
+               dev_err(&dev->dev, "Can't get IO address from device tree\n");
                goto err_out;
        }
 
-               dev_dbg(&dev->dev, "physmap flash device: %.8llx at %.8llx\n",
-           (unsigned long long)res.end - res.start + 1,
-           (unsigned long long)res.start);
+               dev_dbg(&dev->dev, "of_flash device: %.8llx-%.8llx\n",
+               (unsigned long long)res.start, (unsigned long long)res.end);
 
-       info = kzalloc(sizeof(struct physmap_flash_info), GFP_KERNEL);
-       if (info == NULL) {
-               err = -ENOMEM;
+       err = -ENOMEM;
+       info = kzalloc(sizeof(*info), GFP_KERNEL);
+       if (!info)
                goto err_out;
-       }
        memset(info, 0, sizeof(*info));
 
        dev_set_drvdata(&dev->dev, info);
 
+       err = -EBUSY;
        info->res = request_mem_region(res.start, res.end - res.start + 1,
-                       dev->dev.bus_id);
-       if (info->res == NULL) {
-               dev_err(&dev->dev, "Could not reserve memory region\n");
-               err = -ENOMEM;
+                                      dev->dev.bus_id);
+       if (!info->res)
                goto err_out;
-       }
 
+       err = -ENXIO;
        width = of_get_property(dp, "bank-width", NULL);
-       if (width == NULL) {
-               dev_err(&dev->dev, "Can't get the flash bank width!\n");
-               err = -EINVAL;
+       if (!width) {
+               dev_err(&dev->dev, "Can't get bank width from device tree\n");
                goto err_out;
        }
 
@@ -165,91 +254,87 @@ static int __devinit of_physmap_probe(struct of_device *dev, const struct of_dev
        info->map.size = res.end - res.start + 1;
        info->map.bankwidth = *width;
 
+       err = -ENOMEM;
        info->map.virt = ioremap(info->map.phys, info->map.size);
-       if (info->map.virt == NULL) {
-               dev_err(&dev->dev, "Failed to ioremap flash region\n");
-               err = EIO;
+       if (!info->map.virt) {
+               dev_err(&dev->dev, "Failed to ioremap() flash region\n");
                goto err_out;
        }
 
        simple_map_init(&info->map);
 
-       of_probe = of_get_property(dp, "probe-type", NULL);
-       if (of_probe == NULL) {
-               probe_type = rom_probe_types;
-               for (; info->mtd == NULL && *probe_type != NULL; probe_type++)
-                       info->mtd = do_map_probe(*probe_type, &info->map);
-       } else if (!strcmp(of_probe, "CFI"))
-               info->mtd = do_map_probe("cfi_probe", &info->map);
-       else if (!strcmp(of_probe, "JEDEC"))
-               info->mtd = do_map_probe("jedec_probe", &info->map);
-       else {
-               if (strcmp(of_probe, "ROM"))
-                       dev_dbg(&dev->dev, "map_probe: don't know probe type "
-                       "'%s', mapping as rom\n", of_probe);
-               info->mtd = do_map_probe("mtd_rom", &info->map);
-       }
-       if (info->mtd == NULL) {
-               dev_err(&dev->dev, "map_probe failed\n");
-               err = -ENXIO;
+       if (probe_type)
+               info->mtd = do_map_probe(probe_type, &info->map);
+       else
+               info->mtd = obsolete_probe(dev, &info->map);
+
+       err = -ENXIO;
+       if (!info->mtd) {
+               dev_err(&dev->dev, "do_map_probe() failed\n");
                goto err_out;
        }
        info->mtd->owner = THIS_MODULE;
 
-#ifdef CONFIG_MTD_PARTITIONS
-       err = parse_mtd_partitions(info->mtd, part_probe_types, &info->parts, 0);
-       if (err > 0) {
-               add_mtd_partitions(info->mtd, info->parts, err);
-       } else if ((err = parse_flash_partitions(dp, &info->parts)) > 0) {
-               dev_info(&dev->dev, "Using OF partition information\n");
-               add_mtd_partitions(info->mtd, info->parts, err);
-               info->nr_parts = err;
-       } else
-#endif
+       err = parse_partitions(info, dev);
+       if (err < 0)
+               goto err_out;
+
+       if (err > 0)
+               add_mtd_partitions(info->mtd, OF_FLASH_PARTS(info), err);
+       else
+               add_mtd_device(info->mtd);
 
-       add_mtd_device(info->mtd);
        return 0;
 
 err_out:
-       of_physmap_remove(dev);
+       of_flash_remove(dev);
        return err;
-
-       return 0;
-
-
 }
 
-static struct of_device_id of_physmap_match[] = {
+static struct of_device_id of_flash_match[] = {
+       {
+               .compatible     = "cfi-flash",
+               .data           = (void *)"cfi_probe",
+       },
+       {
+               /* FIXME: JEDEC chips can't be safely and reliably
+                * probed, although the mtd code gets it right in
+                * practice most of the time.  We should use the
+                * vendor and device ids specified by the binding to
+                * bypass the heuristic probe code, but the mtd layer
+                * provides, at present, no interface for doing so
+                * :(. */
+               .compatible     = "jedec-flash",
+               .data           = (void *)"jedec_probe",
+       },
        {
                .type           = "rom",
                .compatible     = "direct-mapped"
        },
        { },
 };
+MODULE_DEVICE_TABLE(of, of_flash_match);
 
-MODULE_DEVICE_TABLE(of, of_physmap_match);
-
-
-static struct of_platform_driver of_physmap_flash_driver = {
-       .name           = "physmap-flash",
-       .match_table    = of_physmap_match,
-       .probe          = of_physmap_probe,
-       .remove         = of_physmap_remove,
+static struct of_platform_driver of_flash_driver = {
+       .name           = "of-flash",
+       .match_table    = of_flash_match,
+       .probe          = of_flash_probe,
+       .remove         = of_flash_remove,
 };
 
-static int __init of_physmap_init(void)
+static int __init of_flash_init(void)
 {
-       return of_register_platform_driver(&of_physmap_flash_driver);
+       return of_register_platform_driver(&of_flash_driver);
 }
 
-static void __exit of_physmap_exit(void)
+static void __exit of_flash_exit(void)
 {
-       of_unregister_platform_driver(&of_physmap_flash_driver);
+       of_unregister_platform_driver(&of_flash_driver);
 }
 
-module_init(of_physmap_init);
-module_exit(of_physmap_exit);
+module_init(of_flash_init);
+module_exit(of_flash_exit);
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Vitaly Wool <vwool@ru.mvista.com>");
-MODULE_DESCRIPTION("Configurable MTD map driver for OF");
+MODULE_DESCRIPTION("Device tree based MTD map driver");
index 9667dac383f04bd6e9e959852c744cac6f0fa720..d00e7d41f6a5ce6d47c694753e198eac329c6167 100644 (file)
@@ -2919,7 +2919,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth)
        test = in_be16(&ugeth->p_tx_glbl_pram->temoder);
 
        /* Function code register value to be used later */
-       function_code = QE_BMR_BYTE_ORDER_BO_MOT | UCC_FAST_FUNCTION_CODE_GBL;
+       function_code = UCC_BMR_BO_BE | UCC_BMR_GBL;
        /* Required for QE */
 
        /* function code register */
index aaeb9487798750469e1ea85271cc025559326d8e..4fb95b3af948f940026f957a526bfc08cac948dd 100644 (file)
@@ -44,6 +44,7 @@
 
 struct ucc_geth {
        struct ucc_fast uccf;
+       u8 res0[0x100 - sizeof(struct ucc_fast)];
 
        u32 maccfg1;            /* mac configuration reg. 1 */
        u32 maccfg2;            /* mac configuration reg. 2 */
index 6c257b88ce51ed8fc7206407e351f3c9f431c0ff..df884f0ad8e5860be83668b47ef6b03ffc7fe0d8 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
-#include <asm/ocp.h>
 #include <linux/crc32.h>
 #include <linux/mii.h>
 #include <linux/phy.h>
index 81b52b7cca21deb314f2b2a15864172ac6cf7eb0..d6ae38e55d01f72045fd7e8c239420937fa62298 100644 (file)
@@ -986,6 +986,31 @@ config SERIAL_PMACZILOG
          PowerMac machines.
          Say Y or M if you want to be able to these serial ports.
 
+config SERIAL_PMACZILOG_TTYS
+       bool "Use ttySn device nodes for Zilog z85c30"
+       depends on SERIAL_PMACZILOG
+       help
+         The pmac_zilog driver for the z85C30 chip on many powermacs
+         historically used the device numbers for /dev/ttySn.  The
+         8250 serial port driver also uses these numbers, which means
+         the two drivers being unable to coexist; you could not use
+         both z85C30 and 8250 type ports at the same time.
+
+         If this option is not selected, the pmac_zilog driver will
+         use the device numbers allocated for /dev/ttyPZn.  This allows
+         the pmac_zilog and 8250 drivers to co-exist, but may cause
+         existing userspace setups to break.  Programs that need to
+         access the built-in serial ports on powermacs will need to
+         be reconfigured to use /dev/ttyPZn instead of /dev/ttySn.
+
+         If you enable this option, any z85c30 ports in the system will
+         be registered as ttyS0 onwards as in the past, and you will be
+         unable to use the 8250 module for PCMCIA or other 16C550-style
+         UARTs.
+
+         Say N unless you need the z85c30 ports on your powermac
+         to appear as /dev/ttySn.
+
 config SERIAL_PMACZILOG_CONSOLE
        bool "Console on PowerMac z85c30 serial port"
        depends on SERIAL_PMACZILOG=y
index a8f894c7819463cd30b39eafd1bc10032f135965..32b9737759c45fdd3045cba8db1318d4d711ed86 100644 (file)
@@ -56,21 +56,21 @@ struct uart_cpm_port {
        u16                     rx_fifosize;
        u16                     tx_nrfifos;
        u16                     tx_fifosize;
-       smc_t                   *smcp;
-       smc_uart_t              *smcup;
-       scc_t                   *sccp;
-       scc_uart_t              *sccup;
-       volatile cbd_t          *rx_bd_base;
-       volatile cbd_t          *rx_cur;
-       volatile cbd_t          *tx_bd_base;
-       volatile cbd_t          *tx_cur;
+       smc_t __iomem           *smcp;
+       smc_uart_t __iomem      *smcup;
+       scc_t __iomem           *sccp;
+       scc_uart_t __iomem      *sccup;
+       cbd_t __iomem           *rx_bd_base;
+       cbd_t __iomem           *rx_cur;
+       cbd_t __iomem           *tx_bd_base;
+       cbd_t __iomem           *tx_cur;
        unsigned char           *tx_buf;
        unsigned char           *rx_buf;
        u32                     flags;
        void                    (*set_lineif)(struct uart_cpm_port *);
        u8                      brg;
        uint                     dp_addr;
-       void                    *mem_addr;
+       void                    *mem_addr;
        dma_addr_t               dma_addr;
        u32                     mem_size;
        /* helpers */
@@ -80,14 +80,18 @@ struct uart_cpm_port {
        int                     is_portb;
        /* wait on close if needed */
        int                     wait_closing;
+       /* value to combine with opcode to form cpm command */
+       u32                     command;
 };
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 extern int cpm_uart_port_map[UART_NR];
+#endif
 extern int cpm_uart_nr;
 extern struct uart_cpm_port cpm_uart_ports[UART_NR];
 
 /* these are located in their respective files */
-void cpm_line_cr_cmd(int line, int cmd);
+void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd);
 int cpm_uart_init_portdesc(void);
 int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con);
 void cpm_uart_freebuf(struct uart_cpm_port *pinfo);
@@ -102,34 +106,36 @@ void scc4_lineif(struct uart_cpm_port *pinfo);
 /*
    virtual to phys transtalion
 */
-static inline unsigned long cpu2cpm_addr(void* addr, struct uart_cpm_port *pinfo)
+static inline unsigned long cpu2cpm_addr(void *addr,
+                                         struct uart_cpm_port *pinfo)
 {
        int offset;
        u32 val = (u32)addr;
+       u32 mem = (u32)pinfo->mem_addr;
        /* sane check */
-       if (likely((val >= (u32)pinfo->mem_addr)) &&
-                       (val<((u32)pinfo->mem_addr + pinfo->mem_size))) {
-               offset = val - (u32)pinfo->mem_addr;
-               return pinfo->dma_addr+offset;
+       if (likely(val >= mem && val < mem + pinfo->mem_size)) {
+               offset = val - mem;
+               return pinfo->dma_addr + offset;
        }
        /* something nasty happened */
        BUG();
        return 0;
 }
 
-static inline void *cpm2cpu_addr(unsigned long addr, struct uart_cpm_port *pinfo)
+static inline void *cpm2cpu_addr(unsigned long addr,
+                                 struct uart_cpm_port *pinfo)
 {
        int offset;
        u32 val = addr;
+       u32 dma = (u32)pinfo->dma_addr;
        /* sane check */
-       if (likely((val >= pinfo->dma_addr) &&
-                       (val<(pinfo->dma_addr + pinfo->mem_size)))) {
-               offset = val - (u32)pinfo->dma_addr;
-               return (void*)(pinfo->mem_addr+offset);
+       if (likely(val >= dma && val < dma + pinfo->mem_size)) {
+               offset = val - dma;
+               return pinfo->mem_addr + offset;
        }
        /* something nasty happened */
        BUG();
-       return 0;
+       return NULL;
 }
 
 
index cefde58dbad2c73dcba3078d108034d0332bd148..b5e4478de0e3b31f3ef6a0adbfce536d5986d6c8 100644 (file)
@@ -10,7 +10,7 @@
  *  Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2)
  *              Pantelis Antoniou (panto@intracom.gr) (CPM1)
  *
- *  Copyright (C) 2004 Freescale Semiconductor, Inc.
+ *  Copyright (C) 2004, 2007 Freescale Semiconductor, Inc.
  *            (C) 2004 Intracom, S.A.
  *            (C) 2005-2006 MontaVista Software, Inc.
  *             Vitaly Bordug <vbordug@ru.mvista.com>
 #include <asm/irq.h>
 #include <asm/delay.h>
 #include <asm/fs_pd.h>
+#include <asm/udbg.h>
+
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+#include <linux/of_platform.h>
+#endif
 
 #if defined(CONFIG_SERIAL_CPM_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
 #define SUPPORT_SYSRQ
 
 #include "cpm_uart.h"
 
-/***********************************************************************/
-
-/* Track which ports are configured as uarts */
-int cpm_uart_port_map[UART_NR];
-/* How many ports did we config as uarts */
-int cpm_uart_nr = 0;
 
 /**************************************************************/
 
@@ -73,6 +72,11 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo);
 
 /**************************************************************/
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
+/* Track which ports are configured as uarts */
+int cpm_uart_port_map[UART_NR];
+/* How many ports did we config as uarts */
+int cpm_uart_nr;
 
 /* Place-holder for board-specific stuff */
 struct platform_device* __attribute__ ((weak)) __init
@@ -119,6 +123,7 @@ static int cpm_uart_id2nr(int id)
        /* not found or invalid argument */
        return -1;
 }
+#endif
 
 /*
  * Check, if transmit buffers are processed
@@ -126,14 +131,14 @@ static int cpm_uart_id2nr(int id)
 static unsigned int cpm_uart_tx_empty(struct uart_port *port)
 {
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile cbd_t *bdp = pinfo->tx_bd_base;
+       cbd_t __iomem *bdp = pinfo->tx_bd_base;
        int ret = 0;
 
        while (1) {
-               if (bdp->cbd_sc & BD_SC_READY)
+               if (in_be16(&bdp->cbd_sc) & BD_SC_READY)
                        break;
 
-               if (bdp->cbd_sc & BD_SC_WRAP) {
+               if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) {
                        ret = TIOCSER_TEMT;
                        break;
                }
@@ -162,15 +167,15 @@ static unsigned int cpm_uart_get_mctrl(struct uart_port *port)
 static void cpm_uart_stop_tx(struct uart_port *port)
 {
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile smc_t *smcp = pinfo->smcp;
-       volatile scc_t *sccp = pinfo->sccp;
+       smc_t __iomem *smcp = pinfo->smcp;
+       scc_t __iomem *sccp = pinfo->sccp;
 
        pr_debug("CPM uart[%d]:stop tx\n", port->line);
 
        if (IS_SMC(pinfo))
-               smcp->smc_smcm &= ~SMCM_TX;
+               clrbits8(&smcp->smc_smcm, SMCM_TX);
        else
-               sccp->scc_sccm &= ~UART_SCCM_TX;
+               clrbits16(&sccp->scc_sccm, UART_SCCM_TX);
 }
 
 /*
@@ -179,24 +184,24 @@ static void cpm_uart_stop_tx(struct uart_port *port)
 static void cpm_uart_start_tx(struct uart_port *port)
 {
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile smc_t *smcp = pinfo->smcp;
-       volatile scc_t *sccp = pinfo->sccp;
+       smc_t __iomem *smcp = pinfo->smcp;
+       scc_t __iomem *sccp = pinfo->sccp;
 
        pr_debug("CPM uart[%d]:start tx\n", port->line);
 
        if (IS_SMC(pinfo)) {
-               if (smcp->smc_smcm & SMCM_TX)
+               if (in_8(&smcp->smc_smcm) & SMCM_TX)
                        return;
        } else {
-               if (sccp->scc_sccm & UART_SCCM_TX)
+               if (in_be16(&sccp->scc_sccm) & UART_SCCM_TX)
                        return;
        }
 
        if (cpm_uart_tx_pump(port) != 0) {
                if (IS_SMC(pinfo)) {
-                       smcp->smc_smcm |= SMCM_TX;
+                       setbits8(&smcp->smc_smcm, SMCM_TX);
                } else {
-                       sccp->scc_sccm |= UART_SCCM_TX;
+                       setbits16(&sccp->scc_sccm, UART_SCCM_TX);
                }
        }
 }
@@ -207,15 +212,15 @@ static void cpm_uart_start_tx(struct uart_port *port)
 static void cpm_uart_stop_rx(struct uart_port *port)
 {
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile smc_t *smcp = pinfo->smcp;
-       volatile scc_t *sccp = pinfo->sccp;
+       smc_t __iomem *smcp = pinfo->smcp;
+       scc_t __iomem *sccp = pinfo->sccp;
 
        pr_debug("CPM uart[%d]:stop rx\n", port->line);
 
        if (IS_SMC(pinfo))
-               smcp->smc_smcm &= ~SMCM_RX;
+               clrbits8(&smcp->smc_smcm, SMCM_RX);
        else
-               sccp->scc_sccm &= ~UART_SCCM_RX;
+               clrbits16(&sccp->scc_sccm, UART_SCCM_RX);
 }
 
 /*
@@ -232,15 +237,14 @@ static void cpm_uart_enable_ms(struct uart_port *port)
 static void cpm_uart_break_ctl(struct uart_port *port, int break_state)
 {
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       int line = pinfo - cpm_uart_ports;
 
        pr_debug("CPM uart[%d]:break ctrl, break_state: %d\n", port->line,
                break_state);
 
        if (break_state)
-               cpm_line_cr_cmd(line, CPM_CR_STOP_TX);
+               cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
        else
-               cpm_line_cr_cmd(line, CPM_CR_RESTART_TX);
+               cpm_line_cr_cmd(pinfo, CPM_CR_RESTART_TX);
 }
 
 /*
@@ -259,10 +263,11 @@ static void cpm_uart_int_tx(struct uart_port *port)
 static void cpm_uart_int_rx(struct uart_port *port)
 {
        int i;
-       unsigned char ch, *cp;
+       unsigned char ch;
+       u8 *cp;
        struct tty_struct *tty = port->info->tty;
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile cbd_t *bdp;
+       cbd_t __iomem *bdp;
        u16 status;
        unsigned int flg;
 
@@ -274,13 +279,13 @@ static void cpm_uart_int_rx(struct uart_port *port)
        bdp = pinfo->rx_cur;
        for (;;) {
                /* get status */
-               status = bdp->cbd_sc;
+               status = in_be16(&bdp->cbd_sc);
                /* If this one is empty, return happy */
                if (status & BD_SC_EMPTY)
                        break;
 
                /* get number of characters, and check spce in flip-buffer */
-               i = bdp->cbd_datlen;
+               i = in_be16(&bdp->cbd_datlen);
 
                /* If we have not enough room in tty flip buffer, then we try
                 * later, which will be the next rx-interrupt or a timeout
@@ -291,7 +296,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
                }
 
                /* get pointer */
-               cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo);
+               cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo);
 
                /* loop through the buffer */
                while (i-- > 0) {
@@ -311,10 +316,11 @@ static void cpm_uart_int_rx(struct uart_port *port)
                }               /* End while (i--) */
 
                /* This BD is ready to be used again. Clear status. get next */
-               bdp->cbd_sc &= ~(BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV | BD_SC_ID);
-               bdp->cbd_sc |= BD_SC_EMPTY;
+               clrbits16(&bdp->cbd_sc, BD_SC_BR | BD_SC_FR | BD_SC_PR |
+                                       BD_SC_OV | BD_SC_ID);
+               setbits16(&bdp->cbd_sc, BD_SC_EMPTY);
 
-               if (bdp->cbd_sc & BD_SC_WRAP)
+               if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP)
                        bdp = pinfo->rx_bd_base;
                else
                        bdp++;
@@ -322,7 +328,7 @@ static void cpm_uart_int_rx(struct uart_port *port)
        } /* End for (;;) */
 
        /* Write back buffer pointer */
-       pinfo->rx_cur = (volatile cbd_t *) bdp;
+       pinfo->rx_cur = bdp;
 
        /* activate BH processing */
        tty_flip_buffer_push(tty);
@@ -376,14 +382,14 @@ static irqreturn_t cpm_uart_int(int irq, void *data)
        u8 events;
        struct uart_port *port = (struct uart_port *)data;
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile smc_t *smcp = pinfo->smcp;
-       volatile scc_t *sccp = pinfo->sccp;
+       smc_t __iomem *smcp = pinfo->smcp;
+       scc_t __iomem *sccp = pinfo->sccp;
 
        pr_debug("CPM uart[%d]:IRQ\n", port->line);
 
        if (IS_SMC(pinfo)) {
-               events = smcp->smc_smce;
-               smcp->smc_smce = events;
+               events = in_8(&smcp->smc_smce);
+               out_8(&smcp->smc_smce, events);
                if (events & SMCM_BRKE)
                        uart_handle_break(port);
                if (events & SMCM_RX)
@@ -391,8 +397,8 @@ static irqreturn_t cpm_uart_int(int irq, void *data)
                if (events & SMCM_TX)
                        cpm_uart_int_tx(port);
        } else {
-               events = sccp->scc_scce;
-               sccp->scc_scce = events;
+               events = in_be16(&sccp->scc_scce);
+               out_be16(&sccp->scc_scce, events);
                if (events & UART_SCCM_BRKE)
                        uart_handle_break(port);
                if (events & UART_SCCM_RX)
@@ -407,7 +413,6 @@ static int cpm_uart_startup(struct uart_port *port)
 {
        int retval;
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       int line = pinfo - cpm_uart_ports;
 
        pr_debug("CPM uart[%d]:startup\n", port->line);
 
@@ -418,15 +423,15 @@ static int cpm_uart_startup(struct uart_port *port)
 
        /* Startup rx-int */
        if (IS_SMC(pinfo)) {
-               pinfo->smcp->smc_smcm |= SMCM_RX;
-               pinfo->smcp->smc_smcmr |= (SMCMR_REN | SMCMR_TEN);
+               setbits8(&pinfo->smcp->smc_smcm, SMCM_RX);
+               setbits16(&pinfo->smcp->smc_smcmr, (SMCMR_REN | SMCMR_TEN));
        } else {
-               pinfo->sccp->scc_sccm |= UART_SCCM_RX;
-               pinfo->sccp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+               setbits16(&pinfo->sccp->scc_sccm, UART_SCCM_RX);
+               setbits32(&pinfo->sccp->scc_gsmrl, (SCC_GSMRL_ENR | SCC_GSMRL_ENT));
        }
 
        if (!(pinfo->flags & FLAG_CONSOLE))
-               cpm_line_cr_cmd(line,CPM_CR_INIT_TRX);
+               cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX);
        return 0;
 }
 
@@ -442,7 +447,6 @@ inline void cpm_uart_wait_until_send(struct uart_cpm_port *pinfo)
 static void cpm_uart_shutdown(struct uart_port *port)
 {
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       int line = pinfo - cpm_uart_ports;
 
        pr_debug("CPM uart[%d]:shutdown\n", port->line);
 
@@ -462,20 +466,20 @@ static void cpm_uart_shutdown(struct uart_port *port)
 
                /* Stop uarts */
                if (IS_SMC(pinfo)) {
-                       volatile smc_t *smcp = pinfo->smcp;
-                       smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
-                       smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX);
+                       smc_t __iomem *smcp = pinfo->smcp;
+                       clrbits16(&smcp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
+                       clrbits8(&smcp->smc_smcm, SMCM_RX | SMCM_TX);
                } else {
-                       volatile scc_t *sccp = pinfo->sccp;
-                       sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
-                       sccp->scc_sccm &= ~(UART_SCCM_TX | UART_SCCM_RX);
+                       scc_t __iomem *sccp = pinfo->sccp;
+                       clrbits32(&sccp->scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+                       clrbits16(&sccp->scc_sccm, UART_SCCM_TX | UART_SCCM_RX);
                }
 
                /* Shut them really down and reinit buffer descriptors */
                if (IS_SMC(pinfo))
-                       cpm_line_cr_cmd(line, CPM_CR_STOP_TX);
+                       cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
                else
-                       cpm_line_cr_cmd(line, CPM_CR_GRA_STOP_TX);
+                       cpm_line_cr_cmd(pinfo, CPM_CR_GRA_STOP_TX);
 
                cpm_uart_initbd(pinfo);
        }
@@ -490,8 +494,8 @@ static void cpm_uart_set_termios(struct uart_port *port,
        u16 cval, scval, prev_mode;
        int bits, sbits;
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
-       volatile smc_t *smcp = pinfo->smcp;
-       volatile scc_t *sccp = pinfo->sccp;
+       smc_t __iomem *smcp = pinfo->smcp;
+       scc_t __iomem *sccp = pinfo->sccp;
 
        pr_debug("CPM uart[%d]:set_termios\n", port->line);
 
@@ -586,16 +590,15 @@ static void cpm_uart_set_termios(struct uart_port *port,
                 * enables, because we want to put them back if they were
                 * present.
                 */
-               prev_mode = smcp->smc_smcmr;
-               smcp->smc_smcmr = smcr_mk_clen(bits) | cval | SMCMR_SM_UART;
-               smcp->smc_smcmr |= (prev_mode & (SMCMR_REN | SMCMR_TEN));
+               prev_mode = in_be16(&smcp->smc_smcmr);
+               out_be16(&smcp->smc_smcmr, smcr_mk_clen(bits) | cval | SMCMR_SM_UART);
+               setbits16(&smcp->smc_smcmr, (prev_mode & (SMCMR_REN | SMCMR_TEN)));
        } else {
-               sccp->scc_psmr = (sbits << 12) | scval;
+               out_be16(&sccp->scc_psmr, (sbits << 12) | scval);
        }
 
        cpm_set_brg(pinfo->brg - 1, baud);
        spin_unlock_irqrestore(&port->lock, flags);
-
 }
 
 static const char *cpm_uart_type(struct uart_port *port)
@@ -629,8 +632,8 @@ static int cpm_uart_verify_port(struct uart_port *port,
  */
 static int cpm_uart_tx_pump(struct uart_port *port)
 {
-       volatile cbd_t *bdp;
-       unsigned char *p;
+       cbd_t __iomem *bdp;
+       u8 *p;
        int count;
        struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port;
        struct circ_buf *xmit = &port->info->xmit;
@@ -640,13 +643,14 @@ static int cpm_uart_tx_pump(struct uart_port *port)
                /* Pick next descriptor and fill from buffer */
                bdp = pinfo->tx_cur;
 
-               p = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo);
+               p = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo);
 
                *p++ = port->x_char;
-               bdp->cbd_datlen = 1;
-               bdp->cbd_sc |= BD_SC_READY;
+
+               out_be16(&bdp->cbd_datlen, 1);
+               setbits16(&bdp->cbd_sc, BD_SC_READY);
                /* Get next BD. */
-               if (bdp->cbd_sc & BD_SC_WRAP)
+               if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP)
                        bdp = pinfo->tx_bd_base;
                else
                        bdp++;
@@ -665,9 +669,10 @@ static int cpm_uart_tx_pump(struct uart_port *port)
        /* Pick next descriptor and fill from buffer */
        bdp = pinfo->tx_cur;
 
-       while (!(bdp->cbd_sc & BD_SC_READY) && (xmit->tail != xmit->head)) {
+       while (!(in_be16(&bdp->cbd_sc) & BD_SC_READY) &&
+              xmit->tail != xmit->head) {
                count = 0;
-               p = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo);
+               p = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo);
                while (count < pinfo->tx_fifosize) {
                        *p++ = xmit->buf[xmit->tail];
                        xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
@@ -676,11 +681,10 @@ static int cpm_uart_tx_pump(struct uart_port *port)
                        if (xmit->head == xmit->tail)
                                break;
                }
-               bdp->cbd_datlen = count;
-               bdp->cbd_sc |= BD_SC_READY;
-               eieio();
+               out_be16(&bdp->cbd_datlen, count);
+               setbits16(&bdp->cbd_sc, BD_SC_READY);
                /* Get next BD. */
-               if (bdp->cbd_sc & BD_SC_WRAP)
+               if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP)
                        bdp = pinfo->tx_bd_base;
                else
                        bdp++;
@@ -705,7 +709,7 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo)
 {
        int i;
        u8 *mem_addr;
-       volatile cbd_t *bdp;
+       cbd_t __iomem *bdp;
 
        pr_debug("CPM uart[%d]:initbd\n", pinfo->port.line);
 
@@ -716,13 +720,13 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo)
        mem_addr = pinfo->mem_addr;
        bdp = pinfo->rx_cur = pinfo->rx_bd_base;
        for (i = 0; i < (pinfo->rx_nrfifos - 1); i++, bdp++) {
-               bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo);
-               bdp->cbd_sc = BD_SC_EMPTY | BD_SC_INTRPT;
+               out_be32(&bdp->cbd_bufaddr, cpu2cpm_addr(mem_addr, pinfo));
+               out_be16(&bdp->cbd_sc, BD_SC_EMPTY | BD_SC_INTRPT);
                mem_addr += pinfo->rx_fifosize;
        }
 
-       bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo);
-       bdp->cbd_sc = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT;
+       out_be32(&bdp->cbd_bufaddr, cpu2cpm_addr(mem_addr, pinfo));
+       out_be16(&bdp->cbd_sc, BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT);
 
        /* Set the physical address of the host memory
         * buffers in the buffer descriptors, and the
@@ -731,20 +735,19 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo)
        mem_addr = pinfo->mem_addr + L1_CACHE_ALIGN(pinfo->rx_nrfifos * pinfo->rx_fifosize);
        bdp = pinfo->tx_cur = pinfo->tx_bd_base;
        for (i = 0; i < (pinfo->tx_nrfifos - 1); i++, bdp++) {
-               bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo);
-               bdp->cbd_sc = BD_SC_INTRPT;
+               out_be32(&bdp->cbd_bufaddr, cpu2cpm_addr(mem_addr, pinfo));
+               out_be16(&bdp->cbd_sc, BD_SC_INTRPT);
                mem_addr += pinfo->tx_fifosize;
        }
 
-       bdp->cbd_bufaddr = cpu2cpm_addr(mem_addr, pinfo);
-       bdp->cbd_sc = BD_SC_WRAP | BD_SC_INTRPT;
+       out_be32(&bdp->cbd_bufaddr, cpu2cpm_addr(mem_addr, pinfo));
+       out_be16(&bdp->cbd_sc, BD_SC_WRAP | BD_SC_INTRPT);
 }
 
 static void cpm_uart_init_scc(struct uart_cpm_port *pinfo)
 {
-       int line = pinfo - cpm_uart_ports;
-       volatile scc_t *scp;
-       volatile scc_uart_t *sup;
+       scc_t __iomem *scp;
+       scc_uart_t __iomem *sup;
 
        pr_debug("CPM uart[%d]:init_scc\n", pinfo->port.line);
 
@@ -752,8 +755,10 @@ static void cpm_uart_init_scc(struct uart_cpm_port *pinfo)
        sup = pinfo->sccup;
 
        /* Store address */
-       pinfo->sccup->scc_genscc.scc_rbase = (unsigned char *)pinfo->rx_bd_base - DPRAM_BASE;
-       pinfo->sccup->scc_genscc.scc_tbase = (unsigned char *)pinfo->tx_bd_base - DPRAM_BASE;
+       out_be16(&pinfo->sccup->scc_genscc.scc_rbase,
+                (u8 __iomem *)pinfo->rx_bd_base - DPRAM_BASE);
+       out_be16(&pinfo->sccup->scc_genscc.scc_tbase,
+                (u8 __iomem *)pinfo->tx_bd_base - DPRAM_BASE);
 
        /* Set up the uart parameters in the
         * parameter ram.
@@ -761,51 +766,50 @@ static void cpm_uart_init_scc(struct uart_cpm_port *pinfo)
 
        cpm_set_scc_fcr(sup);
 
-       sup->scc_genscc.scc_mrblr = pinfo->rx_fifosize;
-       sup->scc_maxidl = pinfo->rx_fifosize;
-       sup->scc_brkcr = 1;
-       sup->scc_parec = 0;
-       sup->scc_frmec = 0;
-       sup->scc_nosec = 0;
-       sup->scc_brkec = 0;
-       sup->scc_uaddr1 = 0;
-       sup->scc_uaddr2 = 0;
-       sup->scc_toseq = 0;
-       sup->scc_char1 = 0x8000;
-       sup->scc_char2 = 0x8000;
-       sup->scc_char3 = 0x8000;
-       sup->scc_char4 = 0x8000;
-       sup->scc_char5 = 0x8000;
-       sup->scc_char6 = 0x8000;
-       sup->scc_char7 = 0x8000;
-       sup->scc_char8 = 0x8000;
-       sup->scc_rccm = 0xc0ff;
+       out_be16(&sup->scc_genscc.scc_mrblr, pinfo->rx_fifosize);
+       out_be16(&sup->scc_maxidl, pinfo->rx_fifosize);
+       out_be16(&sup->scc_brkcr, 1);
+       out_be16(&sup->scc_parec, 0);
+       out_be16(&sup->scc_frmec, 0);
+       out_be16(&sup->scc_nosec, 0);
+       out_be16(&sup->scc_brkec, 0);
+       out_be16(&sup->scc_uaddr1, 0);
+       out_be16(&sup->scc_uaddr2, 0);
+       out_be16(&sup->scc_toseq, 0);
+       out_be16(&sup->scc_char1, 0x8000);
+       out_be16(&sup->scc_char2, 0x8000);
+       out_be16(&sup->scc_char3, 0x8000);
+       out_be16(&sup->scc_char4, 0x8000);
+       out_be16(&sup->scc_char5, 0x8000);
+       out_be16(&sup->scc_char6, 0x8000);
+       out_be16(&sup->scc_char7, 0x8000);
+       out_be16(&sup->scc_char8, 0x8000);
+       out_be16(&sup->scc_rccm, 0xc0ff);
 
        /* Send the CPM an initialize command.
         */
-       cpm_line_cr_cmd(line, CPM_CR_INIT_TRX);
+       cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX);
 
        /* Set UART mode, 8 bit, no parity, one stop.
         * Enable receive and transmit.
         */
-       scp->scc_gsmrh = 0;
-       scp->scc_gsmrl =
-           (SCC_GSMRL_MODE_UART | SCC_GSMRL_TDCR_16 | SCC_GSMRL_RDCR_16);
+       out_be32(&scp->scc_gsmrh, 0);
+       out_be32(&scp->scc_gsmrl,
+                SCC_GSMRL_MODE_UART | SCC_GSMRL_TDCR_16 | SCC_GSMRL_RDCR_16);
 
        /* Enable rx interrupts  and clear all pending events.  */
-       scp->scc_sccm = 0;
-       scp->scc_scce = 0xffff;
-       scp->scc_dsr = 0x7e7e;
-       scp->scc_psmr = 0x3000;
+       out_be16(&scp->scc_sccm, 0);
+       out_be16(&scp->scc_scce, 0xffff);
+       out_be16(&scp->scc_dsr, 0x7e7e);
+       out_be16(&scp->scc_psmr, 0x3000);
 
-       scp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+       setbits32(&scp->scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
 }
 
 static void cpm_uart_init_smc(struct uart_cpm_port *pinfo)
 {
-       int line = pinfo - cpm_uart_ports;
-       volatile smc_t *sp;
-       volatile smc_uart_t *up;
+       smc_t __iomem *sp;
+       smc_uart_t __iomem *up;
 
        pr_debug("CPM uart[%d]:init_smc\n", pinfo->port.line);
 
@@ -813,19 +817,21 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo)
        up = pinfo->smcup;
 
        /* Store address */
-       pinfo->smcup->smc_rbase = (u_char *)pinfo->rx_bd_base - DPRAM_BASE;
-       pinfo->smcup->smc_tbase = (u_char *)pinfo->tx_bd_base - DPRAM_BASE;
+       out_be16(&pinfo->smcup->smc_rbase,
+                (u8 __iomem *)pinfo->rx_bd_base - DPRAM_BASE);
+       out_be16(&pinfo->smcup->smc_tbase,
+                (u8 __iomem *)pinfo->tx_bd_base - DPRAM_BASE);
 
 /*
  *  In case SMC1 is being relocated...
  */
 #if defined (CONFIG_I2C_SPI_SMC1_UCODE_PATCH)
-       up->smc_rbptr = pinfo->smcup->smc_rbase;
-       up->smc_tbptr = pinfo->smcup->smc_tbase;
-       up->smc_rstate = 0;
-       up->smc_tstate = 0;
-       up->smc_brkcr = 1;              /* number of break chars */
-       up->smc_brkec = 0;
+       out_be16(&up->smc_rbptr, in_be16(&pinfo->smcup->smc_rbase));
+       out_be16(&up->smc_tbptr, in_be16(&pinfo->smcup->smc_tbase));
+       out_be32(&up->smc_rstate, 0);
+       out_be32(&up->smc_tstate, 0);
+       out_be16(&up->smc_brkcr, 1);              /* number of break chars */
+       out_be16(&up->smc_brkec, 0);
 #endif
 
        /* Set up the uart parameters in the
@@ -834,24 +840,24 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo)
        cpm_set_smc_fcr(up);
 
        /* Using idle charater time requires some additional tuning.  */
-       up->smc_mrblr = pinfo->rx_fifosize;
-       up->smc_maxidl = pinfo->rx_fifosize;
-       up->smc_brklen = 0;
-       up->smc_brkec = 0;
-       up->smc_brkcr = 1;
+       out_be16(&up->smc_mrblr, pinfo->rx_fifosize);
+       out_be16(&up->smc_maxidl, pinfo->rx_fifosize);
+       out_be16(&up->smc_brklen, 0);
+       out_be16(&up->smc_brkec, 0);
+       out_be16(&up->smc_brkcr, 1);
 
-       cpm_line_cr_cmd(line, CPM_CR_INIT_TRX);
+       cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX);
 
        /* Set UART mode, 8 bit, no parity, one stop.
         * Enable receive and transmit.
         */
-       sp->smc_smcmr = smcr_mk_clen(9) | SMCMR_SM_UART;
+       out_be16(&sp->smc_smcmr, smcr_mk_clen(9) | SMCMR_SM_UART);
 
        /* Enable only rx interrupts clear all pending events. */
-       sp->smc_smcm = 0;
-       sp->smc_smce = 0xff;
+       out_8(&sp->smc_smcm, 0);
+       out_8(&sp->smc_smce, 0xff);
 
-       sp->smc_smcmr |= (SMCMR_REN | SMCMR_TEN);
+       setbits16(&sp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
 }
 
 /*
@@ -869,11 +875,11 @@ static int cpm_uart_request_port(struct uart_port *port)
                return 0;
 
        if (IS_SMC(pinfo)) {
-               pinfo->smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX);
-               pinfo->smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
+               clrbits8(&pinfo->smcp->smc_smcm, SMCM_RX | SMCM_TX);
+               clrbits16(&pinfo->smcp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
        } else {
-               pinfo->sccp->scc_sccm &= ~(UART_SCCM_TX | UART_SCCM_RX);
-               pinfo->sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+               clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_TX | UART_SCCM_RX);
+               clrbits32(&pinfo->sccp->scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
        }
 
        ret = cpm_uart_allocbuf(pinfo, 0);
@@ -929,6 +935,86 @@ static struct uart_ops cpm_uart_pops = {
        .verify_port    = cpm_uart_verify_port,
 };
 
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+struct uart_cpm_port cpm_uart_ports[UART_NR];
+
+static int cpm_uart_init_port(struct device_node *np,
+                              struct uart_cpm_port *pinfo)
+{
+       const u32 *data;
+       void __iomem *mem, *pram;
+       int len;
+       int ret;
+
+       data = of_get_property(np, "fsl,cpm-brg", &len);
+       if (!data || len != 4) {
+               printk(KERN_ERR "CPM UART %s has no/invalid "
+                               "fsl,cpm-brg property.\n", np->name);
+               return -EINVAL;
+       }
+       pinfo->brg = *data;
+
+       data = of_get_property(np, "fsl,cpm-command", &len);
+       if (!data || len != 4) {
+               printk(KERN_ERR "CPM UART %s has no/invalid "
+                               "fsl,cpm-command property.\n", np->name);
+               return -EINVAL;
+       }
+       pinfo->command = *data;
+
+       mem = of_iomap(np, 0);
+       if (!mem)
+               return -ENOMEM;
+
+       pram = of_iomap(np, 1);
+       if (!pram) {
+               ret = -ENOMEM;
+               goto out_mem;
+       }
+
+       if (of_device_is_compatible(np, "fsl,cpm1-scc-uart") ||
+           of_device_is_compatible(np, "fsl,cpm2-scc-uart")) {
+               pinfo->sccp = mem;
+               pinfo->sccup = pram;
+       } else if (of_device_is_compatible(np, "fsl,cpm1-smc-uart") ||
+                  of_device_is_compatible(np, "fsl,cpm2-smc-uart")) {
+               pinfo->flags |= FLAG_SMC;
+               pinfo->smcp = mem;
+               pinfo->smcup = pram;
+       } else {
+               ret = -ENODEV;
+               goto out_pram;
+       }
+
+       pinfo->tx_nrfifos = TX_NUM_FIFO;
+       pinfo->tx_fifosize = TX_BUF_SIZE;
+       pinfo->rx_nrfifos = RX_NUM_FIFO;
+       pinfo->rx_fifosize = RX_BUF_SIZE;
+
+       pinfo->port.uartclk = ppc_proc_freq;
+       pinfo->port.mapbase = (unsigned long)mem;
+       pinfo->port.type = PORT_CPM;
+       pinfo->port.ops = &cpm_uart_pops,
+       pinfo->port.iotype = UPIO_MEM;
+       spin_lock_init(&pinfo->port.lock);
+
+       pinfo->port.irq = of_irq_to_resource(np, 0, NULL);
+       if (pinfo->port.irq == NO_IRQ) {
+               ret = -EINVAL;
+               goto out_pram;
+       }
+
+       return cpm_uart_request_port(&pinfo->port);
+
+out_pram:
+       iounmap(pram);
+out_mem:
+       iounmap(mem);
+       return ret;
+}
+
+#else
+
 struct uart_cpm_port cpm_uart_ports[UART_NR] = {
        [UART_SMC1] = {
                .port = {
@@ -1072,6 +1158,7 @@ int cpm_uart_drv_get_platform_data(struct platform_device *pdev, int is_con)
 
        return 0;
 }
+#endif
 
 #ifdef CONFIG_SERIAL_CPM_CONSOLE
 /*
@@ -1083,11 +1170,15 @@ int cpm_uart_drv_get_platform_data(struct platform_device *pdev, int is_con)
 static void cpm_uart_console_write(struct console *co, const char *s,
                                   u_int count)
 {
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+       struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index];
+#else
        struct uart_cpm_port *pinfo =
            &cpm_uart_ports[cpm_uart_port_map[co->index]];
+#endif
        unsigned int i;
-       volatile cbd_t *bdp, *bdbase;
-       volatile unsigned char *cp;
+       cbd_t __iomem *bdp, *bdbase;
+       unsigned char *cp;
 
        /* Get the address of the host memory buffer.
         */
@@ -1105,37 +1196,36 @@ static void cpm_uart_console_write(struct console *co, const char *s,
                 * Ready indicates output is ready, and xmt is doing
                 * that, not that it is ready for us to send.
                 */
-               while ((bdp->cbd_sc & BD_SC_READY) != 0)
+               while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0)
                        ;
 
                /* Send the character out.
                 * If the buffer address is in the CPM DPRAM, don't
                 * convert it.
                 */
-               cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo);
-
+               cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo);
                *cp = *s;
 
-               bdp->cbd_datlen = 1;
-               bdp->cbd_sc |= BD_SC_READY;
+               out_be16(&bdp->cbd_datlen, 1);
+               setbits16(&bdp->cbd_sc, BD_SC_READY);
 
-               if (bdp->cbd_sc & BD_SC_WRAP)
+               if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP)
                        bdp = bdbase;
                else
                        bdp++;
 
                /* if a LF, also do CR... */
                if (*s == 10) {
-                       while ((bdp->cbd_sc & BD_SC_READY) != 0)
+                       while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0)
                                ;
 
-                       cp = cpm2cpu_addr(bdp->cbd_bufaddr, pinfo);
-
+                       cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo);
                        *cp = 13;
-                       bdp->cbd_datlen = 1;
-                       bdp->cbd_sc |= BD_SC_READY;
 
-                       if (bdp->cbd_sc & BD_SC_WRAP)
+                       out_be16(&bdp->cbd_datlen, 1);
+                       setbits16(&bdp->cbd_sc, BD_SC_READY);
+
+                       if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP)
                                bdp = bdbase;
                        else
                                bdp++;
@@ -1146,22 +1236,56 @@ static void cpm_uart_console_write(struct console *co, const char *s,
         * Finally, Wait for transmitter & holding register to empty
         *  and restore the IER
         */
-       while ((bdp->cbd_sc & BD_SC_READY) != 0)
+       while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0)
                ;
 
-       pinfo->tx_cur = (volatile cbd_t *) bdp;
+       pinfo->tx_cur = bdp;
 }
 
 
 static int __init cpm_uart_console_setup(struct console *co, char *options)
 {
-       struct uart_port *port;
-       struct uart_cpm_port *pinfo;
        int baud = 38400;
        int bits = 8;
        int parity = 'n';
        int flow = 'n';
        int ret;
+       struct uart_cpm_port *pinfo;
+       struct uart_port *port;
+
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+       struct device_node *np = NULL;
+       int i = 0;
+
+       if (co->index >= UART_NR) {
+               printk(KERN_ERR "cpm_uart: console index %d too high\n",
+                      co->index);
+               return -ENODEV;
+       }
+
+       do {
+               np = of_find_node_by_type(np, "serial");
+               if (!np)
+                       return -ENODEV;
+
+               if (!of_device_is_compatible(np, "fsl,cpm1-smc-uart") &&
+                   !of_device_is_compatible(np, "fsl,cpm1-scc-uart") &&
+                   !of_device_is_compatible(np, "fsl,cpm2-smc-uart") &&
+                   !of_device_is_compatible(np, "fsl,cpm2-scc-uart"))
+                       i--;
+       } while (i++ != co->index);
+
+       pinfo = &cpm_uart_ports[co->index];
+
+       pinfo->flags |= FLAG_CONSOLE;
+       port = &pinfo->port;
+
+       ret = cpm_uart_init_port(np, pinfo);
+       of_node_put(np);
+       if (ret)
+               return ret;
+
+#else
 
        struct fs_uart_platform_info *pdata;
        struct platform_device* pdev = early_uart_get_pdev(co->index);
@@ -1188,6 +1312,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
        }
 
        pinfo->flags |= FLAG_CONSOLE;
+#endif
 
        if (options) {
                uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -1196,12 +1321,18 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
                        baud = 9600;
        }
 
+#ifdef CONFIG_PPC_EARLY_DEBUG_CPM
+       udbg_putc = NULL;
+#endif
+
+       cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX);
+
        if (IS_SMC(pinfo)) {
-               pinfo->smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX);
-               pinfo->smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN);
+               clrbits8(&pinfo->smcp->smc_smcm, SMCM_RX | SMCM_TX);
+               clrbits16(&pinfo->smcp->smc_smcmr, SMCMR_REN | SMCMR_TEN);
        } else {
-               pinfo->sccp->scc_sccm &= ~(UART_SCCM_TX | UART_SCCM_RX);
-               pinfo->sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
+               clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_TX | UART_SCCM_RX);
+               clrbits32(&pinfo->sccp->scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT);
        }
 
        ret = cpm_uart_allocbuf(pinfo, 1);
@@ -1217,6 +1348,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
                cpm_uart_init_scc(pinfo);
 
        uart_set_options(port, co, baud, parity, bits, flow);
+       cpm_line_cr_cmd(pinfo, CPM_CR_RESTART_TX);
 
        return 0;
 }
@@ -1232,7 +1364,7 @@ static struct console cpm_scc_uart_console = {
        .data           = &cpm_reg,
 };
 
-int __init cpm_uart_console_init(void)
+static int __init cpm_uart_console_init(void)
 {
        register_console(&cpm_scc_uart_console);
        return 0;
@@ -1252,7 +1384,81 @@ static struct uart_driver cpm_reg = {
        .major          = SERIAL_CPM_MAJOR,
        .minor          = SERIAL_CPM_MINOR,
        .cons           = CPM_UART_CONSOLE,
+       .nr             = UART_NR,
 };
+
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+static int probe_index;
+
+static int __devinit cpm_uart_probe(struct of_device *ofdev,
+                                    const struct of_device_id *match)
+{
+       int index = probe_index++;
+       struct uart_cpm_port *pinfo = &cpm_uart_ports[index];
+       int ret;
+
+       pinfo->port.line = index;
+
+       if (index >= UART_NR)
+               return -ENODEV;
+
+       dev_set_drvdata(&ofdev->dev, pinfo);
+
+       ret = cpm_uart_init_port(ofdev->node, pinfo);
+       if (ret)
+               return ret;
+
+       return uart_add_one_port(&cpm_reg, &pinfo->port);
+}
+
+static int __devexit cpm_uart_remove(struct of_device *ofdev)
+{
+       struct uart_cpm_port *pinfo = dev_get_drvdata(&ofdev->dev);
+       return uart_remove_one_port(&cpm_reg, &pinfo->port);
+}
+
+static struct of_device_id cpm_uart_match[] = {
+       {
+               .compatible = "fsl,cpm1-smc-uart",
+       },
+       {
+               .compatible = "fsl,cpm1-scc-uart",
+       },
+       {
+               .compatible = "fsl,cpm2-smc-uart",
+       },
+       {
+               .compatible = "fsl,cpm2-scc-uart",
+       },
+       {}
+};
+
+static struct of_platform_driver cpm_uart_driver = {
+       .name = "cpm_uart",
+       .match_table = cpm_uart_match,
+       .probe = cpm_uart_probe,
+       .remove = cpm_uart_remove,
+ };
+
+static int __init cpm_uart_init(void)
+{
+       int ret = uart_register_driver(&cpm_reg);
+       if (ret)
+               return ret;
+
+       ret = of_register_platform_driver(&cpm_uart_driver);
+       if (ret)
+               uart_unregister_driver(&cpm_reg);
+
+       return ret;
+}
+
+static void __exit cpm_uart_exit(void)
+{
+       of_unregister_platform_driver(&cpm_uart_driver);
+       uart_unregister_driver(&cpm_reg);
+}
+#else
 static int cpm_uart_drv_probe(struct device *dev)
 {
        struct platform_device  *pdev = to_platform_device(dev);
@@ -1380,6 +1586,7 @@ static void __exit cpm_uart_exit(void)
        driver_unregister(&cpm_smc_uart_driver);
        uart_unregister_driver(&cpm_reg);
 }
+#endif
 
 module_init(cpm_uart_init);
 module_exit(cpm_uart_exit);
index 8c6324ed0202dda2b7568a3478f1e2ca3c948434..52fb044bb79a917333788d033217016fefce868f 100644 (file)
 
 /**************************************************************/
 
-void cpm_line_cr_cmd(int line, int cmd)
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
+{
+       u16 __iomem *cpcr = &cpmp->cp_cpcr;
+
+       out_be16(cpcr, port->command | (cmd << 8) | CPM_CR_FLG);
+       while (in_be16(cpcr) & CPM_CR_FLG)
+               ;
+}
+#else
+void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
 {
        ushort val;
+       int line = port - cpm_uart_ports;
        volatile cpm8xx_t *cp = cpmp;
 
        switch (line) {
@@ -114,6 +125,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo)
        /* XXX SCC4: insert port configuration here */
        pinfo->brg = 4;
 }
+#endif
 
 /*
  * Allocate DP-Ram and memory buffers. We need to allocate a transmit and
@@ -167,7 +179,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
        pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos
                                                       * pinfo->rx_fifosize);
 
-       pinfo->rx_bd_base = (volatile cbd_t *)dp_mem;
+       pinfo->rx_bd_base = (cbd_t __iomem __force *)dp_mem;
        pinfo->tx_bd_base = pinfo->rx_bd_base + pinfo->rx_nrfifos;
 
        return 0;
@@ -184,6 +196,7 @@ void cpm_uart_freebuf(struct uart_cpm_port *pinfo)
        cpm_dpfree(pinfo->dp_addr);
 }
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 /* Setup any dynamic params in the uart desc */
 int cpm_uart_init_portdesc(void)
 {
@@ -279,3 +292,4 @@ int cpm_uart_init_portdesc(void)
 #endif
        return 0;
 }
+#endif
index 2a6477834c3e0e8e63c17b7c62fc8735855d1db1..9b5465fb0bbb3a5b330e51e8bad8ec2a2c7e2c13 100644 (file)
 #include <asm/commproc.h>
 
 /* defines for IRQs */
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 #define SMC1_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SMC1)
 #define SMC2_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SMC2)
 #define SCC1_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SCC1)
 #define SCC2_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SCC2)
 #define SCC3_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SCC3)
 #define SCC4_IRQ       (CPM_IRQ_OFFSET + CPMVEC_SCC4)
+#endif
 
 static inline void cpm_set_brg(int brg, int baud)
 {
        cpm_setbrg(brg, baud);
 }
 
-static inline void cpm_set_scc_fcr(volatile scc_uart_t * sup)
+static inline void cpm_set_scc_fcr(scc_uart_t __iomem * sup)
 {
-       sup->scc_genscc.scc_rfcr = SMC_EB;
-       sup->scc_genscc.scc_tfcr = SMC_EB;
+       out_8(&sup->scc_genscc.scc_rfcr, SMC_EB);
+       out_8(&sup->scc_genscc.scc_tfcr, SMC_EB);
 }
 
-static inline void cpm_set_smc_fcr(volatile smc_uart_t * up)
+static inline void cpm_set_smc_fcr(smc_uart_t __iomem * up)
 {
-       up->smc_rfcr = SMC_EB;
-       up->smc_tfcr = SMC_EB;
+       out_8(&up->smc_rfcr, SMC_EB);
+       out_8(&up->smc_tfcr, SMC_EB);
 }
 
-#define DPRAM_BASE     ((unsigned char *)cpm_dpram_addr(0))
+#define DPRAM_BASE     ((u8 __iomem __force *)cpm_dpram_addr(0))
 
 #endif
index 7b61d805ebe98b317138e3c2a562ee1496c29789..882dbc17d590bc700e5c6d8af6fa086314197924 100644 (file)
 
 /**************************************************************/
 
-void cpm_line_cr_cmd(int line, int cmd)
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
+{
+       cpm_cpm2_t __iomem *cp = cpm2_map(im_cpm);
+
+       out_be32(&cp->cp_cpcr, port->command | cmd | CPM_CR_FLG);
+       while (in_be32(&cp->cp_cpcr) & CPM_CR_FLG)
+               ;
+
+       cpm2_unmap(cp);
+}
+#else
+void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
 {
        ulong val;
+       int line = port - cpm_uart_ports;
        volatile cpm_cpm2_t *cp = cpm2_map(im_cpm);
 
 
@@ -211,6 +224,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo)
        cpm2_unmap(cpmux);
        cpm2_unmap(io);
 }
+#endif
 
 /*
  * Allocate DP-Ram and memory buffers. We need to allocate a transmit and 
@@ -221,7 +235,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo)
 int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
 {
        int dpmemsz, memsz;
-       u8 *dp_mem;
+       u8 __iomem *dp_mem;
        unsigned long dp_offset;
        u8 *mem_addr;
        dma_addr_t dma_addr = 0;
@@ -264,7 +278,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
        pinfo->tx_buf = pinfo->rx_buf + L1_CACHE_ALIGN(pinfo->rx_nrfifos
                                                       * pinfo->rx_fifosize);
 
-       pinfo->rx_bd_base = (volatile cbd_t *)dp_mem;
+       pinfo->rx_bd_base = (cbd_t __iomem *)dp_mem;
        pinfo->tx_bd_base = pinfo->rx_bd_base + pinfo->rx_nrfifos;
 
        return 0;
@@ -275,12 +289,13 @@ void cpm_uart_freebuf(struct uart_cpm_port *pinfo)
        dma_free_coherent(NULL, L1_CACHE_ALIGN(pinfo->rx_nrfifos *
                                               pinfo->rx_fifosize) +
                          L1_CACHE_ALIGN(pinfo->tx_nrfifos *
-                                        pinfo->tx_fifosize), pinfo->mem_addr,
+                                        pinfo->tx_fifosize), (void __force *)pinfo->mem_addr,
                          pinfo->dma_addr);
 
        cpm_dpfree(pinfo->dp_addr);
 }
 
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 /* Setup any dynamic params in the uart desc */
 int cpm_uart_init_portdesc(void)
 {
@@ -386,3 +401,4 @@ int cpm_uart_init_portdesc(void)
 
        return 0;
 }
+#endif
index 1b3219f56c81513a07381d5fa54263930c112b26..40006a7dce4693b0353d2ed2f9409dcac6b1e138 100644 (file)
 #include <asm/cpm2.h>
 
 /* defines for IRQs */
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
 #define SMC1_IRQ       SIU_INT_SMC1
 #define SMC2_IRQ       SIU_INT_SMC2
 #define SCC1_IRQ       SIU_INT_SCC1
 #define SCC2_IRQ       SIU_INT_SCC2
 #define SCC3_IRQ       SIU_INT_SCC3
 #define SCC4_IRQ       SIU_INT_SCC4
+#endif
 
 static inline void cpm_set_brg(int brg, int baud)
 {
        cpm_setbrg(brg, baud);
 }
 
-static inline void cpm_set_scc_fcr(volatile scc_uart_t * sup)
+static inline void cpm_set_scc_fcr(scc_uart_t __iomem *sup)
 {
-       sup->scc_genscc.scc_rfcr = CPMFCR_GBL | CPMFCR_EB;
-       sup->scc_genscc.scc_tfcr = CPMFCR_GBL | CPMFCR_EB;
+       out_8(&sup->scc_genscc.scc_rfcr, CPMFCR_GBL | CPMFCR_EB);
+       out_8(&sup->scc_genscc.scc_tfcr, CPMFCR_GBL | CPMFCR_EB);
 }
 
-static inline void cpm_set_smc_fcr(volatile smc_uart_t * up)
+static inline void cpm_set_smc_fcr(smc_uart_t __iomem *up)
 {
-       up->smc_rfcr = CPMFCR_GBL | CPMFCR_EB;
-       up->smc_tfcr = CPMFCR_GBL | CPMFCR_EB;
+       out_8(&up->smc_rfcr, CPMFCR_GBL | CPMFCR_EB);
+       out_8(&up->smc_tfcr, CPMFCR_GBL | CPMFCR_EB);
 }
 
-#define DPRAM_BASE     ((unsigned char *)cpm_dpram_addr(0))
+#define DPRAM_BASE     ((u8 __iomem __force *)cpm_dpram_addr(0))
 
 #endif
index 35f8b86cc78fe3c9acb75626ff913b696d478b30..035cca0281995cfc12660bb4e47e24434560bcbc 100644 (file)
@@ -1051,7 +1051,7 @@ mpc52xx_uart_of_assign(struct device_node *np, int idx)
        /* If the slot is already occupied, then swap slots */
        if (mpc52xx_uart_nodes[idx] && (free_idx != -1))
                mpc52xx_uart_nodes[free_idx] = mpc52xx_uart_nodes[idx];
-       mpc52xx_uart_nodes[i] = np;
+       mpc52xx_uart_nodes[idx] = np;
 }
 
 static void
index 0fa9f6761763023c45b60b7582fb4e70e2b807c7..794bd0f50d7374533489a888ae19cf2763704fe4 100644 (file)
@@ -88,6 +88,16 @@ MODULE_LICENSE("GPL");
 
 #define PWRDBG(fmt, arg...)    printk(KERN_DEBUG fmt , ## arg)
 
+#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
+#define PMACZILOG_MAJOR                TTY_MAJOR
+#define PMACZILOG_MINOR                64
+#define PMACZILOG_NAME         "ttyS"
+#else
+#define PMACZILOG_MAJOR                204
+#define PMACZILOG_MINOR                192
+#define PMACZILOG_NAME         "ttyPZ"
+#endif
+
 
 /*
  * For the sake of early serial console, we can do a pre-probe
@@ -99,9 +109,10 @@ static DEFINE_MUTEX(pmz_irq_mutex);
 
 static struct uart_driver pmz_uart_reg = {
        .owner          =       THIS_MODULE,
-       .driver_name    =       "ttyS",
-       .dev_name       =       "ttyS",
-       .major          =       TTY_MAJOR,
+       .driver_name    =       PMACZILOG_NAME,
+       .dev_name       =       PMACZILOG_NAME,
+       .major          =       PMACZILOG_MAJOR,
+       .minor          =       PMACZILOG_MINOR,
 };
 
 
@@ -1587,7 +1598,7 @@ static int pmz_suspend(struct macio_dev *mdev, pm_message_t pm_state)
        if (pm_state.event == mdev->ofdev.dev.power.power_state.event)
                return 0;
 
-       pmz_debug("suspend, switching to state %d\n", pm_state);
+       pmz_debug("suspend, switching to state %d\n", pm_state.event);
 
        state = pmz_uart_reg.state + uap->port.line;
 
@@ -1778,7 +1789,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c
 static int __init pmz_console_setup(struct console *co, char *options);
 
 static struct console pmz_console = {
-       .name   =       "ttyS",
+       .name   =       PMACZILOG_NAME,
        .write  =       pmz_console_write,
        .device =       uart_console_device,
        .setup  =       pmz_console_setup,
@@ -1802,7 +1813,6 @@ static int __init pmz_register(void)
        
        pmz_uart_reg.nr = pmz_ports_count;
        pmz_uart_reg.cons = PMACZILOG_CONSOLE;
-       pmz_uart_reg.minor = 64;
 
        /*
         * Register this driver with the serial core
index f5051cf1a0c8ec0613d1b4c9d467fa099a5c1aa6..dfef83f14960d58de1c9ac7eb793f4aa105dcc72 100644 (file)
@@ -1,7 +1,8 @@
 /*
  * uartlite.c: Serial driver for Xilinx uartlite serial controller
  *
- * Peter Korsgaard <jacmet@sunsite.dk>
+ * Copyright (C) 2006 Peter Korsgaard <jacmet@sunsite.dk>
+ * Copyright (C) 2007 Secret Lab Technologies Ltd.
  *
  * This file is licensed under the terms of the GNU General Public License
  * version 2.  This program is licensed "as is" without any warranty of any
 #include <linux/delay.h>
 #include <linux/interrupt.h>
 #include <asm/io.h>
+#if defined(CONFIG_OF)
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#endif
 
+#define ULITE_NAME             "ttyUL"
 #define ULITE_MAJOR            204
 #define ULITE_MINOR            187
 #define ULITE_NR_UARTS         4
 
-/* For register details see datasheet:
-   http://www.xilinx.com/bvdocs/ipcenter/data_sheet/opb_uartlite.pdf
-*/
+/* ---------------------------------------------------------------------
+ * Register definitions
+ *
+ * For register details see datasheet:
+ * http://www.xilinx.com/bvdocs/ipcenter/data_sheet/opb_uartlite.pdf
+ */
+
 #define ULITE_RX               0x00
 #define ULITE_TX               0x04
 #define ULITE_STATUS           0x08
 #define ULITE_CONTROL_IE       0x10
 
 
-static struct uart_port ports[ULITE_NR_UARTS];
+static struct uart_port ulite_ports[ULITE_NR_UARTS];
+
+/* ---------------------------------------------------------------------
+ * Core UART driver operations
+ */
 
 static int ulite_receive(struct uart_port *port, int stat)
 {
@@ -307,6 +321,10 @@ static struct uart_ops ulite_ops = {
        .verify_port    = ulite_verify_port
 };
 
+/* ---------------------------------------------------------------------
+ * Console driver operations
+ */
+
 #ifdef CONFIG_SERIAL_UARTLITE_CONSOLE
 static void ulite_console_wait_tx(struct uart_port *port)
 {
@@ -329,7 +347,7 @@ static void ulite_console_putchar(struct uart_port *port, int ch)
 static void ulite_console_write(struct console *co, const char *s,
                                unsigned int count)
 {
-       struct uart_port *port = &ports[co->index];
+       struct uart_port *port = &ulite_ports[co->index];
        unsigned long flags;
        unsigned int ier;
        int locked = 1;
@@ -355,6 +373,31 @@ static void ulite_console_write(struct console *co, const char *s,
                spin_unlock_irqrestore(&port->lock, flags);
 }
 
+#if defined(CONFIG_OF)
+static inline void __init ulite_console_of_find_device(int id)
+{
+       struct device_node *np;
+       struct resource res;
+       const unsigned int *of_id;
+       int rc;
+
+       for_each_compatible_node(np, NULL, "xilinx,uartlite") {
+               of_id = of_get_property(np, "port-number", NULL);
+               if ((!of_id) || (*of_id != id))
+                       continue;
+
+               rc = of_address_to_resource(np, 0, &res);
+               if (rc)
+                       continue;
+
+               ulite_ports[id].mapbase = res.start;
+               return;
+       }
+}
+#else /* CONFIG_OF */
+static inline void __init ulite_console_of_find_device(int id) { /* do nothing */ }
+#endif /* CONFIG_OF */
+
 static int __init ulite_console_setup(struct console *co, char *options)
 {
        struct uart_port *port;
@@ -366,11 +409,23 @@ static int __init ulite_console_setup(struct console *co, char *options)
        if (co->index < 0 || co->index >= ULITE_NR_UARTS)
                return -EINVAL;
 
-       port = &ports[co->index];
+       port = &ulite_ports[co->index];
 
-       /* not initialized yet? */
-       if (!port->membase)
+       /* Check if it is an OF device */
+       if (!port->mapbase)
+               ulite_console_of_find_device(co->index);
+
+       /* Do we have a device now? */
+       if (!port->mapbase) {
+               pr_debug("console on ttyUL%i not present\n", co->index);
                return -ENODEV;
+       }
+
+       /* not initialized yet? */
+       if (!port->membase) {
+               if (ulite_request_port(port))
+                       return -ENODEV;
+       }
 
        if (options)
                uart_parse_options(options, &baud, &parity, &bits, &flow);
@@ -381,7 +436,7 @@ static int __init ulite_console_setup(struct console *co, char *options)
 static struct uart_driver ulite_uart_driver;
 
 static struct console ulite_console = {
-       .name   = "ttyUL",
+       .name   = ULITE_NAME,
        .write  = ulite_console_write,
        .device = uart_console_device,
        .setup  = ulite_console_setup,
@@ -403,7 +458,7 @@ console_initcall(ulite_console_init);
 static struct uart_driver ulite_uart_driver = {
        .owner          = THIS_MODULE,
        .driver_name    = "uartlite",
-       .dev_name       = "ttyUL",
+       .dev_name       = ULITE_NAME,
        .major          = ULITE_MAJOR,
        .minor          = ULITE_MINOR,
        .nr             = ULITE_NR_UARTS,
@@ -412,59 +467,111 @@ static struct uart_driver ulite_uart_driver = {
 #endif
 };
 
-static int __devinit ulite_probe(struct platform_device *pdev)
+/* ---------------------------------------------------------------------
+ * Port assignment functions (mapping devices to uart_port structures)
+ */
+
+/** ulite_assign: register a uartlite device with the driver
+ *
+ * @dev: pointer to device structure
+ * @id: requested id number.  Pass -1 for automatic port assignment
+ * @base: base address of uartlite registers
+ * @irq: irq number for uartlite
+ *
+ * Returns: 0 on success, <0 otherwise
+ */
+static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
 {
-       struct resource *res, *res2;
        struct uart_port *port;
+       int rc;
 
-       if (pdev->id < 0 || pdev->id >= ULITE_NR_UARTS)
+       /* if id = -1; then scan for a free id and use that */
+       if (id < 0) {
+               for (id = 0; id < ULITE_NR_UARTS; id++)
+                       if (ulite_ports[id].mapbase == 0)
+                               break;
+       }
+       if (id < 0 || id >= ULITE_NR_UARTS) {
+               dev_err(dev, "%s%i too large\n", ULITE_NAME, id);
                return -EINVAL;
+       }
 
-       if (ports[pdev->id].membase)
+       if ((ulite_ports[id].mapbase) && (ulite_ports[id].mapbase != base)) {
+               dev_err(dev, "cannot assign to %s%i; it is already in use\n",
+                       ULITE_NAME, id);
                return -EBUSY;
+       }
 
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res)
-               return -ENODEV;
+       port = &ulite_ports[id];
 
-       res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-       if (!res2)
-               return -ENODEV;
+       spin_lock_init(&port->lock);
+       port->fifosize = 16;
+       port->regshift = 2;
+       port->iotype = UPIO_MEM;
+       port->iobase = 1; /* mark port in use */
+       port->mapbase = base;
+       port->membase = NULL;
+       port->ops = &ulite_ops;
+       port->irq = irq;
+       port->flags = UPF_BOOT_AUTOCONF;
+       port->dev = dev;
+       port->type = PORT_UNKNOWN;
+       port->line = id;
+
+       dev_set_drvdata(dev, port);
+
+       /* Register the port */
+       rc = uart_add_one_port(&ulite_uart_driver, port);
+       if (rc) {
+               dev_err(dev, "uart_add_one_port() failed; err=%i\n", rc);
+               port->mapbase = 0;
+               dev_set_drvdata(dev, NULL);
+               return rc;
+       }
 
-       port = &ports[pdev->id];
+       return 0;
+}
 
-       port->fifosize  = 16;
-       port->regshift  = 2;
-       port->iotype    = UPIO_MEM;
-       port->iobase    = 1; /* mark port in use */
-       port->mapbase   = res->start;
-       port->membase   = NULL;
-       port->ops       = &ulite_ops;
-       port->irq       = res2->start;
-       port->flags     = UPF_BOOT_AUTOCONF;
-       port->dev       = &pdev->dev;
-       port->type      = PORT_UNKNOWN;
-       port->line      = pdev->id;
+/** ulite_release: register a uartlite device with the driver
+ *
+ * @dev: pointer to device structure
+ */
+static int __devinit ulite_release(struct device *dev)
+{
+       struct uart_port *port = dev_get_drvdata(dev);
+       int rc = 0;
 
-       uart_add_one_port(&ulite_uart_driver, port);
-       platform_set_drvdata(pdev, port);
+       if (port) {
+               rc = uart_remove_one_port(&ulite_uart_driver, port);
+               dev_set_drvdata(dev, NULL);
+               port->mapbase = 0;
+       }
 
-       return 0;
+       return rc;
 }
 
-static int ulite_remove(struct platform_device *pdev)
+/* ---------------------------------------------------------------------
+ * Platform bus binding
+ */
+
+static int __devinit ulite_probe(struct platform_device *pdev)
 {
-       struct uart_port *port = platform_get_drvdata(pdev);
+       struct resource *res, *res2;
 
-       platform_set_drvdata(pdev, NULL);
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENODEV;
 
-       if (port)
-               uart_remove_one_port(&ulite_uart_driver, port);
+       res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (!res2)
+               return -ENODEV;
 
-       /* mark port as free */
-       port->membase = NULL;
+       return ulite_assign(&pdev->dev, pdev->id, res->start, res2->start);
+}
 
-       return 0;
+static int ulite_remove(struct platform_device *pdev)
+{
+       return ulite_release(&pdev->dev);
 }
 
 static struct platform_driver ulite_platform_driver = {
@@ -476,24 +583,109 @@ static struct platform_driver ulite_platform_driver = {
                   },
 };
 
+/* ---------------------------------------------------------------------
+ * OF bus bindings
+ */
+#if defined(CONFIG_OF)
+static int __devinit
+ulite_of_probe(struct of_device *op, const struct of_device_id *match)
+{
+       struct resource res;
+       const unsigned int *id;
+       int irq, rc;
+
+       dev_dbg(&op->dev, "%s(%p, %p)\n", __FUNCTION__, op, match);
+
+       rc = of_address_to_resource(op->node, 0, &res);
+       if (rc) {
+               dev_err(&op->dev, "invalid address\n");
+               return rc;
+       }
+
+       irq = irq_of_parse_and_map(op->node, 0);
+
+       id = of_get_property(op->node, "port-number", NULL);
+
+       return ulite_assign(&op->dev, id ? *id : -1, res.start+3, irq);
+}
+
+static int __devexit ulite_of_remove(struct of_device *op)
+{
+       return ulite_release(&op->dev);
+}
+
+/* Match table for of_platform binding */
+static struct of_device_id __devinit ulite_of_match[] = {
+       { .type = "serial", .compatible = "xilinx,uartlite", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, ulite_of_match);
+
+static struct of_platform_driver ulite_of_driver = {
+       .owner = THIS_MODULE,
+       .name = "uartlite",
+       .match_table = ulite_of_match,
+       .probe = ulite_of_probe,
+       .remove = __devexit_p(ulite_of_remove),
+       .driver = {
+               .name = "uartlite",
+       },
+};
+
+/* Registration helpers to keep the number of #ifdefs to a minimum */
+static inline int __init ulite_of_register(void)
+{
+       pr_debug("uartlite: calling of_register_platform_driver()\n");
+       return of_register_platform_driver(&ulite_of_driver);
+}
+
+static inline void __exit ulite_of_unregister(void)
+{
+       of_unregister_platform_driver(&ulite_of_driver);
+}
+#else /* CONFIG_OF */
+/* CONFIG_OF not enabled; do nothing helpers */
+static inline int __init ulite_of_register(void) { return 0; }
+static inline void __exit ulite_of_unregister(void) { }
+#endif /* CONFIG_OF */
+
+/* ---------------------------------------------------------------------
+ * Module setup/teardown
+ */
+
 int __init ulite_init(void)
 {
        int ret;
 
+       pr_debug("uartlite: calling uart_register_driver()\n");
        ret = uart_register_driver(&ulite_uart_driver);
        if (ret)
-               return ret;
+               goto err_uart;
 
+       ret = ulite_of_register();
+       if (ret)
+               goto err_of;
+
+       pr_debug("uartlite: calling platform_driver_register()\n");
        ret = platform_driver_register(&ulite_platform_driver);
        if (ret)
-               uart_unregister_driver(&ulite_uart_driver);
+               goto err_plat;
 
+       return 0;
+
+err_plat:
+       ulite_of_unregister();
+err_of:
+       uart_unregister_driver(&ulite_uart_driver);
+err_uart:
+       printk(KERN_ERR "registering uartlite driver failed: err=%i", ret);
        return ret;
 }
 
 void __exit ulite_exit(void)
 {
        platform_driver_unregister(&ulite_platform_driver);
+       ulite_of_unregister();
        uart_unregister_driver(&ulite_uart_driver);
 }
 
index 8503e733a172454cbaf89675d3627f4535c2bf62..cbe71a5338d0db2956e04919d62201ca59a47348 100644 (file)
@@ -17,6 +17,8 @@
  *  more details.
  */
 
+#undef DEBUG
+
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -535,33 +537,35 @@ static int __devinit platinumfb_probe(struct of_device* odev,
        volatile __u8           *fbuffer;
        int                     bank0, bank1, bank2, bank3, rc;
 
-       printk(KERN_INFO "platinumfb: Found Apple Platinum video hardware\n");
+       dev_info(&odev->dev, "Found Apple Platinum video hardware\n");
 
        info = framebuffer_alloc(sizeof(*pinfo), &odev->dev);
-       if (info == NULL)
+       if (info == NULL) {
+               dev_err(&odev->dev, "Failed to allocate fbdev !\n");
                return -ENOMEM;
+       }
        pinfo = info->par;
 
        if (of_address_to_resource(dp, 0, &pinfo->rsrc_reg) ||
            of_address_to_resource(dp, 1, &pinfo->rsrc_fb)) {
-               printk(KERN_ERR "platinumfb: Can't get resources\n");
-               framebuffer_release(info);
-               return -ENXIO;
-       }
-       if (!request_mem_region(pinfo->rsrc_reg.start,
-                               pinfo->rsrc_reg.start -
-                               pinfo->rsrc_reg.end + 1,
-                               "platinumfb registers")) {
+               dev_err(&odev->dev, "Can't get resources\n");
                framebuffer_release(info);
                return -ENXIO;
        }
+       dev_dbg(&odev->dev, " registers  : 0x%llx...0x%llx\n",
+               (unsigned long long)pinfo->rsrc_reg.start,
+               (unsigned long long)pinfo->rsrc_reg.end);
+       dev_dbg(&odev->dev, " framebuffer: 0x%llx...0x%llx\n",
+               (unsigned long long)pinfo->rsrc_fb.start,
+               (unsigned long long)pinfo->rsrc_fb.end);
+
+       /* Do not try to request register space, they overlap with the
+        * northbridge and that can fail. Only request framebuffer
+        */
        if (!request_mem_region(pinfo->rsrc_fb.start,
-                               pinfo->rsrc_fb.start
-                               - pinfo->rsrc_fb.end + 1,
+                               pinfo->rsrc_fb.end - pinfo->rsrc_fb.start + 1,
                                "platinumfb framebuffer")) {
-               release_mem_region(pinfo->rsrc_reg.start,
-                                  pinfo->rsrc_reg.end -
-                                  pinfo->rsrc_reg.start + 1);
+               printk(KERN_ERR "platinumfb: Can't request framebuffer !\n");
                framebuffer_release(info);
                return -ENXIO;
        }
@@ -600,7 +604,8 @@ static int __devinit platinumfb_probe(struct of_device* odev,
        bank2 = fbuffer[0x200000] == 0x56;
        bank3 = fbuffer[0x300000] == 0x78;
        pinfo->total_vram = (bank0 + bank1 + bank2 + bank3) * 0x100000;
-       printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n", (int) (pinfo->total_vram / 1024 / 1024),
+       printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n",
+              (unsigned int) (pinfo->total_vram / 1024 / 1024),
               bank3, bank2, bank1, bank0);
 
        /*
@@ -644,16 +649,15 @@ static int __devexit platinumfb_remove(struct of_device* odev)
         unregister_framebuffer (info);
        
        /* Unmap frame buffer and registers */
+       iounmap(pinfo->frame_buffer);
+       iounmap(pinfo->platinum_regs);
+       iounmap(pinfo->cmap_regs);
+
        release_mem_region(pinfo->rsrc_fb.start,
                           pinfo->rsrc_fb.end -
                           pinfo->rsrc_fb.start + 1);
-       release_mem_region(pinfo->rsrc_reg.start,
-                          pinfo->rsrc_reg.end -
-                          pinfo->rsrc_reg.start + 1);
-       iounmap(pinfo->frame_buffer);
-       iounmap(pinfo->platinum_regs);
+
        release_mem_region(pinfo->cmap_regs_phys, 0x1000);
-       iounmap(pinfo->cmap_regs);
 
        framebuffer_release(info);
 
index 6ef9733a18d4ca2aa7294a803006e319993d48c5..6ef99b2d13ca6f8a4809d5914cbab6309255b3e3 100644 (file)
@@ -6,9 +6,12 @@
  * Author: MontaVista Software, Inc.
  *         source@mvista.com
  *
- * 2002-2007 (c) MontaVista Software, Inc.  This file is licensed under the
- * terms of the GNU General Public License version 2.  This program is licensed
- * "as is" without any warranty of any kind, whether express or implied.
+ * 2002-2007 (c) MontaVista Software, Inc.
+ * 2007 (c) Secret Lab Technologies, Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
  */
 
 /*
@@ -18,6 +21,7 @@
  * Geert Uytterhoeven.
  */
 
+#include <linux/device.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/version.h>
 #include <linux/init.h>
 #include <linux/dma-mapping.h>
 #include <linux/platform_device.h>
-
+#if defined(CONFIG_OF)
+#include <linux/of_device.h>
+#include <linux/of_platform.h>
+#endif
 #include <asm/io.h>
-#include <syslib/virtex_devices.h>
+#include <linux/xilinxfb.h>
 
 #define DRIVER_NAME            "xilinxfb"
 #define DRIVER_DESCRIPTION     "Xilinx TFT LCD frame buffer driver"
  */
 #define BYTES_PER_PIXEL        4
 #define BITS_PER_PIXEL (BYTES_PER_PIXEL * 8)
-#define XRES           640
-#define YRES           480
-#define XRES_VIRTUAL   1024
-#define YRES_VIRTUAL   YRES
-#define LINE_LENGTH    (XRES_VIRTUAL * BYTES_PER_PIXEL)
-#define FB_SIZE                (YRES_VIRTUAL * LINE_LENGTH)
 
 #define RED_SHIFT      16
 #define GREEN_SHIFT    8
 
 #define PALETTE_ENTRIES_NO     16      /* passed to fb_alloc_cmap() */
 
+/*
+ * Default xilinxfb configuration
+ */
+static struct xilinxfb_platform_data xilinx_fb_default_pdata = {
+       .xres = 640,
+       .yres = 480,
+       .xvirt = 1024,
+       .yvirt = 480;
+};
+
 /*
  * Here are the default fb_fix_screeninfo and fb_var_screeninfo structures
  */
@@ -83,17 +94,10 @@ static struct fb_fix_screeninfo xilinx_fb_fix = {
        .id =           "Xilinx",
        .type =         FB_TYPE_PACKED_PIXELS,
        .visual =       FB_VISUAL_TRUECOLOR,
-       .smem_len =     FB_SIZE,
-       .line_length =  LINE_LENGTH,
        .accel =        FB_ACCEL_NONE
 };
 
 static struct fb_var_screeninfo xilinx_fb_var = {
-       .xres =                 XRES,
-       .yres =                 YRES,
-       .xres_virtual =         XRES_VIRTUAL,
-       .yres_virtual =         YRES_VIRTUAL,
-
        .bits_per_pixel =       BITS_PER_PIXEL,
 
        .red =          { RED_SHIFT, 8, 0 },
@@ -111,8 +115,9 @@ struct xilinxfb_drvdata {
        u32             regs_phys;      /* phys. address of the control registers */
        u32 __iomem     *regs;          /* virt. address of the control registers */
 
-       unsigned char __iomem   *fb_virt;       /* virt. address of the frame buffer */
+       void            *fb_virt;       /* virt. address of the frame buffer */
        dma_addr_t      fb_phys;        /* phys. address of the frame buffer */
+       int             fb_alloced;     /* Flag, was the fb memory alloced? */
 
        u32             reg_ctrl_default;
 
@@ -195,130 +200,136 @@ static struct fb_ops xilinxfb_ops =
        .fb_imageblit           = cfb_imageblit,
 };
 
-/* === The device driver === */
+/* ---------------------------------------------------------------------
+ * Bus independent setup/teardown
+ */
 
-static int
-xilinxfb_drv_probe(struct device *dev)
+static int xilinxfb_assign(struct device *dev, unsigned long physaddr,
+                          struct xilinxfb_platform_data *pdata)
 {
-       struct platform_device *pdev;
-       struct xilinxfb_platform_data *pdata;
        struct xilinxfb_drvdata *drvdata;
-       struct resource *regs_res;
-       int retval;
-
-       if (!dev)
-               return -EINVAL;
-
-       pdev = to_platform_device(dev);
-       pdata = pdev->dev.platform_data;
+       int rc;
+       int fbsize = pdata->xvirt * pdata->yvirt * BYTES_PER_PIXEL;
 
+       /* Allocate the driver data region */
        drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
        if (!drvdata) {
-               printk(KERN_ERR "Couldn't allocate device private record\n");
+               dev_err(dev, "Couldn't allocate device private record\n");
                return -ENOMEM;
        }
        dev_set_drvdata(dev, drvdata);
 
        /* Map the control registers in */
-       regs_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-       if (!regs_res || (regs_res->end - regs_res->start + 1 < 8)) {
-               printk(KERN_ERR "Couldn't get registers resource\n");
-               retval = -EFAULT;
-               goto failed1;
+       if (!request_mem_region(physaddr, 8, DRIVER_NAME)) {
+               dev_err(dev, "Couldn't lock memory region at 0x%08lX\n",
+                       physaddr);
+               rc = -ENODEV;
+               goto err_region;
        }
-
-       if (!request_mem_region(regs_res->start, 8, DRIVER_NAME)) {
-               printk(KERN_ERR
-                      "Couldn't lock memory region at 0x%08X\n",
-                      regs_res->start);
-               retval = -EBUSY;
-               goto failed1;
+       drvdata->regs_phys = physaddr;
+       drvdata->regs = ioremap(physaddr, 8);
+       if (!drvdata->regs) {
+               dev_err(dev, "Couldn't lock memory region at 0x%08lX\n",
+                       physaddr);
+               rc = -ENODEV;
+               goto err_map;
        }
-       drvdata->regs = (u32 __iomem*) ioremap(regs_res->start, 8);
-       drvdata->regs_phys = regs_res->start;
 
        /* Allocate the framebuffer memory */
-       drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(FB_SIZE),
-                               &drvdata->fb_phys, GFP_KERNEL);
+       if (pdata->fb_phys) {
+               drvdata->fb_phys = pdata->fb_phys;
+               drvdata->fb_virt = ioremap(pdata->fb_phys, fbsize);
+       } else {
+               drvdata->fb_alloced = 1;
+               drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(fbsize),
+                                       &drvdata->fb_phys, GFP_KERNEL);
+       }
+
        if (!drvdata->fb_virt) {
-               printk(KERN_ERR "Could not allocate frame buffer memory\n");
-               retval = -ENOMEM;
-               goto failed2;
+               dev_err(dev, "Could not allocate frame buffer memory\n");
+               rc = -ENOMEM;
+               goto err_fbmem;
        }
 
        /* Clear (turn to black) the framebuffer */
-       memset_io((void *) drvdata->fb_virt, 0, FB_SIZE);
+       memset_io((void __iomem *)drvdata->fb_virt, 0, fbsize);
 
        /* Tell the hardware where the frame buffer is */
        xilinx_fb_out_be32(drvdata, REG_FB_ADDR, drvdata->fb_phys);
 
        /* Turn on the display */
        drvdata->reg_ctrl_default = REG_CTRL_ENABLE;
-       if (pdata && pdata->rotate_screen)
+       if (pdata->rotate_screen)
                drvdata->reg_ctrl_default |= REG_CTRL_ROTATE;
        xilinx_fb_out_be32(drvdata, REG_CTRL, drvdata->reg_ctrl_default);
 
        /* Fill struct fb_info */
        drvdata->info.device = dev;
-       drvdata->info.screen_base = drvdata->fb_virt;
+       drvdata->info.screen_base = (void __iomem *)drvdata->fb_virt;
        drvdata->info.fbops = &xilinxfb_ops;
        drvdata->info.fix = xilinx_fb_fix;
        drvdata->info.fix.smem_start = drvdata->fb_phys;
-       drvdata->info.pseudo_palette = drvdata->pseudo_palette;
-
-       if (fb_alloc_cmap(&drvdata->info.cmap, PALETTE_ENTRIES_NO, 0) < 0) {
-               printk(KERN_ERR "Fail to allocate colormap (%d entries)\n",
-                       PALETTE_ENTRIES_NO);
-               retval = -EFAULT;
-               goto failed3;
-       }
+       drvdata->info.fix.smem_len = fbsize;
+       drvdata->info.fix.line_length = pdata->xvirt * BYTES_PER_PIXEL;
 
+       drvdata->info.pseudo_palette = drvdata->pseudo_palette;
        drvdata->info.flags = FBINFO_DEFAULT;
-       if (pdata) {
-               xilinx_fb_var.height = pdata->screen_height_mm;
-               xilinx_fb_var.width = pdata->screen_width_mm;
-       }
        drvdata->info.var = xilinx_fb_var;
+       drvdata->info.var.height = pdata->screen_height_mm;
+       drvdata->info.var.width = pdata->screen_width_mm;
+       drvdata->info.var.xres = pdata->xres;
+       drvdata->info.var.yres = pdata->yres;
+       drvdata->info.var.xres_virtual = pdata->xvirt;
+       drvdata->info.var.yres_virtual = pdata->yvirt;
+
+       /* Allocate a colour map */
+       rc = fb_alloc_cmap(&drvdata->info.cmap, PALETTE_ENTRIES_NO, 0);
+       if (rc) {
+               dev_err(dev, "Fail to allocate colormap (%d entries)\n",
+                       PALETTE_ENTRIES_NO);
+               goto err_cmap;
+       }
 
        /* Register new frame buffer */
-       if (register_framebuffer(&drvdata->info) < 0) {
-               printk(KERN_ERR "Could not register frame buffer\n");
-               retval = -EINVAL;
-               goto failed4;
+       rc = register_framebuffer(&drvdata->info);
+       if (rc) {
+               dev_err(dev, "Could not register frame buffer\n");
+               goto err_regfb;
        }
 
+       /* Put a banner in the log (for DEBUG) */
+       dev_dbg(dev, "regs: phys=%lx, virt=%p\n", physaddr, drvdata->regs);
+       dev_dbg(dev, "fb: phys=%p, virt=%p, size=%x\n",
+               (void*)drvdata->fb_phys, drvdata->fb_virt, fbsize);
+
        return 0;       /* success */
 
-failed4:
+err_regfb:
        fb_dealloc_cmap(&drvdata->info.cmap);
 
-failed3:
-       dma_free_coherent(dev, PAGE_ALIGN(FB_SIZE), drvdata->fb_virt,
-               drvdata->fb_phys);
-
+err_cmap:
+       if (drvdata->fb_alloced)
+               dma_free_coherent(dev, PAGE_ALIGN(fbsize), drvdata->fb_virt,
+                       drvdata->fb_phys);
        /* Turn off the display */
        xilinx_fb_out_be32(drvdata, REG_CTRL, 0);
+
+err_fbmem:
        iounmap(drvdata->regs);
 
-failed2:
-       release_mem_region(regs_res->start, 8);
+err_map:
+       release_mem_region(physaddr, 8);
 
-failed1:
+err_region:
        kfree(drvdata);
        dev_set_drvdata(dev, NULL);
 
-       return retval;
+       return rc;
 }
 
-static int
-xilinxfb_drv_remove(struct device *dev)
+static int xilinxfb_release(struct device *dev)
 {
-       struct xilinxfb_drvdata *drvdata;
-
-       if (!dev)
-               return -ENODEV;
-
-       drvdata = (struct xilinxfb_drvdata *) dev_get_drvdata(dev);
+       struct xilinxfb_drvdata *drvdata = dev_get_drvdata(dev);
 
 #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)
        xilinx_fb_blank(VESA_POWERDOWN, &drvdata->info);
@@ -328,8 +339,9 @@ xilinxfb_drv_remove(struct device *dev)
 
        fb_dealloc_cmap(&drvdata->info.cmap);
 
-       dma_free_coherent(dev, PAGE_ALIGN(FB_SIZE), drvdata->fb_virt,
-               drvdata->fb_phys);
+       if (drvdata->fb_alloced)
+               dma_free_coherent(dev, PAGE_ALIGN(drvdata->info.fix.smem_len),
+                                 drvdata->fb_virt, drvdata->fb_phys);
 
        /* Turn off the display */
        xilinx_fb_out_be32(drvdata, REG_CTRL, 0);
@@ -343,29 +355,168 @@ xilinxfb_drv_remove(struct device *dev)
        return 0;
 }
 
+/* ---------------------------------------------------------------------
+ * Platform bus binding
+ */
+
+static int
+xilinxfb_platform_probe(struct platform_device *pdev)
+{
+       struct xilinxfb_platform_data *pdata;
+       struct resource *res;
 
-static struct device_driver xilinxfb_driver = {
-       .name           = DRIVER_NAME,
-       .bus            = &platform_bus_type,
+       /* Find the registers address */
+       res = platform_get_resource(pdev, IORESOURCE_IO, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "Couldn't get registers resource\n");
+               return -ENODEV;
+       }
 
-       .probe          = xilinxfb_drv_probe,
-       .remove         = xilinxfb_drv_remove
+       /* If a pdata structure is provided, then extract the parameters */
+       pdata = &xilinx_fb_default_pdata;
+       if (pdev->dev.platform_data) {
+               pdata = pdev->dev.platform_data;
+               if (!pdata->xres)
+                       pdata->xres = xilinx_fb_default_pdata.xres;
+               if (!pdata->yres)
+                       pdata->yres = xilinx_fb_default_pdata.yres;
+               if (!pdata->xvirt)
+                       pdata->xvirt = xilinx_fb_default_pdata.xvirt;
+               if (!pdata->yvirt)
+                       pdata->yvirt = xilinx_fb_default_pdata.yvirt;
+       }
+
+       return xilinxfb_assign(&pdev->dev, res->start, pdata);
+}
+
+static int
+xilinxfb_platform_remove(struct platform_device *pdev)
+{
+       return xilinxfb_release(&pdev->dev);
+}
+
+
+static struct platform_driver xilinxfb_platform_driver = {
+       .probe          = xilinxfb_platform_probe,
+       .remove         = xilinxfb_platform_remove,
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = DRIVER_NAME,
+       },
+};
+
+/* ---------------------------------------------------------------------
+ * OF bus binding
+ */
+
+#if defined(CONFIG_OF)
+static int __devinit
+xilinxfb_of_probe(struct of_device *op, const struct of_device_id *match)
+{
+       struct resource res;
+       const u32 *prop;
+       struct xilinxfb_platform_data pdata;
+       int size, rc;
+
+       /* Copy with the default pdata (not a ptr reference!) */
+       pdata = xilinx_fb_default_pdata;
+
+       dev_dbg(&op->dev, "xilinxfb_of_probe(%p, %p)\n", op, match);
+
+       rc = of_address_to_resource(op->node, 0, &res);
+       if (rc) {
+               dev_err(&op->dev, "invalid address\n");
+               return rc;
+       }
+
+       prop = of_get_property(op->node, "phys-size", &size);
+       if ((prop) && (size >= sizeof(u32)*2)) {
+               pdata.screen_width_mm = prop[0];
+               pdata.screen_height_mm = prop[1];
+       }
+
+       prop = of_get_property(op->node, "resolution", &size);
+       if ((prop) && (size >= sizeof(u32)*2)) {
+               pdata.xres = prop[0];
+               pdata.yres = prop[1];
+       }
+
+       prop = of_get_property(op->node, "virtual-resolution", &size);
+       if ((prop) && (size >= sizeof(u32)*2)) {
+               pdata.xvirt = prop[0];
+               pdata.yvirt = prop[1];
+       }
+
+       if (of_find_property(op->node, "rotate-display", NULL))
+               pdata.rotate_screen = 1;
+
+       return xilinxfb_assign(&op->dev, res.start, &pdata);
+}
+
+static int __devexit xilinxfb_of_remove(struct of_device *op)
+{
+       return xilinxfb_release(&op->dev);
+}
+
+/* Match table for of_platform binding */
+static struct of_device_id __devinit xilinxfb_of_match[] = {
+       { .compatible = "xilinx,ml300-fb", },
+       {},
 };
+MODULE_DEVICE_TABLE(of, xilinxfb_of_match);
+
+static struct of_platform_driver xilinxfb_of_driver = {
+       .owner = THIS_MODULE,
+       .name = DRIVER_NAME,
+       .match_table = xilinxfb_of_match,
+       .probe = xilinxfb_of_probe,
+       .remove = __devexit_p(xilinxfb_of_remove),
+       .driver = {
+               .name = DRIVER_NAME,
+       },
+};
+
+/* Registration helpers to keep the number of #ifdefs to a minimum */
+static inline int __init xilinxfb_of_register(void)
+{
+       pr_debug("xilinxfb: calling of_register_platform_driver()\n");
+       return of_register_platform_driver(&xilinxfb_of_driver);
+}
+
+static inline void __exit xilinxfb_of_unregister(void)
+{
+       of_unregister_platform_driver(&xilinxfb_of_driver);
+}
+#else /* CONFIG_OF */
+/* CONFIG_OF not enabled; do nothing helpers */
+static inline int __init xilinxfb_of_register(void) { return 0; }
+static inline void __exit xilinxfb_of_unregister(void) { }
+#endif /* CONFIG_OF */
+
+/* ---------------------------------------------------------------------
+ * Module setup and teardown
+ */
 
 static int __init
 xilinxfb_init(void)
 {
-       /*
-        * No kernel boot options used,
-        * so we just need to register the driver
-        */
-       return driver_register(&xilinxfb_driver);
+       int rc;
+       rc = xilinxfb_of_register();
+       if (rc)
+               return rc;
+
+       rc = platform_driver_register(&xilinxfb_platform_driver);
+       if (rc)
+               xilinxfb_of_unregister();
+
+       return rc;
 }
 
 static void __exit
 xilinxfb_cleanup(void)
 {
-       driver_unregister(&xilinxfb_driver);
+       platform_driver_unregister(&xilinxfb_platform_driver);
+       xilinxfb_of_unregister();
 }
 
 module_init(xilinxfb_init);
index 4482a0673b1591869c63358a1db6a21582848252..b1013f34085d00ac4b966e895ac58419f4ae3269 100644 (file)
@@ -1514,9 +1514,6 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file)
        int thread_status_size = 0;
        elf_addr_t *auxv;
        unsigned long mm_flags;
-#ifdef ELF_CORE_WRITE_EXTRA_NOTES
-       int extra_notes_size;
-#endif
 
        /*
         * We no longer stop all VM operations.
@@ -1645,10 +1642,7 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file)
                
                sz += thread_status_size;
 
-#ifdef ELF_CORE_WRITE_EXTRA_NOTES
-               extra_notes_size = ELF_CORE_EXTRA_NOTES_SIZE;
-               sz += extra_notes_size;
-#endif
+               sz += elf_coredump_extra_notes_size();
 
                fill_elf_note_phdr(&phdr, sz, offset);
                offset += sz;
@@ -1698,10 +1692,8 @@ static int elf_core_dump(long signr, struct pt_regs *regs, struct file *file)
                if (!writenote(notes + i, file, &foffset))
                        goto end_coredump;
 
-#ifdef ELF_CORE_WRITE_EXTRA_NOTES
-       ELF_CORE_WRITE_EXTRA_NOTES;
-       foffset += extra_notes_size;
-#endif
+       if (elf_coredump_extra_notes_write(file, &foffset))
+               goto end_coredump;
 
        /* write out the thread status notes section */
        list_for_each(t, &thread_list) {
diff --git a/include/asm-powerpc/8xx_immap.h b/include/asm-powerpc/8xx_immap.h
new file mode 100644 (file)
index 0000000..1311cef
--- /dev/null
@@ -0,0 +1,564 @@
+/*
+ * MPC8xx Internal Memory Map
+ * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
+ *
+ * The I/O on the MPC860 is comprised of blocks of special registers
+ * and the dual port ram for the Communication Processor Module.
+ * Within this space are functional units such as the SIU, memory
+ * controller, system timers, and other control functions.  It is
+ * a combination that I found difficult to separate into logical
+ * functional files.....but anyone else is welcome to try.  -- Dan
+ */
+#ifdef __KERNEL__
+#ifndef __IMMAP_8XX__
+#define __IMMAP_8XX__
+
+/* System configuration registers.
+*/
+typedef        struct sys_conf {
+       uint    sc_siumcr;
+       uint    sc_sypcr;
+       uint    sc_swt;
+       char    res1[2];
+       ushort  sc_swsr;
+       uint    sc_sipend;
+       uint    sc_simask;
+       uint    sc_siel;
+       uint    sc_sivec;
+       uint    sc_tesr;
+       char    res2[0xc];
+       uint    sc_sdcr;
+       char    res3[0x4c];
+} sysconf8xx_t;
+
+/* PCMCIA configuration registers.
+*/
+typedef struct pcmcia_conf {
+       uint    pcmc_pbr0;
+       uint    pcmc_por0;
+       uint    pcmc_pbr1;
+       uint    pcmc_por1;
+       uint    pcmc_pbr2;
+       uint    pcmc_por2;
+       uint    pcmc_pbr3;
+       uint    pcmc_por3;
+       uint    pcmc_pbr4;
+       uint    pcmc_por4;
+       uint    pcmc_pbr5;
+       uint    pcmc_por5;
+       uint    pcmc_pbr6;
+       uint    pcmc_por6;
+       uint    pcmc_pbr7;
+       uint    pcmc_por7;
+       char    res1[0x20];
+       uint    pcmc_pgcra;
+       uint    pcmc_pgcrb;
+       uint    pcmc_pscr;
+       char    res2[4];
+       uint    pcmc_pipr;
+       char    res3[4];
+       uint    pcmc_per;
+       char    res4[4];
+} pcmconf8xx_t;
+
+/* Memory controller registers.
+*/
+typedef struct mem_ctlr {
+       uint    memc_br0;
+       uint    memc_or0;
+       uint    memc_br1;
+       uint    memc_or1;
+       uint    memc_br2;
+       uint    memc_or2;
+       uint    memc_br3;
+       uint    memc_or3;
+       uint    memc_br4;
+       uint    memc_or4;
+       uint    memc_br5;
+       uint    memc_or5;
+       uint    memc_br6;
+       uint    memc_or6;
+       uint    memc_br7;
+       uint    memc_or7;
+       char    res1[0x24];
+       uint    memc_mar;
+       uint    memc_mcr;
+       char    res2[4];
+       uint    memc_mamr;
+       uint    memc_mbmr;
+       ushort  memc_mstat;
+       ushort  memc_mptpr;
+       uint    memc_mdr;
+       char    res3[0x80];
+} memctl8xx_t;
+
+/*-----------------------------------------------------------------------
+ * BR - Memory Controler: Base Register                                        16-9
+ */
+#define BR_BA_MSK      0xffff8000      /* Base Address Mask                    */
+#define BR_AT_MSK      0x00007000      /* Address Type Mask                    */
+#define BR_PS_MSK      0x00000c00      /* Port Size Mask                       */
+#define BR_PS_32       0x00000000      /* 32 bit port size                     */
+#define BR_PS_16       0x00000800      /* 16 bit port size                     */
+#define BR_PS_8                0x00000400      /*  8 bit port size                     */
+#define BR_PARE                0x00000200      /* Parity Enable                        */
+#define BR_WP          0x00000100      /* Write Protect                        */
+#define BR_MS_MSK      0x000000c0      /* Machine Select Mask                  */
+#define BR_MS_GPCM     0x00000000      /* G.P.C.M. Machine Select              */
+#define BR_MS_UPMA     0x00000080      /* U.P.M.A Machine Select               */
+#define BR_MS_UPMB     0x000000c0      /* U.P.M.B Machine Select               */
+#define BR_V           0x00000001      /* Bank Valid                           */
+
+/*-----------------------------------------------------------------------
+ * OR - Memory Controler: Option Register                              16-11
+ */
+#define OR_AM_MSK      0xffff8000      /* Address Mask Mask                    */
+#define OR_ATM_MSK     0x00007000      /* Address Type Mask Mask               */
+#define OR_CSNT_SAM    0x00000800      /* Chip Select Negation Time/ Start     */
+                                       /* Address Multiplex                    */
+#define OR_ACS_MSK     0x00000600      /* Address to Chip Select Setup mask    */
+#define OR_ACS_DIV1    0x00000000      /* CS is output at the same time        */
+#define OR_ACS_DIV4    0x00000400      /* CS is output 1/4 a clock later       */
+#define OR_ACS_DIV2    0x00000600      /* CS is output 1/2 a clock later       */
+#define OR_G5LA                0x00000400      /* Output #GPL5 on #GPL_A5              */
+#define OR_G5LS                0x00000200      /* Drive #GPL high on falling edge of...*/
+#define OR_BI          0x00000100      /* Burst inhibit                        */
+#define OR_SCY_MSK     0x000000f0      /* Cycle Lenght in Clocks               */
+#define OR_SCY_0_CLK   0x00000000      /* 0 clock cycles wait states           */
+#define OR_SCY_1_CLK   0x00000010      /* 1 clock cycles wait states           */
+#define OR_SCY_2_CLK   0x00000020      /* 2 clock cycles wait states           */
+#define OR_SCY_3_CLK   0x00000030      /* 3 clock cycles wait states           */
+#define OR_SCY_4_CLK   0x00000040      /* 4 clock cycles wait states           */
+#define OR_SCY_5_CLK   0x00000050      /* 5 clock cycles wait states           */
+#define OR_SCY_6_CLK   0x00000060      /* 6 clock cycles wait states           */
+#define OR_SCY_7_CLK   0x00000070      /* 7 clock cycles wait states           */
+#define OR_SCY_8_CLK   0x00000080      /* 8 clock cycles wait states           */
+#define OR_SCY_9_CLK   0x00000090      /* 9 clock cycles wait states           */
+#define OR_SCY_10_CLK  0x000000a0      /* 10 clock cycles wait states          */
+#define OR_SCY_11_CLK  0x000000b0      /* 11 clock cycles wait states          */
+#define OR_SCY_12_CLK  0x000000c0      /* 12 clock cycles wait states          */
+#define OR_SCY_13_CLK  0x000000d0      /* 13 clock cycles wait states          */
+#define OR_SCY_14_CLK  0x000000e0      /* 14 clock cycles wait states          */
+#define OR_SCY_15_CLK  0x000000f0      /* 15 clock cycles wait states          */
+#define OR_SETA                0x00000008      /* External Transfer Acknowledge        */
+#define OR_TRLX                0x00000004      /* Timing Relaxed                       */
+#define OR_EHTR                0x00000002      /* Extended Hold Time on Read           */
+
+/* System Integration Timers.
+*/
+typedef struct sys_int_timers {
+       ushort  sit_tbscr;
+       char    res0[0x02];
+       uint    sit_tbreff0;
+       uint    sit_tbreff1;
+       char    res1[0x14];
+       ushort  sit_rtcsc;
+       char    res2[0x02];
+       uint    sit_rtc;
+       uint    sit_rtsec;
+       uint    sit_rtcal;
+       char    res3[0x10];
+       ushort  sit_piscr;
+       char    res4[2];
+       uint    sit_pitc;
+       uint    sit_pitr;
+       char    res5[0x34];
+} sit8xx_t;
+
+#define TBSCR_TBIRQ_MASK       ((ushort)0xff00)
+#define TBSCR_REFA             ((ushort)0x0080)
+#define TBSCR_REFB             ((ushort)0x0040)
+#define TBSCR_REFAE            ((ushort)0x0008)
+#define TBSCR_REFBE            ((ushort)0x0004)
+#define TBSCR_TBF              ((ushort)0x0002)
+#define TBSCR_TBE              ((ushort)0x0001)
+
+#define RTCSC_RTCIRQ_MASK      ((ushort)0xff00)
+#define RTCSC_SEC              ((ushort)0x0080)
+#define RTCSC_ALR              ((ushort)0x0040)
+#define RTCSC_38K              ((ushort)0x0010)
+#define RTCSC_SIE              ((ushort)0x0008)
+#define RTCSC_ALE              ((ushort)0x0004)
+#define RTCSC_RTF              ((ushort)0x0002)
+#define RTCSC_RTE              ((ushort)0x0001)
+
+#define PISCR_PIRQ_MASK                ((ushort)0xff00)
+#define PISCR_PS               ((ushort)0x0080)
+#define PISCR_PIE              ((ushort)0x0004)
+#define PISCR_PTF              ((ushort)0x0002)
+#define PISCR_PTE              ((ushort)0x0001)
+
+/* Clocks and Reset.
+*/
+typedef struct clk_and_reset {
+       uint    car_sccr;
+       uint    car_plprcr;
+       uint    car_rsr;
+       char    res[0x74];        /* Reserved area                  */
+} car8xx_t;
+
+/* System Integration Timers keys.
+*/
+typedef struct sitk {
+       uint    sitk_tbscrk;
+       uint    sitk_tbreff0k;
+       uint    sitk_tbreff1k;
+       uint    sitk_tbk;
+       char    res1[0x10];
+       uint    sitk_rtcsck;
+       uint    sitk_rtck;
+       uint    sitk_rtseck;
+       uint    sitk_rtcalk;
+       char    res2[0x10];
+       uint    sitk_piscrk;
+       uint    sitk_pitck;
+       char    res3[0x38];
+} sitk8xx_t;
+
+/* Clocks and reset keys.
+*/
+typedef struct cark {
+       uint    cark_sccrk;
+       uint    cark_plprcrk;
+       uint    cark_rsrk;
+       char    res[0x474];
+} cark8xx_t;
+
+/* The key to unlock registers maintained by keep-alive power.
+*/
+#define KAPWR_KEY      ((unsigned int)0x55ccaa33)
+
+/* Video interface.  MPC823 Only.
+*/
+typedef struct vid823 {
+       ushort  vid_vccr;
+       ushort  res1;
+       u_char  vid_vsr;
+       u_char  res2;
+       u_char  vid_vcmr;
+       u_char  res3;
+       uint    vid_vbcb;
+       uint    res4;
+       uint    vid_vfcr0;
+       uint    vid_vfaa0;
+       uint    vid_vfba0;
+       uint    vid_vfcr1;
+       uint    vid_vfaa1;
+       uint    vid_vfba1;
+       u_char  res5[0x18];
+} vid823_t;
+
+/* LCD interface.  823 Only.
+*/
+typedef struct lcd {
+       uint    lcd_lccr;
+       uint    lcd_lchcr;
+       uint    lcd_lcvcr;
+       char    res1[4];
+       uint    lcd_lcfaa;
+       uint    lcd_lcfba;
+       char    lcd_lcsr;
+       char    res2[0x7];
+} lcd823_t;
+
+/* I2C
+*/
+typedef struct i2c {
+       u_char  i2c_i2mod;
+       char    res1[3];
+       u_char  i2c_i2add;
+       char    res2[3];
+       u_char  i2c_i2brg;
+       char    res3[3];
+       u_char  i2c_i2com;
+       char    res4[3];
+       u_char  i2c_i2cer;
+       char    res5[3];
+       u_char  i2c_i2cmr;
+       char    res6[0x8b];
+} i2c8xx_t;
+
+/* DMA control/status registers.
+*/
+typedef struct sdma_csr {
+       char    res1[4];
+       uint    sdma_sdar;
+       u_char  sdma_sdsr;
+       char    res3[3];
+       u_char  sdma_sdmr;
+       char    res4[3];
+       u_char  sdma_idsr1;
+       char    res5[3];
+       u_char  sdma_idmr1;
+       char    res6[3];
+       u_char  sdma_idsr2;
+       char    res7[3];
+       u_char  sdma_idmr2;
+       char    res8[0x13];
+} sdma8xx_t;
+
+/* Communication Processor Module Interrupt Controller.
+*/
+typedef struct cpm_ic {
+       ushort  cpic_civr;
+       char    res[0xe];
+       uint    cpic_cicr;
+       uint    cpic_cipr;
+       uint    cpic_cimr;
+       uint    cpic_cisr;
+} cpic8xx_t;
+
+/* Input/Output Port control/status registers.
+*/
+typedef struct io_port {
+       ushort  iop_padir;
+       ushort  iop_papar;
+       ushort  iop_paodr;
+       ushort  iop_padat;
+       char    res1[8];
+       ushort  iop_pcdir;
+       ushort  iop_pcpar;
+       ushort  iop_pcso;
+       ushort  iop_pcdat;
+       ushort  iop_pcint;
+       char    res2[6];
+       ushort  iop_pddir;
+       ushort  iop_pdpar;
+       char    res3[2];
+       ushort  iop_pddat;
+       uint    utmode;
+       char    res4[4];
+} iop8xx_t;
+
+/* Communication Processor Module Timers
+*/
+typedef struct cpm_timers {
+       ushort  cpmt_tgcr;
+       char    res1[0xe];
+       ushort  cpmt_tmr1;
+       ushort  cpmt_tmr2;
+       ushort  cpmt_trr1;
+       ushort  cpmt_trr2;
+       ushort  cpmt_tcr1;
+       ushort  cpmt_tcr2;
+       ushort  cpmt_tcn1;
+       ushort  cpmt_tcn2;
+       ushort  cpmt_tmr3;
+       ushort  cpmt_tmr4;
+       ushort  cpmt_trr3;
+       ushort  cpmt_trr4;
+       ushort  cpmt_tcr3;
+       ushort  cpmt_tcr4;
+       ushort  cpmt_tcn3;
+       ushort  cpmt_tcn4;
+       ushort  cpmt_ter1;
+       ushort  cpmt_ter2;
+       ushort  cpmt_ter3;
+       ushort  cpmt_ter4;
+       char    res2[8];
+} cpmtimer8xx_t;
+
+/* Finally, the Communication Processor stuff.....
+*/
+typedef struct scc {           /* Serial communication channels */
+       uint    scc_gsmrl;
+       uint    scc_gsmrh;
+       ushort  scc_psmr;
+       char    res1[2];
+       ushort  scc_todr;
+       ushort  scc_dsr;
+       ushort  scc_scce;
+       char    res2[2];
+       ushort  scc_sccm;
+       char    res3;
+       u_char  scc_sccs;
+       char    res4[8];
+} scc_t;
+
+typedef struct smc {           /* Serial management channels */
+       char    res1[2];
+       ushort  smc_smcmr;
+       char    res2[2];
+       u_char  smc_smce;
+       char    res3[3];
+       u_char  smc_smcm;
+       char    res4[5];
+} smc_t;
+
+/* MPC860T Fast Ethernet Controller.  It isn't part of the CPM, but
+ * it fits within the address space.
+ */
+
+typedef struct fec {
+       uint    fec_addr_low;           /* lower 32 bits of station address     */
+       ushort  fec_addr_high;          /* upper 16 bits of station address     */
+       ushort  res1;                   /* reserved                             */
+       uint    fec_hash_table_high;    /* upper 32-bits of hash table          */
+       uint    fec_hash_table_low;     /* lower 32-bits of hash table          */
+       uint    fec_r_des_start;        /* beginning of Rx descriptor ring      */
+       uint    fec_x_des_start;        /* beginning of Tx descriptor ring      */
+       uint    fec_r_buff_size;        /* Rx buffer size                       */
+       uint    res2[9];                /* reserved                             */
+       uint    fec_ecntrl;             /* ethernet control register            */
+       uint    fec_ievent;             /* interrupt event register             */
+       uint    fec_imask;              /* interrupt mask register              */
+       uint    fec_ivec;               /* interrupt level and vector status    */
+       uint    fec_r_des_active;       /* Rx ring updated flag                 */
+       uint    fec_x_des_active;       /* Tx ring updated flag                 */
+       uint    res3[10];               /* reserved                             */
+       uint    fec_mii_data;           /* MII data register                    */
+       uint    fec_mii_speed;          /* MII speed control register           */
+       uint    res4[17];               /* reserved                             */
+       uint    fec_r_bound;            /* end of RAM (read-only)               */
+       uint    fec_r_fstart;           /* Rx FIFO start address                */
+       uint    res5[6];                /* reserved                             */
+       uint    fec_x_fstart;           /* Tx FIFO start address                */
+       uint    res6[17];               /* reserved                             */
+       uint    fec_fun_code;           /* fec SDMA function code               */
+       uint    res7[3];                /* reserved                             */
+       uint    fec_r_cntrl;            /* Rx control register                  */
+       uint    fec_r_hash;             /* Rx hash register                     */
+       uint    res8[14];               /* reserved                             */
+       uint    fec_x_cntrl;            /* Tx control register                  */
+       uint    res9[0x1e];             /* reserved                             */
+} fec_t;
+
+/* The FEC and LCD color map share the same address space....
+ * I guess we will never see an 823T :-).
+ */
+union fec_lcd {
+       fec_t   fl_un_fec;
+       u_char  fl_un_cmap[0x200];
+};
+
+typedef struct comm_proc {
+       /* General control and status registers.
+       */
+       ushort  cp_cpcr;
+       u_char  res1[2];
+       ushort  cp_rccr;
+       u_char  res2;
+       u_char  cp_rmds;
+       u_char  res3[4];
+       ushort  cp_cpmcr1;
+       ushort  cp_cpmcr2;
+       ushort  cp_cpmcr3;
+       ushort  cp_cpmcr4;
+       u_char  res4[2];
+       ushort  cp_rter;
+       u_char  res5[2];
+       ushort  cp_rtmr;
+       u_char  res6[0x14];
+
+       /* Baud rate generators.
+       */
+       uint    cp_brgc1;
+       uint    cp_brgc2;
+       uint    cp_brgc3;
+       uint    cp_brgc4;
+
+       /* Serial Communication Channels.
+       */
+       scc_t   cp_scc[4];
+
+       /* Serial Management Channels.
+       */
+       smc_t   cp_smc[2];
+
+       /* Serial Peripheral Interface.
+       */
+       ushort  cp_spmode;
+       u_char  res7[4];
+       u_char  cp_spie;
+       u_char  res8[3];
+       u_char  cp_spim;
+       u_char  res9[2];
+       u_char  cp_spcom;
+       u_char  res10[2];
+
+       /* Parallel Interface Port.
+       */
+       u_char  res11[2];
+       ushort  cp_pipc;
+       u_char  res12[2];
+       ushort  cp_ptpr;
+       uint    cp_pbdir;
+       uint    cp_pbpar;
+       u_char  res13[2];
+       ushort  cp_pbodr;
+       uint    cp_pbdat;
+
+       /* Port E - MPC87x/88x only.
+        */
+       uint    cp_pedir;
+       uint    cp_pepar;
+       uint    cp_peso;
+       uint    cp_peodr;
+       uint    cp_pedat;
+
+       /* Communications Processor Timing Register -
+          Contains RMII Timing for the FECs on MPC87x/88x only.
+       */
+       uint    cp_cptr;
+
+       /* Serial Interface and Time Slot Assignment.
+       */
+       uint    cp_simode;
+       u_char  cp_sigmr;
+       u_char  res15;
+       u_char  cp_sistr;
+       u_char  cp_sicmr;
+       u_char  res16[4];
+       uint    cp_sicr;
+       uint    cp_sirp;
+       u_char  res17[0xc];
+
+       /* 256 bytes of MPC823 video controller RAM array.
+       */
+       u_char  cp_vcram[0x100];
+       u_char  cp_siram[0x200];
+
+       /* The fast ethernet controller is not really part of the CPM,
+        * but it resides in the address space.
+        * The LCD color map is also here.
+        */
+       union   fec_lcd fl_un;
+#define cp_fec         fl_un.fl_un_fec
+#define lcd_cmap       fl_un.fl_un_cmap
+       char    res18[0xE00];
+
+       /* The DUET family has a second FEC here */
+       fec_t   cp_fec2;
+#define cp_fec1        cp_fec  /* consistency macro */
+
+       /* Dual Ported RAM follows.
+        * There are many different formats for this memory area
+        * depending upon the devices used and options chosen.
+        * Some processors don't have all of it populated.
+        */
+       u_char  cp_dpmem[0x1C00];       /* BD / Data / ucode */
+       u_char  cp_dparam[0x400];       /* Parameter RAM */
+} cpm8xx_t;
+
+/* Internal memory map.
+*/
+typedef struct immap {
+       sysconf8xx_t    im_siu_conf;    /* SIU Configuration */
+       pcmconf8xx_t    im_pcmcia;      /* PCMCIA Configuration */
+       memctl8xx_t     im_memctl;      /* Memory Controller */
+       sit8xx_t        im_sit;         /* System integration timers */
+       car8xx_t        im_clkrst;      /* Clocks and reset */
+       sitk8xx_t       im_sitk;        /* Sys int timer keys */
+       cark8xx_t       im_clkrstk;     /* Clocks and reset keys */
+       vid823_t        im_vid;         /* Video (823 only) */
+       lcd823_t        im_lcd;         /* LCD (823 only) */
+       i2c8xx_t        im_i2c;         /* I2C control/status */
+       sdma8xx_t       im_sdma;        /* SDMA control/status */
+       cpic8xx_t       im_cpic;        /* CPM Interrupt Controller */
+       iop8xx_t        im_ioport;      /* IO Port control/status */
+       cpmtimer8xx_t   im_cpmtimer;    /* CPM timers */
+       cpm8xx_t        im_cpm;         /* Communication processor */
+} immap_t;
+
+#endif /* __IMMAP_8XX__ */
+#endif /* __KERNEL__ */
index c44810b9d3224dbc54474b4a6cb7eab5a2a9af3d..f3fc733758f5ccfeb27e1e3e51df7d4039608cbb 100644 (file)
@@ -5,7 +5,7 @@
  * PowerPC atomic operations
  */
 
-typedef struct { volatile int counter; } atomic_t;
+typedef struct { int counter; } atomic_t;
 
 #ifdef __KERNEL__
 #include <linux/compiler.h>
@@ -15,8 +15,19 @@ typedef struct { volatile int counter; } atomic_t;
 
 #define ATOMIC_INIT(i)         { (i) }
 
-#define atomic_read(v)         ((v)->counter)
-#define atomic_set(v,i)                (((v)->counter) = (i))
+static __inline__ int atomic_read(const atomic_t *v)
+{
+       int t;
+
+       __asm__ __volatile__("lwz%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter));
+
+       return t;
+}
+
+static __inline__ void atomic_set(atomic_t *v, int i)
+{
+       __asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
+}
 
 static __inline__ void atomic_add(int a, atomic_t *v)
 {
@@ -240,12 +251,23 @@ static __inline__ int atomic_dec_if_positive(atomic_t *v)
 
 #ifdef __powerpc64__
 
-typedef struct { volatile long counter; } atomic64_t;
+typedef struct { long counter; } atomic64_t;
 
 #define ATOMIC64_INIT(i)       { (i) }
 
-#define atomic64_read(v)       ((v)->counter)
-#define atomic64_set(v,i)      (((v)->counter) = (i))
+static __inline__ long atomic64_read(const atomic64_t *v)
+{
+       long t;
+
+       __asm__ __volatile__("ld%U1%X1 %0,%1" : "=r"(t) : "m"(v->counter));
+
+       return t;
+}
+
+static __inline__ void atomic64_set(atomic64_t *v, long i)
+{
+       __asm__ __volatile__("std%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
+}
 
 static __inline__ void atomic64_add(long a, atomic64_t *v)
 {
diff --git a/include/asm-powerpc/cell-regs.h b/include/asm-powerpc/cell-regs.h
new file mode 100644 (file)
index 0000000..fd6fd00
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ * cbe_regs.h
+ *
+ * This file is intended to hold the various register definitions for CBE
+ * on-chip system devices (memory controller, IO controller, etc...)
+ *
+ * (C) Copyright IBM Corporation 2001,2006
+ *
+ * Authors: Maximino Aguilar (maguilar@us.ibm.com)
+ *          David J. Erb (djerb@us.ibm.com)
+ *
+ * (c) 2006 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
+ */
+
+#ifndef CBE_REGS_H
+#define CBE_REGS_H
+
+#include <asm/cell-pmu.h>
+
+/*
+ *
+ * Some HID register definitions
+ *
+ */
+
+/* CBE specific HID0 bits */
+#define HID0_CBE_THERM_WAKEUP  0x0000020000000000ul
+#define HID0_CBE_SYSERR_WAKEUP 0x0000008000000000ul
+#define HID0_CBE_THERM_INT_EN  0x0000000400000000ul
+#define HID0_CBE_SYSERR_INT_EN 0x0000000200000000ul
+
+#define MAX_CBE                2
+
+/*
+ *
+ * Pervasive unit register definitions
+ *
+ */
+
+union spe_reg {
+       u64 val;
+       u8 spe[8];
+};
+
+union ppe_spe_reg {
+       u64 val;
+       struct {
+               u32 ppe;
+               u32 spe;
+       };
+};
+
+
+struct cbe_pmd_regs {
+       /* Debug Bus Control */
+       u64     pad_0x0000;                                     /* 0x0000 */
+
+       u64     group_control;                                  /* 0x0008 */
+
+       u8      pad_0x0010_0x00a8 [0x00a8 - 0x0010];            /* 0x0010 */
+
+       u64     debug_bus_control;                              /* 0x00a8 */
+
+       u8      pad_0x00b0_0x0100 [0x0100 - 0x00b0];            /* 0x00b0 */
+
+       u64     trace_aux_data;                                 /* 0x0100 */
+       u64     trace_buffer_0_63;                              /* 0x0108 */
+       u64     trace_buffer_64_127;                            /* 0x0110 */
+       u64     trace_address;                                  /* 0x0118 */
+       u64     ext_tr_timer;                                   /* 0x0120 */
+
+       u8      pad_0x0128_0x0400 [0x0400 - 0x0128];            /* 0x0128 */
+
+       /* Performance Monitor */
+       u64     pm_status;                                      /* 0x0400 */
+       u64     pm_control;                                     /* 0x0408 */
+       u64     pm_interval;                                    /* 0x0410 */
+       u64     pm_ctr[4];                                      /* 0x0418 */
+       u64     pm_start_stop;                                  /* 0x0438 */
+       u64     pm07_control[8];                                /* 0x0440 */
+
+       u8      pad_0x0480_0x0800 [0x0800 - 0x0480];            /* 0x0480 */
+
+       /* Thermal Sensor Registers */
+       union   spe_reg ts_ctsr1;                               /* 0x0800 */
+       u64     ts_ctsr2;                                       /* 0x0808 */
+       union   spe_reg ts_mtsr1;                               /* 0x0810 */
+       u64     ts_mtsr2;                                       /* 0x0818 */
+       union   spe_reg ts_itr1;                                /* 0x0820 */
+       u64     ts_itr2;                                        /* 0x0828 */
+       u64     ts_gitr;                                        /* 0x0830 */
+       u64     ts_isr;                                         /* 0x0838 */
+       u64     ts_imr;                                         /* 0x0840 */
+       union   spe_reg tm_cr1;                                 /* 0x0848 */
+       u64     tm_cr2;                                         /* 0x0850 */
+       u64     tm_simr;                                        /* 0x0858 */
+       union   ppe_spe_reg tm_tpr;                             /* 0x0860 */
+       union   spe_reg tm_str1;                                /* 0x0868 */
+       u64     tm_str2;                                        /* 0x0870 */
+       union   ppe_spe_reg tm_tsr;                             /* 0x0878 */
+
+       /* Power Management */
+       u64     pmcr;                                           /* 0x0880 */
+#define CBE_PMD_PAUSE_ZERO_CONTROL     0x10000
+       u64     pmsr;                                           /* 0x0888 */
+
+       /* Time Base Register */
+       u64     tbr;                                            /* 0x0890 */
+
+       u8      pad_0x0898_0x0c00 [0x0c00 - 0x0898];            /* 0x0898 */
+
+       /* Fault Isolation Registers */
+       u64     checkstop_fir;                                  /* 0x0c00 */
+       u64     recoverable_fir;                                /* 0x0c08 */
+       u64     spec_att_mchk_fir;                              /* 0x0c10 */
+       u32     fir_mode_reg;                                   /* 0x0c18 */
+       u8      pad_0x0c1c_0x0c20 [4];                          /* 0x0c1c */
+#define CBE_PMD_FIR_MODE_M8            0x00800
+       u64     fir_enable_mask;                                /* 0x0c20 */
+
+       u8      pad_0x0c28_0x0ca8 [0x0ca8 - 0x0c28];            /* 0x0c28 */
+       u64     ras_esc_0;                                      /* 0x0ca8 */
+       u8      pad_0x0cb0_0x1000 [0x1000 - 0x0cb0];            /* 0x0cb0 */
+};
+
+extern struct cbe_pmd_regs __iomem *cbe_get_pmd_regs(struct device_node *np);
+extern struct cbe_pmd_regs __iomem *cbe_get_cpu_pmd_regs(int cpu);
+
+/*
+ * PMU shadow registers
+ *
+ * Many of the registers in the performance monitoring unit are write-only,
+ * so we need to save a copy of what we write to those registers.
+ *
+ * The actual data counters are read/write. However, writing to the counters
+ * only takes effect if the PMU is enabled. Otherwise the value is stored in
+ * a hardware latch until the next time the PMU is enabled. So we save a copy
+ * of the counter values if we need to read them back while the PMU is
+ * disabled. The counter_value_in_latch field is a bitmap indicating which
+ * counters currently have a value waiting to be written.
+ */
+
+struct cbe_pmd_shadow_regs {
+       u32 group_control;
+       u32 debug_bus_control;
+       u32 trace_address;
+       u32 ext_tr_timer;
+       u32 pm_status;
+       u32 pm_control;
+       u32 pm_interval;
+       u32 pm_start_stop;
+       u32 pm07_control[NR_CTRS];
+
+       u32 pm_ctr[NR_PHYS_CTRS];
+       u32 counter_value_in_latch;
+};
+
+extern struct cbe_pmd_shadow_regs *cbe_get_pmd_shadow_regs(struct device_node *np);
+extern struct cbe_pmd_shadow_regs *cbe_get_cpu_pmd_shadow_regs(int cpu);
+
+/*
+ *
+ * IIC unit register definitions
+ *
+ */
+
+struct cbe_iic_pending_bits {
+       u32 data;
+       u8 flags;
+       u8 class;
+       u8 source;
+       u8 prio;
+};
+
+#define CBE_IIC_IRQ_VALID      0x80
+#define CBE_IIC_IRQ_IPI                0x40
+
+struct cbe_iic_thread_regs {
+       struct cbe_iic_pending_bits pending;
+       struct cbe_iic_pending_bits pending_destr;
+       u64 generate;
+       u64 prio;
+};
+
+struct cbe_iic_regs {
+       u8      pad_0x0000_0x0400[0x0400 - 0x0000];             /* 0x0000 */
+
+       /* IIC interrupt registers */
+       struct  cbe_iic_thread_regs thread[2];                  /* 0x0400 */
+
+       u64     iic_ir;                                         /* 0x0440 */
+#define CBE_IIC_IR_PRIO(x)      (((x) & 0xf) << 12)
+#define CBE_IIC_IR_DEST_NODE(x) (((x) & 0xf) << 4)
+#define CBE_IIC_IR_DEST_UNIT(x) ((x) & 0xf)
+#define CBE_IIC_IR_IOC_0        0x0
+#define CBE_IIC_IR_IOC_1S       0xb
+#define CBE_IIC_IR_PT_0         0xe
+#define CBE_IIC_IR_PT_1         0xf
+
+       u64     iic_is;                                         /* 0x0448 */
+#define CBE_IIC_IS_PMI         0x2
+
+       u8      pad_0x0450_0x0500[0x0500 - 0x0450];             /* 0x0450 */
+
+       /* IOC FIR */
+       u64     ioc_fir_reset;                                  /* 0x0500 */
+       u64     ioc_fir_set;                                    /* 0x0508 */
+       u64     ioc_checkstop_enable;                           /* 0x0510 */
+       u64     ioc_fir_error_mask;                             /* 0x0518 */
+       u64     ioc_syserr_enable;                              /* 0x0520 */
+       u64     ioc_fir;                                        /* 0x0528 */
+
+       u8      pad_0x0530_0x1000[0x1000 - 0x0530];             /* 0x0530 */
+};
+
+extern struct cbe_iic_regs __iomem *cbe_get_iic_regs(struct device_node *np);
+extern struct cbe_iic_regs __iomem *cbe_get_cpu_iic_regs(int cpu);
+
+
+struct cbe_mic_tm_regs {
+       u8      pad_0x0000_0x0040[0x0040 - 0x0000];             /* 0x0000 */
+
+       u64     mic_ctl_cnfg2;                                  /* 0x0040 */
+#define CBE_MIC_ENABLE_AUX_TRC         0x8000000000000000LL
+#define CBE_MIC_DISABLE_PWR_SAV_2      0x0200000000000000LL
+#define CBE_MIC_DISABLE_AUX_TRC_WRAP   0x0100000000000000LL
+#define CBE_MIC_ENABLE_AUX_TRC_INT     0x0080000000000000LL
+
+       u64     pad_0x0048;                                     /* 0x0048 */
+
+       u64     mic_aux_trc_base;                               /* 0x0050 */
+       u64     mic_aux_trc_max_addr;                           /* 0x0058 */
+       u64     mic_aux_trc_cur_addr;                           /* 0x0060 */
+       u64     mic_aux_trc_grf_addr;                           /* 0x0068 */
+       u64     mic_aux_trc_grf_data;                           /* 0x0070 */
+
+       u64     pad_0x0078;                                     /* 0x0078 */
+
+       u64     mic_ctl_cnfg_0;                                 /* 0x0080 */
+#define CBE_MIC_DISABLE_PWR_SAV_0      0x8000000000000000LL
+
+       u64     pad_0x0088;                                     /* 0x0088 */
+
+       u64     slow_fast_timer_0;                              /* 0x0090 */
+       u64     slow_next_timer_0;                              /* 0x0098 */
+
+       u8      pad_0x00a0_0x00f8[0x00f8 - 0x00a0];             /* 0x00a0 */
+       u64     mic_df_ecc_address_0;                           /* 0x00f8 */
+
+       u8      pad_0x0100_0x01b8[0x01b8 - 0x0100];             /* 0x0100 */
+       u64     mic_df_ecc_address_1;                           /* 0x01b8 */
+
+       u64     mic_ctl_cnfg_1;                                 /* 0x01c0 */
+#define CBE_MIC_DISABLE_PWR_SAV_1      0x8000000000000000LL
+
+       u64     pad_0x01c8;                                     /* 0x01c8 */
+
+       u64     slow_fast_timer_1;                              /* 0x01d0 */
+       u64     slow_next_timer_1;                              /* 0x01d8 */
+
+       u8      pad_0x01e0_0x0208[0x0208 - 0x01e0];             /* 0x01e0 */
+       u64     mic_exc;                                        /* 0x0208 */
+#define CBE_MIC_EXC_BLOCK_SCRUB                0x0800000000000000ULL
+#define CBE_MIC_EXC_FAST_SCRUB         0x0100000000000000ULL
+
+       u64     mic_mnt_cfg;                                    /* 0x0210 */
+#define CBE_MIC_MNT_CFG_CHAN_0_POP     0x0002000000000000ULL
+#define CBE_MIC_MNT_CFG_CHAN_1_POP     0x0004000000000000ULL
+
+       u64     mic_df_config;                                  /* 0x0218 */
+#define CBE_MIC_ECC_DISABLE_0          0x4000000000000000ULL
+#define CBE_MIC_ECC_REP_SINGLE_0       0x2000000000000000ULL
+#define CBE_MIC_ECC_DISABLE_1          0x0080000000000000ULL
+#define CBE_MIC_ECC_REP_SINGLE_1       0x0040000000000000ULL
+
+       u8      pad_0x0220_0x0230[0x0230 - 0x0220];             /* 0x0220 */
+       u64     mic_fir;                                        /* 0x0230 */
+#define CBE_MIC_FIR_ECC_SINGLE_0_ERR   0x0200000000000000ULL
+#define CBE_MIC_FIR_ECC_MULTI_0_ERR    0x0100000000000000ULL
+#define CBE_MIC_FIR_ECC_SINGLE_1_ERR   0x0080000000000000ULL
+#define CBE_MIC_FIR_ECC_MULTI_1_ERR    0x0040000000000000ULL
+#define CBE_MIC_FIR_ECC_ERR_MASK       0xffff000000000000ULL
+#define CBE_MIC_FIR_ECC_SINGLE_0_CTE   0x0000020000000000ULL
+#define CBE_MIC_FIR_ECC_MULTI_0_CTE    0x0000010000000000ULL
+#define CBE_MIC_FIR_ECC_SINGLE_1_CTE   0x0000008000000000ULL
+#define CBE_MIC_FIR_ECC_MULTI_1_CTE    0x0000004000000000ULL
+#define CBE_MIC_FIR_ECC_CTE_MASK       0x0000ffff00000000ULL
+#define CBE_MIC_FIR_ECC_SINGLE_0_RESET 0x0000000002000000ULL
+#define CBE_MIC_FIR_ECC_MULTI_0_RESET  0x0000000001000000ULL
+#define CBE_MIC_FIR_ECC_SINGLE_1_RESET 0x0000000000800000ULL
+#define CBE_MIC_FIR_ECC_MULTI_1_RESET  0x0000000000400000ULL
+#define CBE_MIC_FIR_ECC_RESET_MASK     0x00000000ffff0000ULL
+#define CBE_MIC_FIR_ECC_SINGLE_0_SET   0x0000000000000200ULL
+#define CBE_MIC_FIR_ECC_MULTI_0_SET    0x0000000000000100ULL
+#define CBE_MIC_FIR_ECC_SINGLE_1_SET   0x0000000000000080ULL
+#define CBE_MIC_FIR_ECC_MULTI_1_SET    0x0000000000000040ULL
+#define CBE_MIC_FIR_ECC_SET_MASK       0x000000000000ffffULL
+       u64     mic_fir_debug;                                  /* 0x0238 */
+
+       u8      pad_0x0240_0x1000[0x1000 - 0x0240];             /* 0x0240 */
+};
+
+extern struct cbe_mic_tm_regs __iomem *cbe_get_mic_tm_regs(struct device_node *np);
+extern struct cbe_mic_tm_regs __iomem *cbe_get_cpu_mic_tm_regs(int cpu);
+
+/* some utility functions to deal with SMT */
+extern u32 cbe_get_hw_thread_id(int cpu);
+extern u32 cbe_cpu_to_node(int cpu);
+extern u32 cbe_node_to_cpu(int node);
+
+/* Init this module early */
+extern void cbe_regs_init(void);
+
+
+#endif /* CBE_REGS_H */
diff --git a/include/asm-powerpc/clk_interface.h b/include/asm-powerpc/clk_interface.h
new file mode 100644 (file)
index 0000000..ab1882c
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __ASM_POWERPC_CLK_INTERFACE_H
+#define __ASM_POWERPC_CLK_INTERFACE_H
+
+#include <linux/clk.h>
+
+struct clk_interface {
+       struct clk*     (*clk_get)      (struct device *dev, const char *id);
+       int             (*clk_enable)   (struct clk *clk);
+       void            (*clk_disable)  (struct clk *clk);
+       unsigned long   (*clk_get_rate) (struct clk *clk);
+       void            (*clk_put)      (struct clk *clk);
+       long            (*clk_round_rate) (struct clk *clk, unsigned long rate);
+       int             (*clk_set_rate) (struct clk *clk, unsigned long rate);
+       int             (*clk_set_parent) (struct clk *clk, struct clk *parent);
+       struct clk*     (*clk_get_parent) (struct clk *clk);
+};
+
+extern struct clk_interface clk_functions;
+
+#endif /* __ASM_POWERPC_CLK_INTERFACE_H */
diff --git a/include/asm-powerpc/commproc.h b/include/asm-powerpc/commproc.h
new file mode 100644 (file)
index 0000000..0307c84
--- /dev/null
@@ -0,0 +1,755 @@
+/*
+ * MPC8xx Communication Processor Module.
+ * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
+ *
+ * This file contains structures and information for the communication
+ * processor channels.  Some CPM control and status is available
+ * throught the MPC8xx internal memory map.  See immap.h for details.
+ * This file only contains what I need for the moment, not the total
+ * CPM capabilities.  I (or someone else) will add definitions as they
+ * are needed.  -- Dan
+ *
+ * On the MBX board, EPPC-Bug loads CPM microcode into the first 512
+ * bytes of the DP RAM and relocates the I2C parameter area to the
+ * IDMA1 space.  The remaining DP RAM is available for buffer descriptors
+ * or other use.
+ */
+#ifndef __CPM_8XX__
+#define __CPM_8XX__
+
+#include <asm/8xx_immap.h>
+#include <asm/ptrace.h>
+#include <asm/cpm.h>
+
+/* CPM Command register.
+*/
+#define CPM_CR_RST     ((ushort)0x8000)
+#define CPM_CR_OPCODE  ((ushort)0x0f00)
+#define CPM_CR_CHAN    ((ushort)0x00f0)
+#define CPM_CR_FLG     ((ushort)0x0001)
+
+/* Some commands (there are more...later)
+*/
+#define CPM_CR_INIT_TRX                ((ushort)0x0000)
+#define CPM_CR_INIT_RX         ((ushort)0x0001)
+#define CPM_CR_INIT_TX         ((ushort)0x0002)
+#define CPM_CR_HUNT_MODE       ((ushort)0x0003)
+#define CPM_CR_STOP_TX         ((ushort)0x0004)
+#define CPM_CR_GRA_STOP_TX     ((ushort)0x0005)
+#define CPM_CR_RESTART_TX      ((ushort)0x0006)
+#define CPM_CR_CLOSE_RX_BD     ((ushort)0x0007)
+#define CPM_CR_SET_GADDR       ((ushort)0x0008)
+#define CPM_CR_SET_TIMER       CPM_CR_SET_GADDR
+
+/* Channel numbers.
+*/
+#define CPM_CR_CH_SCC1         ((ushort)0x0000)
+#define CPM_CR_CH_I2C          ((ushort)0x0001)        /* I2C and IDMA1 */
+#define CPM_CR_CH_SCC2         ((ushort)0x0004)
+#define CPM_CR_CH_SPI          ((ushort)0x0005)        /* SPI / IDMA2 / Timers */
+#define CPM_CR_CH_TIMER                CPM_CR_CH_SPI
+#define CPM_CR_CH_SCC3         ((ushort)0x0008)
+#define CPM_CR_CH_SMC1         ((ushort)0x0009)        /* SMC1 / DSP1 */
+#define CPM_CR_CH_SCC4         ((ushort)0x000c)
+#define CPM_CR_CH_SMC2         ((ushort)0x000d)        /* SMC2 / DSP2 */
+
+#define mk_cr_cmd(CH, CMD)     ((CMD << 8) | (CH << 4))
+
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
+/* The dual ported RAM is multi-functional.  Some areas can be (and are
+ * being) used for microcode.  There is an area that can only be used
+ * as data ram for buffer descriptors, which is all we use right now.
+ * Currently the first 512 and last 256 bytes are used for microcode.
+ */
+#define CPM_DATAONLY_BASE      ((uint)0x0800)
+#define CPM_DATAONLY_SIZE      ((uint)0x0700)
+#define CPM_DP_NOSPACE         ((uint)0x7fffffff)
+#endif
+
+/* Export the base address of the communication processor registers
+ * and dual port ram.
+ */
+extern cpm8xx_t __iomem *cpmp; /* Pointer to comm processor */
+
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+#define cpm_dpalloc cpm_muram_alloc
+#define cpm_dpfree cpm_muram_free
+#define cpm_dpram_addr cpm_muram_addr
+#define cpm_dpram_phys cpm_muram_dma
+#else
+extern unsigned long cpm_dpalloc(uint size, uint align);
+extern int cpm_dpfree(unsigned long offset);
+extern unsigned long cpm_dpalloc_fixed(unsigned long offset, uint size, uint align);
+extern void cpm_dpdump(void);
+extern void *cpm_dpram_addr(unsigned long offset);
+extern uint cpm_dpram_phys(u8* addr);
+#endif
+
+extern void cpm_setbrg(uint brg, uint rate);
+
+extern uint m8xx_cpm_hostalloc(uint size);
+extern int  m8xx_cpm_hostfree(uint start);
+extern void m8xx_cpm_hostdump(void);
+
+extern void cpm_load_patch(volatile immap_t *immr);
+
+/* Buffer descriptors used by many of the CPM protocols.
+*/
+typedef struct cpm_buf_desc {
+       ushort  cbd_sc;         /* Status and Control */
+       ushort  cbd_datlen;     /* Data length in buffer */
+       uint    cbd_bufaddr;    /* Buffer address in host memory */
+} cbd_t;
+
+#define BD_SC_EMPTY    ((ushort)0x8000)        /* Receive is empty */
+#define BD_SC_READY    ((ushort)0x8000)        /* Transmit is ready */
+#define BD_SC_WRAP     ((ushort)0x2000)        /* Last buffer descriptor */
+#define BD_SC_INTRPT   ((ushort)0x1000)        /* Interrupt on change */
+#define BD_SC_LAST     ((ushort)0x0800)        /* Last buffer in frame */
+#define BD_SC_TC       ((ushort)0x0400)        /* Transmit CRC */
+#define BD_SC_CM       ((ushort)0x0200)        /* Continous mode */
+#define BD_SC_ID       ((ushort)0x0100)        /* Rec'd too many idles */
+#define BD_SC_P                ((ushort)0x0100)        /* xmt preamble */
+#define BD_SC_BR       ((ushort)0x0020)        /* Break received */
+#define BD_SC_FR       ((ushort)0x0010)        /* Framing error */
+#define BD_SC_PR       ((ushort)0x0008)        /* Parity error */
+#define BD_SC_NAK      ((ushort)0x0004)        /* NAK - did not respond */
+#define BD_SC_OV       ((ushort)0x0002)        /* Overrun */
+#define BD_SC_UN       ((ushort)0x0002)        /* Underrun */
+#define BD_SC_CD       ((ushort)0x0001)        /* ?? */
+#define BD_SC_CL       ((ushort)0x0001)        /* Collision */
+
+/* Parameter RAM offsets.
+*/
+#define PROFF_SCC1     ((uint)0x0000)
+#define PROFF_IIC      ((uint)0x0080)
+#define PROFF_SCC2     ((uint)0x0100)
+#define PROFF_SPI      ((uint)0x0180)
+#define PROFF_SCC3     ((uint)0x0200)
+#define PROFF_SMC1     ((uint)0x0280)
+#define PROFF_SCC4     ((uint)0x0300)
+#define PROFF_SMC2     ((uint)0x0380)
+
+/* Define enough so I can at least use the serial port as a UART.
+ * The MBX uses SMC1 as the host serial port.
+ */
+typedef struct smc_uart {
+       ushort  smc_rbase;      /* Rx Buffer descriptor base address */
+       ushort  smc_tbase;      /* Tx Buffer descriptor base address */
+       u_char  smc_rfcr;       /* Rx function code */
+       u_char  smc_tfcr;       /* Tx function code */
+       ushort  smc_mrblr;      /* Max receive buffer length */
+       uint    smc_rstate;     /* Internal */
+       uint    smc_idp;        /* Internal */
+       ushort  smc_rbptr;      /* Internal */
+       ushort  smc_ibc;        /* Internal */
+       uint    smc_rxtmp;      /* Internal */
+       uint    smc_tstate;     /* Internal */
+       uint    smc_tdp;        /* Internal */
+       ushort  smc_tbptr;      /* Internal */
+       ushort  smc_tbc;        /* Internal */
+       uint    smc_txtmp;      /* Internal */
+       ushort  smc_maxidl;     /* Maximum idle characters */
+       ushort  smc_tmpidl;     /* Temporary idle counter */
+       ushort  smc_brklen;     /* Last received break length */
+       ushort  smc_brkec;      /* rcv'd break condition counter */
+       ushort  smc_brkcr;      /* xmt break count register */
+       ushort  smc_rmask;      /* Temporary bit mask */
+       char    res1[8];        /* Reserved */
+       ushort  smc_rpbase;     /* Relocation pointer */
+} smc_uart_t;
+
+/* Function code bits.
+*/
+#define SMC_EB ((u_char)0x10)  /* Set big endian byte order */
+
+/* SMC uart mode register.
+*/
+#define        SMCMR_REN       ((ushort)0x0001)
+#define SMCMR_TEN      ((ushort)0x0002)
+#define SMCMR_DM       ((ushort)0x000c)
+#define SMCMR_SM_GCI   ((ushort)0x0000)
+#define SMCMR_SM_UART  ((ushort)0x0020)
+#define SMCMR_SM_TRANS ((ushort)0x0030)
+#define SMCMR_SM_MASK  ((ushort)0x0030)
+#define SMCMR_PM_EVEN  ((ushort)0x0100)        /* Even parity, else odd */
+#define SMCMR_REVD     SMCMR_PM_EVEN
+#define SMCMR_PEN      ((ushort)0x0200)        /* Parity enable */
+#define SMCMR_BS       SMCMR_PEN
+#define SMCMR_SL       ((ushort)0x0400)        /* Two stops, else one */
+#define SMCR_CLEN_MASK ((ushort)0x7800)        /* Character length */
+#define smcr_mk_clen(C)        (((C) << 11) & SMCR_CLEN_MASK)
+
+/* SMC2 as Centronics parallel printer.  It is half duplex, in that
+ * it can only receive or transmit.  The parameter ram values for
+ * each direction are either unique or properly overlap, so we can
+ * include them in one structure.
+ */
+typedef struct smc_centronics {
+       ushort  scent_rbase;
+       ushort  scent_tbase;
+       u_char  scent_cfcr;
+       u_char  scent_smask;
+       ushort  scent_mrblr;
+       uint    scent_rstate;
+       uint    scent_r_ptr;
+       ushort  scent_rbptr;
+       ushort  scent_r_cnt;
+       uint    scent_rtemp;
+       uint    scent_tstate;
+       uint    scent_t_ptr;
+       ushort  scent_tbptr;
+       ushort  scent_t_cnt;
+       uint    scent_ttemp;
+       ushort  scent_max_sl;
+       ushort  scent_sl_cnt;
+       ushort  scent_character1;
+       ushort  scent_character2;
+       ushort  scent_character3;
+       ushort  scent_character4;
+       ushort  scent_character5;
+       ushort  scent_character6;
+       ushort  scent_character7;
+       ushort  scent_character8;
+       ushort  scent_rccm;
+       ushort  scent_rccr;
+} smc_cent_t;
+
+/* Centronics Status Mask Register.
+*/
+#define SMC_CENT_F     ((u_char)0x08)
+#define SMC_CENT_PE    ((u_char)0x04)
+#define SMC_CENT_S     ((u_char)0x02)
+
+/* SMC Event and Mask register.
+*/
+#define        SMCM_BRKE       ((unsigned char)0x40)   /* When in UART Mode */
+#define        SMCM_BRK        ((unsigned char)0x10)   /* When in UART Mode */
+#define        SMCM_TXE        ((unsigned char)0x10)   /* When in Transparent Mode */
+#define        SMCM_BSY        ((unsigned char)0x04)
+#define        SMCM_TX         ((unsigned char)0x02)
+#define        SMCM_RX         ((unsigned char)0x01)
+
+/* Baud rate generators.
+*/
+#define CPM_BRG_RST            ((uint)0x00020000)
+#define CPM_BRG_EN             ((uint)0x00010000)
+#define CPM_BRG_EXTC_INT       ((uint)0x00000000)
+#define CPM_BRG_EXTC_CLK2      ((uint)0x00004000)
+#define CPM_BRG_EXTC_CLK6      ((uint)0x00008000)
+#define CPM_BRG_ATB            ((uint)0x00002000)
+#define CPM_BRG_CD_MASK                ((uint)0x00001ffe)
+#define CPM_BRG_DIV16          ((uint)0x00000001)
+
+/* SI Clock Route Register
+*/
+#define SICR_RCLK_SCC1_BRG1    ((uint)0x00000000)
+#define SICR_TCLK_SCC1_BRG1    ((uint)0x00000000)
+#define SICR_RCLK_SCC2_BRG2    ((uint)0x00000800)
+#define SICR_TCLK_SCC2_BRG2    ((uint)0x00000100)
+#define SICR_RCLK_SCC3_BRG3    ((uint)0x00100000)
+#define SICR_TCLK_SCC3_BRG3    ((uint)0x00020000)
+#define SICR_RCLK_SCC4_BRG4    ((uint)0x18000000)
+#define SICR_TCLK_SCC4_BRG4    ((uint)0x03000000)
+
+/* SCCs.
+*/
+#define SCC_GSMRH_IRP          ((uint)0x00040000)
+#define SCC_GSMRH_GDE          ((uint)0x00010000)
+#define SCC_GSMRH_TCRC_CCITT   ((uint)0x00008000)
+#define SCC_GSMRH_TCRC_BISYNC  ((uint)0x00004000)
+#define SCC_GSMRH_TCRC_HDLC    ((uint)0x00000000)
+#define SCC_GSMRH_REVD         ((uint)0x00002000)
+#define SCC_GSMRH_TRX          ((uint)0x00001000)
+#define SCC_GSMRH_TTX          ((uint)0x00000800)
+#define SCC_GSMRH_CDP          ((uint)0x00000400)
+#define SCC_GSMRH_CTSP         ((uint)0x00000200)
+#define SCC_GSMRH_CDS          ((uint)0x00000100)
+#define SCC_GSMRH_CTSS         ((uint)0x00000080)
+#define SCC_GSMRH_TFL          ((uint)0x00000040)
+#define SCC_GSMRH_RFW          ((uint)0x00000020)
+#define SCC_GSMRH_TXSY         ((uint)0x00000010)
+#define SCC_GSMRH_SYNL16       ((uint)0x0000000c)
+#define SCC_GSMRH_SYNL8                ((uint)0x00000008)
+#define SCC_GSMRH_SYNL4                ((uint)0x00000004)
+#define SCC_GSMRH_RTSM         ((uint)0x00000002)
+#define SCC_GSMRH_RSYN         ((uint)0x00000001)
+
+#define SCC_GSMRL_SIR          ((uint)0x80000000)      /* SCC2 only */
+#define SCC_GSMRL_EDGE_NONE    ((uint)0x60000000)
+#define SCC_GSMRL_EDGE_NEG     ((uint)0x40000000)
+#define SCC_GSMRL_EDGE_POS     ((uint)0x20000000)
+#define SCC_GSMRL_EDGE_BOTH    ((uint)0x00000000)
+#define SCC_GSMRL_TCI          ((uint)0x10000000)
+#define SCC_GSMRL_TSNC_3       ((uint)0x0c000000)
+#define SCC_GSMRL_TSNC_4       ((uint)0x08000000)
+#define SCC_GSMRL_TSNC_14      ((uint)0x04000000)
+#define SCC_GSMRL_TSNC_INF     ((uint)0x00000000)
+#define SCC_GSMRL_RINV         ((uint)0x02000000)
+#define SCC_GSMRL_TINV         ((uint)0x01000000)
+#define SCC_GSMRL_TPL_128      ((uint)0x00c00000)
+#define SCC_GSMRL_TPL_64       ((uint)0x00a00000)
+#define SCC_GSMRL_TPL_48       ((uint)0x00800000)
+#define SCC_GSMRL_TPL_32       ((uint)0x00600000)
+#define SCC_GSMRL_TPL_16       ((uint)0x00400000)
+#define SCC_GSMRL_TPL_8                ((uint)0x00200000)
+#define SCC_GSMRL_TPL_NONE     ((uint)0x00000000)
+#define SCC_GSMRL_TPP_ALL1     ((uint)0x00180000)
+#define SCC_GSMRL_TPP_01       ((uint)0x00100000)
+#define SCC_GSMRL_TPP_10       ((uint)0x00080000)
+#define SCC_GSMRL_TPP_ZEROS    ((uint)0x00000000)
+#define SCC_GSMRL_TEND         ((uint)0x00040000)
+#define SCC_GSMRL_TDCR_32      ((uint)0x00030000)
+#define SCC_GSMRL_TDCR_16      ((uint)0x00020000)
+#define SCC_GSMRL_TDCR_8       ((uint)0x00010000)
+#define SCC_GSMRL_TDCR_1       ((uint)0x00000000)
+#define SCC_GSMRL_RDCR_32      ((uint)0x0000c000)
+#define SCC_GSMRL_RDCR_16      ((uint)0x00008000)
+#define SCC_GSMRL_RDCR_8       ((uint)0x00004000)
+#define SCC_GSMRL_RDCR_1       ((uint)0x00000000)
+#define SCC_GSMRL_RENC_DFMAN   ((uint)0x00003000)
+#define SCC_GSMRL_RENC_MANCH   ((uint)0x00002000)
+#define SCC_GSMRL_RENC_FM0     ((uint)0x00001000)
+#define SCC_GSMRL_RENC_NRZI    ((uint)0x00000800)
+#define SCC_GSMRL_RENC_NRZ     ((uint)0x00000000)
+#define SCC_GSMRL_TENC_DFMAN   ((uint)0x00000600)
+#define SCC_GSMRL_TENC_MANCH   ((uint)0x00000400)
+#define SCC_GSMRL_TENC_FM0     ((uint)0x00000200)
+#define SCC_GSMRL_TENC_NRZI    ((uint)0x00000100)
+#define SCC_GSMRL_TENC_NRZ     ((uint)0x00000000)
+#define SCC_GSMRL_DIAG_LE      ((uint)0x000000c0)      /* Loop and echo */
+#define SCC_GSMRL_DIAG_ECHO    ((uint)0x00000080)
+#define SCC_GSMRL_DIAG_LOOP    ((uint)0x00000040)
+#define SCC_GSMRL_DIAG_NORM    ((uint)0x00000000)
+#define SCC_GSMRL_ENR          ((uint)0x00000020)
+#define SCC_GSMRL_ENT          ((uint)0x00000010)
+#define SCC_GSMRL_MODE_ENET    ((uint)0x0000000c)
+#define SCC_GSMRL_MODE_QMC     ((uint)0x0000000a)
+#define SCC_GSMRL_MODE_DDCMP   ((uint)0x00000009)
+#define SCC_GSMRL_MODE_BISYNC  ((uint)0x00000008)
+#define SCC_GSMRL_MODE_V14     ((uint)0x00000007)
+#define SCC_GSMRL_MODE_AHDLC   ((uint)0x00000006)
+#define SCC_GSMRL_MODE_PROFIBUS        ((uint)0x00000005)
+#define SCC_GSMRL_MODE_UART    ((uint)0x00000004)
+#define SCC_GSMRL_MODE_SS7     ((uint)0x00000003)
+#define SCC_GSMRL_MODE_ATALK   ((uint)0x00000002)
+#define SCC_GSMRL_MODE_HDLC    ((uint)0x00000000)
+
+#define SCC_TODR_TOD           ((ushort)0x8000)
+
+/* SCC Event and Mask register.
+*/
+#define        SCCM_TXE        ((unsigned char)0x10)
+#define        SCCM_BSY        ((unsigned char)0x04)
+#define        SCCM_TX         ((unsigned char)0x02)
+#define        SCCM_RX         ((unsigned char)0x01)
+
+typedef struct scc_param {
+       ushort  scc_rbase;      /* Rx Buffer descriptor base address */
+       ushort  scc_tbase;      /* Tx Buffer descriptor base address */
+       u_char  scc_rfcr;       /* Rx function code */
+       u_char  scc_tfcr;       /* Tx function code */
+       ushort  scc_mrblr;      /* Max receive buffer length */
+       uint    scc_rstate;     /* Internal */
+       uint    scc_idp;        /* Internal */
+       ushort  scc_rbptr;      /* Internal */
+       ushort  scc_ibc;        /* Internal */
+       uint    scc_rxtmp;      /* Internal */
+       uint    scc_tstate;     /* Internal */
+       uint    scc_tdp;        /* Internal */
+       ushort  scc_tbptr;      /* Internal */
+       ushort  scc_tbc;        /* Internal */
+       uint    scc_txtmp;      /* Internal */
+       uint    scc_rcrc;       /* Internal */
+       uint    scc_tcrc;       /* Internal */
+} sccp_t;
+
+/* Function code bits.
+*/
+#define SCC_EB ((u_char)0x10)  /* Set big endian byte order */
+
+/* CPM Ethernet through SCCx.
+ */
+typedef struct scc_enet {
+       sccp_t  sen_genscc;
+       uint    sen_cpres;      /* Preset CRC */
+       uint    sen_cmask;      /* Constant mask for CRC */
+       uint    sen_crcec;      /* CRC Error counter */
+       uint    sen_alec;       /* alignment error counter */
+       uint    sen_disfc;      /* discard frame counter */
+       ushort  sen_pads;       /* Tx short frame pad character */
+       ushort  sen_retlim;     /* Retry limit threshold */
+       ushort  sen_retcnt;     /* Retry limit counter */
+       ushort  sen_maxflr;     /* maximum frame length register */
+       ushort  sen_minflr;     /* minimum frame length register */
+       ushort  sen_maxd1;      /* maximum DMA1 length */
+       ushort  sen_maxd2;      /* maximum DMA2 length */
+       ushort  sen_maxd;       /* Rx max DMA */
+       ushort  sen_dmacnt;     /* Rx DMA counter */
+       ushort  sen_maxb;       /* Max BD byte count */
+       ushort  sen_gaddr1;     /* Group address filter */
+       ushort  sen_gaddr2;
+       ushort  sen_gaddr3;
+       ushort  sen_gaddr4;
+       uint    sen_tbuf0data0; /* Save area 0 - current frame */
+       uint    sen_tbuf0data1; /* Save area 1 - current frame */
+       uint    sen_tbuf0rba;   /* Internal */
+       uint    sen_tbuf0crc;   /* Internal */
+       ushort  sen_tbuf0bcnt;  /* Internal */
+       ushort  sen_paddrh;     /* physical address (MSB) */
+       ushort  sen_paddrm;
+       ushort  sen_paddrl;     /* physical address (LSB) */
+       ushort  sen_pper;       /* persistence */
+       ushort  sen_rfbdptr;    /* Rx first BD pointer */
+       ushort  sen_tfbdptr;    /* Tx first BD pointer */
+       ushort  sen_tlbdptr;    /* Tx last BD pointer */
+       uint    sen_tbuf1data0; /* Save area 0 - current frame */
+       uint    sen_tbuf1data1; /* Save area 1 - current frame */
+       uint    sen_tbuf1rba;   /* Internal */
+       uint    sen_tbuf1crc;   /* Internal */
+       ushort  sen_tbuf1bcnt;  /* Internal */
+       ushort  sen_txlen;      /* Tx Frame length counter */
+       ushort  sen_iaddr1;     /* Individual address filter */
+       ushort  sen_iaddr2;
+       ushort  sen_iaddr3;
+       ushort  sen_iaddr4;
+       ushort  sen_boffcnt;    /* Backoff counter */
+
+       /* NOTE: Some versions of the manual have the following items
+        * incorrectly documented.  Below is the proper order.
+        */
+       ushort  sen_taddrh;     /* temp address (MSB) */
+       ushort  sen_taddrm;
+       ushort  sen_taddrl;     /* temp address (LSB) */
+} scc_enet_t;
+
+/* SCC Event register as used by Ethernet.
+*/
+#define SCCE_ENET_GRA  ((ushort)0x0080)        /* Graceful stop complete */
+#define SCCE_ENET_TXE  ((ushort)0x0010)        /* Transmit Error */
+#define SCCE_ENET_RXF  ((ushort)0x0008)        /* Full frame received */
+#define SCCE_ENET_BSY  ((ushort)0x0004)        /* All incoming buffers full */
+#define SCCE_ENET_TXB  ((ushort)0x0002)        /* A buffer was transmitted */
+#define SCCE_ENET_RXB  ((ushort)0x0001)        /* A buffer was received */
+
+/* SCC Mode Register (PMSR) as used by Ethernet.
+*/
+#define SCC_PSMR_HBC   ((ushort)0x8000)        /* Enable heartbeat */
+#define SCC_PSMR_FC    ((ushort)0x4000)        /* Force collision */
+#define SCC_PSMR_RSH   ((ushort)0x2000)        /* Receive short frames */
+#define SCC_PSMR_IAM   ((ushort)0x1000)        /* Check individual hash */
+#define SCC_PSMR_ENCRC ((ushort)0x0800)        /* Ethernet CRC mode */
+#define SCC_PSMR_PRO   ((ushort)0x0200)        /* Promiscuous mode */
+#define SCC_PSMR_BRO   ((ushort)0x0100)        /* Catch broadcast pkts */
+#define SCC_PSMR_SBT   ((ushort)0x0080)        /* Special backoff timer */
+#define SCC_PSMR_LPB   ((ushort)0x0040)        /* Set Loopback mode */
+#define SCC_PSMR_SIP   ((ushort)0x0020)        /* Sample Input Pins */
+#define SCC_PSMR_LCW   ((ushort)0x0010)        /* Late collision window */
+#define SCC_PSMR_NIB22 ((ushort)0x000a)        /* Start frame search */
+#define SCC_PSMR_FDE   ((ushort)0x0001)        /* Full duplex enable */
+
+/* Buffer descriptor control/status used by Ethernet receive.
+*/
+#define BD_ENET_RX_EMPTY       ((ushort)0x8000)
+#define BD_ENET_RX_WRAP                ((ushort)0x2000)
+#define BD_ENET_RX_INTR                ((ushort)0x1000)
+#define BD_ENET_RX_LAST                ((ushort)0x0800)
+#define BD_ENET_RX_FIRST       ((ushort)0x0400)
+#define BD_ENET_RX_MISS                ((ushort)0x0100)
+#define BD_ENET_RX_LG          ((ushort)0x0020)
+#define BD_ENET_RX_NO          ((ushort)0x0010)
+#define BD_ENET_RX_SH          ((ushort)0x0008)
+#define BD_ENET_RX_CR          ((ushort)0x0004)
+#define BD_ENET_RX_OV          ((ushort)0x0002)
+#define BD_ENET_RX_CL          ((ushort)0x0001)
+#define BD_ENET_RX_BC          ((ushort)0x0080)        /* DA is Broadcast */
+#define BD_ENET_RX_MC          ((ushort)0x0040)        /* DA is Multicast */
+#define BD_ENET_RX_STATS       ((ushort)0x013f)        /* All status bits */
+
+/* Buffer descriptor control/status used by Ethernet transmit.
+*/
+#define BD_ENET_TX_READY       ((ushort)0x8000)
+#define BD_ENET_TX_PAD         ((ushort)0x4000)
+#define BD_ENET_TX_WRAP                ((ushort)0x2000)
+#define BD_ENET_TX_INTR                ((ushort)0x1000)
+#define BD_ENET_TX_LAST                ((ushort)0x0800)
+#define BD_ENET_TX_TC          ((ushort)0x0400)
+#define BD_ENET_TX_DEF         ((ushort)0x0200)
+#define BD_ENET_TX_HB          ((ushort)0x0100)
+#define BD_ENET_TX_LC          ((ushort)0x0080)
+#define BD_ENET_TX_RL          ((ushort)0x0040)
+#define BD_ENET_TX_RCMASK      ((ushort)0x003c)
+#define BD_ENET_TX_UN          ((ushort)0x0002)
+#define BD_ENET_TX_CSL         ((ushort)0x0001)
+#define BD_ENET_TX_STATS       ((ushort)0x03ff)        /* All status bits */
+
+/* SCC as UART
+*/
+typedef struct scc_uart {
+       sccp_t  scc_genscc;
+       char    res1[8];        /* Reserved */
+       ushort  scc_maxidl;     /* Maximum idle chars */
+       ushort  scc_idlc;       /* temp idle counter */
+       ushort  scc_brkcr;      /* Break count register */
+       ushort  scc_parec;      /* receive parity error counter */
+       ushort  scc_frmec;      /* receive framing error counter */
+       ushort  scc_nosec;      /* receive noise counter */
+       ushort  scc_brkec;      /* receive break condition counter */
+       ushort  scc_brkln;      /* last received break length */
+       ushort  scc_uaddr1;     /* UART address character 1 */
+       ushort  scc_uaddr2;     /* UART address character 2 */
+       ushort  scc_rtemp;      /* Temp storage */
+       ushort  scc_toseq;      /* Transmit out of sequence char */
+       ushort  scc_char1;      /* control character 1 */
+       ushort  scc_char2;      /* control character 2 */
+       ushort  scc_char3;      /* control character 3 */
+       ushort  scc_char4;      /* control character 4 */
+       ushort  scc_char5;      /* control character 5 */
+       ushort  scc_char6;      /* control character 6 */
+       ushort  scc_char7;      /* control character 7 */
+       ushort  scc_char8;      /* control character 8 */
+       ushort  scc_rccm;       /* receive control character mask */
+       ushort  scc_rccr;       /* receive control character register */
+       ushort  scc_rlbc;       /* receive last break character */
+} scc_uart_t;
+
+/* SCC Event and Mask registers when it is used as a UART.
+*/
+#define UART_SCCM_GLR          ((ushort)0x1000)
+#define UART_SCCM_GLT          ((ushort)0x0800)
+#define UART_SCCM_AB           ((ushort)0x0200)
+#define UART_SCCM_IDL          ((ushort)0x0100)
+#define UART_SCCM_GRA          ((ushort)0x0080)
+#define UART_SCCM_BRKE         ((ushort)0x0040)
+#define UART_SCCM_BRKS         ((ushort)0x0020)
+#define UART_SCCM_CCR          ((ushort)0x0008)
+#define UART_SCCM_BSY          ((ushort)0x0004)
+#define UART_SCCM_TX           ((ushort)0x0002)
+#define UART_SCCM_RX           ((ushort)0x0001)
+
+/* The SCC PMSR when used as a UART.
+*/
+#define SCU_PSMR_FLC           ((ushort)0x8000)
+#define SCU_PSMR_SL            ((ushort)0x4000)
+#define SCU_PSMR_CL            ((ushort)0x3000)
+#define SCU_PSMR_UM            ((ushort)0x0c00)
+#define SCU_PSMR_FRZ           ((ushort)0x0200)
+#define SCU_PSMR_RZS           ((ushort)0x0100)
+#define SCU_PSMR_SYN           ((ushort)0x0080)
+#define SCU_PSMR_DRT           ((ushort)0x0040)
+#define SCU_PSMR_PEN           ((ushort)0x0010)
+#define SCU_PSMR_RPM           ((ushort)0x000c)
+#define SCU_PSMR_REVP          ((ushort)0x0008)
+#define SCU_PSMR_TPM           ((ushort)0x0003)
+#define SCU_PSMR_TEVP          ((ushort)0x0002)
+
+/* CPM Transparent mode SCC.
+ */
+typedef struct scc_trans {
+       sccp_t  st_genscc;
+       uint    st_cpres;       /* Preset CRC */
+       uint    st_cmask;       /* Constant mask for CRC */
+} scc_trans_t;
+
+#define BD_SCC_TX_LAST         ((ushort)0x0800)
+
+/* IIC parameter RAM.
+*/
+typedef struct iic {
+       ushort  iic_rbase;      /* Rx Buffer descriptor base address */
+       ushort  iic_tbase;      /* Tx Buffer descriptor base address */
+       u_char  iic_rfcr;       /* Rx function code */
+       u_char  iic_tfcr;       /* Tx function code */
+       ushort  iic_mrblr;      /* Max receive buffer length */
+       uint    iic_rstate;     /* Internal */
+       uint    iic_rdp;        /* Internal */
+       ushort  iic_rbptr;      /* Internal */
+       ushort  iic_rbc;        /* Internal */
+       uint    iic_rxtmp;      /* Internal */
+       uint    iic_tstate;     /* Internal */
+       uint    iic_tdp;        /* Internal */
+       ushort  iic_tbptr;      /* Internal */
+       ushort  iic_tbc;        /* Internal */
+       uint    iic_txtmp;      /* Internal */
+       char    res1[4];        /* Reserved */
+       ushort  iic_rpbase;     /* Relocation pointer */
+       char    res2[2];        /* Reserved */
+} iic_t;
+
+#define BD_IIC_START           ((ushort)0x0400)
+
+/* SPI parameter RAM.
+*/
+typedef struct spi {
+       ushort  spi_rbase;      /* Rx Buffer descriptor base address */
+       ushort  spi_tbase;      /* Tx Buffer descriptor base address */
+       u_char  spi_rfcr;       /* Rx function code */
+       u_char  spi_tfcr;       /* Tx function code */
+       ushort  spi_mrblr;      /* Max receive buffer length */
+       uint    spi_rstate;     /* Internal */
+       uint    spi_rdp;        /* Internal */
+       ushort  spi_rbptr;      /* Internal */
+       ushort  spi_rbc;        /* Internal */
+       uint    spi_rxtmp;      /* Internal */
+       uint    spi_tstate;     /* Internal */
+       uint    spi_tdp;        /* Internal */
+       ushort  spi_tbptr;      /* Internal */
+       ushort  spi_tbc;        /* Internal */
+       uint    spi_txtmp;      /* Internal */
+       uint    spi_res;
+       ushort  spi_rpbase;     /* Relocation pointer */
+       ushort  spi_res2;
+} spi_t;
+
+/* SPI Mode register.
+*/
+#define SPMODE_LOOP    ((ushort)0x4000)        /* Loopback */
+#define SPMODE_CI      ((ushort)0x2000)        /* Clock Invert */
+#define SPMODE_CP      ((ushort)0x1000)        /* Clock Phase */
+#define SPMODE_DIV16   ((ushort)0x0800)        /* BRG/16 mode */
+#define SPMODE_REV     ((ushort)0x0400)        /* Reversed Data */
+#define SPMODE_MSTR    ((ushort)0x0200)        /* SPI Master */
+#define SPMODE_EN      ((ushort)0x0100)        /* Enable */
+#define SPMODE_LENMSK  ((ushort)0x00f0)        /* character length */
+#define SPMODE_LEN4    ((ushort)0x0030)        /*  4 bits per char */
+#define SPMODE_LEN8    ((ushort)0x0070)        /*  8 bits per char */
+#define SPMODE_LEN16   ((ushort)0x00f0)        /* 16 bits per char */
+#define SPMODE_PMMSK   ((ushort)0x000f)        /* prescale modulus */
+
+/* SPIE fields */
+#define SPIE_MME       0x20
+#define SPIE_TXE       0x10
+#define SPIE_BSY       0x04
+#define SPIE_TXB       0x02
+#define SPIE_RXB       0x01
+
+/*
+ * RISC Controller Configuration Register definitons
+ */
+#define RCCR_TIME      0x8000                  /* RISC Timer Enable */
+#define RCCR_TIMEP(t)  (((t) & 0x3F)<<8)       /* RISC Timer Period */
+#define RCCR_TIME_MASK 0x00FF                  /* not RISC Timer related bits */
+
+/* RISC Timer Parameter RAM offset */
+#define PROFF_RTMR     ((uint)0x01B0)
+
+typedef struct risc_timer_pram {
+       unsigned short  tm_base;        /* RISC Timer Table Base Address */
+       unsigned short  tm_ptr;         /* RISC Timer Table Pointer (internal) */
+       unsigned short  r_tmr;          /* RISC Timer Mode Register */
+       unsigned short  r_tmv;          /* RISC Timer Valid Register */
+       unsigned long   tm_cmd;         /* RISC Timer Command Register */
+       unsigned long   tm_cnt;         /* RISC Timer Internal Count */
+} rt_pram_t;
+
+/* Bits in RISC Timer Command Register */
+#define TM_CMD_VALID   0x80000000      /* Valid - Enables the timer */
+#define TM_CMD_RESTART 0x40000000      /* Restart - for automatic restart */
+#define TM_CMD_PWM     0x20000000      /* Run in Pulse Width Modulation Mode */
+#define TM_CMD_NUM(n)  (((n)&0xF)<<16) /* Timer Number */
+#define TM_CMD_PERIOD(p) ((p)&0xFFFF)  /* Timer Period */
+
+/* CPM interrupts.  There are nearly 32 interrupts generated by CPM
+ * channels or devices.  All of these are presented to the PPC core
+ * as a single interrupt.  The CPM interrupt handler dispatches its
+ * own handlers, in a similar fashion to the PPC core handler.  We
+ * use the table as defined in the manuals (i.e. no special high
+ * priority and SCC1 == SCCa, etc...).
+ */
+#define CPMVEC_NR              32
+#define        CPMVEC_PIO_PC15         ((ushort)0x1f)
+#define        CPMVEC_SCC1             ((ushort)0x1e)
+#define        CPMVEC_SCC2             ((ushort)0x1d)
+#define        CPMVEC_SCC3             ((ushort)0x1c)
+#define        CPMVEC_SCC4             ((ushort)0x1b)
+#define        CPMVEC_PIO_PC14         ((ushort)0x1a)
+#define        CPMVEC_TIMER1           ((ushort)0x19)
+#define        CPMVEC_PIO_PC13         ((ushort)0x18)
+#define        CPMVEC_PIO_PC12         ((ushort)0x17)
+#define        CPMVEC_SDMA_CB_ERR      ((ushort)0x16)
+#define CPMVEC_IDMA1           ((ushort)0x15)
+#define CPMVEC_IDMA2           ((ushort)0x14)
+#define CPMVEC_TIMER2          ((ushort)0x12)
+#define CPMVEC_RISCTIMER       ((ushort)0x11)
+#define CPMVEC_I2C             ((ushort)0x10)
+#define        CPMVEC_PIO_PC11         ((ushort)0x0f)
+#define        CPMVEC_PIO_PC10         ((ushort)0x0e)
+#define CPMVEC_TIMER3          ((ushort)0x0c)
+#define        CPMVEC_PIO_PC9          ((ushort)0x0b)
+#define        CPMVEC_PIO_PC8          ((ushort)0x0a)
+#define        CPMVEC_PIO_PC7          ((ushort)0x09)
+#define CPMVEC_TIMER4          ((ushort)0x07)
+#define        CPMVEC_PIO_PC6          ((ushort)0x06)
+#define        CPMVEC_SPI              ((ushort)0x05)
+#define        CPMVEC_SMC1             ((ushort)0x04)
+#define        CPMVEC_SMC2             ((ushort)0x03)
+#define        CPMVEC_PIO_PC5          ((ushort)0x02)
+#define        CPMVEC_PIO_PC4          ((ushort)0x01)
+#define        CPMVEC_ERROR            ((ushort)0x00)
+
+/* CPM interrupt configuration vector.
+*/
+#define        CICR_SCD_SCC4           ((uint)0x00c00000)      /* SCC4 @ SCCd */
+#define        CICR_SCC_SCC3           ((uint)0x00200000)      /* SCC3 @ SCCc */
+#define        CICR_SCB_SCC2           ((uint)0x00040000)      /* SCC2 @ SCCb */
+#define        CICR_SCA_SCC1           ((uint)0x00000000)      /* SCC1 @ SCCa */
+#define CICR_IRL_MASK          ((uint)0x0000e000)      /* Core interrrupt */
+#define CICR_HP_MASK           ((uint)0x00001f00)      /* Hi-pri int. */
+#define CICR_IEN               ((uint)0x00000080)      /* Int. enable */
+#define CICR_SPS               ((uint)0x00000001)      /* SCC Spread */
+
+extern void cpm_install_handler(int vec, void (*handler)(void *), void *dev_id);
+extern void cpm_free_handler(int vec);
+
+#define IMAP_ADDR              (get_immrbase())
+
+#define CPM_PIN_INPUT     0
+#define CPM_PIN_OUTPUT    1
+#define CPM_PIN_PRIMARY   0
+#define CPM_PIN_SECONDARY 2
+#define CPM_PIN_GPIO      4
+#define CPM_PIN_OPENDRAIN 8
+
+enum cpm_port {
+       CPM_PORTA,
+       CPM_PORTB,
+       CPM_PORTC,
+       CPM_PORTD,
+       CPM_PORTE,
+};
+
+void cpm1_set_pin(enum cpm_port port, int pin, int flags);
+
+enum cpm_clk_dir {
+       CPM_CLK_RX,
+       CPM_CLK_TX,
+       CPM_CLK_RTX
+};
+
+enum cpm_clk_target {
+       CPM_CLK_SCC1,
+       CPM_CLK_SCC2,
+       CPM_CLK_SCC3,
+       CPM_CLK_SCC4,
+       CPM_CLK_SMC1,
+       CPM_CLK_SMC2,
+};
+
+enum cpm_clk {
+       CPM_BRG1,       /* Baud Rate Generator  1 */
+       CPM_BRG2,       /* Baud Rate Generator  2 */
+       CPM_BRG3,       /* Baud Rate Generator  3 */
+       CPM_BRG4,       /* Baud Rate Generator  4 */
+       CPM_CLK1,       /* Clock  1 */
+       CPM_CLK2,       /* Clock  2 */
+       CPM_CLK3,       /* Clock  3 */
+       CPM_CLK4,       /* Clock  4 */
+       CPM_CLK5,       /* Clock  5 */
+       CPM_CLK6,       /* Clock  6 */
+       CPM_CLK7,       /* Clock  7 */
+       CPM_CLK8,       /* Clock  8 */
+};
+
+int cpm1_clk_setup(enum cpm_clk_target target, int clock, int mode);
+
+#endif /* __CPM_8XX__ */
diff --git a/include/asm-powerpc/cpm.h b/include/asm-powerpc/cpm.h
new file mode 100644 (file)
index 0000000..48df9f3
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __CPM_H
+#define __CPM_H
+
+#include <linux/compiler.h>
+#include <linux/types.h>
+
+int cpm_muram_init(void);
+unsigned long cpm_muram_alloc(unsigned long size, unsigned long align);
+int cpm_muram_free(unsigned long offset);
+unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
+void __iomem *cpm_muram_addr(unsigned long offset);
+dma_addr_t cpm_muram_dma(void __iomem *addr);
+
+#endif
diff --git a/include/asm-powerpc/cpm2.h b/include/asm-powerpc/cpm2.h
new file mode 100644 (file)
index 0000000..f1112c1
--- /dev/null
@@ -0,0 +1,1274 @@
+/*
+ * Communication Processor Module v2.
+ *
+ * This file contains structures and information for the communication
+ * processor channels found in the dual port RAM or parameter RAM.
+ * All CPM control and status is available through the CPM2 internal
+ * memory map.  See immap_cpm2.h for details.
+ */
+#ifdef __KERNEL__
+#ifndef __CPM2__
+#define __CPM2__
+
+#include <asm/immap_cpm2.h>
+#include <asm/cpm.h>
+
+#ifdef CONFIG_PPC_85xx
+#define CPM_MAP_ADDR (get_immrbase() + 0x80000)
+#endif
+
+/* CPM Command register.
+*/
+#define CPM_CR_RST     ((uint)0x80000000)
+#define CPM_CR_PAGE    ((uint)0x7c000000)
+#define CPM_CR_SBLOCK  ((uint)0x03e00000)
+#define CPM_CR_FLG     ((uint)0x00010000)
+#define CPM_CR_MCN     ((uint)0x00003fc0)
+#define CPM_CR_OPCODE  ((uint)0x0000000f)
+
+/* Device sub-block and page codes.
+*/
+#define CPM_CR_SCC1_SBLOCK     (0x04)
+#define CPM_CR_SCC2_SBLOCK     (0x05)
+#define CPM_CR_SCC3_SBLOCK     (0x06)
+#define CPM_CR_SCC4_SBLOCK     (0x07)
+#define CPM_CR_SMC1_SBLOCK     (0x08)
+#define CPM_CR_SMC2_SBLOCK     (0x09)
+#define CPM_CR_SPI_SBLOCK      (0x0a)
+#define CPM_CR_I2C_SBLOCK      (0x0b)
+#define CPM_CR_TIMER_SBLOCK    (0x0f)
+#define CPM_CR_RAND_SBLOCK     (0x0e)
+#define CPM_CR_FCC1_SBLOCK     (0x10)
+#define CPM_CR_FCC2_SBLOCK     (0x11)
+#define CPM_CR_FCC3_SBLOCK     (0x12)
+#define CPM_CR_IDMA1_SBLOCK    (0x14)
+#define CPM_CR_IDMA2_SBLOCK    (0x15)
+#define CPM_CR_IDMA3_SBLOCK    (0x16)
+#define CPM_CR_IDMA4_SBLOCK    (0x17)
+#define CPM_CR_MCC1_SBLOCK     (0x1c)
+
+#define CPM_CR_FCC_SBLOCK(x)   (x + 0x10)
+
+#define CPM_CR_SCC1_PAGE       (0x00)
+#define CPM_CR_SCC2_PAGE       (0x01)
+#define CPM_CR_SCC3_PAGE       (0x02)
+#define CPM_CR_SCC4_PAGE       (0x03)
+#define CPM_CR_SMC1_PAGE       (0x07)
+#define CPM_CR_SMC2_PAGE       (0x08)
+#define CPM_CR_SPI_PAGE                (0x09)
+#define CPM_CR_I2C_PAGE                (0x0a)
+#define CPM_CR_TIMER_PAGE      (0x0a)
+#define CPM_CR_RAND_PAGE       (0x0a)
+#define CPM_CR_FCC1_PAGE       (0x04)
+#define CPM_CR_FCC2_PAGE       (0x05)
+#define CPM_CR_FCC3_PAGE       (0x06)
+#define CPM_CR_IDMA1_PAGE      (0x07)
+#define CPM_CR_IDMA2_PAGE      (0x08)
+#define CPM_CR_IDMA3_PAGE      (0x09)
+#define CPM_CR_IDMA4_PAGE      (0x0a)
+#define CPM_CR_MCC1_PAGE       (0x07)
+#define CPM_CR_MCC2_PAGE       (0x08)
+
+#define CPM_CR_FCC_PAGE(x)     (x + 0x04)
+
+/* Some opcodes (there are more...later)
+*/
+#define CPM_CR_INIT_TRX                ((ushort)0x0000)
+#define CPM_CR_INIT_RX         ((ushort)0x0001)
+#define CPM_CR_INIT_TX         ((ushort)0x0002)
+#define CPM_CR_HUNT_MODE       ((ushort)0x0003)
+#define CPM_CR_STOP_TX         ((ushort)0x0004)
+#define CPM_CR_GRA_STOP_TX     ((ushort)0x0005)
+#define CPM_CR_RESTART_TX      ((ushort)0x0006)
+#define CPM_CR_SET_GADDR       ((ushort)0x0008)
+#define CPM_CR_START_IDMA      ((ushort)0x0009)
+#define CPM_CR_STOP_IDMA       ((ushort)0x000b)
+
+#define mk_cr_cmd(PG, SBC, MCN, OP) \
+       ((PG << 26) | (SBC << 21) | (MCN << 6) | OP)
+
+#ifndef CONFIG_PPC_CPM_NEW_BINDING
+/* Dual Port RAM addresses.  The first 16K is available for almost
+ * any CPM use, so we put the BDs there.  The first 128 bytes are
+ * used for SMC1 and SMC2 parameter RAM, so we start allocating
+ * BDs above that.  All of this must change when we start
+ * downloading RAM microcode.
+ */
+#define CPM_DATAONLY_BASE      ((uint)128)
+#define CPM_DP_NOSPACE         ((uint)0x7fffffff)
+#if defined(CONFIG_8272) || defined(CONFIG_MPC8555)
+#define CPM_DATAONLY_SIZE      ((uint)(8 * 1024) - CPM_DATAONLY_BASE)
+#define CPM_FCC_SPECIAL_BASE   ((uint)0x00009000)
+#else
+#define CPM_DATAONLY_SIZE      ((uint)(16 * 1024) - CPM_DATAONLY_BASE)
+#define CPM_FCC_SPECIAL_BASE   ((uint)0x0000b000)
+#endif
+#endif
+
+/* The number of pages of host memory we allocate for CPM.  This is
+ * done early in kernel initialization to get physically contiguous
+ * pages.
+ */
+#define NUM_CPM_HOST_PAGES     2
+
+/* Export the base address of the communication processor registers
+ * and dual port ram.
+ */
+extern cpm_cpm2_t __iomem *cpmp; /* Pointer to comm processor */
+
+#ifdef CONFIG_PPC_CPM_NEW_BINDING
+#define cpm_dpalloc cpm_muram_alloc
+#define cpm_dpfree cpm_muram_free
+#define cpm_dpram_addr cpm_muram_addr
+#else
+extern unsigned long cpm_dpalloc(uint size, uint align);
+extern int cpm_dpfree(unsigned long offset);
+extern unsigned long cpm_dpalloc_fixed(unsigned long offset, uint size, uint align);
+extern void cpm_dpdump(void);
+extern void *cpm_dpram_addr(unsigned long offset);
+#endif
+
+extern void cpm_setbrg(uint brg, uint rate);
+extern void cpm2_fastbrg(uint brg, uint rate, int div16);
+extern void cpm2_reset(void);
+
+
+/* Buffer descriptors used by many of the CPM protocols.
+*/
+typedef struct cpm_buf_desc {
+       ushort  cbd_sc;         /* Status and Control */
+       ushort  cbd_datlen;     /* Data length in buffer */
+       uint    cbd_bufaddr;    /* Buffer address in host memory */
+} cbd_t;
+
+#define BD_SC_EMPTY    ((ushort)0x8000)        /* Receive is empty */
+#define BD_SC_READY    ((ushort)0x8000)        /* Transmit is ready */
+#define BD_SC_WRAP     ((ushort)0x2000)        /* Last buffer descriptor */
+#define BD_SC_INTRPT   ((ushort)0x1000)        /* Interrupt on change */
+#define BD_SC_LAST     ((ushort)0x0800)        /* Last buffer in frame */
+#define BD_SC_CM       ((ushort)0x0200)        /* Continous mode */
+#define BD_SC_ID       ((ushort)0x0100)        /* Rec'd too many idles */
+#define BD_SC_P                ((ushort)0x0100)        /* xmt preamble */
+#define BD_SC_BR       ((ushort)0x0020)        /* Break received */
+#define BD_SC_FR       ((ushort)0x0010)        /* Framing error */
+#define BD_SC_PR       ((ushort)0x0008)        /* Parity error */
+#define BD_SC_OV       ((ushort)0x0002)        /* Overrun */
+#define BD_SC_CD       ((ushort)0x0001)        /* ?? */
+
+/* Function code bits, usually generic to devices.
+*/
+#define CPMFCR_GBL     ((u_char)0x20)  /* Set memory snooping */
+#define CPMFCR_EB      ((u_char)0x10)  /* Set big endian byte order */
+#define CPMFCR_TC2     ((u_char)0x04)  /* Transfer code 2 value */
+#define CPMFCR_DTB     ((u_char)0x02)  /* Use local bus for data when set */
+#define CPMFCR_BDB     ((u_char)0x01)  /* Use local bus for BD when set */
+
+/* Parameter RAM offsets from the base.
+*/
+#define PROFF_SCC1             ((uint)0x8000)
+#define PROFF_SCC2             ((uint)0x8100)
+#define PROFF_SCC3             ((uint)0x8200)
+#define PROFF_SCC4             ((uint)0x8300)
+#define PROFF_FCC1             ((uint)0x8400)
+#define PROFF_FCC2             ((uint)0x8500)
+#define PROFF_FCC3             ((uint)0x8600)
+#define PROFF_MCC1             ((uint)0x8700)
+#define PROFF_SMC1_BASE                ((uint)0x87fc)
+#define PROFF_IDMA1_BASE       ((uint)0x87fe)
+#define PROFF_MCC2             ((uint)0x8800)
+#define PROFF_SMC2_BASE                ((uint)0x88fc)
+#define PROFF_IDMA2_BASE       ((uint)0x88fe)
+#define PROFF_SPI_BASE         ((uint)0x89fc)
+#define PROFF_IDMA3_BASE       ((uint)0x89fe)
+#define PROFF_TIMERS           ((uint)0x8ae0)
+#define PROFF_REVNUM           ((uint)0x8af0)
+#define PROFF_RAND             ((uint)0x8af8)
+#define PROFF_I2C_BASE         ((uint)0x8afc)
+#define PROFF_IDMA4_BASE       ((uint)0x8afe)
+
+#define PROFF_SCC_SIZE         ((uint)0x100)
+#define PROFF_FCC_SIZE         ((uint)0x100)
+#define PROFF_SMC_SIZE         ((uint)64)
+
+/* The SMCs are relocated to any of the first eight DPRAM pages.
+ * We will fix these at the first locations of DPRAM, until we
+ * get some microcode patches :-).
+ * The parameter ram space for the SMCs is fifty-some bytes, and
+ * they are required to start on a 64 byte boundary.
+ */
+#define PROFF_SMC1     (0)
+#define PROFF_SMC2     (64)
+
+
+/* Define enough so I can at least use the serial port as a UART.
+ */
+typedef struct smc_uart {
+       ushort  smc_rbase;      /* Rx Buffer descriptor base address */
+       ushort  smc_tbase;      /* Tx Buffer descriptor base address */
+       u_char  smc_rfcr;       /* Rx function code */
+       u_char  smc_tfcr;       /* Tx function code */
+       ushort  smc_mrblr;      /* Max receive buffer length */
+       uint    smc_rstate;     /* Internal */
+       uint    smc_idp;        /* Internal */
+       ushort  smc_rbptr;      /* Internal */
+       ushort  smc_ibc;        /* Internal */
+       uint    smc_rxtmp;      /* Internal */
+       uint    smc_tstate;     /* Internal */
+       uint    smc_tdp;        /* Internal */
+       ushort  smc_tbptr;      /* Internal */
+       ushort  smc_tbc;        /* Internal */
+       uint    smc_txtmp;      /* Internal */
+       ushort  smc_maxidl;     /* Maximum idle characters */
+       ushort  smc_tmpidl;     /* Temporary idle counter */
+       ushort  smc_brklen;     /* Last received break length */
+       ushort  smc_brkec;      /* rcv'd break condition counter */
+       ushort  smc_brkcr;      /* xmt break count register */
+       ushort  smc_rmask;      /* Temporary bit mask */
+       uint    smc_stmp;       /* SDMA Temp */
+} smc_uart_t;
+
+/* SMC uart mode register (Internal memory map).
+*/
+#define SMCMR_REN      ((ushort)0x0001)
+#define SMCMR_TEN      ((ushort)0x0002)
+#define SMCMR_DM       ((ushort)0x000c)
+#define SMCMR_SM_GCI   ((ushort)0x0000)
+#define SMCMR_SM_UART  ((ushort)0x0020)
+#define SMCMR_SM_TRANS ((ushort)0x0030)
+#define SMCMR_SM_MASK  ((ushort)0x0030)
+#define SMCMR_PM_EVEN  ((ushort)0x0100)        /* Even parity, else odd */
+#define SMCMR_REVD     SMCMR_PM_EVEN
+#define SMCMR_PEN      ((ushort)0x0200)        /* Parity enable */
+#define SMCMR_BS       SMCMR_PEN
+#define SMCMR_SL       ((ushort)0x0400)        /* Two stops, else one */
+#define SMCR_CLEN_MASK ((ushort)0x7800)        /* Character length */
+#define smcr_mk_clen(C)        (((C) << 11) & SMCR_CLEN_MASK)
+
+/* SMC Event and Mask register.
+*/
+#define SMCM_BRKE       ((unsigned char)0x40)   /* When in UART Mode */
+#define SMCM_BRK        ((unsigned char)0x10)   /* When in UART Mode */
+#define SMCM_TXE       ((unsigned char)0x10)
+#define SMCM_BSY       ((unsigned char)0x04)
+#define SMCM_TX                ((unsigned char)0x02)
+#define SMCM_RX                ((unsigned char)0x01)
+
+/* Baud rate generators.
+*/
+#define CPM_BRG_RST            ((uint)0x00020000)
+#define CPM_BRG_EN             ((uint)0x00010000)
+#define CPM_BRG_EXTC_INT       ((uint)0x00000000)
+#define CPM_BRG_EXTC_CLK3_9    ((uint)0x00004000)
+#define CPM_BRG_EXTC_CLK5_15   ((uint)0x00008000)
+#define CPM_BRG_ATB            ((uint)0x00002000)
+#define CPM_BRG_CD_MASK                ((uint)0x00001ffe)
+#define CPM_BRG_DIV16          ((uint)0x00000001)
+
+/* SCCs.
+*/
+#define SCC_GSMRH_IRP          ((uint)0x00040000)
+#define SCC_GSMRH_GDE          ((uint)0x00010000)
+#define SCC_GSMRH_TCRC_CCITT   ((uint)0x00008000)
+#define SCC_GSMRH_TCRC_BISYNC  ((uint)0x00004000)
+#define SCC_GSMRH_TCRC_HDLC    ((uint)0x00000000)
+#define SCC_GSMRH_REVD         ((uint)0x00002000)
+#define SCC_GSMRH_TRX          ((uint)0x00001000)
+#define SCC_GSMRH_TTX          ((uint)0x00000800)
+#define SCC_GSMRH_CDP          ((uint)0x00000400)
+#define SCC_GSMRH_CTSP         ((uint)0x00000200)
+#define SCC_GSMRH_CDS          ((uint)0x00000100)
+#define SCC_GSMRH_CTSS         ((uint)0x00000080)
+#define SCC_GSMRH_TFL          ((uint)0x00000040)
+#define SCC_GSMRH_RFW          ((uint)0x00000020)
+#define SCC_GSMRH_TXSY         ((uint)0x00000010)
+#define SCC_GSMRH_SYNL16       ((uint)0x0000000c)
+#define SCC_GSMRH_SYNL8                ((uint)0x00000008)
+#define SCC_GSMRH_SYNL4                ((uint)0x00000004)
+#define SCC_GSMRH_RTSM         ((uint)0x00000002)
+#define SCC_GSMRH_RSYN         ((uint)0x00000001)
+
+#define SCC_GSMRL_SIR          ((uint)0x80000000)      /* SCC2 only */
+#define SCC_GSMRL_EDGE_NONE    ((uint)0x60000000)
+#define SCC_GSMRL_EDGE_NEG     ((uint)0x40000000)
+#define SCC_GSMRL_EDGE_POS     ((uint)0x20000000)
+#define SCC_GSMRL_EDGE_BOTH    ((uint)0x00000000)
+#define SCC_GSMRL_TCI          ((uint)0x10000000)
+#define SCC_GSMRL_TSNC_3       ((uint)0x0c000000)
+#define SCC_GSMRL_TSNC_4       ((uint)0x08000000)
+#define SCC_GSMRL_TSNC_14      ((uint)0x04000000)
+#define SCC_GSMRL_TSNC_INF     ((uint)0x00000000)
+#define SCC_GSMRL_RINV         ((uint)0x02000000)
+#define SCC_GSMRL_TINV         ((uint)0x01000000)
+#define SCC_GSMRL_TPL_128      ((uint)0x00c00000)
+#define SCC_GSMRL_TPL_64       ((uint)0x00a00000)
+#define SCC_GSMRL_TPL_48       ((uint)0x00800000)
+#define SCC_GSMRL_TPL_32       ((uint)0x00600000)
+#define SCC_GSMRL_TPL_16       ((uint)0x00400000)
+#define SCC_GSMRL_TPL_8                ((uint)0x00200000)
+#define SCC_GSMRL_TPL_NONE     ((uint)0x00000000)
+#define SCC_GSMRL_TPP_ALL1     ((uint)0x00180000)
+#define SCC_GSMRL_TPP_01       ((uint)0x00100000)
+#define SCC_GSMRL_TPP_10       ((uint)0x00080000)
+#define SCC_GSMRL_TPP_ZEROS    ((uint)0x00000000)
+#define SCC_GSMRL_TEND         ((uint)0x00040000)
+#define SCC_GSMRL_TDCR_32      ((uint)0x00030000)
+#define SCC_GSMRL_TDCR_16      ((uint)0x00020000)
+#define SCC_GSMRL_TDCR_8       ((uint)0x00010000)
+#define SCC_GSMRL_TDCR_1       ((uint)0x00000000)
+#define SCC_GSMRL_RDCR_32      ((uint)0x0000c000)
+#define SCC_GSMRL_RDCR_16      ((uint)0x00008000)
+#define SCC_GSMRL_RDCR_8       ((uint)0x00004000)
+#define SCC_GSMRL_RDCR_1       ((uint)0x00000000)
+#define SCC_GSMRL_RENC_DFMAN   ((uint)0x00003000)
+#define SCC_GSMRL_RENC_MANCH   ((uint)0x00002000)
+#define SCC_GSMRL_RENC_FM0     ((uint)0x00001000)
+#define SCC_GSMRL_RENC_NRZI    ((uint)0x00000800)
+#define SCC_GSMRL_RENC_NRZ     ((uint)0x00000000)
+#define SCC_GSMRL_TENC_DFMAN   ((uint)0x00000600)
+#define SCC_GSMRL_TENC_MANCH   ((uint)0x00000400)
+#define SCC_GSMRL_TENC_FM0     ((uint)0x00000200)
+#define SCC_GSMRL_TENC_NRZI    ((uint)0x00000100)
+#define SCC_GSMRL_TENC_NRZ     ((uint)0x00000000)
+#define SCC_GSMRL_DIAG_LE      ((uint)0x000000c0)      /* Loop and echo */
+#define SCC_GSMRL_DIAG_ECHO    ((uint)0x00000080)
+#define SCC_GSMRL_DIAG_LOOP    ((uint)0x00000040)
+#define SCC_GSMRL_DIAG_NORM    ((uint)0x00000000)
+#define SCC_GSMRL_ENR          ((uint)0x00000020)
+#define SCC_GSMRL_ENT          ((uint)0x00000010)
+#define SCC_GSMRL_MODE_ENET    ((uint)0x0000000c)
+#define SCC_GSMRL_MODE_DDCMP   ((uint)0x00000009)
+#define SCC_GSMRL_MODE_BISYNC  ((uint)0x00000008)
+#define SCC_GSMRL_MODE_V14     ((uint)0x00000007)
+#define SCC_GSMRL_MODE_AHDLC   ((uint)0x00000006)
+#define SCC_GSMRL_MODE_PROFIBUS        ((uint)0x00000005)
+#define SCC_GSMRL_MODE_UART    ((uint)0x00000004)
+#define SCC_GSMRL_MODE_SS7     ((uint)0x00000003)
+#define SCC_GSMRL_MODE_ATALK   ((uint)0x00000002)
+#define SCC_GSMRL_MODE_HDLC    ((uint)0x00000000)
+
+#define SCC_TODR_TOD           ((ushort)0x8000)
+
+/* SCC Event and Mask register.
+*/
+#define SCCM_TXE       ((unsigned char)0x10)
+#define SCCM_BSY       ((unsigned char)0x04)
+#define SCCM_TX                ((unsigned char)0x02)
+#define SCCM_RX                ((unsigned char)0x01)
+
+typedef struct scc_param {
+       ushort  scc_rbase;      /* Rx Buffer descriptor base address */
+       ushort  scc_tbase;      /* Tx Buffer descriptor base address */
+       u_char  scc_rfcr;       /* Rx function code */
+       u_char  scc_tfcr;       /* Tx function code */
+       ushort  scc_mrblr;      /* Max receive buffer length */
+       uint    scc_rstate;     /* Internal */
+       uint    scc_idp;        /* Internal */
+       ushort  scc_rbptr;      /* Internal */
+       ushort  scc_ibc;        /* Internal */
+       uint    scc_rxtmp;      /* Internal */
+       uint    scc_tstate;     /* Internal */
+       uint    scc_tdp;        /* Internal */
+       ushort  scc_tbptr;      /* Internal */
+       ushort  scc_tbc;        /* Internal */
+       uint    scc_txtmp;      /* Internal */
+       uint    scc_rcrc;       /* Internal */
+       uint    scc_tcrc;       /* Internal */
+} sccp_t;
+
+/* CPM Ethernet through SCC1.
+ */
+typedef struct scc_enet {
+       sccp_t  sen_genscc;
+       uint    sen_cpres;      /* Preset CRC */
+       uint    sen_cmask;      /* Constant mask for CRC */
+       uint    sen_crcec;      /* CRC Error counter */
+       uint    sen_alec;       /* alignment error counter */
+       uint    sen_disfc;      /* discard frame counter */
+       ushort  sen_pads;       /* Tx short frame pad character */
+       ushort  sen_retlim;     /* Retry limit threshold */
+       ushort  sen_retcnt;     /* Retry limit counter */
+       ushort  sen_maxflr;     /* maximum frame length register */
+       ushort  sen_minflr;     /* minimum frame length register */
+       ushort  sen_maxd1;      /* maximum DMA1 length */
+       ushort  sen_maxd2;      /* maximum DMA2 length */
+       ushort  sen_maxd;       /* Rx max DMA */
+       ushort  sen_dmacnt;     /* Rx DMA counter */
+       ushort  sen_maxb;       /* Max BD byte count */
+       ushort  sen_gaddr1;     /* Group address filter */
+       ushort  sen_gaddr2;
+       ushort  sen_gaddr3;
+       ushort  sen_gaddr4;
+       uint    sen_tbuf0data0; /* Save area 0 - current frame */
+       uint    sen_tbuf0data1; /* Save area 1 - current frame */
+       uint    sen_tbuf0rba;   /* Internal */
+       uint    sen_tbuf0crc;   /* Internal */
+       ushort  sen_tbuf0bcnt;  /* Internal */
+       ushort  sen_paddrh;     /* physical address (MSB) */
+       ushort  sen_paddrm;
+       ushort  sen_paddrl;     /* physical address (LSB) */
+       ushort  sen_pper;       /* persistence */
+       ushort  sen_rfbdptr;    /* Rx first BD pointer */
+       ushort  sen_tfbdptr;    /* Tx first BD pointer */
+       ushort  sen_tlbdptr;    /* Tx last BD pointer */
+       uint    sen_tbuf1data0; /* Save area 0 - current frame */
+       uint    sen_tbuf1data1; /* Save area 1 - current frame */
+       uint    sen_tbuf1rba;   /* Internal */
+       uint    sen_tbuf1crc;   /* Internal */
+       ushort  sen_tbuf1bcnt;  /* Internal */
+       ushort  sen_txlen;      /* Tx Frame length counter */
+       ushort  sen_iaddr1;     /* Individual address filter */
+       ushort  sen_iaddr2;
+       ushort  sen_iaddr3;
+       ushort  sen_iaddr4;
+       ushort  sen_boffcnt;    /* Backoff counter */
+
+       /* NOTE: Some versions of the manual have the following items
+        * incorrectly documented.  Below is the proper order.
+        */
+       ushort  sen_taddrh;     /* temp address (MSB) */
+       ushort  sen_taddrm;
+       ushort  sen_taddrl;     /* temp address (LSB) */
+} scc_enet_t;
+
+
+/* SCC Event register as used by Ethernet.
+*/
+#define SCCE_ENET_GRA  ((ushort)0x0080)        /* Graceful stop complete */
+#define SCCE_ENET_TXE  ((ushort)0x0010)        /* Transmit Error */
+#define SCCE_ENET_RXF  ((ushort)0x0008)        /* Full frame received */
+#define SCCE_ENET_BSY  ((ushort)0x0004)        /* All incoming buffers full */
+#define SCCE_ENET_TXB  ((ushort)0x0002)        /* A buffer was transmitted */
+#define SCCE_ENET_RXB  ((ushort)0x0001)        /* A buffer was received */
+
+/* SCC Mode Register (PSMR) as used by Ethernet.
+*/
+#define SCC_PSMR_HBC   ((ushort)0x8000)        /* Enable heartbeat */
+#define SCC_PSMR_FC    ((ushort)0x4000)        /* Force collision */
+#define SCC_PSMR_RSH   ((ushort)0x2000)        /* Receive short frames */
+#define SCC_PSMR_IAM   ((ushort)0x1000)        /* Check individual hash */
+#define SCC_PSMR_ENCRC ((ushort)0x0800)        /* Ethernet CRC mode */
+#define SCC_PSMR_PRO   ((ushort)0x0200)        /* Promiscuous mode */
+#define SCC_PSMR_BRO   ((ushort)0x0100)        /* Catch broadcast pkts */
+#define SCC_PSMR_SBT   ((ushort)0x0080)        /* Special backoff timer */
+#define SCC_PSMR_LPB   ((ushort)0x0040)        /* Set Loopback mode */
+#define SCC_PSMR_SIP   ((ushort)0x0020)        /* Sample Input Pins */
+#define SCC_PSMR_LCW   ((ushort)0x0010)        /* Late collision window */
+#define SCC_PSMR_NIB22 ((ushort)0x000a)        /* Start frame search */
+#define SCC_PSMR_FDE   ((ushort)0x0001)        /* Full duplex enable */
+
+/* Buffer descriptor control/status used by Ethernet receive.
+ * Common to SCC and FCC.
+ */
+#define BD_ENET_RX_EMPTY       ((ushort)0x8000)
+#define BD_ENET_RX_WRAP                ((ushort)0x2000)
+#define BD_ENET_RX_INTR                ((ushort)0x1000)
+#define BD_ENET_RX_LAST                ((ushort)0x0800)
+#define BD_ENET_RX_FIRST       ((ushort)0x0400)
+#define BD_ENET_RX_MISS                ((ushort)0x0100)
+#define BD_ENET_RX_BC          ((ushort)0x0080)        /* FCC Only */
+#define BD_ENET_RX_MC          ((ushort)0x0040)        /* FCC Only */
+#define BD_ENET_RX_LG          ((ushort)0x0020)
+#define BD_ENET_RX_NO          ((ushort)0x0010)
+#define BD_ENET_RX_SH          ((ushort)0x0008)
+#define BD_ENET_RX_CR          ((ushort)0x0004)
+#define BD_ENET_RX_OV          ((ushort)0x0002)
+#define BD_ENET_RX_CL          ((ushort)0x0001)
+#define BD_ENET_RX_STATS       ((ushort)0x01ff)        /* All status bits */
+
+/* Buffer descriptor control/status used by Ethernet transmit.
+ * Common to SCC and FCC.
+ */
+#define BD_ENET_TX_READY       ((ushort)0x8000)
+#define BD_ENET_TX_PAD         ((ushort)0x4000)
+#define BD_ENET_TX_WRAP                ((ushort)0x2000)
+#define BD_ENET_TX_INTR                ((ushort)0x1000)
+#define BD_ENET_TX_LAST                ((ushort)0x0800)
+#define BD_ENET_TX_TC          ((ushort)0x0400)
+#define BD_ENET_TX_DEF         ((ushort)0x0200)
+#define BD_ENET_TX_HB          ((ushort)0x0100)
+#define BD_ENET_TX_LC          ((ushort)0x0080)
+#define BD_ENET_TX_RL          ((ushort)0x0040)
+#define BD_ENET_TX_RCMASK      ((ushort)0x003c)
+#define BD_ENET_TX_UN          ((ushort)0x0002)
+#define BD_ENET_TX_CSL         ((ushort)0x0001)
+#define BD_ENET_TX_STATS       ((ushort)0x03ff)        /* All status bits */
+
+/* SCC as UART
+*/
+typedef struct scc_uart {
+       sccp_t  scc_genscc;
+       uint    scc_res1;       /* Reserved */
+       uint    scc_res2;       /* Reserved */
+       ushort  scc_maxidl;     /* Maximum idle chars */
+       ushort  scc_idlc;       /* temp idle counter */
+       ushort  scc_brkcr;      /* Break count register */
+       ushort  scc_parec;      /* receive parity error counter */
+       ushort  scc_frmec;      /* receive framing error counter */
+       ushort  scc_nosec;      /* receive noise counter */
+       ushort  scc_brkec;      /* receive break condition counter */
+       ushort  scc_brkln;      /* last received break length */
+       ushort  scc_uaddr1;     /* UART address character 1 */
+       ushort  scc_uaddr2;     /* UART address character 2 */
+       ushort  scc_rtemp;      /* Temp storage */
+       ushort  scc_toseq;      /* Transmit out of sequence char */
+       ushort  scc_char1;      /* control character 1 */
+       ushort  scc_char2;      /* control character 2 */
+       ushort  scc_char3;      /* control character 3 */
+       ushort  scc_char4;      /* control character 4 */
+       ushort  scc_char5;      /* control character 5 */
+       ushort  scc_char6;      /* control character 6 */
+       ushort  scc_char7;      /* control character 7 */
+       ushort  scc_char8;      /* control character 8 */
+       ushort  scc_rccm;       /* receive control character mask */
+       ushort  scc_rccr;       /* receive control character register */
+       ushort  scc_rlbc;       /* receive last break character */
+} scc_uart_t;
+
+/* SCC Event and Mask registers when it is used as a UART.
+*/
+#define UART_SCCM_GLR          ((ushort)0x1000)
+#define UART_SCCM_GLT          ((ushort)0x0800)
+#define UART_SCCM_AB           ((ushort)0x0200)
+#define UART_SCCM_IDL          ((ushort)0x0100)
+#define UART_SCCM_GRA          ((ushort)0x0080)
+#define UART_SCCM_BRKE         ((ushort)0x0040)
+#define UART_SCCM_BRKS         ((ushort)0x0020)
+#define UART_SCCM_CCR          ((ushort)0x0008)
+#define UART_SCCM_BSY          ((ushort)0x0004)
+#define UART_SCCM_TX           ((ushort)0x0002)
+#define UART_SCCM_RX           ((ushort)0x0001)
+
+/* The SCC PSMR when used as a UART.
+*/
+#define SCU_PSMR_FLC           ((ushort)0x8000)
+#define SCU_PSMR_SL            ((ushort)0x4000)
+#define SCU_PSMR_CL            ((ushort)0x3000)
+#define SCU_PSMR_UM            ((ushort)0x0c00)
+#define SCU_PSMR_FRZ           ((ushort)0x0200)
+#define SCU_PSMR_RZS           ((ushort)0x0100)
+#define SCU_PSMR_SYN           ((ushort)0x0080)
+#define SCU_PSMR_DRT           ((ushort)0x0040)
+#define SCU_PSMR_PEN           ((ushort)0x0010)
+#define SCU_PSMR_RPM           ((ushort)0x000c)
+#define SCU_PSMR_REVP          ((ushort)0x0008)
+#define SCU_PSMR_TPM           ((ushort)0x0003)
+#define SCU_PSMR_TEVP          ((ushort)0x0002)
+
+/* CPM Transparent mode SCC.
+ */
+typedef struct scc_trans {
+       sccp_t  st_genscc;
+       uint    st_cpres;       /* Preset CRC */
+       uint    st_cmask;       /* Constant mask for CRC */
+} scc_trans_t;
+
+#define BD_SCC_TX_LAST         ((ushort)0x0800)
+
+/* How about some FCCs.....
+*/
+#define FCC_GFMR_DIAG_NORM     ((uint)0x00000000)
+#define FCC_GFMR_DIAG_LE       ((uint)0x40000000)
+#define FCC_GFMR_DIAG_AE       ((uint)0x80000000)
+#define FCC_GFMR_DIAG_ALE      ((uint)0xc0000000)
+#define FCC_GFMR_TCI           ((uint)0x20000000)
+#define FCC_GFMR_TRX           ((uint)0x10000000)
+#define FCC_GFMR_TTX           ((uint)0x08000000)
+#define FCC_GFMR_TTX           ((uint)0x08000000)
+#define FCC_GFMR_CDP           ((uint)0x04000000)
+#define FCC_GFMR_CTSP          ((uint)0x02000000)
+#define FCC_GFMR_CDS           ((uint)0x01000000)
+#define FCC_GFMR_CTSS          ((uint)0x00800000)
+#define FCC_GFMR_SYNL_NONE     ((uint)0x00000000)
+#define FCC_GFMR_SYNL_AUTO     ((uint)0x00004000)
+#define FCC_GFMR_SYNL_8                ((uint)0x00008000)
+#define FCC_GFMR_SYNL_16       ((uint)0x0000c000)
+#define FCC_GFMR_RTSM          ((uint)0x00002000)
+#define FCC_GFMR_RENC_NRZ      ((uint)0x00000000)
+#define FCC_GFMR_RENC_NRZI     ((uint)0x00000800)
+#define FCC_GFMR_REVD          ((uint)0x00000400)
+#define FCC_GFMR_TENC_NRZ      ((uint)0x00000000)
+#define FCC_GFMR_TENC_NRZI     ((uint)0x00000100)
+#define FCC_GFMR_TCRC_16       ((uint)0x00000000)
+#define FCC_GFMR_TCRC_32       ((uint)0x00000080)
+#define FCC_GFMR_ENR           ((uint)0x00000020)
+#define FCC_GFMR_ENT           ((uint)0x00000010)
+#define FCC_GFMR_MODE_ENET     ((uint)0x0000000c)
+#define FCC_GFMR_MODE_ATM      ((uint)0x0000000a)
+#define FCC_GFMR_MODE_HDLC     ((uint)0x00000000)
+
+/* Generic FCC parameter ram.
+*/
+typedef struct fcc_param {
+       ushort  fcc_riptr;      /* Rx Internal temp pointer */
+       ushort  fcc_tiptr;      /* Tx Internal temp pointer */
+       ushort  fcc_res1;
+       ushort  fcc_mrblr;      /* Max receive buffer length, mod 32 bytes */
+       uint    fcc_rstate;     /* Upper byte is Func code, must be set */
+       uint    fcc_rbase;      /* Receive BD base */
+       ushort  fcc_rbdstat;    /* RxBD status */
+       ushort  fcc_rbdlen;     /* RxBD down counter */
+       uint    fcc_rdptr;      /* RxBD internal data pointer */
+       uint    fcc_tstate;     /* Upper byte is Func code, must be set */
+       uint    fcc_tbase;      /* Transmit BD base */
+       ushort  fcc_tbdstat;    /* TxBD status */
+       ushort  fcc_tbdlen;     /* TxBD down counter */
+       uint    fcc_tdptr;      /* TxBD internal data pointer */
+       uint    fcc_rbptr;      /* Rx BD Internal buf pointer */
+       uint    fcc_tbptr;      /* Tx BD Internal buf pointer */
+       uint    fcc_rcrc;       /* Rx temp CRC */
+       uint    fcc_res2;
+       uint    fcc_tcrc;       /* Tx temp CRC */
+} fccp_t;
+
+
+/* Ethernet controller through FCC.
+*/
+typedef struct fcc_enet {
+       fccp_t  fen_genfcc;
+       uint    fen_statbuf;    /* Internal status buffer */
+       uint    fen_camptr;     /* CAM address */
+       uint    fen_cmask;      /* Constant mask for CRC */
+       uint    fen_cpres;      /* Preset CRC */
+       uint    fen_crcec;      /* CRC Error counter */
+       uint    fen_alec;       /* alignment error counter */
+       uint    fen_disfc;      /* discard frame counter */
+       ushort  fen_retlim;     /* Retry limit */
+       ushort  fen_retcnt;     /* Retry counter */
+       ushort  fen_pper;       /* Persistence */
+       ushort  fen_boffcnt;    /* backoff counter */
+       uint    fen_gaddrh;     /* Group address filter, high 32-bits */
+       uint    fen_gaddrl;     /* Group address filter, low 32-bits */
+       ushort  fen_tfcstat;    /* out of sequence TxBD */
+       ushort  fen_tfclen;
+       uint    fen_tfcptr;
+       ushort  fen_mflr;       /* Maximum frame length (1518) */
+       ushort  fen_paddrh;     /* MAC address */
+       ushort  fen_paddrm;
+       ushort  fen_paddrl;
+       ushort  fen_ibdcount;   /* Internal BD counter */
+       ushort  fen_ibdstart;   /* Internal BD start pointer */
+       ushort  fen_ibdend;     /* Internal BD end pointer */
+       ushort  fen_txlen;      /* Internal Tx frame length counter */
+       uint    fen_ibdbase[8]; /* Internal use */
+       uint    fen_iaddrh;     /* Individual address filter */
+       uint    fen_iaddrl;
+       ushort  fen_minflr;     /* Minimum frame length (64) */
+       ushort  fen_taddrh;     /* Filter transfer MAC address */
+       ushort  fen_taddrm;
+       ushort  fen_taddrl;
+       ushort  fen_padptr;     /* Pointer to pad byte buffer */
+       ushort  fen_cftype;     /* control frame type */
+       ushort  fen_cfrange;    /* control frame range */
+       ushort  fen_maxb;       /* maximum BD count */
+       ushort  fen_maxd1;      /* Max DMA1 length (1520) */
+       ushort  fen_maxd2;      /* Max DMA2 length (1520) */
+       ushort  fen_maxd;       /* internal max DMA count */
+       ushort  fen_dmacnt;     /* internal DMA counter */
+       uint    fen_octc;       /* Total octect counter */
+       uint    fen_colc;       /* Total collision counter */
+       uint    fen_broc;       /* Total broadcast packet counter */
+       uint    fen_mulc;       /* Total multicast packet count */
+       uint    fen_uspc;       /* Total packets < 64 bytes */
+       uint    fen_frgc;       /* Total packets < 64 bytes with errors */
+       uint    fen_ospc;       /* Total packets > 1518 */
+       uint    fen_jbrc;       /* Total packets > 1518 with errors */
+       uint    fen_p64c;       /* Total packets == 64 bytes */
+       uint    fen_p65c;       /* Total packets 64 < bytes <= 127 */
+       uint    fen_p128c;      /* Total packets 127 < bytes <= 255 */
+       uint    fen_p256c;      /* Total packets 256 < bytes <= 511 */
+       uint    fen_p512c;      /* Total packets 512 < bytes <= 1023 */
+       uint    fen_p1024c;     /* Total packets 1024 < bytes <= 1518 */
+       uint    fen_cambuf;     /* Internal CAM buffer poiner */
+       ushort  fen_rfthr;      /* Received frames threshold */
+       ushort  fen_rfcnt;      /* Received frames count */
+} fcc_enet_t;
+
+/* FCC Event/Mask register as used by Ethernet.
+*/
+#define FCC_ENET_GRA   ((ushort)0x0080)        /* Graceful stop complete */
+#define FCC_ENET_RXC   ((ushort)0x0040)        /* Control Frame Received */
+#define FCC_ENET_TXC   ((ushort)0x0020)        /* Out of seq. Tx sent */
+#define FCC_ENET_TXE   ((ushort)0x0010)        /* Transmit Error */
+#define FCC_ENET_RXF   ((ushort)0x0008)        /* Full frame received */
+#define FCC_ENET_BSY   ((ushort)0x0004)        /* Busy.  Rx Frame dropped */
+#define FCC_ENET_TXB   ((ushort)0x0002)        /* A buffer was transmitted */
+#define FCC_ENET_RXB   ((ushort)0x0001)        /* A buffer was received */
+
+/* FCC Mode Register (FPSMR) as used by Ethernet.
+*/
+#define FCC_PSMR_HBC   ((uint)0x80000000)      /* Enable heartbeat */
+#define FCC_PSMR_FC    ((uint)0x40000000)      /* Force Collision */
+#define FCC_PSMR_SBT   ((uint)0x20000000)      /* Stop backoff timer */
+#define FCC_PSMR_LPB   ((uint)0x10000000)      /* Local protect. 1 = FDX */
+#define FCC_PSMR_LCW   ((uint)0x08000000)      /* Late collision select */
+#define FCC_PSMR_FDE   ((uint)0x04000000)      /* Full Duplex Enable */
+#define FCC_PSMR_MON   ((uint)0x02000000)      /* RMON Enable */
+#define FCC_PSMR_PRO   ((uint)0x00400000)      /* Promiscuous Enable */
+#define FCC_PSMR_FCE   ((uint)0x00200000)      /* Flow Control Enable */
+#define FCC_PSMR_RSH   ((uint)0x00100000)      /* Receive Short Frames */
+#define FCC_PSMR_CAM   ((uint)0x00000400)      /* CAM enable */
+#define FCC_PSMR_BRO   ((uint)0x00000200)      /* Broadcast pkt discard */
+#define FCC_PSMR_ENCRC ((uint)0x00000080)      /* Use 32-bit CRC */
+
+/* IIC parameter RAM.
+*/
+typedef struct iic {
+       ushort  iic_rbase;      /* Rx Buffer descriptor base address */
+       ushort  iic_tbase;      /* Tx Buffer descriptor base address */
+       u_char  iic_rfcr;       /* Rx function code */
+       u_char  iic_tfcr;       /* Tx function code */
+       ushort  iic_mrblr;      /* Max receive buffer length */
+       uint    iic_rstate;     /* Internal */
+       uint    iic_rdp;        /* Internal */
+       ushort  iic_rbptr;      /* Internal */
+       ushort  iic_rbc;        /* Internal */
+       uint    iic_rxtmp;      /* Internal */
+       uint    iic_tstate;     /* Internal */
+       uint    iic_tdp;        /* Internal */
+       ushort  iic_tbptr;      /* Internal */
+       ushort  iic_tbc;        /* Internal */
+       uint    iic_txtmp;      /* Internal */
+} iic_t;
+
+/* SPI parameter RAM.
+*/
+typedef struct spi {
+       ushort  spi_rbase;      /* Rx Buffer descriptor base address */
+       ushort  spi_tbase;      /* Tx Buffer descriptor base address */
+       u_char  spi_rfcr;       /* Rx function code */
+       u_char  spi_tfcr;       /* Tx function code */
+       ushort  spi_mrblr;      /* Max receive buffer length */
+       uint    spi_rstate;     /* Internal */
+       uint    spi_rdp;        /* Internal */
+       ushort  spi_rbptr;      /* Internal */
+       ushort  spi_rbc;        /* Internal */
+       uint    spi_rxtmp;      /* Internal */
+       uint    spi_tstate;     /* Internal */
+       uint    spi_tdp;        /* Internal */
+       ushort  spi_tbptr;      /* Internal */
+       ushort  spi_tbc;        /* Internal */
+       uint    spi_txtmp;      /* Internal */
+       uint    spi_res;        /* Tx temp. */
+       uint    spi_res1[4];    /* SDMA temp. */
+} spi_t;
+
+/* SPI Mode register.
+*/
+#define SPMODE_LOOP    ((ushort)0x4000)        /* Loopback */
+#define SPMODE_CI      ((ushort)0x2000)        /* Clock Invert */
+#define SPMODE_CP      ((ushort)0x1000)        /* Clock Phase */
+#define SPMODE_DIV16   ((ushort)0x0800)        /* BRG/16 mode */
+#define SPMODE_REV     ((ushort)0x0400)        /* Reversed Data */
+#define SPMODE_MSTR    ((ushort)0x0200)        /* SPI Master */
+#define SPMODE_EN      ((ushort)0x0100)        /* Enable */
+#define SPMODE_LENMSK  ((ushort)0x00f0)        /* character length */
+#define SPMODE_PMMSK   ((ushort)0x000f)        /* prescale modulus */
+
+#define SPMODE_LEN(x)  ((((x)-1)&0xF)<<4)
+#define SPMODE_PM(x)   ((x) &0xF)
+
+#define SPI_EB         ((u_char)0x10)          /* big endian byte order */
+
+#define BD_IIC_START           ((ushort)0x0400)
+
+/* IDMA parameter RAM
+*/
+typedef struct idma {
+       ushort ibase;           /* IDMA buffer descriptor table base address */
+       ushort dcm;             /* DMA channel mode */
+       ushort ibdptr;          /* IDMA current buffer descriptor pointer */
+       ushort dpr_buf;         /* IDMA transfer buffer base address */
+       ushort buf_inv;         /* internal buffer inventory */
+       ushort ss_max;          /* steady-state maximum transfer size */
+       ushort dpr_in_ptr;      /* write pointer inside the internal buffer */
+       ushort sts;             /* source transfer size */
+       ushort dpr_out_ptr;     /* read pointer inside the internal buffer */
+       ushort seob;            /* source end of burst */
+       ushort deob;            /* destination end of burst */
+       ushort dts;             /* destination transfer size */
+       ushort ret_add;         /* return address when working in ERM=1 mode */
+       ushort res0;            /* reserved */
+       uint   bd_cnt;          /* internal byte count */
+       uint   s_ptr;           /* source internal data pointer */
+       uint   d_ptr;           /* destination internal data pointer */
+       uint   istate;          /* internal state */
+       u_char res1[20];        /* pad to 64-byte length */
+} idma_t;
+
+/* DMA channel mode bit fields
+*/
+#define IDMA_DCM_FB            ((ushort)0x8000) /* fly-by mode */
+#define IDMA_DCM_LP            ((ushort)0x4000) /* low priority */
+#define IDMA_DCM_TC2           ((ushort)0x0400) /* value driven on TC[2] */
+#define IDMA_DCM_DMA_WRAP_MASK ((ushort)0x01c0) /* mask for DMA wrap */
+#define IDMA_DCM_DMA_WRAP_64   ((ushort)0x0000) /* 64-byte DMA xfer buffer */
+#define IDMA_DCM_DMA_WRAP_128  ((ushort)0x0040) /* 128-byte DMA xfer buffer */
+#define IDMA_DCM_DMA_WRAP_256  ((ushort)0x0080) /* 256-byte DMA xfer buffer */
+#define IDMA_DCM_DMA_WRAP_512  ((ushort)0x00c0) /* 512-byte DMA xfer buffer */
+#define IDMA_DCM_DMA_WRAP_1024 ((ushort)0x0100) /* 1024-byte DMA xfer buffer */
+#define IDMA_DCM_DMA_WRAP_2048 ((ushort)0x0140) /* 2048-byte DMA xfer buffer */
+#define IDMA_DCM_SINC          ((ushort)0x0020) /* source inc addr */
+#define IDMA_DCM_DINC          ((ushort)0x0010) /* destination inc addr */
+#define IDMA_DCM_ERM           ((ushort)0x0008) /* external request mode */
+#define IDMA_DCM_DT            ((ushort)0x0004) /* DONE treatment */
+#define IDMA_DCM_SD_MASK       ((ushort)0x0003) /* mask for SD bit field */
+#define IDMA_DCM_SD_MEM2MEM    ((ushort)0x0000) /* memory-to-memory xfer */
+#define IDMA_DCM_SD_PER2MEM    ((ushort)0x0002) /* peripheral-to-memory xfer */
+#define IDMA_DCM_SD_MEM2PER    ((ushort)0x0001) /* memory-to-peripheral xfer */
+
+/* IDMA Buffer Descriptors
+*/
+typedef struct idma_bd {
+       uint flags;
+       uint len;       /* data length */
+       uint src;       /* source data buffer pointer */
+       uint dst;       /* destination data buffer pointer */
+} idma_bd_t;
+
+/* IDMA buffer descriptor flag bit fields
+*/
+#define IDMA_BD_V      ((uint)0x80000000)      /* valid */
+#define IDMA_BD_W      ((uint)0x20000000)      /* wrap */
+#define IDMA_BD_I      ((uint)0x10000000)      /* interrupt */
+#define IDMA_BD_L      ((uint)0x08000000)      /* last */
+#define IDMA_BD_CM     ((uint)0x02000000)      /* continuous mode */
+#define IDMA_BD_SDN    ((uint)0x00400000)      /* source done */
+#define IDMA_BD_DDN    ((uint)0x00200000)      /* destination done */
+#define IDMA_BD_DGBL   ((uint)0x00100000)      /* destination global */
+#define IDMA_BD_DBO_LE ((uint)0x00040000)      /* little-end dest byte order */
+#define IDMA_BD_DBO_BE ((uint)0x00080000)      /* big-end dest byte order */
+#define IDMA_BD_DDTB   ((uint)0x00010000)      /* destination data bus */
+#define IDMA_BD_SGBL   ((uint)0x00002000)      /* source global */
+#define IDMA_BD_SBO_LE ((uint)0x00000800)      /* little-end src byte order */
+#define IDMA_BD_SBO_BE ((uint)0x00001000)      /* big-end src byte order */
+#define IDMA_BD_SDTB   ((uint)0x00000200)      /* source data bus */
+
+/* per-channel IDMA registers
+*/
+typedef struct im_idma {
+       u_char idsr;                    /* IDMAn event status register */
+       u_char res0[3];
+       u_char idmr;                    /* IDMAn event mask register */
+       u_char res1[3];
+} im_idma_t;
+
+/* IDMA event register bit fields
+*/
+#define IDMA_EVENT_SC  ((unsigned char)0x08)   /* stop completed */
+#define IDMA_EVENT_OB  ((unsigned char)0x04)   /* out of buffers */
+#define IDMA_EVENT_EDN ((unsigned char)0x02)   /* external DONE asserted */
+#define IDMA_EVENT_BC  ((unsigned char)0x01)   /* buffer descriptor complete */
+
+/* RISC Controller Configuration Register (RCCR) bit fields
+*/
+#define RCCR_TIME      ((uint)0x80000000) /* timer enable */
+#define RCCR_TIMEP_MASK        ((uint)0x3f000000) /* mask for timer period bit field */
+#define RCCR_DR0M      ((uint)0x00800000) /* IDMA0 request mode */
+#define RCCR_DR1M      ((uint)0x00400000) /* IDMA1 request mode */
+#define RCCR_DR2M      ((uint)0x00000080) /* IDMA2 request mode */
+#define RCCR_DR3M      ((uint)0x00000040) /* IDMA3 request mode */
+#define RCCR_DR0QP_MASK        ((uint)0x00300000) /* mask for IDMA0 req priority */
+#define RCCR_DR0QP_HIGH ((uint)0x00000000) /* IDMA0 has high req priority */
+#define RCCR_DR0QP_MED ((uint)0x00100000) /* IDMA0 has medium req priority */
+#define RCCR_DR0QP_LOW ((uint)0x00200000) /* IDMA0 has low req priority */
+#define RCCR_DR1QP_MASK        ((uint)0x00030000) /* mask for IDMA1 req priority */
+#define RCCR_DR1QP_HIGH ((uint)0x00000000) /* IDMA1 has high req priority */
+#define RCCR_DR1QP_MED ((uint)0x00010000) /* IDMA1 has medium req priority */
+#define RCCR_DR1QP_LOW ((uint)0x00020000) /* IDMA1 has low req priority */
+#define RCCR_DR2QP_MASK        ((uint)0x00000030) /* mask for IDMA2 req priority */
+#define RCCR_DR2QP_HIGH ((uint)0x00000000) /* IDMA2 has high req priority */
+#define RCCR_DR2QP_MED ((uint)0x00000010) /* IDMA2 has medium req priority */
+#define RCCR_DR2QP_LOW ((uint)0x00000020) /* IDMA2 has low req priority */
+#define RCCR_DR3QP_MASK        ((uint)0x00000003) /* mask for IDMA3 req priority */
+#define RCCR_DR3QP_HIGH ((uint)0x00000000) /* IDMA3 has high req priority */
+#define RCCR_DR3QP_MED ((uint)0x00000001) /* IDMA3 has medium req priority */
+#define RCCR_DR3QP_LOW ((uint)0x00000002) /* IDMA3 has low req priority */
+#define RCCR_EIE       ((uint)0x00080000) /* external interrupt enable */
+#define RCCR_SCD       ((uint)0x00040000) /* scheduler configuration */
+#define RCCR_ERAM_MASK ((uint)0x0000e000) /* mask for enable RAM microcode */
+#define RCCR_ERAM_0KB  ((uint)0x00000000) /* use 0KB of dpram for microcode */
+#define RCCR_ERAM_2KB  ((uint)0x00002000) /* use 2KB of dpram for microcode */
+#define RCCR_ERAM_4KB  ((uint)0x00004000) /* use 4KB of dpram for microcode */
+#define RCCR_ERAM_6KB  ((uint)0x00006000) /* use 6KB of dpram for microcode */
+#define RCCR_ERAM_8KB  ((uint)0x00008000) /* use 8KB of dpram for microcode */
+#define RCCR_ERAM_10KB ((uint)0x0000a000) /* use 10KB of dpram for microcode */
+#define RCCR_ERAM_12KB ((uint)0x0000c000) /* use 12KB of dpram for microcode */
+#define RCCR_EDM0      ((uint)0x00000800) /* DREQ0 edge detect mode */
+#define RCCR_EDM1      ((uint)0x00000400) /* DREQ1 edge detect mode */
+#define RCCR_EDM2      ((uint)0x00000200) /* DREQ2 edge detect mode */
+#define RCCR_EDM3      ((uint)0x00000100) /* DREQ3 edge detect mode */
+#define RCCR_DEM01     ((uint)0x00000008) /* DONE0/DONE1 edge detect mode */
+#define RCCR_DEM23     ((uint)0x00000004) /* DONE2/DONE3 edge detect mode */
+
+/*-----------------------------------------------------------------------
+ * CMXFCR - CMX FCC Clock Route Register
+ */
+#define CMXFCR_FC1         0x40000000   /* FCC1 connection              */
+#define CMXFCR_RF1CS_MSK   0x38000000   /* Receive FCC1 Clock Source Mask */
+#define CMXFCR_TF1CS_MSK   0x07000000   /* Transmit FCC1 Clock Source Mask */
+#define CMXFCR_FC2         0x00400000   /* FCC2 connection              */
+#define CMXFCR_RF2CS_MSK   0x00380000   /* Receive FCC2 Clock Source Mask */
+#define CMXFCR_TF2CS_MSK   0x00070000   /* Transmit FCC2 Clock Source Mask */
+#define CMXFCR_FC3         0x00004000   /* FCC3 connection              */
+#define CMXFCR_RF3CS_MSK   0x00003800   /* Receive FCC3 Clock Source Mask */
+#define CMXFCR_TF3CS_MSK   0x00000700   /* Transmit FCC3 Clock Source Mask */
+
+#define CMXFCR_RF1CS_BRG5  0x00000000   /* Receive FCC1 Clock Source is BRG5 */
+#define CMXFCR_RF1CS_BRG6  0x08000000   /* Receive FCC1 Clock Source is BRG6 */
+#define CMXFCR_RF1CS_BRG7  0x10000000   /* Receive FCC1 Clock Source is BRG7 */
+#define CMXFCR_RF1CS_BRG8  0x18000000   /* Receive FCC1 Clock Source is BRG8 */
+#define CMXFCR_RF1CS_CLK9  0x20000000   /* Receive FCC1 Clock Source is CLK9 */
+#define CMXFCR_RF1CS_CLK10 0x28000000   /* Receive FCC1 Clock Source is CLK10 */
+#define CMXFCR_RF1CS_CLK11 0x30000000   /* Receive FCC1 Clock Source is CLK11 */
+#define CMXFCR_RF1CS_CLK12 0x38000000   /* Receive FCC1 Clock Source is CLK12 */
+
+#define CMXFCR_TF1CS_BRG5  0x00000000   /* Transmit FCC1 Clock Source is BRG5 */
+#define CMXFCR_TF1CS_BRG6  0x01000000   /* Transmit FCC1 Clock Source is BRG6 */
+#define CMXFCR_TF1CS_BRG7  0x02000000   /* Transmit FCC1 Clock Source is BRG7 */
+#define CMXFCR_TF1CS_BRG8  0x03000000   /* Transmit FCC1 Clock Source is BRG8 */
+#define CMXFCR_TF1CS_CLK9  0x04000000   /* Transmit FCC1 Clock Source is CLK9 */
+#define CMXFCR_TF1CS_CLK10 0x05000000   /* Transmit FCC1 Clock Source is CLK10 */
+#define CMXFCR_TF1CS_CLK11 0x06000000   /* Transmit FCC1 Clock Source is CLK11 */
+#define CMXFCR_TF1CS_CLK12 0x07000000   /* Transmit FCC1 Clock Source is CLK12 */
+
+#define CMXFCR_RF2CS_BRG5  0x00000000   /* Receive FCC2 Clock Source is BRG5 */
+#define CMXFCR_RF2CS_BRG6  0x00080000   /* Receive FCC2 Clock Source is BRG6 */
+#define CMXFCR_RF2CS_BRG7  0x00100000   /* Receive FCC2 Clock Source is BRG7 */
+#define CMXFCR_RF2CS_BRG8  0x00180000   /* Receive FCC2 Clock Source is BRG8 */
+#define CMXFCR_RF2CS_CLK13 0x00200000   /* Receive FCC2 Clock Source is CLK13 */
+#define CMXFCR_RF2CS_CLK14 0x00280000   /* Receive FCC2 Clock Source is CLK14 */
+#define CMXFCR_RF2CS_CLK15 0x00300000   /* Receive FCC2 Clock Source is CLK15 */
+#define CMXFCR_RF2CS_CLK16 0x00380000   /* Receive FCC2 Clock Source is CLK16 */
+
+#define CMXFCR_TF2CS_BRG5  0x00000000   /* Transmit FCC2 Clock Source is BRG5 */
+#define CMXFCR_TF2CS_BRG6  0x00010000   /* Transmit FCC2 Clock Source is BRG6 */
+#define CMXFCR_TF2CS_BRG7  0x00020000   /* Transmit FCC2 Clock Source is BRG7 */
+#define CMXFCR_TF2CS_BRG8  0x00030000   /* Transmit FCC2 Clock Source is BRG8 */
+#define CMXFCR_TF2CS_CLK13 0x00040000   /* Transmit FCC2 Clock Source is CLK13 */
+#define CMXFCR_TF2CS_CLK14 0x00050000   /* Transmit FCC2 Clock Source is CLK14 */
+#define CMXFCR_TF2CS_CLK15 0x00060000   /* Transmit FCC2 Clock Source is CLK15 */
+#define CMXFCR_TF2CS_CLK16 0x00070000   /* Transmit FCC2 Clock Source is CLK16 */
+
+#define CMXFCR_RF3CS_BRG5  0x00000000   /* Receive FCC3 Clock Source is BRG5 */
+#define CMXFCR_RF3CS_BRG6  0x00000800   /* Receive FCC3 Clock Source is BRG6 */
+#define CMXFCR_RF3CS_BRG7  0x00001000   /* Receive FCC3 Clock Source is BRG7 */
+#define CMXFCR_RF3CS_BRG8  0x00001800   /* Receive FCC3 Clock Source is BRG8 */
+#define CMXFCR_RF3CS_CLK13 0x00002000   /* Receive FCC3 Clock Source is CLK13 */
+#define CMXFCR_RF3CS_CLK14 0x00002800   /* Receive FCC3 Clock Source is CLK14 */
+#define CMXFCR_RF3CS_CLK15 0x00003000   /* Receive FCC3 Clock Source is CLK15 */
+#define CMXFCR_RF3CS_CLK16 0x00003800   /* Receive FCC3 Clock Source is CLK16 */
+
+#define CMXFCR_TF3CS_BRG5  0x00000000   /* Transmit FCC3 Clock Source is BRG5 */
+#define CMXFCR_TF3CS_BRG6  0x00000100   /* Transmit FCC3 Clock Source is BRG6 */
+#define CMXFCR_TF3CS_BRG7  0x00000200   /* Transmit FCC3 Clock Source is BRG7 */
+#define CMXFCR_TF3CS_BRG8  0x00000300   /* Transmit FCC3 Clock Source is BRG8 */
+#define CMXFCR_TF3CS_CLK13 0x00000400   /* Transmit FCC3 Clock Source is CLK13 */
+#define CMXFCR_TF3CS_CLK14 0x00000500   /* Transmit FCC3 Clock Source is CLK14 */
+#define CMXFCR_TF3CS_CLK15 0x00000600   /* Transmit FCC3 Clock Source is CLK15 */
+#define CMXFCR_TF3CS_CLK16 0x00000700   /* Transmit FCC3 Clock Source is CLK16 */
+
+/*-----------------------------------------------------------------------
+ * CMXSCR - CMX SCC Clock Route Register
+ */
+#define CMXSCR_GR1         0x80000000   /* Grant Support of SCC1        */
+#define CMXSCR_SC1         0x40000000   /* SCC1 connection              */
+#define CMXSCR_RS1CS_MSK   0x38000000   /* Receive SCC1 Clock Source Mask */
+#define CMXSCR_TS1CS_MSK   0x07000000   /* Transmit SCC1 Clock Source Mask */
+#define CMXSCR_GR2         0x00800000   /* Grant Support of SCC2        */
+#define CMXSCR_SC2         0x00400000   /* SCC2 connection              */
+#define CMXSCR_RS2CS_MSK   0x00380000   /* Receive SCC2 Clock Source Mask */
+#define CMXSCR_TS2CS_MSK   0x00070000   /* Transmit SCC2 Clock Source Mask */
+#define CMXSCR_GR3         0x00008000   /* Grant Support of SCC3        */
+#define CMXSCR_SC3         0x00004000   /* SCC3 connection              */
+#define CMXSCR_RS3CS_MSK   0x00003800   /* Receive SCC3 Clock Source Mask */
+#define CMXSCR_TS3CS_MSK   0x00000700   /* Transmit SCC3 Clock Source Mask */
+#define CMXSCR_GR4         0x00000080   /* Grant Support of SCC4        */
+#define CMXSCR_SC4         0x00000040   /* SCC4 connection              */
+#define CMXSCR_RS4CS_MSK   0x00000038   /* Receive SCC4 Clock Source Mask */
+#define CMXSCR_TS4CS_MSK   0x00000007   /* Transmit SCC4 Clock Source Mask */
+
+#define CMXSCR_RS1CS_BRG1  0x00000000   /* SCC1 Rx Clock Source is BRG1 */
+#define CMXSCR_RS1CS_BRG2  0x08000000   /* SCC1 Rx Clock Source is BRG2 */
+#define CMXSCR_RS1CS_BRG3  0x10000000   /* SCC1 Rx Clock Source is BRG3 */
+#define CMXSCR_RS1CS_BRG4  0x18000000   /* SCC1 Rx Clock Source is BRG4 */
+#define CMXSCR_RS1CS_CLK11 0x20000000   /* SCC1 Rx Clock Source is CLK11 */
+#define CMXSCR_RS1CS_CLK12 0x28000000   /* SCC1 Rx Clock Source is CLK12 */
+#define CMXSCR_RS1CS_CLK3  0x30000000   /* SCC1 Rx Clock Source is CLK3 */
+#define CMXSCR_RS1CS_CLK4  0x38000000   /* SCC1 Rx Clock Source is CLK4 */
+
+#define CMXSCR_TS1CS_BRG1  0x00000000   /* SCC1 Tx Clock Source is BRG1 */
+#define CMXSCR_TS1CS_BRG2  0x01000000   /* SCC1 Tx Clock Source is BRG2 */
+#define CMXSCR_TS1CS_BRG3  0x02000000   /* SCC1 Tx Clock Source is BRG3 */
+#define CMXSCR_TS1CS_BRG4  0x03000000   /* SCC1 Tx Clock Source is BRG4 */
+#define CMXSCR_TS1CS_CLK11 0x04000000   /* SCC1 Tx Clock Source is CLK11 */
+#define CMXSCR_TS1CS_CLK12 0x05000000   /* SCC1 Tx Clock Source is CLK12 */
+#define CMXSCR_TS1CS_CLK3  0x06000000   /* SCC1 Tx Clock Source is CLK3 */
+#define CMXSCR_TS1CS_CLK4  0x07000000   /* SCC1 Tx Clock Source is CLK4 */
+
+#define CMXSCR_RS2CS_BRG1  0x00000000   /* SCC2 Rx Clock Source is BRG1 */
+#define CMXSCR_RS2CS_BRG2  0x00080000   /* SCC2 Rx Clock Source is BRG2 */
+#define CMXSCR_RS2CS_BRG3  0x00100000   /* SCC2 Rx Clock Source is BRG3 */
+#define CMXSCR_RS2CS_BRG4  0x00180000   /* SCC2 Rx Clock Source is BRG4 */
+#define CMXSCR_RS2CS_CLK11 0x00200000   /* SCC2 Rx Clock Source is CLK11 */
+#define CMXSCR_RS2CS_CLK12 0x00280000   /* SCC2 Rx Clock Source is CLK12 */
+#define CMXSCR_RS2CS_CLK3  0x00300000   /* SCC2 Rx Clock Source is CLK3 */
+#define CMXSCR_RS2CS_CLK4  0x00380000   /* SCC2 Rx Clock Source is CLK4 */
+
+#define CMXSCR_TS2CS_BRG1  0x00000000   /* SCC2 Tx Clock Source is BRG1 */
+#define CMXSCR_TS2CS_BRG2  0x00010000   /* SCC2 Tx Clock Source is BRG2 */
+#define CMXSCR_TS2CS_BRG3  0x00020000   /* SCC2 Tx Clock Source is BRG3 */
+#define CMXSCR_TS2CS_BRG4  0x00030000   /* SCC2 Tx Clock Source is BRG4 */
+#define CMXSCR_TS2CS_CLK11 0x00040000   /* SCC2 Tx Clock Source is CLK11 */
+#define CMXSCR_TS2CS_CLK12 0x00050000   /* SCC2 Tx Clock Source is CLK12 */
+#define CMXSCR_TS2CS_CLK3  0x00060000   /* SCC2 Tx Clock Source is CLK3 */
+#define CMXSCR_TS2CS_CLK4  0x00070000   /* SCC2 Tx Clock Source is CLK4 */
+
+#define CMXSCR_RS3CS_BRG1  0x00000000   /* SCC3 Rx Clock Source is BRG1 */
+#define CMXSCR_RS3CS_BRG2  0x00000800   /* SCC3 Rx Clock Source is BRG2 */
+#define CMXSCR_RS3CS_BRG3  0x00001000   /* SCC3 Rx Clock Source is BRG3 */
+#define CMXSCR_RS3CS_BRG4  0x00001800   /* SCC3 Rx Clock Source is BRG4 */
+#define CMXSCR_RS3CS_CLK5  0x00002000   /* SCC3 Rx Clock Source is CLK5 */
+#define CMXSCR_RS3CS_CLK6  0x00002800   /* SCC3 Rx Clock Source is CLK6 */
+#define CMXSCR_RS3CS_CLK7  0x00003000   /* SCC3 Rx Clock Source is CLK7 */
+#define CMXSCR_RS3CS_CLK8  0x00003800   /* SCC3 Rx Clock Source is CLK8 */
+
+#define CMXSCR_TS3CS_BRG1  0x00000000   /* SCC3 Tx Clock Source is BRG1 */
+#define CMXSCR_TS3CS_BRG2  0x00000100   /* SCC3 Tx Clock Source is BRG2 */
+#define CMXSCR_TS3CS_BRG3  0x00000200   /* SCC3 Tx Clock Source is BRG3 */
+#define CMXSCR_TS3CS_BRG4  0x00000300   /* SCC3 Tx Clock Source is BRG4 */
+#define CMXSCR_TS3CS_CLK5  0x00000400   /* SCC3 Tx Clock Source is CLK5 */
+#define CMXSCR_TS3CS_CLK6  0x00000500   /* SCC3 Tx Clock Source is CLK6 */
+#define CMXSCR_TS3CS_CLK7  0x00000600   /* SCC3 Tx Clock Source is CLK7 */
+#define CMXSCR_TS3CS_CLK8  0x00000700   /* SCC3 Tx Clock Source is CLK8 */
+
+#define CMXSCR_RS4CS_BRG1  0x00000000   /* SCC4 Rx Clock Source is BRG1 */
+#define CMXSCR_RS4CS_BRG2  0x00000008   /* SCC4 Rx Clock Source is BRG2 */
+#define CMXSCR_RS4CS_BRG3  0x00000010   /* SCC4 Rx Clock Source is BRG3 */
+#define CMXSCR_RS4CS_BRG4  0x00000018   /* SCC4 Rx Clock Source is BRG4 */
+#define CMXSCR_RS4CS_CLK5  0x00000020   /* SCC4 Rx Clock Source is CLK5 */
+#define CMXSCR_RS4CS_CLK6  0x00000028   /* SCC4 Rx Clock Source is CLK6 */
+#define CMXSCR_RS4CS_CLK7  0x00000030   /* SCC4 Rx Clock Source is CLK7 */
+#define CMXSCR_RS4CS_CLK8  0x00000038   /* SCC4 Rx Clock Source is CLK8 */
+
+#define CMXSCR_TS4CS_BRG1  0x00000000   /* SCC4 Tx Clock Source is BRG1 */
+#define CMXSCR_TS4CS_BRG2  0x00000001   /* SCC4 Tx Clock Source is BRG2 */
+#define CMXSCR_TS4CS_BRG3  0x00000002   /* SCC4 Tx Clock Source is BRG3 */
+#define CMXSCR_TS4CS_BRG4  0x00000003   /* SCC4 Tx Clock Source is BRG4 */
+#define CMXSCR_TS4CS_CLK5  0x00000004   /* SCC4 Tx Clock Source is CLK5 */
+#define CMXSCR_TS4CS_CLK6  0x00000005   /* SCC4 Tx Clock Source is CLK6 */
+#define CMXSCR_TS4CS_CLK7  0x00000006   /* SCC4 Tx Clock Source is CLK7 */
+#define CMXSCR_TS4CS_CLK8  0x00000007   /* SCC4 Tx Clock Source is CLK8 */
+
+/*-----------------------------------------------------------------------
+ * SIUMCR - SIU Module Configuration Register                           4-31
+ */
+#define SIUMCR_BBD     0x80000000      /* Bus Busy Disable             */
+#define SIUMCR_ESE     0x40000000      /* External Snoop Enable        */
+#define SIUMCR_PBSE    0x20000000      /* Parity Byte Select Enable    */
+#define SIUMCR_CDIS    0x10000000      /* Core Disable                 */
+#define SIUMCR_DPPC00  0x00000000      /* Data Parity Pins Configuration*/
+#define SIUMCR_DPPC01  0x04000000      /* - " -                        */
+#define SIUMCR_DPPC10  0x08000000      /* - " -                        */
+#define SIUMCR_DPPC11  0x0c000000      /* - " -                        */
+#define SIUMCR_L2CPC00 0x00000000      /* L2 Cache Pins Configuration  */
+#define SIUMCR_L2CPC01 0x01000000      /* - " -                        */
+#define SIUMCR_L2CPC10 0x02000000      /* - " -                        */
+#define SIUMCR_L2CPC11 0x03000000      /* - " -                        */
+#define SIUMCR_LBPC00  0x00000000      /* Local Bus Pins Configuration */
+#define SIUMCR_LBPC01  0x00400000      /* - " -                        */
+#define SIUMCR_LBPC10  0x00800000      /* - " -                        */
+#define SIUMCR_LBPC11  0x00c00000      /* - " -                        */
+#define SIUMCR_APPC00  0x00000000      /* Address Parity Pins Configuration*/
+#define SIUMCR_APPC01  0x00100000      /* - " -                        */
+#define SIUMCR_APPC10  0x00200000      /* - " -                        */
+#define SIUMCR_APPC11  0x00300000      /* - " -                        */
+#define SIUMCR_CS10PC00        0x00000000      /* CS10 Pin Configuration       */
+#define SIUMCR_CS10PC01        0x00040000      /* - " -                        */
+#define SIUMCR_CS10PC10        0x00080000      /* - " -                        */
+#define SIUMCR_CS10PC11        0x000c0000      /* - " -                        */
+#define SIUMCR_BCTLC00 0x00000000      /* Buffer Control Configuration */
+#define SIUMCR_BCTLC01 0x00010000      /* - " -                        */
+#define SIUMCR_BCTLC10 0x00020000      /* - " -                        */
+#define SIUMCR_BCTLC11 0x00030000      /* - " -                        */
+#define SIUMCR_MMR00   0x00000000      /* Mask Masters Requests        */
+#define SIUMCR_MMR01   0x00004000      /* - " -                        */
+#define SIUMCR_MMR10   0x00008000      /* - " -                        */
+#define SIUMCR_MMR11   0x0000c000      /* - " -                        */
+#define SIUMCR_LPBSE   0x00002000      /* LocalBus Parity Byte Select Enable*/
+
+/*-----------------------------------------------------------------------
+ * SCCR - System Clock Control Register                                         9-8
+*/
+#define SCCR_PCI_MODE  0x00000100      /* PCI Mode     */
+#define SCCR_PCI_MODCK 0x00000080      /* Value of PCI_MODCK pin       */
+#define SCCR_PCIDF_MSK 0x00000078      /* PCI division factor  */
+#define SCCR_PCIDF_SHIFT 3
+
+#ifndef CPM_IMMR_OFFSET
+#define CPM_IMMR_OFFSET        0x101a8
+#endif
+
+#define FCC_PSMR_RMII  ((uint)0x00020000)      /* Use RMII interface */
+
+/* FCC iop & clock configuration. BSP code is responsible to define Fx_RXCLK & Fx_TXCLK
+ * in order to use clock-computing stuff below for the FCC x
+ */
+
+/* Automatically generates register configurations */
+#define PC_CLK(x)      ((uint)(1<<(x-1)))      /* FCC CLK I/O ports */
+
+#define CMXFCR_RF1CS(x)        ((uint)((x-5)<<27))     /* FCC1 Receive Clock Source */
+#define CMXFCR_TF1CS(x)        ((uint)((x-5)<<24))     /* FCC1 Transmit Clock Source */
+#define CMXFCR_RF2CS(x)        ((uint)((x-9)<<19))     /* FCC2 Receive Clock Source */
+#define CMXFCR_TF2CS(x) ((uint)((x-9)<<16))    /* FCC2 Transmit Clock Source */
+#define CMXFCR_RF3CS(x)        ((uint)((x-9)<<11))     /* FCC3 Receive Clock Source */
+#define CMXFCR_TF3CS(x) ((uint)((x-9)<<8))     /* FCC3 Transmit Clock Source */
+
+#define PC_F1RXCLK     PC_CLK(F1_RXCLK)
+#define PC_F1TXCLK     PC_CLK(F1_TXCLK)
+#define CMX1_CLK_ROUTE (CMXFCR_RF1CS(F1_RXCLK) | CMXFCR_TF1CS(F1_TXCLK))
+#define CMX1_CLK_MASK  ((uint)0xff000000)
+
+#define PC_F2RXCLK     PC_CLK(F2_RXCLK)
+#define PC_F2TXCLK     PC_CLK(F2_TXCLK)
+#define CMX2_CLK_ROUTE (CMXFCR_RF2CS(F2_RXCLK) | CMXFCR_TF2CS(F2_TXCLK))
+#define CMX2_CLK_MASK  ((uint)0x00ff0000)
+
+#define PC_F3RXCLK     PC_CLK(F3_RXCLK)
+#define PC_F3TXCLK     PC_CLK(F3_TXCLK)
+#define CMX3_CLK_ROUTE (CMXFCR_RF3CS(F3_RXCLK) | CMXFCR_TF3CS(F3_TXCLK))
+#define CMX3_CLK_MASK  ((uint)0x0000ff00)
+
+#define CPMUX_CLK_MASK (CMX3_CLK_MASK | CMX2_CLK_MASK)
+#define CPMUX_CLK_ROUTE (CMX3_CLK_ROUTE | CMX2_CLK_ROUTE)
+
+#define CLK_TRX (PC_F3TXCLK | PC_F3RXCLK | PC_F2TXCLK | PC_F2RXCLK)
+
+/* I/O Pin assignment for FCC1.  I don't yet know the best way to do this,
+ * but there is little variation among the choices.
+ */
+#define PA1_COL                0x00000001U
+#define PA1_CRS                0x00000002U
+#define PA1_TXER       0x00000004U
+#define PA1_TXEN       0x00000008U
+#define PA1_RXDV       0x00000010U
+#define PA1_RXER       0x00000020U
+#define PA1_TXDAT      0x00003c00U
+#define PA1_RXDAT      0x0003c000U
+#define PA1_PSORA0     (PA1_RXDAT | PA1_TXDAT)
+#define PA1_PSORA1     (PA1_COL | PA1_CRS | PA1_TXER | PA1_TXEN | \
+               PA1_RXDV | PA1_RXER)
+#define PA1_DIRA0      (PA1_RXDAT | PA1_CRS | PA1_COL | PA1_RXER | PA1_RXDV)
+#define PA1_DIRA1      (PA1_TXDAT | PA1_TXEN | PA1_TXER)
+
+
+/* I/O Pin assignment for FCC2.  I don't yet know the best way to do this,
+ * but there is little variation among the choices.
+ */
+#define PB2_TXER       0x00000001U
+#define PB2_RXDV       0x00000002U
+#define PB2_TXEN       0x00000004U
+#define PB2_RXER       0x00000008U
+#define PB2_COL                0x00000010U
+#define PB2_CRS                0x00000020U
+#define PB2_TXDAT      0x000003c0U
+#define PB2_RXDAT      0x00003c00U
+#define PB2_PSORB0     (PB2_RXDAT | PB2_TXDAT | PB2_CRS | PB2_COL | \
+               PB2_RXER | PB2_RXDV | PB2_TXER)
+#define PB2_PSORB1     (PB2_TXEN)
+#define PB2_DIRB0      (PB2_RXDAT | PB2_CRS | PB2_COL | PB2_RXER | PB2_RXDV)
+#define PB2_DIRB1      (PB2_TXDAT | PB2_TXEN | PB2_TXER)
+
+
+/* I/O Pin assignment for FCC3.  I don't yet know the best way to do this,
+ * but there is little variation among the choices.
+ */
+#define PB3_RXDV       0x00004000U
+#define PB3_RXER       0x00008000U
+#define PB3_TXER       0x00010000U
+#define PB3_TXEN       0x00020000U
+#define PB3_COL                0x00040000U
+#define PB3_CRS                0x00080000U
+#define PB3_TXDAT      0x0f000000U
+#define PC3_TXDAT      0x00000010U
+#define PB3_RXDAT      0x00f00000U
+#define PB3_PSORB0     (PB3_RXDAT | PB3_TXDAT | PB3_CRS | PB3_COL | \
+               PB3_RXER | PB3_RXDV | PB3_TXER | PB3_TXEN)
+#define PB3_PSORB1     0
+#define PB3_DIRB0      (PB3_RXDAT | PB3_CRS | PB3_COL | PB3_RXER | PB3_RXDV)
+#define PB3_DIRB1      (PB3_TXDAT | PB3_TXEN | PB3_TXER)
+#define PC3_DIRC1      (PC3_TXDAT)
+
+/* Handy macro to specify mem for FCCs*/
+#define FCC_MEM_OFFSET(x) (CPM_FCC_SPECIAL_BASE + (x*128))
+#define FCC1_MEM_OFFSET FCC_MEM_OFFSET(0)
+#define FCC2_MEM_OFFSET FCC_MEM_OFFSET(1)
+#define FCC3_MEM_OFFSET FCC_MEM_OFFSET(2)
+
+/* Clocks and GRG's */
+
+enum cpm_clk_dir {
+       CPM_CLK_RX,
+       CPM_CLK_TX,
+       CPM_CLK_RTX
+};
+
+enum cpm_clk_target {
+       CPM_CLK_SCC1,
+       CPM_CLK_SCC2,
+       CPM_CLK_SCC3,
+       CPM_CLK_SCC4,
+       CPM_CLK_FCC1,
+       CPM_CLK_FCC2,
+       CPM_CLK_FCC3,
+       CPM_CLK_SMC1,
+       CPM_CLK_SMC2,
+};
+
+enum cpm_clk {
+       CPM_CLK_NONE = 0,
+       CPM_BRG1,       /* Baud Rate Generator  1 */
+       CPM_BRG2,       /* Baud Rate Generator  2 */
+       CPM_BRG3,       /* Baud Rate Generator  3 */
+       CPM_BRG4,       /* Baud Rate Generator  4 */
+       CPM_BRG5,       /* Baud Rate Generator  5 */
+       CPM_BRG6,       /* Baud Rate Generator  6 */
+       CPM_BRG7,       /* Baud Rate Generator  7 */
+       CPM_BRG8,       /* Baud Rate Generator  8 */
+       CPM_CLK1,       /* Clock  1 */
+       CPM_CLK2,       /* Clock  2 */
+       CPM_CLK3,       /* Clock  3 */
+       CPM_CLK4,       /* Clock  4 */
+       CPM_CLK5,       /* Clock  5 */
+       CPM_CLK6,       /* Clock  6 */
+       CPM_CLK7,       /* Clock  7 */
+       CPM_CLK8,       /* Clock  8 */
+       CPM_CLK9,       /* Clock  9 */
+       CPM_CLK10,      /* Clock 10 */
+       CPM_CLK11,      /* Clock 11 */
+       CPM_CLK12,      /* Clock 12 */
+       CPM_CLK13,      /* Clock 13 */
+       CPM_CLK14,      /* Clock 14 */
+       CPM_CLK15,      /* Clock 15 */
+       CPM_CLK16,      /* Clock 16 */
+       CPM_CLK17,      /* Clock 17 */
+       CPM_CLK18,      /* Clock 18 */
+       CPM_CLK19,      /* Clock 19 */
+       CPM_CLK20,      /* Clock 20 */
+       CPM_CLK_DUMMY
+};
+
+extern int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode);
+extern int cpm2_smc_clk_setup(enum cpm_clk_target target, int clock);
+
+#define CPM_PIN_INPUT     0
+#define CPM_PIN_OUTPUT    1
+#define CPM_PIN_PRIMARY   0
+#define CPM_PIN_SECONDARY 2
+#define CPM_PIN_GPIO      4
+#define CPM_PIN_OPENDRAIN 8
+
+void cpm2_set_pin(int port, int pin, int flags);
+
+#endif /* __CPM2__ */
+#endif /* __KERNEL__ */
index 3dc8e2dfca84d26c9b92c36fc28ed42b068aacfd..ae093ef68363a699d2cfafde633801c0e2513ace 100644 (file)
@@ -57,6 +57,7 @@ enum powerpc_pmc_type {
        PPC_PMC_PA6T = 2,
 };
 
+/* NOTE WELL: Update identify_cpu() if fields are added or removed! */
 struct cpu_spec {
        /* CPU is matched via (PVR & pvr_mask) == pvr_value */
        unsigned int    pvr_mask;
@@ -136,6 +137,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
 #define CPU_FTR_REAL_LE                        ASM_CONST(0x0000000000400000)
 #define CPU_FTR_FPU_UNAVAILABLE                ASM_CONST(0x0000000000800000)
 #define CPU_FTR_UNIFIED_ID_CACHE       ASM_CONST(0x0000000001000000)
+#define CPU_FTR_SPE                    ASM_CONST(0x0000000002000000)
 
 /*
  * Add the 64-bit processor unique features in the top half of the word;
@@ -162,6 +164,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
 #define CPU_FTR_CELL_TB_BUG            LONG_ASM_CONST(0x0000800000000000)
 #define CPU_FTR_SPURR                  LONG_ASM_CONST(0x0001000000000000)
 #define CPU_FTR_DSCR                   LONG_ASM_CONST(0x0002000000000000)
+#define CPU_FTR_1T_SEGMENT             LONG_ASM_CONST(0x0004000000000000)
 
 #ifndef __ASSEMBLY__
 
@@ -180,12 +183,27 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
 #define PPC_FEATURE_HAS_ALTIVEC_COMP    0
 #endif
 
-/* We need to mark all pages as being coherent if we're SMP or we
- * have a 74[45]x and an MPC107 host bridge. Also 83xx requires
- * it for PCI "streaming/prefetch" to work properly.
+/* We only set the spe features if the kernel was compiled with spe
+ * support
+ */
+#ifdef CONFIG_SPE
+#define CPU_FTR_SPE_COMP       CPU_FTR_SPE
+#define PPC_FEATURE_HAS_SPE_COMP PPC_FEATURE_HAS_SPE
+#define PPC_FEATURE_HAS_EFP_SINGLE_COMP PPC_FEATURE_HAS_EFP_SINGLE
+#define PPC_FEATURE_HAS_EFP_DOUBLE_COMP PPC_FEATURE_HAS_EFP_DOUBLE
+#else
+#define CPU_FTR_SPE_COMP       0
+#define PPC_FEATURE_HAS_SPE_COMP    0
+#define PPC_FEATURE_HAS_EFP_SINGLE_COMP 0
+#define PPC_FEATURE_HAS_EFP_DOUBLE_COMP 0
+#endif
+
+/* We need to mark all pages as being coherent if we're SMP or we have a
+ * 74[45]x and an MPC107 host bridge. Also 83xx and PowerQUICC II
+ * require it for PCI "streaming/prefetch" to work properly.
  */
 #if defined(CONFIG_SMP) || defined(CONFIG_MPC10X_BRIDGE) \
-       || defined(CONFIG_PPC_83xx)
+       || defined(CONFIG_PPC_83xx) || defined(CONFIG_8260)
 #define CPU_FTR_COMMON                  CPU_FTR_NEED_COHERENT
 #else
 #define CPU_FTR_COMMON                  0
@@ -297,7 +315,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
            CPU_FTR_PPC_LE)
 #define CPU_FTRS_82XX  (CPU_FTR_COMMON | \
            CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB)
-#define CPU_FTRS_G2_LE (CPU_FTR_MAYBE_CAN_DOZE | \
+#define CPU_FTRS_G2_LE (CPU_FTR_COMMON | CPU_FTR_MAYBE_CAN_DOZE | \
            CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS)
 #define CPU_FTRS_E300  (CPU_FTR_MAYBE_CAN_DOZE | \
            CPU_FTR_USE_TB | CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_HAS_HIGH_BATS | \
@@ -310,10 +328,12 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
 #define CPU_FTRS_8XX   (CPU_FTR_USE_TB)
 #define CPU_FTRS_40X   (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
 #define CPU_FTRS_44X   (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
-#define CPU_FTRS_E200  (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
-           CPU_FTR_COHERENT_ICACHE | CPU_FTR_UNIFIED_ID_CACHE)
-#define CPU_FTRS_E500  (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN)
-#define CPU_FTRS_E500_2        (CPU_FTR_USE_TB | \
+#define CPU_FTRS_E200  (CPU_FTR_USE_TB | CPU_FTR_SPE_COMP | \
+           CPU_FTR_NODSISRALIGN | CPU_FTR_COHERENT_ICACHE | \
+           CPU_FTR_UNIFIED_ID_CACHE)
+#define CPU_FTRS_E500  (CPU_FTR_USE_TB | CPU_FTR_SPE_COMP | \
+           CPU_FTR_NODSISRALIGN)
+#define CPU_FTRS_E500_2        (CPU_FTR_USE_TB | CPU_FTR_SPE_COMP | \
            CPU_FTR_BIG_PHYS | CPU_FTR_NODSISRALIGN)
 #define CPU_FTRS_GENERIC_32    (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN)
 
@@ -355,7 +375,7 @@ extern void do_feature_fixups(unsigned long value, void *fixup_start,
 #define CPU_FTRS_POSSIBLE      \
            (CPU_FTRS_POWER3 | CPU_FTRS_RS64 | CPU_FTRS_POWER4 |        \
            CPU_FTRS_PPC970 | CPU_FTRS_POWER5 | CPU_FTRS_POWER6 |       \
-           CPU_FTRS_CELL | CPU_FTRS_PA6T)
+           CPU_FTRS_CELL | CPU_FTRS_PA6T | CPU_FTR_1T_SEGMENT)
 #else
 enum {
        CPU_FTRS_POSSIBLE =
index 5dbfca8dde3661d7f779f39d3b87c56604aa7239..6b82c3ba495a37c14b0d9b3df4d426fc4b78e5b7 100644 (file)
 
 #include <asm/io.h>
 
-typedef struct { void __iomem *token; unsigned int stride; } dcr_host_t;
+typedef struct {
+       void __iomem *token;
+       unsigned int stride;
+       unsigned int base;
+} dcr_host_t;
 
 #define DCR_MAP_OK(host)       ((host).token != NULL)
 
index 05af081222f6ba7c0a1ac8f8cf90b4def3cbb487..f41058c0f6cb95ebc2d18db98ac7d5210b65b2c8 100644 (file)
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 
-typedef struct {} dcr_host_t;
+typedef struct {
+       unsigned int base;
+} dcr_host_t;
 
 #define DCR_MAP_OK(host)       (1)
 
-#define dcr_map(dev, dcr_n, dcr_c)     ((dcr_host_t){})
+#define dcr_map(dev, dcr_n, dcr_c)     ((dcr_host_t){ .base = (dcr_n) })
 #define dcr_unmap(host, dcr_n, dcr_c)  do {} while (0)
 #define dcr_read(host, dcr_n)          mfdcr(dcr_n)
 #define dcr_write(host, dcr_n, value)  mtdcr(dcr_n, value)
index 744d6bb2411646ff89ace4b049fbc062ec6cce94..d05891608f744ddd8c9c8e751d7434c35cc8a123 100644 (file)
@@ -249,8 +249,12 @@ dma_map_single(struct device *dev, void *ptr, size_t size,
        return virt_to_bus(ptr);
 }
 
-/* We do nothing. */
-#define dma_unmap_single(dev, addr, size, dir) ((void)0)
+static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
+                                   size_t size,
+                                   enum dma_data_direction direction)
+{
+       /* We do nothing. */
+}
 
 static inline dma_addr_t
 dma_map_page(struct device *dev, struct page *page,
@@ -264,8 +268,12 @@ dma_map_page(struct device *dev, struct page *page,
        return page_to_bus(page) + offset;
 }
 
-/* We do nothing. */
-#define dma_unmap_page(dev, handle, size, dir) ((void)0)
+static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
+                                 size_t size,
+                                 enum dma_data_direction direction)
+{
+       /* We do nothing. */
+}
 
 static inline int
 dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
@@ -284,8 +292,12 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
        return nents;
 }
 
-/* We don't do anything here. */
-#define dma_unmap_sg(dev, sg, nents, dir)      ((void)0)
+static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
+                               int nhwentries,
+                               enum dma_data_direction direction)
+{
+       /* We don't do anything here. */
+}
 
 #endif /* CONFIG_PPC64 */
 
index de507995c7b1e0504c6831e84abb50c8eb2cfea3..e42820d6d25bcf0a218948d58a26fc7f149566fd 100644 (file)
@@ -413,13 +413,8 @@ do {                                                                       \
 /* Notes used in ET_CORE. Note name is "SPU/<fd>/<filename>". */
 #define NT_SPU         1
 
-extern int arch_notes_size(void);
-extern void arch_write_notes(struct file *file);
-
-#define ELF_CORE_EXTRA_NOTES_SIZE arch_notes_size()
-#define ELF_CORE_WRITE_EXTRA_NOTES arch_write_notes(file)
-
 #define ARCH_HAVE_EXTRA_ELF_NOTES
-#endif /* CONFIG_PPC_CELL */
+
+#endif /* CONFIG_SPU_BASE */
 
 #endif /* _ASM_POWERPC_ELF_H */
diff --git a/include/asm-powerpc/exception.h b/include/asm-powerpc/exception.h
new file mode 100644 (file)
index 0000000..39abdb0
--- /dev/null
@@ -0,0 +1,311 @@
+#ifndef _ASM_POWERPC_EXCEPTION_H
+#define _ASM_POWERPC_EXCEPTION_H
+/*
+ * Extracted from head_64.S
+ *
+ *  PowerPC version
+ *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
+ *
+ *  Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
+ *    Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
+ *  Adapted for Power Macintosh by Paul Mackerras.
+ *  Low-level exception handlers and MMU support
+ *  rewritten by Paul Mackerras.
+ *    Copyright (C) 1996 Paul Mackerras.
+ *
+ *  Adapted for 64bit PowerPC by Dave Engebretsen, Peter Bergner, and
+ *    Mike Corrigan {engebret|bergner|mikejc}@us.ibm.com
+ *
+ *  This file contains the low-level support and setup for the
+ *  PowerPC-64 platform, including trap and interrupt dispatch.
+ *
+ *  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.
+ */
+/*
+ * The following macros define the code that appears as
+ * the prologue to each of the exception handlers.  They
+ * are split into two parts to allow a single kernel binary
+ * to be used for pSeries and iSeries.
+ *
+ * We make as much of the exception code common between native
+ * exception handlers (including pSeries LPAR) and iSeries LPAR
+ * implementations as possible.
+ */
+
+#define EX_R9          0
+#define EX_R10         8
+#define EX_R11         16
+#define EX_R12         24
+#define EX_R13         32
+#define EX_SRR0                40
+#define EX_DAR         48
+#define EX_DSISR       56
+#define EX_CCR         60
+#define EX_R3          64
+#define EX_LR          72
+
+/*
+ * We're short on space and time in the exception prolog, so we can't
+ * use the normal SET_REG_IMMEDIATE macro. Normally we just need the
+ * low halfword of the address, but for Kdump we need the whole low
+ * word.
+ */
+#ifdef CONFIG_CRASH_DUMP
+#define LOAD_HANDLER(reg, label)                                       \
+       oris    reg,reg,(label)@h;      /* virt addr of handler ... */  \
+       ori     reg,reg,(label)@l;      /* .. and the rest */
+#else
+#define LOAD_HANDLER(reg, label)                                       \
+       ori     reg,reg,(label)@l;      /* virt addr of handler ... */
+#endif
+
+#define EXCEPTION_PROLOG_1(area)                               \
+       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
+       std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
+       std     r10,area+EX_R10(r13);                                   \
+       std     r11,area+EX_R11(r13);                                   \
+       std     r12,area+EX_R12(r13);                                   \
+       mfspr   r9,SPRN_SPRG1;                                          \
+       std     r9,area+EX_R13(r13);                                    \
+       mfcr    r9
+
+/*
+ * Equal to EXCEPTION_PROLOG_PSERIES, except that it forces 64bit mode.
+ * The firmware calls the registered system_reset_fwnmi and
+ * machine_check_fwnmi handlers in 32bit mode if the cpu happens to run
+ * a 32bit application at the time of the event.
+ * This firmware bug is present on POWER4 and JS20.
+ */
+#define EXCEPTION_PROLOG_PSERIES_FORCE_64BIT(area, label)              \
+       EXCEPTION_PROLOG_1(area);                                       \
+       clrrdi  r12,r13,32;             /* get high part of &label */   \
+       mfmsr   r10;                                                    \
+       /* force 64bit mode */                                          \
+       li      r11,5;                  /* MSR_SF_LG|MSR_ISF_LG */      \
+       rldimi  r10,r11,61,0;           /* insert into top 3 bits */    \
+       /* done 64bit mode */                                           \
+       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
+       LOAD_HANDLER(r12,label)                                         \
+       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
+       mtspr   SPRN_SRR0,r12;                                          \
+       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
+       mtspr   SPRN_SRR1,r10;                                          \
+       rfid;                                                           \
+       b       .       /* prevent speculative execution */
+
+#define EXCEPTION_PROLOG_PSERIES(area, label)                          \
+       EXCEPTION_PROLOG_1(area);                                       \
+       clrrdi  r12,r13,32;             /* get high part of &label */   \
+       mfmsr   r10;                                                    \
+       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
+       LOAD_HANDLER(r12,label)                                         \
+       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
+       mtspr   SPRN_SRR0,r12;                                          \
+       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
+       mtspr   SPRN_SRR1,r10;                                          \
+       rfid;                                                           \
+       b       .       /* prevent speculative execution */
+
+/*
+ * The common exception prolog is used for all except a few exceptions
+ * such as a segment miss on a kernel address.  We have to be prepared
+ * to take another exception from the point where we first touch the
+ * kernel stack onwards.
+ *
+ * On entry r13 points to the paca, r9-r13 are saved in the paca,
+ * r9 contains the saved CR, r11 and r12 contain the saved SRR0 and
+ * SRR1, and relocation is on.
+ */
+#define EXCEPTION_PROLOG_COMMON(n, area)                                  \
+       andi.   r10,r12,MSR_PR;         /* See if coming from user      */ \
+       mr      r10,r1;                 /* Save r1                      */ \
+       subi    r1,r1,INT_FRAME_SIZE;   /* alloc frame on kernel stack  */ \
+       beq-    1f;                                                        \
+       ld      r1,PACAKSAVE(r13);      /* kernel stack to use          */ \
+1:     cmpdi   cr1,r1,0;               /* check if r1 is in userspace  */ \
+       bge-    cr1,2f;                 /* abort if it is               */ \
+       b       3f;                                                        \
+2:     li      r1,(n);                 /* will be reloaded later       */ \
+       sth     r1,PACA_TRAP_SAVE(r13);                                    \
+       b       bad_stack;                                                 \
+3:     std     r9,_CCR(r1);            /* save CR in stackframe        */ \
+       std     r11,_NIP(r1);           /* save SRR0 in stackframe      */ \
+       std     r12,_MSR(r1);           /* save SRR1 in stackframe      */ \
+       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    */ \
+       ld      r9,area+EX_R9(r13);     /* move r9, r10 to stackframe   */ \
+       ld      r10,area+EX_R10(r13);                                      \
+       std     r9,GPR9(r1);                                               \
+       std     r10,GPR10(r1);                                             \
+       ld      r9,area+EX_R11(r13);    /* move r11 - r13 to stackframe */ \
+       ld      r10,area+EX_R12(r13);                                      \
+       ld      r11,area+EX_R13(r13);                                      \
+       std     r9,GPR11(r1);                                              \
+       std     r10,GPR12(r1);                                             \
+       std     r11,GPR13(r1);                                             \
+       ld      r2,PACATOC(r13);        /* get kernel TOC into r2       */ \
+       mflr    r9;                     /* save LR in stackframe        */ \
+       std     r9,_LINK(r1);                                              \
+       mfctr   r10;                    /* save CTR in stackframe       */ \
+       std     r10,_CTR(r1);                                              \
+       lbz     r10,PACASOFTIRQEN(r13);                            \
+       mfspr   r11,SPRN_XER;           /* save XER in stackframe       */ \
+       std     r10,SOFTE(r1);                                             \
+       std     r11,_XER(r1);                                              \
+       li      r9,(n)+1;                                                  \
+       std     r9,_TRAP(r1);           /* set trap number              */ \
+       li      r10,0;                                                     \
+       ld      r11,exception_marker@toc(r2);                              \
+       std     r10,RESULT(r1);         /* clear regs->result           */ \
+       std     r11,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame      */
+
+/*
+ * Exception vectors.
+ */
+#define STD_EXCEPTION_PSERIES(n, label)                        \
+       . = n;                                          \
+       .globl label##_pSeries;                         \
+label##_pSeries:                                       \
+       HMT_MEDIUM;                                     \
+       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
+       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
+
+#define HSTD_EXCEPTION_PSERIES(n, label)               \
+       . = n;                                          \
+       .globl label##_pSeries;                         \
+label##_pSeries:                                       \
+       HMT_MEDIUM;                                     \
+       mtspr   SPRN_SPRG1,r20;         /* save r20 */  \
+       mfspr   r20,SPRN_HSRR0;         /* copy HSRR0 to SRR0 */ \
+       mtspr   SPRN_SRR0,r20;                          \
+       mfspr   r20,SPRN_HSRR1;         /* copy HSRR0 to SRR0 */ \
+       mtspr   SPRN_SRR1,r20;                          \
+       mfspr   r20,SPRN_SPRG1;         /* restore r20 */ \
+       mtspr   SPRN_SPRG1,r13;         /* save r13 */  \
+       EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common)
+
+
+#define MASKABLE_EXCEPTION_PSERIES(n, label)                           \
+       . = n;                                                          \
+       .globl label##_pSeries;                                         \
+label##_pSeries:                                                       \
+       HMT_MEDIUM;                                                     \
+       mtspr   SPRN_SPRG1,r13;         /* save r13 */                  \
+       mfspr   r13,SPRN_SPRG3;         /* get paca address into r13 */ \
+       std     r9,PACA_EXGEN+EX_R9(r13);       /* save r9, r10 */      \
+       std     r10,PACA_EXGEN+EX_R10(r13);                             \
+       lbz     r10,PACASOFTIRQEN(r13);                                 \
+       mfcr    r9;                                                     \
+       cmpwi   r10,0;                                                  \
+       beq     masked_interrupt;                                       \
+       mfspr   r10,SPRN_SPRG1;                                         \
+       std     r10,PACA_EXGEN+EX_R13(r13);                             \
+       std     r11,PACA_EXGEN+EX_R11(r13);                             \
+       std     r12,PACA_EXGEN+EX_R12(r13);                             \
+       clrrdi  r12,r13,32;             /* get high part of &label */   \
+       mfmsr   r10;                                                    \
+       mfspr   r11,SPRN_SRR0;          /* save SRR0 */                 \
+       LOAD_HANDLER(r12,label##_common)                                \
+       ori     r10,r10,MSR_IR|MSR_DR|MSR_RI;                           \
+       mtspr   SPRN_SRR0,r12;                                          \
+       mfspr   r12,SPRN_SRR1;          /* and SRR1 */                  \
+       mtspr   SPRN_SRR1,r10;                                          \
+       rfid;                                                           \
+       b       .       /* prevent speculative execution */
+
+#ifdef CONFIG_PPC_ISERIES
+#define DISABLE_INTS                           \
+       li      r11,0;                          \
+       stb     r11,PACASOFTIRQEN(r13);         \
+BEGIN_FW_FTR_SECTION;                          \
+       stb     r11,PACAHARDIRQEN(r13);         \
+END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES);  \
+BEGIN_FW_FTR_SECTION;                          \
+       mfmsr   r10;                            \
+       ori     r10,r10,MSR_EE;                 \
+       mtmsrd  r10,1;                          \
+END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
+
+#else
+#define DISABLE_INTS                           \
+       li      r11,0;                          \
+       stb     r11,PACASOFTIRQEN(r13);         \
+       stb     r11,PACAHARDIRQEN(r13)
+
+#endif /* CONFIG_PPC_ISERIES */
+
+#define ENABLE_INTS                            \
+       ld      r12,_MSR(r1);                   \
+       mfmsr   r11;                            \
+       rlwimi  r11,r12,0,MSR_EE;               \
+       mtmsrd  r11,1
+
+#define STD_EXCEPTION_COMMON(trap, label, hdlr)                \
+       .align  7;                                      \
+       .globl label##_common;                          \
+label##_common:                                                \
+       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
+       DISABLE_INTS;                                   \
+       bl      .save_nvgprs;                           \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
+       bl      hdlr;                                   \
+       b       .ret_from_except
+
+/*
+ * Like STD_EXCEPTION_COMMON, but for exceptions that can occur
+ * in the idle task and therefore need the special idle handling.
+ */
+#define STD_EXCEPTION_COMMON_IDLE(trap, label, hdlr)   \
+       .align  7;                                      \
+       .globl label##_common;                          \
+label##_common:                                                \
+       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
+       FINISH_NAP;                                     \
+       DISABLE_INTS;                                   \
+       bl      .save_nvgprs;                           \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
+       bl      hdlr;                                   \
+       b       .ret_from_except
+
+#define STD_EXCEPTION_COMMON_LITE(trap, label, hdlr)   \
+       .align  7;                                      \
+       .globl label##_common;                          \
+label##_common:                                                \
+       EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN);      \
+       FINISH_NAP;                                     \
+       DISABLE_INTS;                                   \
+BEGIN_FTR_SECTION                                      \
+       bl      .ppc64_runlatch_on;                     \
+END_FTR_SECTION_IFSET(CPU_FTR_CTRL)                    \
+       addi    r3,r1,STACK_FRAME_OVERHEAD;             \
+       bl      hdlr;                                   \
+       b       .ret_from_except_lite
+
+/*
+ * When the idle code in power4_idle puts the CPU into NAP mode,
+ * it has to do so in a loop, and relies on the external interrupt
+ * and decrementer interrupt entry code to get it out of the loop.
+ * It sets the _TLF_NAPPING bit in current_thread_info()->local_flags
+ * to signal that it is in the loop and needs help to get out.
+ */
+#ifdef CONFIG_PPC_970_NAP
+#define FINISH_NAP                             \
+BEGIN_FTR_SECTION                              \
+       clrrdi  r11,r1,THREAD_SHIFT;            \
+       ld      r9,TI_LOCAL_FLAGS(r11);         \
+       andi.   r10,r9,_TLF_NAPPING;            \
+       bnel    power4_fixup_nap;               \
+END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
+#else
+#define FINISH_NAP
+#endif
+
+#endif /* _ASM_POWERPC_EXCEPTION_H */
index c624915b757e0ee7d75c2bf8a3f58560b8289d53..9361cd5342cccb7a9bd825b216159d7cfe9d4b5d 100644 (file)
 
 #if defined(CONFIG_8260)
 #include <asm/mpc8260.h>
-#elif defined(CONFIG_85xx)
-#include <asm/mpc85xx.h>
 #endif
 
-#define cpm2_map(member)                                               \
-({                                                                     \
-       u32 offset = offsetof(cpm2_map_t, member);                      \
-       void *addr = ioremap (CPM_MAP_ADDR + offset,                    \
-                             sizeof( ((cpm2_map_t*)0)->member));       \
-       addr;                                                           \
-})
-
-#define cpm2_map_size(member, size)                                    \
-({                                                                     \
-       u32 offset = offsetof(cpm2_map_t, member);                      \
-       void *addr = ioremap (CPM_MAP_ADDR + offset, size);             \
-       addr;                                                           \
-})
-
-#define cpm2_unmap(addr)       iounmap(addr)
+#define cpm2_map(member) (&cpm2_immr->member)
+#define cpm2_map_size(member, size) (&cpm2_immr->member)
+#define cpm2_unmap(addr) do {} while(0)
 #endif
 
 #ifdef CONFIG_8xx
 #include <asm/8xx_immap.h>
 #include <asm/mpc8xx.h>
 
-#define immr_map(member)                                               \
-({                                                                     \
-       u32 offset = offsetof(immap_t, member);                         \
-       void *addr = ioremap (IMAP_ADDR + offset,                       \
-                             sizeof( ((immap_t*)0)->member));          \
-       addr;                                                           \
-})
-
-#define immr_map_size(member, size)                                    \
-({                                                                     \
-       u32 offset = offsetof(immap_t, member);                         \
-       void *addr = ioremap (IMAP_ADDR + offset, size);                \
-       addr;                                                           \
-})
+extern immap_t __iomem *mpc8xx_immr;
 
-#define immr_unmap(addr)               iounmap(addr)
+#define immr_map(member) (&mpc8xx_immr->member)
+#define immr_map_size(member, size) (&mpc8xx_immr->member)
+#define immr_unmap(addr) do {} while (0)
 #endif
 
 static inline int uart_baudrate(void)
diff --git a/include/asm-powerpc/highmem.h b/include/asm-powerpc/highmem.h
new file mode 100644 (file)
index 0000000..f7b21ee
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * highmem.h: virtual kernel memory mappings for high memory
+ *
+ * PowerPC version, stolen from the i386 version.
+ *
+ * Used in CONFIG_HIGHMEM systems for memory pages which
+ * are not addressable by direct kernel virtual addresses.
+ *
+ * Copyright (C) 1999 Gerhard Wichert, Siemens AG
+ *                   Gerhard.Wichert@pdb.siemens.de
+ *
+ *
+ * Redesigned the x86 32-bit VM architecture to deal with
+ * up to 16 Terrabyte physical memory. With current x86 CPUs
+ * we now support up to 64 Gigabytes physical RAM.
+ *
+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
+ */
+
+#ifndef _ASM_HIGHMEM_H
+#define _ASM_HIGHMEM_H
+
+#ifdef __KERNEL__
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <asm/kmap_types.h>
+#include <asm/tlbflush.h>
+#include <asm/page.h>
+
+/* undef for production */
+#define HIGHMEM_DEBUG 1
+
+extern pte_t *kmap_pte;
+extern pgprot_t kmap_prot;
+extern pte_t *pkmap_page_table;
+
+/*
+ * Right now we initialize only a single pte table. It can be extended
+ * easily, subsequent pte tables have to be allocated in one physical
+ * chunk of RAM.
+ */
+#define PKMAP_BASE     CONFIG_HIGHMEM_START
+#define LAST_PKMAP     (1 << PTE_SHIFT)
+#define LAST_PKMAP_MASK (LAST_PKMAP-1)
+#define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
+#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
+
+#define KMAP_FIX_BEGIN (PKMAP_BASE + 0x00400000UL)
+
+extern void *kmap_high(struct page *page);
+extern void kunmap_high(struct page *page);
+
+static inline void *kmap(struct page *page)
+{
+       might_sleep();
+       if (!PageHighMem(page))
+               return page_address(page);
+       return kmap_high(page);
+}
+
+static inline void kunmap(struct page *page)
+{
+       BUG_ON(in_interrupt());
+       if (!PageHighMem(page))
+               return;
+       kunmap_high(page);
+}
+
+/*
+ * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap
+ * gives a more generic (and caching) interface. But kmap_atomic can
+ * be used in IRQ contexts, so in some (very limited) cases we need
+ * it.
+ */
+static inline void *kmap_atomic(struct page *page, enum km_type type)
+{
+       unsigned int idx;
+       unsigned long vaddr;
+
+       /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
+       pagefault_disable();
+       if (!PageHighMem(page))
+               return page_address(page);
+
+       idx = type + KM_TYPE_NR*smp_processor_id();
+       vaddr = KMAP_FIX_BEGIN + idx * PAGE_SIZE;
+#ifdef HIGHMEM_DEBUG
+       BUG_ON(!pte_none(*(kmap_pte+idx)));
+#endif
+       set_pte_at(&init_mm, vaddr, kmap_pte+idx, mk_pte(page, kmap_prot));
+       flush_tlb_page(NULL, vaddr);
+
+       return (void*) vaddr;
+}
+
+static inline void kunmap_atomic(void *kvaddr, enum km_type type)
+{
+#ifdef HIGHMEM_DEBUG
+       unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
+       unsigned int idx = type + KM_TYPE_NR*smp_processor_id();
+
+       if (vaddr < KMAP_FIX_BEGIN) { // FIXME
+               pagefault_enable();
+               return;
+       }
+
+       BUG_ON(vaddr != KMAP_FIX_BEGIN + idx * PAGE_SIZE);
+
+       /*
+        * force other mappings to Oops if they'll try to access
+        * this pte without first remap it
+        */
+       pte_clear(&init_mm, vaddr, kmap_pte+idx);
+       flush_tlb_page(NULL, vaddr);
+#endif
+       pagefault_enable();
+}
+
+static inline struct page *kmap_atomic_to_page(void *ptr)
+{
+       unsigned long idx, vaddr = (unsigned long) ptr;
+
+       if (vaddr < KMAP_FIX_BEGIN)
+               return virt_to_page(ptr);
+
+       idx = (vaddr - KMAP_FIX_BEGIN) >> PAGE_SHIFT;
+       return pte_page(kmap_pte[idx]);
+}
+
+#define flush_cache_kmaps()    flush_cache_all()
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_HIGHMEM_H */
diff --git a/include/asm-powerpc/hydra.h b/include/asm-powerpc/hydra.h
new file mode 100644 (file)
index 0000000..1ad4eed
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ *  include/asm-ppc/hydra.h -- Mac I/O `Hydra' definitions
+ *
+ *  Copyright (C) 1997 Geert Uytterhoeven
+ *
+ *  This file is based on the following documentation:
+ *
+ *     Macintosh Technology in the Common Hardware Reference Platform
+ *     Apple Computer, Inc.
+ *
+ *     Â© Copyright 1995 Apple Computer, Inc. All rights reserved.
+ *
+ *  It's available online from http://chrp.apple.com/MacTech.pdf.
+ *  You can obtain paper copies of this book from computer bookstores or by
+ *  writing Morgan Kaufmann Publishers, Inc., 340 Pine Street, Sixth Floor, San
+ *  Francisco, CA 94104. Reference ISBN 1-55860-393-X.
+ *
+ *  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.
+ */
+
+#ifndef _ASMPPC_HYDRA_H
+#define _ASMPPC_HYDRA_H
+
+#ifdef __KERNEL__
+
+struct Hydra {
+    /* DBDMA Controller Register Space */
+    char Pad1[0x30];
+    u_int CachePD;
+    u_int IDs;
+    u_int Feature_Control;
+    char Pad2[0x7fc4];
+    /* DBDMA Channel Register Space */
+    char SCSI_DMA[0x100];
+    char Pad3[0x300];
+    char SCCA_Tx_DMA[0x100];
+    char SCCA_Rx_DMA[0x100];
+    char SCCB_Tx_DMA[0x100];
+    char SCCB_Rx_DMA[0x100];
+    char Pad4[0x7800];
+    /* Device Register Space */
+    char SCSI[0x1000];
+    char ADB[0x1000];
+    char SCC_Legacy[0x1000];
+    char SCC[0x1000];
+    char Pad9[0x2000];
+    char VIA[0x2000];
+    char Pad10[0x28000];
+    char OpenPIC[0x40000];
+};
+
+extern volatile struct Hydra __iomem *Hydra;
+
+
+    /*
+     *  Feature Control Register
+     */
+
+#define HYDRA_FC_SCC_CELL_EN   0x00000001      /* Enable SCC Clock */
+#define HYDRA_FC_SCSI_CELL_EN  0x00000002      /* Enable SCSI Clock */
+#define HYDRA_FC_SCCA_ENABLE   0x00000004      /* Enable SCC A Lines */
+#define HYDRA_FC_SCCB_ENABLE   0x00000008      /* Enable SCC B Lines */
+#define HYDRA_FC_ARB_BYPASS    0x00000010      /* Bypass Internal Arbiter */
+#define HYDRA_FC_RESET_SCC     0x00000020      /* Reset SCC */
+#define HYDRA_FC_MPIC_ENABLE   0x00000040      /* Enable OpenPIC */
+#define HYDRA_FC_SLOW_SCC_PCLK 0x00000080      /* 1=15.6672, 0=25 MHz */
+#define HYDRA_FC_MPIC_IS_MASTER        0x00000100      /* OpenPIC Master Mode */
+
+
+    /*
+     *  OpenPIC Interrupt Sources
+     */
+
+#define HYDRA_INT_SIO          0
+#define HYDRA_INT_SCSI_DMA     1
+#define HYDRA_INT_SCCA_TX_DMA  2
+#define HYDRA_INT_SCCA_RX_DMA  3
+#define HYDRA_INT_SCCB_TX_DMA  4
+#define HYDRA_INT_SCCB_RX_DMA  5
+#define HYDRA_INT_SCSI         6
+#define HYDRA_INT_SCCA         7
+#define HYDRA_INT_SCCB         8
+#define HYDRA_INT_VIA          9
+#define HYDRA_INT_ADB          10
+#define HYDRA_INT_ADB_NMI      11
+#define HYDRA_INT_EXT1         12      /* PCI IRQW */
+#define HYDRA_INT_EXT2         13      /* PCI IRQX */
+#define HYDRA_INT_EXT3         14      /* PCI IRQY */
+#define HYDRA_INT_EXT4         15      /* PCI IRQZ */
+#define HYDRA_INT_EXT5         16      /* IDE Primay/Secondary */
+#define HYDRA_INT_EXT6         17      /* IDE Secondary */
+#define HYDRA_INT_EXT7         18      /* Power Off Request */
+#define HYDRA_INT_SPARE                19
+
+extern int hydra_init(void);
+extern void macio_adb_init(void);
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASMPPC_HYDRA_H */
index 0f66f0f82c329709f1124cabc6cfd8013c6e54ae..1644e44c8757667e575ec03268d02323b62e4145 100644 (file)
@@ -67,7 +67,7 @@ static __inline__ unsigned long ide_default_io_base(int index)
 #define ide_init_default_irq(base)     ide_default_irq(base)
 #endif
 
-#if (defined CONFIG_APUS || defined CONFIG_BLK_DEV_MPC8xx_IDE )
+#ifdef CONFIG_BLK_DEV_MPC8xx_IDE
 #define IDE_ARCH_ACK_INTR  1
 #define ide_ack_intr(hwif) (hwif->hw.ack_intr ? hwif->hw.ack_intr(hwif) : 1)
 #endif
index 59b9e07b8e99fe85f81ebcc9583534477c112e62..0ad4e653d464bd48514c83bb6c263029cb88d83f 100644 (file)
-/*
+/**
  * MPC86xx Internal Memory Map
  *
- * Author: Jeff Brown
+ * Authors: Jeff Brown
+ *          Timur Tabi <timur@freescale.com>
  *
- * Copyright 2004 Freescale Semiconductor, Inc
+ * Copyright 2004,2007 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.
  *
+ * This header file defines structures for various 86xx SOC devices that are
+ * used by multiple source files.
  */
 
 #ifndef __ASM_POWERPC_IMMAP_86XX_H__
 #define __ASM_POWERPC_IMMAP_86XX_H__
 #ifdef __KERNEL__
 
-/* Eventually this should define all the IO block registers in 86xx */
+/* Global Utility Registers */
+struct ccsr_guts {
+       __be32  porpllsr;       /* 0x.0000 - POR PLL Ratio Status Register */
+       __be32  porbmsr;        /* 0x.0004 - POR Boot Mode Status Register */
+       __be32  porimpscr;      /* 0x.0008 - POR I/O Impedance Status and Control Register */
+       __be32  pordevsr;       /* 0x.000c - POR I/O Device Status Register */
+       __be32  pordbgmsr;      /* 0x.0010 - POR Debug Mode Status Register */
+       u8      res1[0x20 - 0x14];
+       __be32  porcir;         /* 0x.0020 - POR Configuration Information Register */
+       u8      res2[0x30 - 0x24];
+       __be32  gpiocr;         /* 0x.0030 - GPIO Control Register */
+       u8      res3[0x40 - 0x34];
+       __be32  gpoutdr;        /* 0x.0040 - General-Purpose Output Data Register */
+       u8      res4[0x50 - 0x44];
+       __be32  gpindr;         /* 0x.0050 - General-Purpose Input Data Register */
+       u8      res5[0x60 - 0x54];
+       __be32  pmuxcr;         /* 0x.0060 - Alternate Function Signal Multiplex Control */
+       u8      res6[0x70 - 0x64];
+       __be32  devdisr;        /* 0x.0070 - Device Disable Control */
+       __be32  devdisr2;       /* 0x.0074 - Device Disable Control 2 */
+       u8      res7[0x80 - 0x78];
+       __be32  powmgtcsr;      /* 0x.0080 - Power Management Status and Control Register */
+       u8      res8[0x90 - 0x84];
+       __be32  mcpsumr;        /* 0x.0090 - Machine Check Summary Register */
+       __be32  rstrscr;        /* 0x.0094 - Reset Request Status and Control Register */
+       u8      res9[0xA0 - 0x98];
+       __be32  pvr;            /* 0x.00a0 - Processor Version Register */
+       __be32  svr;            /* 0x.00a4 - System Version Register */
+       u8      res10[0xB0 - 0xA8];
+       __be32  rstcr;          /* 0x.00b0 - Reset Control Register */
+       u8      res11[0xC0 - 0xB4];
+       __be32  elbcvselcr;     /* 0x.00c0 - eLBC Voltage Select Ctrl Reg */
+       u8      res12[0x800 - 0xC4];
+       __be32  clkdvdr;        /* 0x.0800 - Clock Divide Register */
+       u8      res13[0x900 - 0x804];
+       __be32  ircr;           /* 0x.0900 - Infrared Control Register */
+       u8      res14[0x908 - 0x904];
+       __be32  dmacr;          /* 0x.0908 - DMA Control Register */
+       u8      res15[0x914 - 0x90C];
+       __be32  elbccr;         /* 0x.0914 - eLBC Control Register */
+       u8      res16[0xB20 - 0x918];
+       __be32  ddr1clkdr;      /* 0x.0b20 - DDR1 Clock Disable Register */
+       __be32  ddr2clkdr;      /* 0x.0b24 - DDR2 Clock Disable Register */
+       __be32  ddrclkdr;       /* 0x.0b28 - DDR Clock Disable Register */
+       u8      res17[0xE00 - 0xB2C];
+       __be32  clkocr;         /* 0x.0e00 - Clock Out Select Register */
+       u8      res18[0xE10 - 0xE04];
+       __be32  ddrdllcr;       /* 0x.0e10 - DDR DLL Control Register */
+       u8      res19[0xE20 - 0xE14];
+       __be32  lbcdllcr;       /* 0x.0e20 - LBC DLL Control Register */
+       u8      res20[0xF04 - 0xE24];
+       __be32  srds1cr0;       /* 0x.0f04 - SerDes1 Control Register 0 */
+       __be32  srds1cr1;       /* 0x.0f08 - SerDes1 Control Register 0 */
+       u8      res21[0xF40 - 0xF0C];
+       __be32  srds2cr0;       /* 0x.0f40 - SerDes1 Control Register 0 */
+       __be32  srds2cr1;       /* 0x.0f44 - SerDes1 Control Register 0 */
+} __attribute__ ((packed));
 
-/* PCI Registers */
-typedef struct ccsr_pci {
-       uint    cfg_addr;       /* 0x.000 - PCI Configuration Address Register */
-       uint    cfg_data;       /* 0x.004 - PCI Configuration Data Register */
-       uint    int_ack;        /* 0x.008 - PCI Interrupt Acknowledge Register */
-       char    res1[3060];
-       uint    potar0;         /* 0x.c00 - PCI Outbound Transaction Address Register 0 */
-       uint    potear0;        /* 0x.c04 - PCI Outbound Translation Extended Address Register 0 */
-       uint    powbar0;        /* 0x.c08 - PCI Outbound Window Base Address Register 0 */
-       char    res2[4];
-       uint    powar0;         /* 0x.c10 - PCI Outbound Window Attributes Register 0 */
-       char    res3[12];
-       uint    potar1;         /* 0x.c20 - PCI Outbound Transaction Address Register 1 */
-       uint    potear1;        /* 0x.c24 - PCI Outbound Translation Extended Address Register 1 */
-       uint    powbar1;        /* 0x.c28 - PCI Outbound Window Base Address Register 1 */
-       char    res4[4];
-       uint    powar1;         /* 0x.c30 - PCI Outbound Window Attributes Register 1 */
-       char    res5[12];
-       uint    potar2;         /* 0x.c40 - PCI Outbound Transaction Address Register 2 */
-       uint    potear2;        /* 0x.c44 - PCI Outbound Translation Extended Address Register 2 */
-       uint    powbar2;        /* 0x.c48 - PCI Outbound Window Base Address Register 2 */
-       char    res6[4];
-       uint    powar2;         /* 0x.c50 - PCI Outbound Window Attributes Register 2 */
-       char    res7[12];
-       uint    potar3;         /* 0x.c60 - PCI Outbound Transaction Address Register 3 */
-       uint    potear3;        /* 0x.c64 - PCI Outbound Translation Extended Address Register 3 */
-       uint    powbar3;        /* 0x.c68 - PCI Outbound Window Base Address Register 3 */
-       char    res8[4];
-       uint    powar3;         /* 0x.c70 - PCI Outbound Window Attributes Register 3 */
-       char    res9[12];
-       uint    potar4;         /* 0x.c80 - PCI Outbound Transaction Address Register 4 */
-       uint    potear4;        /* 0x.c84 - PCI Outbound Translation Extended Address Register 4 */
-       uint    powbar4;        /* 0x.c88 - PCI Outbound Window Base Address Register 4 */
-       char    res10[4];
-       uint    powar4;         /* 0x.c90 - PCI Outbound Window Attributes Register 4 */
-       char    res11[268];
-       uint    pitar3;         /* 0x.da0 - PCI Inbound Translation Address Register 3  */
-       char    res12[4];
-       uint    piwbar3;        /* 0x.da8 - PCI Inbound Window Base Address Register 3 */
-       uint    piwbear3;       /* 0x.dac - PCI Inbound Window Base Extended Address Register 3 */
-       uint    piwar3;         /* 0x.db0 - PCI Inbound Window Attributes Register 3 */
-       char    res13[12];
-       uint    pitar2;         /* 0x.dc0 - PCI Inbound Translation Address Register 2  */
-       char    res14[4];
-       uint    piwbar2;        /* 0x.dc8 - PCI Inbound Window Base Address Register 2 */
-       uint    piwbear2;       /* 0x.dcc - PCI Inbound Window Base Extended Address Register 2 */
-       uint    piwar2;         /* 0x.dd0 - PCI Inbound Window Attributes Register 2 */
-       char    res15[12];
-       uint    pitar1;         /* 0x.de0 - PCI Inbound Translation Address Register 1  */
-       char    res16[4];
-       uint    piwbar1;        /* 0x.de8 - PCI Inbound Window Base Address Register 1 */
-       char    res17[4];
-       uint    piwar1;         /* 0x.df0 - PCI Inbound Window Attributes Register 1 */
-       char    res18[12];
-       uint    err_dr;         /* 0x.e00 - PCI Error Detect Register */
-       uint    err_cap_dr;     /* 0x.e04 - PCI Error Capture Disable Register */
-       uint    err_en;         /* 0x.e08 - PCI Error Enable Register */
-       uint    err_attrib;     /* 0x.e0c - PCI Error Attributes Capture Register */
-       uint    err_addr;       /* 0x.e10 - PCI Error Address Capture Register */
-       uint    err_ext_addr;   /* 0x.e14 - PCI Error Extended Address Capture Register */
-       uint    err_dl;         /* 0x.e18 - PCI Error Data Low Capture Register */
-       uint    err_dh;         /* 0x.e1c - PCI Error Data High Capture Register */
-       uint    gas_timr;       /* 0x.e20 - PCI Gasket Timer Register */
-       uint    pci_timr;       /* 0x.e24 - PCI Timer Register */
-       char    res19[472];
-} ccsr_pci_t;
+#define CCSR_GUTS_DMACR_DEV_SSI        0       /* DMA controller/channel set to SSI */
+#define CCSR_GUTS_DMACR_DEV_IR 1       /* DMA controller/channel set to IR */
 
-/* Global Utility Registers */
-typedef struct ccsr_guts {
-       uint    porpllsr;       /* 0x.0000 - POR PLL Ratio Status Register */
-       uint    porbmsr;        /* 0x.0004 - POR Boot Mode Status Register */
-       uint    porimpscr;      /* 0x.0008 - POR I/O Impedance Status and Control Register */
-       uint    pordevsr;       /* 0x.000c - POR I/O Device Status Register */
-       uint    pordbgmsr;      /* 0x.0010 - POR Debug Mode Status Register */
-       char    res1[12];
-       uint    gpporcr;        /* 0x.0020 - General-Purpose POR Configuration Register */
-       char    res2[12];
-       uint    gpiocr;         /* 0x.0030 - GPIO Control Register */
-       char    res3[12];
-       uint    gpoutdr;        /* 0x.0040 - General-Purpose Output Data Register */
-       char    res4[12];
-       uint    gpindr;         /* 0x.0050 - General-Purpose Input Data Register */
-       char    res5[12];
-       uint    pmuxcr;         /* 0x.0060 - Alternate Function Signal Multiplex Control */
-       char    res6[12];
-       uint    devdisr;        /* 0x.0070 - Device Disable Control */
-       char    res7[12];
-       uint    powmgtcsr;      /* 0x.0080 - Power Management Status and Control Register */
-       char    res8[12];
-       uint    mcpsumr;        /* 0x.0090 - Machine Check Summary Register */
-       char    res9[12];
-       uint    pvr;            /* 0x.00a0 - Processor Version Register */
-       uint    svr;            /* 0x.00a4 - System Version Register */
-       char    res10[3416];
-       uint    clkocr;         /* 0x.0e00 - Clock Out Select Register */
-       char    res11[12];
-       uint    ddrdllcr;       /* 0x.0e10 - DDR DLL Control Register */
-       char    res12[12];
-       uint    lbcdllcr;       /* 0x.0e20 - LBC DLL Control Register */
-       char    res13[61916];
-} ccsr_guts_t;
+/*
+ * Set the DMACR register in the GUTS
+ *
+ * The DMACR register determines the source of initiated transfers for each
+ * channel on each DMA controller.  Rather than have a bunch of repetitive
+ * macros for the bit patterns, we just have a function that calculates
+ * them.
+ *
+ * guts: Pointer to GUTS structure
+ * co: The DMA controller (1 or 2)
+ * ch: The channel on the DMA controller (0, 1, 2, or 3)
+ * device: The device to set as the source (CCSR_GUTS_DMACR_DEV_xx)
+ */
+static inline void guts_set_dmacr(struct ccsr_guts __iomem *guts,
+       unsigned int co, unsigned int ch, unsigned int device)
+{
+       unsigned int shift = 16 + (8 * (2 - co) + 2 * (3 - ch));
+
+       clrsetbits_be32(&guts->dmacr, 3 << shift, device << shift);
+}
+
+#define CCSR_GUTS_PMUXCR_LDPSEL                0x00010000
+#define CCSR_GUTS_PMUXCR_SSI1_MASK     0x0000C000      /* Bitmask for SSI1 */
+#define CCSR_GUTS_PMUXCR_SSI1_LA       0x00000000      /* Latched address */
+#define CCSR_GUTS_PMUXCR_SSI1_HI       0x00004000      /* High impedance */
+#define CCSR_GUTS_PMUXCR_SSI1_SSI      0x00008000      /* Used for SSI1 */
+#define CCSR_GUTS_PMUXCR_SSI2_MASK     0x00003000      /* Bitmask for SSI2 */
+#define CCSR_GUTS_PMUXCR_SSI2_LA       0x00000000      /* Latched address */
+#define CCSR_GUTS_PMUXCR_SSI2_HI       0x00001000      /* High impedance */
+#define CCSR_GUTS_PMUXCR_SSI2_SSI      0x00002000      /* Used for SSI2 */
+#define CCSR_GUTS_PMUXCR_LA_22_25_LA   0x00000000      /* Latched Address */
+#define CCSR_GUTS_PMUXCR_LA_22_25_HI   0x00000400      /* High impedance */
+#define CCSR_GUTS_PMUXCR_DBGDRV                0x00000200      /* Signals not driven */
+#define CCSR_GUTS_PMUXCR_DMA2_0                0x00000008
+#define CCSR_GUTS_PMUXCR_DMA2_3                0x00000004
+#define CCSR_GUTS_PMUXCR_DMA1_0                0x00000002
+#define CCSR_GUTS_PMUXCR_DMA1_3                0x00000001
+
+#define CCSR_GUTS_CLKDVDR_PXCKEN       0x80000000
+#define CCSR_GUTS_CLKDVDR_SSICKEN      0x20000000
+#define CCSR_GUTS_CLKDVDR_PXCKINV      0x10000000
+#define CCSR_GUTS_CLKDVDR_PXCKDLY_SHIFT 25
+#define CCSR_GUTS_CLKDVDR_PXCKDLY_MASK 0x06000000
+#define CCSR_GUTS_CLKDVDR_PXCKDLY(x) \
+       (((x) & 3) << CCSR_GUTS_CLKDVDR_PXCKDLY_SHIFT)
+#define CCSR_GUTS_CLKDVDR_PXCLK_SHIFT  16
+#define CCSR_GUTS_CLKDVDR_PXCLK_MASK   0x001F0000
+#define CCSR_GUTS_CLKDVDR_PXCLK(x) (((x) & 31) << CCSR_GUTS_CLKDVDR_PXCLK_SHIFT)
+#define CCSR_GUTS_CLKDVDR_SSICLK_MASK  0x000000FF
+#define CCSR_GUTS_CLKDVDR_SSICLK(x) ((x) & CCSR_GUTS_CLKDVDR_SSICLK_MASK)
 
 #endif /* __ASM_POWERPC_IMMAP_86XX_H__ */
 #endif /* __KERNEL__ */
diff --git a/include/asm-powerpc/immap_cpm2.h b/include/asm-powerpc/immap_cpm2.h
new file mode 100644 (file)
index 0000000..4080bab
--- /dev/null
@@ -0,0 +1,650 @@
+/*
+ * CPM2 Internal Memory Map
+ * Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
+ *
+ * The Internal Memory Map for devices with CPM2 on them.  This
+ * is the superset of all CPM2 devices (8260, 8266, 8280, 8272,
+ * 8560).
+ */
+#ifdef __KERNEL__
+#ifndef __IMMAP_CPM2__
+#define __IMMAP_CPM2__
+
+#include <linux/types.h>
+
+/* System configuration registers.
+*/
+typedef        struct sys_82xx_conf {
+       u32     sc_siumcr;
+       u32     sc_sypcr;
+       u8      res1[6];
+       u16     sc_swsr;
+       u8      res2[20];
+       u32     sc_bcr;
+       u8      sc_ppc_acr;
+       u8      res3[3];
+       u32     sc_ppc_alrh;
+       u32     sc_ppc_alrl;
+       u8      sc_lcl_acr;
+       u8      res4[3];
+       u32     sc_lcl_alrh;
+       u32     sc_lcl_alrl;
+       u32     sc_tescr1;
+       u32     sc_tescr2;
+       u32     sc_ltescr1;
+       u32     sc_ltescr2;
+       u32     sc_pdtea;
+       u8      sc_pdtem;
+       u8      res5[3];
+       u32     sc_ldtea;
+       u8      sc_ldtem;
+       u8      res6[163];
+} sysconf_82xx_cpm2_t;
+
+typedef        struct sys_85xx_conf {
+       u32     sc_cear;
+       u16     sc_ceer;
+       u16     sc_cemr;
+       u8      res1[70];
+       u32     sc_smaer;
+       u8      res2[4];
+       u32     sc_smevr;
+       u32     sc_smctr;
+       u32     sc_lmaer;
+       u8      res3[4];
+       u32     sc_lmevr;
+       u32     sc_lmctr;
+       u8      res4[144];
+} sysconf_85xx_cpm2_t;
+
+typedef union sys_conf {
+       sysconf_82xx_cpm2_t     siu_82xx;
+       sysconf_85xx_cpm2_t     siu_85xx;
+} sysconf_cpm2_t;
+
+
+
+/* Memory controller registers.
+*/
+typedef struct mem_ctlr {
+       u32     memc_br0;
+       u32     memc_or0;
+       u32     memc_br1;
+       u32     memc_or1;
+       u32     memc_br2;
+       u32     memc_or2;
+       u32     memc_br3;
+       u32     memc_or3;
+       u32     memc_br4;
+       u32     memc_or4;
+       u32     memc_br5;
+       u32     memc_or5;
+       u32     memc_br6;
+       u32     memc_or6;
+       u32     memc_br7;
+       u32     memc_or7;
+       u32     memc_br8;
+       u32     memc_or8;
+       u32     memc_br9;
+       u32     memc_or9;
+       u32     memc_br10;
+       u32     memc_or10;
+       u32     memc_br11;
+       u32     memc_or11;
+       u8      res1[8];
+       u32     memc_mar;
+       u8      res2[4];
+       u32     memc_mamr;
+       u32     memc_mbmr;
+       u32     memc_mcmr;
+       u8      res3[8];
+       u16     memc_mptpr;
+       u8      res4[2];
+       u32     memc_mdr;
+       u8      res5[4];
+       u32     memc_psdmr;
+       u32     memc_lsdmr;
+       u8      memc_purt;
+       u8      res6[3];
+       u8      memc_psrt;
+       u8      res7[3];
+       u8      memc_lurt;
+       u8      res8[3];
+       u8      memc_lsrt;
+       u8      res9[3];
+       u32     memc_immr;
+       u32     memc_pcibr0;
+       u32     memc_pcibr1;
+       u8      res10[16];
+       u32     memc_pcimsk0;
+       u32     memc_pcimsk1;
+       u8      res11[52];
+} memctl_cpm2_t;
+
+/* System Integration Timers.
+*/
+typedef struct sys_int_timers {
+       u8      res1[32];
+       u16     sit_tmcntsc;
+       u8      res2[2];
+       u32     sit_tmcnt;
+       u8      res3[4];
+       u32     sit_tmcntal;
+       u8      res4[16];
+       u16     sit_piscr;
+       u8      res5[2];
+       u32     sit_pitc;
+       u32     sit_pitr;
+       u8      res6[94];
+       u8      res7[390];
+} sit_cpm2_t;
+
+#define PISCR_PIRQ_MASK                ((u16)0xff00)
+#define PISCR_PS               ((u16)0x0080)
+#define PISCR_PIE              ((u16)0x0004)
+#define PISCR_PTF              ((u16)0x0002)
+#define PISCR_PTE              ((u16)0x0001)
+
+/* PCI Controller.
+*/
+typedef struct pci_ctlr {
+       u32     pci_omisr;
+       u32     pci_omimr;
+       u8      res1[8];
+       u32     pci_ifqpr;
+       u32     pci_ofqpr;
+       u8      res2[8];
+       u32     pci_imr0;
+       u32     pci_imr1;
+       u32     pci_omr0;
+       u32     pci_omr1;
+       u32     pci_odr;
+       u8      res3[4];
+       u32     pci_idr;
+       u8      res4[20];
+       u32     pci_imisr;
+       u32     pci_imimr;
+       u8      res5[24];
+       u32     pci_ifhpr;
+       u8      res6[4];
+       u32     pci_iftpr;
+       u8      res7[4];
+       u32     pci_iphpr;
+       u8      res8[4];
+       u32     pci_iptpr;
+       u8      res9[4];
+       u32     pci_ofhpr;
+       u8      res10[4];
+       u32     pci_oftpr;
+       u8      res11[4];
+       u32     pci_ophpr;
+       u8      res12[4];
+       u32     pci_optpr;
+       u8      res13[8];
+       u32     pci_mucr;
+       u8      res14[8];
+       u32     pci_qbar;
+       u8      res15[12];
+       u32     pci_dmamr0;
+       u32     pci_dmasr0;
+       u32     pci_dmacdar0;
+       u8      res16[4];
+       u32     pci_dmasar0;
+       u8      res17[4];
+       u32     pci_dmadar0;
+       u8      res18[4];
+       u32     pci_dmabcr0;
+       u32     pci_dmandar0;
+       u8      res19[86];
+       u32     pci_dmamr1;
+       u32     pci_dmasr1;
+       u32     pci_dmacdar1;
+       u8      res20[4];
+       u32     pci_dmasar1;
+       u8      res21[4];
+       u32     pci_dmadar1;
+       u8      res22[4];
+       u32     pci_dmabcr1;
+       u32     pci_dmandar1;
+       u8      res23[88];
+       u32     pci_dmamr2;
+       u32     pci_dmasr2;
+       u32     pci_dmacdar2;
+       u8      res24[4];
+       u32     pci_dmasar2;
+       u8      res25[4];
+       u32     pci_dmadar2;
+       u8      res26[4];
+       u32     pci_dmabcr2;
+       u32     pci_dmandar2;
+       u8      res27[88];
+       u32     pci_dmamr3;
+       u32     pci_dmasr3;
+       u32     pci_dmacdar3;
+       u8      res28[4];
+       u32     pci_dmasar3;
+       u8      res29[4];
+       u32     pci_dmadar3;
+       u8      res30[4];
+       u32     pci_dmabcr3;
+       u32     pci_dmandar3;
+       u8      res31[344];
+       u32     pci_potar0;
+       u8      res32[4];
+       u32     pci_pobar0;
+       u8      res33[4];
+       u32     pci_pocmr0;
+       u8      res34[4];
+       u32     pci_potar1;
+       u8      res35[4];
+       u32     pci_pobar1;
+       u8      res36[4];
+       u32     pci_pocmr1;
+       u8      res37[4];
+       u32     pci_potar2;
+       u8      res38[4];
+       u32     pci_pobar2;
+       u8      res39[4];
+       u32     pci_pocmr2;
+       u8      res40[50];
+       u32     pci_ptcr;
+       u32     pci_gpcr;
+       u32     pci_gcr;
+       u32     pci_esr;
+       u32     pci_emr;
+       u32     pci_ecr;
+       u32     pci_eacr;
+       u8      res41[4];
+       u32     pci_edcr;
+       u8      res42[4];
+       u32     pci_eccr;
+       u8      res43[44];
+       u32     pci_pitar1;
+       u8      res44[4];
+       u32     pci_pibar1;
+       u8      res45[4];
+       u32     pci_picmr1;
+       u8      res46[4];
+       u32     pci_pitar0;
+       u8      res47[4];
+       u32     pci_pibar0;
+       u8      res48[4];
+       u32     pci_picmr0;
+       u8      res49[4];
+       u32     pci_cfg_addr;
+       u32     pci_cfg_data;
+       u32     pci_int_ack;
+       u8      res50[756];
+} pci_cpm2_t;
+
+/* Interrupt Controller.
+*/
+typedef struct interrupt_controller {
+       u16     ic_sicr;
+       u8      res1[2];
+       u32     ic_sivec;
+       u32     ic_sipnrh;
+       u32     ic_sipnrl;
+       u32     ic_siprr;
+       u32     ic_scprrh;
+       u32     ic_scprrl;
+       u32     ic_simrh;
+       u32     ic_simrl;
+       u32     ic_siexr;
+       u8      res2[88];
+} intctl_cpm2_t;
+
+/* Clocks and Reset.
+*/
+typedef struct clk_and_reset {
+       u32     car_sccr;
+       u8      res1[4];
+       u32     car_scmr;
+       u8      res2[4];
+       u32     car_rsr;
+       u32     car_rmr;
+       u8      res[104];
+} car_cpm2_t;
+
+/* Input/Output Port control/status registers.
+ * Names consistent with processor manual, although they are different
+ * from the original 8xx names.......
+ */
+typedef struct io_port {
+       u32     iop_pdira;
+       u32     iop_ppara;
+       u32     iop_psora;
+       u32     iop_podra;
+       u32     iop_pdata;
+       u8      res1[12];
+       u32     iop_pdirb;
+       u32     iop_pparb;
+       u32     iop_psorb;
+       u32     iop_podrb;
+       u32     iop_pdatb;
+       u8      res2[12];
+       u32     iop_pdirc;
+       u32     iop_pparc;
+       u32     iop_psorc;
+       u32     iop_podrc;
+       u32     iop_pdatc;
+       u8      res3[12];
+       u32     iop_pdird;
+       u32     iop_ppard;
+       u32     iop_psord;
+       u32     iop_podrd;
+       u32     iop_pdatd;
+       u8      res4[12];
+} iop_cpm2_t;
+
+/* Communication Processor Module Timers
+*/
+typedef struct cpm_timers {
+       u8      cpmt_tgcr1;
+       u8      res1[3];
+       u8      cpmt_tgcr2;
+       u8      res2[11];
+       u16     cpmt_tmr1;
+       u16     cpmt_tmr2;
+       u16     cpmt_trr1;
+       u16     cpmt_trr2;
+       u16     cpmt_tcr1;
+       u16     cpmt_tcr2;
+       u16     cpmt_tcn1;
+       u16     cpmt_tcn2;
+       u16     cpmt_tmr3;
+       u16     cpmt_tmr4;
+       u16     cpmt_trr3;
+       u16     cpmt_trr4;
+       u16     cpmt_tcr3;
+       u16     cpmt_tcr4;
+       u16     cpmt_tcn3;
+       u16     cpmt_tcn4;
+       u16     cpmt_ter1;
+       u16     cpmt_ter2;
+       u16     cpmt_ter3;
+       u16     cpmt_ter4;
+       u8      res3[584];
+} cpmtimer_cpm2_t;
+
+/* DMA control/status registers.
+*/
+typedef struct sdma_csr {
+       u8      res0[24];
+       u8      sdma_sdsr;
+       u8      res1[3];
+       u8      sdma_sdmr;
+       u8      res2[3];
+       u8      sdma_idsr1;
+       u8      res3[3];
+       u8      sdma_idmr1;
+       u8      res4[3];
+       u8      sdma_idsr2;
+       u8      res5[3];
+       u8      sdma_idmr2;
+       u8      res6[3];
+       u8      sdma_idsr3;
+       u8      res7[3];
+       u8      sdma_idmr3;
+       u8      res8[3];
+       u8      sdma_idsr4;
+       u8      res9[3];
+       u8      sdma_idmr4;
+       u8      res10[707];
+} sdma_cpm2_t;
+
+/* Fast controllers
+*/
+typedef struct fcc {
+       u32     fcc_gfmr;
+       u32     fcc_fpsmr;
+       u16     fcc_ftodr;
+       u8      res1[2];
+       u16     fcc_fdsr;
+       u8      res2[2];
+       u16     fcc_fcce;
+       u8      res3[2];
+       u16     fcc_fccm;
+       u8      res4[2];
+       u8      fcc_fccs;
+       u8      res5[3];
+       u8      fcc_ftirr_phy[4];
+} fcc_t;
+
+/* Fast controllers continued
+ */
+typedef struct fcc_c {
+       u32     fcc_firper;
+       u32     fcc_firer;
+       u32     fcc_firsr_hi;
+       u32     fcc_firsr_lo;
+       u8      fcc_gfemr;
+       u8      res1[15];
+} fcc_c_t;
+
+/* TC Layer
+ */
+typedef struct tclayer {
+       u16     tc_tcmode;
+       u16     tc_cdsmr;
+       u16     tc_tcer;
+       u16     tc_rcc;
+       u16     tc_tcmr;
+       u16     tc_fcc;
+       u16     tc_ccc;
+       u16     tc_icc;
+       u16     tc_tcc;
+       u16     tc_ecc;
+       u8      res1[12];
+} tclayer_t;
+
+
+/* I2C
+*/
+typedef struct i2c {
+       u8      i2c_i2mod;
+       u8      res1[3];
+       u8      i2c_i2add;
+       u8      res2[3];
+       u8      i2c_i2brg;
+       u8      res3[3];
+       u8      i2c_i2com;
+       u8      res4[3];
+       u8      i2c_i2cer;
+       u8      res5[3];
+       u8      i2c_i2cmr;
+       u8      res6[331];
+} i2c_cpm2_t;
+
+typedef struct scc {           /* Serial communication channels */
+       u32     scc_gsmrl;
+       u32     scc_gsmrh;
+       u16     scc_psmr;
+       u8      res1[2];
+       u16     scc_todr;
+       u16     scc_dsr;
+       u16     scc_scce;
+       u8      res2[2];
+       u16     scc_sccm;
+       u8      res3;
+       u8      scc_sccs;
+       u8      res4[8];
+} scc_t;
+
+typedef struct smc {           /* Serial management channels */
+       u8      res1[2];
+       u16     smc_smcmr;
+       u8      res2[2];
+       u8      smc_smce;
+       u8      res3[3];
+       u8      smc_smcm;
+       u8      res4[5];
+} smc_t;
+
+/* Serial Peripheral Interface.
+*/
+typedef struct spi_ctrl {
+       u16     spi_spmode;
+       u8      res1[4];
+       u8      spi_spie;
+       u8      res2[3];
+       u8      spi_spim;
+       u8      res3[2];
+       u8      spi_spcom;
+       u8      res4[82];
+} spictl_cpm2_t;
+
+/* CPM Mux.
+*/
+typedef struct cpmux {
+       u8      cmx_si1cr;
+       u8      res1;
+       u8      cmx_si2cr;
+       u8      res2;
+       u32     cmx_fcr;
+       u32     cmx_scr;
+       u8      cmx_smr;
+       u8      res3;
+       u16     cmx_uar;
+       u8      res4[16];
+} cpmux_t;
+
+/* SIRAM control
+*/
+typedef struct siram {
+       u16     si_amr;
+       u16     si_bmr;
+       u16     si_cmr;
+       u16     si_dmr;
+       u8      si_gmr;
+       u8      res1;
+       u8      si_cmdr;
+       u8      res2;
+       u8      si_str;
+       u8      res3;
+       u16     si_rsr;
+} siramctl_t;
+
+typedef struct mcc {
+       u16     mcc_mcce;
+       u8      res1[2];
+       u16     mcc_mccm;
+       u8      res2[2];
+       u8      mcc_mccf;
+       u8      res3[7];
+} mcc_t;
+
+typedef struct comm_proc {
+       u32     cp_cpcr;
+       u32     cp_rccr;
+       u8      res1[14];
+       u16     cp_rter;
+       u8      res2[2];
+       u16     cp_rtmr;
+       u16     cp_rtscr;
+       u8      res3[2];
+       u32     cp_rtsr;
+       u8      res4[12];
+} cpm_cpm2_t;
+
+/* USB Controller.
+*/
+typedef struct usb_ctlr {
+       u8      usb_usmod;
+       u8      usb_usadr;
+       u8      usb_uscom;
+       u8      res1[1];
+       u16     usb_usep1;
+       u16     usb_usep2;
+       u16     usb_usep3;
+       u16     usb_usep4;
+       u8      res2[4];
+       u16     usb_usber;
+       u8      res3[2];
+       u16     usb_usbmr;
+       u8      usb_usbs;
+       u8      res4[7];
+} usb_cpm2_t;
+
+/* ...and the whole thing wrapped up....
+*/
+
+typedef struct immap {
+       /* Some references are into the unique and known dpram spaces,
+        * others are from the generic base.
+        */
+#define im_dprambase   im_dpram1
+       u8              im_dpram1[16*1024];
+       u8              res1[16*1024];
+       u8              im_dpram2[4*1024];
+       u8              res2[8*1024];
+       u8              im_dpram3[4*1024];
+       u8              res3[16*1024];
+
+       sysconf_cpm2_t  im_siu_conf;    /* SIU Configuration */
+       memctl_cpm2_t   im_memctl;      /* Memory Controller */
+       sit_cpm2_t      im_sit;         /* System Integration Timers */
+       pci_cpm2_t      im_pci;         /* PCI Controller */
+       intctl_cpm2_t   im_intctl;      /* Interrupt Controller */
+       car_cpm2_t      im_clkrst;      /* Clocks and reset */
+       iop_cpm2_t      im_ioport;      /* IO Port control/status */
+       cpmtimer_cpm2_t im_cpmtimer;    /* CPM timers */
+       sdma_cpm2_t     im_sdma;        /* SDMA control/status */
+
+       fcc_t           im_fcc[3];      /* Three FCCs */
+       u8              res4z[32];
+       fcc_c_t         im_fcc_c[3];    /* Continued FCCs */
+
+       u8              res4[32];
+
+       tclayer_t       im_tclayer[8];  /* Eight TCLayers */
+       u16             tc_tcgsr;
+       u16             tc_tcger;
+
+       /* First set of baud rate generators.
+       */
+       u8              res[236];
+       u32             im_brgc5;
+       u32             im_brgc6;
+       u32             im_brgc7;
+       u32             im_brgc8;
+
+       u8              res5[608];
+
+       i2c_cpm2_t      im_i2c;         /* I2C control/status */
+       cpm_cpm2_t      im_cpm;         /* Communication processor */
+
+       /* Second set of baud rate generators.
+       */
+       u32             im_brgc1;
+       u32             im_brgc2;
+       u32             im_brgc3;
+       u32             im_brgc4;
+
+       scc_t           im_scc[4];      /* Four SCCs */
+       smc_t           im_smc[2];      /* Couple of SMCs */
+       spictl_cpm2_t   im_spi;         /* A SPI */
+       cpmux_t         im_cpmux;       /* CPM clock route mux */
+       siramctl_t      im_siramctl1;   /* First SI RAM Control */
+       mcc_t           im_mcc1;        /* First MCC */
+       siramctl_t      im_siramctl2;   /* Second SI RAM Control */
+       mcc_t           im_mcc2;        /* Second MCC */
+       usb_cpm2_t      im_usb;         /* USB Controller */
+
+       u8              res6[1153];
+
+       u16             im_si1txram[256];
+       u8              res7[512];
+       u16             im_si1rxram[256];
+       u8              res8[512];
+       u16             im_si2txram[256];
+       u8              res9[512];
+       u16             im_si2rxram[256];
+       u8              res10[512];
+       u8              res11[4096];
+} cpm2_map_t;
+
+extern cpm2_map_t __iomem *cpm2_immr;
+
+#endif /* __IMMAP_CPM2__ */
+#endif /* __KERNEL__ */
index 1020b7fc0129b021eaf1b2f08cc13174b838c439..aba9806b31c9f7faa879cb4547821b48bf15289f 100644 (file)
@@ -86,8 +86,9 @@ struct cp_qe {
        __be16  ceexe4;         /* QE external request 4 event register */
        u8      res11[0x2];
        __be16  ceexm4;         /* QE external request 4 mask register */
-       u8      res12[0x2];
-       u8      res13[0x280];
+       u8      res12[0x3A];
+       __be32  ceurnr;         /* QE microcode revision number register */
+       u8      res13[0x244];
 } __attribute__ ((packed));
 
 /* QE Multiplexer */
@@ -96,10 +97,7 @@ struct qe_mux {
        __be32  cmxsi1cr_l;     /* CMX SI1 clock route low register */
        __be32  cmxsi1cr_h;     /* CMX SI1 clock route high register */
        __be32  cmxsi1syr;      /* CMX SI1 SYNC route register */
-       __be32  cmxucr1;        /* CMX UCC1, UCC3 clock route register */
-       __be32  cmxucr2;        /* CMX UCC5, UCC7 clock route register */
-       __be32  cmxucr3;        /* CMX UCC2, UCC4 clock route register */
-       __be32  cmxucr4;        /* CMX UCC6, UCC8 clock route register */
+       __be32  cmxucr[4];      /* CMX UCCx clock route registers */
        __be32  cmxupcr;        /* CMX UPC clock route register */
        u8      res0[0x1C];
 } __attribute__ ((packed));
@@ -260,7 +258,6 @@ struct ucc_slow {
        __be16  utpt;
        u8      res4[0x52];
        u8      guemr;          /* UCC general extended mode register */
-       u8      res5[0x200 - 0x091];
 } __attribute__ ((packed));
 
 /* QE UCC Fast */
@@ -293,21 +290,13 @@ struct ucc_fast {
        __be32  urtry;          /* UCC retry counter register */
        u8      res8[0x4C];
        u8      guemr;          /* UCC general extended mode register */
-       u8      res9[0x100 - 0x091];
-} __attribute__ ((packed));
-
-/* QE UCC */
-struct ucc_common {
-       u8      res1[0x90];
-       u8      guemr;
-       u8      res2[0x200 - 0x091];
 } __attribute__ ((packed));
 
 struct ucc {
        union {
                struct  ucc_slow slow;
                struct  ucc_fast fast;
-               struct  ucc_common common;
+               u8      res[0x200];     /* UCC blocks are 512 bytes each */
        };
 } __attribute__ ((packed));
 
@@ -406,7 +395,7 @@ struct dbg {
 
 /* RISC Special Registers (Trap and Breakpoint) */
 struct rsp {
-       u8      fixme[0x100];
+       u32     reg[0x40];      /* 64 32-bit registers */
 } __attribute__ ((packed));
 
 struct qe_immap {
@@ -435,11 +424,13 @@ struct qe_immap {
        u8                      res13[0x600];
        struct upc              upc2;           /* MultiPHY UTOPIA POS Ctrlr 2*/
        struct sdma             sdma;           /* SDMA */
-       struct dbg              dbg;            /* Debug Space */
-       struct rsp              rsp[0x2];       /* RISC Special Registers
+       struct dbg              dbg;            /* 0x104080 - 0x1040FF
+                                                  Debug Space */
+       struct rsp              rsp[0x2];       /* 0x104100 - 0x1042FF
+                                                  RISC Special Registers
                                                   (Trap and Breakpoint) */
-       u8                      res14[0x300];
-       u8                      res15[0x3A00];
+       u8                      res14[0x300];   /* 0x104300 - 0x1045FF */
+       u8                      res15[0x3A00];  /* 0x104600 - 0x107FFF */
        u8                      res16[0x8000];  /* 0x108000 - 0x110000 */
        u8                      muram[0xC000];  /* 0x110000 - 0x11C000
                                                   Multi-user RAM */
@@ -450,7 +441,7 @@ struct qe_immap {
 extern struct qe_immap *qe_immr;
 extern phys_addr_t get_qe_base(void);
 
-static inline unsigned long immrbar_virt_to_phys(volatile void * address)
+static inline unsigned long immrbar_virt_to_phys(void *address)
 {
        if ( ((u32)address >= (u32)qe_immr) &&
                        ((u32)address < ((u32)qe_immr + QE_IMMAP_SIZE)) )
index bb8d965f96c6bc42969c51009fe38ba7f12b371d..affba7052fb6dc935cc9fa41594306b9dcf13f0a 100644 (file)
@@ -86,7 +86,7 @@ extern unsigned long pci_dram_offset;
  */
 
 #ifdef CONFIG_PPC64
-#define IO_SET_SYNC_FLAG()     do { get_paca()->io_sync = 1; } while(0)
+#define IO_SET_SYNC_FLAG()     do { local_paca->io_sync = 1; } while(0)
 #else
 #define IO_SET_SYNC_FLAG()
 #endif
@@ -734,6 +734,32 @@ static inline void * bus_to_virt(unsigned long address)
 #define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) |  (_v))
 #define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
 
+#define setbits8(_addr, _v) out_8((_addr), in_8(_addr) |  (_v))
+#define clrbits8(_addr, _v) out_8((_addr), in_8(_addr) & ~(_v))
+
+/* Clear and set bits in one shot.  These macros can be used to clear and
+ * set multiple bits in a register using a single read-modify-write.  These
+ * macros can also be used to set a multiple-bit bit pattern using a mask,
+ * by specifying the mask in the 'clear' parameter and the new bit pattern
+ * in the 'set' parameter.
+ */
+
+#define clrsetbits(type, addr, clear, set) \
+       out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
+
+#ifdef __powerpc64__
+#define clrsetbits_be64(addr, clear, set) clrsetbits(be64, addr, clear, set)
+#define clrsetbits_le64(addr, clear, set) clrsetbits(le64, addr, clear, set)
+#endif
+
+#define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
+#define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
+
+#define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
+#define clrsetbits_le16(addr, clear, set) clrsetbits(le32, addr, clear, set)
+
+#define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
+
 #endif /* __KERNEL__ */
 
 #endif /* _ASM_POWERPC_IO_H */
index 0485c53db2b5dc64273ba5661918710c686a61e6..1392db45652359226c0bf9958063350afc730792 100644 (file)
@@ -124,6 +124,9 @@ struct irq_host {
        struct irq_host_ops     *ops;
        void                    *host_data;
        irq_hw_number_t         inval_irq;
+
+       /* Optional device node pointer */
+       struct device_node      *of_node;
 };
 
 /* The main irq map itself is an array of NR_IRQ entries containing the
@@ -142,7 +145,7 @@ extern irq_hw_number_t virq_to_hw(unsigned int virq);
 
 /**
  * irq_alloc_host - Allocate a new irq_host data structure
- * @node: device-tree node of the interrupt controller
+ * @of_node: optional device-tree node of the interrupt controller
  * @revmap_type: type of reverse mapping to use
  * @revmap_arg: for IRQ_HOST_MAP_LINEAR linear only: size of the map
  * @ops: map/unmap host callbacks
@@ -156,7 +159,8 @@ extern irq_hw_number_t virq_to_hw(unsigned int virq);
  * later during boot automatically (the reverse mapping will use the slow path
  * until that happens).
  */
-extern struct irq_host *irq_alloc_host(unsigned int revmap_type,
+extern struct irq_host *irq_alloc_host(struct device_node *of_node,
+                                      unsigned int revmap_type,
                                       unsigned int revmap_arg,
                                       struct irq_host_ops *ops,
                                       irq_hw_number_t inval_irq);
index 4cec4762076dffa99ce78ddc86401f2721af0ede..cc029d388e11a6bf3f5f1eda0bf53c91b0925c18 100644 (file)
@@ -21,6 +21,9 @@
 #ifndef _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H
 #define _ASM_POWERPC_ISERIES_HV_CALL_EVENT_H
 
+#include <linux/types.h>
+#include <linux/dma-mapping.h>
+
 #include <asm/iseries/hv_call_sc.h>
 #include <asm/iseries/hv_types.h>
 #include <asm/abs_addr.h>
@@ -113,6 +116,13 @@ static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
                        eventData3, eventData4, eventData5);
 }
 
+extern void *iseries_hv_alloc(size_t size, dma_addr_t *dma_handle, gfp_t flag);
+extern void iseries_hv_free(size_t size, void *vaddr, dma_addr_t dma_handle);
+extern dma_addr_t iseries_hv_map(void *vaddr, size_t size,
+                       enum dma_data_direction direction);
+extern void iseries_hv_unmap(dma_addr_t dma_handle, size_t size,
+                       enum dma_data_direction direction);
+
 static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event)
 {
        return HvCall1(HvCallEventAckLpEvent, virt_to_abs(event));
index 6e323a13ac3031e760295b7583bb3dec24097a40..c59ee7e4bed117d7cf7fd960d8b56fffcbeef6ef 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 struct pci_dev;
+struct vio_dev;
 struct device_node;
 struct iommu_table;
 
@@ -34,4 +35,7 @@ extern void iommu_table_getparms_iSeries(unsigned long busno,
                unsigned char slotno, unsigned char virtbus,
                struct iommu_table *tbl);
 
+extern struct iommu_table *vio_build_iommu_table_iseries(struct vio_dev *dev);
+extern void iommu_vio_init(void);
+
 #endif /* _ASM_POWERPC_ISERIES_IOMMU_H */
index 2ec384d66abb90578e897df9b0fd42f8cc5c058e..5e9f3e128ee261a7e25b79a06c67118a37bb26ec 100644 (file)
@@ -22,6 +22,8 @@
 
 #include <asm/types.h>
 
+#endif
+
 /*
  * The iSeries hypervisor will set up mapping for one or more
  * ESID/VSID pairs (in SLB/segment registers) and will set up
@@ -56,6 +58,7 @@
 /* Hypervisor initially maps 32MB of the load area */
 #define HvPagesToMap   8192
 
+#ifndef __ASSEMBLY__
 struct LparMap {
        u64     xNumberEsids;   // Number of ESID/VSID pairs
        u64     xNumberRanges;  // Number of VA ranges to map
index 7a95d296abd12201a0e75dff0d228c14a2770bbc..f9ac0d00b9517de34216580b741dc2013592f5f2 100644 (file)
  */
 #define VIO_MAX_SUBTYPES 8
 
+#define VIOMAXBLOCKDMA 12
+
+struct open_data {
+       u64     disk_size;
+       u16     max_disk;
+       u16     cylinders;
+       u16     tracks;
+       u16     sectors;
+       u16     bytes_per_sector;
+};
+
+struct rw_data {
+       u64     offset;
+       struct {
+               u32     token;
+               u32     reserved;
+               u64     len;
+       } dma_info[VIOMAXBLOCKDMA];
+};
+
+struct vioblocklpevent {
+       struct HvLpEvent        event;
+       u32                     reserved;
+       u16                     version;
+       u16                     sub_result;
+       u16                     disk;
+       u16                     flags;
+       union {
+               struct open_data        open_data;
+               struct rw_data          rw_data;
+               u64                     changed;
+       } u;
+};
+
+#define vioblockflags_ro   0x0001
+
+enum vioblocksubtype {
+       vioblockopen = 0x0001,
+       vioblockclose = 0x0002,
+       vioblockread = 0x0003,
+       vioblockwrite = 0x0004,
+       vioblockflush = 0x0005,
+       vioblockcheck = 0x0007
+};
+
+struct viocdlpevent {
+       struct HvLpEvent        event;
+       u32                     reserved;
+       u16                     version;
+       u16                     sub_result;
+       u16                     disk;
+       u16                     flags;
+       u32                     token;
+       u64                     offset;         /* On open, max number of disks */
+       u64                     len;            /* On open, size of the disk */
+       u32                     block_size;     /* Only set on open */
+       u32                     media_size;     /* Only set on open */
+};
+
+enum viocdsubtype {
+       viocdopen = 0x0001,
+       viocdclose = 0x0002,
+       viocdread = 0x0003,
+       viocdwrite = 0x0004,
+       viocdlockdoor = 0x0005,
+       viocdgetinfo = 0x0006,
+       viocdcheck = 0x0007
+};
+
+struct viotapelpevent {
+       struct HvLpEvent event;
+       u32 reserved;
+       u16 version;
+       u16 sub_type_result;
+       u16 tape;
+       u16 flags;
+       u32 token;
+       u64 len;
+       union {
+               struct {
+                       u32 tape_op;
+                       u32 count;
+               } op;
+               struct {
+                       u32 type;
+                       u32 resid;
+                       u32 dsreg;
+                       u32 gstat;
+                       u32 erreg;
+                       u32 file_no;
+                       u32 block_no;
+               } get_status;
+               struct {
+                       u32 block_no;
+               } get_pos;
+       } u;
+};
+
+enum viotapesubtype {
+       viotapeopen = 0x0001,
+       viotapeclose = 0x0002,
+       viotaperead = 0x0003,
+       viotapewrite = 0x0004,
+       viotapegetinfo = 0x0005,
+       viotapeop = 0x0006,
+       viotapegetpos = 0x0007,
+       viotapesetpos = 0x0008,
+       viotapegetstatus = 0x0009
+};
+
 /*
  * Each subtype can register a handler to process their events.
  * The handler must have this interface.
@@ -68,6 +178,8 @@ extern void vio_set_hostlp(void);
 extern void *vio_get_event_buffer(int subtype);
 extern void vio_free_event_buffer(int subtype, void *buffer);
 
+extern struct vio_dev *vio_create_viodasd(u32 unit);
+
 extern HvLpIndex viopath_hostLp;
 extern HvLpIndex viopath_ourLp;
 
@@ -150,8 +262,4 @@ enum viochar_rc {
        viochar_rc_ebusy = 1
 };
 
-struct device;
-
-extern struct device *iSeries_vio_dev;
-
 #endif /* _ASM_POWERPC_ISERIES_VIO_H */
diff --git a/include/asm-powerpc/kgdb.h b/include/asm-powerpc/kgdb.h
new file mode 100644 (file)
index 0000000..b617dac
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * kgdb.h: Defines and declarations for serial line source level
+ *         remote debugging of the Linux kernel using gdb.
+ *
+ * PPC Mods (C) 1998 Michael Tesch (tesch@cs.wisc.edu)
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ */
+#ifdef __KERNEL__
+#ifndef _PPC_KGDB_H
+#define _PPC_KGDB_H
+
+#ifndef __ASSEMBLY__
+
+/* Things specific to the gen550 backend. */
+struct uart_port;
+
+extern void gen550_progress(char *, unsigned short);
+extern void gen550_kgdb_map_scc(void);
+extern void gen550_init(int, struct uart_port *);
+
+/* Things specific to the pmac backend. */
+extern void zs_kgdb_hook(int tty_num);
+
+/* To init the kgdb engine. (called by serial hook)*/
+extern void set_debug_traps(void);
+
+/* To enter the debugger explicitly. */
+extern void breakpoint(void);
+
+/* For taking exceptions
+ * these are defined in traps.c
+ */
+extern int (*debugger)(struct pt_regs *regs);
+extern int (*debugger_bpt)(struct pt_regs *regs);
+extern int (*debugger_sstep)(struct pt_regs *regs);
+extern int (*debugger_iabr_match)(struct pt_regs *regs);
+extern int (*debugger_dabr_match)(struct pt_regs *regs);
+extern void (*debugger_fault_handler)(struct pt_regs *regs);
+
+/* What we bring to the party */
+int kgdb_bpt(struct pt_regs *regs);
+int kgdb_sstep(struct pt_regs *regs);
+void kgdb(struct pt_regs *regs);
+int kgdb_iabr_match(struct pt_regs *regs);
+int kgdb_dabr_match(struct pt_regs *regs);
+
+/*
+ * external low-level support routines (ie macserial.c)
+ */
+extern void kgdb_interruptible(int); /* control interrupts from serial */
+extern void putDebugChar(char);   /* write a single character      */
+extern char getDebugChar(void);   /* read and return a single char */
+
+#endif /* !(__ASSEMBLY__) */
+#endif /* !(_PPC_KGDB_H) */
+#endif /* __KERNEL__ */
index 0c5880f702254338d0dee571b17a64a5fdbe99c4..b5f9f4c9c2940e0f2b1ac4b4a9e200e6f9810c5a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef _PPC64_LMB_H
-#define _PPC64_LMB_H
+#ifndef _ASM_POWERPC_LMB_H
+#define _ASM_POWERPC_LMB_H
 #ifdef __KERNEL__
 
 /*
@@ -77,4 +77,4 @@ lmb_end_pfn(struct lmb_region *type, unsigned long region_nr)
 }
 
 #endif /* __KERNEL__ */
-#endif /* _PPC64_LMB_H */
+#endif /* _ASM_POWERPC_LMB_H */
index 71c6e7eb2a266798d56e3c6676d528fa1fa8be3f..6968f4300dca56e058fb8fd6cdb032630b53c3be 100644 (file)
@@ -51,22 +51,22 @@ struct machdep_calls {
 #ifdef CONFIG_PPC64
        void            (*hpte_invalidate)(unsigned long slot,
                                           unsigned long va,
-                                          int psize,
+                                          int psize, int ssize,
                                           int local);
        long            (*hpte_updatepp)(unsigned long slot, 
                                         unsigned long newpp, 
                                         unsigned long va,
-                                        int pize,
+                                        int psize, int ssize,
                                         int local);
        void            (*hpte_updateboltedpp)(unsigned long newpp, 
                                               unsigned long ea,
-                                              int psize);
+                                              int psize, int ssize);
        long            (*hpte_insert)(unsigned long hpte_group,
                                       unsigned long va,
                                       unsigned long prpn,
                                       unsigned long rflags,
                                       unsigned long vflags,
-                                      int psize);
+                                      int psize, int ssize);
        long            (*hpte_remove)(unsigned long hpte_group);
        void            (*flush_hash_range)(unsigned long number, int local);
 
@@ -99,7 +99,7 @@ struct machdep_calls {
 #endif /* CONFIG_PPC64 */
 
        int             (*probe)(void);
-       void            (*setup_arch)(void);
+       void            (*setup_arch)(void); /* Optional, may be NULL */
        void            (*init_early)(void);
        /* Optional, may be NULL. */
        void            (*show_cpuinfo)(struct seq_file *m);
diff --git a/include/asm-powerpc/mmu-40x.h b/include/asm-powerpc/mmu-40x.h
new file mode 100644 (file)
index 0000000..7d37f77
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef _ASM_POWERPC_MMU_40X_H_
+#define _ASM_POWERPC_MMU_40X_H_
+
+/*
+ * PPC40x support
+ */
+
+#define PPC40X_TLB_SIZE 64
+
+/*
+ * TLB entries are defined by a "high" tag portion and a "low" data
+ * portion.  On all architectures, the data portion is 32-bits.
+ *
+ * TLB entries are managed entirely under software control by reading,
+ * writing, and searchoing using the 4xx-specific tlbre, tlbwr, and tlbsx
+ * instructions.
+ */
+
+#define        TLB_LO          1
+#define        TLB_HI          0
+
+#define        TLB_DATA        TLB_LO
+#define        TLB_TAG         TLB_HI
+
+/* Tag portion */
+
+#define TLB_EPN_MASK    0xFFFFFC00      /* Effective Page Number */
+#define TLB_PAGESZ_MASK 0x00000380
+#define TLB_PAGESZ(x)   (((x) & 0x7) << 7)
+#define   PAGESZ_1K            0
+#define   PAGESZ_4K             1
+#define   PAGESZ_16K            2
+#define   PAGESZ_64K            3
+#define   PAGESZ_256K           4
+#define   PAGESZ_1M             5
+#define   PAGESZ_4M             6
+#define   PAGESZ_16M            7
+#define TLB_VALID       0x00000040      /* Entry is valid */
+
+/* Data portion */
+
+#define TLB_RPN_MASK    0xFFFFFC00      /* Real Page Number */
+#define TLB_PERM_MASK   0x00000300
+#define TLB_EX          0x00000200      /* Instruction execution allowed */
+#define TLB_WR          0x00000100      /* Writes permitted */
+#define TLB_ZSEL_MASK   0x000000F0
+#define TLB_ZSEL(x)     (((x) & 0xF) << 4)
+#define TLB_ATTR_MASK   0x0000000F
+#define TLB_W           0x00000008      /* Caching is write-through */
+#define TLB_I           0x00000004      /* Caching is inhibited */
+#define TLB_M           0x00000002      /* Memory is coherent */
+#define TLB_G           0x00000001      /* Memory is guarded from prefetch */
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned long phys_addr_t;
+
+typedef struct {
+       unsigned long id;
+       unsigned long vdso_base;
+} mm_context_t;
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* _ASM_POWERPC_MMU_40X_H_ */
index 3112ad14ad9504b699f6c4e65cc41d4a76dc332d..82328dec2b527d2ecdd05b0694ca2d8562c0558d 100644 (file)
@@ -47,6 +47,8 @@ extern char initial_stab[];
 
 /* Bits in the SLB VSID word */
 #define SLB_VSID_SHIFT         12
+#define SLB_VSID_SHIFT_1T      24
+#define SLB_VSID_SSIZE_SHIFT   62
 #define SLB_VSID_B             ASM_CONST(0xc000000000000000)
 #define SLB_VSID_B_256M                ASM_CONST(0x0000000000000000)
 #define SLB_VSID_B_1T          ASM_CONST(0x4000000000000000)
@@ -66,6 +68,7 @@ extern char initial_stab[];
 #define SLB_VSID_USER          (SLB_VSID_KP|SLB_VSID_KS|SLB_VSID_C)
 
 #define SLBIE_C                        (0x08000000)
+#define SLBIE_SSIZE_SHIFT      25
 
 /*
  * Hash table
@@ -77,7 +80,7 @@ extern char initial_stab[];
 #define HPTE_V_AVPN_SHIFT      7
 #define HPTE_V_AVPN            ASM_CONST(0x3fffffffffffff80)
 #define HPTE_V_AVPN_VAL(x)     (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
-#define HPTE_V_COMPARE(x,y)    (!(((x) ^ (y)) & HPTE_V_AVPN))
+#define HPTE_V_COMPARE(x,y)    (!(((x) ^ (y)) & 0xffffffffffffff80))
 #define HPTE_V_BOLTED          ASM_CONST(0x0000000000000010)
 #define HPTE_V_LOCK            ASM_CONST(0x0000000000000008)
 #define HPTE_V_LARGE           ASM_CONST(0x0000000000000004)
@@ -164,16 +167,19 @@ struct mmu_psize_def
 #define MMU_SEGSIZE_256M       0
 #define MMU_SEGSIZE_1T         1
 
+
 #ifndef __ASSEMBLY__
 
 /*
- * The current system page sizes
+ * The current system page and segment sizes
  */
 extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
 extern int mmu_linear_psize;
 extern int mmu_virtual_psize;
 extern int mmu_vmalloc_psize;
 extern int mmu_io_psize;
+extern int mmu_kernel_ssize;
+extern int mmu_highuser_ssize;
 
 /*
  * If the processor supports 64k normal pages but not 64k cache
@@ -195,13 +201,15 @@ extern int mmu_huge_psize;
  * This function sets the AVPN and L fields of the HPTE  appropriately
  * for the page size
  */
-static inline unsigned long hpte_encode_v(unsigned long va, int psize)
+static inline unsigned long hpte_encode_v(unsigned long va, int psize,
+                                         int ssize)
 {
-       unsigned long v =
+       unsigned long v;
        v = (va >> 23) & ~(mmu_psize_defs[psize].avpnm);
        v <<= HPTE_V_AVPN_SHIFT;
        if (psize != MMU_PAGE_4K)
                v |= HPTE_V_LARGE;
+       v |= ((unsigned long) ssize) << HPTE_V_SSIZE_SHIFT;
        return v;
 }
 
@@ -226,20 +234,40 @@ static inline unsigned long hpte_encode_r(unsigned long pa, int psize)
 }
 
 /*
- * This hashes a virtual address for a 256Mb segment only for now
+ * Build a VA given VSID, EA and segment size
  */
+static inline unsigned long hpt_va(unsigned long ea, unsigned long vsid,
+                                  int ssize)
+{
+       if (ssize == MMU_SEGSIZE_256M)
+               return (vsid << 28) | (ea & 0xfffffffUL);
+       return (vsid << 40) | (ea & 0xffffffffffUL);
+}
 
-static inline unsigned long hpt_hash(unsigned long va, unsigned int shift)
+/*
+ * This hashes a virtual address
+ */
+
+static inline unsigned long hpt_hash(unsigned long va, unsigned int shift,
+                                    int ssize)
 {
-       return ((va >> 28) & 0x7fffffffffUL) ^ ((va & 0x0fffffffUL) >> shift);
+       unsigned long hash, vsid;
+
+       if (ssize == MMU_SEGSIZE_256M) {
+               hash = (va >> 28) ^ ((va & 0x0fffffffUL) >> shift);
+       } else {
+               vsid = va >> 40;
+               hash = vsid ^ (vsid << 25) ^ ((va & 0xffffffffffUL) >> shift);
+       }
+       return hash & 0x7fffffffffUL;
 }
 
 extern int __hash_page_4K(unsigned long ea, unsigned long access,
                          unsigned long vsid, pte_t *ptep, unsigned long trap,
-                         unsigned int local);
+                         unsigned int local, int ssize);
 extern int __hash_page_64K(unsigned long ea, unsigned long access,
                           unsigned long vsid, pte_t *ptep, unsigned long trap,
-                          unsigned int local);
+                          unsigned int local, int ssize);
 struct mm_struct;
 extern int hash_page(unsigned long ea, unsigned long access, unsigned long trap);
 extern int hash_huge_page(struct mm_struct *mm, unsigned long access,
@@ -248,7 +276,7 @@ extern int hash_huge_page(struct mm_struct *mm, unsigned long access,
 
 extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
                             unsigned long pstart, unsigned long mode,
-                            int psize);
+                            int psize, int ssize);
 
 extern void htab_initialize(void);
 extern void htab_initialize_secondary(void);
@@ -256,6 +284,7 @@ extern void hpte_init_native(void);
 extern void hpte_init_lpar(void);
 extern void hpte_init_iSeries(void);
 extern void hpte_init_beat(void);
+extern void hpte_init_beat_v3(void);
 
 extern void stabs_alloc(void);
 extern void slb_initialize(void);
@@ -316,12 +345,17 @@ extern void slb_vmalloc_update(void);
  * which are used by the iSeries firmware.
  */
 
-#define VSID_MULTIPLIER        ASM_CONST(200730139)    /* 28-bit prime */
-#define VSID_BITS      36
-#define VSID_MODULUS   ((1UL<<VSID_BITS)-1)
+#define VSID_MULTIPLIER_256M   ASM_CONST(200730139)    /* 28-bit prime */
+#define VSID_BITS_256M         36
+#define VSID_MODULUS_256M      ((1UL<<VSID_BITS_256M)-1)
 
-#define CONTEXT_BITS   19
-#define USER_ESID_BITS 16
+#define VSID_MULTIPLIER_1T     ASM_CONST(12538073)     /* 24-bit prime */
+#define VSID_BITS_1T           24
+#define VSID_MODULUS_1T                ((1UL<<VSID_BITS_1T)-1)
+
+#define CONTEXT_BITS           19
+#define USER_ESID_BITS         16
+#define USER_ESID_BITS_1T      4
 
 #define USER_VSID_RANGE        (1UL << (USER_ESID_BITS + SID_SHIFT))
 
@@ -335,17 +369,17 @@ extern void slb_vmalloc_update(void);
  *     rx = scratch register (clobbered)
  *
  *     - rt and rx must be different registers
- *     - The answer will end up in the low 36 bits of rt.  The higher
+ *     - The answer will end up in the low VSID_BITS bits of rt.  The higher
  *       bits may contain other garbage, so you may need to mask the
  *       result.
  */
-#define ASM_VSID_SCRAMBLE(rt, rx)      \
-       lis     rx,VSID_MULTIPLIER@h;                                   \
-       ori     rx,rx,VSID_MULTIPLIER@l;                                \
+#define ASM_VSID_SCRAMBLE(rt, rx, size)                                        \
+       lis     rx,VSID_MULTIPLIER_##size@h;                            \
+       ori     rx,rx,VSID_MULTIPLIER_##size@l;                         \
        mulld   rt,rt,rx;               /* rt = rt * MULTIPLIER */      \
                                                                        \
-       srdi    rx,rt,VSID_BITS;                                        \
-       clrldi  rt,rt,(64-VSID_BITS);                                   \
+       srdi    rx,rt,VSID_BITS_##size;                                 \
+       clrldi  rt,rt,(64-VSID_BITS_##size);                            \
        add     rt,rt,rx;               /* add high and low bits */     \
        /* Now, r3 == VSID (mod 2^36-1), and lies between 0 and         \
         * 2^36-1+2^28-1.  That in particular means that if r3 >=       \
@@ -354,7 +388,7 @@ extern void slb_vmalloc_update(void);
         * doesn't, the answer is the low 36 bits of r3+1.  So in all   \
         * cases the answer is the low 36 bits of (r3 + ((r3+1) >> 36))*/\
        addi    rx,rt,1;                                                \
-       srdi    rx,rx,VSID_BITS;        /* extract 2^36 bit */          \
+       srdi    rx,rx,VSID_BITS_##size; /* extract 2^VSID_BITS bit */   \
        add     rt,rt,rx
 
 
@@ -376,37 +410,60 @@ typedef struct {
 } mm_context_t;
 
 
-static inline unsigned long vsid_scramble(unsigned long protovsid)
-{
 #if 0
-       /* The code below is equivalent to this function for arguments
-        * < 2^VSID_BITS, which is all this should ever be called
-        * with.  However gcc is not clever enough to compute the
-        * modulus (2^n-1) without a second multiply. */
-       return ((protovsid * VSID_MULTIPLIER) % VSID_MODULUS);
-#else /* 1 */
-       unsigned long x;
+/*
+ * The code below is equivalent to this function for arguments
+ * < 2^VSID_BITS, which is all this should ever be called
+ * with.  However gcc is not clever enough to compute the
+ * modulus (2^n-1) without a second multiply.
+ */
+#define vsid_scrample(protovsid, size) \
+       ((((protovsid) * VSID_MULTIPLIER_##size) % VSID_MODULUS_##size))
 
-       x = protovsid * VSID_MULTIPLIER;
-       x = (x >> VSID_BITS) + (x & VSID_MODULUS);
-       return (x + ((x+1) >> VSID_BITS)) & VSID_MODULUS;
+#else /* 1 */
+#define vsid_scramble(protovsid, size) \
+       ({                                                               \
+               unsigned long x;                                         \
+               x = (protovsid) * VSID_MULTIPLIER_##size;                \
+               x = (x >> VSID_BITS_##size) + (x & VSID_MODULUS_##size); \
+               (x + ((x+1) >> VSID_BITS_##size)) & VSID_MODULUS_##size; \
+       })
 #endif /* 1 */
-}
 
 /* This is only valid for addresses >= KERNELBASE */
-static inline unsigned long get_kernel_vsid(unsigned long ea)
+static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
 {
-       return vsid_scramble(ea >> SID_SHIFT);
+       if (ssize == MMU_SEGSIZE_256M)
+               return vsid_scramble(ea >> SID_SHIFT, 256M);
+       return vsid_scramble(ea >> SID_SHIFT_1T, 1T);
 }
 
-/* This is only valid for user addresses (which are below 2^41) */
-static inline unsigned long get_vsid(unsigned long context, unsigned long ea)
+/* Returns the segment size indicator for a user address */
+static inline int user_segment_size(unsigned long addr)
 {
-       return vsid_scramble((context << USER_ESID_BITS)
-                            | (ea >> SID_SHIFT));
+       /* Use 1T segments if possible for addresses >= 1T */
+       if (addr >= (1UL << SID_SHIFT_1T))
+               return mmu_highuser_ssize;
+       return MMU_SEGSIZE_256M;
 }
 
-#define VSID_SCRAMBLE(pvsid)   (((pvsid) * VSID_MULTIPLIER) % VSID_MODULUS)
+/* This is only valid for user addresses (which are below 2^44) */
+static inline unsigned long get_vsid(unsigned long context, unsigned long ea,
+                                    int ssize)
+{
+       if (ssize == MMU_SEGSIZE_256M)
+               return vsid_scramble((context << USER_ESID_BITS)
+                                    | (ea >> SID_SHIFT), 256M);
+       return vsid_scramble((context << USER_ESID_BITS_1T)
+                            | (ea >> SID_SHIFT_1T), 1T);
+}
+
+/*
+ * This is only used on legacy iSeries in lparmap.c,
+ * hence the 256MB segment assumption.
+ */
+#define VSID_SCRAMBLE(pvsid)   (((pvsid) * VSID_MULTIPLIER_256M) %     \
+                                VSID_MODULUS_256M)
 #define KERNEL_VSID(ea)                VSID_SCRAMBLE(GET_ESID(ea))
 
 /* Physical address used by some IO functions */
index d44d211e7588e587022c1d4550fbfcf16ea0a828..4c0e1b4f975c369e2655b29c8bf660d9b05ac8a6 100644 (file)
@@ -8,6 +8,9 @@
 #elif defined(CONFIG_PPC_STD_MMU)
 /* 32-bit classic hash table MMU */
 #  include <asm/mmu-hash32.h>
+#elif defined(CONFIG_40x)
+/* 40x-style software loaded TLB */
+#  include <asm/mmu-40x.h>
 #elif defined(CONFIG_44x)
 /* 44x-style software loaded TLB */
 #  include <asm/mmu-44x.h>
index c4631f6dd4f970be98c4609857511347f45211b7..24751df791ac603519dc00d77175f99587a37948 100644 (file)
@@ -243,7 +243,7 @@ struct mpc52xx_cdm {
 
 extern void __iomem * mpc52xx_find_and_map(const char *);
 extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
-extern void mpc52xx_setup_cpu(void);
+extern void mpc5200_setup_xlb_arbiter(void);
 extern void mpc52xx_declare_of_platform_devices(void);
 
 extern void mpc52xx_init_irq(void);
@@ -262,6 +262,16 @@ struct mpc52xx_suspend {
 extern struct mpc52xx_suspend mpc52xx_suspend;
 extern int __init mpc52xx_pm_init(void);
 extern int mpc52xx_set_wakeup_gpio(u8 pin, u8 level);
+
+#ifdef CONFIG_PPC_LITE5200
+extern int __init lite5200_pm_init(void);
+
+/* lite5200 calls mpc5200 suspend functions, so here they are */
+extern int mpc52xx_pm_prepare(suspend_state_t);
+extern int mpc52xx_pm_enter(suspend_state_t);
+extern int mpc52xx_pm_finish(suspend_state_t);
+extern char saved_sram[0x4000]; /* reuse buffer from mpc52xx suspend */
+#endif
 #endif /* CONFIG_PM */
 
 #endif /* __ASM_POWERPC_MPC52xx_H__ */
diff --git a/include/asm-powerpc/mpc52xx_psc.h b/include/asm-powerpc/mpc52xx_psc.h
new file mode 100644 (file)
index 0000000..26690d2
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * include/asm-ppc/mpc52xx_psc.h
+ *
+ * Definitions of consts/structs to drive the Freescale MPC52xx OnChip
+ * PSCs. Theses are shared between multiple drivers since a PSC can be
+ * UART, AC97, IR, I2S, ... So this header is in asm-ppc.
+ *
+ *
+ * Maintainer : Sylvain Munaut <tnt@246tNt.com>
+ *
+ * Based/Extracted from some header of the 2.4 originally written by
+ * Dale Farnsworth <dfarnsworth@mvista.com>
+ *
+ * Copyright (C) 2004 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2003 MontaVista, Software, Inc.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __ASM_MPC52xx_PSC_H__
+#define __ASM_MPC52xx_PSC_H__
+
+#include <asm/types.h>
+
+/* Max number of PSCs */
+#define MPC52xx_PSC_MAXNUM     6
+
+/* Programmable Serial Controller (PSC) status register bits */
+#define MPC52xx_PSC_SR_CDE     0x0080
+#define MPC52xx_PSC_SR_RXRDY   0x0100
+#define MPC52xx_PSC_SR_RXFULL  0x0200
+#define MPC52xx_PSC_SR_TXRDY   0x0400
+#define MPC52xx_PSC_SR_TXEMP   0x0800
+#define MPC52xx_PSC_SR_OE      0x1000
+#define MPC52xx_PSC_SR_PE      0x2000
+#define MPC52xx_PSC_SR_FE      0x4000
+#define MPC52xx_PSC_SR_RB      0x8000
+
+/* PSC Command values */
+#define MPC52xx_PSC_RX_ENABLE          0x0001
+#define MPC52xx_PSC_RX_DISABLE         0x0002
+#define MPC52xx_PSC_TX_ENABLE          0x0004
+#define MPC52xx_PSC_TX_DISABLE         0x0008
+#define MPC52xx_PSC_SEL_MODE_REG_1     0x0010
+#define MPC52xx_PSC_RST_RX             0x0020
+#define MPC52xx_PSC_RST_TX             0x0030
+#define MPC52xx_PSC_RST_ERR_STAT       0x0040
+#define MPC52xx_PSC_RST_BRK_CHG_INT    0x0050
+#define MPC52xx_PSC_START_BRK          0x0060
+#define MPC52xx_PSC_STOP_BRK           0x0070
+
+/* PSC TxRx FIFO status bits */
+#define MPC52xx_PSC_RXTX_FIFO_ERR      0x0040
+#define MPC52xx_PSC_RXTX_FIFO_UF       0x0020
+#define MPC52xx_PSC_RXTX_FIFO_OF       0x0010
+#define MPC52xx_PSC_RXTX_FIFO_FR       0x0008
+#define MPC52xx_PSC_RXTX_FIFO_FULL     0x0004
+#define MPC52xx_PSC_RXTX_FIFO_ALARM    0x0002
+#define MPC52xx_PSC_RXTX_FIFO_EMPTY    0x0001
+
+/* PSC interrupt mask bits */
+#define MPC52xx_PSC_IMR_TXRDY          0x0100
+#define MPC52xx_PSC_IMR_RXRDY          0x0200
+#define MPC52xx_PSC_IMR_DB             0x0400
+#define MPC52xx_PSC_IMR_IPC            0x8000
+
+/* PSC input port change bit */
+#define MPC52xx_PSC_CTS                        0x01
+#define MPC52xx_PSC_DCD                        0x02
+#define MPC52xx_PSC_D_CTS              0x10
+#define MPC52xx_PSC_D_DCD              0x20
+
+/* PSC mode fields */
+#define MPC52xx_PSC_MODE_5_BITS                        0x00
+#define MPC52xx_PSC_MODE_6_BITS                        0x01
+#define MPC52xx_PSC_MODE_7_BITS                        0x02
+#define MPC52xx_PSC_MODE_8_BITS                        0x03
+#define MPC52xx_PSC_MODE_BITS_MASK             0x03
+#define MPC52xx_PSC_MODE_PAREVEN               0x00
+#define MPC52xx_PSC_MODE_PARODD                        0x04
+#define MPC52xx_PSC_MODE_PARFORCE              0x08
+#define MPC52xx_PSC_MODE_PARNONE               0x10
+#define MPC52xx_PSC_MODE_ERR                   0x20
+#define MPC52xx_PSC_MODE_FFULL                 0x40
+#define MPC52xx_PSC_MODE_RXRTS                 0x80
+
+#define MPC52xx_PSC_MODE_ONE_STOP_5_BITS       0x00
+#define MPC52xx_PSC_MODE_ONE_STOP              0x07
+#define MPC52xx_PSC_MODE_TWO_STOP              0x0f
+
+#define MPC52xx_PSC_RFNUM_MASK 0x01ff
+
+
+/* Structure of the hardware registers */
+struct mpc52xx_psc {
+       u8              mode;           /* PSC + 0x00 */
+       u8              reserved0[3];
+       union {                         /* PSC + 0x04 */
+               u16     status;
+               u16     clock_select;
+       } sr_csr;
+#define mpc52xx_psc_status     sr_csr.status
+#define mpc52xx_psc_clock_select sr_csr.clock_select
+       u16             reserved1;
+       u8              command;        /* PSC + 0x08 */
+       u8              reserved2[3];
+       union {                         /* PSC + 0x0c */
+               u8      buffer_8;
+               u16     buffer_16;
+               u32     buffer_32;
+       } buffer;
+#define mpc52xx_psc_buffer_8   buffer.buffer_8
+#define mpc52xx_psc_buffer_16  buffer.buffer_16
+#define mpc52xx_psc_buffer_32  buffer.buffer_32
+       union {                         /* PSC + 0x10 */
+               u8      ipcr;
+               u8      acr;
+       } ipcr_acr;
+#define mpc52xx_psc_ipcr       ipcr_acr.ipcr
+#define mpc52xx_psc_acr                ipcr_acr.acr
+       u8              reserved3[3];
+       union {                         /* PSC + 0x14 */
+               u16     isr;
+               u16     imr;
+       } isr_imr;
+#define mpc52xx_psc_isr                isr_imr.isr
+#define mpc52xx_psc_imr                isr_imr.imr
+       u16             reserved4;
+       u8              ctur;           /* PSC + 0x18 */
+       u8              reserved5[3];
+       u8              ctlr;           /* PSC + 0x1c */
+       u8              reserved6[3];
+       u16             ccr;            /* PSC + 0x20 */
+       u8              reserved7[14];
+       u8              ivr;            /* PSC + 0x30 */
+       u8              reserved8[3];
+       u8              ip;             /* PSC + 0x34 */
+       u8              reserved9[3];
+       u8              op1;            /* PSC + 0x38 */
+       u8              reserved10[3];
+       u8              op0;            /* PSC + 0x3c */
+       u8              reserved11[3];
+       u32             sicr;           /* PSC + 0x40 */
+       u8              ircr1;          /* PSC + 0x44 */
+       u8              reserved13[3];
+       u8              ircr2;          /* PSC + 0x44 */
+       u8              reserved14[3];
+       u8              irsdr;          /* PSC + 0x4c */
+       u8              reserved15[3];
+       u8              irmdr;          /* PSC + 0x50 */
+       u8              reserved16[3];
+       u8              irfdr;          /* PSC + 0x54 */
+       u8              reserved17[3];
+       u16             rfnum;          /* PSC + 0x58 */
+       u16             reserved18;
+       u16             tfnum;          /* PSC + 0x5c */
+       u16             reserved19;
+       u32             rfdata;         /* PSC + 0x60 */
+       u16             rfstat;         /* PSC + 0x64 */
+       u16             reserved20;
+       u8              rfcntl;         /* PSC + 0x68 */
+       u8              reserved21[5];
+       u16             rfalarm;        /* PSC + 0x6e */
+       u16             reserved22;
+       u16             rfrptr;         /* PSC + 0x72 */
+       u16             reserved23;
+       u16             rfwptr;         /* PSC + 0x76 */
+       u16             reserved24;
+       u16             rflrfptr;       /* PSC + 0x7a */
+       u16             reserved25;
+       u16             rflwfptr;       /* PSC + 0x7e */
+       u32             tfdata;         /* PSC + 0x80 */
+       u16             tfstat;         /* PSC + 0x84 */
+       u16             reserved26;
+       u8              tfcntl;         /* PSC + 0x88 */
+       u8              reserved27[5];
+       u16             tfalarm;        /* PSC + 0x8e */
+       u16             reserved28;
+       u16             tfrptr;         /* PSC + 0x92 */
+       u16             reserved29;
+       u16             tfwptr;         /* PSC + 0x96 */
+       u16             reserved30;
+       u16             tflrfptr;       /* PSC + 0x9a */
+       u16             reserved31;
+       u16             tflwfptr;       /* PSC + 0x9e */
+};
+
+
+#endif  /* __ASM_MPC52xx_PSC_H__ */
diff --git a/include/asm-powerpc/mpc85xx.h b/include/asm-powerpc/mpc85xx.h
deleted file mode 100644 (file)
index 5414299..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * include/asm-powerpc/mpc85xx.h
- *
- * MPC85xx definitions
- *
- * Maintainer: Kumar Gala <galak@kernel.crashing.org>
- *
- * 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.
- */
-
-#ifdef __KERNEL__
-#ifndef __ASM_MPC85xx_H__
-#define __ASM_MPC85xx_H__
-
-#include <asm/mmu.h>
-
-#ifdef CONFIG_85xx
-
-#if defined(CONFIG_MPC8540_ADS) || defined(CONFIG_MPC8560_ADS)
-#include <platforms/85xx/mpc85xx_ads.h>
-#endif
-#if defined(CONFIG_MPC8555_CDS) || defined(CONFIG_MPC8548_CDS)
-#include <platforms/85xx/mpc8555_cds.h>
-#endif
-#ifdef CONFIG_MPC85xx_CDS
-#include <platforms/85xx/mpc85xx_cds.h>
-#endif
-
-/* Let modules/drivers get at CCSRBAR */
-extern phys_addr_t get_ccsrbar(void);
-
-#ifdef MODULE
-#define CCSRBAR get_ccsrbar()
-#else
-#define CCSRBAR BOARD_CCSRBAR
-#endif
-
-#endif /* CONFIG_85xx */
-#endif /* __ASM_MPC85xx_H__ */
-#endif /* __KERNEL__ */
index 262db6b8da7349c073f0eaf126f4e245133e4c6a..ae84dde3bc7f0574064a8927abc429a8004a1820 100644 (file)
@@ -224,8 +224,6 @@ struct mpic_reg_bank {
        u32 __iomem     *base;
 #ifdef CONFIG_PPC_DCR
        dcr_host_t      dhost;
-       unsigned int    dbase;
-       unsigned int    doff;
 #endif /* CONFIG_PPC_DCR */
 };
 
@@ -240,9 +238,6 @@ struct mpic_irq_save {
 /* The instance data of a given MPIC */
 struct mpic
 {
-       /* The device node of the interrupt controller */
-       struct device_node      *of_node;
-
        /* The remapper for this MPIC */
        struct irq_host         *irqhost;
 
@@ -292,10 +287,6 @@ struct mpic
        struct mpic_reg_bank    cpuregs[MPIC_MAX_CPUS];
        struct mpic_reg_bank    isus[MPIC_MAX_ISU];
 
-#ifdef CONFIG_PPC_DCR
-       unsigned int            dcr_base;
-#endif
-
        /* Protected sources */
        unsigned long           *protected;
 
@@ -309,6 +300,10 @@ struct mpic
        unsigned long           *hwirq_bitmap;
 #endif
 
+#ifdef CONFIG_MPIC_BROKEN_REGREAD
+       u32                     isu_reg0_shadow[MPIC_MAX_IRQ_SOURCES];
+#endif
+
        /* link */
        struct mpic             *next;
 
index f3563e11e260b7162d19b758f24d47dd1de0e956..9877982508bf65753ec6a8c419b350067dd72069 100644 (file)
@@ -63,8 +63,10 @@ struct nvram_partition {
 };
 
 
-extern int nvram_write_error_log(char * buff, int length, unsigned int err_type);
-extern int nvram_read_error_log(char * buff, int length, unsigned int * err_type);
+extern int nvram_write_error_log(char * buff, int length,
+                                        unsigned int err_type, unsigned int err_seq);
+extern int nvram_read_error_log(char * buff, int length,
+                                        unsigned int * err_type, unsigned int *err_seq);
 extern int nvram_clear_error_log(void);
 extern struct nvram_partition *nvram_find_partition(int sig, const char *name);
 
index c6a5b173566676c5d5bef92336f687c95bc13142..fcd7b428ed0bbc01e13ee9b443b43076fbeed907 100644 (file)
 #include       <asm/mmu.h>
 
 register struct paca_struct *local_paca asm("r13");
+
+#if defined(CONFIG_DEBUG_PREEMPT) && defined(CONFIG_SMP)
+extern unsigned int debug_smp_processor_id(void); /* from linux/smp.h */
+/*
+ * Add standard checks that preemption cannot occur when using get_paca():
+ * otherwise the paca_struct it points to may be the wrong one just after.
+ */
+#define get_paca()     ((void) debug_smp_processor_id(), local_paca)
+#else
 #define get_paca()     local_paca
+#endif
+
 #define get_lppaca()   (get_paca()->lppaca_ptr)
 #define get_slb_shadow()       (get_paca()->slb_shadow_ptr)
 
index 3448a3d4bc64efc74d84a9c3e337a8989b108fd9..4ee82c61e4d7ec9ad6b213139f27716d7a19796c 100644 (file)
  */
 #define PAGE_FACTOR            (PAGE_SHIFT - HW_PAGE_SHIFT)
 
-/* Segment size */
+/* Segment size; normal 256M segments */
 #define SID_SHIFT              28
-#define SID_MASK               0xfffffffffUL
+#define SID_MASK               ASM_CONST(0xfffffffff)
 #define ESID_MASK              0xfffffffff0000000UL
 #define GET_ESID(x)            (((x) >> SID_SHIFT) & SID_MASK)
 
+/* 1T segments */
+#define SID_SHIFT_1T           40
+#define SID_MASK_1T            0xffffffUL
+#define ESID_MASK_1T           0xffffff0000000000UL
+#define GET_ESID_1T(x)         (((x) >> SID_SHIFT_1T) & SID_MASK_1T)
+
 #ifndef __ASSEMBLY__
 #include <asm/cache.h>
 
@@ -121,6 +127,7 @@ extern unsigned int get_slice_psize(struct mm_struct *mm,
 
 extern void slice_init_context(struct mm_struct *mm, unsigned int psize);
 extern void slice_set_user_psize(struct mm_struct *mm, unsigned int psize);
+#define slice_mm_new_context(mm)       ((mm)->context.id == 0)
 
 #define ARCH_HAS_HUGEPAGE_ONLY_RANGE
 extern int is_hugepage_only_range(struct mm_struct *m,
@@ -130,6 +137,12 @@ extern int is_hugepage_only_range(struct mm_struct *m,
 #endif /* __ASSEMBLY__ */
 #else
 #define slice_init()
+#define slice_set_user_psize(mm, psize)                \
+do {                                           \
+       (mm)->context.user_psize = (psize);     \
+       (mm)->context.sllp = SLB_VSID_USER | mmu_psize_defs[(psize)].sllp; \
+} while (0)
+#define slice_mm_new_context(mm)       1
 #endif /* CONFIG_PPC_MM_SLICES */
 
 #ifdef CONFIG_HUGETLB_PAGE
index e909769b641046a3b718170a20691fdc5fb2141f..dc318458b5fe528a0642b3f5783fe92239ca2511 100644 (file)
@@ -98,7 +98,8 @@ extern int early_find_capability(struct pci_controller *hose, int bus,
                                 int dev_fn, int cap);
 
 extern void setup_indirect_pci(struct pci_controller* hose,
-                              u32 cfg_addr, u32 cfg_data, u32 flags);
+                              resource_size_t cfg_addr,
+                              resource_size_t cfg_data, u32 flags);
 extern void setup_grackle(struct pci_controller *hose);
 extern void __init update_bridge_resource(struct pci_dev *dev,
                                          struct resource *res);
index 73dc8ba4010da31ce1afbdf4f0c90082bfec56c1..6b229626d3ff8a483a7875068ffcdf3dd29fff08 100644 (file)
@@ -28,7 +28,7 @@
 /* var is in discarded region: offset to particular copy we want */
 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu)))
 #define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
-#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
+#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, local_paca->data_offset))
 
 /* A macro to avoid #include hell... */
 #define percpu_modcopy(pcpudst, src, size)                     \
index add5481fd7c7ce3436d65b5eee5ec32f245978e2..818e2abc81e2ee435c82854b1abdbcceb29ffcfc 100644 (file)
 #define PUD_INDEX_SIZE  7
 #define PGD_INDEX_SIZE  9
 
+#ifndef __ASSEMBLY__
 #define PTE_TABLE_SIZE (sizeof(pte_t) << PTE_INDEX_SIZE)
 #define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE)
 #define PUD_TABLE_SIZE (sizeof(pud_t) << PUD_INDEX_SIZE)
 #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
+#endif /* __ASSEMBLY__ */
 
 #define PTRS_PER_PTE   (1 << PTE_INDEX_SIZE)
 #define PTRS_PER_PMD   (1 << PMD_INDEX_SIZE)
index 33ae9018fe7242a303c690c902f658226dd0a5e0..bd54b772fbc64d7fb3969e0c608781c80b43be79 100644 (file)
@@ -9,9 +9,11 @@
 #define PUD_INDEX_SIZE 0
 #define PGD_INDEX_SIZE  4
 
+#ifndef __ASSEMBLY__
 #define PTE_TABLE_SIZE (sizeof(real_pte_t) << PTE_INDEX_SIZE)
 #define PMD_TABLE_SIZE (sizeof(pmd_t) << PMD_INDEX_SIZE)
 #define PGD_TABLE_SIZE (sizeof(pgd_t) << PGD_INDEX_SIZE)
+#endif /* __ASSEMBLY__ */
 
 #define PTRS_PER_PTE   (1 << PTE_INDEX_SIZE)
 #define PTRS_PER_PMD   (1 << PMD_INDEX_SIZE)
index 65325721446deca505420cfc8dae4cf8c1430847..2dbd4e7884faee59e96e53b391e1495bee1307e2 100644 (file)
@@ -155,6 +155,20 @@ name: \
        .type GLUE(.,name),@function; \
 GLUE(.,name):
 
+#define _INIT_GLOBAL(name) \
+       .section ".text.init.refok"; \
+       .align 2 ; \
+       .globl name; \
+       .globl GLUE(.,name); \
+       .section ".opd","aw"; \
+name: \
+       .quad GLUE(.,name); \
+       .quad .TOC.@tocbase; \
+       .quad 0; \
+       .previous; \
+       .type GLUE(.,name),@function; \
+GLUE(.,name):
+
 #define _KPROBE(name) \
        .section ".kprobes.text","a"; \
        .align 2 ; \
@@ -195,6 +209,10 @@ GLUE(.,name):
 
 #else /* 32-bit */
 
+#define _ENTRY(n)      \
+       .globl n;       \
+n:
+
 #define _GLOBAL(n)     \
        .text;          \
        .stabs __stringify(n:F-1),N_FUN,0,0,n;\
index e28b108051592d443c9f6da8982c2740be780424..dba7c948189db065a0862bcfa8c438f236a15ada 100644 (file)
@@ -145,9 +145,9 @@ struct thread_struct {
        unsigned long   dabr;           /* Data address breakpoint register */
 #ifdef CONFIG_ALTIVEC
        /* Complete AltiVec register set */
-       vector128       vr[32] __attribute((aligned(16)));
+       vector128       vr[32] __attribute__((aligned(16)));
        /* AltiVec status */
-       vector128       vscr __attribute((aligned(16)));
+       vector128       vscr __attribute__((aligned(16)));
        unsigned long   vrsave;
        int             used_vr;        /* set if process has used altivec */
 #endif /* CONFIG_ALTIVEC */
index 672083787a1d8eb1664ba77c5509cf58e708cd96..925e2d384bb327e1dff9d3177dee37e38c932084 100644 (file)
@@ -24,7 +24,7 @@
 #define OF_ROOT_NODE_ADDR_CELLS_DEFAULT        1
 #define OF_ROOT_NODE_SIZE_CELLS_DEFAULT        1
 
-#define of_compat_cmp(s1, s2, l)       strncasecmp((s1), (s2), (l))
+#define of_compat_cmp(s1, s2, l)       strcasecmp((s1), (s2))
 #define of_prop_cmp(s1, s2)            strcmp((s1), (s2))
 #define of_node_cmp(s1, s2)            strcasecmp((s1), (s2))
 
@@ -145,7 +145,6 @@ extern void of_detach_node(struct device_node *);
 extern void finish_device_tree(void);
 extern void unflatten_device_tree(void);
 extern void early_init_devtree(void *);
-#define device_is_compatible(d, c)     of_device_is_compatible((d), (c))
 extern int machine_is_compatible(const char *compat);
 extern void print_properties(struct device_node *node);
 extern int prom_n_intr_cells(struct device_node* np);
index a6f3f5ee7ca7f70a3ee592c0e173f91b40f3e53b..f577a16c6728a1a34c363ccfefbc526e5c5f4894 100644 (file)
@@ -229,6 +229,9 @@ enum lv1_result {
        LV1_INVALID_CLASS_ID            = -21,
        LV1_CONSTRAINT_NOT_SATISFIED    = -22,
        LV1_ALIGNMENT_ERROR             = -23,
+       LV1_HARDWARE_ERROR              = -24,
+       LV1_INVALID_DATA_FORMAT         = -25,
+       LV1_INVALID_OPERATION           = -26,
        LV1_INTERNAL_ERROR              = -32768,
 };
 
@@ -284,6 +287,12 @@ static inline const char* ps3_result(int result)
                return "LV1_CONSTRAINT_NOT_SATISFIED (-22)";
        case LV1_ALIGNMENT_ERROR:
                return "LV1_ALIGNMENT_ERROR (-23)";
+       case LV1_HARDWARE_ERROR:
+               return "LV1_HARDWARE_ERROR (-24)";
+       case LV1_INVALID_DATA_FORMAT:
+               return "LV1_INVALID_DATA_FORMAT (-25)";
+       case LV1_INVALID_OPERATION:
+               return "LV1_INVALID_OPERATION (-26)";
        case LV1_INTERNAL_ERROR:
                return "LV1_INTERNAL_ERROR (-32768)";
        default:
index 9d304b1f1608bf94f2e0b145d6ebc18afab75222..0dabe46a29d20ac7e1e9a9a85001261eb34220b5 100644 (file)
 extern void qe_reset(void);
 extern int par_io_init(struct device_node *np);
 extern int par_io_of_config(struct device_node *np);
+extern int par_io_config_pin(u8 port, u8 pin, int dir, int open_drain,
+                            int assignment, int has_irq);
+extern int par_io_data_set(u8 port, u8 pin, u8 val);
 
 /* QE internal API */
 int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);
-void qe_setbrg(u32 brg, u32 rate);
+void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier);
 int qe_get_snum(void);
 void qe_put_snum(u8 snum);
 unsigned long qe_muram_alloc(int size, int align);
@@ -46,14 +49,28 @@ void *qe_muram_addr(unsigned long offset);
 
 /* Buffer descriptors */
 struct qe_bd {
-       u16 status;
-       u16 length;
-       u32 buf;
+       __be16 status;
+       __be16 length;
+       __be32 buf;
 } __attribute__ ((packed));
 
 #define BD_STATUS_MASK 0xffff0000
 #define BD_LENGTH_MASK 0x0000ffff
 
+#define BD_SC_EMPTY    0x8000  /* Receive is empty */
+#define BD_SC_READY    0x8000  /* Transmit is ready */
+#define BD_SC_WRAP     0x2000  /* Last buffer descriptor */
+#define BD_SC_INTRPT   0x1000  /* Interrupt on change */
+#define BD_SC_LAST     0x0800  /* Last buffer in frame */
+#define BD_SC_CM       0x0200  /* Continous mode */
+#define BD_SC_ID       0x0100  /* Rec'd too many idles */
+#define BD_SC_P                0x0100  /* xmt preamble */
+#define BD_SC_BR       0x0020  /* Break received */
+#define BD_SC_FR       0x0010  /* Framing error */
+#define BD_SC_PR       0x0008  /* Parity error */
+#define BD_SC_OV       0x0002  /* Overrun */
+#define BD_SC_CD       0x0001  /* ?? */
+
 /* Alignment */
 #define QE_INTR_TABLE_ALIGN    16      /* ??? */
 #define QE_ALIGNMENT_OF_BD     8
@@ -266,15 +283,12 @@ enum qe_clock {
 /* QE CECR Protocol - For non-MCC, specifies mode for QE CECR command */
 #define QE_CR_PROTOCOL_UNSPECIFIED     0x00    /* For all other protocols */
 #define QE_CR_PROTOCOL_HDLC_TRANSPARENT        0x00
+#define QE_CR_PROTOCOL_QMC             0x02
+#define QE_CR_PROTOCOL_UART            0x04
 #define QE_CR_PROTOCOL_ATM_POS         0x0A
 #define QE_CR_PROTOCOL_ETHERNET                0x0C
 #define QE_CR_PROTOCOL_L2_SWITCH       0x0D
 
-/* BMR byte order */
-#define QE_BMR_BYTE_ORDER_BO_PPC       0x08    /* powerpc little endian */
-#define QE_BMR_BYTE_ORDER_BO_MOT       0x10    /* motorola big endian */
-#define QE_BMR_BYTE_ORDER_BO_MAX       0x18
-
 /* BRG configuration register */
 #define QE_BRGC_ENABLE         0x00010000
 #define QE_BRGC_DIVISOR_SHIFT  1
@@ -321,41 +335,41 @@ enum qe_clock {
 #define UPGCR_ADDR     0x10000000      /* Master MPHY Addr multiplexing */
 #define UPGCR_DIAG     0x01000000      /* Diagnostic mode */
 
-/* UCC */
+/* UCC GUEMR register */
 #define UCC_GUEMR_MODE_MASK_RX 0x02
-#define UCC_GUEMR_MODE_MASK_TX 0x01
 #define UCC_GUEMR_MODE_FAST_RX 0x02
-#define UCC_GUEMR_MODE_FAST_TX 0x01
 #define UCC_GUEMR_MODE_SLOW_RX 0x00
+#define UCC_GUEMR_MODE_MASK_TX 0x01
+#define UCC_GUEMR_MODE_FAST_TX 0x01
 #define UCC_GUEMR_MODE_SLOW_TX 0x00
+#define UCC_GUEMR_MODE_MASK (UCC_GUEMR_MODE_MASK_RX | UCC_GUEMR_MODE_MASK_TX)
 #define UCC_GUEMR_SET_RESERVED3        0x10    /* Bit 3 in the guemr is reserved but
                                           must be set 1 */
 
 /* structure representing UCC SLOW parameter RAM */
 struct ucc_slow_pram {
-       u16 rbase;              /* RX BD base address */
-       u16 tbase;              /* TX BD base address */
-       u8 rfcr;                /* Rx function code */
-       u8 tfcr;                /* Tx function code */
-       u16 mrblr;              /* Rx buffer length */
-       u32 rstate;             /* Rx internal state */
-       u32 rptr;               /* Rx internal data pointer */
-       u16 rbptr;              /* rb BD Pointer */
-       u16 rcount;             /* Rx internal byte count */
-       u32 rtemp;              /* Rx temp */
-       u32 tstate;             /* Tx internal state */
-       u32 tptr;               /* Tx internal data pointer */
-       u16 tbptr;              /* Tx BD pointer */
-       u16 tcount;             /* Tx byte count */
-       u32 ttemp;              /* Tx temp */
-       u32 rcrc;               /* temp receive CRC */
-       u32 tcrc;               /* temp transmit CRC */
+       __be16 rbase;           /* RX BD base address */
+       __be16 tbase;           /* TX BD base address */
+       u8 rbmr;                /* RX bus mode register (same as CPM's RFCR) */
+       u8 tbmr;                /* TX bus mode register (same as CPM's TFCR) */
+       __be16 mrblr;           /* Rx buffer length */
+       __be32 rstate;          /* Rx internal state */
+       __be32 rptr;            /* Rx internal data pointer */
+       __be16 rbptr;           /* rb BD Pointer */
+       __be16 rcount;          /* Rx internal byte count */
+       __be32 rtemp;           /* Rx temp */
+       __be32 tstate;          /* Tx internal state */
+       __be32 tptr;            /* Tx internal data pointer */
+       __be16 tbptr;           /* Tx BD pointer */
+       __be16 tcount;          /* Tx byte count */
+       __be32 ttemp;           /* Tx temp */
+       __be32 rcrc;            /* temp receive CRC */
+       __be32 tcrc;            /* temp transmit CRC */
 } __attribute__ ((packed));
 
 /* General UCC SLOW Mode Register (GUMRH & GUMRL) */
-#define UCC_SLOW_GUMR_H_CRC16          0x00004000
-#define UCC_SLOW_GUMR_H_CRC16CCITT     0x00000000
-#define UCC_SLOW_GUMR_H_CRC32CCITT     0x00008000
+#define UCC_SLOW_GUMR_H_SAM_QMC                0x00000000
+#define UCC_SLOW_GUMR_H_SAM_SATM       0x00008000
 #define UCC_SLOW_GUMR_H_REVD           0x00002000
 #define UCC_SLOW_GUMR_H_TRX            0x00001000
 #define UCC_SLOW_GUMR_H_TTX            0x00000800
@@ -375,9 +389,33 @@ struct ucc_slow_pram {
 #define UCC_SLOW_GUMR_L_TCI            0x10000000
 #define UCC_SLOW_GUMR_L_RINV           0x02000000
 #define UCC_SLOW_GUMR_L_TINV           0x01000000
-#define UCC_SLOW_GUMR_L_TEND           0x00020000
+#define UCC_SLOW_GUMR_L_TEND           0x00040000
+#define UCC_SLOW_GUMR_L_TDCR_MASK      0x00030000
+#define UCC_SLOW_GUMR_L_TDCR_32                0x00030000
+#define UCC_SLOW_GUMR_L_TDCR_16                0x00020000
+#define UCC_SLOW_GUMR_L_TDCR_8         0x00010000
+#define UCC_SLOW_GUMR_L_TDCR_1         0x00000000
+#define UCC_SLOW_GUMR_L_RDCR_MASK      0x0000c000
+#define UCC_SLOW_GUMR_L_RDCR_32                0x0000c000
+#define UCC_SLOW_GUMR_L_RDCR_16                0x00008000
+#define UCC_SLOW_GUMR_L_RDCR_8         0x00004000
+#define UCC_SLOW_GUMR_L_RDCR_1         0x00000000
+#define UCC_SLOW_GUMR_L_RENC_NRZI      0x00000800
+#define UCC_SLOW_GUMR_L_RENC_NRZ       0x00000000
+#define UCC_SLOW_GUMR_L_TENC_NRZI      0x00000100
+#define UCC_SLOW_GUMR_L_TENC_NRZ       0x00000000
+#define UCC_SLOW_GUMR_L_DIAG_MASK      0x000000c0
+#define UCC_SLOW_GUMR_L_DIAG_LE                0x000000c0
+#define UCC_SLOW_GUMR_L_DIAG_ECHO      0x00000080
+#define UCC_SLOW_GUMR_L_DIAG_LOOP      0x00000040
+#define UCC_SLOW_GUMR_L_DIAG_NORM      0x00000000
 #define UCC_SLOW_GUMR_L_ENR            0x00000020
 #define UCC_SLOW_GUMR_L_ENT            0x00000010
+#define UCC_SLOW_GUMR_L_MODE_MASK      0x0000000F
+#define UCC_SLOW_GUMR_L_MODE_BISYNC    0x00000008
+#define UCC_SLOW_GUMR_L_MODE_AHDLC     0x00000006
+#define UCC_SLOW_GUMR_L_MODE_UART      0x00000004
+#define UCC_SLOW_GUMR_L_MODE_QMC       0x00000002
 
 /* General UCC FAST Mode Register */
 #define UCC_FAST_GUMR_TCI      0x20000000
@@ -394,53 +432,111 @@ struct ucc_slow_pram {
 #define UCC_FAST_GUMR_ENR      0x00000020
 #define UCC_FAST_GUMR_ENT      0x00000010
 
-/* Slow UCC Event Register (UCCE) */
-#define UCC_SLOW_UCCE_GLR      0x1000
-#define UCC_SLOW_UCCE_GLT      0x0800
-#define UCC_SLOW_UCCE_DCC      0x0400
-#define UCC_SLOW_UCCE_FLG      0x0200
-#define UCC_SLOW_UCCE_AB       0x0200
-#define UCC_SLOW_UCCE_IDLE     0x0100
-#define UCC_SLOW_UCCE_GRA      0x0080
-#define UCC_SLOW_UCCE_TXE      0x0010
-#define UCC_SLOW_UCCE_RXF      0x0008
-#define UCC_SLOW_UCCE_CCR      0x0008
-#define UCC_SLOW_UCCE_RCH      0x0008
-#define UCC_SLOW_UCCE_BSY      0x0004
-#define UCC_SLOW_UCCE_TXB      0x0002
-#define UCC_SLOW_UCCE_TX       0x0002
-#define UCC_SLOW_UCCE_RX       0x0001
-#define UCC_SLOW_UCCE_GOV      0x0001
-#define UCC_SLOW_UCCE_GUN      0x0002
-#define UCC_SLOW_UCCE_GINT     0x0004
-#define UCC_SLOW_UCCE_IQOV     0x0008
-
-#define UCC_SLOW_UCCE_HDLC_SET (UCC_SLOW_UCCE_TXE | UCC_SLOW_UCCE_BSY | \
-               UCC_SLOW_UCCE_GRA | UCC_SLOW_UCCE_TXB | UCC_SLOW_UCCE_RXF | \
-               UCC_SLOW_UCCE_DCC | UCC_SLOW_UCCE_GLT | UCC_SLOW_UCCE_GLR)
-#define UCC_SLOW_UCCE_ENET_SET (UCC_SLOW_UCCE_TXE | UCC_SLOW_UCCE_BSY | \
-               UCC_SLOW_UCCE_GRA | UCC_SLOW_UCCE_TXB | UCC_SLOW_UCCE_RXF)
-#define UCC_SLOW_UCCE_TRANS_SET        (UCC_SLOW_UCCE_TXE | UCC_SLOW_UCCE_BSY | \
-               UCC_SLOW_UCCE_GRA | UCC_SLOW_UCCE_TX | UCC_SLOW_UCCE_RX | \
-               UCC_SLOW_UCCE_DCC | UCC_SLOW_UCCE_GLT | UCC_SLOW_UCCE_GLR)
-#define UCC_SLOW_UCCE_UART_SET (UCC_SLOW_UCCE_BSY | UCC_SLOW_UCCE_GRA | \
-               UCC_SLOW_UCCE_TXB | UCC_SLOW_UCCE_TX | UCC_SLOW_UCCE_RX | \
-               UCC_SLOW_UCCE_GLT | UCC_SLOW_UCCE_GLR)
-#define UCC_SLOW_UCCE_QMC_SET  (UCC_SLOW_UCCE_IQOV | UCC_SLOW_UCCE_GINT | \
-               UCC_SLOW_UCCE_GUN | UCC_SLOW_UCCE_GOV)
-
-#define UCC_SLOW_UCCE_OTHER    (UCC_SLOW_UCCE_TXE | UCC_SLOW_UCCE_BSY | \
-               UCC_SLOW_UCCE_GRA | UCC_SLOW_UCCE_DCC | UCC_SLOW_UCCE_GLT | \
-               UCC_SLOW_UCCE_GLR)
-
-#define UCC_SLOW_INTR_TX       UCC_SLOW_UCCE_TXB
-#define UCC_SLOW_INTR_RX       (UCC_SLOW_UCCE_RXF | UCC_SLOW_UCCE_RX)
-#define UCC_SLOW_INTR          (UCC_SLOW_INTR_TX | UCC_SLOW_INTR_RX)
+/* UART Slow UCC Event Register (UCCE) */
+#define UCC_UART_UCCE_AB       0x0200
+#define UCC_UART_UCCE_IDLE     0x0100
+#define UCC_UART_UCCE_GRA      0x0080
+#define UCC_UART_UCCE_BRKE     0x0040
+#define UCC_UART_UCCE_BRKS     0x0020
+#define UCC_UART_UCCE_CCR      0x0008
+#define UCC_UART_UCCE_BSY      0x0004
+#define UCC_UART_UCCE_TX       0x0002
+#define UCC_UART_UCCE_RX       0x0001
+
+/* HDLC Slow UCC Event Register (UCCE) */
+#define UCC_HDLC_UCCE_GLR      0x1000
+#define UCC_HDLC_UCCE_GLT      0x0800
+#define UCC_HDLC_UCCE_IDLE     0x0100
+#define UCC_HDLC_UCCE_BRKE     0x0040
+#define UCC_HDLC_UCCE_BRKS     0x0020
+#define UCC_HDLC_UCCE_TXE      0x0010
+#define UCC_HDLC_UCCE_RXF      0x0008
+#define UCC_HDLC_UCCE_BSY      0x0004
+#define UCC_HDLC_UCCE_TXB      0x0002
+#define UCC_HDLC_UCCE_RXB      0x0001
+
+/* BISYNC Slow UCC Event Register (UCCE) */
+#define UCC_BISYNC_UCCE_GRA    0x0080
+#define UCC_BISYNC_UCCE_TXE    0x0010
+#define UCC_BISYNC_UCCE_RCH    0x0008
+#define UCC_BISYNC_UCCE_BSY    0x0004
+#define UCC_BISYNC_UCCE_TXB    0x0002
+#define UCC_BISYNC_UCCE_RXB    0x0001
+
+/* Gigabit Ethernet Fast UCC Event Register (UCCE) */
+#define UCC_GETH_UCCE_MPD       0x80000000
+#define UCC_GETH_UCCE_SCAR      0x40000000
+#define UCC_GETH_UCCE_GRA       0x20000000
+#define UCC_GETH_UCCE_CBPR      0x10000000
+#define UCC_GETH_UCCE_BSY       0x08000000
+#define UCC_GETH_UCCE_RXC       0x04000000
+#define UCC_GETH_UCCE_TXC       0x02000000
+#define UCC_GETH_UCCE_TXE       0x01000000
+#define UCC_GETH_UCCE_TXB7      0x00800000
+#define UCC_GETH_UCCE_TXB6      0x00400000
+#define UCC_GETH_UCCE_TXB5      0x00200000
+#define UCC_GETH_UCCE_TXB4      0x00100000
+#define UCC_GETH_UCCE_TXB3      0x00080000
+#define UCC_GETH_UCCE_TXB2      0x00040000
+#define UCC_GETH_UCCE_TXB1      0x00020000
+#define UCC_GETH_UCCE_TXB0      0x00010000
+#define UCC_GETH_UCCE_RXB7      0x00008000
+#define UCC_GETH_UCCE_RXB6      0x00004000
+#define UCC_GETH_UCCE_RXB5      0x00002000
+#define UCC_GETH_UCCE_RXB4      0x00001000
+#define UCC_GETH_UCCE_RXB3      0x00000800
+#define UCC_GETH_UCCE_RXB2      0x00000400
+#define UCC_GETH_UCCE_RXB1      0x00000200
+#define UCC_GETH_UCCE_RXB0      0x00000100
+#define UCC_GETH_UCCE_RXF7      0x00000080
+#define UCC_GETH_UCCE_RXF6      0x00000040
+#define UCC_GETH_UCCE_RXF5      0x00000020
+#define UCC_GETH_UCCE_RXF4      0x00000010
+#define UCC_GETH_UCCE_RXF3      0x00000008
+#define UCC_GETH_UCCE_RXF2      0x00000004
+#define UCC_GETH_UCCE_RXF1      0x00000002
+#define UCC_GETH_UCCE_RXF0      0x00000001
+
+/* UPSMR, when used as a UART */
+#define UCC_UART_UPSMR_FLC             0x8000
+#define UCC_UART_UPSMR_SL              0x4000
+#define UCC_UART_UPSMR_CL_MASK         0x3000
+#define UCC_UART_UPSMR_CL_8            0x3000
+#define UCC_UART_UPSMR_CL_7            0x2000
+#define UCC_UART_UPSMR_CL_6            0x1000
+#define UCC_UART_UPSMR_CL_5            0x0000
+#define UCC_UART_UPSMR_UM_MASK         0x0c00
+#define UCC_UART_UPSMR_UM_NORMAL       0x0000
+#define UCC_UART_UPSMR_UM_MAN_MULTI    0x0400
+#define UCC_UART_UPSMR_UM_AUTO_MULTI   0x0c00
+#define UCC_UART_UPSMR_FRZ             0x0200
+#define UCC_UART_UPSMR_RZS             0x0100
+#define UCC_UART_UPSMR_SYN             0x0080
+#define UCC_UART_UPSMR_DRT             0x0040
+#define UCC_UART_UPSMR_PEN             0x0010
+#define UCC_UART_UPSMR_RPM_MASK                0x000c
+#define UCC_UART_UPSMR_RPM_ODD         0x0000
+#define UCC_UART_UPSMR_RPM_LOW         0x0004
+#define UCC_UART_UPSMR_RPM_EVEN                0x0008
+#define UCC_UART_UPSMR_RPM_HIGH                0x000C
+#define UCC_UART_UPSMR_TPM_MASK                0x0003
+#define UCC_UART_UPSMR_TPM_ODD         0x0000
+#define UCC_UART_UPSMR_TPM_LOW         0x0001
+#define UCC_UART_UPSMR_TPM_EVEN                0x0002
+#define UCC_UART_UPSMR_TPM_HIGH                0x0003
 
 /* UCC Transmit On Demand Register (UTODR) */
 #define UCC_SLOW_TOD   0x8000
 #define UCC_FAST_TOD   0x8000
 
+/* UCC Bus Mode Register masks */
+/* Not to be confused with the Bundle Mode Register */
+#define UCC_BMR_GBL            0x20
+#define UCC_BMR_BO_BE          0x10
+#define UCC_BMR_CETM           0x04
+#define UCC_BMR_DTB            0x02
+#define UCC_BMR_BDB            0x01
+
 /* Function code masks */
 #define FC_GBL                         0x20
 #define FC_DTB_LCL                     0x02
index e386fb7e44b0d928b3829f851fdd43b4ffda0a20..a779b2c9eaf163eb73c0f80faaedd24a1ea7e30f 100644 (file)
@@ -56,9 +56,75 @@ enum qe_ic_grp_id {
        QE_IC_GRP_RISCB         /* QE interrupt controller RISC group B */
 };
 
-void qe_ic_init(struct device_node *node, unsigned int flags);
+void qe_ic_init(struct device_node *node, unsigned int flags,
+               void (*low_handler)(unsigned int irq, struct irq_desc *desc),
+               void (*high_handler)(unsigned int irq, struct irq_desc *desc));
 void qe_ic_set_highest_priority(unsigned int virq, int high);
 int qe_ic_set_priority(unsigned int virq, unsigned int priority);
 int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high);
 
+struct qe_ic;
+unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic);
+unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic);
+
+static inline void qe_ic_cascade_low_ipic(unsigned int irq,
+                                         struct irq_desc *desc)
+{
+       struct qe_ic *qe_ic = desc->handler_data;
+       unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
+
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq);
+}
+
+static inline void qe_ic_cascade_high_ipic(unsigned int irq,
+                                          struct irq_desc *desc)
+{
+       struct qe_ic *qe_ic = desc->handler_data;
+       unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
+
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq);
+}
+
+static inline void qe_ic_cascade_low_mpic(unsigned int irq,
+                                         struct irq_desc *desc)
+{
+       struct qe_ic *qe_ic = desc->handler_data;
+       unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
+
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq);
+
+       desc->chip->eoi(irq);
+}
+
+static inline void qe_ic_cascade_high_mpic(unsigned int irq,
+                                          struct irq_desc *desc)
+{
+       struct qe_ic *qe_ic = desc->handler_data;
+       unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
+
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq);
+
+       desc->chip->eoi(irq);
+}
+
+static inline void qe_ic_cascade_muxed_mpic(unsigned int irq,
+                                           struct irq_desc *desc)
+{
+       struct qe_ic *qe_ic = desc->handler_data;
+       unsigned int cascade_irq;
+
+       cascade_irq = qe_ic_get_high_irq(qe_ic);
+       if (cascade_irq == NO_IRQ)
+               cascade_irq = qe_ic_get_low_irq(qe_ic);
+
+       if (cascade_irq != NO_IRQ)
+               generic_handle_irq(cascade_irq);
+
+       desc->chip->eoi(irq);
+}
+
 #endif /* _ASM_POWERPC_QE_IC_H */
index 281011e953ec1ea7e2be43b09101c4cdc2d186fa..e775ff1ca413e96ff5cf8b926f1b08c6105f58bf 100644 (file)
 #else /* 32-bit */
 /* Default MSR for kernel mode. */
 #ifndef MSR_KERNEL     /* reg_booke.h also defines this */
-#ifdef CONFIG_APUS_FAST_EXCEPT
-#define MSR_KERNEL     (MSR_ME|MSR_IP|MSR_RI|MSR_IR|MSR_DR)
-#else
 #define MSR_KERNEL     (MSR_ME|MSR_RI|MSR_IR|MSR_DR)
 #endif
-#endif
 
 #define MSR_USER       (MSR_KERNEL|MSR_PR|MSR_EE)
 #endif
 #define   PA6T_MMCR1_ES4       0x0000000000ff0000UL
 #define   PA6T_MMCR1_ES5       0x00000000ff000000UL
 
-#define SPRN_PA6T_SIAR  780
-#define SPRN_PA6T_UPMC0 771
-#define SPRN_PA6T_UPMC1 772
+#define SPRN_PA6T_UPMC0 771    /* User PerfMon Counter 0 */
+#define SPRN_PA6T_UPMC1 772    /* ... */
 #define SPRN_PA6T_UPMC2 773
 #define SPRN_PA6T_UPMC3 774
 #define SPRN_PA6T_UPMC4 775
 #define SPRN_PA6T_UPMC5 776
-#define SPRN_PA6T_UMMCR0 779
-#define SPRN_PA6T_UMMCR1 782
-#define SPRN_PA6T_PMC0  787
-#define SPRN_PA6T_PMC1  788
-#define SPRN_PA6T_PMC2  789
-#define SPRN_PA6T_PMC3  790
-#define SPRN_PA6T_PMC4  791
-#define SPRN_PA6T_PMC5  792
+#define SPRN_PA6T_UMMCR0 779   /* User Monitor Mode Control Register 0 */
+#define SPRN_PA6T_SIAR 780     /* Sampled Instruction Address */
+#define SPRN_PA6T_UMMCR1 782   /* User Monitor Mode Control Register 1 */
+#define SPRN_PA6T_SIER 785     /* Sampled Instruction Event Register */
+#define SPRN_PA6T_PMC0 787
+#define SPRN_PA6T_PMC1 788
+#define SPRN_PA6T_PMC2 789
+#define SPRN_PA6T_PMC3 790
+#define SPRN_PA6T_PMC4 791
+#define SPRN_PA6T_PMC5 792
+#define SPRN_PA6T_TSR0 793     /* Timestamp Register 0 */
+#define SPRN_PA6T_TSR1 794     /* Timestamp Register 1 */
+#define SPRN_PA6T_TSR2 799     /* Timestamp Register 2 */
+#define SPRN_PA6T_TSR3 784     /* Timestamp Register 3 */
+
+#define SPRN_PA6T_IER  981     /* Icache Error Register */
+#define SPRN_PA6T_DER  982     /* Dcache Error Register */
+#define SPRN_PA6T_BER  862     /* BIU Error Address Register */
+#define SPRN_PA6T_MER  849     /* MMU Error Register */
+
+#define SPRN_PA6T_IMA0 880     /* Instruction Match Array 0 */
+#define SPRN_PA6T_IMA1 881     /* ... */
+#define SPRN_PA6T_IMA2 882
+#define SPRN_PA6T_IMA3 883
+#define SPRN_PA6T_IMA4 884
+#define SPRN_PA6T_IMA5 885
+#define SPRN_PA6T_IMA6 886
+#define SPRN_PA6T_IMA7 887
+#define SPRN_PA6T_IMA8 888
+#define SPRN_PA6T_IMA9 889
+#define SPRN_PA6T_BTCR 978     /* Breakpoint and Tagging Control Register */
+#define SPRN_PA6T_IMAAT        979     /* Instruction Match Array Action Table */
+#define SPRN_PA6T_PCCR 1019    /* Power Counter Control Register */
+#define SPRN_PA6T_RPCCR        1021    /* Retire PC Trace Control Register */
+
 
 #else /* 32-bit */
 #define SPRN_MMCR0     952     /* Monitor Mode Control Register 0 */
index e929145e1e46700bdef35c903acb6725ef5c66e3..cefc14728cc567535f99ea6b417afa68ff667158 100644 (file)
@@ -1,6 +1,10 @@
 #ifndef _ASM_POWERPC_RWSEM_H
 #define _ASM_POWERPC_RWSEM_H
 
+#ifndef _LINUX_RWSEM_H
+#error "Please don't include <asm/rwsem.h> directly, use <linux/rwsem.h> instead."
+#endif
+
 #ifdef __KERNEL__
 
 /*
index d037f50580e23fbf7c6482903e3ddf4ffc68be17..19102bfc14cab5207b97d323e7b4bb6137b004fe 100644 (file)
@@ -45,7 +45,7 @@ void generic_mach_cpu_die(void);
 #endif
 
 #ifdef CONFIG_PPC64
-#define raw_smp_processor_id() (get_paca()->paca_index)
+#define raw_smp_processor_id() (local_paca->paca_index)
 #define hard_smp_processor_id() (get_paca()->hw_cpu_id)
 #else
 /* 32-bit */
index 5bde3980bf496d3e8336565f71402d7296ec8beb..b1accce77bb5a84a52a5f3b165bff1350137770e 100644 (file)
@@ -238,19 +238,14 @@ extern long spu_sys_callback(struct spu_syscall_block *s);
 
 /* syscalls implemented in spufs */
 struct file;
-extern struct spufs_calls {
-       asmlinkage long (*create_thread)(const char __user *name,
+struct spufs_calls {
+       long (*create_thread)(const char __user *name,
                                        unsigned int flags, mode_t mode,
                                        struct file *neighbor);
-       asmlinkage long (*spu_run)(struct file *filp, __u32 __user *unpc,
+       long (*spu_run)(struct file *filp, __u32 __user *unpc,
                                                __u32 __user *ustatus);
-       struct module *owner;
-} spufs_calls;
-
-/* coredump calls implemented in spufs */
-struct spu_coredump_calls {
-       asmlinkage int (*arch_notes_size)(void);
-       asmlinkage void (*arch_write_notes)(struct file *file);
+       int (*coredump_extra_notes_size)(void);
+       int (*coredump_extra_notes_write)(struct file *file, loff_t *foffset);
        struct module *owner;
 };
 
@@ -274,21 +269,8 @@ struct spu_coredump_calls {
 #define SPU_CREATE_FLAG_ALL            0x003f /* mask of all valid flags */
 
 
-#ifdef CONFIG_SPU_FS_MODULE
 int register_spu_syscalls(struct spufs_calls *calls);
 void unregister_spu_syscalls(struct spufs_calls *calls);
-#else
-static inline int register_spu_syscalls(struct spufs_calls *calls)
-{
-       return 0;
-}
-static inline void unregister_spu_syscalls(struct spufs_calls *calls)
-{
-}
-#endif /* MODULE */
-
-int register_arch_coredump_calls(struct spu_coredump_calls *calls);
-void unregister_arch_coredump_calls(struct spu_coredump_calls *calls);
 
 int spu_add_sysdev_attr(struct sysdev_attribute *attr);
 void spu_remove_sysdev_attr(struct sysdev_attribute *attr);
index 41520b7a7b76006e2f58025874da39f176d42562..d10e99bf500119972d6ef6579ada5b1164136ce4 100644 (file)
@@ -189,6 +189,9 @@ extern int mem_init_done;   /* set on boot once kmalloc can be called */
 extern unsigned long memory_limit;
 extern unsigned long klimit;
 
+extern void *alloc_maybe_bootmem(size_t size, gfp_t mask);
+extern void *zalloc_maybe_bootmem(size_t size, gfp_t mask);
+
 extern int powersave_nap;      /* set if nap mode can be used in idle loop */
 
 /*
index c104c15c6625b5d35a06ae22f0a4a96cc20a2131..f05895522f7f796e8136ea7bc231007c721a39c9 100644 (file)
@@ -179,7 +179,7 @@ static inline unsigned int get_dec(void)
 static inline void set_dec(int val)
 {
 #if defined(CONFIG_40x)
-       return;         /* Have to let it auto-reload */
+       mtspr(SPRN_PIT, val);
 #elif defined(CONFIG_8xx_CPU6)
        set_dec_cpu6(val);
 #else
@@ -245,6 +245,7 @@ extern void snapshot_timebases(void);
 #define snapshot_timebases()                   do { } while (0)
 #endif
 
+extern void secondary_cpu_time_init(void);
 extern void iSeries_time_init_early(void);
 
 #endif /* __KERNEL__ */
index 66714042e4383399a597ec5867a14e46e52ee1bc..e20ff7541f364812bbe8259e73170ae603ea8abb 100644 (file)
@@ -23,6 +23,8 @@
 #include <asm/mmu.h>
 #endif
 
+#include <linux/pagemap.h>
+
 struct mmu_gather;
 
 #define tlb_start_vma(tlb, vma)        do { } while (0)
index 99a0439baa501b6def238c670428e2b5a06d1610..a022f806bb21eba7eea83420b01442cef25f4872 100644 (file)
@@ -97,6 +97,7 @@ struct ppc64_tlb_batch {
        real_pte_t              pte[PPC64_TLB_BATCH_NR];
        unsigned long           vaddr[PPC64_TLB_BATCH_NR];
        unsigned int            psize;
+       int                     ssize;
 };
 DECLARE_PER_CPU(struct ppc64_tlb_batch, ppc64_tlb_batch);
 
@@ -127,7 +128,7 @@ static inline void arch_leave_lazy_mmu_mode(void)
 
 
 extern void flush_hash_page(unsigned long va, real_pte_t pte, int psize,
-                           int local);
+                           int ssize, int local);
 extern void flush_hash_range(unsigned long number, int local);
 
 
index 3b363757a2bbf7370cdcff220becf11313f2fd8f..a584341c87e3f4c3d0c5d82bf831d39695be350f 100644 (file)
@@ -48,7 +48,7 @@ typedef unsigned long long __u64;
 
 typedef struct {
        __u32 u[4];
-} __attribute((aligned(16))) __vector128;
+} __attribute__((aligned(16))) __vector128;
 
 #endif /* __ASSEMBLY__ */
 
index afe3076bdc03d862465dcf181772c6672f704c50..46b09ba6bead6fa8b230436f6dc4508348189eff 100644 (file)
 /* Slow or fast type for UCCs.
 */
 enum ucc_speed_type {
-       UCC_SPEED_TYPE_FAST, UCC_SPEED_TYPE_SLOW
-};
-
-/* Initial UCCs Parameter RAM address relative to: MEM_MAP_BASE (IMMR).
-*/
-enum ucc_pram_initial_offset {
-       UCC_PRAM_OFFSET_UCC1 = 0x8400,
-       UCC_PRAM_OFFSET_UCC2 = 0x8500,
-       UCC_PRAM_OFFSET_UCC3 = 0x8600,
-       UCC_PRAM_OFFSET_UCC4 = 0x9000,
-       UCC_PRAM_OFFSET_UCC5 = 0x8000,
-       UCC_PRAM_OFFSET_UCC6 = 0x8100,
-       UCC_PRAM_OFFSET_UCC7 = 0x8200,
-       UCC_PRAM_OFFSET_UCC8 = 0x8300
+       UCC_SPEED_TYPE_FAST = UCC_GUEMR_MODE_FAST_RX | UCC_GUEMR_MODE_FAST_TX,
+       UCC_SPEED_TYPE_SLOW = UCC_GUEMR_MODE_SLOW_RX | UCC_GUEMR_MODE_SLOW_TX
 };
 
 /* ucc_set_type
  * Sets UCC to slow or fast mode.
  *
  * ucc_num - (In) number of UCC (0-7).
- * regs    - (In) pointer to registers base for the UCC.
  * speed   - (In) slow or fast mode for UCC.
  */
-int ucc_set_type(int ucc_num, struct ucc_common *regs,
-                enum ucc_speed_type speed);
-
-/* ucc_init_guemr
- * Init the Guemr register.
- *
- * regs - (In) pointer to registers base for the UCC.
- */
-int ucc_init_guemr(struct ucc_common *regs);
+int ucc_set_type(unsigned int ucc_num, enum ucc_speed_type speed);
 
-int ucc_set_qe_mux_mii_mng(int ucc_num);
+int ucc_set_qe_mux_mii_mng(unsigned int ucc_num);
 
-int ucc_set_qe_mux_rxtx(int ucc_num, enum qe_clock clock, enum comm_dir mode);
+int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock,
+       enum comm_dir mode);
 
-int ucc_mux_set_grant_tsa_bkpt(int ucc_num, int set, u32 mask);
+int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask);
 
 /* QE MUX clock routing for UCC
 */
-static inline int ucc_set_qe_mux_grant(int ucc_num, int set)
+static inline int ucc_set_qe_mux_grant(unsigned int ucc_num, int set)
 {
        return ucc_mux_set_grant_tsa_bkpt(ucc_num, set, QE_CMXUCR_GRANT);
 }
 
-static inline int ucc_set_qe_mux_tsa(int ucc_num, int set)
+static inline int ucc_set_qe_mux_tsa(unsigned int ucc_num, int set)
 {
        return ucc_mux_set_grant_tsa_bkpt(ucc_num, set, QE_CMXUCR_TSA);
 }
 
-static inline int ucc_set_qe_mux_bkpt(int ucc_num, int set)
+static inline int ucc_set_qe_mux_bkpt(unsigned int ucc_num, int set)
 {
        return ucc_mux_set_grant_tsa_bkpt(ucc_num, set, QE_CMXUCR_BKPT);
 }
index fdaac9d762bb5d5e101365be102f7e23ac7e032d..0980e6ad335b7fb2aa14ccc3dcbfd525025d56a5 100644 (file)
@@ -148,9 +148,10 @@ enum ucc_slow_diag_mode {
 
 struct ucc_slow_info {
        int ucc_num;
+       int protocol;                   /* QE_CR_PROTOCOL_xxx */
        enum qe_clock rx_clock;
        enum qe_clock tx_clock;
-       u32 regs;
+       phys_addr_t regs;
        int irq;
        u16 uccm_mask;
        int data_mem_part;
@@ -186,7 +187,7 @@ struct ucc_slow_info {
 
 struct ucc_slow_private {
        struct ucc_slow_info *us_info;
-       struct ucc_slow *us_regs;       /* a pointer to memory map of UCC regs */
+       struct ucc_slow __iomem *us_regs; /* Ptr to memory map of UCC regs */
        struct ucc_slow_pram *us_pram;  /* a pointer to the parameter RAM */
        u32 us_pram_offset;
        int enabled_tx;         /* Whether channel is enabled for Tx (ENT) */
@@ -277,12 +278,12 @@ void ucc_slow_graceful_stop_tx(struct ucc_slow_private * uccs);
  */
 void ucc_slow_stop_tx(struct ucc_slow_private * uccs);
 
-/* ucc_slow_restart_x
+/* ucc_slow_restart_tx
  * Restarts transmitting on a specified slow UCC.
  *
  * uccs - (In) pointer to the slow UCC structure.
  */
-void ucc_slow_restart_x(struct ucc_slow_private * uccs);
+void ucc_slow_restart_tx(struct ucc_slow_private *uccs);
 
 u32 ucc_slow_get_qe_cr_subblock(int uccs_num);
 
index ce9d82fb7b68c0cdbf2607f678c73014e0cfc6ae..a9e0b0ebcb0fe33cd8070f84a60e1a2a8b2ab020 100644 (file)
@@ -48,6 +48,7 @@ extern void __init udbg_init_rtas_console(void);
 extern void __init udbg_init_debug_beat(void);
 extern void __init udbg_init_btext(void);
 extern void __init udbg_init_44x_as1(void);
+extern void __init udbg_init_cpm(void);
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_UDBG_H */
index 3a0975e2adadad1ff673b6880ae04ed33f016449..9204c15839c57a01e6fe31720ead644705a08069 100644 (file)
@@ -53,18 +53,12 @@ struct vio_dev {
 };
 
 struct vio_driver {
-       struct list_head node;
        const struct vio_device_id *id_table;
        int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
        int (*remove)(struct vio_dev *dev);
-       void (*shutdown)(struct vio_dev *dev);
-       unsigned long driver_data;
        struct device_driver driver;
 };
 
-extern struct dma_mapping_ops vio_dma_ops;
-extern struct bus_type vio_bus_type;
-
 extern int vio_register_driver(struct vio_driver *drv);
 extern void vio_unregister_driver(struct vio_driver *drv);
 
diff --git a/include/asm-powerpc/xilinx_intc.h b/include/asm-powerpc/xilinx_intc.h
new file mode 100644 (file)
index 0000000..343612f
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Xilinx intc external definitions
+ *
+ * Copyright 2007 Secret Lab Technologies Ltd.
+ *
+ * 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 _ASM_POWERPC_XILINX_INTC_H
+#define _ASM_POWERPC_XILINX_INTC_H
+
+#ifdef __KERNEL__
+
+extern void __init xilinx_intc_init_tree(void);
+extern unsigned int xilinx_intc_get_irq(void);
+
+#endif /* __KERNEL__ */
+#endif /* _ASM_POWERPC_XILINX_INTC_H */
diff --git a/include/asm-ppc/amigahw.h b/include/asm-ppc/amigahw.h
deleted file mode 100644 (file)
index 90fd127..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifdef __KERNEL__
-#ifndef __ASMPPC_AMIGAHW_H
-#define __ASMPPC_AMIGAHW_H
-
-#include <asm-m68k/amigahw.h>
-
-#undef CHIP_PHYSADDR
-#ifdef CONFIG_APUS_FAST_EXCEPT
-#define CHIP_PHYSADDR      (0x000000)
-#else
-#define CHIP_PHYSADDR      (0x004000)
-#endif
-
-
-#endif /* __ASMPPC_AMIGAHW_H */
-#endif /* __KERNEL__ */
diff --git a/include/asm-ppc/amigaints.h b/include/asm-ppc/amigaints.h
deleted file mode 100644 (file)
index aa3ff63..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
-** amigaints.h -- Amiga Linux interrupt handling structs and prototypes
-**
-** Copyright 1992 by Greg Harp
-**
-** 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.
-**
-** Created 10/2/92 by Greg Harp
-*/
-
-#ifdef __KERNEL__
-#ifndef _ASMm68k_AMIGAINTS_H_
-#define _ASMm68k_AMIGAINTS_H_
-
-/*
-** Amiga Interrupt sources.
-**
-*/
-
-#define AUTO_IRQS           (8)
-#define AMI_STD_IRQS        (14)
-#define CIA_IRQS            (5)
-#define AMI_IRQS            (32) /* AUTO_IRQS+AMI_STD_IRQS+2*CIA_IRQS */
-
-/* vertical blanking interrupt */
-#define IRQ_AMIGA_VERTB     0
-
-/* copper interrupt */
-#define IRQ_AMIGA_COPPER    1
-
-/* Audio interrupts */
-#define IRQ_AMIGA_AUD0     2
-#define IRQ_AMIGA_AUD1     3
-#define IRQ_AMIGA_AUD2     4
-#define IRQ_AMIGA_AUD3     5
-
-/* Blitter done interrupt */
-#define IRQ_AMIGA_BLIT     6
-
-/* floppy disk interrupts */
-#define IRQ_AMIGA_DSKSYN    7
-#define IRQ_AMIGA_DSKBLK    8
-
-/* builtin serial port interrupts */
-#define IRQ_AMIGA_RBF      9
-#define IRQ_AMIGA_TBE      10
-
-/* software interrupts */
-#define IRQ_AMIGA_SOFT      11
-
-/* interrupts from external hardware */
-#define IRQ_AMIGA_PORTS            12
-#define IRQ_AMIGA_EXTER            13
-
-/* CIA interrupt sources */
-#define IRQ_AMIGA_CIAA      14
-#define IRQ_AMIGA_CIAA_TA   14
-#define IRQ_AMIGA_CIAA_TB   15
-#define IRQ_AMIGA_CIAA_ALRM 16
-#define IRQ_AMIGA_CIAA_SP   17
-#define IRQ_AMIGA_CIAA_FLG  18
-#define IRQ_AMIGA_CIAB      19
-#define IRQ_AMIGA_CIAB_TA   19
-#define IRQ_AMIGA_CIAB_TB   20
-#define IRQ_AMIGA_CIAB_ALRM 21
-#define IRQ_AMIGA_CIAB_SP   22
-#define IRQ_AMIGA_CIAB_FLG  23
-
-/* auto-vector interrupts */
-#define IRQ_AMIGA_AUTO      24
-#define IRQ_AMIGA_AUTO_0    24 /* This is just a dummy */
-#define IRQ_AMIGA_AUTO_1    25
-#define IRQ_AMIGA_AUTO_2    26
-#define IRQ_AMIGA_AUTO_3    27
-#define IRQ_AMIGA_AUTO_4    28
-#define IRQ_AMIGA_AUTO_5    29
-#define IRQ_AMIGA_AUTO_6    30
-#define IRQ_AMIGA_AUTO_7    31
-
-#define IRQ_FLOPPY         IRQ_AMIGA_DSKBLK
-
-/* INTREQR masks */
-#define IRQ1_MASK   0x0007     /* INTREQR mask for IRQ 1 */
-#define IRQ2_MASK   0x0008     /* INTREQR mask for IRQ 2 */
-#define IRQ3_MASK   0x0070     /* INTREQR mask for IRQ 3 */
-#define IRQ4_MASK   0x0780     /* INTREQR mask for IRQ 4 */
-#define IRQ5_MASK   0x1800     /* INTREQR mask for IRQ 5 */
-#define IRQ6_MASK   0x2000     /* INTREQR mask for IRQ 6 */
-#define IRQ7_MASK   0x4000     /* INTREQR mask for IRQ 7 */
-
-#define IF_SETCLR   0x8000      /* set/clr bit */
-#define IF_INTEN    0x4000     /* master interrupt bit in INT* registers */
-#define IF_EXTER    0x2000     /* external level 6 and CIA B interrupt */
-#define IF_DSKSYN   0x1000     /* disk sync interrupt */
-#define IF_RBF     0x0800      /* serial receive buffer full interrupt */
-#define IF_AUD3     0x0400     /* audio channel 3 done interrupt */
-#define IF_AUD2     0x0200     /* audio channel 2 done interrupt */
-#define IF_AUD1     0x0100     /* audio channel 1 done interrupt */
-#define IF_AUD0     0x0080     /* audio channel 0 done interrupt */
-#define IF_BLIT     0x0040     /* blitter done interrupt */
-#define IF_VERTB    0x0020     /* vertical blanking interrupt */
-#define IF_COPER    0x0010     /* copper interrupt */
-#define IF_PORTS    0x0008     /* external level 2 and CIA A interrupt */
-#define IF_SOFT     0x0004     /* software initiated interrupt */
-#define IF_DSKBLK   0x0002     /* diskblock DMA finished */
-#define IF_TBE     0x0001      /* serial transmit buffer empty interrupt */
-
-extern void amiga_do_irq(int irq, struct pt_regs *fp);
-extern void amiga_do_irq_list(int irq, struct pt_regs *fp);
-
-/* CIA interrupt control register bits */
-
-#define CIA_ICR_TA     0x01
-#define CIA_ICR_TB     0x02
-#define CIA_ICR_ALRM   0x04
-#define CIA_ICR_SP     0x08
-#define CIA_ICR_FLG    0x10
-#define CIA_ICR_ALL    0x1f
-#define CIA_ICR_SETCLR 0x80
-
-/* to access the interrupt control registers of CIA's use only
-** these functions, they behave exactly like the amiga os routines
-*/
-
-extern struct ciabase ciaa_base, ciab_base;
-
-extern unsigned char cia_set_irq(unsigned int irq, int set);
-extern unsigned char cia_able_irq(unsigned int irq, int enable);
-
-#endif /* asm-m68k/amigaints.h */
-#endif /* __KERNEL__ */
diff --git a/include/asm-ppc/amigappc.h b/include/asm-ppc/amigappc.h
deleted file mode 100644 (file)
index 35114ce..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-** asm-ppc/amigappc.h -- This header defines some values and pointers for
-**                        the Phase 5 PowerUp card.
-**
-** Copyright 1997, 1998 by Phase5, Germany.
-**
-** 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.
-**
-** Created: 7/22/97 by Jesper Skov
-*/
-
-#ifdef __KERNEL__
-#ifndef _M68K_AMIGAPPC_H
-#define _M68K_AMIGAPPC_H
-
-#ifndef __ASSEMBLY__
-
-/* #include <asm/system.h> */
-#define mb()  __asm__ __volatile__ ("sync" : : : "memory")
-
-#define APUS_WRITE(_a_, _v_)                           \
-do {                                                   \
-       (*((volatile unsigned char *)(_a_)) = (_v_));   \
-       mb();                                           \
-} while (0)
-
-#define APUS_READ(_a_, _v_)                            \
-do {                                                   \
-       (_v_) = (*((volatile unsigned char *)(_a_)));   \
-       mb();                                           \
-} while (0)
-#endif /* ndef __ASSEMBLY__ */
-
-/* Maybe add a [#ifdef WANT_ZTWOBASE] condition to amigahw.h? */
-#define zTwoBase (0x80000000)
-
-#define APUS_IPL_BASE          (zTwoBase + 0x00f60000)
-#define APUS_REG_RESET         (APUS_IPL_BASE + 0x00)
-#define APUS_REG_WAITSTATE     (APUS_IPL_BASE + 0x10)
-#define APUS_REG_SHADOW        (APUS_IPL_BASE + 0x18)
-#define APUS_REG_LOCK          (APUS_IPL_BASE + 0x20)
-#define APUS_REG_INT           (APUS_IPL_BASE + 0x28)
-#define APUS_IPL_EMU           (APUS_IPL_BASE + 0x30)
-#define APUS_INT_LVL           (APUS_IPL_BASE + 0x38)
-
-#define REGSHADOW_SETRESET     (0x80)
-#define REGSHADOW_SELFRESET    (0x40)
-
-#define REGLOCK_SETRESET       (0x80)
-#define REGLOCK_BLACKMAGICK1   (0x40)
-#define REGLOCK_BLACKMAGICK2   (0x20)
-#define REGLOCK_BLACKMAGICK3   (0x10)
-
-#define REGWAITSTATE_SETRESET  (0x80)
-#define REGWAITSTATE_PPCW      (0x08)
-#define REGWAITSTATE_PPCR      (0x04)
-
-#define REGRESET_SETRESET      (0x80)
-#define REGRESET_PPCRESET      (0x10)
-#define REGRESET_M68KRESET     (0x08)
-#define REGRESET_AMIGARESET    (0x04)
-#define REGRESET_AUXRESET      (0x02)
-#define REGRESET_SCSIRESET     (0x01)
-
-#define REGINT_SETRESET                (0x80)
-#define REGINT_ENABLEIPL       (0x02)
-#define REGINT_INTMASTER       (0x01)
-
-#define IPLEMU_SETRESET                (0x80)
-#define IPLEMU_DISABLEINT      (0x40)
-#define IPLEMU_IPL2            (0x20)
-#define IPLEMU_IPL1            (0x10)
-#define IPLEMU_IPL0            (0x08)
-#define IPLEMU_PPCIPL2         (0x04)
-#define IPLEMU_PPCIPL1         (0x02)
-#define IPLEMU_PPCIPL0         (0x01)
-#define IPLEMU_IPLMASK         (IPLEMU_PPCIPL2|IPLEMU_PPCIPL1|IPLEMU_PPCIPL0)
-
-#define INTLVL_SETRESET         (0x80)
-#define INTLVL_MASK             (0x7f)
-
-#endif /* _M68k_AMIGAPPC_H */
-#endif /* __KERNEL__ */
diff --git a/include/asm-ppc/ans-lcd.h b/include/asm-ppc/ans-lcd.h
deleted file mode 100644 (file)
index d795b9f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef _PPC_ANS_LCD_H
-#define _PPC_ANS_LCD_H
-
-#define ANSLCD_MINOR           156
-
-#define ANSLCD_CLEAR           0x01
-#define ANSLCD_SENDCTRL                0x02
-#define ANSLCD_SETSHORTDELAY   0x03
-#define ANSLCD_SETLONGDELAY    0x04
-
-#endif
index 2ace4a74f26327cba677492f2f074a9524383b10..f6ed77aee3281c7dc046faccee5065b6d1b31088 100644 (file)
 
 #include <asm/page.h>
 
-#if defined(CONFIG_APUS) && !defined(__BOOTER__)
-#include <asm-m68k/bootinfo.h>
-#else
-
 struct bi_record {
        unsigned long tag;              /* tag ID */
        unsigned long size;             /* size of record (in bytes) */
@@ -44,7 +40,6 @@ bootinfo_addr(unsigned long offset)
        return (struct bi_record *)_ALIGN((offset) + (1 << 20) - 1,
                                          (1 << 20));
 }
-#endif /* CONFIG_APUS */
 
 
 #endif /* _PPC_BOOTINFO_H */
index 95d590423cf2d1fde47616bb4c09ee64022459ad..8f58231a8bc67bdf490182294036b2e2a05733b3 100644 (file)
@@ -30,7 +30,7 @@
 #include <asm/mpc8xx.h>
 #elif defined(CONFIG_8260)
 #include <asm/mpc8260.h>
-#elif defined(CONFIG_APUS) || !defined(CONFIG_PCI)
+#elif !defined(CONFIG_PCI)
 #define _IO_BASE       0
 #define _ISA_MEM_BASE  0
 #define PCI_DRAM_OFFSET 0
@@ -145,24 +145,7 @@ static inline void writeb(__u8 b, volatile void __iomem *addr)
 }
 #endif
 
-#if defined(CONFIG_APUS)
-static inline __u16 readw(const volatile void __iomem *addr)
-{
-       return *(__force volatile __u16 *)(addr);
-}
-static inline __u32 readl(const volatile void __iomem *addr)
-{
-       return *(__force volatile __u32 *)(addr);
-}
-static inline void writew(__u16 b, volatile void __iomem *addr)
-{
-       *(__force volatile __u16 *)(addr) = b;
-}
-static inline void writel(__u32 b, volatile void __iomem *addr)
-{
-       *(__force volatile __u32 *)(addr) = b;
-}
-#elif defined (CONFIG_8260_PCI9)
+#if defined (CONFIG_8260_PCI9)
 /* Use macros if PCI9 workaround enabled */
 #define readw(addr) in_le16((volatile u16 *)(addr))
 #define readl(addr) in_le32((volatile u32 *)(addr))
@@ -185,7 +168,7 @@ static inline void writel(__u32 b, volatile void __iomem *addr)
 {
        out_le32(addr, b);
 }
-#endif /* CONFIG_APUS */
+#endif /* CONFIG_8260_PCI9 */
 
 #define readb_relaxed(addr) readb(addr)
 #define readw_relaxed(addr) readw(addr)
@@ -300,13 +283,7 @@ extern __inline__ void name(unsigned int val, unsigned int port) \
 }
 
 __do_out_asm(outb, "stbx")
-#ifdef CONFIG_APUS
-__do_in_asm(inb, "lbzx")
-__do_in_asm(inw, "lhz%U1%X1")
-__do_in_asm(inl, "lwz%U1%X1")
-__do_out_asm(outl,"stw%U0%X0")
-__do_out_asm(outw, "sth%U0%X0")
-#elif defined (CONFIG_8260_PCI9)
+#if defined (CONFIG_8260_PCI9)
 /* in asm cannot be defined if PCI9 workaround is used */
 #define inb(port)              in_8((port)+___IO_BASE)
 #define inw(port)              in_le16((port)+___IO_BASE)
@@ -371,7 +348,6 @@ extern void __iomem *ioremap64(unsigned long long address, unsigned long size);
 #define ioremap_nocache(addr, size)    ioremap((addr), (size))
 extern void iounmap(volatile void __iomem *addr);
 extern unsigned long iopa(unsigned long addr);
-extern unsigned long mm_ptov(unsigned long addr) __attribute_const__;
 extern void io_block_mapping(unsigned long virt, phys_addr_t phys,
                             unsigned int size, int flags);
 
@@ -384,24 +360,16 @@ extern void io_block_mapping(unsigned long virt, phys_addr_t phys,
  */
 extern inline unsigned long virt_to_bus(volatile void * address)
 {
-#ifndef CONFIG_APUS
         if (address == (void *)0)
                return 0;
         return (unsigned long)address - KERNELBASE + PCI_DRAM_OFFSET;
-#else
-       return iopa ((unsigned long) address);
-#endif
 }
 
 extern inline void * bus_to_virt(unsigned long address)
 {
-#ifndef CONFIG_APUS
         if (address == 0)
                return NULL;
         return (void *)(address - PCI_DRAM_OFFSET + KERNELBASE);
-#else
-       return (void*) mm_ptov (address);
-#endif
 }
 
 /*
@@ -410,20 +378,12 @@ extern inline void * bus_to_virt(unsigned long address)
  */
 extern inline unsigned long virt_to_phys(volatile void * address)
 {
-#ifndef CONFIG_APUS
        return (unsigned long) address - KERNELBASE;
-#else
-       return iopa ((unsigned long) address);
-#endif
 }
 
 extern inline void * phys_to_virt(unsigned long address)
 {
-#ifndef CONFIG_APUS
        return (void *) (address + KERNELBASE);
-#else
-       return (void*) mm_ptov (address);
-#endif
 }
 
 /*
@@ -553,4 +513,7 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
 #define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) |  (_v))
 #define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
 
+#define setbits8(_addr, _v) out_8((_addr), in_8(_addr) |  (_v))
+#define clrbits8(_addr, _v) out_8((_addr), in_8(_addr) & ~(_v))
+
 #endif /* __KERNEL__ */
index 293a444a1d7724d057528655336f6e96a2a943cd..a20b499b0186c6606aa8be36f5a182314c5ed0ae 100644 (file)
@@ -8,10 +8,6 @@
 #include <asm/setup.h>
 #include <asm/page.h>
 
-#ifdef CONFIG_APUS
-#include <asm-m68k/machdep.h>
-#endif
-
 struct pt_regs;
 struct pci_bus;        
 struct pci_dev;
index 16dbc7d174506e2b2754210ab24e7451f3cca6e7..1379a4f76de3bf51af5273949dfb5c96e4f6a82b 100644 (file)
 #include <linux/init.h>
 #include <linux/list.h>
 #include <linux/device.h>
+#include <linux/rwsem.h>
 
 #include <asm/mmu.h>
 #include <asm/ocp_ids.h>
-#include <asm/rwsem.h>
 #include <asm/semaphore.h>
 
 #ifdef CONFIG_PPC_OCP
index fe95c8258cf9f3e40397b97149fd651e61fa8c13..ad4c5a1bc9d658daab08ca0825d55cb728e1b8a2 100644 (file)
@@ -97,62 +97,22 @@ extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
 extern void copy_user_page(void *to, void *from, unsigned long vaddr,
                           struct page *pg);
 
-#ifndef CONFIG_APUS
 #define PPC_MEMSTART   0
-#define PPC_PGSTART    0
 #define PPC_MEMOFFSET  PAGE_OFFSET
-#else
-extern unsigned long ppc_memstart;
-extern unsigned long ppc_pgstart;
-extern unsigned long ppc_memoffset;
-#define PPC_MEMSTART   ppc_memstart
-#define PPC_PGSTART    ppc_pgstart
-#define PPC_MEMOFFSET  ppc_memoffset
-#endif
 
-#if defined(CONFIG_APUS) && !defined(MODULE)
-/* map phys->virtual and virtual->phys for RAM pages */
-static inline unsigned long ___pa(unsigned long v)
-{
-       unsigned long p;
-       asm volatile ("1: addis %0, %1, %2;"
-                     ".section \".vtop_fixup\",\"aw\";"
-                     ".align  1;"
-                     ".long   1b;"
-                     ".previous;"
-                     : "=r" (p)
-                     : "b" (v), "K" (((-PAGE_OFFSET) >> 16) & 0xffff));
-
-       return p;
-}
-static inline void* ___va(unsigned long p)
-{
-       unsigned long v;
-       asm volatile ("1: addis %0, %1, %2;"
-                     ".section \".ptov_fixup\",\"aw\";"
-                     ".align  1;"
-                     ".long   1b;"
-                     ".previous;"
-                     : "=r" (v)
-                     : "b" (p), "K" (((PAGE_OFFSET) >> 16) & 0xffff));
-
-       return (void*) v;
-}
-#else
 #define ___pa(vaddr) ((vaddr)-PPC_MEMOFFSET)
 #define ___va(paddr) ((paddr)+PPC_MEMOFFSET)
-#endif
 
 extern int page_is_ram(unsigned long pfn);
 
 #define __pa(x) ___pa((unsigned long)(x))
 #define __va(x) ((void *)(___va((unsigned long)(x))))
 
-#define ARCH_PFN_OFFSET                (PPC_PGSTART)
+#define ARCH_PFN_OFFSET                0
 #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
 #define page_to_virt(page)     __va(page_to_pfn(page) << PAGE_SHIFT)
 
-#define pfn_valid(pfn)         (((pfn) - PPC_PGSTART) < max_mapnr)
+#define pfn_valid(pfn)         ((pfn) < max_mapnr)
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
 /* Pure 2^n version of get_order */
index c159315d2c8f0f31d5903f1805b2a2429dd38320..063ad91cbbcc273e3fa69c9b51e3c957f6fc1538 100644 (file)
@@ -765,14 +765,6 @@ extern void paging_init(void);
 #define pte_to_pgoff(pte)      (pte_val(pte) >> 3)
 #define pgoff_to_pte(off)      ((pte_t) { ((off) << 3) | _PAGE_FILE })
 
-/* CONFIG_APUS */
-/* For virtual address to physical address conversion */
-extern void cache_clear(__u32 addr, int length);
-extern void cache_push(__u32 addr, int length);
-extern int mm_end_of_chunk (unsigned long addr, int len);
-extern unsigned long iopa(unsigned long addr);
-extern unsigned long mm_ptov(unsigned long addr) __attribute_const__;
-
 /* Values for nocacheflag and cmode */
 /* These are not used by the APUS kernel_map, but prevents
    compilation errors. */
index 901f7fa8b2d7dbda789913eecd180a6d0cadc588..71f4c996fe750f4453ca7a1a11e2626391ac2887 100644 (file)
@@ -35,7 +35,6 @@ extern unsigned long sub_reloc_offset(unsigned long);
 #define machine_is_compatible(x)               0
 #define of_find_compatible_node(f, t, c)       NULL
 #define of_get_property(p, n, l)               NULL
-#define get_property(a, b, c)                  of_get_property((a), (b), (c))
 
 #endif /* _PPC_PROM_H */
 #endif /* __KERNEL__ */
index 8b17ffe222c462c8133cb507e3e90767f53b80ab..d2da84acf45d8266bc4fd1b7cea428b1c7296a73 100644 (file)
@@ -389,12 +389,14 @@ extern Elf64_Dyn _DYNAMIC [];
 
 #endif
 
+/* Optional callbacks to write extra ELF notes. */
 #ifndef ARCH_HAVE_EXTRA_ELF_NOTES
-static inline int arch_notes_size(void) { return 0; }
-static inline void arch_write_notes(struct file *file) { }
-
-#define ELF_CORE_EXTRA_NOTES_SIZE arch_notes_size()
-#define ELF_CORE_WRITE_EXTRA_NOTES arch_write_notes(file)
-#endif /* ARCH_HAVE_EXTRA_ELF_NOTES */
+static inline int elf_coredump_extra_notes_size(void) { return 0; }
+static inline int elf_coredump_extra_notes_write(struct file *file,
+                       loff_t *foffset) { return 0; }
+#else
+extern int elf_coredump_extra_notes_size(void);
+extern int elf_coredump_extra_notes_write(struct file *file, loff_t *foffset);
+#endif
 
 #endif /* _LINUX_ELF_H */
index 47734ffd97451698c1233c4cbae6f0c16317574c..6df80e9859147973ecd06d6c2863d400b838d71a 100644 (file)
@@ -54,7 +54,6 @@ extern int of_device_is_compatible(const struct device_node *device,
 extern const void *of_get_property(const struct device_node *node,
                                const char *name,
                                int *lenp);
-#define get_property(a, b, c)  of_get_property((a), (b), (c))
 extern int of_n_addr_cells(struct device_node *np);
 extern int of_n_size_cells(struct device_node *np);
 
index 8acae4eeaa763373f6908c52189218c228e5f23d..3948708c42ca66156ce733dacf7b263445c094f5 100644 (file)
 #define PCI_DEVICE_ID_MPC8533          0x0031
 #define PCI_DEVICE_ID_MPC8544E         0x0032
 #define PCI_DEVICE_ID_MPC8544          0x0033
+#define PCI_DEVICE_ID_MPC8572E         0x0040
+#define PCI_DEVICE_ID_MPC8572          0x0041
 #define PCI_DEVICE_ID_MPC8641          0x7010
 #define PCI_DEVICE_ID_MPC8641D         0x7011
+#define PCI_DEVICE_ID_MPC8610          0x7018
 
 #define PCI_VENDOR_ID_PASEMI           0x1959
 
diff --git a/include/linux/xilinxfb.h b/include/linux/xilinxfb.h
new file mode 100644 (file)
index 0000000..f2463f5
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Platform device data for Xilinx Framebuffer device
+ *
+ * Copyright 2007 Secret Lab Technologies Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2.  This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#ifndef __XILINXFB_H__
+#define __XILINXFB_H__
+
+#include <linux/types.h>
+
+/* ML300/403 reference design framebuffer driver platform data struct */
+struct xilinxfb_platform_data {
+       u32 rotate_screen;      /* Flag to rotate display 180 degrees */
+       u32 screen_height_mm;   /* Physical dimentions of screen in mm */
+       u32 screen_width_mm;
+       u32 xres, yres;         /* resolution of screen in pixels */
+       u32 xvirt, yvirt;       /* resolution of memory buffer */
+
+       /* Physical address of framebuffer memory; If non-zero, driver
+        * will use provided memory address instead of allocating one from
+        * the consistent pool. */
+       u32 fb_phys;
+};
+
+#endif  /* __XILINXFB_H__ */
index 53a456ebf6d50dd3e4705ccc84e5b0a1c44f6c90..c7314f95264763d10d5b0417aa29cf41ed26fd36 100644 (file)
@@ -1221,7 +1221,7 @@ static ctl_table fs_table[] = {
 };
 
 static ctl_table debug_table[] = {
-#ifdef CONFIG_X86
+#if defined(CONFIG_X86) || defined(CONFIG_PPC)
        {
                .ctl_name       = CTL_UNNUMBERED,
                .procname       = "exception-trace",
index cdc9b099e620f9fa00398c746e2b4cdd29bce554..396c38b3cb69f76f90b7882d45c448170eba8044 100644 (file)
@@ -167,7 +167,7 @@ config SLUB_DEBUG_ON
 
 config DEBUG_PREEMPT
        bool "Debug preemptible kernel"
-       depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT
+       depends on DEBUG_KERNEL && PREEMPT && (TRACE_IRQFLAGS_SUPPORT || PPC64)
        default y
        help
          If you say Y here then the kernel will use a debug variant of the