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/pp/ata-sd-pp.c | 40 ++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 19 deletions(-) (limited to 'firmware/target/arm/pp') diff --git a/firmware/target/arm/pp/ata-sd-pp.c b/firmware/target/arm/pp/ata-sd-pp.c index fb0a9e150e..b998afd21e 100644 --- a/firmware/target/arm/pp/ata-sd-pp.c +++ b/firmware/target/arm/pp/ata-sd-pp.c @@ -82,7 +82,7 @@ #define STAT_TIME_OUT_RES (1 << 1) #define STAT_TIME_OUT_READ (1) #define STAT_ERROR_BITS (0x3f) - + /* MMC_CMDAT bits */ /* Some of the bits used by the OF don't make much sense with these */ /* definitions. So they're probably different between PXA and PP502x */ @@ -101,7 +101,7 @@ #define CMDAT_RES_TYPE3 (3) #define CMDAT_RES_TYPE2 (2) #define CMDAT_RES_TYPE1 (1) - + /* MMC_I_MASK bits */ /* PP502x apparently only has bits 0-3 */ #define I_MASK_SDIO_SUSPEND_ACK (1 << 12) @@ -499,18 +499,18 @@ static inline void copy_write_sectors(const unsigned char** buf) { asm volatile ( "ldmia %[buf]!, { r3, r5, r7, r9 } \r\n" - "mov r4, r3, lsr #16 \r\n" - "mov r6, r5, lsr #16 \r\n" - "mov r8, r7, lsr #16 \r\n" - "mov r10, r9, lsr #16 \r\n" + "mov r4, r3, lsr #16 \r\n" + "mov r6, r5, lsr #16 \r\n" + "mov r8, r7, lsr #16 \r\n" + "mov r10, r9, lsr #16 \r\n" "stmia %[data], { r3-r10 } \r\n" "ldmia %[buf]!, { r3, r5, r7, r9 } \r\n" - "mov r4, r3, lsr #16 \r\n" - "mov r6, r5, lsr #16 \r\n" - "mov r8, r7, lsr #16 \r\n" - "mov %[t], r9, lsr #16 \r\n" + "mov r4, r3, lsr #16 \r\n" + "mov r6, r5, lsr #16 \r\n" + "mov r8, r7, lsr #16 \r\n" + "mov %[t], r9, lsr #16 \r\n" "stmia %[data], { r3-r9 } \r\n" - : [buf]"+&r"(*buf), [t]"=&r"(t) + : [buf]"+&r"(*buf), [t]"=&r"(t) : [data]"r"(&MMC_DATA_FIFO) : "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" ); @@ -760,7 +760,7 @@ static void sd_init_device(int card_no) currcard->csd[i] = temp_reg[3-i]; sd_parse_csd(currcard); - + MMC_CLKRT = 0; /* switch to highest clock rate */ ret = sd_command(SD_SELECT_CARD, currcard->rca, NULL, @@ -849,7 +849,7 @@ static void sd_select_device(int card_no) /* API Functions */ -int sd_read_sectors(IF_MD(int drive,) unsigned long start, int incount, +int sd_read_sectors(IF_MD(int drive,) sector_t start, int incount, void* inbuf) { #ifndef HAVE_MULTIDRIVE @@ -857,8 +857,8 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int incount, #endif int ret; unsigned char *buf, *buf_end; - unsigned int bank; - + sector_t bank; + /* TODO: Add DMA support. */ mutex_lock(&sd_mtx); @@ -894,7 +894,7 @@ sd_read_retry: if (ret < 0) goto sd_read_error; } - + start -= bank * BLOCKS_PER_BANK; } @@ -904,6 +904,8 @@ sd_read_retry: MMC_NUMBLK = incount; + // XXX 64-bit addresses.. + #ifdef HAVE_HOTSWAP if(currcard->ocr & (1<<30) ) { @@ -966,7 +968,7 @@ sd_read_error: } } -int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, +int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* outbuf) { /* Write support is not finished yet */ @@ -1010,7 +1012,7 @@ sd_write_retry: if (ret < 0) goto sd_write_error; } - + start -= bank * BLOCKS_PER_BANK; } @@ -1250,7 +1252,7 @@ int sd_num_drives(int first_drive) #else (void)first_drive; #endif - + #ifdef HAVE_MULTIDRIVE return 2; #else -- cgit v1.2.3