On Sat, Sep 20, 2014 at 06:01:51PM +0200, Cédric Tessier wrote:
> Hi,
>
> I've bought a BeagleBone Black rev. C board, and I was trying to install
> OpenBSD on it, but the internal eMMC was causing errors.
>
> sdmmc1: unknown CARD_TYPE 0x17
> scsibus1 at sdmmc1: 2 targets, initiator 0
> sd1 at scsibus1 targ 1 lun 0: <SD/MMC, Drive #01, > SCSI2 0/direct fixed
> sd1: 1024MB, 512 bytes/sector, 2097152 sectors
>
> Card type and sectors count were wrong, and accessing the device was
> causing I/O errors.
>
> I've investigated the problem, and it looks like the support of
> High Capacity eMMC (> 2GB) is missing.
>
> I've written a quick and dirty patch (tested on 5.5 and snapshot) which fix
> all my issues.
>
> Modifications:
> - mask reserved bits for card type value
These bits do not appear to be reserved. In your case bit 4
seems to indicate HS200/200 MHz clock capable.
Bit 5 is HS400/400 MHz clock capable.
> - read sectors count from EXT_CSD
> - fix sectors count and enable SDHC if High Capacity eMMC is detected
Is the old method of reading the block length still supported
with emmc and csd ver > 2? That wasn't the case for normal sd card.
It seems the emmc situation is a bit different as the capacity
stored in a seperate place.
> +
> + if (ext_csd[EXT_CSD_REV] >= 2) {
> + sectors = ext_csd[EXT_CSD_SEC_COUNT + 0] << 0 |
> + ext_csd[EXT_CSD_SEC_COUNT + 1]
> << 8 |
> + ext_csd[EXT_CSD_SEC_COUNT + 2]
> << 16 |
> + ext_csd[EXT_CSD_SEC_COUNT + 3]
> << 24;
> + /*
> + * High capacity MMC seems to report a "magic" 4096 *
> 512 bytes
> + * capacity in csd, but ext_csd contains the real
> sectors count
> + */
> + if ((sf->csd.capacity == (4096 * 512)) &&
> + (sectors > (2u * 1024 * 1024 * 1024) / 512)) {
> + sf->flags |= SFF_SDHC;
> + sf->csd.capacity = sectors;
> + }
I think this should change to
if (sectors > (2u * 1024 * 1024 * 1024) / 512)
sf->flags |= SFF_SDHC;
sf->csd.capacity = sectors;
All csd rev > 2 cards should report valid sectors in the extended space.