diff options
author | Amit Pundir <amit.pundir@linaro.org> | 2022-11-14 20:37:42 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-11-14 20:37:42 +0000 |
commit | 240dac4cebcf4ac0f3e543395e3e25157c916e98 (patch) | |
tree | 9d6485f5df6e221d15da360861cbac606bc728a1 | |
parent | 119066d65f758743d8647ffac0fd6e71e68bfc38 (diff) | |
parent | 1fece4fa4404375e3af584fb35107b40b0eda16a (diff) |
dragonboards: sync up vendor userspace daemons to upstream sources am: 53c1287103 am: 1fece4fa44
Original change: https://android-review.googlesource.com/c/device/linaro/dragonboard/+/2300537
Change-Id: I5d149e17dfec5af2466989ec356be8a7d6d215fa
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | qcom/pd-mapper/pd-mapper.c | 1 | ||||
-rw-r--r-- | qcom/qrtr/Makefile | 2 | ||||
-rw-r--r-- | qcom/qrtr/lib/libqrtr.h | 5 | ||||
-rw-r--r-- | qcom/qrtr/lib/qmi.c | 26 | ||||
-rw-r--r-- | qcom/qrtr/lib/qrtr.c | 4 | ||||
-rw-r--r-- | qcom/qrtr/src/list.h | 4 | ||||
-rw-r--r-- | qcom/qrtr/src/lookup.c | 2 | ||||
-rw-r--r-- | qcom/rmtfs/rmtfs.c | 9 | ||||
-rw-r--r-- | qcom/rmtfs/rmtfs.h | 1 | ||||
-rw-r--r-- | qcom/rmtfs/rproc.c | 122 | ||||
-rw-r--r-- | qcom/rmtfs/storage.c | 23 |
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; |