From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hannes Petermaier Date: Tue, 05 Aug 2014 10:55:22 +0200 Subject: [U-Boot] mmc: question about capacity detection In-Reply-To: <53E085BF.709@petermaier.org> References: <53E085BF.709@petermaier.org> Message-ID: <53E09BFA.1090401@petermaier.org> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 2014-08-05 09:20, Hannes Petermaier wrote: > hi folks, > > i am actually trying to enable the "enhanced data area" on an 4GB emmc > device, this i've done successfully with the linux mmc-utils and the > card has after this "partitioning" 2GB user-partition. > > Linux kernel deals correctly with the card. > > U-Boot doesn't: > > " > MMC: block number 0x301 exceeds max(0x0) > spl: mmc blk read err - 0 > ### ERROR ### Please RESET the board ### > " > > So i debugged around and found the capacity-calculation, which i don't > fully understand. > " > if (mmc->high_capacity) { > csize = (mmc->csd[1] & 0x3f) << 16 > | (mmc->csd[2] & 0xffff0000) >> 16; > cmult = 8; > } else { > csize = (mmc->csd[1] & 0x3ff) << 2 > | (mmc->csd[2] & 0xc0000000) >> 30; > cmult = (mmc->csd[2] & 0x00038000) >> 15; > } > " > The else path does for my opinion the right calculation according the > mmc-specification, the "high_capacity" path i do not understand at > all, neither i found some specification for this. > > In fact my 4GB card (with 2GB enhanced area) works only with "the > else" path. > my csd Registers: > > MMC-card dection: > ocr : 0xc0ff8080 > csd[0] : 0xd04f0132 > csd[1] : 0x0f5a13ff > csd[2] : 0xffffffe7 > csd[3] : 0x8a4000f1 > c_size : 0x00000000003fffff > c_mult : 0x0000000000000008 > > U-Boot (BuR V2.0)# mmc info > Device: OMAP SD/MMC > Manufacturer ID: fe > OEM: 14e > Name: MMC04 > Tran Speed: 52000000 > Rd Block Len: 512 > MMC version 4.41 > High Capacity: Yes > Capacity: 4 TiB > Bus Width: 1-bit > > any ideas ? > > best regards, > Hannes > I've digged a bit deeper and found an (for me, as newbie in this) interesting webpage: http://www.hjreggel.net/cardspeed/special-sd.html there i've found the key to understand the "high_capacity" path: "...In CSD Version 2.0, the C_SIZE field was extended to 22 bit. The C_SIZE_MULT was dropped, assuming a preset multiplier of 2^10 . The READ_BL_LEN was kept, but the only value allowed is 9, indicating a block length of 512 bytes." So the code should be as following: - if (mmc->high_capacity) { + if (mmc->high_capacity && mmc->read_bl_len == MMC_MAX_BLOCK_LEN) { i'am correct in my thinking ? please some comment. if yes - i will format a patch for this best regards, Hannes