linux/drivers/devfreq/tegra30-devfreq.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * A devfreq driver for NVIDIA Tegra SoCs
   4 *
   5 * Copyright (c) 2014 NVIDIA CORPORATION. All rights reserved.
   6 * Copyright (C) 2014 Google, Inc
   7 */
   8
   9#include <linux/clk.h>
  10#include <linux/cpufreq.h>
  11#include <linux/devfreq.h>
  12#include <linux/interrupt.h>
  13#include <linux/io.h>
  14#include <linux/irq.h>
  15#include <linux/module.h>
  16#include <linux/of_device.h>
  17#include <linux/platform_device.h>
  18#include <linux/pm_opp.h>
  19#include <linux/reset.h>
  20#include <linux/workqueue.h>
  21
  22#include <soc/tegra/fuse.h>
  23
  24#include "governor.h"
  25
  26#define ACTMON_GLB_STATUS                                       0x0
  27#define ACTMON_GLB_PERIOD_CTRL                                  0x4
  28
  29#define ACTMON_DEV_CTRL                                         0x0
  30#define ACTMON_DEV_CTRL_K_VAL_SHIFT                             10
  31#define ACTMON_DEV_CTRL_ENB_PERIODIC                            BIT(18)
  32#define ACTMON_DEV_CTRL_AVG_BELOW_WMARK_EN                      BIT(20)
  33#define ACTMON_DEV_CTRL_AVG_ABOVE_WMARK_EN                      BIT(21)
  34#define ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_NUM_SHIFT       23
  35#define ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_NUM_SHIFT       26
  36#define ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN              BIT(29)
  37#define ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN              BIT(30)
  38#define ACTMON_DEV_CTRL_ENB                                     BIT(31)
  39
  40#define ACTMON_DEV_CTRL_STOP                                    0x00000000
  41
  42#define ACTMON_DEV_UPPER_WMARK                                  0x4
  43#define ACTMON_DEV_LOWER_WMARK                                  0x8
  44#define ACTMON_DEV_INIT_AVG                                     0xc
  45#define ACTMON_DEV_AVG_UPPER_WMARK                              0x10
  46#define ACTMON_DEV_AVG_LOWER_WMARK                              0x14
  47#define ACTMON_DEV_COUNT_WEIGHT                                 0x18
  48#define ACTMON_DEV_AVG_COUNT                                    0x20
  49#define ACTMON_DEV_INTR_STATUS                                  0x24
  50
  51#define ACTMON_INTR_STATUS_CLEAR                                0xffffffff
  52
  53#define ACTMON_DEV_INTR_CONSECUTIVE_UPPER                       BIT(31)
  54#define ACTMON_DEV_INTR_CONSECUTIVE_LOWER                       BIT(30)
  55
  56#define ACTMON_ABOVE_WMARK_WINDOW                               1
  57#define ACTMON_BELOW_WMARK_WINDOW                               3
  58#define ACTMON_BOOST_FREQ_STEP                                  16000
  59
  60/*
  61 * ACTMON_AVERAGE_WINDOW_LOG2: default value for @DEV_CTRL_K_VAL, which
  62 * translates to 2 ^ (K_VAL + 1). ex: 2 ^ (6 + 1) = 128
  63 */
  64#define ACTMON_AVERAGE_WINDOW_LOG2                      6
  65#define ACTMON_SAMPLING_PERIOD                          12 /* ms */
  66#define ACTMON_DEFAULT_AVG_BAND                         6  /* 1/10 of % */
  67
  68#define KHZ                                                     1000
  69
  70#define KHZ_MAX                                         (ULONG_MAX / KHZ)
  71
  72/* Assume that the bus is saturated if the utilization is 25% */
  73#define BUS_SATURATION_RATIO                                    25
  74
  75/**
  76 * struct tegra_devfreq_device_config - configuration specific to an ACTMON
  77 * device
  78 *
  79 * Coefficients and thresholds are percentages unless otherwise noted
  80 */
  81struct tegra_devfreq_device_config {
  82        u32             offset;
  83        u32             irq_mask;
  84
  85        /* Factors applied to boost_freq every consecutive watermark breach */
  86        unsigned int    boost_up_coeff;
  87        unsigned int    boost_down_coeff;
  88
  89        /* Define the watermark bounds when applied to the current avg */
  90        unsigned int    boost_up_threshold;
  91        unsigned int    boost_down_threshold;
  92
  93        /*
  94         * Threshold of activity (cycles translated to kHz) below which the
  95         * CPU frequency isn't to be taken into account. This is to avoid
  96         * increasing the EMC frequency when the CPU is very busy but not
  97         * accessing the bus often.
  98         */
  99        u32             avg_dependency_threshold;
 100};
 101
 102enum tegra_actmon_device {
 103        MCALL = 0,
 104        MCCPU,
 105};
 106
 107static const struct tegra_devfreq_device_config tegra124_device_configs[] = {
 108        {
 109                /* MCALL: All memory accesses (including from the CPUs) */
 110                .offset = 0x1c0,
 111                .irq_mask = 1 << 26,
 112                .boost_up_coeff = 200,
 113                .boost_down_coeff = 50,
 114                .boost_up_threshold = 60,
 115                .boost_down_threshold = 40,
 116        },
 117        {
 118                /* MCCPU: memory accesses from the CPUs */
 119                .offset = 0x200,
 120                .irq_mask = 1 << 25,
 121                .boost_up_coeff = 800,
 122                .boost_down_coeff = 40,
 123                .boost_up_threshold = 27,
 124                .boost_down_threshold = 10,
 125                .avg_dependency_threshold = 16000, /* 16MHz in kHz units */
 126        },
 127};
 128
 129static const struct tegra_devfreq_device_config tegra30_device_configs[] = {
 130        {
 131                /* MCALL: All memory accesses (including from the CPUs) */
 132                .offset = 0x1c0,
 133                .irq_mask = 1 << 26,
 134                .boost_up_coeff = 200,
 135                .boost_down_coeff = 50,
 136                .boost_up_threshold = 20,
 137                .boost_down_threshold = 10,
 138        },
 139        {
 140                /* MCCPU: memory accesses from the CPUs */
 141                .offset = 0x200,
 142                .irq_mask = 1 << 25,
 143                .boost_up_coeff = 800,
 144                .boost_down_coeff = 40,
 145                .boost_up_threshold = 27,
 146                .boost_down_threshold = 10,
 147                .avg_dependency_threshold = 16000, /* 16MHz in kHz units */
 148        },
 149};
 150
 151/**
 152 * struct tegra_devfreq_device - state specific to an ACTMON device
 153 *
 154 * Frequencies are in kHz.
 155 */
 156struct tegra_devfreq_device {
 157        const struct tegra_devfreq_device_config *config;
 158        void __iomem *regs;
 159
 160        /* Average event count sampled in the last interrupt */
 161        u32 avg_count;
 162
 163        /*
 164         * Extra frequency to increase the target by due to consecutive
 165         * watermark breaches.
 166         */
 167        unsigned long boost_freq;
 168
 169        /* Optimal frequency calculated from the stats for this device */
 170        unsigned long target_freq;
 171};
 172
 173struct tegra_devfreq_soc_data {
 174        const struct tegra_devfreq_device_config *configs;
 175        /* Weight value for count measurements */
 176        unsigned int count_weight;
 177};
 178
 179struct tegra_devfreq {
 180        struct devfreq          *devfreq;
 181        struct opp_table        *opp_table;
 182
 183        struct reset_control    *reset;
 184        struct clk              *clock;
 185        void __iomem            *regs;
 186
 187        struct clk              *emc_clock;
 188        unsigned long           max_freq;
 189        unsigned long           cur_freq;
 190        struct notifier_block   clk_rate_change_nb;
 191
 192        struct delayed_work     cpufreq_update_work;
 193        struct notifier_block   cpu_rate_change_nb;
 194
 195        struct tegra_devfreq_device devices[2];
 196
 197        unsigned int            irq;
 198
 199        bool                    started;
 200
 201        const struct tegra_devfreq_soc_data *soc;
 202};
 203
 204struct tegra_actmon_emc_ratio {
 205        unsigned long cpu_freq;
 206        unsigned long emc_freq;
 207};
 208
 209static const struct tegra_actmon_emc_ratio actmon_emc_ratios[] = {
 210        { 1400000,    KHZ_MAX },
 211        { 1200000,    750000 },
 212        { 1100000,    600000 },
 213        { 1000000,    500000 },
 214        {  800000,    375000 },
 215        {  500000,    200000 },
 216        {  250000,    100000 },
 217};
 218
 219static u32 actmon_readl(struct tegra_devfreq *tegra, u32 offset)
 220{
 221        return readl_relaxed(tegra->regs + offset);
 222}
 223
 224static void actmon_writel(struct tegra_devfreq *tegra, u32 val, u32 offset)
 225{
 226        writel_relaxed(val, tegra->regs + offset);
 227}
 228
 229static u32 device_readl(struct tegra_devfreq_device *dev, u32 offset)
 230{
 231        return readl_relaxed(dev->regs + offset);
 232}
 233
 234static void device_writel(struct tegra_devfreq_device *dev, u32 val,
 235                          u32 offset)
 236{
 237        writel_relaxed(val, dev->regs + offset);
 238}
 239
 240static unsigned long do_percent(unsigned long long val, unsigned int pct)
 241{
 242        val = val * pct;
 243        do_div(val, 100);
 244
 245        /*
 246         * High freq + high boosting percent + large polling interval are
 247         * resulting in integer overflow when watermarks are calculated.
 248         */
 249        return min_t(u64, val, U32_MAX);
 250}
 251
 252static void tegra_devfreq_update_avg_wmark(struct tegra_devfreq *tegra,
 253                                           struct tegra_devfreq_device *dev)
 254{
 255        u32 avg_band_freq = tegra->max_freq * ACTMON_DEFAULT_AVG_BAND / KHZ;
 256        u32 band = avg_band_freq * tegra->devfreq->profile->polling_ms;
 257        u32 avg;
 258
 259        avg = min(dev->avg_count, U32_MAX - band);
 260        device_writel(dev, avg + band, ACTMON_DEV_AVG_UPPER_WMARK);
 261
 262        avg = max(dev->avg_count, band);
 263        device_writel(dev, avg - band, ACTMON_DEV_AVG_LOWER_WMARK);
 264}
 265
 266static void tegra_devfreq_update_wmark(struct tegra_devfreq *tegra,
 267                                       struct tegra_devfreq_device *dev)
 268{
 269        u32 val = tegra->cur_freq * tegra->devfreq->profile->polling_ms;
 270
 271        device_writel(dev, do_percent(val, dev->config->boost_up_threshold),
 272                      ACTMON_DEV_UPPER_WMARK);
 273
 274        device_writel(dev, do_percent(val, dev->config->boost_down_threshold),
 275                      ACTMON_DEV_LOWER_WMARK);
 276}
 277
 278static void actmon_isr_device(struct tegra_devfreq *tegra,
 279                              struct tegra_devfreq_device *dev)
 280{
 281        u32 intr_status, dev_ctrl;
 282
 283        dev->avg_count = device_readl(dev, ACTMON_DEV_AVG_COUNT);
 284        tegra_devfreq_update_avg_wmark(tegra, dev);
 285
 286        intr_status = device_readl(dev, ACTMON_DEV_INTR_STATUS);
 287        dev_ctrl = device_readl(dev, ACTMON_DEV_CTRL);
 288
 289        if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_UPPER) {
 290                /*
 291                 * new_boost = min(old_boost * up_coef + step, max_freq)
 292                 */
 293                dev->boost_freq = do_percent(dev->boost_freq,
 294                                             dev->config->boost_up_coeff);
 295                dev->boost_freq += ACTMON_BOOST_FREQ_STEP;
 296
 297                dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN;
 298
 299                if (dev->boost_freq >= tegra->max_freq) {
 300                        dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN;
 301                        dev->boost_freq = tegra->max_freq;
 302                }
 303        } else if (intr_status & ACTMON_DEV_INTR_CONSECUTIVE_LOWER) {
 304                /*
 305                 * new_boost = old_boost * down_coef
 306                 * or 0 if (old_boost * down_coef < step / 2)
 307                 */
 308                dev->boost_freq = do_percent(dev->boost_freq,
 309                                             dev->config->boost_down_coeff);
 310
 311                dev_ctrl |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN;
 312
 313                if (dev->boost_freq < (ACTMON_BOOST_FREQ_STEP >> 1)) {
 314                        dev_ctrl &= ~ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_EN;
 315                        dev->boost_freq = 0;
 316                }
 317        }
 318
 319        device_writel(dev, dev_ctrl, ACTMON_DEV_CTRL);
 320
 321        device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS);
 322}
 323
 324static unsigned long actmon_cpu_to_emc_rate(struct tegra_devfreq *tegra,
 325                                            unsigned long cpu_freq)
 326{
 327        unsigned int i;
 328        const struct tegra_actmon_emc_ratio *ratio = actmon_emc_ratios;
 329
 330        for (i = 0; i < ARRAY_SIZE(actmon_emc_ratios); i++, ratio++) {
 331                if (cpu_freq >= ratio->cpu_freq) {
 332                        if (ratio->emc_freq >= tegra->max_freq)
 333                                return tegra->max_freq;
 334                        else
 335                                return ratio->emc_freq;
 336                }
 337        }
 338
 339        return 0;
 340}
 341
 342static unsigned long actmon_device_target_freq(struct tegra_devfreq *tegra,
 343                                               struct tegra_devfreq_device *dev)
 344{
 345        unsigned int avg_sustain_coef;
 346        unsigned long target_freq;
 347
 348        target_freq = dev->avg_count / tegra->devfreq->profile->polling_ms;
 349        avg_sustain_coef = 100 * 100 / dev->config->boost_up_threshold;
 350        target_freq = do_percent(target_freq, avg_sustain_coef);
 351
 352        return target_freq;
 353}
 354
 355static void actmon_update_target(struct tegra_devfreq *tegra,
 356                                 struct tegra_devfreq_device *dev)
 357{
 358        unsigned long cpu_freq = 0;
 359        unsigned long static_cpu_emc_freq = 0;
 360
 361        dev->target_freq = actmon_device_target_freq(tegra, dev);
 362
 363        if (dev->config->avg_dependency_threshold &&
 364            dev->config->avg_dependency_threshold <= dev->target_freq) {
 365                cpu_freq = cpufreq_quick_get(0);
 366                static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq);
 367
 368                dev->target_freq += dev->boost_freq;
 369                dev->target_freq = max(dev->target_freq, static_cpu_emc_freq);
 370        } else {
 371                dev->target_freq += dev->boost_freq;
 372        }
 373}
 374
 375static irqreturn_t actmon_thread_isr(int irq, void *data)
 376{
 377        struct tegra_devfreq *tegra = data;
 378        bool handled = false;
 379        unsigned int i;
 380        u32 val;
 381
 382        mutex_lock(&tegra->devfreq->lock);
 383
 384        val = actmon_readl(tegra, ACTMON_GLB_STATUS);
 385        for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) {
 386                if (val & tegra->devices[i].config->irq_mask) {
 387                        actmon_isr_device(tegra, tegra->devices + i);
 388                        handled = true;
 389                }
 390        }
 391
 392        if (handled)
 393                update_devfreq(tegra->devfreq);
 394
 395        mutex_unlock(&tegra->devfreq->lock);
 396
 397        return handled ? IRQ_HANDLED : IRQ_NONE;
 398}
 399
 400static int tegra_actmon_clk_notify_cb(struct notifier_block *nb,
 401                                      unsigned long action, void *ptr)
 402{
 403        struct clk_notifier_data *data = ptr;
 404        struct tegra_devfreq *tegra;
 405        struct tegra_devfreq_device *dev;
 406        unsigned int i;
 407
 408        if (action != POST_RATE_CHANGE)
 409                return NOTIFY_OK;
 410
 411        tegra = container_of(nb, struct tegra_devfreq, clk_rate_change_nb);
 412
 413        tegra->cur_freq = data->new_rate / KHZ;
 414
 415        for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) {
 416                dev = &tegra->devices[i];
 417
 418                tegra_devfreq_update_wmark(tegra, dev);
 419        }
 420
 421        return NOTIFY_OK;
 422}
 423
 424static void tegra_actmon_delayed_update(struct work_struct *work)
 425{
 426        struct tegra_devfreq *tegra = container_of(work, struct tegra_devfreq,
 427                                                   cpufreq_update_work.work);
 428
 429        mutex_lock(&tegra->devfreq->lock);
 430        update_devfreq(tegra->devfreq);
 431        mutex_unlock(&tegra->devfreq->lock);
 432}
 433
 434static unsigned long
 435tegra_actmon_cpufreq_contribution(struct tegra_devfreq *tegra,
 436                                  unsigned int cpu_freq)
 437{
 438        struct tegra_devfreq_device *actmon_dev = &tegra->devices[MCCPU];
 439        unsigned long static_cpu_emc_freq, dev_freq;
 440
 441        dev_freq = actmon_device_target_freq(tegra, actmon_dev);
 442
 443        /* check whether CPU's freq is taken into account at all */
 444        if (dev_freq < actmon_dev->config->avg_dependency_threshold)
 445                return 0;
 446
 447        static_cpu_emc_freq = actmon_cpu_to_emc_rate(tegra, cpu_freq);
 448
 449        if (dev_freq + actmon_dev->boost_freq >= static_cpu_emc_freq)
 450                return 0;
 451
 452        return static_cpu_emc_freq;
 453}
 454
 455static int tegra_actmon_cpu_notify_cb(struct notifier_block *nb,
 456                                      unsigned long action, void *ptr)
 457{
 458        struct cpufreq_freqs *freqs = ptr;
 459        struct tegra_devfreq *tegra;
 460        unsigned long old, new, delay;
 461
 462        if (action != CPUFREQ_POSTCHANGE)
 463                return NOTIFY_OK;
 464
 465        tegra = container_of(nb, struct tegra_devfreq, cpu_rate_change_nb);
 466
 467        /*
 468         * Quickly check whether CPU frequency should be taken into account
 469         * at all, without blocking CPUFreq's core.
 470         */
 471        if (mutex_trylock(&tegra->devfreq->lock)) {
 472                old = tegra_actmon_cpufreq_contribution(tegra, freqs->old);
 473                new = tegra_actmon_cpufreq_contribution(tegra, freqs->new);
 474                mutex_unlock(&tegra->devfreq->lock);
 475
 476                /*
 477                 * If CPU's frequency shouldn't be taken into account at
 478                 * the moment, then there is no need to update the devfreq's
 479                 * state because ISR will re-check CPU's frequency on the
 480                 * next interrupt.
 481                 */
 482                if (old == new)
 483                        return NOTIFY_OK;
 484        }
 485
 486        /*
 487         * CPUFreq driver should support CPUFREQ_ASYNC_NOTIFICATION in order
 488         * to allow asynchronous notifications. This means we can't block
 489         * here for too long, otherwise CPUFreq's core will complain with a
 490         * warning splat.
 491         */
 492        delay = msecs_to_jiffies(ACTMON_SAMPLING_PERIOD);
 493        schedule_delayed_work(&tegra->cpufreq_update_work, delay);
 494
 495        return NOTIFY_OK;
 496}
 497
 498static void tegra_actmon_configure_device(struct tegra_devfreq *tegra,
 499                                          struct tegra_devfreq_device *dev)
 500{
 501        u32 val = 0;
 502
 503        /* reset boosting on governor's restart */
 504        dev->boost_freq = 0;
 505
 506        dev->target_freq = tegra->cur_freq;
 507
 508        dev->avg_count = tegra->cur_freq * tegra->devfreq->profile->polling_ms;
 509        device_writel(dev, dev->avg_count, ACTMON_DEV_INIT_AVG);
 510
 511        tegra_devfreq_update_avg_wmark(tegra, dev);
 512        tegra_devfreq_update_wmark(tegra, dev);
 513
 514        device_writel(dev, tegra->soc->count_weight, ACTMON_DEV_COUNT_WEIGHT);
 515        device_writel(dev, ACTMON_INTR_STATUS_CLEAR, ACTMON_DEV_INTR_STATUS);
 516
 517        val |= ACTMON_DEV_CTRL_ENB_PERIODIC;
 518        val |= (ACTMON_AVERAGE_WINDOW_LOG2 - 1)
 519                << ACTMON_DEV_CTRL_K_VAL_SHIFT;
 520        val |= (ACTMON_BELOW_WMARK_WINDOW - 1)
 521                << ACTMON_DEV_CTRL_CONSECUTIVE_BELOW_WMARK_NUM_SHIFT;
 522        val |= (ACTMON_ABOVE_WMARK_WINDOW - 1)
 523                << ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_NUM_SHIFT;
 524        val |= ACTMON_DEV_CTRL_AVG_ABOVE_WMARK_EN;
 525        val |= ACTMON_DEV_CTRL_AVG_BELOW_WMARK_EN;
 526        val |= ACTMON_DEV_CTRL_CONSECUTIVE_ABOVE_WMARK_EN;
 527        val |= ACTMON_DEV_CTRL_ENB;
 528
 529        device_writel(dev, val, ACTMON_DEV_CTRL);
 530}
 531
 532static void tegra_actmon_stop_devices(struct tegra_devfreq *tegra)
 533{
 534        struct tegra_devfreq_device *dev = tegra->devices;
 535        unsigned int i;
 536
 537        for (i = 0; i < ARRAY_SIZE(tegra->devices); i++, dev++) {
 538                device_writel(dev, ACTMON_DEV_CTRL_STOP, ACTMON_DEV_CTRL);
 539                device_writel(dev, ACTMON_INTR_STATUS_CLEAR,
 540                              ACTMON_DEV_INTR_STATUS);
 541        }
 542}
 543
 544static int tegra_actmon_resume(struct tegra_devfreq *tegra)
 545{
 546        unsigned int i;
 547        int err;
 548
 549        if (!tegra->devfreq->profile->polling_ms || !tegra->started)
 550                return 0;
 551
 552        actmon_writel(tegra, tegra->devfreq->profile->polling_ms - 1,
 553                      ACTMON_GLB_PERIOD_CTRL);
 554
 555        /*
 556         * CLK notifications are needed in order to reconfigure the upper
 557         * consecutive watermark in accordance to the actual clock rate
 558         * to avoid unnecessary upper interrupts.
 559         */
 560        err = clk_notifier_register(tegra->emc_clock,
 561                                    &tegra->clk_rate_change_nb);
 562        if (err) {
 563                dev_err(tegra->devfreq->dev.parent,
 564                        "Failed to register rate change notifier\n");
 565                return err;
 566        }
 567
 568        tegra->cur_freq = clk_get_rate(tegra->emc_clock) / KHZ;
 569
 570        for (i = 0; i < ARRAY_SIZE(tegra->devices); i++)
 571                tegra_actmon_configure_device(tegra, &tegra->devices[i]);
 572
 573        /*
 574         * We are estimating CPU's memory bandwidth requirement based on
 575         * amount of memory accesses and system's load, judging by CPU's
 576         * frequency. We also don't want to receive events about CPU's
 577         * frequency transaction when governor is stopped, hence notifier
 578         * is registered dynamically.
 579         */
 580        err = cpufreq_register_notifier(&tegra->cpu_rate_change_nb,
 581                                        CPUFREQ_TRANSITION_NOTIFIER);
 582        if (err) {
 583                dev_err(tegra->devfreq->dev.parent,
 584                        "Failed to register rate change notifier: %d\n", err);
 585                goto err_stop;
 586        }
 587
 588        enable_irq(tegra->irq);
 589
 590        return 0;
 591
 592err_stop:
 593        tegra_actmon_stop_devices(tegra);
 594
 595        clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb);
 596
 597        return err;
 598}
 599
 600static int tegra_actmon_start(struct tegra_devfreq *tegra)
 601{
 602        int ret = 0;
 603
 604        if (!tegra->started) {
 605                tegra->started = true;
 606
 607                ret = tegra_actmon_resume(tegra);
 608                if (ret)
 609                        tegra->started = false;
 610        }
 611
 612        return ret;
 613}
 614
 615static void tegra_actmon_pause(struct tegra_devfreq *tegra)
 616{
 617        if (!tegra->devfreq->profile->polling_ms || !tegra->started)
 618                return;
 619
 620        disable_irq(tegra->irq);
 621
 622        cpufreq_unregister_notifier(&tegra->cpu_rate_change_nb,
 623                                    CPUFREQ_TRANSITION_NOTIFIER);
 624
 625        cancel_delayed_work_sync(&tegra->cpufreq_update_work);
 626
 627        tegra_actmon_stop_devices(tegra);
 628
 629        clk_notifier_unregister(tegra->emc_clock, &tegra->clk_rate_change_nb);
 630}
 631
 632static void tegra_actmon_stop(struct tegra_devfreq *tegra)
 633{
 634        tegra_actmon_pause(tegra);
 635        tegra->started = false;
 636}
 637
 638static int tegra_devfreq_target(struct device *dev, unsigned long *freq,
 639                                u32 flags)
 640{
 641        struct dev_pm_opp *opp;
 642        int ret;
 643
 644        opp = devfreq_recommended_opp(dev, freq, flags);
 645        if (IS_ERR(opp)) {
 646                dev_err(dev, "Failed to find opp for %lu Hz\n", *freq);
 647                return PTR_ERR(opp);
 648        }
 649
 650        ret = dev_pm_opp_set_opp(dev, opp);
 651        dev_pm_opp_put(opp);
 652
 653        return ret;
 654}
 655
 656static int tegra_devfreq_get_dev_status(struct device *dev,
 657                                        struct devfreq_dev_status *stat)
 658{
 659        struct tegra_devfreq *tegra = dev_get_drvdata(dev);
 660        struct tegra_devfreq_device *actmon_dev;
 661        unsigned long cur_freq;
 662
 663        cur_freq = READ_ONCE(tegra->cur_freq);
 664
 665        /* To be used by the tegra governor */
 666        stat->private_data = tegra;
 667
 668        /* The below are to be used by the other governors */
 669        stat->current_frequency = cur_freq * KHZ;
 670
 671        actmon_dev = &tegra->devices[MCALL];
 672
 673        /* Number of cycles spent on memory access */
 674        stat->busy_time = device_readl(actmon_dev, ACTMON_DEV_AVG_COUNT);
 675
 676        /* The bus can be considered to be saturated way before 100% */
 677        stat->busy_time *= 100 / BUS_SATURATION_RATIO;
 678
 679        /* Number of cycles in a sampling period */
 680        stat->total_time = tegra->devfreq->profile->polling_ms * cur_freq;
 681
 682        stat->busy_time = min(stat->busy_time, stat->total_time);
 683
 684        return 0;
 685}
 686
 687static struct devfreq_dev_profile tegra_devfreq_profile = {
 688        .polling_ms     = ACTMON_SAMPLING_PERIOD,
 689        .target         = tegra_devfreq_target,
 690        .get_dev_status = tegra_devfreq_get_dev_status,
 691        .is_cooling_device = true,
 692};
 693
 694static int tegra_governor_get_target(struct devfreq *devfreq,
 695                                     unsigned long *freq)
 696{
 697        struct devfreq_dev_status *stat;
 698        struct tegra_devfreq *tegra;
 699        struct tegra_devfreq_device *dev;
 700        unsigned long target_freq = 0;
 701        unsigned int i;
 702        int err;
 703
 704        err = devfreq_update_stats(devfreq);
 705        if (err)
 706                return err;
 707
 708        stat = &devfreq->last_status;
 709
 710        tegra = stat->private_data;
 711
 712        for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) {
 713                dev = &tegra->devices[i];
 714
 715                actmon_update_target(tegra, dev);
 716
 717                target_freq = max(target_freq, dev->target_freq);
 718        }
 719
 720        /*
 721         * tegra-devfreq driver operates with KHz units, while OPP table
 722         * entries use Hz units. Hence we need to convert the units for the
 723         * devfreq core.
 724         */
 725        *freq = target_freq * KHZ;
 726
 727        return 0;
 728}
 729
 730static int tegra_governor_event_handler(struct devfreq *devfreq,
 731                                        unsigned int event, void *data)
 732{
 733        struct tegra_devfreq *tegra = dev_get_drvdata(devfreq->dev.parent);
 734        unsigned int *new_delay = data;
 735        int ret = 0;
 736
 737        /*
 738         * Couple devfreq-device with the governor early because it is
 739         * needed at the moment of governor's start (used by ISR).
 740         */
 741        tegra->devfreq = devfreq;
 742
 743        switch (event) {
 744        case DEVFREQ_GOV_START:
 745                devfreq_monitor_start(devfreq);
 746                ret = tegra_actmon_start(tegra);
 747                break;
 748
 749        case DEVFREQ_GOV_STOP:
 750                tegra_actmon_stop(tegra);
 751                devfreq_monitor_stop(devfreq);
 752                break;
 753
 754        case DEVFREQ_GOV_UPDATE_INTERVAL:
 755                /*
 756                 * ACTMON hardware supports up to 256 milliseconds for the
 757                 * sampling period.
 758                 */
 759                if (*new_delay > 256) {
 760                        ret = -EINVAL;
 761                        break;
 762                }
 763
 764                tegra_actmon_pause(tegra);
 765                devfreq_update_interval(devfreq, new_delay);
 766                ret = tegra_actmon_resume(tegra);
 767                break;
 768
 769        case DEVFREQ_GOV_SUSPEND:
 770                tegra_actmon_stop(tegra);
 771                devfreq_monitor_suspend(devfreq);
 772                break;
 773
 774        case DEVFREQ_GOV_RESUME:
 775                devfreq_monitor_resume(devfreq);
 776                ret = tegra_actmon_start(tegra);
 777                break;
 778        }
 779
 780        return ret;
 781}
 782
 783static struct devfreq_governor tegra_devfreq_governor = {
 784        .name = "tegra_actmon",
 785        .attrs = DEVFREQ_GOV_ATTR_POLLING_INTERVAL,
 786        .flags = DEVFREQ_GOV_FLAG_IMMUTABLE
 787                | DEVFREQ_GOV_FLAG_IRQ_DRIVEN,
 788        .get_target_freq = tegra_governor_get_target,
 789        .event_handler = tegra_governor_event_handler,
 790};
 791
 792static int tegra_devfreq_probe(struct platform_device *pdev)
 793{
 794        u32 hw_version = BIT(tegra_sku_info.soc_speedo_id);
 795        struct tegra_devfreq_device *dev;
 796        struct tegra_devfreq *tegra;
 797        struct devfreq *devfreq;
 798        unsigned int i;
 799        long rate;
 800        int err;
 801
 802        tegra = devm_kzalloc(&pdev->dev, sizeof(*tegra), GFP_KERNEL);
 803        if (!tegra)
 804                return -ENOMEM;
 805
 806        tegra->soc = of_device_get_match_data(&pdev->dev);
 807
 808        tegra->regs = devm_platform_ioremap_resource(pdev, 0);
 809        if (IS_ERR(tegra->regs))
 810                return PTR_ERR(tegra->regs);
 811
 812        tegra->reset = devm_reset_control_get(&pdev->dev, "actmon");
 813        if (IS_ERR(tegra->reset)) {
 814                dev_err(&pdev->dev, "Failed to get reset\n");
 815                return PTR_ERR(tegra->reset);
 816        }
 817
 818        tegra->clock = devm_clk_get(&pdev->dev, "actmon");
 819        if (IS_ERR(tegra->clock)) {
 820                dev_err(&pdev->dev, "Failed to get actmon clock\n");
 821                return PTR_ERR(tegra->clock);
 822        }
 823
 824        tegra->emc_clock = devm_clk_get(&pdev->dev, "emc");
 825        if (IS_ERR(tegra->emc_clock))
 826                return dev_err_probe(&pdev->dev, PTR_ERR(tegra->emc_clock),
 827                                     "Failed to get emc clock\n");
 828
 829        err = platform_get_irq(pdev, 0);
 830        if (err < 0)
 831                return err;
 832
 833        tegra->irq = err;
 834
 835        irq_set_status_flags(tegra->irq, IRQ_NOAUTOEN);
 836
 837        err = devm_request_threaded_irq(&pdev->dev, tegra->irq, NULL,
 838                                        actmon_thread_isr, IRQF_ONESHOT,
 839                                        "tegra-devfreq", tegra);
 840        if (err) {
 841                dev_err(&pdev->dev, "Interrupt request failed: %d\n", err);
 842                return err;
 843        }
 844
 845        tegra->opp_table = dev_pm_opp_set_supported_hw(&pdev->dev,
 846                                                       &hw_version, 1);
 847        err = PTR_ERR_OR_ZERO(tegra->opp_table);
 848        if (err) {
 849                dev_err(&pdev->dev, "Failed to set supported HW: %d\n", err);
 850                return err;
 851        }
 852
 853        err = dev_pm_opp_of_add_table_noclk(&pdev->dev, 0);
 854        if (err) {
 855                dev_err(&pdev->dev, "Failed to add OPP table: %d\n", err);
 856                goto put_hw;
 857        }
 858
 859        err = clk_prepare_enable(tegra->clock);
 860        if (err) {
 861                dev_err(&pdev->dev,
 862                        "Failed to prepare and enable ACTMON clock\n");
 863                goto remove_table;
 864        }
 865
 866        err = reset_control_reset(tegra->reset);
 867        if (err) {
 868                dev_err(&pdev->dev, "Failed to reset hardware: %d\n", err);
 869                goto disable_clk;
 870        }
 871
 872        rate = clk_round_rate(tegra->emc_clock, ULONG_MAX);
 873        if (rate < 0) {
 874                dev_err(&pdev->dev, "Failed to round clock rate: %ld\n", rate);
 875                err = rate;
 876                goto disable_clk;
 877        }
 878
 879        tegra->max_freq = rate / KHZ;
 880
 881        for (i = 0; i < ARRAY_SIZE(tegra->devices); i++) {
 882                dev = tegra->devices + i;
 883                dev->config = tegra->soc->configs + i;
 884                dev->regs = tegra->regs + dev->config->offset;
 885        }
 886
 887        platform_set_drvdata(pdev, tegra);
 888
 889        tegra->clk_rate_change_nb.notifier_call = tegra_actmon_clk_notify_cb;
 890        tegra->cpu_rate_change_nb.notifier_call = tegra_actmon_cpu_notify_cb;
 891
 892        INIT_DELAYED_WORK(&tegra->cpufreq_update_work,
 893                          tegra_actmon_delayed_update);
 894
 895        err = devfreq_add_governor(&tegra_devfreq_governor);
 896        if (err) {
 897                dev_err(&pdev->dev, "Failed to add governor: %d\n", err);
 898                goto remove_opps;
 899        }
 900
 901        tegra_devfreq_profile.initial_freq = clk_get_rate(tegra->emc_clock);
 902
 903        devfreq = devfreq_add_device(&pdev->dev, &tegra_devfreq_profile,
 904                                     "tegra_actmon", NULL);
 905        if (IS_ERR(devfreq)) {
 906                err = PTR_ERR(devfreq);
 907                goto remove_governor;
 908        }
 909
 910        return 0;
 911
 912remove_governor:
 913        devfreq_remove_governor(&tegra_devfreq_governor);
 914
 915remove_opps:
 916        dev_pm_opp_remove_all_dynamic(&pdev->dev);
 917
 918        reset_control_reset(tegra->reset);
 919disable_clk:
 920        clk_disable_unprepare(tegra->clock);
 921remove_table:
 922        dev_pm_opp_of_remove_table(&pdev->dev);
 923put_hw:
 924        dev_pm_opp_put_supported_hw(tegra->opp_table);
 925
 926        return err;
 927}
 928
 929static int tegra_devfreq_remove(struct platform_device *pdev)
 930{
 931        struct tegra_devfreq *tegra = platform_get_drvdata(pdev);
 932
 933        devfreq_remove_device(tegra->devfreq);
 934        devfreq_remove_governor(&tegra_devfreq_governor);
 935
 936        reset_control_reset(tegra->reset);
 937        clk_disable_unprepare(tegra->clock);
 938
 939        dev_pm_opp_of_remove_table(&pdev->dev);
 940        dev_pm_opp_put_supported_hw(tegra->opp_table);
 941
 942        return 0;
 943}
 944
 945static const struct tegra_devfreq_soc_data tegra124_soc = {
 946        .configs = tegra124_device_configs,
 947
 948        /*
 949         * Activity counter is incremented every 256 memory transactions,
 950         * and each transaction takes 4 EMC clocks.
 951         */
 952        .count_weight = 4 * 256,
 953};
 954
 955static const struct tegra_devfreq_soc_data tegra30_soc = {
 956        .configs = tegra30_device_configs,
 957        .count_weight = 2 * 256,
 958};
 959
 960static const struct of_device_id tegra_devfreq_of_match[] = {
 961        { .compatible = "nvidia,tegra30-actmon",  .data = &tegra30_soc, },
 962        { .compatible = "nvidia,tegra124-actmon", .data = &tegra124_soc, },
 963        { },
 964};
 965
 966MODULE_DEVICE_TABLE(of, tegra_devfreq_of_match);
 967
 968static struct platform_driver tegra_devfreq_driver = {
 969        .probe  = tegra_devfreq_probe,
 970        .remove = tegra_devfreq_remove,
 971        .driver = {
 972                .name = "tegra-devfreq",
 973                .of_match_table = tegra_devfreq_of_match,
 974        },
 975};
 976module_platform_driver(tegra_devfreq_driver);
 977
 978MODULE_LICENSE("GPL v2");
 979MODULE_DESCRIPTION("Tegra devfreq driver");
 980MODULE_AUTHOR("Tomeu Vizoso <tomeu.vizoso@collabora.com>");
 981