Greg Kroah-Hartman | b244131 | 2017-11-01 15:07:57 +0100 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
Jeremy Fitzhardinge | 0e91398 | 2008-05-26 23:31:27 +0100 | [diff] [blame] | 2 | #include <linux/types.h> |
Thomas Gleixner | 4ffee52 | 2015-03-25 13:09:16 +0100 | [diff] [blame] | 3 | #include <linux/tick.h> |
Jeremy Fitzhardinge | 0e91398 | 2008-05-26 23:31:27 +0100 | [diff] [blame] | 4 | |
Andrew Morton | facca61 | 2015-12-29 14:54:13 -0800 | [diff] [blame] | 5 | #include <xen/xen.h> |
Jeremy Fitzhardinge | 0e91398 | 2008-05-26 23:31:27 +0100 | [diff] [blame] | 6 | #include <xen/interface/xen.h> |
7 | #include <xen/grant_table.h> | ||||
8 | #include <xen/events.h> | ||||
9 | |||||
10 | #include <asm/xen/hypercall.h> | ||||
11 | #include <asm/xen/page.h> | ||||
Ingo Molnar | 99d0000 | 2009-01-23 11:09:15 +0100 | [diff] [blame] | 12 | #include <asm/fixmap.h> |
Jeremy Fitzhardinge | 0e91398 | 2008-05-26 23:31:27 +0100 | [diff] [blame] | 13 | |
14 | #include "xen-ops.h" | ||||
15 | #include "mmu.h" | ||||
Boris Ostrovsky | 65d0cf0 | 2015-08-10 16:34:34 -0400 | [diff] [blame] | 16 | #include "pmu.h" |
Jeremy Fitzhardinge | 0e91398 | 2008-05-26 23:31:27 +0100 | [diff] [blame] | 17 | |
David Vrabel | aa8532c | 2014-05-08 11:09:23 +0100 | [diff] [blame] | 18 | void xen_arch_pre_suspend(void) |
19 | { | ||||
Joao Martins | 2229f70 | 2017-11-08 17:19:57 +0000 | [diff] [blame] | 20 | xen_save_time_memory_area(); |
21 | |||||
Boris Ostrovsky | 65d0cf0 | 2015-08-10 16:34:34 -0400 | [diff] [blame] | 22 | if (xen_pv_domain()) |
23 | xen_pv_pre_suspend(); | ||||
David Vrabel | aa8532c | 2014-05-08 11:09:23 +0100 | [diff] [blame] | 24 | } |
25 | |||||
26 | void xen_arch_post_suspend(int cancelled) | ||||
27 | { | ||||
Boris Ostrovsky | 65d0cf0 | 2015-08-10 16:34:34 -0400 | [diff] [blame] | 28 | if (xen_pv_domain()) |
29 | xen_pv_post_suspend(cancelled); | ||||
30 | else | ||||
31 | xen_hvm_post_suspend(cancelled); | ||||
Joao Martins | 2229f70 | 2017-11-08 17:19:57 +0000 | [diff] [blame] | 32 | |
33 | xen_restore_time_memory_area(); | ||||
Jeremy Fitzhardinge | 0e91398 | 2008-05-26 23:31:27 +0100 | [diff] [blame] | 34 | } |
35 | |||||
Ian Campbell | f6eafe3 | 2009-11-25 14:12:08 +0000 | [diff] [blame] | 36 | static void xen_vcpu_notify_restore(void *data) |
37 | { | ||||
Ian Campbell | f6eafe3 | 2009-11-25 14:12:08 +0000 | [diff] [blame] | 38 | /* Boot processor notified via generic timekeeping_resume() */ |
Thomas Gleixner | 4ffee52 | 2015-03-25 13:09:16 +0100 | [diff] [blame] | 39 | if (smp_processor_id() == 0) |
Ian Campbell | f6eafe3 | 2009-11-25 14:12:08 +0000 | [diff] [blame] | 40 | return; |
41 | |||||
Thomas Gleixner | f46481d | 2015-03-25 13:11:04 +0100 | [diff] [blame] | 42 | tick_resume_local(); |
Ian Campbell | f6eafe3 | 2009-11-25 14:12:08 +0000 | [diff] [blame] | 43 | } |
44 | |||||
Boris Ostrovsky | 2b953a5 | 2015-04-28 18:46:20 -0400 | [diff] [blame] | 45 | static void xen_vcpu_notify_suspend(void *data) |
46 | { | ||||
47 | tick_suspend_local(); | ||||
48 | } | ||||
49 | |||||
Isaku Yamahata | ad55db9 | 2008-07-08 15:06:32 -0700 | [diff] [blame] | 50 | void xen_arch_resume(void) |
51 | { | ||||
Boris Ostrovsky | de0afc9 | 2015-12-02 12:10:48 -0500 | [diff] [blame] | 52 | int cpu; |
53 | |||||
Thomas Gleixner | 4ffee52 | 2015-03-25 13:09:16 +0100 | [diff] [blame] | 54 | on_each_cpu(xen_vcpu_notify_restore, NULL, 1); |
Boris Ostrovsky | de0afc9 | 2015-12-02 12:10:48 -0500 | [diff] [blame] | 55 | |
56 | for_each_online_cpu(cpu) | ||||
57 | xen_pmu_init(cpu); | ||||
Isaku Yamahata | ad55db9 | 2008-07-08 15:06:32 -0700 | [diff] [blame] | 58 | } |
Boris Ostrovsky | 2b953a5 | 2015-04-28 18:46:20 -0400 | [diff] [blame] | 59 | |
60 | void xen_arch_suspend(void) | ||||
61 | { | ||||
Boris Ostrovsky | de0afc9 | 2015-12-02 12:10:48 -0500 | [diff] [blame] | 62 | int cpu; |
63 | |||||
64 | for_each_online_cpu(cpu) | ||||
65 | xen_pmu_finish(cpu); | ||||
66 | |||||
Boris Ostrovsky | 2b953a5 | 2015-04-28 18:46:20 -0400 | [diff] [blame] | 67 | on_each_cpu(xen_vcpu_notify_suspend, NULL, 1); |
68 | } |