]> git.proxmox.com Git - mirror_qemu.git/blame - docs/specs/acpi_nvdimm.txt
spapr: update spapr hotplug documentation
[mirror_qemu.git] / docs / specs / acpi_nvdimm.txt
CommitLineData
15b82b1d
XG
1QEMU<->ACPI BIOS NVDIMM interface
2---------------------------------
3
4QEMU supports NVDIMM via ACPI. This document describes the basic concepts of
5NVDIMM ACPI and the interface between QEMU and the ACPI BIOS.
6
7NVDIMM ACPI Background
8----------------------
9NVDIMM is introduced in ACPI 6.0 which defines an NVDIMM root device under
10_SB scope with a _HID of “ACPI0012”. For each NVDIMM present or intended
11to be supported by platform, platform firmware also exposes an ACPI
12Namespace Device under the root device.
13
14The NVDIMM child devices under the NVDIMM root device are defined with _ADR
15corresponding to the NFIT device handle. The NVDIMM root device and the
16NVDIMM devices can have device specific methods (_DSM) to provide additional
17functions specific to a particular NVDIMM implementation.
18
19This is an example from ACPI 6.0, a platform contains one NVDIMM:
20
21Scope (\_SB){
22 Device (NVDR) // Root device
23 {
24 Name (_HID, “ACPI0012”)
25 Method (_STA) {...}
26 Method (_FIT) {...}
27 Method (_DSM, ...) {...}
28 Device (NVD)
29 {
30 Name(_ADR, h) //where h is NFIT Device Handle for this NVDIMM
31 Method (_DSM, ...) {...}
32 }
33 }
34}
35
36Method supported on both NVDIMM root device and NVDIMM device
37_DSM (Device Specific Method)
38 It is a control method that enables devices to provide device specific
39 control functions that are consumed by the device driver.
40 The NVDIMM DSM specification can be found at:
41 http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf
42
43 Arguments:
44 Arg0 – A Buffer containing a UUID (16 Bytes)
45 Arg1 – An Integer containing the Revision ID (4 Bytes)
46 Arg2 – An Integer containing the Function Index (4 Bytes)
47 Arg3 – A package containing parameters for the function specified by the
48 UUID, Revision ID, and Function Index
49
50 Return Value:
51 If Function Index = 0, a Buffer containing a function index bitfield.
52 Otherwise, the return value and type depends on the UUID, revision ID
53 and function index which are described in the DSM specification.
54
55Methods on NVDIMM ROOT Device
56_FIT(Firmware Interface Table)
57 It evaluates to a buffer returning data in the format of a series of NFIT
58 Type Structure.
59
60 Arguments: None
61
62 Return Value:
63 A Buffer containing a list of NFIT Type structure entries.
64
65 The detailed definition of the structure can be found at ACPI 6.0: 5.2.25
66 NVDIMM Firmware Interface Table (NFIT).
67
68QEMU NVDIMM Implemention
69========================
70QEMU uses 4 bytes IO Port starting from 0x0a18 and a RAM-based memory page
71for NVDIMM ACPI.
72
73Memory:
74 QEMU uses BIOS Linker/loader feature to ask BIOS to allocate a memory
75 page and dynamically patch its into a int32 object named "MEMA" in ACPI.
76
77 This page is RAM-based and it is used to transfer data between _DSM
78 method and QEMU. If ACPI has control, this pages is owned by ACPI which
79 writes _DSM input data to it, otherwise, it is owned by QEMU which
80 emulates _DSM access and writes the output data to it.
81
82 ACPI writes _DSM Input Data (based on the offset in the page):
83 [0x0 - 0x3]: 4 bytes, NVDIMM Device Handle, 0 is reserved for NVDIMM
84 Root device.
85 [0x4 - 0x7]: 4 bytes, Revision ID, that is the Arg1 of _DSM method.
86 [0x8 - 0xB]: 4 bytes. Function Index, that is the Arg2 of _DSM method.
87 [0xC - 0xFFF]: 4084 bytes, the Arg3 of _DSM method.
88
89 QEMU Writes Output Data (based on the offset in the page):
90 [0x0 - 0x3]: 4 bytes, the length of result
91 [0x4 - 0xFFF]: 4092 bytes, the DSM result filled by QEMU
92
93IO Port 0x0a18 - 0xa1b:
94 ACPI writes the address of the memory page allocated by BIOS to this
95 port then QEMU gets the control and fills the result in the memory page.
96
97 write Access:
98 [0x0a18 - 0xa1b]: 4 bytes, the address of the memory page allocated
99 by BIOS.
100
101_DSM process diagram:
102---------------------
103"MEMA" indicates the address of memory page allocated by BIOS.
104
105 +----------------------+   +-----------------------+
106 |   1. OSPM   |      | 2. OSPM |
107 | save _DSM input data | | write "MEMA" to | Exit to QEMU
108 | to the page +----->| IO port 0x0a18 +------------+
109 | indicated by "MEMA" | | | |
110 +----------------------+ +-----------------------+ |
111  |
112  v
113 +------------- ----+ +-----------+ +------------------+--------+
114 | 5 QEMU | | 4 QEMU | | 3. QEMU |
115 | write _DSM result | | emulate | | get _DSM input data from |
116 | to the page +<------+ _DSM +<-----+ the page indicated by the |
117 | | | | | value from the IO port |
118 +--------+-----------+ +-----------+ +---------------------------+
119 |
120 | Enter Guest
121 |
122 v
123 +--------------------------+ +--------------+
124 | 6 OSPM | | 7 OSPM |
125 | result size is returned | | _DSM return |
126 | by reading DSM +----->+ |
127 | result from the page | | |
128 +--------------------------+ +--------------+
129
130 _FIT implementation
131 -------------------
132 TODO (will fill it when nvdimm hotplug is introduced)