Skip to content

Commit edf0a40

Browse files
committed
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/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 5b81415 + 4587d39 commit edf0a40

File tree

12 files changed

+85
-60
lines changed

12 files changed

+85
-60
lines changed

Documentation/devicetree/bindings/firmware/qcom,scm.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ properties:
3232
- qcom,scm-ipq8074
3333
- qcom,scm-ipq9574
3434
- qcom,scm-mdm9607
35+
- qcom,scm-milos
3536
- qcom,scm-msm8226
3637
- qcom,scm-msm8660
3738
- qcom,scm-msm8916
@@ -198,6 +199,7 @@ allOf:
198199
compatible:
199200
contains:
200201
enum:
202+
- qcom,scm-milos
201203
- qcom,scm-sm8450
202204
- qcom,scm-sm8550
203205
- qcom,scm-sm8650

Documentation/devicetree/bindings/soc/qcom/qcom,aoss-qmp.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ properties:
2525
compatible:
2626
items:
2727
- enum:
28+
- qcom,milos-aoss-qmp
2829
- qcom,qcs615-aoss-qmp
2930
- qcom,qcs8300-aoss-qmp
3031
- qcom,qdu1000-aoss-qmp

Documentation/devicetree/bindings/soc/qcom/qcom,pmic-glink.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ properties:
3737
- const: qcom,pmic-glink
3838
- items:
3939
- enum:
40+
- qcom,milos-pmic-glink
4041
- qcom,sm8650-pmic-glink
4142
- qcom,sm8750-pmic-glink
4243
- qcom,x1e80100-pmic-glink

drivers/firmware/qcom/qcom_scm.c

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,7 +1603,13 @@ bool qcom_scm_lmh_dcvsh_available(void)
16031603
}
16041604
EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available);
16051605

1606-
int qcom_scm_shm_bridge_enable(void)
1606+
/*
1607+
* This is only supposed to be called once by the TZMem module. It takes the
1608+
* SCM struct device as argument and uses it to pass the call as at the time
1609+
* the SHM Bridge is enabled, the SCM is not yet fully set up and doesn't
1610+
* accept global user calls. Don't try to use the __scm pointer here.
1611+
*/
1612+
int qcom_scm_shm_bridge_enable(struct device *scm_dev)
16071613
{
16081614
int ret;
16091615

@@ -1615,11 +1621,11 @@ int qcom_scm_shm_bridge_enable(void)
16151621

16161622
struct qcom_scm_res res;
16171623

1618-
if (!__qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP,
1624+
if (!__qcom_scm_is_call_available(scm_dev, QCOM_SCM_SVC_MP,
16191625
QCOM_SCM_MP_SHM_BRIDGE_ENABLE))
16201626
return -EOPNOTSUPP;
16211627

1622-
ret = qcom_scm_call(__scm->dev, &desc, &res);
1628+
ret = qcom_scm_call(scm_dev, &desc, &res);
16231629

16241630
if (ret)
16251631
return ret;
@@ -1631,7 +1637,7 @@ int qcom_scm_shm_bridge_enable(void)
16311637
}
16321638
EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_enable);
16331639

