diff mbox series

[v1,1/7] toradex: tdx-cfg-block: add EEPROM read/store wrappers

Message ID 1592857680-637-2-git-send-email-igor.opaniuk@gmail.com
State New
Headers show
Series Toradex: EEPROM storage support for Config Block | expand

Commit Message

Igor Opaniuk June 22, 2020, 8:27 p.m. UTC
From: Igor Opaniuk <igor.opaniuk at toradex.com>

These functions wrap functionality for storing config blocks in EEPROM.

Signed-off-by: Igor Opaniuk <igor.opaniuk at toradex.com>
---

 board/toradex/common/Makefile     |  1 +
 board/toradex/common/tdx-eeprom.c | 90 +++++++++++++++++++++++++++++++++++++++
 board/toradex/common/tdx-eeprom.h | 14 ++++++
 3 files changed, 105 insertions(+)
 create mode 100644 board/toradex/common/tdx-eeprom.c
 create mode 100644 board/toradex/common/tdx-eeprom.h
diff mbox series

Patch

diff --git a/board/toradex/common/Makefile b/board/toradex/common/Makefile
index 6b9fccb..7b19b6e 100644
--- a/board/toradex/common/Makefile
+++ b/board/toradex/common/Makefile
@@ -8,4 +8,5 @@  obj- := __dummy__.o
 else
 obj-$(CONFIG_TDX_CFG_BLOCK) += tdx-cfg-block.o
 obj-y += tdx-common.o
+obj-y += tdx-eeprom.o
 endif
diff --git a/board/toradex/common/tdx-eeprom.c b/board/toradex/common/tdx-eeprom.c
new file mode 100644
index 0000000..fbc267d
--- /dev/null
+++ b/board/toradex/common/tdx-eeprom.c
@@ -0,0 +1,90 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (c) 2020 Toradex
+ */
+
+#include <dm.h>
+#include <i2c_eeprom.h>
+#include <linux/errno.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+static int get_tdx_eeprom(u32 eeprom_id, struct udevice **devp)
+{
+	int ret = 0;
+	int node;
+	ofnode eeprom;
+	char eeprom_str[16];
+	const char *path;
+
+	if (!gd->fdt_blob) {
+		printf("%s: don't have a valid gd->fdt_blob!\n", __func__);
+		return -EFAULT;
+	}
+
+	node = fdt_path_offset(gd->fdt_blob, "/aliases");
+	if (node < 0)
+		return -ENODEV;
+
+	sprintf(eeprom_str, "eeprom%d", eeprom_id);
+
+	path = fdt_getprop(gd->fdt_blob, node, eeprom_str, NULL);
+	if (!path) {
+		printf("%s: no alias for %s\n", __func__, eeprom_str);
+		return -ENODEV;
+	}
+
+	eeprom = ofnode_path(path);
+	if (!ofnode_valid(eeprom)) {
+		printf("%s: invalid hardware path to EEPROM\n", __func__);
+		return -ENODEV;
+	}
+
+	ret = uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, devp);
+	if (ret) {
+		printf("%s: cannot find EEPROM by node\n", __func__);
+		return ret;
+	}
+
+	return ret;
+}
+
+int read_tdx_eeprom_data(u32 eeprom_id, int offset, u8 *buf,
+			 int size)
+{
+	struct udevice *dev;
+	int ret;
+
+	ret = get_tdx_eeprom(eeprom_id, &dev);
+	if (ret)
+		return ret;
+
+	ret = i2c_eeprom_read(dev, 0x0, buf, size);
+	if (ret) {
+		printf("%s: error reading data from EEPROM id: %d!, ret = %d\n",
+		       __func__, eeprom_id, ret);
+		return ret;
+	}
+
+	return ret;
+}
+
+int write_tdx_eeprom_data(u32 eeprom_id, int offset, u8 *buf,
+			  int size)
+{
+	struct udevice *dev;
+	int ret;
+
+	ret = get_tdx_eeprom(eeprom_id, &dev);
+	if (ret)
+		return ret;
+
+	ret = i2c_eeprom_write(dev, 0x0, buf, size);
+	if (ret) {
+		printf("%s: error writing data to EEPROM id: %d, ret = %d\n",
+		       __func__, eeprom_id, ret);
+		return ret;
+	}
+
+	return ret;
+}
diff --git a/board/toradex/common/tdx-eeprom.h b/board/toradex/common/tdx-eeprom.h
new file mode 100644
index 0000000..a6772d2
--- /dev/null
+++ b/board/toradex/common/tdx-eeprom.h
@@ -0,0 +1,14 @@ 
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (c) 2020 Toradex
+ */
+
+#ifndef _TDX_EEPROM_H
+#define _TDX_EEPROM_H
+
+#include <i2c_eeprom.h>
+
+int read_tdx_eeprom_data(u32 eeprom_id, int offset, uint8_t *buf, int size);
+int write_tdx_eeprom_data(u32 eeprom_id, int offset, uint8_t *buf, int size);
+
+#endif /* _TDX_EEPROM_H */