]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - disk/part.c
applied patches from Freescale and Ka-Ro
[karo-tx-uboot.git] / disk / part.c
1 /*
2  * (C) Copyright 2001
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
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 #include <ide.h>
27 #include <part.h>
28
29 #undef  PART_DEBUG
30
31 #ifdef  PART_DEBUG
32 #define PRINTF(fmt,args...)     printf (fmt ,##args)
33 #else
34 #define PRINTF(fmt,args...)
35 #endif
36
37 #if (defined(CONFIG_CMD_IDE) || \
38      defined(CONFIG_CMD_MG_DISK) || \
39      defined(CONFIG_CMD_SATA) || \
40      defined(CONFIG_CMD_SCSI) || \
41      defined(CONFIG_CMD_USB) || \
42      defined(CONFIG_MMC) || \
43      defined(CONFIG_SYSTEMACE) )
44
45 struct block_drvr {
46         char *name;
47         block_dev_desc_t* (*get_dev)(int dev);
48 };
49
50 static const struct block_drvr block_drvr[] = {
51 #if defined(CONFIG_CMD_IDE)
52         { .name = "ide", .get_dev = ide_get_dev, },
53 #endif
54 #if defined(CONFIG_CMD_PATA)
55         { .name = "pata", .get_dev = pata_get_dev, },
56 #endif
57 #if defined(CONFIG_CMD_SATA)
58         {.name = "sata", .get_dev = sata_get_dev, },
59 #endif
60 #if defined(CONFIG_CMD_SCSI)
61         { .name = "scsi", .get_dev = scsi_get_dev, },
62 #endif
63 #if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
64         { .name = "usb", .get_dev = usb_stor_get_dev, },
65 #endif
66 #if defined(CONFIG_MMC)
67         { .name = "mmc", .get_dev = mmc_get_dev, },
68 #endif
69 #if defined(CONFIG_SYSTEMACE)
70         { .name = "ace", .get_dev = systemace_get_dev, },
71 #endif
72 #if defined(CONFIG_CMD_MG_DISK)
73         { .name = "mgd", .get_dev = mg_disk_get_dev, },
74 #endif
75         { },
76 };
77
78 DECLARE_GLOBAL_DATA_PTR;
79
80 block_dev_desc_t *get_dev(char* ifname, int dev)
81 {
82         const struct block_drvr *drvr = block_drvr;
83         block_dev_desc_t* (*reloc_get_dev)(int dev);
84
85         while (drvr->name) {
86                 reloc_get_dev = drvr->get_dev + gd->reloc_off;
87                 if (strncmp(ifname, drvr->name, strlen(drvr->name)) == 0)
88                         return reloc_get_dev(dev);
89                 drvr++;
90         }
91         return NULL;
92 }
93 #else
94 block_dev_desc_t *get_dev(char* ifname, int dev)
95 {
96         return NULL;
97 }
98 #endif
99
100 #if (defined(CONFIG_CMD_IDE) || \
101         defined(CONFIG_CMD_PATA) || \
102      defined(CONFIG_CMD_MG_DISK) || \
103      defined(CONFIG_CMD_SATA) || \
104      defined(CONFIG_CMD_SCSI) || \
105      defined(CONFIG_CMD_USB) || \
106      defined(CONFIG_MMC) || \
107      defined(CONFIG_SYSTEMACE) )
108
109 /* ------------------------------------------------------------------------- */
110 /*
111  * reports device info to the user
112  */
113 void dev_print (block_dev_desc_t *dev_desc)
114 {
115 #ifdef CONFIG_LBA48
116         uint64_t lba512; /* number of blocks if 512bytes block size */
117 #else
118         lbaint_t lba512;
119 #endif
120
121         if (dev_desc->type == DEV_TYPE_UNKNOWN) {
122                 puts ("not available\n");
123                 return;
124         }
125
126         switch (dev_desc->if_type) {
127         case IF_TYPE_SCSI:
128                 printf ("(%d:%d) Vendor: %s Prod.: %s Rev: %s\n",
129                         dev_desc->target,dev_desc->lun,
130                         dev_desc->vendor,
131                         dev_desc->product,
132                         dev_desc->revision);
133                 break;
134         case IF_TYPE_ATAPI:
135         case IF_TYPE_IDE:
136         case IF_TYPE_SATA:
137                 printf ("Model: %s Firm: %s Ser#: %s\n",
138                         dev_desc->vendor,
139                         dev_desc->revision,
140                         dev_desc->product);
141                 break;
142         case IF_TYPE_SD:
143         case IF_TYPE_MMC:
144         case IF_TYPE_USB:
145                 printf ("Vendor: %s Rev: %s Prod: %s\n",
146                         dev_desc->vendor,
147                         dev_desc->revision,
148                         dev_desc->product);
149                 break;
150         case IF_TYPE_DOC:
151                 puts("device type DOC\n");
152                 return;
153         case IF_TYPE_UNKNOWN:
154                 puts("device type unknown\n");
155                 return;
156         default:
157                 printf("Unhandled device type: %i\n", dev_desc->if_type);
158                 return;
159         }
160         puts ("            Type: ");
161         if (dev_desc->removable)
162                 puts ("Removable ");
163         switch (dev_desc->type & 0x1F) {
164         case DEV_TYPE_HARDDISK:
165                 puts ("Hard Disk");
166                 break;
167         case DEV_TYPE_CDROM:
168                 puts ("CD ROM");
169                 break;
170         case DEV_TYPE_OPDISK:
171                 puts ("Optical Device");
172                 break;
173         case DEV_TYPE_TAPE:
174                 puts ("Tape");
175                 break;
176         default:
177                 printf ("# %02X #", dev_desc->type & 0x1F);
178                 break;
179         }
180         puts ("\n");
181         if ((dev_desc->lba * dev_desc->blksz)>0L) {
182                 ulong mb, mb_quot, mb_rem, gb, gb_quot, gb_rem;
183                 lbaint_t lba;
184
185                 lba = dev_desc->lba;
186
187                 lba512 = (lba * (dev_desc->blksz/512));
188                 mb = (10 * lba512) / 2048;      /* 2048 = (1024 * 1024) / 512 MB */
189                 /* round to 1 digit */
190                 mb_quot = mb / 10;
191                 mb_rem  = mb - (10 * mb_quot);
192
193                 gb = mb / 1024;
194                 gb_quot = gb / 10;
195                 gb_rem  = gb - (10 * gb_quot);
196 #ifdef CONFIG_LBA48
197                 if (dev_desc->lba48)
198                         printf ("            Supports 48-bit addressing\n");
199 #endif
200 #if defined(CONFIG_SYS_64BIT_LBA) && defined(CONFIG_SYS_64BIT_VSPRINTF)
201                 printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%Ld x %ld)\n",
202                         mb_quot, mb_rem,
203                         gb_quot, gb_rem,
204                         lba,
205                         dev_desc->blksz);
206 #else
207                 printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%ld x %ld)\n",
208                         mb_quot, mb_rem,
209                         gb_quot, gb_rem,
210                         (ulong)lba,
211                         dev_desc->blksz);
212 #endif
213         } else {
214                 puts ("            Capacity: not available\n");
215         }
216 }
217 #endif
218
219 #if (defined(CONFIG_CMD_IDE) || \
220         defined(CONFIG_CMD_PATA) || \
221      defined(CONFIG_CMD_MG_DISK) || \
222      defined(CONFIG_CMD_SATA) || \
223      defined(CONFIG_CMD_SCSI) || \
224      defined(CONFIG_CMD_USB) || \
225      defined(CONFIG_MMC)                || \
226      defined(CONFIG_SYSTEMACE) )
227
228 #if defined(CONFIG_MAC_PARTITION) || \
229     defined(CONFIG_DOS_PARTITION) || \
230     defined(CONFIG_ISO_PARTITION) || \
231     defined(CONFIG_AMIGA_PARTITION) || \
232     defined(CONFIG_EFI_PARTITION)
233
234 void init_part (block_dev_desc_t * dev_desc)
235 {
236 #ifdef CONFIG_ISO_PARTITION
237         if (test_part_iso(dev_desc) == 0) {
238                 dev_desc->part_type = PART_TYPE_ISO;
239                 return;
240         }
241 #endif
242
243 #ifdef CONFIG_MAC_PARTITION
244         if (test_part_mac(dev_desc) == 0) {
245                 dev_desc->part_type = PART_TYPE_MAC;
246                 return;
247         }
248 #endif
249
250 /* must be placed before DOS partition detection */
251 #ifdef CONFIG_EFI_PARTITION
252         if (test_part_efi(dev_desc) == 0) {
253                 dev_desc->part_type = PART_TYPE_EFI;
254                 return;
255         }
256 #endif
257
258 #ifdef CONFIG_DOS_PARTITION
259         if (test_part_dos(dev_desc) == 0) {
260                 dev_desc->part_type = PART_TYPE_DOS;
261                 return;
262         }
263 #endif
264
265 #ifdef CONFIG_AMIGA_PARTITION
266         if (test_part_amiga(dev_desc) == 0) {
267             dev_desc->part_type = PART_TYPE_AMIGA;
268             return;
269         }
270 #endif
271 }
272
273
274 int get_partition_info (block_dev_desc_t *dev_desc, int part
275                                         , disk_partition_t *info)
276 {
277         switch (dev_desc->part_type) {
278 #ifdef CONFIG_MAC_PARTITION
279         case PART_TYPE_MAC:
280                 if (get_partition_info_mac(dev_desc,part,info) == 0) {
281                         PRINTF ("## Valid MAC partition found ##\n");
282                         return (0);
283                 }
284                 break;
285 #endif
286
287 #ifdef CONFIG_DOS_PARTITION
288         case PART_TYPE_DOS:
289                 if (get_partition_info_dos(dev_desc,part,info) == 0) {
290                         PRINTF ("## Valid DOS partition found ##\n");
291                         return (0);
292                 }
293                 break;
294 #endif
295
296 #ifdef CONFIG_ISO_PARTITION
297         case PART_TYPE_ISO:
298                 if (get_partition_info_iso(dev_desc,part,info) == 0) {
299                         PRINTF ("## Valid ISO boot partition found ##\n");
300                         return (0);
301                 }
302                 break;
303 #endif
304
305 #ifdef CONFIG_AMIGA_PARTITION
306         case PART_TYPE_AMIGA:
307             if (get_partition_info_amiga(dev_desc, part, info) == 0)
308             {
309                 PRINTF ("## Valid Amiga partition found ##\n");
310                 return (0);
311             }
312             break;
313 #endif
314
315 #ifdef CONFIG_EFI_PARTITION
316         case PART_TYPE_EFI:
317                 if (get_partition_info_efi(dev_desc,part,info) == 0) {
318                         PRINTF ("## Valid EFI partition found ##\n");
319                         return (0);
320                 }
321                 break;
322 #endif
323         default:
324                 break;
325         }
326         return (-1);
327 }
328
329 static void print_part_header (const char *type, block_dev_desc_t * dev_desc)
330 {
331         puts ("\nPartition Map for ");
332         switch (dev_desc->if_type) {
333         case IF_TYPE_IDE:
334                 puts ("IDE");
335                 break;
336         case IF_TYPE_SATA:
337                 puts ("SATA");
338                 break;
339         case IF_TYPE_SCSI:
340                 puts ("SCSI");
341                 break;
342         case IF_TYPE_ATAPI:
343                 puts ("ATAPI");
344                 break;
345         case IF_TYPE_USB:
346                 puts ("USB");
347                 break;
348         case IF_TYPE_DOC:
349                 puts ("DOC");
350                 break;
351         default:
352                 puts ("UNKNOWN");
353                 break;
354         }
355         printf (" device %d  --   Partition Type: %s\n\n",
356                         dev_desc->dev, type);
357 }
358
359 void print_part (block_dev_desc_t * dev_desc)
360 {
361
362                 switch (dev_desc->part_type) {
363 #ifdef CONFIG_MAC_PARTITION
364         case PART_TYPE_MAC:
365                 PRINTF ("## Testing for valid MAC partition ##\n");
366                 print_part_header ("MAC", dev_desc);
367                 print_part_mac (dev_desc);
368                 return;
369 #endif
370 #ifdef CONFIG_DOS_PARTITION
371         case PART_TYPE_DOS:
372                 PRINTF ("## Testing for valid DOS partition ##\n");
373                 print_part_header ("DOS", dev_desc);
374                 print_part_dos (dev_desc);
375                 return;
376 #endif
377
378 #ifdef CONFIG_ISO_PARTITION
379         case PART_TYPE_ISO:
380                 PRINTF ("## Testing for valid ISO Boot partition ##\n");
381                 print_part_header ("ISO", dev_desc);
382                 print_part_iso (dev_desc);
383                 return;
384 #endif
385
386 #ifdef CONFIG_AMIGA_PARTITION
387         case PART_TYPE_AMIGA:
388             PRINTF ("## Testing for a valid Amiga partition ##\n");
389             print_part_header ("AMIGA", dev_desc);
390             print_part_amiga (dev_desc);
391             return;
392 #endif
393
394 #ifdef CONFIG_EFI_PARTITION
395         case PART_TYPE_EFI:
396                 PRINTF ("## Testing for valid EFI partition ##\n");
397                 print_part_header ("EFI", dev_desc);
398                 print_part_efi (dev_desc);
399                 return;
400 #endif
401         }
402         puts ("## Unknown partition table\n");
403 }
404
405
406 #else   /* neither MAC nor DOS nor ISO nor AMIGA nor EFI partition configured */
407 # error neither CONFIG_MAC_PARTITION nor CONFIG_DOS_PARTITION
408 # error nor CONFIG_ISO_PARTITION nor CONFIG_AMIGA_PARTITION
409 # error nor CONFIG_EFI_PARTITION configured!
410 #endif
411
412 #endif