From 15e52374698ba7395ff0ece0d3d70435a66406c4 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Fri, 5 Jul 2024 16:00:30 -0400 Subject: storage: 64-bit sector offsets * Create new 'sector_t' type alias: * uint64_t for all targets with HAVE_LBA48 or HAVE_SDUC * unsigned long for the everything else * Alter all storage APIs to use sector_t instead of 'unsigned long' * Alter Volume/Partition/storage info structures to use sector_t * Disk cache converted to sector_t * ATA Core: * convert to using sector_t for sector addresses and drive sizes * Always fill out upper 16 bits of LBA48 addresses * IDENTIFY INFO is fixed at 512 bytes, not SECTOR_SIZE * USB mass storage: * convert to using sector_t for sector addesses and drive sizes * Implement READ_16/WRITE_16 for LBA48 addresses * Convert FAT code to use sector_t for all sector references * output_dyn_value() now accepts int64_t instead of 'int' * Corrected "rockbox info" to work for (MULTIVOLUME & !MULTIDRIVE) * Better reporting of disk and (logical+physical) sector sizes in debug info * Detect SDUC cards and report on storage debug_info screen To-do: SDUC * Refactor SD core to remove duplicate code in every driver * Card probe and init state machine * Implement core SDUC support * SD2.0 needs to be 2.0+ (fixed for jz47xx and x1000) * Host and Card ID (ACMD41) * 32-bit addressing for all read/write/erase operations (CMD22) * ADD SDUC to target device drivers, defining HAVE_SDUC as appropriate Change-Id: Ib0138781a0081664d11511037685503df1b93608 --- firmware/target/arm/imx233/nand-imx233.c | 4 ++-- firmware/target/arm/imx233/partitions-imx233.c | 2 +- firmware/target/arm/imx233/partitions-imx233.h | 6 +++--- firmware/target/arm/imx233/sdmmc-imx233.c | 16 ++++++++-------- 4 files changed, 14 insertions(+), 14 deletions(-) (limited to 'firmware/target/arm/imx233') diff --git a/firmware/target/arm/imx233/nand-imx233.c b/firmware/target/arm/imx233/nand-imx233.c index a7afba7d43..22da408e05 100644 --- a/firmware/target/arm/imx233/nand-imx233.c +++ b/firmware/target/arm/imx233/nand-imx233.c @@ -36,13 +36,13 @@ int nand_init(void) { return -1; } -int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, +int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf) { return -1; } -int nand_write_sectors(IF_MD(int drive,) unsigned long start, int count, +int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf) { return -1; diff --git a/firmware/target/arm/imx233/partitions-imx233.c b/firmware/target/arm/imx233/partitions-imx233.c index 83a0bf8b42..965f98dca5 100644 --- a/firmware/target/arm/imx233/partitions-imx233.c +++ b/firmware/target/arm/imx233/partitions-imx233.c @@ -71,7 +71,7 @@ static const char *creative_part_name(enum imx233_part_t part) } static int compute_window_creative(intptr_t user, part_read_fn_t read_fn, - enum imx233_part_t part, unsigned *start, unsigned *end) + enum imx233_part_t part, sector_t *start, unsigned *end) { uint8_t mblk[512]; int ret = read_fn(user, MBLK_ADDR / 512, 1, mblk); diff --git a/firmware/target/arm/imx233/partitions-imx233.h b/firmware/target/arm/imx233/partitions-imx233.h index e5378dadbb..4c8f703c2d 100644 --- a/firmware/target/arm/imx233/partitions-imx233.h +++ b/firmware/target/arm/imx233/partitions-imx233.h @@ -45,7 +45,7 @@ enum imx233_part_t /** The computation function can be called very early in the boot, at which point * usual storage read/write function may not be available. To workaround this * issue, one must provide a read function. */ -typedef int (*part_read_fn_t)(intptr_t user, unsigned long start, int count, void* buf); +typedef int (*part_read_fn_t)(intptr_t user, sector_t start, int count, void* buf); /* Enable/Disable window computations for internal storage following the * Freescale/Creative convention */ void imx233_partitions_enable_window(bool enable); @@ -55,6 +55,6 @@ bool imx233_partitions_is_window_enabled(void); * for a whole disk, *end should be the size of the disk when the function is * called */ int imx233_partitions_compute_window(intptr_t user, part_read_fn_t read_fn, - enum imx233_part_t part, unsigned *start, unsigned *end); + enum imx233_part_t part, sector_t *start, unsigned *end); -#endif /* __PARTITIONS_IMX233__ */ \ No newline at end of file +#endif /* __PARTITIONS_IMX233__ */ diff --git a/firmware/target/arm/imx233/sdmmc-imx233.c b/firmware/target/arm/imx233/sdmmc-imx233.c index af090e8a07..5577c6002d 100644 --- a/firmware/target/arm/imx233/sdmmc-imx233.c +++ b/firmware/target/arm/imx233/sdmmc-imx233.c @@ -648,7 +648,7 @@ int mmc_event(long id, intptr_t data) #endif /* CONFIG_STORAGE & STORAGE_MMC */ /* low-level function, don't call directly! */ -static int __xfer_sectors(int drive, unsigned long start, int count, void *buf, bool read) +static int __xfer_sectors(int drive, sector_t start, int count, void *buf, bool read) { uint32_t resp; int ret = 0; @@ -660,7 +660,7 @@ static int __xfer_sectors(int drive, unsigned long start, int count, void *buf, need_stop = false; /* Set bank_start to the correct unit (blocks or bytes). * MMC drives use block addressing, SD cards bytes or blocks */ - int bank_start = start; + sector_t bank_start = start; if(SDMMC_MODE(drive) == SD_MODE && !(SDMMC_INFO(drive).ocr & (1<<30))) /* not SDHC */ bank_start *= SD_BLOCK_SIZE; /* issue read/write @@ -686,7 +686,7 @@ static int __xfer_sectors(int drive, unsigned long start, int count, void *buf, return ret; } -static int transfer_sectors(int drive, unsigned long start, int count, void *buf, bool read) +static int transfer_sectors(int drive, sector_t start, int count, void *buf, bool read) { int ret = 0; /* the function doesn't work when count is 0 */ @@ -806,7 +806,7 @@ static int transfer_sectors(int drive, unsigned long start, int count, void *buf } /* user specifies the sdmmc drive */ -static int part_read_fn(intptr_t user, unsigned long start, int count, void* buf) +static int part_read_fn(intptr_t user, sector_t start, int count, void* buf) { return transfer_sectors(user, start, count, buf, true); } @@ -917,7 +917,7 @@ void sd_enable(bool on) (void) on; } -int sd_read_sectors(IF_MD(int sd_drive,) unsigned long start, int count, void *buf) +int sd_read_sectors(IF_MD(int sd_drive,) sector_t start, int count, void *buf) { #ifndef HAVE_MULTIDRIVE int sd_drive = 0; @@ -925,7 +925,7 @@ int sd_read_sectors(IF_MD(int sd_drive,) unsigned long start, int count, void *b return transfer_sectors(sd_map[sd_drive], start, count, buf, true); } -int sd_write_sectors(IF_MD(int sd_drive,) unsigned long start, int count, const void* buf) +int sd_write_sectors(IF_MD(int sd_drive,) sector_t start, int count, const void* buf) { #ifndef HAVE_MULTIDRIVE int sd_drive = 0; @@ -1039,7 +1039,7 @@ int mmc_spinup_time(void) return 0; } -int mmc_read_sectors(IF_MD(int mmc_drive,) unsigned long start, int count, void *buf) +int mmc_read_sectors(IF_MD(int mmc_drive,) sector_t start, int count, void *buf) { #ifndef HAVE_MULTIDRIVE int mmc_drive = 0; @@ -1047,7 +1047,7 @@ int mmc_read_sectors(IF_MD(int mmc_drive,) unsigned long start, int count, void return transfer_sectors(mmc_map[mmc_drive], start, count, buf, true); } -int mmc_write_sectors(IF_MD(int mmc_drive,) unsigned long start, int count, const void* buf) +int mmc_write_sectors(IF_MD(int mmc_drive,) sector_t start, int count, const void* buf) { #ifndef HAVE_MULTIDRIVE int mmc_drive = 0; -- cgit v1.2.3