All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Herrmann <morpheus.ibis@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 08/11] DM: use new blockdev API in ext2
Date: Thu, 20 Sep 2012 21:37:44 +0200	[thread overview]
Message-ID: <1348169867-2917-9-git-send-email-morpheus.ibis@gmail.com> (raw)
In-Reply-To: <1348169867-2917-1-git-send-email-morpheus.ibis@gmail.com>

cmd_ext2dm.c is a copy of cmd_ext2.c with just trivial changes, but those touch
large portion of the lines due to different number of parameters (old API has a
separate parameter for interface and for disk number, new API has this as one)

Signed-off-by: Pavel Herrmann <morpheus.ibis@gmail.com>
---
 common/Makefile     |   3 +-
 common/cmd_ext2dm.c | 211 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 fs/ext2/Makefile    |   7 +-
 fs/ext2/dev_dm.c    | 107 ++++++++++++++++++++++++++
 include/ext2fs.h    |   9 ++-
 5 files changed, 334 insertions(+), 3 deletions(-)
 create mode 100644 common/cmd_ext2dm.c
 create mode 100644 fs/ext2/dev_dm.c

diff --git a/common/Makefile b/common/Makefile
index 29e5798..22f9234 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -87,10 +87,11 @@ COBJS-$(CONFIG_ENV_IS_IN_EEPROM) += cmd_eeprom.o
 COBJS-$(CONFIG_CMD_EEPROM) += cmd_eeprom.o
 COBJS-$(CONFIG_CMD_ELF) += cmd_elf.o
 COBJS-$(CONFIG_SYS_HUSH_PARSER) += cmd_exit.o
-COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2.o
 ifdef CONFIG_DM
+COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2dm.o
 COBJS-$(CONFIG_CMD_FAT) += cmd_fatdm.o
 else
+COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2.o
 COBJS-$(CONFIG_CMD_FAT) += cmd_fat.o
 endif
 COBJS-$(CONFIG_CMD_FDC)$(CONFIG_CMD_FDOS) += cmd_fdc.o
