xref: /qemu/hw/acpi/acpi_generic_initiator.c (revision b64b7ed8)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved
4  */
5 
6 #include "qemu/osdep.h"
7 #include "hw/acpi/acpi_generic_initiator.h"
8 #include "hw/boards.h"
9 #include "qemu/error-report.h"
10 
11 typedef struct AcpiGenericInitiatorClass {
12     ObjectClass parent_class;
13 } AcpiGenericInitiatorClass;
14 
15 OBJECT_DEFINE_TYPE_WITH_INTERFACES(AcpiGenericInitiator, acpi_generic_initiator,
16                    ACPI_GENERIC_INITIATOR, OBJECT,
17                    { TYPE_USER_CREATABLE },
18                    { NULL })
19 
20 OBJECT_DECLARE_SIMPLE_TYPE(AcpiGenericInitiator, ACPI_GENERIC_INITIATOR)
21 
22 static void acpi_generic_initiator_init(Object *obj)
23 {
24     AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj);
25 
26     gi->node = MAX_NODES;
27     gi->pci_dev = NULL;
28 }
29 
30 static void acpi_generic_initiator_finalize(Object *obj)
31 {
32     AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj);
33 
34     g_free(gi->pci_dev);
35 }
36 
37 static void acpi_generic_initiator_set_pci_device(Object *obj, const char *val,
38                                                   Error **errp)
39 {
40     AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj);
41 
42     gi->pci_dev = g_strdup(val);
43 }
44 
45 static void acpi_generic_initiator_set_node(Object *obj, Visitor *v,
46                                             const char *name, void *opaque,
47                                             Error **errp)
48 {
49     AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj);
50     uint32_t value;
51 
52     if (!visit_type_uint32(v, name, &value, errp)) {
53         return;
54     }
55 
56     if (value >= MAX_NODES) {
57         error_printf("%s: Invalid NUMA node specified\n",
58                      TYPE_ACPI_GENERIC_INITIATOR);
59         exit(1);
60     }
61 
62     gi->node = value;
63 }
64 
65 static void acpi_generic_initiator_class_init(ObjectClass *oc, void *data)
66 {
67     object_class_property_add_str(oc, "pci-dev", NULL,
68         acpi_generic_initiator_set_pci_device);
69     object_class_property_add(oc, "node", "int", NULL,
70         acpi_generic_initiator_set_node, NULL, NULL);
71 }
72