mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	 98d2d3a264
			
		
	
	
		98d2d3a264
		
	
	
	
	
		
			
			The core houses infrastructure for decoder resources. A CXL port's dports are more closely related to decoder infrastructure than topology enumeration. Implement generic PCI based dport enumeration in the core, i.e. arrange for existing root port enumeration from cxl_acpi to share code with switch port enumeration which just amounts to a small difference in a pci_walk_bus() invocation once the appropriate 'struct pci_bus' has been retrieved. Set the convention that decoder objects are registered after all dports are enumerated. This enables userspace to know when the CXL core is finished establishing 'dportX' links underneath the 'portX' object. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Link: https://lore.kernel.org/r/164368114191.354031.5270501846455462665.stgit@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
		
			
				
	
	
		
			36 lines
		
	
	
		
			829 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			829 B
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0-only
 | |
| /* Copyright(c) 2021 Intel Corporation. All rights reserved. */
 | |
| 
 | |
| #include <linux/platform_device.h>
 | |
| #include <linux/device.h>
 | |
| #include <linux/acpi.h>
 | |
| #include <cxl.h>
 | |
| #include "test/mock.h"
 | |
| 
 | |
| struct acpi_device *to_cxl_host_bridge(struct device *host, struct device *dev)
 | |
| {
 | |
| 	int index;
 | |
| 	struct acpi_device *adev, *found = NULL;
 | |
| 	struct cxl_mock_ops *ops = get_cxl_mock_ops(&index);
 | |
| 
 | |
| 	if (ops && ops->is_mock_bridge(dev)) {
 | |
| 		found = ACPI_COMPANION(dev);
 | |
| 		goto out;
 | |
| 	}
 | |
| 
 | |
| 	if (dev->bus == &platform_bus_type)
 | |
| 		goto out;
 | |
| 
 | |
| 	adev = to_acpi_device(dev);
 | |
| 	if (!acpi_pci_find_root(adev->handle))
 | |
| 		goto out;
 | |
| 
 | |
| 	if (strcmp(acpi_device_hid(adev), "ACPI0016") == 0) {
 | |
| 		found = adev;
 | |
| 		dev_dbg(host, "found host bridge %s\n", dev_name(&adev->dev));
 | |
| 	}
 | |
| out:
 | |
| 	put_cxl_mock_ops(index);
 | |
| 	return found;
 | |
| }
 |