ppc4xx: Add initial esd PMC440 board support
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 3/3 ppc4xx: Add initial esd PMC440 board support
Hi Matthias,
Quoted 14 lines · Matthias Fuchs
ppc4xx: Add initial esd PMC440 board support
This patch is based on Stefan's for-1.3.1 branch.
Signed-off-by Matthias Fuchs <[email protected]>---
commit69a91d4b1575d1dec7b38c163fc0bcadb8b79705
tree55c7dbafa6b182a65abbc8dd252788aa22ce8359
parente2166ace3e44dd42196d2c0ce41367ec9950ffb8
author Matthias Fuchs <[email protected]> Fri, 09 Nov 2007 15:53:46 +0100 committer Matthias Fuchs <[email protected]> Fri, 09 Nov 2007 15:53:46 +0100
Quoted 15 lines
Makefile | 3 board/esd/pmc440/Makefile | 53 ++ board/esd/pmc440/cmd_pmc440.c | 555 +++++++++++++++++++++++++ board/esd/pmc440/config.mk | 41 ++ board/esd/pmc440/fpga.c | 463 +++++++++++++++++++++ board/esd/pmc440/fpga.h | 49 ++ board/esd/pmc440/init.S | 170 ++++++++ board/esd/pmc440/pmc440.c | 839 ++++++++++++++++++++++++++++++++++++++ board/esd/pmc440/pmc440.h | 148 +++++++ board/esd/pmc440/sdram.c | 442 ++++++++++++++++++++ board/esd/pmc440/sdram.h | 505 +++++++++++++++++++++++ board/esd/pmc440/u-boot-nand.lds | 137 ++++++ board/esd/pmc440/u-boot.lds | 145 +++++++ 13 files changed, 3550 insertions(+), 0 deletions(-)
You forgot to add your new board port to MAKEALL and MAINTAINERS. Please add this in the next respin.
And where is the board config file (include/configs/PMC440.h)?
Quoted 122 lines
Makefile +3
-0@@ -1225,6 +1225,9 @@ PLU405_config: unconfig PMC405_config: unconfig @$(MKCONFIG) $(@:_config=) ppc ppc4xx pmc405 esd +PMC440_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc ppc4xx pmc440 esd + PPChameleonEVB_config \ PPChameleonEVB_BA_25_config \ PPChameleonEVB_ME_25_config \board/esd/pmc440/Makefile new file +53
-0@@ -0,0 +1,53 @@ +# +# (C) Copyright 2002-2006 +# Wolfgang Denk, DENX Software Engineering, wd at denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# 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 $(TOPDIR)/config.mk + +LIB = $(obj)lib$(BOARD).a + +COBJS = $(BOARD).o cmd_pmc440.o sdram.o fpga.o \ + ../common/cmd_loadpci.o + +SOBJS = init.o + +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(OBJS) $(SOBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS) + +clean: + rm -f $(SOBJS) $(OBJS) + +distclean: clean + rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +#########################################################################board/esd/pmc440/cmd_pmc440.c new file +34
-0@@ -0,0 +1,555 @@ +/* +* (C) Copyright 2007 +* Matthias Fuchs, esd Gmbh, matthias.fuchs at esd-electronics.com. +* +* See file CREDITS for list of people who contributed to this +* project. +* +* 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 <common.h> +#include <command.h> +#include <asm/io.h> + +#include <asm/processor.h> + +#include "pmc440.h" + +int is_monarch (void ); +int bootstrap_eeprom_write (unsigned dev_addr, unsigned offset, uchar*buffer, unsigned cnt); +int
eeprom_write_enable(unsigneddev_addr, int state);board/esd/pmc440/cmd_pmc440.c new file +7
-0+ +DECLARE_GLOBAL_DATA_PTR ; + +#ifdef CONFIG_CMD_BSP + +static int got_fifoirq; +static int got_hcirq;
board/esd/pmc440/cmd_pmc440.c
Quoted 10 lines
board/esd/pmc440/cmd_pmc440.c new file +10
-0+ +int fpga_interrupt (u32 arg) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)arg; +int rc =-1 ;/* not for us */ +u32 status =FPGA_IN32 (&fpga->status); + +/* check for interrupt from fifo module */ +if (status &STATUS_FIFO_ISF ) { +/* disable this int source */
Something is wrong here with the indentation. Spaces instead of tabs?
Quoted 17 lines
board/esd/pmc440/cmd_pmc440.c new file +17
-0+FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_FIFOIE_GATE ); + rc =0 ; + got_fifoirq =1 ;/* trigger backend */ + } + +if (status &STATUS_HOST_ISF ) { +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_HCINT_GATE ); + rc =0 ; + got_hcirq =1 ; + } + +return rc; +} + + +int do_waithci (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{
board/esd/pmc440/cmd_pmc440.c
Quoted 10 lines
board/esd/pmc440/cmd_pmc440.c new file +10
-0+pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; + + got_hcirq =0 ; + +FPGA_CLRBITS (&fpga->ctrla,CTRL_HOST_IE ); +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_HCINT_GATE ); + +irq_install_handler (IRQ0_FPGA , + (interrupt_handler_t *)fpga_interrupt, + fpga);
Please stick to one coding style in each source file. So if you generally don't add the space before the "(" of a function call, then please never do it. Please check the complete patch for this.
board/esd/pmc440/cmd_pmc440.c
Quoted 4 lines
board/esd/pmc440/cmd_pmc440.c new file +4
-0+ +FPGA_SETBITS (&fpga->ctrla,CTRL_HOST_IE ); + +while (!got_hcirq) {
A space would be nice here.
Quoted 15 lines
board/esd/pmc440/cmd_pmc440.c new file +15
-0+/* Abort if ctrl-c was pressed */ +if (ctrlc ()) { +puts ("\nAbort\n" ); +break ; + } + } +if (got_hcirq) +printf ("Got interrupt!\n" ); + +FPGA_CLRBITS (&fpga->ctrla,CTRL_HOST_IE ); +irq_free_handler (IRQ0_FPGA ); +return 0 ; +} +U_BOOT_CMD( + waithci, 1, 1, do_waithci,
board/esd/pmc440/cmd_pmc440.c
Quoted 10 lines
board/esd/pmc440/cmd_pmc440.c new file +10
-0+"waithci - Wait for host control interrupt\n" , +NULL + ); + + +void dump_fifo (pmc440_fpga_t *fpga,int f,int *n) +{ +u32 ctrl; + +while (!((ctrl =FPGA_IN32 (&fpga->fifo[f].ctrl)) &FIFO_EMPTY )) {
Space missing.
I'm stopping here for now, since the mail seems to be too big for the list already. Please split your patch up into smaller pieces, so that it fits.
Thanks. Looks good otherwise.
Viele Gr??e,
Stefan
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================
PATCH 3/3 ppc4xx: Add initial esd PMC440 board support
Hi Wolfgang, Hi Stefan,
thanks for your comments. I tried to consider them in my updated patch series. As a consequence of the lists size limit (40k) and our little discussion on irc I banned cogito from my system an started with plain git which seems to be slightly more powerful:-)
To fool the list's size limit I did two things: first I split the huge patch (3/3) into three single patches. Even they do not really make sense without the others, they will not break U-Boot's buildsystem at any time.
The second very cool thing is the very powerful git option for creating patch that contain 1:1 copies of existing files. The PMC440 board uses sequoia's sdram.c and sdram.h. Together these two files would explode the 40k size limit. So it's a good idea to generate patch by calling:
format-patch -5 -C -C -n
or (which has the same effect):
format-patch -5 -C --find-copies-harder -n
This is how the patch summary looks like in this case:
board/{amcc/sequoia => esd/pmc440}/Makefile | 4 +-
board/{amcc/sequoia => esd/pmc440}/config.mk | 0
board/{amcc/sequoia => esd/pmc440}/init.S | 16 +-
.../sequoia/sequoia.c => esd/pmc440/pmc440.c} | 512 +++++++++++++++-----
board/esd/pmc440/pmc440.h | 148 ++++++
board/{amcc/sequoia => esd/pmc440}/sdram.c | 0
board/{amcc/sequoia => esd/pmc440}/sdram.h | 0
board/{amcc/sequoia => esd/pmc440}/u-boot-nand.lds | 0
board/{amcc/sequoia => esd/pmc440}/u-boot.lds | 0
9 files changed, 545 insertions(+), 135 deletions(-)
copy board/{amcc/sequoia => esd/pmc440}/Makefile (95%)
copy board/{amcc/sequoia => esd/pmc440}/config.mk (100%)
copy board/{amcc/sequoia => esd/pmc440}/init.S (89%)
copy board/{amcc/sequoia/sequoia.c => esd/pmc440/pmc440.c} (59%)
create mode 100644 board/esd/pmc440/pmc440.h
copy board/{amcc/sequoia => esd/pmc440}/sdram.c (100%)
copy board/{amcc/sequoia => esd/pmc440}/sdram.h (100%)
copy board/{amcc/sequoia => esd/pmc440}/u-boot-nand.lds (100%)
copy board/{amcc/sequoia => esd/pmc440}/u-boot.lds (100%)Please notice that the following fife patches replace all of my previous three patches. They are generated against Stefan's ppc4xx/for-1.3.1 brach because of the 4xx DCACHE rework.
Matthias
PATCH 1/5 Add Epson RX8025 RTC support
---
rtc/Makefile | 6 +-
rtc/{ds1307.c => rx8025.c} | 131 ++++++++++++++++++++++++++------------------
2 files changed, 80 insertions(+), 57 deletions(-)
copy rtc/{ds1307.c => rx8025.c} (60%)rtc/Makefile +3 -3
@@ -30,9 +30,9 @@ LIB = $(obj)librtc.a COBJS = date.o \ bf5xx_rtc.o ds12887.o ds1302.o ds1306.o ds1307.o \ ds1337.o ds1374.o ds1556.o ds164x.o ds174x.o ds3231.o \ - m41t11.o max6900.o m48t35ax.o mc146818.o mk48t59.o \ - mpc5xxx.o mpc8xx.o pcf8563.o s3c24x0_rtc.o rs5c372.o \ - mcfrtc.o x1205.o + m41t11.o m48t35ax.o max6900.o mc146818.o mcfrtc.o mk48t59.o \ + mpc5xxx.o mpc8xx.o pcf8563.o rs5c372.o rx8025.o s3c24x0_rtc.o \ + x1205.o SRCS := $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(COBJS))
rtc/rx8025.c renamed from rtc/ds1307.c +77 -54
211 lines not on this page · raw message
Signature · 1 line
1.5.3
PATCH 2/5 serial: Make default_serial_console() a weak function
In reply to Matthias FuchsWith this patch it is possible to reimplement default_serial_console() in board specific code. This will be done in the upcomming PMC440 U-Boot port. This also allows the lwmon board maintainer to remove the '#if !defined(CONFIG_LWMON) ...' from common/serial.c.
--- common/serial.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
common/serial.c +3 -1
@@ -33,7 +33,7 @@ static struct serial_device *serial_devices = NULL;static struct serial_device *serial_current =NULL ;#if !defined(CONFIG_LWMON ) && !defined(CONFIG_PXA27X ) -struct serial_device *default_serial_console (void ) +struct serial_device *__default_serial_console (void ) {#if defined(CONFIG_8xx_CONS_SMC1) || defined(CONFIG_8xx_CONS_SMC2)return &serial_smc_device;
@@ -64,6 +64,8 @@ struct serial_device *default_serial_console (void)#error No default console #endif } + +struct serial_device *default_serial_console (void ) __attribute__((weak,alias ("__default_serial_console" )));#endif int serial_register (struct serial_device *dev)
Signature · 1 line
1.5.3
PATCH 3/5 ppc4xx: Add initial esd PMC440 board files
In reply to Matthias FuchsThis patch adds the first files for the new esd PMC440 boards. The next two patches will complete the PMC440 board support.
---
board/{amcc/sequoia => esd/pmc440}/Makefile | 4 +-
board/{amcc/sequoia => esd/pmc440}/config.mk | 0
board/{amcc/sequoia => esd/pmc440}/init.S | 16 +-
.../sequoia/sequoia.c => esd/pmc440/pmc440.c} | 512 +++++++++++++++-----
board/esd/pmc440/pmc440.h | 148 ++++++
board/{amcc/sequoia => esd/pmc440}/sdram.c | 0
board/{amcc/sequoia => esd/pmc440}/sdram.h | 0
board/{amcc/sequoia => esd/pmc440}/u-boot-nand.lds | 0
board/{amcc/sequoia => esd/pmc440}/u-boot.lds | 0
9 files changed, 545 insertions(+), 135 deletions(-)
copy board/{amcc/sequoia => esd/pmc440}/Makefile (95%)
copy board/{amcc/sequoia => esd/pmc440}/config.mk (100%)
copy board/{amcc/sequoia => esd/pmc440}/init.S (90%)
copy board/{amcc/sequoia/sequoia.c => esd/pmc440/pmc440.c} (59%)
create mode 100644 board/esd/pmc440/pmc440.h
copy board/{amcc/sequoia => esd/pmc440}/sdram.c (100%)
copy board/{amcc/sequoia => esd/pmc440}/sdram.h (100%)
copy board/{amcc/sequoia => esd/pmc440}/u-boot-nand.lds (100%)
copy board/{amcc/sequoia => esd/pmc440}/u-boot.lds (100%)board/esd/pmc440/Makefile renamed from board/amcc/sequoia/Makefile +3 -1
@@ -25,7 +25,9 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(BOARD).a -COBJS = $(BOARD).o cmd_sequoia.o sdram.o +COBJS = $(BOARD).o cmd_pmc440.o sdram.o fpga.o \ + ../common/cmd_loadpci.o + SOBJS = init.o SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
board/esd/pmc440/config.mk renamed from board/amcc/sequoia/config.mk +0 -0
board/esd/pmc440/init.S renamed from board/amcc/sequoia/init.S +11 -5
@@ -10,7 +10,7 @@ * * 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 + * 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
@@ -34,7 +34,7 @@ #define SZ_64K 0x00000030 #define SZ_256K 0x00000040 #define SZ_1M 0x00000050 -#define SZ_8M 0x00000060 +#define SZ_8M 0x00000060 #define SZ_16M 0x00000070 #define SZ_256M 0x00000090
@@ -115,8 +115,13 @@ tlbtab: tlbentry( CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 1, AC_R|AC_W|SA_G|SA_I ) tlbentry( CFG_PCI_MEMBASE3, SZ_256M, CFG_PCI_MEMBASE3, 1, AC_R|AC_W|SA_G|SA_I ) - /* TLB-entry for EBC */ - tlbentry( CFG_BCSR_BASE, SZ_1K, CFG_BCSR_BASE, 1, AC_R|AC_W|AC_X|SA_G|SA_I ) + /* TLB-entries for EBC */ + /* PMC440 maps EBC to 0xef000000 which is handled by the peripheral + * tlb entry. + * This dummy entry is only for convinience in order not to modify the + * amount of entries. Currently OS/9 relies on this :-) + */ + tlbentry( 0xc0000000, SZ_256M, 0xc0000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I ) /* TLB-entry for NAND */ tlbentry( CFG_NAND_ADDR, SZ_1K, CFG_NAND_ADDR, 1, AC_R|AC_W|AC_X|SA_G|SA_I )
@@ -130,9 +135,10 @@ tlbtab: /* TLB-entry for peripherals */ tlbentry( 0xEF000000, SZ_16M, 0xEF000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I) - /* TLB-entry PCI IO Space - from sr at denx.de */ + /* TLB-entry PCI IO space */ tlbentry(0xE8000000, SZ_64K, 0xE8000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I) + /* TODO: what about high IO space */ tlbtab_end #if defined(CONFIG_NAND_U_BOOT) && !defined(CONFIG_NAND_SPL)
board/esd/pmc440/pmc440.c renamed from board/amcc/sequoia/sequoia.c +383 -129
712 lines not on this page · raw message
board/esd/pmc440/pmc440.h new file +148 -0
148 lines not on this page · raw message
board/esd/pmc440/sdram.c renamed from board/amcc/sequoia/sdram.c +0 -0
board/esd/pmc440/sdram.h renamed from board/amcc/sequoia/sdram.h +0 -0
board/esd/pmc440/u-boot-nand.lds renamed from board/amcc/sequoia/u-boot-nand.lds +0 -0
board/esd/pmc440/u-boot.lds renamed from board/amcc/sequoia/u-boot.lds +0 -0
Signature · 1 line
1.5.3
PATCH 4/5 ppc4xx: Add FPGA support and BSP command for PMC440 boards
In reply to Matthias FuchsThis patch adds some BSP commands and FPGA booting support for esd's PMC440 boards.
---
board/esd/pmc440/cmd_pmc440.c | 555 ++++++++++++++++++++++++++++++++++
board/esd/pmc440/fpga.c | 463 ++++++++++++++++++++++++++++
board/{gen860t => esd/pmc440}/fpga.h | 22 +-
3 files changed, 1031 insertions(+), 9 deletions(-)
create mode 100644 board/esd/pmc440/cmd_pmc440.c
create mode 100644 board/esd/pmc440/fpga.c
copy board/{gen860t => esd/pmc440}/fpga.h (71%)board/esd/pmc440/cmd_pmc440.c new file +555 -0
@@ -0,0 +1,555 @@ +/* +* (C) Copyright 2007 +* Matthias Fuchs, esd Gmbh, matthias.fuchs at esd-electronics.com. +* +* See file CREDITS for list of people who contributed to this +* project. +* +* 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 <common.h> +#include <command.h> +#include <asm/io.h> + +#include <asm/processor.h> + +#include "pmc440.h" + +int is_monarch (void ); +int bootstrap_eeprom_write (unsigned dev_addr,unsigned offset,uchar *buffer,unsigned cnt); +int eeprom_write_enable (unsigned dev_addr,int state); + +DECLARE_GLOBAL_DATA_PTR ; + +#ifdef CONFIG_CMD_BSP + +static int got_fifoirq; +static int got_hcirq; + +int fpga_interrupt (u32 arg) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)arg; +int rc =-1 ;/* not for us */ +u32 status =FPGA_IN32 (&fpga->status); + +/* check for interrupt from fifo module */ +if (status &STATUS_FIFO_ISF ) { +/* disable this int source */ +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_FIFOIE_GATE ); + rc =0 ; + got_fifoirq =1 ;/* trigger backend */ + } + +if (status &STATUS_HOST_ISF ) { +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_HCINT_GATE ); + rc =0 ; + got_hcirq =1 ; + } + +return rc; +} + + +int do_waithci (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; + + got_hcirq =0 ; + +FPGA_CLRBITS (&fpga->ctrla,CTRL_HOST_IE ); +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_HCINT_GATE ); + +irq_install_handler (IRQ0_FPGA , + (interrupt_handler_t *)fpga_interrupt, + fpga); + +FPGA_SETBITS (&fpga->ctrla,CTRL_HOST_IE ); + +while (!got_hcirq) { +/* Abort if ctrl-c was pressed */ +if (ctrlc ()) { +puts ("\nAbort\n" ); +break ; + } + } +if (got_hcirq) +printf ("Got interrupt!\n" ); + +FPGA_CLRBITS (&fpga->ctrla,CTRL_HOST_IE ); +irq_free_handler (IRQ0_FPGA ); +return 0 ; +} +U_BOOT_CMD ( + waithci,1 ,1 , do_waithci, +"waithci - Wait for host control interrupt\n" , +NULL + ); + + +void dump_fifo (pmc440_fpga_t *fpga,int f,int *n) +{ +u32 ctrl; + +while (!((ctrl =FPGA_IN32 (&fpga->fifo[f].ctrl)) &FIFO_EMPTY )) { +printf ("%5d %d %3d %08x" , + (*n)++, f, ctrl & (FIFO_LEVEL_MASK |FIFO_FULL ), +FPGA_IN32 (&fpga->fifo[f].data)); +if (ctrl &FIFO_OVERFLOW ) { +printf (" OVERFLOW\n" ); +FPGA_CLRBITS (&fpga->fifo[f].ctrl,FIFO_OVERFLOW ); + }else +printf ("\n" ); + } +} + + +int do_fifo (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; +int i; +int n =0 ; +u32 ctrl, data, f; +char str[] ="\\|/-" ; +int abort =0 ; +int count =0 ; +int count2 =0 ; + +switch (argc) { +case 1 : +/* print all fifos status information */ +printf ("fifo level status\n" ); +printf ("______________________________\n" ); +for (i=0 ; i<FIFO_COUNT ; i++) { + ctrl =FPGA_IN32 (&fpga->fifo[i].ctrl); +printf (" %d %3d %s%s%s %s\n" , + i, ctrl & (FIFO_LEVEL_MASK |FIFO_FULL ), + ctrl &FIFO_FULL ?"FULL " :"" , + ctrl &FIFO_EMPTY ?"EMPTY " :"" , + ctrl & (FIFO_FULL |FIFO_EMPTY ) ?"" :"NOT EMPTY" , + ctrl &FIFO_OVERFLOW ?"OVERFLOW" :"" ); + } +break ; + +case 2 : +/* completely read out fifo 'n' */ +if (!strcmp (argv[1 ],"read" )) { +printf (" # fifo level data\n" ); +printf ("______________________________\n" ); + +for (i=0 ; i<FIFO_COUNT ; i++) +dump_fifo (fpga, i, &n); + + }else if (!strcmp (argv[1 ],"wait" )) { + got_fifoirq =0 ; + +irq_install_handler (IRQ0_FPGA , + (interrupt_handler_t *)fpga_interrupt, + fpga); + +printf (" # fifo level data\n" ); +printf ("______________________________\n" ); + +/* enable all fifo interrupts */ +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_FIFOIE_GATE |HOSTCTRL_FIFOIE_FLAG ); +for (i=0 ; i<FIFO_COUNT ; i++) { +/* enable interrupts from all fifos */ +FPGA_SETBITS (&fpga->fifo[i].ctrl,FIFO_IE ); + } + +while (1 ) { +/* wait loop */ +while (!got_fifoirq) { + count++; +if (!(count %100 )) { + count2++; +putc (0x08 );/* backspace */ +putc (str[count2 %4 ]); + } + +/* Abort if ctrl-c was pressed */ +if ((abort =ctrlc ())) { +puts ("\nAbort\n" ); +break ; + } +udelay (1000 ); + } +if (abort) +break ; + +/* simple fifo backend */ +if (got_fifoirq) { +for (i=0 ; i<FIFO_COUNT ; i++) +dump_fifo (fpga, i, &n); + + got_fifoirq =0 ; +/* unmask global fifo irq */ +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_FIFOIE_GATE |HOSTCTRL_FIFOIE_FLAG ); + } + } + +/* disable all fifo interrupts */ +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_FIFOIE_GATE ); +for (i=0 ; i<FIFO_COUNT ; i++) +FPGA_CLRBITS (&fpga->fifo[i].ctrl,FIFO_IE ); + +irq_free_handler (IRQ0_FPGA ); + + }else { +printf ("Usage:\nfifo %s\n" , cmdtp->help); +return 1 ; + } +break ; + +case 4 : +case 5 : +if (!strcmp (argv[1 ],"write" )) { +/* get fifo number or fifo address */ + f =simple_strtoul (argv[2 ],NULL ,16 ); + +/* data paramter */ + data =simple_strtoul (argv[3 ],NULL ,16 ); + +/* get optional count parameter */ + n =1 ; +if (argc >=5 ) + n = (int )simple_strtoul (argv[4 ],NULL ,10 ); + +if (f <FIFO_COUNT ) { +printf ("writing %d x %08x to fifo %d\n" , + n, data, f); +for (i=0 ; i<n; i++) +FPGA_OUT32 (&fpga->fifo[f].data, data); + }else { +printf ("writing %d x %08x to fifo port at address %08x\n" , + n, data, f); +for (i=0 ; i<n; i++) +out32 (f, data); + } + }else { +printf ("Usage:\nfifo %s\n" , cmdtp->help); +return 1 ; + } +break ; + +default : +printf ("Usage:\nfifo %s\n" , cmdtp->help); +return 1 ; + } +return 0 ; +} +U_BOOT_CMD ( + fifo,5 ,1 , do_fifo, +"fifo - Fifo module operations\n" , +"wait\nfifo read\n" +"fifo write fifo(0..3) data [cnt=1]\n" +"fifo write address(>=4) data [cnt=1]\n" +" - without arguments: print all fifo's status\n" +" - with 'wait' argument: interrupt driven read from all fifos\n" +" - with 'read' argument: read current contents from all fifos\n" +" - with 'write' argument: write 'data' 'cnt' times to 'fifo' or 'address'\n" + ); + + +int do_setup_bootstrap_eeprom (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +ulong sdsdp[5 ]; +ulong delay; +int count=16 ; + +if (argc <2 ) { +printf ("Usage:\nsbe %s\n" , cmdtp->help); +return -1 ; + } + +if (argc >1 ) { +if (!strcmp (argv[1 ],"400" )) { +/* PLB=133MHz, PLB/PCI=4 */ +printf ("Bootstrapping for 400MHz\n" ); + sdsdp[0 ]=0x8678624e ; + sdsdp[1 ]=0x0947a030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else if (!strcmp (argv[1 ],"533" )) { +/* PLB=133MHz, PLB/PCI=3 */ +printf ("Bootstrapping for 533MHz\n" ); + sdsdp[0 ]=0x87788252 ; + sdsdp[1 ]=0x095fa030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else if (!strcmp (argv[1 ],"667" )) { +/* PLB=133MHz, PLB/PCI=4 */ +printf ("Bootstrapping for 667MHz\n" ); + sdsdp[0 ]=0x8778a256 ; + sdsdp[1 ]=0x0947a030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else if (!strcmp (argv[1 ],"test" )) { +/* TODO: this will replace the 667 MHz config above. +* But it needs some more testing on a real 667 MHz CPU. +*/ +printf ("Bootstrapping for test (667MHz PLB=133PLB PLB/PCI=3)\n" ); + sdsdp[0 ]=0x8778a256 ; + sdsdp[1 ]=0x095fa030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else { +printf ("Usage:\nsbe %s\n" , cmdtp->help); +return -1 ; + } + } + +if (argc >2 ) { + sdsdp[4 ] =0 ; +if (argv[2 ][0 ]=='1' ) + sdsdp[4 ]=0x19750100 ; +else if (argv[2 ][0 ]=='0' ) + sdsdp[4 ]=0x19750000 ; +if (sdsdp[4 ]) + count +=4 ; + } + +if (argc >3 ) { + delay =simple_strtoul (argv[3 ],NULL ,10 ); +if (delay >20 ) + delay =20 ; + sdsdp[4 ] |= delay; + } + +printf ("Writing boot EEPROM ...\n" ); +if (bootstrap_eeprom_write (CFG_I2C_BOOT_EEPROM_ADDR , +0 , (uchar *)sdsdp, count) !=0 ) +printf ("bootstrap_eeprom_write failed\n" ); +else +printf ("done (dump via 'i2c md 52 0.1 14')\n" ); + +return 0 ; +} +U_BOOT_CMD ( + sbe,4 ,0 , do_setup_bootstrap_eeprom, +"sbe - setup bootstrap eeprom\n" , +"<cpufreq:400|533|667> [<console-uart:0|1> [<bringup delay (0..20s)>]]" + ); + + +#ifdef CONFIG_PRAM +#include <environment.h> +extern env_t *env_ptr; + +int do_painit (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +DECLARE_GLOBAL_DATA_PTR ; +u32 memsize; +u32 pram; +char *v; +u32 param; +ulong *lptr; + + memsize = gd->bd->bi_memsize; + + v =getenv ("pram" ); +if (v) + pram =simple_strtoul (v,NULL ,10 ); +else { +printf ("Error: pram undefined. Please define pram in KiB\n" ); +return 1 ; + } + + param = memsize - (pram <<10 ); +printf ("PARAM: @%08x\n" , param); + +memset ((void *)param,0 , (pram <<10 )); +memcpy ((void *)param, env_ptr,CFG_ENV_SIZE ); + + lptr = (ulong *)memsize; + *(--lptr) =CFG_ENV_SIZE ; + *(--lptr) = pram <<10 ; + *(--lptr) =crc32 (0 , (void *)(memsize -0x08 ),0x08 ); + *(--lptr) =0 ; +return 0 ; +} +U_BOOT_CMD ( + painit,1 ,1 , do_painit, +"painit - prepare PciAccess system\n" , +NULL + ); +#endif /* CONFIG_PRAM */ + + +int do_selfreset (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +if (argc >1 ) { +if (argv[1 ][0 ] =='0' ) { +/* assert */ +printf ("self-reset# asserted\n" ); +out_be32 ((void *)GPIO0_TCR , +in_be32 ((void *)GPIO0_TCR ) |GPIO0_SELF_RST ); + }else { +/* deassert */ +printf ("self-reset# deasserted\n" ); +out_be32 ((void *)GPIO0_TCR , +in_be32 ((void *)GPIO0_TCR ) & ~GPIO0_SELF_RST ); + } + }else { +printf ("self-reset# is %s\n" , +in_be32 ((void *)GPIO0_TCR ) &GPIO0_SELF_RST ? +"active" :"inactive" ); + } + +return 0 ; +} +U_BOOT_CMD ( + selfreset,2 ,1 , do_selfreset, +"selfreset- assert self-reset# signal\n" , +NULL + ); + + +int do_resetout (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; + +/* requiers bootet FPGA and PLD_IOEN_N active */ +if (in_be32 ((void *)GPIO1_OR ) &GPIO1_IOEN_N ) { +printf ("Error: resetout requires a bootet FPGA\n" ); +return -1 ; + } + +if (argc >1 ) { +if (argv[1 ][0 ] =='0' ) { +/* assert */ +printf ("PMC-RESETOUT# asserted\n" ); +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_PMCRSTOUT_GATE ); + }else { +/* deassert */ +printf ("PMC-RESETOUT# deasserted\n" ); +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_PMCRSTOUT_GATE |HOSTCTRL_PMCRSTOUT_FLAG ); + } + }else { +printf ("PMC-RESETOUT# is %s\n" , +FPGA_IN32 (&fpga->hostctrl) &HOSTCTRL_PMCRSTOUT_FLAG ? +"inactive" :"active" ); + } + +return 0 ; +} +U_BOOT_CMD ( + resetout,2 ,1 , do_resetout, +"resetout - assert PMC-RESETOUT# signal\n" , +NULL + ); + + +int do_inta (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +if (is_monarch ()) { +printf ("This command is only supported in non-monarch mode\n" ); +return -1 ; + } + +if (argc >1 ) { +if (argv[1 ][0 ] =='0' ) { +/* assert */ +printf ("inta# asserted\n" ); +out_be32 ((void *)GPIO1_TCR , +in_be32 ((void *)GPIO1_TCR ) |GPIO1_INTA_FAKE ); + }else { +/* deassert */ +printf ("inta# deasserted\n" ); +out_be32 ((void *)GPIO1_TCR , +in_be32 ((void *)GPIO1_TCR ) & ~GPIO1_INTA_FAKE ); + } + }else { +printf ("inta# is %s\n" ,in_be32 ((void *)GPIO1_TCR ) &GPIO1_INTA_FAKE ?"active" :"inactive" ); + } +return 0 ; +} +U_BOOT_CMD ( + inta,2 ,1 , do_inta, +"inta - Assert/Deassert or query INTA# state in non-monarch mode\n" , +NULL + ); + + +/* test-only */ +int do_pmm (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +ulong pciaddr; + +if (argc >1 ) { + pciaddr =simple_strtoul (argv[1 ],NULL ,16 ); + + pciaddr &=0xf0000000 ; + +/* map PCI address at 0xc0000000 in PLB space */ +out32r (PCIX0_PMM1MA ,0x00000000 );/* PMM1 Mask/Attribute - disabled b4 setting */ +out32r (PCIX0_PMM1LA ,0xc0000000 );/* PMM1 Local Address */ +out32r (PCIX0_PMM1PCILA , pciaddr);/* PMM1 PCI Low Address */ +out32r (PCIX0_PMM1PCIHA ,0x00000000 );/* PMM1 PCI High Address */ +out32r (PCIX0_PMM1MA ,0xf0000001 );/* 256MB + No prefetching, and enable region */ + }else { +printf ("Usage:\npmm %s\n" , cmdtp->help); + } +return 0 ; +} +U_BOOT_CMD ( + pmm,2 ,1 , do_pmm, +"pmm - Setup pmm[1] registers\n" , +"<pciaddr> (pciaddr will be aligned to 256MB)\n" + ); + +#if defined(CFG_EEPROM_WREN ) +int do_eep_wren (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +int query = argc ==1 ; +int state =0 ; + +if (query) { +/* Query write access state. */ + state =eeprom_write_enable (CFG_I2C_EEPROM_ADDR ,-1 ); +if (state <0 ) { +puts ("Query of write access state failed.\n" ); + }else { +printf ("Write access for device 0x%0x is %sabled.\n" , +CFG_I2C_EEPROM_ADDR , state ?"en" :"dis" ); + state =0 ; + } + }else { +if ('0' == argv[1 ][0 ]) { +/* Disable write access. */ + state =eeprom_write_enable (CFG_I2C_EEPROM_ADDR ,0 ); + }else { +/* Enable write access. */ + state =eeprom_write_enable (CFG_I2C_EEPROM_ADDR ,1 ); + } +if (state <0 ) { +puts ("Setup of write access state failed.\n" ); + } + } + +return state; +} +U_BOOT_CMD (eepwren,2 ,0 , do_eep_wren, +"eepwren - Enable / disable / query EEPROM write access\n" , +NULL ); +#endif /* #if defined(CFG_EEPROM_WREN) */ + +#endif /* CONFIG_CMD_BSP */
board/esd/pmc440/fpga.c new file +463 -0
463 lines not on this page · raw message
board/esd/pmc440/fpga.h renamed from board/gen860t/fpga.h +13 -9
@@ -1,7 +1,6 @@/* -* (C) Copyright 2002 -* Rich Ireland, Enterasys Networks, rireland at enterasys.com. -* Keith Outwater, keith_outwater at mvis.com. +* (C) Copyright 2007 +* Matthias Fuchs, esd gmbh germany, matthias.fuchs at esd-electronics.com * * See file CREDITS for list of people who contributed to this * project.
@@ -20,14 +19,10 @@* along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA -* */ -/* -* Virtex2 FPGA configuration support for the GEN860T computer -*/ +extern int pmc440_init_fpga (void ); -extern int gen860t_init_fpga (void );extern int fpga_pgm_fn (int assert_pgm,int flush,int cookie);extern int fpga_init_fn (int cookie);extern int fpga_err_fn (int cookie);
@@ -35,6 +30,7 @@ extern int fpga_done_fn(int cookie);extern int fpga_clk_fn (int assert_clk,int flush,int cookie);extern int fpga_cs_fn (int assert_cs,int flush,int cookie);extern int fpga_wr_fn (int assert_write,int flush,int cookie); +extern int fpga_wdata_fn (uchar data,int flush,int cookie);extern int fpga_read_data_fn (unsigned char *data,int cookie);extern int fpga_write_data_fn (unsigned char data,int flush,int cookie);extern int fpga_busy_fn (int cookie);
@@ -42,4 +38,12 @@ extern int fpga_abort_fn(int cookie );extern int fpga_pre_config_fn (int cookie );extern int fpga_post_config_fn (int cookie ); -/* vim: set ts=4 sw=4 tw=78: */ +extern int ngcc_fpga_pgm_fn (int assert_pgm,int flush,int cookie); +extern int ngcc_fpga_init_fn (int cookie); +extern int ngcc_fpga_done_fn (int cookie); +extern int ngcc_fpga_clk_fn (int assert_clk,int flush,int cookie); +extern int ngcc_fpga_wr_fn (int assert_write,int flush,int cookie); +extern int ngcc_fpga_pre_config_fn (int cookie ); +extern int ngcc_fpga_post_config_fn (int cookie ); + +
Signature · 1 line
1.5.3
PATCH 4/5 ppc4xx: Add FPGA support and BSP command for PMC440 boards
Hi,
Stefan motivated me to resend this patch with some whitespace issues fixed.
This patch adds some BSP commands and FPGA booting support for esd's PMC440 boards.
--- board/esd/pmc440/cmd_pmc440.c | 555 +++++++++++++++++++++++++++++++++++++++++ board/esd/pmc440/fpga.c | 469 ++++++++++++++++++++++++++++++++++ board/esd/pmc440/fpga.h | 47 ++++ 3 files changed, 1071 insertions(+), 0 deletions(-) create mode 100644 board/esd/pmc440/cmd_pmc440.c create mode 100644 board/esd/pmc440/fpga.c create mode 100644 board/esd/pmc440/fpga.h
board/esd/pmc440/cmd_pmc440.c new file +555 -0
@@ -0,0 +1,555 @@ +/* +* (C) Copyright 2007 +* Matthias Fuchs, esd Gmbh, matthias.fuchs at esd-electronics.com. +* +* See file CREDITS for list of people who contributed to this +* project. +* +* 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 <common.h> +#include <command.h> +#include <asm/io.h> + +#include <asm/processor.h> + +#include "pmc440.h" + +int is_monarch (void ); +int bootstrap_eeprom_write (unsigned dev_addr,unsigned offset,uchar *buffer,unsigned cnt); +int eeprom_write_enable (unsigned dev_addr,int state); + +DECLARE_GLOBAL_DATA_PTR ; + +#ifdef CONFIG_CMD_BSP + +static int got_fifoirq; +static int got_hcirq; + +int fpga_interrupt (u32 arg) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)arg; +int rc =-1 ;/* not for us */ +u32 status =FPGA_IN32 (&fpga->status); + +/* check for interrupt from fifo module */ +if (status &STATUS_FIFO_ISF ) { +/* disable this int source */ +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_FIFOIE_GATE ); + rc =0 ; + got_fifoirq =1 ;/* trigger backend */ + } + +if (status &STATUS_HOST_ISF ) { +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_HCINT_GATE ); + rc =0 ; + got_hcirq =1 ; + } + +return rc; +} + + +int do_waithci (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; + + got_hcirq =0 ; + +FPGA_CLRBITS (&fpga->ctrla,CTRL_HOST_IE ); +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_HCINT_GATE ); + +irq_install_handler (IRQ0_FPGA , + (interrupt_handler_t *)fpga_interrupt, + fpga); + +FPGA_SETBITS (&fpga->ctrla,CTRL_HOST_IE ); + +while (!got_hcirq) { +/* Abort if ctrl-c was pressed */ +if (ctrlc ()) { +puts ("\nAbort\n" ); +break ; + } + } +if (got_hcirq) +printf ("Got interrupt!\n" ); + +FPGA_CLRBITS (&fpga->ctrla,CTRL_HOST_IE ); +irq_free_handler (IRQ0_FPGA ); +return 0 ; +} +U_BOOT_CMD ( + waithci,1 ,1 , do_waithci, +"waithci - Wait for host control interrupt\n" , +NULL + ); + + +void dump_fifo (pmc440_fpga_t *fpga,int f,int *n) +{ +u32 ctrl; + +while (!((ctrl =FPGA_IN32 (&fpga->fifo[f].ctrl)) &FIFO_EMPTY )) { +printf ("%5d %d %3d %08x" , + (*n)++, f, ctrl & (FIFO_LEVEL_MASK |FIFO_FULL ), +FPGA_IN32 (&fpga->fifo[f].data)); +if (ctrl &FIFO_OVERFLOW ) { +printf (" OVERFLOW\n" ); +FPGA_CLRBITS (&fpga->fifo[f].ctrl,FIFO_OVERFLOW ); + }else +printf ("\n" ); + } +} + + +int do_fifo (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; +int i; +int n =0 ; +u32 ctrl, data, f; +char str[] ="\\|/-" ; +int abort =0 ; +int count =0 ; +int count2 =0 ; + +switch (argc) { +case 1 : +/* print all fifos status information */ +printf ("fifo level status\n" ); +printf ("______________________________\n" ); +for (i=0 ; i<FIFO_COUNT ; i++) { + ctrl =FPGA_IN32 (&fpga->fifo[i].ctrl); +printf (" %d %3d %s%s%s %s\n" , + i, ctrl & (FIFO_LEVEL_MASK |FIFO_FULL ), + ctrl &FIFO_FULL ?"FULL " :"" , + ctrl &FIFO_EMPTY ?"EMPTY " :"" , + ctrl & (FIFO_FULL |FIFO_EMPTY ) ?"" :"NOT EMPTY" , + ctrl &FIFO_OVERFLOW ?"OVERFLOW" :"" ); + } +break ; + +case 2 : +/* completely read out fifo 'n' */ +if (!strcmp (argv[1 ],"read" )) { +printf (" # fifo level data\n" ); +printf ("______________________________\n" ); + +for (i=0 ; i<FIFO_COUNT ; i++) +dump_fifo (fpga, i, &n); + + }else if (!strcmp (argv[1 ],"wait" )) { + got_fifoirq =0 ; + +irq_install_handler (IRQ0_FPGA , + (interrupt_handler_t *)fpga_interrupt, + fpga); + +printf (" # fifo level data\n" ); +printf ("______________________________\n" ); + +/* enable all fifo interrupts */ +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_FIFOIE_GATE |HOSTCTRL_FIFOIE_FLAG ); +for (i=0 ; i<FIFO_COUNT ; i++) { +/* enable interrupts from all fifos */ +FPGA_SETBITS (&fpga->fifo[i].ctrl,FIFO_IE ); + } + +while (1 ) { +/* wait loop */ +while (!got_fifoirq) { + count++; +if (!(count %100 )) { + count2++; +putc (0x08 );/* backspace */ +putc (str[count2 %4 ]); + } + +/* Abort if ctrl-c was pressed */ +if ((abort =ctrlc ())) { +puts ("\nAbort\n" ); +break ; + } +udelay (1000 ); + } +if (abort) +break ; + +/* simple fifo backend */ +if (got_fifoirq) { +for (i=0 ; i<FIFO_COUNT ; i++) +dump_fifo (fpga, i, &n); + + got_fifoirq =0 ; +/* unmask global fifo irq */ +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_FIFOIE_GATE |HOSTCTRL_FIFOIE_FLAG ); + } + } + +/* disable all fifo interrupts */ +FPGA_OUT32 (&fpga->hostctrl,HOSTCTRL_FIFOIE_GATE ); +for (i=0 ; i<FIFO_COUNT ; i++) +FPGA_CLRBITS (&fpga->fifo[i].ctrl,FIFO_IE ); + +irq_free_handler (IRQ0_FPGA ); + + }else { +printf ("Usage:\nfifo %s\n" , cmdtp->help); +return 1 ; + } +break ; + +case 4 : +case 5 : +if (!strcmp (argv[1 ],"write" )) { +/* get fifo number or fifo address */ + f =simple_strtoul (argv[2 ],NULL ,16 ); + +/* data paramter */ + data =simple_strtoul (argv[3 ],NULL ,16 ); + +/* get optional count parameter */ + n =1 ; +if (argc >=5 ) + n = (int )simple_strtoul (argv[4 ],NULL ,10 ); + +if (f <FIFO_COUNT ) { +printf ("writing %d x %08x to fifo %d\n" , + n, data, f); +for (i=0 ; i<n; i++) +FPGA_OUT32 (&fpga->fifo[f].data, data); + }else { +printf ("writing %d x %08x to fifo port at address %08x\n" , + n, data, f); +for (i=0 ; i<n; i++) +out32 (f, data); + } + }else { +printf ("Usage:\nfifo %s\n" , cmdtp->help); +return 1 ; + } +break ; + +default : +printf ("Usage:\nfifo %s\n" , cmdtp->help); +return 1 ; + } +return 0 ; +} +U_BOOT_CMD ( + fifo,5 ,1 , do_fifo, +"fifo - Fifo module operations\n" , +"wait\nfifo read\n" +"fifo write fifo(0..3) data [cnt=1]\n" +"fifo write address(>=4) data [cnt=1]\n" +" - without arguments: print all fifo's status\n" +" - with 'wait' argument: interrupt driven read from all fifos\n" +" - with 'read' argument: read current contents from all fifos\n" +" - with 'write' argument: write 'data' 'cnt' times to 'fifo' or 'address'\n" + ); + + +int do_setup_bootstrap_eeprom (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +ulong sdsdp[5 ]; +ulong delay; +int count=16 ; + +if (argc <2 ) { +printf ("Usage:\nsbe %s\n" , cmdtp->help); +return -1 ; + } + +if (argc >1 ) { +if (!strcmp (argv[1 ],"400" )) { +/* PLB=133MHz, PLB/PCI=4 */ +printf ("Bootstrapping for 400MHz\n" ); + sdsdp[0 ]=0x8678624e ; + sdsdp[1 ]=0x0947a030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else if (!strcmp (argv[1 ],"533" )) { +/* PLB=133MHz, PLB/PCI=3 */ +printf ("Bootstrapping for 533MHz\n" ); + sdsdp[0 ]=0x87788252 ; + sdsdp[1 ]=0x095fa030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else if (!strcmp (argv[1 ],"667" )) { +/* PLB=133MHz, PLB/PCI=4 */ +printf ("Bootstrapping for 667MHz\n" ); + sdsdp[0 ]=0x8778a256 ; + sdsdp[1 ]=0x0947a030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else if (!strcmp (argv[1 ],"test" )) { +/* TODO: this will replace the 667 MHz config above. +* But it needs some more testing on a real 667 MHz CPU. +*/ +printf ("Bootstrapping for test (667MHz PLB=133PLB PLB/PCI=3)\n" ); + sdsdp[0 ]=0x8778a256 ; + sdsdp[1 ]=0x095fa030 ; + sdsdp[2 ]=0x40082350 ; + sdsdp[3 ]=0x0d050000 ; + }else { +printf ("Usage:\nsbe %s\n" , cmdtp->help); +return -1 ; + } + } + +if (argc >2 ) { + sdsdp[4 ] =0 ; +if (argv[2 ][0 ]=='1' ) + sdsdp[4 ]=0x19750100 ; +else if (argv[2 ][0 ]=='0' ) + sdsdp[4 ]=0x19750000 ; +if (sdsdp[4 ]) + count +=4 ; + } + +if (argc >3 ) { + delay =simple_strtoul (argv[3 ],NULL ,10 ); +if (delay >20 ) + delay =20 ; + sdsdp[4 ] |= delay; + } + +printf ("Writing boot EEPROM ...\n" ); +if (bootstrap_eeprom_write (CFG_I2C_BOOT_EEPROM_ADDR , +0 , (uchar *)sdsdp, count) !=0 ) +printf ("bootstrap_eeprom_write failed\n" ); +else +printf ("done (dump via 'i2c md 52 0.1 14')\n" ); + +return 0 ; +} +U_BOOT_CMD ( + sbe,4 ,0 , do_setup_bootstrap_eeprom, +"sbe - setup bootstrap eeprom\n" , +"<cpufreq:400|533|667> [<console-uart:0|1> [<bringup delay (0..20s)>]]" + ); + + +#ifdef CONFIG_PRAM +#include <environment.h> +extern env_t *env_ptr; + +int do_painit (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +DECLARE_GLOBAL_DATA_PTR ; +u32 memsize; +u32 pram; +char *v; +u32 param; +ulong *lptr; + + memsize = gd->bd->bi_memsize; + + v =getenv ("pram" ); +if (v) + pram =simple_strtoul (v,NULL ,10 ); +else { +printf ("Error: pram undefined. Please define pram in KiB\n" ); +return 1 ; + } + + param = memsize - (pram <<10 ); +printf ("PARAM: @%08x\n" , param); + +memset ((void *)param,0 , (pram <<10 )); +memcpy ((void *)param, env_ptr,CFG_ENV_SIZE ); + + lptr = (ulong *)memsize; + *(--lptr) =CFG_ENV_SIZE ; + *(--lptr) = pram <<10 ; + *(--lptr) =crc32 (0 , (void *)(memsize -0x08 ),0x08 ); + *(--lptr) =0 ; +return 0 ; +} +U_BOOT_CMD ( + painit,1 ,1 , do_painit, +"painit - prepare PciAccess system\n" , +NULL + ); +#endif /* CONFIG_PRAM */ + + +int do_selfreset (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +if (argc >1 ) { +if (argv[1 ][0 ] =='0' ) { +/* assert */ +printf ("self-reset# asserted\n" ); +out_be32 ((void *)GPIO0_TCR , +in_be32 ((void *)GPIO0_TCR ) |GPIO0_SELF_RST ); + }else { +/* deassert */ +printf ("self-reset# deasserted\n" ); +out_be32 ((void *)GPIO0_TCR , +in_be32 ((void *)GPIO0_TCR ) & ~GPIO0_SELF_RST ); + } + }else { +printf ("self-reset# is %s\n" , +in_be32 ((void *)GPIO0_TCR ) &GPIO0_SELF_RST ? +"active" :"inactive" ); + } + +return 0 ; +} +U_BOOT_CMD ( + selfreset,2 ,1 , do_selfreset, +"selfreset- assert self-reset# signal\n" , +NULL + ); + + +int do_resetout (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +pmc440_fpga_t *fpga = (pmc440_fpga_t *)FPGA_BA ; + +/* requiers bootet FPGA and PLD_IOEN_N active */ +if (in_be32 ((void *)GPIO1_OR ) &GPIO1_IOEN_N ) { +printf ("Error: resetout requires a bootet FPGA\n" ); +return -1 ; + } + +if (argc >1 ) { +if (argv[1 ][0 ] =='0' ) { +/* assert */ +printf ("PMC-RESETOUT# asserted\n" ); +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_PMCRSTOUT_GATE ); + }else { +/* deassert */ +printf ("PMC-RESETOUT# deasserted\n" ); +FPGA_OUT32 (&fpga->hostctrl, +HOSTCTRL_PMCRSTOUT_GATE |HOSTCTRL_PMCRSTOUT_FLAG ); + } + }else { +printf ("PMC-RESETOUT# is %s\n" , +FPGA_IN32 (&fpga->hostctrl) &HOSTCTRL_PMCRSTOUT_FLAG ? +"inactive" :"active" ); + } + +return 0 ; +} +U_BOOT_CMD ( + resetout,2 ,1 , do_resetout, +"resetout - assert PMC-RESETOUT# signal\n" , +NULL + ); + + +int do_inta (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +if (is_monarch ()) { +printf ("This command is only supported in non-monarch mode\n" ); +return -1 ; + } + +if (argc >1 ) { +if (argv[1 ][0 ] =='0' ) { +/* assert */ +printf ("inta# asserted\n" ); +out_be32 ((void *)GPIO1_TCR , +in_be32 ((void *)GPIO1_TCR ) |GPIO1_INTA_FAKE ); + }else { +/* deassert */ +printf ("inta# deasserted\n" ); +out_be32 ((void *)GPIO1_TCR , +in_be32 ((void *)GPIO1_TCR ) & ~GPIO1_INTA_FAKE ); + } + }else { +printf ("inta# is %s\n" ,in_be32 ((void *)GPIO1_TCR ) &GPIO1_INTA_FAKE ?"active" :"inactive" ); + } +return 0 ; +} +U_BOOT_CMD ( + inta,2 ,1 , do_inta, +"inta - Assert/Deassert or query INTA# state in non-monarch mode\n" , +NULL + ); + + +/* test-only */ +int do_pmm (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +ulong pciaddr; + +if (argc >1 ) { + pciaddr =simple_strtoul (argv[1 ],NULL ,16 ); + + pciaddr &=0xf0000000 ; + +/* map PCI address at 0xc0000000 in PLB space */ +out32r (PCIX0_PMM1MA ,0x00000000 );/* PMM1 Mask/Attribute - disabled b4 setting */ +out32r (PCIX0_PMM1LA ,0xc0000000 );/* PMM1 Local Address */ +out32r (PCIX0_PMM1PCILA , pciaddr);/* PMM1 PCI Low Address */ +out32r (PCIX0_PMM1PCIHA ,0x00000000 );/* PMM1 PCI High Address */ +out32r (PCIX0_PMM1MA ,0xf0000001 );/* 256MB + No prefetching, and enable region */ + }else { +printf ("Usage:\npmm %s\n" , cmdtp->help); + } +return 0 ; +} +U_BOOT_CMD ( + pmm,2 ,1 , do_pmm, +"pmm - Setup pmm[1] registers\n" , +"<pciaddr> (pciaddr will be aligned to 256MB)\n" + ); + +#if defined(CFG_EEPROM_WREN ) +int do_eep_wren (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) +{ +int query = argc ==1 ; +int state =0 ; + +if (query) { +/* Query write access state. */ + state =eeprom_write_enable (CFG_I2C_EEPROM_ADDR ,-1 ); +if (state <0 ) { +puts ("Query of write access state failed.\n" ); + }else { +printf ("Write access for device 0x%0x is %sabled.\n" , +CFG_I2C_EEPROM_ADDR , state ?"en" :"dis" ); + state =0 ; + } + }else { +if ('0' == argv[1 ][0 ]) { +/* Disable write access. */ + state =eeprom_write_enable (CFG_I2C_EEPROM_ADDR ,0 ); + }else { +/* Enable write access. */ + state =eeprom_write_enable (CFG_I2C_EEPROM_ADDR ,1 ); + } +if (state <0 ) { +puts ("Setup of write access state failed.\n" ); + } + } + +return state; +} +U_BOOT_CMD (eepwren,2 ,0 , do_eep_wren, +"eepwren - Enable / disable / query EEPROM write access\n" , +NULL ); +#endif /* #if defined(CFG_EEPROM_WREN) */ + +#endif /* CONFIG_CMD_BSP */
board/esd/pmc440/fpga.c new file +469 -0
469 lines not on this page · raw message
board/esd/pmc440/fpga.h new file +47 -0
47 lines not on this page · raw message
Signature · 1 line
1.5.3
PATCH 5/5 ppc4xx: Complete PMC440 board support
In reply to Matthias FuchsThis patch brings the PMC440 board configuration file. Finally it enables the PMC440 board support.
---
MAINTAINERS | 1 +
MAKEALL | 1 +
Makefile | 3 +
include/configs/{sequoia.h => PMC440.h} | 400 ++++++++++++++++---------------
4 files changed, 211 insertions(+), 194 deletions(-)
copy include/configs/{sequoia.h => PMC440.h} (51%)MAINTAINERS +1 -0
@@ -159,6 +159,7 @@ Matthias Fuchs <[email protected]> PCI405 PPC405GP PLU405 PPC405EP PMC405 PPC405GP + PMC440 PPC440EPx VOH405 PPC405EP VOM405 PPC405EP WUH405 PPC405EP
MAKEALL +1 -0
@@ -208,6 +208,7 @@ LIST_4xx=" \ PIP405 \ PLU405 \ PMC405 \ + PMC440 \ PPChameleonEVB \ rainier \ sbc405 \
Makefile +3 -0
@@ -1234,6 +1234,9 @@ PLU405_config: unconfig PMC405_config: unconfig @$(MKCONFIG) $(@:_config=) ppc ppc4xx pmc405 esd +PMC440_config: unconfig + @$(MKCONFIG) $(@:_config=) ppc ppc4xx pmc440 esd + PPChameleonEVB_config \ PPChameleonEVB_BA_25_config \ PPChameleonEVB_ME_25_config \
include/configs/PMC440.h renamed from include/configs/sequoia.h +206 -194
626 lines not on this page · raw message
Signature · 1 line
1.5.3