The RCRB is extracted already during ACPI CEDT table parsing while the data of this is needed not earlier than dport creation. This implementation comes with drawbacks: During ACPI table scan there is already MMIO access including mapping and unmapping, but only ACPI data should be collected here. The collected data must be transferred through a couple of interfaces until it is finally consumed when creating the dport. This causes complex data structures and function interfaces. Additionally, RCRB parsing will be extended to also extract AER data, it would be much easier do this at a later point during port and dport creation when the data structures are available to hold that data. To simplify all that, probe the RCRB at a later point during RCH downstream port creation. Change ACPI table parser to only extract the base address of either the component registers or the RCRB. Parse and extract the RCRB in devm_cxl_add_rch_dport(). This is in preparation to centralize all RCRB scanning. Signed-off-by: Robert Richter <rrichter@amd.com> Signed-off-by: Terry Bowman <terry.bowman@amd.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Link: https://lore.kernel.org/r/20230622205523.85375-2-terry.bowman@amd.com Co-developed-by: Dan Williams <dan.j.williams@intel.com> Link: https://lore.kernel.org/r/20230622205523.85375-3-terry.bowman@amd.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
33 lines
1.2 KiB
C
33 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/acpi.h>
|
|
#include <cxl.h>
|
|
|
|
struct cxl_mock_ops {
|
|
struct list_head list;
|
|
bool (*is_mock_adev)(struct acpi_device *dev);
|
|
int (*acpi_table_parse_cedt)(enum acpi_cedt_type id,
|
|
acpi_tbl_entry_handler_arg handler_arg,
|
|
void *arg);
|
|
bool (*is_mock_bridge)(struct device *dev);
|
|
acpi_status (*acpi_evaluate_integer)(acpi_handle handle,
|
|
acpi_string pathname,
|
|
struct acpi_object_list *arguments,
|
|
unsigned long long *data);
|
|
struct acpi_pci_root *(*acpi_pci_find_root)(acpi_handle handle);
|
|
bool (*is_mock_bus)(struct pci_bus *bus);
|
|
bool (*is_mock_port)(struct device *dev);
|
|
bool (*is_mock_dev)(struct device *dev);
|
|
int (*devm_cxl_port_enumerate_dports)(struct cxl_port *port);
|
|
struct cxl_hdm *(*devm_cxl_setup_hdm)(
|
|
struct cxl_port *port, struct cxl_endpoint_dvsec_info *info);
|
|
int (*devm_cxl_add_passthrough_decoder)(struct cxl_port *port);
|
|
int (*devm_cxl_enumerate_decoders)(
|
|
struct cxl_hdm *hdm, struct cxl_endpoint_dvsec_info *info);
|
|
};
|
|
|
|
void register_cxl_mock_ops(struct cxl_mock_ops *ops);
|
|
void unregister_cxl_mock_ops(struct cxl_mock_ops *ops);
|
|
struct cxl_mock_ops *get_cxl_mock_ops(int *index);
|
|
void put_cxl_mock_ops(int index);
|