[lib][ptable] Modify ptable to respect erase geometries.

Modify the existing ptable code to pay attention to bio device erase
geometry if present.  Significant changes include...

+ Partitions must be allocated on both program and erase block
  boundaries.
+ Partitions lengths must be multiples of both program and erase block
  sizes.
+ Partitions may not span non-homogeneous regions of erase geometry.
+ ptable_allocate as been made private.
+ Users may no longer explicitly select a position for partitions to
  be added, they may only ask for the partition to be allocated at the
  begining or the end of the block device.
+ A bio subdevice will be registered for each active partition in the
  system.  Users are encouraged to add their partition using
  ptable_add, and then open a handle to the subdevice using bio_open.
  The bio subdevice will prevent accidental scribbling outside of the
  partition lines, and also advertise the partition erase size.

Signed-off-by: John Grossman <johngro@google.com>
Change-Id: I09bf9038d210ff8be42d44166ab92c789872e036
This commit is contained in:
John Grossman
2015-06-18 15:49:35 -07:00
committed by Travis Geiselbrecht
parent 8a7219ddb1
commit eab2816302
4 changed files with 597 additions and 346 deletions

View File

@@ -295,17 +295,7 @@ int lkb_handle_command(lkb_t *lkb, const char *cmd, const char *arg, size_t len,
if (ptable_find(arg, &entry) < 0) {
size_t plen = len;
/* doesn't exist, make one */
#if PLATFORM_ZYNQ
/* XXX not really the right place, should be in the ptable/bio layer */
plen = ROUNDUP(plen, 256*1024);
#endif
off_t off = ptable_allocate(plen, 0);
if (off < 0) {
*result = "no space to allocate partition";
return -1;
}
if (ptable_add(arg, off, plen, 0) < 0) {
if (ptable_add(arg, plen, 0) < 0) {
*result = "error creating partition";
return -1;
}

View File

@@ -42,6 +42,8 @@
#include <lib/minip.h>
#endif
#define BLOCK_DEVICE_NAME "spi0"
static void zynq_common_target_init(uint level)
{
status_t err;
@@ -49,11 +51,11 @@ static void zynq_common_target_init(uint level)
/* zybo has a spiflash on qspi */
spiflash_detect();
bdev_t *spi = bio_open("spi0");
bdev_t *spi = bio_open(BLOCK_DEVICE_NAME);
if (spi) {
/* find or create a partition table at the start of flash */
if (ptable_scan(spi, 0) < 0) {
ptable_create_default(spi, 0);
if (ptable_scan(BLOCK_DEVICE_NAME, 0) < 0) {
ptable_create_default(BLOCK_DEVICE_NAME, 0);
}
struct ptable_entry entry = { 0 };
@@ -61,7 +63,7 @@ static void zynq_common_target_init(uint level)
/* find and recover sysparams */
if (ptable_find("sysparam", &entry) < 0) {
/* didn't find sysparam partition, create it */
ptable_add("sysparam", 0x1000, 0x1000, 0);
ptable_add("sysparam", 0x1000, 0);
ptable_find("sysparam", &entry);
}
@@ -81,7 +83,7 @@ static void zynq_common_target_init(uint level)
}
/* create bootloader partition if it does not exist */
ptable_add("bootloader", 0x20000, 0x40000, 0);
ptable_add("bootloader", 0x40000, 0);
#if LK_DEBUGLEVEL > 1
printf("flash partition table:\n");
@@ -111,7 +113,7 @@ static void zynq_common_target_init(uint level)
if (ptr) {
bootimage_open(ptr, bootimage_size, &bi);
}
} else if (!strcmp(device, "spi0")) {
} else if (!strcmp(device, BLOCK_DEVICE_NAME)) {
/* we were loaded from spi flash, go look at it to see if we can find it */
if (spi) {
void *ptr = 0;

View File

@@ -27,12 +27,8 @@
#include <sys/types.h>
#include <lib/bio.h>
status_t ptable_scan(bdev_t *bdev, uint64_t offset);
bool ptable_found_valid(void);
bdev_t *ptable_get_device(void);
#define MAX_FLASH_PTABLE_NAME_LEN 12
#define FLASH_PTABLE_ALLOC_END 0x1
struct ptable_entry {
uint64_t offset;
@@ -41,14 +37,11 @@ struct ptable_entry {
uint8_t name[MAX_FLASH_PTABLE_NAME_LEN];
};
bool ptable_found_valid(void);
bdev_t* ptable_get_device(void);
status_t ptable_scan(const char* bdev_name, uint64_t offset);
status_t ptable_find(const char *name, struct ptable_entry *entry) __NONNULL((1));
status_t ptable_create_default(bdev_t *bdev, uint64_t offset) __NONNULL();
status_t ptable_add(const char *name, uint64_t offset, uint64_t len, uint32_t flags) __NONNULL();
status_t ptable_create_default(const char* bdev_name, uint64_t offset) __NONNULL();
status_t ptable_add(const char *name, uint64_t min_len, uint32_t flags) __NONNULL();
status_t ptable_remove(const char *name) __NONNULL();
void ptable_dump(void);
#define FLASH_PTABLE_ALLOC_END 0x1
off_t ptable_allocate(uint64_t length, uint flags);
off_t ptable_allocate_at(off_t offset, uint64_t length);
void ptable_dump(void);

File diff suppressed because it is too large Load Diff