All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Igor Mammedov <imammedo@redhat.com>
Subject: [PULL 57/66] acpi: cpuhp: introduce 'firmware performs eject' status/control bits
Date: Tue, 8 Dec 2020 14:37:11 -0500	[thread overview]
Message-ID: <20201208193307.646726-58-mst@redhat.com> (raw)
In-Reply-To: <20201208193307.646726-1-mst@redhat.com>

From: Igor Mammedov <imammedo@redhat.com>

Adds bit #4 to status/control field of CPU hotplug MMIO interface.
New bit will be used OSPM to mark CPUs as pending for removal by firmware,
when it calls _EJ0 method on CPU device node. Later on, when firmware
sees this bit set, it will perform CPU eject which will clear bit #4
as well.

Signed-off-by: Igor Mammedov <imammedo@redhat.com>
Message-Id: <20201207140739.3829993-3-imammedo@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 docs/specs/acpi_cpu_hotplug.txt | 19 ++++++++++++++-----
 include/hw/acpi/cpu.h           |  1 +
 hw/acpi/cpu.c                   | 12 +++++++++++-
 hw/acpi/trace-events            |  2 ++
 4 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/docs/specs/acpi_cpu_hotplug.txt b/docs/specs/acpi_cpu_hotplug.txt
index 9bb22d1270..9bd59ae0da 100644
--- a/docs/specs/acpi_cpu_hotplug.txt
+++ b/docs/specs/acpi_cpu_hotplug.txt
@@ -56,8 +56,11 @@ read access:
               no device check event to OSPM was issued.
               It's valid only when bit 0 is set.
            2: Device remove event, used to distinguish device for which
-              no device eject request to OSPM was issued.
-           3-7: reserved and should be ignored by OSPM
+              no device eject request to OSPM was issued. Firmware must
+              ignore this bit.
+           3: reserved and should be ignored by OSPM
+           4: if set to 1, OSPM requests firmware to perform device eject.
+           5-7: reserved and should be ignored by OSPM
     [0x5-0x7] reserved
     [0x8] Command data: (DWORD access)
           contains 0 unless value last stored in 'Command field' is one of:
@@ -79,10 +82,16 @@ write access:
                selected CPU device
             2: if set to 1 clears device remove event, set by OSPM
                after it has emitted device eject request for the
-               selected CPU device
+               selected CPU device.
             3: if set to 1 initiates device eject, set by OSPM when it
