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();
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);