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