1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * (C) Copyright 2003 - 2004 3*2e192b24SSimon Glass * Sysgo Real-Time Solutions, AG <www.elinos.com> 4*2e192b24SSimon Glass * Pavel Bartusek <pba@sysgo.com> 5*2e192b24SSimon Glass * 6*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 7*2e192b24SSimon Glass */ 8*2e192b24SSimon Glass 9*2e192b24SSimon Glass /* 10*2e192b24SSimon Glass * Reiserfs support 11*2e192b24SSimon Glass */ 12*2e192b24SSimon Glass #include <common.h> 13*2e192b24SSimon Glass #include <config.h> 14*2e192b24SSimon Glass #include <command.h> 15*2e192b24SSimon Glass #include <image.h> 16*2e192b24SSimon Glass #include <linux/ctype.h> 17*2e192b24SSimon Glass #include <asm/byteorder.h> 18*2e192b24SSimon Glass #include <reiserfs.h> 19*2e192b24SSimon Glass #include <part.h> 20*2e192b24SSimon Glass 21*2e192b24SSimon Glass #ifndef CONFIG_DOS_PARTITION 22*2e192b24SSimon Glass #error DOS partition support must be selected 23*2e192b24SSimon Glass #endif 24*2e192b24SSimon Glass 25*2e192b24SSimon Glass /* #define REISER_DEBUG */ 26*2e192b24SSimon Glass 27*2e192b24SSimon Glass #ifdef REISER_DEBUG 28*2e192b24SSimon Glass #define PRINTF(fmt,args...) printf (fmt ,##args) 29*2e192b24SSimon Glass #else 30*2e192b24SSimon Glass #define PRINTF(fmt,args...) 31*2e192b24SSimon Glass #endif 32*2e192b24SSimon Glass 33*2e192b24SSimon Glass int do_reiserls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 34*2e192b24SSimon Glass { 35*2e192b24SSimon Glass char *filename = "/"; 36*2e192b24SSimon Glass int dev, part; 37*2e192b24SSimon Glass block_dev_desc_t *dev_desc=NULL; 38*2e192b24SSimon Glass disk_partition_t info; 39*2e192b24SSimon Glass 40*2e192b24SSimon Glass if (argc < 3) 41*2e192b24SSimon Glass return CMD_RET_USAGE; 42*2e192b24SSimon Glass 43*2e192b24SSimon Glass part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); 44*2e192b24SSimon Glass if (part < 0) 45*2e192b24SSimon Glass return 1; 46*2e192b24SSimon Glass 47*2e192b24SSimon Glass if (argc == 4) { 48*2e192b24SSimon Glass filename = argv[3]; 49*2e192b24SSimon Glass } 50*2e192b24SSimon Glass 51*2e192b24SSimon Glass dev = dev_desc->dev; 52*2e192b24SSimon Glass PRINTF("Using device %s %d:%d, directory: %s\n", argv[1], dev, part, filename); 53*2e192b24SSimon Glass 54*2e192b24SSimon Glass reiserfs_set_blk_dev(dev_desc, &info); 55*2e192b24SSimon Glass 56*2e192b24SSimon Glass if (!reiserfs_mount(info.size)) { 57*2e192b24SSimon Glass printf ("** Bad Reiserfs partition or disk - %s %d:%d **\n", argv[1], dev, part); 58*2e192b24SSimon Glass return 1; 59*2e192b24SSimon Glass } 60*2e192b24SSimon Glass 61*2e192b24SSimon Glass if (reiserfs_ls (filename)) { 62*2e192b24SSimon Glass printf ("** Error reiserfs_ls() **\n"); 63*2e192b24SSimon Glass return 1; 64*2e192b24SSimon Glass }; 65*2e192b24SSimon Glass 66*2e192b24SSimon Glass return 0; 67*2e192b24SSimon Glass } 68*2e192b24SSimon Glass 69*2e192b24SSimon Glass U_BOOT_CMD( 70*2e192b24SSimon Glass reiserls, 4, 1, do_reiserls, 71*2e192b24SSimon Glass "list files in a directory (default /)", 72*2e192b24SSimon Glass "<interface> <dev[:part]> [directory]\n" 73*2e192b24SSimon Glass " - list files from 'dev' on 'interface' in a 'directory'" 74*2e192b24SSimon Glass ); 75*2e192b24SSimon Glass 76*2e192b24SSimon Glass /****************************************************************************** 77*2e192b24SSimon Glass * Reiserfs boot command intepreter. Derived from diskboot 78*2e192b24SSimon Glass */ 79*2e192b24SSimon Glass int do_reiserload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 80*2e192b24SSimon Glass { 81*2e192b24SSimon Glass char *filename = NULL; 82*2e192b24SSimon Glass int dev, part; 83*2e192b24SSimon Glass ulong addr = 0, filelen; 84*2e192b24SSimon Glass disk_partition_t info; 85*2e192b24SSimon Glass block_dev_desc_t *dev_desc = NULL; 86*2e192b24SSimon Glass unsigned long count; 87*2e192b24SSimon Glass char *addr_str; 88*2e192b24SSimon Glass 89*2e192b24SSimon Glass switch (argc) { 90*2e192b24SSimon Glass case 3: 91*2e192b24SSimon Glass addr_str = getenv("loadaddr"); 92*2e192b24SSimon Glass if (addr_str != NULL) { 93*2e192b24SSimon Glass addr = simple_strtoul (addr_str, NULL, 16); 94*2e192b24SSimon Glass } else { 95*2e192b24SSimon Glass addr = CONFIG_SYS_LOAD_ADDR; 96*2e192b24SSimon Glass } 97*2e192b24SSimon Glass filename = getenv ("bootfile"); 98*2e192b24SSimon Glass count = 0; 99*2e192b24SSimon Glass break; 100*2e192b24SSimon Glass case 4: 101*2e192b24SSimon Glass addr = simple_strtoul (argv[3], NULL, 16); 102*2e192b24SSimon Glass filename = getenv ("bootfile"); 103*2e192b24SSimon Glass count = 0; 104*2e192b24SSimon Glass break; 105*2e192b24SSimon Glass case 5: 106*2e192b24SSimon Glass addr = simple_strtoul (argv[3], NULL, 16); 107*2e192b24SSimon Glass filename = argv[4]; 108*2e192b24SSimon Glass count = 0; 109*2e192b24SSimon Glass break; 110*2e192b24SSimon Glass case 6: 111*2e192b24SSimon Glass addr = simple_strtoul (argv[3], NULL, 16); 112*2e192b24SSimon Glass filename = argv[4]; 113*2e192b24SSimon Glass count = simple_strtoul (argv[5], NULL, 16); 114*2e192b24SSimon Glass break; 115*2e192b24SSimon Glass 116*2e192b24SSimon Glass default: 117*2e192b24SSimon Glass return CMD_RET_USAGE; 118*2e192b24SSimon Glass } 119*2e192b24SSimon Glass 120*2e192b24SSimon Glass if (!filename) { 121*2e192b24SSimon Glass puts ("\n** No boot file defined **\n"); 122*2e192b24SSimon Glass return 1; 123*2e192b24SSimon Glass } 124*2e192b24SSimon Glass 125*2e192b24SSimon Glass part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1); 126*2e192b24SSimon Glass if (part < 0) 127*2e192b24SSimon Glass return 1; 128*2e192b24SSimon Glass 129*2e192b24SSimon Glass dev = dev_desc->dev; 130*2e192b24SSimon Glass 131*2e192b24SSimon Glass printf("Loading file \"%s\" from %s device %d%c%c\n", 132*2e192b24SSimon Glass filename, argv[1], dev, 133*2e192b24SSimon Glass part ? ':' : ' ', part ? part + '0' : ' '); 134*2e192b24SSimon Glass 135*2e192b24SSimon Glass reiserfs_set_blk_dev(dev_desc, &info); 136*2e192b24SSimon Glass 137*2e192b24SSimon Glass if (!reiserfs_mount(info.size)) { 138*2e192b24SSimon Glass printf ("** Bad Reiserfs partition or disk - %s %d:%d **\n", argv[1], dev, part); 139*2e192b24SSimon Glass return 1; 140*2e192b24SSimon Glass } 141*2e192b24SSimon Glass 142*2e192b24SSimon Glass filelen = reiserfs_open(filename); 143*2e192b24SSimon Glass if (filelen < 0) { 144*2e192b24SSimon Glass printf("** File not found %s **\n", filename); 145*2e192b24SSimon Glass return 1; 146*2e192b24SSimon Glass } 147*2e192b24SSimon Glass if ((count < filelen) && (count != 0)) { 148*2e192b24SSimon Glass filelen = count; 149*2e192b24SSimon Glass } 150*2e192b24SSimon Glass 151*2e192b24SSimon Glass if (reiserfs_read((char *)addr, filelen) != filelen) { 152*2e192b24SSimon Glass printf("\n** Unable to read \"%s\" from %s %d:%d **\n", filename, argv[1], dev, part); 153*2e192b24SSimon Glass return 1; 154*2e192b24SSimon Glass } 155*2e192b24SSimon Glass 156*2e192b24SSimon Glass /* Loading ok, update default load address */ 157*2e192b24SSimon Glass load_addr = addr; 158*2e192b24SSimon Glass 159*2e192b24SSimon Glass printf ("\n%ld bytes read\n", filelen); 160*2e192b24SSimon Glass setenv_hex("filesize", filelen); 161*2e192b24SSimon Glass 162*2e192b24SSimon Glass return filelen; 163*2e192b24SSimon Glass } 164*2e192b24SSimon Glass 165*2e192b24SSimon Glass U_BOOT_CMD( 166*2e192b24SSimon Glass reiserload, 6, 0, do_reiserload, 167*2e192b24SSimon Glass "load binary file from a Reiser filesystem", 168*2e192b24SSimon Glass "<interface> <dev[:part]> [addr] [filename] [bytes]\n" 169*2e192b24SSimon Glass " - load binary file 'filename' from 'dev' on 'interface'\n" 170*2e192b24SSimon Glass " to address 'addr' from dos filesystem" 171*2e192b24SSimon Glass ); 172