]> git.sur5r.net Git - u-boot/blobdiff - fs/fs.c
Merge branch 'u-boot-samsung/master' into 'u-boot-arm/master'
[u-boot] / fs / fs.c
diff --git a/fs/fs.c b/fs/fs.c
index 856d8baf9287d023de03b764b0b9e1d716ba7ae1..6f5063c3aff5e2806320bead6547a6c4154d4495 100644 (file)
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -20,6 +20,8 @@
 #include <ext4fs.h>
 #include <fat.h>
 #include <fs.h>
+#include <sandboxfs.h>
+#include <asm/io.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -27,7 +29,8 @@ static block_dev_desc_t *fs_dev_desc;
 static disk_partition_t fs_partition;
 static int fs_type = FS_TYPE_ANY;
 
-static inline int fs_probe_unsupported(void)
+static inline int fs_probe_unsupported(block_dev_desc_t *fs_dev_desc,
+                                     disk_partition_t *fs_partition)
 {
        printf("** Unrecognized filesystem type **\n");
        return -1;
@@ -38,7 +41,7 @@ static inline int fs_ls_unsupported(const char *dirname)
        return -1;
 }
 
-static inline int fs_read_unsupported(const char *filename, ulong addr,
+static inline int fs_read_unsupported(const char *filename, void *buf,
                                      int offset, int len)
 {
        return -1;
@@ -48,114 +51,12 @@ static inline void fs_close_unsupported(void)
 {
 }
 
-#ifdef CONFIG_FS_FAT
-static int fs_probe_fat(void)
-{
-       return fat_set_blk_dev(fs_dev_desc, &fs_partition);
-}
-
-static void fs_close_fat(void)
-{
-}
-
-#define fs_ls_fat file_fat_ls
-
-static int fs_read_fat(const char *filename, ulong addr, int offset, int len)
-{
-       int len_read;
-
-       len_read = file_fat_read_at(filename, offset,
-                                   (unsigned char *)addr, len);
-       if (len_read == -1) {
-               printf("** Unable to read file %s **\n", filename);
-               return -1;
-       }
-
-       return len_read;
-}
-#else
-static inline int fs_probe_fat(void)
-{
-       return -1;
-}
-
-static inline void fs_close_fat(void)
-{
-}
-
-#define fs_ls_fat fs_ls_unsupported
-#define fs_read_fat fs_read_unsupported
-#endif
-
-#ifdef CONFIG_FS_EXT4
-static int fs_probe_ext(void)
-{
-       ext4fs_set_blk_dev(fs_dev_desc, &fs_partition);
-
-       if (!ext4fs_mount(fs_partition.size)) {
-               ext4fs_close();
-               return -1;
-       }
-
-       return 0;
-}
-
-static void fs_close_ext(void)
-{
-       ext4fs_close();
-}
-
-#define fs_ls_ext ext4fs_ls
-
-static int fs_read_ext(const char *filename, ulong addr, int offset, int len)
-{
-       int file_len;
-       int len_read;
-
-       if (offset != 0) {
-               printf("** Cannot support non-zero offset **\n");
-               return -1;
-       }
-
-       file_len = ext4fs_open(filename);
-       if (file_len < 0) {
-               printf("** File not found %s **\n", filename);
-               ext4fs_close();
-               return -1;
-       }
-
-       if (len == 0)
-               len = file_len;
-
-       len_read = ext4fs_read((char *)addr, len);
-       ext4fs_close();
-
-       if (len_read != len) {
-               printf("** Unable to read file %s **\n", filename);
-               return -1;
-       }
-
-       return len_read;
-}
-#else
-static inline int fs_probe_ext(void)
-{
-       return -1;
-}
-
-static inline void fs_close_ext(void)
-{
-}
-
-#define fs_ls_ext fs_ls_unsupported
-#define fs_read_ext fs_read_unsupported
-#endif
-
 struct fstype_info {
        int fstype;
-       int (*probe)(void);
+       int (*probe)(block_dev_desc_t *fs_dev_desc,
+                    disk_partition_t *fs_partition);
        int (*ls)(const char *dirname);
-       int (*read)(const char *filename, ulong addr, int offset, int len);
+       int (*read)(const char *filename, void *buf, int offset, int len);
        void (*close)(void);
 };
 
@@ -163,19 +64,28 @@ static struct fstype_info fstypes[] = {
 #ifdef CONFIG_FS_FAT
        {
                .fstype = FS_TYPE_FAT,
-               .probe = fs_probe_fat,
-               .close = fs_close_fat,
+               .probe = fat_set_blk_dev,
+               .close = fat_close,
                .ls = file_fat_ls,
-               .read = fs_read_fat,
+               .read = fat_read_file,
        },
 #endif
 #ifdef CONFIG_FS_EXT4
        {
                .fstype = FS_TYPE_EXT,
-               .probe = fs_probe_ext,
-               .close = fs_close_ext,
+               .probe = ext4fs_probe,
+               .close = ext4fs_close,
                .ls = ext4fs_ls,
-               .read = fs_read_ext,
+               .read = ext4_read_file,
+       },
+#endif
+#ifdef CONFIG_SANDBOX
+       {
+               .fstype = FS_TYPE_SANDBOX,
+               .probe = sandbox_fs_set_blk_dev,
+               .close = sandbox_fs_close,
+               .ls = sandbox_fs_ls,
+               .read = fs_read_sandbox,
        },
 #endif
        {
@@ -230,7 +140,7 @@ int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
                                fstype != info->fstype)
                        continue;
 
-               if (!info->probe()) {
+               if (!info->probe(fs_dev_desc, &fs_partition)) {
                        fs_type = info->fstype;
                        return 0;
                }
@@ -244,6 +154,7 @@ static void fs_close(void)
        struct fstype_info *info = fs_get_info(fs_type);
 
        info->close();
+
        fs_type = FS_TYPE_ANY;
 }
 
@@ -255,6 +166,7 @@ int fs_ls(const char *dirname)
 
        ret = info->ls(dirname);
 
+       fs_type = FS_TYPE_ANY;
        fs_close();
 
        return ret;
@@ -263,9 +175,16 @@ int fs_ls(const char *dirname)
 int fs_read(const char *filename, ulong addr, int offset, int len)
 {
        struct fstype_info *info = fs_get_info(fs_type);
+       void *buf;
        int ret;
 
-       ret = info->read(filename, addr, offset, len);
+       /*
+        * We don't actually know how many bytes are being read, since len==0
+        * means read the whole file.
+        */
+       buf = map_sysmem(addr, len);
+       ret = info->read(filename, buf, offset, len);
+       unmap_sysmem(buf);
 
        /* If we requested a specific number of bytes, check we got it */
        if (ret >= 0 && len && ret != len) {