On Fri, Apr 29, 2016 at 10:25:13PM +0200, Ard Biesheuvel wrote:
> 
> > On 29 apr. 2016, at 22:06, Bjorn Helgaas <helg...@kernel.org> wrote:
> > 
> >> On Fri, Apr 29, 2016 at 03:51:49PM +0200, Ard Biesheuvel wrote:
> >>> On 29 April 2016 at 15:41, Bjorn Helgaas <helg...@kernel.org> wrote:
> >>>> On Thu, Apr 28, 2016 at 11:39:35PM +0200, Alexander Graf wrote:
> >>>> On 28.04.16 20:06, Bjorn Helgaas wrote:
> > 
> >>>>> If firmware is giving us a bare address of something, that seems like
> >>>>> a clue that it might depend on that address staying the same.
> >>>> 
> >>>> Well, I'd look at it from the other side. It gives us a correct address
> >>>> on entry with the system configured at exactly the state it's in on
> >>>> entry. If Linux changes the system, some guarantees obviously don't work
> >>>> anymore.
> >>> 
> >>> Can you point me to the part of the EFI spec that communicates this?
> >>> I'm curious what the intent is and whether there's any indication that
> >>> EFI expects the OS to preserve some configuration.  I don't think it's
> >>> reasonable for the OS to preserve this sort of configuration because
> >>> it limits how well we can support hotplug.
> >>> 
> >>> I wonder if we're using this frame buffer address as more than what
> >>> EFI intended.  For example, maybe it was intended for use by an early
> >>> console driver, but there's some other mechanism we should be using
> >>> after that.
> >> 
> >> The UEFI spec describes this as follows (UEFIv2.6 section 11.9)
> >> 
> >> """
> >> Graphics output may also be required as part of the startup of an
> >> operating system. There are
> >> potentially times in modern operating systems prior to the loading of
> >> a high performance OS
> >> graphics driver where access to graphics output device is required.
> >> The Graphics Output Protocol
> >> supports this capability by providing the EFI OS loader access to a
> >> hardware frame buffer and
> >> enough information to allow the OS to draw directly to the graphics
> >> output device.
> >> """
> >> 
> >> So the intent is to provide minimal framebuffer services until the
> >> 'real' driver takes over.
> > 
> > Makes sense.  A 'real' driver for a PCI device would use
> > pci_register_driver() and use pci_resource_start() or similar to
> > locate the framebuffer, which would avoid the problem because the PCI
> > core doesn't change BARs while a driver owns the device.
> > 
> >> The GOP protocol only describes the base and size of the framebuffer,
> >> and the pixel format. At boot time, the early UEFI code in the kernel
> >> could potentially figure out which PCI device it is related to, if
> >> necessary, but i am not sure if this would solve the x86 case as well.
> > 
> > Does drivers/video/fbdev/efifb.c support only a single framebuffer
> > device?  If a system has several, how does it decide which to use?  I
> > assume UEFI would provide GOP for all the framebuffers?
> > 
> 
> Yes. The early efi code iterates over all gop instances to figure out which 
> one is connected to the efi console.
> 
> > If we could fix this by making efifb claim a PCI device, I think that
> > would be cleaner.  I don't know how to figure out the correct device,
> > but that would solve the "BAR changed" problem, and it would have
> > cleaner ownership semantics, too.
> 
> If the bus layout is static, the efi init code can record the 
> segment/bus/device and match it with the kernel's view. is that guaranteed to 
> be sufficient for all implementations of pci?

In theory, no.  The kernel can reassign bus numbers to make space for
hotplug devices.  In practice, they're like BARs: if the firmware sets
them up, we don't normally change them unless they're obviously
broken.

Reply via email to