]>
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 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
2076d0a1 SR |
6 | */ |
7 | ||
8 | #include <common.h> | |
9 | #include <command.h> | |
ca0c2d42 MF |
10 | #if !defined(CONFIG_440) |
11 | #include <asm/4xx_pci.h> | |
12 | #endif | |
2076d0a1 | 13 | |
b9307262 | 14 | #if defined(CONFIG_CMD_BSP) |
2076d0a1 | 15 | |
74de7aef | 16 | extern int do_source (cmd_tbl_t *, int, int, char *[]); |
2076d0a1 SR |
17 | |
18 | #define ADDRMASK 0xfffff000 | |
19 | ||
20 | /* | |
21 | * Command loadpci: wait for signal from host and boot image. | |
22 | */ | |
54841ab5 | 23 | int do_loadpci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
2076d0a1 | 24 | { |
ca0c2d42 | 25 | u32 *ptr = 0; |
2076d0a1 SR |
26 | int count = 0; |
27 | int count2 = 0; | |
28 | char addr[16]; | |
29 | char str[] = "\\|/-"; | |
30 | char *local_args[2]; | |
ca0c2d42 | 31 | u32 la, ptm1la; |
2076d0a1 | 32 | |
ca0c2d42 | 33 | #if defined(CONFIG_440) |
ddc922ff | 34 | ptm1la = in32r(PCIL0_PTM1LA); |
ca0c2d42 MF |
35 | #else |
36 | ptm1la = in32r(PTM1LA); | |
37 | #endif | |
2076d0a1 SR |
38 | while(1) { |
39 | /* | |
40 | * Mark sync address | |
41 | */ | |
ca0c2d42 | 42 | ptr = (u32 *)ptm1la; |
2076d0a1 SR |
43 | memset(ptr, 0, 0x20); |
44 | ||
45 | *ptr = 0xffffffff; | |
46 | puts("\nWaiting for action from pci host -"); | |
47 | ||
48 | /* | |
49 | * Wait for host to write the start address | |
50 | */ | |
51 | while (*ptr == 0xffffffff) { | |
52 | count++; | |
53 | if (!(count % 100)) { | |
54 | count2++; | |
55 | putc(0x08); /* backspace */ | |
56 | putc(str[count2 % 4]); | |
57 | } | |
58 | ||
59 | /* Abort if ctrl-c was pressed */ | |
60 | if (ctrlc()) { | |
61 | puts("\nAbort\n"); | |
62 | return 0; | |
63 | } | |
64 | ||
65 | udelay(1000); | |
66 | } | |
67 | ||
68 | printf("\nGot bootcode %08x: ", *ptr); | |
ca0c2d42 MF |
69 | la = ptm1la + (*ptr & ADDRMASK); |
70 | sprintf(addr, "%08x", la); | |
2076d0a1 SR |
71 | |
72 | switch (*ptr & ~ADDRMASK) { | |
73 | case 0: | |
74 | /* | |
75 | * Boot image via bootm | |
76 | */ | |
77 | printf("booting image at addr 0x%s ...\n", addr); | |
78 | setenv("loadaddr", addr); | |
ca0c2d42 | 79 | do_bootm(cmdtp, 0, 0, NULL); |
2076d0a1 SR |
80 | break; |
81 | ||
82 | case 1: | |
83 | /* | |
74de7aef | 84 | * Boot image via "source" command |
2076d0a1 SR |
85 | */ |
86 | printf("executing script at addr 0x%s ...\n", addr); | |
2076d0a1 SR |
87 | local_args[0] = addr; |
88 | local_args[1] = NULL; | |
74de7aef | 89 | do_source(cmdtp, 0, 1, local_args); |
2076d0a1 SR |
90 | break; |
91 | ||
92 | case 2: | |
93 | /* | |
94 | * Call run_cmd | |
95 | */ | |
96 | printf("running command at addr 0x%s ...\n", addr); | |
53071532 | 97 | run_command((char *)la, 0); |
2076d0a1 SR |
98 | break; |
99 | ||
100 | default: | |
101 | printf("unhandled boot method\n"); | |
102 | break; | |
103 | } | |
104 | } | |
105 | } | |
106 | ||
107 | U_BOOT_CMD( | |
108 | loadpci, 1, 1, do_loadpci, | |
2fb2604d | 109 | "Wait for pci bootcmd and boot it", |
a89c33db WD |
110 | "" |
111 | ); | |
2076d0a1 SR |
112 | |
113 | #endif |