aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/acpi_mem_hotplug.rst
blob: 069819bc3e01e57daee278257c9225491d646df8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
QEMU<->ACPI BIOS memory hotplug interface
=========================================

ACPI BIOS GPE.3 handler is dedicated for notifying OS about memory hot-add
and hot-remove events.

Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access)
----------------------------------------------------------------

Read access behavior
^^^^^^^^^^^^^^^^^^^^

[0x0-0x3]
  Lo part of memory device phys address
[0x4-0x7]
  Hi part of memory device phys address
[0x8-0xb]
  Lo part of memory device size in bytes
[0xc-0xf]
  Hi part of memory device size in bytes
[0x10-0x13]
  Memory device proximity domain
[0x14]
  Memory device status fields

  bits:

  0:
    Device is enabled and may be used by guest
  1:
    Device insert event, used to distinguish device for which
    no device check event to OSPM was issued.
    It's valid only when bit 1 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

[0x15-0x17]
  reserved

Write access behavior
^^^^^^^^^^^^^^^^^^^^^


[0x0-0x3]
  Memory device slot selector, selects active memory device.
  All following accesses to other registers in 0xa00-0xa17
  region will read/store data from/to selected memory device.
[0x4-0x7]
  OST event code reported by OSPM
[0x8-0xb]
  OST status code reported by OSPM
[0xc-0x13]
  reserved, writes into it are ignored
[0x14]
  Memory device control fields

  bits:

  0:
    reserved, OSPM must clear it before writing to register.
    Due to BUG in versions prior 2.4 that field isn't cleared
    when other fields are written. Keep it reserved and don't
    try to reuse it.
  1:
    if set to 1 clears device insert event, set by OSPM
    after it has emitted device check event for the
    selected memory device
  2:
    if set to 1 clears device remove event, set by OSPM
    after it has emitted device eject request for the
    selected memory device
  3:
    if set to 1 initiates device eject, set by OSPM when it
    triggers memory device removal and calls _EJ0 method
  4-7:
    reserved, OSPM must clear them before writing to register

Selecting memory device slot beyond present range has no effect on platform:

- write accesses to memory hot-plug registers not documented above are ignored
- read accesses to memory hot-plug registers not documented above return
  all bits set to 1.

Memory hot remove process diagram
---------------------------------

::

   +-------------+     +-----------------------+      +------------------+
   |  1. QEMU    |     | 2. QEMU               |      |3. QEMU           |
   |  device_del +---->+ device unplug request +----->+Send SCI to guest,|
   |             |     |         cb            |      |return control to |
   |             |     |                       |      |management        |
   +-------------+     +-----------------------+      +------------------+

   +---------------------------------------------------------------------+

   +---------------------+              +-------------------------+
   | OSPM:               | remove event | OSPM:                   |
   | send Eject Request, |              | Scan memory devices     |
   | clear remove event  +<-------------+ for event flags         |
   |                     |              |                         |
   +---------------------+              +-------------------------+
             |
             |
   +---------v--------+            +-----------------------+
   | Guest OS:        |  success   | OSPM:                 |
   | process Ejection +----------->+ Execute _EJ0 method,  |
   | request          |            | set eject bit in flags|
   +------------------+            +-----------------------+
             |failure                         |
             v                                v
   +------------------------+      +-----------------------+
   | OSPM:                  |      | QEMU:                 |
   | set OST event & status |      | call device unplug cb |
   | fields                 |      |                       |
   +------------------------+      +-----------------------+
            |                                  |
            v                                  v
   +------------------+              +-------------------+
   |QEMU:             |              |QEMU:              |
   |Send OST QMP event|              |Send device deleted|
   |                  |              |QMP event          |
   +------------------+              |                   |
                                     +-------------------+