public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH 04/10] [media] coda: fix FMO value setting for CodaDx6
       [not found] ` <1379582036-4840-5-git-send-email-p.zabel@pengutronix.de>
@ 2013-09-30 11:48   ` Hans Verkuil
  2013-09-30 13:23     ` Philipp Zabel
  0 siblings, 1 reply; 5+ messages in thread
From: Hans Verkuil @ 2013-09-30 11:48 UTC (permalink / raw)
  To: Philipp Zabel
  Cc: linux-media, Mauro Carvalho Chehab, Kamil Debski, Javier Martin,
	Hans Verkuil, kernel

On 09/19/2013 11:13 AM, Philipp Zabel wrote:
> The register is only written on CodaDx6, so the temporary variable
> to be written only needs to be initialized on CodaDx6.
> 
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>  drivers/media/platform/coda.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> index 53539c1..e8acff3 100644
> --- a/drivers/media/platform/coda.c
> +++ b/drivers/media/platform/coda.c
> @@ -2074,10 +2074,10 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
>  	coda_setup_iram(ctx);
>  
>  	if (dst_fourcc == V4L2_PIX_FMT_H264) {
> -		value  = (FMO_SLICE_SAVE_BUF_SIZE << 7);
> -		value |= (0 & CODA_FMOPARAM_TYPE_MASK) << CODA_FMOPARAM_TYPE_OFFSET;
> -		value |=  0 & CODA_FMOPARAM_SLICENUM_MASK;
>  		if (dev->devtype->product == CODA_DX6) {
> +			value  = (FMO_SLICE_SAVE_BUF_SIZE << 7);
> +			value |= (0 & CODA_FMOPARAM_TYPE_MASK) << CODA_FMOPARAM_TYPE_OFFSET;
> +			value |=  0 & CODA_FMOPARAM_SLICENUM_MASK;

0 & CODA_FMOPARAM_SLICENUM_MASK?

These last two lines evaluate to a nop, so that looks very weird. Is this a bug?

Regards,

	Hans

>  			coda_write(dev, value, CODADX6_CMD_ENC_SEQ_FMO);
>  		} else {
>  			coda_write(dev, ctx->iram_info.search_ram_paddr,
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 07/10] [media] coda: prefix v4l2_ioctl_ops with coda_
       [not found] ` <1379582036-4840-8-git-send-email-p.zabel@pengutronix.de>
@ 2013-09-30 11:50   ` Hans Verkuil
  2013-09-30 13:23     ` Philipp Zabel
  0 siblings, 1 reply; 5+ messages in thread
From: Hans Verkuil @ 2013-09-30 11:50 UTC (permalink / raw)
  To: Philipp Zabel
  Cc: linux-media, Mauro Carvalho Chehab, Kamil Debski, Javier Martin,
	Hans Verkuil, kernel

On 09/19/2013 11:13 AM, Philipp Zabel wrote:
> Moving the ioctl handler callbacks into the coda namespace helps
> tremendously to make sense of backtraces.

I like the idea, but I would just use the coda_ prefix, not coda_vidioc_. In general
the prefix is either vidioc_ or the name of the driver, not both.

Regards,

	Hans

