Re: ioremap_uc() followed by set_memory_wc() - burrying MTRR
From: Andy Lutomirski <luto@amacapital.net>
Date: 2015-04-15 20:43:17
Also in:
linux-media, linux-rdma, lkml
On Mon, Apr 13, 2015 at 10:49 AM, Luis R. Rodriguez [off-list ref] wrote:
c) ivtv: the driver does not have the PCI space mapped out separately, and in fact it actually does not do the math for the framebuffer, instead it lets the device's own CPU do that and assume where its at, see ivtvfb_get_framebuffer() and CX2341X_OSD_GET_FRAMEBUFFER, it has a get but not a setter. Its not clear if the firmware would make a split easy. We'd need ioremap_ucminus() here too and __arch_phys_wc_add().
IMO this should be conceptually easy to split. Once we get the framebuffer address, just unmap it (or don't prematurely map it) and then ioremap the thing.
From the beginning it seems only framebuffer devices used MTRR/WC, lately it seems infiniband drivers also find good use for for it for PIO TX buffers to blast some sort of data, in the future I would not be surprised if other devices found use for it.
IMO the Infiniband maintainers should fix their code. Especially in the server space, there aren't that many MTRRs to go around. I wrote arch_phys_wc_add in the first place because my server *ran out of MTRRs*. Hey, IB people: can you fix your drivers to use arch_phys_wc_add (which is permitted to be a no-op) along with ioremap_wc? Your users will thank you.
It may be true that the existing drivers that requires the above type of work are corner cases -- but I wouldn't hold my breath for that. The ivtv device is a good example of the worst type of situations and these days. So perhap __arch_phys_wc_add() and a ioremap_ucminus() might be something more than transient unless hardware folks get a good memo or already know how to just Do The Right Thing (TM).
I disagree. We should try to NACK any new code that can't function without MTRRs. (Plus, ARM is growing in popularity in the server space, and ARM quite sensibly doesn't have MTRRs.) --Andy