rmtfs: Update to latest version
Commit b08ef6f ("Use fdatasync instead of O_SYNC on storage")
This version adds support for newer devices that use PAS and not MSA.
diff --git a/qcom/rmtfs/.gitignore b/qcom/rmtfs/.gitignore
new file mode 100644
index 0000000..eab0e81
--- /dev/null
+++ b/qcom/rmtfs/.gitignore
@@ -0,0 +1,3 @@
+rmtfs
+*.o
+rmtfs.service
diff --git a/qcom/rmtfs/rmtfs.c b/qcom/rmtfs/rmtfs.c
index 93965f1..ffca070 100644
--- a/qcom/rmtfs/rmtfs.c
+++ b/qcom/rmtfs/rmtfs.c
@@ -220,6 +220,10 @@
respond:
dbgprintf("[RMTFS] iovec %d, %sforced => (%d:%d)\n", caller_id, force ? "" : "not ",
resp.result.result, resp.result.error);
+
+ if (is_write)
+ storage_sync(rmtfd);
+
for (i = 0; i < num_entries; i++) {
dbgprintf("[RMTFS] %s %d:%d 0x%x\n", is_write ? "write" : "read",
entries[i].sector_addr,
@@ -445,7 +449,10 @@
rproc_start();
for (;;) {
- if (rprocfd >= 0 && sig_int_count == 1 && !sig_int_handled) {
+ if (sig_int_count == 1 && !sig_int_handled) {
+ if (rprocfd < 0)
+ break;
+
rproc_stop();
sig_int_handled = true;
} else if (sig_int_count > 1) {
@@ -482,7 +489,7 @@
return ret;
}
-static void sig_int_handler(int signo __unused)
+static void sig_int_handler(int signo)
{
sig_int_count++;
}
diff --git a/qcom/rmtfs/rmtfs.h b/qcom/rmtfs/rmtfs.h
index 242baa5..fa4b806 100644
--- a/qcom/rmtfs/rmtfs.h
+++ b/qcom/rmtfs/rmtfs.h
@@ -34,6 +34,7 @@
void storage_exit(void);
ssize_t storage_pread(const struct rmtfd *rmtfd, void *buf, size_t nbyte, off_t offset);
ssize_t storage_pwrite(struct rmtfd *rmtfd, const void *buf, size_t nbyte, off_t offset);
+int storage_sync(struct rmtfd *rmtfd);
int rproc_init(void);
int rproc_start(void);
diff --git a/qcom/rmtfs/rproc.c b/qcom/rmtfs/rproc.c
index 95b45cb..732d992 100644
--- a/qcom/rmtfs/rproc.c
+++ b/qcom/rmtfs/rproc.c
@@ -13,13 +13,75 @@
#include "rmtfs.h"
#define RPROC_BASE_PATH "/sys/bus/platform/drivers/qcom-q6v5-mss/"
+#define RPROC_CLASS_PATH "/sys/class/remoteproc/"
static pthread_t start_thread;
static pthread_t stop_thread;
static int rproc_state_fd;
static int rproc_pipe[2];
-int rproc_init(void)
+static int rproc_init_by_modalias(void)
+{
+ struct dirent *rproc_de;
+ char modalias[256];
+ DIR *base_dir;
+ int modalias_fd;
+ int rproc_fd;
+ int state_fd = -1;
+ int base_fd;
+ int ret;
+
+ base_fd = open(RPROC_CLASS_PATH, O_RDONLY | O_DIRECTORY);
+ if (base_fd < 0)
+ return -1;
+
+ base_dir = fdopendir(base_fd);
+ if (!base_dir) {
+ fprintf(stderr, "failed to open remoteproc class path\n");
+ close(base_fd);
+ return -1;
+ }
+
+ while (state_fd < 0 && (rproc_de = readdir(base_dir)) != NULL) {
+ if (!strcmp(rproc_de->d_name, ".") ||
+ !strcmp(rproc_de->d_name, ".."))
+ continue;
+
+ rproc_fd = openat(base_fd, rproc_de->d_name, O_RDONLY | O_DIRECTORY);
+ if (rproc_fd < 0)
+ continue;
+
+ modalias_fd = openat(rproc_fd, "device/modalias", O_RDONLY);
+ if (modalias_fd < 0)
+ goto close_rproc_fd;
+
+ ret = read(modalias_fd, modalias, sizeof(modalias) - 1);
+ if (ret < 0)
+ goto close_modalias_fd;
+ modalias[ret] = '\0';
+
+ if (!strstr(modalias, "-mpss-pas") && !strstr(modalias, "-mss-pil"))
+ goto close_modalias_fd;
+
+ state_fd = openat(rproc_fd, "state", O_WRONLY);
+ if (state_fd < 0) {
+ fprintf(stderr,
+ "unable to open remoteproc \"state\" control file of %s\n",
+ rproc_de->d_name);
+ }
+
+close_modalias_fd:
+ close(modalias_fd);
+close_rproc_fd:
+ close(rproc_fd);
+ }
+ closedir(base_dir);
+ close(base_fd);
+
+ return state_fd;
+}
+
+static int rproc_init_by_mss_driver(void)
{
struct dirent *device_de;
struct dirent *rproc_de;
@@ -28,10 +90,8 @@
DIR *base_dir;
int device_fd;
int rproc_fd;
+ int state_fd = -1;
int base_fd;
- int ret;
-
- rproc_state_fd = -1;
base_fd = open(RPROC_BASE_PATH, O_RDONLY | O_DIRECTORY);
if (base_fd < 0)
@@ -44,7 +104,7 @@
return -1;
}
- while (rproc_state_fd < 0 && (device_de = readdir(base_dir)) != NULL) {
+ while (state_fd < 0 && (device_de = readdir(base_dir)) != NULL) {
if (!strcmp(device_de->d_name, ".") ||
!strcmp(device_de->d_name, ".."))
continue;
@@ -60,7 +120,7 @@
}
rproc_dir = fdopendir(rproc_base_fd);
- while (rproc_state_fd < 0 && (rproc_de = readdir(rproc_dir)) != NULL) {
+ while (state_fd < 0 && (rproc_de = readdir(rproc_dir)) != NULL) {
if (!strcmp(rproc_de->d_name, ".") ||
!strcmp(rproc_de->d_name, ".."))
continue;
@@ -69,8 +129,8 @@
if (rproc_fd < 0)
continue;
- rproc_state_fd = openat(rproc_fd, "state", O_WRONLY);
- if (rproc_state_fd < 0) {
+ state_fd = openat(rproc_fd, "state", O_WRONLY);
+ if (state_fd < 0) {
fprintf(stderr,
"unable to open remoteproc \"state\" control file of %s\n",
device_de->d_name);
@@ -86,41 +146,64 @@
closedir(base_dir);
close(base_fd);
- if (rproc_state_fd < 0)
- return -1;
+ return state_fd;
+}
+
+int rproc_init(void)
+{
+ int state_fd;
+ int ret;
+
+ state_fd = rproc_init_by_modalias();
+ if (state_fd < 0) {
+ state_fd = rproc_init_by_mss_driver();
+ if (state_fd < 0)
+ return -1;
+ }
ret = pipe(rproc_pipe);
if (ret < 0) {
- close(rproc_state_fd);
+ close(state_fd);
return -1;
}
+ rproc_state_fd = state_fd;
+
return rproc_pipe[0];
}
-static void *do_rproc_start(void *unused __unused)
+static void *do_rproc_start(void *unused)
{
ssize_t ret;
ret = pwrite(rproc_state_fd, "start", 5, 0);
- if (ret < 4)
- fprintf(stderr, "failed to update start state\n");
+ if (ret < 4) {
+ fprintf(stderr, "failed to update start state: %s\n",
+ strerror(errno));
+ }
return NULL;
}
int rproc_start()
{
- return pthread_create(&start_thread, NULL, do_rproc_start, NULL);
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ return pthread_create(&start_thread, &attr, do_rproc_start, NULL);
}
-static void *do_rproc_stop(void *unused __unused)
+static void *do_rproc_stop(void *unused)
{
ssize_t ret;
ret = pwrite(rproc_state_fd, "stop", 4, 0);
- if (ret < 4)
- fprintf(stderr, "failed to update stop state\n");
+ if (ret < 4) {
+ fprintf(stderr, "failed to update stop state: %s\n",
+ strerror(errno));
+ }
ret = write(rproc_pipe[1], "Y", 1);
if (ret != 1) {
@@ -133,5 +216,10 @@
int rproc_stop(void)
{
- return pthread_create(&stop_thread, NULL, do_rproc_stop, NULL);
+ pthread_attr_t attr;
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ return pthread_create(&stop_thread, &attr, do_rproc_stop, NULL);
}
diff --git a/qcom/rmtfs/sharedmem.c b/qcom/rmtfs/sharedmem.c
index b6d3279..d8b5ecd 100644
--- a/qcom/rmtfs/sharedmem.c
+++ b/qcom/rmtfs/sharedmem.c
@@ -256,7 +256,7 @@
return -saved_errno;
}
-static int rmtfs_mem_open_uio(struct rmtfs_mem *rmem __unused, int client_id __unused)
+static int rmtfs_mem_open_uio(struct rmtfs_mem *rmem, int client_id)
{
fprintf(stderr, "uio access is not supported on ANDROID yet\n");
return -EINVAL;
@@ -330,7 +330,7 @@
return rmem->address;
}
-void rmtfs_mem_free(struct rmtfs_mem *rmem __unused)
+void rmtfs_mem_free(struct rmtfs_mem *rmem)
{
}
diff --git a/qcom/rmtfs/storage.c b/qcom/rmtfs/storage.c
index c8e69ed..aaf73d0 100644
--- a/qcom/rmtfs/storage.c
+++ b/qcom/rmtfs/storage.c
@@ -41,6 +41,7 @@
{ "/boot/modem_fs2", "modem_fs2", "modemst2" },
{ "/boot/modem_fsc", "modem_fsc", "fsc" },
{ "/boot/modem_fsg", "modem_fsg", "fsg" },
+ { "/boot/modem_tunning", "modem_tunning", "tunning" },
{}
};
@@ -150,8 +151,10 @@
void storage_close(struct rmtfd *rmtfd)
{
- close(rmtfd->fd);
- rmtfd->fd = -1;
+ if (rmtfd->fd >= 0) {
+ close(rmtfd->fd);
+ rmtfd->fd = -1;
+ }
free(rmtfd->shadow_buf);
rmtfd->shadow_buf = NULL;
@@ -188,10 +191,8 @@
{
int i;
- for (i = 0; i < MAX_CALLERS; i++) {
- if (rmtfds[i].fd >= 0)
- close(rmtfds[i].fd);
- }
+ for (i = 0; i < MAX_CALLERS; i++)
+ storage_close(&rmtfds[i]);
}
ssize_t storage_pread(const struct rmtfd *rmtfd, void *buf, size_t nbyte, off_t offset)
@@ -244,6 +245,14 @@
return nbyte;
}
+int storage_sync(struct rmtfd *rmtfd)
+{
+ if (storage_read_only)
+ return 0;
+
+ return fdatasync(rmtfd->fd);
+}
+
static int storage_populate_shadow_buf(struct rmtfd *rmtfd, const char *file)
{
ssize_t len;