|
@@ -41,6 +41,8 @@
|
|
|
#include <linux/memory.h>
|
|
|
#include <asm/plpar_wrappers.h>
|
|
|
|
|
|
+#include "pseries.h"
|
|
|
+
|
|
|
#define CMM_DRIVER_VERSION "1.0.0"
|
|
|
#define CMM_DEFAULT_DELAY 1
|
|
|
#define CMM_HOTPLUG_DELAY 5
|
|
@@ -109,6 +111,38 @@ static int hotplug_occurred; /* protected by the hotplug mutex */
|
|
|
|
|
|
static struct task_struct *cmm_thread_ptr;
|
|
|
|
|
|
+static long plpar_page_set_loaned(unsigned long vpa)
|
|
|
+{
|
|
|
+ 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 long plpar_page_set_active(unsigned long vpa)
|
|
|
+{
|
|
|
+ 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;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* cmm_alloc_pages - Allocate pages and mark them as loaned
|
|
|
* @nr: number of pages to allocate
|