From patchwork Fri Apr 21 03:01:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhikang Zhang X-Patchwork-Id: 753089 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3w8LY93fqdz9s73 for ; Fri, 21 Apr 2017 13:18:37 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 3B216C21DE3; Fri, 21 Apr 2017 03:18:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAD_ENC_HEADER, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 1E4CDC21DFC; Fri, 21 Apr 2017 03:17:16 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 2B930C21E01; Fri, 21 Apr 2017 03:16:53 +0000 (UTC) Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0079.outbound.protection.outlook.com [104.47.40.79]) by lists.denx.de (Postfix) with ESMTPS id AFE34C21DED for ; Fri, 21 Apr 2017 03:16:49 +0000 (UTC) Received: from BLUPR0301CA0033.namprd03.prod.outlook.com (10.162.113.171) by CY1PR0301MB1195.namprd03.prod.outlook.com (10.160.165.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1034.10; Fri, 21 Apr 2017 03:16:44 +0000 Received: from BN1AFFO11FD033.protection.gbl (2a01:111:f400:7c10::148) by BLUPR0301CA0033.outlook.office365.com (2a01:111:e400:5259::43) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1047.13 via Frontend Transport; Fri, 21 Apr 2017 03:16:43 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1AFFO11FD033.mail.protection.outlook.com (10.58.52.246) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1019.14 via Frontend Transport; Fri, 21 Apr 2017 03:16:42 +0000 Received: from titan.ap.freescale.net ([10.192.208.233]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v3L3GYG6031670; Thu, 20 Apr 2017 20:16:40 -0700 From: Zhikang Zhang To: , Date: Fri, 21 Apr 2017 11:01:29 +0800 Message-ID: <1492743689-40341-3-git-send-email-zhikang.zhang@nxp.com> X-Mailer: git-send-email 2.1.0.27.g96db324 In-Reply-To: <1492743689-40341-1-git-send-email-zhikang.zhang@nxp.com> References: <1492743689-40341-1-git-send-email-zhikang.zhang@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131372182031145997; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39850400002)(39860400002)(39840400002)(39400400002)(39410400002)(39450400003)(39380400002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(9170700003)(104016004)(6666003)(2950100002)(48376002)(36756003)(86362001)(85426001)(305945005)(189998001)(4326008)(5660300001)(8676002)(38730400002)(47776003)(54906002)(50986999)(356003)(106466001)(76176999)(5003940100001)(50466002)(105606002)(8656002)(53936002)(8936002)(33646002)(77096006)(81166006)(50226002)(2906002)(142933001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0301MB1195; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; MLV:ovrnspm; MX:1; A:1; PTR:InfoDomainNonexistent; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD033; 1:JUALA1XfdyUKC2+moBPJf37+687yEpcge7DZrogylpJqy80hgqvVmjKmDLl56xn7LoOWq6uhhEa0HhXA40TAlQDVJqfrW5HZ0L0Eaw9+AIuJwNgqVwIWhB6l1TlkemQ6lIj0dIKatTJMT3l28jMCZNa813aRWpe7GTqXcV0kZUOGwu3AeIJLnssMXeYoPt74GA5M1Of8YzjMLtrU7XxhBu6oMHx0YqP9ncT3INH8lQjGMiTtBjoriL5TjQ3PHSoj4AHB/ZQx2kQ+BqMBIGFdXMidof0zeQCn1qfQ6mO2K3k3dgui06atzjbAgcYcefHogtHc8O6YnPweUB+zfFDqCKNvOOFfQcqepx1JaGxFAMdHrwYh/cD4BP4cJNbV7HhVahBgWwcX7vvM0Y092cqpcuT3QPW1VZsV/9DkrnJvCvAZfTapSOzpg/EDFlSe9Ei/yW9z0Fp62Eec2JluNydPPrRukpvhEuQ28exgi/f1I41Uplv3e1+iUpOt1hE1beBneVUUMZlQfBqDDGMTGpn5ozW54WQOIRFSpkveTJ8lwUT2IsWnRpCLyD7fXNZHUGVvFx2vqEnG7vIfnBtxxD1AmW91PEgUAONagax67YRXP9lFTUMGSEPpZegR9UBdw/n9CKIWPWWNUWbptZwACq31FMUf/Ogfg717ljYJZwcVCTJCiDrD/QB98PfWe3lwZ5q4ZNYLRzzRwfBFAxinV+13sV/FSXjgoyFoSGD/NPQ/eUE= MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: fc1dc336-32df-46fe-910d-08d48864d5b9 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131430075)(201703131517081); SRVR:CY1PR0301MB1195; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1195; 3:r0wEdL+F+ulL/t5nUCEX7gBtBy44T/RWUg3KuciNBlHjBhEZS1zUP8HfoA0nRTbuqaFeOqCYcAj6MqZxSqckb2JhO36TJ6010b4T1v99kqqHPvbwJkaMdpm2p0h74HJYwhU3ju+78CyWEV0qoKFYRlFm3GC64cm9ZDQ0rkIgi6HpZakHXElmA7IOJDQs+mImFbjhqR5ZE4LPJwC+Kho3Mo3ZMNvuMaezDQ5JwMIlliyPJC8rCPBHSfMgPM/MoD0TJvR3j+6Mav4VO7yyHqaEPVAYNUZh7oyv4de0guzDB8j6t7pfhOkZgf45BveO2R9JbfoXjQ4BNl80+ZvWDDZIW4HVSSrcSN38FWzFZ/0A1yNQATkVEgnC/2GrDtgu4BLSNPX4S3YCX6w1y6MNJdKuaAtfDoiumRbq9wYSMF6T1yNmkevtCRt7VTK2BRtAngft; 25:pcfs24/FZQU2e1jr49lWOJAuEucLIeQL+YiEmd9aWnCtT65Nx4/d/LAH0878CUAnOXE50bGIz41CRV0dFuX3bPEyqGNEHzZ4aJBIo9qrCGDDWY1qy5GnAEqw47Z1E6ItJH7+NITrnrf5LlAqJRpnGWkmv0rqztL+2dDxsLBCaAyAe8/7MaFasZe1Vtd8lnFwLPwLG9WNJtzByqtvVSwrBaRsrgQZs1SPIucsQMDZtA0yqqozFB2yua6HYA3vsrdZBoJDBkzlC2oFaVmVODccjWj8KabFPRcULSjsI+ukEwR+i9qCUzFsi/CTcD27gjjQltkgJ/zs9M3brQ/zMcbexiM0f8iutOozCwBmLmxUVOt6sZaJBX8CUE/UJa117fyJGq56jhQV066WXEsh0v6VFE0TGkwrNZfN/CaggXyLcw9WRlYvjrckw+A8wu5H77LZ+9/PZ1AOMNuNFE0nqlAVoA== X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1195; 31:J0oT7a0xmPA78vxKQ+5e7gSTIqDm9lrTLqI1hUrhFeGoA+umMuziLSLtuJwQ8QtYztmwnu0a06QfU4QxMGM9Zm9tRz613T3J0wzeULgKT2/ObEeFyptiiMe9ZRRKlow9Ol3osYn3i0Eprg+j9UTnvLDpIZv6GWJiOP4yI2FNmxR2RsnaelEvqaP65oUqME+xA+Zlxb/kgDS2g9vOvDex1v6wALTVt0sa/GMzXLoa15i27/RLzg6dhybms0wbBuP824QX9YYNWABbcEGDjWvM/tpN+Y8Rwuy9nBy6HoKNJgQ= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095135)(601004)(2401047)(13017025)(13024025)(13023025)(13018025)(8121501046)(13015025)(5005006)(3002001)(10201501046)(93006095)(93001095)(6055026)(6096035)(201703131430075)(201703131441075)(201703131448075)(201703131433075)(201703161259150)(20161123556025)(20161123563025)(20161123565025)(20161123561025); SRVR:CY1PR0301MB1195; BCL:0; PCL:0; RULEID:(400006); SRVR:CY1PR0301MB1195; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1195; 4:Tn9yhT+1aJYcrwlKaLvA/US6ZO30ws6eFKD3w+vOSSDIFF+qi78tiFslPPUq0caljAVjqJ5J/psTSod+QOkgmowCvhY+LFG7DIY2KWaM7xmILg2XcTKsHZTrC+/PiMlj1XD9Xt2aoZy0LHmVUINZWk3JtdBQ9hsvFAArAVUmwcwxfQ1godWCqcFkT57sgHxz+rxeP3YUQrD9q/GONea4+AJoHBi8q/j2uPx1nC964lD7dz+ZEOmURZiv2gPAgkeIoVwhMYSMNz1IXVrhf+8B0NAxyvltfrGbO8wArCF+fJaOyNvuVib1U0iQbfI2tAYhYPAhBff0ea4E65Mz2ZuYsztqkmGS0hXX999Uxwqf/YVSinQepPLkZdgpkocPhyuGu2O3hvIEAudt2Y332EVXbVcr5Po527cnmjaIUYvkmdsXJvODJyfcfqGD6EW66yzICxAa0ZBaVx02TbHZ8CI65gR1AmJcgXwh6Qp7stAskfiPfZAqM3n8MKWz9cd2Nz3BNsK0MOCRn1kplSgsonEWl4gi6lBH19XG4frN32JPM6BlJPJiW49/91J2E3KmIYqYw9UadqlPBFSsa/Pj0EzX1UGi2FFpWGgEPHvBi6HaH9c0B7Q9bYepSybtbPFbleoR5PRn3UZOQvsL9ahzVum6m7GUJiY7tkq99fp+6o7WA+xWmhjyzsLS/1HET267hHgP5J7iM7dTThNFd69JLnUK8kGHYvVtP12WJJ5eT0Yt5i0ikqvo3Yq/V2PVdq+JRCHxyRj3EqhLwGxC2XYq0GpvAc5jVIaNdQuT5LaLhF1khVmKO9R5jc/iMUY403+FDUWCvEUmtTSKk/egzkyU6Bfo4NbXFpG0sIuMvOx4bqTRmc8pgV5KnA2eu5K7kY0D4nX/MnBJ7BDjjyfdbPnHJP+it0+Cd/Z+VdmdhbuKAeg6RXI= X-Forefront-PRVS: 02843AA9E0 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0301MB1195; 23:0FF7ZCV3bHnTZPFjkdZX6nfonR+Ppg2no/fW3tT?= =?us-ascii?Q?sNznDw5F/WokpSfd5uInkkLelP27NKDEfPexYnshsnGEEw3HLs6ArH3u8Px+?= =?us-ascii?Q?6ta9tDMbVhRbo24DrUxiVeyUXQrjreYuNWtdpinzoSZQY8zqyt/6hbz1miD3?= =?us-ascii?Q?90sbrvbjLChkQs1ykgt0agKYgGG1RRihl7Z+Ol/97Pz8qhuy1ykxgE8RRsLA?= =?us-ascii?Q?0KFSDG1pXb9YVcqL2c0OZDR8Y4cabmYIq7SCdqhNSITcjgThyNNdpdeq/2gQ?= =?us-ascii?Q?Ng2ZBs7ft7pfStTTGnvArHgymfTQVwNpvlUnS3UpGH5DkqM1HyC1AzDHKndL?= =?us-ascii?Q?eK6XipaGFDbI6mDXDVTL+RMB/dKOTKTfayXvpqMD00OWOTsr95FvQqS38cxR?= =?us-ascii?Q?ZgwPSl+K8V3Xa6Av5+V10REXur5S7rDbS/op7FVn4Mey2sXoxVaCb0CUvhsv?= =?us-ascii?Q?MTh4ew4XSd+bQqE3dDb78iR/H/sjqkMiYslyd3yPJwal0M4kvTLm6dGtsDzd?= =?us-ascii?Q?LObDsBKWWxrppISMDDAqYY8qcfX8IEU2iVoOPk96ACE3zZkn/rytaaNGP51X?= =?us-ascii?Q?+XTfenV4DWR8PK1NBBxdpYsUyi1FsnsLPcwJ1kpYxt7SB1mfLKIrYr+7U1hf?= =?us-ascii?Q?TEAoS/EAvk575tVE2Rn60L4PTz7oj+uAIkvWSIYPA5zhHn4cp/W/PPyKC9nc?= =?us-ascii?Q?UaKPkYWyZSf3uExXgOShnEa87VeyrvpbWTwRngeZXK2rPGJUya/HR9izu590?= =?us-ascii?Q?IzsWpF7/zFVGd8hWScf8du+BnGed/QwH7pDDDA9T/9YkiiMlSLQpkNCrTTmM?= =?us-ascii?Q?B7nGB7mE27JPJg/lTFixtaXxfi9wDBCRcFr2CrVJRC4l+pPRGfWKT8adHoHc?= =?us-ascii?Q?IxmK9KWK23yr2WL9lXxVrMelT96NZ+NoUT1yW1K0eRzHG4HiMA0zHcL9EjZN?= =?us-ascii?Q?VXdJaPevO3oakZ8Pnzz6Pdn6ryY86hW99X7UoluTUJN8CsyrbjkaV2EPQqw4?= =?us-ascii?Q?WBT2BkjmL2XChBJ/iOKisiio+5QcwxMZq1sEOP+dlTiKbZAfOw5SJ8u7v+Bs?= =?us-ascii?Q?nK6G+hYDIbRBG2Sd07WfC7dc4BBIIhorszV8vtyjk+54SLujoca//Z2v13xB?= =?us-ascii?Q?feROe4vY8B2jeTROElz/53Mau05z4OMiOEImb4YNrUAXH83s3C2giPOkdtuw?= =?us-ascii?Q?xg8pGKpCUF/lRwpU=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1195; 6:WBlCgcy7EulehIwvcC41MF0ch/99dMbORvFyK0EYPByUKBwD2UTNVyZqM8Vq/yr0mO07MOVshOdFbRRX6OylXuo/Qe5biRVMGcaAZ/pSvXmKMiD0q30NBMtZslqgRIPpRaDGlgXMxrkb2iQYuVIjecVFUJO4DDFBrroNKz9ztxvMsJLo+CBebXBxXZkPLkH1ha8jfYhptXqRqOuWTkd4Ov346aNEdtE5yPxYqOe4WhiqMxvJgy2a3N6LHq6g5UDk+KINsH0wtBk1ZcW5K0pvRdZtt4h8byqw7TnzkuSYHI5nfFUHb/tnNK5/bxSZU1crPjF5hEvnlVKjUINl/Yry4xt1JD29wugSZCwWnV8UW4amDmTw5e71yLDu5M5N5sw+2I1WobFAHoygViRPNzwmpYv210nRpJDAMJWAu5xET1lP/V8D4f2xYDVapYzwJldGUTOzGUL4phZCy+GGzSmk/yKD5xKBHgJ/fsdndmTUH/mhHgmxhXBiefm2yuW4goFU; 5:kYfEXRAIXEA4pWtScttLvwVNF/tmo4+hKMfXGSQ3bRClpAbvwmt4kZLRMkW7l59MR3FMh/ENsb2a8ug4jqPvfv37naaFpAmDkY+g5RTauN3C4YTsQs9e3PY9qNVq1Prsz6gEcNNYZ8wQEfq/96JfNDQ+TO7GNIP3gq8jNPDEuD0KV1v77evpcLCtxBqVUgNZ; 24:kZe/iBxirlAzcyfiW//sd+lGCWfQviZVin1/EMpWjYKzGzafakc/Hpqq+iP89aLtB9odHXhI7rkgQ1LD1If9V+PFmMEVMLrajDScD50Qjd4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1195; 7:uQyWld6jocY/bpYkFLsP8W5NwtLjtvnRyrSRRbw9kVNw5ywAitefpgfK6X8XxFCJJsyc8D5Mdau70MUrUK6Z/N4kbJvKG4Fo3A0XG+rBKvv6njU2ZzHzL2Z28hvlYgXyW3Opme8uhOZ9wZLqF0Aljq1e5LUiR2yPuhrx6posWtnc2o7XbB48UQevl4HzwggGTdVf6okXf0uelgTMiYvY6t2KU+w+oru/zuhRWmLErOTXvbx6bHx57B3WIIu6McS3US5H5HpB4jSSkK39bt/80ZuwHPvLKJYPL/ZSqaox0AOg/n2MrgzXMwCN/C8vaSAQBTx9Kj0oXFgGeGMx5eJSsw== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Apr 2017 03:16:42.8337 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1195 Cc: Zhikang Zhang , wenbin.song@nxp.com, mingkai.hu@nxp.com Subject: [U-Boot] [RFC,v2 2/2] NVMe: add nvme commands X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Add nvme commands in U-Boot command line. 1. "nvme list" - show all available NVMe blk devices 2. "nvme info" - show current or a specific NVMe blk device 3. "nvme device" - show or set current device 4. "nvme part" - print partition table 5. "nvme read" - read data from NVMe blk device 6. "nvme write" - write data to NVMe blk device Signed-off-by: Zhikang Zhang Signed-off-by: Wenbin Song --- Changes for v2: - remove the calling of "initialie" in fuction "do_nvmecops" - change the function "do_nvme_info" to support BLK uclass --- cmd/Kconfig | 9 +++ cmd/Makefile | 1 + cmd/nvme.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ disk/part.c | 6 ++ doc/README.nvme | 54 ++++++++++++++++++ 5 files changed, 243 insertions(+) create mode 100644 cmd/nvme.c diff --git a/cmd/Kconfig b/cmd/Kconfig index 13dc46a..e30814b 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -502,6 +502,15 @@ config CMD_USB help USB support. +config CMD_NVME + bool "NVMe" + depends on NVME + help + NVMe support. + This enables nvme commands in command line + You can use comamnd "nvme" to show what commands it supports + such as "nvme info" "nvme list". + config CMD_DFU bool "dfu" select USB_FUNCTION_DFU diff --git a/cmd/Makefile b/cmd/Makefile index 97c862f..941100e 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -111,6 +111,7 @@ obj-$(CONFIG_CMD_REISER) += reiser.o obj-$(CONFIG_CMD_REMOTEPROC) += remoteproc.o obj-$(CONFIG_SANDBOX) += host.o obj-$(CONFIG_CMD_SATA) += sata.o +obj-$(CONFIG_CMD_NVME) += nvme.o obj-$(CONFIG_CMD_SF) += sf.o obj-$(CONFIG_SCSI) += scsi.o disk.o obj-$(CONFIG_CMD_SHA1SUM) += sha1sum.o diff --git a/cmd/nvme.c b/cmd/nvme.c new file mode 100644 index 0000000..8dc1f14 --- /dev/null +++ b/cmd/nvme.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2017 NXP Semiconductors + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include + +static int nvme_curr_device; + +static int do_nvme_list(cmd_tbl_t *cmdtp, int flag, + int argc, char * const argv[]) +{ + blk_list_devices(IF_TYPE_NVME); + return CMD_RET_SUCCESS; +} + +static int do_nvme_info(cmd_tbl_t *cmdtp, int flag, + int argc, char * const argv[]) +{ + int devnum; + struct udevice *udev; + int ret; + if (argc > 1) + devnum = (int)simple_strtoul(argv[1], NULL, 10); + else + devnum = nvme_curr_device; + ret = blk_get_device(IF_TYPE_NVME, devnum, &udev); + if (ret < 0) + return ret; + + nvme_print_info(udev); + return CMD_RET_SUCCESS; +} + +static int do_nvme_device(cmd_tbl_t *cmdtp, int flag, + int argc, char * const argv[]) +{ + if (argc > 1) { + int devnum = (int)simple_strtoul(argv[1], NULL, 10); + if (!blk_show_device(IF_TYPE_NVME, devnum)) { + nvme_curr_device = devnum; + printf("... is now current device\n"); + } else { + return CMD_RET_FAILURE; + } + } else { + blk_show_device(IF_TYPE_NVME, nvme_curr_device); + } + + return CMD_RET_SUCCESS; +} + +static int do_nvme_part(cmd_tbl_t *cmdtp, int flag, + int argc, char * const argv[]) +{ + if (argc > 1) { + int devnum = (int)simple_strtoul(argv[2], NULL, 10); + if (blk_print_part_devnum(IF_TYPE_NVME, devnum)) { + printf("\nNVME device %d not available\n", devnum); + return CMD_RET_FAILURE; + } + } else { + blk_print_part_devnum(IF_TYPE_NVME, nvme_curr_device); + } + + return CMD_RET_SUCCESS; +} + +static int do_nvme_read(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + unsigned long time; + if (argc != 4) + return CMD_RET_USAGE; + + ulong addr = simple_strtoul(argv[1], NULL, 16); + ulong cnt = simple_strtoul(argv[3], NULL, 16); + ulong n; + lbaint_t blk = simple_strtoul(argv[2], NULL, 16); + + printf("\nNVME read: device %d block # %ld, count %ld ... ", + nvme_curr_device, blk, cnt); + + time = get_timer(0); + n = blk_read_devnum(IF_TYPE_NVME, nvme_curr_device, blk, + cnt, (ulong *)addr); + time = get_timer(time); + + printf("read: %s\n", (n == cnt) ? "OK" : "ERROR"); + printf("%lu bytes read in %lu ms", cnt * 512, time); + if (time > 0) { + puts(" ("); + print_size(div_u64(cnt * 512, time) * 1000, "/s"); + puts(")"); + } + puts("\n"); + return (n == cnt) ? 0 : 1; +} + +static int do_nvme_write(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + unsigned long time; + if (argc != 4) + return CMD_RET_USAGE; + + ulong addr = simple_strtoul(argv[1], NULL, 16); + ulong cnt = simple_strtoul(argv[3], NULL, 16); + ulong n; + lbaint_t blk = simple_strtoul(argv[2], NULL, 16); + + printf("\nNVME write: device %d block # %ld, count %ld ... ", + nvme_curr_device, blk, cnt); + + time = get_timer(0); + n = blk_write_devnum(IF_TYPE_NVME, nvme_curr_device, blk, + cnt, (ulong *)addr); + time = get_timer(time); + + printf("write: %s\n", (n == cnt) ? "OK" : "ERROR"); + printf("%lu bytes read in %lu ms", cnt * 512, time); + if (time > 0) { + puts(" ("); + print_size(div_u64(cnt * 512, time) * 1000, "/s"); + puts(")"); + } + puts("\n"); + return (n == cnt) ? 0 : 1; +} + +static cmd_tbl_t cmd_nvme[] = { + U_BOOT_CMD_MKENT(list, 1, 1, do_nvme_list, "", ""), + U_BOOT_CMD_MKENT(info, 2, 1, do_nvme_info, "", ""), + U_BOOT_CMD_MKENT(device, 2, 1, do_nvme_device, "", ""), + U_BOOT_CMD_MKENT(part, 2, 1, do_nvme_part, "", ""), + U_BOOT_CMD_MKENT(write, 4, 0, do_nvme_write, "", ""), + U_BOOT_CMD_MKENT(read, 4, 0, do_nvme_read, "", "") +}; + +static int do_nvmecops(cmd_tbl_t *cmdtp, int flag, int argc, + char * const argv[]) +{ + cmd_tbl_t *cp; + + cp = find_cmd_tbl(argv[1], cmd_nvme, ARRAY_SIZE(cmd_nvme)); + + argc--; + argv++; + + if (cp == NULL || argc > cp->maxargs) + return CMD_RET_USAGE; + + if (flag == CMD_FLAG_REPEAT && !cp->repeatable) + return CMD_RET_SUCCESS; + + return cp->cmd(cmdtp, flag, argc, argv); +} + +U_BOOT_CMD( + nvme, 8, 1, do_nvmecops, + "NVME sub system", + "\nnvme list - show all available NVME blk devices\n" + "nvme info [dev]- show current or a specific NVME blk device\n" + "nvme device [dev] - show or set current device\n" + "nvme part [dev] - print partition table\n" + "nvme read addr blk# cnt\n" + "nvme write addr blk# cnt" +); diff --git a/disk/part.c b/disk/part.c index cd44702..983104e 100644 --- a/disk/part.c +++ b/disk/part.c @@ -140,6 +140,12 @@ void dev_print (struct blk_desc *dev_desc) case IF_TYPE_DOC: puts("device type DOC\n"); return; + case IF_TYPE_NVME: + printf("Vendor: %s Rev: %s Prod: %s\n", + dev_desc->vendor, + dev_desc->revision, + dev_desc->product); + break; case IF_TYPE_UNKNOWN: puts("device type unknown\n"); return; diff --git a/doc/README.nvme b/doc/README.nvme index b429715..9ecb314 100644 --- a/doc/README.nvme +++ b/doc/README.nvme @@ -28,3 +28,57 @@ You can also get/set other features through standard commands. NVMe Config Switches: --------------------- CONFIG_NVME enables basic NVMe device support +CONFIG_CMD_NVME enables basic NVMe command + + +NVMe usage in U-boot: +--------------------- + +Two ways to operate the hard disk + +* Raw read/write block from/to NVMe hard disk; +* load read file from ext2/fat/ext4 filesytems in hard disk + +1 How to know the information of all the NVMe hard disk? + + => nvme info + +2 How to list all of the NVMe hard disks? + + => nvme list + +Device 0: Vendor: 0x8086 Rev: 8DV10131 Prod: CVFT535600LS400BGN + Type: Hard Disk + Capacity: 381554.0 MB = 372.6 GB (781422768 x 512) + +3 How to raw write the kernel.itb to a NVMe hard disk? + + Notes: Hard disk sectors are normally 512 bytes, so + 0x1000 sectors = 2 MBytes + + wirte kernel.itb + => tftp 80000000 /tftpboot/kernel.itb + => nvme write 80000000 0 11000 + +4 How to raw read the kernel.itb from a NVMe hard disk? + + load kernel.itb + => nvme read a0000000 0 11000 + + boot + => bootm a0000000 + +5 How to load image from fat filesystem in U-boot? + + U-boot doesn't support fat write to hard disk, so + the files must be written by other means (e.g. linux). + + => fatls nvme 0:1 + 32376967 kernel.itb + 22929408 100m + + 2 file(s), 0 dir(s) + + => fatload nvme 0:1 a0000000 /kernel.itb + + => bootm a0000000