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