aboutsummaryrefslogtreecommitdiff
path: root/platforms/astbmc
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2015-02-19 06:34:53 +0800
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-02-19 10:48:13 +1100
commit73b262e768529f152ec64b4418b0c31691bc15c3 (patch)
tree1ff236173025725b84335ced477ec98e2fd619c8 /platforms/astbmc
parente7d1f60eb49bfd81e1fe153cece899de2542f83e (diff)
downloadskiboot-73b262e768529f152ec64b4418b0c31691bc15c3.zip
skiboot-73b262e768529f152ec64b4418b0c31691bc15c3.tar.gz
skiboot-73b262e768529f152ec64b4418b0c31691bc15c3.tar.bz2
core/flash: port pnor_load_resource to flash code
Since we have a flash device registered as the system flash, use this as a generic load_resource backend. Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Reviewed-by: Joel Stanley <joel@jms.id.au> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'platforms/astbmc')
-rw-r--r--platforms/astbmc/astbmc.h3
-rw-r--r--platforms/astbmc/habanero.c2
-rw-r--r--platforms/astbmc/palmetto.c2
-rw-r--r--platforms/astbmc/pnor.c167
4 files changed, 2 insertions, 172 deletions
diff --git a/platforms/astbmc/astbmc.h b/platforms/astbmc/astbmc.h
index cff4757..cee475a 100644
--- a/platforms/astbmc/astbmc.h
+++ b/platforms/astbmc/astbmc.h
@@ -24,8 +24,5 @@ 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 int pnor_load_part(const char *name, void *addr, size_t *len);
-extern bool pnor_load_resource(enum resource_id id, uint32_t subid,
- void *buf, size_t *len);
#endif /* __ASTBMC_H */
diff --git a/platforms/astbmc/habanero.c b/platforms/astbmc/habanero.c
index a19aafd..0ec867f 100644
--- a/platforms/astbmc/habanero.c
+++ b/platforms/astbmc/habanero.c
@@ -49,5 +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,
+ .load_resource = flash_load_resource,
};
diff --git a/platforms/astbmc/palmetto.c b/platforms/astbmc/palmetto.c
index 210d10a..3435d0b 100644
--- a/platforms/astbmc/palmetto.c
+++ b/platforms/astbmc/palmetto.c
@@ -51,6 +51,6 @@ 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,
+ .load_resource = flash_load_resource,
.exit = ipmi_wdt_final_reset,
};
diff --git a/platforms/astbmc/pnor.c b/platforms/astbmc/pnor.c
index c566877..e5bc269 100644
--- a/platforms/astbmc/pnor.c
+++ b/platforms/astbmc/pnor.c
@@ -84,170 +84,3 @@ int pnor_init(void)
return rc;
}
-static struct {
- enum resource_id id;
- uint32_t subid;
- char name[PART_NAME_MAX+1];
-} part_name_map[] = {
- { RESOURCE_ID_KERNEL, RESOURCE_SUBID_NONE, "KERNEL" },
- { RESOURCE_ID_INITRAMFS,RESOURCE_SUBID_NONE, "ROOTFS" },
-};
-
-/* This mimics the hostboot SBE format */
-#define PNOR_SUBPART_ALIGNMENT 0x1000
-#define PNOR_SUBPART_HEADER_SIZE PNOR_SUBPART_ALIGNMENT
-struct pnor_hostboot_toc {
- be32 ec;
- be32 offset; /* From start of header. 4K aligned */
- be32 size;
-};
-#define PNOR_HOSTBOOT_TOC_MAX_ENTRIES ((PNOR_SUBPART_HEADER_SIZE - 8)/sizeof(struct pnor_hostboot_toc))
-struct pnor_hostboot_header {
- char eyecatcher[4];
- be32 version;
- struct pnor_hostboot_toc toc[PNOR_HOSTBOOT_TOC_MAX_ENTRIES];
-};
-
-static int pnor_find_subpartition(struct flash_chip *chip,
- uint32_t subid,
- uint32_t *start,
- uint32_t *total_size)
-{
- struct pnor_hostboot_header *header;
- uint32_t i;
- bool rc;
- char eyecatcher[5];
-
- header = malloc(PNOR_SUBPART_HEADER_SIZE);
- if (!header)
- return false;
-
- /* Get the TOC */
- rc = flash_read(chip, *start, header, PNOR_SUBPART_HEADER_SIZE);
- if (rc) {
- prerror("PLAT: pnor subpartition TOC read failed %i", rc);
- goto end;
- }
-
- /* Perform sanity */
- i = be32_to_cpu(header->version);
- if (i != 1) {
- prerror("PLAT: pnor subpartition TOC version unknown %i", i);
- rc = OPAL_RESOURCE;
- goto end;
- }
- /* NULL terminate eyecatcher */
- strncpy(eyecatcher, header->eyecatcher, 4);
- eyecatcher[4] = 0;
- printf("PLAT: pnor subpartition eyecatcher %s\n", eyecatcher);
-
- rc = OPAL_RESOURCE;
- for (i = 0; i< PNOR_HOSTBOOT_TOC_MAX_ENTRIES; i++) {
- uint32_t ec, offset, size;
-
- ec = be32_to_cpu(header->toc[i].ec);
- offset = be32_to_cpu(header->toc[i].offset);
- size = be32_to_cpu(header->toc[i].size);
- /* Check for null terminating entry */
- if (!ec && !offset && !size) {
- prerror("PLAT: pnor subpartition not found.");
- goto end;
- }
-
- if (ec != subid)
- continue;
-
- /* Sanity check the offset and size */
- if (offset + size > *total_size) {
- prerror("PLAT: pnor subpartition too big: %i", i);
- goto end;
- }
- if (!size) {
- prerror("PLAT: pnor subpartition zero size: %i", i);
- goto end;
- }
- if (offset < PNOR_SUBPART_HEADER_SIZE) {
- prerror("PLAT: pnor subpartition offset too small: %i", i);
- goto end;
- }
-
- /* All good, let's adjust the start and size */
- printf("PLAT: pnor found subpartition: %i size: %i offset %i\n",
- i, size, offset);
- *start += offset;
- size = (size + (PNOR_SUBPART_ALIGNMENT - 1)) & ~(PNOR_SUBPART_ALIGNMENT - 1);
- *total_size = size;
- rc = 0;
- goto end;
- }
-
-end:
- free(header);
- return rc;
-}
-
-bool pnor_load_resource(enum resource_id id, uint32_t subid,
- 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;
- }
-
- /*
- * If partition doesn't have a subindex but the caller specifies one,
- * we fail. eg. kernel partition doesn't have a subindex
- */
- if ((part_name_map[i].subid == RESOURCE_SUBID_NONE) &&
- (subid != RESOURCE_SUBID_NONE)) {
- prerror("PLAT: Partition %s doesn't have subindex\n", name);
- 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;
- }
-
- /* Find the sub partition if required */
- if (subid != RESOURCE_SUBID_NONE) {
- rc = pnor_find_subpartition(pnor_chip, subid, &part_start,
- &part_size);
- if (rc)
- 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;
-}