1634-
int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
1640+
int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
16351641
u64 ipfn_and_s_perm_flags, u64 size_and_flags,
16361642
u64 ns_vmids, u64 *handle)
16371643
{
@@ -1659,7 +1665,7 @@ int qcom_scm_shm_bridge_create(struct device *dev, u64 pfn_and_ns_perm_flags,
16591665
}
16601666
EXPORT_SYMBOL_GPL(qcom_scm_shm_bridge_create);
16611667

1662-
int qcom_scm_shm_bridge_delete(struct device *dev, u64 handle)
1668+
int qcom_scm_shm_bridge_delete(u64 handle)
16631669
{
16641670
struct qcom_scm_desc desc = {
16651671
.svc = QCOM_SCM_SVC_MP,
@@ -2250,24 +2256,47 @@ static int qcom_scm_probe(struct platform_device *pdev)
22502256
if (ret)
22512257
return ret;
22522258

2253-
/* Paired with smp_load_acquire() in qcom_scm_is_available(). */
2254-
smp_store_release(&__scm, scm);
2259+
ret = of_reserved_mem_device_init(scm->dev);
2260+
if (ret && ret != -ENODEV)
2261+
return dev_err_probe(scm->dev, ret,
2262+
"Failed to setup the reserved memory region for TZ mem\n");
2263+
2264+
ret = qcom_tzmem_enable(scm->dev);
2265+
if (ret)
2266+
return dev_err_probe(scm->dev, ret,
2267+
"Failed to enable the TrustZone memory allocator\n");
2268+
2269+
memset(&pool_config, 0, sizeof(pool_config));
2270+
pool_config.initial_size = 0;
2271+
pool_config.policy = QCOM_TZMEM_POLICY_ON_DEMAND;
2272+
pool_config.max_size = SZ_256K;
2273+
2274+
scm->mempool = devm_qcom_tzmem_pool_new(scm->dev, &pool_config);
2275+
if (IS_ERR(scm->mempool))
2276+
return dev_err_probe(scm->dev, PTR_ERR(scm->mempool),
2277+
"Failed to create the SCM memory pool\n");
22552278

22562279
irq = platform_get_irq_optional(pdev, 0);
22572280
if (irq < 0) {
2258-
if (irq != -ENXIO) {
2259-
ret = irq;
2260-
goto err;
2261-
}
2281+
if (irq != -ENXIO)
2282+
return irq;
22622283
} else {
2263-
ret = devm_request_threaded_irq(__scm->dev, irq, NULL, qcom_scm_irq_handler,
2264-
IRQF_ONESHOT, "qcom-scm", __scm);
2265-
if (ret < 0) {
2266-
dev_err_probe(scm->dev, ret, "Failed to request qcom-scm irq\n");
2267-
goto err;
2268-
}
2284+
ret = devm_request_threaded_irq(scm->dev, irq, NULL, qcom_scm_irq_handler,
2285+
IRQF_ONESHOT, "qcom-scm", scm);
2286+
if (ret < 0)
2287+
return dev_err_probe(scm->dev, ret,
2288+
"Failed to request qcom-scm irq\n");
22692289
}
22702290

2291+
/*
2292+
* Paired with smp_load_acquire() in qcom_scm_is_available().
2293+
*
2294+
* This marks the SCM API as ready to accept user calls and can only
2295+
* be called after the TrustZone memory pool is initialized and the
2296+
* waitqueue interrupt requested.
2297+
*/
2298+
smp_store_release(&__scm, scm);
2299+
22712300
__get_convention();
22722301

22732302
/*
@@ -2283,32 +2312,6 @@ static int qcom_scm_probe(struct platform_device *pdev)
22832312
if (of_property_read_bool(pdev->dev.of_node, "qcom,sdi-enabled") || !download_mode)
22842313
qcom_scm_disable_sdi();
22852314

2286-
ret = of_reserved_mem_device_init(__scm->dev);
2287-
if (ret && ret != -ENODEV) {
2288-
dev_err_probe(__scm->dev, ret,
2289-
"Failed to setup the reserved memory region for TZ mem\n");
2290-
goto err;
2291-
}
2292-
2293-
ret = qcom_tzmem_enable(__scm->dev);
2294-
if (ret) {
2295-
dev_err_probe(__scm->dev, ret,
2296-
"Failed to enable the TrustZone memory allocator\n");
2297-
goto err;
2298-
}
2299-
2300-
memset(&pool_config, 0, sizeof(pool_config));
2301-
pool_config.initial_size = 0;
2302-
pool_config.policy = QCOM_TZMEM_POLICY_ON_DEMAND;
2303-
pool_config.max_size = SZ_256K;
2304-
2305-
__scm->mempool = devm_qcom_tzmem_pool_new(__scm->dev, &pool_config);
2306-
if (IS_ERR(__scm->mempool)) {
2307-
ret = dev_err_probe(__scm->dev, PTR_ERR(__scm->mempool),
2308-
"Failed to create the SCM memory pool\n");
2309-
goto err;
2310-
}
2311-
23122315
/*
23132316
* Initialize the QSEECOM interface.
23142317
*
@@ -2323,12 +2326,6 @@ static int qcom_scm_probe(struct platform_device *pdev)
23232326
WARN(ret < 0, "failed to initialize qseecom: %d\n", ret);
23242327

23252328
return 0;
2326-
2327-
err:
2328-
/* Paired with smp_load_acquire() in qcom_scm_is_available(). */
2329-
smp_store_release(&__scm, NULL);
2330-
2331-
return ret;
23322329
}
23332330

23342331
static void qcom_scm_shutdown(struct platform_device *pdev)

drivers/firmware/qcom/qcom_scm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ int scm_legacy_call(struct device *dev, const struct qcom_scm_desc *desc,
8383
struct qcom_scm_res *res);
8484

8585
struct qcom_tzmem_pool *qcom_scm_get_tzmem_pool(void);
86+
int qcom_scm_shm_bridge_enable(struct device *scm_dev);
8687

8788
#define QCOM_SCM_SVC_BOOT 0x01
8889
#define QCOM_SCM_BOOT_SET_ADDR 0x01

drivers/firmware/qcom/qcom_tzmem.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <linux/spinlock.h>
2121
#include <linux/types.h>
2222

23+
#include "qcom_scm.h"
2324
#include "qcom_tzmem.h"
2425

2526
struct qcom_tzmem_area {
@@ -94,7 +95,7 @@ static int qcom_tzmem_init(void)
9495
goto notsupp;
9596
}
9697

97-
ret = qcom_scm_shm_bridge_enable();
98+
ret = qcom_scm_shm_bridge_enable(qcom_tzmem_dev);
9899
if (ret == -EOPNOTSUPP)
99100
goto notsupp;
100101

@@ -124,9 +125,9 @@ static int qcom_tzmem_init_area(struct qcom_tzmem_area *area)
124125
if (!handle)
125126
return -ENOMEM;
126127

127-
ret = qcom_scm_shm_bridge_create(qcom_tzmem_dev, pfn_and_ns_perm,
128-
ipfn_and_s_perm, size_and_flags,
129-
QCOM_SCM_VMID_HLOS, handle);
128+
ret = qcom_scm_shm_bridge_create(pfn_and_ns_perm, ipfn_and_s_perm,
129+
size_and_flags, QCOM_SCM_VMID_HLOS,
130+
handle);
130131
if (ret)
131132
return ret;
132133

@@ -142,7 +143,7 @@ static void qcom_tzmem_cleanup_area(struct qcom_tzmem_area *area)
142143
if (!qcom_tzmem_using_shm_bridge)
143144
return;
144145

145-
qcom_scm_shm_bridge_delete(qcom_tzmem_dev, *handle);
146+
qcom_scm_shm_bridge_delete(*handle);
146147
kfree(handle);
147148
}
148149

drivers/soc/qcom/pmic_glink.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,10 @@ static int pmic_glink_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
167167
return 0;
168168
}
169169

