diff options
| -rw-r--r-- | arch/powerpc/platforms/pseries/plpar_wrappers.h | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/platforms/pseries/plpar_wrappers.h index a437267c6bf8..d967c1893ab5 100644 --- a/arch/powerpc/platforms/pseries/plpar_wrappers.h +++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _PSERIES_PLPAR_WRAPPERS_H | 2 | #define _PSERIES_PLPAR_WRAPPERS_H |
| 3 | 3 | ||
| 4 | #include <asm/hvcall.h> | 4 | #include <asm/hvcall.h> |
| 5 | #include <asm/page.h> | ||
| 5 | 6 | ||
| 6 | static inline long poll_pending(void) | 7 | static inline long poll_pending(void) |
| 7 | { | 8 | { |
| @@ -44,12 +45,34 @@ static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa) | |||
| 44 | 45 | ||
| 45 | static inline long plpar_page_set_loaned(unsigned long vpa) | 46 | static inline long plpar_page_set_loaned(unsigned long vpa) |
| 46 | { | 47 | { |
| 47 | return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa, 0); | 48 | unsigned long cmo_page_sz = cmo_get_page_size(); |
| 49 | long rc = 0; | ||
| 50 | int i; | ||
| 51 | |||
| 52 | for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz) | ||
| 53 | rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0); | ||
| 54 | |||
| 55 | for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz) | ||
| 56 | plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, | ||
| 57 | vpa + i - cmo_page_sz, 0); | ||
| 58 | |||
| 59 | return rc; | ||
| 48 | } | 60 | } |
| 49 | 61 | ||
| 50 | static inline long plpar_page_set_active(unsigned long vpa) | 62 | static inline long plpar_page_set_active(unsigned long vpa) |
| 51 | { | 63 | { |
| 52 | return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa, 0); | 64 | unsigned long cmo_page_sz = cmo_get_page_size(); |
| 65 | long rc = 0; | ||
| 66 | int i; | ||
| 67 | |||
| 68 | for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz) | ||
| 69 | rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0); | ||
| 70 | |||
| 71 | for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz) | ||
| 72 | plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, | ||
| 73 | vpa + i - cmo_page_sz, 0); | ||
| 74 | |||
| 75 | return rc; | ||
| 53 | } | 76 | } |
| 54 | 77 | ||
| 55 | extern void vpa_init(int cpu); | 78 | extern void vpa_init(int cpu); |
