e73cc6
From: Prerna Saxena <prerna@linux.vnet.ibm.com>
e73cc6
Date: Tue, 4 Nov 2014 22:51:26 +0530
e73cc6
Subject: [PATCH] Cpu: Add support for Power LE Architecture.
e73cc6
e73cc6
This adds support for PowerPC Little Endian architecture.,
e73cc6
and allows libvirt to spawn VMs based on 'ppc64le' architecture.
e73cc6
e73cc6
Signed-off-by: Pradipta Kr. Banerjee <bpradip@in.ibm.com>
e73cc6
Signed-off-by: Prerna Saxena <prerna@linux.vnet.ibm.com>
e73cc6
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
e73cc6
(cherry picked from commit da636d83dc6b1d070a705786b4daef8644eaca13)
e73cc6
---
e73cc6
 src/conf/domain_conf.c       |  2 +-
e73cc6
 src/cpu/cpu_powerpc.c        |  2 +-
e73cc6
 src/qemu/qemu_capabilities.c |  6 +++---
e73cc6
 src/qemu/qemu_command.c      | 22 +++++++++++-----------
e73cc6
 src/qemu/qemu_domain.c       |  1 +
e73cc6
 src/util/virarch.h           |  3 +++
e73cc6
 6 files changed, 20 insertions(+), 16 deletions(-)
e73cc6
e73cc6
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
e73cc6
index 1b8efb1..21309b0 100644
e73cc6
--- a/src/conf/domain_conf.c
e73cc6
+++ b/src/conf/domain_conf.c
e73cc6
@@ -10043,7 +10043,7 @@ virDomainVideoDefaultType(const virDomainDef *def)
e73cc6
             (STREQ(def->os.type, "xen") ||
e73cc6
              STREQ(def->os.type, "linux")))
e73cc6
             return VIR_DOMAIN_VIDEO_TYPE_XEN;
e73cc6
-        else if (def->os.arch == VIR_ARCH_PPC64)
e73cc6
+        else if ARCH_IS_PPC64(def->os.arch)
e73cc6
             return VIR_DOMAIN_VIDEO_TYPE_VGA;
e73cc6
         else
e73cc6
             return VIR_DOMAIN_VIDEO_TYPE_CIRRUS;
e73cc6
diff --git a/src/cpu/cpu_powerpc.c b/src/cpu/cpu_powerpc.c
e73cc6
index 67cb9ff..d591c18 100644
e73cc6
--- a/src/cpu/cpu_powerpc.c
e73cc6
+++ b/src/cpu/cpu_powerpc.c
e73cc6
@@ -38,7 +38,7 @@
e73cc6
 
e73cc6
 VIR_LOG_INIT("cpu.cpu_powerpc");
e73cc6
 
e73cc6
-static const virArch archs[] = { VIR_ARCH_PPC64 };
e73cc6
+static const virArch archs[] = { VIR_ARCH_PPC64, VIR_ARCH_PPC64LE };
e73cc6
 
