mbox series

[v3,0/5] ppc, fbdev: Clean up fbdev mmap helper

Message ID 20230911131033.27745-1-tzimmermann@suse.de (mailing list archive)
Headers show
Series ppc, fbdev: Clean up fbdev mmap helper | expand

Message

Thomas Zimmermann Sept. 11, 2023, 1:08 p.m. UTC
Clean up and rename fb_pgprotect() to work without struct file. Then
refactor the implementation for PowerPC. This change has been discussed
at [1] in the context of refactoring fbdev's mmap code.

The first two patches update fbdev and replace fbdev's fb_pgprotect()
with pgprot_framebuffer() on all architectures. The new helper's stream-
lined interface enables more refactoring within fbdev's mmap
implementation.

Patches 3 to 5 adapt PowerPC's internal interfaces to provide
phys_mem_access_prot() that works without struct file. Neither the
architecture code or fbdev helpers need the parameter.

v3:
	* rename fb_pgrotect() to pgprot_framebuffer() (Arnd)
v2:
	* reorder patches to simplify merging (Michael)

[1] https://lore.kernel.org/linuxppc-dev/5501ba80-bdb0-6344-16b0-0466a950f82c@suse.com/

Thomas Zimmermann (5):
  fbdev: Avoid file argument in fb_pgprotect()
  fbdev: Replace fb_pgprotect() with fb_pgprot_device()
  arch/powerpc: Remove trailing whitespaces
  arch/powerpc: Remove file parameter from phys_mem_access_prot code
  arch/powerpc: Call internal __phys_mem_access_prot() in fbdev code

 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/book3s/pgtable.h | 10 ++++++++--
 arch/powerpc/include/asm/fb.h             | 13 +++++--------
 arch/powerpc/include/asm/machdep.h        | 13 ++++++-------
 arch/powerpc/include/asm/nohash/pgtable.h | 10 ++++++++--
 arch/powerpc/include/asm/pci.h            |  4 +---
 arch/powerpc/kernel/pci-common.c          |  3 +--
 arch/powerpc/mm/mem.c                     |  8 ++++----
 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 ++++++------
 15 files changed, 86 insertions(+), 75 deletions(-)

Comments

Christophe Leroy Sept. 11, 2023, 2:19 p.m. UTC | #1
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
>
Thomas Zimmermann Sept. 11, 2023, 2:28 p.m. UTC | #2
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
>>