Skip to content

Commit d1734cf

Browse files
committed
Merge tag 'mtk-soc-for-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux into soc/drivers
MediaTek driver updates for v6.10 This adds a much needed cleanup for the MediaTek CMDQ helper driver and also some more helper functions which will be used in drivers using the MediaTek Global Command Engine (GCE) HW. Also adds support for MT8188's VPPSYS mutex for MDP3 support, a new SoC in the mtk-socinfo driver and changes the marketing name for the pre existing MT8188 SoC. * tag 'mtk-soc-for-v6.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux: soc: mediatek: mtk-socinfo: Correct the marketing name for MT8188GV soc: mediatek: mtk-socinfo: Add entry for MT8395AV/ZA Genio 1200 soc: mediatek: mtk-mutex: Add support for MT8188 VPPSYS soc: mediatek: socinfo: Advertise about unknown MediaTek SoC soc: mediatek: cmdq: Don't log an error when gce-client-reg is not found soc: mediatek: mtk-cmdq: Add cmdq_pkt_acquire_event() function soc: mediatek: mtk-cmdq: Add cmdq_pkt_poll_addr() function soc: mediatek: mtk-cmdq: Add cmdq_pkt_mem_move() function soc: mediatek: mtk-cmdq: Add specific purpose register definitions for GCE soc: mediatek: cmdq: Refine cmdq_pkt_create() and cmdq_pkt_destroy() soc: mediatek: cmdq: Remove cmdq_pkt_flush_async() helper function soc: mediatek: cmdq: Add cmdq_pkt_eoc() helper function soc: mediatek: cmdq: Add cmdq_pkt_jump_rel() helper function soc: mediatek: cmdq: Rename cmdq_pkt_jump() to cmdq_pkt_jump_abs() soc: mediatek: cmdq: Add parameter shift_pa to cmdq_pkt_jump() soc: mediatek: cmdq: Fix typo of CMDQ_JUMP_RELATIVE Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 75c0675 + 8a87e1d commit d1734cf

File tree

4 files changed

+292
-65
lines changed

4 files changed

+292
-65
lines changed

drivers/soc/mediatek/mtk-cmdq-helper.c

Lines changed: 124 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@
1212

1313
#define CMDQ_WRITE_ENABLE_MASK BIT(0)
1414
#define CMDQ_POLL_ENABLE_MASK BIT(0)
15+
/* dedicate the last GPR_R15 to assign the register address to be poll */
16+
#define CMDQ_POLL_ADDR_GPR (15)
1517
#define CMDQ_EOC_IRQ_EN BIT(0)
1618
#define CMDQ_REG_TYPE 1
17-
#define CMDQ_JUMP_RELATIVE 1
19+
#define CMDQ_JUMP_RELATIVE 0
20+
#define CMDQ_JUMP_ABSOLUTE 1
1821

