[PATCH][U-Boot] glamo-mmc: Enable reading from cards above 4 GiB
Rask Ingemann Lambertsen
rask at sygehus.dk
Mon Mar 23 01:03:53 CET 2009
This patch makes it possible to load e.g. kernels located above 4 GiB on
SDHC cards. The block number is no longer converted to a byte offset on SDHC
cards.
Signed-off-by: Rask Ingemann Lambertsen <rask at sygehus.dk>
---
diff --git a/board/neo1973/gta02/glamo-mmc.c b/board/neo1973/gta02/glamo-mmc.c
index 33dc6bb..adb0d8f 100644
--- a/board/neo1973/gta02/glamo-mmc.c
+++ b/board/neo1973/gta02/glamo-mmc.c
@@ -89,18 +89,6 @@ unsigned char CRC7(u8 * pu8, int cnt)
return (crc << 1) | 1;
}
-ulong mmc_bread(int dev_num, ulong blknr, ulong blkcnt, void *dst)
-{
- ulong src = blknr * MMC_BLOCK_SIZE;
-
- if (!blkcnt)
- return 0;
-
-/* printf("mmc_bread(%d, %ld, %ld, %p)\n", dev_num, blknr, blkcnt, dst); */
- mmc_read(src, dst, blkcnt * MMC_BLOCK_SIZE);
- return blkcnt;
-}
-
/* MMC_DEFAULT_RCA should probably be just 1, but this may break other code
that expects it to be shifted. */
static u_int16_t rca = MMC_DEFAULT_RCA >> 16;
@@ -406,7 +394,8 @@ static u_int8_t ldo_voltage(unsigned int millivolts)
return millivolts / 100;
}
-int mmc_read(ulong src, uchar *dst, int size)
+static
+int glamo_mmc_read(ulong src, uint blksize, uchar *dst, int size)
{
int resp;
u8 response[16];
@@ -429,17 +418,23 @@ int mmc_read(ulong src, uchar *dst, int size)
while (size) {
switch (card_type) {
case CARDTYPE_SDHC: /* block addressing */
+ if (blksize != MMC_BLOCK_SIZE) {
+ printf("Bad align on src\n");
+ return 0;
+ }
resp = mmc_cmd(MMC_READ_SINGLE_BLOCK,
- src >> MMC_BLOCK_SIZE_BITS,
+ src,
MMC_CMD_ADTC | MMC_RSP_R1 |
MMC_DATA_READ, MMC_BLOCK_SIZE, 1, 0,
(u16 *)&response[0]);
+ src += 1;
break;
default: /* byte addressing */
- resp = mmc_cmd(MMC_READ_SINGLE_BLOCK, src,
+ resp = mmc_cmd(MMC_READ_SINGLE_BLOCK, src * blksize,
MMC_CMD_ADTC | MMC_RSP_R1 | MMC_DATA_READ,
MMC_BLOCK_SIZE, 1, 0,
(u16 *)&response[0]);
+ src += MMC_BLOCK_SIZE / blksize;
break;
}
do_pio_read((u16 *)dst, MMC_BLOCK_SIZE >> 1);
@@ -449,11 +444,31 @@ int mmc_read(ulong src, uchar *dst, int size)
else
size = 0;
dst += MMC_BLOCK_SIZE;
- src += MMC_BLOCK_SIZE;
}
return size_original;
}
+ulong mmc_bread(int dev_num, ulong blknr, ulong blkcnt, void *dst)
+{
+ ulong size = blkcnt * MMC_BLOCK_SIZE;
+
+ if (!blkcnt)
+ return 0;
+
+/* printf("mmc_bread(%d, %ld, %ld, %p)\n", dev_num, blknr, blkcnt, dst); */
+ glamo_mmc_read(blknr, MMC_BLOCK_SIZE, dst, size);
+ return blkcnt;
+}
+
+int mmc_read(ulong src, uchar *dst, int size)
+{
+ if (src & (MMC_BLOCK_SIZE - 1))
+ return (glamo_mmc_read (src, 1, dst, size));
+ else
+ return (glamo_mmc_read (src >> MMC_BLOCK_SIZE_BITS,
+ MMC_BLOCK_SIZE, dst, size));
+}
+
int mmc_write(uchar *src, ulong dst, int size)
{
int resp;
--
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year
More information about the openmoko-kernel
mailing list