void adf_exit_arb(struct adf_accel_dev *accel_dev)
{
	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
	void __iomem *csr;
	unsigned int i;

	if (!accel_dev->transport)
		return;

	csr = accel_dev->transport->banks[0].csr_addr;

	/* Reset arbiter configuration */
	for (i = 0; i < ADF_ARB_NUM; i++)
		WRITE_CSR_ARB_SARCONFIG(csr, i, 0);

	/* Shutdown work queue */
	for (i = 0; i < hw_data->num_engines; i++)
		WRITE_CSR_ARB_WQCFG(csr, i, 0);

	/* Unmap worker threads to service arbiters */
	for (i = 0; i < hw_data->num_engines; i++)
		WRITE_CSR_ARB_WRK_2_SER_MAP(csr, i, 0);

	/* Disable arbitration on all rings */
	for (i = 0; i < GET_MAX_BANKS(accel_dev); i++)
		WRITE_CSR_ARB_RINGSRVARBEN(csr, i, 0);
}
示例#2
0
/*
 * adf_cfgAddInternalValues
 * Add internal config values to general section of the given accel dev
 */
CpaStatus
adf_cfgAddInternalValues(icp_accel_dev_t *accel_dev)
{
    CpaStatus status = CPA_STATUS_FAIL;
    adf_cfg_device_data_t *cfg = NULL;
    adf_cfg_section_t *section_general = NULL;
    Cpa32U *qatMask = NULL;
    Cpa32U i = 0;
    Cpa64U val = 0;
    char keyStr[ADF_CFG_MAX_KEY_LEN_IN_BYTES] = {0};
    char valStr[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
    Cpa32S enabled = 0;
    Cpa32U rev_id = accel_dev->pciAccelDev.revisionId;
    char maj_step = 'A';
    int  min_step  = 0;
    adf_hw_device_data_t *hw_data = NULL;
    Cpa32U maxNumAccelerators = 0;

    ICP_CHECK_FOR_NULL_PARAM(accel_dev);
    ICP_CHECK_FOR_NULL_PARAM(accel_dev->pHwDeviceData);

    status = adf_cfgDeviceFind(accel_dev->accelId, &cfg);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to find cfg device\n");
        return status;
    }

    status = icp_adf_cfgGetParamValue(accel_dev,
                                      GENERAL_SEC,
                                      ADF_PROC_DEBUG,
                                      (char*)valStr);
    if (CPA_STATUS_SUCCESS == status)
    {
        enabled = ICP_STRTOUL((char*)valStr, NULL, ADF_CFG_BASE_DEC);
    }
    if (enabled)
    {
        status = adf_debug_create_cfg(accel_dev, cfg);
        if (CPA_STATUS_SUCCESS != status)
        {
            ADF_ERROR("Failed to create cfg debug file\n");
            return status;
        }
    }
    if (BIT_IS_SET(accel_dev->adfSubsystemStatus,
                              ADF_STATUS_SYSTEM_RESTARTING))
    {
        /*
         * If we are in reset triggered from error handling
         * all the values are already there.
         */
        return CPA_STATUS_SUCCESS;
    }

    section_general = adf_cfgSectionFind(cfg->config_section,
                                         GENERAL_SEC);
    if (NULL == section_general)
    {
        ADF_ERROR("Could not find section %s\n", GENERAL_SEC);
        return CPA_STATUS_FAIL;
    }

    /* Add device node id */
    val = accel_dev->pkg_id;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_NODE_ID, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add device device node id\n");
        return status;
    }

    /* Add device pkg id */
    val = accel_dev->accelId;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_PKG_ID, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add device pkg id\n");
        return status;
    }

    /* Add device bus address */
    val = icp_adf_get_busAddress((Cpa16U)(accel_dev->accelId));
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_BUS_ADDRESS, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add device bus address\n");
        return status;
    }

    hw_data = accel_dev->pHwDeviceData;

    /* Add number of Acceleration Engines */
    val = hw_data->getNumAccelEngines(hw_data, accel_dev->aeMask);
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_NUM_AE, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add number of Acceleration Engines\n");
        return status;
    }

    /* Add number of Accelerators */
    val = hw_data->getNumAccelerators(hw_data, accel_dev->accelMask);
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_NUM_ACCEL, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add number of Accelerators\n");
        return status;
    }

    val = hw_data->maxNumAccelEngines;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_MAX_AE, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add maximum of Acceleration Engines\n");
        return status;
    }

    maxNumAccelerators = GET_MAX_ACCEL(accel_dev);
    val = maxNumAccelerators;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_MAX_ACCEL, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add maximum of Acceleration Engines\n");
        return status;
    }

    val = GET_MAX_BANKS(accel_dev);
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_MAX_BANKS, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add maximum Number of Banks\n");
        return status;
    }

    val = GET_NUM_RINGS_PER_BANK(accel_dev);
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_MAX_RINGS_PER_BANK, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add maximum Rings Per Bank\n");
        return status;
    }

    val = hw_data->userEtringCsrSize;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
            ADF_DEV_USER_RING_CSR_SIZE, (void*)&val,
            ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add User Space Ring Csr Size\n");
        return status;
    }

    val = accel_dev->accelCapabilitiesMask;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_CAPABILITIES_MASK, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add capabilities mask\n");
        return status;
    }

    val = accel_dev->accelMask;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_ACCEL_MASK, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add accel mask\n");
        return status;
    }

    val = accel_dev->aeMask;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                  ADF_DEV_AE_MASK, (void*)&val,
                                  ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add AE mask\n");
        return status;
    }

    val = accel_dev->sku;
    status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                     ADF_DEV_SKU, (void*)&val,
                                     ADF_DEC);
    if (CPA_STATUS_SUCCESS != status)
    {
        ADF_ERROR("Failed to add AE mask\n");
        return status;
    }

    /*
     * Calculate the accelengines associated with each
     * accelerator and add each mask to the config table
     */
    qatMask = ICP_MALLOC_GEN_NUMA(sizeof (*qatMask) * maxNumAccelerators,
            accel_dev->pkg_id);
    if (NULL == qatMask)
    {
        ADF_ERROR("Failed to allocate memory\n");
        return CPA_STATUS_FAIL;
    }

    hw_data->getAccelMaskList(hw_data,
                accel_dev->accelMask, accel_dev->aeMask, qatMask);

    for(i=0; i < maxNumAccelerators; i++)
    {
        ICP_MEMSET(keyStr, 0, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
        ICP_MEMSET(valStr, 0, ADF_CFG_MAX_VAL_LEN_IN_BYTES);
        snprintf(keyStr, ADF_CFG_MAX_KEY_LEN_IN_BYTES,
                ADF_DEV_ACCELAE_MASK_FMT, i);

        snprintf(valStr, ADF_CFG_MAX_VAL_LEN_IN_BYTES,
                "0x%X", qatMask[i]);

        status = adf_cfgAddKeyValueParam(accel_dev, section_general,
                                         keyStr, (void *)valStr, ADF_STR);
        if (CPA_STATUS_SUCCESS != status)
        {
            ADF_ERROR("Failed to add Accel/AE Mask %d\n", i);
            ICP_FREE_NUMA(qatMask);
            return status;
        }
    }
    ICP_FREE_NUMA(qatMask);
    ICP_MEMSET(keyStr, 0, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
    if(DEV_C2XXX == hw_data->dev_class->type)
    {
        maj_step += ((rev_id & C2XXX_MAJOR_STEPPING_MASK)
            >> C2XXX_MAJOR_STEPPING_SHIFT);
        min_step  += (rev_id & C2XXX_MINOR_STEPPING_MASK);
    }
示例#3
0
static int adf_dev_configure(struct adf_accel_dev *accel_dev)
{
	int cpus = num_online_cpus();
	int banks = GET_MAX_BANKS(accel_dev);
	int instances = min(cpus, banks);
	char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
	int i;
	unsigned long val;

	if (adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC))
		goto err;
	if (adf_cfg_section_add(accel_dev, "Accelerator0"))
		goto err;
	for (i = 0; i < instances; i++) {
		val = i;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_BANK_NUM, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
			 i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
		val = 128;
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 512;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 0;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 2;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 4;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_RND_TX, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 8;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 10;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = 12;
		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_RND_RX, i);
		if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
						key, (void *)&val, ADF_DEC))
			goto err;

		val = ADF_COALESCING_DEF_TIME;
		snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
		if (adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
						key, (void *)&val, ADF_DEC))
			goto err;
	}

	val = i;
	if (adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
					ADF_NUM_CY, (void *)&val, ADF_DEC))
		goto err;

	set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
	return 0;
err:
	dev_err(&GET_DEV(accel_dev), "Failed to start QAT accel dev\n");
	return -EINVAL;
}