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