xref: /OK3568_Linux_fs/kernel/fs/exfat/exfat_raw.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef _EXFAT_RAW_H
7*4882a593Smuzhiyun #define _EXFAT_RAW_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define BOOT_SIGNATURE		0xAA55
12*4882a593Smuzhiyun #define EXBOOT_SIGNATURE	0xAA550000
13*4882a593Smuzhiyun #define STR_EXFAT		"EXFAT   "	/* size should be 8 */
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define EXFAT_MAX_FILE_LEN	255
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define VOLUME_DIRTY		0x0002
18*4882a593Smuzhiyun #define MEDIA_FAILURE		0x0004
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define EXFAT_EOF_CLUSTER	0xFFFFFFFFu
21*4882a593Smuzhiyun #define EXFAT_BAD_CLUSTER	0xFFFFFFF7u
22*4882a593Smuzhiyun #define EXFAT_FREE_CLUSTER	0
23*4882a593Smuzhiyun /* Cluster 0, 1 are reserved, the first cluster is 2 in the cluster heap. */
24*4882a593Smuzhiyun #define EXFAT_RESERVED_CLUSTERS	2
25*4882a593Smuzhiyun #define EXFAT_FIRST_CLUSTER	2
26*4882a593Smuzhiyun #define EXFAT_DATA_CLUSTER_COUNT(sbi)	\
27*4882a593Smuzhiyun 	((sbi)->num_clusters - EXFAT_RESERVED_CLUSTERS)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /* AllocationPossible and NoFatChain field in GeneralSecondaryFlags Field */
30*4882a593Smuzhiyun #define ALLOC_FAT_CHAIN		0x01
31*4882a593Smuzhiyun #define ALLOC_NO_FAT_CHAIN	0x03
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define DENTRY_SIZE		32 /* directory entry size */
34*4882a593Smuzhiyun #define DENTRY_SIZE_BITS	5
35*4882a593Smuzhiyun /* exFAT allows 8388608(256MB) directory entries */
36*4882a593Smuzhiyun #define MAX_EXFAT_DENTRIES	8388608
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* dentry types */
39*4882a593Smuzhiyun #define EXFAT_UNUSED		0x00	/* end of directory */
40*4882a593Smuzhiyun #define EXFAT_DELETE		(~0x80)
41*4882a593Smuzhiyun #define IS_EXFAT_DELETED(x)	((x) < 0x80) /* deleted file (0x01~0x7F) */
42*4882a593Smuzhiyun #define EXFAT_INVAL		0x80	/* invalid value */
43*4882a593Smuzhiyun #define EXFAT_BITMAP		0x81	/* allocation bitmap */
44*4882a593Smuzhiyun #define EXFAT_UPCASE		0x82	/* upcase table */
45*4882a593Smuzhiyun #define EXFAT_VOLUME		0x83	/* volume label */
46*4882a593Smuzhiyun #define EXFAT_FILE		0x85	/* file or dir */
47*4882a593Smuzhiyun #define EXFAT_GUID		0xA0
48*4882a593Smuzhiyun #define EXFAT_PADDING		0xA1
49*4882a593Smuzhiyun #define EXFAT_ACLTAB		0xA2
50*4882a593Smuzhiyun #define EXFAT_STREAM		0xC0	/* stream entry */
51*4882a593Smuzhiyun #define EXFAT_NAME		0xC1	/* file name entry */
52*4882a593Smuzhiyun #define EXFAT_ACL		0xC2	/* stream entry */
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define IS_EXFAT_CRITICAL_PRI(x)	(x < 0xA0)
55*4882a593Smuzhiyun #define IS_EXFAT_BENIGN_PRI(x)		(x < 0xC0)
56*4882a593Smuzhiyun #define IS_EXFAT_CRITICAL_SEC(x)	(x < 0xE0)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* checksum types */
59*4882a593Smuzhiyun #define CS_DIR_ENTRY		0
60*4882a593Smuzhiyun #define CS_BOOT_SECTOR		1
61*4882a593Smuzhiyun #define CS_DEFAULT		2
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* file attributes */
64*4882a593Smuzhiyun #define ATTR_READONLY		0x0001
65*4882a593Smuzhiyun #define ATTR_HIDDEN		0x0002
66*4882a593Smuzhiyun #define ATTR_SYSTEM		0x0004
67*4882a593Smuzhiyun #define ATTR_VOLUME		0x0008
68*4882a593Smuzhiyun #define ATTR_SUBDIR		0x0010
69*4882a593Smuzhiyun #define ATTR_ARCHIVE		0x0020
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define ATTR_RWMASK		(ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME | \
72*4882a593Smuzhiyun 				 ATTR_SUBDIR | ATTR_ARCHIVE)
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define BOOTSEC_JUMP_BOOT_LEN		3
75*4882a593Smuzhiyun #define BOOTSEC_FS_NAME_LEN		8
76*4882a593Smuzhiyun #define BOOTSEC_OLDBPB_LEN		53
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun #define EXFAT_FILE_NAME_LEN		15
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun #define EXFAT_MIN_SECT_SIZE_BITS		9
81*4882a593Smuzhiyun #define EXFAT_MAX_SECT_SIZE_BITS		12
82*4882a593Smuzhiyun #define EXFAT_MAX_SECT_PER_CLUS_BITS(x)		(25 - (x)->sect_size_bits)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* EXFAT: Main and Backup Boot Sector (512 bytes) */
85*4882a593Smuzhiyun struct boot_sector {
86*4882a593Smuzhiyun 	__u8	jmp_boot[BOOTSEC_JUMP_BOOT_LEN];
87*4882a593Smuzhiyun 	__u8	fs_name[BOOTSEC_FS_NAME_LEN];
88*4882a593Smuzhiyun 	__u8	must_be_zero[BOOTSEC_OLDBPB_LEN];
89*4882a593Smuzhiyun 	__le64	partition_offset;
90*4882a593Smuzhiyun 	__le64	vol_length;
91*4882a593Smuzhiyun 	__le32	fat_offset;
92*4882a593Smuzhiyun 	__le32	fat_length;
93*4882a593Smuzhiyun 	__le32	clu_offset;
94*4882a593Smuzhiyun 	__le32	clu_count;
95*4882a593Smuzhiyun 	__le32	root_cluster;
96*4882a593Smuzhiyun 	__le32	vol_serial;
97*4882a593Smuzhiyun 	__u8	fs_revision[2];
98*4882a593Smuzhiyun 	__le16	vol_flags;
99*4882a593Smuzhiyun 	__u8	sect_size_bits;
100*4882a593Smuzhiyun 	__u8	sect_per_clus_bits;
101*4882a593Smuzhiyun 	__u8	num_fats;
102*4882a593Smuzhiyun 	__u8	drv_sel;
103*4882a593Smuzhiyun 	__u8	percent_in_use;
104*4882a593Smuzhiyun 	__u8	reserved[7];
105*4882a593Smuzhiyun 	__u8	boot_code[390];
106*4882a593Smuzhiyun 	__le16	signature;
107*4882a593Smuzhiyun } __packed;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun struct exfat_dentry {
110*4882a593Smuzhiyun 	__u8 type;
111*4882a593Smuzhiyun 	union {
112*4882a593Smuzhiyun 		struct {
113*4882a593Smuzhiyun 			__u8 num_ext;
114*4882a593Smuzhiyun 			__le16 checksum;
115*4882a593Smuzhiyun 			__le16 attr;
116*4882a593Smuzhiyun 			__le16 reserved1;
117*4882a593Smuzhiyun 			__le16 create_time;
118*4882a593Smuzhiyun 			__le16 create_date;
119*4882a593Smuzhiyun 			__le16 modify_time;
120*4882a593Smuzhiyun 			__le16 modify_date;
121*4882a593Smuzhiyun 			__le16 access_time;
122*4882a593Smuzhiyun 			__le16 access_date;
123*4882a593Smuzhiyun 			__u8 create_time_cs;
124*4882a593Smuzhiyun 			__u8 modify_time_cs;
125*4882a593Smuzhiyun 			__u8 create_tz;
126*4882a593Smuzhiyun 			__u8 modify_tz;
127*4882a593Smuzhiyun 			__u8 access_tz;
128*4882a593Smuzhiyun 			__u8 reserved2[7];
129*4882a593Smuzhiyun 		} __packed file; /* file directory entry */
130*4882a593Smuzhiyun 		struct {
131*4882a593Smuzhiyun 			__u8 flags;
132*4882a593Smuzhiyun 			__u8 reserved1;
133*4882a593Smuzhiyun 			__u8 name_len;
134*4882a593Smuzhiyun 			__le16 name_hash;
135*4882a593Smuzhiyun 			__le16 reserved2;
136*4882a593Smuzhiyun 			__le64 valid_size;
137*4882a593Smuzhiyun 			__le32 reserved3;
138*4882a593Smuzhiyun 			__le32 start_clu;
139*4882a593Smuzhiyun 			__le64 size;
140*4882a593Smuzhiyun 		} __packed stream; /* stream extension directory entry */
141*4882a593Smuzhiyun 		struct {
142*4882a593Smuzhiyun 			__u8 flags;
143*4882a593Smuzhiyun 			__le16 unicode_0_14[EXFAT_FILE_NAME_LEN];
144*4882a593Smuzhiyun 		} __packed name; /* file name directory entry */
145*4882a593Smuzhiyun 		struct {
146*4882a593Smuzhiyun 			__u8 flags;
147*4882a593Smuzhiyun 			__u8 reserved[18];
148*4882a593Smuzhiyun 			__le32 start_clu;
149*4882a593Smuzhiyun 			__le64 size;
150*4882a593Smuzhiyun 		} __packed bitmap; /* allocation bitmap directory entry */
151*4882a593Smuzhiyun 		struct {
152*4882a593Smuzhiyun 			__u8 reserved1[3];
153*4882a593Smuzhiyun 			__le32 checksum;
154*4882a593Smuzhiyun 			__u8 reserved2[12];
155*4882a593Smuzhiyun 			__le32 start_clu;
156*4882a593Smuzhiyun 			__le64 size;
157*4882a593Smuzhiyun 		} __packed upcase; /* up-case table directory entry */
158*4882a593Smuzhiyun 	} __packed dentry;
159*4882a593Smuzhiyun } __packed;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define EXFAT_TZ_VALID		(1 << 7)
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /* Jan 1 GMT 00:00:00 1980 */
164*4882a593Smuzhiyun #define EXFAT_MIN_TIMESTAMP_SECS    315532800LL
165*4882a593Smuzhiyun /* Dec 31 GMT 23:59:59 2107 */
166*4882a593Smuzhiyun #define EXFAT_MAX_TIMESTAMP_SECS    4354819199LL
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #endif /* !_EXFAT_RAW_H */
169