Skip to content

Commit d8f2638

Browse files
committed
Merge tag 'qcom-drivers-fixes-for-6.11' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into arm/fixes
Qualcomm driver fixes for v6.11 This corrects the tzmem virt-to-phys conversion, which caused issues for the uefisecapp implementation of EFI variable access. SDM670 is excluded from tzmem usage due to reported issues. The SCM get wait queue context call is corrected to be marked ATOMIC and some dead code in qseecom, following the tzmem conversion, is removed. The memory backing command DB is remapped writecombined, to avoid XPU violations when Linux runs without the Qualcomm hypervisor. Two compile fixes are added for pd-mapper, and the broken reference count is corrected, to make pd-mapper deal with remoteprocs going away. In pmic_glink a race condition where the client callbacks might be called before we returned the client handle is corrected. The broken conditions for when to signal that the firmware is going down is also corrected. In the pmic_glink UCSI driver, the ucsi_unregister() is moved out of the pdr callback, as this is being invoked in atomic context. Konrad's email address is updated in MAINTAINERS, and related mailmap entries are added. * tag 'qcom-drivers-fixes-for-6.11' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: soc: qcom: pd-mapper: Fix singleton refcount firmware: qcom: tzmem: disable sdm670 platform soc: qcom: pmic_glink: Actually communicate when remote goes down usb: typec: ucsi: Move unregister out of atomic section soc: qcom: pmic_glink: Fix race during initialization firmware: qcom: qseecom: remove unused functions firmware: qcom: tzmem: fix virtual-to-physical address conversion firmware: qcom: scm: Mark get_wq_ctx() as atomic call MAINTAINERS: Update Konrad Dybcio's email address mailmap: Add an entry for Konrad Dybcio soc: qcom: pd-mapper: mark qcom_pdm_domains as __maybe_unused soc: qcom: cmd-db: Map shared memory as WC, not WB soc: qcom: pd-mapper: Depend on ARCH_QCOM || COMPILE_TEST Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 27795c5 + c158ceb commit d8f2638

File tree

13 files changed

+120
-103
lines changed

13 files changed

+120
-103
lines changed

.mailmap

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ Kenneth Westfield <[email protected]> <[email protected]>
354354
355355
356356
Kishon Vijay Abraham I <[email protected]> <[email protected]>
357+
358+
357359
Konstantin Khlebnikov <[email protected]> <[email protected]>
358360
Konstantin Khlebnikov <[email protected]> <[email protected]>
359361

MAINTAINERS

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2745,7 +2745,7 @@ F: include/linux/soc/qcom/
27452745

27462746
ARM/QUALCOMM SUPPORT
27472747
M: Bjorn Andersson <[email protected]>
2748-
M: Konrad Dybcio <konrad.dybcio@linaro.org>
2748+
M: Konrad Dybcio <konradybcio@kernel.org>
27492749
27502750
S: Maintained
27512751
T: git git://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git
@@ -7106,7 +7106,7 @@ F: drivers/gpu/drm/tiny/panel-mipi-dbi.c
71067106
DRM DRIVER for Qualcomm Adreno GPUs
71077107
M: Rob Clark <[email protected]>
71087108
R: Sean Paul <[email protected]>
7109-
R: Konrad Dybcio <konrad.dybcio@linaro.org>
7109+
R: Konrad Dybcio <konradybcio@kernel.org>
71107110
71117111
71127112
@@ -18774,7 +18774,7 @@ F: include/uapi/drm/qaic_accel.h
1877418774

1877518775
QUALCOMM CORE POWER REDUCTION (CPR) AVS DRIVER
1877618776
M: Bjorn Andersson <[email protected]>
18777-
M: Konrad Dybcio <konrad.dybcio@linaro.org>
18777+
M: Konrad Dybcio <konradybcio@kernel.org>
1877818778
1877918779
1878018780
S: Maintained

drivers/firmware/qcom/qcom_scm-smc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ int scm_get_wq_ctx(u32 *wq_ctx, u32 *flags, u32 *more_pending)
7373
struct arm_smccc_res get_wq_res;
7474
struct arm_smccc_args get_wq_ctx = {0};
7575

76-
get_wq_ctx.args[0] = ARM_SMCCC_CALL_VAL(ARM_SMCCC_STD_CALL,
76+
get_wq_ctx.args[0] = ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,
7777
ARM_SMCCC_SMC_64, ARM_SMCCC_OWNER_SIP,
7878
SCM_SMC_FNID(QCOM_SCM_SVC_WAITQ, QCOM_SCM_WAITQ_GET_WQ_CTX));
7979

drivers/firmware/qcom/qcom_tzmem.c

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ struct qcom_tzmem_pool {
4040
};
4141

