1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun * Marvell OcteonTX CPT driver 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2019 Marvell International Ltd. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 7*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as 8*4882a593Smuzhiyun * published by the Free Software Foundation. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef __OTX_CPTPF_UCODE_H 12*4882a593Smuzhiyun #define __OTX_CPTPF_UCODE_H 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/pci.h> 15*4882a593Smuzhiyun #include <linux/types.h> 16*4882a593Smuzhiyun #include <linux/module.h> 17*4882a593Smuzhiyun #include "otx_cpt_hw_types.h" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* CPT ucode name maximum length */ 20*4882a593Smuzhiyun #define OTX_CPT_UCODE_NAME_LENGTH 64 21*4882a593Smuzhiyun /* 22*4882a593Smuzhiyun * On OcteonTX 83xx platform, only one type of engines is allowed to be 23*4882a593Smuzhiyun * attached to an engine group. 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun #define OTX_CPT_MAX_ETYPES_PER_GRP 1 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* Default tar archive file names */ 28*4882a593Smuzhiyun #define OTX_CPT_UCODE_TAR_FILE_NAME "cpt8x-mc.tar" 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* CPT ucode alignment */ 31*4882a593Smuzhiyun #define OTX_CPT_UCODE_ALIGNMENT 128 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* CPT ucode signature size */ 34*4882a593Smuzhiyun #define OTX_CPT_UCODE_SIGN_LEN 256 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Microcode version string length */ 37*4882a593Smuzhiyun #define OTX_CPT_UCODE_VER_STR_SZ 44 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Maximum number of supported engines/cores on OcteonTX 83XX platform */ 40*4882a593Smuzhiyun #define OTX_CPT_MAX_ENGINES 64 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define OTX_CPT_ENGS_BITMASK_LEN (OTX_CPT_MAX_ENGINES/(BITS_PER_BYTE * \ 43*4882a593Smuzhiyun sizeof(unsigned long))) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Microcode types */ 46*4882a593Smuzhiyun enum otx_cpt_ucode_type { 47*4882a593Smuzhiyun OTX_CPT_AE_UC_TYPE = 1, /* AE-MAIN */ 48*4882a593Smuzhiyun OTX_CPT_SE_UC_TYPE1 = 20, /* SE-MAIN - combination of 21 and 22 */ 49*4882a593Smuzhiyun OTX_CPT_SE_UC_TYPE2 = 21, /* Fast Path IPSec + AirCrypto */ 50*4882a593Smuzhiyun OTX_CPT_SE_UC_TYPE3 = 22, /* 51*4882a593Smuzhiyun * Hash + HMAC + FlexiCrypto + RNG + Full 52*4882a593Smuzhiyun * Feature IPSec + AirCrypto + Kasumi 53*4882a593Smuzhiyun */ 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun struct otx_cpt_bitmap { 57*4882a593Smuzhiyun unsigned long bits[OTX_CPT_ENGS_BITMASK_LEN]; 58*4882a593Smuzhiyun int size; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct otx_cpt_engines { 62*4882a593Smuzhiyun int type; 63*4882a593Smuzhiyun int count; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Microcode version number */ 67*4882a593Smuzhiyun struct otx_cpt_ucode_ver_num { 68*4882a593Smuzhiyun u8 nn; 69*4882a593Smuzhiyun u8 xx; 70*4882a593Smuzhiyun u8 yy; 71*4882a593Smuzhiyun u8 zz; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct otx_cpt_ucode_hdr { 75*4882a593Smuzhiyun struct otx_cpt_ucode_ver_num ver_num; 76*4882a593Smuzhiyun u8 ver_str[OTX_CPT_UCODE_VER_STR_SZ]; 77*4882a593Smuzhiyun __be32 code_length; 78*4882a593Smuzhiyun u32 padding[3]; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct otx_cpt_ucode { 82*4882a593Smuzhiyun u8 ver_str[OTX_CPT_UCODE_VER_STR_SZ];/* 83*4882a593Smuzhiyun * ucode version in readable format 84*4882a593Smuzhiyun */ 85*4882a593Smuzhiyun struct otx_cpt_ucode_ver_num ver_num;/* ucode version number */ 86*4882a593Smuzhiyun char filename[OTX_CPT_UCODE_NAME_LENGTH]; /* ucode filename */ 87*4882a593Smuzhiyun dma_addr_t dma; /* phys address of ucode image */ 88*4882a593Smuzhiyun dma_addr_t align_dma; /* aligned phys address of ucode image */ 89*4882a593Smuzhiyun void *va; /* virt address of ucode image */ 90*4882a593Smuzhiyun void *align_va; /* aligned virt address of ucode image */ 91*4882a593Smuzhiyun u32 size; /* ucode image size */ 92*4882a593Smuzhiyun int type; /* ucode image type SE or AE */ 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct tar_ucode_info_t { 96*4882a593Smuzhiyun struct list_head list; 97*4882a593Smuzhiyun struct otx_cpt_ucode ucode;/* microcode information */ 98*4882a593Smuzhiyun const u8 *ucode_ptr; /* pointer to microcode in tar archive */ 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* Maximum and current number of engines available for all engine groups */ 102*4882a593Smuzhiyun struct otx_cpt_engs_available { 103*4882a593Smuzhiyun int max_se_cnt; 104*4882a593Smuzhiyun int max_ae_cnt; 105*4882a593Smuzhiyun int se_cnt; 106*4882a593Smuzhiyun int ae_cnt; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* Engines reserved to an engine group */ 110*4882a593Smuzhiyun struct otx_cpt_engs_rsvd { 111*4882a593Smuzhiyun int type; /* engine type */ 112*4882a593Smuzhiyun int count; /* number of engines attached */ 113*4882a593Smuzhiyun int offset; /* constant offset of engine type in the bitmap */ 114*4882a593Smuzhiyun unsigned long *bmap; /* attached engines bitmap */ 115*4882a593Smuzhiyun struct otx_cpt_ucode *ucode; /* ucode used by these engines */ 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct otx_cpt_mirror_info { 119*4882a593Smuzhiyun int is_ena; /* 120*4882a593Smuzhiyun * is mirroring enabled, it is set only for engine 121*4882a593Smuzhiyun * group which mirrors another engine group 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun int idx; /* 124*4882a593Smuzhiyun * index of engine group which is mirrored by this 125*4882a593Smuzhiyun * group, set only for engine group which mirrors 126*4882a593Smuzhiyun * another group 127*4882a593Smuzhiyun */ 128*4882a593Smuzhiyun int ref_count; /* 129*4882a593Smuzhiyun * number of times this engine group is mirrored by 130*4882a593Smuzhiyun * other groups, this is set only for engine group 131*4882a593Smuzhiyun * which is mirrored by other group(s) 132*4882a593Smuzhiyun */ 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun struct otx_cpt_eng_grp_info { 136*4882a593Smuzhiyun struct otx_cpt_eng_grps *g; /* pointer to engine_groups structure */ 137*4882a593Smuzhiyun struct device_attribute info_attr; /* group info entry attr */ 138*4882a593Smuzhiyun /* engines attached */ 139*4882a593Smuzhiyun struct otx_cpt_engs_rsvd engs[OTX_CPT_MAX_ETYPES_PER_GRP]; 140*4882a593Smuzhiyun /* Microcode information */ 141*4882a593Smuzhiyun struct otx_cpt_ucode ucode[OTX_CPT_MAX_ETYPES_PER_GRP]; 142*4882a593Smuzhiyun /* sysfs info entry name */ 143*4882a593Smuzhiyun char sysfs_info_name[OTX_CPT_UCODE_NAME_LENGTH]; 144*4882a593Smuzhiyun /* engine group mirroring information */ 145*4882a593Smuzhiyun struct otx_cpt_mirror_info mirror; 146*4882a593Smuzhiyun int idx; /* engine group index */ 147*4882a593Smuzhiyun bool is_enabled; /* 148*4882a593Smuzhiyun * is engine group enabled, engine group is enabled 149*4882a593Smuzhiyun * when it has engines attached and ucode loaded 150*4882a593Smuzhiyun */ 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct otx_cpt_eng_grps { 154*4882a593Smuzhiyun struct otx_cpt_eng_grp_info grp[OTX_CPT_MAX_ENGINE_GROUPS]; 155*4882a593Smuzhiyun struct device_attribute ucode_load_attr;/* ucode load attr */ 156*4882a593Smuzhiyun struct otx_cpt_engs_available avail; 157*4882a593Smuzhiyun struct mutex lock; 158*4882a593Smuzhiyun void *obj; 159*4882a593Smuzhiyun int engs_num; /* total number of engines supported */ 160*4882a593Smuzhiyun int eng_types_supported; /* engine types supported SE, AE */ 161*4882a593Smuzhiyun u8 eng_ref_cnt[OTX_CPT_MAX_ENGINES];/* engines reference count */ 162*4882a593Smuzhiyun bool is_ucode_load_created; /* is ucode_load sysfs entry created */ 163*4882a593Smuzhiyun bool is_first_try; /* is this first try to create kcrypto engine grp */ 164*4882a593Smuzhiyun bool is_rdonly; /* do engine groups configuration can be modified */ 165*4882a593Smuzhiyun }; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun int otx_cpt_init_eng_grps(struct pci_dev *pdev, 168*4882a593Smuzhiyun struct otx_cpt_eng_grps *eng_grps, int pf_type); 169*4882a593Smuzhiyun void otx_cpt_cleanup_eng_grps(struct pci_dev *pdev, 170*4882a593Smuzhiyun struct otx_cpt_eng_grps *eng_grps); 171*4882a593Smuzhiyun int otx_cpt_try_create_default_eng_grps(struct pci_dev *pdev, 172*4882a593Smuzhiyun struct otx_cpt_eng_grps *eng_grps, 173*4882a593Smuzhiyun int pf_type); 174*4882a593Smuzhiyun void otx_cpt_set_eng_grps_is_rdonly(struct otx_cpt_eng_grps *eng_grps, 175*4882a593Smuzhiyun bool is_rdonly); 176*4882a593Smuzhiyun int otx_cpt_uc_supports_eng_type(struct otx_cpt_ucode *ucode, int eng_type); 177*4882a593Smuzhiyun int otx_cpt_eng_grp_has_eng_type(struct otx_cpt_eng_grp_info *eng_grp, 178*4882a593Smuzhiyun int eng_type); 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #endif /* __OTX_CPTPF_UCODE_H */ 181