diff --git a/common/cmd_ext2dm.c b/common/cmd_ext2dm.c
new file mode 100644
index 0000000..da703eb
--- /dev/null
+++ b/common/cmd_ext2dm.c
@@ -0,0 +1,211 @@
+/*
+ * (C) Copyright 2004
+ * esd gmbh <www.esd-electronics.com>
+ * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
+ *
+ * made from cmd_reiserfs by
+ *
+ * (C) Copyright 2003 - 2004
+ * Sysgo Real-Time Solutions, AG <www.elinos.com>
+ * Pavel Bartusek <pba@sysgo.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ */
+
+/*
+ * Ext2fs support
+ */
+#include <common.h>
+#include <config.h>
+#include <command.h>
+#include <image.h>
+#include <linux/ctype.h>
+#include <asm/byteorder.h>
+#include <ext2fs.h>
+#include <dm/structures.h>
+#include <dm/blockdev.h>
+
+/* #define	EXT2_DEBUG */
+
+#ifdef	EXT2_DEBUG
+#define	PRINTF(fmt, args...)	printf(fmt, ##args)
+#else
+#define PRINTF(fmt, args...)
+#endif
+
+int do_ext2ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	char *filename = "/";
+	struct instance *bdev;
+	int part_length;
+
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	bdev = get_blockdev_by_name(argv[1]);
+
+	if (bdev == NULL) {
+		printf("\n** Block device %s not found\n", argv[1]);
+		return 1;
+	}
+
+	if (argc == 3)
+		filename = argv[2];
+
+	PRINTF("Using device %s, directory: %s\n", argv[1], filename);
+
+	part_length = ext2fs_set_blk_dev(bdev);
+	if (part_length == 0) {
+		printf("** Bad partition - %s **\n",  argv[1]);
+		ext2fs_close();
+		return 1;
+	}
+
+	if (!ext2fs_mount(part_length)) {
+		printf("** Bad ext2 partition or disk - %s**\n",  argv[1]);
+		ext2fs_close();
+		return 1;
+	}
+
+	if (ext2fs_ls(filename)) {
+		printf("** Error ext2fs_ls() **\n");
+		ext2fs_close();
+		return 1;
+	};
+
+	ext2fs_close();
+
+	return 0;
+}
+
+U_BOOT_CMD(
+	ext2ls,	3,	1,	do_ext2ls,
+	"list files in a directory (default /)",
+	"<dev[:part]> [directory]\n"
+	"    - list files from 'dev' in a 'directory'"
+);
+
+/******************************************************************************
+ * Ext2fs boot command intepreter. Derived from diskboot
+ */
+int do_ext2load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	char *filename = NULL;
+	struct instance *bdev;
+	ulong addr = 0, part_length;
+	int filelen;
+	char buf[12];
+	unsigned long count;
+	char *addr_str;
+
+	switch (argc) {
+	case 2:
+		addr_str = getenv("loadaddr");
+		if (addr_str != NULL)
+			addr = simple_strtoul(addr_str, NULL, 16);
+		else
+			addr = CONFIG_SYS_LOAD_ADDR;
+
+		filename = getenv("bootfile");
+		count = 0;
+		break;
+	case 3:
+		addr = simple_strtoul(argv[2], NULL, 16);
+		filename = getenv("bootfile");
+		count = 0;
+		break;
+	case 4:
+		addr = simple_strtoul(argv[2], NULL, 16);
+		filename = argv[3];
+		count = 0;
+		break;
+	case 5:
+		addr = simple_strtoul(argv[2], NULL, 16);
+		filename = argv[3];
+		count = simple_strtoul(argv[4], NULL, 16);
+		break;
+
+	default:
+		return CMD_RET_USAGE;
+	}
+
+	if (!filename) {
+		puts("** No boot file defined **\n");
+		return 1;
+	}
+
+	bdev = get_blockdev_by_name(argv[1]);
+	if (!bdev) {
+		printf("** Block device %s not found\n", argv[1]);
+		return 1;
+	}
+
+	PRINTF("Using device %s\n", argv[1]);
+
+	printf("Loading file \"%s\" from device %s\n", filename, argv[1]);
+
+	part_length = ext2fs_set_blk_dev(bdev);
+	if (part_length == 0) {
+		printf("** Bad partition - %s **\n",  argv[1]);
+		ext2fs_close();
+		return 1;
+	}
+
+	if (!ext2fs_mount(part_length)) {
+		printf("** Bad ext2 partition or disk - %s **\n", argv[1]);
+		ext2fs_close();
+		return 1;
+	}
+
+	filelen = ext2fs_open(filename);
+	if (filelen < 0) {
+		printf("** File not found %s\n", filename);
+		ext2fs_close();
+		return 1;
+	}
+	if ((count < filelen) && (count != 0))
+		filelen = count;
+
+	if (ext2fs_read((char *)addr, filelen) != filelen) {
+		printf("** Unable to read \"%s\" from %s **\n",	filename,
+			argv[1]);
+		ext2fs_close();
+		return 1;
+	}
+
+	ext2fs_close();
+
+	/* Loading ok, update default load address */
+	load_addr = addr;
+
+	printf("%d bytes read\n", filelen);
+	sprintf(buf, "%X", filelen);
+	setenv("filesize", buf);
+
+	return 0;
+}
+
+U_BOOT_CMD(
+	ext2load,	5,	0,	do_ext2load,
+	"load binary file from a Ext2 filesystem",
+	"<dev[:part]> [addr] [filename] [bytes]\n"
+	"    - load binary file 'filename' from 'dev'\n"
+	"      to address 'addr' from ext2 filesystem"
+);
diff --git a/fs/ext2/Makefile b/fs/ext2/Makefile
index 3c65d25..ac4ddf2 100644
--- a/fs/ext2/Makefile
+++ b/fs/ext2/Makefile
@@ -30,7 +30,12 @@ include $(TOPDIR)/config.mk
 LIB	= $(obj)libext2fs.o
 
 AOBJS	=
-COBJS-$(CONFIG_CMD_EXT2) := ext2fs.o dev.o
+COBJS-$(CONFIG_CMD_EXT2) := ext2fs.o
+ifdef CONFIG_DM
+COBJS-${CONFIG_CMD_EXT2} += dev_dm.o
+else
+COBJS-${CONFIG_CMD_EXT2} += dev.o
+endif
 
 SRCS	:= $(AOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(AOBJS) $(COBJS-y))
