]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/esd/common/cmd_loadpci.c
mxc_ipuv3: fix memory alignment of framebuffer
[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_source (cmd_tbl_t *, int, int, char *[]);
33
34 #define ADDRMASK 0xfffff000
35
36 /*
37  * Command loadpci: wait for signal from host and boot image.
38  */
39 int do_loadpci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
40 {
41         u32 *ptr = 0;
42         int count = 0;
43         int count2 = 0;
44         char addr[16];
45         char str[] = "\\|/-";
46         char *local_args[2];
47         u32 la, ptm1la;
48
49 #if defined(CONFIG_440)
50         ptm1la = in32r(PCIL0_PTM1LA);
51 #else
52         ptm1la = in32r(PTM1LA);
53 #endif
54         while(1) {
55                 /*
56                  * Mark sync address
57                  */
58                 ptr = (u32 *)ptm1la;
59                 memset(ptr, 0, 0x20);
60
61                 *ptr = 0xffffffff;
62                 puts("\nWaiting for action from pci host -");
63
64                 /*
65                  * Wait for host to write the start address
66                  */
67                 while (*ptr == 0xffffffff) {
68                         count++;
69                         if (!(count % 100)) {
70                                 count2++;
71                                 putc(0x08); /* backspace */
72                                 putc(str[count2 % 4]);
73                         }
74
75                         /* Abort if ctrl-c was pressed */
76                         if (ctrlc()) {
77                                 puts("\nAbort\n");
78                                 return 0;
79                         }
80
81                         udelay(1000);
82                 }
83
84                 printf("\nGot bootcode %08x: ", *ptr);
85                 la = ptm1la + (*ptr & ADDRMASK);
86                 sprintf(addr, "%08x", la);
87
88                 switch (*ptr & ~ADDRMASK) {
89                 case 0:
90                         /*
91                          * Boot image via bootm
92                          */
93                         printf("booting image at addr 0x%s ...\n", addr);
94                         setenv("loadaddr", addr);
95                         do_bootm(cmdtp, 0, 0, NULL);
96                         break;
97
98                 case 1:
99                         /*
100                          * Boot image via "source" command
101                          */
102                         printf("executing script at addr 0x%s ...\n", addr);
103                         local_args[0] = addr;
104                         local_args[1] = NULL;
105                         do_source(cmdtp, 0, 1, local_args);
106                         break;
107
108                 case 2:
109                         /*
110                          * Call run_cmd
111                          */
112                         printf("running command at addr 0x%s ...\n", addr);
113                         run_command((char *)la, 0);
114                         break;
115
116                 default:
117                         printf("unhandled boot method\n");
118                         break;
119                 }
120         }
121 }
122
123 U_BOOT_CMD(
124         loadpci,        1,      1,      do_loadpci,
125         "Wait for pci bootcmd and boot it",
126         ""
127 );
128
129 #endif