For clear separation of user's (OS) filesystem to U-Boot and other's
stuff it is now possible to give the filesystem a specific offset and a
specific size.
For full consistency OS storage driver also has to support this and
has to use same offset and size.

Following new parameters has been added to the block_dev_desc_t
structure:
- lba_offset : offset in blocks from which fs is reading/writing
- lba_fs     : size in blocks of fs

This two parameters are filled from the underlaying device-driver.
As default they are initialized for giving whole size of block-device
to the filesystem.

In case of mmc-driver a function for modifiying drive geometry is
called 'board_mmc_geometry', this function is implemented as
'__weak', so it can be replaced by a board-specific function, which
can setup suitable offset and size for the filesystem.
This function is responsible for giving reasonable values, e.g.
lba_offset+lba_fs must not exceed available blocks of the device.

Only MMC Driver and FATFS are modified to support this.

Signed-off-by: Hannes Petermaier <oe5...@oevsv.at>
---
 disk/part_dos.c    |   11 ++++++++---
 drivers/mmc/mmc.c  |    8 ++++++++
 fs/fat/fat.c       |    5 +++--
 fs/fat/fat_write.c |    7 ++++---
 include/part.h     |   10 +++++++++-
 5 files changed, 32 insertions(+), 9 deletions(-)

diff --git a/disk/part_dos.c b/disk/part_dos.c
index 05c3933..aa38819 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -87,7 +87,8 @@ int test_part_dos (block_dev_desc_t *dev_desc)
 {
        ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
 
-       if (dev_desc->block_read(dev_desc->dev, 0, 1, (ulong *) buffer) != 1)
+       if (dev_desc->block_read(dev_desc->dev, dev_desc->lba_offset, 1,
+                                (ulong *)buffer) != 1)
                return -1;
 
        if (test_block_type(buffer) != DOS_MBR)
@@ -106,7 +107,9 @@ static void print_partition_extended(block_dev_desc_t 
*dev_desc,
        dos_partition_t *pt;
        int i;
 
-       if (dev_desc->block_read(dev_desc->dev, ext_part_sector, 1, (ulong *) 
buffer) != 1) {
+       if (dev_desc->block_read(dev_desc->dev,
+                                ext_part_sector + dev_desc->lba_offset, 1,
+                                (ulong *)buffer) != 1) {
                printf ("** Can't read partition table on %d:%d **\n",
                        dev_desc->dev, ext_part_sector);
                return;
@@ -169,7 +172,9 @@ static int get_partition_info_extended (block_dev_desc_t 
*dev_desc, int ext_part
        dos_partition_t *pt;
        int i;
 
-       if (dev_desc->block_read (dev_desc->dev, ext_part_sector, 1, (ulong *) 
buffer) != 1) {
+       if (dev_desc->block_read(dev_desc->dev,
+                                ext_part_sector + dev_desc->lba_offset, 1,
+                                (ulong *)buffer) != 1) {
                printf ("** Can't read partition table on %d:%d **\n",
                        dev_desc->dev, ext_part_sector);
                return -1;
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 8ab0bc9..4acce73 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -526,6 +526,12 @@ static int mmc_change_freq(struct mmc *mmc)
        return 0;
 }
 
+void __weak board_mmc_geometry(struct mmc *mmc)
+{
+       mmc->block_dev.lba_fs = mmc->block_dev.lba;
+       mmc->block_dev.lba_offset = 0;
+}
+
 static int mmc_set_capacity(struct mmc *mmc, int part_num)
 {
        switch (part_num) {
@@ -551,6 +557,8 @@ static int mmc_set_capacity(struct mmc *mmc, int part_num)
 
        mmc->block_dev.lba = lldiv(mmc->capacity, mmc->read_bl_len);
 
+       board_mmc_geometry(mmc);
+
        return 0;
 }
 
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 54f42ea..dba0989 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -49,7 +49,8 @@ static int disk_read(__u32 block, __u32 nr_blocks, void *buf)
                return -1;
 
        return cur_dev->block_read(cur_dev->dev,
-                       cur_part_info.start + block, nr_blocks, buf);
+                       cur_part_info.start + block + cur_dev->lba_offset,
+                       nr_blocks, buf);
 }
 
 int fat_set_blk_dev(block_dev_desc_t *dev_desc, disk_partition_t *info)
@@ -97,7 +98,7 @@ int fat_register_device(block_dev_desc_t *dev_desc, int 
part_no)
                }
 
                info.start = 0;
-               info.size = dev_desc->lba;
+               info.size = dev_desc->lba_fs;
                info.blksz = dev_desc->blksz;
                info.name[0] = 0;
                info.type[0] = 0;
diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
index 9f5e911..6238a8e 100644
--- a/fs/fat/fat_write.c
+++ b/fs/fat/fat_write.c
@@ -31,14 +31,15 @@ static int disk_write(__u32 block, __u32 nr_blocks, void 
*buf)
        if (!cur_dev || !cur_dev->block_write)
                return -1;
 
-       if (cur_part_info.start + block + nr_blocks >
-               cur_part_info.start + total_sector) {
+       if (cur_part_info.start + block + nr_blocks + cur_dev->lba_offset >
+               cur_part_info.start + total_sector + cur_dev->lba_offset) {
                printf("error: overflow occurs\n");
                return -1;
        }
 
        return cur_dev->block_write(cur_dev->dev,
-                       cur_part_info.start + block, nr_blocks, buf);
+                       cur_part_info.start + block + cur_dev->lba_offset,
+                       nr_blocks, buf);
 }
 
 /*
diff --git a/include/part.h b/include/part.h
index 4beb6db..29a227a 100644
--- a/include/part.h
+++ b/include/part.h
@@ -20,7 +20,15 @@ typedef struct block_dev_desc {
 #ifdef CONFIG_LBA48
        unsigned char   lba48;          /* device can use 48bit addr (ATA/ATAPI 
v7) */
 #endif
-       lbaint_t        lba;            /* number of blocks */
+       lbaint_t        lba_offset;     /*
+                                        * offset from which file-systems
+                                        * do their work
+                                        */
+       lbaint_t        lba_fs;         /*
+                                        * number of blocks available to the
+                                        * file-system
+                                        */
+       lbaint_t        lba;            /* total number of blocks-available */
        unsigned long   blksz;          /* block size */
        int             log2blksz;      /* for convenience: log2(blksz) */
        char            vendor [40+1];  /* IDE model, SCSI Vendor */
-- 
1.7.9.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to