1*4d3c95f5SJorgen Lundman /* 2*4d3c95f5SJorgen Lundman * ZFS filesystem port for Uboot by 3*4d3c95f5SJorgen Lundman * Jorgen Lundman <lundman at lundman.net> 4*4d3c95f5SJorgen Lundman * 5*4d3c95f5SJorgen Lundman * zfsfs support 6*4d3c95f5SJorgen Lundman * made from existing GRUB Sources by Sun, GNU and others. 7*4d3c95f5SJorgen Lundman * 8*4d3c95f5SJorgen Lundman * This program is free software; you can redistribute it and/or modify 9*4d3c95f5SJorgen Lundman * it under the terms of the GNU General Public License version 2 as 10*4d3c95f5SJorgen Lundman * published by the Free Software Foundation. 11*4d3c95f5SJorgen Lundman * 12*4d3c95f5SJorgen Lundman * This program is distributed in the hope that it will be useful, 13*4d3c95f5SJorgen Lundman * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*4d3c95f5SJorgen Lundman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*4d3c95f5SJorgen Lundman * GNU General Public License for more details. 16*4d3c95f5SJorgen Lundman * 17*4d3c95f5SJorgen Lundman * You should have received a copy of the GNU General Public License 18*4d3c95f5SJorgen Lundman * along with this program; if not, write to the Free Software 19*4d3c95f5SJorgen Lundman * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20*4d3c95f5SJorgen Lundman */ 21*4d3c95f5SJorgen Lundman 22*4d3c95f5SJorgen Lundman #ifndef __ZFS_COMMON__ 23*4d3c95f5SJorgen Lundman #define __ZFS_COMMON__ 24*4d3c95f5SJorgen Lundman 25*4d3c95f5SJorgen Lundman #define SECTOR_SIZE 0x200 26*4d3c95f5SJorgen Lundman #define SECTOR_BITS 9 27*4d3c95f5SJorgen Lundman 28*4d3c95f5SJorgen Lundman 29*4d3c95f5SJorgen Lundman typedef enum zfs_endian { 30*4d3c95f5SJorgen Lundman UNKNOWN_ENDIAN = -2, 31*4d3c95f5SJorgen Lundman LITTLE_ENDIAN = -1, 32*4d3c95f5SJorgen Lundman BIG_ENDIAN = 0 33*4d3c95f5SJorgen Lundman } zfs_endian_t; 34*4d3c95f5SJorgen Lundman 35*4d3c95f5SJorgen Lundman 36*4d3c95f5SJorgen Lundman /* Endian macros. */ 37*4d3c95f5SJorgen Lundman #define zfs_to_cpu16(x, a) (((a) == BIG_ENDIAN) ? be16_to_cpu(x) \ 38*4d3c95f5SJorgen Lundman : le16_to_cpu(x)) 39*4d3c95f5SJorgen Lundman #define cpu_to_zfs16(x, a) (((a) == BIG_ENDIAN) ? cpu_to_be16(x) \ 40*4d3c95f5SJorgen Lundman : cpu_to_le16(x)) 41*4d3c95f5SJorgen Lundman 42*4d3c95f5SJorgen Lundman #define zfs_to_cpu32(x, a) (((a) == BIG_ENDIAN) ? be32_to_cpu(x) \ 43*4d3c95f5SJorgen Lundman : le32_to_cpu(x)) 44*4d3c95f5SJorgen Lundman #define cpu_to_zfs32(x, a) (((a) == BIG_ENDIAN) ? cpu_to_be32(x) \ 45*4d3c95f5SJorgen Lundman : cpu_to_le32(x)) 46*4d3c95f5SJorgen Lundman 47*4d3c95f5SJorgen Lundman #define zfs_to_cpu64(x, a) (((a) == BIG_ENDIAN) ? be64_to_cpu(x) \ 48*4d3c95f5SJorgen Lundman : le64_to_cpu(x)) 49*4d3c95f5SJorgen Lundman #define cpu_to_zfs64(x, a) (((a) == BIG_ENDIAN) ? cpu_to_be64(x) \ 50*4d3c95f5SJorgen Lundman : cpu_to_le64(x)) 51*4d3c95f5SJorgen Lundman 52*4d3c95f5SJorgen Lundman 53*4d3c95f5SJorgen Lundman enum zfs_errors { 54*4d3c95f5SJorgen Lundman ZFS_ERR_NONE = 0, 55*4d3c95f5SJorgen Lundman ZFS_ERR_NOT_IMPLEMENTED_YET = -1, 56*4d3c95f5SJorgen Lundman ZFS_ERR_BAD_FS = -2, 57*4d3c95f5SJorgen Lundman ZFS_ERR_OUT_OF_MEMORY = -3, 58*4d3c95f5SJorgen Lundman ZFS_ERR_FILE_NOT_FOUND = -4, 59*4d3c95f5SJorgen Lundman ZFS_ERR_BAD_FILE_TYPE = -5, 60*4d3c95f5SJorgen Lundman ZFS_ERR_OUT_OF_RANGE = -6, 61*4d3c95f5SJorgen Lundman }; 62*4d3c95f5SJorgen Lundman 63*4d3c95f5SJorgen Lundman struct zfs_filesystem { 64*4d3c95f5SJorgen Lundman 65*4d3c95f5SJorgen Lundman /* Block Device Descriptor */ 66*4d3c95f5SJorgen Lundman block_dev_desc_t *dev_desc; 67*4d3c95f5SJorgen Lundman }; 68*4d3c95f5SJorgen Lundman 69*4d3c95f5SJorgen Lundman 70*4d3c95f5SJorgen Lundman extern block_dev_desc_t *zfs_dev_desc; 71*4d3c95f5SJorgen Lundman 72*4d3c95f5SJorgen Lundman struct device_s { 73*4d3c95f5SJorgen Lundman uint64_t part_length; 74*4d3c95f5SJorgen Lundman }; 75*4d3c95f5SJorgen Lundman typedef struct device_s *device_t; 76*4d3c95f5SJorgen Lundman 77*4d3c95f5SJorgen Lundman struct zfs_file { 78*4d3c95f5SJorgen Lundman device_t device; 79*4d3c95f5SJorgen Lundman uint64_t size; 80*4d3c95f5SJorgen Lundman void *data; 81*4d3c95f5SJorgen Lundman uint64_t offset; 82*4d3c95f5SJorgen Lundman }; 83*4d3c95f5SJorgen Lundman 84*4d3c95f5SJorgen Lundman typedef struct zfs_file *zfs_file_t; 85*4d3c95f5SJorgen Lundman 86*4d3c95f5SJorgen Lundman struct zfs_dirhook_info { 87*4d3c95f5SJorgen Lundman int dir; 88*4d3c95f5SJorgen Lundman int mtimeset; 89*4d3c95f5SJorgen Lundman time_t mtime; 90*4d3c95f5SJorgen Lundman time_t mtime2; 91*4d3c95f5SJorgen Lundman }; 92*4d3c95f5SJorgen Lundman 93*4d3c95f5SJorgen Lundman 94*4d3c95f5SJorgen Lundman 95*4d3c95f5SJorgen Lundman 96*4d3c95f5SJorgen Lundman struct zfs_filesystem *zfsget_fs(void); 97*4d3c95f5SJorgen Lundman int init_fs(block_dev_desc_t *dev_desc); 98*4d3c95f5SJorgen Lundman void deinit_fs(block_dev_desc_t *dev_desc); 99*4d3c95f5SJorgen Lundman int zfs_open(zfs_file_t, const char *filename); 100*4d3c95f5SJorgen Lundman uint64_t zfs_read(zfs_file_t, char *buf, uint64_t len); 101*4d3c95f5SJorgen Lundman struct zfs_data *zfs_mount(device_t); 102*4d3c95f5SJorgen Lundman int zfs_close(zfs_file_t); 103*4d3c95f5SJorgen Lundman int zfs_ls(device_t dev, const char *path, 104*4d3c95f5SJorgen Lundman int (*hook) (const char *, const struct zfs_dirhook_info *)); 105*4d3c95f5SJorgen Lundman int zfs_devread(int sector, int byte_offset, int byte_len, char *buf); 106*4d3c95f5SJorgen Lundman int zfs_set_blk_dev(block_dev_desc_t *rbdd, int part); 107*4d3c95f5SJorgen Lundman void zfs_unmount(struct zfs_data *data); 108*4d3c95f5SJorgen Lundman int lzjb_decompress(void *, void *, uint32_t, uint32_t); 109*4d3c95f5SJorgen Lundman #endif 110