[igt-dev] [PATCH i-g-t 3/6] tools/dpcd_reg: Unify file handling.
Rodrigo Vivi
rodrigo.vivi at intel.com
Sat Sep 1 04:18:03 UTC 2018
Besides removing few code duplication this will
allow us to read multiple regs without having
to keep closing and opening the file for every
read.
Cc: Tarun Vyas <tarun.vyas at intel.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan at intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
---
tools/dpcd_reg.c | 98 +++++++++++++++++++++++++++---------------------
1 file changed, 55 insertions(+), 43 deletions(-)
diff --git a/tools/dpcd_reg.c b/tools/dpcd_reg.c
index d139007c..09da4109 100644
--- a/tools/dpcd_reg.c
+++ b/tools/dpcd_reg.c
@@ -53,61 +53,56 @@ static void print_usage(char *tool, int help)
exit((help == 1)? EXIT_SUCCESS : EXIT_FAILURE);
}
-static int dpcd_read(char *device, const uint32_t offset, size_t count)
+static int dpcd_read(int fd, const uint32_t offset, size_t count)
{
- int fd, ret, i;
+ int ret, i;
void *buf = malloc(sizeof(uint8_t) * count);
+ ret = lseek(fd, offset, SEEK_SET);
+ if (ret < 0) {
+ igt_warn("lseek to %04x failed!\n", offset);
+ return ret;
+ }
+
if (NULL != buf)
memset(buf, 0, sizeof(uint8_t) * count);
else {
igt_warn("Can't allocate read buffer\n");
- return EXIT_FAILURE;
+ return -1;
}
- fd = open(device, O_RDONLY);
- if (fd > 0) {
- ret = pread(fd, buf, count, offset);
- close(fd);
- if (ret != count) {
- igt_warn("Failed to read from %s aux device - error %s\n", device, strerror(errno));
- ret = EXIT_FAILURE;
- goto out;
- }
-
- igt_info("%04x:", offset);
- for (i = 0; i < count; i++)
- igt_info(" %02x", *(((uint8_t *)(buf)) + i));
- igt_info("\n");
- }
- else {
- igt_warn("Failed to open %s aux device - error: %s\n", device, strerror(errno));
- ret = EXIT_FAILURE;
+ ret = read(fd, buf, count);
+ if (ret != count) {
+ igt_warn("Failed to read - error %s\n", strerror(errno));
+ goto out;
}
+
+ igt_info("%04x:", offset);
+ for (i = 0; i < count; i++)
+ igt_info(" %02x", *(((uint8_t *)(buf)) + i));
+ igt_info("\n");
+
out:
free(buf);
return ret;
}
-static int dpcd_write(char *device, const uint32_t offset, const uint8_t *val)
+static int dpcd_write(int fd, const uint32_t offset, const uint8_t *val)
{
- int fd, ret;
-
- fd = open(device, O_RDWR);
- if (fd > 0) {
- ret = pwrite(fd, (const void *)val, sizeof(uint8_t), offset);
- close(fd);
- if (ret < 0) {
- igt_warn("Failed to write to %s aux device - error %s\n", device, strerror(errno));
- ret = EXIT_FAILURE;
- goto out;
- }
- ret = dpcd_read(device, offset, sizeof(uint8_t));
+ int ret;
+
+ ret = lseek(fd, offset, SEEK_SET);
+ if (ret < 0) {
+ igt_warn("lseek to %04x failed!\n", offset);
+ return ret;
}
- else {
- igt_warn("Failed to open %s aux device - error: %s\n", device, strerror(errno));
- ret = EXIT_FAILURE;
+
+ ret = write(fd, (const void *)val, sizeof(uint8_t));
+ if (ret < 0) {
+ igt_warn("Failed to write - error %s\n", strerror(errno));
+ goto out;
}
+ ret = dpcd_read(fd, offset, sizeof(uint8_t));
out:
return ret;
}
@@ -115,10 +110,11 @@ out:
int main(int argc, char **argv)
{
char dev_name[20];
- int ret, devid, help_flg;
+ int fd, ret, devid, help_flg;
uint32_t offset;
uint8_t val;
size_t count;
+ int file_op = O_RDONLY;
enum command {
INV = -1,
@@ -157,11 +153,12 @@ int main(int argc, char **argv)
break;
/* Command parsing */
case 1:
- if (strcmp(optarg, "read") == 0)
+ if (strcmp(optarg, "read") == 0) {
cmd = READ;
- else if (strcmp(optarg, "write") == 0)
+ } else if (strcmp(optarg, "write") == 0) {
cmd = WRITE;
- break;
+ file_op = O_RDWR;
+ } break;
case ':':
igt_warn("The -%c option of %s requires an argument\n",
optopt, argv[0]);
@@ -185,20 +182,33 @@ int main(int argc, char **argv)
memset(dev_name, '\0', 20);
snprintf(dev_name, sizeof(aux_dev) + 2, "%s%d", aux_dev, devid);
+ fd = open(dev_name, file_op);
+ if (fd < 0) {
+ igt_warn("Failed to open %s aux device - error: %s\n", dev_name,
+ strerror(errno));
+ return EXIT_FAILURE;
+ }
+
switch (cmd) {
case READ:
if (count == INVALID) {
igt_warn("Please specify the count in bytes\n");
print_usage(argv[0], 0);
}
- ret = dpcd_read(dev_name, offset, count);
+ ret = dpcd_read(fd, offset, count);
+ if (ret != count)
+ igt_warn("Failed to read from %s aux device\n",
+ dev_name);
break;
case WRITE:
if (val == INVALID) {
igt_warn("Write value is missing\n");
print_usage(argv[0], 0);
}
- ret = dpcd_write(dev_name, offset, &val);
+ ret = dpcd_write(fd, offset, &val);
+ if (ret < 0)
+ igt_warn("Failed to write to %s aux device\n",
+ dev_name);
break;
case INV:
default:
@@ -206,5 +216,7 @@ int main(int argc, char **argv)
print_usage(argv[0], 0);
}
+ close(fd);
+
return ret;
}
--
2.17.1
More information about the igt-dev
mailing list