diff --git a/lib/fmc/core.h b/lib/fmc/core.h
index e9d2a24032eb15ae8b5b92b0dbd1b93fc1f3a322..b927f82392d2ab7fd0e9e9153ca2df8135b5fb0c 100644
--- a/lib/fmc/core.h
+++ b/lib/fmc/core.h
@@ -34,6 +34,8 @@ int fmc_slot_eeprom_type_get(struct fmc_tkn *tkn, unsigned int slot_n,
 			     char *str, size_t max_len);
 int fmc_slot_eeprom_type_set(struct fmc_tkn *tkn, unsigned int slot_n,
                              const char *str, size_t max_len);
+int fmc_slot_eeprom_size(struct fmc_tkn *tkn, unsigned int slot_n,
+			 unsigned int *size);
 int fmc_slot_eeprom_read(struct fmc_tkn *tkn, unsigned int slot_n,
 			 char *buf, size_t len, off_t offset);
 int fmc_slot_eeprom_write(struct fmc_tkn *tkn, unsigned int slot_n,
diff --git a/lib/libfmc.c b/lib/libfmc.c
index ecc50a973078fe3fc17df10bbd92557c444e3216..d7015828a88ee840ee7073a37495f76d6dc7661a 100644
--- a/lib/libfmc.c
+++ b/lib/libfmc.c
@@ -368,6 +368,24 @@ int fmc_slot_eeprom_type_set(struct fmc_tkn *tkn, unsigned int slot_n,
 	return err;
 }
 
+int fmc_slot_eeprom_size(struct fmc_tkn *tkn, unsigned int slot_n,
+			 unsigned int *size)
+{
+	struct fmc_carrier *carrier = (struct fmc_carrier *)tkn;
+	struct fmc_slot *slot = __fmc_slot_get(carrier, slot_n);
+	char len_c[8];
+	unsigned long len;
+
+
+	strncpy(len_c, slot->eeprom_type + 3, sizeof(len_c));
+	len = strtol(len_c, NULL, 10);
+	if (errno == ERANGE || errno == EINVAL)
+		return - 1;
+	*size = (len * 1024) / 8;
+
+	return 0;
+}
+
 int fmc_slot_eeprom_read(struct fmc_tkn *tkn, unsigned int slot_n,
 			 char *buf, size_t len, off_t offset)
 {
diff --git a/tools/fmc-slot-eeprom.c b/tools/fmc-slot-eeprom.c
index 9ae9b95fcd3b83cd20a54a40999ac67b15ee4229..771630d17efe85fcf801e0ef5cee83b1ec735e5b 100644
--- a/tools/fmc-slot-eeprom.c
+++ b/tools/fmc-slot-eeprom.c
@@ -23,7 +23,8 @@ static void help(void)
 		"\t-h  print help\n"
 		"\t-c  carrier number\n"
 		"\t-s  slot number\n"
-		"\t-t  EEPROM type to set\n",
+		"\t-t  EEPROM type to set\n"
+		"\t-d  dump EEPROM content\n",
 		name);
 }
 
@@ -33,6 +34,29 @@ static void print_version(void)
 	       name, git_version, fmc_version_get());
 }
 
+static void print_dump(struct fmc_tkn *fmc, unsigned int slot_n,
+		       const char *eeprom_type)
+{
+	char *buf;
+	unsigned int len;
+	int ret;
+
+	ret = fmc_slot_eeprom_size(fmc, slot_n, &len);
+	if (ret < 0)
+		fputs("Failed to get EEPROM size\n", stderr);
+
+	buf = malloc(len);
+	if (!buf) {
+		fputs("Failed to allocate buffer\n", stderr);
+		return;
+	}
+	ret = fmc_slot_eeprom_read(fmc, slot_n, buf, len, 0);
+	if (ret > 0)
+		fwrite(buf, len, 1, stdout);
+	else
+		fputs("Failed to read EEPROM\n", stderr);
+}
+
 int main(int argc, char *argv[])
 {
 	struct fmc_tkn *fmc;
@@ -41,6 +65,7 @@ int main(int argc, char *argv[])
 	char *eeprom_type = NULL;
 	char eeprom_type_rb[16];
 	int err = 0;
+	int dump = 0;
 	char opt;
 
 	name = strndup(basename(argv[0]), 64);
@@ -48,7 +73,7 @@ int main(int argc, char *argv[])
 		err = -1;
 		goto out_strdup;
 	}
-	while ((opt = getopt(argc, argv, "h?Vc:s:t:")) != -1) {
+	while ((opt = getopt(argc, argv, "h?Vc:s:t:d")) != -1) {
 		switch (opt) {
 		case 'h':
 		case '?':
@@ -71,6 +96,9 @@ int main(int argc, char *argv[])
 		case 't':
 			eeprom_type = optarg;
 			break;
+		case 'd':
+			dump = 1;
+			break;
 		}
 	}
 	if (carr_n == FMC_ID_INVALID || slot_n == FMC_ID_INVALID) {
@@ -90,8 +118,12 @@ int main(int argc, char *argv[])
 	}
 	fmc_slot_eeprom_type_get(fmc, slot_n,
 				 eeprom_type_rb, sizeof(eeprom_type_rb));
-	fprintf(stdout, "fmc-slot.%u.%u EEPROM type %s\n",
-		carr_n, slot_n, eeprom_type_rb);
+	if (dump == 0)
+		fprintf(stdout, "fmc-slot.%u.%u EEPROM type %s\n",
+			carr_n, slot_n, eeprom_type_rb);
+	else
+		print_dump(fmc, slot_n, eeprom_type_rb);
+
 	fmc_carrier_close(fmc);
 out_open:
 out_invalid: