Commit 538b0ba2 authored by Bjorn Andersson's avatar Bjorn Andersson
Browse files

Merge branch '20230109130523.298971-3-konrad.dybcio@linaro.org' into drivers-for-6.3

parents 5b8db5b4 45ca30eb
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -27,9 +27,11 @@ properties:
      identifier of the client to use this region for buffers

  qcom,vmid:
    $ref: /schemas/types.yaml#/definitions/uint32
    $ref: /schemas/types.yaml#/definitions/uint32-array
    description: >
      vmid of the remote processor, to set up memory protection
      Array of vmids of the remote processors, to set up memory protection
    minItems: 1
    maxItems: 2

required:
  - qcom,client-id
+22 −7
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/qcom_scm.h>

#define QCOM_RMTFS_MEM_DEV_MAX	(MINORMASK + 1)
#define NUM_MAX_VMIDS		2

static dev_t qcom_rmtfs_mem_major;

@@ -171,12 +172,12 @@ static void qcom_rmtfs_mem_release_device(struct device *dev)
static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
{
	struct device_node *node = pdev->dev.of_node;
	struct qcom_scm_vmperm perms[2];
	struct qcom_scm_vmperm perms[NUM_MAX_VMIDS + 1];
	struct reserved_mem *rmem;
	struct qcom_rmtfs_mem *rmtfs_mem;
	u32 client_id;
	u32 vmid;
	int ret;
	u32 num_vmids, vmid[NUM_MAX_VMIDS];
	int ret, i;

	rmem = of_reserved_mem_lookup(node);
	if (!rmem) {
@@ -226,7 +227,18 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
		goto put_device;
	}

	ret = of_property_read_u32(node, "qcom,vmid", &vmid);
	num_vmids = of_property_count_u32_elems(node, "qcom,vmid");
	if (num_vmids < 0) {
		dev_err(&pdev->dev, "failed to count qcom,vmid elements: %d\n", ret);
		goto remove_cdev;
	} else if (num_vmids > NUM_MAX_VMIDS) {
		dev_warn(&pdev->dev,
			 "too many VMIDs (%d) specified! Only mapping first %d entries\n",
			 num_vmids, NUM_MAX_VMIDS);
		num_vmids = NUM_MAX_VMIDS;
	}

	ret = of_property_read_u32_array(node, "qcom,vmid", vmid, num_vmids);
	if (ret < 0 && ret != -EINVAL) {
		dev_err(&pdev->dev, "failed to parse qcom,vmid\n");
		goto remove_cdev;
@@ -238,12 +250,15 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)

		perms[0].vmid = QCOM_SCM_VMID_HLOS;
		perms[0].perm = QCOM_SCM_PERM_RW;
		perms[1].vmid = vmid;
		perms[1].perm = QCOM_SCM_PERM_RW;

		for (i = 0; i < num_vmids; i++) {
			perms[i + 1].vmid = vmid[i];
			perms[i + 1].perm = QCOM_SCM_PERM_RW;
		}

		rmtfs_mem->perms = BIT(QCOM_SCM_VMID_HLOS);
		ret = qcom_scm_assign_mem(rmtfs_mem->addr, rmtfs_mem->size,
					  &rmtfs_mem->perms, perms, 2);
					  &rmtfs_mem->perms, perms, num_vmids + 1);
		if (ret < 0) {
			dev_err(&pdev->dev, "assign memory failed\n");
			goto remove_cdev;
+16 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */
/*
 * Copyright (c) 2010-2015, 2018-2019 The Linux Foundation. All rights reserved.
 * Copyright (C) 2015 Linaro Ltd.
 */

#ifndef _DT_BINDINGS_FIRMWARE_QCOM_SCM_H
#define _DT_BINDINGS_FIRMWARE_QCOM_SCM_H

#define QCOM_SCM_VMID_HLOS		0x3
#define QCOM_SCM_VMID_MSS_MSA		0xF
#define QCOM_SCM_VMID_WLAN		0x18
#define QCOM_SCM_VMID_WLAN_CE		0x19
#define QCOM_SCM_VMID_NAV		0x2B

#endif
+2 −4
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@
#include <linux/types.h>
#include <linux/cpumask.h>

#include <dt-bindings/firmware/qcom,scm.h>

#define QCOM_SCM_VERSION(major, minor)	(((major) << 16) | ((minor) & 0xFF))
#define QCOM_SCM_CPU_PWR_DOWN_L2_ON	0x0
#define QCOM_SCM_CPU_PWR_DOWN_L2_OFF	0x1
@@ -51,10 +53,6 @@ enum qcom_scm_ice_cipher {
	QCOM_SCM_ICE_CIPHER_AES_256_CBC = 4,
};

#define QCOM_SCM_VMID_HLOS       0x3
#define QCOM_SCM_VMID_MSS_MSA    0xF
#define QCOM_SCM_VMID_WLAN       0x18
#define QCOM_SCM_VMID_WLAN_CE    0x19
#define QCOM_SCM_PERM_READ       0x4
#define QCOM_SCM_PERM_WRITE      0x2
#define QCOM_SCM_PERM_EXEC       0x1