From patchwork Fri Nov 25 09:01:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tomas Melin X-Patchwork-Id: 699108 X-Patchwork-Delegate: jh80.chung@samsung.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3tQ9700t4Xz9t80 for ; Fri, 25 Nov 2016 20:01:48 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id B98C74BDBD; Fri, 25 Nov 2016 10:01:45 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 4pOzgOUkYZBL; Fri, 25 Nov 2016 10:01:45 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 397E94B98A; Fri, 25 Nov 2016 10:01:45 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 109FF4B98A for ; Fri, 25 Nov 2016 10:01:40 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1KeAIhhvBc_x for ; Fri, 25 Nov 2016 10:01:39 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from hel-mailgw-01.vaisala.com (hel-mailgw-01.vaisala.com [193.143.230.17]) by theia.denx.de (Postfix) with ESMTPS id A5BF04B6B3 for ; Fri, 25 Nov 2016 10:01:35 +0100 (CET) IronPort-PHdr: =?us-ascii?q?9a23=3A0rJY5BShDEA7lgtKZR0k4XB259psv+yvbD5Q0YIu?= =?us-ascii?q?jvd0So/mwa69ZxWN2/xhgRfzUJnB7Loc0qyN4vumAjVLvcfJmUtBWaQEbwUCh8?= =?us-ascii?q?QSkl5oK+++Imq/EsTXaTcnFt9JTl5v8iLzG0FUHMHjew+a+SXqvnYdFRrlKAV6?= =?us-ascii?q?OPn+FJLMgMSrzeCy/IDYbxlViDanb75/KBu7oR/fu8ULjodvJaI8wQbVr3VVfO?= =?us-ascii?q?hb2XlmLk+JkRbm4cew8p9j8yBOtP8k6sVNT6b0cbkmQLJBFDgpPHw768PttRnY?= =?us-ascii?q?UAuA/WAcXXkMkhpJGAfK8hf3VYrsvyTgt+p93C6aPdDqTb0xRD+v4btnRAPuhS?= =?us-ascii?q?waMTMy7WPZhdFqjK9DoByvuQFxzYDXbo+SL/dyYr/RcMkGSWdbQspdSypMCZ68?= =?us-ascii?q?YYsVCOoBOP5VoZf6p1sLtxS+HhSnCuTxxT9Mh3/227Ax3uM9EQHB2QwvBckOvG?= =?us-ascii?q?7RrNrrMKcSUOa1wbLWzTrZbvNWwi3y6IzSfRw7vf6MWrdwfNPXxEIyFA3Flk2d?= =?us-ascii?q?pZHnMj+LzOgBrWeW4/B9We61lWIrtQF8rz6yzck2kIbJnJgaylXc+CV8x4Y6OM?= =?us-ascii?q?O3RVZgYd6hDJtQryaaN5ZqQs86Q2FnpiI6yroetJC5cyYEzo0ryQPYZfKZaYaE?= =?us-ascii?q?+A7sVOGLITdgnn5lZqiwhxep8Ue6zu3zTNO430pNripAitXMt3YN2ALP6sWfV/?= =?us-ascii?q?dw/Fmt1SyR2w3c8O1IPFo4mbTFJ5Mh2rIwk4AcsUXHHi/4gkX2i6qWe104+uiv?= =?us-ascii?q?7uToeK7mqoWZN4BqjgH+M6Iul9ehAesiMwgORHKU+eCm27H54UL5R7BKguUskq?= =?us-ascii?q?bFqJDaOdgbpqmhDg9Iy4os8BG/DzC60NkDmXkHLUlFeA6cj4TzJl7BPvb4DPil?= =?us-ascii?q?j1uxjjg4j8zBa6CkCJLKMlDHkaz9ZvBx5khMjgY+nv5F4JcBNrYEKem7f0L1td?= =?us-ascii?q?qQWgM+NgWvhePqDNR7/p0XWHmGBqbfO6TX5wzbrtkzKvWBMddG8A32LOIosqbj?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A2G5AQBv/TdY/+EBGKxdHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBgw0BAQEBAYF5jUWpfoIOggiGIYJBFAEBAQEBAQEBAQEBAoEHgjM?= =?us-ascii?q?Ygx2BUbc6i0sBAQgnCQGGNI8FBYhSh2CKIoF2jxKBcIg4hgiRfR6BLIN3HIFfc?= =?us-ascii?q?Ig3AQEB?= X-IPAS-Result: =?us-ascii?q?A2G5AQBv/TdY/+EBGKxdHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAYF5jUWpfoIOggiGIYJBFAEBAQEBAQEBAQEBAoEHgjMYgx2BUbc6i0sBA?= =?us-ascii?q?QgnCQGGNI8FBYhSh2CKIoF2jxKBcIg4hgiRfR6BLIN3HIFfcIg3AQEB?= X-IronPort-AV: E=Sophos;i="5.31,546,1473109200"; d="scan'208";a="34096184" Received: from hel-smtp.corp.vaisala.com ([172.24.1.225]) by hel-mailgw-01.vaisala.com with ESMTP; 25 Nov 2016 11:01:17 +0200 Received: from debian8.corp.vaisala.com ([172.24.65.111]) by HEL-SMTP.corp.vaisala.com over TLS secured channel with Microsoft SMTPSVC(8.5.9600.16384); Fri, 25 Nov 2016 11:01:14 +0200 From: Tomas Melin To: u-boot@lists.denx.de Date: Fri, 25 Nov 2016 11:01:03 +0200 Message-Id: <1480064463-17432-1-git-send-email-tomas.melin@vaisala.com> X-Mailer: git-send-email 2.1.4 X-OriginalArrivalTime: 25 Nov 2016 09:01:14.0269 (UTC) FILETIME=[799434D0:01D246FA] Cc: trini@konsulko.com Subject: [U-Boot] [PATCH v3] mmc: add bkops-enable command X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" 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 --- cmd/Kconfig | 9 +++++++++ cmd/mmc.c | 32 ++++++++++++++++++++++++++++++++ drivers/mmc/mmc.c | 34 ++++++++++++++++++++++++++++++++++ include/mmc.h | 6 ++++++ 4 files changed, 81 insertions(+) diff --git a/cmd/Kconfig b/cmd/Kconfig index e339d86..6f9081a 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -550,6 +550,15 @@ 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 command for setting manual background operations handshake + on a eMMC device. The feature is optionally available on eMMC devices + conforming to standard >= 4.41. + 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 - set DSR register value\n" +#ifdef CONFIG_CMD_BKOPS_ENABLE + "mmc bkops-enable - enable background operations handshake on device\n" + " WARNING: This is a write-once setting.\n" +#endif ); /* Old command kept for compatibility. Same as 'mmc info' */ diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 0cec02c..680b5cc 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -1810,3 +1810,37 @@ 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; + } + + 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 manual background operations\n"); + return err; + } + + puts("Enabled manual background operations\n"); + + return 0; +} +#endif diff --git a/include/mmc.h b/include/mmc.h index 5ef37d3..abf72f1 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 & R/W/E */ #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