> 
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>  drivers/media/platform/coda.c | 123 +++++++++++++++++++++---------------------
>  1 file changed, 63 insertions(+), 60 deletions(-)
> 
> diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> index 4f038c2..9091664 100644
> --- a/drivers/media/platform/coda.c
> +++ b/drivers/media/platform/coda.c
> @@ -412,8 +412,8 @@ static char *coda_product_name(int product)
>  /*
>   * V4L2 ioctl() operations.
>   */
> -static int vidioc_querycap(struct file *file, void *priv,
> -			   struct v4l2_capability *cap)
> +static int coda_vidioc_querycap(struct file *file, void *priv,
> +				struct v4l2_capability *cap)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
> @@ -484,8 +484,8 @@ static int enum_fmt(void *priv, struct v4l2_fmtdesc *f,
>  	return -EINVAL;
>  }
>  
> -static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
> -				   struct v4l2_fmtdesc *f)
> +static int coda_vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
> +					struct v4l2_fmtdesc *f)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	struct vb2_queue *src_vq;
> @@ -503,13 +503,14 @@ static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
>  	return enum_fmt(priv, f, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0);
>  }
>  
> -static int vidioc_enum_fmt_vid_out(struct file *file, void *priv,
> -				   struct v4l2_fmtdesc *f)
> +static int coda_vidioc_enum_fmt_vid_out(struct file *file, void *priv,
> +					struct v4l2_fmtdesc *f)
>  {
>  	return enum_fmt(priv, f, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0);
>  }
>  
> -static int vidioc_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
> +static int coda_vidioc_g_fmt(struct file *file, void *priv,
> +			     struct v4l2_format *f)
>  {
>  	struct vb2_queue *vq;
>  	struct coda_q_data *q_data;
> @@ -536,7 +537,7 @@ static int vidioc_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
>  	return 0;
>  }
>  
> -static int vidioc_try_fmt(struct coda_codec *codec, struct v4l2_format *f)
> +static int coda_vidioc_try_fmt(struct coda_codec *codec, struct v4l2_format *f)
>  {
>  	unsigned int max_w, max_h;
>  	enum v4l2_field field;
> @@ -575,8 +576,8 @@ static int vidioc_try_fmt(struct coda_codec *codec, struct v4l2_format *f)
>  	return 0;
>  }
>  
> -static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
> -				  struct v4l2_format *f)
> +static int coda_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
> +				       struct v4l2_format *f)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	struct coda_codec *codec;
> @@ -604,7 +605,7 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
>  
>  	f->fmt.pix.colorspace = ctx->colorspace;
>  
> -	ret = vidioc_try_fmt(codec, f);
> +	ret = coda_vidioc_try_fmt(codec, f);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -620,8 +621,8 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
>  	return 0;
>  }
>  
> -static int vidioc_try_fmt_vid_out(struct file *file, void *priv,
> -				  struct v4l2_format *f)
> +static int coda_vidioc_try_fmt_vid_out(struct file *file, void *priv,
> +				       struct v4l2_format *f)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	struct coda_codec *codec;
> @@ -633,10 +634,10 @@ static int vidioc_try_fmt_vid_out(struct file *file, void *priv,
>  	if (!f->fmt.pix.colorspace)
>  		f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709;
>  
> -	return vidioc_try_fmt(codec, f);
> +	return coda_vidioc_try_fmt(codec, f);
>  }
>  
> -static int vidioc_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f)
> +static int coda_vidioc_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f)
>  {
>  	struct coda_q_data *q_data;
>  	struct vb2_queue *vq;
> @@ -666,61 +667,62 @@ static int vidioc_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f)
>  	return 0;
>  }
>  
> -static int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
> -				struct v4l2_format *f)
> +static int coda_vidioc_s_fmt_vid_cap(struct file *file, void *priv,
> +				     struct v4l2_format *f)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	int ret;
>  
> -	ret = vidioc_try_fmt_vid_cap(file, priv, f);
> +	ret = coda_vidioc_try_fmt_vid_cap(file, priv, f);
>  	if (ret)
>  		return ret;
>  
> -	return vidioc_s_fmt(ctx, f);
> +	return coda_vidioc_s_fmt(ctx, f);
>  }
>  
> -static int vidioc_s_fmt_vid_out(struct file *file, void *priv,
> -				struct v4l2_format *f)
> +static int coda_vidioc_s_fmt_vid_out(struct file *file, void *priv,
> +				     struct v4l2_format *f)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	int ret;
>  
> -	ret = vidioc_try_fmt_vid_out(file, priv, f);
> +	ret = coda_vidioc_try_fmt_vid_out(file, priv, f);
>  	if (ret)
>  		return ret;
>  
> -	ret = vidioc_s_fmt(ctx, f);
> +	ret = coda_vidioc_s_fmt(ctx, f);
>  	if (ret)
>  		ctx->colorspace = f->fmt.pix.colorspace;
>  
>  	return ret;
>  }
>  
> -static int vidioc_reqbufs(struct file *file, void *priv,
> -			  struct v4l2_requestbuffers *reqbufs)
> +static int coda_vidioc_reqbufs(struct file *file, void *priv,
> +			       struct v4l2_requestbuffers *reqbufs)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
>  	return v4l2_m2m_reqbufs(file, ctx->m2m_ctx, reqbufs);
>  }
>  
> -static int vidioc_querybuf(struct file *file, void *priv,
> -			   struct v4l2_buffer *buf)
> +static int coda_vidioc_querybuf(struct file *file, void *priv,
> +				struct v4l2_buffer *buf)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
>  	return v4l2_m2m_querybuf(file, ctx->m2m_ctx, buf);
>  }
>  
> -static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
> +static int coda_vidioc_qbuf(struct file *file, void *priv,
> +			    struct v4l2_buffer *buf)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
>  	return v4l2_m2m_qbuf(file, ctx->m2m_ctx, buf);
>  }
>  
> -static int vidioc_expbuf(struct file *file, void *priv,
> -			 struct v4l2_exportbuffer *eb)
> +static int coda_vidioc_expbuf(struct file *file, void *priv,
> +			      struct v4l2_exportbuffer *eb)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
> @@ -738,7 +740,8 @@ static bool coda_buf_is_end_of_stream(struct coda_ctx *ctx,
>  		(buf->sequence == (ctx->qsequence - 1)));
>  }
>  
> -static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
> +static int coda_vidioc_dqbuf(struct file *file, void *priv,
> +			     struct v4l2_buffer *buf)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	int ret;
> @@ -758,24 +761,24 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
>  	return ret;
>  }
>  
> -static int vidioc_create_bufs(struct file *file, void *priv,
> -			      struct v4l2_create_buffers *create)
> +static int coda_vidioc_create_bufs(struct file *file, void *priv,
> +				   struct v4l2_create_buffers *create)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
>  	return v4l2_m2m_create_bufs(file, ctx->m2m_ctx, create);
>  }
>  
> -static int vidioc_streamon(struct file *file, void *priv,
> -			   enum v4l2_buf_type type)
> +static int coda_vidioc_streamon(struct file *file, void *priv,
> +				enum v4l2_buf_type type)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  
>  	return v4l2_m2m_streamon(file, ctx->m2m_ctx, type);
>  }
>  
> -static int vidioc_streamoff(struct file *file, void *priv,
> -			    enum v4l2_buf_type type)
> +static int coda_vidioc_streamoff(struct file *file, void *priv,
> +				 enum v4l2_buf_type type)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(priv);
>  	int ret;
> @@ -792,8 +795,8 @@ static int vidioc_streamoff(struct file *file, void *priv,
>  	return ret;
>  }
>  
> -static int vidioc_decoder_cmd(struct file *file, void *fh,
> -			      struct v4l2_decoder_cmd *dc)
> +static int coda_vidioc_decoder_cmd(struct file *file, void *fh,
> +				   struct v4l2_decoder_cmd *dc)
>  {
>  	struct coda_ctx *ctx = fh_to_ctx(fh);
>  
> @@ -816,8 +819,8 @@ static int vidioc_decoder_cmd(struct file *file, void *fh,
>  	return 0;
>  }
>  
> -static int vidioc_subscribe_event(struct v4l2_fh *fh,
> -				  const struct v4l2_event_subscription *sub)
> +static int coda_vidioc_subscribe_event(struct v4l2_fh *fh,
> +				       const struct v4l2_event_subscription *sub)
>  {
>  	switch (sub->type) {
>  	case V4L2_EVENT_EOS:
> @@ -828,32 +831,32 @@ static int vidioc_subscribe_event(struct v4l2_fh *fh,
>  }
>  
>  static const struct v4l2_ioctl_ops coda_ioctl_ops = {
> -	.vidioc_querycap	= vidioc_querycap,
> +	.vidioc_querycap	= coda_vidioc_querycap,
>  
> -	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
> -	.vidioc_g_fmt_vid_cap	= vidioc_g_fmt,
> -	.vidioc_try_fmt_vid_cap	= vidioc_try_fmt_vid_cap,
> -	.vidioc_s_fmt_vid_cap	= vidioc_s_fmt_vid_cap,
> +	.vidioc_enum_fmt_vid_cap = coda_vidioc_enum_fmt_vid_cap,
> +	.vidioc_g_fmt_vid_cap	= coda_vidioc_g_fmt,
> +	.vidioc_try_fmt_vid_cap	= coda_vidioc_try_fmt_vid_cap,
> +	.vidioc_s_fmt_vid_cap	= coda_vidioc_s_fmt_vid_cap,
>  
> -	.vidioc_enum_fmt_vid_out = vidioc_enum_fmt_vid_out,
> -	.vidioc_g_fmt_vid_out	= vidioc_g_fmt,
> -	.vidioc_try_fmt_vid_out	= vidioc_try_fmt_vid_out,
> -	.vidioc_s_fmt_vid_out	= vidioc_s_fmt_vid_out,
> +	.vidioc_enum_fmt_vid_out = coda_vidioc_enum_fmt_vid_out,
> +	.vidioc_g_fmt_vid_out	= coda_vidioc_g_fmt,
> +	.vidioc_try_fmt_vid_out	= coda_vidioc_try_fmt_vid_out,
> +	.vidioc_s_fmt_vid_out	= coda_vidioc_s_fmt_vid_out,
>  
> -	.vidioc_reqbufs		= vidioc_reqbufs,
> -	.vidioc_querybuf	= vidioc_querybuf,
> +	.vidioc_reqbufs		= coda_vidioc_reqbufs,
> +	.vidioc_querybuf	= coda_vidioc_querybuf,
>  
> -	.vidioc_qbuf		= vidioc_qbuf,
> -	.vidioc_expbuf		= vidioc_expbuf,
> -	.vidioc_dqbuf		= vidioc_dqbuf,
> -	.vidioc_create_bufs	= vidioc_create_bufs,
> +	.vidioc_qbuf		= coda_vidioc_qbuf,
> +	.vidioc_expbuf		= coda_vidioc_expbuf,
> +	.vidioc_dqbuf		= coda_vidioc_dqbuf,
> +	.vidioc_create_bufs	= coda_vidioc_create_bufs,
>  
> -	.vidioc_streamon	= vidioc_streamon,
> -	.vidioc_streamoff	= vidioc_streamoff,
> +	.vidioc_streamon	= coda_vidioc_streamon,
> +	.vidioc_streamoff	= coda_vidioc_streamoff,
>  
> -	.vidioc_decoder_cmd	= vidioc_decoder_cmd,
> +	.vidioc_decoder_cmd	= coda_vidioc_decoder_cmd,
>  
> -	.vidioc_subscribe_event = vidioc_subscribe_event,
> +	.vidioc_subscribe_event = coda_vidioc_subscribe_event,
>  	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
>  };
>  
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 10/10] [media] coda: v4l2-compliance fix: zero pixel format priv field
       [not found] ` <1379582036-4840-11-git-send-email-p.zabel@pengutronix.de>
@ 2013-09-30 11:52   ` Hans Verkuil
  0 siblings, 0 replies; 5+ messages in thread
From: Hans Verkuil @ 2013-09-30 11:52 UTC (permalink / raw)
  To: Philipp Zabel
  Cc: linux-media, Mauro Carvalho Chehab, Kamil Debski, Javier Martin,
	Hans Verkuil, kernel

On 09/19/2013 11:13 AM, Philipp Zabel wrote:
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>  drivers/media/platform/coda.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> index d15238a..6dec34d 100644
> --- a/drivers/media/platform/coda.c
> +++ b/drivers/media/platform/coda.c
> @@ -556,6 +556,7 @@ static int coda_vidioc_g_fmt(struct file *file, void *priv,
>  
>  	f->fmt.pix.sizeimage	= q_data->sizeimage;
>  	f->fmt.pix.colorspace	= ctx->colorspace;
> +	f->fmt.pix.priv		= 0;

This is cleared by the core code, so this isn't necessary.

>  
>  	return 0;
>  }
> @@ -613,6 +614,8 @@ static int coda_vidioc_try_fmt(struct coda_ctx *ctx, struct coda_codec *codec,
>  		BUG();
>  	}
>  
> +	f->fmt.pix.priv = 0;
> +

This is the only one that needs to be cleared manually, so this is fine.

Regards,

	Hans

>  	return 0;
>  }
>  
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 04/10] [media] coda: fix FMO value setting for CodaDx6
  2013-09-30 11:48   ` [PATCH 04/10] [media] coda: fix FMO value setting for CodaDx6 Hans Verkuil
@ 2013-09-30 13:23     ` Philipp Zabel
  0 siblings, 0 replies; 5+ messages in thread
