summaryrefslogtreecommitdiff
path: root/firmware/common/disk_cache.c
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2024-07-05 16:00:30 -0400
committerSolomon Peachy <pizza@shaftnet.org>2024-08-12 14:23:44 -0400
commit15e52374698ba7395ff0ece0d3d70435a66406c4 (patch)
tree778f81817b2381decc920b49242e91f994f2d8ee /firmware/common/disk_cache.c
parent9ff308a589f3655453fe047d9b08ca5e2a01f06d (diff)
downloadrockbox-15e52374698ba7395ff0ece0d3d70435a66406c4.tar.gz
rockbox-15e52374698ba7395ff0ece0d3d70435a66406c4.zip
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
Diffstat (limited to 'firmware/common/disk_cache.c')
-rw-r--r--firmware/common/disk_cache.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/firmware/common/disk_cache.c b/firmware/common/disk_cache.c
index 9e4dee6a91..74c4d5f35b 100644
--- a/firmware/common/disk_cache.c
+++ b/firmware/common/disk_cache.c
@@ -71,12 +71,12 @@ struct disk_cache_entry
71#ifdef HAVE_MULTIVOLUME 71#ifdef HAVE_MULTIVOLUME
72 unsigned char volume; /* volume of sector */ 72 unsigned char volume; /* volume of sector */
73#endif 73#endif
74 unsigned long sector; /* cached disk sector number */ 74 sector_t sector; /* cached disk sector number */
75}; 75};
76 76
77BITARRAY_TYPE_DECLARE(cache_map_entry_t, cache_map, DC_NUM_ENTRIES) 77BITARRAY_TYPE_DECLARE(cache_map_entry_t, cache_map, DC_NUM_ENTRIES)
78 78
79static inline unsigned int map_sector(unsigned long sector) 79static inline unsigned int map_sector(sector_t sector)
80{ 80{
81 /* keep sector hash simple for now */ 81 /* keep sector hash simple for now */
82 return sector % DC_MAP_NUM_ENTRIES; 82 return sector % DC_MAP_NUM_ENTRIES;
@@ -172,7 +172,7 @@ static inline void cache_discard_entry(struct disk_cache_entry *dce,
172/* search the cache for the specified sector, returning a buffer, either 172/* search the cache for the specified sector, returning a buffer, either
173 to the specified sector, if it exists, or a new/evicted entry that must 173 to the specified sector, if it exists, or a new/evicted entry that must
174 be filled */ 174 be filled */
175void * dc_cache_probe(IF_MV(int volume,) unsigned long sector, 175void * dc_cache_probe(IF_MV(int volume,) sector_t sector,
176 unsigned int *flagsp) 176 unsigned int *flagsp)
177{ 177{
178 unsigned int mapnum = map_sector(sector); 178 unsigned int mapnum = map_sector(sector);
@@ -200,7 +200,7 @@ void * dc_cache_probe(IF_MV(int volume,) unsigned long sector,
200 if (old_flags) 200 if (old_flags)
201 { 201 {
202 int old_volume = IF_MV_VOL(dce->volume); 202 int old_volume = IF_MV_VOL(dce->volume);
203 unsigned long sector = dce->sector; 203 sector_t sector = dce->sector;
204 unsigned int old_mapnum = map_sector(sector); 204 unsigned int old_mapnum = map_sector(sector);
205 205
206 if (old_flags & DCE_DIRTY) 206 if (old_flags & DCE_DIRTY)