Framebuffer mmap on PowerPC

Christophe Leroy christophe.leroy at csgroup.eu
Fri Sep 1 03:41:36 AEST 2023



Le 31/08/2023 à 19:38, Christophe Leroy a écrit :
> 
> 
> Le 31/08/2023 à 16:41, Thomas Zimmermann a écrit :
>> Hi,
>>
>> there's a per-architecture function called fb_pgprotect() that sets 
>> VMA's vm_page_prot for mmaped framebuffers. Most architectures use a 
>> simple implementation based on pgprot_writecomine() [1] or 
>> pgprot_noncached(). [2]
>>
>> On PPC this function uses phys_mem_access_prot() and therefore 
>> requires the mmap call's file struct. [3] Removing the file argument 
>> would help with simplifying the caller of fb_pgprotect(). [4]
>>
>> Why is the file even required on PPC?
>>
>> Is it possible to replace phys_mem_access_prot() with something 
>> simpler that does not use the file struct?
> 
> Looks like phys_mem_access_prot() defaults to calling pgprot_noncached() 
> see 
> https://elixir.bootlin.com/linux/v6.5/source/arch/powerpc/mm/mem.c#L37 
> but for a few platforms that's superseeded by 
> pci_phys_mem_access_prot(), see 
> https://elixir.bootlin.com/linux/v6.5/source/arch/powerpc/kernel/pci-common.c#L524
> 
> However, as far as I can see pci_phys_mem_access_prot() doesn't use file 
> so you could likely drop that argument on phys_mem_access_prot() on 
> powerpc. But when I for instance look at arm, I see that the file 
> argument is used, see 
> https://elixir.bootlin.com/linux/v6.5/source/arch/arm/mm/mmu.c#L713
> 
> So, the simplest is maybe the following, allthough that's probably worth 
> a comment:
> 
> diff --git a/arch/powerpc/include/asm/fb.h b/arch/powerpc/include/asm/fb.h
> index 5f1a2e5f7654..8b9b856f476e 100644
> --- a/arch/powerpc/include/asm/fb.h
> +++ b/arch/powerpc/include/asm/fb.h
> @@ -6,10 +6,9 @@
> 
>   #include <asm/page.h>
> 
> -static inline void fb_pgprotect(struct file *file, struct 
> vm_area_struct *vma,
> -                unsigned long off)
> +static inline void fb_pgprotect(struct vm_area_struct *vma, unsigned 
> long off)
>   {
> -    vma->vm_page_prot = phys_mem_access_prot(file, off >> PAGE_SHIFT,
> +    vma->vm_page_prot = phys_mem_access_prot(NULL, off >> PAGE_SHIFT,
>                            vma->vm_end - vma->vm_start,
>                            vma->vm_page_prot);
>   }

And while at it, maybe also replace off >> PAGE_SHIFT by PHYS_PFN(off)

Christophe

> 
> 
> Christophe
> 
> 
>>
>> Best regards
>> Thomas
>>
>>
>> [1] 
>> https://elixir.bootlin.com/linux/v6.5/source/include/asm-generic/fb.h#L19
>> [2] 
>> https://elixir.bootlin.com/linux/v6.5/source/arch/mips/include/asm/fb.h#L11
>> [3] 
>> https://elixir.bootlin.com/linux/v6.5/source/arch/powerpc/include/asm/fb.h#L12
>> [4] 
>> https://elixir.bootlin.com/linux/v6.5/source/drivers/video/fbdev/core/fbmem.c#L1299
>>
>>


More information about the Linuxppc-dev mailing list