To support generating GCE write instructions using both pa_base and
subsys, the original cmdq_pkt_write() and cmdq_pkt_write_mask() have
been expanded into four new APIs:
- Replaced cmdq_pkt_write() to cmdq_pkt_write_pa() and
cmdq_pkt_write_subsys().
- Replaced cmdq_pkt_write_mask() to cmdq_pkt_write_mask_pa() and
cmdq_pkt_write_mask_subsys().
The original cmdq_pkt_write() and cmdq_pkt_write_mask() will be removed
after all CMDQ users have migrated to the new APIs.
Signed-off-by: Jason-JH Lin <jason-jh.lin@mediatek.com>
---
drivers/soc/mediatek/mtk-cmdq-helper.c | 41 +++++++++++++
include/linux/soc/mediatek/mtk-cmdq.h | 79 ++++++++++++++++++++++++++
2 files changed, 120 insertions(+)
diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
index 41e1997cdd53..7e86299213d8 100644
--- a/drivers/soc/mediatek/mtk-cmdq-helper.c
+++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
@@ -213,6 +213,26 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value)
}
EXPORT_SYMBOL(cmdq_pkt_write);
+int cmdq_pkt_write_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/, u32 pa_base,
+ u16 offset, u32 value)
+{
+ int err;
+
+ err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0, CMDQ_ADDR_HIGH(pa_base));
+ if (err < 0)
+ return err;
+
+ return cmdq_pkt_write_s_value(pkt, CMDQ_THR_SPR_IDX0, CMDQ_ADDR_LOW(offset), value);
+}
+EXPORT_SYMBOL(cmdq_pkt_write_pa);
+
+int cmdq_pkt_write_subsys(struct cmdq_pkt *pkt, u8 subsys, u32 pa_base /*unused*/,
+ u16 offset, u32 value)
+{
+ return cmdq_pkt_write(pkt, subsys, offset, value);
+}
+EXPORT_SYMBOL(cmdq_pkt_write_subsys);
+
int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
u16 offset, u32 value, u32 mask)
{
@@ -230,6 +250,27 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
}
EXPORT_SYMBOL(cmdq_pkt_write_mask);
+int cmdq_pkt_write_mask_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/, u32 pa_base,
+ u16 offset, u32 value, u32 mask)
+{
+ int err;
+
+ err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0, CMDQ_ADDR_HIGH(pa_base));
+ if (err < 0)
+ return err;
+
+ return cmdq_pkt_write_s_mask_value(pkt, CMDQ_THR_SPR_IDX0,
+ CMDQ_ADDR_LOW(offset), value, mask);
+}
+EXPORT_SYMBOL(cmdq_pkt_write_mask_pa);
+
+int cmdq_pkt_write_mask_subsys(struct cmdq_pkt *pkt, u8 subsys, u32 pa_base /*unused*/,
+ u16 offset, u32 value, u32 mask)
+{
+ return cmdq_pkt_write_mask(pkt, subsys, offset, value, mask);
+}
+EXPORT_SYMBOL(cmdq_pkt_write_mask_subsys);
+
int cmdq_pkt_read_s(struct cmdq_pkt *pkt, u16 high_addr_reg_idx, u16 addr_low,
u16 reg_idx)
{
diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h
index 3699229a7375..2055f194c6e9 100644
--- a/include/linux/soc/mediatek/mtk-cmdq.h
+++ b/include/linux/soc/mediatek/mtk-cmdq.h
@@ -124,6 +124,32 @@ void cmdq_pkt_destroy(struct cmdq_client *client, struct cmdq_pkt *pkt);
*/
int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
+/**
+ * cmdq_pkt_write_pa() - append write command to the CMDQ packet with pa_base
+ * @pkt: the CMDQ packet
+ * @subsys: unused parameter
+ * @pa_base: the physical address base of the hardware register
+ * @offset: register offset from CMDQ sub system
+ * @value: the specified target register value
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_write_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/,
+ u32 pa_base, u16 offset, u32 value);
+
+/**
+ * cmdq_pkt_write_subsys() - append write command to the CMDQ packet with subsys
+ * @pkt: the CMDQ packet
+ * @subsys: the CMDQ sub system code
+ * @pa_base: unused parameter
+ * @offset: register offset from CMDQ sub system
+ * @value: the specified target register value
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_write_subsys(struct cmdq_pkt *pkt, u8 subsys,
+ u32 pa_base /*unused*/, u16 offset, u32 value);
+
/**
* cmdq_pkt_write_mask() - append write command with mask to the CMDQ packet
* @pkt: the CMDQ packet
@@ -137,6 +163,34 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value);
int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
u16 offset, u32 value, u32 mask);
+/**
+ * cmdq_pkt_write_mask_pa() - append write command with mask to the CMDQ packet with pa
+ * @pkt: the CMDQ packet
+ * @subsys: unused parameter
+ * @pa_base: the physical address base of the hardware register
+ * @offset: register offset from CMDQ sub system
+ * @value: the specified target register value
+ * @mask: the specified target register mask
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_write_mask_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/,
+ u32 pa_base, u16 offset, u32 value, u32 mask);
+
+/**
+ * cmdq_pkt_write_mask_subsys() - append write command with mask to the CMDQ packet with subsys
+ * @pkt: the CMDQ packet
+ * @subsys: the CMDQ sub system code
+ * @pa_base: unused parameter
+ * @offset: register offset from CMDQ sub system
+ * @value: the specified target register value
+ * @mask: the specified target register mask
+ *
+ * Return: 0 for success; else the error code is returned
+ */
+int cmdq_pkt_write_mask_subsys(struct cmdq_pkt *pkt, u8 subsys,
+ u32 pa_base /*unused*/, u16 offset, u32 value, u32 mask);
+
/*
* cmdq_pkt_read_s() - append read_s command to the CMDQ packet
* @pkt: the CMDQ packet
@@ -424,12 +478,37 @@ static inline int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u3
return -ENOENT;
}
+static inline int cmdq_pkt_write_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/,
+ u32 pa_base, u16 offset, u32 value)
+{
+ return -ENOENT;
+}
+
+static inline int cmdq_pkt_write_subsys(struct cmdq_pkt *pkt, u8 subsys,
+ u32 pa_base /*unused*/, u16 offset, u32 value)
+{
+ return -ENOENT;
+}
+
static inline int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
u16 offset, u32 value, u32 mask)
{
return -ENOENT;
}
+static inline int cmdq_pkt_write_mask_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/,
+ u32 pa_base, u16 offset, u32 value, u32 mask)
+{
+ return -ENOENT;
+}
+
+static inline int cmdq_pkt_write_mask_subsys(struct cmdq_pkt *pkt, u8 subsys,
+ u32 pa_base /*unused*/, u16 offset,
+ u32 value, u32 mask)
+{
+ return -ENOENT;
+}
+
static inline int cmdq_pkt_read_s(struct cmdq_pkt *pkt, u16 high_addr_reg_idx,
u16 addr_low, u16 reg_idx)
{
--
2.43.0
Il 27/08/25 13:37, Jason-JH Lin ha scritto: > To support generating GCE write instructions using both pa_base and > subsys, the original cmdq_pkt_write() and cmdq_pkt_write_mask() have > been expanded into four new APIs: > - Replaced cmdq_pkt_write() to cmdq_pkt_write_pa() and > cmdq_pkt_write_subsys(). > - Replaced cmdq_pkt_write_mask() to cmdq_pkt_write_mask_pa() and > cmdq_pkt_write_mask_subsys(). > > The original cmdq_pkt_write() and cmdq_pkt_write_mask() will be removed > after all CMDQ users have migrated to the new APIs. > > Signed-off-by: Jason-JH Lin <jason-jh.lin@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
On Wed, 2025-08-27 at 19:37 +0800, Jason-JH Lin wrote:
> To support generating GCE write instructions using both pa_base and
> subsys, the original cmdq_pkt_write() and cmdq_pkt_write_mask() have
> been expanded into four new APIs:
> - Replaced cmdq_pkt_write() to cmdq_pkt_write_pa() and
> cmdq_pkt_write_subsys().
> - Replaced cmdq_pkt_write_mask() to cmdq_pkt_write_mask_pa() and
> cmdq_pkt_write_mask_subsys().
>
> The original cmdq_pkt_write() and cmdq_pkt_write_mask() will be removed
> after all CMDQ users have migrated to the new APIs.
>
> Signed-off-by: Jason-JH Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/soc/mediatek/mtk-cmdq-helper.c | 41 +++++++++++++
> include/linux/soc/mediatek/mtk-cmdq.h | 79 ++++++++++++++++++++++++++
> 2 files changed, 120 insertions(+)
>
> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c
> index 41e1997cdd53..7e86299213d8 100644
> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> @@ -213,6 +213,26 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value)
> }
> EXPORT_SYMBOL(cmdq_pkt_write);
>
> +int cmdq_pkt_write_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/, u32 pa_base,
> + u16 offset, u32 value)
subsys is useless. Drop it.
> +{
> + int err;
> +
> + err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0, CMDQ_ADDR_HIGH(pa_base));
> + if (err < 0)
> + return err;
> +
> + return cmdq_pkt_write_s_value(pkt, CMDQ_THR_SPR_IDX0, CMDQ_ADDR_LOW(offset), value);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_write_pa);
> +
> +int cmdq_pkt_write_subsys(struct cmdq_pkt *pkt, u8 subsys, u32 pa_base /*unused*/,
> + u16 offset, u32 value)
pa_base is useless. Drop it.
> +{
> + return cmdq_pkt_write(pkt, subsys, offset, value);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_write_subsys);
> +
> int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> u16 offset, u32 value, u32 mask)
> {
> @@ -230,6 +250,27 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> }
> EXPORT_SYMBOL(cmdq_pkt_write_mask);
>
> +int cmdq_pkt_write_mask_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/, u32 pa_base,
> + u16 offset, u32 value, u32 mask)
subsys is useless. Drop it.
> +{
> + int err;
> +
> + err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0, CMDQ_ADDR_HIGH(pa_base));
> + if (err < 0)
> + return err;
> +
> + return cmdq_pkt_write_s_mask_value(pkt, CMDQ_THR_SPR_IDX0,
> + CMDQ_ADDR_LOW(offset), value, mask);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_write_mask_pa);
> +
> +int cmdq_pkt_write_mask_subsys(struct cmdq_pkt *pkt, u8 subsys, u32 pa_base /*unused*/,
> + u16 offset, u32 value, u32 mask)
pa_base is useless. Drop it.
> +{
> + return cmdq_pkt_write_mask(pkt, subsys, offset, value, mask);
> +}
> +EXPORT_SYMBOL(cmdq_pkt_write_mask_subsys);
> +
On Fri, 2025-09-05 at 09:41 +0000, CK Hu (胡俊光) wrote:
> On Wed, 2025-08-27 at 19:37 +0800, Jason-JH Lin wrote:
> > To support generating GCE write instructions using both pa_base and
> > subsys, the original cmdq_pkt_write() and cmdq_pkt_write_mask()
> > have
> > been expanded into four new APIs:
> > - Replaced cmdq_pkt_write() to cmdq_pkt_write_pa() and
> > cmdq_pkt_write_subsys().
> > - Replaced cmdq_pkt_write_mask() to cmdq_pkt_write_mask_pa() and
> > cmdq_pkt_write_mask_subsys().
> >
> > The original cmdq_pkt_write() and cmdq_pkt_write_mask() will be
> > removed
> > after all CMDQ users have migrated to the new APIs.
> >
> > Signed-off-by: Jason-JH Lin <jason-jh.lin@mediatek.com>
> > ---
> > drivers/soc/mediatek/mtk-cmdq-helper.c | 41 +++++++++++++
> > include/linux/soc/mediatek/mtk-cmdq.h | 79
> > ++++++++++++++++++++++++++
> > 2 files changed, 120 insertions(+)
> >
> > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > index 41e1997cdd53..7e86299213d8 100644
> > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
> > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
> > @@ -213,6 +213,26 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8
> > subsys, u16 offset, u32 value)
> > }
> > EXPORT_SYMBOL(cmdq_pkt_write);
> >
> > +int cmdq_pkt_write_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/,
> > u32 pa_base,
> > + u16 offset, u32 value)
>
> subsys is useless. Drop it.
>
> > +{
> > + int err;
> > +
> > + err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0,
> > CMDQ_ADDR_HIGH(pa_base));
> > + if (err < 0)
> > + return err;
> > +
> > + return cmdq_pkt_write_s_value(pkt, CMDQ_THR_SPR_IDX0,
> > CMDQ_ADDR_LOW(offset), value);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_write_pa);
> > +
> > +int cmdq_pkt_write_subsys(struct cmdq_pkt *pkt, u8 subsys, u32
> > pa_base /*unused*/,
> > + u16 offset, u32 value)
>
> pa_base is useless. Drop it.
>
> > +{
> > + return cmdq_pkt_write(pkt, subsys, offset, value);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_write_subsys);
> > +
> > int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
> > u16 offset, u32 value, u32 mask)
> > {
> > @@ -230,6 +250,27 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt,
> > u8 subsys,
> > }
> > EXPORT_SYMBOL(cmdq_pkt_write_mask);
> >
> > +int cmdq_pkt_write_mask_pa(struct cmdq_pkt *pkt, u8 subsys
> > /*unused*/, u32 pa_base,
> > + u16 offset, u32 value, u32 mask)
>
> subsys is useless. Drop it.
>
> > +{
> > + int err;
> > +
> > + err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0,
> > CMDQ_ADDR_HIGH(pa_base));
> > + if (err < 0)
> > + return err;
> > +
> > + return cmdq_pkt_write_s_mask_value(pkt, CMDQ_THR_SPR_IDX0,
> > + CMDQ_ADDR_LOW(offset),
> > value, mask);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_write_mask_pa);
> > +
> > +int cmdq_pkt_write_mask_subsys(struct cmdq_pkt *pkt, u8 subsys,
> > u32 pa_base /*unused*/,
> > + u16 offset, u32 value, u32 mask)
>
> pa_base is useless. Drop it.
>
> > +{
> > + return cmdq_pkt_write_mask(pkt, subsys, offset, value,
> > mask);
> > +}
> > +EXPORT_SYMBOL(cmdq_pkt_write_mask_subsys);
> > +
Hi CK,
I'll drop the unused parameters.
Thanks for the reviews.
Regards,
Jason-JH Lin
Il 13/10/25 11:50, Jason-JH Lin (林睿祥) ha scritto:
> On Fri, 2025-09-05 at 09:41 +0000, CK Hu (胡俊光) wrote:
>> On Wed, 2025-08-27 at 19:37 +0800, Jason-JH Lin wrote:
>>> To support generating GCE write instructions using both pa_base and
>>> subsys, the original cmdq_pkt_write() and cmdq_pkt_write_mask()
>>> have
>>> been expanded into four new APIs:
>>> - Replaced cmdq_pkt_write() to cmdq_pkt_write_pa() and
>>> cmdq_pkt_write_subsys().
>>> - Replaced cmdq_pkt_write_mask() to cmdq_pkt_write_mask_pa() and
>>> cmdq_pkt_write_mask_subsys().
>>>
>>> The original cmdq_pkt_write() and cmdq_pkt_write_mask() will be
>>> removed
>>> after all CMDQ users have migrated to the new APIs.
>>>
>>> Signed-off-by: Jason-JH Lin <jason-jh.lin@mediatek.com>
>>> ---
>>> drivers/soc/mediatek/mtk-cmdq-helper.c | 41 +++++++++++++
>>> include/linux/soc/mediatek/mtk-cmdq.h | 79
>>> ++++++++++++++++++++++++++
>>> 2 files changed, 120 insertions(+)
>>>
>>> diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> b/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> index 41e1997cdd53..7e86299213d8 100644
>>> --- a/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c
>>> @@ -213,6 +213,26 @@ int cmdq_pkt_write(struct cmdq_pkt *pkt, u8
>>> subsys, u16 offset, u32 value)
>>> }
>>> EXPORT_SYMBOL(cmdq_pkt_write);
>>>
>>> +int cmdq_pkt_write_pa(struct cmdq_pkt *pkt, u8 subsys /*unused*/,
>>> u32 pa_base,
>>> + u16 offset, u32 value)
>>
>> subsys is useless. Drop it.
>>
>>> +{
>>> + int err;
>>> +
>>> + err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0,
>>> CMDQ_ADDR_HIGH(pa_base));
>>> + if (err < 0)
>>> + return err;
>>> +
>>> + return cmdq_pkt_write_s_value(pkt, CMDQ_THR_SPR_IDX0,
>>> CMDQ_ADDR_LOW(offset), value);
>>> +}
>>> +EXPORT_SYMBOL(cmdq_pkt_write_pa);
>>> +
>>> +int cmdq_pkt_write_subsys(struct cmdq_pkt *pkt, u8 subsys, u32
>>> pa_base /*unused*/,
>>> + u16 offset, u32 value)
>>
>> pa_base is useless. Drop it.
>>
>>> +{
>>> + return cmdq_pkt_write(pkt, subsys, offset, value);
>>> +}
>>> +EXPORT_SYMBOL(cmdq_pkt_write_subsys);
>>> +
>>> int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
>>> u16 offset, u32 value, u32 mask)
>>> {
>>> @@ -230,6 +250,27 @@ int cmdq_pkt_write_mask(struct cmdq_pkt *pkt,
>>> u8 subsys,
>>> }
>>> EXPORT_SYMBOL(cmdq_pkt_write_mask);
>>>
>>> +int cmdq_pkt_write_mask_pa(struct cmdq_pkt *pkt, u8 subsys
>>> /*unused*/, u32 pa_base,
>>> + u16 offset, u32 value, u32 mask)
>>
>> subsys is useless. Drop it.
>>
>>> +{
>>> + int err;
>>> +
>>> + err = cmdq_pkt_assign(pkt, CMDQ_THR_SPR_IDX0,
>>> CMDQ_ADDR_HIGH(pa_base));
>>> + if (err < 0)
>>> + return err;
>>> +
>>> + return cmdq_pkt_write_s_mask_value(pkt, CMDQ_THR_SPR_IDX0,
>>> + CMDQ_ADDR_LOW(offset),
>>> value, mask);
>>> +}
>>> +EXPORT_SYMBOL(cmdq_pkt_write_mask_pa);
>>> +
>>> +int cmdq_pkt_write_mask_subsys(struct cmdq_pkt *pkt, u8 subsys,
>>> u32 pa_base /*unused*/,
>>> + u16 offset, u32 value, u32 mask)
>>
>> pa_base is useless. Drop it.
>>
>>> +{
>>> + return cmdq_pkt_write_mask(pkt, subsys, offset, value,
>>> mask);
>>> +}
>>> +EXPORT_SYMBOL(cmdq_pkt_write_mask_subsys);
>>> +
>
> Hi CK,
>
> I'll drop the unused parameters.
> Thanks for the reviews.
It's unused, but if we want to use function pointers we do need those.
Unless you want to use one variable for both things, which then becomes
kind of janky and unreadable.
Cheers,
Angelo
>
> Regards,
> Jason-JH Lin
© 2016 - 2026 Red Hat, Inc.