]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: support ich9-intel-hda audio device
authorLaine Stump <laine@laine.org>
Tue, 24 Sep 2013 14:17:38 +0000 (10:17 -0400)
committerLaine Stump <laine@laine.org>
Wed, 25 Sep 2013 14:38:02 +0000 (10:38 -0400)
This resolves one of the issues in:

   https://bugzilla.redhat.com/show_bug.cgi?id=1003983

This device is identical to qemu's "intel-hda" device (known as "ich6"
in libvirt), but has a different PCI device ID (which matches the ID
of the hda audio built into the ich9 chipset, of course). It's not
supported in earlier versions of qemu, so it requires a capability
bit.

docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_command.c
tests/qemuxml2argvdata/qemuxml2argv-sound-device.args
tests/qemuxml2argvdata/qemuxml2argv-sound-device.xml
tests/qemuxml2argvtest.c

index fb6a26c3bc16539f83b01fc5f75293b044d9f694..5c5301d8aff75b835932285e8cedff62e3bcf3f4 100644 (file)
           <value>pcspk</value>
           <value>ac97</value>
           <value>ich6</value>
+          <value>ich9</value>
         </choice>
       </attribute>
       <interleave>
index 240f318936f245c1c9d346f37396628d6356ebca..4110127f9248829037dd019354950de678b1ac0f 100644 (file)
@@ -462,7 +462,8 @@ VIR_ENUM_IMPL(virDomainSoundModel, VIR_DOMAIN_SOUND_MODEL_LAST,
               "es1370",
               "pcspk",
               "ac97",
-              "ich6")
+              "ich6",
+              "ich9")
 
 VIR_ENUM_IMPL(virDomainMemDump, VIR_DOMAIN_MEM_DUMP_LAST,
               "default",
@@ -8451,7 +8452,8 @@ virDomainSoundDefParseXML(const xmlNodePtr node,
         goto error;
     }
 
-    if (def->model == VIR_DOMAIN_SOUND_MODEL_ICH6) {
+    if (def->model == VIR_DOMAIN_SOUND_MODEL_ICH6 ||
+        def->model == VIR_DOMAIN_SOUND_MODEL_ICH9) {
         int ncodecs;
         xmlNodePtr *codecNodes = NULL;
 
index 5c33e080c6b97964d213e6c8ac71d28df07fa9e0..f20a91687e4e588faa86a0afb8247a64a63ff153 100644 (file)
@@ -1253,6 +1253,7 @@ enum virDomainSoundModel {
     VIR_DOMAIN_SOUND_MODEL_PCSPK,
     VIR_DOMAIN_SOUND_MODEL_AC97,
     VIR_DOMAIN_SOUND_MODEL_ICH6,
+    VIR_DOMAIN_SOUND_MODEL_ICH9,
 
     VIR_DOMAIN_SOUND_MODEL_LAST
 };
index d830e2ab2fb73ae3c216baeba403a78233d24254..dc8f0be02b7baff1997c5639cc4c9bab2b387c0a 100644 (file)
@@ -241,6 +241,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
               "usb-storage", /* 155 */
               "usb-storage.removable",
               "virtio-mmio",
+              "ich9-intel-hda",
     );
 
 struct _virQEMUCaps {
@@ -1391,6 +1392,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
     { "i82801b11-bridge", QEMU_CAPS_DEVICE_DMI_TO_PCI_BRIDGE },
     { "usb-storage", QEMU_CAPS_DEVICE_USB_STORAGE },
     { "virtio-mmio", QEMU_CAPS_DEVICE_VIRTIO_MMIO },
+    { "ich9-intel-hda", QEMU_CAPS_DEVICE_ICH9_INTEL_HDA },
 };
 
 static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsVirtioBlk[] = {
index f3c8fa86bfc72ccf291cdc4483fc9b2707b66a05..f8dc728c83394cf206219cc2936b07ec1683b370 100644 (file)
@@ -196,6 +196,7 @@ enum virQEMUCapsFlags {
     QEMU_CAPS_DEVICE_USB_STORAGE = 155, /* -device usb-storage */
     QEMU_CAPS_USB_STORAGE_REMOVABLE = 156, /* usb-storage.removable */
     QEMU_CAPS_DEVICE_VIRTIO_MMIO = 157, /* -device virtio-mmio */
+    QEMU_CAPS_DEVICE_ICH9_INTEL_HDA = 158, /* -device ich9-intel-hda */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
index 3156cff97f43846ae1cd2f1f3d1b887027f2f8e9..c8a5c8b5558d7b90e267338309606e8bd07bda8b 100644 (file)
@@ -1800,6 +1800,7 @@ qemuCollectPCIAddress(virDomainDefPtr def ATTRIBUTE_UNUSED,
     case VIR_DOMAIN_DEVICE_SOUND:
         switch (device->data.sound->model) {
         case VIR_DOMAIN_SOUND_MODEL_ICH6:
+        case VIR_DOMAIN_SOUND_MODEL_ICH9:
             flags = (QEMU_PCI_CONNECT_TYPE_PCI |
                      QEMU_PCI_CONNECT_TYPE_EITHER_IF_CONFIG);
             break;
@@ -5280,6 +5281,15 @@ qemuBuildSoundDevStr(virDomainDefPtr def,
     case VIR_DOMAIN_SOUND_MODEL_ICH6:
         model = "intel-hda";
         break;
+    case VIR_DOMAIN_SOUND_MODEL_ICH9:
+        model = "ich9-intel-hda";
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_ICH9_INTEL_HDA)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("The ich9-intel-hda audio controller "
+                             "is not supported in this QEMU binary"));
+            goto error;
+        }
+        break;
     }
 
     virBufferAsprintf(&buf, "%s,id=%s", model, sound->info.alias);
@@ -9065,7 +9075,8 @@ qemuBuildCommandLine(virConnectPtr conn,
 
                     virCommandAddArg(cmd, str);
 
-                    if (sound->model == VIR_DOMAIN_SOUND_MODEL_ICH6) {
+                    if (sound->model == VIR_DOMAIN_SOUND_MODEL_ICH6 ||
+                        sound->model == VIR_DOMAIN_SOUND_MODEL_ICH9) {
                         char *codecstr = NULL;
 
                         for (j = 0; j < sound->ncodecs; j++) {
@@ -9111,7 +9122,8 @@ qemuBuildCommandLine(virConnectPtr conn,
                     goto error;
                 }
 
-                if (sound->model == VIR_DOMAIN_SOUND_MODEL_ICH6) {
+                if (sound->model == VIR_DOMAIN_SOUND_MODEL_ICH6 ||
+                    sound->model == VIR_DOMAIN_SOUND_MODEL_ICH9) {
                     VIR_FREE(modstr);
                     virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                                    _("this QEMU binary lacks hda support"));
index d35845353218aaf20c90ba603a411bcde745b7e9..1511389d8ff8d5eaf933db17a0b1437620b8eb11 100644 (file)
@@ -9,4 +9,9 @@ id=sound4-codec0,bus=sound4.0,cad=0 \
 -device intel-hda,id=sound5,bus=pci.0,addr=0x6 \
 -device hda-micro,id=sound5-codec0,bus=sound5.0,cad=0 \
 -device hda-duplex,id=sound5-codec1,bus=sound5.0,cad=1 \
--device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7
+-device ich9-intel-hda,id=sound6,bus=pci.0,addr=0x7 -device hda-duplex,\
+id=sound6-codec0,bus=sound6.0,cad=0 \
+-device ich9-intel-hda,id=sound7,bus=pci.0,addr=0x8 \
+-device hda-micro,id=sound7-codec0,bus=sound7.0,cad=0 \
+-device hda-duplex,id=sound7-codec1,bus=sound7.0,cad=1 \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x9
index 7bf9ff92179ac1440b2ae5d5abc80e1909c4ef47..8ce718e98ae3cbcda55686985d9e5adf13c8bae3 100644 (file)
       <codec type='micro'/>
       <codec type='duplex'/>
     </sound>
+    <sound model='ich9'/>
+    <sound model='ich9'>
+      <codec type='micro'/>
+      <codec type='duplex'/>
+    </sound>
     <memballoon model='virtio'/>
   </devices>
 </domain>
index ec4a6e5777968b29d4b5016a3c9a31850789380c..0b808a4a39d599a1ba16ac5a4e1d955a0240fbb0 100644 (file)
@@ -855,7 +855,8 @@ mymain(void)
     DO_TEST("sound", NONE);
     DO_TEST("sound-device",
             QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
-            QEMU_CAPS_HDA_DUPLEX, QEMU_CAPS_HDA_MICRO);
+            QEMU_CAPS_HDA_DUPLEX, QEMU_CAPS_HDA_MICRO,
+            QEMU_CAPS_DEVICE_ICH9_INTEL_HDA);
     DO_TEST("fs9p",
             QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_FSDEV,
             QEMU_CAPS_FSDEV_WRITEOUT);