Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 00747b1e authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "uio: msm_sharedmem: add guard page around shared memory"

parents a5522b1b 59e88273
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -9,10 +9,18 @@ Required properties:
- reg-names : Indicates various client-names.
- qcom,client-id : The client id for the QMI clients.

Optional properties:
- qcom,guard-memory:	If this dtsi property is set, then the shared memory
			region will be guarded by SZ_4K at the start and at the end.
			This is needed to overcome the XPU limitation on few MSM HW,
			so as to make this memory not contiguous with other allocations
			that may possibly happen from other clients.

Example:
	qcom,msm_sharedmem@0dc80000 {
		compatible = "qcom,sharedmem-uio";
		reg = <0x0dc80000 0x00180000>,
		reg-names = "rmtfs";
		qcom,client-id = <0x00000001>;
		qcom,guard-memory;
	};
+21 −2
Original line number Diff line number Diff line
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2017, 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
@@ -107,10 +107,12 @@ static int msm_sharedmem_probe(struct platform_device *pdev)
	struct resource *clnt_res = NULL;
	u32 client_id = ((u32)~0U);
	u32 shared_mem_size = 0;
	u32 shared_mem_tot_sz = 0;
	void *shared_mem = NULL;
	phys_addr_t shared_mem_pyhsical = 0;
	bool is_addr_dynamic = false;
	struct sharemem_qmi_entry qmi_entry;
	bool guard_memory = false;

	/* Get the addresses from platform-data */
	if (!pdev->dev.of_node) {
@@ -145,13 +147,30 @@ static int msm_sharedmem_probe(struct platform_device *pdev)

	if (shared_mem_pyhsical == 0) {
		is_addr_dynamic = true;
		shared_mem = dma_alloc_coherent(&pdev->dev, shared_mem_size,

		/*
		 * If guard_memory is set, then the shared memory region
		 * will be guarded by SZ_4K at the start and at the end.
		 * This is needed to overcome the XPU limitation on few
		 * MSM HW, so as to make this memory not contiguous with
		 * other allocations that may possibly happen from other
		 * clients in the system.
		 */
		guard_memory = of_property_read_bool(pdev->dev.of_node,
				"qcom,guard-memory");

		shared_mem_tot_sz = guard_memory ? shared_mem_size + SZ_8K :
					shared_mem_size;

		shared_mem = dma_alloc_coherent(&pdev->dev, shared_mem_tot_sz,
					&shared_mem_pyhsical, GFP_KERNEL);
		if (shared_mem == NULL) {
			pr_err("Shared mem alloc client=%s, size=%u\n",
				clnt_res->name, shared_mem_size);
			return -ENOMEM;
		}
		if (guard_memory)
			shared_mem_pyhsical += SZ_4K;
	}

	/* Set up the permissions for the shared ram that was allocated. */