.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* |
---|
2 | | - * This program is free software; you can redistribute it and/or modify |
---|
3 | | - * it under the terms of the GNU General Public License, version 2, as |
---|
4 | | - * published by the Free Software Foundation. |
---|
5 | | - * |
---|
6 | | - * This program is distributed in the hope that it will be useful, |
---|
7 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
8 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
9 | | - * GNU General Public License for more details. |
---|
10 | | - * |
---|
11 | | - * You should have received a copy of the GNU General Public License |
---|
12 | | - * along with this program; if not, write to the Free Software |
---|
13 | | - * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
14 | 3 | * |
---|
15 | 4 | * Copyright 2011 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com> |
---|
16 | 5 | * |
---|
.. | .. |
---|
64 | 53 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) |
---|
65 | 54 | |
---|
66 | 55 | /* Save host PMU registers */ |
---|
67 | | -BEGIN_FTR_SECTION |
---|
68 | | - /* Work around P8 PMAE bug */ |
---|
69 | | - li r3, -1 |
---|
70 | | - clrrdi r3, r3, 10 |
---|
71 | | - mfspr r8, SPRN_MMCR2 |
---|
72 | | - mtspr SPRN_MMCR2, r3 /* freeze all counters using MMCR2 */ |
---|
73 | | - isync |
---|
74 | | -END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
---|
75 | | - li r3, 1 |
---|
76 | | - sldi r3, r3, 31 /* MMCR0_FC (freeze counters) bit */ |
---|
77 | | - mfspr r7, SPRN_MMCR0 /* save MMCR0 */ |
---|
78 | | - mtspr SPRN_MMCR0, r3 /* freeze all counters, disable interrupts */ |
---|
79 | | - mfspr r6, SPRN_MMCRA |
---|
80 | | - /* Clear MMCRA in order to disable SDAR updates */ |
---|
81 | | - li r5, 0 |
---|
82 | | - mtspr SPRN_MMCRA, r5 |
---|
83 | | - isync |
---|
84 | | - lbz r5, PACA_PMCINUSE(r13) /* is the host using the PMU? */ |
---|
85 | | - cmpwi r5, 0 |
---|
86 | | - beq 31f /* skip if not */ |
---|
87 | | - mfspr r5, SPRN_MMCR1 |
---|
88 | | - mfspr r9, SPRN_SIAR |
---|
89 | | - mfspr r10, SPRN_SDAR |
---|
90 | | - std r7, HSTATE_MMCR0(r13) |
---|
91 | | - std r5, HSTATE_MMCR1(r13) |
---|
92 | | - std r6, HSTATE_MMCRA(r13) |
---|
93 | | - std r9, HSTATE_SIAR(r13) |
---|
94 | | - std r10, HSTATE_SDAR(r13) |
---|
95 | | -BEGIN_FTR_SECTION |
---|
96 | | - mfspr r9, SPRN_SIER |
---|
97 | | - std r8, HSTATE_MMCR2(r13) |
---|
98 | | - std r9, HSTATE_SIER(r13) |
---|
99 | | -END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
---|
100 | | - mfspr r3, SPRN_PMC1 |
---|
101 | | - mfspr r5, SPRN_PMC2 |
---|
102 | | - mfspr r6, SPRN_PMC3 |
---|
103 | | - mfspr r7, SPRN_PMC4 |
---|
104 | | - mfspr r8, SPRN_PMC5 |
---|
105 | | - mfspr r9, SPRN_PMC6 |
---|
106 | | - stw r3, HSTATE_PMC1(r13) |
---|
107 | | - stw r5, HSTATE_PMC2(r13) |
---|
108 | | - stw r6, HSTATE_PMC3(r13) |
---|
109 | | - stw r7, HSTATE_PMC4(r13) |
---|
110 | | - stw r8, HSTATE_PMC5(r13) |
---|
111 | | - stw r9, HSTATE_PMC6(r13) |
---|
112 | | -31: |
---|
| 56 | + bl kvmhv_save_host_pmu |
---|
113 | 57 | |
---|
114 | 58 | /* |
---|
115 | 59 | * Put whatever is in the decrementer into the |
---|
116 | 60 | * hypervisor decrementer. |
---|
| 61 | + * Because of a hardware deviation in P8 and P9, |
---|
| 62 | + * we need to set LPCR[HDICE] before writing HDEC. |
---|
117 | 63 | */ |
---|
118 | | -BEGIN_FTR_SECTION |
---|
119 | 64 | ld r5, HSTATE_KVM_VCORE(r13) |
---|
120 | 65 | ld r6, VCORE_KVM(r5) |
---|
121 | 66 | ld r9, KVM_HOST_LPCR(r6) |
---|
122 | | - andis. r9, r9, LPCR_LD@h |
---|
123 | | -END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
---|
| 67 | + ori r8, r9, LPCR_HDICE |
---|
| 68 | + mtspr SPRN_LPCR, r8 |
---|
| 69 | + isync |
---|
| 70 | + andis. r0, r9, LPCR_LD@h |
---|
124 | 71 | mfspr r8,SPRN_DEC |
---|
125 | 72 | mftb r7 |
---|
126 | 73 | BEGIN_FTR_SECTION |
---|
.. | .. |
---|
161 | 108 | ld r0, PPC_LR_STKOFF(r1) |
---|
162 | 109 | mtlr r0 |
---|
163 | 110 | blr |
---|
| 111 | + |
---|
| 112 | +_GLOBAL(kvmhv_save_host_pmu) |
---|
| 113 | +BEGIN_FTR_SECTION |
---|
| 114 | + /* Work around P8 PMAE bug */ |
---|
| 115 | + li r3, -1 |
---|
| 116 | + clrrdi r3, r3, 10 |
---|
| 117 | + mfspr r8, SPRN_MMCR2 |
---|
| 118 | + mtspr SPRN_MMCR2, r3 /* freeze all counters using MMCR2 */ |
---|
| 119 | + isync |
---|
| 120 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
---|
| 121 | + li r3, 1 |
---|
| 122 | + sldi r3, r3, 31 /* MMCR0_FC (freeze counters) bit */ |
---|
| 123 | + mfspr r7, SPRN_MMCR0 /* save MMCR0 */ |
---|
| 124 | + mtspr SPRN_MMCR0, r3 /* freeze all counters, disable interrupts */ |
---|
| 125 | + mfspr r6, SPRN_MMCRA |
---|
| 126 | + /* Clear MMCRA in order to disable SDAR updates */ |
---|
| 127 | + li r5, 0 |
---|
| 128 | + mtspr SPRN_MMCRA, r5 |
---|
| 129 | + isync |
---|
| 130 | + lbz r5, PACA_PMCINUSE(r13) /* is the host using the PMU? */ |
---|
| 131 | + cmpwi r5, 0 |
---|
| 132 | + beq 31f /* skip if not */ |
---|
| 133 | + mfspr r5, SPRN_MMCR1 |
---|
| 134 | + mfspr r9, SPRN_SIAR |
---|
| 135 | + mfspr r10, SPRN_SDAR |
---|
| 136 | + std r7, HSTATE_MMCR0(r13) |
---|
| 137 | + std r5, HSTATE_MMCR1(r13) |
---|
| 138 | + std r6, HSTATE_MMCRA(r13) |
---|
| 139 | + std r9, HSTATE_SIAR(r13) |
---|
| 140 | + std r10, HSTATE_SDAR(r13) |
---|
| 141 | +BEGIN_FTR_SECTION |
---|
| 142 | + mfspr r9, SPRN_SIER |
---|
| 143 | + std r8, HSTATE_MMCR2(r13) |
---|
| 144 | + std r9, HSTATE_SIER(r13) |
---|
| 145 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
---|
| 146 | +BEGIN_FTR_SECTION |
---|
| 147 | + mfspr r5, SPRN_MMCR3 |
---|
| 148 | + mfspr r6, SPRN_SIER2 |
---|
| 149 | + mfspr r7, SPRN_SIER3 |
---|
| 150 | + std r5, HSTATE_MMCR3(r13) |
---|
| 151 | + std r6, HSTATE_SIER2(r13) |
---|
| 152 | + std r7, HSTATE_SIER3(r13) |
---|
| 153 | +END_FTR_SECTION_IFSET(CPU_FTR_ARCH_31) |
---|
| 154 | + mfspr r3, SPRN_PMC1 |
---|
| 155 | + mfspr r5, SPRN_PMC2 |
---|
| 156 | + mfspr r6, SPRN_PMC3 |
---|
| 157 | + mfspr r7, SPRN_PMC4 |
---|
| 158 | + mfspr r8, SPRN_PMC5 |
---|
| 159 | + mfspr r9, SPRN_PMC6 |
---|
| 160 | + stw r3, HSTATE_PMC1(r13) |
---|
| 161 | + stw r5, HSTATE_PMC2(r13) |
---|
| 162 | + stw r6, HSTATE_PMC3(r13) |
---|
| 163 | + stw r7, HSTATE_PMC4(r13) |
---|
| 164 | + stw r8, HSTATE_PMC5(r13) |
---|
| 165 | + stw r9, HSTATE_PMC6(r13) |
---|
| 166 | +31: blr |
---|