ALT Linux Bugzilla
– Attachment 9154 Details for
Bug 39607
Ядро 5.4 не видит NVME накопитель в ноутбуке с Intel TigerLake-LP (драйвер vmd)
New bug
|
Search
|
[?]
|
Help
Register
|
Log In
[x]
|
Forgot Password
Login:
[x]
|
EN
|
RU
[patch]
Patch 2/3
0002-PCI-vmd-Remove-dma_map_ops-overrides.patch (text/plain), 7.08 KB, created by
Николай Костригин
on 2021-01-26 18:39:46 MSK
(
hide
)
Description:
Patch 2/3
Filename:
MIME Type:
Creator:
Николай Костригин
Created:
2021-01-26 18:39:46 MSK
Size:
7.08 KB
patch
obsolete
>From 7dca318d2d9af266c6fd85e6df2469d979b5a6f8 Mon Sep 17 00:00:00 2001 >From: Jon Derrick <jonathan.derrick@intel.com> >Date: Tue, 21 Jan 2020 06:37:50 -0700 >Subject: [PATCH 2/3] PCI: vmd: Remove dma_map_ops overrides > >Devices on the VMD domain use the VMD endpoint's requester ID and have been >relying on the VMD endpoint's DMA operations. The problem with this was >that VMD domain devices would use the VMD endpoint's attributes when doing >DMA and IOMMU mapping. We can be smarter about this by only using the VMD >endpoint when mapping and providing the correct child device's attributes >during DMA operations. > >Remove the dma_map_ops redirect. > >Link: https://lore.kernel.org/r/1579613871-301529-7-git-send-email-jonathan.derrick@intel.com >Signed-off-by: Jon Derrick <jonathan.derrick@intel.com> >Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> >Reviewed-by: Keith Busch <kbusch@kernel.org> >Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> >--- > drivers/pci/controller/Kconfig | 1 - > drivers/pci/controller/vmd.c | 150 --------------------------------- > 2 files changed, 151 deletions(-) > >diff --git a/drivers/pci/controller/Kconfig b/drivers/pci/controller/Kconfig >index dc59889949ad..6e8dda085ded 100644 >--- a/drivers/pci/controller/Kconfig >+++ b/drivers/pci/controller/Kconfig >@@ -267,7 +267,6 @@ config PCIE_TANGO_SMP8759 > > config VMD > depends on PCI_MSI && X86_64 && SRCU >- select X86_DEV_DMA_OPS > tristate "Intel Volume Management Device Driver" > ---help--- > Adds support for the Intel Volume Management Device (VMD). VMD is a >diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c >index 41f4c1c825e6..18a7dddf0696 100644 >--- a/drivers/pci/controller/vmd.c >+++ b/drivers/pci/controller/vmd.c >@@ -98,9 +98,6 @@ struct vmd_dev { > struct irq_domain *irq_domain; > struct pci_bus *bus; > u8 busn_start; >- >- struct dma_map_ops dma_ops; >- struct dma_domain dma_domain; > }; > > static inline struct vmd_dev *vmd_from_bus(struct pci_bus *bus) >@@ -295,151 +292,6 @@ static struct msi_domain_info vmd_msi_domain_info = { > .chip = &vmd_msi_controller, > }; > >-/* >- * VMD replaces the requester ID with its own. DMA mappings for devices in a >- * VMD domain need to be mapped for the VMD, not the device requiring >- * the mapping. >- */ >-static struct device *to_vmd_dev(struct device *dev) >-{ >- struct pci_dev *pdev = to_pci_dev(dev); >- struct vmd_dev *vmd = vmd_from_bus(pdev->bus); >- >- return &vmd->dev->dev; >-} >- >-static void *vmd_alloc(struct device *dev, size_t size, dma_addr_t *addr, >- gfp_t flag, unsigned long attrs) >-{ >- return dma_alloc_attrs(to_vmd_dev(dev), size, addr, flag, attrs); >-} >- >-static void vmd_free(struct device *dev, size_t size, void *vaddr, >- dma_addr_t addr, unsigned long attrs) >-{ >- return dma_free_attrs(to_vmd_dev(dev), size, vaddr, addr, attrs); >-} >- >-static int vmd_mmap(struct device *dev, struct vm_area_struct *vma, >- void *cpu_addr, dma_addr_t addr, size_t size, >- unsigned long attrs) >-{ >- return dma_mmap_attrs(to_vmd_dev(dev), vma, cpu_addr, addr, size, >- attrs); >-} >- >-static int vmd_get_sgtable(struct device *dev, struct sg_table *sgt, >- void *cpu_addr, dma_addr_t addr, size_t size, >- unsigned long attrs) >-{ >- return dma_get_sgtable_attrs(to_vmd_dev(dev), sgt, cpu_addr, addr, size, >- attrs); >-} >- >-static dma_addr_t vmd_map_page(struct device *dev, struct page *page, >- unsigned long offset, size_t size, >- enum dma_data_direction dir, >- unsigned long attrs) >-{ >- return dma_map_page_attrs(to_vmd_dev(dev), page, offset, size, dir, >- attrs); >-} >- >-static void vmd_unmap_page(struct device *dev, dma_addr_t addr, size_t size, >- enum dma_data_direction dir, unsigned long attrs) >-{ >- dma_unmap_page_attrs(to_vmd_dev(dev), addr, size, dir, attrs); >-} >- >-static int vmd_map_sg(struct device *dev, struct scatterlist *sg, int nents, >- enum dma_data_direction dir, unsigned long attrs) >-{ >- return dma_map_sg_attrs(to_vmd_dev(dev), sg, nents, dir, attrs); >-} >- >-static void vmd_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, >- enum dma_data_direction dir, unsigned long attrs) >-{ >- dma_unmap_sg_attrs(to_vmd_dev(dev), sg, nents, dir, attrs); >-} >- >-static void vmd_sync_single_for_cpu(struct device *dev, dma_addr_t addr, >- size_t size, enum dma_data_direction dir) >-{ >- dma_sync_single_for_cpu(to_vmd_dev(dev), addr, size, dir); >-} >- >-static void vmd_sync_single_for_device(struct device *dev, dma_addr_t addr, >- size_t size, enum dma_data_direction dir) >-{ >- dma_sync_single_for_device(to_vmd_dev(dev), addr, size, dir); >-} >- >-static void vmd_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, >- int nents, enum dma_data_direction dir) >-{ >- dma_sync_sg_for_cpu(to_vmd_dev(dev), sg, nents, dir); >-} >- >-static void vmd_sync_sg_for_device(struct device *dev, struct scatterlist *sg, >- int nents, enum dma_data_direction dir) >-{ >- dma_sync_sg_for_device(to_vmd_dev(dev), sg, nents, dir); >-} >- >-static int vmd_dma_supported(struct device *dev, u64 mask) >-{ >- return dma_supported(to_vmd_dev(dev), mask); >-} >- >-static u64 vmd_get_required_mask(struct device *dev) >-{ >- return dma_get_required_mask(to_vmd_dev(dev)); >-} >- >-static void vmd_teardown_dma_ops(struct vmd_dev *vmd) >-{ >- struct dma_domain *domain = &vmd->dma_domain; >- >- if (get_dma_ops(&vmd->dev->dev)) >- del_dma_domain(domain); >-} >- >-#define ASSIGN_VMD_DMA_OPS(source, dest, fn) \ >- do { \ >- if (source->fn) \ >- dest->fn = vmd_##fn; \ >- } while (0) >- >-static void vmd_setup_dma_ops(struct vmd_dev *vmd) >-{ >- const struct dma_map_ops *source = get_dma_ops(&vmd->dev->dev); >- struct dma_map_ops *dest = &vmd->dma_ops; >- struct dma_domain *domain = &vmd->dma_domain; >- >- domain->domain_nr = vmd->sysdata.domain; >- domain->dma_ops = dest; >- >- if (!source) >- return; >- ASSIGN_VMD_DMA_OPS(source, dest, alloc); >- ASSIGN_VMD_DMA_OPS(source, dest, free); >- ASSIGN_VMD_DMA_OPS(source, dest, mmap); >- ASSIGN_VMD_DMA_OPS(source, dest, get_sgtable); >- ASSIGN_VMD_DMA_OPS(source, dest, map_page); >- ASSIGN_VMD_DMA_OPS(source, dest, unmap_page); >- ASSIGN_VMD_DMA_OPS(source, dest, map_sg); >- ASSIGN_VMD_DMA_OPS(source, dest, unmap_sg); >- ASSIGN_VMD_DMA_OPS(source, dest, sync_single_for_cpu); >- ASSIGN_VMD_DMA_OPS(source, dest, sync_single_for_device); >- ASSIGN_VMD_DMA_OPS(source, dest, sync_sg_for_cpu); >- ASSIGN_VMD_DMA_OPS(source, dest, sync_sg_for_device); >- ASSIGN_VMD_DMA_OPS(source, dest, dma_supported); >- ASSIGN_VMD_DMA_OPS(source, dest, get_required_mask); >- add_dma_domain(domain); >-} >-#undef ASSIGN_VMD_DMA_OPS >- > static char __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, > unsigned int devfn, int reg, int len) > { >@@ -713,7 +565,6 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) > } > > vmd_attach_resources(vmd); >- vmd_setup_dma_ops(vmd); > dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain); > > pci_scan_child_bus(vmd->bus); >@@ -829,7 +680,6 @@ static void vmd_remove(struct pci_dev *dev) > pci_stop_root_bus(vmd->bus); > pci_remove_root_bus(vmd->bus); > vmd_cleanup_srcu(vmd); >- vmd_teardown_dma_ops(vmd); > vmd_detach_resources(vmd); > irq_domain_remove(vmd->irq_domain); > irq_domain_free_fwnode(fn); >-- >2.29.2 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 39607
:
9153
| 9154 |
9155