mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
sfc: add cxl support
Add CXL initialization based on new CXL API for accel drivers and make it dependent on kernel CXL configuration. Signed-off-by: Alejandro Lucero <alucerop@amd.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Acked-by: Edward Cree <ecree.xilinx@gmail.com> Reviewed-by: Alison Schofield <alison.schofield@intel.com> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Link: https://patch.msgid.link/20260630151346.31201-2-alejandro.lucero-palau@amd.com Signed-off-by: Dave Jiang <dave.jiang@intel.com>
This commit is contained in:
parent
96ddf1af34
commit
a3fc56b12e
|
|
@ -66,6 +66,15 @@ config SFC_MCDI_LOGGING
|
|||
Driver-Interface) commands and responses, allowing debugging of
|
||||
driver/firmware interaction. The tracing is actually enabled by
|
||||
a sysfs file 'mcdi_logging' under the PCI device.
|
||||
config SFC_CXL
|
||||
bool "Solarflare SFC9100-family CXL support"
|
||||
depends on SFC && CXL_BUS >= SFC
|
||||
default SFC
|
||||
help
|
||||
This enables SFC CXL support if the kernel is configuring CXL for
|
||||
using CTPIO with CXL.mem. The SFC device with CXL support and
|
||||
with a CXL-aware firmware can be used for minimizing latencies
|
||||
when sending through CTPIO.
|
||||
|
||||
source "drivers/net/ethernet/sfc/falcon/Kconfig"
|
||||
source "drivers/net/ethernet/sfc/siena/Kconfig"
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ sfc-$(CONFIG_SFC_SRIOV) += sriov.o ef10_sriov.o ef100_sriov.o ef100_rep.o \
|
|||
mae.o tc.o tc_bindings.o tc_counters.o \
|
||||
tc_encap_actions.o tc_conntrack.o
|
||||
|
||||
sfc-$(CONFIG_SFC_CXL) += efx_cxl.o
|
||||
obj-$(CONFIG_SFC) += sfc.o
|
||||
|
||||
obj-$(CONFIG_SFC_FALCON) += falcon/
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
#include "selftest.h"
|
||||
#include "sriov.h"
|
||||
#include "efx_devlink.h"
|
||||
#include "efx_cxl.h"
|
||||
|
||||
#include "mcdi_port_common.h"
|
||||
#include "mcdi_pcol.h"
|
||||
|
|
@ -981,12 +982,14 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
|
|||
efx_pci_remove_main(efx);
|
||||
|
||||
efx_fini_io(efx);
|
||||
|
||||
probe_data = container_of(efx, struct efx_probe_data, efx);
|
||||
|
||||
pci_dbg(efx->pci_dev, "shutdown successful\n");
|
||||
|
||||
efx_fini_devlink_and_unlock(efx);
|
||||
efx_fini_struct(efx);
|
||||
free_netdev(efx->net_dev);
|
||||
probe_data = container_of(efx, struct efx_probe_data, efx);
|
||||
kfree(probe_data);
|
||||
};
|
||||
|
||||
|
|
@ -1190,6 +1193,17 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
|
|||
if (rc)
|
||||
goto fail2;
|
||||
|
||||
/* A successful cxl initialization implies a CXL region created to be
|
||||
* used for PIO buffers. If there is no CXL support legacy PIO buffers
|
||||
* defined at specific PCI BAR regions will be used. If there is CXL
|
||||
* support and the cxl initialization fails, the driver probe fails.
|
||||
*/
|
||||
rc = efx_cxl_init(probe_data);
|
||||
if (rc) {
|
||||
pci_err(pci_dev, "CXL initialization failed with error %d\n", rc);
|
||||
goto fail3;
|
||||
}
|
||||
|
||||
rc = efx_pci_probe_post_io(efx);
|
||||
if (rc) {
|
||||
/* On failure, retry once immediately.
|
||||
|
|
|
|||
50
drivers/net/ethernet/sfc/efx_cxl.c
Normal file
50
drivers/net/ethernet/sfc/efx_cxl.c
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/****************************************************************************
|
||||
*
|
||||
* Driver for AMD network controllers and boards
|
||||
* Copyright (C) 2025, Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "net_driver.h"
|
||||
#include "efx_cxl.h"
|
||||
|
||||
#define EFX_CTPIO_BUFFER_SIZE SZ_256M
|
||||
|
||||
int efx_cxl_init(struct efx_probe_data *probe_data)
|
||||
{
|
||||
struct efx_nic *efx = &probe_data->efx;
|
||||
struct pci_dev *pci_dev = efx->pci_dev;
|
||||
struct efx_cxl *cxl;
|
||||
u16 dvsec;
|
||||
|
||||
/* Is the device configured with and using CXL? */
|
||||
if (!pcie_is_cxl(pci_dev))
|
||||
return 0;
|
||||
|
||||
dvsec = pci_find_dvsec_capability(pci_dev, PCI_VENDOR_ID_CXL,
|
||||
PCI_DVSEC_CXL_DEVICE);
|
||||
if (!dvsec) {
|
||||
pci_info(pci_dev, "CXL_DVSEC_PCIE_DEVICE capability not found\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
pci_dbg(pci_dev, "CXL_DVSEC_PCIE_DEVICE capability found\n");
|
||||
|
||||
/* Create a cxl_dev_state embedded in the cxl struct using cxl core api
|
||||
* specifying no mbox available.
|
||||
*/
|
||||
cxl = devm_cxl_dev_state_create(&pci_dev->dev, CXL_DEVTYPE_DEVMEM,
|
||||
pci_get_dsn(pci_dev), dvsec,
|
||||
struct efx_cxl, cxlds, false);
|
||||
|
||||
if (!cxl)
|
||||
return -ENOMEM;
|
||||
|
||||
probe_data->cxl = cxl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_IMPORT_NS("CXL");
|
||||
29
drivers/net/ethernet/sfc/efx_cxl.h
Normal file
29
drivers/net/ethernet/sfc/efx_cxl.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/****************************************************************************
|
||||
* Driver for AMD network controllers and boards
|
||||
* Copyright (C) 2025, Advanced Micro Devices, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation, incorporated herein by reference.
|
||||
*/
|
||||
|
||||
#ifndef EFX_CXL_H
|
||||
#define EFX_CXL_H
|
||||
|
||||
#ifdef CONFIG_SFC_CXL
|
||||
|
||||
#include <cxl/cxl.h>
|
||||
|
||||
struct efx_probe_data;
|
||||
|
||||
struct efx_cxl {
|
||||
struct cxl_dev_state cxlds;
|
||||
struct cxl_memdev *cxlmd;
|
||||
};
|
||||
|
||||
int efx_cxl_init(struct efx_probe_data *probe_data);
|
||||
#else
|
||||
static inline int efx_cxl_init(struct efx_probe_data *probe_data) { return 0; }
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -1197,14 +1197,22 @@ struct efx_nic {
|
|||
atomic_t n_rx_noskb_drops;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SFC_CXL
|
||||
struct efx_cxl;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct efx_probe_data - State after hardware probe
|
||||
* @pci_dev: The PCI device
|
||||
* @efx: Efx NIC details
|
||||
* @cxl: details of related cxl objects
|
||||
*/
|
||||
struct efx_probe_data {
|
||||
struct pci_dev *pci_dev;
|
||||
struct efx_nic efx;
|
||||
#ifdef CONFIG_SFC_CXL
|
||||
struct efx_cxl *cxl;
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline struct efx_nic *efx_netdev_priv(struct net_device *dev)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user