[Cbe-oss-dev] [PATCH 7/9] spufs: limit saving MFC_CNTL bits
Noguchi, Masato
Masato.Noguchi at jp.sony.com
Thu Aug 23 18:01:42 EST 2007
> From: HYEONSEUNG JANG [mailto:hs8848.jang at samsung.com]
> Subject: Re: Re: [Cbe-oss-dev] [PATCH 7/9] spufs: limit saving
MFC_CNTL bits
>
> It's good but I personally think that it's better to save or modify
CSA
> MFC_CNTL only inside the save_mfc_cntl() in some way for code
maintenance.
Actually, save_mfc_cntl() (Save step 8) is performed before stopping
SPU execution (save_spu_status(): Save step 11). Thus, SPU may issue
new DMA command and MFC_CNTL[Q] bit may be changed from "empty"
to "not empty" between save_mfc_cntl() and save_mfc_queues()(Save step
19).
Also, MFC_CNTL[Dh] is saved at save_mfc_decr() (Save step 12), because
of same reason.
M.Noguchi
> HS Jang.
>
> ------- Original Message -------
> Sender : Masato Noguchi<Masato.Noguchi at jp.sony.com>
> Date : Aug 23, 2007 15:12
> Title : Re: [Cbe-oss-dev] [PATCH 7/9] spufs: limit saving MFC_CNTL
bits
>
>
> "HYEONSEUNG JANG" <hs8848.jang at samsung.com> wrote:
> (2007/08/23 12:24)
>
> >
> >After applying the patch, It can causes the following behavior :
> >
> > In the saving step, save_mfc_cntl() always sets CSA MFC_CNTL[Q] to
be '0',
> > which means 'not empty' *ignoring current SPU MFC_CNTL[Q]*.
> > save_mfc_queues() checks current SPU MFC_CNTL[Q] to decide whether
to
> > save MFC queue context or not.
> >
> > In the restoring step, restore_mfc_queues() checks CSA MFC_CNTL[Q]
before
> > restoring MFC queue context.
> >
> > For example, when current SPU MFC_CNTL[Q] is 1, 'empty', in the
saving
> > step. it ends up restoring old, _garbage_, MFC queue in
> > restore_mfc_queues() because CSA MFC_CNTL[Q] is always 'not empty'
and
> > it can lead to wrong DMA being initiated after restoring step.
> >
>
> Surely. That's a problem.
> Thank you for pointing out it.
>
> >
> >I think we must save at least MFC_CNTL_DMA_QUEUES_EMPTY field like
the
> following.
> >( note that below patch should be applied after the original patch)
> >
> >
> >diff --git a/arch/powerpc/platforms/cell/spufs/switch.c
> b/arch/powerpc/platforms/cell/spufs/switch.c
> >index 27ffdae..d222355 100644
> >--- a/arch/powerpc/platforms/cell/spufs/switch.c
> >+++ b/arch/powerpc/platforms/cell/spufs/switch.c
> >@@ -194,6 +194,8 @@ static inline void save_mfc_cntl(struct spu_state
*csa,
> struct spu *spu)
> > }
> > break;
> > }
> >+
> >+ csa->priv2.mfc_control_RW |= in_be64(&priv2->mfc_control_RW)
&
> MFC_CNTL_DMA_QUEUES_EMPTY_MASK;
> > }
> >
> > static inline void save_spu_runcntl(struct spu_state *csa, struct
spu *spu)
> >
> >
>
>
> Um, I feel MFC_CNTL[Q] in a CSA should indicate wheter a DMA
> queue was saved to a CSA or not. How about this?
>
> Signed-off-by: Masato Noguchi <Masato.Noguchi at jp.sony.com>
> ---
> diff --git a/arch/powerpc/platforms/cell/spufs/switch.c
> b/arch/powerpc/platforms/cell/spufs/switch.c
> index 27ffdae..4eea86f 100644
> --- a/arch/powerpc/platforms/cell/spufs/switch.c
> +++ b/arch/powerpc/platforms/cell/spufs/switch.c
> @@ -329,10 +329,13 @@ static inline void save_mfc_queues(struct
spu_state *csa,
> struct spu *spu)
> int i;
>
> /* Save, Step 19:
> - * If MFC_Cntl[Se]=0 then save
> + * Update saved copy of CSA.MFC_CNTL[Q], and
> + * if MFC_Cntl[Q]=0 then save
> * MFC command queues.
> */
> - if ((in_be64(&priv2->mfc_control_RW) &
MFC_CNTL_DMA_QUEUES_EMPTY)
> == 0) {
> + if (in_be64(&priv2->mfc_control_RW) & MFC_CNTL_DMA_QUEUES_EMPTY)
{
> + csa->priv2.mfc_control_RW |= MFC_CNTL_DMA_QUEUES_EMPTY;
> + } else {
> for (i = 0; i < 8; i++) {
> csa->priv2.puq[i].mfc_cq_data0_RW =
> in_be64(&priv2->puq[i].mfc_cq_data0_RW);
>
>
>
>
>
More information about the cbe-oss-dev
mailing list