xref: /OK3568_Linux_fs/external/rkupdate/gpt.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef _GPT_H
2*4882a593Smuzhiyun #define _GPT_H
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #define MSDOS_MBR_SIGNATURE 0xAA55
5*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI 0xEF
6*4882a593Smuzhiyun #define EFI_PMBR_OSTYPE_EFI_GPT 0xEE
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define GPT_HEADER_SIGNATURE 0x5452415020494645ULL
9*4882a593Smuzhiyun #define GPT_HEADER_REVISION_V1 0x00010000
10*4882a593Smuzhiyun #define GPT_PRIMARY_PARTITION_TABLE_LBA 1ULL
11*4882a593Smuzhiyun #define GPT_ENTRY_NAME "gpt"
12*4882a593Smuzhiyun #define GPT_ENTRY_NUMBERS       128
13*4882a593Smuzhiyun #define GPT_ENTRY_SIZE          128
14*4882a593Smuzhiyun #define PART_PROPERTY_BOOTABLE (1 << 2)
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define EFI_GUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
17*4882a593Smuzhiyun     ((efi_guid_t) \
18*4882a593Smuzhiyun     {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
19*4882a593Smuzhiyun             (b) & 0xff, ((b) >> 8) & 0xff, \
20*4882a593Smuzhiyun             (c) & 0xff, ((c) >> 8) & 0xff, \
21*4882a593Smuzhiyun             (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define PARTITION_IDBLOCK_GUID \
24*4882a593Smuzhiyun     EFI_GUID(0xDA2BB095, 0x390E, 0x48ca, \
25*4882a593Smuzhiyun              0x90, 0x47, 0x05, 0xE8, 0x18, 0xB2, 0x97, 0xCE)
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun typedef unsigned char u8;
28*4882a593Smuzhiyun typedef unsigned short u16;
29*4882a593Smuzhiyun typedef unsigned int  u32;
30*4882a593Smuzhiyun typedef unsigned long long u64;
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define uswap_16(x) \
33*4882a593Smuzhiyun     ((((x) & 0xff00) >> 8) | \
34*4882a593Smuzhiyun      (((x) & 0x00ff) << 8))
35*4882a593Smuzhiyun #define uswap_32(x) \
36*4882a593Smuzhiyun     ((((x) & 0xff000000) >> 24) | \
37*4882a593Smuzhiyun      (((x) & 0x00ff0000) >>  8) | \
38*4882a593Smuzhiyun      (((x) & 0x0000ff00) <<  8) | \
39*4882a593Smuzhiyun      (((x) & 0x000000ff) << 24))
40*4882a593Smuzhiyun #define _uswap_64(x, sfx) \
41*4882a593Smuzhiyun     ((((x) & 0xff00000000000000##sfx) >> 56) | \
42*4882a593Smuzhiyun      (((x) & 0x00ff000000000000##sfx) >> 40) | \
43*4882a593Smuzhiyun      (((x) & 0x0000ff0000000000##sfx) >> 24) | \
44*4882a593Smuzhiyun      (((x) & 0x000000ff00000000##sfx) >>  8) | \
45*4882a593Smuzhiyun      (((x) & 0x00000000ff000000##sfx) <<  8) | \
46*4882a593Smuzhiyun      (((x) & 0x0000000000ff0000##sfx) << 24) | \
47*4882a593Smuzhiyun      (((x) & 0x000000000000ff00##sfx) << 40) | \
48*4882a593Smuzhiyun      (((x) & 0x00000000000000ff##sfx) << 56))
49*4882a593Smuzhiyun #if defined(__GNUC__)
50*4882a593Smuzhiyun     #define uswap_64(x) _uswap_64(x, ull)
51*4882a593Smuzhiyun #else
52*4882a593Smuzhiyun     #define uswap_64(x) _uswap_64(x, )
53*4882a593Smuzhiyun #endif
54*4882a593Smuzhiyun #define __LITTLE_ENDIAN__ 1
55*4882a593Smuzhiyun #ifdef __LITTLE_ENDIAN__
56*4882a593Smuzhiyun     #define cpu_to_le16(x)      (x)
57*4882a593Smuzhiyun     #define cpu_to_le32(x)      (x)
58*4882a593Smuzhiyun     #define cpu_to_le64(x)      (x)
59*4882a593Smuzhiyun     #define le16_to_cpu(x)      (x)
60*4882a593Smuzhiyun     #define le32_to_cpu(x)      (x)
61*4882a593Smuzhiyun     #define le64_to_cpu(x)      (x)
62*4882a593Smuzhiyun     #define cpu_to_be16(x)      uswap_16(x)
63*4882a593Smuzhiyun     #define cpu_to_be32(x)      uswap_32(x)
64*4882a593Smuzhiyun     #define cpu_to_be64(x)      uswap_64(x)
65*4882a593Smuzhiyun     #define be16_to_cpu(x)      uswap_16(x)
66*4882a593Smuzhiyun     #define be32_to_cpu(x)      uswap_32(x)
67*4882a593Smuzhiyun     #define be64_to_cpu(x)      uswap_64(x)
68*4882a593Smuzhiyun #else
69*4882a593Smuzhiyun     #define cpu_to_le16(x)      uswap_16(x)
70*4882a593Smuzhiyun     #define cpu_to_le32(x)      uswap_32(x)
71*4882a593Smuzhiyun     #define cpu_to_le64(x)      uswap_64(x)
72*4882a593Smuzhiyun     #define le16_to_cpu(x)      uswap_16(x)
73*4882a593Smuzhiyun     #define le32_to_cpu(x)      uswap_32(x)
74*4882a593Smuzhiyun     #define le64_to_cpu(x)      uswap_64(x)
75*4882a593Smuzhiyun     #define cpu_to_be16(x)      (x)
76*4882a593Smuzhiyun     #define cpu_to_be32(x)      (x)
77*4882a593Smuzhiyun     #define cpu_to_be64(x)      (x)
78*4882a593Smuzhiyun     #define be16_to_cpu(x)      (x)
79*4882a593Smuzhiyun     #define be32_to_cpu(x)      (x)
80*4882a593Smuzhiyun     #define be64_to_cpu(x)      (x)
81*4882a593Smuzhiyun #endif
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun typedef union
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun     struct
87*4882a593Smuzhiyun     {
88*4882a593Smuzhiyun         unsigned int time_low;
89*4882a593Smuzhiyun         unsigned short time_mid;
90*4882a593Smuzhiyun         unsigned short time_hi_and_version;
91*4882a593Smuzhiyun         unsigned char clock_seq_hi_and_reserved;
92*4882a593Smuzhiyun         unsigned char clock_seq_low;
93*4882a593Smuzhiyun         unsigned char node[6];
94*4882a593Smuzhiyun     } uuid;
95*4882a593Smuzhiyun     u8 raw[16];
96*4882a593Smuzhiyun } efi_guid_t;
97*4882a593Smuzhiyun #pragma pack(1)
98*4882a593Smuzhiyun typedef struct
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun     u16 usTag;/*0xEEEE*/
101*4882a593Smuzhiyun     u16 usBackupGpt;/*0:no backup,1:has backup*/
102*4882a593Smuzhiyun     u16 usEntryCount;
103*4882a593Smuzhiyun     u64 entryDataSize[32];
104*4882a593Smuzhiyun } gpt_compact_info;
105*4882a593Smuzhiyun /* based on linux/include/genhd.h */
106*4882a593Smuzhiyun typedef struct
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun     u8 boot_ind;        /* 0x80 - active */
109*4882a593Smuzhiyun     u8 head;        /* starting head */
110*4882a593Smuzhiyun     u8 sector;      /* starting sector */
111*4882a593Smuzhiyun     u8 cyl;         /* starting cylinder */
112*4882a593Smuzhiyun     u8 sys_ind;     /* What partition type */
113*4882a593Smuzhiyun     u8 end_head;        /* end head */
114*4882a593Smuzhiyun     u8 end_sector;      /* end sector */
115*4882a593Smuzhiyun     u8 end_cyl;     /* end cylinder */
116*4882a593Smuzhiyun     u32 start_sect; /* starting sector counting from 0 */
117*4882a593Smuzhiyun     u32 nr_sects;   /* nr of sectors in partition */
118*4882a593Smuzhiyun } mbr_partition ;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* based on linux/fs/partitions/efi.h */
121*4882a593Smuzhiyun typedef struct _gpt_header
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun     u64 signature;
124*4882a593Smuzhiyun     u32 revision;
125*4882a593Smuzhiyun     u32 header_size;
126*4882a593Smuzhiyun     u32 header_crc32;
127*4882a593Smuzhiyun     u32 reserved1;
128*4882a593Smuzhiyun     u64 my_lba;
129*4882a593Smuzhiyun     u64 alternate_lba;
130*4882a593Smuzhiyun     u64 first_usable_lba;
131*4882a593Smuzhiyun     u64 last_usable_lba;
132*4882a593Smuzhiyun     efi_guid_t disk_guid;
133*4882a593Smuzhiyun     u64 partition_entry_lba;
134*4882a593Smuzhiyun     u32 num_partition_entries;
135*4882a593Smuzhiyun     u32 sizeof_partition_entry;
136*4882a593Smuzhiyun     u32 partition_entry_array_crc32;
137*4882a593Smuzhiyun } gpt_header;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun typedef union _gpt_entry_attributes
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun     struct
142*4882a593Smuzhiyun     {
143*4882a593Smuzhiyun         u64 required_to_function: 1;
144*4882a593Smuzhiyun         u64 no_block_io_protocol: 1;
145*4882a593Smuzhiyun         u64 legacy_bios_bootable: 1;
146*4882a593Smuzhiyun         u64 reserved: 45;
147*4882a593Smuzhiyun         u64 type_guid_specific: 16;
148*4882a593Smuzhiyun     } fields;
149*4882a593Smuzhiyun     unsigned long long raw;
150*4882a593Smuzhiyun } gpt_entry_attributes;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun #define PARTNAME_SZ 72
153*4882a593Smuzhiyun typedef struct _gpt_entry
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun     efi_guid_t partition_type_guid;
156*4882a593Smuzhiyun     efi_guid_t unique_partition_guid;
157*4882a593Smuzhiyun     u64 starting_lba;
158*4882a593Smuzhiyun     u64 ending_lba;
159*4882a593Smuzhiyun     gpt_entry_attributes attributes;
160*4882a593Smuzhiyun     u16 partition_name[PARTNAME_SZ / sizeof(u16)];
161*4882a593Smuzhiyun } gpt_entry;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun typedef struct _legacy_mbr
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun     u8 boot_code[440];
166*4882a593Smuzhiyun     u32 unique_mbr_signature;
167*4882a593Smuzhiyun     u16 unknown;
168*4882a593Smuzhiyun     mbr_partition partition_record[4];
169*4882a593Smuzhiyun     u16 signature;
170*4882a593Smuzhiyun } legacy_mbr;
171*4882a593Smuzhiyun #pragma pack()
172*4882a593Smuzhiyun #endif  /* _GPT_H */
173