Lines Matching +full:tegra124 +full:- +full:emc
68 * transaction takes 4 EMC clocks for Tegra124; So the COUNT_WEIGHT is
89 * struct tegra_devfreq_device_config - configuration specific to an ACTMON
108 * to be taken into account. This is to avoid increasing the EMC
142 * struct tegra_devfreq_device - state specific to an ACTMON device
196 return readl(tegra->regs + offset); in actmon_readl()
201 writel(val, tegra->regs + offset); in actmon_writel()
206 return readl(dev->regs + offset); in device_readl()
212 writel(val, dev->regs + offset); in device_writel()
223 u32 avg = dev->avg_count; in tegra_devfreq_update_avg_wmark()
224 u32 avg_band_freq = tegra->max_freq * ACTMON_DEFAULT_AVG_BAND / KHZ; in tegra_devfreq_update_avg_wmark()
229 avg = max(dev->avg_count, band); in tegra_devfreq_update_avg_wmark()
230 device_writel(dev, avg - band, ACTMON_DEV_AVG_LOWER_WMARK); in tegra_devfreq_update_avg_wmark()
236 u32 val = tegra->cur_freq * ACTMON_SAMPLING_PERIOD; in tegra_devfreq_update_wmark()
238 device_writel(dev, do_percent(val, dev->config->boost_up_threshold), in tegra_devfreq_update_wmark()
241 device_writel(dev, do_percent(val, dev->config->boost_down_threshold), in tegra_devfreq_update_wmark()
258 spin_lock_irqsave(&dev->lock, flags); in actmon_isr_device()
260 dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT); in actmon_isr_device()
270 dev->boost_freq = do_percent(dev->boost_freq, in actmon_isr_device()
271 dev->config->boost_up_coeff); in actmon_isr_device()
272 dev->boost_freq += ACTMON_BOOST_FREQ_STEP; in actmon_isr_device()
276 if (dev->boost_freq >= tegra->max_freq) in actmon_isr_device()
277 dev->boost_freq = tegra->max_freq; in actmon_isr_device()
285 dev->boost_freq = do_percent(dev->boost_freq, in actmon_isr_device()
286 dev->config->boost_down_coeff); in actmon_isr_device()
290 if (dev->boost_freq < (ACTMON_BOOST_FREQ_STEP >> 1)) in actmon_isr_device()
291 dev->boost_freq = 0; in actmon_isr_device()
296 if (dev->config->avg_dependency_threshold) { in actmon_isr_device()
297 if (dev->avg_count >= dev->config->avg_dependency_threshold) in actmon_isr_device()
299 else if (dev->boost_freq == 0) in actmon_isr_device()
309 spin_unlock_irqrestore(&dev->lock, flags); in actmon_isr_device()
320 for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { in actmon_isr()
321 if (val & tegra->devices[i].config->irq_mask) { in actmon_isr()
322 actmon_isr_device(tegra, tegra->devices + i); in actmon_isr()
337 if (cpu_freq >= ratio->cpu_freq) { in actmon_cpu_to_emc_rate()
338 if (ratio->emc_freq >= tegra->max_freq) in actmon_cpu_to_emc_rate()
339 return tegra->max_freq; in actmon_cpu_to_emc_rate()
341 return ratio->emc_freq; in actmon_cpu_to_emc_rate()
356 if (dev->config->avg_dependency_threshold) { in actmon_update_target()
361 spin_lock_irqsave(&dev->lock, flags); in actmon_update_target()
363 dev->target_freq = dev->avg_count / ACTMON_SAMPLING_PERIOD; in actmon_update_target()
364 avg_sustain_coef = 100 * 100 / dev->config->boost_up_threshold; in actmon_update_target()
365 dev->target_freq = do_percent(dev->target_freq, avg_sustain_coef); in actmon_update_target()
366 dev->target_freq += dev->boost_freq; in actmon_update_target()
368 if (dev->avg_count >= dev->config->avg_dependency_threshold) in actmon_update_target()
369 dev->target_freq = max(dev->target_freq, static_cpu_emc_freq); in actmon_update_target()
371 spin_unlock_irqrestore(&dev->lock, flags); in actmon_update_target()
378 mutex_lock(&tegra->devfreq->lock); in actmon_thread_isr()
379 update_devfreq(tegra->devfreq); in actmon_thread_isr()
380 mutex_unlock(&tegra->devfreq->lock); in actmon_thread_isr()
399 tegra->cur_freq = data->new_rate / KHZ; in tegra_actmon_rate_notify_cb()
401 for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { in tegra_actmon_rate_notify_cb()
402 dev = &tegra->devices[i]; in tegra_actmon_rate_notify_cb()
404 spin_lock_irqsave(&dev->lock, flags); in tegra_actmon_rate_notify_cb()
406 spin_unlock_irqrestore(&dev->lock, flags); in tegra_actmon_rate_notify_cb()
420 for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { in tegra_actmon_enable_interrupts()
421 dev = &tegra->devices[i]; in tegra_actmon_enable_interrupts()
441 for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { in tegra_actmon_disable_interrupts()
442 dev = &tegra->devices[i]; in tegra_actmon_disable_interrupts()
461 dev->target_freq = tegra->cur_freq; in tegra_actmon_configure_device()
463 dev->avg_count = tegra->cur_freq * ACTMON_SAMPLING_PERIOD; in tegra_actmon_configure_device()
464 device_writel(dev, dev->avg_count, ACTMON_DEV_INIT_AVG); in tegra_actmon_configure_device()
473 val |= (ACTMON_AVERAGE_WINDOW_LOG2 - 1) in tegra_actmon_configure_device()
475 val |= (ACTMON_BELOW_WMARK_WINDOW - 1) in tegra_actmon_configure_device()
477 val |= (ACTMON_ABOVE_WMARK_WINDOW - 1) in tegra_actmon_configure_device()
501 clk_set_min_rate(tegra->emc_clock, rate); in tegra_devfreq_target()
502 clk_set_rate(tegra->emc_clock, 0); in tegra_devfreq_target()
513 stat->current_frequency = tegra->cur_freq * KHZ; in tegra_devfreq_get_dev_status()
516 stat->private_data = tegra; in tegra_devfreq_get_dev_status()
520 actmon_dev = &tegra->devices[MCALL]; in tegra_devfreq_get_dev_status()
523 stat->busy_time = device_readl(actmon_dev, ACTMON_DEV_AVG_COUNT); in tegra_devfreq_get_dev_status()
526 stat->busy_time *= 100 / BUS_SATURATION_RATIO; in tegra_devfreq_get_dev_status()
529 stat->total_time = ACTMON_SAMPLING_PERIOD * tegra->cur_freq; in tegra_devfreq_get_dev_status()
531 stat->busy_time = min(stat->busy_time, stat->total_time); in tegra_devfreq_get_dev_status()
556 stat = &devfreq->last_status; in tegra_governor_get_target()
558 tegra = stat->private_data; in tegra_governor_get_target()
560 for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) { in tegra_governor_get_target()
561 dev = &tegra->devices[i]; in tegra_governor_get_target()
565 target_freq = max(target_freq, dev->target_freq); in tegra_governor_get_target()
579 tegra = dev_get_drvdata(devfreq->dev.parent); in tegra_governor_event_handler()
622 tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL); in tegra_devfreq_probe()
624 return -ENOMEM; in tegra_devfreq_probe()
628 tegra->regs = devm_ioremap_resource(&pdev->dev, res); in tegra_devfreq_probe()
629 if (IS_ERR(tegra->regs)) in tegra_devfreq_probe()
630 return PTR_ERR(tegra->regs); in tegra_devfreq_probe()
632 tegra->reset = devm_reset_control_get(&pdev->dev, "actmon"); in tegra_devfreq_probe()
633 if (IS_ERR(tegra->reset)) { in tegra_devfreq_probe()
634 dev_err(&pdev->dev, "Failed to get reset\n"); in tegra_devfreq_probe()
635 return PTR_ERR(tegra->reset); in tegra_devfreq_probe()
638 tegra->clock = devm_clk_get(&pdev->dev, "actmon"); in tegra_devfreq_probe()
639 if (IS_ERR(tegra->clock)) { in tegra_devfreq_probe()
640 dev_err(&pdev->dev, "Failed to get actmon clock\n"); in tegra_devfreq_probe()
641 return PTR_ERR(tegra->clock); in tegra_devfreq_probe()
644 tegra->emc_clock = devm_clk_get(&pdev->dev, "emc"); in tegra_devfreq_probe()
645 if (IS_ERR(tegra->emc_clock)) { in tegra_devfreq_probe()
646 dev_err(&pdev->dev, "Failed to get emc clock\n"); in tegra_devfreq_probe()
647 return PTR_ERR(tegra->emc_clock); in tegra_devfreq_probe()
650 clk_set_rate(tegra->emc_clock, ULONG_MAX); in tegra_devfreq_probe()
652 tegra->rate_change_nb.notifier_call = tegra_actmon_rate_notify_cb; in tegra_devfreq_probe()
653 err = clk_notifier_register(tegra->emc_clock, &tegra->rate_change_nb); in tegra_devfreq_probe()
655 dev_err(&pdev->dev, in tegra_devfreq_probe()
660 reset_control_assert(tegra->reset); in tegra_devfreq_probe()
662 err = clk_prepare_enable(tegra->clock); in tegra_devfreq_probe()
664 dev_err(&pdev->dev, in tegra_devfreq_probe()
669 reset_control_deassert(tegra->reset); in tegra_devfreq_probe()
671 tegra->max_freq = clk_round_rate(tegra->emc_clock, ULONG_MAX) / KHZ; in tegra_devfreq_probe()
672 tegra->cur_freq = clk_get_rate(tegra->emc_clock) / KHZ; in tegra_devfreq_probe()
674 actmon_writel(tegra, ACTMON_SAMPLING_PERIOD - 1, in tegra_devfreq_probe()
678 dev = tegra->devices + i; in tegra_devfreq_probe()
679 dev->config = actmon_device_configs + i; in tegra_devfreq_probe()
680 dev->regs = tegra->regs + dev->config->offset; in tegra_devfreq_probe()
681 spin_lock_init(&dev->lock); in tegra_devfreq_probe()
686 for (rate = 0; rate <= tegra->max_freq * KHZ; rate++) { in tegra_devfreq_probe()
687 rate = clk_round_rate(tegra->emc_clock, rate); in tegra_devfreq_probe()
688 dev_pm_opp_add(&pdev->dev, rate, 0); in tegra_devfreq_probe()
693 dev_err(&pdev->dev, "Failed to get IRQ: %d\n", irq); in tegra_devfreq_probe()
699 err = devm_request_threaded_irq(&pdev->dev, irq, actmon_isr, in tegra_devfreq_probe()
701 "tegra-devfreq", tegra); in tegra_devfreq_probe()
703 dev_err(&pdev->dev, "Interrupt request failed\n"); in tegra_devfreq_probe()
707 tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock); in tegra_devfreq_probe()
708 tegra->devfreq = devm_devfreq_add_device(&pdev->dev, in tegra_devfreq_probe()
724 val = device_readl(&tegra->devices[i], ACTMON_DEV_CTRL); in tegra_devfreq_remove()
726 device_writel(&tegra->devices[i], val, ACTMON_DEV_CTRL); in tegra_devfreq_remove()
731 devm_free_irq(&pdev->dev, irq, tegra); in tegra_devfreq_remove()
733 clk_notifier_unregister(tegra->emc_clock, &tegra->rate_change_nb); in tegra_devfreq_remove()
735 clk_disable_unprepare(tegra->clock); in tegra_devfreq_remove()
741 { .compatible = "nvidia,tegra124-actmon" },
751 .name = "tegra-devfreq",