FW: [PATCH] powerpc: Xilinx: adding virtex5 powerpc 440 support

Grant Likely grant.likely at secretlab.ca
Sun Jun 29 07:59:32 EST 2008


Hi John.

Oops, you had also posted this patch to the list later, so I'm also
forwarding my comments to the list.

Cheers,
g.

On Sat, Jun 28, 2008 at 3:56 PM, Grant Likely <grant.likely at secretlab.ca> wrote:
> Sorry for the late reply on this one, I had gotten rather busy.
>
> On Wed, Jun 18, 2008 at 03:09:39PM -0600, John Linn wrote:
>> 1.    I'm not sure why we need to disable the interrupts in the
>> bootstrap loader?
>
> You don't.  That's old zImage.raw stuff that you don't need.
>
>> 2.    I see some SecetLab copyright in new files that might be just a
>> cut/paste type error?
>
> If it is mostly based on my code, then it is appropriate to preserve my
> copyright and add Xilinx's copyright above it.  If it is really heavily
> modified, then the Secret lab copyright can be dropped.
>
>> 3.    I don't see the cputable.c up to date with the 440?
>
>> Thanks,
>> John
>>
>> -----Original Message-----
>> From: John Linn [mailto:john.linn at xilinx.com]
>> Sent: Wednesday, June 18, 2008 2:58 PM
>> Cc: John Linn
>> Subject: [PATCH] powerpc: Xilinx: adding virtex5 powerpc 440 support
>>
>>
>>
>> The following files add support for Virtex5 with Powerpc 440.
>>
>>
>>
>> Device trees are currently handled differently than other embedded
>>
>> systems as there may not be a boot loader such that the device
>>
>> tree is compiled into the kernel or pulled from a BRAM.
>>
>>
>>
>> The UART 16550 has extra initialization in the bootstrap loader
>>
>> since a boot loader is not used many times.
>>
>
> Your mailer seems to have damaged the patch by wrapping lines and
> inserting extra blank lines.  You'll need to resend.  I've removed
> them below so I could make comments.
>
>>
>> Signed-off-by: John Linn <john.linn at xilinx.com>
>> ---
>>  arch/powerpc/Kconfig                     |   75 +++
>>  arch/powerpc/boot/Makefile               |   24 +-
>>  arch/powerpc/boot/dts/ml507.dts          |  254 ++++++++
>>  arch/powerpc/boot/io.h                   |    7 +
>>  arch/powerpc/boot/virtex.c               |  246 ++++++++
>>  arch/powerpc/configs/44x/ml507_defconfig | 1010 ++++++++++++++++++++++++++++++
>>  arch/powerpc/platforms/44x/Kconfig       |   62 ++
>>  arch/powerpc/platforms/44x/Makefile      |    1 +
>>  arch/powerpc/platforms/44x/virtex.c      |   58 ++
>>  arch/powerpc/platforms/Kconfig           |    7 +
>>  10 files changed, 1739 insertions(+), 5 deletions(-)
>>  create mode 100644 arch/powerpc/boot/dts/ml507.dts
>>  create mode 100644 arch/powerpc/boot/virtex.c
>>  create mode 100644 arch/powerpc/configs/44x/ml507_defconfig
>>  create mode 100644 arch/powerpc/platforms/44x/virtex.c
>>
>> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
>> index 3934e26..94adfe1 100644
>> --- a/arch/powerpc/Kconfig
>> +++ b/arch/powerpc/Kconfig
>> @@ -483,6 +483,81 @@ config SECCOMP
>>
>>         If unsure, say Y. Only embedded should say N here.
>>
>> +config WANT_DEVICE_TREE
>> +     bool
>> +     default n
>
> This shouldn't be here.
>
>> +
>> +config BUILD_RAW_IMAGE
>> +     bool "Build firmware-independent image"
>> +     select WANT_DEVICE_TREE
>> +     help
>> +       If this is enabled, a firmware independent "raw" image will be
>> +       built, as zImage.raw.  This requires a completely filled-in
>> +       device tree, with the following labels:
>> +
>> +       mem_size_cells: on /#address-cells
>> +       memsize: on the size portion of /memory/reg
>> +       timebase: on the boot CPU's timebase property
>
> Obsolete stuff; replaced with simpleImage
>
>> +config DEVICE_TREE
>> +     string "Static device tree source file"
>> +     depends on WANT_DEVICE_TREE
>> +     help
>> +       This specifies the device tree source (.dts) file to be
>> +       compiled and included when building the bootwrapper.  If a
>> +       relative filename is given, then it will be relative to
>> +       arch/powerpc/boot/dts.  If you are not using the bootwrapper,
>> +       or do not need to build a dts into the bootwrapper, this
>> +       field is ignored.
>> +
>> +       For example, this is required when building a cuImage target
>> +       for an older U-Boot, which cannot pass a device tree itself.
>> +       Such a kernel will not work with a newer U-Boot that tries to
>> +       pass a device tree (unless you tell it not to).  If your U-Boot
>> +       does not mention a device tree in "help bootm", then use the
>> +       cuImage target and specify a device tree here.  Otherwise, use
>> +       the uImage target and leave this field blank.
>
> Obsolete
>
>> +config COMPRESSED_DEVICE_TREE
>> +     bool "Use compressed device tree"
>> +     depends on XILINX_VIRTEX
>> +     depends on WANT_DEVICE_TREE
>> +     help
>> +       In Xilinx FPGAs, the hardware can change quite dramatically
>> while
>> +       still running the same kernel.  In this case and other similar
>> +       ones, it is preferable to associate the device tree with a
>> +       particular build of the hardware design.  This configuration
>> +       option assumes that the device tree blob has been compressed and
>> +       stored in Block RAM in the FPGA design.  Typically, such a block
>> +       ram is available in order to provide a bootloop or other code
>> +       close to the reset vector at the top of the address space.  By
>> +       default, the parameter options associated with this configuration
>> +       assumes that exactly one block ram (2KB) of storage is available,
>> +       which should be sufficient for most designs.  If necessary in a
>> +       particular design, due to boot code requirement or a large number
>> +       of devices, this address (and the corresponding parameters in the
>> +       EDK design) must be modified.
>> +
>> +       Note that in some highly area constrained designs, no block rams
>> +       may be available in the design, and some other mechanism may be
>> +       used to hold the processor in reset while external memory is
>> +       initialized with processor code.  In such cases, that mechanism
>> +       should also be used to load the device tree at an appropriate
>> +       location, and the parameters associated with this configuration
>> +       option should be modified to point to that location in external
>> +       memory.
>
> This is a really interesting option and is probably useful for other
> platforms too.  I'd like to see this split out into a separate patch and
> slightly reworked so that it is usable by non-xilinx targets.
>
>> +config COMPRESSED_DTB_START
>> +     hex "Start of compressed device tree"
>> +     depends on COMPRESSED_DEVICE_TREE
>> +     default 0xfffff800
>> +
>> +config COMPRESSED_DTB_SIZE
>> +     hex "Size of compressed device tree"
>> +     depends on COMPRESSED_DEVICE_TREE
>> +     default 0x800
>
> These probably shouldn't be config values.  Either they should be
> provided in regsiters or memory at boot time, or a data file should be
> pulled in when linking the bootwrapper to determine where to look for the
> device tree compressed blob.  The goal of this is to allow multiple
> images to be built (with different dtb locations) for a single kernel
> compile.
>
>> diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
>> index 1cee2f9..9de59fb 100644
>> --- a/arch/powerpc/boot/Makefile
>> +++ b/arch/powerpc/boot/Makefile
>> @@ -66,7 +66,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-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
>>             cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c
>> simpleboot.c \
>> -           virtex405-head.S
>> +           virtex.c virtex405-head.S
>>  src-boot := $(src-wlib) $(src-plat) empty.c
>>
>>  src-boot := $(addprefix $(obj)/, $(src-boot))
>> @@ -197,6 +197,7 @@ image-$(CONFIG_PPC_HOLLY)         += zImage.holly
>>  image-$(CONFIG_PPC_PRPMC2800)            += dtbImage.prpmc2800
>>  image-$(CONFIG_PPC_ISERIES)        += zImage.iseries
>>  image-$(CONFIG_DEFAULT_UIMAGE)           += uImage
>> +image-$(CONFIG_XILINX_VIRTEX)            += zImage.virtex
>>
>>  #
>>  # Targets which embed a device tree blob
>> @@ -279,14 +280,24 @@ targets += $(image-y) $(initrd-y)
>>
>>  $(addprefix $(obj)/, $(initrd-y)): $(obj)/ramdisk.image.gz
>>
>> +# If CONFIG_WANT_DEVICE_TREE is set and CONFIG_DEVICE_TREE isn't an
>> +# empty string, define 'dts' to be path to the dts
>> +# CONFIG_DEVICE_TREE will have "" around it, make sure to strip them
>> +ifeq ($(CONFIG_WANT_DEVICE_TREE),y)
>> +ifneq ($(CONFIG_DEVICE_TREE),"")
>> +dts = $(if $(shell echo $(CONFIG_DEVICE_TREE) | grep '^/'),\
>> +     ,$(srctree)/$(src)/dts/)$(CONFIG_DEVICE_TREE:"%"=%)
>> +endif
>> +endif
>> +
>
> Obsolete stuff
>
>>  # Don't put the ramdisk on the pattern rule; when its missing make will
>> try
>>  # the pattern rule with less dependencies that also matches (even with
>> the
>>  # hard dependency listed).
>> -$(obj)/zImage.initrd.%: vmlinux $(wrapperbits)
>> -     $(call if_changed,wrap,$*,,,$(obj)/ramdisk.image.gz)
>> +$(obj)/zImage.initrd.%: vmlinux $(wrapperbits) $(dts)
>> +     $(call if_changed,wrap,$*,$(dts),,$(obj)/ramdisk.image.gz)
>
> Ditto
>
>>
>> -$(obj)/zImage.%: vmlinux $(wrapperbits)
>> -     $(call if_changed,wrap,$*)
>> +$(obj)/zImage.%: vmlinux $(wrapperbits) $(dts)
>> +     $(call if_changed,wrap,$*,$(dts))
>
> Ditto
>
>>  # dtbImage% - a dtbImage is a zImage with an embedded device tree blob
>>  $(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb
>> @@ -325,6 +336,9 @@ $(obj)/treeImage.%: vmlinux $(obj)/%.dtb
>> $(wrapperbits)
>>  $(obj)/%.dtb: $(dtstree)/%.dts $(obj)/dtc
>>       $(obj)/dtc -O dtb -o $(obj)/$*.dtb -b 0 $(DTS_FLAGS)
>> $(dtstree)/$*.dts
>>
>> +$(obj)/zImage.raw: vmlinux $(dts) $(wrapperbits)
>> +     $(call if_changed,wrap,raw,$(dts))
>> +
>
> Ditto
>
>>  # If there isn't a platform selected then just strip the vmlinux.
>>  ifeq (,$(image-y))
>>  image-y := vmlinux.strip
>> diff --git a/arch/powerpc/boot/dts/ml507.dts
>> b/arch/powerpc/boot/dts/ml507.dts
>> new file mode 100644
>> index 0000000..43d8535
>> --- /dev/null
>> +++ b/arch/powerpc/boot/dts/ml507.dts
>> @@ -0,0 +1,254 @@
>> +/*
>> + * (C) Copyright 2007-2008 Xilinx, Inc.
>> + * (C) Copyright 2007 Michal Simek
>> + *
>> + * Michal SIMEK <monstr at monstr.eu>
>
> I don't think it is appropriate to have Michal's name here; this is a
> generated file, not a file that he wrote.  (It is, of course, 100%
> appropriate for the tool that generated it to have his copyright)
>
> It *might* be appropriate for Xilinx to claim copyright on this file
> because it is the device tree for one of Xilinx's reference designs, but
> that ground isn't very stable.
>
>> + * 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
>
> These three paragraphs can be dropped; they are redundant.
>
>> + *
>> + * CAUTION: This file is automatically generated by libgen.
>> + * Version: Xilinx EDK 10.1.01 EDK_K_SP1.2
>
> This is a generated file and so it is debatable about whether or not it
> is appropriate for inclusion in the kernel.  Personally, I lean toward
> including it as long as it is well documented as to what it is.
> Specifically, the comment block should state exactly what version of the
> reference design is being described here.
>
> <snipping the entire dts file>
>
> BTW, the dts file and defconfig should be submitted in separate patch
> files.
>
>> diff --git a/arch/powerpc/boot/io.h b/arch/powerpc/boot/io.h
>> index ccaedae..ec57ec9 100644
>> --- a/arch/powerpc/boot/io.h
>> +++ b/arch/powerpc/boot/io.h
>> @@ -99,4 +99,11 @@ static inline void barrier(void)
>>       asm volatile("" : : : "memory");
>>  }
>>
>> +static inline void disable_irq(void)
>> +{
>> +     int dummy;
>> +     asm volatile("mfmsr %0; rlwinm %0, %0, 0, ~(1<<15); mtmsr %0" :
>> +                  "=r" (dummy) : : "memory");
>> +}
>> +
>
> Drop this; it was part of the old zImage.raw stuff.
>
>>  #endif /* _IO_H */
>> diff --git a/arch/powerpc/boot/virtex.c b/arch/powerpc/boot/virtex.c
>> new file mode 100644
>> index 0000000..5d807c6
>> --- /dev/null
>> +++ b/arch/powerpc/boot/virtex.c
>> @@ -0,0 +1,246 @@
>> +/*
>> + * Old U-boot compatibility for Walnut
>
> Not true!  :-)
>
>> + * Author: Josh Boyer <jwboyer at linux.vnet.ibm.com>
>
> Probably not true either!
>
>> + *
>> + * Copyright 2007 IBM Corporation
>> + *   Based on cuboot-83xx.c, which is:
>> + * Copyright (c) 2007 Freescale Semiconductor, Inc.
>
> You should probably add Xilinx to this list.
>
>> + * 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.
>
> This paragraph is redundant; remove.
>
>> + */
>> +
>> +#include <stddef.h>
>> +#include <stdio.h>
>> +#include "ops.h"
>> +#include "dcr.h"
>> +#include "4xx.h"
>> +#include "io.h"
>> +#include "reg.h"
>> +
>> +BSS_STACK(4096);
>> +
>> +#include "types.h"
>> +#include "gunzip_util.h"
>> +#include <libfdt.h>
>> +#include "../../../include/linux/autoconf.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 */
>> +
>> +/* This function is only needed when there is no boot loader to
>> +   initialize the UART
>> +*/
>> +static int virtex_ns16550_console_init(void *devp)
>> +{
>> +     int n;
>> +     unsigned long reg_phys;
>> +     unsigned char *regbase;
>> +     u32 regshift, clk, spd;
>> +     u16 divisor;
>> +
>> +     n = getprop(devp, "virtual-reg", &regbase, sizeof(regbase));
>> +     if (n != sizeof(regbase)) {
>> +           if (!dt_xlate_reg(devp, 0, &reg_phys, NULL))
>> +                 return -1;
>> +
>> +           regbase = (void *)reg_phys + 3;
>> +     }
>> +     regshift = 2;
>> +
>> +     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(regbase + (UART_LCR << regshift), UART_LCR_DLAB);
>> +
>> +     /* Baud rate based on input clock */
>> +     out_8(regbase + (UART_DLL << regshift), divisor & 0xFF);
>> +     out_8(regbase + (UART_DLM << regshift), divisor >> 8);
>> +
>> +     /* 8 data, 1 stop, no parity */
>> +     out_8(regbase + (UART_LCR << regshift), UART_LCR_WLEN8);
>> +
>> +     /* RTS/DTR */
>> +     out_8(regbase + (UART_MCR << regshift), UART_MCR_RTS | UART_MCR_DTR);
>> +
>> +     /* Clear transmitter and receiver */
>> +     out_8(regbase + (UART_FCR << regshift),
>> +                       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
>> +*/
>> +static int virtex_serial_console_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;
>> +}
>> +
>> +#ifdef CONFIG_COMPRESSED_DEVICE_TREE
>> +static struct gunzip_state gzstate;
>> +#endif
>
> #ifdefs are forbidden in bootwrapper code.  Use different zImage targets
> to enable/disable particular features.
>
>> +
>> +void platform_init(void)
>
> Wrong signature for platform_init().  Should be:
>
> void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
>                   unsigned long r6, unsigned long r7)
>
>> +{
>> +     u32 memreg[4];
>> +     u64 start;
>> +     u64 size = 0x2000000;
>> +     int naddr, nsize, i;
>> +     void *root, *memory;
>> +     static const unsigned long line_size = 32;
>> +     static const unsigned long congruence_classes = 256;
>> +     unsigned long addr;
>> +     unsigned long dccr;
>> +
>> +#ifdef CONFIG_COMPRESSED_DEVICE_TREE
>> +     void *dtbz_start;
>> +     u32 dtbz_size;
>> +     void *dtb_addr;
>> +     u32 dtb_size;
>> +     struct fdt_header dtb_header;
>> +     int len;
>> +#endif
>
> Ditto
>
>> +
>> +        if((mfpvr() & 0xfffff000) == 0x20011000) {
>> +            /* PPC errata 213: only for Virtex-4 FX */
>> +            __asm__("mfccr0  0\n\t"
>> +                    "oris    0,0,0x50000000 at h\n\t"
>> +                    "mtccr0  0"
>> +                    : : : "0");
>> +        }
>> +
>> +     /*
>> +     * Invalidate the data cache if the data cache is turned off.
>> +     * - The 405 core does not invalidate the data cache on power-up
>> +     *   or reset but does turn off the data cache. We cannot assume
>> +     *   that the cache contents are valid.
>> +     * - If the data cache is turned on this must have been done by
>> +     *   a bootloader and we assume that the cache contents are
>> +     *   valid.
>> +     */
>> +     __asm__("mfdccr %0": "=r" (dccr));
>> +     if (dccr == 0) {
>> +           for (addr = 0;
>> +                addr < (congruence_classes * line_size);
>> +                addr += line_size) {
>> +                 __asm__("dccci 0,%0": :"b"(addr));
>> +           }
>> +     }
>
> Instead of duplicating this in C code, you should instead modify the
> wrapper script to also link in virtex405-head.o
>
>> +#if defined(CONFIG_XILINX_VIRTEX_5_FXT) && defined(CONFIG_MATH_EMULATION)
>> +     /* Make sure the APU is disabled when using soft FPU emulation */
>> +     mtdcr(5, 0);
>> +#endif
>
> Again; remove #ifdefs.  Do stuff like this in the equivalent of
> virtex405-head.S
>
>> +
>> +     disable_irq();
>> +
>> +#ifdef CONFIG_COMPRESSED_DEVICE_TREE
>> +
>> +        /** FIXME: flatdevicetrees need the initializer allocated,
>> +            libfdt will fix this. */
>> +     dtbz_start = (void *)CONFIG_COMPRESSED_DTB_START;
>> +     dtbz_size = CONFIG_COMPRESSED_DTB_SIZE;
>> +     /** get the device tree */
>> +     gunzip_start(&gzstate, dtbz_start, dtbz_size);
>> +     gunzip_exactly(&gzstate, &dtb_header, sizeof(dtb_header));
>> +
>> +     dtb_size = dtb_header.totalsize;
>> +     // printf("Allocating 0x%lx bytes for dtb ...\n\r", dtb_size);
>
> remove c++ style comments
>
>> +
>> +     dtb_addr = _end; // Should be allocated?
>> +
>> +     gunzip_start(&gzstate, dtbz_start, dtbz_size);
>> +     len = gunzip_finish(&gzstate, dtb_addr, dtb_size);
>> +     if (len != dtb_size)
>> +           fatal("ran out of data!  only got 0x%x of 0x%lx bytes.\n\r",
>> +                       len, dtb_size);
>> +     printf("done 0x%x bytes\n\r", len);
>> +     simple_alloc_init(0x800000, size - (unsigned long)0x800000, 32, 64);
>> +     fdt_init(dtb_addr);
>
> Address shouldn't be hard coded.  Can you calculate the dtb_addr based on
> the _end addr and the size of the dtb?
>
>> +#else
>> +        /** FIXME: flatdevicetrees need the initializer allocated,
>> +            libfdt will fix this. */
>> +     simple_alloc_init(_end, size - (unsigned long)_end, 32, 64);
>> +     fdt_init(_dtb_start);
>> +#endif
>> +
>> +     root = finddevice("/");
>> +     if (getprop(root, "#address-cells", &naddr, sizeof(naddr)) < 0)
>> +           naddr = 2;
>> +     if (naddr < 1 || naddr > 2)
>> +           fatal("Can't cope with #address-cells == %d in /\n\r", naddr);
>> +
>> +     if (getprop(root, "#size-cells", &nsize, sizeof(nsize)) < 0)
>> +           nsize = 1;
>> +     if (nsize < 1 || nsize > 2)
>> +           fatal("Can't cope with #size-cells == %d in /\n\r", nsize);
>> +
>> +     memory = finddevice("/memory at 0");
>> +     if (! memory) {
>> +           fatal("Need a memory at 0 node!\n\r");
>> +     }
>> +     if (getprop(memory, "reg", memreg, sizeof(memreg)) < 0)
>> +           fatal("Need a memory at 0 node!\n\r");
>> +
>> +     i = 0;
>> +     start = memreg[i++];
>> +     if(naddr == 2) {
>> +           start = (start << 32) | memreg[i++];
>> +     }
>> +     size = memreg[i++];
>> +     if (nsize == 2)
>> +           size = (size << 32) | memreg[i++];
>> +
>> +     // timebase_period_ns = 1000000000 / timebase;
>> +     virtex_serial_console_init();
>> +     serial_console_init();
>> +     if (console_ops.open)
>> +           console_ops.open();
>> +
>> +#ifdef CONFIG_COMPRESSED_DEVICE_TREE
>> +     printf("Using compressed device tree at 0x%x\n\r",
>> CONFIG_COMPRESSED_DTB_START);
>> +#else
>> +#endif
>> +        printf("booting virtex\n\r");
>> +        printf("memstart=0x%llx\n\r", start);
>> +        printf("memsize=0x%llx\n\r", size);
>> +}
>> diff --git a/arch/powerpc/platforms/44x/Kconfig
>> b/arch/powerpc/platforms/44x/Kconfig
>> index 6abe913..b90b33d 100644
>> --- a/arch/powerpc/platforms/44x/Kconfig
>> +++ b/arch/powerpc/platforms/44x/Kconfig
>> @@ -102,6 +102,58 @@ config YOSEMITE
>>  #    help
>>  #      This option enables support for the IBM PPC440GX evaluation board.
>>
>> +config XILINX_ML507
>> +     bool "Xilinx ML507 Reference System"
>> +     depends on 44x
>> +     default n
>> +     select XILINX_ML5XX
>> +     select WANT_DEVICE_TREE
>> +     help
>> +       This option enables support for the Xilinx ML507 board.
>
> I don't think this is necessary.  Follow the lead of virtex4 support and
> do something like config XILINX_VIRTEX_440_GENERIC_BOARD.
>
>> @@ -152,3 +204,13 @@ config 460EX
>>  # 44x errata/workaround config symbols, selected by the CPU models
>> above
>>  config IBM440EP_ERR42
>>       bool
>> +
>> +# Xilinx specific config options.
>> +config XILINX_ML5XX
>> +     bool
>> +     select XILINX_VIRTEX
>
> I think you should drop this.  Board specific stuff should be contained
> within the .dts files.
>
>> +config XILINX_VIRTEX_5_FXT
>> +     bool
>> +     depends on XILINX_ML507
>> +     default y
>
> Drop the above two lines and may the generic board config option select
> XILINX_VIRTEX_5_FXT
>
>> diff --git a/arch/powerpc/platforms/44x/Makefile
>> b/arch/powerpc/platforms/44x/Makefile
>> index 774165f..e3a9337 100644
>> --- a/arch/powerpc/platforms/44x/Makefile
>> +++ b/arch/powerpc/platforms/44x/Makefile
>> @@ -4,6 +4,7 @@ obj-$(CONFIG_TAISHAN)     += taishan.o
>>  obj-$(CONFIG_BAMBOO)   += bamboo.o
>>  obj-$(CONFIG_YOSEMITE) += bamboo.o
>>  obj-$(CONFIG_SEQUOIA)  += sequoia.o
>> +obj-$(CONFIG_XILINX_ML507)   += virtex.o
>>  obj-$(CONFIG_KATMAI)   += katmai.o
>>  obj-$(CONFIG_RAINIER)  += rainier.o
>>  obj-$(CONFIG_WARP)     += warp.o
>> diff --git a/arch/powerpc/platforms/44x/virtex.c
>> b/arch/powerpc/platforms/44x/virtex.c
>> new file mode 100644
>> index 0000000..42ca337
>> --- /dev/null
>> +++ b/arch/powerpc/platforms/44x/virtex.c
>> @@ -0,0 +1,58 @@
>> +/*
>> + * Xilinx Virtex 5FXT 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>
>> +#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", },
>
> Do you need this whole list if the device tree generator is now claiming
> "simple-bus" compatibility?
>
>> +     { .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,virtex"))
>> +           return 0;
>
> This is probably not good.  Granted, it is impossible to build a 405+440
> multiplatform image, but the device tree generator should probably be
> modified to claim something like "xlnx,virtex5fxt" so it isn't confused
> with an older virtex part.  (I realize that this is just following the
> lead from virtex2/4 support, but that should probably be changed too.)
>
>> +
>> +     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,
>> +     .restart                = ppc4xx_reset_system,
>> +};
>> diff --git a/arch/powerpc/platforms/Kconfig
>> b/arch/powerpc/platforms/Kconfig
>> index 87454c5..523388b 100644
>> --- a/arch/powerpc/platforms/Kconfig
>> +++ b/arch/powerpc/platforms/Kconfig
>> @@ -313,6 +313,13 @@ config FSL_ULI1575
>>  config CPM
>>       bool
>>
>> +config XILINX_VIRTEX
>> +     bool
>> +     select PPC_DCR_MMIO
>> +     select PPC_DCR_NATIVE
>> +     help
>> +       Support for Xilinx Virtex platforms.
>> +
>
> config XILINX_VIRTEX is already defined in
> arch/powerpc/platforms/40x/Kconfig.  Moving it to this file should be
> done in a separate patch.
>
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.



More information about the Linuxppc-dev mailing list