4242
struct qcom_tzmem_chunk {
43-
phys_addr_t paddr;
4443
size_t size;
4544
struct qcom_tzmem_pool *owner;
4645
};
@@ -78,6 +77,7 @@ static bool qcom_tzmem_using_shm_bridge;
7877
/* List of machines that are known to not support SHM bridge correctly. */
7978
static const char *const qcom_tzmem_blacklist[] = {
8079
"qcom,sc8180x",
80+
"qcom,sdm670", /* failure in GPU firmware loading */
8181
"qcom,sdm845", /* reset in rmtfs memory assignment */
8282
"qcom,sm8150", /* reset in rmtfs memory assignment */
8383
NULL
@@ -385,7 +385,6 @@ void *qcom_tzmem_alloc(struct qcom_tzmem_pool *pool, size_t size, gfp_t gfp)
385385
return NULL;
386386
}
387387

388-
chunk->paddr = gen_pool_virt_to_phys(pool->genpool, vaddr);
389388
chunk->size = size;
390389
chunk->owner = pool;
391390

@@ -431,25 +430,37 @@ void qcom_tzmem_free(void *vaddr)
431430
EXPORT_SYMBOL_GPL(qcom_tzmem_free);
432431

433432
/**
434-
* qcom_tzmem_to_phys() - Map the virtual address of a TZ buffer to physical.
435-
* @vaddr: Virtual address of the buffer allocated from a TZ memory pool.
433+
* qcom_tzmem_to_phys() - Map the virtual address of TZ memory to physical.
434+
* @vaddr: Virtual address of memory allocated from a TZ memory pool.
436435
*
437-
* Can be used in any context. The address must have been returned by a call
438-
* to qcom_tzmem_alloc().
436+
* Can be used in any context. The address must point to memory allocated
437+
* using qcom_tzmem_alloc().
439438
*
440-
* Returns: Physical address of the buffer.
439+
* Returns:
440+
* Physical address mapped from the virtual or 0 if the mapping failed.
441441
*/
442442
phys_addr_t qcom_tzmem_to_phys(void *vaddr)
443443
{
444444
struct qcom_tzmem_chunk *chunk;
445+
struct radix_tree_iter iter;
446+
void __rcu **slot;
447+
phys_addr_t ret;
445448

446449
guard(spinlock_irqsave)(&qcom_tzmem_chunks_lock);
447450

448-
chunk = radix_tree_lookup(&qcom_tzmem_chunks, (unsigned long)vaddr);
449-
if (!chunk)
450-
return 0;
451+
radix_tree_for_each_slot(slot, &qcom_tzmem_chunks, &iter, 0) {
452+
chunk = radix_tree_deref_slot_protected(slot,
453+
&qcom_tzmem_chunks_lock);
451454

452-
return chunk->paddr;
455+
ret = gen_pool_virt_to_phys(chunk->owner->genpool,
456+
(unsigned long)vaddr);
457+
if (ret == -1)
458+
continue;
459+
460+
return ret;
461+
}
462+
463+
return 0;
453464
}
454465
EXPORT_SYMBOL_GPL(qcom_tzmem_to_phys);
455466

drivers/power/supply/qcom_battmgr.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,12 +1387,16 @@ static int qcom_battmgr_probe(struct auxiliary_device *adev,
13871387
"failed to register wireless charing power supply\n");
13881388
}
13891389

1390-
battmgr->client = devm_pmic_glink_register_client(dev,
1391-
PMIC_GLINK_OWNER_BATTMGR,
1392-
qcom_battmgr_callback,
1393-
qcom_battmgr_pdr_notify,
1394-
battmgr);
1395-
return PTR_ERR_OR_ZERO(battmgr->client);
1390+
battmgr->client = devm_pmic_glink_client_alloc(dev, PMIC_GLINK_OWNER_BATTMGR,
1391+
qcom_battmgr_callback,
1392+
qcom_battmgr_pdr_notify,
1393+
battmgr);
1394+
if (IS_ERR(battmgr->client))
1395+
return PTR_ERR(battmgr->client);
1396+
1397+
pmic_glink_client_register(battmgr->client);
1398+
1399+
return 0;
13961400
}
13971401

13981402
static const struct auxiliary_device_id qcom_battmgr_id_table[] = {

drivers/soc/qcom/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ config QCOM_PD_MAPPER
7777
select QCOM_QMI_HELPERS
7878
select QCOM_PDR_MSG
7979
select AUXILIARY_BUS
80-
depends on NET && QRTR
80+
depends on NET && QRTR && (ARCH_QCOM || COMPILE_TEST)
8181
default QCOM_RPROC_COMMON
8282
help
8383
The Protection Domain Mapper maps registered services to the domains

drivers/soc/qcom/cmd-db.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ static int cmd_db_dev_probe(struct platform_device *pdev)
349349
return -EINVAL;
350350
}
351351

352-
cmd_db_header = memremap(rmem->base, rmem->size, MEMREMAP_WB);
352+
cmd_db_header = memremap(rmem->base, rmem->size, MEMREMAP_WC);
353353
if (!cmd_db_header) {
354354
ret = -ENOMEM;
355355
cmd_db_header = NULL;

drivers/soc/qcom/pmic_glink.c

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,14 @@ static void _devm_pmic_glink_release_client(struct device *dev, void *res)
6666
spin_unlock_irqrestore(&pg->client_lock, flags);
6767
}
6868

