Hi Tomas, On 11/23/2016 09:50 PM, Tomas Melin wrote: > Hi Jaehoon, > > On 11/23/2016 11:53 AM, Jaehoon Chung wrote: >> On 11/21/2016 04:52 PM, Tomas Melin wrote: >>> Is your meaning by this that you think that the kernel driver >>> implementation is insufficient, and that you therefore do not recommmend >>> using bkops functionality for eMMC at all (ever)? >> >> No...If user really want to use this, they can use the mmc-utils.. > > Actually, I have also been using mmc-utils for this purpose, and even > provided patches upstream for the tool. It seems that all settings are not > really working properly. E.g. setting both hwpartition and write reliability > failes in some cases with our devices, the write reliability bit setting is > for some reason lost after the power cycle. The same problems have not be > noticed doing the same configurations from U-Boot. > So doing the emmc setting seems more reliable in U-Boot. > > Below v2 of the original patch that instead puts the command into a separate > CONFIG_CMD_BKOPS_ENABLE that must be enabled explicitly by > the user if he or she wishes to use the command. > I understand your standpoint and arguments for not providing the command in > U-Boot with default setting, but please still consider > accepting it as a configurable command that can be pulled in by those users > who need it. Either way, we will > keep it as a out-of-tree patch. But frankly, I think this command might be of > use to many others as well.
I understood what your purpose..Could you send the patch again? After sending the patch V2 again, i will check again for satisfying both you and me. :) > > BR, > Tomas > > >>From 7387943be48e7ccc2bf6aa1d30d35ef279c98f2d Mon Sep 17 00:00:00 2001 > From: Tomas Melin <tomas.me...@vaisala.com> > Date: Wed, 16 Nov 2016 09:10:02 +0200 > Subject: [PATCH] mmc: add bkops-enable command > > Add new command that provides possibility to enable the > background operations handshake functionality > (BKOPS_EN, EXT_CSD byte [163]) on eMMC devices. > > This is an optional feature of eMMCs, the setting is write-once. > The command must be explicitly taken into use with > CONFIG_CMD_BKOPS_ENABLE. > > Signed-off-by: Tomas Melin <tomas.me...@vaisala.com> > --- > cmd/Kconfig | 7 +++++++ > cmd/mmc.c | 32 ++++++++++++++++++++++++++++++++ > drivers/mmc/mmc.c | 32 ++++++++++++++++++++++++++++++++ > include/mmc.h | 6 ++++++ > 4 files changed, 77 insertions(+) > > diff --git a/cmd/Kconfig b/cmd/Kconfig > index e339d86..8286d15 100644 > --- a/cmd/Kconfig > +++ b/cmd/Kconfig > @@ -550,6 +550,13 @@ config SYS_AMBAPP_PRINT_ON_STARTUP > help > Show AMBA Plug-n-Play information on startup. > > +config CMD_BKOPS_ENABLE > + bool "mmc bkops enable" > + depends on CMD_MMC > + default n > + help > + Enable background operations handshake on device. > + > config CMD_BLOCK_CACHE > bool "blkcache - control and stats for block cache" > depends on BLOCK_CACHE > diff --git a/cmd/mmc.c b/cmd/mmc.c > index b2761e9..b8dcc26 100644 > --- a/cmd/mmc.c > +++ b/cmd/mmc.c > @@ -729,6 +729,31 @@ static int do_mmc_setdsr(cmd_tbl_t *cmdtp, int flag, > return ret; > } > > +#ifdef CONFIG_CMD_BKOPS_ENABLE > +static int do_mmc_bkops_enable(cmd_tbl_t *cmdtp, int flag, > + int argc, char * const argv[]) > +{ > + int dev; > + struct mmc *mmc; > + > + if (argc != 2) > + return CMD_RET_USAGE; > + > + dev = simple_strtoul(argv[1], NULL, 10); > + > + mmc = init_mmc_device(dev, false); > + if (!mmc) > + return CMD_RET_FAILURE; > + > + if (IS_SD(mmc)) { > + puts("BKOPS_EN only exists on eMMC\n"); > + return CMD_RET_FAILURE; > + } > + > + return mmc_set_bkops_enable(mmc); > +} > +#endif > + > static cmd_tbl_t cmd_mmc[] = { > U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, "", ""), > U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, "", ""), > @@ -749,6 +774,9 @@ static cmd_tbl_t cmd_mmc[] = { > U_BOOT_CMD_MKENT(rpmb, CONFIG_SYS_MAXARGS, 1, do_mmcrpmb, "", ""), > #endif > U_BOOT_CMD_MKENT(setdsr, 2, 0, do_mmc_setdsr, "", ""), > +#ifdef CONFIG_CMD_BKOPS_ENABLE > + U_BOOT_CMD_MKENT(bkops-enable, 2, 0, do_mmc_bkops_enable, "", ""), > +#endif > }; > > static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const > argv[]) > @@ -813,6 +841,10 @@ U_BOOT_CMD( > "mmc rpmb counter - read the value of the write counter\n" > #endif > "mmc setdsr <value> - set DSR register value\n" > +#ifdef CONFIG_CMD_BKOPS_ENABLE > + "mmc bkops-enable <dev> - enable background operations handshake on > device\n" > + " WARNING: This is a write-once setting.\n" "Write-once setting" -> "Onetime programmable" > +#endif > ); > > /* Old command kept for compatibility. Same as 'mmc info' */ > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index 0cec02c..d40d13f 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -1810,3 +1810,35 @@ int mmc_initialize(bd_t *bis) > mmc_do_preinit(); > return 0; > } > + > +#ifdef CONFIG_CMD_BKOPS_ENABLE > +int mmc_set_bkops_enable(struct mmc *mmc) > +{ > + int err; > + ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN); > + > + err = mmc_send_ext_csd(mmc, ext_csd); > + if (err) { > + puts("Could not get ext_csd register values\n"); > + return err; > + } Does it need to check Card version? > + > + if (!(ext_csd[EXT_CSD_BKOPS_SUPPORT] & 0x1)) { > + puts("Background operations not supported on device\n"); > + return -EMEDIUMTYPE; > + } > + > + if (ext_csd[EXT_CSD_BKOPS_EN] & 0x1) { > + puts("Background operations already enabled\n"); > + return 0; > + } > + > + err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BKOPS_EN, 1); > + if (err) { > + puts("Failed to enable background operations\n"); > + return err; > + } > + > + return 0; > +} > +#endif > diff --git a/include/mmc.h b/include/mmc.h > index 5ef37d3..2c677f7 100644 > --- a/include/mmc.h > +++ b/include/mmc.h > @@ -175,6 +175,7 @@ > #define EXT_CSD_MAX_ENH_SIZE_MULT 157 /* R */ > #define EXT_CSD_PARTITIONING_SUPPORT 160 /* RO */ > #define EXT_CSD_RST_N_FUNCTION 162 /* R/W */ > +#define EXT_CSD_BKOPS_EN 163 /* R/W */ Maybe not R/W. Best Regards, Jaehoon Chung > #define EXT_CSD_WR_REL_PARAM 166 /* R */ > #define EXT_CSD_WR_REL_SET 167 /* R/W */ > #define EXT_CSD_RPMB_MULT 168 /* RO */ > @@ -189,6 +190,7 @@ > #define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */ > #define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */ > #define EXT_CSD_BOOT_MULT 226 /* RO */ > +#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */ > > /* > * EXT_CSD field definitions > @@ -541,6 +543,10 @@ int mmc_rpmb_read(struct mmc *mmc, void *addr, unsigned > short blk, > unsigned short cnt, unsigned char *key); > int mmc_rpmb_write(struct mmc *mmc, void *addr, unsigned short blk, > unsigned short cnt, unsigned char *key); > +#ifdef CONFIG_CMD_BKOPS_ENABLE > +int mmc_set_bkops_enable(struct mmc *mmc); > +#endif > + > /** > * Start device initialization and return immediately; it does not block on > * polling OCR (operation condition register) status. Then you should call > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot