| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved |
| */ |
| |
| #include "qemu/osdep.h" |
| #include "hw/acpi/acpi_generic_initiator.h" |
| #include "hw/boards.h" |
| #include "qemu/error-report.h" |
| |
| typedef struct AcpiGenericInitiatorClass { |
| ObjectClass parent_class; |
| } AcpiGenericInitiatorClass; |
| |
| OBJECT_DEFINE_TYPE_WITH_INTERFACES(AcpiGenericInitiator, acpi_generic_initiator, |
| ACPI_GENERIC_INITIATOR, OBJECT, |
| { TYPE_USER_CREATABLE }, |
| { NULL }) |
| |
| OBJECT_DECLARE_SIMPLE_TYPE(AcpiGenericInitiator, ACPI_GENERIC_INITIATOR) |
| |
| static void acpi_generic_initiator_init(Object *obj) |
| { |
| AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj); |
| |
| gi->node = MAX_NODES; |
| gi->pci_dev = NULL; |
| } |
| |
| static void acpi_generic_initiator_finalize(Object *obj) |
| { |
| AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj); |
| |
| g_free(gi->pci_dev); |
| } |
| |
| static void acpi_generic_initiator_set_pci_device(Object *obj, const char *val, |
| Error **errp) |
| { |
| AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj); |
| |
| gi->pci_dev = g_strdup(val); |
| } |
| |
| static void acpi_generic_initiator_set_node(Object *obj, Visitor *v, |
| const char *name, void *opaque, |
| Error **errp) |
| { |
| AcpiGenericInitiator *gi = ACPI_GENERIC_INITIATOR(obj); |
| uint32_t value; |
| |
| if (!visit_type_uint32(v, name, &value, errp)) { |
| return; |
| } |
| |
| if (value >= MAX_NODES) { |
| error_printf("%s: Invalid NUMA node specified\n", |
| TYPE_ACPI_GENERIC_INITIATOR); |
| exit(1); |
| } |
| |
| gi->node = value; |
| } |
| |
| static void acpi_generic_initiator_class_init(ObjectClass *oc, void *data) |
| { |
| object_class_property_add_str(oc, "pci-dev", NULL, |
| acpi_generic_initiator_set_pci_device); |
| object_class_property_add(oc, "node", "int", NULL, |
| acpi_generic_initiator_set_node, NULL, NULL); |
| } |