From patchwork Mon Jan 28 11:05:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shameerali Kolothum Thodi X-Patchwork-Id: 156706 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp3297974jaa; Mon, 28 Jan 2019 03:10:33 -0800 (PST) X-Google-Smtp-Source: ALg8bN5KR/0tHzpMgeD2GU0IGxKPdPETOEkyn7QCKLRREUglVZQH7FYzlu8ApEmuINLdFo8V6TPX X-Received: by 2002:a1c:1d81:: with SMTP id d123mr16208200wmd.112.1548673833666; Mon, 28 Jan 2019 03:10:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548673833; cv=none; d=google.com; s=arc-20160816; b=mcyK7RmGq7MNaIOS76U3AwXU5JFwkMUASMiymEo4iLdr/2aBpnAxmgSegn/0AAUsfd f3XyJ32t33/KBL2FcGMmlZMG6XDiqXCoyFIVMcUO9XF7X8jtvs3eStz8J+NoS27kSmaj SFepzEaE53KWKqbnC7aBBzIeYRQN9KStSMVq5OflEmeR8FQGF7nk4pGQScAaEr3kp9+1 mvqxlcdPf7c/V6LKg8Umknu2O0S2COXPX+lHher61w7s+wsHkYqh9lH1/d7aRThPgU78 LOXp69O1wadR6jqjm+regpdw67A9+78sKd2DYt/62wfCkZIRouY9ugylQFEY86wSfokw FvIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:mime-version:references :in-reply-to:message-id:date:to:from; bh=KvZxo5x/BCgRYbg0IbVFilSp+tj7rJxZ7buifNClvZw=; b=he1nN1v1Xu7bLP/xZMA4QtELUN1wfogOg98jRBr2cRv+r6PzqghqB+847N70fwm8+z +Uq55e02e/D9pNnswndJsYpyF+V4O00bn7ohd4bJQIoJFVzYCJDLVvSq90xsZE73DC7i rQy4KRpC7drYzCAO3gvtM6rK2OwboKHHd7AecUCv/Do3p2t31ZC6Q+tfIJjSyMUf9yTg uN9n+FrvuUro6s2gJ8n8Ll0ujT661m9N/TAe5IhJ/Zy1IaBLcosJzyvJgK2Sr59pk2Yu Gh9bgOlaxJV2qYH9ONc8DpO3H+6/h6ltwLbUezo0pxf1u4gsR0ZdIeRug7oTlaK4OjbR sQDg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org" Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id h25si45476485wmb.160.2019.01.28.03.10.33 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 28 Jan 2019 03:10:33 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org" Received: from localhost ([127.0.0.1]:57941 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1go4oC-0005Ki-Hh for patch@linaro.org; Mon, 28 Jan 2019 06:10:32 -0500 Received: from eggs.gnu.org ([209.51.188.92]:56223) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1go4l5-0003we-54 for qemu-devel@nongnu.org; Mon, 28 Jan 2019 06:07:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1go4l4-0004Fv-83 for qemu-devel@nongnu.org; Mon, 28 Jan 2019 06:07:19 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:2174 helo=huawei.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1go4l0-00044k-F6; Mon, 28 Jan 2019 06:07:14 -0500 Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id CA9DBE647A6015494704; Mon, 28 Jan 2019 19:06:58 +0800 (CST) Received: from S00345302A-PC.china.huawei.com (10.202.227.237) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.408.0; Mon, 28 Jan 2019 19:06:48 +0800 From: Shameer Kolothum To: , , , , , Date: Mon, 28 Jan 2019 11:05:45 +0000 Message-ID: <20190128110545.20644-4-shameerali.kolothum.thodi@huawei.com> X-Mailer: git-send-email 2.12.0.windows.1 In-Reply-To: <20190128110545.20644-1-shameerali.kolothum.thodi@huawei.com> References: <20190128110545.20644-1-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.202.227.237] X-CFilter-Loop: Reflected X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 45.249.212.190 Subject: [Qemu-devel] [RFC PATCH 3/4] hw/arm/virt: Enable pc-dimm hotplug support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linuxarm@huawei.com, xuwei5@huawei.com Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" pc-dimm memory hotplug is enabled using GPIO(Pin 2) based ACPI event. Hot removal functionality is not yet supported. Signed-off-by: Shameer Kolothum --- hw/arm/virt.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) -- 2.7.4 diff --git a/hw/arm/virt.c b/hw/arm/virt.c index 884960d..cf64554 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -62,6 +62,7 @@ #include "hw/mem/pc-dimm.h" #include "hw/mem/nvdimm.h" #include "hw/acpi/acpi.h" +#include "hw/acpi/pc-hotplug.h" #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ @@ -1651,7 +1652,14 @@ static void machvirt_init(MachineState *machine) nvdimm_init_acpi_state(acpi_nvdimm_state, sysmem, vms->fw_cfg, OBJECT(vms)); } + if (vms->acpi_memhp_state.is_enabled) { + MemHotplugState *state = &vms->acpi_memhp_state; + hwaddr base; + state->hw_reduced_acpi = true; + base = vms->memmap[VIRT_ACPI_IO].base + ACPI_MEMORY_HOTPLUG_BASE; + acpi_memory_hotplug_init(sysmem, OBJECT(vms), state, base); + } vms->bootinfo.ram_size = machine->ram_size; vms->bootinfo.kernel_filename = machine->kernel_filename; vms->bootinfo.kernel_cmdline = machine->kernel_cmdline; @@ -1819,6 +1827,20 @@ static void virt_set_nvdimm_persistence(Object *obj, const char *value, nvdimm_state->persistence_string = g_strdup(value); } +static bool virt_get_memhp_support(Object *obj, Error **errp) +{ + VirtMachineState *vms = VIRT_MACHINE(obj); + + return vms->acpi_memhp_state.is_enabled; +} + +static void virt_set_memhp_support(Object *obj, bool value, Error **errp) +{ + VirtMachineState *vms = VIRT_MACHINE(obj); + + vms->acpi_memhp_state.is_enabled = value; +} + static CpuInstanceProperties virt_cpu_index_to_props(MachineState *ms, unsigned cpu_index) { @@ -1863,8 +1885,8 @@ static void virt_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, const bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); VirtMachineState *vms = VIRT_MACHINE(hotplug_dev); - if (dev->hotplugged) { - error_setg(errp, "memory hotplug is not supported"); + if (dev->hotplugged && is_nvdimm) { + error_setg(errp, "nvdimm hotplug is not supported"); } if (is_nvdimm && !vms->acpi_nvdimm_state.is_enabled) { @@ -1875,6 +1897,22 @@ static void virt_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, pc_dimm_pre_plug(PC_DIMM(dev), MACHINE(hotplug_dev), NULL, errp); } +static void virt_memhp_send_event(HotplugHandler *hotplug_dev, DeviceState *dev, + Error **errp) +{ + DeviceState *gpio_dev; + VirtMachineState *vms = VIRT_MACHINE(hotplug_dev); + + gpio_dev = virt_get_gpio_dev(GPIO_PCDIMM); + if (!gpio_dev) { + error_setg(errp, "No dev interface to send hotplug event"); + return; + } + acpi_memory_plug_cb(hotplug_dev, &vms->acpi_memhp_state, + dev, errp); + qemu_set_irq(qdev_get_gpio_in(gpio_dev, 0), 1); +} + static void virt_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { @@ -1891,6 +1929,10 @@ static void virt_memory_plug(HotplugHandler *hotplug_dev, nvdimm_plug(&vms->acpi_nvdimm_state); } + if (dev->hotplugged && !is_nvdimm) { + virt_memhp_send_event(hotplug_dev, dev, errp); + } + out: error_propagate(errp, local_err); } @@ -1898,6 +1940,11 @@ out: static void virt_memory_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { + if (dev->hotplugged) { + error_setg(errp, "memory hot unplug is not supported"); + return; + } + pc_dimm_unplug(PC_DIMM(dev), MACHINE(hotplug_dev)); object_unparent(OBJECT(dev)); } @@ -2085,6 +2132,12 @@ static void virt_instance_init(Object *obj) "Set NVDIMM persistence" "Valid values are cpu and mem-ctrl", NULL); + vms->acpi_memhp_state.is_enabled = true; + object_property_add_bool(obj, "memory-hotplug-support", + virt_get_memhp_support, + virt_set_memhp_support, + NULL); + vms->irqmap = a15irqmap; }