mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
crypto: qat - add qat_6xxx driver
Add a new driver, qat_6xxx, to support QAT GEN6 devices. QAT GEN6 devices are a follow-on generation of GEN4 devices and differently from the previous generation, they can support all three services (symmetric, asymmetric, and data compression) concurrently. In order to have the qat_6xxx driver to reuse some of the GEN4 logic, a new abstraction layer has been introduced to bridge the two implementations. This allows to avoid code duplication and to keep the qat_6xxx driver isolated from the GEN4 logic. This approach has been used for the PF to VF logic and the HW CSR access logic. Signed-off-by: Laurent M Coquerel <laurent.m.coquerel@intel.com> Co-developed-by: George Abraham P <george.abraham.p@intel.com> Signed-off-by: George Abraham P <george.abraham.p@intel.com> Co-developed-by: Karthikeyan Gopal <karthikeyan.gopal@intel.com> Signed-off-by: Karthikeyan Gopal <karthikeyan.gopal@intel.com> Co-developed-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com> Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com> Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
committed by
Herbert Xu
parent
942028bc2f
commit
17fd7514ae
@@ -70,6 +70,18 @@ config CRYPTO_DEV_QAT_420XX
|
||||
To compile this as a module, choose M here: the module
|
||||
will be called qat_420xx.
|
||||
|
||||
config CRYPTO_DEV_QAT_6XXX
|
||||
tristate "Support for Intel(R) QuickAssist Technology QAT_6XXX"
|
||||
depends on (X86 || COMPILE_TEST)
|
||||
depends on PCI
|
||||
select CRYPTO_DEV_QAT
|
||||
help
|
||||
Support for Intel(R) QuickAssist Technology QAT_6xxx
|
||||
for accelerating crypto and compression workloads.
|
||||
|
||||
To compile this as a module, choose M here: the module
|
||||
will be called qat_6xxx.
|
||||
|
||||
config CRYPTO_DEV_QAT_DH895xCCVF
|
||||
tristate "Support for Intel(R) DH895xCC Virtual Function"
|
||||
depends on PCI && (!CPU_BIG_ENDIAN || COMPILE_TEST)
|
||||
|
||||
@@ -6,6 +6,7 @@ obj-$(CONFIG_CRYPTO_DEV_QAT_C3XXX) += qat_c3xxx/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_C62X) += qat_c62x/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_4XXX) += qat_4xxx/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_420XX) += qat_420xx/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_6XXX) += qat_6xxx/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_DH895xCCVF) += qat_dh895xccvf/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_C3XXXVF) += qat_c3xxxvf/
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_C62XVF) += qat_c62xvf/
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_CRYPTO_DEV_QAT_6XXX) += qat_6xxx.o
|
||||
qat_6xxx-y := adf_drv.o adf_6xxx_hw_data.o
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,148 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2025 Intel Corporation */
|
||||
#ifndef ADF_6XXX_HW_DATA_H_
|
||||
#define ADF_6XXX_HW_DATA_H_
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/units.h>
|
||||
|
||||
#include "adf_accel_devices.h"
|
||||
#include "adf_cfg_common.h"
|
||||
#include "adf_dc.h"
|
||||
|
||||
/* PCIe configuration space */
|
||||
#define ADF_GEN6_BAR_MASK (BIT(0) | BIT(2) | BIT(4))
|
||||
#define ADF_GEN6_SRAM_BAR 0
|
||||
#define ADF_GEN6_PMISC_BAR 1
|
||||
#define ADF_GEN6_ETR_BAR 2
|
||||
#define ADF_6XXX_MAX_ACCELENGINES 9
|
||||
|
||||
/* Clocks frequency */
|
||||
#define ADF_GEN6_COUNTER_FREQ (100 * HZ_PER_MHZ)
|
||||
|
||||
/* Physical function fuses */
|
||||
#define ADF_GEN6_FUSECTL0_OFFSET 0x2C8
|
||||
#define ADF_GEN6_FUSECTL1_OFFSET 0x2CC
|
||||
#define ADF_GEN6_FUSECTL4_OFFSET 0x2D8
|
||||
|
||||
/* Accelerators */
|
||||
#define ADF_GEN6_ACCELERATORS_MASK 0x1
|
||||
#define ADF_GEN6_MAX_ACCELERATORS 1
|
||||
|
||||
/* MSI-X interrupt */
|
||||
#define ADF_GEN6_SMIAPF_RP_X0_MASK_OFFSET 0x41A040
|
||||
#define ADF_GEN6_SMIAPF_RP_X1_MASK_OFFSET 0x41A044
|
||||
#define ADF_GEN6_SMIAPF_MASK_OFFSET 0x41A084
|
||||
#define ADF_GEN6_MSIX_RTTABLE_OFFSET(i) (0x409000 + ((i) * 4))
|
||||
|
||||
/* Bank and ring configuration */
|
||||
#define ADF_GEN6_NUM_RINGS_PER_BANK 2
|
||||
#define ADF_GEN6_NUM_BANKS_PER_VF 4
|
||||
#define ADF_GEN6_ETR_MAX_BANKS 64
|
||||
#define ADF_GEN6_RX_RINGS_OFFSET 1
|
||||
#define ADF_GEN6_TX_RINGS_MASK 0x1
|
||||
|
||||
/* Arbiter configuration */
|
||||
#define ADF_GEN6_ARB_CONFIG (BIT(31) | BIT(6) | BIT(0))
|
||||
#define ADF_GEN6_ARB_OFFSET 0x000
|
||||
#define ADF_GEN6_ARB_WRK_2_SER_MAP_OFFSET 0x400
|
||||
|
||||
/* Admin interface configuration */
|
||||
#define ADF_GEN6_ADMINMSGUR_OFFSET 0x500574
|
||||
#define ADF_GEN6_ADMINMSGLR_OFFSET 0x500578
|
||||
#define ADF_GEN6_MAILBOX_BASE_OFFSET 0x600970
|
||||
|
||||
/*
|
||||
* Watchdog timers
|
||||
* Timeout is in cycles. Clock speed may vary across products but this
|
||||
* value should be a few milli-seconds.
|
||||
*/
|
||||
#define ADF_SSM_WDT_DEFAULT_VALUE 0x7000000ULL
|
||||
#define ADF_SSM_WDT_PKE_DEFAULT_VALUE 0x8000000ULL
|
||||
#define ADF_SSMWDTATHL_OFFSET 0x5208
|
||||
#define ADF_SSMWDTATHH_OFFSET 0x520C
|
||||
#define ADF_SSMWDTCNVL_OFFSET 0x5408
|
||||
#define ADF_SSMWDTCNVH_OFFSET 0x540C
|
||||
#define ADF_SSMWDTUCSL_OFFSET 0x5808
|
||||
#define ADF_SSMWDTUCSH_OFFSET 0x580C
|
||||
#define ADF_SSMWDTDCPRL_OFFSET 0x5A08
|
||||
#define ADF_SSMWDTDCPRH_OFFSET 0x5A0C
|
||||
#define ADF_SSMWDTPKEL_OFFSET 0x5E08
|
||||
#define ADF_SSMWDTPKEH_OFFSET 0x5E0C
|
||||
|
||||
/* Ring reset */
|
||||
#define ADF_RPRESET_POLL_TIMEOUT_US (5 * USEC_PER_SEC)
|
||||
#define ADF_RPRESET_POLL_DELAY_US 20
|
||||
#define ADF_WQM_CSR_RPRESETCTL_RESET BIT(0)
|
||||
#define ADF_WQM_CSR_RPRESETCTL(bank) (0x6000 + (bank) * 8)
|
||||
#define ADF_WQM_CSR_RPRESETSTS_STATUS BIT(0)
|
||||
#define ADF_WQM_CSR_RPRESETSTS(bank) (ADF_WQM_CSR_RPRESETCTL(bank) + 4)
|
||||
|
||||
/* Controls and sets up the corresponding ring mode of operation */
|
||||
#define ADF_GEN6_CSR_RINGMODECTL(bank) (0x9000 + (bank) * 4)
|
||||
|
||||
/* Specifies the traffic class to use for the transactions to/from the ring */
|
||||
#define ADF_GEN6_RINGMODECTL_TC_MASK GENMASK(18, 16)
|
||||
#define ADF_GEN6_RINGMODECTL_TC_DEFAULT 0x7
|
||||
|
||||
/* Specifies usage of tc for the transactions to/from this ring */
|
||||
#define ADF_GEN6_RINGMODECTL_TC_EN_MASK GENMASK(20, 19)
|
||||
|
||||
/*
|
||||
* Use the value programmed in the tc field for request descriptor
|
||||
* and metadata read transactions
|
||||
*/
|
||||
#define ADF_GEN6_RINGMODECTL_TC_EN_OP1 0x1
|
||||
|
||||
/* VC0 Resource Control Register */
|
||||
#define ADF_GEN6_PVC0CTL_OFFSET 0x204
|
||||
#define ADF_GEN6_PVC0CTL_TCVCMAP_OFFSET 1
|
||||
#define ADF_GEN6_PVC0CTL_TCVCMAP_MASK GENMASK(7, 1)
|
||||
#define ADF_GEN6_PVC0CTL_TCVCMAP_DEFAULT 0x7F
|
||||
|
||||
/* VC1 Resource Control Register */
|
||||
#define ADF_GEN6_PVC1CTL_OFFSET 0x210
|
||||
#define ADF_GEN6_PVC1CTL_TCVCMAP_OFFSET 1
|
||||
#define ADF_GEN6_PVC1CTL_TCVCMAP_MASK GENMASK(7, 1)
|
||||
#define ADF_GEN6_PVC1CTL_TCVCMAP_DEFAULT 0x40
|
||||
#define ADF_GEN6_PVC1CTL_VCEN_OFFSET 31
|
||||
#define ADF_GEN6_PVC1CTL_VCEN_MASK BIT(31)
|
||||
/* RW bit: 0x1 - enables a Virtual Channel, 0x0 - disables */
|
||||
#define ADF_GEN6_PVC1CTL_VCEN_ON 0x1
|
||||
|
||||
/* Error source mask registers */
|
||||
#define ADF_GEN6_ERRMSK0 0x41A210
|
||||
#define ADF_GEN6_ERRMSK1 0x41A214
|
||||
#define ADF_GEN6_ERRMSK2 0x41A218
|
||||
#define ADF_GEN6_ERRMSK3 0x41A21C
|
||||
|
||||
#define ADF_GEN6_VFLNOTIFY BIT(7)
|
||||
|
||||
/* Number of heartbeat counter pairs */
|
||||
#define ADF_NUM_HB_CNT_PER_AE ADF_NUM_THREADS_PER_AE
|
||||
|
||||
/* Physical function fuses */
|
||||
#define ADF_6XXX_ACCELENGINES_MASK GENMASK(8, 0)
|
||||
#define ADF_6XXX_ADMIN_AE_MASK GENMASK(8, 8)
|
||||
|
||||
/* Firmware binaries */
|
||||
#define ADF_6XXX_FW "qat_6xxx.bin"
|
||||
#define ADF_6XXX_MMP "qat_6xxx_mmp.bin"
|
||||
#define ADF_6XXX_CY_OBJ "qat_6xxx_cy.bin"
|
||||
#define ADF_6XXX_DC_OBJ "qat_6xxx_dc.bin"
|
||||
#define ADF_6XXX_ADMIN_OBJ "qat_6xxx_admin.bin"
|
||||
|
||||
enum icp_qat_gen6_slice_mask {
|
||||
ICP_ACCEL_GEN6_MASK_UCS_SLICE = BIT(0),
|
||||
ICP_ACCEL_GEN6_MASK_AUTH_SLICE = BIT(1),
|
||||
ICP_ACCEL_GEN6_MASK_PKE_SLICE = BIT(2),
|
||||
ICP_ACCEL_GEN6_MASK_CPR_SLICE = BIT(3),
|
||||
ICP_ACCEL_GEN6_MASK_DCPRZ_SLICE = BIT(4),
|
||||
ICP_ACCEL_GEN6_MASK_WCP_WAT_SLICE = BIT(6),
|
||||
};
|
||||
|
||||
void adf_init_hw_data_6xxx(struct adf_hw_device_data *hw_data);
|
||||
void adf_clean_hw_data_6xxx(struct adf_hw_device_data *hw_data);
|
||||
|
||||
#endif /* ADF_6XXX_HW_DATA_H_ */
|
||||
@@ -0,0 +1,224 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright(c) 2025 Intel Corporation */
|
||||
#include <linux/array_size.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <adf_accel_devices.h>
|
||||
#include <adf_cfg.h>
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_dbgfs.h>
|
||||
|
||||
#include "adf_gen6_shared.h"
|
||||
#include "adf_6xxx_hw_data.h"
|
||||
|
||||
static int bar_map[] = {
|
||||
0, /* SRAM */
|
||||
2, /* PMISC */
|
||||
4, /* ETR */
|
||||
};
|
||||
|
||||
static void adf_device_down(void *accel_dev)
|
||||
{
|
||||
adf_dev_down(accel_dev);
|
||||
}
|
||||
|
||||
static void adf_dbgfs_cleanup(void *accel_dev)
|
||||
{
|
||||
adf_dbgfs_exit(accel_dev);
|
||||
}
|
||||
|
||||
static void adf_cfg_device_remove(void *accel_dev)
|
||||
{
|
||||
adf_cfg_dev_remove(accel_dev);
|
||||
}
|
||||
|
||||
static void adf_cleanup_hw_data(void *accel_dev)
|
||||
{
|
||||
struct adf_accel_dev *accel_device = accel_dev;
|
||||
|
||||
if (accel_device->hw_device) {
|
||||
adf_clean_hw_data_6xxx(accel_device->hw_device);
|
||||
accel_device->hw_device = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void adf_devmgr_remove(void *accel_dev)
|
||||
{
|
||||
adf_devmgr_rm_dev(accel_dev, NULL);
|
||||
}
|
||||
|
||||
static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct adf_accel_pci *accel_pci_dev;
|
||||
struct adf_hw_device_data *hw_data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct adf_accel_dev *accel_dev;
|
||||
struct adf_bar *bar;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
if (num_possible_nodes() > 1 && dev_to_node(dev) < 0) {
|
||||
/*
|
||||
* If the accelerator is connected to a node with no memory
|
||||
* there is no point in using the accelerator since the remote
|
||||
* memory transaction will be very slow.
|
||||
*/
|
||||
return dev_err_probe(dev, -EINVAL, "Invalid NUMA configuration.\n");
|
||||
}
|
||||
|
||||
accel_dev = devm_kzalloc(dev, sizeof(*accel_dev), GFP_KERNEL);
|
||||
if (!accel_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&accel_dev->crypto_list);
|
||||
INIT_LIST_HEAD(&accel_dev->list);
|
||||
accel_pci_dev = &accel_dev->accel_pci_dev;
|
||||
accel_pci_dev->pci_dev = pdev;
|
||||
accel_dev->owner = THIS_MODULE;
|
||||
|
||||
hw_data = devm_kzalloc(dev, sizeof(*hw_data), GFP_KERNEL);
|
||||
if (!hw_data)
|
||||
return -ENOMEM;
|
||||
|
||||
pci_read_config_byte(pdev, PCI_REVISION_ID, &accel_pci_dev->revid);
|
||||
pci_read_config_dword(pdev, ADF_GEN6_FUSECTL4_OFFSET, &hw_data->fuses[ADF_FUSECTL4]);
|
||||
pci_read_config_dword(pdev, ADF_GEN6_FUSECTL0_OFFSET, &hw_data->fuses[ADF_FUSECTL0]);
|
||||
pci_read_config_dword(pdev, ADF_GEN6_FUSECTL1_OFFSET, &hw_data->fuses[ADF_FUSECTL1]);
|
||||
|
||||
if (!(hw_data->fuses[ADF_FUSECTL1] & ICP_ACCEL_GEN6_MASK_WCP_WAT_SLICE))
|
||||
return dev_err_probe(dev, -EFAULT, "Wireless mode is not supported.\n");
|
||||
|
||||
/* Enable PCI device */
|
||||
ret = pcim_enable_device(pdev);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Cannot enable PCI device.\n");
|
||||
|
||||
ret = adf_devmgr_add_dev(accel_dev, NULL);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to add new accelerator device.\n");
|
||||
|
||||
ret = devm_add_action_or_reset(dev, adf_devmgr_remove, accel_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
accel_dev->hw_device = hw_data;
|
||||
adf_init_hw_data_6xxx(accel_dev->hw_device);
|
||||
|
||||
ret = devm_add_action_or_reset(dev, adf_cleanup_hw_data, accel_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Get Accelerators and Accelerator Engine masks */
|
||||
hw_data->accel_mask = hw_data->get_accel_mask(hw_data);
|
||||
hw_data->ae_mask = hw_data->get_ae_mask(hw_data);
|
||||
accel_pci_dev->sku = hw_data->get_sku(hw_data);
|
||||
|
||||
/* If the device has no acceleration engines then ignore it */
|
||||
if (!hw_data->accel_mask || !hw_data->ae_mask ||
|
||||
(~hw_data->ae_mask & ADF_GEN6_ACCELERATORS_MASK)) {
|
||||
ret = -EFAULT;
|
||||
return dev_err_probe(dev, ret, "No acceleration units were found.\n");
|
||||
}
|
||||
|
||||
/* Create device configuration table */
|
||||
ret = adf_cfg_dev_add(accel_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, adf_cfg_device_remove, accel_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Set DMA identifier */
|
||||
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "No usable DMA configuration.\n");
|
||||
|
||||
ret = adf_gen6_cfg_dev_init(accel_dev);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to initialize configuration.\n");
|
||||
|
||||
/* Get accelerator capability mask */
|
||||
hw_data->accel_capabilities_mask = hw_data->get_accel_cap(accel_dev);
|
||||
if (!hw_data->accel_capabilities_mask) {
|
||||
ret = -EINVAL;
|
||||
return dev_err_probe(dev, ret, "Failed to get capabilities mask.\n");
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bar_map); i++) {
|
||||
bar = &accel_pci_dev->pci_bars[i];
|
||||
|
||||
/* Map 64-bit PCIe BAR */
|
||||
bar->virt_addr = pcim_iomap_region(pdev, bar_map[i], pci_name(pdev));
|
||||
if (!bar->virt_addr) {
|
||||
ret = -ENOMEM;
|
||||
return dev_err_probe(dev, ret, "Failed to ioremap PCI region.\n");
|
||||
}
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
/*
|
||||
* The PCI config space is saved at this point and will be restored
|
||||
* after a Function Level Reset (FLR) as the FLR does not completely
|
||||
* restore it.
|
||||
*/
|
||||
ret = pci_save_state(pdev);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "Failed to save pci state.\n");
|
||||
|
||||
adf_dbgfs_init(accel_dev);
|
||||
|
||||
ret = devm_add_action_or_reset(dev, adf_dbgfs_cleanup, accel_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = adf_dev_up(accel_dev, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, adf_device_down, accel_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = adf_sysfs_init(accel_dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void adf_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev);
|
||||
|
||||
adf_dev_down(accel_dev);
|
||||
}
|
||||
|
||||
static const struct pci_device_id adf_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_QAT_6XXX) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, adf_pci_tbl);
|
||||
|
||||
static struct pci_driver adf_driver = {
|
||||
.id_table = adf_pci_tbl,
|
||||
.name = ADF_6XXX_DEVICE_NAME,
|
||||
.probe = adf_probe,
|
||||
.shutdown = adf_shutdown,
|
||||
.sriov_configure = adf_sriov_configure,
|
||||
.err_handler = &adf_err_handler,
|
||||
};
|
||||
module_pci_driver(adf_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Intel");
|
||||
MODULE_FIRMWARE(ADF_6XXX_FW);
|
||||
MODULE_FIRMWARE(ADF_6XXX_MMP);
|
||||
MODULE_DESCRIPTION("Intel(R) QuickAssist Technology for GEN6 Devices");
|
||||
MODULE_SOFTDEP("pre: crypto-intel_qat");
|
||||
MODULE_IMPORT_NS("CRYPTO_QAT");
|
||||
@@ -19,6 +19,7 @@ intel_qat-y := adf_accel_engine.o \
|
||||
adf_gen4_pm.o \
|
||||
adf_gen4_ras.o \
|
||||
adf_gen4_vf_mig.o \
|
||||
adf_gen6_shared.o \
|
||||
adf_hw_arbiter.o \
|
||||
adf_init.o \
|
||||
adf_isr.o \
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#define ADF_C3XXXVF_DEVICE_NAME "c3xxxvf"
|
||||
#define ADF_4XXX_DEVICE_NAME "4xxx"
|
||||
#define ADF_420XX_DEVICE_NAME "420xx"
|
||||
#define ADF_6XXX_DEVICE_NAME "6xxx"
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_4XXX 0x4940
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_4XXXIOV 0x4941
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_401XX 0x4942
|
||||
@@ -35,6 +36,7 @@
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_420XX 0x4946
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_420XXIOV 0x4947
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_6XXX 0x4948
|
||||
#define PCI_DEVICE_ID_INTEL_QAT_6XXX_IOV 0x4949
|
||||
|
||||
#define ADF_DEVICE_FUSECTL_OFFSET 0x40
|
||||
#define ADF_DEVICE_LEGFUSE_OFFSET 0x4C
|
||||
|
||||
@@ -48,6 +48,7 @@ enum adf_device_type {
|
||||
DEV_C3XXXVF,
|
||||
DEV_4XXX,
|
||||
DEV_420XX,
|
||||
DEV_6XXX,
|
||||
};
|
||||
|
||||
struct adf_dev_status_info {
|
||||
|
||||
@@ -8,6 +8,7 @@ enum adf_fw_objs {
|
||||
ADF_FW_ASYM_OBJ,
|
||||
ADF_FW_DC_OBJ,
|
||||
ADF_FW_ADMIN_OBJ,
|
||||
ADF_FW_CY_OBJ,
|
||||
};
|
||||
|
||||
struct adf_fw_config {
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2025 Intel Corporation */
|
||||
#ifndef ADF_GEN6_PM_H
|
||||
#define ADF_GEN6_PM_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
struct adf_accel_dev;
|
||||
|
||||
/* Power management */
|
||||
#define ADF_GEN6_PM_POLL_DELAY_US 20
|
||||
#define ADF_GEN6_PM_POLL_TIMEOUT_US USEC_PER_SEC
|
||||
#define ADF_GEN6_PM_STATUS 0x50A00C
|
||||
#define ADF_GEN6_PM_INTERRUPT 0x50A028
|
||||
|
||||
/* Power management source in ERRSOU2 and ERRMSK2 */
|
||||
#define ADF_GEN6_PM_SOU BIT(18)
|
||||
|
||||
/* cpm_pm_interrupt bitfields */
|
||||
#define ADF_GEN6_PM_DRV_ACTIVE BIT(20)
|
||||
|
||||
#define ADF_GEN6_PM_DEFAULT_IDLE_FILTER 0x6
|
||||
|
||||
/* cpm_pm_status bitfields */
|
||||
#define ADF_GEN6_PM_INIT_STATE BIT(21)
|
||||
|
||||
#endif /* ADF_GEN6_PM_H */
|
||||
@@ -0,0 +1,49 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright(c) 2025 Intel Corporation */
|
||||
#include <linux/export.h>
|
||||
|
||||
#include "adf_gen4_config.h"
|
||||
#include "adf_gen4_hw_csr_data.h"
|
||||
#include "adf_gen4_pfvf.h"
|
||||
#include "adf_gen6_shared.h"
|
||||
|
||||
struct adf_accel_dev;
|
||||
struct adf_pfvf_ops;
|
||||
struct adf_hw_csr_ops;
|
||||
|
||||
/*
|
||||
* QAT GEN4 and GEN6 devices often differ in terms of supported features,
|
||||
* options and internal logic. However, some of the mechanisms and register
|
||||
* layout are shared between those two GENs. This file serves as an abstraction
|
||||
* layer that allows to use existing GEN4 implementation that is also
|
||||
* applicable to GEN6 without additional overhead and complexity.
|
||||
*/
|
||||
void adf_gen6_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops)
|
||||
{
|
||||
adf_gen4_init_pf_pfvf_ops(pfvf_ops);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen6_init_pf_pfvf_ops);
|
||||
|
||||
void adf_gen6_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
|
||||
{
|
||||
return adf_gen4_init_hw_csr_ops(csr_ops);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen6_init_hw_csr_ops);
|
||||
|
||||
int adf_gen6_cfg_dev_init(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
return adf_gen4_cfg_dev_init(accel_dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen6_cfg_dev_init);
|
||||
|
||||
int adf_gen6_comp_dev_config(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
return adf_comp_dev_config(accel_dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen6_comp_dev_config);
|
||||
|
||||
int adf_gen6_no_dev_config(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
return adf_no_dev_config(accel_dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen6_no_dev_config);
|
||||
@@ -0,0 +1,15 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2025 Intel Corporation */
|
||||
#ifndef ADF_GEN6_SHARED_H_
|
||||
#define ADF_GEN6_SHARED_H_
|
||||
|
||||
struct adf_hw_csr_ops;
|
||||
struct adf_accel_dev;
|
||||
struct adf_pfvf_ops;
|
||||
|
||||
void adf_gen6_init_pf_pfvf_ops(struct adf_pfvf_ops *pfvf_ops);
|
||||
void adf_gen6_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops);
|
||||
int adf_gen6_cfg_dev_init(struct adf_accel_dev *accel_dev);
|
||||
int adf_gen6_comp_dev_config(struct adf_accel_dev *accel_dev);
|
||||
int adf_gen6_no_dev_config(struct adf_accel_dev *accel_dev);
|
||||
#endif/* ADF_GEN6_SHARED_H_ */
|
||||
Reference in New Issue
Block a user