summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/keymile/common/common.c156
-rw-r--r--board/keymile/scripts/README23
-rw-r--r--board/keymile/scripts/debug-arm-env.txt2
-rw-r--r--board/keymile/scripts/debug-common-env.txt9
-rw-r--r--board/keymile/scripts/debug-ppc-env.txt2
-rw-r--r--common/cmd_mmc.c224
-rw-r--r--drivers/mmc/fsl_esdhc.c1
-rw-r--r--drivers/mmc/mmc.c35
-rw-r--r--drivers/mmc/mmc_spi.c5
-rw-r--r--drivers/mmc/omap_hsmmc.c1
-rw-r--r--include/configs/km/keymile-common.h159
-rw-r--r--include/configs/km/km-powerpc.h12
-rw-r--r--include/configs/km/km_arm.h5
-rw-r--r--include/mmc.h10
14 files changed, 402 insertions, 242 deletions
diff --git a/board/keymile/common/common.c b/board/keymile/common/common.c
index 9adfefa..9be4c72 100644
--- a/board/keymile/common/common.c
+++ b/board/keymile/common/common.c
@@ -32,6 +32,7 @@
#include <net.h>
#include <netdev.h>
#include <asm/io.h>
+#include <linux/ctype.h>
#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
#include <libfdt.h>
@@ -716,3 +717,158 @@ static int do_setboardid(cmd_tbl_t *cmdtp, int flag, int argc,
U_BOOT_CMD(km_setboardid, 1, 0, do_setboardid, "setboardid", "read out bid and "
"hwkey from IVM and set in environment");
+
+/*
+ * command km_checkbidhwk
+ * if "boardid" and "hwkey" are not already set in the environment, do:
+ * if a "boardIdListHex" exists in the environment:
+ * - read ivm data for boardid and hwkey
+ * - compare each entry of the boardIdListHex with the
+ * IVM data:
+ * if match:
+ * set environment variables boardid, boardId,
+ * hwkey, hwKey to the found values
+ * both (boardid and boardId) are set because
+ * they might be used differently in the
+ * application and in the init scripts (?)
+ * return 0 in case of match, 1 if not match or error
+ */
+int do_checkboardidhwk(cmd_tbl_t *cmdtp, int flag, int argc,
+ char *const argv[])
+{
+ unsigned long ivmbid = 0, ivmhwkey = 0;
+ unsigned long envbid = 0, envhwkey = 0;
+ char *p;
+ int verbose = argc > 1 && *argv[1] == 'v';
+ int rc = 0;
+
+ /*
+ * first read out the real inventory values, these values are
+ * already stored in the local hush variables
+ */
+ p = get_local_var("IVM_BoardId");
+ if (p == NULL) {
+ printf("can't get the IVM_Boardid\n");
+ return 1;
+ }
+ rc = strict_strtoul(p, 16, &ivmbid);
+
+ p = get_local_var("IVM_HWKey");
+ if (p == NULL) {
+ printf("can't get the IVM_HWKey\n");
+ return 1;
+ }
+ rc = strict_strtoul(p, 16, &ivmhwkey);
+
+ if (!ivmbid || !ivmhwkey) {
+ printf("Error: IVM_BoardId and/or IVM_HWKey not set!\n");
+ return rc;
+ }
+
+ /* now try to read values from environment if available */
+ p = getenv("boardid");
+ if (p != NULL)
+ rc = strict_strtoul(p, 16, &envbid);
+ p = getenv("hwkey");
+ if (p != NULL)
+ rc = strict_strtoul(p, 16, &envhwkey);
+
+ if (rc != 0) {
+ printf("strict_strtoul returns error: %d", rc);
+ return rc;
+ }
+
+ if (!envbid || !envhwkey) {
+ /*
+ * BoardId/HWkey not available in the environment, so try the
+ * environment variable for BoardId/HWkey list
+ */
+ char *bidhwklist = getenv("boardIdListHex");
+
+ if (bidhwklist) {
+ int found = 0;
+ char *rest = bidhwklist;
+ char *endp;
+
+ if (verbose) {
+ printf("IVM_BoardId: %ld, IVM_HWKey=%ld\n",
+ ivmbid, ivmhwkey);
+ printf("boardIdHwKeyList: %s\n",
+ bidhwklist);
+ }
+ while (!found) {
+ /* loop over each bid/hwkey pair in the list */
+ unsigned long bid = 0;
+ unsigned long hwkey = 0;
+
+ while (*rest && !isxdigit(*rest))
+ rest++;
+ /*
+ * use simple_strtoul because we need &end and
+ * we know we got non numeric char at the end
+ */
+ bid = simple_strtoul(rest, &endp, 16);
+ /* BoardId and HWkey are separated with a "_" */
+ if (*endp == '_') {
+ rest = endp + 1;
+ /*
+ * use simple_strtoul because we need
+ * &end
+ */
+ hwkey = simple_strtoul(rest, &endp, 16);
+ rest = endp;
+ while (*rest && !isxdigit(*rest))
+ rest++;
+ }
+ if ((!bid) || (!hwkey)) {
+ /* end of list */
+ break;
+ }
+ if (verbose) {
+ printf("trying bid=0x%lX, hwkey=%ld\n",
+ bid, hwkey);
+ }
+ /*
+ * Compare the values of the found entry in the
+ * list with the valid values which are stored
+ * in the inventory eeprom. If they are equal
+ * store the values in environment variables
+ * and save the environment.
+ * This can only happen once for the lifetime
+ * of a board, because once saved the function
+ * will never reach the while loop.
+ */
+ if ((bid == ivmbid) && (hwkey == ivmhwkey)) {
+ char buf[10];
+
+ found = 1;
+ envbid = bid;
+ envhwkey = hwkey;
+ sprintf(buf, "%lx", bid);
+ setenv("boardid", buf);
+ sprintf(buf, "%lx", hwkey);
+ setenv("hwkey", buf);
+ saveenv();
+ }
+ } /* end while( ! found ) */
+ }
+ }
+
+ /* compare now the values */
+ if ((ivmbid == envbid) && (ivmhwkey == envhwkey)) {
+ printf("boardid=0x%3lX, hwkey=%ld\n", envbid, envhwkey);
+ rc = 0; /* match */
+ } else {
+ printf("Error: env bId=0x%3lX, hwKey=%ld\n", envbid, envhwkey);
+ printf(" IVM bId=0x%3lX, hwKey=%ld\n", ivmbid, ivmhwkey);
+ rc = 1; /* don't match */
+ }
+ return rc;
+}
+
+U_BOOT_CMD(km_checkbidhwk, 2, 0, do_checkboardidhwk,
+ "check boardid and hwkey",
+ "[v]\n - check environment parameter "\
+ "\"boardIdListHex\" against stored boardid and hwkey "\
+ "from the IVM\n v: verbose output"
+);
diff --git a/board/keymile/scripts/README b/board/keymile/scripts/README
new file mode 100644
index 0000000..86c2b5a
--- /dev/null
+++ b/board/keymile/scripts/README
@@ -0,0 +1,23 @@
+debug-common-env.txt
+============================
+This file defines environment variables which are valid for powerpc boards
+and for arm boards.
+
+addramfs: add phram device for the rootfilesysten in ram
+develop: for development, laod kernel via tftp and mount rootfs via NFS
+nfsargs: default arguments for nfs boot
+ramfs: load rootfilesystem in RAM kernel
+rootfsfile: loacation of the rootfs file for ramfs
+setramfspram: compute PRAM size for ramfs target
+setrootfsaddr: compute rootfilesystem address for phram
+tftpkernel: load a kernel with tftp into ram
+tftpramfs: load rootfs with tftp into ram
+
+debug-ppc-env.txt
+============================
+fdt_file: location of the dtb file on the tftp server
+tftpfdt: load dtb file and set fdt address
+
+debug-arm-env.txt
+============================
+tftpfdt: for arm only a dummy variable, because we have no fdt on arm
diff --git a/board/keymile/scripts/debug-arm-env.txt b/board/keymile/scripts/debug-arm-env.txt
new file mode 100644
index 0000000..84498af
--- /dev/null
+++ b/board/keymile/scripts/debug-arm-env.txt
@@ -0,0 +1,2 @@
+debug_env_common=tftpboot 0x200000 scripts/debug-common-env.txt && env import -t 0x200000 ${filesize}
+tftpfdt=true
diff --git a/board/keymile/scripts/debug-common-env.txt b/board/keymile/scripts/debug-common-env.txt
new file mode 100644
index 0000000..1fd4b0c
--- /dev/null
+++ b/board/keymile/scripts/debug-common-env.txt
@@ -0,0 +1,9 @@
+addramfs=setenv bootargs "${bootargs} phram.phram=rootfs${boot_bank},${rootfsaddr},${rootfssize}"
+develop=setenv subbootcmds "tftpfdt tftpkernel nfsargs ${commonargs} boot " && setenv bootcmd 'run bootrunner' && setenv altbootcmd 'run bootcmd' && km_setboardid && saveenv && reset
+nfsargs=setenv bootargs ubi.mtd=ubi0 root=/dev/nfs rw nfsroot=${serverip}:${rootpath}
+ramfs=setenv actual_bank -1 && setenv subbootcmds "tftpfdt tftpkernel setrootfsaddr tftpramfs flashargs ${commonargs} addpanic addramfs boot " && setenv bootcmd 'run bootrunner' && setenv altbootcmd 'run bootcmd' && run setboardid && run setramfspram && run setpnvramaddr && saveenv && reset
+rootfsfile=${hostname}/rootfsImage
+setramfspram=setexpr value 0 + ${reservedpram} && setexpr value 0x${value} + ${rootfssize} && setexpr value 0x${value} + ${varsize} && setexpr value 0x${value} + ${pnvramsize} && setexpr value 0x${value} / 0x400 && setenv pram 0x${value}
+tftpkernel=tftpboot ${kernel_addr_r} ${hostname}/uImage && setenv actual_kernel_addr ${kernel_addr_r}
+tftpramfs=tftpboot ${rootfsaddr} ${hostname}/rootfsImage && setenv loadaddr
+setrootfsaddr=setexpr value ${pnvramsize} - ${rootfssize} && setenv rootfsaddr 0x${value}
diff --git a/board/keymile/scripts/debug-ppc-env.txt b/board/keymile/scripts/debug-ppc-env.txt
new file mode 100644
index 0000000..3c06ff1
--- /dev/null
+++ b/board/keymile/scripts/debug-ppc-env.txt
@@ -0,0 +1,2 @@
+debug_env_common=tftpboot 0x200000 scripts/debug-common-env.txt && env import -t 0x200000 ${filesize}
+tftpfdt=tftpboot ${fdt_addr_r} ${hostname}/${hostname}.dtb && setenv actual_fdt_addr ${fdt_addr_r}
diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
index 6166749..176646d 100644
--- a/common/cmd_mmc.c
+++ b/common/cmd_mmc.c
@@ -25,9 +25,8 @@
#include <command.h>
#include <mmc.h>
-#ifndef CONFIG_GENERIC_MMC
static int curr_device = -1;
-
+#ifndef CONFIG_GENERIC_MMC
int do_mmc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int dev;
@@ -113,140 +112,193 @@ static void print_mmcinfo(struct mmc *mmc)
int do_mmcinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
struct mmc *mmc;
- int dev_num;
- if (argc < 2)
- dev_num = 0;
- else
- dev_num = simple_strtoul(argv[1], NULL, 0);
+ if (curr_device < 0) {
+ if (get_mmc_num() > 0)
+ curr_device = 0;
+ else {
+ puts("No MMC device available\n");
+ return 1;
+ }
+ }
- mmc = find_mmc_device(dev_num);
+ mmc = find_mmc_device(curr_device);
if (mmc) {
mmc_init(mmc);
print_mmcinfo(mmc);
+ return 0;
+ } else {
+ printf("no mmc device at slot %x\n", curr_device);
+ return 1;
}
-
- return 0;
}
U_BOOT_CMD(
- mmcinfo, 2, 0, do_mmcinfo,
+ mmcinfo, 1, 0, do_mmcinfo,
"display MMC info",
- "<dev num>\n"
" - device number of the device to dislay info of\n"
""
);
int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
- int rc = 0;
+ if (argc < 2)
+ return cmd_usage(cmdtp);
- switch (argc) {
- case 3:
- if (strcmp(argv[1], "rescan") == 0) {
- int dev = simple_strtoul(argv[2], NULL, 10);
- struct mmc *mmc = find_mmc_device(dev);
+ if (curr_device < 0) {
+ if (get_mmc_num() > 0)
+ curr_device = 0;
+ else {
+ puts("No MMC device available\n");
+ return 1;
+ }
+ }
- if (!mmc)
- return 1;
+ if (strcmp(argv[1], "rescan") == 0) {
+ struct mmc *mmc = find_mmc_device(curr_device);
- mmc_init(mmc);
+ if (!mmc) {
+ printf("no mmc device at slot %x\n", curr_device);
+ return 1;
+ }
+ mmc->has_init = 0;
+ mmc_init(mmc);
+
+ return 0;
+ } else if (strncmp(argv[1], "part", 4) == 0) {
+ block_dev_desc_t *mmc_dev;
+ struct mmc *mmc = find_mmc_device(curr_device);
+
+ if (!mmc) {
+ printf("no mmc device at slot %x\n", curr_device);
+ return 1;
+ }
+ mmc_init(mmc);
+ mmc_dev = mmc_get_dev(curr_device);
+ if (mmc_dev != NULL &&
+ mmc_dev->type != DEV_TYPE_UNKNOWN) {
+ print_part(mmc_dev);
return 0;
- } else if (strncmp(argv[1], "part", 4) == 0) {
- int dev = simple_strtoul(argv[2], NULL, 10);
- block_dev_desc_t *mmc_dev;
- struct mmc *mmc = find_mmc_device(dev);
+ }
- if (!mmc) {
- puts("no mmc devices available\n");
+ puts("get mmc type error!\n");
+ return 1;
+ } else if (strcmp(argv[1], "list") == 0) {
+ print_mmc_devices('\n');
+ return 0;
+ } else if (strcmp(argv[1], "dev") == 0) {
+ int dev, part = -1;
+ struct mmc *mmc;
+
+ if (argc == 2)
+ dev = curr_device;
+ else if (argc == 3)
+ dev = simple_strtoul(argv[2], NULL, 10);
+ else if (argc == 4) {
+ dev = (int)simple_strtoul(argv[2], NULL, 10);
+ part = (int)simple_strtoul(argv[3], NULL, 10);
+ if (part > PART_ACCESS_MASK) {
+ printf("#part_num shouldn't be larger"
+ " than %d\n", PART_ACCESS_MASK);
return 1;
}
- mmc_init(mmc);
- mmc_dev = mmc_get_dev(dev);
- if (mmc_dev != NULL &&
- mmc_dev->type != DEV_TYPE_UNKNOWN) {
- print_part(mmc_dev);
- return 0;
- }
+ } else
+ return cmd_usage(cmdtp);
- puts("get mmc type error!\n");
+ mmc = find_mmc_device(dev);
+ if (!mmc) {
+ printf("no mmc device at slot %x\n", dev);
return 1;
}
- case 0:
- case 1:
- case 4:
- return cmd_usage(cmdtp);
+ mmc_init(mmc);
+ if (part != -1) {
+ int ret;
+ if (mmc->part_config == MMCPART_NOAVAILABLE) {
+ printf("Card doesn't support part_switch\n");
+ return 1;
+ }
- case 2:
- if (!strcmp(argv[1], "list")) {
- print_mmc_devices('\n');
- return 0;
+ if (part != mmc->part_num) {
+ ret = mmc_switch_part(dev, part);
+ if (!ret)
+ mmc->part_num = part;
+
+ printf("switch to partions #%d, %s\n",
+ part, (!ret) ? "OK" : "ERROR");
+ }
+ }
+ curr_device = dev;
+ if (mmc->part_config == MMCPART_NOAVAILABLE)
+ printf("mmc%d is current device\n", curr_device);
+ else
+ printf("mmc%d(part %d) is current device\n",
+ curr_device, mmc->part_num);
+
+ return 0;
+ } else if (strcmp(argv[1], "read") == 0) {
+ void *addr = (void *)simple_strtoul(argv[2], NULL, 16);
+ u32 cnt = simple_strtoul(argv[4], NULL, 16);
+ u32 n;
+ u32 blk = simple_strtoul(argv[3], NULL, 16);
+ struct mmc *mmc = find_mmc_device(curr_device);
+
+ if (!mmc) {
+ printf("no mmc device at slot %x\n", curr_device);
+ return 1;
}
- return 1;
- default: /* at least 5 args */
- if (strcmp(argv[1], "read") == 0) {
- int dev = simple_strtoul(argv[2], NULL, 10);
- void *addr = (void *)simple_strtoul(argv[3], NULL, 16);
- u32 cnt = simple_strtoul(argv[5], NULL, 16);
- u32 n;
- u32 blk = simple_strtoul(argv[4], NULL, 16);
- struct mmc *mmc = find_mmc_device(dev);
-
- if (!mmc)
- return 1;
- printf("\nMMC read: dev # %d, block # %d, count %d ... ",
- dev, blk, cnt);
+ printf("\nMMC read: dev # %d, block # %d, count %d ... ",
+ curr_device, blk, cnt);
- mmc_init(mmc);
+ mmc_init(mmc);
- n = mmc->block_dev.block_read(dev, blk, cnt, addr);
+ n = mmc->block_dev.block_read(curr_device, blk, cnt, addr);
- /* flush cache after read */
- flush_cache((ulong)addr, cnt * 512); /* FIXME */
+ /* flush cache after read */
+ flush_cache((ulong)addr, cnt * 512); /* FIXME */
- printf("%d blocks read: %s\n",
+ printf("%d blocks read: %s\n",
n, (n==cnt) ? "OK" : "ERROR");
- return (n == cnt) ? 0 : 1;
- } else if (strcmp(argv[1], "write") == 0) {
- int dev = simple_strtoul(argv[2], NULL, 10);
- void *addr = (void *)simple_strtoul(argv[3], NULL, 16);
- u32 cnt = simple_strtoul(argv[5], NULL, 16);
- u32 n;
- struct mmc *mmc = find_mmc_device(dev);
+ return (n == cnt) ? 0 : 1;
+ } else if (strcmp(argv[1], "write") == 0) {
+ void *addr = (void *)simple_strtoul(argv[2], NULL, 16);
+ u32 cnt = simple_strtoul(argv[4], NULL, 16);
+ u32 n;
+ struct mmc *mmc = find_mmc_device(curr_device);
- int blk = simple_strtoul(argv[4], NULL, 16);
+ int blk = simple_strtoul(argv[3], NULL, 16);
- if (!mmc)
- return 1;
+ if (!mmc) {
+ printf("no mmc device at slot %x\n", curr_device);
+ return 1;
+ }
- printf("\nMMC write: dev # %d, block # %d, count %d ... ",
- dev, blk, cnt);
+ printf("\nMMC write: dev # %d, block # %d, count %d ... ",
+ curr_device, blk, cnt);
- mmc_init(mmc);
+ mmc_init(mmc);
- n = mmc->block_dev.block_write(dev, blk, cnt, addr);
+ n = mmc->block_dev.block_write(curr_device, blk, cnt, addr);
- printf("%d blocks written: %s\n",
+ printf("%d blocks written: %s\n",
n, (n == cnt) ? "OK" : "ERROR");
- return (n == cnt) ? 0 : 1;
- } else
- rc = cmd_usage(cmdtp);
-
- return rc;
+ return (n == cnt) ? 0 : 1;
}
+
+ return cmd_usage(cmdtp);
}
U_BOOT_CMD(
mmc, 6, 1, do_mmcops,
"MMC sub system",
- "read <device num> addr blk# cnt\n"
- "mmc write <device num> addr blk# cnt\n"
- "mmc rescan <device num>\n"
- "mmc part <device num> - lists available partition on mmc\n"
+ "read addr blk# cnt\n"
+ "mmc write addr blk# cnt\n"
+ "mmc rescan\n"
+ "mmc part - lists available partition on current mmc device\n"
+ "mmc dev [dev] [part] - show or set current mmc device [partition]\n"
"mmc list - lists available devices");
#endif
diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
index d2355be..ec953f0 100644
--- a/drivers/mmc/fsl_esdhc.c
+++ b/drivers/mmc/fsl_esdhc.c
@@ -525,6 +525,7 @@ int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
mmc->f_min = 400000;
mmc->f_max = MIN(gd->sdhc_clk, 52000000);
+ mmc->b_max = 0;
mmc_register(mmc);
return 0;
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index f6d31f5..1d089a7 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -577,6 +577,18 @@ int mmc_change_freq(struct mmc *mmc)
return 0;
}
+int mmc_switch_part(int dev_num, unsigned int part_num)
+{
+ struct mmc *mmc = find_mmc_device(dev_num);
+
+ if (!mmc)
+ return -1;
+
+ return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
+ (mmc->part_config & ~PART_ACCESS_MASK)
+ | (part_num & PART_ACCESS_MASK));
+}
+
int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
{
struct mmc_cmd cmd;
@@ -899,6 +911,7 @@ int mmc_startup(struct mmc *mmc)
return err;
}
+ mmc->part_config = MMCPART_NOAVAILABLE;
if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
/* check ext_csd version and capacity */
err = mmc_send_ext_csd(mmc, ext_csd);
@@ -907,6 +920,10 @@ int mmc_startup(struct mmc *mmc)
ext_csd[214] << 16 | ext_csd[215] << 24;
mmc->capacity *= 512;
}
+
+ /* store the partition info of emmc */
+ if (ext_csd[160] & PART_SUPPORT)
+ mmc->part_config = ext_csd[179];
}
if (IS_SD(mmc))
@@ -1048,6 +1065,9 @@ int mmc_init(struct mmc *mmc)
{
int err;
+ if (mmc->has_init)
+ return 0;
+
err = mmc->init(mmc);
if (err)
@@ -1062,6 +1082,9 @@ int mmc_init(struct mmc *mmc)
if (err)
return err;
+ /* The internal partition reset to user partition(0) at every CMD0*/
+ mmc->part_num = 0;
+
/* Test for SD version 2 */
err = mmc_send_if_cond(mmc);
@@ -1078,7 +1101,12 @@ int mmc_init(struct mmc *mmc)
}
}
- return mmc_startup(mmc);
+ err = mmc_startup(mmc);
+ if (err)
+ mmc->has_init = 0;
+ else
+ mmc->has_init = 1;
+ return err;
}
/*
@@ -1110,6 +1138,11 @@ void print_mmc_devices(char separator)
printf("\n");
}
+int get_mmc_num(void)
+{
+ return cur_dev_num;
+}
+
int mmc_initialize(bd_t *bis)
{
INIT_LIST_HEAD (&mmc_devices);
diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c
index dc7574c..49fb9e0 100644
--- a/drivers/mmc/mmc_spi.c
+++ b/drivers/mmc/mmc_spi.c
@@ -208,6 +208,11 @@ static int mmc_spi_request(struct mmc *mmc, struct mmc_cmd *cmd,
cmd->response[0] = swab32(cmd->response[0]);
debug("r32 %x\n", cmd->response[0]);
break;
+ case MMC_CMD_SEND_STATUS:
+ spi_xfer(spi, 1 * 8, NULL, cmd->response, 0);
+ cmd->response[0] = (cmd->response[0] & 0xff) ?
+ MMC_STATUS_ERROR : MMC_STATUS_RDY_FOR_DATA;
+ break;
}
} else {
debug("%s:data %x %x %x\n", __func__,
diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
index 957b987..ef12ecd 100644
--- a/drivers/mmc/omap_hsmmc.c
+++ b/drivers/mmc/omap_hsmmc.c
@@ -30,6 +30,7 @@
#include <twl4030.h>
#include <asm/io.h>
#include <asm/arch/mmc_host_def.h>
+#include <asm/arch/sys_proto.h>
/* If we fail after 1 second wait, something is really bad */
#define MAX_RETRY_MS 1000
diff --git a/include/configs/km/keymile-common.h b/include/configs/km/keymile-common.h
index e91f6c7..f89a2ea 100644
--- a/include/configs/km/keymile-common.h
+++ b/include/configs/km/keymile-common.h
@@ -169,13 +169,8 @@
"break=0; " \
"for subbootcmd in ${subbootcmds}; do " \
"if test ${break} -eq 0; then; " \
- "echo \"[INFO] running \\c\"; " \
"print ${subbootcmd}; " \
"run ${subbootcmd} || break=1; " \
- "if test ${break} -eq 1; then; " \
- "echo \"[ERR] failed \\c\"; " \
- "print ${subbootcmd}; " \
- "fi; " \
"fi; " \
"done\0" \
""
@@ -186,8 +181,6 @@
* - set 'bootcmd' and 'altbootcmd'
* available targets:
* - 'release': for a standalone system kernel/rootfs from flash
- * - 'develop': for development kernel(tftp)/rootfs(NFS)
- * - 'ramfs': rootfilesystem in RAM kernel(tftp)/rootfs(RAM)
*
* - 'commonargs': bootargs common to all targets
*/
@@ -201,50 +194,14 @@
"addmtdparts " \
"addbootcount " \
"\0" \
- "develop=" \
- "setenv subbootcmds \"" \
- "tftpfdt tftpkernel " \
- "nfsargs ${commonargs} " \
- "printbootargs boot " \
- "\" && " \
- "setenv bootcmd \'" \
- "run bootrunner" \
- "\' && " \
- "setenv altbootcmd \'" \
- "run bootcmd" \
- "\' && " \
- "run setboardid && " \
- "saveenv && " \
- "reset\0" \
- "ramfs=" \
- "setenv actual_bank -1 && " \
- "setenv subbootcmds \"" \
- "tftpfdt tftpkernel " \
- "setrootfsaddr tftpramfs " \
- "flashargs ${commonargs} " \
- "addpanic addramfs " \
- "printbootargs boot " \
- "\" && " \
- "setenv bootcmd \'" \
- "run bootrunner" \
- "\' && " \
- "setenv altbootcmd \'" \
- "run bootcmd" \
- "\' && " \
- "run setboardid && " \
- "run setramfspram && " \
- "saveenv && " \
- "reset\0" \
"release=" \
"setenv actual_bank ${initial_boot_bank} && " \
"setenv subbootcmds \"" \
- "checkboardidlist " \
"checkboardid " \
"ubiattach ubicopy " \
"cramfsloadfdt cramfsloadkernel " \
"flashargs ${commonargs} " \
- "addpanic " \
- "printbootargs boot " \
+ "addpanic boot " \
"\" && " \
"setenv bootcmd \'" \
"run actual bootrunner; reset" \
@@ -252,8 +209,12 @@
"setenv altbootcmd \'" \
"run backup bootrunner; reset" \
"\' && " \
- "saveenv && " \
+ "saveenv && saveenv && " \
"reset\0" \
+ "debug_env=" \
+ "tftp 200000 " CONFIG_KM_ARCH_DBG_FILE " && " \
+ "env import -t 200000 ${filesize} && " \
+ "run debug_env_common\0" \
""
/*
@@ -263,10 +224,8 @@
* - 'addip': add ip configuration
* - 'addmem': limit kernel memory mem=
* - 'addpanic': add kernel panic options
- * - 'addramfs': add phram device for the rootfilesysten in ram
* - 'addtty': add console=...
* - 'addvar': add phram device for /var
- * - 'nfsargs': default arguments for nfs boot
* - 'flashargs': defaults arguments for flash base boot
*
* processor specific settings
@@ -281,25 +240,15 @@
"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \
":${hostname}:${netdev}:off\0" \
"addmem=" \
- "setenv bootargs ${bootargs} mem=0x${pnvramaddr}\0" \
+ "setenv bootargs ${bootargs} mem=${pnvramaddr}\0" \
"addpanic=" \
- "setenv bootargs ${bootargs} " \
- "panic=1 panic_on_oops=1\0" \
- "addramfs=" \
- "setenv bootargs \"" \
- "${bootargs} phram.phram=" \
- "rootfs${boot_bank},${rootfsaddr},${rootfssize}\"\0" \
+ "setenv bootargs ${bootargs} panic=1 panic_on_oops=1\0" \
"addtty=" \
"setenv bootargs ${bootargs}" \
" console=" CONFIG_KM_CONSOLE_TTY ",${baudrate}\0" \
"addvar=" \
"setenv bootargs ${bootargs} phram.phram=phvar," \
- "${varaddr},0x" xstr(CONFIG_KM_PHRAM) "\0" \
- "nfsargs=" \
- "setenv bootargs " \
- "ubi.mtd=" CONFIG_KM_UBI_LINUX_MTD_NAME " " \
- "root=/dev/nfs rw " \
- "nfsroot=${serverip}:${rootpath}\0" \
+ "${varaddr}," xstr(CONFIG_KM_PHRAM) "\0" \
"flashargs=" \
"setenv bootargs " \
"ubi.mtd=" CONFIG_KM_UBI_LINUX_MTD_NAME " " \
@@ -308,71 +257,25 @@
""
/*
- * compute_addr
- * - compute addresses and sizes
- * - addresses are calculated form the end of memory 'memsize'
- *
- * - 'setramfspram': compute PRAM size for ramfs target
- * - 'setrootfsaddr': compute rootfilesystem address for phram
- */
-#define CONFIG_KM_DEF_ENV_COMPUTE_ADDR \
- "setboardid=" \
- "if test \"x${boardId}\" = \"x\"; then; " \
- "setenv boardId ${IVM_BoardId} && " \
- "setenv hwKey ${IVM_HWKey}; " \
- "else; " \
- "echo \\\\c; " \
- "fi\0" \
- "setramfspram=" \
- "setexpr value ${rootfssize} / 0x400 && " \
- "setexpr value 0x${value} + ${pram} && " \
- "setenv pram 0x${value}\0" \
- "setrootfsaddr=" \
- "setexpr value ${pnvramaddr} - ${rootfssize} && " \
- "setenv rootfsaddr 0x${value}\0" \
- ""
-
-/*
* flash_boot
* - commands for booting from flash
*
- * - 'cramfsaddr': address to the cramfs (in ram)
* - 'cramfsloadkernel': copy kernel from a cramfs to ram
* - 'ubiattach': attach ubi partition
* - 'ubicopy': copy ubi volume to ram
* - volume names: bootfs0, bootfs1, bootfs2, ...
- * - 'ubiparition': mtd parition name for ubi
*
* processor specific settings
* - 'cramfsloadfdt': copy fdt from a cramfs to ram
*/
#define CONFIG_KM_DEF_ENV_FLASH_BOOT \
- "cramfsaddr="xstr(CONFIG_KM_CRAMFS_ADDR) "\0" \
+ "cramfsaddr=" xstr(CONFIG_KM_CRAMFS_ADDR) "\0" \
"cramfsloadkernel=" \
"cramfsload ${kernel_addr_r} uImage && " \
"setenv actual_kernel_addr ${kernel_addr_r}\0" \
- "ubiattach=ubi part ${ubipartition}\0" \
- "ubicopy=ubi read ${cramfsaddr} bootfs${boot_bank}\0" \
- "ubipartition=" CONFIG_KM_UBI_PARTITION_NAME "\0" \
- ""
-
-/*
- * net_boot
- * - commands for booting over the network
- *
- * - 'tftpkernel': load a kernel with tftp into ram
- * - 'tftpramfs': load rootfs with tftp into ram
- *
- * processor specific settings
- * - 'tftpfdt': load fdt with tftp into ram
- */
-#define CONFIG_KM_DEF_ENV_NET_BOOT \
- "tftpkernel=" \
- "tftpboot ${kernel_addr_r} ${kernel_file} && " \
- "setenv actual_kernel_addr ${kernel_addr_r}\0" \
- "tftpramfs=" \
- "tftpboot ${rootfsaddr} \"\\\"${rootfsfile}\\\"\" && " \
- "setenv loadaddr\0" \
+ "ubiattach=ubi part " CONFIG_KM_UBI_PARTITION_NAME "\0" \
+ "ubicopy=ubi read "xstr(CONFIG_KM_CRAMFS_ADDR) \
+ " bootfs${boot_bank}\0" \
""
/*
@@ -389,36 +292,8 @@
"default=" \
"setenv default 'run newenv; reset' && " \
"run release && saveenv; reset\0" \
- "checkboardidlist=" \
- "if test \"x${boardIdListHex}\" != \"x\"; then " \
- "IVMbidhwk=${IVM_BoardId}_${IVM_HWKey}; " \
- "found=0; " \
- "for bidhwk in \"${boardIdListHex}\"; do " \
- "echo trying $bidhwk ...; " \
- "if test \"x$bidhwk\" = \"x$IVMbidhwk\"; then " \
- "found=1; " \
- "echo match found for $bidhwk; " \
- "if test \"x$bidhwk\" != \"x${boardId}_${hwKey}\";then "\
- "setenv boardid ${IVM_BoardId}; " \
- "setenv boardId ${IVM_BoardId}; " \
- "setenv hwkey ${IVM_HWKey}; " \
- "setenv hwKey ${IVM_HWKey}; " \
- "echo \"boardId set to ${boardId}\"; " \
- "echo \"hwKey set to ${hwKey}\"; " \
- "saveenv; " \
- "fi; " \
- "fi; " \
- "done; " \
- "else " \
- "echo \"boardIdListHex not set, not checked\"; "\
- "found=1; " \
- "fi; " \
- "test \"$found\" = 1 \0" \
- "checkboardid=" \
- "test \"x${boardId}\" = \"x${IVM_BoardId}\" && " \
- "test \"x${hwKey}\" = \"x${IVM_HWKey}\"\0" \
- "printbootargs=print bootargs\0" \
- "rootfsfile="xstr(CONFIG_HOSTNAME) "/rootfsImage\0" \
+ "checkboardid=km_checkbidhwk\0" \
+ "pnvramsize=" xstr(CONFIG_KM_PNVRAM) "\0" \
""
#ifndef CONFIG_KM_DEF_ENV
@@ -429,17 +304,13 @@
CONFIG_KM_DEF_ENV_BOOTRUNNER \
CONFIG_KM_DEF_ENV_BOOTTARGETS \
CONFIG_KM_DEF_ENV_BOOTARGS \
- CONFIG_KM_DEF_ENV_COMPUTE_ADDR \
CONFIG_KM_DEF_ENV_FLASH_BOOT \
- CONFIG_KM_DEF_ENV_NET_BOOT \
CONFIG_KM_DEF_ENV_CONSTANTS \
"altbootcmd=run bootcmd\0" \
"bootcmd=run default\0" \
"bootlimit=2\0" \
"init=/sbin/init-overlay.sh\0" \
"kernel_addr_r="xstr(CONFIG_KM_KERNEL_ADDR) "\0" \
- "kernel_file="xstr(CONFIG_HOSTNAME) "/uImage\0" \
- "kernel_name=uImage\0" \
"load=tftpboot ${u-boot_addr_r} ${u-boot}\0" \
"mtdids=" MTDIDS_DEFAULT "\0" \
"mtdparts=" MTDPARTS_DEFAULT "\0" \
diff --git a/include/configs/km/km-powerpc.h b/include/configs/km/km-powerpc.h
index 3351609..d6db8d7 100644
--- a/include/configs/km/km-powerpc.h
+++ b/include/configs/km/km-powerpc.h
@@ -67,20 +67,14 @@
#define CONFIG_KM_FDT_ADDR 0x7E0000 /* 128Kbytes */
#define CONFIG_KM_DEF_ENV_CPU \
- "addbootcount=echo \\\\c\0" \
- "addmtdparts=echo \\\\c\0" \
+ "addbootcount=true\0" \
+ "addmtdparts=true\0" \
"boot=bootm ${actual_kernel_addr} - ${actual_fdt_addr}\0" \
"cramfsloadfdt=" \
"cramfsload ${fdt_addr_r} " \
"fdt_0x${IVM_BoardId}_0x${IVM_HWKey}.dtb && " \
"setenv actual_fdt_addr ${fdt_addr_r}\0" \
"fdt_addr_r=" xstr(CONFIG_KM_FDT_ADDR) "\0" \
- "fdt_file=" \
- xstr(CONFIG_HOSTNAME) "/" \
- xstr(CONFIG_HOSTNAME) ".dtb\0" \
- "tftpfdt=" \
- "tftpboot ${fdt_addr_r} ${fdt_file} && " \
- "setenv actual_fdt_addr ${fdt_addr_r} \0" \
"update=" \
"protect off " xstr(BOOTFLASH_START) " +${filesize} && "\
"erase " xstr(BOOTFLASH_START) " +${filesize} && " \
@@ -89,4 +83,6 @@
"protect on " xstr(BOOTFLASH_START) " +${filesize}\0" \
""
+#define CONFIG_KM_ARCH_DBG_FILE "scripts/debug-ppc-env.txt"
+
#endif /* __CONFIG_KEYMILE_POWERPC_H */
diff --git a/include/configs/km/km_arm.h b/include/configs/km/km_arm.h
index a38a070..aa9f1ae 100644
--- a/include/configs/km/km_arm.h
+++ b/include/configs/km/km_arm.h
@@ -66,12 +66,11 @@
#define CONFIG_KM_DEF_ENV_CPU \
"addmtdparts=setenv bootargs ${bootargs} ${mtdparts}\0" \
"boot=bootm ${actual_kernel_addr} - -\0" \
- "cramfsloadfdt=echo \\\\c\0" \
- "tftpfdt=echo \\\\c\0" \
+ "cramfsloadfdt=true\0" \
CONFIG_KM_DEF_ENV_UPDATE \
""
-
+#define CONFIG_KM_ARCH_DBG_FILE "scripts/debug-arm-env.txt"
#define CONFIG_MD5 /* get_random_hex on krikwood needs MD5 support */
#define CONFIG_SKIP_LOWLEVEL_INIT /* disable board lowlevel_init */
diff --git a/include/mmc.h b/include/mmc.h
index f7f2286..aeacdee 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -102,6 +102,7 @@
#define MMC_STATUS_MASK (~0x0206BF7F)
#define MMC_STATUS_RDY_FOR_DATA (1 << 8)
#define MMC_STATUS_CURR_STATE (0xf << 9)
+#define MMC_STATUS_ERROR (1 << 19)
#define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */
#define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */
@@ -137,6 +138,7 @@
* EXT_CSD fields
*/
+#define EXT_CSD_PART_CONF 179 /* R/W */
#define EXT_CSD_BUS_WIDTH 183 /* R/W */
#define EXT_CSD_HS_TIMING 185 /* R/W */
#define EXT_CSD_CARD_TYPE 196 /* RO */
@@ -178,6 +180,9 @@
#define MMC_RSP_R6 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
#define MMC_RSP_R7 (MMC_RSP_PRESENT|MMC_RSP_CRC|MMC_RSP_OPCODE)
+#define MMCPART_NOAVAILABLE (0xff)
+#define PART_ACCESS_MASK (0x7)
+#define PART_SUPPORT (0x1)
struct mmc_cid {
unsigned long psn;
@@ -262,6 +267,7 @@ struct mmc {
void *priv;
uint voltages;
uint version;
+ uint has_init;
uint f_min;
uint f_max;
int high_capacity;
@@ -274,6 +280,8 @@ struct mmc {
uint csd[4];
uint cid[4];
ushort rca;
+ char part_config;
+ char part_num;
uint tran_speed;
uint read_bl_len;
uint write_bl_len;
@@ -294,7 +302,9 @@ void mmc_set_clock(struct mmc *mmc, uint clock);
struct mmc *find_mmc_device(int dev_num);
int mmc_set_dev(int dev_num);
void print_mmc_devices(char separator);
+int get_mmc_num(void);
int board_mmc_getcd(u8 *cd, struct mmc *mmc);
+int mmc_switch_part(int dev_num, unsigned int part_num);
#ifdef CONFIG_GENERIC_MMC
int atmel_mci_init(void *regs);