Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/qat/qat_common/adf_cfg_bundle.c
Show First 20 Lines • Show All 151 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
adf_cfg_init_and_insert_inst(struct adf_cfg_bundle *bundle, | adf_cfg_init_and_insert_inst(struct adf_cfg_bundle *bundle, | ||||
struct adf_cfg_device *device, | struct adf_cfg_device *device, | ||||
int bank_num, | int bank_num, | ||||
struct adf_accel_dev *accel_dev) | struct adf_accel_dev *accel_dev) | ||||
{ | { | ||||
struct adf_cfg_instance *cfg_instance = NULL; | struct adf_cfg_instance *cfg_instance = NULL; | ||||
int ring_pair_index = 0; | int ring_pair_index = 0; | ||||
int ring_index = 0; | |||||
int i = 0; | int i = 0; | ||||
u8 serv_type; | u8 serv_type; | ||||
int num_req_rings = bundle->num_of_rings / 2; | int num_rings_per_srv = 0; | ||||
int num_rings_per_srv = num_req_rings / ADF_CFG_NUM_SERVICES; | struct adf_hw_device_data *hw_data = accel_dev->hw_device; | ||||
u16 ring_to_svc_map = GET_HW_DATA(accel_dev)->ring_to_svc_map; | u16 ring_to_svc_map = GET_HW_DATA(accel_dev)->ring_to_svc_map; | ||||
/* init the bundle with instance information */ | /* init the bundle with instance information */ | ||||
for (ring_pair_index = 0; ring_pair_index < ADF_CFG_NUM_SERVICES; | for (ring_pair_index = 0; ring_pair_index < bundle->max_cfg_svc_num; | ||||
ring_pair_index++) { | ring_pair_index++) { | ||||
serv_type = GET_SRV_TYPE(ring_to_svc_map, ring_pair_index); | adf_get_ring_svc_map_data(hw_data, | ||||
bundle->number, | |||||
ring_pair_index, | |||||
&serv_type, | |||||
&ring_index, | |||||
&num_rings_per_srv); | |||||
for (i = 0; i < num_rings_per_srv; i++) { | for (i = 0; i < num_rings_per_srv; i++) { | ||||
cfg_instance = malloc(sizeof(*cfg_instance), | cfg_instance = malloc(sizeof(*cfg_instance), | ||||
M_QAT, | M_QAT, | ||||
M_WAITOK | M_ZERO); | M_WAITOK | M_ZERO); | ||||
switch (serv_type) { | switch (serv_type) { | ||||
case CRYPTO: | case CRYPTO: | ||||
crypto_instance_init(cfg_instance, bundle); | crypto_instance_init(cfg_instance, bundle); | ||||
Show All 36 Lines | |||||
int | int | ||||
adf_cfg_bundle_init(struct adf_cfg_bundle *bundle, | adf_cfg_bundle_init(struct adf_cfg_bundle *bundle, | ||||
struct adf_cfg_device *device, | struct adf_cfg_device *device, | ||||
int bank_num, | int bank_num, | ||||
struct adf_accel_dev *accel_dev) | struct adf_accel_dev *accel_dev) | ||||
{ | { | ||||
int i = 0; | int i = 0; | ||||
bundle->number = bank_num; | |||||
/* init ring to service mapping for this bundle */ | /* init ring to service mapping for this bundle */ | ||||
adf_cfg_init_ring2serv_mapping(accel_dev, bundle); | adf_cfg_init_ring2serv_mapping(accel_dev, bundle, device); | ||||
/* init the bundle with instance information */ | /* init the bundle with instance information */ | ||||
adf_cfg_init_and_insert_inst(bundle, device, bank_num, accel_dev); | adf_cfg_init_and_insert_inst(bundle, device, bank_num, accel_dev); | ||||
CPU_FILL(&bundle->affinity_mask); | CPU_FILL(&bundle->affinity_mask); | ||||
bundle->type = FREE; | bundle->type = FREE; | ||||
bundle->polling_mode = -1; | bundle->polling_mode = -1; | ||||
bundle->section_index = 0; | bundle->section_index = 0; | ||||
bundle->number = bank_num; | |||||
bundle->sections = malloc(sizeof(char *) * bundle->max_section, | bundle->sections = malloc(sizeof(char *) * bundle->max_section, | ||||
M_QAT, | M_QAT, | ||||
M_WAITOK | M_ZERO); | M_WAITOK | M_ZERO); | ||||
for (i = 0; i < bundle->max_section; i++) { | for (i = 0; i < bundle->max_section; i++) { | ||||
bundle->sections[i] = | bundle->sections[i] = | ||||
malloc(ADF_CFG_MAX_STR_LEN, M_QAT, M_WAITOK | M_ZERO); | malloc(ADF_CFG_MAX_STR_LEN, M_QAT, M_WAITOK | M_ZERO); | ||||
Show All 16 Lines | adf_cfg_bundle_clear(struct adf_cfg_bundle *bundle, | ||||
free(bundle->sections, M_QAT); | free(bundle->sections, M_QAT); | ||||
bundle->sections = NULL; | bundle->sections = NULL; | ||||
adf_cfg_rel_ring2serv_mapping(bundle); | adf_cfg_rel_ring2serv_mapping(bundle); | ||||
} | } | ||||
static void | static void | ||||
adf_cfg_assign_serv_to_rings(struct adf_cfg_bundle *bundle, u16 ring_to_svc_map) | adf_cfg_assign_serv_to_rings(struct adf_hw_device_data *hw_data, | ||||
struct adf_cfg_bundle *bundle, | |||||
struct adf_cfg_device *device) | |||||
{ | { | ||||
int ring_pair_index = 0; | int ring_pair_index = 0; | ||||
int ring_index = 0; | int ring_index = 0; | ||||
u8 serv_type = 0; | u8 serv_type = 0; | ||||
int num_req_rings = bundle->num_of_rings / 2; | int num_req_rings = bundle->num_of_rings / 2; | ||||
int num_rings_per_srv = num_req_rings / ADF_CFG_NUM_SERVICES; | int num_rings_per_srv = 0; | ||||
for (ring_pair_index = 0; ring_pair_index < ADF_CFG_NUM_SERVICES; | for (ring_pair_index = 0; ring_pair_index < bundle->max_cfg_svc_num; | ||||
ring_pair_index++) { | ring_pair_index++) { | ||||
serv_type = GET_SRV_TYPE(ring_to_svc_map, ring_pair_index); | adf_get_ring_svc_map_data(hw_data, | ||||
ring_index = num_rings_per_srv * ring_pair_index; | bundle->number, | ||||
ring_pair_index, | |||||
&serv_type, | |||||
&ring_index, | |||||
&num_rings_per_srv); | |||||
switch (serv_type) { | switch (serv_type) { | ||||
case CRYPTO: | case CRYPTO: | ||||
ASSIGN_SERV_TO_RINGS(bundle, | ASSIGN_SERV_TO_RINGS(bundle, | ||||
ring_index, | ring_index, | ||||
num_req_rings, | num_req_rings, | ||||
ADF_ACCEL_SERV_ASYM, | ADF_ACCEL_SERV_ASYM, | ||||
num_rings_per_srv); | num_rings_per_srv); | ||||
ring_pair_index++; | ring_pair_index++; | ||||
ring_index = num_rings_per_srv * ring_pair_index; | ring_index = num_rings_per_srv * ring_pair_index; | ||||
if (ring_pair_index == ADF_CFG_NUM_SERVICES) | if (ring_pair_index == bundle->max_cfg_svc_num) | ||||
break; | break; | ||||
ASSIGN_SERV_TO_RINGS(bundle, | ASSIGN_SERV_TO_RINGS(bundle, | ||||
ring_index, | ring_index, | ||||
num_req_rings, | num_req_rings, | ||||
ADF_ACCEL_SERV_SYM, | ADF_ACCEL_SERV_SYM, | ||||
num_rings_per_srv); | num_rings_per_srv); | ||||
break; | break; | ||||
case COMP: | case COMP: | ||||
Show All 24 Lines | case NA: | ||||
ADF_ACCEL_SERV_NA, | ADF_ACCEL_SERV_NA, | ||||
num_rings_per_srv); | num_rings_per_srv); | ||||
break; | break; | ||||
default: | default: | ||||
/* unknown service type */ | /* unknown service type */ | ||||
pr_err("Unknown service type %d, mask 0x%x.\n", | pr_err("Unknown service type %d, mask 0x%x.\n", | ||||
serv_type, | serv_type, | ||||
ring_to_svc_map); | hw_data->ring_to_svc_map); | ||||
} | } | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
void | void | ||||
adf_cfg_init_ring2serv_mapping(struct adf_accel_dev *accel_dev, | adf_cfg_init_ring2serv_mapping(struct adf_accel_dev *accel_dev, | ||||
struct adf_cfg_bundle *bundle) | struct adf_cfg_bundle *bundle, | ||||
struct adf_cfg_device *device) | |||||
{ | { | ||||
struct adf_hw_device_data *hw_data = accel_dev->hw_device; | struct adf_hw_device_data *hw_data = accel_dev->hw_device; | ||||
struct adf_cfg_ring *ring_in_bundle; | struct adf_cfg_ring *ring_in_bundle; | ||||
int ring_num = 0; | int ring_num = 0; | ||||
bundle->num_of_rings = hw_data->num_rings_per_bank; | bundle->num_of_rings = hw_data->num_rings_per_bank; | ||||
if (hw_data->num_rings_per_bank >= (2 * ADF_CFG_NUM_SERVICES)) | |||||
bundle->max_cfg_svc_num = ADF_CFG_NUM_SERVICES; | |||||
else | |||||
bundle->max_cfg_svc_num = 1; | |||||
bundle->rings = | bundle->rings = | ||||
malloc(bundle->num_of_rings * sizeof(struct adf_cfg_ring *), | malloc(bundle->num_of_rings * sizeof(struct adf_cfg_ring *), | ||||
M_QAT, | M_QAT, | ||||
M_WAITOK | M_ZERO); | M_WAITOK | M_ZERO); | ||||
for (ring_num = 0; ring_num < bundle->num_of_rings; ring_num++) { | for (ring_num = 0; ring_num < bundle->num_of_rings; ring_num++) { | ||||
ring_in_bundle = malloc(sizeof(struct adf_cfg_ring), | ring_in_bundle = malloc(sizeof(struct adf_cfg_ring), | ||||
M_QAT, | M_QAT, | ||||
M_WAITOK | M_ZERO); | M_WAITOK | M_ZERO); | ||||
ring_in_bundle->mode = | ring_in_bundle->mode = | ||||
(ring_num < bundle->num_of_rings / 2) ? TX : RX; | (ring_num < bundle->num_of_rings / 2) ? TX : RX; | ||||
ring_in_bundle->number = ring_num; | ring_in_bundle->number = ring_num; | ||||
bundle->rings[ring_num] = ring_in_bundle; | bundle->rings[ring_num] = ring_in_bundle; | ||||
} | } | ||||
adf_cfg_assign_serv_to_rings(bundle, hw_data->ring_to_svc_map); | adf_cfg_assign_serv_to_rings(hw_data, bundle, device); | ||||
return; | return; | ||||
} | } | ||||
int | int | ||||
adf_cfg_rel_ring2serv_mapping(struct adf_cfg_bundle *bundle) | adf_cfg_rel_ring2serv_mapping(struct adf_cfg_bundle *bundle) | ||||
{ | { | ||||
int i = 0; | int i = 0; | ||||
Show All 10 Lines |