Merge branch 'virtex-for-2.6.27' of git://git.secretlab.ca/git/linux-2.6-virtex into 4xx-next
This commit is contained in:
Коммит
beae4c03c0
|
@ -0,0 +1,141 @@
|
||||||
|
The PowerPC boot wrapper
|
||||||
|
------------------------
|
||||||
|
Copyright (C) Secret Lab Technologies Ltd.
|
||||||
|
|
||||||
|
PowerPC image targets compresses and wraps the kernel image (vmlinux) with
|
||||||
|
a boot wrapper to make it usable by the system firmware. There is no
|
||||||
|
standard PowerPC firmware interface, so the boot wrapper is designed to
|
||||||
|
be adaptable for each kind of image that needs to be built.
|
||||||
|
|
||||||
|
The boot wrapper can be found in the arch/powerpc/boot/ directory. The
|
||||||
|
Makefile in that directory has targets for all the available image types.
|
||||||
|
The different image types are used to support all of the various firmware
|
||||||
|
interfaces found on PowerPC platforms. OpenFirmware is the most commonly
|
||||||
|
used firmware type on general purpose PowerPC systems from Apple, IBM and
|
||||||
|
others. U-Boot is typically found on embedded PowerPC hardware, but there
|
||||||
|
are a handful of other firmware implementations which are also popular. Each
|
||||||
|
firmware interface requires a different image format.
|
||||||
|
|
||||||
|
The boot wrapper is built from the makefile in arch/powerpc/boot/Makefile and
|
||||||
|
it uses the wrapper script (arch/powerpc/boot/wrapper) to generate target
|
||||||
|
image. The details of the build system is discussed in the next section.
|
||||||
|
Currently, the following image format targets exist:
|
||||||
|
|
||||||
|
cuImage.%: Backwards compatible uImage for older version of
|
||||||
|
U-Boot (for versions that don't understand the device
|
||||||
|
tree). This image embeds a device tree blob inside
|
||||||
|
the image. The boot wrapper, kernel and device tree
|
||||||
|
are all embedded inside the U-Boot uImage file format
|
||||||
|
with boot wrapper code that extracts data from the old
|
||||||
|
bd_info structure and loads the data into the device
|
||||||
|
tree before jumping into the kernel.
|
||||||
|
Because of the series of #ifdefs found in the
|
||||||
|
bd_info structure used in the old U-Boot interfaces,
|
||||||
|
cuImages are platform specific. Each specific
|
||||||
|
U-Boot platform has a different platform init file
|
||||||
|
which populates the embedded device tree with data
|
||||||
|
from the platform specific bd_info file. The platform
|
||||||
|
specific cuImage platform init code can be found in
|
||||||
|
arch/powerpc/boot/cuboot.*.c. Selection of the correct
|
||||||
|
cuImage init code for a specific board can be found in
|
||||||
|
the wrapper structure.
|
||||||
|
dtbImage.%: Similar to zImage, except device tree blob is embedded
|
||||||
|
inside the image instead of provided by firmware. The
|
||||||
|
output image file can be either an elf file or a flat
|
||||||
|
binary depending on the platform.
|
||||||
|
dtbImages are used on systems which do not have an
|
||||||
|
interface for passing a device tree directly.
|
||||||
|
dtbImages are similar to simpleImages except that
|
||||||
|
dtbImages have platform specific code for extracting
|
||||||
|
data from the board firmware, but simpleImages do not
|
||||||
|
talk to the firmware at all.
|
||||||
|
PlayStation 3 support uses dtbImage. So do Embedded
|
||||||
|
Planet boards using the PlanetCore firmware. Board
|
||||||
|
specific initialization code is typically found in a
|
||||||
|
file named arch/powerpc/boot/<platform>.c; but this
|
||||||
|
can be overridden by the wrapper script.
|
||||||
|
simpleImage.%: Firmware independent compressed image that does not
|
||||||
|
depend on any particular firmware interface and embeds
|
||||||
|
a device tree blob. This image is a flat binary that
|
||||||
|
can be loaded to any location in RAM and jumped to.
|
||||||
|
Firmware cannot pass any configuration data to the
|
||||||
|
kernel with this image type and it depends entirely on
|
||||||
|
the embedded device tree for all information.
|
||||||
|
The simpleImage is useful for booting systems with
|
||||||
|
an unknown firmware interface or for booting from
|
||||||
|
a debugger when no firmware is present (such as on
|
||||||
|
the Xilinx Virtex platform). The only assumption that
|
||||||
|
simpleImage makes is that RAM is correctly initialized
|
||||||
|
and that the MMU is either off or has RAM mapped to
|
||||||
|
base address 0.
|
||||||
|
simpleImage also supports inserting special platform
|
||||||
|
specific initialization code to the start of the bootup
|
||||||
|
sequence. The virtex405 platform uses this feature to
|
||||||
|
ensure that the cache is invalidated before caching
|
||||||
|
is enabled. Platform specific initialization code is
|
||||||
|
added as part of the wrapper script and is keyed on
|
||||||
|
the image target name. For example, all
|
||||||
|
simpleImage.virtex405-* targets will add the
|
||||||
|
virtex405-head.S initialization code (This also means
|
||||||
|
that the dts file for virtex405 targets should be
|
||||||
|
named (virtex405-<board>.dts). Search the wrapper
|
||||||
|
script for 'virtex405' and see the file
|
||||||
|
arch/powerpc/boot/virtex405-head.S for details.
|
||||||
|
treeImage.%; Image format for used with OpenBIOS firmware found
|
||||||
|
on some ppc4xx hardware. This image embeds a device
|
||||||
|
tree blob inside the image.
|
||||||
|
uImage: Native image format used by U-Boot. The uImage target
|
||||||
|
does not add any boot code. It just wraps a compressed
|
||||||
|
vmlinux in the uImage data structure. This image
|
||||||
|
requires a version of U-Boot that is able to pass
|
||||||
|
a device tree to the kernel at boot. If using an older
|
||||||
|
version of U-Boot, then you need to use a cuImage
|
||||||
|
instead.
|
||||||
|
zImage.%: Image format which does not embed a device tree.
|
||||||
|
Used by OpenFirmware and other firmware interfaces
|
||||||
|
which are able to supply a device tree. This image
|
||||||
|
expects firmware to provide the device tree at boot.
|
||||||
|
Typically, if you have general purpose PowerPC
|
||||||
|
hardware then you want this image format.
|
||||||
|
|
||||||
|
Image types which embed a device tree blob (simpleImage, dtbImage, treeImage,
|
||||||
|
and cuImage) all generate the device tree blob from a file in the
|
||||||
|
arch/powerpc/boot/dts/ directory. The Makefile selects the correct device
|
||||||
|
tree source based on the name of the target. Therefore, if the kernel is
|
||||||
|
built with 'make treeImage.walnut simpleImage.virtex405-ml403', then the
|
||||||
|
build system will use arch/powerpc/boot/dts/walnut.dts to build
|
||||||
|
treeImage.walnut and arch/powerpc/boot/dts/virtex405-ml403.dts to build
|
||||||
|
the simpleImage.virtex405-ml403.
|
||||||
|
|
||||||
|
Two special targets called 'zImage' and 'zImage.initrd' also exist. These
|
||||||
|
targets build all the default images as selected by the kernel configuration.
|
||||||
|
Default images are selected by the boot wrapper Makefile
|
||||||
|
(arch/powerpc/boot/Makefile) by adding targets to the $image-y variable. Look
|
||||||
|
at the Makefile to see which default image targets are available.
|
||||||
|
|
||||||
|
How it is built
|
||||||
|
---------------
|
||||||
|
arch/powerpc is designed to support multiplatform kernels, which means
|
||||||
|
that a single vmlinux image can be booted on many different target boards.
|
||||||
|
It also means that the boot wrapper must be able to wrap for many kinds of
|
||||||
|
images on a single build. The design decision was made to not use any
|
||||||
|
conditional compilation code (#ifdef, etc) in the boot wrapper source code.
|
||||||
|
All of the boot wrapper pieces are buildable at any time regardless of the
|
||||||
|
kernel configuration. Building all the wrapper bits on every kernel build
|
||||||
|
also ensures that obscure parts of the wrapper are at the very least compile
|
||||||
|
tested in a large variety of environments.
|
||||||
|
|
||||||
|
The wrapper is adapted for different image types at link time by linking in
|
||||||
|
just the wrapper bits that are appropriate for the image type. The 'wrapper
|
||||||
|
script' (found in arch/powerpc/boot/wrapper) is called by the Makefile and
|
||||||
|
is responsible for selecting the correct wrapper bits for the image type.
|
||||||
|
The arguments are well documented in the script's comment block, so they
|
||||||
|
are not repeated here. However, it is worth mentioning that the script
|
||||||
|
uses the -p (platform) argument as the main method of deciding which wrapper
|
||||||
|
bits to compile in. Look for the large 'case "$platform" in' block in the
|
||||||
|
middle of the script. This is also the place where platform specific fixups
|
||||||
|
can be selected by changing the link order.
|
||||||
|
|
||||||
|
In particular, care should be taken when working with cuImages. cuImage
|
||||||
|
wrapper bits are very board specific and care should be taken to make sure
|
||||||
|
the target you are trying to build is supported by the wrapper bits.
|
|
@ -458,6 +458,19 @@ config CMDLINE
|
||||||
some command-line options at build time by entering them here. In
|
some command-line options at build time by entering them here. In
|
||||||
most cases you will need to specify the root device here.
|
most cases you will need to specify the root device here.
|
||||||
|
|
||||||
|
config EXTRA_TARGETS
|
||||||
|
string "Additional default image types"
|
||||||
|
help
|
||||||
|
List additional targets to be built by the bootwrapper here (separated
|
||||||
|
by spaces). This is useful for targets that depend of device tree
|
||||||
|
files in the .dts directory.
|
||||||
|
|
||||||
|
Targets in this list will be build as part of the default build
|
||||||
|
target, or when the user does a 'make zImage' or a
|
||||||
|
'make zImage.initrd'.
|
||||||
|
|
||||||
|
If unsure, leave blank
|
||||||
|
|
||||||
if !44x || BROKEN
|
if !44x || BROKEN
|
||||||
config ARCH_WANTS_FREEZER_CONTROL
|
config ARCH_WANTS_FREEZER_CONTROL
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -163,12 +163,25 @@ bootwrapper_install %.dtb:
|
||||||
$(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
|
$(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
|
||||||
|
|
||||||
define archhelp
|
define archhelp
|
||||||
@echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
|
@echo '* zImage - Build default images selected by kernel config'
|
||||||
|
@echo ' zImage.* - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
|
||||||
|
@echo ' uImage - U-Boot native image format'
|
||||||
|
@echo ' cuImage.<dt> - Backwards compatible U-Boot image for older'
|
||||||
|
@echo ' versions which do not support device trees'
|
||||||
|
@echo ' dtbImage.<dt> - zImage with an embedded device tree blob'
|
||||||
|
@echo ' simpleImage.<dt> - Firmware independent image.'
|
||||||
|
@echo ' treeImage.<dt> - Support for older IBM 4xx firmware (not U-Boot)'
|
||||||
@echo ' install - Install kernel using'
|
@echo ' install - Install kernel using'
|
||||||
@echo ' (your) ~/bin/installkernel or'
|
@echo ' (your) ~/bin/installkernel or'
|
||||||
@echo ' (distribution) /sbin/installkernel or'
|
@echo ' (distribution) /sbin/installkernel or'
|
||||||
@echo ' install to $$(INSTALL_PATH) and run lilo'
|
@echo ' install to $$(INSTALL_PATH) and run lilo'
|
||||||
@echo ' *_defconfig - Select default config from arch/$(ARCH)/configs'
|
@echo ' *_defconfig - Select default config from arch/$(ARCH)/configs'
|
||||||
|
@echo ''
|
||||||
|
@echo ' Targets with <dt> embed a device tree blob inside the image'
|
||||||
|
@echo ' These targets support board with firmware that does not'
|
||||||
|
@echo ' support passing a device tree directly. Replace <dt> with the'
|
||||||
|
@echo ' name of a dts file from the arch/$(ARCH)/boot/dts/ directory'
|
||||||
|
@echo ' (minus the .dts extension).'
|
||||||
endef
|
endef
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
|
|
@ -68,7 +68,7 @@ src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c
|
||||||
fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \
|
fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \
|
||||||
cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
|
cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
|
||||||
cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \
|
cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \
|
||||||
virtex405-head.S redboot-83xx.c cuboot-sam440ep.c
|
virtex405-head.S virtex.c redboot-83xx.c cuboot-sam440ep.c
|
||||||
src-boot := $(src-wlib) $(src-plat) empty.c
|
src-boot := $(src-wlib) $(src-plat) empty.c
|
||||||
|
|
||||||
src-boot := $(addprefix $(obj)/, $(src-boot))
|
src-boot := $(addprefix $(obj)/, $(src-boot))
|
||||||
|
@ -276,6 +276,9 @@ ifeq ($(CONFIG_PPC32),y)
|
||||||
image-$(CONFIG_PPC_PMAC) += zImage.coff zImage.miboot
|
image-$(CONFIG_PPC_PMAC) += zImage.coff zImage.miboot
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Allow extra targets to be added to the defconfig
|
||||||
|
image-y += $(subst ",,$(CONFIG_EXTRA_TARGETS))
|
||||||
|
|
||||||
initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
|
initrd- := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
|
||||||
initrd-y := $(patsubst zImage%, zImage.initrd%, \
|
initrd-y := $(patsubst zImage%, zImage.initrd%, \
|
||||||
$(patsubst dtbImage%, dtbImage.initrd%, \
|
$(patsubst dtbImage%, dtbImage.initrd%, \
|
||||||
|
|
|
@ -0,0 +1,296 @@
|
||||||
|
/*
|
||||||
|
* This file supports the Xilinx ML507 board with the 440 processor.
|
||||||
|
* A reference design for the FPGA is provided at http://git.xilinx.com.
|
||||||
|
*
|
||||||
|
* (C) Copyright 2008 Xilinx, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "xlnx,virtex440";
|
||||||
|
dcr-parent = <&ppc440_0>;
|
||||||
|
model = "testing";
|
||||||
|
DDR2_SDRAM: memory@0 {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = < 0 0x10000000 >;
|
||||||
|
} ;
|
||||||
|
chosen {
|
||||||
|
bootargs = "console=ttyS0 ip=on root=/dev/ram";
|
||||||
|
linux,stdout-path = "/plb@0/serial@83e00000";
|
||||||
|
} ;
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#cpus = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
ppc440_0: cpu@0 {
|
||||||
|
clock-frequency = <400000000>;
|
||||||
|
compatible = "PowerPC,440", "ibm,ppc440";
|
||||||
|
d-cache-line-size = <0x20>;
|
||||||
|
d-cache-size = <0x8000>;
|
||||||
|
dcr-access-method = "native";
|
||||||
|
dcr-controller ;
|
||||||
|
device_type = "cpu";
|
||||||
|
i-cache-line-size = <0x20>;
|
||||||
|
i-cache-size = <0x8000>;
|
||||||
|
model = "PowerPC,440";
|
||||||
|
reg = <0>;
|
||||||
|
timebase-frequency = <400000000>;
|
||||||
|
xlnx,apu-control = <1>;
|
||||||
|
xlnx,apu-udi-0 = <0>;
|
||||||
|
xlnx,apu-udi-1 = <0>;
|
||||||
|
xlnx,apu-udi-10 = <0>;
|
||||||
|
xlnx,apu-udi-11 = <0>;
|
||||||
|
xlnx,apu-udi-12 = <0>;
|
||||||
|
xlnx,apu-udi-13 = <0>;
|
||||||
|
xlnx,apu-udi-14 = <0>;
|
||||||
|
xlnx,apu-udi-15 = <0>;
|
||||||
|
xlnx,apu-udi-2 = <0>;
|
||||||
|
xlnx,apu-udi-3 = <0>;
|
||||||
|
xlnx,apu-udi-4 = <0>;
|
||||||
|
xlnx,apu-udi-5 = <0>;
|
||||||
|
xlnx,apu-udi-6 = <0>;
|
||||||
|
xlnx,apu-udi-7 = <0>;
|
||||||
|
xlnx,apu-udi-8 = <0>;
|
||||||
|
xlnx,apu-udi-9 = <0>;
|
||||||
|
xlnx,dcr-autolock-enable = <1>;
|
||||||
|
xlnx,dcu-rd-ld-cache-plb-prio = <0>;
|
||||||
|
xlnx,dcu-rd-noncache-plb-prio = <0>;
|
||||||
|
xlnx,dcu-rd-touch-plb-prio = <0>;
|
||||||
|
xlnx,dcu-rd-urgent-plb-prio = <0>;
|
||||||
|
xlnx,dcu-wr-flush-plb-prio = <0>;
|
||||||
|
xlnx,dcu-wr-store-plb-prio = <0>;
|
||||||
|
xlnx,dcu-wr-urgent-plb-prio = <0>;
|
||||||
|
xlnx,dma0-control = <0>;
|
||||||
|
xlnx,dma0-plb-prio = <0>;
|
||||||
|
xlnx,dma0-rxchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma0-rxirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma0-txchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma0-txirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma1-control = <0>;
|
||||||
|
xlnx,dma1-plb-prio = <0>;
|
||||||
|
xlnx,dma1-rxchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma1-rxirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma1-txchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma1-txirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma2-control = <0>;
|
||||||
|
xlnx,dma2-plb-prio = <0>;
|
||||||
|
xlnx,dma2-rxchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma2-rxirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma2-txchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma2-txirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma3-control = <0>;
|
||||||
|
xlnx,dma3-plb-prio = <0>;
|
||||||
|
xlnx,dma3-rxchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma3-rxirqtimer = <0x3ff>;
|
||||||
|
xlnx,dma3-txchannelctrl = <0x1010000>;
|
||||||
|
xlnx,dma3-txirqtimer = <0x3ff>;
|
||||||
|
xlnx,endian-reset = <0>;
|
||||||
|
xlnx,generate-plb-timespecs = <1>;
|
||||||
|
xlnx,icu-rd-fetch-plb-prio = <0>;
|
||||||
|
xlnx,icu-rd-spec-plb-prio = <0>;
|
||||||
|
xlnx,icu-rd-touch-plb-prio = <0>;
|
||||||
|
xlnx,interconnect-imask = <0xffffffff>;
|
||||||
|
xlnx,mplb-allow-lock-xfer = <1>;
|
||||||
|
xlnx,mplb-arb-mode = <0>;
|
||||||
|
xlnx,mplb-awidth = <0x20>;
|
||||||
|
xlnx,mplb-counter = <0x500>;
|
||||||
|
xlnx,mplb-dwidth = <0x80>;
|
||||||
|
xlnx,mplb-max-burst = <8>;
|
||||||
|
xlnx,mplb-native-dwidth = <0x80>;
|
||||||
|
xlnx,mplb-p2p = <0>;
|
||||||
|
xlnx,mplb-prio-dcur = <2>;
|
||||||
|
xlnx,mplb-prio-dcuw = <3>;
|
||||||
|
xlnx,mplb-prio-icu = <4>;
|
||||||
|
xlnx,mplb-prio-splb0 = <1>;
|
||||||
|
xlnx,mplb-prio-splb1 = <0>;
|
||||||
|
xlnx,mplb-read-pipe-enable = <1>;
|
||||||
|
xlnx,mplb-sync-tattribute = <0>;
|
||||||
|
xlnx,mplb-wdog-enable = <1>;
|
||||||
|
xlnx,mplb-write-pipe-enable = <1>;
|
||||||
|
xlnx,mplb-write-post-enable = <1>;
|
||||||
|
xlnx,num-dma = <1>;
|
||||||
|
xlnx,pir = <0xf>;
|
||||||
|
xlnx,ppc440mc-addr-base = <0>;
|
||||||
|
xlnx,ppc440mc-addr-high = <0xfffffff>;
|
||||||
|
xlnx,ppc440mc-arb-mode = <0>;
|
||||||
|
xlnx,ppc440mc-bank-conflict-mask = <0xc00000>;
|
||||||
|
xlnx,ppc440mc-control = <0xf810008f>;
|
||||||
|
xlnx,ppc440mc-max-burst = <8>;
|
||||||
|
xlnx,ppc440mc-prio-dcur = <2>;
|
||||||
|
xlnx,ppc440mc-prio-dcuw = <3>;
|
||||||
|
xlnx,ppc440mc-prio-icu = <4>;
|
||||||
|
xlnx,ppc440mc-prio-splb0 = <1>;
|
||||||
|
xlnx,ppc440mc-prio-splb1 = <0>;
|
||||||
|
xlnx,ppc440mc-row-conflict-mask = <0x3ffe00>;
|
||||||
|
xlnx,ppcdm-asyncmode = <0>;
|
||||||
|
xlnx,ppcds-asyncmode = <0>;
|
||||||
|
xlnx,user-reset = <0>;
|
||||||
|
DMA0: sdma@80 {
|
||||||
|
compatible = "xlnx,ll-dma-1.00.a";
|
||||||
|
dcr-reg = < 0x80 0x11 >;
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 9 2 0xa 2 >;
|
||||||
|
} ;
|
||||||
|
} ;
|
||||||
|
} ;
|
||||||
|
plb_v46_0: plb@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "xlnx,plb-v46-1.02.a", "simple-bus";
|
||||||
|
ranges ;
|
||||||
|
DIP_Switches_8Bit: gpio@81460000 {
|
||||||
|
compatible = "xlnx,xps-gpio-1.00.a";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 6 2 >;
|
||||||
|
reg = < 0x81460000 0x10000 >;
|
||||||
|
xlnx,all-inputs = <1>;
|
||||||
|
xlnx,all-inputs-2 = <0>;
|
||||||
|
xlnx,dout-default = <0>;
|
||||||
|
xlnx,dout-default-2 = <0>;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,gpio-width = <8>;
|
||||||
|
xlnx,interrupt-present = <1>;
|
||||||
|
xlnx,is-bidir = <1>;
|
||||||
|
xlnx,is-bidir-2 = <1>;
|
||||||
|
xlnx,is-dual = <0>;
|
||||||
|
xlnx,tri-default = <0xffffffff>;
|
||||||
|
xlnx,tri-default-2 = <0xffffffff>;
|
||||||
|
} ;
|
||||||
|
Hard_Ethernet_MAC: xps-ll-temac@81c00000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "xlnx,compound";
|
||||||
|
ethernet@81c00000 {
|
||||||
|
compatible = "xlnx,xps-ll-temac-1.01.b";
|
||||||
|
device_type = "network";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 5 2 >;
|
||||||
|
llink-connected = <&DMA0>;
|
||||||
|
local-mac-address = [ 02 00 00 00 00 00 ];
|
||||||
|
reg = < 0x81c00000 0x40 >;
|
||||||
|
xlnx,bus2core-clk-ratio = <1>;
|
||||||
|
xlnx,phy-type = <1>;
|
||||||
|
xlnx,phyaddr = <1>;
|
||||||
|
xlnx,rxcsum = <1>;
|
||||||
|
xlnx,rxfifo = <0x1000>;
|
||||||
|
xlnx,temac-type = <0>;
|
||||||
|
xlnx,txcsum = <1>;
|
||||||
|
xlnx,txfifo = <0x1000>;
|
||||||
|
} ;
|
||||||
|
} ;
|
||||||
|
LEDs_8Bit: gpio@81400000 {
|
||||||
|
compatible = "xlnx,xps-gpio-1.00.a";
|
||||||
|
reg = < 0x81400000 0x10000 >;
|
||||||
|
xlnx,all-inputs = <0>;
|
||||||
|
xlnx,all-inputs-2 = <0>;
|
||||||
|
xlnx,dout-default = <0>;
|
||||||
|
xlnx,dout-default-2 = <0>;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,gpio-width = <8>;
|
||||||
|
xlnx,interrupt-present = <0>;
|
||||||
|
xlnx,is-bidir = <1>;
|
||||||
|
xlnx,is-bidir-2 = <1>;
|
||||||
|
xlnx,is-dual = <0>;
|
||||||
|
xlnx,tri-default = <0xffffffff>;
|
||||||
|
xlnx,tri-default-2 = <0xffffffff>;
|
||||||
|
} ;
|
||||||
|
LEDs_Positions: gpio@81420000 {
|
||||||
|
compatible = "xlnx,xps-gpio-1.00.a";
|
||||||
|
reg = < 0x81420000 0x10000 >;
|
||||||
|
xlnx,all-inputs = <0>;
|
||||||
|
xlnx,all-inputs-2 = <0>;
|
||||||
|
xlnx,dout-default = <0>;
|
||||||
|
xlnx,dout-default-2 = <0>;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,gpio-width = <5>;
|
||||||
|
xlnx,interrupt-present = <0>;
|
||||||
|
xlnx,is-bidir = <1>;
|
||||||
|
xlnx,is-bidir-2 = <1>;
|
||||||
|
xlnx,is-dual = <0>;
|
||||||
|
xlnx,tri-default = <0xffffffff>;
|
||||||
|
xlnx,tri-default-2 = <0xffffffff>;
|
||||||
|
} ;
|
||||||
|
Push_Buttons_5Bit: gpio@81440000 {
|
||||||
|
compatible = "xlnx,xps-gpio-1.00.a";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 7 2 >;
|
||||||
|
reg = < 0x81440000 0x10000 >;
|
||||||
|
xlnx,all-inputs = <1>;
|
||||||
|
xlnx,all-inputs-2 = <0>;
|
||||||
|
xlnx,dout-default = <0>;
|
||||||
|
xlnx,dout-default-2 = <0>;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,gpio-width = <5>;
|
||||||
|
xlnx,interrupt-present = <1>;
|
||||||
|
xlnx,is-bidir = <1>;
|
||||||
|
xlnx,is-bidir-2 = <1>;
|
||||||
|
xlnx,is-dual = <0>;
|
||||||
|
xlnx,tri-default = <0xffffffff>;
|
||||||
|
xlnx,tri-default-2 = <0xffffffff>;
|
||||||
|
} ;
|
||||||
|
RS232_Uart_1: serial@83e00000 {
|
||||||
|
clock-frequency = <100000000>;
|
||||||
|
compatible = "xlnx,xps-uart16550-2.00.a", "ns16550";
|
||||||
|
current-speed = <0x2580>;
|
||||||
|
device_type = "serial";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 8 2 >;
|
||||||
|
reg = < 0x83e00000 0x10000 >;
|
||||||
|
reg-offset = <3>;
|
||||||
|
reg-shift = <2>;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,has-external-rclk = <0>;
|
||||||
|
xlnx,has-external-xin = <0>;
|
||||||
|
xlnx,is-a-16550 = <1>;
|
||||||
|
} ;
|
||||||
|
SysACE_CompactFlash: sysace@83600000 {
|
||||||
|
compatible = "xlnx,xps-sysace-1.00.a";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 4 2 >;
|
||||||
|
reg = < 0x83600000 0x10000 >;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,mem-width = <0x10>;
|
||||||
|
} ;
|
||||||
|
xps_bram_if_cntlr_1: xps-bram-if-cntlr@ffff0000 {
|
||||||
|
compatible = "xlnx,xps-bram-if-cntlr-1.00.a";
|
||||||
|
reg = < 0xffff0000 0x10000 >;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
} ;
|
||||||
|
xps_intc_0: interrupt-controller@81800000 {
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
compatible = "xlnx,xps-intc-1.00.a";
|
||||||
|
interrupt-controller ;
|
||||||
|
reg = < 0x81800000 0x10000 >;
|
||||||
|
xlnx,num-intr-inputs = <0xb>;
|
||||||
|
} ;
|
||||||
|
xps_timebase_wdt_1: xps-timebase-wdt@83a00000 {
|
||||||
|
compatible = "xlnx,xps-timebase-wdt-1.00.b";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 2 0 1 2 >;
|
||||||
|
reg = < 0x83a00000 0x10000 >;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,wdt-enable-once = <0>;
|
||||||
|
xlnx,wdt-interval = <0x1e>;
|
||||||
|
} ;
|
||||||
|
xps_timer_1: timer@83c00000 {
|
||||||
|
compatible = "xlnx,xps-timer-1.00.a";
|
||||||
|
interrupt-parent = <&xps_intc_0>;
|
||||||
|
interrupts = < 3 2 >;
|
||||||
|
reg = < 0x83c00000 0x10000 >;
|
||||||
|
xlnx,count-width = <0x20>;
|
||||||
|
xlnx,family = "virtex5";
|
||||||
|
xlnx,gen0-assert = <1>;
|
||||||
|
xlnx,gen1-assert = <1>;
|
||||||
|
xlnx,one-timer-only = <1>;
|
||||||
|
xlnx,trig0-assert = <1>;
|
||||||
|
xlnx,trig1-assert = <1>;
|
||||||
|
} ;
|
||||||
|
} ;
|
||||||
|
} ;
|
|
@ -23,6 +23,8 @@
|
||||||
|
|
||||||
BSS_STACK(4*1024);
|
BSS_STACK(4*1024);
|
||||||
|
|
||||||
|
extern int platform_specific_init(void) __attribute__((weak));
|
||||||
|
|
||||||
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||||
unsigned long r6, unsigned long r7)
|
unsigned long r6, unsigned long r7)
|
||||||
{
|
{
|
||||||
|
@ -80,5 +82,9 @@ void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
|
||||||
|
|
||||||
/* prepare the device tree and find the console */
|
/* prepare the device tree and find the console */
|
||||||
fdt_init(_dtb_start);
|
fdt_init(_dtb_start);
|
||||||
|
|
||||||
|
if (platform_specific_init)
|
||||||
|
platform_specific_init();
|
||||||
|
|
||||||
serial_console_init();
|
serial_console_init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* The platform specific code for virtex devices since a boot loader is not
|
||||||
|
* always used.
|
||||||
|
*
|
||||||
|
* (C) Copyright 2008 Xilinx, 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 "io.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
|
||||||
|
#define UART_DLL 0 /* Out: Divisor Latch Low */
|
||||||
|
#define UART_DLM 1 /* Out: Divisor Latch High */
|
||||||
|
#define UART_FCR 2 /* Out: FIFO Control Register */
|
||||||
|
#define UART_FCR_CLEAR_RCVR 0x02 /* Clear the RCVR FIFO */
|
||||||
|
#define UART_FCR_CLEAR_XMIT 0x04 /* Clear the XMIT FIFO */
|
||||||
|
#define UART_LCR 3 /* Out: Line Control Register */
|
||||||
|
#define UART_MCR 4 /* Out: Modem Control Register */
|
||||||
|
#define UART_MCR_RTS 0x02 /* RTS complement */
|
||||||
|
#define UART_MCR_DTR 0x01 /* DTR complement */
|
||||||
|
#define UART_LCR_DLAB 0x80 /* Divisor latch access bit */
|
||||||
|
#define UART_LCR_WLEN8 0x03 /* Wordlength: 8 bits */
|
||||||
|
|
||||||
|
static int virtex_ns16550_console_init(void *devp)
|
||||||
|
{
|
||||||
|
unsigned char *reg_base;
|
||||||
|
u32 reg_shift, reg_offset, clk, spd;
|
||||||
|
u16 divisor;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
if (dt_get_virtual_reg(devp, (void **)®_base, 1) < 1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
n = getprop(devp, "reg-offset", ®_offset, sizeof(reg_offset));
|
||||||
|
if (n == sizeof(reg_offset))
|
||||||
|
reg_base += reg_offset;
|
||||||
|
|
||||||
|
n = getprop(devp, "reg-shift", ®_shift, sizeof(reg_shift));
|
||||||
|
if (n != sizeof(reg_shift))
|
||||||
|
reg_shift = 0;
|
||||||
|
|
||||||
|
n = getprop(devp, "current-speed", (void *)&spd, sizeof(spd));
|
||||||
|
if (n != sizeof(spd))
|
||||||
|
spd = 9600;
|
||||||
|
|
||||||
|
/* should there be a default clock rate?*/
|
||||||
|
n = getprop(devp, "clock-frequency", (void *)&clk, sizeof(clk));
|
||||||
|
if (n != sizeof(clk))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
divisor = clk / (16 * spd);
|
||||||
|
|
||||||
|
/* Access baud rate */
|
||||||
|
out_8(reg_base + (UART_LCR << reg_shift), UART_LCR_DLAB);
|
||||||
|
|
||||||
|
/* Baud rate based on input clock */
|
||||||
|
out_8(reg_base + (UART_DLL << reg_shift), divisor & 0xFF);
|
||||||
|
out_8(reg_base + (UART_DLM << reg_shift), divisor >> 8);
|
||||||
|
|
||||||
|
/* 8 data, 1 stop, no parity */
|
||||||
|
out_8(reg_base + (UART_LCR << reg_shift), UART_LCR_WLEN8);
|
||||||
|
|
||||||
|
/* RTS/DTR */
|
||||||
|
out_8(reg_base + (UART_MCR << reg_shift), UART_MCR_RTS | UART_MCR_DTR);
|
||||||
|
|
||||||
|
/* Clear transmitter and receiver */
|
||||||
|
out_8(reg_base + (UART_FCR << reg_shift),
|
||||||
|
UART_FCR_CLEAR_XMIT | UART_FCR_CLEAR_RCVR);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For virtex, the kernel may be loaded without using a bootloader and if so
|
||||||
|
some UARTs need more setup than is provided in the normal console init
|
||||||
|
*/
|
||||||
|
int platform_specific_init(void)
|
||||||
|
{
|
||||||
|
void *devp;
|
||||||
|
char devtype[MAX_PROP_LEN];
|
||||||
|
char path[MAX_PATH_LEN];
|
||||||
|
|
||||||
|
devp = finddevice("/chosen");
|
||||||
|
if (devp == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (getprop(devp, "linux,stdout-path", path, MAX_PATH_LEN) > 0) {
|
||||||
|
devp = finddevice(path);
|
||||||
|
if (devp == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if ((getprop(devp, "device_type", devtype, sizeof(devtype)) > 0)
|
||||||
|
&& !strcmp(devtype, "serial")
|
||||||
|
&& (dt_is_compatible(devp, "ns16550")))
|
||||||
|
virtex_ns16550_console_init(devp);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -207,7 +207,15 @@ adder875-redboot)
|
||||||
binary=y
|
binary=y
|
||||||
;;
|
;;
|
||||||
simpleboot-virtex405-*)
|
simpleboot-virtex405-*)
|
||||||
platformo="$object/virtex405-head.o $object/simpleboot.o"
|
platformo="$object/virtex405-head.o $object/simpleboot.o $object/virtex.o"
|
||||||
|
binary=y
|
||||||
|
;;
|
||||||
|
simpleboot-virtex440-*)
|
||||||
|
platformo="$object/simpleboot.o $object/virtex.o"
|
||||||
|
binary=y
|
||||||
|
;;
|
||||||
|
simpleboot-*)
|
||||||
|
platformo="$object/simpleboot.o"
|
||||||
binary=y
|
binary=y
|
||||||
;;
|
;;
|
||||||
asp834x-redboot)
|
asp834x-redboot)
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1447,6 +1447,16 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.machine_check = machine_check_440A,
|
.machine_check = machine_check_440A,
|
||||||
.platform = "ppc440",
|
.platform = "ppc440",
|
||||||
},
|
},
|
||||||
|
{ /* 440 in Xilinx Virtex-5 FXT */
|
||||||
|
.pvr_mask = 0xfffffff0,
|
||||||
|
.pvr_value = 0x7ff21910,
|
||||||
|
.cpu_name = "440 in Virtex-5 FXT",
|
||||||
|
.cpu_features = CPU_FTRS_44X,
|
||||||
|
.cpu_user_features = COMMON_USER_BOOKE,
|
||||||
|
.icache_bsize = 32,
|
||||||
|
.dcache_bsize = 32,
|
||||||
|
.platform = "ppc440",
|
||||||
|
},
|
||||||
{ /* 460EX */
|
{ /* 460EX */
|
||||||
.pvr_mask = 0xffff0002,
|
.pvr_mask = 0xffff0002,
|
||||||
.pvr_value = 0x13020002,
|
.pvr_value = 0x13020002,
|
||||||
|
|
|
@ -111,6 +111,22 @@ config YOSEMITE
|
||||||
# help
|
# help
|
||||||
# This option enables support for the IBM PPC440GX evaluation board.
|
# This option enables support for the IBM PPC440GX evaluation board.
|
||||||
|
|
||||||
|
config XILINX_VIRTEX440_GENERIC_BOARD
|
||||||
|
bool "Generic Xilinx Virtex 440 board"
|
||||||
|
depends on 44x
|
||||||
|
default n
|
||||||
|
select XILINX_VIRTEX_5_FXT
|
||||||
|
help
|
||||||
|
This option enables generic support for Xilinx Virtex based boards
|
||||||
|
that use a 440 based processor in the Virtex 5 FXT FPGA architecture.
|
||||||
|
|
||||||
|
The generic virtex board support matches any device tree which
|
||||||
|
specifies 'xlnx,virtex440' in its compatible field. This includes
|
||||||
|
the Xilinx ML5xx reference designs using the powerpc core.
|
||||||
|
|
||||||
|
Most Virtex 5 designs should use this unless it needs to do some
|
||||||
|
special configuration at board probe time.
|
||||||
|
|
||||||
# 44x specific CPU modules, selected based on the board above.
|
# 44x specific CPU modules, selected based on the board above.
|
||||||
config 440EP
|
config 440EP
|
||||||
bool
|
bool
|
||||||
|
@ -161,3 +177,13 @@ config 460EX
|
||||||
# 44x errata/workaround config symbols, selected by the CPU models above
|
# 44x errata/workaround config symbols, selected by the CPU models above
|
||||||
config IBM440EP_ERR42
|
config IBM440EP_ERR42
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
# Xilinx specific config options.
|
||||||
|
config XILINX_VIRTEX
|
||||||
|
bool
|
||||||
|
|
||||||
|
# Xilinx Virtex 5 FXT FPGA architecture, selected by a Xilinx board above
|
||||||
|
config XILINX_VIRTEX_5_FXT
|
||||||
|
bool
|
||||||
|
select XILINX_VIRTEX
|
||||||
|
|
||||||
|
|
|
@ -10,3 +10,4 @@ obj-$(CONFIG_RAINIER) += rainier.o
|
||||||
obj-$(CONFIG_WARP) += warp.o
|
obj-$(CONFIG_WARP) += warp.o
|
||||||
obj-$(CONFIG_WARP) += warp-nand.o
|
obj-$(CONFIG_WARP) += warp-nand.o
|
||||||
obj-$(CONFIG_CANYONLANDS) += canyonlands.o
|
obj-$(CONFIG_CANYONLANDS) += canyonlands.o
|
||||||
|
obj-$(CONFIG_XILINX_VIRTEX_5_FXT) += virtex.o
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Xilinx Virtex 5FXT based board support, derived from
|
||||||
|
* the Xilinx Virtex (IIpro & 4FX) based board support
|
||||||
|
*
|
||||||
|
* Copyright 2007 Secret Lab Technologies Ltd.
|
||||||
|
* Copyright 2008 Xilinx, 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/prom.h>
|
||||||
|
#include <asm/time.h>
|
||||||
|
#include <asm/xilinx_intc.h>
|
||||||
|
#include <asm/reg.h>
|
||||||
|
#include <asm/ppc4xx.h>
|
||||||
|
#include "44x.h"
|
||||||
|
|
||||||
|
static struct of_device_id xilinx_of_bus_ids[] __initdata = {
|
||||||
|
{ .compatible = "simple-bus", },
|
||||||
|
{ .compatible = "xlnx,plb-v46-1.00.a", },
|
||||||
|
{ .compatible = "xlnx,plb-v46-1.02.a", },
|
||||||
|
{ .compatible = "xlnx,plb-v34-1.01.a", },
|
||||||
|
{ .compatible = "xlnx,plb-v34-1.02.a", },
|
||||||
|
{ .compatible = "xlnx,opb-v20-1.10.c", },
|
||||||
|
{ .compatible = "xlnx,dcr-v29-1.00.a", },
|
||||||
|
{ .compatible = "xlnx,compound", },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init virtex_device_probe(void)
|
||||||
|
{
|
||||||
|
of_platform_bus_probe(NULL, xilinx_of_bus_ids, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
machine_device_initcall(virtex, virtex_device_probe);
|
||||||
|
|
||||||
|
static int __init virtex_probe(void)
|
||||||
|
{
|
||||||
|
unsigned long root = of_get_flat_dt_root();
|
||||||
|
|
||||||
|
if (!of_flat_dt_is_compatible(root, "xlnx,virtex440"))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
define_machine(virtex) {
|
||||||
|
.name = "Xilinx Virtex440",
|
||||||
|
.probe = virtex_probe,
|
||||||
|
.init_IRQ = xilinx_intc_init_tree,
|
||||||
|
.get_irq = xilinx_intc_get_irq,
|
||||||
|
.calibrate_decr = generic_calibrate_decr,
|
||||||
|
.restart = ppc4xx_reset_system,
|
||||||
|
};
|
Загрузка…
Ссылка в новой задаче