libqos/fw_cfg: refactor file directory iteraton to make it more reusable
fw-cfg file directory iteration code can be used by other functions that may want to implement fw-cfg file operations. Refactor it into a smaller helper so that it can be reused. No functional change. Signed-off-by: Ani Sinha <anisinha@redhat.com> Reviewed-by: Fabiano Rosas <farosas@suse.de> Message-ID: <20250120043847.954881-2-anisinha@redhat.com> Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
parent
6fccaa2fba
commit
453b3f3cdc
@ -60,6 +60,37 @@ static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
|
||||
qtest_writew(fw_cfg->qts, fw_cfg->base, key);
|
||||
}
|
||||
|
||||
static bool find_pdir_entry(QFWCFG *fw_cfg, const char *filename,
|
||||
uint16_t *sel, uint32_t *size)
|
||||
{
|
||||
g_autofree unsigned char *filesbuf = NULL;
|
||||
uint32_t count;
|
||||
size_t dsize;
|
||||
FWCfgFile *pdir_entry;
|
||||
uint32_t i;
|
||||
bool found = false;
|
||||
|
||||
*size = 0;
|
||||
*sel = 0;
|
||||
|
||||
qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, &count, sizeof(count));
|
||||
count = be32_to_cpu(count);
|
||||
dsize = sizeof(uint32_t) + count * sizeof(struct fw_cfg_file);
|
||||
filesbuf = g_malloc(dsize);
|
||||
qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
|
||||
pdir_entry = (FWCfgFile *)(filesbuf + sizeof(uint32_t));
|
||||
for (i = 0; i < count; ++i, ++pdir_entry) {
|
||||
if (!strcmp(pdir_entry->name, filename)) {
|
||||
*size = be32_to_cpu(pdir_entry->size);
|
||||
*sel = be16_to_cpu(pdir_entry->select);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/*
|
||||
* The caller need check the return value. When the return value is
|
||||
* nonzero, it means that some bytes have been transferred.
|
||||
@ -73,34 +104,20 @@ static void mm_fw_cfg_select(QFWCFG *fw_cfg, uint16_t key)
|
||||
* populated, it has received only a starting slice of the fw_cfg file.
|
||||
*/
|
||||
size_t qfw_cfg_get_file(QFWCFG *fw_cfg, const char *filename,
|
||||
void *data, size_t buflen)
|
||||
void *data, size_t buflen)
|
||||
{
|
||||
uint32_t count;
|
||||
uint32_t i;
|
||||
unsigned char *filesbuf = NULL;
|
||||
size_t dsize;
|
||||
FWCfgFile *pdir_entry;
|
||||
size_t filesize = 0;
|
||||
uint32_t len;
|
||||
uint16_t sel;
|
||||
|
||||
qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, &count, sizeof(count));
|
||||
count = be32_to_cpu(count);
|
||||
dsize = sizeof(uint32_t) + count * sizeof(struct fw_cfg_file);
|
||||
filesbuf = g_malloc(dsize);
|
||||
qfw_cfg_get(fw_cfg, FW_CFG_FILE_DIR, filesbuf, dsize);
|
||||
pdir_entry = (FWCfgFile *)(filesbuf + sizeof(uint32_t));
|
||||
for (i = 0; i < count; ++i, ++pdir_entry) {
|
||||
if (!strcmp(pdir_entry->name, filename)) {
|
||||
uint32_t len = be32_to_cpu(pdir_entry->size);
|
||||
uint16_t sel = be16_to_cpu(pdir_entry->select);
|
||||
filesize = len;
|
||||
if (len > buflen) {
|
||||
len = buflen;
|
||||
}
|
||||
qfw_cfg_get(fw_cfg, sel, data, len);
|
||||
break;
|
||||
if (find_pdir_entry(fw_cfg, filename, &sel, &len)) {
|
||||
filesize = len;
|
||||
if (len > buflen) {
|
||||
len = buflen;
|
||||
}
|
||||
qfw_cfg_get(fw_cfg, sel, data, len);
|
||||
}
|
||||
g_free(filesbuf);
|
||||
|
||||
return filesize;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user