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