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: Haojian Zhuang <haojian.zhuang@linaro.org> Change-Id: Iada05f7c646d0a0f2c0d3b8545540b3cb7153de3
This commit is contained in:
parent
6129e9a643
commit
f8631f5139
|
@ -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)
|
||||||
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 @@
|
||||||
#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)
|
||||||
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,
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue