mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	x86/PCI: VMD: Attach VMD resources to parent domain's resource tree
Attach the new VMD domain's resources to the VMD device's resources.  This
allows /proc/iomem to display a more complete picture.
Before:
  c0000000-c1ffffff : 0000:5d:05.5
  c2000000-c3ffffff : 0000:5d:05.5
    c2010000-c2013fff : nvme
  c4000000-c40fffff : 0000:5d:05.5
After:
  c0000000-c1ffffff : 0000:5d:05.5
  c2000000-c3ffffff : 0000:5d:05.5
    c2000000-c3ffffff : VMD MEMBAR1
      c2000000-c22fffff : PCI Bus 10000:01
        c2000000-c200ffff : 10000:01:00.0
        c2010000-c2013fff : 10000:01:00.0
          c2010000-c2013fff : nvme
      c2300000-c24fffff : PCI Bus 10000:01
  c4000000-c40fffff : 0000:5d:05.5
    c4002000-c40fffff : VMD MEMBAR2
Signed-off-by: Jon Derrick <jonathan.derrick@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Keith Busch <keith.busch@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									d068c350c0
								
							
						
					
					
						commit
						2c2c5c5cd2
					
				
					 1 changed files with 16 additions and 0 deletions
				
			
		| 
						 | 
					@ -503,6 +503,18 @@ static struct pci_ops vmd_ops = {
 | 
				
			||||||
	.write		= vmd_pci_write,
 | 
						.write		= vmd_pci_write,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void vmd_attach_resources(struct vmd_dev *vmd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1];
 | 
				
			||||||
 | 
						vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void vmd_detach_resources(struct vmd_dev *vmd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						vmd->dev->resource[VMD_MEMBAR1].child = NULL;
 | 
				
			||||||
 | 
						vmd->dev->resource[VMD_MEMBAR2].child = NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * VMD domains start at 0x1000 to not clash with ACPI _SEG domains.
 | 
					 * VMD domains start at 0x1000 to not clash with ACPI _SEG domains.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -559,6 +571,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd)
 | 
				
			||||||
		.start = res->start,
 | 
							.start = res->start,
 | 
				
			||||||
		.end   = res->end,
 | 
							.end   = res->end,
 | 
				
			||||||
		.flags = flags,
 | 
							.flags = flags,
 | 
				
			||||||
 | 
							.parent = res,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res = &vmd->dev->resource[VMD_MEMBAR2];
 | 
						res = &vmd->dev->resource[VMD_MEMBAR2];
 | 
				
			||||||
| 
						 | 
					@ -571,6 +584,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd)
 | 
				
			||||||
		.start = res->start + 0x2000,
 | 
							.start = res->start + 0x2000,
 | 
				
			||||||
		.end   = res->end,
 | 
							.end   = res->end,
 | 
				
			||||||
		.flags = flags,
 | 
							.flags = flags,
 | 
				
			||||||
 | 
							.parent = res,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sd->domain = vmd_find_free_domain();
 | 
						sd->domain = vmd_find_free_domain();
 | 
				
			||||||
| 
						 | 
					@ -595,6 +609,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd)
 | 
				
			||||||
		return -ENODEV;
 | 
							return -ENODEV;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vmd_attach_resources(vmd);
 | 
				
			||||||
	vmd_setup_dma_ops(vmd);
 | 
						vmd_setup_dma_ops(vmd);
 | 
				
			||||||
	dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain);
 | 
						dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain);
 | 
				
			||||||
	pci_rescan_bus(vmd->bus);
 | 
						pci_rescan_bus(vmd->bus);
 | 
				
			||||||
| 
						 | 
					@ -691,6 +706,7 @@ static void vmd_remove(struct pci_dev *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct vmd_dev *vmd = pci_get_drvdata(dev);
 | 
						struct vmd_dev *vmd = pci_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						vmd_detach_resources(vmd);
 | 
				
			||||||
	pci_set_drvdata(dev, NULL);
 | 
						pci_set_drvdata(dev, NULL);
 | 
				
			||||||
	sysfs_remove_link(&vmd->dev->dev.kobj, "domain");
 | 
						sysfs_remove_link(&vmd->dev->dev.kobj, "domain");
 | 
				
			||||||
	pci_stop_root_bus(vmd->bus);
 | 
						pci_stop_root_bus(vmd->bus);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue