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:
Ani Sinha 2025-01-20 10:08:32 +05:30 committed by Fabiano Rosas
parent 6fccaa2fba
commit 453b3f3cdc

View File

@ -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;
}