cbfstool: Support top-aligned addresses for new-format images

The cbfstool handling of new-style FMAP-driven "partitioned" images
originally disallowed the use of x86-style top-aligned addresses with
the add.* and layout actions because it wasn't obvious how they should
work, especially since the normal addressing is done relative to each
individual region for these types of images. Not surprisingly,
however, the x86 portions of the build system make copious use of
top-aligned addresses, so this allows their use with new images and
specifies their behavior as being relative to the *image* end---not
the region end---just as it is for legacy images.

Change-Id: Icecc843f4f8b6bb52aa0ea16df771faa278228d2
Signed-off-by: Sol Boucher <solb@chromium.org>
Reviewed-on: http://review.coreboot.org/10136
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 4ecb461..8fb2a60 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -526,6 +526,12 @@
 int cbfs_add_entry(struct cbfs_image *image, struct buffer *buffer,
 		   const char *name, uint32_t type, uint32_t content_offset)
 {
+	assert(image);
+	assert(buffer);
+	assert(buffer->data);
+	assert(name);
+	assert(!IS_TOP_ALIGNED_ADDRESS(content_offset));
+
 	uint32_t entry_type;
 	uint32_t addr, addr_next;
 	struct cbfs_file *entry, *next;
@@ -537,19 +543,6 @@
 	DEBUG("cbfs_add_entry('%s'@0x%x) => need_size = %u+%zu=%u\n",
 	      name, content_offset, header_size, buffer->size, need_size);
 
-	if (IS_TOP_ALIGNED_ADDRESS(content_offset)) {
-		if (!cbfs_is_legacy_cbfs(image)) {
-			ERROR("Top-aligned offsets are only supported for legacy CBFSes (with master headers)\n");
-			return -1;
-		}
-
-		// legacy cbfstool takes top-aligned address.
-		uint32_t theromsize = image->header.romsize;
-		INFO("Converting top-aligned address 0x%x to offset: 0x%x\n",
-		     content_offset, content_offset + theromsize);
-		content_offset = theromsize + (int32_t)content_offset;
-	}
-
 	// Merge empty entries.
 	DEBUG("(trying to merge empty entries...)\n");
 	cbfs_walk(image, cbfs_merge_empty_entry, NULL);