Browse Source

ubwcp: Replace add_memory with memremap_pages

Replace add_memory with memremap_pages as that will ensure that
ULA PA pages are not added to buddy.

Change-Id: I5dfb9dfeca5cad62b031b45c5ab11f1b46569709
Signed-off-by: Liam Mark <[email protected]>
Signed-off-by: Linux Image Build Automation <[email protected]>
Liam Mark 2 years ago
parent
commit
34e2be74ab
2 changed files with 30 additions and 40 deletions
  1. 26 36
      ubwcp/ubwcp_main.c
  2. 4 4
      ubwcp/ubwcp_trace.h

+ 26 - 36
ubwcp/ubwcp_main.c

@@ -27,6 +27,7 @@
 #include <linux/clk.h>
 #include <linux/iommu.h>
 #include <linux/set_memory.h>
+#include <linux/range.h>
 
 MODULE_IMPORT_NS(DMA_BUF);
 
@@ -165,6 +166,8 @@ struct ubwcp_driver {
 	struct mutex hw_range_ck_lock; /* range ck */
 	struct list_head err_handler_list; /* error handler list */
 	spinlock_t err_handler_list_lock;  /* err_handler_list lock */
+
+	struct dev_pagemap pgmap;
 };
 
 struct ubwcp_buf {
@@ -432,23 +435,29 @@ EXPORT_SYMBOL(ubwcp_get_hw_version);
 
 static int add_ula_pa_memory(struct ubwcp_driver *ubwcp)
 {
-	int ret;
+	int ret = 0;
 	int nid;
+	void *ptr;
 
 	nid = memory_add_physaddr_to_nid(ubwcp->ula_pool_base);
-	DBG("calling add_memory()...");
-	trace_ubwcp_add_memory_start(ubwcp->ula_pool_size);
-	ret = add_memory(nid, ubwcp->ula_pool_base, ubwcp->ula_pool_size, MHP_NONE);
-	trace_ubwcp_add_memory_end(ubwcp->ula_pool_size);
-
-	if (ret) {
-		ERR("add_memory() failed st:0x%lx sz:0x%lx err: %d",
+	DBG("calling memremap_pages()...");
+	ubwcp->pgmap.type = MEMORY_DEVICE_GENERIC;
+	ubwcp->pgmap.nr_range = 1;
+	ubwcp->pgmap.range.start = ubwcp->ula_pool_base;
+	ubwcp->pgmap.range.end = ubwcp->ula_pool_base + ubwcp->ula_pool_size - 1;
+	trace_ubwcp_memremap_pages_start(ubwcp->ula_pool_size);
+	ptr = memremap_pages(&ubwcp->pgmap, nid);
+	trace_ubwcp_memremap_pages_end(ubwcp->ula_pool_size);
+
+	if (IS_ERR(ptr)) {
+		ret = IS_ERR(ptr);
+		ERR("memremap_pages() failed st:0x%lx sz:0x%lx err: %d",
 			ubwcp->ula_pool_base,
 			ubwcp->ula_pool_size,
 			ret);
 		/* Fix to put driver in invalid state */
 	} else {
-		DBG("add_memory() ula_pool_base:0x%llx, size:0x%zx, kernel addr:0x%p",
+		DBG("memremap_pages() ula_pool_base:0x%llx, size:0x%zx, kernel addr:0x%p",
 			ubwcp->ula_pool_base,
 			ubwcp->ula_pool_size,
 			page_to_virt(pfn_to_page(PFN_DOWN(ubwcp->ula_pool_base))));
@@ -541,20 +550,10 @@ static int dec_num_non_lin_buffers(struct ubwcp_driver *ubwcp)
 				trace_ubwcp_offline_sync_end(ubwcp->ula_pool_size);
 				DBG("Cancel memory offlining");
 
-				DBG("Calling offline_and_remove_memory() for ULA PA pool");
-				trace_ubwcp_offline_and_remove_memory_start(ubwcp->ula_pool_size);
-				ret = offline_and_remove_memory(ubwcp->ula_pool_base,
-						ubwcp->ula_pool_size);
-				trace_ubwcp_offline_and_remove_memory_end(ubwcp->ula_pool_size);
-				if (ret) {
-					ERR("remove memory failed st:0x%lx sz:0x%lx err: %d",
-						ubwcp->ula_pool_base,
-						ubwcp->ula_pool_size, ret);
-					goto err_remove_mem;
-				} else {
-					DBG("DONE: calling remove memory for ULA PA pool");
-				}
-
+				DBG("Calling memunmap_pages() for ULA PA pool");
+				trace_ubwcp_memunmap_pages_start(ubwcp->ula_pool_size);
+				memunmap_pages(&ubwcp->pgmap);
+				trace_ubwcp_memunmap_pages_end(ubwcp->ula_pool_size);
 				ret = add_ula_pa_memory(ubwcp);
 				if (ret) {
 					ERR("Bad state: failed to add back memory");
@@ -581,20 +580,11 @@ static int dec_num_non_lin_buffers(struct ubwcp_driver *ubwcp)
 			sync_offset += sync_size;
 		}
 		trace_ubwcp_offline_sync_end(ubwcp->ula_pool_size);
+		DBG("Calling memunmap_pages() for ULA PA pool");
+		trace_ubwcp_memunmap_pages_start(ubwcp->ula_pool_size);
+		memunmap_pages(&ubwcp->pgmap);
+		trace_ubwcp_memunmap_pages_end(ubwcp->ula_pool_size);
 
-		DBG("Calling offline_and_remove_memory() for ULA PA pool");
-		trace_ubwcp_offline_and_remove_memory_start(ubwcp->ula_pool_size);
-		ret = offline_and_remove_memory(ubwcp->ula_pool_base, ubwcp->ula_pool_size);
-		trace_ubwcp_offline_and_remove_memory_end(ubwcp->ula_pool_size);
-		if (ret) {
-			ERR("offline_and_remove_memory failed st:0x%lx sz:0x%lx err: %d",
-				ubwcp->ula_pool_base,
-				ubwcp->ula_pool_size, ret);
-			/* Fix to put driver in invalid state */
-			goto err_remove_mem;
-		} else {
-			DBG("DONE: calling offline_and_remove_memory() for ULA PA pool");
-		}
 		DBG("Calling power OFF ...");
 		ubwcp_power(ubwcp, false);
 		ubwcp->mem_online = false;

+ 4 - 4
ubwcp/ubwcp_trace.h

@@ -103,14 +103,14 @@ DEFINE_EVENT(ubwcp_dmabuf_event, ubwcp_init_buffer_end,
 	TP_ARGS(dbuf_addr)
 );
 
-DEFINE_EVENT(ubwcp_size_event, ubwcp_add_memory_start,
+DEFINE_EVENT(ubwcp_size_event, ubwcp_memremap_pages_start,
 
 	TP_PROTO(size_t size),
 
 	TP_ARGS(size)
 );
 
-DEFINE_EVENT(ubwcp_size_event, ubwcp_add_memory_end,
+DEFINE_EVENT(ubwcp_size_event, ubwcp_memremap_pages_end,
 
 	TP_PROTO(size_t size),
 
@@ -215,14 +215,14 @@ DEFINE_EVENT(ubwcp_size_event, ubwcp_hw_flush_end,
 	TP_ARGS(size)
 );
 
-DEFINE_EVENT(ubwcp_size_event, ubwcp_offline_and_remove_memory_start,
+DEFINE_EVENT(ubwcp_size_event, ubwcp_memunmap_pages_start,
 
 	TP_PROTO(size_t size),
 
 	TP_ARGS(size)
 );
 
-DEFINE_EVENT(ubwcp_size_event, ubwcp_offline_and_remove_memory_end,
+DEFINE_EVENT(ubwcp_size_event, ubwcp_memunmap_pages_end,
 
 	TP_PROTO(size_t size),