1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 23:22:37 +02:00

linux_spi.c: Extract get_max_kernel_buf_size() as a function

To get max_kernel_buf_size is a piece of logic on its own, it opens
resources and closes resources, also has some local variables only
for this task. Extracting get_max_kernel_buf_size() as a separate
function simplifies init flow and allows to remove global state from linux_spi
(see next patches in this chain).

TEST=builds
BUG=b:140394053

Change-Id: I4b8c5775fb8f4b0dff702fcc0fb258221254c659
Signed-off-by: Anastasia Klimchuk <aklm@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/52283
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
This commit is contained in:
Anastasia Klimchuk 2021-04-12 16:52:58 +10:00 committed by Edward O'Callaghan
parent 5f1524b22f
commit f227cd3760

View File

@ -119,6 +119,46 @@ static const struct spi_master spi_master_linux = {
.write_aai = default_spi_write_aai, .write_aai = default_spi_write_aai,
}; };
/* Read max buffer size from sysfs, or use page size as fallback. */
static size_t get_max_kernel_buf_size() {
size_t result = 0;
FILE *fp;
fp = fopen(BUF_SIZE_FROM_SYSFS, "r");
if (!fp) {
msg_pwarn("Cannot open %s: %s.\n", BUF_SIZE_FROM_SYSFS, strerror(errno));
goto out;
}
char buf[10];
if (!fgets(buf, sizeof(buf), fp)) {
if (feof(fp))
msg_pwarn("Cannot read %s: file is empty.\n", BUF_SIZE_FROM_SYSFS);
else
msg_pwarn("Cannot read %s: %s.\n", BUF_SIZE_FROM_SYSFS, strerror(errno));
goto out;
}
long int tmp;
errno = 0;
tmp = strtol(buf, NULL, 0);
if ((tmp < 0) || errno) {
msg_pwarn("Buffer size %ld from %s seems wrong.\n", tmp, BUF_SIZE_FROM_SYSFS);
} else {
msg_pdbg("%s: Using value from %s as max buffer size.\n", __func__, BUF_SIZE_FROM_SYSFS);
result = (size_t)tmp;
}
out:
if (fp)
fclose(fp);
if (!result) {
msg_pdbg("%s: Using page size as max buffer size.\n", __func__);
result = (size_t)getpagesize();
}
return result;
}
int linux_spi_init(void) int linux_spi_init(void)
{ {
char *p, *endp, *dev; char *p, *endp, *dev;
@ -183,43 +223,9 @@ int linux_spi_init(void)
return 1; return 1;
} }
/* Read max buffer size from sysfs, or use page size as fallback. */ max_kernel_buf_size = get_max_kernel_buf_size();
FILE *fp;
fp = fopen(BUF_SIZE_FROM_SYSFS, "r");
if (!fp) {
msg_pwarn("Cannot open %s: %s.\n", BUF_SIZE_FROM_SYSFS, strerror(errno));
goto out;
}
char buf[10];
if (!fgets(buf, sizeof(buf), fp)) {
if (feof(fp))
msg_pwarn("Cannot read %s: file is empty.\n", BUF_SIZE_FROM_SYSFS);
else
msg_pwarn("Cannot read %s: %s.\n", BUF_SIZE_FROM_SYSFS, strerror(errno));
goto out;
}
long int tmp;
errno = 0;
tmp = strtol(buf, NULL, 0);
if ((tmp < 0) || errno) {
msg_pwarn("Buffer size %ld from %s seems wrong.\n", tmp, BUF_SIZE_FROM_SYSFS);
} else {
msg_pdbg("%s: Using value from %s as max buffer size.\n", __func__, BUF_SIZE_FROM_SYSFS);
max_kernel_buf_size = (size_t)tmp;
}
out:
if (fp)
fclose(fp);
if (!max_kernel_buf_size) {
msg_pdbg("%s: Using page size as max buffer size.\n", __func__);
max_kernel_buf_size = (size_t)getpagesize();
}
msg_pdbg("%s: max_kernel_buf_size: %zu\n", __func__, max_kernel_buf_size); msg_pdbg("%s: max_kernel_buf_size: %zu\n", __func__, max_kernel_buf_size);
register_spi_master(&spi_master_linux); register_spi_master(&spi_master_linux);
return 0; return 0;
} }