1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
32extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
33extern int do_source (cmd_tbl_t *, int, int, char *[]);
34
35#define ADDRMASK 0xfffff000
36
37
38
39
40int 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(PCIL0_PTM1LA);
52#else
53 ptm1la = in32r(PTM1LA);
54#endif
55 while(1) {
56
57
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
67
68 while (*ptr == 0xffffffff) {
69 count++;
70 if (!(count % 100)) {
71 count2++;
72 putc(0x08);
73 putc(str[count2 % 4]);
74 }
75
76
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
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
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
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
124U_BOOT_CMD(
125 loadpci, 1, 1, do_loadpci,
126 "Wait for pci bootcmd and boot it",
127 ""
128);
129
130#endif
131