12e192b24SSimon Glass /* 22e192b24SSimon Glass * (C) Copyright 2003 - 2004 32e192b24SSimon Glass * Sysgo Real-Time Solutions, AG <www.elinos.com> 42e192b24SSimon Glass * Pavel Bartusek <pba@sysgo.com> 52e192b24SSimon Glass * 62e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 72e192b24SSimon Glass */ 82e192b24SSimon Glass 92e192b24SSimon Glass /* 102e192b24SSimon Glass * Reiserfs support 112e192b24SSimon Glass */ 122e192b24SSimon Glass #include <common.h> 132e192b24SSimon Glass #include <config.h> 142e192b24SSimon Glass #include <command.h> 152e192b24SSimon Glass #include <image.h> 162e192b24SSimon Glass #include <linux/ctype.h> 172e192b24SSimon Glass #include <asm/byteorder.h> 182e192b24SSimon Glass #include <reiserfs.h> 192e192b24SSimon Glass #include <part.h> 202e192b24SSimon Glass 21b0cf7339SPatrick Delaunay #if !CONFIG_IS_ENABLED(DOS_PARTITION) 222e192b24SSimon Glass #error DOS partition support must be selected 232e192b24SSimon Glass #endif 242e192b24SSimon Glass 252e192b24SSimon Glass /* #define REISER_DEBUG */ 262e192b24SSimon Glass 272e192b24SSimon Glass #ifdef REISER_DEBUG 282e192b24SSimon Glass #define PRINTF(fmt,args...) printf (fmt ,##args) 292e192b24SSimon Glass #else 302e192b24SSimon Glass #define PRINTF(fmt,args...) 312e192b24SSimon Glass #endif 322e192b24SSimon Glass 332e192b24SSimon Glass int do_reiserls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 342e192b24SSimon Glass { 352e192b24SSimon Glass char *filename = "/"; 362e192b24SSimon Glass int dev, part; 374101f687SSimon Glass struct blk_desc *dev_desc = NULL; 382e192b24SSimon Glass disk_partition_t info; 392e192b24SSimon Glass 402e192b24SSimon Glass if (argc < 3) 412e192b24SSimon Glass return CMD_RET_USAGE; 422e192b24SSimon Glass 43e35929e4SSimon Glass part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1); 442e192b24SSimon Glass if (part < 0) 452e192b24SSimon Glass return 1; 462e192b24SSimon Glass 472e192b24SSimon Glass if (argc == 4) { 482e192b24SSimon Glass filename = argv[3]; 492e192b24SSimon Glass } 502e192b24SSimon Glass 51bcce53d0SSimon Glass dev = dev_desc->devnum; 522e192b24SSimon Glass PRINTF("Using device %s %d:%d, directory: %s\n", argv[1], dev, part, filename); 532e192b24SSimon Glass 542e192b24SSimon Glass reiserfs_set_blk_dev(dev_desc, &info); 552e192b24SSimon Glass 562e192b24SSimon Glass if (!reiserfs_mount(info.size)) { 572e192b24SSimon Glass printf ("** Bad Reiserfs partition or disk - %s %d:%d **\n", argv[1], dev, part); 582e192b24SSimon Glass return 1; 592e192b24SSimon Glass } 602e192b24SSimon Glass 612e192b24SSimon Glass if (reiserfs_ls (filename)) { 622e192b24SSimon Glass printf ("** Error reiserfs_ls() **\n"); 632e192b24SSimon Glass return 1; 642e192b24SSimon Glass }; 652e192b24SSimon Glass 662e192b24SSimon Glass return 0; 672e192b24SSimon Glass } 682e192b24SSimon Glass 692e192b24SSimon Glass U_BOOT_CMD( 702e192b24SSimon Glass reiserls, 4, 1, do_reiserls, 712e192b24SSimon Glass "list files in a directory (default /)", 722e192b24SSimon Glass "<interface> <dev[:part]> [directory]\n" 732e192b24SSimon Glass " - list files from 'dev' on 'interface' in a 'directory'" 742e192b24SSimon Glass ); 752e192b24SSimon Glass 762e192b24SSimon Glass /****************************************************************************** 772e192b24SSimon Glass * Reiserfs boot command intepreter. Derived from diskboot 782e192b24SSimon Glass */ 792e192b24SSimon Glass int do_reiserload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 802e192b24SSimon Glass { 812e192b24SSimon Glass char *filename = NULL; 822e192b24SSimon Glass int dev, part; 832e192b24SSimon Glass ulong addr = 0, filelen; 842e192b24SSimon Glass disk_partition_t info; 854101f687SSimon Glass struct blk_desc *dev_desc = NULL; 862e192b24SSimon Glass unsigned long count; 872e192b24SSimon Glass char *addr_str; 882e192b24SSimon Glass 892e192b24SSimon Glass switch (argc) { 902e192b24SSimon Glass case 3: 912e192b24SSimon Glass addr_str = getenv("loadaddr"); 922e192b24SSimon Glass if (addr_str != NULL) { 932e192b24SSimon Glass addr = simple_strtoul (addr_str, NULL, 16); 942e192b24SSimon Glass } else { 952e192b24SSimon Glass addr = CONFIG_SYS_LOAD_ADDR; 962e192b24SSimon Glass } 972e192b24SSimon Glass filename = getenv ("bootfile"); 982e192b24SSimon Glass count = 0; 992e192b24SSimon Glass break; 1002e192b24SSimon Glass case 4: 1012e192b24SSimon Glass addr = simple_strtoul (argv[3], NULL, 16); 1022e192b24SSimon Glass filename = getenv ("bootfile"); 1032e192b24SSimon Glass count = 0; 1042e192b24SSimon Glass break; 1052e192b24SSimon Glass case 5: 1062e192b24SSimon Glass addr = simple_strtoul (argv[3], NULL, 16); 1072e192b24SSimon Glass filename = argv[4]; 1082e192b24SSimon Glass count = 0; 1092e192b24SSimon Glass break; 1102e192b24SSimon Glass case 6: 1112e192b24SSimon Glass addr = simple_strtoul (argv[3], NULL, 16); 1122e192b24SSimon Glass filename = argv[4]; 1132e192b24SSimon Glass count = simple_strtoul (argv[5], NULL, 16); 1142e192b24SSimon Glass break; 1152e192b24SSimon Glass 1162e192b24SSimon Glass default: 1172e192b24SSimon Glass return CMD_RET_USAGE; 1182e192b24SSimon Glass } 1192e192b24SSimon Glass 1202e192b24SSimon Glass if (!filename) { 1212e192b24SSimon Glass puts ("\n** No boot file defined **\n"); 1222e192b24SSimon Glass return 1; 1232e192b24SSimon Glass } 1242e192b24SSimon Glass 125e35929e4SSimon Glass part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1); 1262e192b24SSimon Glass if (part < 0) 1272e192b24SSimon Glass return 1; 1282e192b24SSimon Glass 129bcce53d0SSimon Glass dev = dev_desc->devnum; 1302e192b24SSimon Glass 1312e192b24SSimon Glass printf("Loading file \"%s\" from %s device %d%c%c\n", 1322e192b24SSimon Glass filename, argv[1], dev, 1332e192b24SSimon Glass part ? ':' : ' ', part ? part + '0' : ' '); 1342e192b24SSimon Glass 1352e192b24SSimon Glass reiserfs_set_blk_dev(dev_desc, &info); 1362e192b24SSimon Glass 1372e192b24SSimon Glass if (!reiserfs_mount(info.size)) { 1382e192b24SSimon Glass printf ("** Bad Reiserfs partition or disk - %s %d:%d **\n", argv[1], dev, part); 1392e192b24SSimon Glass return 1; 1402e192b24SSimon Glass } 1412e192b24SSimon Glass 1422e192b24SSimon Glass filelen = reiserfs_open(filename); 1432e192b24SSimon Glass if (filelen < 0) { 1442e192b24SSimon Glass printf("** File not found %s **\n", filename); 1452e192b24SSimon Glass return 1; 1462e192b24SSimon Glass } 1472e192b24SSimon Glass if ((count < filelen) && (count != 0)) { 1482e192b24SSimon Glass filelen = count; 1492e192b24SSimon Glass } 1502e192b24SSimon Glass 1512e192b24SSimon Glass if (reiserfs_read((char *)addr, filelen) != filelen) { 1522e192b24SSimon Glass printf("\n** Unable to read \"%s\" from %s %d:%d **\n", filename, argv[1], dev, part); 1532e192b24SSimon Glass return 1; 1542e192b24SSimon Glass } 1552e192b24SSimon Glass 1562e192b24SSimon Glass /* Loading ok, update default load address */ 1572e192b24SSimon Glass load_addr = addr; 1582e192b24SSimon Glass 1592e192b24SSimon Glass printf ("\n%ld bytes read\n", filelen); 160*018f5303SSimon Glass env_set_hex("filesize", filelen); 1612e192b24SSimon Glass 1622e192b24SSimon Glass return filelen; 1632e192b24SSimon Glass } 1642e192b24SSimon Glass 1652e192b24SSimon Glass U_BOOT_CMD( 1662e192b24SSimon Glass reiserload, 6, 0, do_reiserload, 1672e192b24SSimon Glass "load binary file from a Reiser filesystem", 1682e192b24SSimon Glass "<interface> <dev[:part]> [addr] [filename] [bytes]\n" 1692e192b24SSimon Glass " - load binary file 'filename' from 'dev' on 'interface'\n" 1702e192b24SSimon Glass " to address 'addr' from dos filesystem" 1712e192b24SSimon Glass ); 172