summaryrefslogtreecommitdiff
path: root/qcom
diff options
context:
space:
mode:
authorAmit Pundir <amit.pundir@linaro.org>2022-10-27 21:55:51 +0530
committerAmit Pundir <amit.pundir@linaro.org>2022-11-11 15:04:14 +0000
commit53c128710369668f406f57682d36fa70e8dcdbc5 (patch)
tree9d6485f5df6e221d15da360861cbac606bc728a1 /qcom
parent529a529e25fe74b906a10ef3d0a36daf74204664 (diff)
dragonboards: sync up vendor userspace daemons to upstream sources
Sync up the vendor userspace daemons, used to bring up the remoteprocs, to their upstream sources. The following projects are being synced up to the associated upstream commit IDs. https://github.com/andersson/pd-mapper 9d78fc0c6143 (pd-mapper: Null terminate firmware_value string") https://github.com/andersson/qrtr commit 9dc7a88548c2 ("libqrtr: Zero-initialize sockaddr_qrtr") Note: Dropped qrtr changes from commit 47e48a8d935b ("Android: Disable "treat warnings as errors".") https://github.com/andersson/qrtr/commit/47e48a8d935b https://github.com/andersson/rmtfs 695d0668ffa6 ("storage: fix out of bounds read") https://github.com/andersson/tqftpserv 783425b550de ("ANDROID: Add Android.bp makefile") Signed-off-by: Amit Pundir <amit.pundir@linaro.org> Change-Id: Ic08ccff151c012f17e2dfe9529a91b2d1931df57
Diffstat (limited to 'qcom')
-rw-r--r--qcom/pd-mapper/pd-mapper.c1
-rw-r--r--qcom/qrtr/Makefile2
-rw-r--r--qcom/qrtr/lib/libqrtr.h5
-rw-r--r--qcom/qrtr/lib/qmi.c26
-rw-r--r--qcom/qrtr/lib/qrtr.c4
-rw-r--r--qcom/qrtr/src/list.h4
-rw-r--r--qcom/qrtr/src/lookup.c2
-rw-r--r--qcom/rmtfs/rmtfs.c9
-rw-r--r--qcom/rmtfs/rmtfs.h1
-rw-r--r--qcom/rmtfs/rproc.c122
-rw-r--r--qcom/rmtfs/storage.c23
11 files changed, 155 insertions, 44 deletions
diff --git a/qcom/pd-mapper/pd-mapper.c b/qcom/pd-mapper/pd-mapper.c
index 664b77d..376d9fe 100644
--- a/qcom/pd-mapper/pd-mapper.c
+++ b/qcom/pd-mapper/pd-mapper.c
@@ -36,6 +36,7 @@
#include <fcntl.h>
#include <libgen.h>
#include <libqrtr.h>
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/qcom/qrtr/Makefile b/qcom/qrtr/Makefile
index f814aa2..036691c 100644
--- a/qcom/qrtr/Makefile
+++ b/qcom/qrtr/Makefile
@@ -126,7 +126,7 @@ $1: $1.in
$(DESTDIR)$(servicedir)/$1: $1
@echo "INSTALL $$<"
- @install -D -m 755 $$< $$@
+ @install -D -m 644 $$< $$@
all-install += $(DESTDIR)$(servicedir)/$1
endef
diff --git a/qcom/qrtr/lib/libqrtr.h b/qcom/qrtr/lib/libqrtr.h
index 87433ed..93254df 100644
--- a/qcom/qrtr/lib/libqrtr.h
+++ b/qcom/qrtr/lib/libqrtr.h
@@ -4,6 +4,7 @@
#include <linux/qrtr.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
@@ -11,7 +12,7 @@ extern "C" {
#endif
#ifndef offsetof
-#define offsetof(type, md) ((unsigned long)&((type *)0)->md)
+#define offsetof(type, md) ((size_t)&((type *)0)->md)
#endif
#ifndef container_of
@@ -90,7 +91,7 @@ struct qmi_elem_info {
uint32_t elem_size;
enum qmi_array_type array_type;
uint8_t tlv_type;
- uint32_t offset;
+ size_t offset;
struct qmi_elem_info *ei_array;
};
diff --git a/qcom/qrtr/lib/qmi.c b/qcom/qrtr/lib/qmi.c
index f1c0293..d217a2d 100644
--- a/qcom/qrtr/lib/qmi.c
+++ b/qcom/qrtr/lib/qmi.c
@@ -249,8 +249,8 @@ static int qmi_encode_struct_elem(struct qmi_elem_info *ei_array,
LOGW("%s: STRUCT Encode failure\n", __func__);
return rc;
}
- buf_dst = (char*)buf_dst + rc;
- buf_src = (char*)buf_src + temp_ei->elem_size;
+ buf_dst = (void*)((char*)buf_dst + rc);
+ buf_src = (void*)((char*)buf_src + temp_ei->elem_size);
encoded_bytes += rc;
}
@@ -310,7 +310,7 @@ static int qmi_encode_string_elem(struct qmi_elem_info *ei_array,
encoded_bytes += rc;
}
- rc = qmi_encode_basic_elem((char*)buf_dst + encoded_bytes, buf_src,
+ rc = qmi_encode_basic_elem((void*)((char*)buf_dst + encoded_bytes), buf_src,
string_len, temp_ei->elem_size);
encoded_bytes += rc;
@@ -354,7 +354,7 @@ static int qmi_encode(struct qmi_elem_info *ei_array, void *out_buf,
buf_dst = buf_dst + (TLV_LEN_SIZE + TLV_TYPE_SIZE);
while (temp_ei->data_type != QMI_EOTI) {
- buf_src = (char*)in_c_struct + temp_ei->offset;
+ buf_src = (void*)((char*)in_c_struct + temp_ei->offset);
tlv_type = temp_ei->tlv_type;
if (temp_ei->array_type == NO_ARRAY) {
@@ -522,8 +522,8 @@ static int qmi_decode_struct_elem(struct qmi_elem_info *ei_array,
tlv_len - decoded_bytes, dec_level);
if (rc < 0)
return rc;
- buf_src = (char*)buf_src + rc;
- buf_dst = (char*)buf_dst + temp_ei->elem_size;
+ buf_src = (void*)((char*)buf_src + rc);
+ buf_dst = (void*)((char*)buf_dst + temp_ei->elem_size);
decoded_bytes += rc;
}
@@ -585,7 +585,7 @@ static int qmi_decode_string_elem(struct qmi_elem_info *ei_array,
return -EFAULT;
}
- rc = qmi_decode_basic_elem(buf_dst, (char*)buf_src + decoded_bytes,
+ rc = qmi_decode_basic_elem(buf_dst, (void*)((char*)buf_src + decoded_bytes),
string_len, temp_ei->elem_size);
*((char *)buf_dst + string_len) = '\0';
decoded_bytes += rc;
@@ -654,7 +654,7 @@ static int qmi_decode(struct qmi_elem_info *ei_array, void *out_c_struct,
tlv_pointer = buf_src;
QMI_ENCDEC_DECODE_TLV(&tlv_type,
&tlv_len, tlv_pointer);
- buf_src = (uint8_t*)buf_src + (TLV_TYPE_SIZE + TLV_LEN_SIZE);
+ buf_src = (void*)((char*)buf_src + (TLV_TYPE_SIZE + TLV_LEN_SIZE));
decoded_bytes += (TLV_TYPE_SIZE + TLV_LEN_SIZE);
temp_ei = find_ei(ei_array, tlv_type);
if (!temp_ei && tlv_type < OPTIONAL_TLV_TYPE_START) {
@@ -673,11 +673,11 @@ static int qmi_decode(struct qmi_elem_info *ei_array, void *out_c_struct,
tlv_len = in_buf_len - decoded_bytes;
}
- buf_dst = (uint8_t*)out_c_struct + temp_ei->offset;
+ buf_dst = (void*)((char*)out_c_struct + temp_ei->offset);
if (temp_ei->data_type == QMI_OPT_FLAG) {
memcpy(buf_dst, &opt_flag_value, sizeof(uint8_t));
temp_ei = temp_ei + 1;
- buf_dst = (uint8_t*)out_c_struct + temp_ei->offset;
+ buf_dst = (void*)((char*)out_c_struct + temp_ei->offset);
}
if (temp_ei->data_type == QMI_DATA_LEN) {
@@ -687,7 +687,7 @@ static int qmi_decode(struct qmi_elem_info *ei_array, void *out_c_struct,
1, data_len_sz);
memcpy(buf_dst, &data_len_value, sizeof(uint32_t));
temp_ei = temp_ei + 1;
- buf_dst = (uint8_t*)out_c_struct + temp_ei->offset;
+ buf_dst = (void*)((char*)out_c_struct + temp_ei->offset);
tlv_len -= data_len_sz;
UPDATE_DECODE_VARIABLES(buf_src, decoded_bytes, rc);
}
@@ -777,7 +777,7 @@ ssize_t qmi_encode_message(struct qrtr_packet *pkt, int type, int msg_id,
/* Encode message, if we have a message */
if (c_struct) {
- msglen = qmi_encode(ei, (char*)pkt->data + sizeof(*hdr), c_struct,
+ msglen = qmi_encode(ei, (void*)((char*)pkt->data + sizeof(*hdr)), c_struct,
pkt->data_len - sizeof(*hdr), 1);
if (msglen < 0)
return msglen;
@@ -839,7 +839,7 @@ int qmi_decode_message(void *c_struct, unsigned int *txn,
if (txn)
*txn = hdr->txn_id;
- return qmi_decode(ei, c_struct, (char*)pkt->data + sizeof(*hdr), pkt->data_len - sizeof(*hdr), 1);
+ return qmi_decode(ei, c_struct, (void*)((char*)pkt->data + sizeof(*hdr)), pkt->data_len - sizeof(*hdr), 1);
}
/* Common header in all QMI responses */
diff --git a/qcom/qrtr/lib/qrtr.c b/qcom/qrtr/lib/qrtr.c
index 7c1c389..96756ba 100644
--- a/qcom/qrtr/lib/qrtr.c
+++ b/qcom/qrtr/lib/qrtr.c
@@ -52,7 +52,7 @@ int qrtr_open(int rport)
}
if (rport != 0) {
- struct sockaddr_qrtr sq;
+ struct sockaddr_qrtr sq = {};
sq.sq_family = AF_QIPCRTR;
sq.sq_node = 1;
@@ -78,7 +78,7 @@ void qrtr_close(int sock)
int qrtr_sendto(int sock, uint32_t node, uint32_t port, const void *data, unsigned int sz)
{
- struct sockaddr_qrtr sq;
+ struct sockaddr_qrtr sq = {};
int rc;
sq.sq_family = AF_QIPCRTR;
diff --git a/qcom/qrtr/src/list.h b/qcom/qrtr/src/list.h
index d740743..1d1c8e6 100644
--- a/qcom/qrtr/src/list.h
+++ b/qcom/qrtr/src/list.h
@@ -1,8 +1,10 @@
#ifndef _LIST_H_
#define _LIST_H_
+#include <stddef.h>
+
#ifndef offsetof
-#define offsetof(type, md) ((unsigned long)&((type *)0)->md)
+#define offsetof(type, md) ((size_t)&((type *)0)->md)
#endif
#ifndef container_of
diff --git a/qcom/qrtr/src/lookup.c b/qcom/qrtr/src/lookup.c
index 3312e40..80cf984 100644
--- a/qcom/qrtr/src/lookup.c
+++ b/qcom/qrtr/src/lookup.c
@@ -64,6 +64,7 @@ static const struct {
{ 41, 0, "RF radiated performance enhancement service" },
{ 42, 0, "Data system determination service" },
{ 43, 0, "Subsystem control service" },
+ { 47, 0, "Data Port Mapper service" },
{ 49, 0, "IPA control service" },
{ 51, 0, "CoreSight remote tracing service" },
{ 52, 0, "Dynamic Heap Memory Sharing" },
@@ -76,6 +77,7 @@ static const struct {
{ 312, 0, "QBT1000 Ultrasonic Fingerprint Sensor service" },
{ 769, 0, "SLIMbus control service" },
{ 771, 0, "Peripheral Access Control Manager service" },
+ { 4096, 0, "TFTP" },
{ DIAG_SERVICE, 0, "DIAG service" },
};
diff --git a/qcom/rmtfs/rmtfs.c b/qcom/rmtfs/rmtfs.c
index 93965f1..b3ed289 100644
--- a/qcom/rmtfs/rmtfs.c
+++ b/qcom/rmtfs/rmtfs.c
@@ -220,6 +220,10 @@ static void rmtfs_iovec(int sock, struct qrtr_packet *pkt)
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 @@ static int run_rmtfs(int rprocfd)
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) {
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 @@ int storage_get_error(const struct rmtfd *rmtfd);
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..68dc3c9 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 @@ int rproc_init(void)
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 @@ int rproc_init(void)
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 @@ int rproc_init(void)
}
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 @@ int rproc_init(void)
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,15 +146,29 @@ int rproc_init(void)
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];
}
@@ -103,15 +177,22 @@ static void *do_rproc_start(void *unused __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)
@@ -119,8 +200,10 @@ static void *do_rproc_stop(void *unused __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 @@ static void *do_rproc_stop(void *unused __unused)
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/storage.c b/qcom/rmtfs/storage.c
index c8e69ed..107b296 100644
--- a/qcom/rmtfs/storage.c
+++ b/qcom/rmtfs/storage.c
@@ -41,6 +41,7 @@ static const struct partition partition_table[] = {
{ "/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 @@ found:
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 @@ void storage_exit(void)
{
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)
@@ -201,7 +202,7 @@ ssize_t storage_pread(const struct rmtfd *rmtfd, void *buf, size_t nbyte, off_t
if (!storage_read_only) {
n = pread(rmtfd->fd, buf, nbyte, offset);
} else {
- n = MIN(nbyte, rmtfd->shadow_len - offset);
+ n = MIN((ssize_t)nbyte, (ssize_t)rmtfd->shadow_len - offset);
if (n > 0)
memcpy(buf, (char*)rmtfd->shadow_buf + offset, n);
else
@@ -244,6 +245,14 @@ ssize_t storage_pwrite(struct rmtfd *rmtfd, const void *buf, size_t nbyte, off_t
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;