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
This commit is contained in:
Solomon Peachy 2024-07-05 16:00:30 -04:00
parent 9ff308a589
commit 15e5237469
49 changed files with 629 additions and 435 deletions

View file

@ -84,7 +84,7 @@ struct nand_param
*
*/
static volatile unsigned long nand_address;
static volatile sector_t nand_address;
#define NAND_DATAPORT (nand_address)
#define NAND_ADDRPORT (nand_address+0x10000)
#define NAND_COMMPORT (nand_address+0x08000)
@ -111,7 +111,7 @@ static volatile unsigned long nand_address;
static struct nand_info* chip_info = NULL;
static struct nand_info* banks[4];
static unsigned int nr_banks = 1;
static unsigned long bank_size;
static sector_t bank_size;
static struct nand_param internal_param;
static struct mutex nand_mtx;
#ifdef USE_DMA
@ -282,7 +282,7 @@ static void jz_rs_correct(unsigned char *dat, int idx, int mask)
/*
* Read oob
*/
static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int size)
static int jz_nand_read_oob(sector_t page_addr, unsigned char *buf, int size)
{
struct nand_param *nandp = &internal_param;
int page_size, row_cycle, bus_width;
@ -338,7 +338,7 @@ static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int siz
* page - page number within a block: 0, 1, 2, ...
* dst - pointer to target buffer
*/
static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst)
static int jz_nand_read_page(sector_t page_addr, unsigned char *dst)
{
struct nand_param *nandp = &internal_param;
int page_size, oob_size;
@ -611,7 +611,7 @@ int nand_init(void)
return res;
}
static inline int read_sector(unsigned long start, unsigned int count,
static inline int read_sector(sector_t start, unsigned int count,
void* buf, unsigned int chip_size)
{
register int ret;
@ -627,14 +627,14 @@ static inline int read_sector(unsigned long start, unsigned int count,
return ret;
}
int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
{
#ifdef HAVE_MULTIDRIVE
(void)drive;
#endif
int ret = 0;
unsigned int i, _count, chip_size = chip_info->page_size;
unsigned long _start;
sector_t _start;
logf("start");
mutex_lock(&nand_mtx);
@ -670,7 +670,7 @@ int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* bu
}
/* TODO */
int nand_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
{
(void)start;
(void)count;

View file

@ -110,7 +110,7 @@ struct nand_param {
static struct nand_info* chip_info = NULL;
static struct nand_info* bank;
static unsigned long nand_size;
static sector_t nand_size;
static struct nand_param internal_param;
static struct mutex nand_mtx;
#ifdef USE_DMA
@ -281,7 +281,7 @@ static void jz_rs_correct(unsigned char *dat, int idx, int mask)
/*
* Read oob
*/
static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int size)
static int jz_nand_read_oob(sector_t page_addr, unsigned char *buf, int size)
{
struct nand_param *nandp = &internal_param;
int page_size, row_cycle, bus_width;
@ -337,7 +337,7 @@ static int jz_nand_read_oob(unsigned long page_addr, unsigned char *buf, int siz
* page - page number within a block: 0, 1, 2, ...
* dst - pointer to target buffer
*/
static int jz_nand_read_page(unsigned long page_addr, unsigned char *dst)
static int jz_nand_read_page(sector_t page_addr, unsigned char *dst)
{
struct nand_param *nandp = &internal_param;
int page_size, oob_size;
@ -532,7 +532,7 @@ int nand_init(void)
return res;
}
static inline int read_sector(unsigned long start, unsigned int count,
static inline int read_sector(sector_t start, unsigned int count,
void* buf, unsigned int chip_size)
{
register int ret;
@ -548,7 +548,7 @@ static inline int read_sector(unsigned long start, unsigned int count,
return ret;
}
static inline int write_sector(unsigned long start, unsigned int count,
static inline int write_sector(sector_t start, unsigned int count,
const void* buf, unsigned int chip_size)
{
int ret = 0;
@ -563,14 +563,14 @@ static inline int write_sector(unsigned long start, unsigned int count,
return ret;
}
int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
int nand_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
{
#ifdef HAVE_MULTIDRIVE
(void)drive;
#endif
int ret = 0;
unsigned int _count, chip_size = chip_info->page_size;
unsigned long _start;
sector_t _start;
logf("start");
mutex_lock(&nand_mtx);
@ -590,14 +590,14 @@ int nand_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* bu
return ret;
}
int nand_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
int nand_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
{
#ifdef HAVE_MULTIDRIVE
(void)drive;
#endif
int ret = 0;
unsigned int _count, chip_size = chip_info->page_size;
unsigned long _start;
sector_t _start;
logf("start");
mutex_lock(&nand_mtx);

View file

@ -42,7 +42,6 @@ static struct mutex sd_mtx;
static int use_4bit;
static int num_6;
static int sd2_0;
//#define SD_DMA_ENABLE
#define SD_DMA_INTERRUPT 0
@ -598,7 +597,7 @@ static int jz_sd_transmit_data(struct sd_request *req)
static inline unsigned int jz_sd_calc_clkrt(unsigned int rate)
{
unsigned int clkrt;
unsigned int clk_src = sd2_0 ? SD_CLOCK_HIGH : SD_CLOCK_FAST;
unsigned int clk_src = card.sd2plus ? SD_CLOCK_HIGH : SD_CLOCK_FAST;
clkrt = 0;
while (rate < clk_src)
@ -716,7 +715,7 @@ static int jz_sd_exec_cmd(struct sd_request *request)
events = SD_EVENT_RX_DATA_DONE;
break;
case 6:
case SD_SWITCH_FUNC:
if (num_6 < 2)
{
#if defined(SD_DMA_ENABLE)
@ -1086,7 +1085,6 @@ static int sd_init_card_state(struct sd_request *request)
(request->response[3+i*4]<< 8) | request->response[4+i*4]);
sd_parse_csd(&card);
sd2_0 = (card_extract_bits(card.csd, 127, 2) == 1);
logf("CSD: %08lx%08lx%08lx%08lx", card.csd[0], card.csd[1], card.csd[2], card.csd[3]);
DEBUG("SD card is ready");
@ -1155,7 +1153,7 @@ static int sd_select_card(void)
if (retval)
return retval;
if (sd2_0)
if (card.sd2plus)
{
retval = sd_read_switch(&request);
if (!retval)
@ -1188,7 +1186,6 @@ static int __sd_init_device(void)
/* Initialise card data as blank */
memset(&card, 0, sizeof(tCardInfo));
sd2_0 = 0;
num_6 = 0;
use_4bit = 0;
@ -1250,7 +1247,7 @@ static inline void sd_stop_transfer(void)
mutex_unlock(&sd_mtx);
}
int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
int sd_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
{
#ifdef HAVE_MULTIDRIVE
(void)drive;
@ -1276,7 +1273,8 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
if ((retval = sd_unpack_r1(&request, &r1)))
goto err;
if (sd2_0)
// XXX 64-bit
if (card.sd2plus)
{
sd_send_cmd(&request, SD_READ_MULTIPLE_BLOCK, start,
count, SD_BLOCK_SIZE, RESPONSE_R1, buf);
@ -1292,19 +1290,18 @@ int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
goto err;
}
last_disk_activity = current_tick;
sd_simple_cmd(&request, SD_STOP_TRANSMISSION, 0, RESPONSE_R1B);
if ((retval = sd_unpack_r1(&request, &r1)))
goto err;
err:
last_disk_activity = current_tick;
sd_stop_transfer();
return retval;
}
int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
{
#ifdef HAVE_MULTIDRIVE
(void)drive;
@ -1330,7 +1327,8 @@ int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const voi
if ((retval = sd_unpack_r1(&request, &r1)))
goto err;
if (sd2_0)
// XXX 64-bit
if (card.sd2plus)
{
sd_send_cmd(&request, SD_WRITE_MULTIPLE_BLOCK, start,
count, SD_BLOCK_SIZE, RESPONSE_R1,

View file

@ -57,8 +57,6 @@ static struct semaphore sd_wakeup[NUM_DRIVES];
static int use_4bit[NUM_DRIVES];
static int num_6[NUM_DRIVES];
static int sd2_0[NUM_DRIVES];
//#define DEBUG(x...) logf(x)
#define DEBUG(x, ...)
@ -698,7 +696,7 @@ static inline unsigned int jz_sd_calc_clkrt(const int drive, unsigned int rate)
unsigned int clkrt = 0;
unsigned int clk_src = cpu_frequency / __cpm_get_mscdiv(); /* MSC_CLK */
if (!sd2_0[drive] && rate > SD_CLOCK_FAST)
if (!card[drive].sd2plus && rate > SD_CLOCK_FAST)
rate = SD_CLOCK_FAST;
while (rate < clk_src)
@ -1192,7 +1190,6 @@ static int sd_init_card_state(const int drive, struct sd_request *request)
(request->response[3+i*4]<< 8) | request->response[4+i*4]);
sd_parse_csd(&card[drive]);
sd2_0[drive] = (card_extract_bits(card[drive].csd, 127, 2) == 1);
logf("CSD: %08lx%08lx%08lx%08lx", card[drive].csd[0], card[drive].csd[1], card[drive].csd[2], card[drive].csd[3]);
DEBUG("SD card is ready");
@ -1261,7 +1258,7 @@ static int sd_select_card(const int drive)
if (retval)
return retval;
if (sd2_0[drive])
if (card[drive].sd2plus)
{
retval = sd_read_switch(drive, &request);
if (!retval)
@ -1292,7 +1289,6 @@ static int __sd_init_device(const int drive)
/* Initialise card data as blank */
memset(&card[drive], 0, sizeof(tCardInfo));
sd2_0[drive] = 0;
num_6[drive] = 0;
use_4bit[drive] = 0;
active[drive] = 0;
@ -1402,7 +1398,7 @@ static inline void sd_stop_transfer(const int drive)
mutex_unlock(&sd_mtx[drive]);
}
int sd_transfer_sectors(IF_MD(const int drive,) unsigned long start, int count, void* buf, bool write)
int sd_transfer_sectors(IF_MD(const int drive,) sector_t start, int count, void* buf, bool write)
{
struct sd_request request;
struct sd_response_r1 r1;
@ -1427,11 +1423,12 @@ int sd_transfer_sectors(IF_MD(const int drive,) unsigned long start, int count,
if ((retval = sd_unpack_r1(&request, &r1)))
goto err;
// XXX 64-bit
sd_send_cmd(drive, &request,
(count > 1) ?
(write ? SD_WRITE_MULTIPLE_BLOCK : SD_READ_MULTIPLE_BLOCK) :
(write ? SD_WRITE_BLOCK : SD_READ_SINGLE_BLOCK),
sd2_0[drive] ? start : (start * SD_BLOCK_SIZE),
card[drive].sd2plus ? start : (start * SD_BLOCK_SIZE),
count, SD_BLOCK_SIZE, RESPONSE_R1, buf);
if ((retval = sd_unpack_r1(&request, &r1)))
goto err;
@ -1451,12 +1448,12 @@ err:
return retval;
}
int sd_read_sectors(IF_MD(int drive,) unsigned long start, int count, void* buf)
int sd_read_sectors(IF_MD(int drive,) sector_t start, int count, void* buf)
{
return sd_transfer_sectors(IF_MD(drive,) start, count, buf, false);
}
int sd_write_sectors(IF_MD(int drive,) unsigned long start, int count, const void* buf)
int sd_write_sectors(IF_MD(int drive,) sector_t start, int count, const void* buf)
{
return sd_transfer_sectors(IF_MD(drive,) start, count, (void*)buf, true);
}

View file

@ -844,7 +844,7 @@ int msc_cmd_send_csd(msc_drv* d)
d->cardinfo.csd[i] = req.response[i];
sd_parse_csd(&d->cardinfo);
if((req.response[0] >> 30) == 1)
if(d->cardinfo.sd2plus)
d->driver_flags |= MSC_DF_V2_CARD;
return 0;

View file

@ -51,7 +51,7 @@ static int sd_init_card(msc_drv* d)
}
static int sd_transfer(msc_drv* d, bool write,
unsigned long start, int count, void* buf)
sector_t start, int count, void* buf)
{
int status = -1;
@ -114,6 +114,7 @@ static int sd_transfer(msc_drv* d, bool write,
: SD_READ_MULTIPLE_BLOCK;
}
// XXX 64-bit
if(d->driver_flags & MSC_DF_V2_CARD)
req.argument = start;
else
@ -142,14 +143,14 @@ static int sd_transfer(msc_drv* d, bool write,
return status;
}
int sd_read_sectors(IF_MD(int drive,) unsigned long start,
int sd_read_sectors(IF_MD(int drive,) sector_t start,
int count, void* buf)
{
return sd_transfer(sd_to_msc[IF_MD_DRV(drive)], false,
start, count, buf);
}
int sd_write_sectors(IF_MD(int drive,) unsigned long start,
int sd_write_sectors(IF_MD(int drive,) sector_t start,
int count, const void* buf)
{
return sd_transfer(sd_to_msc[IF_MD_DRV(drive)], true,