/** * t4vf_get_dev_params - retrieve device paremeters * @adapter: the adapter * * Retrives various device parameters. The parameters are stored in * @adapter->params.dev. */ int t4vf_get_dev_params(struct adapter *adapter) { struct dev_params *dev_params = &adapter->params.dev; u32 params[7], vals[7]; int v; params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_FWREV)); params[1] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_TPREV)); v = t4vf_query_params(adapter, 2, params, vals); if (v) return v; dev_params->fwrev = vals[0]; dev_params->tprev = vals[1]; return 0; }
/** * t4vf_get_vpd_params - retrieve device VPD paremeters * @adapter: the adapter * * Retrives various device Vital Product Data parameters. The parameters * are stored in @adapter->params.vpd. */ int t4vf_get_vpd_params(struct adapter *adapter) { struct vpd_params *vpd_params = &adapter->params.vpd; u32 params[7], vals[7]; int v; params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_DEV) | FW_PARAMS_PARAM_X(FW_PARAMS_PARAM_DEV_CCLK)); v = t4vf_query_params(adapter, 1, params, vals); if (v) return v; vpd_params->cclk = vals[0]; return 0; }
/** * t4vf_get_sge_params - retrieve adapter Scatter gather Engine parameters * @adapter: the adapter * * Retrieves various core SGE parameters in the form of hardware SGE * register values. The caller is responsible for decoding these as * needed. The SGE parameters are stored in @adapter->params.sge. */ int t4vf_get_sge_params(struct adapter *adapter) { struct sge_params *sge_params = &adapter->params.sge; u32 params[7], vals[7]; int v; params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_CONTROL)); params[1] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_HOST_PAGE_SIZE)); params[2] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_FL_BUFFER_SIZE0)); params[3] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_FL_BUFFER_SIZE1)); params[4] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_TIMER_VALUE_0_AND_1)); params[5] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_TIMER_VALUE_2_AND_3)); params[6] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_TIMER_VALUE_4_AND_5)); v = t4vf_query_params(adapter, 7, params, vals); if (v) return v; sge_params->sge_control = vals[0]; sge_params->sge_host_page_size = vals[1]; sge_params->sge_fl_buffer_size[0] = vals[2]; sge_params->sge_fl_buffer_size[1] = vals[3]; sge_params->sge_timer_value_0_and_1 = vals[4]; sge_params->sge_timer_value_2_and_3 = vals[5]; sge_params->sge_timer_value_4_and_5 = vals[6]; params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_INGRESS_RX_THRESHOLD)); v = t4vf_query_params(adapter, 1, params, vals); if (v) return v; sge_params->sge_ingress_rx_threshold = vals[0]; return 0; }
/** * t4vf_get_sge_params - retrieve adapter Scatter gather Engine parameters * @adapter: the adapter * * Retrieves various core SGE parameters in the form of hardware SGE * register values. The caller is responsible for decoding these as * needed. The SGE parameters are stored in @adapter->params.sge. */ int t4vf_get_sge_params(struct adapter *adapter) { struct sge_params *sge_params = &adapter->params.sge; u32 params[7], vals[7]; int v; params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_CONTROL)); params[1] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_HOST_PAGE_SIZE)); params[2] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_FL_BUFFER_SIZE0)); params[3] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_FL_BUFFER_SIZE1)); params[4] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_TIMER_VALUE_0_AND_1)); params[5] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_TIMER_VALUE_2_AND_3)); params[6] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_TIMER_VALUE_4_AND_5)); v = t4vf_query_params(adapter, 7, params, vals); if (v) return v; sge_params->sge_control = vals[0]; sge_params->sge_host_page_size = vals[1]; sge_params->sge_fl_buffer_size[0] = vals[2]; sge_params->sge_fl_buffer_size[1] = vals[3]; sge_params->sge_timer_value_0_and_1 = vals[4]; sge_params->sge_timer_value_2_and_3 = vals[5]; sge_params->sge_timer_value_4_and_5 = vals[6]; /* T4 uses a single control field to specify both the PCIe Padding and * Packing Boundary. T5 introduced the ability to specify these * separately with the Padding Boundary in SGE_CONTROL and and Packing * Boundary in SGE_CONTROL2. So for T5 and later we need to grab * SGE_CONTROL in order to determine how ingress packet data will be * laid out in Packed Buffer Mode. Unfortunately, older versions of * the firmware won't let us retrieve SGE_CONTROL2 so if we get a * failure grabbing it we throw an error since we can't figure out the * right value. */ if (!is_t4(adapter->params.chip)) { params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_CONTROL2_A)); v = t4vf_query_params(adapter, 1, params, vals); if (v != FW_SUCCESS) { dev_err(adapter->pdev_dev, "Unable to get SGE Control2; " "probably old firmware.\n"); return v; } sge_params->sge_control2 = vals[0]; } params[0] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_INGRESS_RX_THRESHOLD)); params[1] = (FW_PARAMS_MNEM(FW_PARAMS_MNEM_REG) | FW_PARAMS_PARAM_XYZ(SGE_CONM_CTRL)); v = t4vf_query_params(adapter, 2, params, vals); if (v) return v; sge_params->sge_ingress_rx_threshold = vals[0]; sge_params->sge_congestion_control = vals[1]; return 0; }