xref: /haiku/src/add-ons/kernel/partitioning_systems/amiga/amiga_rdb.h (revision 91b482987276c2d880d320a3bbc1087291735253)
1*91b48298SAxel Dörfler /*
2*91b48298SAxel Dörfler ** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3*91b48298SAxel Dörfler ** Distributed under the terms of the OpenBeOS License.
4*91b48298SAxel Dörfler */
5*91b48298SAxel Dörfler #ifndef AMIGA_RDB_H
6*91b48298SAxel Dörfler #define AMIGA_RDB_H
7*91b48298SAxel Dörfler 
8*91b48298SAxel Dörfler 
9*91b48298SAxel Dörfler #include "SupportDefs.h"
10*91b48298SAxel Dörfler #include "ByteOrder.h"
11*91b48298SAxel Dörfler 
12*91b48298SAxel Dörfler 
13*91b48298SAxel Dörfler struct rigid_disk_block {
14*91b48298SAxel Dörfler 	uint32	id;
15*91b48298SAxel Dörfler 	uint32	summed_longs;
16*91b48298SAxel Dörfler 	int32	check_sum;
17*91b48298SAxel Dörfler 	uint32	host_id;
18*91b48298SAxel Dörfler 	uint32	block_size;
19*91b48298SAxel Dörfler 	uint32	flags;
20*91b48298SAxel Dörfler 
21*91b48298SAxel Dörfler 	/* block list heads */
22*91b48298SAxel Dörfler 
23*91b48298SAxel Dörfler 	uint32	bad_block_list;
24*91b48298SAxel Dörfler 	uint32	partition_list;
25*91b48298SAxel Dörfler 	uint32	fs_header_list;
26*91b48298SAxel Dörfler 	uint32	drive_init;
27*91b48298SAxel Dörfler 
28*91b48298SAxel Dörfler 	uint32	__reserved1[6];
29*91b48298SAxel Dörfler 
30*91b48298SAxel Dörfler 	/* physical drive characteristics */
31*91b48298SAxel Dörfler 
32*91b48298SAxel Dörfler 	uint32	cylinders;
33*91b48298SAxel Dörfler 	uint32	sectors;
34*91b48298SAxel Dörfler 	uint32	heads;
35*91b48298SAxel Dörfler 	uint32	interleave;
36*91b48298SAxel Dörfler 	uint32	park;
37*91b48298SAxel Dörfler 	uint32	__reserved2[3];
38*91b48298SAxel Dörfler 	uint32	write_precompensation;
39*91b48298SAxel Dörfler 	uint32	reduced_write;
40*91b48298SAxel Dörfler 	uint32	step_rate;
41*91b48298SAxel Dörfler 	uint32	__reserved3[5];
42*91b48298SAxel Dörfler 
43*91b48298SAxel Dörfler 	/* logical drive characteristics */
44*91b48298SAxel Dörfler 
45*91b48298SAxel Dörfler 	uint32	rdb_blocks_low;
46*91b48298SAxel Dörfler 	uint32	rdb_blocks_high;
47*91b48298SAxel Dörfler 	uint32	low_cylinder;
48*91b48298SAxel Dörfler 	uint32	high_cylinder;
49*91b48298SAxel Dörfler 	uint32	cylinder_blocks;
50*91b48298SAxel Dörfler 	uint32	auto_park_seconds;
51*91b48298SAxel Dörfler 
52*91b48298SAxel Dörfler 	uint32	__reserved4[2];
53*91b48298SAxel Dörfler 
54*91b48298SAxel Dörfler 	/* drive identification */
55*91b48298SAxel Dörfler 
56*91b48298SAxel Dörfler 	char	disk_vendor[8];
57*91b48298SAxel Dörfler 	char	disk_product[16];
58*91b48298SAxel Dörfler 	char	disk_revision[4];
59*91b48298SAxel Dörfler 	char	controller_vendor[8];
60*91b48298SAxel Dörfler 	char	controller_product[16];
61*91b48298SAxel Dörfler 	char	controller_revision[4];
62*91b48298SAxel Dörfler 
63*91b48298SAxel Dörfler 	uint32	__reserved5[10];
64*91b48298SAxel Dörfler };
65*91b48298SAxel Dörfler 
66*91b48298SAxel Dörfler #define RDB_DISK_ID			'RDSK'
67*91b48298SAxel Dörfler 
68*91b48298SAxel Dörfler #define RDB_LOCATION_LIMIT	16
69*91b48298SAxel Dörfler 
70*91b48298SAxel Dörfler enum rdb_flags {
71*91b48298SAxel Dörfler 	RDB_LAST				= 0x01,
72*91b48298SAxel Dörfler 	RDB_LAST_LUN			= 0x02,
73*91b48298SAxel Dörfler 	RDB_LAST_TID			= 0x04,
74*91b48298SAxel Dörfler 	RDB_NO_RESELECT			= 0x08,
75*91b48298SAxel Dörfler 	RDB_HAS_DISK_ID			= 0x10,
76*91b48298SAxel Dörfler 	RDB_HAS_CONTROLLER_ID	= 0x20,
77*91b48298SAxel Dörfler 	RDB_SUPPORTS_SYNCHRONOUS = 0x40,
78*91b48298SAxel Dörfler };
79*91b48298SAxel Dörfler 
80*91b48298SAxel Dörfler 
81*91b48298SAxel Dörfler /************* bad blocks *************/
82*91b48298SAxel Dörfler 
83*91b48298SAxel Dörfler struct bad_block_entry {
84*91b48298SAxel Dörfler };
85*91b48298SAxel Dörfler 
86*91b48298SAxel Dörfler struct bad_block_block {
87*91b48298SAxel Dörfler };
88*91b48298SAxel Dörfler 
89*91b48298SAxel Dörfler #define RDB_BAD_BLOCK_ID	'BADB'
90*91b48298SAxel Dörfler 
91*91b48298SAxel Dörfler 
92*91b48298SAxel Dörfler /************* partition block *************/
93*91b48298SAxel Dörfler 
94*91b48298SAxel Dörfler struct partition_block {
95*91b48298SAxel Dörfler 		uint32	id;
96*91b48298SAxel Dörfler 		uint32	summed_longs;
97*91b48298SAxel Dörfler 		int32	check_sum;
98*91b48298SAxel Dörfler 		uint32	host_id;
99*91b48298SAxel Dörfler 		uint32	next;
100*91b48298SAxel Dörfler 		uint32	flags;
101*91b48298SAxel Dörfler 		uint32	__reserved1[2];
102*91b48298SAxel Dörfler 		uint32	open_device_flags;
103*91b48298SAxel Dörfler 		uint8	drive_name[32];		// BSTR form (Pascal like string)
104*91b48298SAxel Dörfler 
105*91b48298SAxel Dörfler 		uint32	__reserved2[15];
106*91b48298SAxel Dörfler 		uint32	environment[17];
107*91b48298SAxel Dörfler 		uint32	__reserved3[15];
108*91b48298SAxel Dörfler };
109*91b48298SAxel Dörfler 
110*91b48298SAxel Dörfler #define RDB_PARTITION_ID	'PART'
111*91b48298SAxel Dörfler 
112*91b48298SAxel Dörfler enum rdb_partition_flags {
113*91b48298SAxel Dörfler 		RDB_PARTITION_BOOTABLE	= 0x01,
114*91b48298SAxel Dörfler 		RDB_PARTITION_NO_MOUNT	= 0x02,
115*91b48298SAxel Dörfler };
116*91b48298SAxel Dörfler 
117*91b48298SAxel Dörfler 
118*91b48298SAxel Dörfler /************* disk environment *************/
119*91b48298SAxel Dörfler 
120*91b48298SAxel Dörfler struct disk_environment {
121*91b48298SAxel Dörfler 	uint32	table_size;			// size of this environment
122*91b48298SAxel Dörfler 	uint32	long_block_size;	// block size in longs (128 == 512 byte)
123*91b48298SAxel Dörfler 	uint32	sec_org;			// always 0
124*91b48298SAxel Dörfler 	uint32	surfaces;
125*91b48298SAxel Dörfler 	uint32	sectors_per_block;
126*91b48298SAxel Dörfler 	uint32	blocks_per_track;
127*91b48298SAxel Dörfler 	uint32	reserved_blocks_at_start;
128*91b48298SAxel Dörfler 	uint32	reserved_blocks_at_end;
129*91b48298SAxel Dörfler 	uint32	interleave;
130*91b48298SAxel Dörfler 	uint32	first_cylinder;
131*91b48298SAxel Dörfler 	uint32	last_cylinder;
132*91b48298SAxel Dörfler 	uint32	num_buffers;
133*91b48298SAxel Dörfler 	uint32	buffer_mem_type;
134*91b48298SAxel Dörfler 	uint32	max_transfer;
135*91b48298SAxel Dörfler 	uint32	dma_mask;
136*91b48298SAxel Dörfler 	int32	boot_priority;
137*91b48298SAxel Dörfler 	uint32	dos_type;
138*91b48298SAxel Dörfler 	uint32	baud_rate;
139*91b48298SAxel Dörfler 	uint32	control;
140*91b48298SAxel Dörfler 	uint32	boot_blocks;
141*91b48298SAxel Dörfler 
142*91b48298SAxel Dörfler 	uint32 FirstCylinder() { return B_BENDIAN_TO_HOST_INT32(first_cylinder); }
143*91b48298SAxel Dörfler 	uint32 LastCylinder() { return B_BENDIAN_TO_HOST_INT32(last_cylinder); }
144*91b48298SAxel Dörfler 	uint32 Surfaces() { return B_BENDIAN_TO_HOST_INT32(surfaces); }
145*91b48298SAxel Dörfler 	uint32 BlocksPerTrack() { return B_BENDIAN_TO_HOST_INT32(blocks_per_track); }
146*91b48298SAxel Dörfler 	uint32 LongBlockSize() { return B_BENDIAN_TO_HOST_INT32(long_block_size); }
147*91b48298SAxel Dörfler 
148*91b48298SAxel Dörfler 	uint64 Start()
149*91b48298SAxel Dörfler 	{
150*91b48298SAxel Dörfler 		return uint64(FirstCylinder()) * BlocksPerTrack() * Surfaces()
151*91b48298SAxel Dörfler 			* LongBlockSize() * sizeof(long);
152*91b48298SAxel Dörfler 	}
153*91b48298SAxel Dörfler 
154*91b48298SAxel Dörfler 	uint64 Size()
155*91b48298SAxel Dörfler 	{
156*91b48298SAxel Dörfler 		return uint64(LastCylinder() + 1 - FirstCylinder()) * BlocksPerTrack() * Surfaces()
157*91b48298SAxel Dörfler 			* LongBlockSize() * sizeof(long);
158*91b48298SAxel Dörfler 	}
159*91b48298SAxel Dörfler };
160*91b48298SAxel Dörfler 
161*91b48298SAxel Dörfler 
162*91b48298SAxel Dörfler /************* file system header block *************/
163*91b48298SAxel Dörfler 
164*91b48298SAxel Dörfler struct fs_header_block {
165*91b48298SAxel Dörfler };
166*91b48298SAxel Dörfler 
167*91b48298SAxel Dörfler #define RDB_FS_HEADER_ID	'FSHD'
168*91b48298SAxel Dörfler 
169*91b48298SAxel Dörfler struct load_seg_block {
170*91b48298SAxel Dörfler };
171*91b48298SAxel Dörfler 
172*91b48298SAxel Dörfler #define RDB_LOAD_SEG_ID		'LSEG'
173*91b48298SAxel Dörfler 
174*91b48298SAxel Dörfler #endif	/* AMIGA_RDB_H */
175*91b48298SAxel Dörfler 
176