diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2015-02-06 17:53:09 +0800 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2015-02-09 11:46:27 +1100 |
commit | 4e60baa269007715c1ff81acf0fc1a94ee19a3f1 (patch) | |
tree | 88fd083745bbc52b29371842b59287557afd561d /platforms | |
parent | 5c70f1c764abeec7c29171285ec90af3318b113d (diff) | |
download | skiboot-4e60baa269007715c1ff81acf0fc1a94ee19a3f1.zip skiboot-4e60baa269007715c1ff81acf0fc1a94ee19a3f1.tar.gz skiboot-4e60baa269007715c1ff81acf0fc1a94ee19a3f1.tar.bz2 |
Fix commit 16c80346
Commit 16c80346 change included some reverts of previous commits, which
we need. This change reverts those reverts, leaving the original intent
of that change.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'platforms')
-rw-r--r-- | platforms/astbmc/astbmc.h | 1 | ||||
-rw-r--r-- | platforms/astbmc/habanero.c | 1 | ||||
-rw-r--r-- | platforms/astbmc/palmetto.c | 1 | ||||
-rw-r--r-- | platforms/astbmc/pnor.c | 56 |
4 files changed, 58 insertions, 1 deletions
diff --git a/platforms/astbmc/astbmc.h b/platforms/astbmc/astbmc.h index cee475a..7e33f61 100644 --- a/platforms/astbmc/astbmc.h +++ b/platforms/astbmc/astbmc.h @@ -24,5 +24,6 @@ extern int64_t astbmc_ipmi_power_down(uint64_t request); extern void astbmc_init(void); extern void astbmc_ext_irq(unsigned int chip_id); extern int pnor_init(void); +extern bool pnor_load_resource(enum resource_id id, void *buf, size_t *len); #endif /* __ASTBMC_H */ diff --git a/platforms/astbmc/habanero.c b/platforms/astbmc/habanero.c index d442d1f..a19aafd 100644 --- a/platforms/astbmc/habanero.c +++ b/platforms/astbmc/habanero.c @@ -49,4 +49,5 @@ DECLARE_PLATFORM(habanero) = { .external_irq = astbmc_ext_irq, .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot, + .load_resource = pnor_load_resource, }; diff --git a/platforms/astbmc/palmetto.c b/platforms/astbmc/palmetto.c index a0030e8..cfa7236 100644 --- a/platforms/astbmc/palmetto.c +++ b/platforms/astbmc/palmetto.c @@ -51,4 +51,5 @@ DECLARE_PLATFORM(palmetto) = { .cec_power_down = astbmc_ipmi_power_down, .cec_reboot = astbmc_ipmi_reboot, .elog_commit = ipmi_elog_commit, + .load_resource = pnor_load_resource, }; diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c index f6e7a5d..2cdb29b 100644 --- a/platforms/astbmc/pnor.c +++ b/platforms/astbmc/pnor.c @@ -14,7 +14,6 @@ * limitations under the License. */ - #include <skiboot.h> #include <device.h> #include <console.h> @@ -85,3 +84,58 @@ int pnor_init(void) return rc; } +static const struct { + enum resource_id id; + char name[PART_NAME_MAX+1]; +} part_name_map[] = { + { RESOURCE_ID_KERNEL, "KERNEL" }, + { RESOURCE_ID_INITRAMFS, "ROOTFS" }, +}; + +bool pnor_load_resource(enum resource_id id, void *buf, size_t *len) +{ + int i, rc, part_num, part_size, part_start; + const char *name; + + if (!pnor_ffs || !pnor_chip) + return false; + + for (i = 0, name = NULL; i < ARRAY_SIZE(part_name_map); i++) { + if (part_name_map[i].id == id) { + name = part_name_map[i].name; + break; + } + } + if (!name) { + prerror("PLAT: Couldn't find partition for id %d\n", id); + return false; + } + + rc = ffs_lookup_part(pnor_ffs, name, &part_num); + if (rc) { + prerror("PLAT: No %s partition in PNOR\n", name); + return false; + } + rc = ffs_part_info(pnor_ffs, part_num, NULL, + &part_start, &part_size, NULL); + if (rc) { + prerror("PLAT: Failed to get %s partition info\n", name); + return false; + } + + if (part_size > *len) { + prerror("PLAT: %s image too large (%d > %zd)\n", name, + part_size, *len); + return false; + } + + rc = flash_read(pnor_chip, part_start, buf, part_size); + if (rc) { + prerror("PLAT: failed to read %s partition\n", name); + return false; + } + + *len = part_size; + + return true; +} |