Exemple #1
0
static uint32_t noc_sat_field(uint64_t bw, uint32_t ws, uint32_t qos_freq)
{
	uint32_t sat_field = 0, win;

	if (bw) {
		/* Limit to max bw and scale bw to 100 KB increments */
		uint64_t tbw, tscale;
		uint64_t bw_scaled = min_t(uint64_t, bw, MAX_BW(qos_freq));
		uint32_t rem = noc_div(&bw_scaled, 100000);

		/**
		 * Calculate saturation from windows size.
		 * WS must be at least one arb period.
		 * Saturation must not exceed max field size
		 *
		 * Bandwidth is in 100KB increments
		 * Window size is in ns
		 * qos_freq is in KHz
		 */
		win = max(ws, 1000000 / qos_freq);
		tbw = bw_scaled * win * qos_freq;
		tscale = 10000000ULL * BW_SCALE * SAT_SCALE;
		rem = noc_div(&tbw, tscale);
		sat_field = (uint32_t)min_t(uint64_t, tbw, MAX_SAT_FIELD);
	}

	MSM_BUS_DBG("NOC: sat_field: %d\n", sat_field);
	return sat_field;
}
/**
@brief Calculate the saturation field value required for the requested
       bandwidth and window size.

@param[in] uBandwidth - Bandwidth in bytes/sec
@param[in] uWindowSize - Window size in nanoseconds
@param[in] uQosFreq   - The frequency of the Qos clock

@returns The appropriate saturation field value, will ceiling at max allowed
         field size.
*/
static uint32_t noc_calc_sat_field
(
  uint64_t uBandwidth,
  uint32_t uWindowSize,
  uint32_t uQosFreq
)
{
  uint32_t uSatField = 0;

  /* Shortcut if necessary. */ 
  if( uBandwidth )
  {
	/* Limit to max bandwidth and scale the bandwidth down to 100KB increments.
    * We run the risk of blowing out of 64-bits without it. */ 
    uint64_t uBandwidthScaled = MIN(uBandwidth, MAX_BW(uQosFreq));
    uBandwidthScaled = CEILING_DIV(uBandwidthScaled, 100000);

    /* Calculate the saturation from the window size.
    ** Window size *can* be zero.
    ** Saturation must not exceed the maximum allowed field size.
    ** Note the additional scaling factor in the division, due to units:
    ** 10 for the bandwidth being in 100KB increments (instead of MB)
    ** 1000 for the window size being in ns (instead of us)
    ** 1000 for qos freq being in KHz (instead of MHz)
    ** Total: 10000000ULL
    */
    uSatField = (uint32_t)MIN(CEILING_DIV(uBandwidthScaled * uWindowSize * uQosFreq, 10000000ULL * BW_SCALE * SAT_SCALE), MAX_SAT_FIELD);
  }

  return uSatField;
}
Exemple #3
0
/* Calculate bandwidth field value for requested bandwidth  */
static uint32_t noc_bw_field(uint64_t bw, uint32_t qos_freq)
{
	uint32_t bw_field = 0;

	if (bw) {
		uint32_t rem;
		uint64_t bw_capped = min_t(uint64_t, bw, MAX_BW(qos_freq));
		uint64_t bwc = bw_capped * BW_SCALE;
		uint64_t qf = 2 * qos_freq * 1000;

		rem = noc_div(&bwc, qf);
		bw_field = (uint32_t)min_t(uint64_t, bwc, MAX_BW_FIELD);
	}

	MSM_BUS_DBG("NOC: bw_field: %u\n", bw_field);
	return bw_field;
}
/**
@brief Calculate the bandwidth field value required for the requested
       bandwidth.

@pre Expects uQosFreq to be non-zero.

@param[in] pBandwidth - The bandwidth structure
@param[in] uQosFreq   - The frequency of the Qos clock

@returns The appropriate bandwidth field value, will ceiling at max allowed
         field size.
*/
static uint32_t noc_calc_bw_field
(
  uint64_t uBandwidth,
  uint32_t uQosFreq
)
{
  uint32_t uBwField = 0;

  /* Shortcut if necessary. */ 
  if( uBandwidth )
  {
    /* Calculate field, and cap to maximum. */
    uint64_t uBandwidthCapped = MIN(uBandwidth, MAX_BW(uQosFreq));
    uBwField = (uint32_t)MIN(CEILING_DIV(BW_SCALE * uBandwidthCapped, 2 * uQosFreq * 1000), MAX_BW_FIELD);
  }

  return uBwField;
}
static uint32_t noc_sat_field(uint64_t bw, uint32_t ws, uint32_t qos_freq)
{
	uint32_t sat_field = 0, win;

	if (bw) {
		
		uint64_t tbw, tscale;
		uint64_t bw_scaled = min_t(uint64_t, bw, MAX_BW(qos_freq));
		uint32_t rem = noc_div(&bw_scaled, 100000);

		win = max(ws, 1000000 / qos_freq);
		tbw = bw_scaled * win * qos_freq;
		tscale = 10000000ULL * BW_SCALE * SAT_SCALE;
		rem = noc_div(&tbw, tscale);
		sat_field = (uint32_t)min_t(uint64_t, tbw, MAX_SAT_FIELD);
	}

	MSM_BUS_DBG("NOC: sat_field: %d\n", sat_field);
	return sat_field;
}