Blame view
disk/part_mac.c
5.38 KB
fe8c2806c Initial revision |
1 2 3 4 |
/* * (C) Copyright 2000 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * |
1a4596601 Add GPL-2.0+ SPDX... |
5 |
* SPDX-License-Identifier: GPL-2.0+ |
fe8c2806c Initial revision |
6 7 8 9 10 11 12 13 14 15 16 17 18 |
*/ /* * Support for harddisk partitions. * * To be compatible with LinuxPPC and Apple we use the standard Apple * SCSI disk partitioning scheme. For more information see: * http://developer.apple.com/techpubs/mac/Devices/Devices-126.html#MARKER-14-92 */ #include <common.h> #include <command.h> #include <ide.h> |
fe8c2806c Initial revision |
19 |
#include "part_mac.h" |
2c1af9dcd disk: define HAVE... |
20 |
#ifdef HAVE_BLOCK_DEVICE |
fe8c2806c Initial revision |
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/* stdlib.h causes some compatibility problems; should fixe these! -- wd */ #ifndef __ldiv_t_defined typedef struct { long int quot; /* Quotient */ long int rem; /* Remainder */ } ldiv_t; extern ldiv_t ldiv (long int __numer, long int __denom); # define __ldiv_t_defined 1 #endif static int part_mac_read_ddb (block_dev_desc_t *dev_desc, mac_driver_desc_t *ddb_p); static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partition_t *pdb_p); /* * Test for a valid MAC partition */ int test_part_mac (block_dev_desc_t *dev_desc) { |
64a08a9ff part_mac: dcache:... |
41 42 |
ALLOC_CACHE_ALIGN_BUFFER(mac_driver_desc_t, ddesc, 1); ALLOC_CACHE_ALIGN_BUFFER(mac_partition_t, mpart, 1); |
fe8c2806c Initial revision |
43 |
ulong i, n; |
64a08a9ff part_mac: dcache:... |
44 |
if (part_mac_read_ddb (dev_desc, ddesc)) { |
fe8c2806c Initial revision |
45 46 47 48 49 50 |
/* error reading Driver Desriptor Block, or no valid Signature */ return (-1); } n = 1; /* assuming at least one partition */ for (i=1; i<=n; ++i) { |
64a08a9ff part_mac: dcache:... |
51 52 |
if ((dev_desc->block_read(dev_desc->dev, i, 1, (ulong *)mpart) != 1) || (mpart->signature != MAC_PARTITION_MAGIC) ) { |
fe8c2806c Initial revision |
53 54 55 |
return (-1); } /* update partition count */ |
64a08a9ff part_mac: dcache:... |
56 |
n = mpart->map_count; |
fe8c2806c Initial revision |
57 58 59 60 61 62 63 64 |
} return (0); } void print_part_mac (block_dev_desc_t *dev_desc) { ulong i, n; |
64a08a9ff part_mac: dcache:... |
65 66 |
ALLOC_CACHE_ALIGN_BUFFER(mac_driver_desc_t, ddesc, 1); ALLOC_CACHE_ALIGN_BUFFER(mac_partition_t, mpart, 1); |
fe8c2806c Initial revision |
67 |
ldiv_t mb, gb; |
64a08a9ff part_mac: dcache:... |
68 |
if (part_mac_read_ddb (dev_desc, ddesc)) { |
fe8c2806c Initial revision |
69 70 71 |
/* error reading Driver Desriptor Block, or no valid Signature */ return; } |
64a08a9ff part_mac: dcache:... |
72 |
n = ddesc->blk_count; |
fe8c2806c Initial revision |
73 |
|
64a08a9ff part_mac: dcache:... |
74 |
mb = ldiv(n, ((1024 * 1024) / ddesc->blk_size)); /* MB */ |
fe8c2806c Initial revision |
75 |
/* round to 1 digit */ |
64a08a9ff part_mac: dcache:... |
76 |
mb.rem *= 10 * ddesc->blk_size; |
fe8c2806c Initial revision |
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
mb.rem += 512 * 1024; mb.rem /= 1024 * 1024; gb = ldiv(10 * mb.quot + mb.rem, 10240); gb.rem += 512; gb.rem /= 1024; printf ("Block Size=%d, Number of Blocks=%d, " "Total Capacity: %ld.%ld MB = %ld.%ld GB " "DeviceType=0x%x, DeviceId=0x%x " " #: type name" " length base (size) ", |
64a08a9ff part_mac: dcache:... |
94 95 |
ddesc->blk_size, ddesc->blk_count, |
fe8c2806c Initial revision |
96 |
mb.quot, mb.rem, gb.quot, gb.rem, |
64a08a9ff part_mac: dcache:... |
97 |
ddesc->dev_type, ddesc->dev_id |
fe8c2806c Initial revision |
98 99 100 101 102 103 104 105 |
); n = 1; /* assuming at least one partition */ for (i=1; i<=n; ++i) { ulong bytes; char c; printf ("%4ld: ", i); |
64a08a9ff part_mac: dcache:... |
106 |
if (dev_desc->block_read (dev_desc->dev, i, 1, (ulong *)mpart) != 1) { |
fe8c2806c Initial revision |
107 108 109 110 111 |
printf ("** Can't read Partition Map on %d:%ld ** ", dev_desc->dev, i); return; } |
64a08a9ff part_mac: dcache:... |
112 |
if (mpart->signature != MAC_PARTITION_MAGIC) { |
fe8c2806c Initial revision |
113 114 115 |
printf ("** Bad Signature on %d:%ld - " "expected 0x%04x, got 0x%04x ", |
64a08a9ff part_mac: dcache:... |
116 |
dev_desc->dev, i, MAC_PARTITION_MAGIC, mpart->signature); |
fe8c2806c Initial revision |
117 118 119 120 |
return; } /* update partition count */ |
64a08a9ff part_mac: dcache:... |
121 |
n = mpart->map_count; |
fe8c2806c Initial revision |
122 123 |
c = 'k'; |
64a08a9ff part_mac: dcache:... |
124 125 |
bytes = mpart->block_count; bytes /= (1024 / ddesc->blk_size); /* kB; assumes blk_size == 512 */ |
fe8c2806c Initial revision |
126 127 128 129 130 131 132 133 134 135 136 |
if (bytes >= 1024) { bytes >>= 10; c = 'M'; } if (bytes >= 1024) { bytes >>= 10; c = 'G'; } printf ("%20.32s %-18.32s %10u @ %-10u (%3ld%c) ", |
64a08a9ff part_mac: dcache:... |
137 138 139 140 |
mpart->type, mpart->name, mpart->block_count, mpart->start_block, |
fe8c2806c Initial revision |
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
bytes, c ); } return; } /* * Read Device Descriptor Block */ static int part_mac_read_ddb (block_dev_desc_t *dev_desc, mac_driver_desc_t *ddb_p) { if (dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *)ddb_p) != 1) { printf ("** Can't read Driver Desriptor Block ** "); return (-1); } if (ddb_p->signature != MAC_DRIVER_MAGIC) { #if 0 printf ("** Bad Signature: expected 0x%04x, got 0x%04x ", MAC_DRIVER_MAGIC, ddb_p->signature); #endif return (-1); } return (0); } /* * Read Partition Descriptor Block */ static int part_mac_read_pdb (block_dev_desc_t *dev_desc, int part, mac_partition_t *pdb_p) { int n = 1; for (;;) { /* |
8bde7f776 * Code cleanup: |
180 181 182 |
* We must always read the descritpor block for * partition 1 first since this is the only way to * know how many partitions we have. |
fe8c2806c Initial revision |
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
*/ if (dev_desc->block_read (dev_desc->dev, n, 1, (ulong *)pdb_p) != 1) { printf ("** Can't read Partition Map on %d:%d ** ", dev_desc->dev, n); return (-1); } if (pdb_p->signature != MAC_PARTITION_MAGIC) { printf ("** Bad Signature on %d:%d: " "expected 0x%04x, got 0x%04x ", dev_desc->dev, n, MAC_PARTITION_MAGIC, pdb_p->signature); return (-1); } if (n == part) return (0); if ((part < 1) || (part > pdb_p->map_count)) { printf ("** Invalid partition %d:%d [%d:1...%d:%d only] ", dev_desc->dev, part, dev_desc->dev, dev_desc->dev, pdb_p->map_count); return (-1); } /* update partition count */ n = part; } /* NOTREACHED */ } int get_partition_info_mac (block_dev_desc_t *dev_desc, int part, disk_partition_t *info) { |
64a08a9ff part_mac: dcache:... |
220 221 |
ALLOC_CACHE_ALIGN_BUFFER(mac_driver_desc_t, ddesc, 1); ALLOC_CACHE_ALIGN_BUFFER(mac_partition_t, mpart, 1); |
fe8c2806c Initial revision |
222 |
|
64a08a9ff part_mac: dcache:... |
223 |
if (part_mac_read_ddb (dev_desc, ddesc)) { |
fe8c2806c Initial revision |
224 225 |
return (-1); } |
64a08a9ff part_mac: dcache:... |
226 |
info->blksz = ddesc->blk_size; |
fe8c2806c Initial revision |
227 |
|
64a08a9ff part_mac: dcache:... |
228 |
if (part_mac_read_pdb (dev_desc, part, mpart)) { |
fe8c2806c Initial revision |
229 230 |
return (-1); } |
64a08a9ff part_mac: dcache:... |
231 232 233 234 |
info->start = mpart->start_block; info->size = mpart->block_count; memcpy (info->type, mpart->type, sizeof(info->type)); memcpy (info->name, mpart->name, sizeof(info->name)); |
fe8c2806c Initial revision |
235 236 237 |
return (0); } |
cde5c64d1 disk/: Remove obs... |
238 |
#endif |