Commit 052ddf7b authored by Thomas Zimmermann's avatar Thomas Zimmermann

fbdev: Replace fb_pgprotect() with pgprot_framebuffer()

Rename the fbdev mmap helper fb_pgprotect() to pgprot_framebuffer().
The helper sets VMA page-access flags for framebuffers in device I/O
memory.

Also clean up the helper's parameters and return value. Instead of
the VMA instance, pass the individial parameters separately: existing
page-access flags, the VMAs start and end addresses and the offset
in the underlying device memory rsp file. Return the new page-access
flags. These changes align pgprot_framebuffer() with other pgprot_()
functions.

v4:
	* fix commit message (Christophe)
v3:
	* rename fb_pgprotect() to pgprot_framebuffer() (Arnd)
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> # m68k
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230922080636.26762-3-tzimmermann@suse.de
parent c205a67d
...@@ -8,17 +8,16 @@ ...@@ -8,17 +8,16 @@
#include <asm/page.h> #include <asm/page.h>
struct file; static inline pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long vm_start, unsigned long vm_end,
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long offset)
unsigned long off)
{ {
if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start)) if (efi_range_is_wc(vm_start, vm_end - vm_start))
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); return pgprot_writecombine(prot);
else else
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); return pgprot_noncached(prot);
} }
#define fb_pgprotect fb_pgprotect #define pgprot_framebuffer pgprot_framebuffer
static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n) static inline void fb_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n)
{ {
......
...@@ -5,26 +5,27 @@ ...@@ -5,26 +5,27 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/setup.h> #include <asm/setup.h>
struct file; static inline pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long vm_start, unsigned long vm_end,
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long offset)
unsigned long off)
{ {
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
#ifdef CONFIG_SUN3 #ifdef CONFIG_SUN3
pgprot_val(vma->vm_page_prot) |= SUN3_PAGE_NOCACHE; pgprot_val(prot) |= SUN3_PAGE_NOCACHE;
#else #else
if (CPU_IS_020_OR_030) if (CPU_IS_020_OR_030)
pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE030; pgprot_val(prot) |= _PAGE_NOCACHE030;
if (CPU_IS_040_OR_060) { if (CPU_IS_040_OR_060) {
pgprot_val(vma->vm_page_prot) &= _CACHEMASK040; pgprot_val(prot) &= _CACHEMASK040;
/* Use no-cache mode, serialized */ /* Use no-cache mode, serialized */
pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE_S; pgprot_val(prot) |= _PAGE_NOCACHE_S;
} }
#endif /* CONFIG_SUN3 */ #endif /* CONFIG_SUN3 */
#endif /* CONFIG_MMU */ #endif /* CONFIG_MMU */
return prot;
} }
#define fb_pgprotect fb_pgprotect #define pgprot_framebuffer pgprot_framebuffer
#include <asm-generic/fb.h> #include <asm-generic/fb.h>
......
...@@ -3,14 +3,13 @@ ...@@ -3,14 +3,13 @@
#include <asm/page.h> #include <asm/page.h>
struct file; static inline pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long vm_start, unsigned long vm_end,
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long offset)
unsigned long off)
{ {
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); return pgprot_noncached(prot);
} }
#define fb_pgprotect fb_pgprotect #define pgprot_framebuffer pgprot_framebuffer
/* /*
* MIPS doesn't define __raw_ I/O macros, so the helpers * MIPS doesn't define __raw_ I/O macros, so the helpers
......
...@@ -2,23 +2,20 @@ ...@@ -2,23 +2,20 @@
#ifndef _ASM_FB_H_ #ifndef _ASM_FB_H_
#define _ASM_FB_H_ #define _ASM_FB_H_
#include <linux/fs.h>
#include <asm/page.h> #include <asm/page.h>
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, static inline pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long off) unsigned long vm_start, unsigned long vm_end,
unsigned long offset)
{ {
/* /*
* PowerPC's implementation of phys_mem_access_prot() does * PowerPC's implementation of phys_mem_access_prot() does
* not use the file argument. Set it to NULL in preparation * not use the file argument. Set it to NULL in preparation
* of later updates to the interface. * of later updates to the interface.
*/ */
vma->vm_page_prot = phys_mem_access_prot(NULL, PHYS_PFN(off), return phys_mem_access_prot(NULL, PHYS_PFN(offset), vm_end - vm_start, prot);
vma->vm_end - vma->vm_start,
vma->vm_page_prot);
} }
#define fb_pgprotect fb_pgprotect #define pgprot_framebuffer pgprot_framebuffer
#include <asm-generic/fb.h> #include <asm-generic/fb.h>
......
...@@ -4,15 +4,18 @@ ...@@ -4,15 +4,18 @@
#include <linux/io.h> #include <linux/io.h>
#include <asm/page.h>
struct fb_info; struct fb_info;
struct file;
struct vm_area_struct;
#ifdef CONFIG_SPARC32 #ifdef CONFIG_SPARC32
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, static inline pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long off) unsigned long vm_start, unsigned long vm_end,
{ } unsigned long offset)
#define fb_pgprotect fb_pgprotect {
return prot;
}
#define pgprot_framebuffer pgprot_framebuffer
#endif #endif
int fb_is_primary_device(struct fb_info *info); int fb_is_primary_device(struct fb_info *info);
......
...@@ -2,12 +2,14 @@ ...@@ -2,12 +2,14 @@
#ifndef _ASM_X86_FB_H #ifndef _ASM_X86_FB_H
#define _ASM_X86_FB_H #define _ASM_X86_FB_H
#include <asm/page.h>
struct fb_info; struct fb_info;
struct file;
struct vm_area_struct;
void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long off); pgprot_t pgprot_framebuffer(pgprot_t prot,
#define fb_pgprotect fb_pgprotect unsigned long vm_start, unsigned long vm_end,
unsigned long offset);
#define pgprot_framebuffer pgprot_framebuffer
int fb_is_primary_device(struct fb_info *info); int fb_is_primary_device(struct fb_info *info);
#define fb_is_primary_device fb_is_primary_device #define fb_is_primary_device fb_is_primary_device
......
...@@ -13,16 +13,17 @@ ...@@ -13,16 +13,17 @@
#include <linux/vgaarb.h> #include <linux/vgaarb.h>
#include <asm/fb.h> #include <asm/fb.h>
void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long off) pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long vm_start, unsigned long vm_end,
unsigned long offset)
{ {
unsigned long prot; pgprot_val(prot) &= ~_PAGE_CACHE_MASK;
prot = pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK;
if (boot_cpu_data.x86 > 3) if (boot_cpu_data.x86 > 3)
pgprot_val(vma->vm_page_prot) = pgprot_val(prot) |= cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS);
prot | cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS);
return prot;
} }
EXPORT_SYMBOL(fb_pgprotect); EXPORT_SYMBOL(pgprot_framebuffer);
int fb_is_primary_device(struct fb_info *info) int fb_is_primary_device(struct fb_info *info)
{ {
......
...@@ -365,7 +365,8 @@ static int fb_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -365,7 +365,8 @@ static int fb_mmap(struct file *file, struct vm_area_struct *vma)
mutex_unlock(&info->mm_lock); mutex_unlock(&info->mm_lock);
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
fb_pgprotect(file, vma, start); vma->vm_page_prot = pgprot_framebuffer(vma->vm_page_prot, vma->vm_start,
vma->vm_end, start);
return vm_iomap_memory(vma, start, len); return vm_iomap_memory(vma, start, len);
} }
......
...@@ -12,14 +12,14 @@ ...@@ -12,14 +12,14 @@
#include <linux/pgtable.h> #include <linux/pgtable.h>
struct fb_info; struct fb_info;
struct file;
#ifndef fb_pgprotect #ifndef pgprot_framebuffer
#define fb_pgprotect fb_pgprotect #define pgprot_framebuffer pgprot_framebuffer
static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, static inline pgprot_t pgprot_framebuffer(pgprot_t prot,
unsigned long off) unsigned long vm_start, unsigned long vm_end,
unsigned long offset)
{ {
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); return pgprot_writecombine(prot);
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment