From: Ding Tianhong <dingtianhong(a)huawei.com>
ascend inclusion
category: feature
bugzilla: NA
CVE: NA
-------------------------------------------------
The Ascend910 platform only use the acpi mode to boot system,
the oem message is recorded in the oem_table_id of IORT table,
so use the oem message to enable the ascend features.
Signed-off-by: Ding Tianhong <dingtianhong(a)huawei.com>
Reviewed-by: Hanjun Guo <guohanjun(a)huawei.com>
Signed-off-by: Yang Yingliang <yangyingliang(a)huawei.com>
---
arch/arm64/mm/init.c | 7 ++++++-
drivers/acpi/arm64/iort.c | 24 ++++++++++++++++++++++++
include/linux/init.h | 7 +++++++
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 883350f9cc42..f23da539a476 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -769,7 +769,7 @@ __setup("keepinitrd", keepinitrd_setup);
#endif
#ifdef CONFIG_ASCEND_FEATURES
-static int __init ascend_enable_setup(char *__unused)
+void ascend_enable_all_features(void)
{
if (IS_ENABLED(CONFIG_ASCEND_DVPP_MMAP))
enable_mmap_dvpp = 1;
@@ -782,6 +782,11 @@ static int __init ascend_enable_setup(char *__unused)
if (IS_ENABLED(CONFIG_SUSPEND))
mem_sleep_current = PM_SUSPEND_ON;
+}
+
+static int __init ascend_enable_setup(char *__unused)
+{
+ ascend_enable_all_features();
return 1;
}
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
index 5a724bdb4a4d..7408ffab7303 100644
--- a/drivers/acpi/arm64/iort.c
+++ b/drivers/acpi/arm64/iort.c
@@ -25,6 +25,7 @@
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
+#include <linux/init.h>
#define IORT_TYPE_MASK(type) (1 << (type))
#define IORT_MSI_TYPE (1 << ACPI_IORT_NODE_ITS_GROUP)
@@ -1639,6 +1640,26 @@ static void __init iort_init_platform_devices(void)
}
}
+/*
+ * This function detects the ascend platform by oem table id.
+ */
+static bool ascend_platform_detected(struct acpi_table_header *h)
+{
+ if (!memcmp(h->oem_table_id, "HI19801P", ACPI_OEM_TABLE_ID_SIZE))
+ return true;
+
+ if (!memcmp(h->oem_table_id, "HI19802P", ACPI_OEM_TABLE_ID_SIZE))
+ return true;
+
+ if (!memcmp(h->oem_table_id, "HI19804P", ACPI_OEM_TABLE_ID_SIZE))
+ return true;
+
+ if (!memcmp(h->oem_table_id, "HI1980\0\0", ACPI_OEM_TABLE_ID_SIZE))
+ return true;
+
+ return false;
+}
+
void __init acpi_iort_init(void)
{
acpi_status status;
@@ -1654,5 +1675,8 @@ void __init acpi_iort_init(void)
return;
}
+ if (ascend_platform_detected(iort_table))
+ ascend_enable_all_features();
+
iort_init_platform_devices();
}
diff --git a/include/linux/init.h b/include/linux/init.h
index 2538d176dd1f..e6f970ac7bf4 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -306,4 +306,11 @@ void __init parse_early_options(char *cmdline);
#define __exit_p(x) NULL
#endif
+#ifndef __ASSEMBLY__
+#ifdef CONFIG_ASCEND_FEATURES
+extern void ascend_enable_all_features(void);
+#else
+static inline void ascend_enable_all_features(void) { }
+#endif
+#endif
#endif /* _LINUX_INIT_H */
--
2.25.1