Commit 477348db authored by Viresh Kumar's avatar Viresh Kumar
Browse files

Merge branch 'cpufreq/arm/qcom-nvmem' into HEAD

Merge base changes for cpufreq support for IPQ8074.
parents 038ef0d9 e9104e73
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ properties:
  iommus:
    maxItems: 1

  dma-coherent: true

required:
  - compatible
  - reg
+12 −0
Original line number Diff line number Diff line
@@ -17800,6 +17800,18 @@ S: Maintained
F:	Documentation/devicetree/bindings/mtd/qcom,nandc.yaml
F:	drivers/mtd/nand/raw/qcom_nandc.c
QUALCOMM QSEECOM DRIVER
M:	Maximilian Luz <luzmaximilian@gmail.com>
L:	linux-arm-msm@vger.kernel.org
S:	Maintained
F:	drivers/firmware/qcom_qseecom.c
QUALCOMM QSEECOM UEFISECAPP DRIVER
M:	Maximilian Luz <luzmaximilian@gmail.com>
L:	linux-arm-msm@vger.kernel.org
S:	Maintained
F:	drivers/firmware/qcom_qseecom_uefisecapp.c
QUALCOMM RMNET DRIVER
M:	Subash Abhinov Kasiviswanathan <quic_subashab@quicinc.com>
M:	Sean Tranchetti <quic_stranche@quicinc.com>
+32 −0
Original line number Diff line number Diff line
@@ -226,6 +226,38 @@ config QCOM_SCM_DOWNLOAD_MODE_DEFAULT

	  Say Y here to enable "download mode" by default.

config QCOM_QSEECOM
	bool "Qualcomm QSEECOM interface driver"
	depends on QCOM_SCM=y
	help
	  Various Qualcomm SoCs have a Secure Execution Environment (SEE) running
	  in the Trust Zone. This module provides an interface to that via the
	  QSEECOM mechanism, using SCM calls.

	  The QSEECOM interface allows, among other things, access to applications
	  running in the SEE. An example of such an application is 'uefisecapp',
	  which is required to access UEFI variables on certain systems. If
	  selected, the interface will also attempt to detect and register client
	  devices for supported applications.

	  Select Y here to enable the QSEECOM interface driver.

config QCOM_QSEECOM_UEFISECAPP
	bool "Qualcomm SEE UEFI Secure App client driver"
	depends on QCOM_QSEECOM
	depends on EFI
	help
	  Various Qualcomm SoCs do not allow direct access to EFI variables.
	  Instead, these need to be accessed via the UEFI Secure Application
	  (uefisecapp), residing in the Secure Execution Environment (SEE).

	  This module provides a client driver for uefisecapp, installing efivar
	  operations to allow the kernel accessing EFI variables, and via that also
	  provide user-space with access to EFI variables via efivarfs.

	  Select Y here to provide access to EFI variables on the aforementioned
	  platforms.

config SYSFB
	bool
	select BOOT_VESA_SUPPORT
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ obj-$(CONFIG_RASPBERRYPI_FIRMWARE) += raspberrypi.o
obj-$(CONFIG_FW_CFG_SYSFS)	+= qemu_fw_cfg.o
obj-$(CONFIG_QCOM_SCM)		+= qcom-scm.o
qcom-scm-objs += qcom_scm.o qcom_scm-smc.o qcom_scm-legacy.o
obj-$(CONFIG_QCOM_QSEECOM)	+= qcom_qseecom.o
obj-$(CONFIG_QCOM_QSEECOM_UEFISECAPP) += qcom_qseecom_uefisecapp.o
obj-$(CONFIG_SYSFB)		+= sysfb.o
obj-$(CONFIG_SYSFB_SIMPLEFB)	+= sysfb_simplefb.o
obj-$(CONFIG_TI_SCI_PROTOCOL)	+= ti_sci.o
+120 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Driver for Qualcomm Secure Execution Environment (SEE) interface (QSEECOM).
 * Responsible for setting up and managing QSEECOM client devices.
 *
 * Copyright (C) 2023 Maximilian Luz <luzmaximilian@gmail.com>
 */
#include <linux/auxiliary_bus.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/types.h>

#include <linux/firmware/qcom/qcom_qseecom.h>
#include <linux/firmware/qcom/qcom_scm.h>

struct qseecom_app_desc {
	const char *app_name;
	const char *dev_name;
};

static void qseecom_client_release(struct device *dev)
{
	struct qseecom_client *client;

	client = container_of(dev, struct qseecom_client, aux_dev.dev);
	kfree(client);
}

static void qseecom_client_remove(void *data)
{
	struct qseecom_client *client = data;

	auxiliary_device_delete(&client->aux_dev);
	auxiliary_device_uninit(&client->aux_dev);
}

static int qseecom_client_register(struct platform_device *qseecom_dev,
				   const struct qseecom_app_desc *desc)
{
	struct qseecom_client *client;
	u32 app_id;
	int ret;

	/* Try to find the app ID, skip device if not found */
	ret = qcom_scm_qseecom_app_get_id(desc->app_name, &app_id);
	if (ret)
		return ret == -ENOENT ? 0 : ret;

	dev_info(&qseecom_dev->dev, "setting up client for %s\n", desc->app_name);

	/* Allocate and set-up the client device */
	client = kzalloc(sizeof(*client), GFP_KERNEL);
	if (!client)
		return -ENOMEM;

	client->aux_dev.name = desc->dev_name;
	client->aux_dev.dev.parent = &qseecom_dev->dev;
	client->aux_dev.dev.release = qseecom_client_release;
	client->app_id = app_id;

	ret = auxiliary_device_init(&client->aux_dev);
	if (ret) {
		kfree(client);
		return ret;
	}

	ret = auxiliary_device_add(&client->aux_dev);
	if (ret) {
		auxiliary_device_uninit(&client->aux_dev);
		return ret;
	}

	ret = devm_add_action_or_reset(&qseecom_dev->dev, qseecom_client_remove, client);
	if (ret)
		return ret;

	return 0;
}

/*
 * List of supported applications. One client device will be created per entry,
 * assuming the app has already been loaded (usually by firmware bootloaders)
 * and its ID can be queried successfully.
 */
static const struct qseecom_app_desc qcom_qseecom_apps[] = {
	{ "qcom.tz.uefisecapp", "uefisecapp" },
};

static int qcom_qseecom_probe(struct platform_device *qseecom_dev)
{
	int ret;
	int i;

	/* Set up client devices for each base application */
	for (i = 0; i < ARRAY_SIZE(qcom_qseecom_apps); i++) {
		ret = qseecom_client_register(qseecom_dev, &qcom_qseecom_apps[i]);
		if (ret)
			return ret;
	}

	return 0;
}

static struct platform_driver qcom_qseecom_driver = {
	.driver = {
		.name	= "qcom_qseecom",
	},
	.probe = qcom_qseecom_probe,
};

static int __init qcom_qseecom_init(void)
{
	return platform_driver_register(&qcom_qseecom_driver);
}
subsys_initcall(qcom_qseecom_init);

MODULE_AUTHOR("Maximilian Luz <luzmaximilian@gmail.com>");
MODULE_DESCRIPTION("Driver for the Qualcomm SEE (QSEECOM) interface");
MODULE_LICENSE("GPL");
Loading