diff options
Diffstat (limited to 'drivers/nvme/host/pci.c')
| -rw-r--r-- | drivers/nvme/host/pci.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 4c644bb7f069..e2634f437f33 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -2172,6 +2172,7 @@ out:  static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)  { +	unsigned long dma_merge_boundary = dma_get_merge_boundary(dev->dev);  	u64 min_chunk = min_t(u64, preferred, PAGE_SIZE * MAX_ORDER_NR_PAGES);  	u64 hmminds = max_t(u32, dev->ctrl.hmminds * 4096, PAGE_SIZE * 2);  	u64 chunk_size; @@ -2180,7 +2181,7 @@ static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)  	 * If there is an IOMMU that can merge pages, try a virtually  	 * non-contiguous allocation for a single segment first.  	 */ -	if (!(PAGE_SIZE & dma_get_merge_boundary(dev->dev))) { +	if (dma_merge_boundary && (PAGE_SIZE & dma_merge_boundary) == 0) {  		if (!nvme_alloc_host_mem_single(dev, preferred))  			return 0;  	} @@ -2833,15 +2834,20 @@ static int nvme_disable_prepare_reset(struct nvme_dev *dev, bool shutdown)  static int nvme_setup_prp_pools(struct nvme_dev *dev)  { +	size_t small_align = 256; +  	dev->prp_page_pool = dma_pool_create("prp list page", dev->dev,  						NVME_CTRL_PAGE_SIZE,  						NVME_CTRL_PAGE_SIZE, 0);  	if (!dev->prp_page_pool)  		return -ENOMEM; +	if (dev->ctrl.quirks & NVME_QUIRK_DMAPOOL_ALIGN_512) +		small_align = 512; +  	/* Optimisation for I/Os between 4k and 128k */  	dev->prp_small_pool = dma_pool_create("prp list 256", dev->dev, -						256, 256, 0); +						256, small_align, 0);  	if (!dev->prp_small_pool) {  		dma_pool_destroy(dev->prp_page_pool);  		return -ENOMEM; @@ -3588,12 +3594,10 @@ static const struct pci_device_id nvme_id_table[] = {  				NVME_QUIRK_DEALLOCATE_ZEROES, },  	{ PCI_VDEVICE(INTEL, 0x0a54),	/* Intel P4500/P4600 */  		.driver_data = NVME_QUIRK_STRIPE_SIZE | -				NVME_QUIRK_DEALLOCATE_ZEROES |  				NVME_QUIRK_IGNORE_DEV_SUBNQN |  				NVME_QUIRK_BOGUS_NID, },  	{ PCI_VDEVICE(INTEL, 0x0a55),	/* Dell Express Flash P4600 */ -		.driver_data = NVME_QUIRK_STRIPE_SIZE | -				NVME_QUIRK_DEALLOCATE_ZEROES, }, +		.driver_data = NVME_QUIRK_STRIPE_SIZE, },  	{ PCI_VDEVICE(INTEL, 0xf1a5),	/* Intel 600P/P3100 */  		.driver_data = NVME_QUIRK_NO_DEEPEST_PS |  				NVME_QUIRK_MEDIUM_PRIO_SQ | @@ -3608,7 +3612,7 @@ static const struct pci_device_id nvme_id_table[] = {  	{ PCI_VDEVICE(REDHAT, 0x0010),	/* Qemu emulated controller */  		.driver_data = NVME_QUIRK_BOGUS_NID, },  	{ PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */ -		.driver_data = NVME_QUIRK_QDEPTH_ONE }, +		.driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, },  	{ PCI_DEVICE(0x126f, 0x2262),	/* Silicon Motion generic */  		.driver_data = NVME_QUIRK_NO_DEEPEST_PS |  				NVME_QUIRK_BOGUS_NID, },  | 
