blob: 36629213d8a8ae1dce6ebe6da149ddf73d2cac42 [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but without any warranty; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <libpayload.h>
#include <vboot_struct.h>
#include "image/fmap.h"
#include "vboot/firmware_id.h"
#include "vboot/util/commonparams.h"
static struct fwid {
int vdat_id;
const char *fw_name;
const char *fw_id;
int fw_size;
const char *id_err;
} fw_fmap_ops[] = {
{VDAT_RW_A, "RW_FWID_A", NULL, 0, "RW A: ID NOT FOUND"},
{VDAT_RW_B, "RW_FWID_B", NULL, 0, "RW B: ID NOT FOUND"},
{VDAT_RECOVERY, "RO_FRID", NULL, 0, "RO: ID NOT FOUND"},
};
static void get_fw_details(struct fwid *entry)
{
if (entry->fw_id)
return;
entry->fw_id = fmap_find_string(entry->fw_name, &entry->fw_size);
if (entry->fw_id == NULL)
entry->fw_id = entry->id_err;
}
static struct fwid *get_fw_entry(int index)
{
int i;
for (i = 0; i < ARRAY_SIZE(fw_fmap_ops); i++) {
if (fw_fmap_ops[i].vdat_id == index)
break;
}
if (i == ARRAY_SIZE(fw_fmap_ops))
return NULL;
struct fwid *entry = &fw_fmap_ops[i];
get_fw_details(entry);
return entry;
}
const char *get_fw_id(int index)
{
struct fwid *entry = get_fw_entry(index);
if(entry == NULL)
return NULL;
return entry->fw_id;
}
int get_fw_size(int index)
{
struct fwid *entry = get_fw_entry(index);
if (entry == NULL)
return 0;
return entry->fw_size;
}
const char *get_ro_fw_id(void)
{
return get_fw_id(VDAT_RECOVERY);
}
const char *get_rwa_fw_id(void)
{
return get_fw_id(VDAT_RW_A);
}
const char *get_rwb_fw_id(void)
{
return get_fw_id(VDAT_RW_B);
}
int get_ro_fw_size(void)
{
return get_fw_size(VDAT_RECOVERY);
}
int get_rwa_fw_size(void)
{
return get_fw_size(VDAT_RW_A);
}
int get_rwb_fw_size(void)
{
return get_fw_size(VDAT_RW_B);
}
static VbSharedDataHeader *get_vdat(void)
{
void *blob;
int size;
if (find_common_params(&blob, &size) == 0)
return blob;
return NULL;
}
static inline int get_active_fw_index(VbSharedDataHeader *vdat)
{
int fw_index = VDAT_UNKNOWN;
if (vdat)
fw_index = vdat->firmware_index;
return fw_index;
}
const char *get_active_fw_id(void)
{
VbSharedDataHeader *vdat = get_vdat();
int fw_index = get_active_fw_index(vdat);
return get_fw_id(fw_index);
}
int get_active_fw_size(void)
{
VbSharedDataHeader *vdat = get_vdat();
int fw_index = get_active_fw_index(vdat);
return get_fw_size(fw_index);
}