forked from torvalds/linux
Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
cxl/acpi: Add an acpi_cxl module for the CXL interconnect
Add an acpi_cxl module to coordinate the ACPI portions of the CXL (Compute eXpress Link) interconnect. This driver binds to ACPI0017 objects in the ACPI tree, and coordinates access to the resources provided by the ACPI CEDT (CXL Early Discovery Table). It also coordinates operations of the root port _OSC object to notify platform firmware that the OS has native support for the CXL capabilities of endpoints. Note: the actbl1.h changes are speculative. The expectation is that they will arrive through the ACPICA tree in due time. Cc: Ben Widawsky <ben.widawsky@intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
- Loading branch information
1 parent
fc4b187
commit a138b84a65bc7931b234fc14497d8cfe53d736f2
Showing
7 changed files
with
223 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| # SPDX-License-Identifier: GPL-2.0-only | ||
| menuconfig CXL_BUS | ||
| tristate "CXL (Compute Express Link) Devices Support" | ||
| help | ||
| CXL is a bus that is electrically compatible with PCI-E, but layers | ||
| three protocols on that signalling (CXL.io, CXL.cache, and CXL.mem). The | ||
| CXL.cache protocol allows devices to hold cachelines locally, the | ||
| CXL.mem protocol allows devices to be fully coherent memory targets, the | ||
| CXL.io protocol is equivalent to PCI-E. Say 'y' to enable support for | ||
| the configuration and management of devices supporting these protocols. | ||
|
|
||
| if CXL_BUS | ||
|
|
||
| config CXL_BUS_PROVIDER | ||
| tristate | ||
|
|
||
| config CXL_ACPI | ||
| tristate "CXL Platform Support" | ||
| depends on ACPI | ||
| default CXL_BUS | ||
| select CXL_BUS_PROVIDER | ||
| help | ||
| CXL Platform Support is a prerequisite for any CXL device driver that | ||
| wants to claim ownership of the component register space. By default | ||
| platform firmware assumes Linux is unaware of CXL capabilities and | ||
| requires explicit opt-in. This platform component also mediates | ||
| resources described by the CEDT (CXL Early Discovery Table) | ||
|
|
||
| Say 'y' to enable CXL (Compute Express Link) drivers. | ||
| endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| # SPDX-License-Identifier: GPL-2.0 | ||
| obj-$(CONFIG_CXL_ACPI) += cxl_acpi.o | ||
|
|
||
| ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=CXL | ||
| cxl_acpi-y := acpi.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,119 @@ | ||
| // SPDX-License-Identifier: GPL-2.0-only | ||
| /* | ||
| * Copyright(c) 2020 Intel Corporation. All rights reserved. | ||
| */ | ||
| #include <linux/list_sort.h> | ||
| #include <linux/module.h> | ||
| #include <linux/mutex.h> | ||
| #include <linux/sysfs.h> | ||
| #include <linux/list.h> | ||
| #include <linux/acpi.h> | ||
| #include <linux/sort.h> | ||
| #include <linux/pci.h> | ||
| #include "acpi.h" | ||
|
|
||
| static void acpi_cxl_desc_init(struct acpi_cxl_desc *acpi_desc, struct device *dev) | ||
| { | ||
| dev_set_drvdata(dev, acpi_desc); | ||
| acpi_desc->dev = dev; | ||
| } | ||
|
|
||
| static void acpi_cedt_put_table(void *table) | ||
| { | ||
| acpi_put_table(table); | ||
| } | ||
|
|
||
| static int acpi_cxl_add(struct acpi_device *adev) | ||
| { | ||
| struct acpi_cxl_desc *acpi_desc; | ||
| struct device *dev = &adev->dev; | ||
| struct acpi_table_header *tbl; | ||
| acpi_status status = AE_OK; | ||
| acpi_size sz; | ||
| int rc = 0; | ||
|
|
||
| status = acpi_get_table(ACPI_SIG_CEDT, 0, &tbl); | ||
| if (ACPI_FAILURE(status)) { | ||
| dev_err(dev, "failed to find CEDT at startup\n"); | ||
| return 0; | ||
| } | ||
|
|
||
| rc = devm_add_action_or_reset(dev, acpi_cedt_put_table, tbl); | ||
| if (rc) | ||
| return rc; | ||
| sz = tbl->length; | ||
| dev_info(dev, "found CEDT at startup: %lld bytes\n", sz); | ||
|
|
||
| acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL); | ||
| if (!acpi_desc) | ||
| return -ENOMEM; | ||
| acpi_cxl_desc_init(acpi_desc, &adev->dev); | ||
|
|
||
| acpi_desc->acpi_header = *tbl; | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| static int acpi_cxl_remove(struct acpi_device *adev) | ||
| { | ||
| return 0; | ||
| } | ||
|
|
||
| static const struct acpi_device_id acpi_cxl_ids[] = { | ||
| { "ACPI0017", 0 }, | ||
| { "", 0 }, | ||
| }; | ||
| MODULE_DEVICE_TABLE(acpi, acpi_cxl_ids); | ||
|
|
||
| static struct acpi_driver acpi_cxl_driver = { | ||
| .name = KBUILD_MODNAME, | ||
| .ids = acpi_cxl_ids, | ||
| .ops = { | ||
| .add = acpi_cxl_add, | ||
| .remove = acpi_cxl_remove, | ||
| }, | ||
| }; | ||
|
|
||
| /* | ||
| * If/when CXL support is defined by other platform firmware the kernel | ||
| * will need a mechanism to select between the platform specific version | ||
| * of this routine, until then, hard-code ACPI assumptions | ||
| */ | ||
| int cxl_bus_prepared(struct pci_dev *pdev) | ||
| { | ||
| struct acpi_device *adev; | ||
| struct pci_dev *root_port; | ||
| struct device *root; | ||
|
|
||
| root_port = pcie_find_root_port(pdev); | ||
| if (!root_port) | ||
| return -ENXIO; | ||
|
|
||
| root = root_port->dev.parent; | ||
| if (!root) | ||
| return -ENXIO; | ||
|
|
||
| adev = ACPI_COMPANION(root); | ||
| if (!adev) | ||
| return -ENXIO; | ||
|
|
||
| /* TODO: OSC enabling */ | ||
|
|
||
| return 0; | ||
| } | ||
| EXPORT_SYMBOL_GPL(cxl_bus_prepared); | ||
|
|
||
| static __init int acpi_cxl_init(void) | ||
| { | ||
| return acpi_bus_register_driver(&acpi_cxl_driver); | ||
| } | ||
|
|
||
| static __exit void acpi_cxl_exit(void) | ||
| { | ||
| acpi_bus_unregister_driver(&acpi_cxl_driver); | ||
| } | ||
|
|
||
| module_init(acpi_cxl_init); | ||
| module_exit(acpi_cxl_exit); | ||
| MODULE_LICENSE("GPL v2"); | ||
| MODULE_AUTHOR("Intel Corporation"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| // SPDX-License-Identifier: GPL-2.0-only | ||
| // Copyright(c) 2020 Intel Corporation. All rights reserved. | ||
|
|
||
| #ifndef __CXL_ACPI_H__ | ||
| #define __CXL_ACPI_H__ | ||
| #include <linux/acpi.h> | ||
|
|
||
| struct acpi_cxl_desc { | ||
| struct acpi_table_header acpi_header; | ||
| struct device *dev; | ||
| }; | ||
|
|
||
| int cxl_bus_prepared(struct pci_dev *pci_dev); | ||
|
|
||
| #endif /* __CXL_ACPI_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters