]>
Commit | Line | Data |
---|---|---|
2076d0a1 | 1 | /* |
ca0c2d42 | 2 | * (C) Copyright 2005-2008 |
2076d0a1 SR |
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> | |
ca0c2d42 MF |
26 | #if !defined(CONFIG_440) |
27 | #include <asm/4xx_pci.h> | |
28 | #endif | |
2076d0a1 | 29 | |
b9307262 | 30 | #if defined(CONFIG_CMD_BSP) |
2076d0a1 SR |
31 | |
32 | extern int do_bootm (cmd_tbl_t *, int, int, char *[]); | |
33 | extern int do_autoscript (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 | { | |
ca0c2d42 | 42 | u32 *ptr = 0; |
2076d0a1 SR |
43 | int count = 0; |
44 | int count2 = 0; | |
45 | char addr[16]; | |
46 | char str[] = "\\|/-"; | |
47 | char *local_args[2]; | |
ca0c2d42 | 48 | u32 la, ptm1la; |
2076d0a1 | 49 | |
ca0c2d42 MF |
50 | #if defined(CONFIG_440) |
51 | ptm1la = in32r(PCIX0_PTM1LA); | |
52 | #else | |
53 | ptm1la = in32r(PTM1LA); | |
54 | #endif | |
2076d0a1 SR |
55 | while(1) { |
56 | /* | |
57 | * Mark sync address | |
58 | */ | |
ca0c2d42 | 59 | ptr = (u32 *)ptm1la; |
2076d0a1 SR |
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); | |
ca0c2d42 MF |
86 | la = ptm1la + (*ptr & ADDRMASK); |
87 | sprintf(addr, "%08x", la); | |
2076d0a1 SR |
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); | |
ca0c2d42 | 96 | do_bootm(cmdtp, 0, 0, NULL); |
2076d0a1 SR |
97 | break; |
98 | ||
99 | case 1: | |
100 | /* | |
101 | * Boot image via autoscr | |
102 | */ | |
103 | printf("executing script at addr 0x%s ...\n", addr); | |
2076d0a1 SR |
104 | local_args[0] = addr; |
105 | local_args[1] = NULL; | |
106 | do_autoscript(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); | |
ca0c2d42 | 114 | run_command((char*)la, 0); |
2076d0a1 SR |
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, | |
2fb2604d | 126 | "Wait for pci bootcmd and boot it", |
2076d0a1 SR |
127 | NULL |
128 | ); | |
129 | ||
130 | #endif |