git: d9a2c2e250ae - main - linuxkpi: Add `memcpy_{from,to}_page()`

From: Jean-Sébastien Pédron <dumbbell_at_FreeBSD.org>
Date: Sun, 13 Apr 2025 10:00:56 UTC
The branch main has been updated by dumbbell:

URL: https://cgit.FreeBSD.org/src/commit/?id=d9a2c2e250ae561fc2ff6c12dda53f70fb8c76b6

commit d9a2c2e250ae561fc2ff6c12dda53f70fb8c76b6
Author:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
AuthorDate: 2025-02-28 23:25:29 +0000
Commit:     Jean-Sébastien Pédron <dumbbell@FreeBSD.org>
CommitDate: 2025-04-13 09:50:42 +0000

    linuxkpi: Add `memcpy_{from,to}_page()`
    
    The i915 DRM driver started to use it in Linux 6.8.
    
    Reviewed by:    bz
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D49384
---
 sys/compat/linuxkpi/common/include/linux/highmem.h | 30 ++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/sys/compat/linuxkpi/common/include/linux/highmem.h b/sys/compat/linuxkpi/common/include/linux/highmem.h
index b8874481f9c6..8b5255c1869c 100644
--- a/sys/compat/linuxkpi/common/include/linux/highmem.h
+++ b/sys/compat/linuxkpi/common/include/linux/highmem.h
@@ -139,4 +139,34 @@ kunmap_local(void *addr)
 	kunmap_atomic(addr);
 }
 
+static inline void
+memcpy_from_page(char *to, struct page *page, size_t offset, size_t len)
+{
+	char *from;
+
+	KASSERT(offset + len <= PAGE_SIZE,
+	    ("%s: memcpy from page %p to address %p: "
+	     "offset+len (%zu+%zu) would go beyond page end",
+	     __func__, page, to, offset, len));
+
+	from = kmap_local_page(page);
+	memcpy(to, from + offset, len);
+	kunmap_local(from);
+}
+
+static inline void
+memcpy_to_page(struct page *page, size_t offset, const char *from, size_t len)
+{
+	char *to;
+
+	KASSERT(offset + len <= PAGE_SIZE,
+	    ("%s: memcpy from address %p to page %p: "
+	     "offset+len (%zu+%zu) would go beyond page end",
+	     __func__, from, page, offset, len));
+
+	to = kmap_local_page(page);
+	memcpy(to + offset, from, len);
+	kunmap_local(to);
+}
+
 #endif	/* _LINUXKPI_LINUX_HIGHMEM_H_ */