diff --git a/fs/ext2/dev_dm.c b/fs/ext2/dev_dm.c
new file mode 100644
index 0000000..6539b44
--- /dev/null
+++ b/fs/ext2/dev_dm.c
@@ -0,0 +1,107 @@
+/*
+ * (C) Copyright 2004
+ *  esd gmbh <www.esd-electronics.com>
+ *  Reinhard Arlt <reinhard.arlt@esd-electronics.com>
+ *
+ *  based on code of fs/reiserfs/dev.c by
+ *
+ *  (C) Copyright 2003 - 2004
+ *  Sysgo AG, <www.elinos.com>, Pavel Bartusek <pba@sysgo.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <common.h>
+#include <config.h>
+#include <ext2fs.h>
+#include <dm/structures.h>
+#include <dm/blockdev.h>
+
+static struct instance *bdev;
+
+int ext2fs_set_blk_dev(struct instance *dev)
+{
+	struct option opt;
+	int error;
+
+	if (!dev)
+		return 0;
+
+	error = blockdev_get_option(dev, BLKD_OPT_BLOCKCOUNT, &opt);
+	if (error || (OPTION_TYPE(opt) != OPTION_TYPE_U))
+		return 0;
+
+	bdev = dev;
+
+	return opt.data.data_u;
+}
+
+int ext2fs_devread(int sector, int byte_offset, int byte_len, char *buf)
+{
+	ALLOC_CACHE_ALIGN_BUFFER(char, sec_buf, SECTOR_SIZE);
+	unsigned sectors;
+
+	/*
+	 *  Get the read to the beginning of a partition.
+	 */
+	sector += byte_offset >> SECTOR_BITS;
+	byte_offset &= SECTOR_SIZE - 1;
+
+	debug(" <%d, %d, %d>\n", sector, byte_offset, byte_len);
+
+	if (bdev == NULL) {
+		printf(" ** %s Invalid Block Device Descriptor (NULL)\n",
+		       __func__);
+		return 0;
+	}
+
+	if (byte_offset != 0) {
+		/* read first part which isn't aligned with start of sector */
+		if (blockdev_read(bdev, sector, 1, sec_buf) != 1) {
+			printf(" ** %s read error **\n", __func__);
+			return 0;
+		}
+		memcpy(buf, sec_buf + byte_offset,
+		       min(SECTOR_SIZE - byte_offset, byte_len));
+		buf += min(SECTOR_SIZE - byte_offset, byte_len);
+		byte_len -= min(SECTOR_SIZE - byte_offset, byte_len);
+		sector++;
+	}
+
+	/*  read sector aligned part */
+	sectors = byte_len / SECTOR_SIZE;
+
+	if (sectors > 0) {
+		if (blockdev_read(bdev, sector, sectors, buf) != sectors) {
+			printf(" ** %s read error - block\n", __func__);
+			return 0;
+		}
+
+		buf += sectors * SECTOR_SIZE;
+		byte_len -= sectors * SECTOR_SIZE;
+		sector += sectors;
+	}
+
+	if (byte_len != 0) {
+		/* read rest of data which are not in whole sector */
+		if (blockdev_read(bdev, sector, 1, sec_buf) != 1) {
+			printf(" ** %s read error - last part\n", __func__);
+			return 0;
+		}
+		memcpy(buf, sec_buf, byte_len);
+	}
+	return 1;
+}
diff --git a/include/ext2fs.h b/include/ext2fs.h
index 163a9bb..d16714e 100644
--- a/include/ext2fs.h
+++ b/include/ext2fs.h
@@ -25,6 +25,10 @@
  * from the original ext2 fs code, as found in the linux kernel.
  */
 
+#ifdef CONFIG_DM
+#include <dm/structures.h>
+#endif
+
 
 #define SECTOR_SIZE		0x200
 #define SECTOR_BITS		9
@@ -72,8 +76,11 @@ typedef enum
   MAX_ERR_NUM
 } ext2fs_error_t;
 
-
+#ifdef CONFIG_DM
+extern int ext2fs_set_blk_dev(struct instance *dev);
+#else
 extern int ext2fs_set_blk_dev(block_dev_desc_t *rbdd, int part);
+#endif
 extern int ext2fs_ls (const char *dirname);
 extern int ext2fs_open (const char *filename);
 extern int ext2fs_read (char *buf, unsigned len);
