Message ID | 20240301144403.2977-5-jason-jh.lin@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add CMDQ API for upcoming ISP feature | expand |
Hi, Jason: On Fri, 2024-03-01 at 22:44 +0800, Jason-JH.Lin wrote: > Add cmdq_pkt_acquire_event() function to support CMDQ user making > an instruction for acquiring event. > > CMDQ users can use cmdq_pkt_acquire_event() and > cmdq_pkt_clear_event() > to acquire GCE event and release GCE event and achieve the MUTEX_LOCK > protection between GCE threads. I'm not clear what acquire do in detail. This is what I guess: cmdq_pkt_acquire_event() would wait for event to be cleared. After event is cleared, cmdq_pkt_acquire_event() would set event and keep executing next command. So the mutex would work like this cmdq_pkt_acquire_event() /* mutex lock */ /* critical secton */ cmdq_pkt_clear_event() /* mutex unlock */ If it's so, describe as detail as this. If not, describe how it do. As I know, GCE is single core, so multiple thread is served by single GCE, why need mutex lock? Regards, CK > > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> > --- > drivers/soc/mediatek/mtk-cmdq-helper.c | 15 +++++++++++++++ > include/linux/soc/mediatek/mtk-cmdq.h | 9 +++++++++ > 2 files changed, 24 insertions(+) > > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c > b/drivers/soc/mediatek/mtk-cmdq-helper.c > index 2e9fc9bb1183..0183b40a0eff 100644 > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c > @@ -342,6 +342,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 > event, bool clear) > } > EXPORT_SYMBOL(cmdq_pkt_wfe); > > +int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event) > +{ > + struct cmdq_instruction inst = {}; > + > + if (event >= CMDQ_MAX_EVENT) > + return -EINVAL; > + > + inst.op = CMDQ_CODE_WFE; > + inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE | > CMDQ_WFE_WAIT; > + inst.event = event; > + > + return cmdq_pkt_append_command(pkt, inst); > +} > +EXPORT_SYMBOL(cmdq_pkt_acquire_event); > + > int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) > { > struct cmdq_instruction inst = { {0} }; > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h > b/include/linux/soc/mediatek/mtk-cmdq.h > index 2fe9be240fbc..de93c0a8e8a9 100644 > --- a/include/linux/soc/mediatek/mtk-cmdq.h > +++ b/include/linux/soc/mediatek/mtk-cmdq.h > @@ -202,6 +202,15 @@ int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, > dma_addr_t src_addr, dma_addr_t dst_ > */ > int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear); > > +/** > + * cmdq_pkt_acquire_event() - append acquire event command to the > CMDQ packet > + * @pkt: the CMDQ packet > + * @event: the desired event to be acquired > + * > + * Return: 0 for success; else the error code is returned > + */ > +int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event); > + > /** > * cmdq_pkt_clear_event() - append clear event command to the CMDQ > packet > * @pkt: the CMDQ packet
Hi CK, Thanks for the reviews. On Mon, 2024-03-04 at 02:11 +0000, CK Hu (胡俊光) wrote: > Hi, Jason: > > On Fri, 2024-03-01 at 22:44 +0800, Jason-JH.Lin wrote: > > Add cmdq_pkt_acquire_event() function to support CMDQ user making > > an instruction for acquiring event. > > > > CMDQ users can use cmdq_pkt_acquire_event() and > > cmdq_pkt_clear_event() > > to acquire GCE event and release GCE event and achieve the > > MUTEX_LOCK > > protection between GCE threads. > > I'm not clear what acquire do in detail. This is what I guess: > > cmdq_pkt_acquire_event() would wait for event to be cleared. After > event is cleared, cmdq_pkt_acquire_event() would set event and keep > executing next command. So the mutex would work like this > > cmdq_pkt_acquire_event() /* mutex lock */ > > /* critical secton */ > > cmdq_pkt_clear_event() /* mutex unlock */ > > If it's so, describe as detail as this. If not, describe how it do. > Yes, they should be used like this. I'll add more description in commit message. > As I know, GCE is single core, so multiple thread is served by single > GCE, why need mutex lock? > Although GCE is single core, it will context switch to other GCE threads with the same priority. The context switch time is set to GCE_THR_SLOT_CYCLES during GCE initialization. So we have to use event_lock to protect HW resource if each cmdq_pkt in different thread may execute more than the context switch time. Regards, Jason-JH.Lin > Regards, > CK > > > > > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> > > --- > > drivers/soc/mediatek/mtk-cmdq-helper.c | 15 +++++++++++++++ > > include/linux/soc/mediatek/mtk-cmdq.h | 9 +++++++++ > > 2 files changed, 24 insertions(+) > > > > diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c > > b/drivers/soc/mediatek/mtk-cmdq-helper.c > > index 2e9fc9bb1183..0183b40a0eff 100644 > > --- a/drivers/soc/mediatek/mtk-cmdq-helper.c > > +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c > > @@ -342,6 +342,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 > > event, bool clear) > > } > > EXPORT_SYMBOL(cmdq_pkt_wfe); > > > > +int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event) > > +{ > > + struct cmdq_instruction inst = {}; > > + > > + if (event >= CMDQ_MAX_EVENT) > > + return -EINVAL; > > + > > + inst.op = CMDQ_CODE_WFE; > > + inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE | > > CMDQ_WFE_WAIT; > > + inst.event = event; > > + > > + return cmdq_pkt_append_command(pkt, inst); > > +} > > +EXPORT_SYMBOL(cmdq_pkt_acquire_event); > > + > > int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) > > { > > struct cmdq_instruction inst = { {0} }; > > diff --git a/include/linux/soc/mediatek/mtk-cmdq.h > > b/include/linux/soc/mediatek/mtk-cmdq.h > > index 2fe9be240fbc..de93c0a8e8a9 100644 > > --- a/include/linux/soc/mediatek/mtk-cmdq.h > > +++ b/include/linux/soc/mediatek/mtk-cmdq.h > > @@ -202,6 +202,15 @@ int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, > > dma_addr_t src_addr, dma_addr_t dst_ > > */ > > int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear); > > > > +/** > > + * cmdq_pkt_acquire_event() - append acquire event command to the > > CMDQ packet > > + * @pkt: the CMDQ packet > > + * @event: the desired event to be acquired > > + * > > + * Return: 0 for success; else the error code is returned > > + */ > > +int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event); > > + > > /** > > * cmdq_pkt_clear_event() - append clear event command to the CMDQ > > packet > > * @pkt: the CMDQ packet
diff --git a/drivers/soc/mediatek/mtk-cmdq-helper.c b/drivers/soc/mediatek/mtk-cmdq-helper.c index 2e9fc9bb1183..0183b40a0eff 100644 --- a/drivers/soc/mediatek/mtk-cmdq-helper.c +++ b/drivers/soc/mediatek/mtk-cmdq-helper.c @@ -342,6 +342,21 @@ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear) } EXPORT_SYMBOL(cmdq_pkt_wfe); +int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event) +{ + struct cmdq_instruction inst = {}; + + if (event >= CMDQ_MAX_EVENT) + return -EINVAL; + + inst.op = CMDQ_CODE_WFE; + inst.value = CMDQ_WFE_UPDATE | CMDQ_WFE_UPDATE_VALUE | CMDQ_WFE_WAIT; + inst.event = event; + + return cmdq_pkt_append_command(pkt, inst); +} +EXPORT_SYMBOL(cmdq_pkt_acquire_event); + int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) { struct cmdq_instruction inst = { {0} }; diff --git a/include/linux/soc/mediatek/mtk-cmdq.h b/include/linux/soc/mediatek/mtk-cmdq.h index 2fe9be240fbc..de93c0a8e8a9 100644 --- a/include/linux/soc/mediatek/mtk-cmdq.h +++ b/include/linux/soc/mediatek/mtk-cmdq.h @@ -202,6 +202,15 @@ int cmdq_pkt_mem_move(struct cmdq_pkt *pkt, dma_addr_t src_addr, dma_addr_t dst_ */ int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event, bool clear); +/** + * cmdq_pkt_acquire_event() - append acquire event command to the CMDQ packet + * @pkt: the CMDQ packet + * @event: the desired event to be acquired + * + * Return: 0 for success; else the error code is returned + */ +int cmdq_pkt_acquire_event(struct cmdq_pkt *pkt, u16 event); + /** * cmdq_pkt_clear_event() - append clear event command to the CMDQ packet * @pkt: the CMDQ packet
Add cmdq_pkt_acquire_event() function to support CMDQ user making an instruction for acquiring event. CMDQ users can use cmdq_pkt_acquire_event() and cmdq_pkt_clear_event() to acquire GCE event and release GCE event and achieve the MUTEX_LOCK protection between GCE threads. Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com> --- drivers/soc/mediatek/mtk-cmdq-helper.c | 15 +++++++++++++++ include/linux/soc/mediatek/mtk-cmdq.h | 9 +++++++++ 2 files changed, 24 insertions(+)