nvme: add 48-bit DMA address quirk for Amazon NVMe controllers
authorFilippo Sironi <sironi@amazon.de>
Wed, 10 Feb 2021 00:39:42 +0000 (01:39 +0100)
committerChristoph Hellwig <hch@lst.de>
Wed, 10 Feb 2021 15:38:06 +0000 (16:38 +0100)
Some Amazon NVMe controllers do not follow the NVMe specification
and are limited to 48-bit DMA addresses.  Add a quirk to force
bounce buffering if needed and limit the IOVA allocation for these
devices.

This affects all current Amazon NVMe controllers that expose EBS
volumes (0x0061, 0x0065, 0x8061) and local instance storage
(0xcd00, 0xcd01, 0xcd02).

Signed-off-by: Filippo Sironi <sironi@amazon.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/nvme.h
drivers/nvme/host/pci.c

index 2efb876..07b3417 100644 (file)
@@ -144,6 +144,12 @@ enum nvme_quirks {
         * NVMe 1.3 compliance.
         */
        NVME_QUIRK_NO_NS_DESC_LIST              = (1 << 15),
+
+       /*
+        * The controller does not properly handle DMA addresses over
+        * 48 bits.
+        */
+       NVME_QUIRK_DMA_ADDRESS_BITS_48          = (1 << 16),
 };
 
 /*
index 5b78e68..0045c5e 100644 (file)
@@ -2362,13 +2362,16 @@ static int nvme_pci_enable(struct nvme_dev *dev)
 {
        int result = -ENOMEM;
        struct pci_dev *pdev = to_pci_dev(dev->dev);
+       int dma_address_bits = 64;
 
        if (pci_enable_device_mem(pdev))
                return result;
 
        pci_set_master(pdev);
 
-       if (dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(64)))
+       if (dev->ctrl.quirks & NVME_QUIRK_DMA_ADDRESS_BITS_48)
+               dma_address_bits = 48;
+       if (dma_set_mask_and_coherent(dev->dev, DMA_BIT_MASK(dma_address_bits)))
                goto disable;
 
        if (readl(dev->bar + NVME_REG_CSTS) == -1) {
@@ -3257,6 +3260,22 @@ static const struct pci_device_id nvme_id_table[] = {
                .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
        { PCI_DEVICE(0x15b7, 0x2001),   /*  Sandisk Skyhawk */
                .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
+       { PCI_DEVICE(0x1d97, 0x2263),   /* SPCC */
+               .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
+       { PCI_DEVICE(0x2646, 0x2263),   /* KINGSTON A2000 NVMe SSD  */
+               .driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0061),
+               .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0065),
+               .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x8061),
+               .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0xcd00),
+               .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0xcd01),
+               .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0xcd02),
+               .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001),
                .driver_data = NVME_QUIRK_SINGLE_VECTOR },
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },