[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] How to switch VGA passthrough live


  • To: Roger Cruz <roger.cruz@xxxxxxxxxxxxxxxxxxx>
  • From: 于佳耕 <yujiageng734@xxxxxxxxx>
  • Date: Sat, 5 Jun 2010 12:44:34 +0800
  • Cc: allen.m.kay@xxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxx, yuri.schaeffer@xxxxxx
  • Delivery-date: Fri, 04 Jun 2010 21:45:34 -0700
  • Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=fJpQQj+aLPvKt+d0yJw8xmVhO/ZlfDTQBulXcSCVjki+dqTJsopQe5/hURoHzB6Mnj qGkq1pHBRaXJW9+/UVuqBIQ1cMV8CaIAY2eepZ/v06AOimbI19h+1SfrdpR7qQiPziXK VZZBQrFVZDmzkXs4GyMqO45GQ39fDlRqetNzQ=
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

At very beginning, I want to take destroy-and-recreate method to implement VGA live switch. After reading code and doing some experiments, I find both of two ways can hide the VGA device. And then we can assign VGA device to another HVM during its creating process.

 

      1. Invoke pci_hide_device function, which set pci_dev->bus->devices[0x10] to NULL

      2. dpci_infos.php_devs[0x10].valid =1

 

And the qemu-hw gets the knowledge of passthrough pci devices from the PCIBus and dpci_infos structures. These two structures reserve the context of each pt pci devce, such as its irqswrite functionread functionmmio mapspio maps… So I have a simple idea that we can assign which domain to use VGA screen by saving/restoring VGA device infos of these two structures. My experiment result as below:

 

 

[root@localhost ~]# xm list

Name                                        ID   Mem VCPUs      State   Time(s)

Domain-0                                     0  1786     4     r-----     67.2

PHY_HVMDomain                                1  2048     4     -b----    219.1

[root@localhost ~]# xm pci-list 1

VSlt VFn domain bus  slot func

0x02 0x0 0x0000 0x00 0x02 0x0

0x05 0x0 0x0000 0x00 0x1a 0x0

0x06 0x0 0x0000 0x00 0x1a 0x1

0x07 0x0 0x0000 0x00 0x1a 0x2

0x08 0x0 0x0000 0x00 0x1a 0x7

 

 

[root@localhost ~]# xm pause 1

[root@localhost ~]# xm pci-detach 1 00:00:02.0

[root@localhost ~]# xm pci-list 1

VSlt VFn domain bus  slot func

0x05 0x0 0x0000 0x00 0x1a 0x0

0x06 0x0 0x0000 0x00 0x1a 0x1

0x07 0x0 0x0000 0x00 0x1a 0x2

0x08 0x0 0x0000 0x00 0x1a 0x7

[root@localhost ~]# xm list

Name                                        ID   Mem VCPUs      State   Time(s)

Domain-0                                     0  1786     4     r-----     68.9

PHY_HVMDomain                                1  2048     4     --p---    223.3

 

 

[root@localhost ~]# xm pci-attach 1 00:00:02.0

[root@localhost ~]# xm unpause 1

[root@localhost ~]# xm list

Name                                        ID   Mem VCPUs      State   Time(s)

Domain-0                                     0  1786     4     r-----     69.6

PHY_HVMDomain                                1  2048     4     -b----    224.3

[root@localhost ~]# xm pci-list 1

VSlt VFn domain bus  slot func

0x02 0x0 0x0000 0x00 0x02 0x0

0x05 0x0 0x0000 0x00 0x1a 0x0

0x06 0x0 0x0000 0x00 0x1a 0x1

0x07 0x0 0x0000 0x00 0x1a 0x2

0x08 0x0 0x0000 0x00 0x1a 0x7

[root@localhost ~]# xm list

Name                                        ID   Mem VCPUs      State   Time(s)

Domain-0                                     0  1786     4     r-----     70.3

PHY_HVMDomain                                1  2048     4     -b----    225.6

[root@localhost ~]#

 

 

When unpausing PHY_HVMDomain, it seems working well. But the screen is black and cannot receive any signals. I am sure that this strategy missed something important, especially on video BIOS. Could you give me some ideas?


 
 

 
2010/6/4 Roger Cruz <roger.cruz@xxxxxxxxxxxxxxxxxxx>
I would be interested in learning if this is a successful strategy as well.  If you could please share with the list any methods on how you may get this to work, that would be great.  I am assuming that your dom0 would be headless and not use the graphics card, right?
 
Roger


From: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx on behalf of 于佳耕
Sent: Fri 6/4/2010 5:29 AM
To: yuri.schaeffer@xxxxxx; allen.m.kay@xxxxxxxxx
Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] How to switch VGA passthrough live

Hi,

 

I want to switch video card live between two HVMs. My simplest idea is that when the HVM has the permission to access passthrough video card, and another HVM will be paused. If switch from A to B, execute commands :

 

xm pause A ;

xm pci-detach A  00:00:02.0 ;

xm pci-attach B 00:00:02.0 ;

xm unpause B.

 

I have a try, but failed. The pseudo-code is as below. Can you give me some ideas? Any suggestions will be thankful.

 

Execute “xm pci-detach Domain 00:00:02.0”:

1.       Raise sci interrupt to unplug the device. If OSPM doesn’t handle the unplug process, and then invoke acpi_php_writeb to power off the device.

2.       Modify power_off_php_devfn function:

int power_off_php_devfn(int php_devfn)

{

                    If(php_devfn == 0x10)  // Intel integrated graphics

                    {

                             p = & dpci_infos.php_devs[php_devfn];

 

       // save the two-tuples : (php_dev, domid)

       save_php_device_by_domid(p,domid);

                  

       // hide the device from bus and dpci_infos

                             pci_hide_device(& p->pt_dev->dev);

                             memset(p,0x00,sizeof(struct php_dev));

 

                             return 0;

                    }

    return unregister_real_device(php_devfn);

}

 

Execute “xm pci-attach Domain 00:00:02.0”:

1.       Modify power_on_php_devfn function:

int power_off_php_devfn(int devfn)

{

           ….

           while(devfn == 0x10) // Intel integrated graphics

           {

                    if( ! get_php_device_by_domid(p,domid) ) // get saved php_dev struct

                             break;                                     // cannot get , create new one

 

                    //restore the php device to bus and dpci_infos

                    restore_php_device(p,devfn);         // restore dpci_infos.php_devs[devfn]

                    dpci_infos->e_bus->devices[devfn] = p-> pt_dev->dev;

 

                    return 0;

           }

 

           if (!dpci_infos.pci_access)

           {…}

           pt_dev = register_real_device(..);

  return 0;

}

 

This plan hides the VGA device from HVM and never destroys it. Both mmio and pio maps are reserved. When finishing “xm unpause B”, it seems working well observed by Dom0 serial port login. But the screen is black and cannot receive any signal. I am confusing. Video BIOS should be reloaded? Or need raise some interrupt to flush screen?

 

 

Thanks & Regards,
Yujiageng


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.