1922
struct cmdq_instruction {
2023
union {
@@ -55,7 +58,7 @@ int cmdq_dev_get_client_reg(struct device *dev,
5558
"mediatek,gce-client-reg",
5659
3, idx, &spec);
5760
if (err < 0) {
58-
dev_err(dev,
61+
dev_warn(dev,
5962
"error %d can't parse gce-client-reg property (%d)",
6063
err, idx);
6164

@@ -105,47 +108,37 @@ void cmdq_mbox_destroy(struct cmdq_client *client)
105108
}
106109
EXPORT_SYMBOL(cmdq_mbox_destroy);
107110

108-
struct cmdq_pkt *cmdq_pkt_create(struct cmdq_client *client, size_t size)
111+
int cmdq_pkt_create(struct cmdq_client *client, struct cmdq_pkt *pkt, size_t size)
109112
{
110-
struct cmdq_pkt *pkt;
111113
struct device *dev;
112114
dma_addr_t dma_addr;
113115

114-
pkt = kzalloc(sizeof(*pkt), GFP_KERNEL);
115-
if (!pkt)
116-
return ERR_PTR(-ENOMEM);
117116
pkt->va_base = kzalloc(size, GFP_KERNEL);
118-
if (!pkt->va_base) {
119-
kfree(pkt);
120-
return ERR_PTR(-ENOMEM);
121-
}
117+
if (!pkt->va_base)
118+
return -ENOMEM;
119+
122120
pkt->buf_size = size;
123-
pkt->cl = (void *)client;
124121

125122
dev = client->chan->mbox->dev;
126123
dma_addr = dma_map_single(dev, pkt->va_base, pkt->buf_size,
127124
DMA_TO_DEVICE);
128125
if (dma_mapping_error(dev, dma_addr)) {
129126
dev_err(dev, "dma map failed, size=%u\n", (u32)(u64)size);
130127
kfree(pkt->va_base);
131-
kfree(pkt);
132-
return ERR_PTR(-ENOMEM);
128+
return -ENOMEM;
133129
}
134130

135131
pkt->pa_base = dma_addr;
136132

137-
return pkt;
133+
return 0;
138134
}
139135
EXPORT_SYMBOL(cmdq_pkt_create);
140136

141-
void cmdq_pkt_destroy(struct cmdq_pkt *pkt)
137+
void cmdq_pkt_destroy(struct cmdq_client *client, struct cmdq_pkt *pkt)
142138
{
143-
struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
144-
145139
dma_unmap_single(client->chan->mbox->dev, pkt->pa_base, pkt->buf_size,
146140
DMA_TO_DEVICE);
147141
kfree(pkt->va_base);
148-
kfree(pkt);
149142
}
150143
EXPORT_SYMBOL(cmdq_pkt_destroy);
151144

@@ -299,6 +292,32 @@ int cmdq_pkt_write_s_mask_value(struct cmdq_pkt *pkt, u8 high_addr_reg_idx,
299292
}
300293
EXPORT_SYMBOL(cmdq_pkt_write_s_mask_value);
301294

295+
int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, dma_addr_t src_addr, dma_addr_t dst_addr)
296+
{
297+
const u16 high_addr_reg_idx = CMDQ_THR_SPR_IDX0;
298+
const u16 value_reg_idx = CMDQ_THR_SPR_IDX1;
299+
int ret;
300+
301+
/* read the value of src_addr into high_addr_reg_idx */
302+
ret = cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(src_addr));
303+
if (ret < 0)
304+
return ret;
305+
ret = cmdq_pkt_read_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(src_addr), value_reg_idx);
306+
if (ret < 0)
307+
return ret;
308+
309+
/* write the value of value_reg_idx into dst_addr */
310+
ret = cmdq_pkt_assign(pkt, high_addr_reg_idx, CMDQ_ADDR_HIGH(dst_addr));
311+
if (ret < 0)
312+
return ret;
313+
ret = cmdq_pkt_write_s(pkt, high_addr_reg_idx, CMDQ_ADDR_LOW(dst_addr), value_reg_idx);
314+
if (ret < 0)
315+
return ret;
316+
317+
return 0;
318+
}
319+
EXPORT_SYMBOL(cmdq_pkt_mem_move);
320+
302321
int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear)
303322
{
304323
struct cmdq_instruction inst = { {0} };
@@ -315,6 +334,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear)
315334
}
316335
EXPORT_SYMBOL(cmdq_pkt_wfe);
317336

