Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp134871ybi; Tue, 16 Jul 2019 17:46:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqxtqosaR5lV7eUlHSEQPgBDfdq5FiXwNrmKUY642cnVJo1DS5jlcYBpBeKb+rMyeyDO2ItN X-Received: by 2002:a17:902:3341:: with SMTP id a59mr38556705plc.186.1563324412790; Tue, 16 Jul 2019 17:46:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1563324412; cv=none; d=google.com; s=arc-20160816; b=wuLdMBKUnAdsauwx+YmAmlafRK8lZNOGOWSMpYaApiXfBaM0ymjlSdfT+O5+ZDUlF3 6N+dhDh2Oa/dLer+CNlpKqfmLF5EU5hE0c/d7VFARiZ1JjHYWNIcyZQA1toXvyvrtU3b J0qpwqlqWtgsEB8E8Qfoje0exXd56zD9jY2YAx9olx4uTrxwQSeoKPsz9eI/X/Z06WB8 1JfNg6k3Yfme980YxcjCNPMnuepL3SaxJuJJNK9As7RyNtxbNYunPSCA+ItjyMiOGUoi cFf9/672AIEmYXvTMbLm8L0TtwAihR7ByaXgedi7epTeEZLVcgxfZtKycmZwlHZQ6qe0 v5Mg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=mkectooDcRo8CMfMRmyjbx6SZV3KqSFn/K3C9alofEU=; b=iSRrOCDk51CvXxXof3JBTTBvjfF/2B6gD+C2ro6p6ufncEsuQ2ETVN3Vg7JM24CRoA ZXsNdvBqoSuIIV27F9ouXuZSeLGcd2jusoFbCjNzhqMAiw0PazGrip8ISaHw95Ovg2OF q81nM+Gy9FbVQT3D6g4xDZFTtSnJhYOkqXVX4Vb6ABObjgpUYNPYhRB+NiA8X4DqO4ce QdGkt61vuxY3LB9sh4T31PpYzEmoGV+zxEz0eW2tC0iOKUX/rQXJTz5EAeGawGGUZgOi v9TT1DpkrvnSCwdSDAjH267CX9biLVC4vG0UlTy2E/ioUb+ahsqLGAl4OCPhMRwauTo4 0mvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o93si15652870pje.38.2019.07.16.17.46.23; Tue, 16 Jul 2019 17:46:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389098AbfGQApy (ORCPT + 99 others); Tue, 16 Jul 2019 20:45:54 -0400 Received: from gate.crashing.org ([63.228.1.57]:56499 "EHLO gate.crashing.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726344AbfGQApy (ORCPT ); Tue, 16 Jul 2019 20:45:54 -0400 Received: from ufdda393ec48b57.ant.amazon.com (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id x6H0jXnj032429; Tue, 16 Jul 2019 19:45:41 -0500 From: Benjamin Herrenschmidt To: linux-nvme@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Jens Axboe , Keith Busch , Christoph Hellwig , Paul Pawlowski , Benjamin Herrenschmidt Subject: [PATCH v2 3/3] nvme-pci: Add support for Apple 2018+ models Date: Wed, 17 Jul 2019 10:45:27 +1000 Message-Id: <20190717004527.30363-3-benh@kernel.crashing.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190717004527.30363-1-benh@kernel.crashing.org> References: <20190717004527.30363-1-benh@kernel.crashing.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Based on reverse engineering and original patch by Paul Pawlowski This adds support for Apple weird implementation of NVME in their 2018 or later machines. It accounts for the twice-as-big SQ entries for the IO queues, and the fact that only interrupt vector 0 appears to function properly. Signed-off-by: Benjamin Herrenschmidt # Conflicts: # drivers/nvme/host/core.c --- drivers/nvme/host/nvme.h | 10 ++++++++++ drivers/nvme/host/pci.c | 21 ++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 716a876119c8..ced0e0a7e039 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -92,6 +92,16 @@ enum nvme_quirks { * Broken Write Zeroes. */ NVME_QUIRK_DISABLE_WRITE_ZEROES = (1 << 9), + + /* + * Use only one interrupt vector for all queues + */ + NVME_QUIRK_SINGLE_VECTOR = (1 << 10), + + /* + * Use non-standard 128 bytes SQEs. + */ + NVME_QUIRK_128_BYTES_SQES = (1 << 11), }; /* diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 1637677afb78..7088971d4c42 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2081,6 +2081,13 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) dev->io_queues[HCTX_TYPE_DEFAULT] = 1; dev->io_queues[HCTX_TYPE_READ] = 0; + /* + * Some Apple controllers require all queues to use the + * first vector. + */ + if (dev->ctrl.quirks & NVME_QUIRK_SINGLE_VECTOR) + irq_queues = 1; + return pci_alloc_irq_vectors_affinity(pdev, 1, irq_queues, PCI_IRQ_ALL_TYPES | PCI_IRQ_AFFINITY, &affd); } @@ -2322,7 +2329,16 @@ static int nvme_pci_enable(struct nvme_dev *dev) io_queue_depth); dev->db_stride = 1 << NVME_CAP_STRIDE(dev->ctrl.cap); dev->dbs = dev->bar + 4096; - dev->io_sqes = NVME_NVM_IOSQES; + + /* + * Some Apple controllers require a non-standard SQE size. + * Interestingly they also seem to ignore the CC:IOSQES register + * so we don't bother updating it here. + */ + if (dev->ctrl.quirks & NVME_QUIRK_128_BYTES_SQES) + dev->io_sqes = 7; + else + dev->io_sqes = NVME_NVM_IOSQES; /* * Temporary fix for the Apple controller found in the MacBook8,1 and @@ -3039,6 +3055,9 @@ static const struct pci_device_id nvme_id_table[] = { { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) }, { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001) }, { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) }, + { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2005), + .driver_data = NVME_QUIRK_SINGLE_VECTOR | + NVME_QUIRK_128_BYTES_SQES }, { 0, } }; MODULE_DEVICE_TABLE(pci, nvme_id_table); -- 2.17.1