69-
struct pmic_glink_client *devm_pmic_glink_register_client(struct device *dev,
70-
unsigned int id,
71-
void (*cb)(const void *, size_t, void *),
72-
void (*pdr)(void *, int),
73-
void *priv)
69+
struct pmic_glink_client *devm_pmic_glink_client_alloc(struct device *dev,
70+
unsigned int id,
71+
void (*cb)(const void *, size_t, void *),
72+
void (*pdr)(void *, int),
73+
void *priv)
7474
{
7575
struct pmic_glink_client *client;
7676
struct pmic_glink *pg = dev_get_drvdata(dev->parent);
77-
unsigned long flags;
7877

7978
client = devres_alloc(_devm_pmic_glink_release_client, sizeof(*client), GFP_KERNEL);
8079
if (!client)
@@ -85,6 +84,18 @@ struct pmic_glink_client *devm_pmic_glink_register_client(struct device *dev,
8584
client->cb = cb;
8685
client->pdr_notify = pdr;
8786
client->priv = priv;
87+
INIT_LIST_HEAD(&client->node);
88+
89+
devres_add(dev, client);
90+
91+
return client;
92+
}
93+
EXPORT_SYMBOL_GPL(devm_pmic_glink_client_alloc);
94+
95+
void pmic_glink_client_register(struct pmic_glink_client *client)
96+
{
97+
struct pmic_glink *pg = client->pg;
98+
unsigned long flags;
8899

89100
mutex_lock(&pg->state_lock);
90101
spin_lock_irqsave(&pg->client_lock, flags);
@@ -95,17 +106,22 @@ struct pmic_glink_client *devm_pmic_glink_register_client(struct device *dev,
95106
spin_unlock_irqrestore(&pg->client_lock, flags);
96107
mutex_unlock(&pg->state_lock);
97108

98-
devres_add(dev, client);
99-
100-
return client;
101109
}
102-
EXPORT_SYMBOL_GPL(devm_pmic_glink_register_client);
110+
EXPORT_SYMBOL_GPL(pmic_glink_client_register);
103111

104112
int pmic_glink_send(struct pmic_glink_client *client, void *data, size_t len)
105113
{
106114
struct pmic_glink *pg = client->pg;
115+
int ret;
107116

108-
return rpmsg_send(pg->ept, data, len);
117+
mutex_lock(&pg->state_lock);
118+
if (!pg->ept)
119+
ret = -ECONNRESET;
120+
else
121+
ret = rpmsg_send(pg->ept, data, len);
122+
mutex_unlock(&pg->state_lock);
123+
124+
return ret;
109125
}
110126
EXPORT_SYMBOL_GPL(pmic_glink_send);
111127

@@ -175,7 +191,7 @@ static void pmic_glink_state_notify_clients(struct pmic_glink *pg)
175191
if (pg->pdr_state == SERVREG_SERVICE_STATE_UP && pg->ept)
176192
new_state = SERVREG_SERVICE_STATE_UP;
177193
} else {
178-
if (pg->pdr_state == SERVREG_SERVICE_STATE_UP && pg->ept)
194+
if (pg->pdr_state == SERVREG_SERVICE_STATE_DOWN || !pg->ept)
179195
new_state = SERVREG_SERVICE_STATE_DOWN;
180196
}
181197

drivers/soc/qcom/pmic_glink_altmode.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -520,12 +520,17 @@ static int pmic_glink_altmode_probe(struct auxiliary_device *adev,
520520
return ret;
521521
}
522522

523-
altmode->client = devm_pmic_glink_register_client(dev,
524-
altmode->owner_id,
525-
pmic_glink_altmode_callback,
526-
pmic_glink_altmode_pdr_notify,
527-
altmode);
528-
return PTR_ERR_OR_ZERO(altmode->client);
523+
altmode->client = devm_pmic_glink_client_alloc(dev,
524+
altmode->owner_id,
525+
pmic_glink_altmode_callback,
526+
pmic_glink_altmode_pdr_notify,
527+
altmode);
528+
if (IS_ERR(altmode->client))
529+
return PTR_ERR(altmode->client);
530+
531+
pmic_glink_client_register(altmode->client);
532+
533+
return 0;
529534
}
530535

531536
static const struct auxiliary_device_id pmic_glink_altmode_id_table[] = {

drivers/soc/qcom/qcom_pd_mapper.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ static const struct qcom_pdm_domain_data *sm8550_domains[] = {
517517
NULL,
518518
};
519519

520-
static const struct of_device_id qcom_pdm_domains[] = {
520+
static const struct of_device_id qcom_pdm_domains[] __maybe_unused = {
521521
{ .compatible = "qcom,apq8064", .data = NULL, },
522522
{ .compatible = "qcom,apq8074", .data = NULL, },
523523
{ .compatible = "qcom,apq8084", .data = NULL, },
@@ -635,6 +635,8 @@ static int qcom_pdm_probe(struct auxiliary_device *auxdev,
635635
ret = PTR_ERR(data);
636636
else
637637
__qcom_pdm_data = data;
638+
} else {
639+
refcount_inc(&__qcom_pdm_data->refcnt);
638640
}
639641

640642
auxiliary_set_drvdata(auxdev, __qcom_pdm_data);

0 commit comments

Comments
 (0)