This command alters the PARTITION_CONFIG[PARTITION_ACCESS] bits to allow
R/W to the various partition that exist on the device.
---
 Hi Chris and mmc-utils maintainers,

 WARNING: While this alters the bits that I want, it actually does not work.
 Any subsequent access (e.g. mmc extcsd read) ends up with the system being
 unresponsive. I have obviously done something uneducatedly stupid.

 I am posting to show exactly what I have done and hoping that someone 
 can point me in the right direction.

 I am trying to put MLO and u-boot into the boot partition (/dev/mmcblk1boot0)
 and then boot from it. I thought if I set the PARTITION_ACCESS to allow boot0
 I can then dd into it. So far all dd attempts returns with write operation
 not permitted.

 What am I missing?

 Thanks for everyone's time.

 Richard Retanubun

 mmc.c      |    5 +++++
 mmc_cmds.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 mmc_cmds.h |    1 +
 3 files changed, 59 insertions(+)

diff --git a/mmc.c b/mmc.c
index 926e92f..985db33 100644
--- a/mmc.c
+++ b/mmc.c
@@ -90,6 +90,11 @@ static struct Command commands[] = {
                "Enable the boot partition for the <device>.\nTo receive 
acknowledgment of boot from the card set <send_ack>\nto 1, else set it to 0.",
          NULL
        },
+       { do_write_partition_access, -2,
+         "partition access", "<partition_number> " "<device>\n"
+               "Enable R/W access to the specified partition on <device>.",
+         NULL
+       },
        { do_write_bkops_en, -1,
          "bkops enable", "<device>\n"
                "Enable the eMMC BKOPS feature on <device>.\nNOTE!  This is a 
one-time programmable (unreversible) change.",
diff --git a/mmc_cmds.c b/mmc_cmds.c
index af6f09f..d67004d 100644
--- a/mmc_cmds.c
+++ b/mmc_cmds.c
@@ -302,6 +302,59 @@ int do_write_boot_en(int nargs, char **argv)
        return ret;
 }
 
+int do_write_partition_access(int nargs, char **argv)
+{
+       __u8 ext_csd[512];
+       __u8 value = 0;
+       int fd, ret;
+       char *device;
+       int partition;
+
+       CHECK(nargs != 3, "Usage: mmc partition access <partition_number> "
+                         "</path/to/mmcblkX>\n", exit(1));
+
+       /*
+        * If <send_ack> is 1, the device will send acknowledgment
+        * pattern "010" to the host when boot operation begins.
+        * If <send_ack> is 0, it won't.
+        */
+       partition = strtol(argv[1], NULL, 10);
+       device = argv[2];
+
+       if (partition < 0 || partition > 7) {
+               fprintf(stderr, "Cannot set access to partition %d "
+                       "range [0-7] \n", partition);
+               exit(1);
+       }
+
+       fd = open(device, O_RDWR);
+       if (fd < 0) {
+               perror("open");
+               exit(1);
+       }
+
+       ret = read_extcsd(fd, ext_csd);
+       if (ret) {
+               fprintf(stderr, "Could not read EXT_CSD from %s\n", device);
+               exit(1);
+       }
+
+       value = ext_csd[EXT_CSD_PART_CONFIG];
+
+       /* Sanitize and set the PARTITION_ACCESS bits */
+       value &= 0xF8;
+       value |= partition;
+
+       ret = write_extcsd_value(fd, EXT_CSD_PART_CONFIG, value);
+       if (ret) {
+               fprintf(stderr, "Could not write 0x%02x to "
+                       "EXT_CSD[%d] in %s\n",
+                       value, EXT_CSD_PART_CONFIG, device);
+               exit(1);
+       }
+       return ret;
+}
+
 int do_hwreset(int value, int nargs, char **argv)
 {
        __u8 ext_csd[512];
diff --git a/mmc_cmds.h b/mmc_cmds.h
index f06cc10..3ba9660 100644
--- a/mmc_cmds.h
+++ b/mmc_cmds.h
@@ -21,6 +21,7 @@ int do_writeprotect_get(int nargs, char **argv);
 int do_writeprotect_set(int nargs, char **argv);
 int do_disable_512B_emulation(int nargs, char **argv);
 int do_write_boot_en(int nargs, char **argv);
+int do_write_partition_access(int nargs, char **argv);
 int do_write_bkops_en(int nargs, char **argv);
 int do_hwreset_en(int nargs, char **argv);
 int do_hwreset_dis(int nargs, char **argv);
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to