platform/mosys: add initial Dedede support

BUG=b:146693923
TEST=cros_workon-dedede start mosys; emerge-dedede mosys

Change-Id: Icaecf8f73393e046febb79a4496c24d6a697c5bc
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/mosys/+/1978722
Reviewed-by: Justin TerAvest <teravest@chromium.org>
Tested-by: Justin TerAvest <teravest@chromium.org>
diff --git a/platform/dedede/dedede.c b/platform/dedede/dedede.c
new file mode 100644
index 0000000..ded55e9
--- /dev/null
+++ b/platform/dedede/dedede.c
@@ -0,0 +1,67 @@
+
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "mosys/command_list.h"
+#include "mosys/platform.h"
+#include "mosys/intf_list.h"
+
+#include "drivers/google/cros_ec.h"
+
+#include "lib/cros_config.h"
+#include "lib/elog.h"
+
+#include "dedede.h"
+
+struct platform_cmd *dedede_sub[] = {
+	&cmd_ec,
+	&cmd_eeprom,
+	&cmd_memory,
+	&cmd_pd,
+	&cmd_platform,
+	&cmd_eventlog,
+	NULL
+};
+
+int dedede_probe(struct platform_intf *intf)
+{
+	/* cros_config model.yaml 'platform-name' should match intf.name. */
+	return cros_config_probe(intf, NULL);
+}
+
+/* late setup routine; not critical to core functionality */
+static int dedede_setup_post(struct platform_intf *intf)
+{
+	if (cros_ec_setup(intf) < 0)
+		return -1;
+
+	return 0;
+}
+
+struct eventlog_cb dedede_eventlog_cb = {
+	.print_type	= &elog_print_type,
+	.print_data	= &elog_print_data,
+	.print_multi	= &elog_print_multi,
+	.verify		= &elog_verify,
+	.verify_header	= &elog_verify_header,
+	.fetch		= &elog_fetch_from_smbios,
+};
+
+struct platform_cb dedede_cb = {
+	.ec		= &cros_ec_cb,
+	.eeprom		= &dedede_eeprom_cb,
+	.memory		= &dedede_memory_cb,
+	.sys 		= &dedede_sys_cb,
+	.eventlog	= &dedede_eventlog_cb,
+};
+
+struct platform_intf platform_dedede = {
+	.type		= PLATFORM_X86_64,
+	.name		= "Dedede",
+	.sub		= dedede_sub,
+	.cb		= &dedede_cb,
+	.probe		= &dedede_probe,
+	.setup_post	= &dedede_setup_post,
+};
diff --git a/platform/dedede/dedede.h b/platform/dedede/dedede.h
new file mode 100644
index 0000000..375890c
--- /dev/null
+++ b/platform/dedede/dedede.h
@@ -0,0 +1,19 @@
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef PLATFORM_DEDEDE_H__
+#define PLATFORM_DEDEDE_H__
+
+#include <inttypes.h>
+#include "mosys/platform.h"
+
+#define DEDEDE_HOST_FIRMWARE_ROM_SIZE	(16384 * 1024)
+
+/* platform callbacks */
+extern struct eeprom_cb dedede_eeprom_cb;	/* eeprom.c */
+extern struct memory_cb dedede_memory_cb;	/* memory.c */
+extern struct sys_cb dedede_sys_cb;		/* sys.c */
+
+#endif
diff --git a/platform/dedede/eeprom.c b/platform/dedede/eeprom.c
new file mode 100644
index 0000000..741d641
--- /dev/null
+++ b/platform/dedede/eeprom.c
@@ -0,0 +1,93 @@
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include <fmap.h>
+
+#include "mosys/alloc.h"
+#include "mosys/platform.h"
+#include "mosys/log.h"
+
+#include "lib/eeprom.h"
+#include "lib/flashrom.h"
+#include "lib/smbios.h"
+
+#include "dedede.h"
+
+
+static int host_firmware_size(struct platform_intf *intf)
+{
+	return DEDEDE_HOST_FIRMWARE_ROM_SIZE;
+}
+
+static int host_firmware_read(struct platform_intf *intf,
+			      struct eeprom *eeprom,
+			      unsigned int offset,
+			      unsigned int len,
+			      void *data)
+{
+	uint8_t *buf;
+	size_t rom_size;
+
+	rom_size = eeprom->device->size(intf);
+	buf = mosys_malloc(rom_size);
+
+	if (flashrom_read(buf, rom_size, HOST_FIRMWARE, NULL) < 0)
+		return -1;
+
+	memcpy(data, &buf[offset], len);
+	free(buf);
+	return 0;
+}
+
+static int host_firmware_read_by_name(struct platform_intf *intf,
+				      struct eeprom *eeprom,
+				      const char *name,
+				      uint8_t **data)
+{
+	return flashrom_read_by_name(data, HOST_FIRMWARE, name);
+}
+
+static int host_firmware_write_by_name(struct platform_intf *intf,
+				       struct eeprom *eeprom,
+				       const char *name,
+				       unsigned int len,
+				       uint8_t *data)
+{
+	return flashrom_write_by_name(len, data, HOST_FIRMWARE, name);
+}
+
+static struct eeprom_dev host_firmware = {
+	.size		= host_firmware_size,
+	.read		= host_firmware_read,
+	.read_by_name	= host_firmware_read_by_name,
+	.write_by_name	= host_firmware_write_by_name,
+	.get_map	= eeprom_get_fmap,
+};
+
+static struct eeprom_region host_firmware_regions[] = {
+	{
+		.name	= "RW_NVRAM",
+		.flag	= EEPROM_FLAG_VBNV,
+	},
+	{ 0 },
+};
+
+static struct eeprom eeproms[] = {
+	{
+		.name		= "host_firmware",
+		.type		= EEPROM_TYPE_FW,
+		.flags		= EEPROM_FLAG_RDWR | EEPROM_FLAG_FMAP,
+		.device		= &host_firmware,
+		.regions	= &host_firmware_regions[0],
+	},
+	{ 0 },
+};
+
+struct eeprom_cb dedede_eeprom_cb = {
+	.eeprom_list	= eeproms,
+};
diff --git a/platform/dedede/memory.c b/platform/dedede/memory.c
new file mode 100644
index 0000000..adaf4f1
--- /dev/null
+++ b/platform/dedede/memory.c
@@ -0,0 +1,14 @@
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "lib/nonspd.h"
+#include "lib/smbios.h"
+#include "dedede.h"
+
+struct memory_cb dedede_memory_cb = {
+	.dimm_count		= smbios_dimm_count,
+	.dimm_speed		= smbios_dimm_speed,
+	.nonspd_mem_info	= &spd_set_nonspd_info,
+};
diff --git a/platform/dedede/meson.build b/platform/dedede/meson.build
new file mode 100644
index 0000000..7ffc697
--- /dev/null
+++ b/platform/dedede/meson.build
@@ -0,0 +1,6 @@
+libmosys_src += files(
+  'eeprom.c',
+  'memory.c',
+  'sys.c',
+  'dedede.c',
+)
diff --git a/platform/dedede/sys.c b/platform/dedede/sys.c
new file mode 100644
index 0000000..b5e20cd
--- /dev/null
+++ b/platform/dedede/sys.c
@@ -0,0 +1,27 @@
+/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "mosys/alloc.h"
+#include "mosys/platform.h"
+
+#include "lib/acpi.h"
+#include "lib/sku.h"
+#include "lib/smbios.h"
+#include "lib/string.h"
+
+static char *dedede_get_name(struct platform_intf *intf)
+{
+	return mosys_strdup(intf->name);
+}
+
+struct sys_cb dedede_sys_cb = {
+	.version		= &smbios_sysinfo_get_version,
+	.vendor			= &smbios_sysinfo_get_vendor,
+	.name			= &dedede_get_name,
+	.family			= &smbios_sysinfo_get_family,
+	.firmware_vendor	= &smbios_bios_get_vendor,
+	.sku_number		= &smbios_sysinfo_get_sku_number,
+	.signature_id           = sku_get_signature_id,
+};
diff --git a/platform/meson.build b/platform/meson.build
index 3246ead..8c67b9b 100644
--- a/platform/meson.build
+++ b/platform/meson.build
@@ -7,6 +7,7 @@
 subdir('cheza')
 subdir('cyan')
 subdir('cyclone')
+subdir('dedede')
 subdir('dummy')
 subdir('fizz')
 subdir('glados')
diff --git a/platform/platform_list.c b/platform/platform_list.c
index 620cc15..317e876 100644
--- a/platform/platform_list.c
+++ b/platform/platform_list.c
@@ -43,6 +43,7 @@
 extern struct platform_intf platform_coral;
 extern struct platform_intf platform_cyan;
 extern struct platform_intf platform_cyclone;
+extern struct platform_intf platform_dedede;
 extern struct platform_intf platform_drallion;
 extern struct platform_intf platform_fizz;
 extern struct platform_intf platform_flapjack;
@@ -82,6 +83,7 @@
 	&platform_slippy,
 	&platform_strago,
 #ifdef CONFIG_CROS_CONFIG
+        &platform_dedede,
 	&platform_fizz,
 	&platform_kahlee,
 	&platform_hatch,