e73cc6
 struct ppc_vendor {
e73cc6
     char *name;
e73cc6
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
e73cc6
index 6eb2955..a48f668 100644
e73cc6
--- a/src/qemu/qemu_capabilities.c
e73cc6
+++ b/src/qemu/qemu_capabilities.c
e73cc6
@@ -633,7 +633,7 @@ virQEMUCapsProbeCPUModels(virQEMUCapsPtr qemuCaps, uid_t runUid, gid_t runGid)
e73cc6
     if (qemuCaps->arch == VIR_ARCH_I686 ||
e73cc6
         qemuCaps->arch == VIR_ARCH_X86_64) {
e73cc6
         parse = virQEMUCapsParseX86Models;
e73cc6
-    } else if (qemuCaps->arch == VIR_ARCH_PPC64) {
e73cc6
+    } else if ARCH_IS_PPC64(qemuCaps->arch) {
e73cc6
         parse = virQEMUCapsParsePPCModels;
e73cc6
     } else {
e73cc6
         VIR_DEBUG("don't know how to parse %s CPU models",
e73cc6
@@ -2013,7 +2013,7 @@ bool virQEMUCapsHasPCIMultiBus(virQEMUCapsPtr qemuCaps,
e73cc6
         return true;
e73cc6
 
e73cc6
     if (def->os.arch == VIR_ARCH_PPC ||
e73cc6
-        def->os.arch == VIR_ARCH_PPC64) {
e73cc6
+        ARCH_IS_PPC64(def->os.arch)) {
e73cc6
         /*
e73cc6
          * Usage of pci.0 naming:
e73cc6
          *
e73cc6
@@ -3583,7 +3583,7 @@ virQEMUCapsSupportsChardev(virDomainDefPtr def,
e73cc6
         !virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))
e73cc6
         return false;
e73cc6
 
e73cc6
-    if ((def->os.arch == VIR_ARCH_PPC) || (def->os.arch == VIR_ARCH_PPC64)) {
e73cc6
+    if ((def->os.arch == VIR_ARCH_PPC) || ARCH_IS_PPC64(def->os.arch)) {
e73cc6
         /* only pseries need -device spapr-vty with -chardev */
e73cc6
         return (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
e73cc6
                 chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO);
e73cc6
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
e73cc6
index 2e5af4f..d60f274 100644
e73cc6
--- a/src/qemu/qemu_command.c
e73cc6
+++ b/src/qemu/qemu_command.c
e73cc6
@@ -713,7 +713,7 @@ qemuSetSCSIControllerModel(virDomainDefPtr def,
e73cc6
             return -1;
e73cc6
         }
e73cc6
     } else {
e73cc6
-        if ((def->os.arch == VIR_ARCH_PPC64) &&
e73cc6
+        if (ARCH_IS_PPC64(def->os.arch) &&
e73cc6
             STRPREFIX(def->os.machine, "pseries")) {
e73cc6
             *model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI;
e73cc6
         } else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI)) {
e73cc6
@@ -1264,7 +1264,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
e73cc6
 
e73cc6
     for (i = 0; i < def->nserials; i++) {
e73cc6
         if (def->serials[i]->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
e73cc6
-            (def->os.arch == VIR_ARCH_PPC64) &&
e73cc6
+            ARCH_IS_PPC64(def->os.arch) &&
e73cc6
             STRPREFIX(def->os.machine, "pseries"))
e73cc6
             def->serials[i]->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
e73cc6
         if (qemuAssignSpaprVIOAddress(def, &def->serials[i]->info,
e73cc6
@@ -1273,7 +1273,7 @@ int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
e73cc6
     }
e73cc6
 
e73cc6
     if (def->nvram) {
e73cc6
-        if (def->os.arch == VIR_ARCH_PPC64 &&
e73cc6
+        if (ARCH_IS_PPC64(def->os.arch) &&
e73cc6
             STRPREFIX(def->os.machine, "pseries"))
e73cc6
             def->nvram->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO;
e73cc6
         if (qemuAssignSpaprVIOAddress(def, &def->nvram->info,
e73cc6
@@ -4195,7 +4195,7 @@ qemuBuildUSBControllerDevStr(virDomainDefPtr domainDef,
e73cc6
     model = def->model;
e73cc6
 
e73cc6
     if (model == -1) {
e73cc6
-        if (domainDef->os.arch == VIR_ARCH_PPC64)
e73cc6
+        if ARCH_IS_PPC64(domainDef->os.arch)
e73cc6
             model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PCI_OHCI;
e73cc6
         else
e73cc6
             model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
e73cc6
@@ -8573,7 +8573,7 @@ qemuBuildCommandLine(virConnectPtr conn,
e73cc6
                            !qemuDomainMachineIsQ35(def) &&
e73cc6
                            (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PIIX3_USB_UHCI) ||
e73cc6
                             (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCI_OHCI) &&
e73cc6
-                             def->os.arch == VIR_ARCH_PPC64))) {
e73cc6
+                             ARCH_IS_PPC64(def->os.arch)))) {
e73cc6
                     if (usblegacy) {
e73cc6
                         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
e73cc6
                                        _("Multiple legacy USB controllers are "
e73cc6
@@ -9771,7 +9771,7 @@ qemuBuildCommandLine(virConnectPtr conn,
e73cc6
     }
e73cc6
 
e73cc6
     if (def->nvram) {
e73cc6
-        if (def->os.arch == VIR_ARCH_PPC64 &&
e73cc6
+        if (ARCH_IS_PPC64(def->os.arch) &&
e73cc6
             STRPREFIX(def->os.machine, "pseries")) {
e73cc6
             if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_NVRAM)) {
e73cc6
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
e73cc6
@@ -9894,7 +9894,7 @@ qemuBuildSerialChrDeviceStr(char **deviceStr,
e73cc6
 {
e73cc6
     virBuffer cmd = VIR_BUFFER_INITIALIZER;
e73cc6
 
e73cc6
-    if ((arch == VIR_ARCH_PPC64) && STRPREFIX(machine, "pseries")) {
e73cc6
+    if (ARCH_IS_PPC64(arch) && STRPREFIX(machine, "pseries")) {
e73cc6
         if (serial->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
e73cc6
             serial->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO) {
e73cc6
             virBufferAsprintf(&cmd, "spapr-vty,chardev=char%s",
e73cc6
@@ -10316,7 +10316,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
e73cc6
     if (VIR_ALLOC(def->src) < 0)
e73cc6
         goto error;
e73cc6
 
e73cc6
-    if (((dom->os.arch == VIR_ARCH_PPC64) &&
e73cc6
+    if ((ARCH_IS_PPC64(dom->os.arch) &&
e73cc6
         dom->os.machine && STRPREFIX(dom->os.machine, "pseries")))
e73cc6
         def->bus = VIR_DOMAIN_DISK_BUS_SCSI;
e73cc6
     else
e73cc6
@@ -10409,7 +10409,7 @@ qemuParseCommandLineDisk(virDomainXMLOptionPtr xmlopt,
e73cc6
         } else if (STREQ(keywords[i], "if")) {
e73cc6
             if (STREQ(values[i], "ide")) {
e73cc6
                 def->bus = VIR_DOMAIN_DISK_BUS_IDE;
e73cc6
-                if (((dom->os.arch == VIR_ARCH_PPC64) &&
e73cc6
+                if ((ARCH_IS_PPC64(dom->os.arch) &&
e73cc6
                      dom->os.machine && STRPREFIX(dom->os.machine, "pseries"))) {
e73cc6
                     virReportError(VIR_ERR_INTERNAL_ERROR,
e73cc6
                                    _("pseries systems do not support ide devices '%s'"), val);
e73cc6
@@ -11654,7 +11654,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
e73cc6
             }
e73cc6
             if (STREQ(arg, "-cdrom")) {
e73cc6
                 disk->device = VIR_DOMAIN_DISK_DEVICE_CDROM;
e73cc6
-                if (((def->os.arch == VIR_ARCH_PPC64) &&
e73cc6
+                if ((ARCH_IS_PPC64(def->os.arch) &&
e73cc6
                     def->os.machine && STRPREFIX(def->os.machine, "pseries")))
e73cc6
                     disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
e73cc6
                 if (VIR_STRDUP(disk->dst, "hdc") < 0)
e73cc6
@@ -11670,7 +11670,7 @@ qemuParseCommandLine(virCapsPtr qemuCaps,
e73cc6
                         disk->bus = VIR_DOMAIN_DISK_BUS_IDE;
e73cc6
                     else
e73cc6
                         disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
e73cc6
-                   if (((def->os.arch == VIR_ARCH_PPC64) &&
e73cc6
+                   if ((ARCH_IS_PPC64(def->os.arch) &&
e73cc6
                        def->os.machine && STRPREFIX(def->os.machine, "pseries")))
e73cc6
                        disk->bus = VIR_DOMAIN_DISK_BUS_SCSI;
e73cc6
                 }
e73cc6
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
e73cc6
index 76fccce..e4edf34 100644
e73cc6
--- a/src/qemu/qemu_domain.c
e73cc6
+++ b/src/qemu/qemu_domain.c
e73cc6
@@ -980,6 +980,7 @@ qemuDomainDefPostParse(virDomainDefPtr def,
e73cc6
        break;
e73cc6
 
e73cc6
     case VIR_ARCH_PPC64:
e73cc6
+    case VIR_ARCH_PPC64LE:
e73cc6
         addPCIRoot = true;
e73cc6
         addDefaultUSBKBD = true;
e73cc6
         addDefaultUSBMouse = true;
e73cc6
diff --git a/src/util/virarch.h b/src/util/virarch.h
e73cc6
index d395e58..3206ce2 100644
e73cc6
--- a/src/util/virarch.h
e73cc6
+++ b/src/util/virarch.h
e73cc6
@@ -79,6 +79,9 @@ typedef enum {
e73cc6
                              (arch) == VIR_ARCH_PPC64LE ||\
e73cc6
                              (arch) == VIR_ARCH_PPCEMB)
e73cc6
 
e73cc6
+# define ARCH_IS_PPC64(arch)  ((arch) == VIR_ARCH_PPC64 ||\
e73cc6
+                               (arch) == VIR_ARCH_PPC64LE)
e73cc6
+
e73cc6
 # define ARCH_IS_ARM(arch)  ((arch) == VIR_ARCH_ARMV6L ||\
e73cc6
                              (arch) == VIR_ARCH_ARMV7L ||\
e73cc6
                              (arch) == VIR_ARCH_ARMV7B ||\