Adrian,

Thank you for the feedback.  I have amended the patch.  I tested the patch 
against mmc4.3 or earlier cards and it works.
Your comment about the switch boot config not being supported by earlier cards 
is handled by NOT checking for any errors. 

The reason the patch is needed is because when our  boot loader gets loaded 
from the private boot area, it sets the partition to the private boot area and 
then hands control to a secondary loader.  Normally our boot loader would 
disable access to the partition once boot code was loaded in before passing 
control to linux but if the process is stopped or the kernel is loaded from 
another device the partition number is not reset.  

We can fix this but it seems good practice for linux to reset the flash to a 
normal state.

The other concerns I believe were addressed earlier.  The trace showing what 
was happening with and without the patch.

regards,
Philip

signed-off-by: Philip Rakity <prak...@marvell.com>
diff -ru linux-2.6.32.8/drivers/mmc/core/mmc.c linux-2.6.32.8 
copy/drivers/mmc/core/mmc.c
--- linux-2.6.32.8/drivers/mmc/core/mmc.c       2010-02-09 04:57:19.000000000 
-0800
+++ linux-2.6.32.8 copy/drivers/mmc/core/mmc.c  2010-03-12 20:56:16.000000000 
-0800
@@ -430,6 +432,13 @@
        }
 
        /*
+       * ensure eMMC private booting PARTITION is not enabled
+       */
+       mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
+               EXT_CSD_BOOT_CONFIG, 0x0);
+
+       /*
         * Compute bus speed.
         */
        max_dtr = (unsigned int)-1;
diff -ru linux-2.6.32.8/include/linux/mmc/mmc.h linux-2.6.32.8 
copy/include/linux/mmc/mmc.h
--- linux-2.6.32.8/include/linux/mmc/mmc.h      2010-02-09 04:57:19.000000000 
-0800
+++ linux-2.6.32.8 copy/include/linux/mmc/mmc.h 2010-03-12 20:53:48.000000000 
-0800
@@ -251,6 +252,7 @@
  * EXT_CSD fields
  */
 
+#define EXT_CSD_BOOT_CONFIG    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 */



On Mar 15, 2010, at 1:08 AM, Adrian Hunter wrote:

> Philip Rakity wrote:
>> Some eMMC chips have a boot partition that is meant to be used to load in 
>> low level boot code.
>> This partition is available when the chip is powered up.  Normally the boot 
>> loader would disable
>> access to the partition once boot code was loaded in before passing control 
>> to linux.  
>> 
>> if booting occurs from another device (not the eMMC chip) the partition will 
>> not be disabled by
>> the boot loader and control will be passed to linux.  This will cause linux 
>> to not recognize user
>> partitions on the chip unless access to the boot partition is deactivated.
>> 
>> See JEDEC Standard 84-A44 (eMMC 4.4 spec) -- Page 139
> 
> Page 139 doesn't say anything about why you need that switch command.
> Please provide a more useful reference or delete this.
> 
> Boot mode is terminated by CMD1, so that switch command should not
> be needed.  Please explain why it is needed in more detail.
> 
> That switch command should not be used for devices that do not
> support it e.g. eMMC 4.3 and before.
> 
> 
>> 
>> signed off by:  Philip Rakity <prak...@marvell.com>
>> diff -ru linux-2.6.32.8/drivers/mmc/core/mmc.c linux-2.6.32.8 
>> copy/drivers/mmc/core/mmc.c
>> --- linux-2.6.32.8/drivers/mmc/core/mmc.c    2010-02-09 04:57:19.000000000 
>> -0800
>> +++ linux-2.6.32.8 copy/drivers/mmc/core/mmc.c       2010-03-12 
>> 20:56:16.000000000 -0800
>> @@ -430,6 +432,13 @@
>>      }
>> 
>>      /*
>> +    * ensure eMMC private booting PARTITION is not enabled
>> +    * see JEDEC Standard No. 84-A44 - Page 139 
>> +    */
>> +    mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
>> +            EXT_CSD_BOOT_CONFIG, 0x0);
>> +
>> +    /*
>>       * Compute bus speed.
>>       */
>>      max_dtr = (unsigned int)-1;
>> diff -ru linux-2.6.32.8/include/linux/mmc/mmc.h linux-2.6.32.8 
>> copy/include/linux/mmc/mmc.h
>> --- linux-2.6.32.8/include/linux/mmc/mmc.h   2010-02-09 04:57:19.000000000 
>> -0800
>> +++ linux-2.6.32.8 copy/include/linux/mmc/mmc.h      2010-03-12 
>> 20:53:48.000000000 -0800
>> @@ -251,6 +252,7 @@
>>  * EXT_CSD fields
>>  */
>> 
>> +#define EXT_CSD_BOOT_CONFIG 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 */
>> 
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
>> the body of a message to majord...@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> 
> 
signed-off-by: Philip Rakity <prak...@marvell.com>
diff -ru linux-2.6.32.8/drivers/mmc/core/mmc.c linux-2.6.32.8 
copy/drivers/mmc/core/mmc.c
--- linux-2.6.32.8/drivers/mmc/core/mmc.c       2010-02-09 04:57:19.000000000 
-0800
+++ linux-2.6.32.8 copy/drivers/mmc/core/mmc.c  2010-03-12 20:56:16.000000000 
-0800
@@ -430,6 +432,13 @@
        }
 
        /*
+       * ensure eMMC private booting PARTITION is not enabled
+       */
+       mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
+               EXT_CSD_BOOT_CONFIG, 0x0);
+
+       /*
         * Compute bus speed.
         */
        max_dtr = (unsigned int)-1;
diff -ru linux-2.6.32.8/include/linux/mmc/mmc.h linux-2.6.32.8 
copy/include/linux/mmc/mmc.h
--- linux-2.6.32.8/include/linux/mmc/mmc.h      2010-02-09 04:57:19.000000000 
-0800
+++ linux-2.6.32.8 copy/include/linux/mmc/mmc.h 2010-03-12 20:53:48.000000000 
-0800
@@ -251,6 +252,7 @@
  * EXT_CSD fields
  */
 
+#define EXT_CSD_BOOT_CONFIG    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 */

Reply via email to