Re: Framebuffer mmap on PowerPC
From: "Arnd Bergmann" <arnd@arndb.de>
Date: 2023-09-01 01:46:05
Also in:
dri-devel, linux-arch, linux-fbdev
On Thu, Aug 31, 2023, at 10:41, Thomas Zimmermann wrote:
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?
What what I can tell, the structure of the code is a result of
these constraints:
- some powerpc platforms use different page table flags for
prefetchable vs nonprefetchable BARs on PCI memory.
- page table flags must match between all mappings, in particular
here between /dev/fb0 and /dev/mem, as mismatched attributes
cause a checkstop. On other architectures this may cause
undefined behavior instead of a checkstop
It's unfortunate that we have multiple incompatible ways
to determine the page flags based on firmware (ia64),
pci (powerpc) or file->f_flags (arm, csky), when they all
try to solve the same problem here.
Christophe's suggested approach to simplify it is probably
fine, another way would be to pass the f_flags value instead
of the file pointer.
Arnd