Blame view

disk/part_mac.c 5.38 KB
fe8c2806c   wdenk   Initial revision
1
2
3
4
  /*
   * (C) Copyright 2000
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
fe8c2806c   wdenk   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   wdenk   Initial revision
19
  #include "part_mac.h"
2c1af9dcd   Stephen Warren   disk: define HAVE...
20
  #ifdef HAVE_BLOCK_DEVICE
fe8c2806c   wdenk   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   Benoît Thébaudeau   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   wdenk   Initial revision
43
  	ulong i, n;
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
44
  	if (part_mac_read_ddb (dev_desc, ddesc)) {
fe8c2806c   wdenk   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   Benoît Thébaudeau   part_mac: dcache:...
51
52
  		if ((dev_desc->block_read(dev_desc->dev, i, 1, (ulong *)mpart) != 1) ||
  		    (mpart->signature != MAC_PARTITION_MAGIC) ) {
fe8c2806c   wdenk   Initial revision
53
54
55
  			return (-1);
  		}
  		/* update partition count */
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
56
  		n = mpart->map_count;
fe8c2806c   wdenk   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   Benoît Thébaudeau   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   wdenk   Initial revision
67
  	ldiv_t mb, gb;
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
68
  	if (part_mac_read_ddb (dev_desc, ddesc)) {
fe8c2806c   wdenk   Initial revision
69
70
71
  		/* error reading Driver Desriptor Block, or no valid Signature */
  		return;
  	}
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
72
  	n  = ddesc->blk_count;
fe8c2806c   wdenk   Initial revision
73

64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
74
  	mb = ldiv(n, ((1024 * 1024) / ddesc->blk_size)); /* MB */
fe8c2806c   wdenk   Initial revision
75
  	/* round to 1 digit */
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
76
  	mb.rem *= 10 * ddesc->blk_size;
fe8c2806c   wdenk   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   Benoît Thébaudeau   part_mac: dcache:...
94
95
  		ddesc->blk_size,
  		ddesc->blk_count,
fe8c2806c   wdenk   Initial revision
96
  		mb.quot, mb.rem, gb.quot, gb.rem,
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
97
  		ddesc->dev_type, ddesc->dev_id
fe8c2806c   wdenk   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   Benoît Thébaudeau   part_mac: dcache:...
106
  		if (dev_desc->block_read (dev_desc->dev, i, 1, (ulong *)mpart) != 1) {
fe8c2806c   wdenk   Initial revision
107
108
109
110
111
  			printf ("** Can't read Partition Map on %d:%ld **
  ",
  				dev_desc->dev, i);
  			return;
  		}
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
112
  		if (mpart->signature != MAC_PARTITION_MAGIC) {
fe8c2806c   wdenk   Initial revision
113
114
115
  			printf ("** Bad Signature on %d:%ld - "
  				"expected 0x%04x, got 0x%04x
  ",
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
116
  				dev_desc->dev, i, MAC_PARTITION_MAGIC, mpart->signature);
fe8c2806c   wdenk   Initial revision
117
118
119
120
  			return;
  		}
  
  		/* update partition count */
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
121
  		n = mpart->map_count;
fe8c2806c   wdenk   Initial revision
122
123
  
  		c      = 'k';
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
124
125
  		bytes  = mpart->block_count;
  		bytes /= (1024 / ddesc->blk_size);  /* kB; assumes blk_size == 512 */
fe8c2806c   wdenk   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   Benoît Thébaudeau   part_mac: dcache:...
137
138
139
140
  			mpart->type,
  			mpart->name,
  			mpart->block_count,
  			mpart->start_block,
fe8c2806c   wdenk   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   wdenk   * 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   wdenk   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   Benoît Thébaudeau   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   wdenk   Initial revision
222

64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
223
  	if (part_mac_read_ddb (dev_desc, ddesc)) {
fe8c2806c   wdenk   Initial revision
224
225
  		return (-1);
  	}
64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
226
  	info->blksz = ddesc->blk_size;
fe8c2806c   wdenk   Initial revision
227

64a08a9ff   Benoît Thébaudeau   part_mac: dcache:...
228
  	if (part_mac_read_pdb (dev_desc, part, mpart)) {
fe8c2806c   wdenk   Initial revision
229
230
  		return (-1);
  	}
64a08a9ff   Benoît Thébaudeau   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   wdenk   Initial revision
235
236
237
  
  	return (0);
  }
cde5c64d1   Jon Loeliger   disk/: Remove obs...
238
  #endif