From: Philipp Zabel @ 2013-09-30 13:23 UTC (permalink / raw)
  To: Hans Verkuil
  Cc: linux-media, Mauro Carvalho Chehab, Kamil Debski, Javier Martin,
	Hans Verkuil, kernel

Am Montag, den 30.09.2013, 13:48 +0200 schrieb Hans Verkuil:
> On 09/19/2013 11:13 AM, Philipp Zabel wrote:
> > The register is only written on CodaDx6, so the temporary variable
> > to be written only needs to be initialized on CodaDx6.
> > 
> > Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> > ---
> >  drivers/media/platform/coda.c | 6 +++---
> >  1 file changed, 3 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c
> > index 53539c1..e8acff3 100644
> > --- a/drivers/media/platform/coda.c
> > +++ b/drivers/media/platform/coda.c
> > @@ -2074,10 +2074,10 @@ static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
> >  	coda_setup_iram(ctx);
> >  
> >  	if (dst_fourcc == V4L2_PIX_FMT_H264) {
> > -		value  = (FMO_SLICE_SAVE_BUF_SIZE << 7);
> > -		value |= (0 & CODA_FMOPARAM_TYPE_MASK) << CODA_FMOPARAM_TYPE_OFFSET;
> > -		value |=  0 & CODA_FMOPARAM_SLICENUM_MASK;
> >  		if (dev->devtype->product == CODA_DX6) {
> > +			value  = (FMO_SLICE_SAVE_BUF_SIZE << 7);
> > +			value |= (0 & CODA_FMOPARAM_TYPE_MASK) << CODA_FMOPARAM_TYPE_OFFSET;
> > +			value |=  0 & CODA_FMOPARAM_SLICENUM_MASK;
> 
> 0 & CODA_FMOPARAM_SLICENUM_MASK?
> 
> These last two lines evaluate to a nop, so that looks very weird. Is this a bug?

I assume Javier added those for documentation purposes. The newer CODA
cores don't have the FMO configuration anymore. I'll remove the no-op
lines for now if he doesn't mind.

regards
Philipp


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 07/10] [media] coda: prefix v4l2_ioctl_ops with coda_
  2013-09-30 11:50   ` [PATCH 07/10] [media] coda: prefix v4l2_ioctl_ops with coda_ Hans Verkuil
@ 2013-09-30 13:23     ` Philipp Zabel
  0 siblings, 0 replies; 5+ messages in thread
From: Philipp Zabel @ 2013-09-30 13:23 UTC (permalink / raw)
  To: Hans Verkuil
  Cc: linux-media, Mauro Carvalho Chehab, Kamil Debski, Javier Martin,
	Hans Verkuil, kernel

Am Montag, den 30.09.2013, 13:50 +0200 schrieb Hans Verkuil:
> On 09/19/2013 11:13 AM, Philipp Zabel wrote:
> > Moving the ioctl handler callbacks into the coda namespace helps
> > tremendously to make sense of backtraces.
> 
> I like the idea, but I would just use the coda_ prefix, not coda_vidioc_. In general
> the prefix is either vidioc_ or the name of the driver, not both.

Thank you, I'll change this patch (and the following patches)
accordingly.

regards
Philipp


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-09-30 13:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <1379582036-4840-1-git-send-email-p.zabel@pengutronix.de>
     [not found] ` <1379582036-4840-5-git-send-email-p.zabel@pengutronix.de>
2013-09-30 11:48   ` [PATCH 04/10] [media] coda: fix FMO value setting for CodaDx6 Hans Verkuil
2013-09-30 13:23     ` Philipp Zabel
     [not found] ` <1379582036-4840-8-git-send-email-p.zabel@pengutronix.de>
2013-09-30 11:50   ` [PATCH 07/10] [media] coda: prefix v4l2_ioctl_ops with coda_ Hans Verkuil
2013-09-30 13:23     ` Philipp Zabel
     [not found] ` <1379582036-4840-11-git-send-email-p.zabel@pengutronix.de>
2013-09-30 11:52   ` [PATCH 10/10] [media] coda: v4l2-compliance fix: zero pixel format priv field Hans Verkuil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox