Message ID | 20230911131033.27745-1-tzimmermann@suse.de (mailing list archive) |
---|---|
Headers | show |
Series | ppc, fbdev: Clean up fbdev mmap helper | expand |
Le 11/09/2023 à 15:08, Thomas Zimmermann a écrit : > 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. > > v3: > * rename fb_pgprotect() to pgprot_framebuffer() (Arnd) Then maybe the Subject: needs to be changed as well. > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > --- > arch/ia64/include/asm/fb.h | 15 +++++++-------- > arch/m68k/include/asm/fb.h | 19 ++++++++++--------- > arch/mips/include/asm/fb.h | 11 +++++------ > arch/powerpc/include/asm/fb.h | 13 +++++-------- > arch/sparc/include/asm/fb.h | 15 +++++++++------ > arch/x86/include/asm/fb.h | 10 ++++++---- > arch/x86/video/fbdev.c | 15 ++++++++------- > drivers/video/fbdev/core/fb_chrdev.c | 3 ++- > include/asm-generic/fb.h | 12 ++++++------ > 9 files changed, 58 insertions(+), 55 deletions(-) > > diff --git a/arch/ia64/include/asm/fb.h b/arch/ia64/include/asm/fb.h > index 1717b26fd423f..7fce0d5423590 100644 > --- a/arch/ia64/include/asm/fb.h > +++ b/arch/ia64/include/asm/fb.h > @@ -8,17 +8,16 @@ > > #include <asm/page.h> > > -struct file; > - > -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, > - unsigned long off) > +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, > + unsigned long vm_start, unsigned long vm_end, > + unsigned long offset) > { > - if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start)) > - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); > + if (efi_range_is_wc(vm_start, vm_end - vm_start)) > + return pgprot_writecombine(prot); > 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) > { > diff --git a/arch/m68k/include/asm/fb.h b/arch/m68k/include/asm/fb.h > index 24273fc7ad917..9941b7434b696 100644 > --- a/arch/m68k/include/asm/fb.h > +++ b/arch/m68k/include/asm/fb.h > @@ -5,26 +5,27 @@ > #include <asm/page.h> > #include <asm/setup.h> > > -struct file; > - > -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, > - unsigned long off) > +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, > + unsigned long vm_start, unsigned long vm_end, > + unsigned long offset) > { > #ifdef CONFIG_MMU > #ifdef CONFIG_SUN3 > - pgprot_val(vma->vm_page_prot) |= SUN3_PAGE_NOCACHE; > + pgprot_val(prot) |= SUN3_PAGE_NOCACHE; > #else > 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) { > - pgprot_val(vma->vm_page_prot) &= _CACHEMASK040; > + pgprot_val(prot) &= _CACHEMASK040; > /* 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_MMU */ > + > + return prot; > } > -#define fb_pgprotect fb_pgprotect > +#define pgprot_framebuffer pgprot_framebuffer > > #include <asm-generic/fb.h> > > diff --git a/arch/mips/include/asm/fb.h b/arch/mips/include/asm/fb.h > index 18b7226403bad..d98d6681d64ec 100644 > --- a/arch/mips/include/asm/fb.h > +++ b/arch/mips/include/asm/fb.h > @@ -3,14 +3,13 @@ > > #include <asm/page.h> > > -struct file; > - > -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, > - unsigned long off) > +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, > + unsigned long vm_start, unsigned long vm_end, > + unsigned long offset) > { > - 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 > diff --git a/arch/powerpc/include/asm/fb.h b/arch/powerpc/include/asm/fb.h > index 61e3b8806db69..3cecf14d51de8 100644 > --- a/arch/powerpc/include/asm/fb.h > +++ b/arch/powerpc/include/asm/fb.h > @@ -2,23 +2,20 @@ > #ifndef _ASM_FB_H_ > #define _ASM_FB_H_ > > -#include <linux/fs.h> > - > #include <asm/page.h> > > -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, > - unsigned long off) > +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, > + unsigned long vm_start, unsigned long vm_end, > + unsigned long offset) > { > /* > * PowerPC's implementation of phys_mem_access_prot() does > * not use the file argument. Set it to NULL in preparation > * of later updates to the interface. > */ > - vma->vm_page_prot = phys_mem_access_prot(NULL, PHYS_PFN(off), > - vma->vm_end - vma->vm_start, > - vma->vm_page_prot); > + return phys_mem_access_prot(NULL, PHYS_PFN(offset), vm_end - vm_start, prot); > } > -#define fb_pgprotect fb_pgprotect > +#define pgprot_framebuffer pgprot_framebuffer > > #include <asm-generic/fb.h> > > diff --git a/arch/sparc/include/asm/fb.h b/arch/sparc/include/asm/fb.h > index 572ecd3e1cc48..24440c0fda490 100644 > --- a/arch/sparc/include/asm/fb.h > +++ b/arch/sparc/include/asm/fb.h > @@ -4,15 +4,18 @@ > > #include <linux/io.h> > > +#include <asm/page.h> > + > struct fb_info; > -struct file; > -struct vm_area_struct; > > #ifdef CONFIG_SPARC32 > -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, > - unsigned long off) > -{ } > -#define fb_pgprotect fb_pgprotect > +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, > + unsigned long vm_start, unsigned long vm_end, > + unsigned long offset) > +{ > + return prot; > +} > +#define pgprot_framebuffer pgprot_framebuffer > #endif > > int fb_is_primary_device(struct fb_info *info); > diff --git a/arch/x86/include/asm/fb.h b/arch/x86/include/asm/fb.h > index 23873da8fb77c..c3b9582de7efd 100644 > --- a/arch/x86/include/asm/fb.h > +++ b/arch/x86/include/asm/fb.h > @@ -2,12 +2,14 @@ > #ifndef _ASM_X86_FB_H > #define _ASM_X86_FB_H > > +#include <asm/page.h> > + > struct fb_info; > -struct file; > -struct vm_area_struct; > > -void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long off); > -#define fb_pgprotect fb_pgprotect > +pgprot_t pgprot_framebuffer(pgprot_t prot, > + 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); > #define fb_is_primary_device fb_is_primary_device > diff --git a/arch/x86/video/fbdev.c b/arch/x86/video/fbdev.c > index 49a0452402e97..1dd6528cc947c 100644 > --- a/arch/x86/video/fbdev.c > +++ b/arch/x86/video/fbdev.c > @@ -13,16 +13,17 @@ > #include <linux/vgaarb.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; > - > - prot = pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK; > + pgprot_val(prot) &= ~_PAGE_CACHE_MASK; > if (boot_cpu_data.x86 > 3) > - pgprot_val(vma->vm_page_prot) = > - prot | cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS); > + pgprot_val(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) > { > diff --git a/drivers/video/fbdev/core/fb_chrdev.c b/drivers/video/fbdev/core/fb_chrdev.c > index eadb81f53a821..32a7315b4b6dd 100644 > --- a/drivers/video/fbdev/core/fb_chrdev.c > +++ b/drivers/video/fbdev/core/fb_chrdev.c > @@ -365,7 +365,8 @@ static int fb_mmap(struct file *file, struct vm_area_struct *vma) > mutex_unlock(&info->mm_lock); > > 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); > } > diff --git a/include/asm-generic/fb.h b/include/asm-generic/fb.h > index bb7ee9c70e603..6ccabb400aa66 100644 > --- a/include/asm-generic/fb.h > +++ b/include/asm-generic/fb.h > @@ -12,14 +12,14 @@ > #include <linux/pgtable.h> > > struct fb_info; > -struct file; > > -#ifndef fb_pgprotect > -#define fb_pgprotect fb_pgprotect > -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, > - unsigned long off) > +#ifndef pgprot_framebuffer > +#define pgprot_framebuffer pgprot_framebuffer > +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, > + 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 >
Am 11.09.23 um 16:19 schrieb Christophe Leroy: > > Le 11/09/2023 à 15:08, Thomas Zimmermann a écrit : >> 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. >> >> v3: >> * rename fb_pgprotect() to pgprot_framebuffer() (Arnd) > > Then maybe the Subject: needs to be changed as well. Arghh. Sorry. > >> >> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> >> --- >> arch/ia64/include/asm/fb.h | 15 +++++++-------- >> arch/m68k/include/asm/fb.h | 19 ++++++++++--------- >> arch/mips/include/asm/fb.h | 11 +++++------ >> arch/powerpc/include/asm/fb.h | 13 +++++-------- >> arch/sparc/include/asm/fb.h | 15 +++++++++------ >> arch/x86/include/asm/fb.h | 10 ++++++---- >> arch/x86/video/fbdev.c | 15 ++++++++------- >> drivers/video/fbdev/core/fb_chrdev.c | 3 ++- >> include/asm-generic/fb.h | 12 ++++++------ >> 9 files changed, 58 insertions(+), 55 deletions(-) >> >> diff --git a/arch/ia64/include/asm/fb.h b/arch/ia64/include/asm/fb.h >> index 1717b26fd423f..7fce0d5423590 100644 >> --- a/arch/ia64/include/asm/fb.h >> +++ b/arch/ia64/include/asm/fb.h >> @@ -8,17 +8,16 @@ >> >> #include <asm/page.h> >> >> -struct file; >> - >> -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, >> - unsigned long off) >> +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, >> + unsigned long vm_start, unsigned long vm_end, >> + unsigned long offset) >> { >> - if (efi_range_is_wc(vma->vm_start, vma->vm_end - vma->vm_start)) >> - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); >> + if (efi_range_is_wc(vm_start, vm_end - vm_start)) >> + return pgprot_writecombine(prot); >> 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) >> { >> diff --git a/arch/m68k/include/asm/fb.h b/arch/m68k/include/asm/fb.h >> index 24273fc7ad917..9941b7434b696 100644 >> --- a/arch/m68k/include/asm/fb.h >> +++ b/arch/m68k/include/asm/fb.h >> @@ -5,26 +5,27 @@ >> #include <asm/page.h> >> #include <asm/setup.h> >> >> -struct file; >> - >> -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, >> - unsigned long off) >> +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, >> + unsigned long vm_start, unsigned long vm_end, >> + unsigned long offset) >> { >> #ifdef CONFIG_MMU >> #ifdef CONFIG_SUN3 >> - pgprot_val(vma->vm_page_prot) |= SUN3_PAGE_NOCACHE; >> + pgprot_val(prot) |= SUN3_PAGE_NOCACHE; >> #else >> 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) { >> - pgprot_val(vma->vm_page_prot) &= _CACHEMASK040; >> + pgprot_val(prot) &= _CACHEMASK040; >> /* 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_MMU */ >> + >> + return prot; >> } >> -#define fb_pgprotect fb_pgprotect >> +#define pgprot_framebuffer pgprot_framebuffer >> >> #include <asm-generic/fb.h> >> >> diff --git a/arch/mips/include/asm/fb.h b/arch/mips/include/asm/fb.h >> index 18b7226403bad..d98d6681d64ec 100644 >> --- a/arch/mips/include/asm/fb.h >> +++ b/arch/mips/include/asm/fb.h >> @@ -3,14 +3,13 @@ >> >> #include <asm/page.h> >> >> -struct file; >> - >> -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, >> - unsigned long off) >> +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, >> + unsigned long vm_start, unsigned long vm_end, >> + unsigned long offset) >> { >> - 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 >> diff --git a/arch/powerpc/include/asm/fb.h b/arch/powerpc/include/asm/fb.h >> index 61e3b8806db69..3cecf14d51de8 100644 >> --- a/arch/powerpc/include/asm/fb.h >> +++ b/arch/powerpc/include/asm/fb.h >> @@ -2,23 +2,20 @@ >> #ifndef _ASM_FB_H_ >> #define _ASM_FB_H_ >> >> -#include <linux/fs.h> >> - >> #include <asm/page.h> >> >> -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, >> - unsigned long off) >> +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, >> + unsigned long vm_start, unsigned long vm_end, >> + unsigned long offset) >> { >> /* >> * PowerPC's implementation of phys_mem_access_prot() does >> * not use the file argument. Set it to NULL in preparation >> * of later updates to the interface. >> */ >> - vma->vm_page_prot = phys_mem_access_prot(NULL, PHYS_PFN(off), >> - vma->vm_end - vma->vm_start, >> - vma->vm_page_prot); >> + return phys_mem_access_prot(NULL, PHYS_PFN(offset), vm_end - vm_start, prot); >> } >> -#define fb_pgprotect fb_pgprotect >> +#define pgprot_framebuffer pgprot_framebuffer >> >> #include <asm-generic/fb.h> >> >> diff --git a/arch/sparc/include/asm/fb.h b/arch/sparc/include/asm/fb.h >> index 572ecd3e1cc48..24440c0fda490 100644 >> --- a/arch/sparc/include/asm/fb.h >> +++ b/arch/sparc/include/asm/fb.h >> @@ -4,15 +4,18 @@ >> >> #include <linux/io.h> >> >> +#include <asm/page.h> >> + >> struct fb_info; >> -struct file; >> -struct vm_area_struct; >> >> #ifdef CONFIG_SPARC32 >> -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, >> - unsigned long off) >> -{ } >> -#define fb_pgprotect fb_pgprotect >> +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, >> + unsigned long vm_start, unsigned long vm_end, >> + unsigned long offset) >> +{ >> + return prot; >> +} >> +#define pgprot_framebuffer pgprot_framebuffer >> #endif >> >> int fb_is_primary_device(struct fb_info *info); >> diff --git a/arch/x86/include/asm/fb.h b/arch/x86/include/asm/fb.h >> index 23873da8fb77c..c3b9582de7efd 100644 >> --- a/arch/x86/include/asm/fb.h >> +++ b/arch/x86/include/asm/fb.h >> @@ -2,12 +2,14 @@ >> #ifndef _ASM_X86_FB_H >> #define _ASM_X86_FB_H >> >> +#include <asm/page.h> >> + >> struct fb_info; >> -struct file; >> -struct vm_area_struct; >> >> -void fb_pgprotect(struct file *file, struct vm_area_struct *vma, unsigned long off); >> -#define fb_pgprotect fb_pgprotect >> +pgprot_t pgprot_framebuffer(pgprot_t prot, >> + 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); >> #define fb_is_primary_device fb_is_primary_device >> diff --git a/arch/x86/video/fbdev.c b/arch/x86/video/fbdev.c >> index 49a0452402e97..1dd6528cc947c 100644 >> --- a/arch/x86/video/fbdev.c >> +++ b/arch/x86/video/fbdev.c >> @@ -13,16 +13,17 @@ >> #include <linux/vgaarb.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; >> - >> - prot = pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK; >> + pgprot_val(prot) &= ~_PAGE_CACHE_MASK; >> if (boot_cpu_data.x86 > 3) >> - pgprot_val(vma->vm_page_prot) = >> - prot | cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS); >> + pgprot_val(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) >> { >> diff --git a/drivers/video/fbdev/core/fb_chrdev.c b/drivers/video/fbdev/core/fb_chrdev.c >> index eadb81f53a821..32a7315b4b6dd 100644 >> --- a/drivers/video/fbdev/core/fb_chrdev.c >> +++ b/drivers/video/fbdev/core/fb_chrdev.c >> @@ -365,7 +365,8 @@ static int fb_mmap(struct file *file, struct vm_area_struct *vma) >> mutex_unlock(&info->mm_lock); >> >> 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); >> } >> diff --git a/include/asm-generic/fb.h b/include/asm-generic/fb.h >> index bb7ee9c70e603..6ccabb400aa66 100644 >> --- a/include/asm-generic/fb.h >> +++ b/include/asm-generic/fb.h >> @@ -12,14 +12,14 @@ >> #include <linux/pgtable.h> >> >> struct fb_info; >> -struct file; >> >> -#ifndef fb_pgprotect >> -#define fb_pgprotect fb_pgprotect >> -static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, >> - unsigned long off) >> +#ifndef pgprot_framebuffer >> +#define pgprot_framebuffer pgprot_framebuffer >> +static inline pgprot_t pgprot_framebuffer(pgprot_t prot, >> + 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 >>