170-
static void pmic_glink_aux_release(struct device *dev) {}
170+
static void pmic_glink_aux_release(struct device *dev)
171+
{
172+
of_node_put(dev->of_node);
173+
}
171174

172175
static int pmic_glink_add_aux_device(struct pmic_glink *pg,
173176
struct auxiliary_device *aux,
@@ -181,8 +184,10 @@ static int pmic_glink_add_aux_device(struct pmic_glink *pg,
181184
aux->dev.release = pmic_glink_aux_release;
182185
device_set_of_node_from_dev(&aux->dev, parent);
183186
ret = auxiliary_device_init(aux);
184-
if (ret)
187+
if (ret) {
188+
of_node_put(aux->dev.of_node);
185189
return ret;
190+
}
186191

187192
ret = auxiliary_device_add(aux);
188193
if (ret)

drivers/soc/qcom/rpmh-rsc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,7 @@ static int rpmh_rsc_probe(struct platform_device *pdev)
10721072
drv->ver.minor = rsc_id & (MINOR_VER_MASK << MINOR_VER_SHIFT);
10731073
drv->ver.minor >>= MINOR_VER_SHIFT;
10741074

1075-
if (drv->ver.major == 3)
1075+
if (drv->ver.major >= 3)
10761076
drv->regs = rpmh_rsc_reg_offset_ver_3_0;
10771077
else
10781078
drv->regs = rpmh_rsc_reg_offset_ver_2_7;

drivers/soc/qcom/socinfo.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#define SMEM_IMAGE_TABLE_BOOT_INDEX 0
3939
#define SMEM_IMAGE_TABLE_TZ_INDEX 1
4040
#define SMEM_IMAGE_TABLE_RPM_INDEX 3
41+
#define SMEM_IMAGE_TABLE_APPSBL_INDEX 9
4142
#define SMEM_IMAGE_TABLE_APPS_INDEX 10
4243
#define SMEM_IMAGE_TABLE_MPSS_INDEX 11
4344
#define SMEM_IMAGE_TABLE_ADSP_INDEX 12
@@ -56,6 +57,7 @@
5657
*/
5758
static const char *const socinfo_image_names[] = {
5859
[SMEM_IMAGE_TABLE_ADSP_INDEX] = "adsp",
60+
[SMEM_IMAGE_TABLE_APPSBL_INDEX] = "appsbl",
5961
[SMEM_IMAGE_TABLE_APPS_INDEX] = "apps",
6062
[SMEM_IMAGE_TABLE_BOOT_INDEX] = "boot",
6163
[SMEM_IMAGE_TABLE_CNSS_INDEX] = "cnss",
@@ -128,8 +130,12 @@ static const char *const pmic_models[] = {
128130
[72] = "PMR735D",
129131
[73] = "PM8550",
130132
[74] = "PMK8550",
133+
[78] = "PMM8650AU",
134+
[79] = "PMM8650AU_PSAIL",
135+
[80] = "PM7550",
131136
[82] = "PMC8380",
132137
[83] = "SMB2360",
138+
[91] = "PMIV0108",
133139
};
134140

135141
struct socinfo_params {
@@ -448,8 +454,13 @@ static const struct soc_id soc_id[] = {
448454
{ qcom_board_id(QCM8550) },
449455
{ qcom_board_id(SM8750) },
450456
{ qcom_board_id(IPQ5300) },
457+
{ qcom_board_id(SM7635) },
458+
{ qcom_board_id(SM6650) },
459+
{ qcom_board_id(SM6650P) },
451460
{ qcom_board_id(IPQ5321) },
452461
{ qcom_board_id(IPQ5424) },
462+
{ qcom_board_id(QCM6690) },
463+
{ qcom_board_id(QCS6690) },
453464
{ qcom_board_id(IPQ5404) },
454465
{ qcom_board_id(QCS9100) },
455466
{ qcom_board_id(QCS8300) },

include/dt-bindings/arm/qcom,ids.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,13 @@
279279
#define QCOM_ID_QCM8550 604
280280
#define QCOM_ID_SM8750 618
281281
#define QCOM_ID_IPQ5300 624
282+
#define QCOM_ID_SM7635 636
283+
#define QCOM_ID_SM6650 640
284+
#define QCOM_ID_SM6650P 641
282285
#define QCOM_ID_IPQ5321 650
283286
#define QCOM_ID_IPQ5424 651
287+
#define QCOM_ID_QCM6690 657
288+
#define QCOM_ID_QCS6690 658
284289
#define QCOM_ID_IPQ5404 671
285290
#define QCOM_ID_QCS9100 667
286291
#define QCOM_ID_QCS8300 674

0 commit comments

Comments
 (0)