To support FastRPC Context Banks which aren't mapped via the SMMU,
make the whole reserved memory region available to the DSP to allow
access to coherent buffers.
This is performed by assigning the memory to the DSP via a hypervisor
call to set the correct permissions for the Virtual Machines on the DSP.
Only perform this operation when at least one VM is enabled
and 'qcom,assign-all-mem' property is present in DTS.
Signed-off-by: Dylan Van Assche <[email protected]>
---
drivers/misc/fastrpc.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index f48466960f1b..ecfd0a91113c 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -2230,7 +2230,9 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
struct fastrpc_channel_ctx *data;
int i, err, domain_id = -1, vmcount;
const char *domain;
- bool secure_dsp;
+ bool secure_dsp, assign_all_mem;
+ struct device_node *rmem_node;
+ struct reserved_mem *rmem;
unsigned int vmids[FASTRPC_MAX_VMIDS];
err = of_property_read_string(rdev->of_node, "label", &domain);
@@ -2265,6 +2267,11 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
if (!data)
return -ENOMEM;
+ assign_all_mem = of_property_read_bool(rdev->of_node, "qcom,assign-all-mem");
+
+ if (assign_all_mem && !vmcount)
+ return -EINVAL;
+
if (vmcount) {
data->vmcount = vmcount;
data->perms = BIT(QCOM_SCM_VMID_HLOS);
@@ -2274,6 +2281,16 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
}
}
+ if (assign_all_mem) {
+ rmem_node = of_parse_phandle(rdev->of_node, "memory-region", 0);
+ if (rmem_node) {
+ rmem = of_reserved_mem_lookup(rmem_node);
+ if (rmem)
+ qcom_scm_assign_mem(rmem->base, rmem->size, &data->perms,
+ data->vmperms, data->vmcount);
+ }
+ }
+
secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
data->secure = secure_dsp;
--
2.39.2
Hi Dylan,
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Dylan-Van-Assche/dt-bindings-misc-qcom-fastrpc-add-qcom-assign-all-memory-property/20230325-214518
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link: https://lore.kernel.org/r/20230325134410.21092-3-me%40dylanvanassche.be
patch subject: [PATCH 2/2] misc: fastrpc: support complete DMA pool access to the DSP
config: microblaze-randconfig-m041-20230326 (https://download.01.org/0day-ci/archive/20230327/[email protected]/config)
compiler: microblaze-linux-gcc (GCC) 12.1.0
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Reported-by: Dan Carpenter <[email protected]>
| Link: https://lore.kernel.org/r/[email protected]/
New smatch warnings:
drivers/misc/fastrpc.c:2273 fastrpc_rpmsg_probe() warn: possible memory leak of 'data'
vim +/data +2273 drivers/misc/fastrpc.c
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2227 static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2228 {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2229 struct device *rdev = &rpdev->dev;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2230 struct fastrpc_channel_ctx *data;
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2231 int i, err, domain_id = -1, vmcount;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2232 const char *domain;
99edd50174e519 Dylan Van Assche 2023-03-25 2233 bool secure_dsp, assign_all_mem;
99edd50174e519 Dylan Van Assche 2023-03-25 2234 struct device_node *rmem_node;
99edd50174e519 Dylan Van Assche 2023-03-25 2235 struct reserved_mem *rmem;
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2236 unsigned int vmids[FASTRPC_MAX_VMIDS];
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2237
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2238 err = of_property_read_string(rdev->of_node, "label", &domain);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2239 if (err) {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2240 dev_info(rdev, "FastRPC Domain not specified in DT\n");
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2241 return err;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2242 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2243
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2244 for (i = 0; i <= CDSP_DOMAIN_ID; i++) {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2245 if (!strcmp(domains[i], domain)) {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2246 domain_id = i;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2247 break;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2248 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2249 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2250
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2251 if (domain_id < 0) {
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2252 dev_info(rdev, "FastRPC Invalid Domain ID %d\n", domain_id);
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2253 return -EINVAL;
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2254 }
f6f9279f2bf0e3 Srinivas Kandagatla 2019-02-08 2255
1ce91d45ba77a4 Abel Vesa 2022-11-25 2256 if (of_reserved_mem_device_init_by_idx(rdev, rdev->of_node, 0))
1ce91d45ba77a4 Abel Vesa 2022-11-25 2257 dev_info(rdev, "no reserved DMA memory for FASTRPC\n");
1ce91d45ba77a4 Abel Vesa 2022-11-25 2258
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2259 vmcount = of_property_read_variable_u32_array(rdev->of_node,
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2260 "qcom,vmids", &vmids[0], 0, FASTRPC_MAX_VMIDS);
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2261 if (vmcount < 0)
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2262 vmcount = 0;
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2263 else if (!qcom_scm_is_available())
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2264 return -EPROBE_DEFER;
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2265
278d56f970ae6e Bjorn Andersson 2019-08-29 2266 data = kzalloc(sizeof(*data), GFP_KERNEL);
278d56f970ae6e Bjorn Andersson 2019-08-29 2267 if (!data)
278d56f970ae6e Bjorn Andersson 2019-08-29 2268 return -ENOMEM;
278d56f970ae6e Bjorn Andersson 2019-08-29 2269
99edd50174e519 Dylan Van Assche 2023-03-25 2270 assign_all_mem = of_property_read_bool(rdev->of_node, "qcom,assign-all-mem");
99edd50174e519 Dylan Van Assche 2023-03-25 2271
99edd50174e519 Dylan Van Assche 2023-03-25 2272 if (assign_all_mem && !vmcount)
99edd50174e519 Dylan Van Assche 2023-03-25 @2273 return -EINVAL;
Move this code before the data = kzalloc() allocation to avoid a memory
leak.
99edd50174e519 Dylan Van Assche 2023-03-25 2274
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2275 if (vmcount) {
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2276 data->vmcount = vmcount;
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2277 data->perms = BIT(QCOM_SCM_VMID_HLOS);
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2278 for (i = 0; i < data->vmcount; i++) {
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2279 data->vmperms[i].vmid = vmids[i];
e90d911906196b Vamsi Krishna Gattupalli 2022-02-14 2280 data->vmperms[i].perm = QCOM_SCM_PERM_RWX;
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests