From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: "Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>,
"Samuel Holland" <samuel.holland@sifive.com>,
"Richard Cochran" <richardcochran@gmail.com>,
"Russell King" <linux@armlinux.org.uk>,
"Thomas Bogendoerfer" <tsbogend@alpha.franken.de>,
"Vladimir Kondratiev" <vladimir.kondratiev@mobileye.com>,
"Gregory CLEMENT" <gregory.clement@bootlin.com>
Cc: <netdev@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<linux-mips@vger.kernel.org>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Tawfik Bayouk" <tawfik.bayouk@mobileye.com>
Subject: Re: [PATCH net-next 10/13] net: macb: Add "mobileye,eyeq5-gem" compatible
Date: Tue, 25 Mar 2025 18:25:35 +0100 [thread overview]
Message-ID: <D8PITUNTWTXA.366TNSXDUL48G@bootlin.com> (raw)
In-Reply-To: <ea5de004-a26c-43a1-9408-0089fa18b44d@tuxon.dev>
On Mon Mar 24, 2025 at 9:18 AM CET, Claudiu Beznea wrote:
> On 21.03.2025 21:09, Théo Lebrun wrote:
>> Add support for the two GEM instances inside Mobileye EyeQ5 SoCs, using
>> compatible "mobileye,eyeq5-gem". With it, add a custom init sequence
>> that accesses two system-controller registers.
>>
>> Noteworthy: NET_IP_ALIGN=2 on MIPS but the hardware does not align and
>> low bits aren't configurable, so we cannot respect the requested IP
>> header alignment.
>>
>> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
>> ---
>> drivers/net/ethernet/cadence/macb_main.c | 95 ++++++++++++++++++++++++++++++++
>> 1 file changed, 95 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
>> index 79161d559166478f85a6f8294d488ed961d9be7f..9f2a5bf9a5ebca5941229bd96091a0fb96f0607d 100644
>> --- a/drivers/net/ethernet/cadence/macb_main.c
>> +++ b/drivers/net/ethernet/cadence/macb_main.c
[...]
>> +static int eyeq5_init(struct platform_device *pdev)
>> +{
>> + struct device *dev = &pdev->dev;
>> + struct net_device *netdev = platform_get_drvdata(pdev);
>> + struct macb *bp = netdev_priv(netdev);
>> + struct device_node *np = dev->of_node;
>> + unsigned int gp, sgmii;
>> + struct regmap *regmap;
>> + unsigned int args[2];
>> + unsigned int reg;
>> + int ret;
>> +
>> + regmap = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 2, args);
>> + if (IS_ERR(regmap))
>> + return PTR_ERR(regmap);
>> +
>> + gp = args[0];
>> + sgmii = args[1];
>> +
>> + /* Forced reset */
>> + regmap_write(regmap, gp, 0);
>> + regmap_write(regmap, sgmii, 0);
>> + usleep_range(5, 20);
>> +
>> + if (bp->phy_interface == PHY_INTERFACE_MODE_SGMII) {
>> + regmap_write(regmap, gp, EYEQ5_OLB_GP_SGMII_MODE);
>> +
>> + reg = EYEQ5_OLB_SGMII_PWR_EN | EYEQ5_OLB_SGMII_RST_DIS |
>> + EYEQ5_OLB_SGMII_PLL_EN;
>> + regmap_write(regmap, sgmii, reg);
>> +
>> + ret = regmap_read_poll_timeout(regmap, sgmii, reg,
>> + reg & EYEQ5_OLB_SGMII_PLL_ACK,
>> + 1, 100);
>> + if (ret)
>> + return dev_err_probe(dev, ret, "PLL timeout");
>> +
>> + regmap_read(regmap, sgmii, ®);
>> + reg |= EYEQ5_OLB_SGMII_PWR_STATE | EYEQ5_OLB_SGMII_SIG_DET_SW;
>> + regmap_write(regmap, sgmii, reg);
>
> You can use regmap_update_bits() here.
>
>> + }
>> +
>> + regmap_read(regmap, gp, ®);
>> + reg &= ~EYEQ5_OLB_GP_RGMII_DRV;
>> + if (phy_interface_mode_is_rgmii(bp->phy_interface))
>> + reg |= FIELD_PREP(EYEQ5_OLB_GP_RGMII_DRV, 0x9);
>> + reg |= EYEQ5_OLB_GP_TX_SWRST_DIS | EYEQ5_OLB_GP_TX_M_CLKE;
>> + reg |= EYEQ5_OLB_GP_SYS_SWRST_DIS | EYEQ5_OLB_GP_SYS_M_CLKE;
>> + regmap_write(regmap, gp, reg);
>
> To me it looks like this code could be abstracted as a phy driver. E.g.,
> check the init_reset_optional() and its usage on "cdns,zynqmp-gem" (phy
> driver here: drivers/phy/xilinx/phy-zynqmp.c).
I thought about that question. Options to implement that sequence are:
- (1) Implement a separate PHY driver, what you are proposing. I just
made a prototype branch to see what it'd look like. Nothing too
surprising; mostly the above sequence is copy-pasted inside
phy_init|power_on(). I see two issues:
- First, a practical one. This adds a lot of boilerplate for no
obvious benefit compared to a raw registers read/write sequence
inside macb_config->init().
The main reason for that boilerplate is to allow reuse of a PHY
across MACs; here we already know that cannot be useful because
the EyeQ5 has two GEMs and nothing else. Those registers are
EyeQ5-specific.
- Second, a semantic one. The registers we are touching are *not*
the PHY's registers. They are configuring the PHY's integration:
its input PLL, resets, etc.
- (2) Second, taking into account that what we are configuring isn't
the PHY itself but its resources, we could try modeling each
individual register+field as a reset / clock / pin control (there is
some drive strength in here, *I think*). Issue: this would get
messy, fast.
- A single register would expose many resources.
- The sequence in macb_config->init() would need to be the exact
same order. IE we can't abstract much.
Something like this pseudocode (which is a bad idea, we'd all agree
here):
reset_deassert(bp->eq5_sgmii_reset);
reset_deassert(bp->eq5_sgmii_reset_pwr);
reset_deassert(bp->eq5_phy_reset_tx);
reset_deassert(bp->eq5_phy_reset_sys);
if (bp->phy_interface == PHY_INTERFACE_MODE_SGMII) {
pinctrl_select_state(bp->eq5_phy_input_pinctrl, bp->eq5_pins_sgmii);
reset_deassert(bp->eq5_sgmii_reset);
clk_prepare_enable(bp->eq5_sgmii_phy_input_pll);
reset_deassert(bp->eq5_sgmii_reset_pwr);
} else {
pinctrl_select_state(bp->eq5_pinctrl, bp->eq5_pins_rgmii);
}
reset_deassert(bp->eq5_phy_reset_tx);
reset_deassert(bp->eq5_phy_reset_sys);
clk_prepare_enable(bp->eq5_phy_mclk_tx);
clk_prepare_enable(bp->eq5_phy_mclk_sys);
- (3) Keep the sequence in macb_config->init(). Plain and simple.
- Issue: it is somewhat unrelated platform-specific code that's
present inside macb_main.c.
The two serious options are (1) and (3).
(1) is what you proposed and (3) is what's in the series.
>> static const struct of_device_id macb_dt_ids[] = {
>> { .compatible = "cdns,at91sam9260-macb", .data = &at91sam9260_config },
>> { .compatible = "cdns,macb" },
>> @@ -5152,6 +5246,7 @@ static const struct of_device_id macb_dt_ids[] = {
>> { .compatible = "cdns,zynqmp-gem", .data = &zynqmp_config}, /* deprecated */
>> { .compatible = "cdns,zynq-gem", .data = &zynq_config }, /* deprecated */
>> { .compatible = "sifive,fu540-c000-gem", .data = &fu540_c000_config },
>> + { .compatible = "mobileye,eyeq5-gem", .data = &eyeq5_config },
>
> Maybe move it after microchip to have it a bit sorted.
Argh those semi sorted lists. I saw "cdns" then "atmel" then "cdns" so I
ignored sorting.
Thanks for the review!
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
WARNING: multiple messages have this Message-ID (diff)
From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: "Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Paul Walmsley" <paul.walmsley@sifive.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Alexandre Ghiti" <alex@ghiti.fr>,
"Samuel Holland" <samuel.holland@sifive.com>,
"Richard Cochran" <richardcochran@gmail.com>,
"Russell King" <linux@armlinux.org.uk>,
"Thomas Bogendoerfer" <tsbogend@alpha.franken.de>,
"Vladimir Kondratiev" <vladimir.kondratiev@mobileye.com>,
"Gregory CLEMENT" <gregory.clement@bootlin.com>
Cc: <netdev@vger.kernel.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<linux-mips@vger.kernel.org>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Tawfik Bayouk" <tawfik.bayouk@mobileye.com>
Subject: Re: [PATCH net-next 10/13] net: macb: Add "mobileye,eyeq5-gem" compatible
Date: Tue, 25 Mar 2025 18:25:35 +0100 [thread overview]
Message-ID: <D8PITUNTWTXA.366TNSXDUL48G@bootlin.com> (raw)
In-Reply-To: <ea5de004-a26c-43a1-9408-0089fa18b44d@tuxon.dev>
On Mon Mar 24, 2025 at 9:18 AM CET, Claudiu Beznea wrote:
> On 21.03.2025 21:09, Théo Lebrun wrote:
>> Add support for the two GEM instances inside Mobileye EyeQ5 SoCs, using
>> compatible "mobileye,eyeq5-gem". With it, add a custom init sequence
>> that accesses two system-controller registers.
>>
>> Noteworthy: NET_IP_ALIGN=2 on MIPS but the hardware does not align and
>> low bits aren't configurable, so we cannot respect the requested IP
>> header alignment.
>>
>> Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
>> ---
>> drivers/net/ethernet/cadence/macb_main.c | 95 ++++++++++++++++++++++++++++++++
>> 1 file changed, 95 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
>> index 79161d559166478f85a6f8294d488ed961d9be7f..9f2a5bf9a5ebca5941229bd96091a0fb96f0607d 100644
>> --- a/drivers/net/ethernet/cadence/macb_main.c
>> +++ b/drivers/net/ethernet/cadence/macb_main.c
[...]
>> +static int eyeq5_init(struct platform_device *pdev)
>> +{
>> + struct device *dev = &pdev->dev;
>> + struct net_device *netdev = platform_get_drvdata(pdev);
>> + struct macb *bp = netdev_priv(netdev);
>> + struct device_node *np = dev->of_node;
>> + unsigned int gp, sgmii;
>> + struct regmap *regmap;
>> + unsigned int args[2];
>> + unsigned int reg;
>> + int ret;
>> +
>> + regmap = syscon_regmap_lookup_by_phandle_args(np, "mobileye,olb", 2, args);
>> + if (IS_ERR(regmap))
>> + return PTR_ERR(regmap);
>> +
>> + gp = args[0];
>> + sgmii = args[1];
>> +
>> + /* Forced reset */
>> + regmap_write(regmap, gp, 0);
>> + regmap_write(regmap, sgmii, 0);
>> + usleep_range(5, 20);
>> +
>> + if (bp->phy_interface == PHY_INTERFACE_MODE_SGMII) {
>> + regmap_write(regmap, gp, EYEQ5_OLB_GP_SGMII_MODE);
>> +
>> + reg = EYEQ5_OLB_SGMII_PWR_EN | EYEQ5_OLB_SGMII_RST_DIS |
>> + EYEQ5_OLB_SGMII_PLL_EN;
>> + regmap_write(regmap, sgmii, reg);
>> +
>> + ret = regmap_read_poll_timeout(regmap, sgmii, reg,
>> + reg & EYEQ5_OLB_SGMII_PLL_ACK,
>> + 1, 100);
>> + if (ret)
>> + return dev_err_probe(dev, ret, "PLL timeout");
>> +
>> + regmap_read(regmap, sgmii, ®);
>> + reg |= EYEQ5_OLB_SGMII_PWR_STATE | EYEQ5_OLB_SGMII_SIG_DET_SW;
>> + regmap_write(regmap, sgmii, reg);
>
> You can use regmap_update_bits() here.
>
>> + }
>> +
>> + regmap_read(regmap, gp, ®);
>> + reg &= ~EYEQ5_OLB_GP_RGMII_DRV;
>> + if (phy_interface_mode_is_rgmii(bp->phy_interface))
>> + reg |= FIELD_PREP(EYEQ5_OLB_GP_RGMII_DRV, 0x9);
>> + reg |= EYEQ5_OLB_GP_TX_SWRST_DIS | EYEQ5_OLB_GP_TX_M_CLKE;
>> + reg |= EYEQ5_OLB_GP_SYS_SWRST_DIS | EYEQ5_OLB_GP_SYS_M_CLKE;
>> + regmap_write(regmap, gp, reg);
>
> To me it looks like this code could be abstracted as a phy driver. E.g.,
> check the init_reset_optional() and its usage on "cdns,zynqmp-gem" (phy
> driver here: drivers/phy/xilinx/phy-zynqmp.c).
I thought about that question. Options to implement that sequence are:
- (1) Implement a separate PHY driver, what you are proposing. I just
made a prototype branch to see what it'd look like. Nothing too
surprising; mostly the above sequence is copy-pasted inside
phy_init|power_on(). I see two issues:
- First, a practical one. This adds a lot of boilerplate for no
obvious benefit compared to a raw registers read/write sequence
inside macb_config->init().
The main reason for that boilerplate is to allow reuse of a PHY
across MACs; here we already know that cannot be useful because
the EyeQ5 has two GEMs and nothing else. Those registers are
EyeQ5-specific.
- Second, a semantic one. The registers we are touching are *not*
the PHY's registers. They are configuring the PHY's integration:
its input PLL, resets, etc.
- (2) Second, taking into account that what we are configuring isn't
the PHY itself but its resources, we could try modeling each
individual register+field as a reset / clock / pin control (there is
some drive strength in here, *I think*). Issue: this would get
messy, fast.
- A single register would expose many resources.
- The sequence in macb_config->init() would need to be the exact
same order. IE we can't abstract much.
Something like this pseudocode (which is a bad idea, we'd all agree
here):
reset_deassert(bp->eq5_sgmii_reset);
reset_deassert(bp->eq5_sgmii_reset_pwr);
reset_deassert(bp->eq5_phy_reset_tx);
reset_deassert(bp->eq5_phy_reset_sys);
if (bp->phy_interface == PHY_INTERFACE_MODE_SGMII) {
pinctrl_select_state(bp->eq5_phy_input_pinctrl, bp->eq5_pins_sgmii);
reset_deassert(bp->eq5_sgmii_reset);
clk_prepare_enable(bp->eq5_sgmii_phy_input_pll);
reset_deassert(bp->eq5_sgmii_reset_pwr);
} else {
pinctrl_select_state(bp->eq5_pinctrl, bp->eq5_pins_rgmii);
}
reset_deassert(bp->eq5_phy_reset_tx);
reset_deassert(bp->eq5_phy_reset_sys);
clk_prepare_enable(bp->eq5_phy_mclk_tx);
clk_prepare_enable(bp->eq5_phy_mclk_sys);
- (3) Keep the sequence in macb_config->init(). Plain and simple.
- Issue: it is somewhat unrelated platform-specific code that's
present inside macb_main.c.
The two serious options are (1) and (3).
(1) is what you proposed and (3) is what's in the series.
>> static const struct of_device_id macb_dt_ids[] = {
>> { .compatible = "cdns,at91sam9260-macb", .data = &at91sam9260_config },
>> { .compatible = "cdns,macb" },
>> @@ -5152,6 +5246,7 @@ static const struct of_device_id macb_dt_ids[] = {
>> { .compatible = "cdns,zynqmp-gem", .data = &zynqmp_config}, /* deprecated */
>> { .compatible = "cdns,zynq-gem", .data = &zynq_config }, /* deprecated */
>> { .compatible = "sifive,fu540-c000-gem", .data = &fu540_c000_config },
>> + { .compatible = "mobileye,eyeq5-gem", .data = &eyeq5_config },
>
> Maybe move it after microchip to have it a bit sorted.
Argh those semi sorted lists. I saw "cdns" then "atmel" then "cdns" so I
ignored sorting.
Thanks for the review!
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2025-03-25 17:25 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-21 19:09 [PATCH net-next 00/13] Support the Cadence MACB/GEM instances on Mobileye EyeQ5 SoCs Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 01/13] dt-bindings: net: cdns,macb: add Mobileye EyeQ5 ethernet interface Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 20:37 ` Rob Herring (Arm)
2025-03-21 20:37 ` Rob Herring (Arm)
2025-03-21 20:49 ` Andrew Lunn
2025-03-21 20:49 ` Andrew Lunn
2025-03-24 16:14 ` Théo Lebrun
2025-03-24 16:14 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 02/13] dt-bindings: net: cdns,macb: allow tsu_clk without tx_clk Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-24 16:30 ` Rob Herring
2025-03-24 16:30 ` Rob Herring
2025-03-27 14:55 ` Théo Lebrun
2025-03-27 14:55 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 03/13] dt-bindings: net: cdns,macb: allow dma-coherent Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-24 16:31 ` Rob Herring (Arm)
2025-03-24 16:31 ` Rob Herring (Arm)
2025-03-21 19:09 ` [PATCH net-next 04/13] net: macb: use BIT() macro for capability definitions Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 20:50 ` Andrew Lunn
2025-03-21 20:50 ` Andrew Lunn
2025-03-21 19:09 ` [PATCH net-next 05/13] net: macb: add no LSO capability (MACB_CAPS_NO_LSO) Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 20:51 ` Andrew Lunn
2025-03-21 20:51 ` Andrew Lunn
2025-03-24 8:18 ` Claudiu Beznea
2025-03-24 8:18 ` Claudiu Beznea
2025-03-26 10:04 ` Théo Lebrun
2025-03-26 10:04 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 06/13] net: macb: simplify macb_probe() code touching match data Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 20:57 ` Andrew Lunn
2025-03-21 20:57 ` Andrew Lunn
2025-03-21 19:09 ` [PATCH net-next 07/13] net: macb: move HW IP alignment value to macb_config Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 21:06 ` Andrew Lunn
2025-03-21 21:06 ` Andrew Lunn
2025-03-24 17:49 ` Théo Lebrun
2025-03-24 17:49 ` Théo Lebrun
2025-03-24 18:36 ` Andrew Lunn
2025-03-24 18:36 ` Andrew Lunn
2025-03-26 5:01 ` Katakam, Harini
2025-03-26 5:01 ` Katakam, Harini
2025-03-27 17:07 ` Théo Lebrun
2025-03-27 17:07 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 08/13] net: macb: introduce DMA descriptor helpers (is 64bit? is PTP?) Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-24 8:20 ` Claudiu Beznea
2025-03-24 8:20 ` Claudiu Beznea
2025-03-24 8:55 ` Maxime Chevallier
2025-03-24 8:55 ` Maxime Chevallier
2025-03-26 10:59 ` Théo Lebrun
2025-03-26 10:59 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 09/13] net: macb: sort #includes Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 21:11 ` Andrew Lunn
2025-03-21 21:11 ` Andrew Lunn
2025-03-21 19:09 ` [PATCH net-next 10/13] net: macb: Add "mobileye,eyeq5-gem" compatible Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-24 8:18 ` Claudiu Beznea
2025-03-24 8:18 ` Claudiu Beznea
2025-03-25 17:25 ` Théo Lebrun [this message]
2025-03-25 17:25 ` Théo Lebrun
2025-03-27 8:13 ` Claudiu Beznea
2025-03-27 8:13 ` Claudiu Beznea
2025-03-21 19:09 ` [PATCH net-next 11/13] MIPS: mobileye: add EyeQ5 DMA IOCU support Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 12/13] MIPS: mobileye: eyeq5: add two Cadence GEM Ethernet controllers Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 19:09 ` [PATCH net-next 13/13] MIPS: mobileye: eyeq5-epm: add two Cadence GEM Ethernet PHYs Théo Lebrun
2025-03-21 19:09 ` Théo Lebrun
2025-03-21 21:16 ` Andrew Lunn
2025-03-21 21:16 ` Andrew Lunn
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=D8PITUNTWTXA.366TNSXDUL48G@bootlin.com \
--to=theo.lebrun@bootlin.com \
--cc=alex@ghiti.fr \
--cc=andrew+netdev@lunn.ch \
--cc=aou@eecs.berkeley.edu \
--cc=claudiu.beznea@tuxon.dev \
--cc=conor+dt@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=gregory.clement@bootlin.com \
--cc=krzk+dt@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=pabeni@redhat.com \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=richardcochran@gmail.com \
--cc=robh@kernel.org \
--cc=samuel.holland@sifive.com \
--cc=tawfik.bayouk@mobileye.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=tsbogend@alpha.franken.de \
--cc=vladimir.kondratiev@mobileye.com \
/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: link
Be 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.