]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/cpuidle/cpuidle-powernv.c
iommu/amd: Reserve exclusion range in iova-domain
[mirror_ubuntu-bionic-kernel.git] / drivers / cpuidle / cpuidle-powernv.c
index e06605b21841acae0d1d4b5d5d6ea963a7d732b8..1d7d5d121d55bbd3cf70cae9904223c4831ee1bc 100644 (file)
@@ -43,9 +43,31 @@ struct stop_psscr_table {
 
 static struct stop_psscr_table stop_psscr_table[CPUIDLE_STATE_MAX] __read_mostly;
 
-static u64 snooze_timeout __read_mostly;
+static u64 default_snooze_timeout __read_mostly;
 static bool snooze_timeout_en __read_mostly;
 
+static u64 get_snooze_timeout(struct cpuidle_device *dev,
+                             struct cpuidle_driver *drv,
+                             int index)
+{
+       int i;
+
+       if (unlikely(!snooze_timeout_en))
+               return default_snooze_timeout;
+
+       for (i = index + 1; i < drv->state_count; i++) {
+               struct cpuidle_state *s = &drv->states[i];
+               struct cpuidle_state_usage *su = &dev->states_usage[i];
+
+               if (s->disabled || su->disable)
+                       continue;
+
+               return s->target_residency * tb_ticks_per_usec;
+       }
+
+       return default_snooze_timeout;
+}
+
 static int snooze_loop(struct cpuidle_device *dev,
                        struct cpuidle_driver *drv,
                        int index)
@@ -56,7 +78,7 @@ static int snooze_loop(struct cpuidle_device *dev,
 
        local_irq_enable();
 
-       snooze_exit_time = get_tb() + snooze_timeout;
+       snooze_exit_time = get_tb() + get_snooze_timeout(dev, drv, index);
        ppc64_runlatch_off();
        HMT_very_low();
        while (!need_resched()) {
@@ -463,11 +485,9 @@ static int powernv_idle_probe(void)
                cpuidle_state_table = powernv_states;
                /* Device tree can indicate more idle states */
                max_idle_state = powernv_add_idle_states();
-               if (max_idle_state > 1) {
+               default_snooze_timeout = TICK_USEC * tb_ticks_per_usec;
+               if (max_idle_state > 1)
                        snooze_timeout_en = true;
-                       snooze_timeout = powernv_states[1].target_residency *
-                                        tb_ticks_per_usec;
-               }
        } else
                return -ENODEV;