summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/char/adsprpc.c16
-rw-r--r--drivers/gpu/msm/kgsl_drawobj.c35
-rw-r--r--drivers/soc/qcom/msm_minidump.c15
-rw-r--r--gen_headers_arm.bp1
-rw-r--r--gen_headers_arm64.bp1
-rw-r--r--include/uapi/linux/slatecom_interface.h93
6 files changed, 130 insertions, 31 deletions
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index 86d65c3c6b92..b5b239eb6dc3 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -298,6 +298,7 @@ struct fastrpc_mmap {
int uncached;
int secure;
uintptr_t attr;
+ bool is_filemap; /*flag to indicate map used in process init*/
};
struct fastrpc_perf {
@@ -557,9 +558,10 @@ static int fastrpc_mmap_remove(struct fastrpc_file *fl, uintptr_t va,
spin_lock(&me->hlock);
hlist_for_each_entry_safe(map, n, &me->maps, hn) {
- if (map->raddr == va &&
+ if (map->refs == 1 && map->raddr == va &&
map->raddr + map->len == va + len &&
- map->refs == 1) {
+ /*Remove map if not used in process initialization*/
+ !map->is_filemap) {
match = map;
hlist_del_init(&map->hn);
break;
@@ -572,9 +574,10 @@ static int fastrpc_mmap_remove(struct fastrpc_file *fl, uintptr_t va,
}
spin_lock(&fl->hlock);
hlist_for_each_entry_safe(map, n, &fl->maps, hn) {
- if (map->raddr == va &&
+ if (map->refs == 1 && map->raddr == va &&
map->raddr + map->len == va + len &&
- map->refs == 1) {
+ /*Remove map if not used in process initialization*/
+ !map->is_filemap) {
match = map;
hlist_del_init(&map->hn);
break;
@@ -712,6 +715,7 @@ static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd, unsigned attr,
map->fl = fl;
map->fd = fd;
map->attr = attr;
+ map->is_filemap = false;
if (mflags == ADSP_MMAP_HEAP_ADDR ||
mflags == ADSP_MMAP_REMOTE_HEAP_ADDR) {
DEFINE_DMA_ATTRS(rh_attrs);
@@ -1901,6 +1905,8 @@ static int fastrpc_init_process(struct fastrpc_file *fl,
if (init->filelen) {
VERIFY(err, !fastrpc_mmap_create(fl, init->filefd, 0,
init->file, init->filelen, mflags, &file));
+ if (file)
+ file->is_filemap = true;
if (err)
goto bail;
}
diff --git a/drivers/gpu/msm/kgsl_drawobj.c b/drivers/gpu/msm/kgsl_drawobj.c
index 9ba15b61af00..bc11111bb74f 100644
--- a/drivers/gpu/msm/kgsl_drawobj.c
+++ b/drivers/gpu/msm/kgsl_drawobj.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2016-2017,2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2017,2019,2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -585,6 +585,7 @@ static void add_profiling_buffer(struct kgsl_device *device,
{
struct kgsl_mem_entry *entry;
struct kgsl_drawobj *drawobj = DRAWOBJ(cmdobj);
+ u64 start;
if (!(drawobj->flags & KGSL_DRAWOBJ_PROFILING))
return;
@@ -601,7 +602,14 @@ static void add_profiling_buffer(struct kgsl_device *device,
gpuaddr);
if (entry != NULL) {
- if (!kgsl_gpuaddr_in_memdesc(&entry->memdesc, gpuaddr, size)) {
+ start = id ? (entry->memdesc.gpuaddr + offset) : gpuaddr;
+ /*
+ * Make sure there is enough room in the object to store the
+ * entire profiling buffer object
+ */
+ if (!kgsl_gpuaddr_in_memdesc(&entry->memdesc, gpuaddr, size) ||
+ !kgsl_gpuaddr_in_memdesc(&entry->memdesc, start,
+ sizeof(struct kgsl_drawobj_profiling_buffer))) {
kgsl_mem_entry_put(entry);
entry = NULL;
}
@@ -614,28 +622,7 @@ static void add_profiling_buffer(struct kgsl_device *device,
return;
}
-
- if (!id) {
- cmdobj->profiling_buffer_gpuaddr = gpuaddr;
- } else {
- u64 off = offset + sizeof(struct kgsl_drawobj_profiling_buffer);
-
- /*
- * Make sure there is enough room in the object to store the
- * entire profiling buffer object
- */
- if (off < offset || off >= entry->memdesc.size) {
- dev_err(device->dev,
- "ignore invalid profile offset ctxt %d id %d offset %lld gpuaddr %llx size %lld\n",
- drawobj->context->id, id, offset, gpuaddr, size);
- kgsl_mem_entry_put(entry);
- return;
- }
-
- cmdobj->profiling_buffer_gpuaddr =
- entry->memdesc.gpuaddr + offset;
- }
-
+ cmdobj->profiling_buffer_gpuaddr = start;
cmdobj->profiling_buf_entry = entry;
}
diff --git a/drivers/soc/qcom/msm_minidump.c b/drivers/soc/qcom/msm_minidump.c
index 300233085161..4d06d6cf9a94 100644
--- a/drivers/soc/qcom/msm_minidump.c
+++ b/drivers/soc/qcom/msm_minidump.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2017,2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -189,6 +189,7 @@ static int md_update_smem_table(const struct md_region *entry)
int msm_minidump_add_region(const struct md_region *entry)
{
u32 entries;
+ u32 toc_init;
struct md_region *mdr;
int ret = 0;
@@ -214,6 +215,16 @@ int msm_minidump_add_region(const struct md_region *entry)
return -ENOMEM;
}
+ toc_init = 0;
+ if (minidump_enabled) {
+ toc_init = 1;
+ if (region_idx >= MAX_NUM_ENTRIES) {
+ spin_unlock(&mdt_lock);
+ pr_err("Maximum regions in minidump table reached.\n");
+ return -ENOMEM;
+ }
+ }
+
mdr = &minidump_table.entry[entries];
strlcpy(mdr->name, entry->name, sizeof(mdr->name));
mdr->virt_addr = entry->virt_addr;
@@ -223,7 +234,7 @@ int msm_minidump_add_region(const struct md_region *entry)
minidump_table.num_regions = entries + 1;
- if (minidump_enabled)
+ if (toc_init)
ret = md_update_smem_table(entry);
else
pendings++;
diff --git a/gen_headers_arm.bp b/gen_headers_arm.bp
index 86419e560f20..9cded5bbba09 100644
--- a/gen_headers_arm.bp
+++ b/gen_headers_arm.bp
@@ -533,6 +533,7 @@ gen_headers_out_arm = [
"linux/shm.h",
"linux/signal.h",
"linux/signalfd.h",
+ "linux/slatecom_interface.h",
"linux/smcinvoke.h",
"linux/smiapp.h",
"linux/snmp.h",
diff --git a/gen_headers_arm64.bp b/gen_headers_arm64.bp
index 05d8ffa9bf59..655b8336c720 100644
--- a/gen_headers_arm64.bp
+++ b/gen_headers_arm64.bp
@@ -531,6 +531,7 @@ gen_headers_out_arm64 = [
"linux/shm.h",
"linux/signal.h",
"linux/signalfd.h",
+ "linux/slatecom_interface.h",
"linux/smcinvoke.h",
"linux/smiapp.h",
"linux/snmp.h",
diff --git a/include/uapi/linux/slatecom_interface.h b/include/uapi/linux/slatecom_interface.h
new file mode 100644
index 000000000000..1caed8c42bf6
--- /dev/null
+++ b/include/uapi/linux/slatecom_interface.h
@@ -0,0 +1,93 @@
+/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
+/*
+ * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
+ */
+#ifndef LINUX_SLATECOM_INTERFACE_H
+#define LINUX_SLATECOM_INTERFACE_H
+
+#include <linux/types.h>
+
+#define SLATECOM_REG_READ 0
+#define SLATECOM_AHB_READ 1
+#define SLATECOM_AHB_WRITE 2
+#define SLATECOM_SET_SPI_FREE 3
+#define SLATECOM_SET_SPI_BUSY 4
+#define SLATECOM_REG_WRITE 5
+#define SLATECOM_SOFT_RESET 6
+#define SLATECOM_MODEM_DOWN2_SLATE 7
+#define SLATECOM_TWM_EXIT 8
+#define SLATECOM_SLATE_APP_RUNNING 9
+#define SLATECOM_ADSP_DOWN2_SLATE 10
+#define SLATECOM_SLATE_WEAR_LOAD 11
+#define SLATECOM_SLATE_WEAR_UNLOAD 12
+#define EXCHANGE_CODE 'V'
+
+struct slate_ui_data {
+ __u64 __user write;
+ __u64 __user result;
+ __u32 slate_address;
+ __u32 cmd;
+ __u32 num_of_words;
+ __u8 __user *buffer;
+};
+
+enum slate_event_type {
+ SLATE_BEFORE_POWER_DOWN = 1,
+ SLATE_AFTER_POWER_DOWN,
+ SLATE_BEFORE_POWER_UP,
+ SLATE_AFTER_POWER_UP,
+ MODEM_BEFORE_POWER_DOWN,
+ MODEM_AFTER_POWER_UP,
+ ADSP_BEFORE_POWER_DOWN,
+ ADSP_AFTER_POWER_UP,
+ TWM_SLATE_AFTER_POWER_UP,
+ SLATE_DSP_ERROR,
+ SLATE_DSP_READY,
+ SLATE_BT_ERROR,
+ SLATE_BT_READY,
+};
+
+#define SLATE_AFTER_POWER_UP SLATE_AFTER_POWER_UP
+
+#define REG_READ \
+ _IOWR(EXCHANGE_CODE, SLATECOM_REG_READ, \
+ struct slate_ui_data)
+#define AHB_READ \
+ _IOWR(EXCHANGE_CODE, SLATECOM_AHB_READ, \
+ struct slate_ui_data)
+#define AHB_WRITE \
+ _IOW(EXCHANGE_CODE, SLATECOM_AHB_WRITE, \
+ struct slate_ui_data)
+#define SET_SPI_FREE \
+ _IOR(EXCHANGE_CODE, SLATECOM_SET_SPI_FREE, \
+ struct slate_ui_data)
+#define SET_SPI_BUSY \
+ _IOR(EXCHANGE_CODE, SLATECOM_SET_SPI_BUSY, \
+ struct slate_ui_data)
+#define REG_WRITE \
+ _IOWR(EXCHANGE_CODE, SLATECOM_REG_WRITE, \
+ struct slate_ui_data)
+#define SLATE_SOFT_RESET \
+ _IOWR(EXCHANGE_CODE, SLATECOM_SOFT_RESET, \
+ struct slate_ui_data)
+#define SLATE_TWM_EXIT \
+ _IOWR(EXCHANGE_CODE, SLATECOM_TWM_EXIT, \
+ struct slate_ui_data)
+#define SLATE_APP_RUNNING \
+ _IOWR(EXCHANGE_CODE, SLATECOM_SLATE_APP_RUNNING, \
+ struct slate_ui_data)
+#define SLATE_MODEM_DOWN2_SLATE_DONE \
+ _IOWR(EXCHANGE_CODE, SLATECOM_MODEM_DOWN2_SLATE, \
+ struct slate_ui_data)
+#define SLATE_WEAR_LOAD \
+ _IOWR(EXCHANGE_CODE, SLATECOM_SLATE_WEAR_LOAD, \
+ struct slate_ui_data)
+#define SLATE_WEAR_UNLOAD \
+ _IOWR(EXCHANGE_CODE, SLATECOM_SLATE_WEAR_UNLOAD, \
+ struct slate_ui_data)
+#define SLATE_ADSP_DOWN2_SLATE_DONE \
+ _IOWR(EXCHANGE_CODE, SLATECOM_ADSP_DOWN2_SLATE, \
+ struct slate_ui_data)
+
+#endif /* LINUX_SLATECOM_INTERFACE_H */
+