summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2018-09-29 08:01:33 -0700
committerFurquan Shaikh <furquan@google.com>2018-10-06 00:02:12 +0000
commit6fb0448187771e59be95160f738d3367414a02c0 (patch)
tree5c871a25a7e46cbf66fe02f3f06f2ff14a6c6e30 /src
parent84f2c63590abb37d8ac51f4f50b116eae517e2f4 (diff)
downloadcoreboot-6fb0448187771e59be95160f738d3367414a02c0.tar.xz
drivers/generic: Add support for providing DSD properties
This change adds support in generic device driver to add properties to DSD table. This driver can be used by all generic devices that do not need any special handling other than simply adding device properties to be used by OS. BUG=b:112888584 Change-Id: I0ca6614f1ef322397618676bbf6da898bef18990 Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/28796 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r--src/drivers/generic/generic/Kconfig1
-rw-r--r--src/drivers/generic/generic/Makefile.inc2
-rw-r--r--src/drivers/generic/generic/chip.h48
-rw-r--r--src/drivers/generic/generic/generic.c98
4 files changed, 148 insertions, 1 deletions
diff --git a/src/drivers/generic/generic/Kconfig b/src/drivers/generic/generic/Kconfig
index 864b878e9a..7b16b623df 100644
--- a/src/drivers/generic/generic/Kconfig
+++ b/src/drivers/generic/generic/Kconfig
@@ -1,2 +1,3 @@
config DRIVERS_GENERIC_GENERIC
bool
+ depends on HAVE_ACPI_TABLES
diff --git a/src/drivers/generic/generic/Makefile.inc b/src/drivers/generic/generic/Makefile.inc
index b7db25411d..37a873b117 100644
--- a/src/drivers/generic/generic/Makefile.inc
+++ b/src/drivers/generic/generic/Makefile.inc
@@ -1 +1 @@
-# Empty
+ramstage-$(CONFIG_DRIVERS_GENERIC_GENERIC) += generic.c
diff --git a/src/drivers/generic/generic/chip.h b/src/drivers/generic/generic/chip.h
new file mode 100644
index 0000000000..f3c54b687b
--- /dev/null
+++ b/src/drivers/generic/generic/chip.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2018 Google LLC.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __GENERIC_GENERIC_CHIP_H__
+#define __GENERIC_GENERIC_CHIP_H__
+
+#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)
+
+#include <arch/acpi_device.h>
+
+#define MAX_GENERIC_PROPERTY_LIST 10
+
+struct drivers_generic_generic_config {
+ const char *hid; /* ACPI _HID (required) */
+ const char *cid; /* ACPI _CID */
+ const char *name; /* ACPI Device Name */
+ /*
+ * Autogenerated ACPI Device Name if name is not provided in
+ * devicetree.
+ */
+ char autogen_name[5];
+ const char *desc; /* ACPI _DDN */
+ unsigned int uid; /* ACPI _UID */
+
+ /* Generic properties for exporting device-specific data to the OS */
+ struct acpi_dp property_list[MAX_GENERIC_PROPERTY_LIST];
+ int property_count;
+};
+
+#else /* CONFIG_HAVE_ACPI_TABLES */
+
+struct drivers_generic_generic_config { };
+
+#endif /* !CONFIG_HAVE_ACPI_TABLES */
+
+#endif /* __GENERIC_GENERIC_CHIP_H__ */
diff --git a/src/drivers/generic/generic/generic.c b/src/drivers/generic/generic/generic.c
new file mode 100644
index 0000000000..37fbab5c61
--- /dev/null
+++ b/src/drivers/generic/generic/generic.c
@@ -0,0 +1,98 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright 2018 Google LLC
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <arch/acpi_device.h>
+#include <arch/acpigen.h>
+#include <console/console.h>
+#include <device/device.h>
+#include <device/path.h>
+#include <stdint.h>
+#include <string.h>
+#include "chip.h"
+
+static void generic_dev_fill_ssdt_generator(struct device *dev)
+{
+ struct acpi_dp *dsd;
+ struct drivers_generic_generic_config *config = dev->chip_info;
+
+ if (!dev->enabled || !config)
+ return;
+
+ if (!config->hid) {
+ printk(BIOS_ERR, "%s: ERROR: _HID required\n", dev_path(dev));
+ return;
+ }
+
+ acpigen_write_scope(acpi_device_scope(dev));
+ acpigen_write_device(acpi_device_name(dev));
+ acpigen_write_name_string("_HID", config->hid);
+ if (config->cid)
+ acpigen_write_name_string("_CID", config->cid);
+ acpigen_write_name_integer("_UID", config->uid);
+ acpigen_write_name_string("_DDN", config->desc);
+ acpigen_write_STA(acpi_device_status(dev));
+
+ dsd = acpi_dp_new_table("_DSD");
+ acpi_dp_add_property_list(dsd, config->property_list,
+ config->property_count);
+ acpi_dp_write(dsd);
+
+ acpigen_pop_len(); /* Device */
+ acpigen_pop_len(); /* Scope */
+
+ printk(BIOS_INFO, "%s: %s at %s\n", acpi_device_path(dev),
+ config->desc ? : dev->chip_ops->name, dev_path(dev));
+}
+
+static char *generic_autogen_name(struct drivers_generic_generic_config *config)
+{
+ char *name = &config->autogen_name[0];
+ static unsigned int id;
+
+ if (name[0] != '\0')
+ return name;
+
+ snprintf(name, sizeof(name), "G%03.3X", id++);
+ name[4] = '\0';
+ return name;
+}
+
+static const char *generic_dev_acpi_name(const struct device *dev)
+{
+ struct drivers_generic_generic_config *config = dev->chip_info;
+
+ if (config->name)
+ return config->name;
+
+ return generic_autogen_name(config);
+}
+
+static struct device_operations generic_dev_ops = {
+ .read_resources = DEVICE_NOOP,
+ .set_resources = DEVICE_NOOP,
+ .enable_resources = DEVICE_NOOP,
+ .acpi_name = &generic_dev_acpi_name,
+ .acpi_fill_ssdt_generator = &generic_dev_fill_ssdt_generator,
+};
+
+static void generic_dev_enable(struct device *dev)
+{
+ dev->ops = &generic_dev_ops;
+}
+
+struct chip_operations drivers_generic_generic_ops = {
+ CHIP_NAME("Generic Device")
+ .enable_dev = &generic_dev_enable
+};