Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto updates from Herbert Xu: "Here is the crypto update for 4.3: API: - the AEAD interface transition is now complete. - add top-level skcipher interface. Drivers: - x86-64 acceleration for chacha20/poly1305. - add sunxi-ss Allwinner Security System crypto accelerator. - add RSA algorithm to qat driver. - add SRIOV support to qat driver. - add LS1021A support to caam. - add i.MX6 support to caam" * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (163 commits) crypto: algif_aead - fix for multiple operations on AF_ALG sockets crypto: qat - enable legacy VFs MPI: Fix mpi_read_buffer crypto: qat - silence a static checker warning crypto: vmx - Fixing opcode issue crypto: caam - Use the preferred style for memory allocations crypto: caam - Propagate the real error code in caam_probe crypto: caam - Fix the error handling in caam_probe crypto: caam - fix writing to JQCR_MS when using service interface crypto: hash - Add AHASH_REQUEST_ON_STACK crypto: testmgr - Use new skcipher interface crypto: skcipher - Add top-level skcipher interface crypto: cmac - allow usage in FIPS mode crypto: sahara - Use dmam_alloc_coherent crypto: caam - Add support for LS1021A crypto: qat - Don't move data inside output buffer crypto: vmx - Fixing GHASH Key issue on little endian crypto: vmx - Fixing AES-CTR counter bug crypto: null - Add missing Kconfig tristate for NULL2 crypto: nx - Add forward declaration for struct crypto_aead ...
This commit is contained in:
@@ -4048,3 +4048,88 @@ void pci_dev_specific_enable_acs(struct pci_dev *dev)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The PCI capabilities list for Intel DH895xCC VFs (device id 0x0443) with
|
||||
* QuickAssist Technology (QAT) is prematurely terminated in hardware. The
|
||||
* Next Capability pointer in the MSI Capability Structure should point to
|
||||
* the PCIe Capability Structure but is incorrectly hardwired as 0 terminating
|
||||
* the list.
|
||||
*/
|
||||
static void quirk_intel_qat_vf_cap(struct pci_dev *pdev)
|
||||
{
|
||||
int pos, i = 0;
|
||||
u8 next_cap;
|
||||
u16 reg16, *cap;
|
||||
struct pci_cap_saved_state *state;
|
||||
|
||||
/* Bail if the hardware bug is fixed */
|
||||
if (pdev->pcie_cap || pci_find_capability(pdev, PCI_CAP_ID_EXP))
|
||||
return;
|
||||
|
||||
/* Bail if MSI Capability Structure is not found for some reason */
|
||||
pos = pci_find_capability(pdev, PCI_CAP_ID_MSI);
|
||||
if (!pos)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Bail if Next Capability pointer in the MSI Capability Structure
|
||||
* is not the expected incorrect 0x00.
|
||||
*/
|
||||
pci_read_config_byte(pdev, pos + 1, &next_cap);
|
||||
if (next_cap)
|
||||
return;
|
||||
|
||||
/*
|
||||
* PCIe Capability Structure is expected to be at 0x50 and should
|
||||
* terminate the list (Next Capability pointer is 0x00). Verify
|
||||
* Capability Id and Next Capability pointer is as expected.
|
||||
* Open-code some of set_pcie_port_type() and pci_cfg_space_size_ext()
|
||||
* to correctly set kernel data structures which have already been
|
||||
* set incorrectly due to the hardware bug.
|
||||
*/
|
||||
pos = 0x50;
|
||||
pci_read_config_word(pdev, pos, ®16);
|
||||
if (reg16 == (0x0000 | PCI_CAP_ID_EXP)) {
|
||||
u32 status;
|
||||
#ifndef PCI_EXP_SAVE_REGS
|
||||
#define PCI_EXP_SAVE_REGS 7
|
||||
#endif
|
||||
int size = PCI_EXP_SAVE_REGS * sizeof(u16);
|
||||
|
||||
pdev->pcie_cap = pos;
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, ®16);
|
||||
pdev->pcie_flags_reg = reg16;
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_DEVCAP, ®16);
|
||||
pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
|
||||
|
||||
pdev->cfg_size = PCI_CFG_SPACE_EXP_SIZE;
|
||||
if (pci_read_config_dword(pdev, PCI_CFG_SPACE_SIZE, &status) !=
|
||||
PCIBIOS_SUCCESSFUL || (status == 0xffffffff))
|
||||
pdev->cfg_size = PCI_CFG_SPACE_SIZE;
|
||||
|
||||
if (pci_find_saved_cap(pdev, PCI_CAP_ID_EXP))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Save PCIE cap
|
||||
*/
|
||||
state = kzalloc(sizeof(*state) + size, GFP_KERNEL);
|
||||
if (!state)
|
||||
return;
|
||||
|
||||
state->cap.cap_nr = PCI_CAP_ID_EXP;
|
||||
state->cap.cap_extended = 0;
|
||||
state->cap.size = size;
|
||||
cap = (u16 *)&state->cap.data[0];
|
||||
pcie_capability_read_word(pdev, PCI_EXP_DEVCTL, &cap[i++]);
|
||||
pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &cap[i++]);
|
||||
pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &cap[i++]);
|
||||
pcie_capability_read_word(pdev, PCI_EXP_RTCTL, &cap[i++]);
|
||||
pcie_capability_read_word(pdev, PCI_EXP_DEVCTL2, &cap[i++]);
|
||||
pcie_capability_read_word(pdev, PCI_EXP_LNKCTL2, &cap[i++]);
|
||||
pcie_capability_read_word(pdev, PCI_EXP_SLTCTL2, &cap[i++]);
|
||||
hlist_add_head(&state->next, &pdev->saved_cap_space);
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x443, quirk_intel_qat_vf_cap);
|
||||
|
Reference in New Issue
Block a user