å?¨ 2018/7/16 22:02, Lukas Wunner å??é??: > On Sat, Jul 14, 2018 at 02:15:24PM +0800, jimqu wrote: >> ??? 2018/7/13 17:27, Lukas Wunner ??????: >>> On Fri, Jul 13, 2018 at 04:06:02PM +0800, Jim Qu wrote: >>>> On modern laptop, there are more and more platforms >>>> have two GPUs, and each of them maybe have audio codec >>>> for HDMP/DP output. For some dGPU which is no output, >>>> audio codec usually is disabled. >>>> >>>> In currect HDA audio driver, it will set all codec as >>>> VGA_SWITCHEROO_DIS, the audio which is binded to UMA >>>> will be suspended if user use debugfs to contorl power >>>> >>>> In HDA driver side, it is difficult to know which GPU >>>> the audio has binded to. So set the bound gpu pci dev >>>> to vgaswitchroo, the correct audio id will be set in >>>> vgaswitchreoo enable function. >>>> >>>> Signed-off-by: Jim Qu <Jim.Qu at amd.com> >>> The approach you've taken in this patch won't work if the HDA controller >>> is bound to a driver after both GPUs have already been bound to a driver >>> and the handler has already been registered. >>> >>> That's because vga_switcheroo_enable() is run when two GPUs have registered >>> as clients and the handler has also registered. If the HDA controller is >>> probed afterwards, its ID will be stuck at VGA_SWITCHEROO_UNKNOWN_ID. >> In genernic speaking, there are two cases , a. audio client is the third >> client. b. audio client is not the third client. >> >> if audio is third client. vga_switcheroo_ready() is true, >> vga_switcheroo_enable() can be called in audio client register fuction. >> if audio is not the third client, vga_switcheroo_enable() will be called in >> the second GFX client register. >> In vga_switcheroo_enable() , the first list loop will set two GPU clients' >> id, and the second list loop will select audio client, set id by its bound >> gpu pci dev. > No, if audio is the third client, vga_switcheroo_ready() is *not* true > because vgasr_priv.active is true. This is set to true once the two > GPUs and the handler have registered. If the audio device registers > afterwards, vga_switcheroo_enable() will already have been called. > It's never called twice because it sets vgasr_priv.active = true. > > As a result, the audio device is stuck at VGA_SWITCHEROO_UNKNOWN_ID. Indeed, I almost ignore the vgasr_priv.active, since I added amdgpu to blacklist, audio is always the first client. :). not so bad, Let me rework the patch tomorrow. Thanks JimQu > Thanks, > > Lukas