int tegra_dc_set_dynamic_emc(struct tegra_dc_win *windows[], int n) { unsigned long new_rate; struct tegra_dc *dc; #ifdef CONFIG_MACH_DA2 const unsigned long threshold = 204000000; #endif if (!use_dynamic_emc) return 0; dc = windows[0]->dc; /* calculate the new rate based on this POST */ new_rate = tegra_dc_get_bandwidth(windows, n); if (WARN_ONCE(new_rate > (ULONG_MAX / 1000), "bandwidth maxed out\n")) new_rate = ULONG_MAX; else new_rate = EMC_BW_TO_FREQ(new_rate * 1000); #ifdef CONFIG_MACH_DA2 if (new_rate < threshold) { new_rate = threshold; } #endif if (tegra_dc_has_multiple_dc()) new_rate = ULONG_MAX; trace_printk("%s:new_emc_clk_rate=%ld\n", dc->ndev->name, new_rate); dc->new_emc_clk_rate = new_rate; return 0; }
int tegra_dc_set_dynamic_emc(struct tegra_dc_win *windows[], int n) { unsigned long new_rate; struct tegra_dc *dc; if (!use_dynamic_emc) return 0; dc = windows[0]->dc; /* calculate the new rate based on this POST */ new_rate = tegra_dc_get_bandwidth(windows, n); if (WARN_ONCE(new_rate > (ULONG_MAX / 1000), "bandwidth maxed out\n")) new_rate = ULONG_MAX; else new_rate = EMC_BW_TO_FREQ(new_rate * 1000); if (tegra_dc_has_multiple_dc()) new_rate = ULONG_MAX; dc->new_emc_clk_rate = new_rate; trace_set_dynamic_emc(dc); return 0; }
static void tegra_overlay_set_emc_freq(struct tegra_overlay_info *dev) { unsigned long new_rate; int i; struct tegra_dc_win *win; struct tegra_dc_win *wins[DC_N_WINDOWS]; for (i = 0; i < DC_N_WINDOWS; i++) { win = tegra_dc_get_window(dev->dc, i); wins[i] = win; } new_rate = tegra_dc_get_bandwidth(wins, dev->dc->n_windows); new_rate = EMC_BW_TO_FREQ(new_rate); if (tegra_dc_has_multiple_dc()) new_rate = ULONG_MAX; clk_set_rate(dev->dc->emc_clk, new_rate); }
int tegra_dc_set_dynamic_emc(struct tegra_dc_win *windows[], int n) { unsigned long new_rate; struct tegra_dc *dc; if (!use_dynamic_emc) return 0; dc = windows[0]->dc; if (tegra_dc_has_multiple_dc()) new_rate = ULONG_MAX; else new_rate = tegra_dc_kbps_to_emc( tegra_dc_get_bandwidth(windows, n)); dc->new_emc_clk_rate = new_rate; trace_set_dynamic_emc(dc); return 0; }
int esc_mods_tegra_dc_config_possible(struct file *fp, struct MODS_TEGRA_DC_CONFIG_POSSIBLE *args) { int i; struct tegra_dc *dc = tegra_dc_get_dc(args->head); struct tegra_dc_win *dc_wins[DC_N_WINDOWS]; #ifndef CONFIG_TEGRA_ISOMGR struct clk *emc_clk = 0; unsigned long max_bandwidth = 0; unsigned long current_emc_freq = 0; unsigned long max_available_bandwidth = 0; #else int ret = -EINVAL; #endif LOG_ENT(); BUG_ON(args->win_num > DC_N_WINDOWS); if (!dc) { LOG_EXT(); return -EINVAL; } for (i = 0; i < args->win_num; i++) { int idx = args->windows[i].index; if (args->windows[i].flags & MODS_TEGRA_DC_WINDOW_FLAG_ENABLED) { mods_tegra_dc_set_windowattr_basic(&dc->tmp_wins[idx], &args->windows[i]); } else { dc->tmp_wins[idx].flags = 0; } dc_wins[i] = &dc->tmp_wins[idx]; mods_debug_printk(DEBUG_TEGRADC, "esc_mods_tegra_dc_config_possible head %u, " "using index %d for window %d\n", args->head, i, idx); } mods_debug_printk(DEBUG_TEGRADC, "esc_mods_tegra_dc_config_possible head %u, " "dc->mode.pclk %u\n", args->head, dc->mode.pclk); #ifndef CONFIG_TEGRA_ISOMGR max_bandwidth = tegra_dc_get_bandwidth(dc_wins, args->win_num); emc_clk = clk_get_sys("tegra_emc", "emc"); if (IS_ERR(emc_clk)) { mods_debug_printk(DEBUG_TEGRADC, "esc_mods_tegra_dc_config_possible " "invalid clock specified when fetching EMC clock\n"); } else { current_emc_freq = clk_get_rate(emc_clk); current_emc_freq /= 1000; max_available_bandwidth = 8 * tegra_emc_freq_req_to_bw(current_emc_freq); max_available_bandwidth = (max_available_bandwidth / 100) * 50; } mods_debug_printk(DEBUG_TEGRADC, "esc_mods_tegra_dc_config_possible bandwidth needed = %lu," " bandwidth available = %lu\n", max_bandwidth, max_available_bandwidth); args->possible = (max_bandwidth <= max_available_bandwidth); #else ret = tegra_dc_bandwidth_negotiate_bw(dc, dc_wins, args->win_num); args->possible = (ret == 0); #endif for (i = 0; i < args->win_num; i++) { args->windows[i].bandwidth = dc_wins[i]->new_bandwidth; mods_debug_printk(DEBUG_TEGRADC, "esc_mods_tegra_dc_config_possible head %u, " "window %d bandwidth %d\n", args->head, dc_wins[i]->idx, dc_wins[i]->new_bandwidth); } LOG_EXT(); return 0; }