# HG changeset patch # User Paul Boddie # Date 1714433872 -7200 # Node ID 3c7cc99ed90f9fe79a04a2e168b564cc1d0f80d1 # Parent 6c93b2db3263f050cb886e20f660619eff366c60 Widened various address and size values to avoid overflow/truncation issues. Fixed high-capacity card support by changing the initialisation procedure. diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/include/msc-defs.h --- a/pkg/devices/lib/msc/include/msc-defs.h Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/include/msc-defs.h Tue Apr 30 01:37:52 2024 +0200 @@ -415,7 +415,6 @@ App_command_sd_send_op_cond = 41, App_command_set_clr_card_detect = 42, App_command_send_scr = 51, - App_command_read_ocr = 58, }; enum Bus_width_bits : unsigned diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/include/msc-generic.h --- a/pkg/devices/lib/msc/include/msc-generic.h Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/include/msc-generic.h Tue Apr 30 01:37:52 2024 +0200 @@ -132,7 +132,7 @@ uint8_t num_cards(); uint32_t read(uint8_t card, struct dma_region *region, - uint32_t address, uint32_t count); + uint64_t address, uint64_t count); uint32_t read_blocks(uint8_t card, struct dma_region *region, uint32_t block_address, uint32_t block_count); diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/include/msc-jz4780.h --- a/pkg/devices/lib/msc/include/msc-jz4780.h Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/include/msc-jz4780.h Tue Apr 30 01:37:52 2024 +0200 @@ -102,7 +102,7 @@ uint32_t jz4780_msc_read(void *msc_channel, uint8_t card, struct dma_region *region, - uint32_t address, uint32_t count); + uint64_t address, uint64_t count); uint32_t jz4780_msc_read_blocks(void *msc_channel, uint8_t card, struct dma_region *region, diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/include/msc-x1600.h --- a/pkg/devices/lib/msc/include/msc-x1600.h Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/include/msc-x1600.h Tue Apr 30 01:37:52 2024 +0200 @@ -104,7 +104,7 @@ uint32_t x1600_msc_read(void *msc_channel, uint8_t card, struct dma_region *region, - uint32_t address, uint32_t count); + uint64_t address, uint64_t count); uint32_t x1600_msc_read_blocks(void *msc_channel, uint8_t card, struct dma_region *region, diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/src/common.cc --- a/pkg/devices/lib/msc/src/common.cc Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/src/common.cc Tue Apr 30 01:37:52 2024 +0200 @@ -557,6 +557,10 @@ continue; } while (!(r3.ocr & Ocr_card_powered_up)); + + // Set the OCR in the current card since we need the CCS indicator. + + _cards[_num_cards].ocr = ocr; } void @@ -593,8 +597,6 @@ struct R2 r2; struct R6 r6; - _num_cards = 0; - while (send_command(Command_all_send_cid, 0)) { read_response((uint16_t *) &r2, Response_size_R2); @@ -650,7 +652,7 @@ // Employ 1-based relative addressing. if (!send_command(Command_send_csd, _cards[card].rca << 16)) - return; + continue; read_response((uint16_t *) &r2, Response_size_R2); @@ -689,15 +691,6 @@ printf("read access time (1 2): %d %d\n", csd->data_read_access_time_1, csd->data_read_access_time_2); printf("DSR: %s\n", csd->dsr_implemented ? "yes" : "no"); - - // Query the OCR again now that we can associate it with a specific card. - - if (!send_app_command(App_command_read_ocr, 0)) - return; - - read_response((uint16_t *) &r3, Response_size_R3); - - _cards[card].ocr = r3.ocr; } } @@ -723,10 +716,15 @@ send_command(Command_go_idle_state, 0); + // Reset the number of SDMEM and MMC cards prior to identification. + + _num_cards = 0; + if (check_sd()) { init_sdio(); init_sdmem(); + identify_cards(); } init_mmc(); @@ -808,7 +806,7 @@ uint32_t Msc_channel::read(uint8_t card, struct dma_region *region, - uint32_t address, uint32_t count) + uint64_t address, uint64_t count) { uint32_t block_size = 1 << _cards[card].csd.read_blocklen; diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/src/jz4780.cc --- a/pkg/devices/lib/msc/src/jz4780.cc Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/src/jz4780.cc Tue Apr 30 01:37:52 2024 +0200 @@ -128,7 +128,7 @@ uint32_t jz4780_msc_read(void *msc_channel, uint8_t card, struct dma_region *region, - uint32_t address, uint32_t count) + uint64_t address, uint64_t count) { return static_cast(msc_channel)->read(card, region, address, count); diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/devices/lib/msc/src/x1600.cc --- a/pkg/devices/lib/msc/src/x1600.cc Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/devices/lib/msc/src/x1600.cc Tue Apr 30 01:37:52 2024 +0200 @@ -145,7 +145,7 @@ uint32_t x1600_msc_read(void *msc_channel, uint8_t card, struct dma_region *region, - uint32_t address, uint32_t count) + uint64_t address, uint64_t count) { return static_cast(msc_channel)->read(card, region, address, count); diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/landfall-examples/msc_block_server/msc_region_accessor.cc --- a/pkg/landfall-examples/msc_block_server/msc_region_accessor.cc Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/landfall-examples/msc_block_server/msc_region_accessor.cc Tue Apr 30 01:37:52 2024 +0200 @@ -34,8 +34,8 @@ { // NOTE: Block size assumption employed. - _start = start_block * 512; - _size = num_blocks * 512; + _start = start_block * (offset_t) 512; + _size = num_blocks * (offset_t) 512; } /* Return the size of the file. */ diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/landfall-examples/msc_block_server/msc_region_accessor.h --- a/pkg/landfall-examples/msc_block_server/msc_region_accessor.h Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/landfall-examples/msc_block_server/msc_region_accessor.h Tue Apr 30 01:37:52 2024 +0200 @@ -21,8 +21,6 @@ #pragma once -#include - #include #include "msc_region_operations.h" @@ -36,7 +34,7 @@ { protected: MscRegionOperations *_ops; - uint32_t _start; + offset_t _start; offset_t _size; /* Data transfer helper methods. */ diff -r 6c93b2db3263 -r 3c7cc99ed90f pkg/landfall-examples/msc_block_server/msc_region_operations.cc --- a/pkg/landfall-examples/msc_block_server/msc_region_operations.cc Tue Apr 30 01:34:57 2024 +0200 +++ b/pkg/landfall-examples/msc_block_server/msc_region_operations.cc Tue Apr 30 01:37:52 2024 +0200 @@ -92,7 +92,7 @@ l4_cache_inv_data(vaddr, vaddr + size); - _msc_channel->read(_card, ®ion, (uint32_t) filepos, (uint32_t) size); + _msc_channel->read(_card, ®ion, filepos, size); } void MscRegionOperations::write(l4_addr_t vaddr, l4re_dma_space_dma_addr_t paddr,