vgaarbiter: rst-ifiy and polish kerneldoc
Move the documentation into Documentation/gpu, link it up and pull in the kernel doc. No actual text changes except that I did polish the kerneldoc a bit, especially for vga_client_register(). v2: Remove some rst from vga-switcheroo.rst that I don't understand, but which seems to be the reason why the new vgaarbiter.rst sometimes drops out of the sidebar index. v3: Drop one level of headings and clarify the vgaarb one a bit. v4: Fix some typos (Sean). Cc: Jonathan Corbet <corbet@lwn.net> Cc: linux-doc@vger.kernel.org Cc: Sean Paul <seanpaul@chromium.org> Reviewed-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1471034937-651-20-git-send-email-daniel.vetter@ffwll.ch
This commit is contained in:
@@ -131,7 +131,24 @@ static struct vga_device *vgadev_find(struct pci_dev *pdev)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Returns the default VGA device (vgacon's babe) */
|
||||
/**
|
||||
* vga_default_device - return the default VGA device, for vgacon
|
||||
*
|
||||
* This can be defined by the platform. The default implementation
|
||||
* is rather dumb and will probably only work properly on single
|
||||
* vga card setups and/or x86 platforms.
|
||||
*
|
||||
* If your VGA default device is not PCI, you'll have to return
|
||||
* NULL here. In this case, I assume it will not conflict with
|
||||
* any PCI card. If this is not true, I'll have to define two archs
|
||||
* hooks for enabling/disabling the VGA default device if that is
|
||||
* possible. This may be a problem with real _ISA_ VGA cards, in
|
||||
* addition to a PCI one. I don't know at this point how to deal
|
||||
* with that card. Can theirs IOs be disabled at all ? If not, then
|
||||
* I suppose it's a matter of having the proper arch hook telling
|
||||
* us about it, so we basically never allow anybody to succeed a
|
||||
* vga_get()...
|
||||
*/
|
||||
struct pci_dev *vga_default_device(void)
|
||||
{
|
||||
return vga_default;
|
||||
@@ -356,6 +373,40 @@ static void __vga_put(struct vga_device *vgadev, unsigned int rsrc)
|
||||
wake_up_all(&vga_wait_queue);
|
||||
}
|
||||
|
||||
/**
|
||||
* vga_get - acquire & locks VGA resources
|
||||
* @pdev: pci device of the VGA card or NULL for the system default
|
||||
* @rsrc: bit mask of resources to acquire and lock
|
||||
* @interruptible: blocking should be interruptible by signals ?
|
||||
*
|
||||
* This function acquires VGA resources for the given card and mark those
|
||||
* resources locked. If the resource requested are "normal" (and not legacy)
|
||||
* resources, the arbiter will first check whether the card is doing legacy
|
||||
* decoding for that type of resource. If yes, the lock is "converted" into a
|
||||
* legacy resource lock.
|
||||
*
|
||||
* The arbiter will first look for all VGA cards that might conflict and disable
|
||||
* their IOs and/or Memory access, including VGA forwarding on P2P bridges if
|
||||
* necessary, so that the requested resources can be used. Then, the card is
|
||||
* marked as locking these resources and the IO and/or Memory accesses are
|
||||
* enabled on the card (including VGA forwarding on parent P2P bridges if any).
|
||||
*
|
||||
* This function will block if some conflicting card is already locking one of
|
||||
* the required resources (or any resource on a different bus segment, since P2P
|
||||
* bridges don't differentiate VGA memory and IO afaik). You can indicate
|
||||
* whether this blocking should be interruptible by a signal (for userland
|
||||
* interface) or not.
|
||||
*
|
||||
* Must not be called at interrupt time or in atomic context. If the card
|
||||
* already owns the resources, the function succeeds. Nested calls are
|
||||
* supported (a per-resource counter is maintained)
|
||||
*
|
||||
* On success, release the VGA resource again with vga_put().
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* 0 on success, negative error code on failure.
|
||||
*/
|
||||
int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)
|
||||
{
|
||||
struct vga_device *vgadev, *conflict;
|
||||
@@ -408,6 +459,21 @@ int vga_get(struct pci_dev *pdev, unsigned int rsrc, int interruptible)
|
||||
}
|
||||
EXPORT_SYMBOL(vga_get);
|
||||
|
||||
/**
|
||||
* vga_tryget - try to acquire & lock legacy VGA resources
|
||||
* @pdev: pci devivce of VGA card or NULL for system default
|
||||
* @rsrc: bit mask of resources to acquire and lock
|
||||
*
|
||||
* This function performs the same operation as vga_get(), but will return an
|
||||
* error (-EBUSY) instead of blocking if the resources are already locked by
|
||||
* another card. It can be called in any context
|
||||
*
|
||||
* On success, release the VGA resource again with vga_put().
|
||||
*
|
||||
* Returns:
|
||||
*
|
||||
* 0 on success, negative error code on failure.
|
||||
*/
|
||||
int vga_tryget(struct pci_dev *pdev, unsigned int rsrc)
|
||||
{
|
||||
struct vga_device *vgadev;
|
||||
@@ -435,6 +501,16 @@ bail:
|
||||
}
|
||||
EXPORT_SYMBOL(vga_tryget);
|
||||
|
||||
/**
|
||||
* vga_put - release lock on legacy VGA resources
|
||||
* @pdev: pci device of VGA card or NULL for system default
|
||||
* @rsrc: but mask of resource to release
|
||||
*
|
||||
* This fuction releases resources previously locked by vga_get() or
|
||||
* vga_tryget(). The resources aren't disabled right away, so that a subsequence
|
||||
* vga_get() on the same card will succeed immediately. Resources have a
|
||||
* counter, so locks are only released if the counter reaches 0.
|
||||
*/
|
||||
void vga_put(struct pci_dev *pdev, unsigned int rsrc)
|
||||
{
|
||||
struct vga_device *vgadev;
|
||||
@@ -716,7 +792,37 @@ void vga_set_legacy_decoding(struct pci_dev *pdev, unsigned int decodes)
|
||||
}
|
||||
EXPORT_SYMBOL(vga_set_legacy_decoding);
|
||||
|
||||
/* call with NULL to unregister */
|
||||
/**
|
||||
* vga_client_register - register or unregister a VGA arbitration client
|
||||
* @pdev: pci device of the VGA client
|
||||
* @cookie: client cookie to be used in callbacks
|
||||
* @irq_set_state: irq state change callback
|
||||
* @set_vga_decode: vga decode change callback
|
||||
*
|
||||
* Clients have two callback mechanisms they can use.
|
||||
*
|
||||
* @irq_set_state callback: If a client can't disable its GPUs VGA
|
||||
* resources, then we need to be able to ask it to turn off its irqs when we
|
||||
* turn off its mem and io decoding.
|
||||
*
|
||||
* @set_vga_decode callback: If a client can disable its GPU VGA resource, it
|
||||
* will get a callback from this to set the encode/decode state.
|
||||
*
|
||||
* Rationale: we cannot disable VGA decode resources unconditionally some single
|
||||
* GPU laptops seem to require ACPI or BIOS access to the VGA registers to
|
||||
* control things like backlights etc. Hopefully newer multi-GPU laptops do
|
||||
* something saner, and desktops won't have any special ACPI for this. The
|
||||
* driver will get a callback when VGA arbitration is first used by userspace
|
||||
* since some older X servers have issues.
|
||||
*
|
||||
* This function does not check whether a client for @pdev has been registered
|
||||
* already.
|
||||
*
|
||||
* To unregister just call this function with @irq_set_state and @set_vga_decode
|
||||
* both set to NULL for the same @pdev as originally used to register them.
|
||||
*
|
||||
* Returns: 0 on success, -1 on failure
|
||||
*/
|
||||
int vga_client_register(struct pci_dev *pdev, void *cookie,
|
||||
void (*irq_set_state)(void *cookie, bool state),
|
||||
unsigned int (*set_vga_decode)(void *cookie,
|
||||
|
Referens i nytt ärende
Block a user