On Sun, Feb 14, 2016 at 1:10 PM, Lukas Wunner lukas@wunner.de wrote:
/**
- vga_switcheroo_client_probe_defer() - whether to defer probing a given GPU
- @pdev: pci device of GPU
- Determine whether any prerequisites are not fulfilled to probe a given GPU.
I'd phrase this as "Determine whether the vgaswitcheroor support is fully loaded" and drop the GPU part - it could be needed by snd drivers eventually too.
- DRM drivers should invoke this early on in their ->probe callback and return
- %-EPROBE_DEFER if it evaluates to %true. The GPU need not be registered with
- vga_switcheroo_register_client() beforehand.
s/need not/must not/ ... is your native language German by any chance?
Aside from that ... should vga_switcheroo_register_client call this helper instead directly and return the appropriate -EDEFER_PROBE error? I realize for some drivers it might be way too late to unrol from that point on, but e.g. i915 already uses -EDEFER_PROBE. And calling it unconditionally will make sure that it's easier to notice when people forget this. So maybe call it both from the register functions, and export as a separate hook? And for i915 we should be able to remove that early check entirely.
- Return: %false unless one of the following applies:
- On pre-retina MacBook Pros, the apple-gmux driver is needed to temporarily
- switch DDC to the inactive GPU so that it can probe the panel's EDID.
- Therefore return %true if gmux is built into the machine, @pdev is the
- inactive GPU and the apple-gmux driver has not registered its handler
- flags, signifying it has not yet loaded or has not finished initializing.
I think the apple-specific comment here should be a separate comment right above the if condition below - it doesn't explain the interface, only one specific case. And we might grow more of those. -Daniel
- */
+bool vga_switcheroo_client_probe_defer(struct pci_dev *pdev) +{
if (apple_gmux_present() && pdev != vga_default_device() &&
!vgasr_priv.handler_flags)
return true;
return false;
+} +EXPORT_SYMBOL(vga_switcheroo_client_probe_defer);