aboutsummaryrefslogtreecommitdiff
path: root/external/gard
diff options
context:
space:
mode:
authorCyril Bur <cyril.bur@au1.ibm.com>2015-11-11 15:40:03 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-11-16 13:11:09 +1100
commit0b3afb4a9e1dcc58cf374dd3056c37983c1d8e2e (patch)
tree2b677179066219c56251ab1e76d766bb73685c9e /external/gard
parente23b2485de0ec6b0962b983a688d1fb4b8a8d112 (diff)
downloadskiboot-0b3afb4a9e1dcc58cf374dd3056c37983c1d8e2e.zip
skiboot-0b3afb4a9e1dcc58cf374dd3056c37983c1d8e2e.tar.gz
skiboot-0b3afb4a9e1dcc58cf374dd3056c37983c1d8e2e.tar.bz2
external/gard: Make use of the common/ flash reading code
Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com> Reviewed-by: Alistair Popple <alistair@popple.id.au> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'external/gard')
-rw-r--r--external/gard/gard.c164
1 files changed, 11 insertions, 153 deletions
diff --git a/external/gard/gard.c b/external/gard/gard.c
index e41047f..0b7a68b 100644
--- a/external/gard/gard.c
+++ b/external/gard/gard.c
@@ -37,6 +37,7 @@
#include <libflash/file.h>
#include <libflash/ecc.h>
#include <libflash/blocklevel.h>
+#include <common/arch_flash.h>
#include "gard.h"
@@ -84,7 +85,7 @@ static void show_flash_err(int rc)
case FFS_ERR_PART_NOT_FOUND:
fprintf(stderr, "libffs flash partition not found\n");
break;
- /* ------- */
+ /* ------- */
case FLASH_ERR_MALLOC_FAILED:
fprintf(stderr, "libflash malloc failed\n");
break;
@@ -225,147 +226,10 @@ static const char *path_type_to_str(enum path_type t)
return "Unknown";
}
-static bool get_dev_attr(const char *dev, const char *attr_file, uint32_t *attr)
-{
- char dev_path[PATH_MAX] = SYSFS_MTD_PATH;
- /*
- * Needs to be large enough to hold at most uint32_t represented as a
- * string in hex with leading 0x
- */
- char attr_buf[10];
- int fd, rc;
-
- /*
- * sizeof(dev_path) - (strlen(dev_path) + 1) is the remaining space in
- * dev_path, + 1 to account for the '\0'. As strncat could write n+1 bytes
- * to dev_path the correct calulcation for n is:
- * (sizeof(dev_path) - (strlen(dev_path) + 1) - 1)
- */
- strncat(dev_path, dev, (sizeof(dev_path) - (strlen(dev_path) + 1) - 1));
- strncat(dev_path, "/", (sizeof(dev_path) - (strlen(dev_path) + 1) - 1));
- strncat(dev_path, attr_file, (sizeof(dev_path) - (strlen(dev_path) + 1) - 1));
- fd = open(dev_path, O_RDONLY);
- if (fd == -1)
- goto out;
-
- rc = read(fd, attr_buf, sizeof(attr_buf));
- close(fd);
- if (rc == -1)
- goto out;
-
- if (attr)
- *attr = strtol(attr_buf, NULL, 0);
-
- return 0;
-
-out:
- fprintf(stderr, "Couldn't get MTD device attribute '%s' from '%s'\n", dev, attr_file);
- return -1;
-}
-
-static int get_dev_mtd(const char *fdt_flash_path, char **r_path)
-{
- struct dirent **namelist;
- char fdt_node_path[PATH_MAX];
- int count, i, rc, fd;
- bool done;
-
- if (!fdt_flash_path)
- return -1;
-
- fd = open(fdt_flash_path, O_RDONLY);
- if (fd == -1) {
- fprintf(stderr, "Couldn't open '%s' FDT attribute to determine which flash device to use\n",
- fdt_flash_path);
- return -1;
- }
-
- rc = read(fd, fdt_node_path, sizeof(fdt_node_path) - 1);
- close(fd);
- if (rc == -1) {
- fprintf(stderr, "Couldn't read flash FDT node from '%s'\n", fdt_flash_path);
- return -1;
- }
- fdt_node_path[rc] = '\0';
-
- count = scandir(SYSFS_MTD_PATH, &namelist, NULL, alphasort);
- if (count == -1) {
- fprintf(stderr, "Couldn't scan '%s' for MTD devices\n", SYSFS_MTD_PATH);
- return -1;
- }
-
- rc = 0;
- done = false;
- for (i = 0; i < count; i++) {
- struct dirent *dirent;
- char dev_path[PATH_MAX] = SYSFS_MTD_PATH;
- char fdt_node_path_tmp[PATH_MAX];
-
- dirent = namelist[i];
- if (dirent->d_name[0] == '.' || rc || done) {
- free(namelist[i]);
- continue;
- }
-
- strncat(dev_path, dirent->d_name, sizeof(dev_path) - strlen(dev_path) - 2);
- strncat(dev_path, "/device/of_node", sizeof(dev_path) - strlen(dev_path) - 2);
-
- rc = readlink(dev_path, fdt_node_path_tmp, sizeof(fdt_node_path_tmp) - 1);
- if (rc == -1) {
- /*
- * This might fail because it could not exist if the system has flash
- * devices that present as mtd but don't have corresponding FDT
- * nodes, just continue silently.
- */
- free(namelist[i]);
- /* Should still try the next dir so reset rc */
- rc = 0;
- continue;
- }
- fdt_node_path_tmp[rc] = '\0';
-
- if (strstr(fdt_node_path_tmp, fdt_node_path)) {
- uint32_t flags, size;
-
- /*
- * size and flags could perhaps have be gotten another way but this
- * method is super unlikely to fail so it will do.
- */
-
- /* Check to see if device is writeable */
- rc = get_dev_attr(dirent->d_name, "flags", &flags);
- if (rc) {
- free(namelist[i]);
- continue;
- }
-
- /* Get the size of the mtd device while we're at it */
- rc = get_dev_attr(dirent->d_name, "size", &size);
- if (rc) {
- free(namelist[i]);
- continue;
- }
-
- strcpy(dev_path, "/dev/");
- strncat(dev_path, dirent->d_name, sizeof(dev_path) - strlen(dev_path) - 2);
- *r_path = strdup(dev_path);
- done = true;
- }
- free(namelist[i]);
- }
- free(namelist);
-
- if (!done)
- fprintf(stderr, "Couldn't find '%s' corresponding MTD\n", fdt_flash_path);
-
- /* explicit negative value so as to not return a libflash code */
- return done ? rc : -1;
-}
-
static int do_iterate(struct gard_ctx *ctx,
- int (*func)(struct gard_ctx *ctx, int pos,
- struct gard_record *gard, void *priv),
- void *priv)
+ int (*func)(struct gard_ctx *ctx, int pos,
+ struct gard_record *gard, void *priv),
+ void *priv)
{
int rc = 0;
unsigned int i;
@@ -414,7 +278,7 @@ static int do_list_i(struct gard_ctx *ctx, int pos, struct gard_record *gard, vo
return -1;
printf("| %08x | %08x | %-15s |\n", be32toh(gard->record_id),
- be32toh(gard->errlog_eid), path_type_to_str(gard->target_id.type_size >> PATH_TYPE_SHIFT));
+ be32toh(gard->errlog_eid), path_type_to_str(gard->target_id.type_size >> PATH_TYPE_SHIFT));
return 0;
}
@@ -680,7 +544,6 @@ static const char *global_optstring = "+ef:p";
int main(int argc, char **argv)
{
const char *action, *progname;
- const char *fdt_flash_path = FDT_ACTIVE_FLASH_PATH;
char *filename = NULL;
struct gard_ctx _ctx, *ctx;
int rc, i = 0;
@@ -744,18 +607,13 @@ int main(int argc, char **argv)
argv += optind;
action = argv[0];
- if (!filename) {
- rc = get_dev_mtd(fdt_flash_path, &filename);
- if (rc) {
- rc = EXIT_FAILURE;
- goto out_free;
- }
+ if (arch_flash_init(&(ctx->bl), filename)) {
+ /* Can fail for a few ways, most likely couldn't open MTD device */
+ fprintf(stderr, "Can't open %s\n", filename ? filename : "MTD Device. Are you root?");
+ rc = EXIT_FAILURE;
+ goto out_free;
}
- rc = file_init_path(filename, NULL, &(ctx->bl));
- if (rc)
- err(EXIT_FAILURE, "Can't open %s", filename);
-
rc = blocklevel_get_info(ctx->bl, NULL, &(ctx->f_size), NULL);
if (rc)
goto out;