mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
More Qualcomm driver updates for v6.17
Fix race condition during SCM driver initialization, in relation to tzmem and waitqueue irq handling, Make the rpmh RSC driver support version 4 of the IP block. Add SM7635 family and related PMICs to the socinfo driver. Also add support for retrieving the bootloader build details. -----BEGIN PGP SIGNATURE----- iQJJBAABCAAzFiEEBd4DzF816k8JZtUlCx85Pw2ZrcUFAmh8XVIVHGFuZGVyc3Nv bkBrZXJuZWwub3JnAAoJEAsfOT8Nma3FBVoP/2YB9iOewIydLQkUfyGTXPy/T3YY Pa01KMuNFfWyExHG+df05KR5p/1kpQeShnH9xQvwTa8jtxle1Ow+nZIhi+SrTYo2 9qn0maH6BXaZTwVWX/CwFRbu/ei1B+EebFSHcfN9Cz23hSM+Yqsngu4a5heZGQnn VXTa3wMC383MZghZSBFVFMi4owSp/LOp9lyz02+cNJVX5IYM+lx30o1d0I/xEPDx ElU3oIMDqMwPopv6HSUFHVVjJBrx7crSUxaEhsl6N7tyXPBfdZiXTk+4uJKy9y/C pYu8iAQfYX1pNUqTxQxY5w79VNS/kBxE8d7+UPjN2BQfft5KTAywx1r/rxG5YtPJ HBA8XbkmH+IG35saCTvtbjLMSeRwnLyoZ4is9V8vHN4e0hzk9fCKg8qeojrODI5v A9XkkLs3HVUJoHwBH/CAvFyvJfkk4LbStKlTrepPkPMOBzR/0ZXXnCVaJzYhgrfO ZdL8HdDQZVKKd3GkcESwZxI0qxuPohtbAagBDZqanKDPQCwWW+JW270RMi0dNRg0 Chts0cVgNSkWmRH/v5xLc1hjTcN9w4b4g8JVdKwrSeLuAIcrH+2yGvjhsqE4wqCr xyvmKpPO2ngzuoY9L2cCEB842JhmJ2C909BiuhPvwrdC5BTQzpBFiCK1qhwDvOQ8 PweSfQSxAUE9VHJY =tp6K -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmiD/PoACgkQmmx57+YA GNmsIA/+O403SHj1P/nmTAubn18vJ4Y0IJfSBtjvW5icGvE4Ei3PkGS1Fq3JSpLw SicjAUDeiKtoC2d1ZbrfiGIH2ixeBqhT205fOADVJrMFZ+iNffH6fQ80ApxRd4Br i+HkDbn4m8QX3iwLE030YvpsWWSreKZQk8XFQJHLSkjcglL69dxaAWOmb11o2FEd qGhkR6fU+kcZDSLavdSS9EzIseNgUoS4d6JXDi4q5diOk3VdtynwxGsVSzzSC2v3 Ed0GNlmD5M1z6pSdnlRmcay0Vj3iA7OnSn2sZKFBKB9af+zDxoyUk6GFFtWsyntM bZX679BVeW8VpcypF5EIoBNV7tFmi2t3X7bElOlz46ydvcmyh5CEq5+mN8CGSO8V A9cgqrg6FZMvfKjYPIaN6aX//+d7HHyM1xKuAOu7CiFq7yt+bmZBnEfGWOrMWp1R 1vDE7MulhumbWKGbi/ICj1ZNG9P9tOq5If9chXynIxv9hUlPa0a+USTL0AyyOGah bs6eU0tZChsKhiU9sZfvDEgIgo+TVBtQBIFSMxyfdYUz4Aaf4FM8udf9YBXGj5Xx 0vyNAFk+X+MykAL53WJ41JAmRgp5GitiAFwYUEvRF7mI8WB39WUbAE4nMstqpL9B E24hYg4p3vnaP5VoQ7idOZVWEfHIXJLq7qt4Y3D6wLHX66NmZic= =3kNF -----END PGP SIGNATURE----- Merge tag 'qcom-drivers-for-6.17-2' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into soc/drivers More Qualcomm driver updates for v6.17 Fix race condition during SCM driver initialization, in relation to tzmem and waitqueue irq handling, Make the rpmh RSC driver support version 4 of the IP block. Add SM7635 family and related PMICs to the socinfo driver. Also add support for retrieving the bootloader build details. * tag 'qcom-drivers-for-6.17-2' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: dt-bindings: soc: qcom: qcom,pmic-glink: document Milos compatible dt-bindings: soc: qcom,aoss-qmp: document the Milos Always-On Subsystem side channel dt-bindings: firmware: qcom,scm: document Milos SCM Firmware Interface soc: qcom: socinfo: Add support to retrieve APPSBL build details soc: qcom: pmic_glink: fix OF node leak soc: qcom: spmi-pmic: add more PMIC SUBTYPE IDs soc: qcom: socinfo: Add PM7550 & PMIV0108 PMICs soc: qcom: socinfo: Add SoC IDs for SM7635 family dt-bindings: arm: qcom,ids: Add SoC IDs for SM7635 family firmware: qcom: scm: request the waitqueue irq *after* initializing SCM firmware: qcom: scm: initialize tzmem before marking SCM as available firmware: qcom: scm: take struct device as argument in SHM bridge enable firmware: qcom: scm: remove unused arguments from SHM bridge routines soc: qcom: rpmh-rsc: Add RSC version 4 support Link: https://lore.kernel.org/r/20250720030743.285440-1-andersson@kernel.org Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
edf0a4053a
|
|
@ -32,6 +32,7 @@ properties:
|
|||
- qcom,scm-ipq8074
|
||||
- qcom,scm-ipq9574
|
||||
- qcom,scm-mdm9607
|
||||
- qcom,scm-milos
|
||||
- qcom,scm-msm8226
|
||||
- qcom,scm-msm8660
|
||||
- qcom,scm-msm8916
|
||||
|
|
@ -198,6 +199,7 @@ allOf:
|
|||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,scm-milos
|
||||
- qcom,scm-sm8450
|
||||
- qcom,scm-sm8550
|
||||
- qcom,scm-sm8650
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ properties:
|
|||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,milos-aoss-qmp
|
||||
- qcom,qcs615-aoss-qmp
|
||||
- qcom,qcs8300-aoss-qmp
|
||||
- qcom,qdu1000-aoss-qmp
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ properties:
|
|||
- const: qcom,pmic-glink
|
||||
- items:
|
||||
- enum:
|
||||
- qcom,milos-pmic-glink
|
||||
- qcom,sm8650-pmic-glink
|
||||
- qcom,sm8750-pmic-glink
|
||||
- qcom,x1e80100-pmic-glink
|
||||
|
|
|
|||
|
|
@ -1603,7 +1603,13 @@ bool qcom_scm_lmh_dcvsh_available(void)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available);
|
||||
|
||||
int qcom_scm_shm_bridge_enable(void)
|
||||
/*
|
||||
* This is only supposed to be called once by the TZMem module. It takes the
|
||||
* SCM struct device as argument and uses it to pass the call as at the time
|
||||
* the SHM Bridge is enabled, the SCM is not yet fully set up and doesn't
|
||||
* accept global user calls. Don't try to use the __scm pointer here.
|
||||
*/
|
||||
int qcom_scm_shm_bridge_enable(struct device *scm_dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
|
@ -1615,11 +1621,11 @@ int qcom_scm_shm_bridge_enable(void)
|
|||
|
||||
struct qcom_scm_res res;
|
||||
|
||||
if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
|
||||
if (!__qcom_scm_is_call_available(scm_dev, QCOM_SCM_SVC_MP,
|
||||
QCOM_SCM_MP_SHM_BRIDGE_ENABLE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ret = qcom_scm_call(__scm->dev, &desc, &res);
|
||||
ret = qcom_scm_call(scm_dev, &desc, &res);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -1631,7 +1637,7 @@ int qcom_scm_shm_bridge_enable(void)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_enable);
|
||||
|
||||
int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
|
||||
int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
|
||||
u64 ipfn_and_s_perm_flags, u64 size_and_flags,
|
||||
u64 ns_vmids, u64 *handle)
|
||||
{
|
||||
|
|
@ -1659,7 +1665,7 @@ int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_create);
|
||||
|
||||
int qcom_scm_shm_bridge_delete(struct device *dev, u64 handle)
|
||||
int qcom_scm_shm_bridge_delete(u64 handle)
|
||||
{
|
||||
struct qcom_scm_desc desc = {
|
||||
.svc = QCOM_SCM_SVC_MP,
|
||||
|
|
@ -2250,24 +2256,47 @@ static int qcom_scm_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Paired with smp_load_acquire() in qcom_scm_is_available(). */
|
||||
smp_store_release(&__scm, scm);
|
||||
ret = of_reserved_mem_device_init(scm->dev);
|
||||
if (ret && ret != -ENODEV)
|
||||
return dev_err_probe(scm->dev, ret,
|
||||
"Failed to setup the reserved memory region for TZ mem\n");
|
||||
|
||||
ret = qcom_tzmem_enable(scm->dev);
|
||||
if (ret)
|
||||
return dev_err_probe(scm->dev, ret,
|
||||
"Failed to enable the TrustZone memory allocator\n");
|
||||
|
||||
memset(&pool_config, 0, sizeof(pool_config));
|
||||
pool_config.initial_size = 0;
|
||||
pool_config.policy = QCOM_TZMEM_POLICY_ON_DEMAND;
|
||||
pool_config.max_size = SZ_256K;
|
||||
|
||||
scm->mempool = devm_qcom_tzmem_pool_new(scm->dev, &pool_config);
|
||||
if (IS_ERR(scm->mempool))
|
||||
return dev_err_probe(scm->dev, PTR_ERR(scm->mempool),
|
||||
"Failed to create the SCM memory pool\n");
|
||||
|
||||
irq = platform_get_irq_optional(pdev, 0);
|
||||
if (irq < 0) {
|
||||
if (irq != -ENXIO) {
|
||||
ret = irq;
|
||||
goto err;
|
||||
}
|
||||
if (irq != -ENXIO)
|
||||
return irq;
|
||||
} else {
|
||||
ret = devm_request_threaded_irq(__scm->dev, irq, NULL, qcom_scm_irq_handler,
|
||||
IRQF_ONESHOT, "qcom-scm", __scm);
|
||||
if (ret < 0) {
|
||||
dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n");
|
||||
goto err;
|
||||
}
|
||||
ret = devm_request_threaded_irq(scm->dev, irq, NULL, qcom_scm_irq_handler,
|
||||
IRQF_ONESHOT, "qcom-scm", scm);
|
||||
if (ret < 0)
|
||||
return dev_err_probe(scm->dev, ret,
|
||||
"Failed to request qcom-scm irq\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Paired with smp_load_acquire() in qcom_scm_is_available().
|
||||
*
|
||||
* This marks the SCM API as ready to accept user calls and can only
|
||||
* be called after the TrustZone memory pool is initialized and the
|
||||
* waitqueue interrupt requested.
|
||||
*/
|
||||
smp_store_release(&__scm, scm);
|
||||
|
||||
__get_convention();
|
||||
|
||||
/*
|
||||
|
|
@ -2283,32 +2312,6 @@ static int qcom_scm_probe(struct platform_device *pdev)
|
|||
if (of_property_read_bool(pdev->dev.of_node, "qcom,sdi-enabled") || !download_mode)
|
||||
qcom_scm_disable_sdi();
|
||||
|
||||
ret = of_reserved_mem_device_init(__scm->dev);
|
||||
if (ret && ret != -ENODEV) {
|
||||
dev_err_probe(__scm->dev, ret,
|
||||
"Failed to setup the reserved memory region for TZ mem\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = qcom_tzmem_enable(__scm->dev);
|
||||
if (ret) {
|
||||
dev_err_probe(__scm->dev, ret,
|
||||
"Failed to enable the TrustZone memory allocator\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
memset(&pool_config, 0, sizeof(pool_config));
|
||||
pool_config.initial_size = 0;
|
||||
pool_config.policy = QCOM_TZMEM_POLICY_ON_DEMAND;
|
||||
pool_config.max_size = SZ_256K;
|
||||
|
||||
__scm->mempool = devm_qcom_tzmem_pool_new(__scm->dev, &pool_config);
|
||||
if (IS_ERR(__scm->mempool)) {
|
||||
ret = dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool),
|
||||
"Failed to create the SCM memory pool\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the QSEECOM interface.
|
||||
*
|
||||
|
|
@ -2323,12 +2326,6 @@ static int qcom_scm_probe(struct platform_device *pdev)
|
|||
WARN(ret < 0, "failed to initialize qseecom: %d\n", ret);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
/* Paired with smp_load_acquire() in qcom_scm_is_available(). */
|
||||
smp_store_release(&__scm, NULL);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void qcom_scm_shutdown(struct platform_device *pdev)
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ int scm_legacy_call(struct device *dev, const struct qcom_scm_desc *desc,
|
|||
struct qcom_scm_res *res);
|
||||
|
||||
struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void);
|
||||
int qcom_scm_shm_bridge_enable(struct device *scm_dev);
|
||||
|
||||
#define QCOM_SCM_SVC_BOOT 0x01
|
||||
#define QCOM_SCM_BOOT_SET_ADDR 0x01
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "qcom_scm.h"
|
||||
#include "qcom_tzmem.h"
|
||||
|
||||
struct qcom_tzmem_area {
|
||||
|
|
@ -94,7 +95,7 @@ static int qcom_tzmem_init(void)
|
|||
goto notsupp;
|
||||
}
|
||||
|
||||
ret = qcom_scm_shm_bridge_enable();
|
||||
ret = qcom_scm_shm_bridge_enable(qcom_tzmem_dev);
|
||||
if (ret == -EOPNOTSUPP)
|
||||
goto notsupp;
|
||||
|
||||
|
|
@ -124,9 +125,9 @@ static int qcom_tzmem_init_area(struct qcom_tzmem_area *area)
|
|||
if (!handle)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = qcom_scm_shm_bridge_create(qcom_tzmem_dev, pfn_and_ns_perm,
|
||||
ipfn_and_s_perm, size_and_flags,
|
||||
QCOM_SCM_VMID_HLOS, handle);
|
||||
ret = qcom_scm_shm_bridge_create(pfn_and_ns_perm, ipfn_and_s_perm,
|
||||
size_and_flags, QCOM_SCM_VMID_HLOS,
|
||||
handle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
@ -142,7 +143,7 @@ static void qcom_tzmem_cleanup_area(struct qcom_tzmem_area *area)
|
|||
if (!qcom_tzmem_using_shm_bridge)
|
||||
return;
|
||||
|
||||
qcom_scm_shm_bridge_delete(qcom_tzmem_dev, *handle);
|
||||
qcom_scm_shm_bridge_delete(*handle);
|
||||
kfree(handle);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -167,7 +167,10 @@ static int pmic_glink_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void pmic_glink_aux_release(struct device *dev) {}
|
||||
static void pmic_glink_aux_release(struct device *dev)
|
||||
{
|
||||
of_node_put(dev->of_node);
|
||||
}
|
||||
|
||||
static int pmic_glink_add_aux_device(struct pmic_glink *pg,
|
||||
struct auxiliary_device *aux,
|
||||
|
|
@ -181,8 +184,10 @@ static int pmic_glink_add_aux_device(struct pmic_glink *pg,
|
|||
aux->dev.release = pmic_glink_aux_release;
|
||||
device_set_of_node_from_dev(&aux->dev, parent);
|
||||
ret = auxiliary_device_init(aux);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
of_node_put(aux->dev.of_node);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = auxiliary_device_add(aux);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -1072,7 +1072,7 @@ static int rpmh_rsc_probe(struct platform_device *pdev)
|
|||
drv->ver.minor = rsc_id & (MINOR_VER_MASK << MINOR_VER_SHIFT);
|
||||
drv->ver.minor >>= MINOR_VER_SHIFT;
|
||||
|
||||
if (drv->ver.major == 3)
|
||||
if (drv->ver.major >= 3)
|
||||
drv->regs = rpmh_rsc_reg_offset_ver_3_0;
|
||||
else
|
||||
drv->regs = rpmh_rsc_reg_offset_ver_2_7;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
#define SMEM_IMAGE_TABLE_BOOT_INDEX 0
|
||||
#define SMEM_IMAGE_TABLE_TZ_INDEX 1
|
||||
#define SMEM_IMAGE_TABLE_RPM_INDEX 3
|
||||
#define SMEM_IMAGE_TABLE_APPSBL_INDEX 9
|
||||
#define SMEM_IMAGE_TABLE_APPS_INDEX 10
|
||||
#define SMEM_IMAGE_TABLE_MPSS_INDEX 11
|
||||
#define SMEM_IMAGE_TABLE_ADSP_INDEX 12
|
||||
|
|
@ -56,6 +57,7 @@
|
|||
*/
|
||||
static const char *const socinfo_image_names[] = {
|
||||
[SMEM_IMAGE_TABLE_ADSP_INDEX] = "adsp",
|
||||
[SMEM_IMAGE_TABLE_APPSBL_INDEX] = "appsbl",
|
||||
[SMEM_IMAGE_TABLE_APPS_INDEX] = "apps",
|
||||
[SMEM_IMAGE_TABLE_BOOT_INDEX] = "boot",
|
||||
[SMEM_IMAGE_TABLE_CNSS_INDEX] = "cnss",
|
||||
|
|
@ -128,8 +130,12 @@ static const char *const pmic_models[] = {
|
|||
[72] = "PMR735D",
|
||||
[73] = "PM8550",
|
||||
[74] = "PMK8550",
|
||||
[78] = "PMM8650AU",
|
||||
[79] = "PMM8650AU_PSAIL",
|
||||
[80] = "PM7550",
|
||||
[82] = "PMC8380",
|
||||
[83] = "SMB2360",
|
||||
[91] = "PMIV0108",
|
||||
};
|
||||
|
||||
struct socinfo_params {
|
||||
|
|
@ -448,8 +454,13 @@ static const struct soc_id soc_id[] = {
|
|||
{ qcom_board_id(QCM8550) },
|
||||
{ qcom_board_id(SM8750) },
|
||||
{ qcom_board_id(IPQ5300) },
|
||||
{ qcom_board_id(SM7635) },
|
||||
{ qcom_board_id(SM6650) },
|
||||
{ qcom_board_id(SM6650P) },
|
||||
{ qcom_board_id(IPQ5321) },
|
||||
{ qcom_board_id(IPQ5424) },
|
||||
{ qcom_board_id(QCM6690) },
|
||||
{ qcom_board_id(QCS6690) },
|
||||
{ qcom_board_id(IPQ5404) },
|
||||
{ qcom_board_id(QCS9100) },
|
||||
{ qcom_board_id(QCS8300) },
|
||||
|
|
|
|||
|
|
@ -279,8 +279,13 @@
|
|||
#define QCOM_ID_QCM8550 604
|
||||
#define QCOM_ID_SM8750 618
|
||||
#define QCOM_ID_IPQ5300 624
|
||||
#define QCOM_ID_SM7635 636
|
||||
#define QCOM_ID_SM6650 640
|
||||
#define QCOM_ID_SM6650P 641
|
||||
#define QCOM_ID_IPQ5321 650
|
||||
#define QCOM_ID_IPQ5424 651
|
||||
#define QCOM_ID_QCM6690 657
|
||||
#define QCOM_ID_QCS6690 658
|
||||
#define QCOM_ID_IPQ5404 671
|
||||
#define QCOM_ID_QCS9100 667
|
||||
#define QCOM_ID_QCS8300 674
|
||||
|
|
|
|||
|
|
@ -148,11 +148,10 @@ bool qcom_scm_lmh_dcvsh_available(void);
|
|||
|
||||
int qcom_scm_gpu_init_regs(u32 gpu_req);
|
||||
|
||||
int qcom_scm_shm_bridge_enable(void);
|
||||
int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
|
||||
int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
|
||||
u64 ipfn_and_s_perm_flags, u64 size_and_flags,
|
||||
u64 ns_vmids, u64 *handle);
|
||||
int qcom_scm_shm_bridge_delete(struct device *dev, u64 handle);
|
||||
int qcom_scm_shm_bridge_delete(u64 handle);
|
||||
|
||||
#ifdef CONFIG_QCOM_QSEECOM
|
||||
|
||||
|
|
|
|||
|
|
@ -50,6 +50,8 @@
|
|||
#define PMR735B_SUBTYPE 0x34
|
||||
#define PM6350_SUBTYPE 0x36
|
||||
#define PM4125_SUBTYPE 0x37
|
||||
#define PMM8650AU_SUBTYPE 0x4e
|
||||
#define PMM8650AU_PSAIL_SUBTYPE 0x4f
|
||||
|
||||
#define PMI8998_FAB_ID_SMIC 0x11
|
||||
#define PMI8998_FAB_ID_GF 0x30
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user