diff options
author | Frank Li <Frank.Li@freescale.com> | 2010-11-19 18:19:00 +0800 |
---|---|---|
committer | Frank Li <Frank.Li@freescale.com> | 2011-04-01 11:33:12 +0800 |
commit | 99c0ca9db153ec48708b05a21589d8f7a1348110 (patch) | |
tree | e33dc4790106d657e787f99e243f03baf08af017 /drivers/mmc | |
parent | e359812d5a3cdac1ea1ad93f46915000b5bba99e (diff) |
ENGR00133884 eMMC: improve boot_info message output
Output bit means of important esd_csd register
Read esd_csd info each time when cat boot_info
becasue user may change config affect esd_csd
value.
boot_info:0x07;
ALT_BOOT_MODE:1 - Supports alternate boot method
DDR_BOOT_MODE:1 - Supports alternate dual data rate during boot
HS_BOOTMODE:1 - Supports high speed timing during boot
boot_size:0512KB
boot_partition:0x48;
BOOT_ACK:1 - Boot acknowledge sent during boot operation
BOOT_PARTITION-ENABLE: 1 - Boot partition 1 enabled
PARTITION_ACCESS:0 - No access to boot partition
boot_bus:0x01
BOOT_MODE:0 - Use single data rate + backward compatible timings
in boot operation
RESET_BOOT_BUS_WIDTH:0 - Reset bus width to x1, single data rate
and backward compatible timings after boot operation
BOOT_BUS_WIDTH:1 - x4 (sdr/ddr) bus width in boot operation mode
Signed-off-by: Frank Li <Frank.Li@freescale.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/core/mmc.c | 110 |
1 files changed, 106 insertions, 4 deletions
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 5d304072c0bd..50d0dc73eb76 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -617,12 +617,114 @@ MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid); MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name); MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid); MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); -MMC_DEV_ATTR(boot_info, "boot_info:0x%02x; boot_size:%04dKB;" - " boot_partition:0x%02x; boot_bus:0x%02x\n", - card->ext_csd.boot_info, card->ext_csd.boot_size_mult * 128, - card->ext_csd.boot_config, card->ext_csd.boot_bus_width); + +static ssize_t mmc_boot_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + char *boot_partition[8] = { + "Device not boot enabled", + "Boot partition 1 enabled", + "Boot partition 2 enabled", + "Reserved", + "Reserved", + "Reserved", + "Reserved", + "User area enabled for boot"}; + + char *boot_partition_access[8] = { + "No access to boot partition", + "R/W boot partition 1", + "R/W boot partition 2", + "R/W Replay Protected Memory Block (RPMB)", + "Access to General Purpose partition 1", + "Access to General Purpose partition 2", + "Access to General Purpose partition 3", + "Access to General Purpose partition 4"}; + + char *bus_width[4] = { + "x1 (sdr) or x4 (ddr) bus width in boot operation mode", + "x4 (sdr/ddr) bus width in boot operation mode", + "x8 (sdr/ddr) bus width in boot operation mode", + "Reserved"}; + + char *boot_mode[4] = { + "Use single data rate + backward compatible timings in boot operation", + "Use single data rate + high speed timings in boot operation mode", + "Use dual data rate in boot operation", + "Reserved"}; + + int partition; + int access; + int width; + int mode; + struct mmc_card *card = container_of(dev, struct mmc_card, dev); + + /* read it again because user may change it */ + mmc_claim_host(card->host); + mmc_read_ext_csd(card); + mmc_release_host(card->host); + + partition = (card->ext_csd.boot_config >> 3) & 0x7; + access = card->ext_csd.boot_config & 0x7; + width = card->ext_csd.boot_bus_width & 0x3; + mode = (card->ext_csd.boot_bus_width >> 3) & 0x3; + + return sprintf(buf, + "boot_info:0x%02x;\n" + " ALT_BOOT_MODE:%x - %s\n" + " DDR_BOOT_MODE:%x - %s\n" + " HS_BOOTMODE:%x - %s\n" + "boot_size:%04dKB\n" + "boot_partition:0x%02x;\n" + " BOOT_ACK:%x - %s\n" + " BOOT_PARTITION-ENABLE: %x - %s\n" + " PARTITION_ACCESS:%x - %s\n" + "boot_bus:0x%02x\n" + " BOOT_MODE:%x - %s\n" + " RESET_BOOT_BUS_WIDTH:%x - %s\n" + " BOOT_BUS_WIDTH:%x - %s\n", + + card->ext_csd.boot_info, + !!(card->ext_csd.boot_info & 0x1), + (card->ext_csd.boot_info & 0x1) ? + "Supports alternate boot method" : + "Does not support alternate boot method", + !!(card->ext_csd.boot_info & 0x2), + (card->ext_csd.boot_info & 0x2) ? + "Supports alternate dual data rate during boot" : + "Does not support dual data rate during boot", + !!(card->ext_csd.boot_info & 0x4), + (card->ext_csd.boot_info & 0x4) ? + "Supports high speed timing during boot" : + "Does not support high speed timing during boot", + + card->ext_csd.boot_size_mult * 128, + + card->ext_csd.boot_config, + !!(card->ext_csd.boot_config & 0x40), + (card->ext_csd.boot_config & 0x40) ? + "Boot acknowledge sent during boot operation" : + "No boot acknowledge sent", + partition, + boot_partition[partition], + access, + boot_partition_access[access], + + card->ext_csd.boot_bus_width, + mode, + boot_mode[mode], + !!(card->ext_csd.boot_bus_width & 0x4), + (card->ext_csd.boot_bus_width & 0x4) ? + "Retain boot bus width and boot mode after boot operation" : + "Reset bus width to x1, single data rate and backward" + "compatible timings after boot operation", + width, + bus_width[width]); +} + DEVICE_ATTR(boot_config, S_IWUGO, NULL, setup_boot_partitions); DEVICE_ATTR(boot_bus_config, S_IWUGO, NULL, setup_boot_bus); +DEVICE_ATTR(boot_info, S_IRUGO, mmc_boot_info_show, NULL); static struct attribute *mmc_std_attrs[] = { &dev_attr_cid.attr, |