From: Mathieu Poirier <mathieu.poirier@linaro.org> To: nikita.shubin@maquefel.me Cc: Nikita Shubin <NShubin@topcon.com>, Ohad Ben-Cohen <ohad@wizery.com>, Bjorn Andersson <bjorn.andersson@linaro.org>, Shawn Guo <shawnguo@kernel.org>, Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix Kernel Team <kernel@pengutronix.de>, Fabio Estevam <festevam@gmail.com>, NXP Linux Team <linux-imx@nxp.com>, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 2/3] remoteproc: imx_rproc: mailbox support Date: Tue, 14 Apr 2020 11:20:05 -0600 [thread overview] Message-ID: <20200414172004.GB24061@xps15> (raw) In-Reply-To: <20200406113310.3041-3-nikita.shubin@maquefel.me> On Mon, Apr 06, 2020 at 02:33:09PM +0300, nikita.shubin@maquefel.me wrote: > Add support for mailboxes to imx_rproc > > Signed-off-by: Nikita Shubin <NShubin@topcon.com> > --- > drivers/remoteproc/Kconfig | 2 + > drivers/remoteproc/imx_rproc.c | 142 ++++++++++++++++++++++++++++++++- > 2 files changed, 143 insertions(+), 1 deletion(-) > > diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig > index 94afdde4bc9f..02d23a54c9cf 100644 > --- a/drivers/remoteproc/Kconfig > +++ b/drivers/remoteproc/Kconfig > @@ -17,6 +17,8 @@ if REMOTEPROC > config IMX_REMOTEPROC > tristate "IMX6/7 remoteproc support" > depends on ARCH_MXC > + select MAILBOX > + select IMX_MBOX > help > Say y here to support iMX's remote processors (Cortex M4 > on iMX7D) via the remote processor framework. > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > index bebc58d0f711..d2bede4ccb70 100644 > --- a/drivers/remoteproc/imx_rproc.c > +++ b/drivers/remoteproc/imx_rproc.c > @@ -14,6 +14,9 @@ > #include <linux/platform_device.h> > #include <linux/regmap.h> > #include <linux/remoteproc.h> > +#include <linux/mailbox_client.h> > + > +#include "remoteproc_internal.h" > > #define IMX7D_SRC_SCR 0x0C > #define IMX7D_ENABLE_M4 BIT(3) > @@ -47,6 +50,12 @@ > > #define IMX_BOOT_PC 0x4 > > +#define IMX_MBOX_NB_VQ 2 > +#define IMX_MBOX_NB_MBX 2 Please align this. > + > +#define IMX_MBX_VQ0 "vq0" > +#define IMX_MBX_VQ1 "vq1" > + > /** > * struct imx_rproc_mem - slim internal memory structure > * @cpu_addr: MPU virtual address of the memory region > @@ -80,6 +89,14 @@ struct imx_rproc_dcfg { > size_t att_size; > }; > > +struct imx_mbox { > + const unsigned char name[10]; > + struct mbox_chan *chan; > + struct mbox_client client; > + struct work_struct vq_work; > + int vq_id; > +}; > + > struct imx_rproc { > struct device *dev; > struct regmap *regmap; > @@ -88,6 +105,8 @@ struct imx_rproc { > struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX]; > struct clk *clk; > void __iomem *bootreg; > + struct imx_mbox mb[IMX_MBOX_NB_MBX]; > + struct workqueue_struct *workqueue; > }; > > static const struct imx_rproc_att imx_rproc_att_imx7d[] = { > @@ -251,10 +270,118 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, int len) > return va; > } > > +static void imx_rproc_mb_vq_work(struct work_struct *work) > +{ > + struct imx_mbox *mb = container_of(work, struct imx_mbox, vq_work); > + struct rproc *rproc = dev_get_drvdata(mb->client.dev); > + > + if (rproc_vq_interrupt(rproc, mb->vq_id) == IRQ_NONE) > + dev_dbg(&rproc->dev, "no message found in vq%d\n", mb->vq_id); > +} > + > +static void imx_rproc_mb_callback(struct mbox_client *cl, void *data) > +{ > + struct rproc *rproc = dev_get_drvdata(cl->dev); > + struct imx_mbox *mb = container_of(cl, struct imx_mbox, client); > + struct imx_rproc *ddata = rproc->priv; > + > + queue_work(ddata->workqueue, &mb->vq_work); > +} > + > +static const struct imx_mbox imx_rproc_mbox[IMX_MBOX_NB_MBX] = { > + { > + .name = IMX_MBX_VQ0, > + .vq_id = 0, > + .client = { > + .rx_callback = imx_rproc_mb_callback, > + .tx_block = false, > + }, > + }, > + { > + .name = IMX_MBX_VQ1, > + .vq_id = 1, > + .client = { > + .rx_callback = imx_rproc_mb_callback, > + .tx_block = false, > + }, > + }, > +}; > + > +static void imx_rproc_request_mbox(struct rproc *rproc) > +{ > + struct imx_rproc *ddata = rproc->priv; > + struct device *dev = &rproc->dev; > + unsigned int i; > + const unsigned char *name; > + struct mbox_client *cl; > + > + /* Initialise mailbox structure table */ > + memcpy(ddata->mb, imx_rproc_mbox, sizeof(imx_rproc_mbox)); > + > + for (i = 0; i < IMX_MBOX_NB_MBX; i++) { > + name = ddata->mb[i].name; > + > + cl = &ddata->mb[i].client; > + cl->dev = dev->parent; > + > + ddata->mb[i].chan = mbox_request_channel_byname(cl, name); > + > + dev_dbg(dev, "%s: name=%s, idx=%u\n", > + __func__, name, ddata->mb[i].vq_id); > + > + if (IS_ERR(ddata->mb[i].chan)) { > + dev_warn(dev, "cannot get %s mbox\n", name); > + ddata->mb[i].chan = NULL; If the mailbox isn't ready this driver will fail without a chance of recovery. Since most of the code in this patch is a carbon copy of the implementation found in stm32_proc.c, I suggest you do the same as they did in stm32_rproc_request_mbox() and privision for cases where requesting a channel returns -EPROBE_DEFER. > + } > + > + if (ddata->mb[i].vq_id >= 0) > + INIT_WORK(&ddata->mb[i].vq_work, imx_rproc_mb_vq_work); > + } > +} > + > +static void imx_rproc_free_mbox(struct rproc *rproc) > +{ > + struct imx_rproc *ddata = rproc->priv; > + unsigned int i; > + > + dev_dbg(&rproc->dev, "%s: %d boxes\n", > + __func__, ARRAY_SIZE(ddata->mb)); > + > + for (i = 0; i < ARRAY_SIZE(ddata->mb); i++) { > + if (ddata->mb[i].chan) > + mbox_free_channel(ddata->mb[i].chan); > + ddata->mb[i].chan = NULL; > + } > +} > + > +static void imx_rproc_kick(struct rproc *rproc, int vqid) > +{ > + struct imx_rproc *ddata = rproc->priv; > + unsigned int i; > + int err; > + > + if (WARN_ON(vqid >= IMX_MBOX_NB_VQ)) > + return; > + > + for (i = 0; i < IMX_MBOX_NB_MBX; i++) { > + if (vqid != ddata->mb[i].vq_id) > + continue; > + if (!ddata->mb[i].chan) > + return; > + dev_dbg(&rproc->dev, "sending message : vqid = %d\n", vqid); > + err = mbox_send_message(ddata->mb[i].chan, &vqid); > + if (err < 0) > + dev_err(&rproc->dev, "%s: failed (%s, err:%d)\n", > + __func__, ddata->mb[i].name, err); > + return; > + } > +} > + > static const struct rproc_ops imx_rproc_ops = { > .start = imx_rproc_start, > .stop = imx_rproc_stop, > .da_to_va = imx_rproc_da_to_va, > + .kick = imx_rproc_kick, > .get_boot_addr = rproc_elf_get_boot_addr, > }; > > @@ -384,14 +511,26 @@ static int imx_rproc_probe(struct platform_device *pdev) > goto err_put_rproc; > } > > + priv->workqueue = create_workqueue(dev_name(dev)); > + if (!priv->workqueue) { > + dev_err(dev, "cannot create workqueue\n"); > + ret = -ENOMEM; > + goto err_put_clk; > + } > + > + imx_rproc_request_mbox(rproc); > + > ret = rproc_add(rproc); > if (ret) { > dev_err(dev, "rproc_add failed\n"); > - goto err_put_clk; > + goto err_free_mb; > } > > return 0; > > +err_free_mb: > + imx_rproc_free_mbox(rproc); > + destroy_workqueue(priv->workqueue); > err_put_clk: > clk_disable_unprepare(priv->clk); > err_put_rproc: > @@ -407,6 +546,7 @@ static int imx_rproc_remove(struct platform_device *pdev) > > clk_disable_unprepare(priv->clk); > rproc_del(rproc); > + imx_rproc_free_mbox(rproc); I have no issues with people reusing code already found in the kernel - in fact I encourage it because it makes reviewing patches much easier. On the flip side you have to give credit where it is due. Here adding a line in the changelog that mentions where you took your inspiration from will be much appreciated. Thanks, Mathieu > rproc_free(rproc); > > return 0; > -- > 2.25.1 >
WARNING: multiple messages have this Message-ID (diff)
From: Mathieu Poirier <mathieu.poirier@linaro.org> To: nikita.shubin@maquefel.me Cc: Ohad Ben-Cohen <ohad@wizery.com>, Fabio Estevam <festevam@gmail.com>, Nikita Shubin <NShubin@topcon.com>, Sascha Hauer <s.hauer@pengutronix.de>, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, Bjorn Andersson <bjorn.andersson@linaro.org>, NXP Linux Team <linux-imx@nxp.com>, Pengutronix Kernel Team <kernel@pengutronix.de>, Shawn Guo <shawnguo@kernel.org>, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 2/3] remoteproc: imx_rproc: mailbox support Date: Tue, 14 Apr 2020 11:20:05 -0600 [thread overview] Message-ID: <20200414172004.GB24061@xps15> (raw) In-Reply-To: <20200406113310.3041-3-nikita.shubin@maquefel.me> On Mon, Apr 06, 2020 at 02:33:09PM +0300, nikita.shubin@maquefel.me wrote: > Add support for mailboxes to imx_rproc > > Signed-off-by: Nikita Shubin <NShubin@topcon.com> > --- > drivers/remoteproc/Kconfig | 2 + > drivers/remoteproc/imx_rproc.c | 142 ++++++++++++++++++++++++++++++++- > 2 files changed, 143 insertions(+), 1 deletion(-) > > diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig > index 94afdde4bc9f..02d23a54c9cf 100644 > --- a/drivers/remoteproc/Kconfig > +++ b/drivers/remoteproc/Kconfig > @@ -17,6 +17,8 @@ if REMOTEPROC > config IMX_REMOTEPROC > tristate "IMX6/7 remoteproc support" > depends on ARCH_MXC > + select MAILBOX > + select IMX_MBOX > help > Say y here to support iMX's remote processors (Cortex M4 > on iMX7D) via the remote processor framework. > diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c > index bebc58d0f711..d2bede4ccb70 100644 > --- a/drivers/remoteproc/imx_rproc.c > +++ b/drivers/remoteproc/imx_rproc.c > @@ -14,6 +14,9 @@ > #include <linux/platform_device.h> > #include <linux/regmap.h> > #include <linux/remoteproc.h> > +#include <linux/mailbox_client.h> > + > +#include "remoteproc_internal.h" > > #define IMX7D_SRC_SCR 0x0C > #define IMX7D_ENABLE_M4 BIT(3) > @@ -47,6 +50,12 @@ > > #define IMX_BOOT_PC 0x4 > > +#define IMX_MBOX_NB_VQ 2 > +#define IMX_MBOX_NB_MBX 2 Please align this. > + > +#define IMX_MBX_VQ0 "vq0" > +#define IMX_MBX_VQ1 "vq1" > + > /** > * struct imx_rproc_mem - slim internal memory structure > * @cpu_addr: MPU virtual address of the memory region > @@ -80,6 +89,14 @@ struct imx_rproc_dcfg { > size_t att_size; > }; > > +struct imx_mbox { > + const unsigned char name[10]; > + struct mbox_chan *chan; > + struct mbox_client client; > + struct work_struct vq_work; > + int vq_id; > +}; > + > struct imx_rproc { > struct device *dev; > struct regmap *regmap; > @@ -88,6 +105,8 @@ struct imx_rproc { > struct imx_rproc_mem mem[IMX7D_RPROC_MEM_MAX]; > struct clk *clk; > void __iomem *bootreg; > + struct imx_mbox mb[IMX_MBOX_NB_MBX]; > + struct workqueue_struct *workqueue; > }; > > static const struct imx_rproc_att imx_rproc_att_imx7d[] = { > @@ -251,10 +270,118 @@ static void *imx_rproc_da_to_va(struct rproc *rproc, u64 da, int len) > return va; > } > > +static void imx_rproc_mb_vq_work(struct work_struct *work) > +{ > + struct imx_mbox *mb = container_of(work, struct imx_mbox, vq_work); > + struct rproc *rproc = dev_get_drvdata(mb->client.dev); > + > + if (rproc_vq_interrupt(rproc, mb->vq_id) == IRQ_NONE) > + dev_dbg(&rproc->dev, "no message found in vq%d\n", mb->vq_id); > +} > + > +static void imx_rproc_mb_callback(struct mbox_client *cl, void *data) > +{ > + struct rproc *rproc = dev_get_drvdata(cl->dev); > + struct imx_mbox *mb = container_of(cl, struct imx_mbox, client); > + struct imx_rproc *ddata = rproc->priv; > + > + queue_work(ddata->workqueue, &mb->vq_work); > +} > + > +static const struct imx_mbox imx_rproc_mbox[IMX_MBOX_NB_MBX] = { > + { > + .name = IMX_MBX_VQ0, > + .vq_id = 0, > + .client = { > + .rx_callback = imx_rproc_mb_callback, > + .tx_block = false, > + }, > + }, > + { > + .name = IMX_MBX_VQ1, > + .vq_id = 1, > + .client = { > + .rx_callback = imx_rproc_mb_callback, > + .tx_block = false, > + }, > + }, > +}; > + > +static void imx_rproc_request_mbox(struct rproc *rproc) > +{ > + struct imx_rproc *ddata = rproc->priv; > + struct device *dev = &rproc->dev; > + unsigned int i; > + const unsigned char *name; > + struct mbox_client *cl; > + > + /* Initialise mailbox structure table */ > + memcpy(ddata->mb, imx_rproc_mbox, sizeof(imx_rproc_mbox)); > + > + for (i = 0; i < IMX_MBOX_NB_MBX; i++) { > + name = ddata->mb[i].name; > + > + cl = &ddata->mb[i].client; > + cl->dev = dev->parent; > + > + ddata->mb[i].chan = mbox_request_channel_byname(cl, name); > + > + dev_dbg(dev, "%s: name=%s, idx=%u\n", > + __func__, name, ddata->mb[i].vq_id); > + > + if (IS_ERR(ddata->mb[i].chan)) { > + dev_warn(dev, "cannot get %s mbox\n", name); > + ddata->mb[i].chan = NULL; If the mailbox isn't ready this driver will fail without a chance of recovery. Since most of the code in this patch is a carbon copy of the implementation found in stm32_proc.c, I suggest you do the same as they did in stm32_rproc_request_mbox() and privision for cases where requesting a channel returns -EPROBE_DEFER. > + } > + > + if (ddata->mb[i].vq_id >= 0) > + INIT_WORK(&ddata->mb[i].vq_work, imx_rproc_mb_vq_work); > + } > +} > + > +static void imx_rproc_free_mbox(struct rproc *rproc) > +{ > + struct imx_rproc *ddata = rproc->priv; > + unsigned int i; > + > + dev_dbg(&rproc->dev, "%s: %d boxes\n", > + __func__, ARRAY_SIZE(ddata->mb)); > + > + for (i = 0; i < ARRAY_SIZE(ddata->mb); i++) { > + if (ddata->mb[i].chan) > + mbox_free_channel(ddata->mb[i].chan); > + ddata->mb[i].chan = NULL; > + } > +} > + > +static void imx_rproc_kick(struct rproc *rproc, int vqid) > +{ > + struct imx_rproc *ddata = rproc->priv; > + unsigned int i; > + int err; > + > + if (WARN_ON(vqid >= IMX_MBOX_NB_VQ)) > + return; > + > + for (i = 0; i < IMX_MBOX_NB_MBX; i++) { > + if (vqid != ddata->mb[i].vq_id) > + continue; > + if (!ddata->mb[i].chan) > + return; > + dev_dbg(&rproc->dev, "sending message : vqid = %d\n", vqid); > + err = mbox_send_message(ddata->mb[i].chan, &vqid); > + if (err < 0) > + dev_err(&rproc->dev, "%s: failed (%s, err:%d)\n", > + __func__, ddata->mb[i].name, err); > + return; > + } > +} > + > static const struct rproc_ops imx_rproc_ops = { > .start = imx_rproc_start, > .stop = imx_rproc_stop, > .da_to_va = imx_rproc_da_to_va, > + .kick = imx_rproc_kick, > .get_boot_addr = rproc_elf_get_boot_addr, > }; > > @@ -384,14 +511,26 @@ static int imx_rproc_probe(struct platform_device *pdev) > goto err_put_rproc; > } > > + priv->workqueue = create_workqueue(dev_name(dev)); > + if (!priv->workqueue) { > + dev_err(dev, "cannot create workqueue\n"); > + ret = -ENOMEM; > + goto err_put_clk; > + } > + > + imx_rproc_request_mbox(rproc); > + > ret = rproc_add(rproc); > if (ret) { > dev_err(dev, "rproc_add failed\n"); > - goto err_put_clk; > + goto err_free_mb; > } > > return 0; > > +err_free_mb: > + imx_rproc_free_mbox(rproc); > + destroy_workqueue(priv->workqueue); > err_put_clk: > clk_disable_unprepare(priv->clk); > err_put_rproc: > @@ -407,6 +546,7 @@ static int imx_rproc_remove(struct platform_device *pdev) > > clk_disable_unprepare(priv->clk); > rproc_del(rproc); > + imx_rproc_free_mbox(rproc); I have no issues with people reusing code already found in the kernel - in fact I encourage it because it makes reviewing patches much easier. On the flip side you have to give credit where it is due. Here adding a line in the changelog that mentions where you took your inspiration from will be much appreciated. Thanks, Mathieu > rproc_free(rproc); > > return 0; > -- > 2.25.1 > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-04-14 17:20 UTC|newest] Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-03-04 14:26 [PATCH 1/2] remoteproc: imx_rproc: dummy kick method Nikita Shubin 2020-03-04 14:26 ` Nikita Shubin 2020-03-04 14:26 ` Nikita Shubin 2020-03-04 14:26 ` [PATCH 2/2] remoteproc: imx_rproc: set pc on start Nikita Shubin 2020-03-04 14:26 ` Nikita Shubin 2020-03-04 14:26 ` Nikita Shubin 2020-03-05 16:16 ` [PATCH 1/2] remoteproc: imx_rproc: dummy kick method Mathieu Poirier 2020-03-05 16:16 ` Mathieu Poirier 2020-03-05 17:29 ` nikita.shubin 2020-03-05 17:29 ` nikita.shubin 2020-03-05 17:54 ` Mathieu Poirier 2020-03-05 17:54 ` Mathieu Poirier 2020-03-05 18:07 ` nikita.shubin 2020-03-05 18:07 ` nikita.shubin 2020-03-05 18:36 ` Mathieu Poirier 2020-03-05 18:36 ` Mathieu Poirier 2020-03-05 18:46 ` nikita.shubin 2020-03-05 18:46 ` nikita.shubin 2020-04-06 11:33 ` [PATCH v2 0/3] remoteproc: imx_rproc: add virtio support nikita.shubin 2020-04-06 11:33 ` nikita.shubin 2020-04-06 11:33 ` [PATCH v2 1/3] remoteproc: imx_rproc: set pc on start nikita.shubin 2020-04-06 11:33 ` nikita.shubin 2020-04-14 16:45 ` Mathieu Poirier 2020-04-14 16:45 ` Mathieu Poirier 2020-04-17 5:40 ` nikita.shubin 2020-04-17 17:01 ` Mathieu Poirier 2020-04-17 17:01 ` Mathieu Poirier 2020-04-17 17:01 ` Mathieu Poirier 2020-04-17 17:26 ` Nikita Shubin 2020-04-17 17:26 ` Nikita Shubin 2020-04-17 17:26 ` Nikita Shubin 2020-04-17 22:24 ` Mathieu Poirier 2020-04-17 22:24 ` Mathieu Poirier 2020-04-17 22:24 ` Mathieu Poirier 2020-04-22 7:35 ` Nikita Shubin 2020-04-22 7:35 ` Nikita Shubin 2020-04-22 7:35 ` Nikita Shubin 2020-04-17 12:11 ` Nikita Shubin 2020-04-17 12:11 ` Nikita Shubin 2020-04-17 15:37 ` Mathieu Poirier 2020-04-17 15:37 ` Mathieu Poirier 2020-04-17 15:46 ` Nikita Shubin 2020-04-17 15:46 ` Nikita Shubin 2020-04-06 11:33 ` [PATCH v2 2/3] remoteproc: imx_rproc: mailbox support nikita.shubin 2020-04-06 11:33 ` nikita.shubin 2020-04-07 1:07 ` kbuild test robot 2020-04-07 1:07 ` kbuild test robot 2020-04-07 1:07 ` kbuild test robot 2020-04-14 17:20 ` Mathieu Poirier [this message] 2020-04-14 17:20 ` Mathieu Poirier 2020-04-17 8:37 ` Nikita Shubin 2020-04-17 8:37 ` Nikita Shubin 2020-04-17 16:02 ` Mathieu Poirier 2020-04-17 16:02 ` Mathieu Poirier 2020-04-14 17:36 ` Mathieu Poirier 2020-04-14 17:36 ` Mathieu Poirier 2020-04-06 11:33 ` [PATCH v2 3/3] remoteproc: imx_rproc: memory regions nikita.shubin 2020-04-06 11:33 ` nikita.shubin 2020-04-14 17:46 ` Mathieu Poirier 2020-04-14 17:46 ` Mathieu Poirier 2020-04-15 2:42 ` [PATCH v2 0/3] remoteproc: imx_rproc: add virtio support Peng Fan 2020-04-15 2:42 ` Peng Fan 2020-04-15 2:42 ` Peng Fan 2020-04-15 16:26 ` Mathieu Poirier 2020-04-15 16:26 ` Mathieu Poirier 2020-04-15 16:26 ` Mathieu Poirier 2020-04-17 8:57 ` Nikita Shubin 2020-04-17 8:57 ` Nikita Shubin 2020-04-17 8:57 ` Nikita Shubin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200414172004.GB24061@xps15 \ --to=mathieu.poirier@linaro.org \ --cc=NShubin@topcon.com \ --cc=bjorn.andersson@linaro.org \ --cc=festevam@gmail.com \ --cc=kernel@pengutronix.de \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-imx@nxp.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-remoteproc@vger.kernel.org \ --cc=nikita.shubin@maquefel.me \ --cc=ohad@wizery.com \ --cc=s.hauer@pengutronix.de \ --cc=shawnguo@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.