-- 
1.7.12

  parent reply	other threads:[~2012-09-20 19:37 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-20 19:37 [U-Boot] [PATCH 00/11] Add DM blockdev subsystem Pavel Herrmann
2012-09-20 19:37 ` [U-Boot] [PATCH 01/11] DM: add block device core Pavel Herrmann
2012-09-20 19:58   ` Marek Vasut
2012-09-21  7:11     ` Pavel Herrmann
2012-09-21 12:39       ` Marek Vasut
2012-09-21 13:27         ` Pavel Herrmann
2012-09-21 13:53           ` Marek Vasut
2012-09-21 14:57             ` Pavel Herrmann
2012-09-21 15:34               ` Marek Vasut
2012-09-21 15:48                 ` Pavel Herrmann
2012-09-21 15:55                   ` Marek Vasut
2012-09-21 17:19                     ` Pavel Herrmann
2012-09-21 18:00                       ` Marek Vasut
2012-09-21 18:53                         ` Pavel Herrmann
2012-09-21 19:17                           ` Marek Vasut
2012-09-21 19:29                             ` Pavel Herrmann
2012-09-21 21:11                               ` Marek Vasut
2012-09-21 23:43                                 ` Pavel Herrmann
2012-09-22  0:09                                   ` Marek Vasut
2012-09-22  9:39                                     ` Pavel Herrmann
2012-09-22 13:33                                       ` Marek Vasut
2012-09-22 13:59                                         ` Pavel Herrmann
2012-09-24 12:23                                           ` Pavel Herrmann
2012-09-20 20:49   ` [U-Boot] [U-Boot-DM] " Vikram Narayanan
2012-09-21  7:09     ` Pavel Herrmann
2012-09-21 12:39       ` Marek Vasut
2012-09-20 19:37 ` [U-Boot] [PATCH 02/11] DM: add support for scanning DOS partitions to blockdev core Pavel Herrmann
2012-09-20 20:03   ` Marek Vasut
2012-09-21  7:22     ` Pavel Herrmann
2012-09-21 12:47       ` Marek Vasut
2012-09-21 13:18         ` Pavel Herrmann
2012-09-21 13:54           ` Marek Vasut
2012-09-20 19:37 ` [U-Boot] [PATCH 03/11] DM: add block controller core Pavel Herrmann
2012-09-20 20:05   ` Marek Vasut
2012-09-21  7:21     ` Pavel Herrmann
2012-09-21 12:51       ` Marek Vasut
2012-09-21 13:14         ` Pavel Herrmann
2012-09-21 13:56           ` Marek Vasut
2012-09-21 15:04             ` Pavel Herrmann
2012-09-21 13:33         ` Pavel Herrmann
2012-09-21 13:58           ` Marek Vasut
2012-09-21 15:09             ` Pavel Herrmann
2012-09-21 15:39               ` Marek Vasut
2012-09-21 15:46                 ` Pavel Herrmann
2012-09-21 16:08                   ` Marek Vasut
2012-09-21 17:22                     ` Pavel Herrmann
2012-09-21 18:01                       ` Marek Vasut
2012-09-21 19:15                         ` Pavel Herrmann
2012-09-21 19:22                           ` Marek Vasut
2012-09-20 19:37 ` [U-Boot] [PATCH 04/11] DM: add sata_legacy driver for blockctrl Pavel Herrmann
2012-09-20 19:37 ` [U-Boot] [PATCH 05/11] DM: add ata and partition blockdev drivers Pavel Herrmann
2012-09-20 19:37 ` [U-Boot] [PATCH 06/11] DM: add cmd_block command Pavel Herrmann
2012-09-20 19:37 ` [U-Boot] [PATCH 07/11] DM: use new blockdev API in FAT Pavel Herrmann
2012-09-20 19:37 ` Pavel Herrmann [this message]
2012-09-20 19:37 ` [U-Boot] [PATCH 09/11] DM: use new blockdev API in reiserfs Pavel Herrmann
2012-09-20 19:37 ` [U-Boot] [PATCH 10/11] DM: use new blockdev API in ZFS Pavel Herrmann
2012-09-20 19:37 ` [U-Boot] [PATCH 11/11] DM: switch sandbox to DM blockdev Pavel Herrmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1348169867-2917-9-git-send-email-morpheus.ibis@gmail.com \
    --to=morpheus.ibis@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.