aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/power/hibernate_64.c18
-rw-r--r--arch/x86/power/hibernate_asm_64.S2
-rw-r--r--drivers/base/power/opp/core.c31
-rw-r--r--drivers/base/power/wakeup.c18
-rw-r--r--drivers/cpufreq/Kconfig1
-rw-r--r--drivers/cpufreq/intel_pstate.c2
6 files changed, 37 insertions, 35 deletions
diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c
index f2b5e6a5cf95..f0b5f2d402af 100644
--- a/arch/x86/power/hibernate_64.c
+++ b/arch/x86/power/hibernate_64.c
@@ -37,11 +37,11 @@ unsigned long jump_address_phys;
37 */ 37 */
38unsigned long restore_cr3 __visible; 38unsigned long restore_cr3 __visible;
39 39
40pgd_t *temp_level4_pgt __visible; 40unsigned long temp_level4_pgt __visible;
41 41
42unsigned long relocated_restore_code __visible; 42unsigned long relocated_restore_code __visible;
43 43
44static int set_up_temporary_text_mapping(void) 44static int set_up_temporary_text_mapping(pgd_t *pgd)
45{ 45{
46 pmd_t *pmd; 46 pmd_t *pmd;
47 pud_t *pud; 47 pud_t *pud;
@@ -71,7 +71,7 @@ static int set_up_temporary_text_mapping(void)
71 __pmd((jump_address_phys & PMD_MASK) | __PAGE_KERNEL_LARGE_EXEC)); 71 __pmd((jump_address_phys & PMD_MASK) | __PAGE_KERNEL_LARGE_EXEC));
72 set_pud(pud + pud_index(restore_jump_address), 72 set_pud(pud + pud_index(restore_jump_address),
73 __pud(__pa(pmd) | _KERNPG_TABLE)); 73 __pud(__pa(pmd) | _KERNPG_TABLE));
74 set_pgd(temp_level4_pgt + pgd_index(restore_jump_address), 74 set_pgd(pgd + pgd_index(restore_jump_address),
75 __pgd(__pa(pud) | _KERNPG_TABLE)); 75 __pgd(__pa(pud) | _KERNPG_TABLE));
76 76
77 return 0; 77 return 0;
@@ -90,15 +90,16 @@ static int set_up_temporary_mappings(void)
90 .kernel_mapping = true, 90 .kernel_mapping = true,
91 }; 91 };
92 unsigned long mstart, mend; 92 unsigned long mstart, mend;
93 pgd_t *pgd;
93 int result; 94 int result;
94 int i; 95 int i;
95 96
96 temp_level4_pgt = (pgd_t *)get_safe_page(GFP_ATOMIC); 97 pgd = (pgd_t *)get_safe_page(GFP_ATOMIC);
97 if (!temp_level4_pgt) 98 if (!pgd)
98 return -ENOMEM; 99 return -ENOMEM;
99 100
100 /* Prepare a temporary mapping for the kernel text */ 101 /* Prepare a temporary mapping for the kernel text */
101 result = set_up_temporary_text_mapping(); 102 result = set_up_temporary_text_mapping(pgd);
102 if (result) 103 if (result)
103 return result; 104 return result;
104 105
@@ -107,13 +108,12 @@ static int set_up_temporary_mappings(void)
107 mstart = pfn_mapped[i].start << PAGE_SHIFT; 108 mstart = pfn_mapped[i].start << PAGE_SHIFT;
108 mend = pfn_mapped[i].end << PAGE_SHIFT; 109 mend = pfn_mapped[i].end << PAGE_SHIFT;
109 110
110 result = kernel_ident_mapping_init(&info, temp_level4_pgt, 111 result = kernel_ident_mapping_init(&info, pgd, mstart, mend);
111 mstart, mend);
112
113 if (result) 112 if (result)
114 return result; 113 return result;
115 } 114 }
116 115
116 temp_level4_pgt = (unsigned long)pgd - __PAGE_OFFSET;
117 return 0; 117 return 0;
118} 118}
119 119
diff --git a/arch/x86/power/hibernate_asm_64.S b/arch/x86/power/hibernate_asm_64.S
index 8eee0e9c93f0..ce8da3a0412c 100644
--- a/arch/x86/power/hibernate_asm_64.S
+++ b/arch/x86/power/hibernate_asm_64.S
@@ -72,8 +72,6 @@ ENTRY(restore_image)
72 /* code below has been relocated to a safe page */ 72 /* code below has been relocated to a safe page */
73ENTRY(core_restore_code) 73ENTRY(core_restore_code)
74 /* switch to temporary page tables */ 74 /* switch to temporary page tables */
75 movq $__PAGE_OFFSET, %rcx
76 subq %rcx, %rax
77 movq %rax, %cr3 75 movq %rax, %cr3
78 /* flush TLB */ 76 /* flush TLB */
79 movq %rbx, %rcx 77 movq %rbx, %rcx
diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c
index 7c04c87738a6..df0c70963d9e 100644
--- a/drivers/base/power/opp/core.c
+++ b/drivers/base/power/opp/core.c
@@ -402,6 +402,22 @@ struct dev_pm_opp *dev_pm_opp_find_freq_exact(struct device *dev,
402} 402}
403EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact); 403EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_exact);
404 404
405static noinline struct dev_pm_opp *_find_freq_ceil(struct opp_table *opp_table,
406 unsigned long *freq)
407{
408 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
409
410 list_for_each_entry_rcu(temp_opp, &opp_table->opp_list, node) {
411 if (temp_opp->available && temp_opp->rate >= *freq) {
412 opp = temp_opp;
413 *freq = opp->rate;
414 break;
415 }
416 }
417
418 return opp;
419}
420
405/** 421/**
406 * dev_pm_opp_find_freq_ceil() - Search for an rounded ceil freq 422 * dev_pm_opp_find_freq_ceil() - Search for an rounded ceil freq
407 * @dev: device for which we do this operation 423 * @dev: device for which we do this operation
@@ -427,7 +443,6 @@ struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
427 unsigned long *freq) 443 unsigned long *freq)
428{ 444{
429 struct opp_table *opp_table; 445 struct opp_table *opp_table;
430 struct dev_pm_opp *temp_opp, *opp = ERR_PTR(-ERANGE);
431 446
432 opp_rcu_lockdep_assert(); 447 opp_rcu_lockdep_assert();
433 448
@@ -440,15 +455,7 @@ struct dev_pm_opp *dev_pm_opp_find_freq_ceil(struct device *dev,
440 if (IS_ERR(opp_table)) 455 if (IS_ERR(opp_table))
441 return ERR_CAST(opp_table); 456 return ERR_CAST(opp_table);
442 457
443 list_for_each_entry_rcu(temp_opp, &opp_table->opp_list, node) { 458 return _find_freq_ceil(opp_table, freq);
444 if (temp_opp->available && temp_opp->rate >= *freq) {
445 opp = temp_opp;
446 *freq = opp->rate;
447 break;
448 }
449 }
450
451 return opp;
452} 459}
453EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil); 460EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_ceil);
454 461
@@ -612,7 +619,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
612 return PTR_ERR(opp_table); 619 return PTR_ERR(opp_table);
613 } 620 }
614 621
615 old_opp = dev_pm_opp_find_freq_ceil(dev, &old_freq); 622 old_opp = _find_freq_ceil(opp_table, &old_freq);
616 if (!IS_ERR(old_opp)) { 623 if (!IS_ERR(old_opp)) {
617 ou_volt = old_opp->u_volt; 624 ou_volt = old_opp->u_volt;
618 ou_volt_min = old_opp->u_volt_min; 625 ou_volt_min = old_opp->u_volt_min;
@@ -622,7 +629,7 @@ int dev_pm_opp_set_rate(struct device *dev, unsigned long target_freq)
622 __func__, old_freq, PTR_ERR(old_opp)); 629 __func__, old_freq, PTR_ERR(old_opp));
623 } 630 }
624 631
625 opp = dev_pm_opp_find_freq_ceil(dev, &freq); 632 opp = _find_freq_ceil(opp_table, &freq);
626 if (IS_ERR(opp)) { 633 if (IS_ERR(opp)) {
627 ret = PTR_ERR(opp); 634 ret = PTR_ERR(opp);
628 dev_err(dev, "%s: failed to find OPP for freq %lu (%d)\n", 635 dev_err(dev, "%s: failed to find OPP for freq %lu (%d)\n",
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 5fb7718f256c..62e4de2aa8d1 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -334,10 +334,9 @@ void device_wakeup_arm_wake_irqs(void)
334 struct wakeup_source *ws; 334 struct wakeup_source *ws;
335 335
336 rcu_read_lock(); 336 rcu_read_lock();
337 list_for_each_entry_rcu(ws, &wakeup_sources, entry) { 337 list_for_each_entry_rcu(ws, &wakeup_sources, entry)
338 if (ws->wakeirq) 338 dev_pm_arm_wake_irq(ws->wakeirq);
339 dev_pm_arm_wake_irq(ws->wakeirq); 339
340 }
341 rcu_read_unlock(); 340 rcu_read_unlock();
342} 341}
343 342
@@ -351,10 +350,9 @@ void device_wakeup_disarm_wake_irqs(void)
351 struct wakeup_source *ws; 350 struct wakeup_source *ws;
352 351
353 rcu_read_lock(); 352 rcu_read_lock();
354 list_for_each_entry_rcu(ws, &wakeup_sources, entry) { 353 list_for_each_entry_rcu(ws, &wakeup_sources, entry)
355 if (ws->wakeirq) 354 dev_pm_disarm_wake_irq(ws->wakeirq);
356 dev_pm_disarm_wake_irq(ws->wakeirq); 355
357 }
358 rcu_read_unlock(); 356 rcu_read_unlock();
359} 357}
360 358
@@ -390,9 +388,7 @@ int device_wakeup_disable(struct device *dev)
390 return -EINVAL; 388 return -EINVAL;
391 389
392 ws = device_wakeup_detach(dev); 390 ws = device_wakeup_detach(dev);
393 if (ws) 391 wakeup_source_unregister(ws);
394 wakeup_source_unregister(ws);
395
396 return 0; 392 return 0;
397} 393}
398EXPORT_SYMBOL_GPL(device_wakeup_disable); 394EXPORT_SYMBOL_GPL(device_wakeup_disable);
diff --git a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig
index c822d72629d5..74919aa81dcb 100644
--- a/drivers/cpufreq/Kconfig
+++ b/drivers/cpufreq/Kconfig
@@ -32,7 +32,6 @@ config CPU_FREQ_BOOST_SW
32 32
33config CPU_FREQ_STAT 33config CPU_FREQ_STAT
34 bool "CPU frequency transition statistics" 34 bool "CPU frequency transition statistics"
35 default y
36 help 35 help
37 Export CPU frequency statistics information through sysfs. 36 Export CPU frequency statistics information through sysfs.
38 37
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
index 9ec033b4f2d9..be9eade147f2 100644
--- a/drivers/cpufreq/intel_pstate.c
+++ b/drivers/cpufreq/intel_pstate.c
@@ -1374,6 +1374,8 @@ MODULE_DEVICE_TABLE(x86cpu, intel_pstate_cpu_ids);
1374 1374
1375static const struct x86_cpu_id intel_pstate_cpu_oob_ids[] __initconst = { 1375static const struct x86_cpu_id intel_pstate_cpu_oob_ids[] __initconst = {
1376 ICPU(INTEL_FAM6_BROADWELL_XEON_D, core_params), 1376 ICPU(INTEL_FAM6_BROADWELL_XEON_D, core_params),
1377 ICPU(INTEL_FAM6_BROADWELL_X, core_params),
1378 ICPU(INTEL_FAM6_SKYLAKE_X, core_params),
1377 {} 1379 {}
1378}; 1380};
1379 1381