mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-22 01:50:16 -05:00
Merge branch 'vfio' of https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6 into v6.10/vfio/qat-v7
This commit is contained in:
@@ -10,12 +10,14 @@
|
||||
#include <adf_fw_config.h>
|
||||
#include <adf_gen4_config.h>
|
||||
#include <adf_gen4_dc.h>
|
||||
#include <adf_gen4_hw_csr_data.h>
|
||||
#include <adf_gen4_hw_data.h>
|
||||
#include <adf_gen4_pfvf.h>
|
||||
#include <adf_gen4_pm.h>
|
||||
#include <adf_gen4_ras.h>
|
||||
#include <adf_gen4_timer.h>
|
||||
#include <adf_gen4_tl.h>
|
||||
#include <adf_gen4_vf_mig.h>
|
||||
#include "adf_420xx_hw_data.h"
|
||||
#include "icp_qat_hw.h"
|
||||
|
||||
@@ -487,6 +489,7 @@ void adf_init_hw_data_420xx(struct adf_hw_device_data *hw_data, u32 dev_id)
|
||||
adf_gen4_init_dc_ops(&hw_data->dc_ops);
|
||||
adf_gen4_init_ras_ops(&hw_data->ras_ops);
|
||||
adf_gen4_init_tl_data(&hw_data->tl_data);
|
||||
adf_gen4_init_vf_mig_ops(&hw_data->vfmig_ops);
|
||||
adf_init_rl_data(&hw_data->rl_data);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,12 +10,14 @@
|
||||
#include <adf_fw_config.h>
|
||||
#include <adf_gen4_config.h>
|
||||
#include <adf_gen4_dc.h>
|
||||
#include <adf_gen4_hw_csr_data.h>
|
||||
#include <adf_gen4_hw_data.h>
|
||||
#include <adf_gen4_pfvf.h>
|
||||
#include <adf_gen4_pm.h>
|
||||
#include "adf_gen4_ras.h"
|
||||
#include <adf_gen4_timer.h>
|
||||
#include <adf_gen4_tl.h>
|
||||
#include <adf_gen4_vf_mig.h>
|
||||
#include "adf_4xxx_hw_data.h"
|
||||
#include "icp_qat_hw.h"
|
||||
|
||||
@@ -454,6 +456,8 @@ void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data, u32 dev_id)
|
||||
hw_data->get_ring_to_svc_map = adf_gen4_get_ring_to_svc_map;
|
||||
hw_data->disable_iov = adf_disable_sriov;
|
||||
hw_data->ring_pair_reset = adf_gen4_ring_pair_reset;
|
||||
hw_data->bank_state_save = adf_gen4_bank_state_save;
|
||||
hw_data->bank_state_restore = adf_gen4_bank_state_restore;
|
||||
hw_data->enable_pm = adf_gen4_enable_pm;
|
||||
hw_data->handle_pm_interrupt = adf_gen4_handle_pm_interrupt;
|
||||
hw_data->dev_config = adf_gen4_dev_config;
|
||||
@@ -469,6 +473,7 @@ void adf_init_hw_data_4xxx(struct adf_hw_device_data *hw_data, u32 dev_id)
|
||||
adf_gen4_init_dc_ops(&hw_data->dc_ops);
|
||||
adf_gen4_init_ras_ops(&hw_data->ras_ops);
|
||||
adf_gen4_init_tl_data(&hw_data->tl_data);
|
||||
adf_gen4_init_vf_mig_ops(&hw_data->vfmig_ops);
|
||||
adf_init_rl_data(&hw_data->rl_data);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_gen2_config.h>
|
||||
#include <adf_gen2_dc.h>
|
||||
#include <adf_gen2_hw_csr_data.h>
|
||||
#include <adf_gen2_hw_data.h>
|
||||
#include <adf_gen2_pfvf.h>
|
||||
#include "adf_c3xxx_hw_data.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_gen2_config.h>
|
||||
#include <adf_gen2_dc.h>
|
||||
#include <adf_gen2_hw_csr_data.h>
|
||||
#include <adf_gen2_hw_data.h>
|
||||
#include <adf_gen2_pfvf.h>
|
||||
#include <adf_pfvf_vf_msg.h>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_gen2_config.h>
|
||||
#include <adf_gen2_dc.h>
|
||||
#include <adf_gen2_hw_csr_data.h>
|
||||
#include <adf_gen2_hw_data.h>
|
||||
#include <adf_gen2_pfvf.h>
|
||||
#include "adf_c62x_hw_data.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_gen2_config.h>
|
||||
#include <adf_gen2_dc.h>
|
||||
#include <adf_gen2_hw_csr_data.h>
|
||||
#include <adf_gen2_hw_data.h>
|
||||
#include <adf_gen2_pfvf.h>
|
||||
#include <adf_pfvf_vf_msg.h>
|
||||
|
||||
@@ -14,16 +14,20 @@ intel_qat-objs := adf_cfg.o \
|
||||
adf_hw_arbiter.o \
|
||||
adf_sysfs.o \
|
||||
adf_sysfs_ras_counters.o \
|
||||
adf_gen2_hw_csr_data.o \
|
||||
adf_gen2_hw_data.o \
|
||||
adf_gen2_config.o \
|
||||
adf_gen4_config.o \
|
||||
adf_gen4_hw_csr_data.o \
|
||||
adf_gen4_hw_data.o \
|
||||
adf_gen4_vf_mig.o \
|
||||
adf_gen4_pm.o \
|
||||
adf_gen2_dc.o \
|
||||
adf_gen4_dc.o \
|
||||
adf_gen4_ras.o \
|
||||
adf_gen4_timer.o \
|
||||
adf_clock.o \
|
||||
adf_mstate_mgr.o \
|
||||
qat_crypto.o \
|
||||
qat_compression.o \
|
||||
qat_comp_algs.o \
|
||||
@@ -52,6 +56,6 @@ intel_qat-$(CONFIG_DEBUG_FS) += adf_transport_debug.o \
|
||||
intel_qat-$(CONFIG_PCI_IOV) += adf_sriov.o adf_vf_isr.o adf_pfvf_utils.o \
|
||||
adf_pfvf_pf_msg.o adf_pfvf_pf_proto.o \
|
||||
adf_pfvf_vf_msg.o adf_pfvf_vf_proto.o \
|
||||
adf_gen2_pfvf.o adf_gen4_pfvf.o
|
||||
adf_gen2_pfvf.o adf_gen4_pfvf.o qat_mig_dev.o
|
||||
|
||||
intel_qat-$(CONFIG_CRYPTO_DEV_QAT_ERROR_INJECTION) += adf_heartbeat_inject.o
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/qat/qat_mig_dev.h>
|
||||
#include "adf_cfg_common.h"
|
||||
#include "adf_rl.h"
|
||||
#include "adf_telemetry.h"
|
||||
@@ -140,6 +141,40 @@ struct admin_info {
|
||||
u32 mailbox_offset;
|
||||
};
|
||||
|
||||
struct ring_config {
|
||||
u64 base;
|
||||
u32 config;
|
||||
u32 head;
|
||||
u32 tail;
|
||||
u32 reserved0;
|
||||
};
|
||||
|
||||
struct bank_state {
|
||||
u32 ringstat0;
|
||||
u32 ringstat1;
|
||||
u32 ringuostat;
|
||||
u32 ringestat;
|
||||
u32 ringnestat;
|
||||
u32 ringnfstat;
|
||||
u32 ringfstat;
|
||||
u32 ringcstat0;
|
||||
u32 ringcstat1;
|
||||
u32 ringcstat2;
|
||||
u32 ringcstat3;
|
||||
u32 iaintflagen;
|
||||
u32 iaintflagreg;
|
||||
u32 iaintflagsrcsel0;
|
||||
u32 iaintflagsrcsel1;
|
||||
u32 iaintcolen;
|
||||
u32 iaintcolctl;
|
||||
u32 iaintflagandcolen;
|
||||
u32 ringexpstat;
|
||||
u32 ringexpintenable;
|
||||
u32 ringsrvarben;
|
||||
u32 reserved0;
|
||||
struct ring_config rings[ADF_ETR_MAX_RINGS_PER_BANK];
|
||||
};
|
||||
|
||||
struct adf_hw_csr_ops {
|
||||
u64 (*build_csr_ring_base_addr)(dma_addr_t addr, u32 size);
|
||||
u32 (*read_csr_ring_head)(void __iomem *csr_base_addr, u32 bank,
|
||||
@@ -150,22 +185,49 @@ struct adf_hw_csr_ops {
|
||||
u32 ring);
|
||||
void (*write_csr_ring_tail)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring, u32 value);
|
||||
u32 (*read_csr_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_uo_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_e_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_ne_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_nf_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_f_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_c_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_exp_stat)(void __iomem *csr_base_addr, u32 bank);
|
||||
u32 (*read_csr_exp_int_en)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_exp_int_en)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value);
|
||||
u32 (*read_csr_ring_config)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring);
|
||||
void (*write_csr_ring_config)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring, u32 value);
|
||||
dma_addr_t (*read_csr_ring_base)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring);
|
||||
void (*write_csr_ring_base)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring, dma_addr_t addr);
|
||||
u32 (*read_csr_int_en)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_int_en)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value);
|
||||
u32 (*read_csr_int_flag)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_int_flag)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value);
|
||||
u32 (*read_csr_int_srcsel)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_int_srcsel)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_int_srcsel_w_val)(void __iomem *csr_base_addr,
|
||||
u32 bank, u32 value);
|
||||
u32 (*read_csr_int_col_en)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_int_col_en)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value);
|
||||
u32 (*read_csr_int_col_ctl)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_int_col_ctl)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value);
|
||||
u32 (*read_csr_int_flag_and_col)(void __iomem *csr_base_addr,
|
||||
u32 bank);
|
||||
void (*write_csr_int_flag_and_col)(void __iomem *csr_base_addr,
|
||||
u32 bank, u32 value);
|
||||
u32 (*read_csr_ring_srv_arb_en)(void __iomem *csr_base_addr, u32 bank);
|
||||
void (*write_csr_ring_srv_arb_en)(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value);
|
||||
u32 (*get_int_col_ctl_enable_mask)(void);
|
||||
};
|
||||
|
||||
struct adf_cfg_device_data;
|
||||
@@ -197,6 +259,20 @@ struct adf_dc_ops {
|
||||
void (*build_deflate_ctx)(void *ctx);
|
||||
};
|
||||
|
||||
struct qat_migdev_ops {
|
||||
int (*init)(struct qat_mig_dev *mdev);
|
||||
void (*cleanup)(struct qat_mig_dev *mdev);
|
||||
void (*reset)(struct qat_mig_dev *mdev);
|
||||
int (*open)(struct qat_mig_dev *mdev);
|
||||
void (*close)(struct qat_mig_dev *mdev);
|
||||
int (*suspend)(struct qat_mig_dev *mdev);
|
||||
int (*resume)(struct qat_mig_dev *mdev);
|
||||
int (*save_state)(struct qat_mig_dev *mdev);
|
||||
int (*save_setup)(struct qat_mig_dev *mdev);
|
||||
int (*load_state)(struct qat_mig_dev *mdev);
|
||||
int (*load_setup)(struct qat_mig_dev *mdev, int size);
|
||||
};
|
||||
|
||||
struct adf_dev_err_mask {
|
||||
u32 cppagentcmdpar_mask;
|
||||
u32 parerr_ath_cph_mask;
|
||||
@@ -244,6 +320,10 @@ struct adf_hw_device_data {
|
||||
void (*enable_ints)(struct adf_accel_dev *accel_dev);
|
||||
void (*set_ssm_wdtimer)(struct adf_accel_dev *accel_dev);
|
||||
int (*ring_pair_reset)(struct adf_accel_dev *accel_dev, u32 bank_nr);
|
||||
int (*bank_state_save)(struct adf_accel_dev *accel_dev, u32 bank_number,
|
||||
struct bank_state *state);
|
||||
int (*bank_state_restore)(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_number, struct bank_state *state);
|
||||
void (*reset_device)(struct adf_accel_dev *accel_dev);
|
||||
void (*set_msix_rttable)(struct adf_accel_dev *accel_dev);
|
||||
const char *(*uof_get_name)(struct adf_accel_dev *accel_dev, u32 obj_num);
|
||||
@@ -260,6 +340,7 @@ struct adf_hw_device_data {
|
||||
struct adf_dev_err_mask dev_err_mask;
|
||||
struct adf_rl_hw_data rl_data;
|
||||
struct adf_tl_hw_data tl_data;
|
||||
struct qat_migdev_ops vfmig_ops;
|
||||
const char *fw_name;
|
||||
const char *fw_mmp_name;
|
||||
u32 fuses;
|
||||
@@ -316,6 +397,7 @@ struct adf_hw_device_data {
|
||||
#define GET_CSR_OPS(accel_dev) (&(accel_dev)->hw_device->csr_ops)
|
||||
#define GET_PFVF_OPS(accel_dev) (&(accel_dev)->hw_device->pfvf_ops)
|
||||
#define GET_DC_OPS(accel_dev) (&(accel_dev)->hw_device->dc_ops)
|
||||
#define GET_VFMIG_OPS(accel_dev) (&(accel_dev)->hw_device->vfmig_ops)
|
||||
#define GET_TL_DATA(accel_dev) GET_HW_DATA(accel_dev)->tl_data
|
||||
#define accel_to_pci_dev(accel_ptr) accel_ptr->accel_pci_dev.pci_dev
|
||||
|
||||
@@ -330,11 +412,17 @@ struct adf_fw_loader_data {
|
||||
struct adf_accel_vf_info {
|
||||
struct adf_accel_dev *accel_dev;
|
||||
struct mutex pf2vf_lock; /* protect CSR access for PF2VF messages */
|
||||
struct mutex pfvf_mig_lock; /* protects PFVF state for migration */
|
||||
struct ratelimit_state vf2pf_ratelimit;
|
||||
u32 vf_nr;
|
||||
bool init;
|
||||
bool restarting;
|
||||
u8 vf_compat_ver;
|
||||
/*
|
||||
* Private area used for device migration.
|
||||
* Memory allocation and free is managed by migration driver.
|
||||
*/
|
||||
void *mig_priv;
|
||||
};
|
||||
|
||||
struct adf_dc_data {
|
||||
|
||||
@@ -248,6 +248,16 @@ static inline void __iomem *adf_get_pmisc_base(struct adf_accel_dev *accel_dev)
|
||||
return pmisc->virt_addr;
|
||||
}
|
||||
|
||||
static inline void __iomem *adf_get_etr_base(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
struct adf_bar *etr;
|
||||
|
||||
etr = &GET_BARS(accel_dev)[hw_data->get_etr_bar_id(hw_data)];
|
||||
|
||||
return etr->virt_addr;
|
||||
}
|
||||
|
||||
static inline void __iomem *adf_get_aram_base(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
|
||||
101
drivers/crypto/intel/qat/qat_common/adf_gen2_hw_csr_data.c
Normal file
101
drivers/crypto/intel/qat/qat_common/adf_gen2_hw_csr_data.c
Normal file
@@ -0,0 +1,101 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#include <linux/types.h>
|
||||
#include "adf_gen2_hw_csr_data.h"
|
||||
|
||||
static u64 build_csr_ring_base_addr(dma_addr_t addr, u32 size)
|
||||
{
|
||||
return BUILD_RING_BASE_ADDR(addr, size);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_e_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_E_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_ring_config(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring, u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static void write_csr_ring_base(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag(void __iomem *csr_base_addr, u32 bank, u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
void adf_gen2_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
|
||||
{
|
||||
csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
|
||||
csr_ops->read_csr_ring_head = read_csr_ring_head;
|
||||
csr_ops->write_csr_ring_head = write_csr_ring_head;
|
||||
csr_ops->read_csr_ring_tail = read_csr_ring_tail;
|
||||
csr_ops->write_csr_ring_tail = write_csr_ring_tail;
|
||||
csr_ops->read_csr_e_stat = read_csr_e_stat;
|
||||
csr_ops->write_csr_ring_config = write_csr_ring_config;
|
||||
csr_ops->write_csr_ring_base = write_csr_ring_base;
|
||||
csr_ops->write_csr_int_flag = write_csr_int_flag;
|
||||
csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
|
||||
csr_ops->write_csr_int_col_en = write_csr_int_col_en;
|
||||
csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
|
||||
csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
|
||||
csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen2_init_hw_csr_ops);
|
||||
86
drivers/crypto/intel/qat/qat_common/adf_gen2_hw_csr_data.h
Normal file
86
drivers/crypto/intel/qat/qat_common/adf_gen2_hw_csr_data.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#ifndef ADF_GEN2_HW_CSR_DATA_H_
|
||||
#define ADF_GEN2_HW_CSR_DATA_H_
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include "adf_accel_devices.h"
|
||||
|
||||
#define ADF_BANK_INT_SRC_SEL_MASK_0 0x4444444CUL
|
||||
#define ADF_BANK_INT_SRC_SEL_MASK_X 0x44444444UL
|
||||
#define ADF_RING_CSR_RING_CONFIG 0x000
|
||||
#define ADF_RING_CSR_RING_LBASE 0x040
|
||||
#define ADF_RING_CSR_RING_UBASE 0x080
|
||||
#define ADF_RING_CSR_RING_HEAD 0x0C0
|
||||
#define ADF_RING_CSR_RING_TAIL 0x100
|
||||
#define ADF_RING_CSR_E_STAT 0x14C
|
||||
#define ADF_RING_CSR_INT_FLAG 0x170
|
||||
#define ADF_RING_CSR_INT_SRCSEL 0x174
|
||||
#define ADF_RING_CSR_INT_SRCSEL_2 0x178
|
||||
#define ADF_RING_CSR_INT_COL_EN 0x17C
|
||||
#define ADF_RING_CSR_INT_COL_CTL 0x180
|
||||
#define ADF_RING_CSR_INT_FLAG_AND_COL 0x184
|
||||
#define ADF_RING_CSR_INT_COL_CTL_ENABLE 0x80000000
|
||||
#define ADF_RING_BUNDLE_SIZE 0x1000
|
||||
#define ADF_ARB_REG_SLOT 0x1000
|
||||
#define ADF_ARB_RINGSRVARBEN_OFFSET 0x19C
|
||||
|
||||
#define BUILD_RING_BASE_ADDR(addr, size) \
|
||||
(((addr) >> 6) & (GENMASK_ULL(63, 0) << (size)))
|
||||
#define READ_CSR_RING_HEAD(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2))
|
||||
#define READ_CSR_RING_TAIL(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2))
|
||||
#define READ_CSR_E_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_E_STAT)
|
||||
#define WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_CONFIG + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, value) \
|
||||
do { \
|
||||
u32 l_base = 0, u_base = 0; \
|
||||
l_base = (u32)((value) & 0xFFFFFFFF); \
|
||||
u_base = (u32)(((value) & 0xFFFFFFFF00000000ULL) >> 32); \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_LBASE + ((ring) << 2), l_base); \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_UBASE + ((ring) << 2), u_base); \
|
||||
} while (0)
|
||||
|
||||
#define WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2), value)
|
||||
#define WRITE_CSR_INT_FLAG(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_FLAG, value)
|
||||
#define WRITE_CSR_INT_SRCSEL(csr_base_addr, bank) \
|
||||
do { \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_SRCSEL, ADF_BANK_INT_SRC_SEL_MASK_0); \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_SRCSEL_2, ADF_BANK_INT_SRC_SEL_MASK_X); \
|
||||
} while (0)
|
||||
#define WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_COL_EN, value)
|
||||
#define WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_COL_CTL, \
|
||||
ADF_RING_CSR_INT_COL_CTL_ENABLE | (value))
|
||||
#define WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_FLAG_AND_COL, value)
|
||||
|
||||
#define WRITE_CSR_RING_SRV_ARB_EN(csr_addr, index, value) \
|
||||
ADF_CSR_WR(csr_addr, ADF_ARB_RINGSRVARBEN_OFFSET + \
|
||||
(ADF_ARB_REG_SLOT * (index)), value)
|
||||
|
||||
void adf_gen2_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops);
|
||||
|
||||
#endif
|
||||
@@ -111,103 +111,6 @@ void adf_gen2_enable_ints(struct adf_accel_dev *accel_dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen2_enable_ints);
|
||||
|
||||
static u64 build_csr_ring_base_addr(dma_addr_t addr, u32 size)
|
||||
{
|
||||
return BUILD_RING_BASE_ADDR(addr, size);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_e_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_E_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_ring_config(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring, u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static void write_csr_ring_base(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag(void __iomem *csr_base_addr, u32 bank, u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
void adf_gen2_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
|
||||
{
|
||||
csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
|
||||
csr_ops->read_csr_ring_head = read_csr_ring_head;
|
||||
csr_ops->write_csr_ring_head = write_csr_ring_head;
|
||||
csr_ops->read_csr_ring_tail = read_csr_ring_tail;
|
||||
csr_ops->write_csr_ring_tail = write_csr_ring_tail;
|
||||
csr_ops->read_csr_e_stat = read_csr_e_stat;
|
||||
csr_ops->write_csr_ring_config = write_csr_ring_config;
|
||||
csr_ops->write_csr_ring_base = write_csr_ring_base;
|
||||
csr_ops->write_csr_int_flag = write_csr_int_flag;
|
||||
csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
|
||||
csr_ops->write_csr_int_col_en = write_csr_int_col_en;
|
||||
csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
|
||||
csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
|
||||
csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen2_init_hw_csr_ops);
|
||||
|
||||
u32 adf_gen2_get_accel_cap(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
|
||||
@@ -6,78 +6,9 @@
|
||||
#include "adf_accel_devices.h"
|
||||
#include "adf_cfg_common.h"
|
||||
|
||||
/* Transport access */
|
||||
#define ADF_BANK_INT_SRC_SEL_MASK_0 0x4444444CUL
|
||||
#define ADF_BANK_INT_SRC_SEL_MASK_X 0x44444444UL
|
||||
#define ADF_RING_CSR_RING_CONFIG 0x000
|
||||
#define ADF_RING_CSR_RING_LBASE 0x040
|
||||
#define ADF_RING_CSR_RING_UBASE 0x080
|
||||
#define ADF_RING_CSR_RING_HEAD 0x0C0
|
||||
#define ADF_RING_CSR_RING_TAIL 0x100
|
||||
#define ADF_RING_CSR_E_STAT 0x14C
|
||||
#define ADF_RING_CSR_INT_FLAG 0x170
|
||||
#define ADF_RING_CSR_INT_SRCSEL 0x174
|
||||
#define ADF_RING_CSR_INT_SRCSEL_2 0x178
|
||||
#define ADF_RING_CSR_INT_COL_EN 0x17C
|
||||
#define ADF_RING_CSR_INT_COL_CTL 0x180
|
||||
#define ADF_RING_CSR_INT_FLAG_AND_COL 0x184
|
||||
#define ADF_RING_CSR_INT_COL_CTL_ENABLE 0x80000000
|
||||
#define ADF_RING_BUNDLE_SIZE 0x1000
|
||||
#define ADF_GEN2_RX_RINGS_OFFSET 8
|
||||
#define ADF_GEN2_TX_RINGS_MASK 0xFF
|
||||
|
||||
#define BUILD_RING_BASE_ADDR(addr, size) \
|
||||
(((addr) >> 6) & (GENMASK_ULL(63, 0) << (size)))
|
||||
#define READ_CSR_RING_HEAD(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2))
|
||||
#define READ_CSR_RING_TAIL(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2))
|
||||
#define READ_CSR_E_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_E_STAT)
|
||||
#define WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_CONFIG + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, value) \
|
||||
do { \
|
||||
u32 l_base = 0, u_base = 0; \
|
||||
l_base = (u32)((value) & 0xFFFFFFFF); \
|
||||
u_base = (u32)(((value) & 0xFFFFFFFF00000000ULL) >> 32); \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_LBASE + ((ring) << 2), l_base); \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_UBASE + ((ring) << 2), u_base); \
|
||||
} while (0)
|
||||
|
||||
#define WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2), value)
|
||||
#define WRITE_CSR_INT_FLAG(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_FLAG, value)
|
||||
#define WRITE_CSR_INT_SRCSEL(csr_base_addr, bank) \
|
||||
do { \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_SRCSEL, ADF_BANK_INT_SRC_SEL_MASK_0); \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_SRCSEL_2, ADF_BANK_INT_SRC_SEL_MASK_X); \
|
||||
} while (0)
|
||||
#define WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_COL_EN, value)
|
||||
#define WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_COL_CTL, \
|
||||
ADF_RING_CSR_INT_COL_CTL_ENABLE | (value))
|
||||
#define WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR(csr_base_addr, (ADF_RING_BUNDLE_SIZE * (bank)) + \
|
||||
ADF_RING_CSR_INT_FLAG_AND_COL, value)
|
||||
|
||||
/* AE to function map */
|
||||
#define AE2FUNCTION_MAP_A_OFFSET (0x3A400 + 0x190)
|
||||
#define AE2FUNCTION_MAP_B_OFFSET (0x3A400 + 0x310)
|
||||
@@ -106,12 +37,6 @@ do { \
|
||||
#define ADF_ARB_OFFSET 0x30000
|
||||
#define ADF_ARB_WRK_2_SER_MAP_OFFSET 0x180
|
||||
#define ADF_ARB_CONFIG (BIT(31) | BIT(6) | BIT(0))
|
||||
#define ADF_ARB_REG_SLOT 0x1000
|
||||
#define ADF_ARB_RINGSRVARBEN_OFFSET 0x19C
|
||||
|
||||
#define WRITE_CSR_RING_SRV_ARB_EN(csr_addr, index, value) \
|
||||
ADF_CSR_WR(csr_addr, ADF_ARB_RINGSRVARBEN_OFFSET + \
|
||||
(ADF_ARB_REG_SLOT * (index)), value)
|
||||
|
||||
/* Power gating */
|
||||
#define ADF_POWERGATE_DC BIT(23)
|
||||
@@ -158,7 +83,6 @@ u32 adf_gen2_get_num_aes(struct adf_hw_device_data *self);
|
||||
void adf_gen2_enable_error_correction(struct adf_accel_dev *accel_dev);
|
||||
void adf_gen2_cfg_iov_thds(struct adf_accel_dev *accel_dev, bool enable,
|
||||
int num_a_regs, int num_b_regs);
|
||||
void adf_gen2_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops);
|
||||
void adf_gen2_get_admin_info(struct admin_info *admin_csrs_info);
|
||||
void adf_gen2_get_arb_info(struct arb_info *arb_info);
|
||||
void adf_gen2_enable_ints(struct adf_accel_dev *accel_dev);
|
||||
|
||||
231
drivers/crypto/intel/qat/qat_common/adf_gen4_hw_csr_data.c
Normal file
231
drivers/crypto/intel/qat/qat_common/adf_gen4_hw_csr_data.c
Normal file
@@ -0,0 +1,231 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#include <linux/types.h>
|
||||
#include "adf_gen4_hw_csr_data.h"
|
||||
|
||||
static u64 build_csr_ring_base_addr(dma_addr_t addr, u32 size)
|
||||
{
|
||||
return BUILD_RING_BASE_ADDR(addr, size);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_uo_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_UO_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_e_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_E_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_ne_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_NE_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_nf_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_NF_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_f_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_F_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_c_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_C_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_exp_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_EXP_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static u32 read_csr_exp_int_en(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_EXP_INT_EN(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_exp_int_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_EXP_INT_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_config(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_CONFIG(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_config(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static dma_addr_t read_csr_ring_base(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_BASE(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_base(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
|
||||
}
|
||||
|
||||
static u32 read_csr_int_en(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_INT_EN(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_en(void __iomem *csr_base_addr, u32 bank, u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_int_flag(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_INT_FLAG(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_INT_SRCSEL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_srcsel_w_val(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_SRCSEL_W_VAL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_int_col_en(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_INT_COL_EN(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_en(void __iomem *csr_base_addr, u32 bank, u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_INT_COL_CTL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_INT_FLAG_AND_COL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_RING_SRV_ARB_EN(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static u32 get_int_col_ctl_enable_mask(void)
|
||||
{
|
||||
return ADF_RING_CSR_INT_COL_CTL_ENABLE;
|
||||
}
|
||||
|
||||
void adf_gen4_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
|
||||
{
|
||||
csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
|
||||
csr_ops->read_csr_ring_head = read_csr_ring_head;
|
||||
csr_ops->write_csr_ring_head = write_csr_ring_head;
|
||||
csr_ops->read_csr_ring_tail = read_csr_ring_tail;
|
||||
csr_ops->write_csr_ring_tail = write_csr_ring_tail;
|
||||
csr_ops->read_csr_stat = read_csr_stat;
|
||||
csr_ops->read_csr_uo_stat = read_csr_uo_stat;
|
||||
csr_ops->read_csr_e_stat = read_csr_e_stat;
|
||||
csr_ops->read_csr_ne_stat = read_csr_ne_stat;
|
||||
csr_ops->read_csr_nf_stat = read_csr_nf_stat;
|
||||
csr_ops->read_csr_f_stat = read_csr_f_stat;
|
||||
csr_ops->read_csr_c_stat = read_csr_c_stat;
|
||||
csr_ops->read_csr_exp_stat = read_csr_exp_stat;
|
||||
csr_ops->read_csr_exp_int_en = read_csr_exp_int_en;
|
||||
csr_ops->write_csr_exp_int_en = write_csr_exp_int_en;
|
||||
csr_ops->read_csr_ring_config = read_csr_ring_config;
|
||||
csr_ops->write_csr_ring_config = write_csr_ring_config;
|
||||
csr_ops->read_csr_ring_base = read_csr_ring_base;
|
||||
csr_ops->write_csr_ring_base = write_csr_ring_base;
|
||||
csr_ops->read_csr_int_en = read_csr_int_en;
|
||||
csr_ops->write_csr_int_en = write_csr_int_en;
|
||||
csr_ops->read_csr_int_flag = read_csr_int_flag;
|
||||
csr_ops->write_csr_int_flag = write_csr_int_flag;
|
||||
csr_ops->read_csr_int_srcsel = read_csr_int_srcsel;
|
||||
csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
|
||||
csr_ops->write_csr_int_srcsel_w_val = write_csr_int_srcsel_w_val;
|
||||
csr_ops->read_csr_int_col_en = read_csr_int_col_en;
|
||||
csr_ops->write_csr_int_col_en = write_csr_int_col_en;
|
||||
csr_ops->read_csr_int_col_ctl = read_csr_int_col_ctl;
|
||||
csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
|
||||
csr_ops->read_csr_int_flag_and_col = read_csr_int_flag_and_col;
|
||||
csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
|
||||
csr_ops->read_csr_ring_srv_arb_en = read_csr_ring_srv_arb_en;
|
||||
csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
|
||||
csr_ops->get_int_col_ctl_enable_mask = get_int_col_ctl_enable_mask;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen4_init_hw_csr_ops);
|
||||
188
drivers/crypto/intel/qat/qat_common/adf_gen4_hw_csr_data.h
Normal file
188
drivers/crypto/intel/qat/qat_common/adf_gen4_hw_csr_data.h
Normal file
@@ -0,0 +1,188 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#ifndef ADF_GEN4_HW_CSR_DATA_H_
|
||||
#define ADF_GEN4_HW_CSR_DATA_H_
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include "adf_accel_devices.h"
|
||||
|
||||
#define ADF_BANK_INT_SRC_SEL_MASK 0x44UL
|
||||
#define ADF_RING_CSR_RING_CONFIG 0x1000
|
||||
#define ADF_RING_CSR_RING_LBASE 0x1040
|
||||
#define ADF_RING_CSR_RING_UBASE 0x1080
|
||||
#define ADF_RING_CSR_RING_HEAD 0x0C0
|
||||
#define ADF_RING_CSR_RING_TAIL 0x100
|
||||
#define ADF_RING_CSR_STAT 0x140
|
||||
#define ADF_RING_CSR_UO_STAT 0x148
|
||||
#define ADF_RING_CSR_E_STAT 0x14C
|
||||
#define ADF_RING_CSR_NE_STAT 0x150
|
||||
#define ADF_RING_CSR_NF_STAT 0x154
|
||||
#define ADF_RING_CSR_F_STAT 0x158
|
||||
#define ADF_RING_CSR_C_STAT 0x15C
|
||||
#define ADF_RING_CSR_INT_FLAG_EN 0x16C
|
||||
#define ADF_RING_CSR_INT_FLAG 0x170
|
||||
#define ADF_RING_CSR_INT_SRCSEL 0x174
|
||||
#define ADF_RING_CSR_INT_COL_EN 0x17C
|
||||
#define ADF_RING_CSR_INT_COL_CTL 0x180
|
||||
#define ADF_RING_CSR_INT_FLAG_AND_COL 0x184
|
||||
#define ADF_RING_CSR_EXP_STAT 0x188
|
||||
#define ADF_RING_CSR_EXP_INT_EN 0x18C
|
||||
#define ADF_RING_CSR_INT_COL_CTL_ENABLE 0x80000000
|
||||
#define ADF_RING_CSR_ADDR_OFFSET 0x100000
|
||||
#define ADF_RING_BUNDLE_SIZE 0x2000
|
||||
#define ADF_RING_CSR_RING_SRV_ARB_EN 0x19C
|
||||
|
||||
#define BUILD_RING_BASE_ADDR(addr, size) \
|
||||
((((addr) >> 6) & (GENMASK_ULL(63, 0) << (size))) << 6)
|
||||
#define READ_CSR_RING_HEAD(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2))
|
||||
#define READ_CSR_RING_TAIL(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2))
|
||||
#define READ_CSR_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_STAT)
|
||||
#define READ_CSR_UO_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_UO_STAT)
|
||||
#define READ_CSR_E_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_E_STAT)
|
||||
#define READ_CSR_NE_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_NE_STAT)
|
||||
#define READ_CSR_NF_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_NF_STAT)
|
||||
#define READ_CSR_F_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_F_STAT)
|
||||
#define READ_CSR_C_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_C_STAT)
|
||||
#define READ_CSR_EXP_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_EXP_STAT)
|
||||
#define READ_CSR_EXP_INT_EN(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_EXP_INT_EN)
|
||||
#define WRITE_CSR_EXP_INT_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_EXP_INT_EN, value)
|
||||
#define READ_CSR_RING_CONFIG(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_CONFIG + ((ring) << 2))
|
||||
#define WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_CONFIG + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, value) \
|
||||
do { \
|
||||
void __iomem *_csr_base_addr = csr_base_addr; \
|
||||
u32 _bank = bank; \
|
||||
u32 _ring = ring; \
|
||||
dma_addr_t _value = value; \
|
||||
u32 l_base = 0, u_base = 0; \
|
||||
l_base = lower_32_bits(_value); \
|
||||
u_base = upper_32_bits(_value); \
|
||||
ADF_CSR_WR((_csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (_bank) + \
|
||||
ADF_RING_CSR_RING_LBASE + ((_ring) << 2), l_base); \
|
||||
ADF_CSR_WR((_csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (_bank) + \
|
||||
ADF_RING_CSR_RING_UBASE + ((_ring) << 2), u_base); \
|
||||
} while (0)
|
||||
|
||||
static inline u64 read_base(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
u32 l_base, u_base;
|
||||
|
||||
/*
|
||||
* Use special IO wrapper for ring base as LBASE and UBASE are
|
||||
* not physically contigious
|
||||
*/
|
||||
l_base = ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * bank) +
|
||||
ADF_RING_CSR_RING_LBASE + (ring << 2));
|
||||
u_base = ADF_CSR_RD(csr_base_addr, (ADF_RING_BUNDLE_SIZE * bank) +
|
||||
ADF_RING_CSR_RING_UBASE + (ring << 2));
|
||||
|
||||
return (u64)u_base << 32 | (u64)l_base;
|
||||
}
|
||||
|
||||
#define READ_CSR_RING_BASE(csr_base_addr, bank, ring) \
|
||||
read_base((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, (bank), (ring))
|
||||
|
||||
#define WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2), value)
|
||||
#define READ_CSR_INT_EN(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_INT_FLAG_EN)
|
||||
#define WRITE_CSR_INT_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_FLAG_EN, (value))
|
||||
#define READ_CSR_INT_FLAG(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_INT_FLAG)
|
||||
#define WRITE_CSR_INT_FLAG(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_FLAG, (value))
|
||||
#define READ_CSR_INT_SRCSEL(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_INT_SRCSEL)
|
||||
#define WRITE_CSR_INT_SRCSEL(csr_base_addr, bank) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_SRCSEL, ADF_BANK_INT_SRC_SEL_MASK)
|
||||
#define WRITE_CSR_INT_SRCSEL_W_VAL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_SRCSEL, (value))
|
||||
#define READ_CSR_INT_COL_EN(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_INT_COL_EN)
|
||||
#define WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_COL_EN, (value))
|
||||
#define READ_CSR_INT_COL_CTL(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_INT_COL_CTL)
|
||||
#define WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_COL_CTL, \
|
||||
ADF_RING_CSR_INT_COL_CTL_ENABLE | (value))
|
||||
#define READ_CSR_INT_FLAG_AND_COL(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_FLAG_AND_COL)
|
||||
#define WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_FLAG_AND_COL, (value))
|
||||
|
||||
#define READ_CSR_RING_SRV_ARB_EN(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_SRV_ARB_EN)
|
||||
#define WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_SRV_ARB_EN, (value))
|
||||
|
||||
void adf_gen4_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops);
|
||||
|
||||
#endif
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
|
||||
/* Copyright(c) 2020 Intel Corporation */
|
||||
#include <linux/iopoll.h>
|
||||
#include <asm/div64.h>
|
||||
#include "adf_accel_devices.h"
|
||||
#include "adf_cfg_services.h"
|
||||
#include "adf_common_drv.h"
|
||||
@@ -8,103 +9,6 @@
|
||||
#include "adf_gen4_hw_data.h"
|
||||
#include "adf_gen4_pm.h"
|
||||
|
||||
static u64 build_csr_ring_base_addr(dma_addr_t addr, u32 size)
|
||||
{
|
||||
return BUILD_RING_BASE_ADDR(addr, size);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring)
|
||||
{
|
||||
return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
|
||||
}
|
||||
|
||||
static void write_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static u32 read_csr_e_stat(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
return READ_CSR_E_STAT(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_ring_config(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
|
||||
}
|
||||
|
||||
static void write_csr_ring_base(void __iomem *csr_base_addr, u32 bank, u32 ring,
|
||||
dma_addr_t addr)
|
||||
{
|
||||
WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
|
||||
{
|
||||
WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_en(void __iomem *csr_base_addr, u32 bank, u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
static void write_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank,
|
||||
u32 value)
|
||||
{
|
||||
WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
|
||||
}
|
||||
|
||||
void adf_gen4_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
|
||||
{
|
||||
csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
|
||||
csr_ops->read_csr_ring_head = read_csr_ring_head;
|
||||
csr_ops->write_csr_ring_head = write_csr_ring_head;
|
||||
csr_ops->read_csr_ring_tail = read_csr_ring_tail;
|
||||
csr_ops->write_csr_ring_tail = write_csr_ring_tail;
|
||||
csr_ops->read_csr_e_stat = read_csr_e_stat;
|
||||
csr_ops->write_csr_ring_config = write_csr_ring_config;
|
||||
csr_ops->write_csr_ring_base = write_csr_ring_base;
|
||||
csr_ops->write_csr_int_flag = write_csr_int_flag;
|
||||
csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
|
||||
csr_ops->write_csr_int_col_en = write_csr_int_col_en;
|
||||
csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
|
||||
csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
|
||||
csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen4_init_hw_csr_ops);
|
||||
|
||||
u32 adf_gen4_get_accel_mask(struct adf_hw_device_data *self)
|
||||
{
|
||||
return ADF_GEN4_ACCELERATORS_MASK;
|
||||
@@ -321,8 +225,7 @@ static int reset_ring_pair(void __iomem *csr, u32 bank_number)
|
||||
int adf_gen4_ring_pair_reset(struct adf_accel_dev *accel_dev, u32 bank_number)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
u32 etr_bar_id = hw_data->get_etr_bar_id(hw_data);
|
||||
void __iomem *csr;
|
||||
void __iomem *csr = adf_get_etr_base(accel_dev);
|
||||
int ret;
|
||||
|
||||
if (bank_number >= hw_data->num_banks)
|
||||
@@ -331,7 +234,6 @@ int adf_gen4_ring_pair_reset(struct adf_accel_dev *accel_dev, u32 bank_number)
|
||||
dev_dbg(&GET_DEV(accel_dev),
|
||||
"ring pair reset for bank:%d\n", bank_number);
|
||||
|
||||
csr = (&GET_BARS(accel_dev)[etr_bar_id])->virt_addr;
|
||||
ret = reset_ring_pair(csr, bank_number);
|
||||
if (ret)
|
||||
dev_err(&GET_DEV(accel_dev),
|
||||
@@ -489,3 +391,281 @@ u16 adf_gen4_get_ring_to_svc_map(struct adf_accel_dev *accel_dev)
|
||||
return ring_to_svc_map;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen4_get_ring_to_svc_map);
|
||||
|
||||
/*
|
||||
* adf_gen4_bank_quiesce_coal_timer() - quiesce bank coalesced interrupt timer
|
||||
* @accel_dev: Pointer to the device structure
|
||||
* @bank_idx: Offset to the bank within this device
|
||||
* @timeout_ms: Timeout in milliseconds for the operation
|
||||
*
|
||||
* This function tries to quiesce the coalesced interrupt timer of a bank if
|
||||
* it has been enabled and triggered.
|
||||
*
|
||||
* Returns 0 on success, error code otherwise
|
||||
*
|
||||
*/
|
||||
int adf_gen4_bank_quiesce_coal_timer(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_idx, int timeout_ms)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
|
||||
struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(accel_dev);
|
||||
void __iomem *csr_misc = adf_get_pmisc_base(accel_dev);
|
||||
void __iomem *csr_etr = adf_get_etr_base(accel_dev);
|
||||
u32 int_col_ctl, int_col_mask, int_col_en;
|
||||
u32 e_stat, intsrc;
|
||||
u64 wait_us;
|
||||
int ret;
|
||||
|
||||
if (timeout_ms < 0)
|
||||
return -EINVAL;
|
||||
|
||||
int_col_ctl = csr_ops->read_csr_int_col_ctl(csr_etr, bank_idx);
|
||||
int_col_mask = csr_ops->get_int_col_ctl_enable_mask();
|
||||
if (!(int_col_ctl & int_col_mask))
|
||||
return 0;
|
||||
|
||||
int_col_en = csr_ops->read_csr_int_col_en(csr_etr, bank_idx);
|
||||
int_col_en &= BIT(ADF_WQM_CSR_RP_IDX_RX);
|
||||
|
||||
e_stat = csr_ops->read_csr_e_stat(csr_etr, bank_idx);
|
||||
if (!(~e_stat & int_col_en))
|
||||
return 0;
|
||||
|
||||
wait_us = 2 * ((int_col_ctl & ~int_col_mask) << 8) * USEC_PER_SEC;
|
||||
do_div(wait_us, hw_data->clock_frequency);
|
||||
wait_us = min(wait_us, (u64)timeout_ms * USEC_PER_MSEC);
|
||||
dev_dbg(&GET_DEV(accel_dev),
|
||||
"wait for bank %d - coalesced timer expires in %llu us (max=%u ms estat=0x%x intcolen=0x%x)\n",
|
||||
bank_idx, wait_us, timeout_ms, e_stat, int_col_en);
|
||||
|
||||
ret = read_poll_timeout(ADF_CSR_RD, intsrc, intsrc,
|
||||
ADF_COALESCED_POLL_DELAY_US, wait_us, true,
|
||||
csr_misc, ADF_WQM_CSR_RPINTSOU(bank_idx));
|
||||
if (ret)
|
||||
dev_warn(&GET_DEV(accel_dev),
|
||||
"coalesced timer for bank %d expired (%llu us)\n",
|
||||
bank_idx, wait_us);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen4_bank_quiesce_coal_timer);
|
||||
|
||||
static int drain_bank(void __iomem *csr, u32 bank_number, int timeout_us)
|
||||
{
|
||||
u32 status;
|
||||
|
||||
ADF_CSR_WR(csr, ADF_WQM_CSR_RPRESETCTL(bank_number),
|
||||
ADF_WQM_CSR_RPRESETCTL_DRAIN);
|
||||
|
||||
return read_poll_timeout(ADF_CSR_RD, status,
|
||||
status & ADF_WQM_CSR_RPRESETSTS_STATUS,
|
||||
ADF_RPRESET_POLL_DELAY_US, timeout_us, true,
|
||||
csr, ADF_WQM_CSR_RPRESETSTS(bank_number));
|
||||
}
|
||||
|
||||
void adf_gen4_bank_drain_finish(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_number)
|
||||
{
|
||||
void __iomem *csr = adf_get_etr_base(accel_dev);
|
||||
|
||||
ADF_CSR_WR(csr, ADF_WQM_CSR_RPRESETSTS(bank_number),
|
||||
ADF_WQM_CSR_RPRESETSTS_STATUS);
|
||||
}
|
||||
|
||||
int adf_gen4_bank_drain_start(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_number, int timeout_us)
|
||||
{
|
||||
void __iomem *csr = adf_get_etr_base(accel_dev);
|
||||
int ret;
|
||||
|
||||
dev_dbg(&GET_DEV(accel_dev), "Drain bank %d\n", bank_number);
|
||||
|
||||
ret = drain_bank(csr, bank_number, timeout_us);
|
||||
if (ret)
|
||||
dev_err(&GET_DEV(accel_dev), "Bank drain failed (timeout)\n");
|
||||
else
|
||||
dev_dbg(&GET_DEV(accel_dev), "Bank drain successful\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void bank_state_save(struct adf_hw_csr_ops *ops, void __iomem *base,
|
||||
u32 bank, struct bank_state *state, u32 num_rings)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
state->ringstat0 = ops->read_csr_stat(base, bank);
|
||||
state->ringuostat = ops->read_csr_uo_stat(base, bank);
|
||||
state->ringestat = ops->read_csr_e_stat(base, bank);
|
||||
state->ringnestat = ops->read_csr_ne_stat(base, bank);
|
||||
state->ringnfstat = ops->read_csr_nf_stat(base, bank);
|
||||
state->ringfstat = ops->read_csr_f_stat(base, bank);
|
||||
state->ringcstat0 = ops->read_csr_c_stat(base, bank);
|
||||
state->iaintflagen = ops->read_csr_int_en(base, bank);
|
||||
state->iaintflagreg = ops->read_csr_int_flag(base, bank);
|
||||
state->iaintflagsrcsel0 = ops->read_csr_int_srcsel(base, bank);
|
||||
state->iaintcolen = ops->read_csr_int_col_en(base, bank);
|
||||
state->iaintcolctl = ops->read_csr_int_col_ctl(base, bank);
|
||||
state->iaintflagandcolen = ops->read_csr_int_flag_and_col(base, bank);
|
||||
state->ringexpstat = ops->read_csr_exp_stat(base, bank);
|
||||
state->ringexpintenable = ops->read_csr_exp_int_en(base, bank);
|
||||
state->ringsrvarben = ops->read_csr_ring_srv_arb_en(base, bank);
|
||||
|
||||
for (i = 0; i < num_rings; i++) {
|
||||
state->rings[i].head = ops->read_csr_ring_head(base, bank, i);
|
||||
state->rings[i].tail = ops->read_csr_ring_tail(base, bank, i);
|
||||
state->rings[i].config = ops->read_csr_ring_config(base, bank, i);
|
||||
state->rings[i].base = ops->read_csr_ring_base(base, bank, i);
|
||||
}
|
||||
}
|
||||
|
||||
#define CHECK_STAT(op, expect_val, name, args...) \
|
||||
({ \
|
||||
u32 __expect_val = (expect_val); \
|
||||
u32 actual_val = op(args); \
|
||||
(__expect_val == actual_val) ? 0 : \
|
||||
(pr_err("QAT: Fail to restore %s register. Expected 0x%x, actual 0x%x\n", \
|
||||
name, __expect_val, actual_val), -EINVAL); \
|
||||
})
|
||||
|
||||
static int bank_state_restore(struct adf_hw_csr_ops *ops, void __iomem *base,
|
||||
u32 bank, struct bank_state *state, u32 num_rings,
|
||||
int tx_rx_gap)
|
||||
{
|
||||
u32 val, tmp_val, i;
|
||||
int ret;
|
||||
|
||||
for (i = 0; i < num_rings; i++)
|
||||
ops->write_csr_ring_base(base, bank, i, state->rings[i].base);
|
||||
|
||||
for (i = 0; i < num_rings; i++)
|
||||
ops->write_csr_ring_config(base, bank, i, state->rings[i].config);
|
||||
|
||||
for (i = 0; i < num_rings / 2; i++) {
|
||||
int tx = i * (tx_rx_gap + 1);
|
||||
int rx = tx + tx_rx_gap;
|
||||
|
||||
ops->write_csr_ring_head(base, bank, tx, state->rings[tx].head);
|
||||
ops->write_csr_ring_tail(base, bank, tx, state->rings[tx].tail);
|
||||
|
||||
/*
|
||||
* The TX ring head needs to be updated again to make sure that
|
||||
* the HW will not consider the ring as full when it is empty
|
||||
* and the correct state flags are set to match the recovered state.
|
||||
*/
|
||||
if (state->ringestat & BIT(tx)) {
|
||||
val = ops->read_csr_int_srcsel(base, bank);
|
||||
val |= ADF_RP_INT_SRC_SEL_F_RISE_MASK;
|
||||
ops->write_csr_int_srcsel_w_val(base, bank, val);
|
||||
ops->write_csr_ring_head(base, bank, tx, state->rings[tx].head);
|
||||
}
|
||||
|
||||
ops->write_csr_ring_tail(base, bank, rx, state->rings[rx].tail);
|
||||
val = ops->read_csr_int_srcsel(base, bank);
|
||||
val |= ADF_RP_INT_SRC_SEL_F_RISE_MASK << ADF_RP_INT_SRC_SEL_RANGE_WIDTH;
|
||||
ops->write_csr_int_srcsel_w_val(base, bank, val);
|
||||
|
||||
ops->write_csr_ring_head(base, bank, rx, state->rings[rx].head);
|
||||
val = ops->read_csr_int_srcsel(base, bank);
|
||||
val |= ADF_RP_INT_SRC_SEL_F_FALL_MASK << ADF_RP_INT_SRC_SEL_RANGE_WIDTH;
|
||||
ops->write_csr_int_srcsel_w_val(base, bank, val);
|
||||
|
||||
/*
|
||||
* The RX ring tail needs to be updated again to make sure that
|
||||
* the HW will not consider the ring as empty when it is full
|
||||
* and the correct state flags are set to match the recovered state.
|
||||
*/
|
||||
if (state->ringfstat & BIT(rx))
|
||||
ops->write_csr_ring_tail(base, bank, rx, state->rings[rx].tail);
|
||||
}
|
||||
|
||||
ops->write_csr_int_flag_and_col(base, bank, state->iaintflagandcolen);
|
||||
ops->write_csr_int_en(base, bank, state->iaintflagen);
|
||||
ops->write_csr_int_col_en(base, bank, state->iaintcolen);
|
||||
ops->write_csr_int_srcsel_w_val(base, bank, state->iaintflagsrcsel0);
|
||||
ops->write_csr_exp_int_en(base, bank, state->ringexpintenable);
|
||||
ops->write_csr_int_col_ctl(base, bank, state->iaintcolctl);
|
||||
ops->write_csr_ring_srv_arb_en(base, bank, state->ringsrvarben);
|
||||
|
||||
/* Check that all ring statuses match the saved state. */
|
||||
ret = CHECK_STAT(ops->read_csr_stat, state->ringstat0, "ringstat",
|
||||
base, bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = CHECK_STAT(ops->read_csr_e_stat, state->ringestat, "ringestat",
|
||||
base, bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = CHECK_STAT(ops->read_csr_ne_stat, state->ringnestat, "ringnestat",
|
||||
base, bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = CHECK_STAT(ops->read_csr_nf_stat, state->ringnfstat, "ringnfstat",
|
||||
base, bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = CHECK_STAT(ops->read_csr_f_stat, state->ringfstat, "ringfstat",
|
||||
base, bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = CHECK_STAT(ops->read_csr_c_stat, state->ringcstat0, "ringcstat",
|
||||
base, bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
tmp_val = ops->read_csr_exp_stat(base, bank);
|
||||
val = state->ringexpstat;
|
||||
if (tmp_val && !val) {
|
||||
pr_err("QAT: Bank was restored with exception: 0x%x\n", val);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adf_gen4_bank_state_save(struct adf_accel_dev *accel_dev, u32 bank_number,
|
||||
struct bank_state *state)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
|
||||
struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(accel_dev);
|
||||
void __iomem *csr_base = adf_get_etr_base(accel_dev);
|
||||
|
||||
if (bank_number >= hw_data->num_banks || !state)
|
||||
return -EINVAL;
|
||||
|
||||
dev_dbg(&GET_DEV(accel_dev), "Saving state of bank %d\n", bank_number);
|
||||
|
||||
bank_state_save(csr_ops, csr_base, bank_number, state,
|
||||
hw_data->num_rings_per_bank);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen4_bank_state_save);
|
||||
|
||||
int adf_gen4_bank_state_restore(struct adf_accel_dev *accel_dev, u32 bank_number,
|
||||
struct bank_state *state)
|
||||
{
|
||||
struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
|
||||
struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(accel_dev);
|
||||
void __iomem *csr_base = adf_get_etr_base(accel_dev);
|
||||
int ret;
|
||||
|
||||
if (bank_number >= hw_data->num_banks || !state)
|
||||
return -EINVAL;
|
||||
|
||||
dev_dbg(&GET_DEV(accel_dev), "Restoring state of bank %d\n", bank_number);
|
||||
|
||||
ret = bank_state_restore(csr_ops, csr_base, bank_number, state,
|
||||
hw_data->num_rings_per_bank, hw_data->tx_rx_gap);
|
||||
if (ret)
|
||||
dev_err(&GET_DEV(accel_dev),
|
||||
"Unable to restore state of bank %d\n", bank_number);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(adf_gen4_bank_state_restore);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only) */
|
||||
/* Copyright(c) 2020 Intel Corporation */
|
||||
#ifndef ADF_GEN4_HW_CSR_DATA_H_
|
||||
#define ADF_GEN4_HW_CSR_DATA_H_
|
||||
#ifndef ADF_GEN4_HW_DATA_H_
|
||||
#define ADF_GEN4_HW_DATA_H_
|
||||
|
||||
#include <linux/units.h>
|
||||
|
||||
@@ -54,95 +54,6 @@
|
||||
#define ADF_GEN4_ADMINMSGLR_OFFSET 0x500578
|
||||
#define ADF_GEN4_MAILBOX_BASE_OFFSET 0x600970
|
||||
|
||||
/* Transport access */
|
||||
#define ADF_BANK_INT_SRC_SEL_MASK 0x44UL
|
||||
#define ADF_RING_CSR_RING_CONFIG 0x1000
|
||||
#define ADF_RING_CSR_RING_LBASE 0x1040
|
||||
#define ADF_RING_CSR_RING_UBASE 0x1080
|
||||
#define ADF_RING_CSR_RING_HEAD 0x0C0
|
||||
#define ADF_RING_CSR_RING_TAIL 0x100
|
||||
#define ADF_RING_CSR_E_STAT 0x14C
|
||||
#define ADF_RING_CSR_INT_FLAG 0x170
|
||||
#define ADF_RING_CSR_INT_SRCSEL 0x174
|
||||
#define ADF_RING_CSR_INT_COL_CTL 0x180
|
||||
#define ADF_RING_CSR_INT_FLAG_AND_COL 0x184
|
||||
#define ADF_RING_CSR_INT_COL_CTL_ENABLE 0x80000000
|
||||
#define ADF_RING_CSR_INT_COL_EN 0x17C
|
||||
#define ADF_RING_CSR_ADDR_OFFSET 0x100000
|
||||
#define ADF_RING_BUNDLE_SIZE 0x2000
|
||||
|
||||
#define BUILD_RING_BASE_ADDR(addr, size) \
|
||||
((((addr) >> 6) & (GENMASK_ULL(63, 0) << (size))) << 6)
|
||||
#define READ_CSR_RING_HEAD(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2))
|
||||
#define READ_CSR_RING_TAIL(csr_base_addr, bank, ring) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2))
|
||||
#define READ_CSR_E_STAT(csr_base_addr, bank) \
|
||||
ADF_CSR_RD((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + ADF_RING_CSR_E_STAT)
|
||||
#define WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_CONFIG + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, value) \
|
||||
do { \
|
||||
void __iomem *_csr_base_addr = csr_base_addr; \
|
||||
u32 _bank = bank; \
|
||||
u32 _ring = ring; \
|
||||
dma_addr_t _value = value; \
|
||||
u32 l_base = 0, u_base = 0; \
|
||||
l_base = lower_32_bits(_value); \
|
||||
u_base = upper_32_bits(_value); \
|
||||
ADF_CSR_WR((_csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (_bank) + \
|
||||
ADF_RING_CSR_RING_LBASE + ((_ring) << 2), l_base); \
|
||||
ADF_CSR_WR((_csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (_bank) + \
|
||||
ADF_RING_CSR_RING_UBASE + ((_ring) << 2), u_base); \
|
||||
} while (0)
|
||||
|
||||
#define WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_HEAD + ((ring) << 2), value)
|
||||
#define WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_TAIL + ((ring) << 2), value)
|
||||
#define WRITE_CSR_INT_FLAG(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_FLAG, (value))
|
||||
#define WRITE_CSR_INT_SRCSEL(csr_base_addr, bank) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_SRCSEL, ADF_BANK_INT_SRC_SEL_MASK)
|
||||
#define WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_COL_EN, (value))
|
||||
#define WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_COL_CTL, \
|
||||
ADF_RING_CSR_INT_COL_CTL_ENABLE | (value))
|
||||
#define WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_INT_FLAG_AND_COL, (value))
|
||||
|
||||
/* Arbiter configuration */
|
||||
#define ADF_RING_CSR_RING_SRV_ARB_EN 0x19C
|
||||
|
||||
#define WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value) \
|
||||
ADF_CSR_WR((csr_base_addr) + ADF_RING_CSR_ADDR_OFFSET, \
|
||||
ADF_RING_BUNDLE_SIZE * (bank) + \
|
||||
ADF_RING_CSR_RING_SRV_ARB_EN, (value))
|
||||
|
||||
/* Default ring mapping */
|
||||
#define ADF_GEN4_DEFAULT_RING_TO_SRV_MAP \
|
||||
(ASYM << ADF_CFG_SERV_RING_PAIR_0_SHIFT | \
|
||||
@@ -166,10 +77,20 @@ do { \
|
||||
#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_DRAIN BIT(2)
|
||||
#define ADF_WQM_CSR_RPRESETCTL(bank) (0x6000 + ((bank) << 3))
|
||||
#define ADF_WQM_CSR_RPRESETSTS_STATUS BIT(0)
|
||||
#define ADF_WQM_CSR_RPRESETSTS(bank) (ADF_WQM_CSR_RPRESETCTL(bank) + 4)
|
||||
|
||||
/* Ring interrupt */
|
||||
#define ADF_RP_INT_SRC_SEL_F_RISE_MASK BIT(2)
|
||||
#define ADF_RP_INT_SRC_SEL_F_FALL_MASK GENMASK(2, 0)
|
||||
#define ADF_RP_INT_SRC_SEL_RANGE_WIDTH 4
|
||||
#define ADF_COALESCED_POLL_TIMEOUT_US (1 * USEC_PER_SEC)
|
||||
#define ADF_COALESCED_POLL_DELAY_US 1000
|
||||
#define ADF_WQM_CSR_RPINTSOU(bank) (0x200000 + ((bank) << 12))
|
||||
#define ADF_WQM_CSR_RP_IDX_RX 1
|
||||
|
||||
/* Error source registers */
|
||||
#define ADF_GEN4_ERRSOU0 (0x41A200)
|
||||
#define ADF_GEN4_ERRSOU1 (0x41A204)
|
||||
@@ -197,6 +118,19 @@ do { \
|
||||
/* Arbiter threads mask with error value */
|
||||
#define ADF_GEN4_ENA_THD_MASK_ERROR GENMASK(ADF_NUM_THREADS_PER_AE, 0)
|
||||
|
||||
/* PF2VM communication channel */
|
||||
#define ADF_GEN4_PF2VM_OFFSET(i) (0x40B010 + (i) * 0x20)
|
||||
#define ADF_GEN4_VM2PF_OFFSET(i) (0x40B014 + (i) * 0x20)
|
||||
#define ADF_GEN4_VINTMSKPF2VM_OFFSET(i) (0x40B00C + (i) * 0x20)
|
||||
#define ADF_GEN4_VINTSOUPF2VM_OFFSET(i) (0x40B008 + (i) * 0x20)
|
||||
#define ADF_GEN4_VINTMSK_OFFSET(i) (0x40B004 + (i) * 0x20)
|
||||
#define ADF_GEN4_VINTSOU_OFFSET(i) (0x40B000 + (i) * 0x20)
|
||||
|
||||
struct adf_gen4_vfmig {
|
||||
struct adf_mstate_mgr *mstate_mgr;
|
||||
bool bank_stopped[ADF_GEN4_NUM_BANKS_PER_VF];
|
||||
};
|
||||
|
||||
void adf_gen4_set_ssm_wdtimer(struct adf_accel_dev *accel_dev);
|
||||
|
||||
enum icp_qat_gen4_slice_mask {
|
||||
@@ -230,11 +164,20 @@ u32 adf_gen4_get_num_aes(struct adf_hw_device_data *self);
|
||||
enum dev_sku_info adf_gen4_get_sku(struct adf_hw_device_data *self);
|
||||
u32 adf_gen4_get_sram_bar_id(struct adf_hw_device_data *self);
|
||||
int adf_gen4_init_device(struct adf_accel_dev *accel_dev);
|
||||
void adf_gen4_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops);
|
||||
int adf_gen4_ring_pair_reset(struct adf_accel_dev *accel_dev, u32 bank_number);
|
||||
void adf_gen4_set_msix_default_rttable(struct adf_accel_dev *accel_dev);
|
||||
void adf_gen4_set_ssm_wdtimer(struct adf_accel_dev *accel_dev);
|
||||
int adf_gen4_init_thd2arb_map(struct adf_accel_dev *accel_dev);
|
||||
u16 adf_gen4_get_ring_to_svc_map(struct adf_accel_dev *accel_dev);
|
||||
int adf_gen4_bank_quiesce_coal_timer(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_idx, int timeout_ms);
|
||||
int adf_gen4_bank_drain_start(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_number, int timeout_us);
|
||||
void adf_gen4_bank_drain_finish(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_number);
|
||||
int adf_gen4_bank_state_save(struct adf_accel_dev *accel_dev, u32 bank_number,
|
||||
struct bank_state *state);
|
||||
int adf_gen4_bank_state_restore(struct adf_accel_dev *accel_dev,
|
||||
u32 bank_number, struct bank_state *state);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,12 +6,10 @@
|
||||
#include "adf_accel_devices.h"
|
||||
#include "adf_common_drv.h"
|
||||
#include "adf_gen4_pfvf.h"
|
||||
#include "adf_gen4_hw_data.h"
|
||||
#include "adf_pfvf_pf_proto.h"
|
||||
#include "adf_pfvf_utils.h"
|
||||
|
||||
#define ADF_4XXX_PF2VM_OFFSET(i) (0x40B010 + ((i) * 0x20))
|
||||
#define ADF_4XXX_VM2PF_OFFSET(i) (0x40B014 + ((i) * 0x20))
|
||||
|
||||
/* VF2PF interrupt source registers */
|
||||
#define ADF_4XXX_VM2PF_SOU 0x41A180
|
||||
#define ADF_4XXX_VM2PF_MSK 0x41A1C0
|
||||
@@ -29,12 +27,12 @@ static const struct pfvf_csr_format csr_gen4_fmt = {
|
||||
|
||||
static u32 adf_gen4_pf_get_pf2vf_offset(u32 i)
|
||||
{
|
||||
return ADF_4XXX_PF2VM_OFFSET(i);
|
||||
return ADF_GEN4_PF2VM_OFFSET(i);
|
||||
}
|
||||
|
||||
static u32 adf_gen4_pf_get_vf2pf_offset(u32 i)
|
||||
{
|
||||
return ADF_4XXX_VM2PF_OFFSET(i);
|
||||
return ADF_GEN4_VM2PF_OFFSET(i);
|
||||
}
|
||||
|
||||
static void adf_gen4_enable_vf2pf_interrupts(void __iomem *pmisc_addr, u32 vf_mask)
|
||||
|
||||
1010
drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.c
Normal file
1010
drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.c
Normal file
File diff suppressed because it is too large
Load Diff
10
drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h
Normal file
10
drivers/crypto/intel/qat/qat_common/adf_gen4_vf_mig.h
Normal file
@@ -0,0 +1,10 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#ifndef ADF_GEN4_VF_MIG_H_
|
||||
#define ADF_GEN4_VF_MIG_H_
|
||||
|
||||
#include "adf_accel_devices.h"
|
||||
|
||||
void adf_gen4_init_vf_mig_ops(struct qat_migdev_ops *vfmig_ops);
|
||||
|
||||
#endif
|
||||
318
drivers/crypto/intel/qat/qat_common/adf_mstate_mgr.c
Normal file
318
drivers/crypto/intel/qat/qat_common/adf_mstate_mgr.c
Normal file
@@ -0,0 +1,318 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include "adf_mstate_mgr.h"
|
||||
|
||||
#define ADF_MSTATE_MAGIC 0xADF5CAEA
|
||||
#define ADF_MSTATE_VERSION 0x1
|
||||
|
||||
struct adf_mstate_sect_h {
|
||||
u8 id[ADF_MSTATE_ID_LEN];
|
||||
u32 size;
|
||||
u32 sub_sects;
|
||||
u8 state[];
|
||||
};
|
||||
|
||||
u32 adf_mstate_state_size(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
return mgr->state - mgr->buf;
|
||||
}
|
||||
|
||||
static inline u32 adf_mstate_avail_room(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
return mgr->buf + mgr->size - mgr->state;
|
||||
}
|
||||
|
||||
void adf_mstate_mgr_init(struct adf_mstate_mgr *mgr, u8 *buf, u32 size)
|
||||
{
|
||||
mgr->buf = buf;
|
||||
mgr->state = buf;
|
||||
mgr->size = size;
|
||||
mgr->n_sects = 0;
|
||||
};
|
||||
|
||||
struct adf_mstate_mgr *adf_mstate_mgr_new(u8 *buf, u32 size)
|
||||
{
|
||||
struct adf_mstate_mgr *mgr;
|
||||
|
||||
mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
|
||||
if (!mgr)
|
||||
return NULL;
|
||||
|
||||
adf_mstate_mgr_init(mgr, buf, size);
|
||||
|
||||
return mgr;
|
||||
}
|
||||
|
||||
void adf_mstate_mgr_destroy(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
kfree(mgr);
|
||||
}
|
||||
|
||||
void adf_mstate_mgr_init_from_parent(struct adf_mstate_mgr *mgr,
|
||||
struct adf_mstate_mgr *p_mgr)
|
||||
{
|
||||
adf_mstate_mgr_init(mgr, p_mgr->state,
|
||||
p_mgr->size - adf_mstate_state_size(p_mgr));
|
||||
}
|
||||
|
||||
void adf_mstate_mgr_init_from_psect(struct adf_mstate_mgr *mgr,
|
||||
struct adf_mstate_sect_h *p_sect)
|
||||
{
|
||||
adf_mstate_mgr_init(mgr, p_sect->state, p_sect->size);
|
||||
mgr->n_sects = p_sect->sub_sects;
|
||||
}
|
||||
|
||||
static void adf_mstate_preamble_init(struct adf_mstate_preh *preamble)
|
||||
{
|
||||
preamble->magic = ADF_MSTATE_MAGIC;
|
||||
preamble->version = ADF_MSTATE_VERSION;
|
||||
preamble->preh_len = sizeof(*preamble);
|
||||
preamble->size = 0;
|
||||
preamble->n_sects = 0;
|
||||
}
|
||||
|
||||
/* default preambles checker */
|
||||
static int adf_mstate_preamble_def_checker(struct adf_mstate_preh *preamble,
|
||||
void *opaque)
|
||||
{
|
||||
struct adf_mstate_mgr *mgr = opaque;
|
||||
|
||||
if (preamble->magic != ADF_MSTATE_MAGIC ||
|
||||
preamble->version > ADF_MSTATE_VERSION ||
|
||||
preamble->preh_len > mgr->size) {
|
||||
pr_debug("QAT: LM - Invalid state (magic=%#x, version=%#x, hlen=%u), state_size=%u\n",
|
||||
preamble->magic, preamble->version, preamble->preh_len,
|
||||
mgr->size);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct adf_mstate_preh *adf_mstate_preamble_add(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
struct adf_mstate_preh *pre = (struct adf_mstate_preh *)mgr->buf;
|
||||
|
||||
if (adf_mstate_avail_room(mgr) < sizeof(*pre)) {
|
||||
pr_err("QAT: LM - Not enough space for preamble\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
adf_mstate_preamble_init(pre);
|
||||
mgr->state += pre->preh_len;
|
||||
|
||||
return pre;
|
||||
}
|
||||
|
||||
int adf_mstate_preamble_update(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
struct adf_mstate_preh *preamble = (struct adf_mstate_preh *)mgr->buf;
|
||||
|
||||
preamble->size = adf_mstate_state_size(mgr) - preamble->preh_len;
|
||||
preamble->n_sects = mgr->n_sects;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void adf_mstate_dump_sect(struct adf_mstate_sect_h *sect,
|
||||
const char *prefix)
|
||||
{
|
||||
pr_debug("QAT: LM - %s QAT state section %s\n", prefix, sect->id);
|
||||
print_hex_dump_debug("h-", DUMP_PREFIX_OFFSET, 16, 2, sect,
|
||||
sizeof(*sect), true);
|
||||
print_hex_dump_debug("s-", DUMP_PREFIX_OFFSET, 16, 2, sect->state,
|
||||
sect->size, true);
|
||||
}
|
||||
|
||||
static inline void __adf_mstate_sect_update(struct adf_mstate_mgr *mgr,
|
||||
struct adf_mstate_sect_h *sect,
|
||||
u32 size,
|
||||
u32 n_subsects)
|
||||
{
|
||||
sect->size += size;
|
||||
sect->sub_sects += n_subsects;
|
||||
mgr->n_sects++;
|
||||
mgr->state += sect->size;
|
||||
|
||||
adf_mstate_dump_sect(sect, "Add");
|
||||
}
|
||||
|
||||
void adf_mstate_sect_update(struct adf_mstate_mgr *p_mgr,
|
||||
struct adf_mstate_mgr *curr_mgr,
|
||||
struct adf_mstate_sect_h *sect)
|
||||
{
|
||||
__adf_mstate_sect_update(p_mgr, sect, adf_mstate_state_size(curr_mgr),
|
||||
curr_mgr->n_sects);
|
||||
}
|
||||
|
||||
static struct adf_mstate_sect_h *adf_mstate_sect_add_header(struct adf_mstate_mgr *mgr,
|
||||
const char *id)
|
||||
{
|
||||
struct adf_mstate_sect_h *sect = (struct adf_mstate_sect_h *)(mgr->state);
|
||||
|
||||
if (adf_mstate_avail_room(mgr) < sizeof(*sect)) {
|
||||
pr_debug("QAT: LM - Not enough space for header of QAT state sect %s\n", id);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
strscpy(sect->id, id, sizeof(sect->id));
|
||||
sect->size = 0;
|
||||
sect->sub_sects = 0;
|
||||
mgr->state += sizeof(*sect);
|
||||
|
||||
return sect;
|
||||
}
|
||||
|
||||
struct adf_mstate_sect_h *adf_mstate_sect_add_vreg(struct adf_mstate_mgr *mgr,
|
||||
const char *id,
|
||||
struct adf_mstate_vreginfo *info)
|
||||
{
|
||||
struct adf_mstate_sect_h *sect;
|
||||
|
||||
sect = adf_mstate_sect_add_header(mgr, id);
|
||||
if (!sect)
|
||||
return NULL;
|
||||
|
||||
if (adf_mstate_avail_room(mgr) < info->size) {
|
||||
pr_debug("QAT: LM - Not enough space for QAT state sect %s, requires %u\n",
|
||||
id, info->size);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(sect->state, info->addr, info->size);
|
||||
__adf_mstate_sect_update(mgr, sect, info->size, 0);
|
||||
|
||||
return sect;
|
||||
}
|
||||
|
||||
struct adf_mstate_sect_h *adf_mstate_sect_add(struct adf_mstate_mgr *mgr,
|
||||
const char *id,
|
||||
adf_mstate_populate populate,
|
||||
void *opaque)
|
||||
{
|
||||
struct adf_mstate_mgr sub_sects_mgr;
|
||||
struct adf_mstate_sect_h *sect;
|
||||
int avail_room, size;
|
||||
|
||||
sect = adf_mstate_sect_add_header(mgr, id);
|
||||
if (!sect)
|
||||
return NULL;
|
||||
|
||||
if (!populate)
|
||||
return sect;
|
||||
|
||||
avail_room = adf_mstate_avail_room(mgr);
|
||||
adf_mstate_mgr_init_from_parent(&sub_sects_mgr, mgr);
|
||||
|
||||
size = (*populate)(&sub_sects_mgr, sect->state, avail_room, opaque);
|
||||
if (size < 0)
|
||||
return NULL;
|
||||
|
||||
size += adf_mstate_state_size(&sub_sects_mgr);
|
||||
if (avail_room < size) {
|
||||
pr_debug("QAT: LM - Not enough space for QAT state sect %s, requires %u\n",
|
||||
id, size);
|
||||
return NULL;
|
||||
}
|
||||
__adf_mstate_sect_update(mgr, sect, size, sub_sects_mgr.n_sects);
|
||||
|
||||
return sect;
|
||||
}
|
||||
|
||||
static int adf_mstate_sect_validate(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
struct adf_mstate_sect_h *start = (struct adf_mstate_sect_h *)mgr->state;
|
||||
struct adf_mstate_sect_h *sect = start;
|
||||
u64 end;
|
||||
int i;
|
||||
|
||||
end = (uintptr_t)mgr->buf + mgr->size;
|
||||
for (i = 0; i < mgr->n_sects; i++) {
|
||||
uintptr_t s_start = (uintptr_t)sect->state;
|
||||
uintptr_t s_end = s_start + sect->size;
|
||||
|
||||
if (s_end < s_start || s_end > end) {
|
||||
pr_debug("QAT: LM - Corrupted state section (index=%u, size=%u) in state_mgr (size=%u, secs=%u)\n",
|
||||
i, sect->size, mgr->size, mgr->n_sects);
|
||||
return -EINVAL;
|
||||
}
|
||||
sect = (struct adf_mstate_sect_h *)s_end;
|
||||
}
|
||||
|
||||
pr_debug("QAT: LM - Scanned section (last child=%s, size=%lu) in state_mgr (size=%u, secs=%u)\n",
|
||||
start->id, sizeof(struct adf_mstate_sect_h) * (ulong)(sect - start),
|
||||
mgr->size, mgr->n_sects);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 adf_mstate_state_size_from_remote(struct adf_mstate_mgr *mgr)
|
||||
{
|
||||
struct adf_mstate_preh *preh = (struct adf_mstate_preh *)mgr->buf;
|
||||
|
||||
return preh->preh_len + preh->size;
|
||||
}
|
||||
|
||||
int adf_mstate_mgr_init_from_remote(struct adf_mstate_mgr *mgr, u8 *buf, u32 size,
|
||||
adf_mstate_preamble_checker pre_checker,
|
||||
void *opaque)
|
||||
{
|
||||
struct adf_mstate_preh *pre;
|
||||
int ret;
|
||||
|
||||
adf_mstate_mgr_init(mgr, buf, size);
|
||||
pre = (struct adf_mstate_preh *)(mgr->buf);
|
||||
|
||||
pr_debug("QAT: LM - Dump state preambles\n");
|
||||
print_hex_dump_debug("", DUMP_PREFIX_OFFSET, 16, 2, pre, pre->preh_len, 0);
|
||||
|
||||
if (pre_checker)
|
||||
ret = (*pre_checker)(pre, opaque);
|
||||
else
|
||||
ret = adf_mstate_preamble_def_checker(pre, mgr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mgr->state = mgr->buf + pre->preh_len;
|
||||
mgr->n_sects = pre->n_sects;
|
||||
|
||||
return adf_mstate_sect_validate(mgr);
|
||||
}
|
||||
|
||||
struct adf_mstate_sect_h *adf_mstate_sect_lookup(struct adf_mstate_mgr *mgr,
|
||||
const char *id,
|
||||
adf_mstate_action action,
|
||||
void *opaque)
|
||||
{
|
||||
struct adf_mstate_sect_h *sect = (struct adf_mstate_sect_h *)mgr->state;
|
||||
struct adf_mstate_mgr sub_sects_mgr;
|
||||
int i, ret;
|
||||
|
||||
for (i = 0; i < mgr->n_sects; i++) {
|
||||
if (!strncmp(sect->id, id, sizeof(sect->id)))
|
||||
goto found;
|
||||
|
||||
sect = (struct adf_mstate_sect_h *)(sect->state + sect->size);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
||||
found:
|
||||
adf_mstate_dump_sect(sect, "Found");
|
||||
|
||||
adf_mstate_mgr_init_from_psect(&sub_sects_mgr, sect);
|
||||
if (sect->sub_sects && adf_mstate_sect_validate(&sub_sects_mgr))
|
||||
return NULL;
|
||||
|
||||
if (!action)
|
||||
return sect;
|
||||
|
||||
ret = (*action)(&sub_sects_mgr, sect->state, sect->size, opaque);
|
||||
if (ret)
|
||||
return NULL;
|
||||
|
||||
return sect;
|
||||
}
|
||||
89
drivers/crypto/intel/qat/qat_common/adf_mstate_mgr.h
Normal file
89
drivers/crypto/intel/qat/qat_common/adf_mstate_mgr.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
|
||||
#ifndef ADF_MSTATE_MGR_H
|
||||
#define ADF_MSTATE_MGR_H
|
||||
|
||||
#define ADF_MSTATE_ID_LEN 8
|
||||
|
||||
#define ADF_MSTATE_ETRB_IDS "ETRBAR"
|
||||
#define ADF_MSTATE_MISCB_IDS "MISCBAR"
|
||||
#define ADF_MSTATE_EXTB_IDS "EXTBAR"
|
||||
#define ADF_MSTATE_GEN_IDS "GENER"
|
||||
#define ADF_MSTATE_CONFIG_IDS "CONFIG"
|
||||
#define ADF_MSTATE_SECTION_NUM 5
|
||||
|
||||
#define ADF_MSTATE_BANK_IDX_IDS "bnk"
|
||||
|
||||
#define ADF_MSTATE_ETR_REGS_IDS "mregs"
|
||||
#define ADF_MSTATE_VINTSRC_IDS "visrc"
|
||||
#define ADF_MSTATE_VINTMSK_IDS "vimsk"
|
||||
#define ADF_MSTATE_SLA_IDS "sla"
|
||||
#define ADF_MSTATE_IOV_INIT_IDS "iovinit"
|
||||
#define ADF_MSTATE_COMPAT_VER_IDS "compver"
|
||||
#define ADF_MSTATE_GEN_CAP_IDS "gencap"
|
||||
#define ADF_MSTATE_GEN_SVCMAP_IDS "svcmap"
|
||||
#define ADF_MSTATE_GEN_EXTDC_IDS "extdc"
|
||||
#define ADF_MSTATE_VINTSRC_PF2VM_IDS "vispv"
|
||||
#define ADF_MSTATE_VINTMSK_PF2VM_IDS "vimpv"
|
||||
#define ADF_MSTATE_VM2PF_IDS "vm2pf"
|
||||
#define ADF_MSTATE_PF2VM_IDS "pf2vm"
|
||||
|
||||
struct adf_mstate_mgr {
|
||||
u8 *buf;
|
||||
u8 *state;
|
||||
u32 size;
|
||||
u32 n_sects;
|
||||
};
|
||||
|
||||
struct adf_mstate_preh {
|
||||
u32 magic;
|
||||
u32 version;
|
||||
u16 preh_len;
|
||||
u16 n_sects;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct adf_mstate_vreginfo {
|
||||
void *addr;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
struct adf_mstate_sect_h;
|
||||
|
||||
typedef int (*adf_mstate_preamble_checker)(struct adf_mstate_preh *preamble, void *opa);
|
||||
typedef int (*adf_mstate_populate)(struct adf_mstate_mgr *sub_mgr, u8 *buf,
|
||||
u32 size, void *opa);
|
||||
typedef int (*adf_mstate_action)(struct adf_mstate_mgr *sub_mgr, u8 *buf, u32 size,
|
||||
void *opa);
|
||||
|
||||
struct adf_mstate_mgr *adf_mstate_mgr_new(u8 *buf, u32 size);
|
||||
void adf_mstate_mgr_destroy(struct adf_mstate_mgr *mgr);
|
||||
void adf_mstate_mgr_init(struct adf_mstate_mgr *mgr, u8 *buf, u32 size);
|
||||
void adf_mstate_mgr_init_from_parent(struct adf_mstate_mgr *mgr,
|
||||
struct adf_mstate_mgr *p_mgr);
|
||||
void adf_mstate_mgr_init_from_psect(struct adf_mstate_mgr *mgr,
|
||||
struct adf_mstate_sect_h *p_sect);
|
||||
int adf_mstate_mgr_init_from_remote(struct adf_mstate_mgr *mgr,
|
||||
u8 *buf, u32 size,
|
||||
adf_mstate_preamble_checker checker,
|
||||
void *opaque);
|
||||
struct adf_mstate_preh *adf_mstate_preamble_add(struct adf_mstate_mgr *mgr);
|
||||
int adf_mstate_preamble_update(struct adf_mstate_mgr *mgr);
|
||||
u32 adf_mstate_state_size(struct adf_mstate_mgr *mgr);
|
||||
u32 adf_mstate_state_size_from_remote(struct adf_mstate_mgr *mgr);
|
||||
void adf_mstate_sect_update(struct adf_mstate_mgr *p_mgr,
|
||||
struct adf_mstate_mgr *curr_mgr,
|
||||
struct adf_mstate_sect_h *sect);
|
||||
struct adf_mstate_sect_h *adf_mstate_sect_add_vreg(struct adf_mstate_mgr *mgr,
|
||||
const char *id,
|
||||
struct adf_mstate_vreginfo *info);
|
||||
struct adf_mstate_sect_h *adf_mstate_sect_add(struct adf_mstate_mgr *mgr,
|
||||
const char *id,
|
||||
adf_mstate_populate populate,
|
||||
void *opaque);
|
||||
struct adf_mstate_sect_h *adf_mstate_sect_lookup(struct adf_mstate_mgr *mgr,
|
||||
const char *id,
|
||||
adf_mstate_action action,
|
||||
void *opaque);
|
||||
#endif
|
||||
@@ -242,13 +242,7 @@ static int adf_handle_vf2pf_msg(struct adf_accel_dev *accel_dev, u8 vf_nr,
|
||||
"VersionRequest received from VF%d (vers %d) to PF (vers %d)\n",
|
||||
vf_nr, vf_compat_ver, ADF_PFVF_COMPAT_THIS_VERSION);
|
||||
|
||||
if (vf_compat_ver == 0)
|
||||
compat = ADF_PF2VF_VF_INCOMPATIBLE;
|
||||
else if (vf_compat_ver <= ADF_PFVF_COMPAT_THIS_VERSION)
|
||||
compat = ADF_PF2VF_VF_COMPATIBLE;
|
||||
else
|
||||
compat = ADF_PF2VF_VF_COMPAT_UNKNOWN;
|
||||
|
||||
compat = adf_vf_compat_checker(vf_compat_ver);
|
||||
vf_info->vf_compat_ver = vf_compat_ver;
|
||||
|
||||
resp->type = ADF_PF2VF_MSGTYPE_VERSION_RESP;
|
||||
|
||||
@@ -28,4 +28,15 @@ u32 adf_pfvf_csr_msg_of(struct adf_accel_dev *accel_dev, struct pfvf_message msg
|
||||
struct pfvf_message adf_pfvf_message_of(struct adf_accel_dev *accel_dev, u32 raw_msg,
|
||||
const struct pfvf_csr_format *fmt);
|
||||
|
||||
static inline u8 adf_vf_compat_checker(u8 vf_compat_ver)
|
||||
{
|
||||
if (vf_compat_ver == 0)
|
||||
return ADF_PF2VF_VF_INCOMPATIBLE;
|
||||
|
||||
if (vf_compat_ver <= ADF_PFVF_COMPAT_THIS_VERSION)
|
||||
return ADF_PF2VF_VF_COMPATIBLE;
|
||||
|
||||
return ADF_PF2VF_VF_COMPAT_UNKNOWN;
|
||||
}
|
||||
|
||||
#endif /* ADF_PFVF_UTILS_H */
|
||||
|
||||
@@ -183,14 +183,14 @@ static enum adf_cfg_service_type srv_to_cfg_svc_type(enum adf_base_services rl_s
|
||||
}
|
||||
|
||||
/**
|
||||
* get_sla_arr_of_type() - Returns a pointer to SLA type specific array
|
||||
* adf_rl_get_sla_arr_of_type() - Returns a pointer to SLA type specific array
|
||||
* @rl_data: pointer to ratelimiting data
|
||||
* @type: SLA type
|
||||
* @sla_arr: pointer to variable where requested pointer will be stored
|
||||
*
|
||||
* Return: Max number of elements allowed for the returned array
|
||||
*/
|
||||
static u32 get_sla_arr_of_type(struct adf_rl *rl_data, enum rl_node_type type,
|
||||
u32 adf_rl_get_sla_arr_of_type(struct adf_rl *rl_data, enum rl_node_type type,
|
||||
struct rl_sla ***sla_arr)
|
||||
{
|
||||
switch (type) {
|
||||
@@ -778,7 +778,7 @@ static void clear_sla(struct adf_rl *rl_data, struct rl_sla *sla)
|
||||
rp_in_use[sla->ring_pairs_ids[i]] = false;
|
||||
|
||||
update_budget(sla, old_cir, true);
|
||||
get_sla_arr_of_type(rl_data, sla->type, &sla_type_arr);
|
||||
adf_rl_get_sla_arr_of_type(rl_data, sla->type, &sla_type_arr);
|
||||
assign_node_to_parent(rl_data->accel_dev, sla, true);
|
||||
adf_rl_send_admin_delete_msg(rl_data->accel_dev, node_id, sla->type);
|
||||
mark_rps_usage(sla, rl_data->rp_in_use, false);
|
||||
@@ -875,7 +875,7 @@ static int add_update_sla(struct adf_accel_dev *accel_dev,
|
||||
|
||||
if (!is_update) {
|
||||
mark_rps_usage(sla, rl_data->rp_in_use, true);
|
||||
get_sla_arr_of_type(rl_data, sla->type, &sla_type_arr);
|
||||
adf_rl_get_sla_arr_of_type(rl_data, sla->type, &sla_type_arr);
|
||||
sla_type_arr[sla->node_id] = sla;
|
||||
rl_data->sla[sla->sla_id] = sla;
|
||||
}
|
||||
@@ -1065,7 +1065,7 @@ void adf_rl_remove_sla_all(struct adf_accel_dev *accel_dev, bool incl_default)
|
||||
|
||||
/* Unregister and remove all SLAs */
|
||||
for (j = RL_LEAF; j >= end_type; j--) {
|
||||
max_id = get_sla_arr_of_type(rl_data, j, &sla_type_arr);
|
||||
max_id = adf_rl_get_sla_arr_of_type(rl_data, j, &sla_type_arr);
|
||||
|
||||
for (i = 0; i < max_id; i++) {
|
||||
if (!sla_type_arr[i])
|
||||
|
||||
@@ -151,6 +151,8 @@ struct rl_sla {
|
||||
u16 ring_pairs_cnt;
|
||||
};
|
||||
|
||||
u32 adf_rl_get_sla_arr_of_type(struct adf_rl *rl_data, enum rl_node_type type,
|
||||
struct rl_sla ***sla_arr);
|
||||
int adf_rl_add_sla(struct adf_accel_dev *accel_dev,
|
||||
struct adf_rl_sla_input_data *sla_in);
|
||||
int adf_rl_update_sla(struct adf_accel_dev *accel_dev,
|
||||
|
||||
@@ -26,10 +26,12 @@ static void adf_iov_send_resp(struct work_struct *work)
|
||||
u32 vf_nr = vf_info->vf_nr;
|
||||
bool ret;
|
||||
|
||||
mutex_lock(&vf_info->pfvf_mig_lock);
|
||||
ret = adf_recv_and_handle_vf2pf_msg(accel_dev, vf_nr);
|
||||
if (ret)
|
||||
/* re-enable interrupt on PF from this VF */
|
||||
adf_enable_vf2pf_interrupts(accel_dev, 1 << vf_nr);
|
||||
mutex_unlock(&vf_info->pfvf_mig_lock);
|
||||
|
||||
kfree(pf2vf_resp);
|
||||
}
|
||||
@@ -62,6 +64,7 @@ static int adf_enable_sriov(struct adf_accel_dev *accel_dev)
|
||||
vf_info->vf_nr = i;
|
||||
|
||||
mutex_init(&vf_info->pf2vf_lock);
|
||||
mutex_init(&vf_info->pfvf_mig_lock);
|
||||
ratelimit_state_init(&vf_info->vf2pf_ratelimit,
|
||||
ADF_VF2PF_RATELIMIT_INTERVAL,
|
||||
ADF_VF2PF_RATELIMIT_BURST);
|
||||
@@ -138,8 +141,10 @@ void adf_disable_sriov(struct adf_accel_dev *accel_dev)
|
||||
if (hw_data->configure_iov_threads)
|
||||
hw_data->configure_iov_threads(accel_dev, false);
|
||||
|
||||
for (i = 0, vf = accel_dev->pf.vf_info; i < totalvfs; i++, vf++)
|
||||
for (i = 0, vf = accel_dev->pf.vf_info; i < totalvfs; i++, vf++) {
|
||||
mutex_destroy(&vf->pf2vf_lock);
|
||||
mutex_destroy(&vf->pfvf_mig_lock);
|
||||
}
|
||||
|
||||
if (!test_bit(ADF_STATUS_RESTARTING, &accel_dev->status)) {
|
||||
kfree(accel_dev->pf.vf_info);
|
||||
|
||||
@@ -474,7 +474,6 @@ static int adf_init_bank(struct adf_accel_dev *accel_dev,
|
||||
int adf_init_etr_data(struct adf_accel_dev *accel_dev)
|
||||
{
|
||||
struct adf_etr_data *etr_data;
|
||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device;
|
||||
void __iomem *csr_addr;
|
||||
u32 size;
|
||||
u32 num_banks = 0;
|
||||
@@ -495,8 +494,7 @@ int adf_init_etr_data(struct adf_accel_dev *accel_dev)
|
||||
}
|
||||
|
||||
accel_dev->transport = etr_data;
|
||||
i = hw_data->get_etr_bar_id(hw_data);
|
||||
csr_addr = accel_dev->accel_pci_dev.pci_bars[i].virt_addr;
|
||||
csr_addr = adf_get_etr_base(accel_dev);
|
||||
|
||||
/* accel_dev->debugfs_dir should always be non-NULL here */
|
||||
etr_data->debug = debugfs_create_dir("transport",
|
||||
|
||||
130
drivers/crypto/intel/qat/qat_common/qat_mig_dev.c
Normal file
130
drivers/crypto/intel/qat/qat_common/qat_mig_dev.c
Normal file
@@ -0,0 +1,130 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#include <linux/dev_printk.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/qat/qat_mig_dev.h>
|
||||
#include "adf_accel_devices.h"
|
||||
#include "adf_common_drv.h"
|
||||
|
||||
struct qat_mig_dev *qat_vfmig_create(struct pci_dev *pdev, int vf_id)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev;
|
||||
struct qat_migdev_ops *ops;
|
||||
struct qat_mig_dev *mdev;
|
||||
|
||||
accel_dev = adf_devmgr_pci_to_accel_dev(pdev);
|
||||
if (!accel_dev)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
ops = GET_VFMIG_OPS(accel_dev);
|
||||
if (!ops || !ops->init || !ops->cleanup || !ops->reset || !ops->open ||
|
||||
!ops->close || !ops->suspend || !ops->resume || !ops->save_state ||
|
||||
!ops->load_state || !ops->save_setup || !ops->load_setup)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mdev = kmalloc(sizeof(*mdev), GFP_KERNEL);
|
||||
if (!mdev)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
mdev->vf_id = vf_id;
|
||||
mdev->parent_accel_dev = accel_dev;
|
||||
|
||||
return mdev;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_create);
|
||||
|
||||
int qat_vfmig_init(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->init(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_init);
|
||||
|
||||
void qat_vfmig_cleanup(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->cleanup(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_cleanup);
|
||||
|
||||
void qat_vfmig_reset(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->reset(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_reset);
|
||||
|
||||
int qat_vfmig_open(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->open(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_open);
|
||||
|
||||
void qat_vfmig_close(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
GET_VFMIG_OPS(accel_dev)->close(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_close);
|
||||
|
||||
int qat_vfmig_suspend(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->suspend(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_suspend);
|
||||
|
||||
int qat_vfmig_resume(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->resume(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_resume);
|
||||
|
||||
int qat_vfmig_save_state(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->save_state(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_save_state);
|
||||
|
||||
int qat_vfmig_save_setup(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->save_setup(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_save_setup);
|
||||
|
||||
int qat_vfmig_load_state(struct qat_mig_dev *mdev)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->load_state(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_load_state);
|
||||
|
||||
int qat_vfmig_load_setup(struct qat_mig_dev *mdev, int size)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = mdev->parent_accel_dev;
|
||||
|
||||
return GET_VFMIG_OPS(accel_dev)->load_setup(mdev, size);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_load_setup);
|
||||
|
||||
void qat_vfmig_destroy(struct qat_mig_dev *mdev)
|
||||
{
|
||||
kfree(mdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qat_vfmig_destroy);
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_gen2_config.h>
|
||||
#include <adf_gen2_dc.h>
|
||||
#include <adf_gen2_hw_csr_data.h>
|
||||
#include <adf_gen2_hw_data.h>
|
||||
#include <adf_gen2_pfvf.h>
|
||||
#include "adf_dh895xcc_hw_data.h"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <adf_common_drv.h>
|
||||
#include <adf_gen2_config.h>
|
||||
#include <adf_gen2_dc.h>
|
||||
#include <adf_gen2_hw_csr_data.h>
|
||||
#include <adf_gen2_hw_data.h>
|
||||
#include <adf_gen2_pfvf.h>
|
||||
#include <adf_pfvf_vf_msg.h>
|
||||
|
||||
31
include/linux/qat/qat_mig_dev.h
Normal file
31
include/linux/qat/qat_mig_dev.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2024 Intel Corporation */
|
||||
#ifndef QAT_MIG_DEV_H_
|
||||
#define QAT_MIG_DEV_H_
|
||||
|
||||
struct pci_dev;
|
||||
|
||||
struct qat_mig_dev {
|
||||
void *parent_accel_dev;
|
||||
u8 *state;
|
||||
u32 setup_size;
|
||||
u32 remote_setup_size;
|
||||
u32 state_size;
|
||||
s32 vf_id;
|
||||
};
|
||||
|
||||
struct qat_mig_dev *qat_vfmig_create(struct pci_dev *pdev, int vf_id);
|
||||
int qat_vfmig_init(struct qat_mig_dev *mdev);
|
||||
void qat_vfmig_cleanup(struct qat_mig_dev *mdev);
|
||||
void qat_vfmig_reset(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_open(struct qat_mig_dev *mdev);
|
||||
void qat_vfmig_close(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_suspend(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_resume(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_save_state(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_save_setup(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_load_state(struct qat_mig_dev *mdev);
|
||||
int qat_vfmig_load_setup(struct qat_mig_dev *mdev, int size);
|
||||
void qat_vfmig_destroy(struct qat_mig_dev *mdev);
|
||||
|
||||
#endif /*QAT_MIG_DEV_H_*/
|
||||
Reference in New Issue
Block a user