Fix some missing commands, cleanup header files
[oweals/u-boot.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
28 #undef  PART_DEBUG
29
30 #ifdef  PART_DEBUG
31 #define PRINTF(fmt,args...)     printf (fmt ,##args)
32 #else
33 #define PRINTF(fmt,args...)
34 #endif
35
36 #if (CONFIG_COMMANDS & CFG_CMD_IDE) || (CONFIG_COMMANDS & CFG_CMD_SCSI)
37
38 /* ------------------------------------------------------------------------- */
39 /*
40  * reports device info to the user
41  */
42 void dev_print (block_dev_desc_t *dev_desc)
43 {
44         ulong lba512; /* number of blocks if 512bytes block size */
45
46         if (dev_desc->type==DEV_TYPE_UNKNOWN) {
47                 puts ("not available\n");
48                 return;
49         }
50         if (dev_desc->if_type==IF_TYPE_SCSI)  {
51                 printf ("(%d:%d) ", dev_desc->target,dev_desc->lun);
52         }
53         if (dev_desc->if_type==IF_TYPE_IDE) {
54                 printf ("Model: %s Firm: %s Ser#: %s\n",
55                         dev_desc->vendor,
56                         dev_desc->revision,
57                         dev_desc->product);
58         } else {
59                 printf ("Vendor: %s Prod.: %s Rev: %s\n",
60                         dev_desc->vendor,
61                         dev_desc->product,
62                         dev_desc->revision);
63         }
64         puts ("            Type: ");
65         if (dev_desc->removable)
66                 puts ("Removable ");
67         switch (dev_desc->type & 0x1F) {
68                 case DEV_TYPE_HARDDISK: puts ("Hard Disk");
69                                         break;
70                 case DEV_TYPE_CDROM:    puts ("CD ROM");
71                                         break;
72                 case DEV_TYPE_OPDISK:   puts ("Optical Device");
73                                         break;
74                 case DEV_TYPE_TAPE:     puts ("Tape");
75                                         break;
76                 default:                printf ("# %02X #", dev_desc->type & 0x1F);
77                                         break;
78         }
79         puts ("\n");
80         if ((dev_desc->lba * dev_desc->blksz)>0L) {
81                 ulong mb, mb_quot, mb_rem, gb, gb_quot, gb_rem;
82
83                 lba512 = (dev_desc->lba * (dev_desc->blksz/512));
84
85                 mb = (10 * lba512) / 2048;      /* 2048 = (1024 * 1024) / 512 MB */
86                 /* round to 1 digit */
87                 mb_quot = mb / 10;
88                 mb_rem  = mb - (10 * mb_quot);
89
90                 gb = mb / 1024;
91                 gb_quot = gb / 10;
92                 gb_rem  = gb - (10 * gb_quot);
93
94                 printf ("            Capacity: %ld.%ld MB = %ld.%ld GB (%ld x %ld)\n",
95                         mb_quot, mb_rem,
96                         gb_quot, gb_rem,
97                         dev_desc->lba,
98                         dev_desc->blksz);
99         } else {
100                 puts ("            Capacity: not available\n");
101         }
102 }
103
104
105 #if defined(CONFIG_MAC_PARTITION) || \
106     defined(CONFIG_DOS_PARTITION) || \
107     defined(CONFIG_ISO_PARTITION) || \
108     defined(CONFIG_AMIGA_PARTITION)
109
110 void init_part (block_dev_desc_t * dev_desc)
111 {
112 #ifdef CONFIG_ISO_PARTITION
113         if (test_part_iso(dev_desc) == 0) {
114                 dev_desc->part_type = PART_TYPE_ISO;
115                 return;
116         }
117 #endif
118
119 #ifdef CONFIG_MAC_PARTITION
120         if (test_part_mac(dev_desc) == 0) {
121                 dev_desc->part_type = PART_TYPE_MAC;
122                 return;
123         }
124 #endif
125
126 #ifdef CONFIG_DOS_PARTITION
127         if (test_part_dos(dev_desc) == 0) {
128                 dev_desc->part_type = PART_TYPE_DOS;
129                 return;
130         }
131 #endif
132
133 #ifdef CONFIG_AMIGA_PARTITION
134         if (test_part_amiga(dev_desc) == 0) {
135             dev_desc->part_type = PART_TYPE_AMIGA;
136             return;
137         }
138 #endif
139 }
140
141
142 int get_partition_info (block_dev_desc_t *dev_desc, int part, disk_partition_t *info)
143 {
144                 switch (dev_desc->part_type) {
145 #ifdef CONFIG_MAC_PARTITION
146         case PART_TYPE_MAC:
147                 if (get_partition_info_mac(dev_desc,part,info) == 0) {
148                         PRINTF ("## Valid MAC partition found ##\n");
149                         return (0);
150                 }
151                 break;
152 #endif
153
154 #ifdef CONFIG_DOS_PARTITION
155         case PART_TYPE_DOS:
156                 if (get_partition_info_dos(dev_desc,part,info) == 0) {
157                         PRINTF ("## Valid DOS partition found ##\n");
158                         return (0);
159                 }
160                 break;
161 #endif
162
163 #ifdef CONFIG_ISO_PARTITION
164         case PART_TYPE_ISO:
165                 if (get_partition_info_iso(dev_desc,part,info) == 0) {
166                         PRINTF ("## Valid ISO boot partition found ##\n");
167                         return (0);
168                 }
169                 break;
170 #endif
171
172 #ifdef CONFIG_AMIGA_PARTITION
173         case PART_TYPE_AMIGA:
174             if (get_partition_info_amiga(dev_desc, part, info) == 0)
175             {
176                 PRINTF ("## Valid Amiga partition found ##\n");
177                 return (0);
178             }
179             break;
180 #endif
181         default:
182                 break;
183         }
184         return (-1);
185 }
186
187 static void print_part_header (const char *type, block_dev_desc_t * dev_desc)
188 {
189         puts ("\nPartition Map for ");
190         switch (dev_desc->if_type) {
191                 case IF_TYPE_IDE:       puts ("IDE");
192                                         break;
193                 case IF_TYPE_SCSI:      puts ("SCSI");
194                                         break;
195                 case IF_TYPE_ATAPI:     puts ("ATAPI");
196                                         break;
197                 case IF_TYPE_USB:       puts ("USB");
198                                         break;
199                 case IF_TYPE_DOC:       puts ("DOC");
200                                         break;
201                 default:                puts ("UNKNOWN");
202                                         break;
203         }
204         printf (" device %d  --   Partition Type: %s\n\n",
205                         dev_desc->dev, type);
206 }
207
208 void print_part (block_dev_desc_t * dev_desc)
209 {
210
211                 switch (dev_desc->part_type) {
212 #ifdef CONFIG_MAC_PARTITION
213         case PART_TYPE_MAC:
214                 PRINTF ("## Testing for valid MAC partition ##\n");
215                 print_part_header ("MAC", dev_desc);
216                 print_part_mac (dev_desc);
217                 return;
218 #endif
219 #ifdef CONFIG_DOS_PARTITION
220         case PART_TYPE_DOS:
221                 PRINTF ("## Testing for valid DOS partition ##\n");
222                 print_part_header ("DOS", dev_desc);
223                 print_part_dos (dev_desc);
224                 return;
225 #endif
226
227 #ifdef CONFIG_ISO_PARTITION
228         case PART_TYPE_ISO:
229                 PRINTF ("## Testing for valid ISO Boot partition ##\n");
230                 print_part_header ("ISO", dev_desc);
231                 print_part_iso (dev_desc);
232                 return;
233 #endif
234
235 #ifdef CONFIG_AMIGA_PARTITION
236         case PART_TYPE_AMIGA:
237             PRINTF ("## Testing for a valid Amiga partition ##\n");
238             print_part_header ("AMIGA", dev_desc);
239             print_part_amiga (dev_desc);
240             return;
241 #endif
242         }
243         puts ("## Unknown partition table\n");
244 }
245
246
247 #else   /* neither MAC nor DOS nor ISO partition configured */
248 # error neither CONFIG_MAC_PARTITION nor CONFIG_DOS_PARTITION nor CONFIG_ISO_PARTITION configured!
249 #endif
250
251 #endif  /* (CONFIG_COMMANDS & CFG_CMD_IDE) || CONFIG_COMMANDS & CFG_CMD_SCSI) */