linux/drivers/crypto/qat/qat_common/adf_gen2_hw_data.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
   2/* Copyright(c) 2020 Intel Corporation */
   3#include "adf_gen2_hw_data.h"
   4#include "icp_qat_hw.h"
   5#include <linux/pci.h>
   6
   7void adf_gen2_cfg_iov_thds(struct adf_accel_dev *accel_dev, bool enable,
   8                           int num_a_regs, int num_b_regs)
   9{
  10        struct adf_hw_device_data *hw_data = accel_dev->hw_device;
  11        void __iomem *pmisc_addr;
  12        struct adf_bar *pmisc;
  13        int pmisc_id, i;
  14        u32 reg;
  15
  16        pmisc_id = hw_data->get_misc_bar_id(hw_data);
  17        pmisc = &GET_BARS(accel_dev)[pmisc_id];
  18        pmisc_addr = pmisc->virt_addr;
  19
  20        /* Set/Unset Valid bit in AE Thread to PCIe Function Mapping Group A */
  21        for (i = 0; i < num_a_regs; i++) {
  22                reg = READ_CSR_AE2FUNCTION_MAP_A(pmisc_addr, i);
  23                if (enable)
  24                        reg |= AE2FUNCTION_MAP_VALID;
  25                else
  26                        reg &= ~AE2FUNCTION_MAP_VALID;
  27                WRITE_CSR_AE2FUNCTION_MAP_A(pmisc_addr, i, reg);
  28        }
  29
  30        /* Set/Unset Valid bit in AE Thread to PCIe Function Mapping Group B */
  31        for (i = 0; i < num_b_regs; i++) {
  32                reg = READ_CSR_AE2FUNCTION_MAP_B(pmisc_addr, i);
  33                if (enable)
  34                        reg |= AE2FUNCTION_MAP_VALID;
  35                else
  36                        reg &= ~AE2FUNCTION_MAP_VALID;
  37                WRITE_CSR_AE2FUNCTION_MAP_B(pmisc_addr, i, reg);
  38        }
  39}
  40EXPORT_SYMBOL_GPL(adf_gen2_cfg_iov_thds);
  41
  42void adf_gen2_get_admin_info(struct admin_info *admin_csrs_info)
  43{
  44        admin_csrs_info->mailbox_offset = ADF_MAILBOX_BASE_OFFSET;
  45        admin_csrs_info->admin_msg_ur = ADF_ADMINMSGUR_OFFSET;
  46        admin_csrs_info->admin_msg_lr = ADF_ADMINMSGLR_OFFSET;
  47}
  48EXPORT_SYMBOL_GPL(adf_gen2_get_admin_info);
  49
  50void adf_gen2_get_arb_info(struct arb_info *arb_info)
  51{
  52        arb_info->arb_cfg = ADF_ARB_CONFIG;
  53        arb_info->arb_offset = ADF_ARB_OFFSET;
  54        arb_info->wt2sam_offset = ADF_ARB_WRK_2_SER_MAP_OFFSET;
  55}
  56EXPORT_SYMBOL_GPL(adf_gen2_get_arb_info);
  57
  58static u64 build_csr_ring_base_addr(dma_addr_t addr, u32 size)
  59{
  60        return BUILD_RING_BASE_ADDR(addr, size);
  61}
  62
  63static u32 read_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring)
  64{
  65        return READ_CSR_RING_HEAD(csr_base_addr, bank, ring);
  66}
  67
  68static void write_csr_ring_head(void __iomem *csr_base_addr, u32 bank, u32 ring,
  69                                u32 value)
  70{
  71        WRITE_CSR_RING_HEAD(csr_base_addr, bank, ring, value);
  72}
  73
  74static u32 read_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring)
  75{
  76        return READ_CSR_RING_TAIL(csr_base_addr, bank, ring);
  77}
  78
  79static void write_csr_ring_tail(void __iomem *csr_base_addr, u32 bank, u32 ring,
  80                                u32 value)
  81{
  82        WRITE_CSR_RING_TAIL(csr_base_addr, bank, ring, value);
  83}
  84
  85static u32 read_csr_e_stat(void __iomem *csr_base_addr, u32 bank)
  86{
  87        return READ_CSR_E_STAT(csr_base_addr, bank);
  88}
  89
  90static void write_csr_ring_config(void __iomem *csr_base_addr, u32 bank,
  91                                  u32 ring, u32 value)
  92{
  93        WRITE_CSR_RING_CONFIG(csr_base_addr, bank, ring, value);
  94}
  95
  96static void write_csr_ring_base(void __iomem *csr_base_addr, u32 bank, u32 ring,
  97                                dma_addr_t addr)
  98{
  99        WRITE_CSR_RING_BASE(csr_base_addr, bank, ring, addr);
 100}
 101
 102static void write_csr_int_flag(void __iomem *csr_base_addr, u32 bank, u32 value)
 103{
 104        WRITE_CSR_INT_FLAG(csr_base_addr, bank, value);
 105}
 106
 107static void write_csr_int_srcsel(void __iomem *csr_base_addr, u32 bank)
 108{
 109        WRITE_CSR_INT_SRCSEL(csr_base_addr, bank);
 110}
 111
 112static void write_csr_int_col_en(void __iomem *csr_base_addr, u32 bank,
 113                                 u32 value)
 114{
 115        WRITE_CSR_INT_COL_EN(csr_base_addr, bank, value);
 116}
 117
 118static void write_csr_int_col_ctl(void __iomem *csr_base_addr, u32 bank,
 119                                  u32 value)
 120{
 121        WRITE_CSR_INT_COL_CTL(csr_base_addr, bank, value);
 122}
 123
 124static void write_csr_int_flag_and_col(void __iomem *csr_base_addr, u32 bank,
 125                                       u32 value)
 126{
 127        WRITE_CSR_INT_FLAG_AND_COL(csr_base_addr, bank, value);
 128}
 129
 130static void write_csr_ring_srv_arb_en(void __iomem *csr_base_addr, u32 bank,
 131                                      u32 value)
 132{
 133        WRITE_CSR_RING_SRV_ARB_EN(csr_base_addr, bank, value);
 134}
 135
 136void adf_gen2_init_hw_csr_ops(struct adf_hw_csr_ops *csr_ops)
 137{
 138        csr_ops->build_csr_ring_base_addr = build_csr_ring_base_addr;
 139        csr_ops->read_csr_ring_head = read_csr_ring_head;
 140        csr_ops->write_csr_ring_head = write_csr_ring_head;
 141        csr_ops->read_csr_ring_tail = read_csr_ring_tail;
 142        csr_ops->write_csr_ring_tail = write_csr_ring_tail;
 143        csr_ops->read_csr_e_stat = read_csr_e_stat;
 144        csr_ops->write_csr_ring_config = write_csr_ring_config;
 145        csr_ops->write_csr_ring_base = write_csr_ring_base;
 146        csr_ops->write_csr_int_flag = write_csr_int_flag;
 147        csr_ops->write_csr_int_srcsel = write_csr_int_srcsel;
 148        csr_ops->write_csr_int_col_en = write_csr_int_col_en;
 149        csr_ops->write_csr_int_col_ctl = write_csr_int_col_ctl;
 150        csr_ops->write_csr_int_flag_and_col = write_csr_int_flag_and_col;
 151        csr_ops->write_csr_ring_srv_arb_en = write_csr_ring_srv_arb_en;
 152}
 153EXPORT_SYMBOL_GPL(adf_gen2_init_hw_csr_ops);
 154
 155u32 adf_gen2_get_accel_cap(struct adf_accel_dev *accel_dev)
 156{
 157        struct adf_hw_device_data *hw_data = accel_dev->hw_device;
 158        struct pci_dev *pdev = accel_dev->accel_pci_dev.pci_dev;
 159        u32 straps = hw_data->straps;
 160        u32 fuses = hw_data->fuses;
 161        u32 legfuses;
 162        u32 capabilities = ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC |
 163                           ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC |
 164                           ICP_ACCEL_CAPABILITIES_AUTHENTICATION;
 165
 166        /* Read accelerator capabilities mask */
 167        pci_read_config_dword(pdev, ADF_DEVICE_LEGFUSE_OFFSET, &legfuses);
 168
 169        if (legfuses & ICP_ACCEL_MASK_CIPHER_SLICE)
 170                capabilities &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC;
 171        if (legfuses & ICP_ACCEL_MASK_PKE_SLICE)
 172                capabilities &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
 173        if (legfuses & ICP_ACCEL_MASK_AUTH_SLICE)
 174                capabilities &= ~ICP_ACCEL_CAPABILITIES_AUTHENTICATION;
 175
 176        if ((straps | fuses) & ADF_POWERGATE_PKE)
 177                capabilities &= ~ICP_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC;
 178
 179        return capabilities;
 180}
 181EXPORT_SYMBOL_GPL(adf_gen2_get_accel_cap);
 182
 183void adf_gen2_set_ssm_wdtimer(struct adf_accel_dev *accel_dev)
 184{
 185        struct adf_hw_device_data *hw_data = accel_dev->hw_device;
 186        u32 timer_val_pke = ADF_SSM_WDT_PKE_DEFAULT_VALUE;
 187        u32 timer_val = ADF_SSM_WDT_DEFAULT_VALUE;
 188        unsigned long accel_mask = hw_data->accel_mask;
 189        void __iomem *pmisc_addr;
 190        struct adf_bar *pmisc;
 191        int pmisc_id;
 192        u32 i = 0;
 193
 194        pmisc_id = hw_data->get_misc_bar_id(hw_data);
 195        pmisc = &GET_BARS(accel_dev)[pmisc_id];
 196        pmisc_addr = pmisc->virt_addr;
 197
 198        /* Configures WDT timers */
 199        for_each_set_bit(i, &accel_mask, hw_data->num_accel) {
 200                /* Enable WDT for sym and dc */
 201                ADF_CSR_WR(pmisc_addr, ADF_SSMWDT(i), timer_val);
 202                /* Enable WDT for pke */
 203                ADF_CSR_WR(pmisc_addr, ADF_SSMWDTPKE(i), timer_val_pke);
 204        }
 205}
 206EXPORT_SYMBOL_GPL(adf_gen2_set_ssm_wdtimer);
 207