xref: /rk3399_rockchip-uboot/include/ext_common.h (revision 04735e9c5578dd4f3584be5454b9779e8e5c2af9)
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 
38a1596438SUma Shankar /* Magic value used to identify an ext2 filesystem.  */
39a1596438SUma Shankar #define	EXT2_MAGIC			0xEF53
40a1596438SUma Shankar /* Amount of indirect blocks in an inode.  */
41a1596438SUma Shankar #define INDIRECT_BLOCKS			12
42a1596438SUma Shankar /* Maximum lenght of a pathname.  */
43a1596438SUma Shankar #define EXT2_PATH_MAX				4096
44a1596438SUma Shankar /* Maximum nesting of symlinks, used to prevent a loop.  */
45a1596438SUma Shankar #define	EXT2_MAX_SYMLINKCNT		8
46a1596438SUma Shankar 
47a1596438SUma Shankar /* Filetype used in directory entry.  */
48a1596438SUma Shankar #define	FILETYPE_UNKNOWN		0
49a1596438SUma Shankar #define	FILETYPE_REG			1
50a1596438SUma Shankar #define	FILETYPE_DIRECTORY		2
51a1596438SUma Shankar #define	FILETYPE_SYMLINK		7
52a1596438SUma Shankar 
53a1596438SUma Shankar /* Filetype information as used in inodes.  */
54a1596438SUma Shankar #define FILETYPE_INO_MASK		0170000
55a1596438SUma Shankar #define FILETYPE_INO_REG		0100000
56a1596438SUma Shankar #define FILETYPE_INO_DIRECTORY		0040000
57a1596438SUma Shankar #define FILETYPE_INO_SYMLINK		0120000
58a1596438SUma Shankar #define EXT2_ROOT_INO			2 /* Root inode */
59a1596438SUma Shankar 
60a1596438SUma Shankar /* The size of an ext2 block in bytes.  */
61a1596438SUma Shankar #define EXT2_BLOCK_SIZE(data)	   (1 << LOG2_BLOCK_SIZE(data))
62a1596438SUma Shankar 
63a1596438SUma Shankar /* Log2 size of ext2 block in bytes.  */
64a1596438SUma Shankar #define LOG2_BLOCK_SIZE(data)	   (__le32_to_cpu		   \
6550ce4c07SEgbert Eich 				    (data->sblock.log2_block_size) \
6650ce4c07SEgbert Eich 				    + EXT2_MIN_BLOCK_LOG_SIZE)
67a1596438SUma Shankar #define INODE_SIZE_FILESYSTEM(data)	(__le32_to_cpu \
68a1596438SUma Shankar 			(data->sblock.inode_size))
69a1596438SUma Shankar 
70a1596438SUma Shankar #define EXT2_FT_DIR	2
71a1596438SUma Shankar #define SUCCESS	1
72a1596438SUma Shankar 
73a1596438SUma Shankar /* Macro-instructions used to manage several block sizes  */
74a1596438SUma Shankar #define EXT2_MIN_BLOCK_LOG_SIZE	10 /* 1024 */
75a1596438SUma Shankar #define EXT2_MAX_BLOCK_LOG_SIZE	16 /* 65536 */
76a1596438SUma Shankar #define EXT2_MIN_BLOCK_SIZE		(1 << EXT2_MIN_BLOCK_LOG_SIZE)
77a1596438SUma Shankar #define EXT2_MAX_BLOCK_SIZE		(1 << EXT2_MAX_BLOCK_LOG_SIZE)
78a1596438SUma Shankar 
79a1596438SUma Shankar /* The ext2 superblock.  */
80a1596438SUma Shankar struct ext2_sblock {
81a1596438SUma Shankar 	uint32_t total_inodes;
82a1596438SUma Shankar 	uint32_t total_blocks;
83a1596438SUma Shankar 	uint32_t reserved_blocks;
84a1596438SUma Shankar 	uint32_t free_blocks;
85a1596438SUma Shankar 	uint32_t free_inodes;
86a1596438SUma Shankar 	uint32_t first_data_block;
87a1596438SUma Shankar 	uint32_t log2_block_size;
88a1596438SUma Shankar 	uint32_t log2_fragment_size;
89a1596438SUma Shankar 	uint32_t blocks_per_group;
90a1596438SUma Shankar 	uint32_t fragments_per_group;
91a1596438SUma Shankar 	uint32_t inodes_per_group;
92a1596438SUma Shankar 	uint32_t mtime;
93a1596438SUma Shankar 	uint32_t utime;
94a1596438SUma Shankar 	uint16_t mnt_count;
95a1596438SUma Shankar 	uint16_t max_mnt_count;
96a1596438SUma Shankar 	uint16_t magic;
97a1596438SUma Shankar 	uint16_t fs_state;
98a1596438SUma Shankar 	uint16_t error_handling;
99a1596438SUma Shankar 	uint16_t minor_revision_level;
100a1596438SUma Shankar 	uint32_t lastcheck;
101a1596438SUma Shankar 	uint32_t checkinterval;
102a1596438SUma Shankar 	uint32_t creator_os;
103a1596438SUma Shankar 	uint32_t revision_level;
104a1596438SUma Shankar 	uint16_t uid_reserved;
105a1596438SUma Shankar 	uint16_t gid_reserved;
106a1596438SUma Shankar 	uint32_t first_inode;
107a1596438SUma Shankar 	uint16_t inode_size;
108a1596438SUma Shankar 	uint16_t block_group_number;
109a1596438SUma Shankar 	uint32_t feature_compatibility;
110a1596438SUma Shankar 	uint32_t feature_incompat;
111a1596438SUma Shankar 	uint32_t feature_ro_compat;
112a1596438SUma Shankar 	uint32_t unique_id[4];
113a1596438SUma Shankar 	char volume_name[16];
114a1596438SUma Shankar 	char last_mounted_on[64];
115a1596438SUma Shankar 	uint32_t compression_info;
116a1596438SUma Shankar };
117a1596438SUma Shankar 
118a1596438SUma Shankar struct ext2_block_group {
119a1596438SUma Shankar 	__u32 block_id;	/* Blocks bitmap block */
120a1596438SUma Shankar 	__u32 inode_id;	/* Inodes bitmap block */
121a1596438SUma Shankar 	__u32 inode_table_id;	/* Inodes table block */
122a1596438SUma Shankar 	__u16 free_blocks;	/* Free blocks count */
123a1596438SUma Shankar 	__u16 free_inodes;	/* Free inodes count */
124a1596438SUma Shankar 	__u16 used_dir_cnt;	/* Directories count */
125a1596438SUma Shankar 	__u16 bg_flags;
126a1596438SUma Shankar 	__u32 bg_reserved[2];
127a1596438SUma Shankar 	__u16 bg_itable_unused; /* Unused inodes count */
128a1596438SUma Shankar 	__u16 bg_checksum;	/* crc16(s_uuid+grouo_num+group_desc)*/
129a1596438SUma Shankar };
130a1596438SUma Shankar 
131a1596438SUma Shankar /* The ext2 inode. */
132a1596438SUma Shankar struct ext2_inode {
133a1596438SUma Shankar 	uint16_t mode;
134a1596438SUma Shankar 	uint16_t uid;
135a1596438SUma Shankar 	uint32_t size;
136a1596438SUma Shankar 	uint32_t atime;
137a1596438SUma Shankar 	uint32_t ctime;
138a1596438SUma Shankar 	uint32_t mtime;
139a1596438SUma Shankar 	uint32_t dtime;
140a1596438SUma Shankar 	uint16_t gid;
141a1596438SUma Shankar 	uint16_t nlinks;
142a1596438SUma Shankar 	uint32_t blockcnt;	/* Blocks of 512 bytes!! */
143a1596438SUma Shankar 	uint32_t flags;
144a1596438SUma Shankar 	uint32_t osd1;
145a1596438SUma Shankar 	union {
146a1596438SUma Shankar 		struct datablocks {
147a1596438SUma Shankar 			uint32_t dir_blocks[INDIRECT_BLOCKS];
148a1596438SUma Shankar 			uint32_t indir_block;
149a1596438SUma Shankar 			uint32_t double_indir_block;
150a1596438SUma Shankar 			uint32_t triple_indir_block;
151a1596438SUma Shankar 		} blocks;
152a1596438SUma Shankar 		char symlink[60];
153a1596438SUma Shankar 	} b;
154a1596438SUma Shankar 	uint32_t version;
155a1596438SUma Shankar 	uint32_t acl;
156a1596438SUma Shankar 	uint32_t dir_acl;
157a1596438SUma Shankar 	uint32_t fragment_addr;
158a1596438SUma Shankar 	uint32_t osd2[3];
159a1596438SUma Shankar };
160a1596438SUma Shankar 
161a1596438SUma Shankar /* The header of an ext2 directory entry. */
162a1596438SUma Shankar struct ext2_dirent {
163a1596438SUma Shankar 	uint32_t inode;
164a1596438SUma Shankar 	uint16_t direntlen;
165a1596438SUma Shankar 	uint8_t namelen;
166a1596438SUma Shankar 	uint8_t filetype;
167a1596438SUma Shankar };
168a1596438SUma Shankar 
169a1596438SUma Shankar struct ext2fs_node {
170a1596438SUma Shankar 	struct ext2_data *data;
171a1596438SUma Shankar 	struct ext2_inode inode;
172a1596438SUma Shankar 	int ino;
173a1596438SUma Shankar 	int inode_read;
174a1596438SUma Shankar };
175a1596438SUma Shankar 
176a1596438SUma Shankar /* Information about a "mounted" ext2 filesystem. */
177a1596438SUma Shankar struct ext2_data {
178a1596438SUma Shankar 	struct ext2_sblock sblock;
179a1596438SUma Shankar 	struct ext2_inode *inode;
180a1596438SUma Shankar 	struct ext2fs_node diropen;
181a1596438SUma Shankar };
182a1596438SUma Shankar 
183*04735e9cSFrederic Leroy extern lbaint_t part_offset;
18481180819SRob Herring 
185a1596438SUma Shankar int do_ext2ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
186a1596438SUma Shankar int do_ext2load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
187a1596438SUma Shankar int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc,
188a1596438SUma Shankar 					char *const argv[]);
189a1596438SUma Shankar int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
190ed34f34dSUma Shankar int do_ext4_write(cmd_tbl_t *cmdtp, int flag, int argc,
191ed34f34dSUma Shankar 				char *const argv[]);
192a1596438SUma Shankar #endif
193