]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/esd/common/cmd_loadpci.c
imported Freescale specific U-Boot additions for i.MX28,... release L2.6.31_10.08.01
[karo-tx-uboot.git] / board / esd / common / cmd_loadpci.c
1 /*
2  * (C) Copyright 2005-2008
3  * Matthias Fuchs, esd GmbH Germany, matthias.fuchs@esd-electronics.com
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 #include <common.h>
25 #include <command.h>
26 #if !defined(CONFIG_440)
27 #include <asm/4xx_pci.h>
28 #endif
29
30 #if defined(CONFIG_CMD_BSP)
31
32 extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
33 extern int do_source (cmd_tbl_t *, int, int, char *[]);
34
35 #define ADDRMASK 0xfffff000
36
37 /*
38  * Command loadpci: wait for signal from host and boot image.
39  */
40 int do_loadpci(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
41 {
42         u32 *ptr = 0;
43         int count = 0;
44         int count2 = 0;
45         char addr[16];
46         char str[] = "\\|/-";
47         char *local_args[2];
48         u32 la, ptm1la;
49
50 #if defined(CONFIG_440)
51         ptm1la = in32r(PCIX0_PTM1LA);
52 #else
53         ptm1la = in32r(PTM1LA);
54 #endif
55         while(1) {
56                 /*
57                  * Mark sync address
58                  */
59                 ptr = (u32 *)ptm1la;
60                 memset(ptr, 0, 0x20);
61
62                 *ptr = 0xffffffff;
63                 puts("\nWaiting for action from pci host -");
64
65                 /*
66                  * Wait for host to write the start address
67                  */
68                 while (*ptr == 0xffffffff) {
69                         count++;
70                         if (!(count % 100)) {
71                                 count2++;
72                                 putc(0x08); /* backspace */
73                                 putc(str[count2 % 4]);
74                         }
75
76                         /* Abort if ctrl-c was pressed */
77                         if (ctrlc()) {
78                                 puts("\nAbort\n");
79                                 return 0;
80                         }
81
82                         udelay(1000);
83                 }
84
85                 printf("\nGot bootcode %08x: ", *ptr);
86                 la = ptm1la + (*ptr & ADDRMASK);
87                 sprintf(addr, "%08x", la);
88
89                 switch (*ptr & ~ADDRMASK) {
90                 case 0:
91                         /*
92                          * Boot image via bootm
93                          */
94                         printf("booting image at addr 0x%s ...\n", addr);
95                         setenv("loadaddr", addr);
96                         do_bootm(cmdtp, 0, 0, NULL);
97                         break;
98
99                 case 1:
100                         /*
101                          * Boot image via "source" command
102                          */
103                         printf("executing script at addr 0x%s ...\n", addr);
104                         local_args[0] = addr;
105                         local_args[1] = NULL;
106                         do_source(cmdtp, 0, 1, local_args);
107                         break;
108
109                 case 2:
110                         /*
111                          * Call run_cmd
112                          */
113                         printf("running command at addr 0x%s ...\n", addr);
114                         run_command((char*)la, 0);
115                         break;
116
117                 default:
118                         printf("unhandled boot method\n");
119                         break;
120                 }
121         }
122 }
123
124 U_BOOT_CMD(
125         loadpci,        1,      1,      do_loadpci,
126         "Wait for pci bootcmd and boot it",
127         ""
128 );
129
130 #endif