337+
int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event)
338+
{
339+
struct cmdq_instruction inst = {};
340+
341+
if (event >= CMDQ_MAX_EVENT)
342+
return -EINVAL;
343+
344+
inst.op = CMDQ_CODE_WFE;
345+
inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE | CMDQ_WFE_WAIT;
346+
inst.event = event;
347+
348+
return cmdq_pkt_append_command(pkt, inst);
349+
}
350+
EXPORT_SYMBOL(cmdq_pkt_acquire_event);
351+
318352
int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
319353
{
320354
struct cmdq_instruction inst = { {0} };
@@ -380,6 +414,53 @@ int cmdq_pkt_poll_mask(struct cmdq_pkt *pkt, u8 subsys,
380414
}
381415
EXPORT_SYMBOL(cmdq_pkt_poll_mask);
382416

417+
int cmdq_pkt_poll_addr(struct cmdq_pkt *pkt, dma_addr_t addr, u32 value, u32 mask)
418+
{
419+
struct cmdq_instruction inst = { {0} };
420+
u8 use_mask = 0;
421+
int ret;
422+
423+
/*
424+
* Append an MASK instruction to set the mask for following POLL instruction
425+
* which enables use_mask bit.
426+
*/
427+
if (mask != GENMASK(31, 0)) {
428+
inst.op = CMDQ_CODE_MASK;
429+
inst.mask = ~mask;
430+
ret = cmdq_pkt_append_command(pkt, inst);
431+
if (ret < 0)
432+
return ret;
433+
use_mask = CMDQ_POLL_ENABLE_MASK;
434+
}
435+
436+
/*
437+
* POLL is an legacy operation in GCE and it does not support SPR and CMDQ_CODE_LOGIC,
438+
* so it can not use cmdq_pkt_assign to keep polling register address to SPR.
439+
* If user wants to poll a register address which doesn't have a subsys id,
440+
* user needs to use GPR and CMDQ_CODE_MASK to move polling register address to GPR.
441+
*/
442+
inst.op = CMDQ_CODE_MASK;
443+
inst.dst_t = CMDQ_REG_TYPE;
444+
inst.sop = CMDQ_POLL_ADDR_GPR;
445+
inst.value = addr;
446+
ret = cmdq_pkt_append_command(pkt, inst);
447+
if (ret < 0)
448+
return ret;
449+
450+
/* Append POLL instruction to poll the register address assign to GPR previously. */
451+
inst.op = CMDQ_CODE_POLL;
452+
inst.dst_t = CMDQ_REG_TYPE;
453+
inst.sop = CMDQ_POLL_ADDR_GPR;
454+
inst.offset = use_mask;
455+
inst.value = value;
456+
ret = cmdq_pkt_append_command(pkt, inst);
457+
if (ret < 0)
458+
return ret;
459+
460+
return 0;
461+
}
462+
EXPORT_SYMBOL(cmdq_pkt_poll_addr);
463+
383464
int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
384465
{
385466
struct cmdq_instruction inst = {};
@@ -392,17 +473,36 @@ int cmdq_pkt_assign(struct cmdq_pkt *pkt, u16 reg_idx, u32 value)
392473
}
393474
EXPORT_SYMBOL(cmdq_pkt_assign);
394475

395-
int cmdq_pkt_jump(struct cmdq_pkt *pkt, dma_addr_t addr)
476+
int cmdq_pkt_jump_abs(struct cmdq_pkt *pkt, dma_addr_t addr, u8 shift_pa)
396477
{
397478
struct cmdq_instruction inst = {};
398479

399480
inst.op = CMDQ_CODE_JUMP;
400-
inst.offset = CMDQ_JUMP_RELATIVE;
401-
inst.value = addr >>
402-
cmdq_get_shift_pa(((struct cmdq_client *)pkt->cl)->chan);
481+
inst.offset = CMDQ_JUMP_ABSOLUTE;
482+
inst.value = addr >> shift_pa;
483+
return cmdq_pkt_append_command(pkt, inst);
484+
}
485+
EXPORT_SYMBOL(cmdq_pkt_jump_abs);
486+
487+
int cmdq_pkt_jump_rel(struct cmdq_pkt *pkt, s32 offset, u8 shift_pa)
488+
{
489+
struct cmdq_instruction inst = { {0} };
490+
491+
inst.op = CMDQ_CODE_JUMP;
492+
inst.value = (u32)offset >> shift_pa;
493+
return cmdq_pkt_append_command(pkt, inst);
494+
}
495+
EXPORT_SYMBOL(cmdq_pkt_jump_rel);
496+
497+
int cmdq_pkt_eoc(struct cmdq_pkt *pkt)
498+
{
499+
struct cmdq_instruction inst = { {0} };
500+
501+
inst.op = CMDQ_CODE_EOC;
502+
inst.value = CMDQ_EOC_IRQ_EN;
403503
return cmdq_pkt_append_command(pkt, inst);
404504
}
405-
EXPORT_SYMBOL(cmdq_pkt_jump);
505+
EXPORT_SYMBOL(cmdq_pkt_eoc);
406506

407507
int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
408508
{
@@ -426,19 +526,4 @@ int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
426526
}
427527
EXPORT_SYMBOL(cmdq_pkt_finalize);
428528

429-
int cmdq_pkt_flush_async(struct cmdq_pkt *pkt)
430-
{
431-
int err;
432-
struct cmdq_client *client = (struct cmdq_client *)pkt->cl;
433-
434-
err = mbox_send_message(client->chan, pkt);
435-
if (err < 0)
436-
return err;
437-
/* We can send next packet immediately, so just call txdone. */
438-
mbox_client_txdone(client->chan, 0);
439-
440-
return 0;
441-
}
442-
EXPORT_SYMBOL(cmdq_pkt_flush_async);
443-
444529
MODULE_LICENSE("GPL v2");

drivers/soc/mediatek/mtk-mutex.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,39 @@ static const unsigned int mt8188_mutex_mod[DDP_COMPONENT_ID_MAX] = {
496496
[DDP_COMPONENT_MERGE5] = MT8188_MUTEX_MOD_DISP1_VPP_MERGE4,
497497
};
498498

499+
static const unsigned int mt8188_mdp_mutex_table_mod[MUTEX_MOD_IDX_MAX] = {
500+
[MUTEX_MOD_IDX_MDP_RDMA0] = MT8195_MUTEX_MOD_MDP_RDMA0,
501+
[MUTEX_MOD_IDX_MDP_RDMA2] = MT8195_MUTEX_MOD_MDP_RDMA2,
502+
[MUTEX_MOD_IDX_MDP_RDMA3] = MT8195_MUTEX_MOD_MDP_RDMA3,
503+
[MUTEX_MOD_IDX_MDP_FG0] = MT8195_MUTEX_MOD_MDP_FG0,
504+
[MUTEX_MOD_IDX_MDP_FG2] = MT8195_MUTEX_MOD_MDP_FG2,
505+
[MUTEX_MOD_IDX_MDP_FG3] = MT8195_MUTEX_MOD_MDP_FG3,
506+
[MUTEX_MOD_IDX_MDP_HDR0] = MT8195_MUTEX_MOD_MDP_HDR0,
507+
[MUTEX_MOD_IDX_MDP_HDR2] = MT8195_MUTEX_MOD_MDP_HDR2,
508+
[MUTEX_MOD_IDX_MDP_HDR3] = MT8195_MUTEX_MOD_MDP_HDR3,
509+
[MUTEX_MOD_IDX_MDP_AAL0] = MT8195_MUTEX_MOD_MDP_AAL0,
510+
[MUTEX_MOD_IDX_MDP_AAL2] = MT8195_MUTEX_MOD_MDP_AAL2,
511+
[MUTEX_MOD_IDX_MDP_AAL3] = MT8195_MUTEX_MOD_MDP_AAL3,
512+
[MUTEX_MOD_IDX_MDP_RSZ0] = MT8195_MUTEX_MOD_MDP_RSZ0,
513+
[MUTEX_MOD_IDX_MDP_RSZ2] = MT8195_MUTEX_MOD_MDP_RSZ2,
514+
[MUTEX_MOD_IDX_MDP_RSZ3] = MT8195_MUTEX_MOD_MDP_RSZ3,
515+
[MUTEX_MOD_IDX_MDP_MERGE2] = MT8195_MUTEX_MOD_MDP_MERGE2,
516+
[MUTEX_MOD_IDX_MDP_MERGE3] = MT8195_MUTEX_MOD_MDP_MERGE3,
517+
[MUTEX_MOD_IDX_MDP_TDSHP0] = MT8195_MUTEX_MOD_MDP_TDSHP0,
518+
[MUTEX_MOD_IDX_MDP_TDSHP2] = MT8195_MUTEX_MOD_MDP_TDSHP2,
519+
[MUTEX_MOD_IDX_MDP_TDSHP3] = MT8195_MUTEX_MOD_MDP_TDSHP3,
520+
[MUTEX_MOD_IDX_MDP_COLOR0] = MT8195_MUTEX_MOD_MDP_COLOR0,
521+
[MUTEX_MOD_IDX_MDP_COLOR2] = MT8195_MUTEX_MOD_MDP_COLOR2,
522+
[MUTEX_MOD_IDX_MDP_COLOR3] = MT8195_MUTEX_MOD_MDP_COLOR3,
523+
[MUTEX_MOD_IDX_MDP_OVL0] = MT8195_MUTEX_MOD_MDP_OVL0,
524+
[MUTEX_MOD_IDX_MDP_PAD0] = MT8195_MUTEX_MOD_MDP_PAD0,
525+
[MUTEX_MOD_IDX_MDP_PAD2] = MT8195_MUTEX_MOD_MDP_PAD2,
526+
[MUTEX_MOD_IDX_MDP_PAD3] = MT8195_MUTEX_MOD_MDP_PAD3,
527+
[MUTEX_MOD_IDX_MDP_WROT0] = MT8195_MUTEX_MOD_MDP_WROT0,
528+
[MUTEX_MOD_IDX_MDP_WROT2] = MT8195_MUTEX_MOD_MDP_WROT2,
529+
[MUTEX_MOD_IDX_MDP_WROT3] = MT8195_MUTEX_MOD_MDP_WROT3,
530+
};
531+
499532
static const unsigned int mt8192_mutex_mod[DDP_COMPONENT_ID_MAX] = {
500533
[DDP_COMPONENT_AAL0] = MT8192_MUTEX_MOD_DISP_AAL0,
501534
[DDP_COMPONENT_CCORR] = MT8192_MUTEX_MOD_DISP_CCORR0,
@@ -735,6 +768,13 @@ static const struct mtk_mutex_data mt8188_mutex_driver_data = {
735768
.mutex_sof_reg = MT8183_MUTEX0_SOF0,
736769
};
737770

771+
static const struct mtk_mutex_data mt8188_vpp_mutex_driver_data = {
772+
.mutex_sof = mt8188_mutex_sof,
773+
.mutex_mod_reg = MT8183_MUTEX0_MOD0,
774+
.mutex_sof_reg = MT8183_MUTEX0_SOF0,
775+
.mutex_table_mod = mt8188_mdp_mutex_table_mod,
776+
};
777+
738778
static const struct mtk_mutex_data mt8192_mutex_driver_data = {
739779
.mutex_mod = mt8192_mutex_mod,
740780
.mutex_sof = mt8183_mutex_sof,
@@ -1089,6 +1129,7 @@ static const struct of_device_id mutex_driver_dt_match[] = {
10891129
{ .compatible = "mediatek,mt8186-disp-mutex", .data = &mt8186_mutex_driver_data },
10901130
{ .compatible = "mediatek,mt8186-mdp3-mutex", .data = &mt8186_mdp_mutex_driver_data },
10911131
{ .compatible = "mediatek,mt8188-disp-mutex", .data = &mt8188_mutex_driver_data },
1132+
{ .compatible = "mediatek,mt8188-vpp-mutex", .data = &mt8188_vpp_mutex_driver_data },
10921133
{ .compatible = "mediatek,mt8192-disp-mutex", .data = &mt8192_mutex_driver_data },
10931134
{ .compatible = "mediatek,mt8195-disp-mutex", .data = &mt8195_mutex_driver_data },
10941135
{ .compatible = "mediatek,mt8195-vpp-mutex", .data = &mt8195_vpp_mutex_driver_data },

drivers/soc/mediatek/mtk-socinfo.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ static struct socinfo_data socinfo_data_table[] = {
4848
MTK_SOCINFO_ENTRY("MT8183", "MT8183V/AZA", "Kompanio 500", 0x00010043, 0x00000940),
4949
MTK_SOCINFO_ENTRY("MT8186", "MT8186GV/AZA", "Kompanio 520", 0x81861001, CELL_NOT_USED),
5050
MTK_SOCINFO_ENTRY("MT8186T", "MT8186TV/AZA", "Kompanio 528", 0x81862001, CELL_NOT_USED),
51-
MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/AZA", "Kompanio 830", 0x81880000, 0x00000010),
52-
MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/HZA", "Kompanio 830", 0x81880000, 0x00000011),
51+
MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/AZA", "Kompanio 838", 0x81880000, 0x00000010),
52+
MTK_SOCINFO_ENTRY("MT8188", "MT8188GV/HZA", "Kompanio 838", 0x81880000, 0x00000011),
5353
MTK_SOCINFO_ENTRY("MT8192", "MT8192V/AZA", "Kompanio 820", 0x00001100, 0x00040080),
5454
MTK_SOCINFO_ENTRY("MT8192T", "MT8192V/ATZA", "Kompanio 828", 0x00000100, 0x000400C0),
5555
MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EZA", "Kompanio 1200", 0x81950300, CELL_NOT_USED),
5656
MTK_SOCINFO_ENTRY("MT8195", "MT8195GV/EHZA", "Kompanio 1200", 0x81950304, CELL_NOT_USED),
5757
MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EZA", "Kompanio 1380", 0x81950400, CELL_NOT_USED),
5858
MTK_SOCINFO_ENTRY("MT8195", "MT8195TV/EHZA", "Kompanio 1380", 0x81950404, CELL_NOT_USED),
59+
MTK_SOCINFO_ENTRY("MT8395", "MT8395AV/ZA", "Genio 1200", 0x83950100, CELL_NOT_USED),
5960
};
6061

6162
static int mtk_socinfo_create_socinfo_node(struct mtk_socinfo *mtk_socinfop)
@@ -144,7 +145,14 @@ static int mtk_socinfo_get_socinfo_data(struct mtk_socinfo *mtk_socinfop)
144145
}
145146
}
146147

147-
return match_socinfo_index >= 0 ? match_socinfo_index : -ENOENT;
148+
if (match_socinfo_index < 0) {
149+
dev_warn(mtk_socinfop->dev,
150+
"Unknown MediaTek SoC with ID 0x%08x 0x%08x\n",
151+
cell_data[0], cell_data[1]);
152+
return -ENOENT;
153+
}
154+
155+
return match_socinfo_index;
148156
}
149157

150158
static int mtk_socinfo_probe(struct platform_device *pdev)

0 commit comments

Comments
 (0)