xref: /rk3399_rockchip-uboot/include/ext_common.h (revision a1596438a68921d2c9b1fdec70a720d38c85ca7d)
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