1*a1596438SUma Shankar /* 2*a1596438SUma Shankar * (C) Copyright 2011 - 2012 Samsung Electronics 3*a1596438SUma Shankar * EXT4 filesystem implementation in Uboot by 4*a1596438SUma Shankar * Uma Shankar <uma.shankar@samsung.com> 5*a1596438SUma Shankar * Manjunatha C Achar <a.manjunatha@samsung.com> 6*a1596438SUma Shankar * 7*a1596438SUma Shankar * Data structures and headers for ext4 support have been taken from 8*a1596438SUma Shankar * ext2 ls load support in Uboot 9*a1596438SUma Shankar * 10*a1596438SUma Shankar * (C) Copyright 2004 11*a1596438SUma Shankar * esd gmbh <www.esd-electronics.com> 12*a1596438SUma Shankar * Reinhard Arlt <reinhard.arlt@esd-electronics.com> 13*a1596438SUma Shankar * 14*a1596438SUma Shankar * based on code from grub2 fs/ext2.c and fs/fshelp.c by 15*a1596438SUma Shankar * GRUB -- GRand Unified Bootloader 16*a1596438SUma Shankar * Copyright (C) 2003, 2004 Free Software Foundation, Inc. 17*a1596438SUma Shankar * 18*a1596438SUma Shankar * This program is free software; you can redistribute it and/or modify 19*a1596438SUma Shankar * it under the terms of the GNU General Public License as published by 20*a1596438SUma Shankar * the Free Software Foundation; either version 2 of the License, or 21*a1596438SUma Shankar * (at your option) any later version. 22*a1596438SUma Shankar * 23*a1596438SUma Shankar * This program is distributed in the hope that it will be useful, 24*a1596438SUma Shankar * but WITHOUT ANY WARRANTY; without even the implied warranty of 25*a1596438SUma Shankar * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 26*a1596438SUma Shankar * GNU General Public License for more details. 27*a1596438SUma Shankar * 28*a1596438SUma Shankar * You should have received a copy of the GNU General Public License 29*a1596438SUma Shankar * along with this program; if not, write to the Free Software 30*a1596438SUma Shankar * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 31*a1596438SUma Shankar */ 32*a1596438SUma Shankar 33*a1596438SUma Shankar #ifndef __EXT_COMMON__ 34*a1596438SUma Shankar #define __EXT_COMMON__ 35*a1596438SUma Shankar #include <command.h> 36*a1596438SUma Shankar #define SECTOR_SIZE 0x200 37*a1596438SUma Shankar #define SECTOR_BITS 9 38*a1596438SUma Shankar 39*a1596438SUma Shankar /* Magic value used to identify an ext2 filesystem. */ 40*a1596438SUma Shankar #define EXT2_MAGIC 0xEF53 41*a1596438SUma Shankar /* Amount of indirect blocks in an inode. */ 42*a1596438SUma Shankar #define INDIRECT_BLOCKS 12 43*a1596438SUma Shankar /* Maximum lenght of a pathname. */ 44*a1596438SUma Shankar #define EXT2_PATH_MAX 4096 45*a1596438SUma Shankar /* Maximum nesting of symlinks, used to prevent a loop. */ 46*a1596438SUma Shankar #define EXT2_MAX_SYMLINKCNT 8 47*a1596438SUma Shankar 48*a1596438SUma Shankar /* Filetype used in directory entry. */ 49*a1596438SUma Shankar #define FILETYPE_UNKNOWN 0 50*a1596438SUma Shankar #define FILETYPE_REG 1 51*a1596438SUma Shankar #define FILETYPE_DIRECTORY 2 52*a1596438SUma Shankar #define FILETYPE_SYMLINK 7 53*a1596438SUma Shankar 54*a1596438SUma Shankar /* Filetype information as used in inodes. */ 55*a1596438SUma Shankar #define FILETYPE_INO_MASK 0170000 56*a1596438SUma Shankar #define FILETYPE_INO_REG 0100000 57*a1596438SUma Shankar #define FILETYPE_INO_DIRECTORY 0040000 58*a1596438SUma Shankar #define FILETYPE_INO_SYMLINK 0120000 59*a1596438SUma Shankar #define EXT2_ROOT_INO 2 /* Root inode */ 60*a1596438SUma Shankar 61*a1596438SUma Shankar /* Bits used as offset in sector */ 62*a1596438SUma Shankar #define DISK_SECTOR_BITS 9 63*a1596438SUma Shankar /* The size of an ext2 block in bytes. */ 64*a1596438SUma Shankar #define EXT2_BLOCK_SIZE(data) (1 << LOG2_BLOCK_SIZE(data)) 65*a1596438SUma Shankar 66*a1596438SUma Shankar /* Log2 size of ext2 block in 512 blocks. */ 67*a1596438SUma Shankar #define LOG2_EXT2_BLOCK_SIZE(data) (__le32_to_cpu \ 68*a1596438SUma Shankar (data->sblock.log2_block_size) + 1) 69*a1596438SUma Shankar 70*a1596438SUma Shankar /* Log2 size of ext2 block in bytes. */ 71*a1596438SUma Shankar #define LOG2_BLOCK_SIZE(data) (__le32_to_cpu \ 72*a1596438SUma Shankar (data->sblock.log2_block_size) + 10) 73*a1596438SUma Shankar #define INODE_SIZE_FILESYSTEM(data) (__le32_to_cpu \ 74*a1596438SUma Shankar (data->sblock.inode_size)) 75*a1596438SUma Shankar 76*a1596438SUma Shankar #define EXT2_FT_DIR 2 77*a1596438SUma Shankar #define SUCCESS 1 78*a1596438SUma Shankar 79*a1596438SUma Shankar /* Macro-instructions used to manage several block sizes */ 80*a1596438SUma Shankar #define EXT2_MIN_BLOCK_LOG_SIZE 10 /* 1024 */ 81*a1596438SUma Shankar #define EXT2_MAX_BLOCK_LOG_SIZE 16 /* 65536 */ 82*a1596438SUma Shankar #define EXT2_MIN_BLOCK_SIZE (1 << EXT2_MIN_BLOCK_LOG_SIZE) 83*a1596438SUma Shankar #define EXT2_MAX_BLOCK_SIZE (1 << EXT2_MAX_BLOCK_LOG_SIZE) 84*a1596438SUma Shankar 85*a1596438SUma Shankar /* The ext2 superblock. */ 86*a1596438SUma Shankar struct ext2_sblock { 87*a1596438SUma Shankar uint32_t total_inodes; 88*a1596438SUma Shankar uint32_t total_blocks; 89*a1596438SUma Shankar uint32_t reserved_blocks; 90*a1596438SUma Shankar uint32_t free_blocks; 91*a1596438SUma Shankar uint32_t free_inodes; 92*a1596438SUma Shankar uint32_t first_data_block; 93*a1596438SUma Shankar uint32_t log2_block_size; 94*a1596438SUma Shankar uint32_t log2_fragment_size; 95*a1596438SUma Shankar uint32_t blocks_per_group; 96*a1596438SUma Shankar uint32_t fragments_per_group; 97*a1596438SUma Shankar uint32_t inodes_per_group; 98*a1596438SUma Shankar uint32_t mtime; 99*a1596438SUma Shankar uint32_t utime; 100*a1596438SUma Shankar uint16_t mnt_count; 101*a1596438SUma Shankar uint16_t max_mnt_count; 102*a1596438SUma Shankar uint16_t magic; 103*a1596438SUma Shankar uint16_t fs_state; 104*a1596438SUma Shankar uint16_t error_handling; 105*a1596438SUma Shankar uint16_t minor_revision_level; 106*a1596438SUma Shankar uint32_t lastcheck; 107*a1596438SUma Shankar uint32_t checkinterval; 108*a1596438SUma Shankar uint32_t creator_os; 109*a1596438SUma Shankar uint32_t revision_level; 110*a1596438SUma Shankar uint16_t uid_reserved; 111*a1596438SUma Shankar uint16_t gid_reserved; 112*a1596438SUma Shankar uint32_t first_inode; 113*a1596438SUma Shankar uint16_t inode_size; 114*a1596438SUma Shankar uint16_t block_group_number; 115*a1596438SUma Shankar uint32_t feature_compatibility; 116*a1596438SUma Shankar uint32_t feature_incompat; 117*a1596438SUma Shankar uint32_t feature_ro_compat; 118*a1596438SUma Shankar uint32_t unique_id[4]; 119*a1596438SUma Shankar char volume_name[16]; 120*a1596438SUma Shankar char last_mounted_on[64]; 121*a1596438SUma Shankar uint32_t compression_info; 122*a1596438SUma Shankar }; 123*a1596438SUma Shankar 124*a1596438SUma Shankar struct ext2_block_group { 125*a1596438SUma Shankar __u32 block_id; /* Blocks bitmap block */ 126*a1596438SUma Shankar __u32 inode_id; /* Inodes bitmap block */ 127*a1596438SUma Shankar __u32 inode_table_id; /* Inodes table block */ 128*a1596438SUma Shankar __u16 free_blocks; /* Free blocks count */ 129*a1596438SUma Shankar __u16 free_inodes; /* Free inodes count */ 130*a1596438SUma Shankar __u16 used_dir_cnt; /* Directories count */ 131*a1596438SUma Shankar __u16 bg_flags; 132*a1596438SUma Shankar __u32 bg_reserved[2]; 133*a1596438SUma Shankar __u16 bg_itable_unused; /* Unused inodes count */ 134*a1596438SUma Shankar __u16 bg_checksum; /* crc16(s_uuid+grouo_num+group_desc)*/ 135*a1596438SUma Shankar }; 136*a1596438SUma Shankar 137*a1596438SUma Shankar /* The ext2 inode. */ 138*a1596438SUma Shankar struct ext2_inode { 139*a1596438SUma Shankar uint16_t mode; 140*a1596438SUma Shankar uint16_t uid; 141*a1596438SUma Shankar uint32_t size; 142*a1596438SUma Shankar uint32_t atime; 143*a1596438SUma Shankar uint32_t ctime; 144*a1596438SUma Shankar uint32_t mtime; 145*a1596438SUma Shankar uint32_t dtime; 146*a1596438SUma Shankar uint16_t gid; 147*a1596438SUma Shankar uint16_t nlinks; 148*a1596438SUma Shankar uint32_t blockcnt; /* Blocks of 512 bytes!! */ 149*a1596438SUma Shankar uint32_t flags; 150*a1596438SUma Shankar uint32_t osd1; 151*a1596438SUma Shankar union { 152*a1596438SUma Shankar struct datablocks { 153*a1596438SUma Shankar uint32_t dir_blocks[INDIRECT_BLOCKS]; 154*a1596438SUma Shankar uint32_t indir_block; 155*a1596438SUma Shankar uint32_t double_indir_block; 156*a1596438SUma Shankar uint32_t triple_indir_block; 157*a1596438SUma Shankar } blocks; 158*a1596438SUma Shankar char symlink[60]; 159*a1596438SUma Shankar } b; 160*a1596438SUma Shankar uint32_t version; 161*a1596438SUma Shankar uint32_t acl; 162*a1596438SUma Shankar uint32_t dir_acl; 163*a1596438SUma Shankar uint32_t fragment_addr; 164*a1596438SUma Shankar uint32_t osd2[3]; 165*a1596438SUma Shankar }; 166*a1596438SUma Shankar 167*a1596438SUma Shankar /* The header of an ext2 directory entry. */ 168*a1596438SUma Shankar struct ext2_dirent { 169*a1596438SUma Shankar uint32_t inode; 170*a1596438SUma Shankar uint16_t direntlen; 171*a1596438SUma Shankar uint8_t namelen; 172*a1596438SUma Shankar uint8_t filetype; 173*a1596438SUma Shankar }; 174*a1596438SUma Shankar 175*a1596438SUma Shankar struct ext2fs_node { 176*a1596438SUma Shankar struct ext2_data *data; 177*a1596438SUma Shankar struct ext2_inode inode; 178*a1596438SUma Shankar int ino; 179*a1596438SUma Shankar int inode_read; 180*a1596438SUma Shankar }; 181*a1596438SUma Shankar 182*a1596438SUma Shankar /* Information about a "mounted" ext2 filesystem. */ 183*a1596438SUma Shankar struct ext2_data { 184*a1596438SUma Shankar struct ext2_sblock sblock; 185*a1596438SUma Shankar struct ext2_inode *inode; 186*a1596438SUma Shankar struct ext2fs_node diropen; 187*a1596438SUma Shankar }; 188*a1596438SUma Shankar 189*a1596438SUma Shankar int do_ext2ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); 190*a1596438SUma Shankar int do_ext2load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); 191*a1596438SUma Shankar int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc, 192*a1596438SUma Shankar char *const argv[]); 193*a1596438SUma Shankar int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]); 194*a1596438SUma Shankar int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc, 195*a1596438SUma Shankar char *const argv[]); 196*a1596438SUma Shankar int do_ext_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]); 197*a1596438SUma Shankar #endif 198