From patchwork Tue Aug 20 07:18:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Williams X-Patchwork-Id: 1149836 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=marvell.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=marvell.com header.i=@marvell.com header.b="HZEF64g3"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=marvell.onmicrosoft.com header.i=@marvell.onmicrosoft.com header.b="kqF8TbDi"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 46CMby37d4z9s00 for ; Tue, 20 Aug 2019 17:19:10 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 1770DC21F29; Tue, 20 Aug 2019 07:19:00 +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=T_DKIM_INVALID 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 0F57FC21E39; Tue, 20 Aug 2019 07:18:59 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 34526C21DB6; Tue, 20 Aug 2019 07:18:58 +0000 (UTC) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by lists.denx.de (Postfix) with ESMTPS id 956A7C21D83 for ; Tue, 20 Aug 2019 07:18:57 +0000 (UTC) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id x7K7H4gn030588 for ; Tue, 20 Aug 2019 00:18:55 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : content-type : mime-version; s=pfpt0818; bh=PVqZmoTKnlHGJa21RGPjKXqfnnJpOZdQbi9NSwvzBhQ=; b=HZEF64g35MN8VCNpLInS08OFxFhCg3UPe2h58Ms5PlMnkHogtdZqprROh3ys84nvjECm 4h3MOyKZjWi40DtuvePxYXjbxFFjCIPzi0Tp3alZYSvBH+2BKuDF8S6j39L0JqJVSQ+R DnnXrVTrDMgFJF3/kGZJsVF9LJ1fNh0A2UJhHXzB/+Ph5dKf8JKTUhGN8FB9uLWt5oi0 dc/7iCVrZ77UsVJHTjrMIF8L1bslN1OxPM9hCEUejBB92bHTiwiYks0jwyCsTUpR2QKF PjMtFwbQr/HNR/aRajlsd9ce1CQXH2HnyK47VQ1iJMJ62oDLyDWbLaZZYm/xFelIdOBU +w== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 2ug8d78rxx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Tue, 20 Aug 2019 00:18:55 -0700 Received: from SC-EXCH01.marvell.com (10.93.176.81) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Tue, 20 Aug 2019 00:18:53 -0700 Received: from NAM04-BN3-obe.outbound.protection.outlook.com (104.47.46.54) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1367.3 via Frontend Transport; Tue, 20 Aug 2019 00:18:53 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=M1wnSeylHLl9i1NxJlfSYLpOg7ZmFVt9F9m5QqjJKAqnJ9yap7VaehKw0n3Y2qUOdDsGkcO6ULxmTpXvJ2sJ0T6DAJvUtkBOAoxVOdAMYZCyshk2OoiNc5ew47f+4XnUG8xQtVbm7wp5gebnp156pkU94bPu2HMIMdE3tIk+aUDciN8by0OFBviSk9GV+Sxv7qvXM5qGepdGmink+0lGg7EUeTBG1HjWzzSu4tH9ai7/ZM881GP/kVoFa1cNOlk1NW+bNr5tF4+ecFxhtx71s7v+9ZwmB8NoXEdKgL8OTPQ4tn37z6U1UnvJi5yHfvaDGCaGb16jXiwYMiHwbt+wrQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PVqZmoTKnlHGJa21RGPjKXqfnnJpOZdQbi9NSwvzBhQ=; b=IN1ab/wTgD0XLBip57gR5xlltoHiaW1M77QzWl9OI/0TwifGKc3bv3Yu7nL6kBC/+YiXyWjbeGB0/g9dhtKHh5HelfJQkzX6lsl1reFAFR4+MIrDgJEWoRDopyuuQ4B/RNIy0bnnDM/zH/OOTKQbtCWchZz4XEcoboJOjbUUXtI2lKaM/F/dTA2At7Z3e5mvj7OiSxVJrhw3NTFc7GnsM/dv3eT6Kq9Y39ma3vGyhlxOE0MwgmZz5vY+AWxc8yzoqEcxrRyi81HCJ1rDoe7Sp42677zfm22d0hiwn6A233k+9IJNtdk8Yx+L81zCubhm96sHB1FWKtNr4pjSMsbQJw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector2-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=PVqZmoTKnlHGJa21RGPjKXqfnnJpOZdQbi9NSwvzBhQ=; b=kqF8TbDiaNonk7zIsHAP7uHgsWfv1EMKIRJzZRtykhgEGG1+sgGSgg7gYkYY0FscxazCJ/DI2C+9wCMEQtS/0nh63ePGUnzj0azkwr5On6c1RsUGdw5YWX5Ugr8c7eORnNbnZwuOfjQDLkUbO1sYU7AoNJFiqveB1PEppkmwnAo= Received: from BYAPR18MB2440.namprd18.prod.outlook.com (20.179.91.209) by BYAPR18MB2583.namprd18.prod.outlook.com (20.179.93.212) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2157.16; Tue, 20 Aug 2019 07:18:48 +0000 Received: from BYAPR18MB2440.namprd18.prod.outlook.com ([fe80::918c:987e:fd98:9e26]) by BYAPR18MB2440.namprd18.prod.outlook.com ([fe80::918c:987e:fd98:9e26%5]) with mapi id 15.20.2178.018; Tue, 20 Aug 2019 07:18:48 +0000 From: Aaron Williams To: "u-boot@lists.denx.de" Thread-Topic: [PATCH] nvme: Fix PRP Offset Invalid Thread-Index: AQHVVydZE5qcWfHOS029p8RESoYhmQ== Date: Tue, 20 Aug 2019 07:18:48 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [199.233.58.37] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 25477537-5298-4dfb-28e6-08d7253ea50a x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(2017052603328)(7193020); SRVR:BYAPR18MB2583; x-ms-traffictypediagnostic: BYAPR18MB2583: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:4502; x-forefront-prvs: 013568035E x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(4636009)(366004)(346002)(376002)(396003)(39860400002)(136003)(199004)(189003)(3846002)(53936002)(6116002)(256004)(486006)(7736002)(81156014)(476003)(76116006)(99286004)(5640700003)(52536014)(71190400001)(2501003)(8936002)(105004)(74316002)(316002)(55016002)(66066001)(81166006)(54896002)(6916009)(6436002)(5660300002)(14454004)(478600001)(2906002)(19627405001)(2351001)(71200400001)(9686003)(26005)(64756008)(66556008)(33656002)(107886003)(8676002)(102836004)(186003)(6506007)(4326008)(25786009)(66446008)(66476007)(7696005)(86362001)(66946007); DIR:OUT; SFP:1101; SCL:1; SRVR:BYAPR18MB2583; H:BYAPR18MB2440.namprd18.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: marvell.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: W4rBkU3xFaGM86Tqd7rbpFhnmIHgMsawgiO16jAtEOPXo1py8jOTGQ/XjOJ5UapLRAyl3V5zKG/XTEYXQ9vst5POuRWUTG4GAurgYThWPBtWeVD5gfKsrV2DBJjg6FH9XVEZZ26Qmxxg+k/xHdadVCC16p90lKBvy21BuuxauPQsoR/Y/tUuM2rwV2SfVUw5TjXCT04egDJ4lJnLJF3sql5kAkdh2PhZqVP8KQKZ2/VDb/JIFmqfU1Q0/Dht69eRaX9V5zO4aMZPU7TXmXi0EE1edq9vuo9SzqX7+G4eeBWdNn+IVA1tpt5JtuLdA3tBGnmZvCAj2ZtEHdXjL0TLmejFpdnGlmVQttqq+uJOQovAsBoIl5E/RSTjwXXSPi9JIMYO7C53MVhYgc2gmqgPKyfhF6YSrTDXOO2L3XBvJw8= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 25477537-5298-4dfb-28e6-08d7253ea50a X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Aug 2019 07:18:48.1661 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: GkARwKhYw3YXROi0T/u3rOOGUr9rP83UrD0R5aWvMknnfCMUeGeLxonLzkVPFUnT+M+K9YoGNNeHyj2H15Z3WA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR18MB2583 X-OriginatorOrg: marvell.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:5.22.84,1.0.8 definitions=2019-08-20_02:2019-08-19,2019-08-20 signatures=0 X-Content-Filtered-By: Mailman/MimeDel 2.1.18 Subject: [U-Boot] [PATCH] nvme: Fix PRP Offset Invalid 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" When large writes take place I saw a Samsung EVO 970+ return a status value of 0x13, PRP Offset Invalid. I tracked this down to the improper handling of PRP entries. The blocks the PRP entries are placed in cannot cross a page boundary and thus should be allocated on page boundaries. This is how the Linux kernel driver works. With this patch, the PRP pool is allocated on a page boundary and other than the very first allocation, the pool size is a multiple of the page size. Each page can hold (4096 / 8) - 1 entries since the last entry must point to the next page in the pool. Change-Id: I8df66c87d6a6105da556d327d4cc5148e444d20e Signed-off-by: Aaron Williams --- drivers/nvme/nvme.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) -- 2.16.4 diff --git a/drivers/nvme/nvme.c b/drivers/nvme/nvme.c index 7008a54a6d..c94a6d0654 100644 --- a/drivers/nvme/nvme.c +++ b/drivers/nvme/nvme.c @@ -75,6 +75,8 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2, int length = total_len; int i, nprps; length -= (page_size - offset); + u32 prps_per_page = (page_size >> 3) - 1; + u32 num_pages; if (length <= 0) { *prp2 = 0; @@ -90,15 +92,16 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2, } nprps = DIV_ROUND_UP(length, page_size); + num_pages = (nprps + prps_per_page - 1) / prps_per_page; if (nprps > dev->prp_entry_num) { free(dev->prp_pool); - dev->prp_pool = malloc(nprps << 3); + dev->prp_pool = memalign(page_size, num_pages * page_size); if (!dev->prp_pool) { printf("Error: malloc prp_pool fail\n"); return -ENOMEM; } - dev->prp_entry_num = nprps; + dev->prp_entry_num = ((page_size >> 3) - 1) * num_pages; } prp_pool = dev->prp_pool; @@ -115,6 +118,7 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2, nprps--; } *prp2 = (ulong)dev->prp_pool; + flush_dcache_range(*prp2, *prp2 + (num_pages * page_size)); return 0; } @@ -791,7 +795,7 @@ static int nvme_probe(struct udevice *udev) } memset(ndev->queues, 0, NVME_Q_NUM * sizeof(struct nvme_queue *)); - ndev->prp_pool = malloc(MAX_PRP_POOL); + ndev->prp_pool = memalign(1 << 12, MAX_PRP_POOL); if (!ndev->prp_pool) { ret = -ENOMEM; printf("Error: %s: Out of memory!\n", udev->name);