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,