blob: 97ed91865329ebecea8ba540b7dbb75a9cda6177 [file] [log] [blame]
wdenkaffae2b2002-08-17 09:36:01 +00001/*
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>
wdenkaffae2b2002-08-17 09:36:01 +000027
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 */
42void 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
wdenkaffae2b2002-08-17 09:36:01 +0000105#if defined(CONFIG_MAC_PARTITION) || \
106 defined(CONFIG_DOS_PARTITION) || \
wdenk452cfd62002-11-19 11:04:11 +0000107 defined(CONFIG_ISO_PARTITION) || \
wdenk57b2d802003-06-27 21:31:46 +0000108 defined(CONFIG_AMIGA_PARTITION)
wdenkaffae2b2002-08-17 09:36:01 +0000109
110void 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
wdenk452cfd62002-11-19 11:04:11 +0000132
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
wdenkaffae2b2002-08-17 09:36:01 +0000139}
140
141
142int 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
wdenk452cfd62002-11-19 11:04:11 +0000171
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
wdenkaffae2b2002-08-17 09:36:01 +0000181 default:
182 break;
183 }
184 return (-1);
185}
186
187static 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
208void 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
wdenk452cfd62002-11-19 11:04:11 +0000234
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
wdenkaffae2b2002-08-17 09:36:01 +0000242 }
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) */