• Lukas Wunner's avatar
    vga_switcheroo: Drop client power state VGA_SWITCHEROO_INIT · e02328f4
    Lukas Wunner authored
    hda_intel.c:azx_probe() defers initialization of an audio controller
    on the discrete GPU if the GPU is powered off. The power state of the
    GPU is determined by calling vga_switcheroo_get_client_state().
    
    vga_switcheroo_get_client_state() returns VGA_SWITCHEROO_INIT if
    vga_switcheroo is not enabled, i.e. if no second GPU or no handler
    has registered.
    
    This can go wrong in the following scenario:
    - Driver for the integrated GPU is not loaded.
    - Driver for the discrete GPU registers with vga_switcheroo, uses driver
      power control to power down the GPU, handler cuts power to the GPU.
    - Driver for the audio controller gets loaded after the GPU was powered
      down, calls vga_switcheroo_get_client_state() which returns
      VGA_SWITCHEROO_INIT instead of VGA_SWITCHEROO_OFF.
    - Consequence: azx_probe() tries to initialize the audio controller even
      though the GPU is powered down.
    
    The power state VGA_SWITCHEROO_INIT was introduced by c8e9cf7b
    ("vga_switcheroo: Add a helper function to get the client state").
    It is not apparent what its benefit might be. The idea seems to
    be to initialize the audio controller even if the power state is
    VGA_SWITCHEROO_OFF (were vga_switcheroo enabled), but as shown
    above this can fail.
    
    Drop VGA_SWITCHEROO_INIT to solve this.
    Acked-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    e02328f4
vga_switcheroo.c 29 KB