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; }
/* 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; }