-               triggers CPU device removal and calls _EJ0 method
-            4-7: reserved, OSPM must clear them before writing to register
+               triggers CPU device removal and calls _EJ0 method or by firmware
+               when bit #4 is set. In case bit #4 were set, it's cleared as
+               part of device eject.
+            4: if set to 1, OSPM hands over device eject to firmware.
+               Firmware shall issue device eject request as described above
+               (bit #3) and OSPM should not touch device eject bit (#3) in case
+               it's asked firmware to perform CPU device eject.
+            5-7: reserved, OSPM must clear them before writing to register
     [0x5] Command field: (1 byte access)
           value:
             0: selects a CPU device with inserting/removing events and
diff --git a/include/hw/acpi/cpu.h b/include/hw/acpi/cpu.h
index 0eeedaa491..d71edde456 100644
--- a/include/hw/acpi/cpu.h
+++ b/include/hw/acpi/cpu.h
@@ -22,6 +22,7 @@ typedef struct AcpiCpuStatus {
     uint64_t arch_id;
     bool is_inserting;
     bool is_removing;
+    bool fw_remove;
     uint32_t ost_event;
     uint32_t ost_status;
 } AcpiCpuStatus;
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index f099b50927..1293204438 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -71,6 +71,7 @@ static uint64_t cpu_hotplug_rd(void *opaque, hwaddr addr, unsigned size)
         val |= cdev->cpu ? 1 : 0;
         val |= cdev->is_inserting ? 2 : 0;
         val |= cdev->is_removing  ? 4 : 0;
+        val |= cdev->fw_remove  ? 16 : 0;
         trace_cpuhp_acpi_read_flags(cpu_st->selector, val);
         break;
     case ACPI_CPU_CMD_DATA_OFFSET_RW:
@@ -148,6 +149,14 @@ static void cpu_hotplug_wr(void *opaque, hwaddr addr, uint64_t data,
             hotplug_ctrl = qdev_get_hotplug_handler(dev);
             hotplug_handler_unplug(hotplug_ctrl, dev, NULL);
             object_unparent(OBJECT(dev));
+            cdev->fw_remove = false;
+        } else if (data & 16) {
+            if (!cdev->cpu || cdev->cpu == first_cpu) {
+                trace_cpuhp_acpi_fw_remove_invalid_cpu(cpu_st->selector);
+                break;
+            }
+            trace_cpuhp_acpi_fw_remove_cpu(cpu_st->selector);
+            cdev->fw_remove = true;
         }
         break;
     case ACPI_CPU_CMD_OFFSET_WR:
@@ -159,7 +168,8 @@ static void cpu_hotplug_wr(void *opaque, hwaddr addr, uint64_t data,
 
                 do {
                     cdev = &cpu_st->devs[iter];
-                    if (cdev->is_inserting || cdev->is_removing) {
+                    if (cdev->is_inserting || cdev->is_removing ||
+                        cdev->fw_remove) {
                         cpu_st->selector = iter;
                         trace_cpuhp_acpi_cpu_has_events(cpu_st->selector,
                             cdev->is_inserting, cdev->is_removing);
diff --git a/hw/acpi/trace-events b/hw/acpi/trace-events
index afbc77de1c..f91ced477d 100644
--- a/hw/acpi/trace-events
+++ b/hw/acpi/trace-events
@@ -29,6 +29,8 @@ cpuhp_acpi_clear_inserting_evt(uint32_t idx) "idx[0x%"PRIx32"]"
 cpuhp_acpi_clear_remove_evt(uint32_t idx) "idx[0x%"PRIx32"]"
 cpuhp_acpi_ejecting_invalid_cpu(uint32_t idx) "0x%"PRIx32
 cpuhp_acpi_ejecting_cpu(uint32_t idx) "0x%"PRIx32
+cpuhp_acpi_fw_remove_invalid_cpu(uint32_t idx) "0x%"PRIx32
+cpuhp_acpi_fw_remove_cpu(uint32_t idx) "0x%"PRIx32
 cpuhp_acpi_write_ost_ev(uint32_t slot, uint32_t ev) "idx[0x%"PRIx32"] OST EVENT: 0x%"PRIx32
 cpuhp_acpi_write_ost_status(uint32_t slot, uint32_t st) "idx[0x%"PRIx32"] OST STATUS: 0x%"PRIx32
 
-- 
MST



  parent reply	other threads:[~2020-12-08 20:36 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-08 19:33 [PULL 00/66] pc,pci,virtio: fixes, cleanups Michael S. Tsirkin
2020-12-08 19:33 ` [PULL 01/66] vhost-user-scsi: Fix memleaks in vus_proc_req() Michael S. Tsirkin
2020-12-08 19:33 ` [PULL 02/66] memory: Rename memory_region_notify_one to memory_region_notify_iommu_one Michael S. Tsirkin
2020-12-08 19:33 ` [PULL 03/66] memory: Add IOMMUTLBEvent Michael S. Tsirkin
2020-12-08 19:33 ` [PULL 04/66] memory: Add IOMMU_NOTIFIER_DEVIOTLB_UNMAP IOMMUTLBNotificationType Michael S. Tsirkin
2020-12-08 19:33 ` [PULL 05/66] intel_iommu: Skip page walking on device iotlb invalidations Michael S. Tsirkin
2020-12-08 19:33 ` [PULL 06/66] memory: Skip bad range assertion if notifier is DEVIOTLB_UNMAP type Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 07/66] virtio: reset device on bad guest index in virtio_load() Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 08/66] acpi/gpex: Extract two APIs from acpi_dsdt_add_pci Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 09/66] fw_cfg: Refactor extra pci roots addition Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 10/66] hw/arm/virt: Write extra pci roots into fw_cfg Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 11/66] acpi: Extract crs build form acpi_build.c Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 12/66] acpi/gpex: Build tables for pxb Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 13/66] acpi: Align the size to 128k Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 14/66] unit-test: The files changed Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 15/66] unit-test: Add testcase for pxb Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 16/66] unit-test: Add the binary file and clear diff.h Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 17/66] failover: fix indentantion Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 18/66] failover: Use always atomics for primary_should_be_hidden Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 19/66] failover: primary bus is only used once, and where it is set Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 20/66] failover: Remove unused parameter Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 21/66] failover: Remove external partially_hotplugged property Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 22/66] failover: qdev_device_add() returns err or dev set Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 23/66] failover: Rename bool to failover_primary_hidden Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 24/66] failover: g_strcmp0() knows how to handle NULL Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 25/66] failover: Remove primary_device_opts Michael S. Tsirkin
2020-12-08 19:34 ` [PULL 26/66] failover: remove standby_id variable Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 27/66] failover: Remove primary_device_dict Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 28/66] failover: Remove memory leak Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 29/66] failover: simplify virtio_net_find_primary() Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 30/66] failover: should_be_hidden() should take a bool Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 31/66] failover: Rename function to hide_device() Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 32/66] failover: virtio_net_connect_failover_devices() does nothing Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 33/66] failover: Rename to failover_find_primary_device() Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 34/66] failover: simplify qdev_device_add() failover case Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 35/66] failover: simplify qdev_device_add() Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 36/66] failover: make sure that id always exist Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 37/66] failover: remove failover_find_primary_device() error parameter Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 38/66] failover: split failover_find_primary_device_id() Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 39/66] failover: We don't need to cache primary_device_id anymore Michael S. Tsirkin
2020-12-08 19:35 ` [PULL 40/66] failover: Caller of this two functions already have primary_dev Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 41/66] failover: simplify failover_unplug_primary Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 42/66] failover: Remove primary_dev member Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 43/66] hw: add compat machines for 6.0 Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 44/66] libvhost-user: replace qemu/bswap.h with glibc endian.h Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 45/66] libvhost-user: replace qemu/memfd.h usage Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 46/66] libvhost-user: remove qemu/compiler.h usage Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 47/66] libvhost-user: drop qemu/osdep.h dependency Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 48/66] libvhost-user: make it a meson subproject Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 49/66] libvhost-user: check memfd API Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 50/66] libvhost-user: add a simple link test without glib Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 51/66] .gitlab-ci: add build-libvhost-user Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 52/66] contrib/vhost-user-blk: avoid g_return_val_if() input validation Michael S. Tsirkin
2020-12-08 19:36 ` [PULL 53/66] contrib/vhost-user-gpu: " Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 54/66] contrib/vhost-user-input: " Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 55/66] block/export: " Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 56/66] hw/i386/pc: add max combined fw size as machine configuration option Michael S. Tsirkin
2020-12-08 19:37 ` Michael S. Tsirkin [this message]
2020-12-08 19:37 ` [PULL 58/66] x86: acpi: introduce AcpiPmInfo::smi_on_cpu_unplug Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 59/66] tests/acpi: allow expected files change Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 60/66] x86: acpi: let the firmware handle pending "CPU remove" events in SMM Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 61/66] tests/acpi: update expected files Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 62/66] x86: ich9: factor out "guest_cpu_hotplug_features" Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 63/66] x86: ich9: let firmware negotiate 'CPU hot-unplug with SMI' feature Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 64/66] pcie_aer: Fix help message of pcie_aer_inject_error command Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 65/66] hw/virtio-pci Added counter for pcie capabilities offsets Michael S. Tsirkin
2020-12-08 19:37 ` [PULL 66/66] hw/virtio-pci Added AER capability Michael S. Tsirkin
2020-12-08 19:53 ` [PULL 00/66] pc,pci,virtio: fixes, cleanups Philippe Mathieu-Daudé
2020-12-08 20:26   ` Michael S. Tsirkin
2020-12-09 14:37 ` Peter Maydell
2020-12-09 16:20   ` Peter Maydell
2020-12-09 18:05     ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201208193307.646726-58-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.