mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-11 23:47:24 +00:00
fwu: gpt: use cached meta-data partition numbers
Use cached values and avoid parsing and scanning through partitions everytime for meta-data partitions because they can't change after bootup. Acked-by: Etienne Carriere <etienne.carriere@linaro.org> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org> Tested-by: Sughosh Ganu <sughosh.ganu@linaro.org>
This commit is contained in:
parent
56b481c428
commit
b042c70554
1 changed files with 24 additions and 19 deletions
|
@ -24,8 +24,9 @@ enum {
|
|||
MDATA_WRITE,
|
||||
};
|
||||
|
||||
static int gpt_get_mdata_partitions(struct blk_desc *desc,
|
||||
uint mdata_parts[2])
|
||||
static uint g_mdata_part[2]; /* = {0, 0} to check against uninit parts */
|
||||
|
||||
static int gpt_get_mdata_partitions(struct blk_desc *desc)
|
||||
{
|
||||
int i, ret;
|
||||
u32 nparts;
|
||||
|
@ -33,18 +34,19 @@ static int gpt_get_mdata_partitions(struct blk_desc *desc,
|
|||
struct disk_partition info;
|
||||
const efi_guid_t fwu_mdata_guid = FWU_MDATA_GUID;
|
||||
|
||||
/* if primary and secondary partitions already found */
|
||||
if (g_mdata_part[0] && g_mdata_part[1])
|
||||
return 0;
|
||||
|
||||
nparts = 0;
|
||||
for (i = 1; i < MAX_SEARCH_PARTITIONS; i++) {
|
||||
for (i = 1; i < MAX_SEARCH_PARTITIONS && nparts < 2; i++) {
|
||||
if (part_get_info(desc, i, &info))
|
||||
continue;
|
||||
uuid_str_to_bin(info.type_guid, part_type_guid.b,
|
||||
UUID_STR_FORMAT_GUID);
|
||||
|
||||
if (!guidcmp(&fwu_mdata_guid, &part_type_guid)) {
|
||||
if (nparts < 2)
|
||||
mdata_parts[nparts] = i;
|
||||
++nparts;
|
||||
}
|
||||
if (!guidcmp(&fwu_mdata_guid, &part_type_guid))
|
||||
g_mdata_part[nparts++] = i;
|
||||
}
|
||||
|
||||
if (nparts != 2) {
|
||||
|
@ -127,26 +129,25 @@ static int fwu_gpt_update_mdata(struct udevice *dev, struct fwu_mdata *mdata)
|
|||
{
|
||||
int ret;
|
||||
struct blk_desc *desc;
|
||||
uint mdata_parts[2];
|
||||
struct fwu_mdata_gpt_blk_priv *priv = dev_get_priv(dev);
|
||||
|
||||
desc = dev_get_uclass_plat(priv->blk_dev);
|
||||
|
||||
ret = gpt_get_mdata_partitions(desc, mdata_parts);
|
||||
ret = gpt_get_mdata_partitions(desc);
|
||||
if (ret < 0) {
|
||||
log_debug("Error getting the FWU metadata partitions\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/* First write the primary partition */
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_WRITE, mdata_parts[0]);
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_WRITE, g_mdata_part[0]);
|
||||
if (ret < 0) {
|
||||
log_debug("Updating primary FWU metadata partition failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* And now the replica */
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_WRITE, mdata_parts[1]);
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_WRITE, g_mdata_part[1]);
|
||||
if (ret < 0) {
|
||||
log_debug("Updating secondary FWU metadata partition failed\n");
|
||||
return ret;
|
||||
|
@ -158,16 +159,14 @@ static int fwu_gpt_update_mdata(struct udevice *dev, struct fwu_mdata *mdata)
|
|||
static int gpt_get_mdata(struct blk_desc *desc, struct fwu_mdata *mdata)
|
||||
{
|
||||
int ret;
|
||||
uint mdata_parts[2];
|
||||
|
||||
ret = gpt_get_mdata_partitions(desc, mdata_parts);
|
||||
|
||||
ret = gpt_get_mdata_partitions(desc);
|
||||
if (ret < 0) {
|
||||
log_debug("Error getting the FWU metadata partitions\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_READ, mdata_parts[0]);
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_READ, g_mdata_part[0]);
|
||||
if (ret < 0) {
|
||||
log_debug("Failed to read the FWU metadata from the device\n");
|
||||
return -EIO;
|
||||
|
@ -182,7 +181,7 @@ static int gpt_get_mdata(struct blk_desc *desc, struct fwu_mdata *mdata)
|
|||
* Try to read the replica.
|
||||
*/
|
||||
memset(mdata, '\0', sizeof(struct fwu_mdata));
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_READ, mdata_parts[1]);
|
||||
ret = gpt_read_write_mdata(desc, mdata, MDATA_READ, g_mdata_part[1]);
|
||||
if (ret < 0) {
|
||||
log_debug("Failed to read the FWU metadata from the device\n");
|
||||
return -EIO;
|
||||
|
@ -206,9 +205,15 @@ static int fwu_gpt_get_mdata(struct udevice *dev, struct fwu_mdata *mdata)
|
|||
static int fwu_gpt_get_mdata_partitions(struct udevice *dev, uint *mdata_parts)
|
||||
{
|
||||
struct fwu_mdata_gpt_blk_priv *priv = dev_get_priv(dev);
|
||||
int err;
|
||||
|
||||
return gpt_get_mdata_partitions(dev_get_uclass_plat(priv->blk_dev),
|
||||
mdata_parts);
|
||||
err = gpt_get_mdata_partitions(dev_get_uclass_plat(priv->blk_dev));
|
||||
if (!err) {
|
||||
mdata_parts[0] = g_mdata_part[0];
|
||||
mdata_parts[1] = g_mdata_part[1];
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int fwu_gpt_read_mdata_partition(struct udevice *dev,
|
||||
|
|
Loading…
Reference in a new issue