|
@@ -2,6 +2,7 @@
|
|
|
#define _PSERIES_PLPAR_WRAPPERS_H
|
|
|
|
|
|
#include <asm/hvcall.h>
|
|
|
+#include <asm/page.h>
|
|
|
|
|
|
static inline long poll_pending(void)
|
|
|
{
|
|
@@ -44,12 +45,34 @@ static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa)
|
|
|
|
|
|
static inline long plpar_page_set_loaned(unsigned long vpa)
|
|
|
{
|
|
|
- return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa, 0);
|
|
|
+ unsigned long cmo_page_sz = cmo_get_page_size();
|
|
|
+ long rc = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
|
|
|
+ rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0);
|
|
|
+
|
|
|
+ for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
|
|
|
+ plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE,
|
|
|
+ vpa + i - cmo_page_sz, 0);
|
|
|
+
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
static inline long plpar_page_set_active(unsigned long vpa)
|
|
|
{
|
|
|
- return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa, 0);
|
|
|
+ unsigned long cmo_page_sz = cmo_get_page_size();
|
|
|
+ long rc = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz)
|
|
|
+ rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0);
|
|
|
+
|
|
|
+ for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz)
|
|
|
+ plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED,
|
|
|
+ vpa + i - cmo_page_sz, 0);
|
|
|
+
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
extern void vpa_init(int cpu);
|