Commit f8631f51 authored by Haojian Zhuang's avatar Haojian Zhuang
Browse files

drivers: partition: support different block size



The block size of some storage device is 4096-byte long, such as UFS. But
PARTITION_BLOCK_SIZE is defined as 512-byte long. So replace it by
PLAT_PARTITION_BLOCK_SIZE. Make it configurable in platform.
Signed-off-by: default avatarHaojian Zhuang <haojian.zhuang@linaro.org>
Change-Id: Iada05f7c646d0a0f2c0d3b8545540b3cb7153de3
parent 6129e9a6
...@@ -546,6 +546,13 @@ optionally be defined: ...@@ -546,6 +546,13 @@ optionally be defined:
PLAT_PARTITION_MAX_ENTRIES := 12 PLAT_PARTITION_MAX_ENTRIES := 12
$(eval $(call add_define,PLAT_PARTITION_MAX_ENTRIES)) $(eval $(call add_define,PLAT_PARTITION_MAX_ENTRIES))
- **PLAT_PARTITION_BLOCK_SIZE**
The size of partition block. It could be either 512 bytes or 4096 bytes.
The default value is 512.
`For example, define the build flag in platform.mk`_:
PLAT_PARTITION_BLOCK_SIZE := 4096
$(eval $(call add_define,PLAT_PARTITION_BLOCK_SIZE))
The following constant is optional. It should be defined to override the default The following constant is optional. It should be defined to override the default
behaviour of the ``assert()`` function (for example, to save memory). behaviour of the ``assert()`` function (for example, to save memory).
......
...@@ -52,9 +52,10 @@ int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry) ...@@ -52,9 +52,10 @@ int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry)
if (result != 0) { if (result != 0) {
return result; return result;
} }
entry->start = (uint64_t)gpt_entry->first_lba * PARTITION_BLOCK_SIZE; entry->start = (uint64_t)gpt_entry->first_lba *
PLAT_PARTITION_BLOCK_SIZE;
entry->length = (uint64_t)(gpt_entry->last_lba - entry->length = (uint64_t)(gpt_entry->last_lba -
gpt_entry->first_lba + 1) * gpt_entry->first_lba + 1) *
PARTITION_BLOCK_SIZE; PLAT_PARTITION_BLOCK_SIZE;
return 0; return 0;
} }
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <drivers/partition/mbr.h> #include <drivers/partition/mbr.h>
#include <plat/common/platform.h> #include <plat/common/platform.h>
static uint8_t mbr_sector[PARTITION_BLOCK_SIZE]; static uint8_t mbr_sector[PLAT_PARTITION_BLOCK_SIZE];
static partition_entry_list_t list; static partition_entry_list_t list;
#if LOG_LEVEL >= LOG_LEVEL_VERBOSE #if LOG_LEVEL >= LOG_LEVEL_VERBOSE
...@@ -57,15 +57,15 @@ static int load_mbr_header(uintptr_t image_handle, mbr_entry_t *mbr_entry) ...@@ -57,15 +57,15 @@ static int load_mbr_header(uintptr_t image_handle, mbr_entry_t *mbr_entry)
return result; return result;
} }
result = io_read(image_handle, (uintptr_t)&mbr_sector, result = io_read(image_handle, (uintptr_t)&mbr_sector,
PARTITION_BLOCK_SIZE, &bytes_read); PLAT_PARTITION_BLOCK_SIZE, &bytes_read);
if (result != 0) { if (result != 0) {
WARN("Failed to read data (%i)\n", result); WARN("Failed to read data (%i)\n", result);
return result; return result;
} }
/* Check MBR boot signature. */ /* Check MBR boot signature. */
if ((mbr_sector[PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) || if ((mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
(mbr_sector[PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) { (mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
return -ENOENT; return -ENOENT;
} }
offset = (uintptr_t)&mbr_sector + MBR_PRIMARY_ENTRY_OFFSET; offset = (uintptr_t)&mbr_sector + MBR_PRIMARY_ENTRY_OFFSET;
...@@ -120,15 +120,15 @@ static int load_mbr_entry(uintptr_t image_handle, mbr_entry_t *mbr_entry, ...@@ -120,15 +120,15 @@ static int load_mbr_entry(uintptr_t image_handle, mbr_entry_t *mbr_entry,
return result; return result;
} }
result = io_read(image_handle, (uintptr_t)&mbr_sector, result = io_read(image_handle, (uintptr_t)&mbr_sector,
PARTITION_BLOCK_SIZE, &bytes_read); PLAT_PARTITION_BLOCK_SIZE, &bytes_read);
if (result != 0) { if (result != 0) {
WARN("Failed to read data (%i)\n", result); WARN("Failed to read data (%i)\n", result);
return result; return result;
} }
/* Check MBR boot signature. */ /* Check MBR boot signature. */
if ((mbr_sector[PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) || if ((mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 2] != MBR_SIGNATURE_FIRST) ||
(mbr_sector[PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) { (mbr_sector[LEGACY_PARTITION_BLOCK_SIZE - 1] != MBR_SIGNATURE_SECOND)) {
return -ENOENT; return -ENOENT;
} }
offset = (uintptr_t)&mbr_sector + offset = (uintptr_t)&mbr_sector +
......
...@@ -10,9 +10,9 @@ ...@@ -10,9 +10,9 @@
#include <drivers/partition/partition.h> #include <drivers/partition/partition.h>
#define PARTITION_TYPE_GPT 0xee #define PARTITION_TYPE_GPT 0xee
#define GPT_HEADER_OFFSET PARTITION_BLOCK_SIZE #define GPT_HEADER_OFFSET PLAT_PARTITION_BLOCK_SIZE
#define GPT_ENTRY_OFFSET (GPT_HEADER_OFFSET + \ #define GPT_ENTRY_OFFSET (GPT_HEADER_OFFSET + \
PARTITION_BLOCK_SIZE) PLAT_PARTITION_BLOCK_SIZE)
#define GUID_LEN 16 #define GUID_LEN 16
#define GPT_SIGNATURE "EFI PART" #define GPT_SIGNATURE "EFI PART"
......
...@@ -17,7 +17,15 @@ ...@@ -17,7 +17,15 @@
CASSERT(PLAT_PARTITION_MAX_ENTRIES <= 128, assert_plat_partition_max_entries); CASSERT(PLAT_PARTITION_MAX_ENTRIES <= 128, assert_plat_partition_max_entries);
#define PARTITION_BLOCK_SIZE 512 #if !PLAT_PARTITION_BLOCK_SIZE
# define PLAT_PARTITION_BLOCK_SIZE 512
#endif /* PLAT_PARTITION_BLOCK_SIZE */
CASSERT((PLAT_PARTITION_BLOCK_SIZE == 512) ||
(PLAT_PARTITION_BLOCK_SIZE == 4096),
assert_plat_partition_block_size);
#define LEGACY_PARTITION_BLOCK_SIZE 512
#define EFI_NAMELEN 36 #define EFI_NAMELEN 36
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment