2 * IPMI ACPI firmware handling
4 * Copyright (c) 2015,2016 Corey Minyard, MontaVista Software, LLC
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
10 #include "qemu/osdep.h"
11 #include "hw/ipmi/ipmi.h"
12 #include "hw/acpi/aml-build.h"
13 #include "hw/acpi/acpi.h"
14 #include "hw/acpi/ipmi.h"
16 static Aml
*aml_ipmi_crs(IPMIFwInfo
*info
)
18 Aml
*crs
= aml_resource_template();
21 * The base address is fixed and cannot change. That may be different
22 * if someone does PCI, but we aren't there yet.
24 switch (info
->memspace
) {
25 case IPMI_MEMSPACE_IO
:
26 aml_append(crs
, aml_io(AML_DECODE16
, info
->base_address
,
27 info
->base_address
+ info
->register_length
- 1,
28 info
->register_spacing
, info
->register_length
));
30 case IPMI_MEMSPACE_MEM32
:
32 aml_dword_memory(AML_POS_DECODE
,
33 AML_MIN_FIXED
, AML_MAX_FIXED
,
34 AML_NON_CACHEABLE
, AML_READ_WRITE
,
37 info
->base_address
+ info
->register_length
- 1,
38 info
->register_spacing
, info
->register_length
));
40 case IPMI_MEMSPACE_MEM64
:
42 aml_qword_memory(AML_POS_DECODE
,
43 AML_MIN_FIXED
, AML_MAX_FIXED
,
44 AML_NON_CACHEABLE
, AML_READ_WRITE
,
45 0xffffffffffffffffULL
,
47 info
->base_address
+ info
->register_length
- 1,
48 info
->register_spacing
, info
->register_length
));
50 case IPMI_MEMSPACE_SMBUS
:
51 aml_append(crs
, aml_i2c_serial_bus_device(info
->base_address
,
58 if (info
->interrupt_number
) {
59 aml_append(crs
, aml_irq_no_flags(info
->interrupt_number
));
65 void build_ipmi_dev_aml(AcpiDevAmlIf
*adev
, Aml
*scope
)
69 IPMIInterface
*ii
= IPMI_INTERFACE(adev
);
70 IPMIInterfaceClass
*iic
= IPMI_INTERFACE_GET_CLASS(ii
);
73 iic
->get_fwinfo(ii
, &info
);
74 assert(info
.ipmi_spec_minor_revision
<= 15);
75 version
= ((info
.ipmi_spec_major_revision
<< 8)
76 | (info
.ipmi_spec_minor_revision
<< 4));
78 dev
= aml_device("MI%d", info
.uuid
);
79 aml_append(dev
, aml_name_decl("_HID", aml_eisaid("IPI0001")));
80 aml_append(dev
, aml_name_decl("_STR", aml_string("ipmi_%s",
81 info
.interface_name
)));
82 aml_append(dev
, aml_name_decl("_UID", aml_int(info
.uuid
)));
83 aml_append(dev
, aml_name_decl("_CRS", aml_ipmi_crs(&info
)));
84 aml_append(dev
, aml_name_decl("_IFT", aml_int(info
.interface_type
)));
85 aml_append(dev
, aml_name_decl("_SRV", aml_int(version
)));
87 aml_append(scope
, dev
);