-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'qcom-drivers-for-6.7' of https://git.kernel.org/pub/scm/li…
…nux/kernel/git/qcom/linux into soc/drivers Qualcomm driver updates for v6.7 This introduces partial support for the Qualcomm Secure Execution Environment SCM interface, and uses this to implement EFI variable access on the Windows On Snapdragon devices (for now). The 32/64-bit calling convention detector of the SCM interface is updated to not choose 64-bit convention when Linux is 32-bit. The "extern" specifier is dropped from the interface include file. The LLCC driver gains support for carrying configuration for multiple different system/DDR configurations for a given platform, and selecting between them. Support for Q[DR]U1000 is added to the driver. All exported symbols are transitioned to EXPORT_SYMBOL_GPL(). The platform_drivers in the Qualcomm SoC are transitioned to the void-returning remove_new implementation. The rmtfs memory driver gains support for leaving guard pages around the used area, to avoid issues if the allocation happens to be placed adjacent to another protected memory region. The socinfo driver gains knowledge about IPQ8174, QCM6490, SM7150P and various PMICs used together with SM8550. * tag 'qcom-drivers-for-6.7' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (44 commits) soc: qcom: socinfo: Convert to platform remove callback returning void soc: qcom: smsm: Convert to platform remove callback returning void soc: qcom: smp2p: Convert to platform remove callback returning void soc: qcom: smem: Convert to platform remove callback returning void soc: qcom: rmtfs_mem: Convert to platform remove callback returning void soc: qcom: qcom_stats: Convert to platform remove callback returning void soc: qcom: qcom_gsbi: Convert to platform remove callback returning void soc: qcom: qcom_aoss: Convert to platform remove callback returning void soc: qcom: pmic_glink: Convert to platform remove callback returning void soc: qcom: ocmem: Convert to platform remove callback returning void soc: qcom: llcc-qcom: Convert to platform remove callback returning void soc: qcom: icc-bwmon: Convert to platform remove callback returning void firmware: qcom_scm: use 64-bit calling convention only when client is 64-bit soc: qcom: llcc: Handle a second device without data corruption soc: qcom: Switch to EXPORT_SYMBOL_GPL() soc: qcom: smem: Annotate struct qcom_smem with __counted_by soc: qcom: rmtfs: Support discarding guard pages dt-bindings: reserved-memory: rmtfs: Allow guard pages dt-bindings: firmware: qcom,scm: document IPQ5018 compatible firmware: qcom_scm: disable SDI if required ... Link: https://lore.kernel.org/r/20231015204014.855672-1-andersson@kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de>
- Loading branch information
Showing
40 changed files
with
2,090 additions
and
261 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -52,6 +52,8 @@ properties: | |
iommus: | ||
maxItems: 1 | ||
|
||
dma-coherent: true | ||
|
||
required: | ||
- compatible | ||
- reg | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
// 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"); |
Oops, something went wrong.