* [PATCH net-next v3 1/6] dt-bindings: net: ftgmac100: Add AST2700 compatible
2026-10-15 6:46 [PATCH net-next v3 0/6] net: ftgmac100: Add AST2700 support Jacky Chou
@ 2026-10-15 6:46 ` Jacky Chou
2026-10-15 19:19 ` Conor Dooley
2026-10-15 6:46 ` [PATCH net-next v3 2/6] net: ftgmac100: Add AST2700 compatible support Jacky Chou
` (4 subsequent siblings)
5 siblings, 1 reply; 8+ messages in thread
From: Jacky Chou @ 2026-10-15 6:46 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, Eric Dumazet
Cc: netdev, devicetree, linux-kernel, Jacky Chou
Add AST2700 to the FTGMAC100 compatible list and document that its
RMII RCLK gate matches the earlier Aspeed SoCs. Allow the reset line for
AST2700 as it follows the same reset requirements as AST2600.
Require "phy-mode" to be present in the device tree when the AST2700
compatible is used, matching the driver's probe-time requirement.
Make aspeed,ast2700-mac a standalone compatible instead of pairing it
with the generic "faraday,ftgmac100" fallback: if a node ever bound
through the generic entry alone, ftgmac100_probe() would set
rxdes0_edorr_mask/txdes0_edotr_mask to BIT(15) instead of the Aspeed
BIT(30), skip Aspeed clock setup, and leave the DMA mask too narrow.
The existing aspeed,ast2400-mac, aspeed,ast2500-mac, and
aspeed,ast2600-mac compatibles have the same structural problem: they
are currently only valid when paired with "faraday,ftgmac100", and a
node that bound through the generic entry alone would hit the same
BIT(15) vs BIT(30) mismatch. Give them the same standalone treatment as
AST2700, so none of the Aspeed compatibles require the generic fallback
alongside them.
ftgmac100_of_match[] has had dedicated entries for AST2400, AST2500,
and AST2600 since commit 03a2aba50b2c ("net: ftgmac100: List all
compatibles"), so there is no known kernel + devicetree combination
where a node has actually bound through the generic entry and gotten
the wrong EDORR bit. This part is a binding correctness fix, not a fix
for an observed failure.
Note that arch/arm/boot/dts/aspeed/aspeed-g4.dtsi, aspeed-g5.dtsi, and
aspeed-g6.dtsi still declare their MAC nodes with the two-string
"aspeed,astXXXX-mac", "faraday,ftgmac100" compatible, so this will make
dtbs_check warn against those files until the redundant fallback
compatible is dropped there as well. That .dtsi change will be sent as
a separate series through the Aspeed/arm-soc tree, since dt-bindings
changes don't go through that tree.
Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
---
.../devicetree/bindings/net/faraday,ftgmac100.yaml | 26 ++++++++++++++--------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml b/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml
index d14410018bcf..0a376b849a91 100644
--- a/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml
+++ b/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml
@@ -13,12 +13,11 @@ properties:
compatible:
oneOf:
- const: faraday,ftgmac100
- - items:
- - enum:
- - aspeed,ast2400-mac
- - aspeed,ast2500-mac
- - aspeed,ast2600-mac
- - const: faraday,ftgmac100
+ - enum:
+ - aspeed,ast2400-mac
+ - aspeed,ast2500-mac
+ - aspeed,ast2600-mac
+ - aspeed,ast2700-mac
reg:
maxItems: 1
@@ -30,7 +29,7 @@ properties:
minItems: 1
items:
- description: MAC IP clock
- - description: RMII RCLK gate for AST2500/2600
+ - description: RMII RCLK gate for AST2500/2600/2700
resets:
maxItems: 1
@@ -82,26 +81,35 @@ allOf:
contains:
enum:
- aspeed,ast2600-mac
+ - aspeed,ast2700-mac
then:
properties:
resets: true
else:
properties:
resets: false
+ - if:
+ properties:
+ compatible:
+ contains:
+ const: aspeed,ast2700-mac
+ then:
+ required:
+ - phy-mode
unevaluatedProperties: false
examples:
- |
ethernet@1e660000 {
- compatible = "aspeed,ast2500-mac", "faraday,ftgmac100";
+ compatible = "aspeed,ast2500-mac";
reg = <0x1e660000 0x180>;
interrupts = <2>;
use-ncsi;
};
ethernet@1e680000 {
- compatible = "aspeed,ast2500-mac", "faraday,ftgmac100";
+ compatible = "aspeed,ast2500-mac";
reg = <0x1e680000 0x180>;
interrupts = <2>;
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH net-next v3 1/6] dt-bindings: net: ftgmac100: Add AST2700 compatible
2026-10-15 6:46 ` [PATCH net-next v3 1/6] dt-bindings: net: ftgmac100: Add AST2700 compatible Jacky Chou
@ 2026-10-15 19:19 ` Conor Dooley
0 siblings, 0 replies; 8+ messages in thread
From: Conor Dooley @ 2026-10-15 19:19 UTC (permalink / raw)
To: Jacky Chou
Cc: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, netdev, devicetree,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 4606 bytes --]
On Thu, Oct 15, 2026 at 02:46:53PM +0800, Jacky Chou wrote:
> Add AST2700 to the FTGMAC100 compatible list and document that its
> RMII RCLK gate matches the earlier Aspeed SoCs. Allow the reset line for
> AST2700 as it follows the same reset requirements as AST2600.
>
> Require "phy-mode" to be present in the device tree when the AST2700
> compatible is used, matching the driver's probe-time requirement.
>
> Make aspeed,ast2700-mac a standalone compatible instead of pairing it
> with the generic "faraday,ftgmac100" fallback: if a node ever bound
> through the generic entry alone, ftgmac100_probe() would set
> rxdes0_edorr_mask/txdes0_edotr_mask to BIT(15) instead of the Aspeed
> BIT(30), skip Aspeed clock setup, and leave the DMA mask too narrow.
>
> The existing aspeed,ast2400-mac, aspeed,ast2500-mac, and
> aspeed,ast2600-mac compatibles have the same structural problem: they
> are currently only valid when paired with "faraday,ftgmac100", and a
> node that bound through the generic entry alone would hit the same
> BIT(15) vs BIT(30) mismatch. Give them the same standalone treatment as
> AST2700, so none of the Aspeed compatibles require the generic fallback
> alongside them.
This needs to be two commits. One fixing the existing devices and one
adding the new one.
> ftgmac100_of_match[] has had dedicated entries for AST2400, AST2500,
> and AST2600 since commit 03a2aba50b2c ("net: ftgmac100: List all
> compatibles"), so there is no known kernel + devicetree combination
> where a node has actually bound through the generic entry and gotten
> the wrong EDORR bit. This part is a binding correctness fix, not a fix
> for an observed failure.
> Note that arch/arm/boot/dts/aspeed/aspeed-g4.dtsi, aspeed-g5.dtsi, and
> aspeed-g6.dtsi still declare their MAC nodes with the two-string
> "aspeed,astXXXX-mac", "faraday,ftgmac100" compatible, so this will make
> dtbs_check warn against those files until the redundant fallback
> compatible is dropped there as well. That .dtsi change will be sent as
> a separate series through the Aspeed/arm-soc tree, since dt-bindings
> changes don't go through that tree.
This should be below the --- line or not even included in the patch.
pw-bot: changes-requested
Thanks,
Conor.
>
> Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
> ---
> .../devicetree/bindings/net/faraday,ftgmac100.yaml | 26 ++++++++++++++--------
> 1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml b/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml
> index d14410018bcf..0a376b849a91 100644
> --- a/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml
> +++ b/Documentation/devicetree/bindings/net/faraday,ftgmac100.yaml
> @@ -13,12 +13,11 @@ properties:
> compatible:
> oneOf:
> - const: faraday,ftgmac100
> - - items:
> - - enum:
> - - aspeed,ast2400-mac
> - - aspeed,ast2500-mac
> - - aspeed,ast2600-mac
> - - const: faraday,ftgmac100
> + - enum:
> + - aspeed,ast2400-mac
> + - aspeed,ast2500-mac
> + - aspeed,ast2600-mac
> + - aspeed,ast2700-mac
>
> reg:
> maxItems: 1
> @@ -30,7 +29,7 @@ properties:
> minItems: 1
> items:
> - description: MAC IP clock
> - - description: RMII RCLK gate for AST2500/2600
> + - description: RMII RCLK gate for AST2500/2600/2700
>
> resets:
> maxItems: 1
> @@ -82,26 +81,35 @@ allOf:
> contains:
> enum:
> - aspeed,ast2600-mac
> + - aspeed,ast2700-mac
> then:
> properties:
> resets: true
> else:
> properties:
> resets: false
> + - if:
> + properties:
> + compatible:
> + contains:
> + const: aspeed,ast2700-mac
> + then:
> + required:
> + - phy-mode
>
> unevaluatedProperties: false
>
> examples:
> - |
> ethernet@1e660000 {
> - compatible = "aspeed,ast2500-mac", "faraday,ftgmac100";
> + compatible = "aspeed,ast2500-mac";
> reg = <0x1e660000 0x180>;
> interrupts = <2>;
> use-ncsi;
> };
>
> ethernet@1e680000 {
> - compatible = "aspeed,ast2500-mac", "faraday,ftgmac100";
> + compatible = "aspeed,ast2500-mac";
> reg = <0x1e680000 0x180>;
> interrupts = <2>;
>
>
> --
> 2.34.1
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next v3 2/6] net: ftgmac100: Add AST2700 compatible support
2026-10-15 6:46 [PATCH net-next v3 0/6] net: ftgmac100: Add AST2700 support Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 1/6] dt-bindings: net: ftgmac100: Add AST2700 compatible Jacky Chou
@ 2026-10-15 6:46 ` Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 3/6] net: ftgmac100: Enable AST2700 RMII support Jacky Chou
` (3 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Jacky Chou @ 2026-10-15 6:46 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, Eric Dumazet
Cc: netdev, devicetree, linux-kernel, Jacky Chou, Andrew Lunn
Add match data for the Aspeed AST2700 FTGMAC100 controller and wire
its compatible string into the OF match table. This lets AST2700 device
tree nodes bind to the ftgmac100 driver.
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
---
drivers/net/ethernet/faraday/ftgmac100.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 6d2fe5c2f390..67b1fa464a42 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -37,7 +37,8 @@ enum ftgmac100_mac_id {
FTGMAC100_FARADAY = 1,
FTGMAC100_AST2400,
FTGMAC100_AST2500,
- FTGMAC100_AST2600
+ FTGMAC100_AST2600,
+ FTGMAC100_AST2700
};
struct ftgmac100_match_data {
@@ -2017,7 +2018,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
if (priv->mac_id == FTGMAC100_AST2400 ||
priv->mac_id == FTGMAC100_AST2500 ||
- priv->mac_id == FTGMAC100_AST2600) {
+ priv->mac_id == FTGMAC100_AST2600 ||
+ priv->mac_id == FTGMAC100_AST2700) {
priv->rxdes0_edorr_mask = BIT(30);
priv->txdes0_edotr_mask = BIT(30);
priv->is_aspeed = true;
@@ -2131,6 +2133,10 @@ static const struct ftgmac100_match_data ftgmac100_match_data_ast2600 = {
.mac_id = FTGMAC100_AST2600
};
+static const struct ftgmac100_match_data ftgmac100_match_data_ast2700 = {
+ .mac_id = FTGMAC100_AST2700
+};
+
static const struct ftgmac100_match_data ftgmac100_match_data_faraday = {
.mac_id = FTGMAC100_FARADAY
};
@@ -2142,6 +2148,8 @@ static const struct of_device_id ftgmac100_of_match[] = {
.data = &ftgmac100_match_data_ast2500 },
{ .compatible = "aspeed,ast2600-mac",
.data = &ftgmac100_match_data_ast2600 },
+ { .compatible = "aspeed,ast2700-mac",
+ .data = &ftgmac100_match_data_ast2700 },
{ .compatible = "faraday,ftgmac100",
.data = &ftgmac100_match_data_faraday },
{ }
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH net-next v3 3/6] net: ftgmac100: Enable AST2700 RMII support
2026-10-15 6:46 [PATCH net-next v3 0/6] net: ftgmac100: Add AST2700 support Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 1/6] dt-bindings: net: ftgmac100: Add AST2700 compatible Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 2/6] net: ftgmac100: Add AST2700 compatible support Jacky Chou
@ 2026-10-15 6:46 ` Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 4/6] net: ftgmac100: Require phy-mode for AST2700 Jacky Chou
` (2 subsequent siblings)
5 siblings, 0 replies; 8+ messages in thread
From: Jacky Chou @ 2026-10-15 6:46 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, Eric Dumazet
Cc: netdev, devicetree, linux-kernel, Jacky Chou
Set the RMII enable bit when an AST2700 port uses RMII so the MAC is
programmed for the selected interface mode. Describe the requirement as
a match-data quirk instead of checking the MAC generation in the data
path, allowing later compatible controllers to opt into the behavior.
phydev is always populated by the time this runs: ftgmac100_start_hw()
is only reached once the device has been opened, and
ftgmac100_probe_dt() always attaches a phy_device before
register_netdev() can succeed -- via a discrete PHY ("phy-handle"), a
"fixed-link" node, or NC-SI's internal fixed 100Mbit PHY
(ftgmac100_probe_ncsi()). Any failure in that setup aborts probe before
register_netdev(), so an opened AST2700 netdev always has phydev set.
This mirrors the same assumption ftgmac100_reset_and_config_mac()
already makes for every Aspeed SoC earlier in the open path.
Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
---
drivers/net/ethernet/faraday/ftgmac100.c | 21 +++++++++++++++++++--
drivers/net/ethernet/faraday/ftgmac100.h | 1 +
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 67b1fa464a42..9b7becb01726 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -41,8 +41,11 @@ enum ftgmac100_mac_id {
FTGMAC100_AST2700
};
+#define FTGMAC100_QUIRK_RMII_ENABLE BIT(0)
+
struct ftgmac100_match_data {
enum ftgmac100_mac_id mac_id;
+ u32 quirks;
};
/* Arbitrary values, I am not sure the HW has limits */
@@ -79,6 +82,7 @@ struct ftgmac100 {
void __iomem *base;
enum ftgmac100_mac_id mac_id;
+ u32 quirks;
/* Rx ring */
unsigned int rx_q_entries;
@@ -355,6 +359,12 @@ static void ftgmac100_init_hw(struct ftgmac100 *priv)
static void ftgmac100_start_hw(struct ftgmac100 *priv)
{
u32 maccr = ioread32(priv->base + FTGMAC100_OFFSET_MACCR);
+ /*
+ * Only reached once the device is open, so a phy_device is already
+ * attached: a discrete PHY via "phy-handle", a "fixed-link" node, or
+ * NC-SI's internal fixed 100M PHY.
+ */
+ struct phy_device *phydev = priv->netdev->phydev;
/* Keep the original GMAC and FAST bits */
maccr &= (FTGMAC100_MACCR_FAST_MODE | FTGMAC100_MACCR_GIGA_MODE);
@@ -383,6 +393,11 @@ static void ftgmac100_start_hw(struct ftgmac100 *priv)
if (priv->netdev->features & NETIF_F_HW_VLAN_CTAG_RX)
maccr |= FTGMAC100_MACCR_RM_VLAN;
+ if ((priv->quirks & FTGMAC100_QUIRK_RMII_ENABLE) &&
+ phydev->interface == PHY_INTERFACE_MODE_RMII) {
+ maccr |= FTGMAC100_MACCR_RMII_ENABLE;
+ }
+
/* Hit the HW */
iowrite32(maccr, priv->base + FTGMAC100_OFFSET_MACCR);
}
@@ -1942,7 +1957,7 @@ static int ftgmac100_probe_dt(struct net_device *netdev,
static int ftgmac100_probe(struct platform_device *pdev)
{
- const struct ftgmac100_match_data *match_data;
+ const struct ftgmac100_match_data *match_data = NULL;
enum ftgmac100_mac_id mac_id;
struct resource *res;
int irq;
@@ -1987,6 +2002,7 @@ static int ftgmac100_probe(struct platform_device *pdev)
priv->netdev = netdev;
priv->dev = &pdev->dev;
priv->mac_id = mac_id;
+ priv->quirks = match_data ? match_data->quirks : 0;
INIT_WORK(&priv->reset_task, ftgmac100_reset_task);
/* map io memory */
@@ -2134,7 +2150,8 @@ static const struct ftgmac100_match_data ftgmac100_match_data_ast2600 = {
};
static const struct ftgmac100_match_data ftgmac100_match_data_ast2700 = {
- .mac_id = FTGMAC100_AST2700
+ .mac_id = FTGMAC100_AST2700,
+ .quirks = FTGMAC100_QUIRK_RMII_ENABLE,
};
static const struct ftgmac100_match_data ftgmac100_match_data_faraday = {
diff --git a/drivers/net/ethernet/faraday/ftgmac100.h b/drivers/net/ethernet/faraday/ftgmac100.h
index 4968f6f0bdbc..8c35c895b146 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.h
+++ b/drivers/net/ethernet/faraday/ftgmac100.h
@@ -167,6 +167,7 @@
#define FTGMAC100_MACCR_RX_BROADPKT (1 << 17)
#define FTGMAC100_MACCR_DISCARD_CRCERR (1 << 18)
#define FTGMAC100_MACCR_FAST_MODE (1 << 19)
+#define FTGMAC100_MACCR_RMII_ENABLE BIT(20)
#define FTGMAC100_MACCR_SW_RST (1 << 31)
/*
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH net-next v3 4/6] net: ftgmac100: Require phy-mode for AST2700
2026-10-15 6:46 [PATCH net-next v3 0/6] net: ftgmac100: Add AST2700 support Jacky Chou
` (2 preceding siblings ...)
2026-10-15 6:46 ` [PATCH net-next v3 3/6] net: ftgmac100: Enable AST2700 RMII support Jacky Chou
@ 2026-10-15 6:46 ` Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 5/6] net: ftgmac100: Add AST2700 upper DMA address support Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 6/6] net: ftgmac100: Allow building on ARM64 Jacky Chou
5 siblings, 0 replies; 8+ messages in thread
From: Jacky Chou @ 2026-10-15 6:46 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, Eric Dumazet
Cc: netdev, devicetree, linux-kernel, Jacky Chou
The driver currently defaults to RGMII when the "phy-mode" property
is missing from the device tree. This default is no longer valid for
AST2700, which also supports RMII via FTGMAC100_QUIRK_RMII_ENABLE.
Make "phy-mode" a required property for AST2700 and fail probe with
an error message if it is not specified, instead of silently
defaulting to RGMII.
Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
---
drivers/net/ethernet/faraday/ftgmac100.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 9b7becb01726..5a578a62df67 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -1526,8 +1526,13 @@ static int ftgmac100_mii_probe(struct net_device *netdev)
/* Default to RGMII. It's a gigabit part after all */
err = of_get_phy_mode(np, &phy_intf);
- if (err)
+ if (err) {
+ if (priv->mac_id == FTGMAC100_AST2700) {
+ dev_err(priv->dev, "phy-mode is required for this SoC\n");
+ return -EINVAL;
+ }
phy_intf = PHY_INTERFACE_MODE_RGMII;
+ }
/* Aspeed only supports these. I don't know about other IP
* block vendors so I'm going to just let them through for
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH net-next v3 5/6] net: ftgmac100: Add AST2700 upper DMA address support
2026-10-15 6:46 [PATCH net-next v3 0/6] net: ftgmac100: Add AST2700 support Jacky Chou
` (3 preceding siblings ...)
2026-10-15 6:46 ` [PATCH net-next v3 4/6] net: ftgmac100: Require phy-mode for AST2700 Jacky Chou
@ 2026-10-15 6:46 ` Jacky Chou
2026-10-15 6:46 ` [PATCH net-next v3 6/6] net: ftgmac100: Allow building on ARM64 Jacky Chou
5 siblings, 0 replies; 8+ messages in thread
From: Jacky Chou @ 2026-10-15 6:46 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, Eric Dumazet
Cc: netdev, devicetree, linux-kernel, Jacky Chou
Program the high RX and TX descriptor ring base registers and carry the
upper DMA address bits in RX and TX descriptors. Rebuild full buffer DMA
addresses in a 64-bit type before unmapping them so bits 34:32 are not
lost to 32-bit arithmetic.
The descriptor format provides three upper buffer address bits, so
request a 35-bit DMA mask instead of advertising an address range that
the hardware cannot encode. Gate all extended address handling with a
match-data quirk so older register layouts remain untouched and later
compatible controllers can opt into the same capability.
Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
---
drivers/net/ethernet/faraday/ftgmac100.c | 62 +++++++++++++++++++++++++++-----
drivers/net/ethernet/faraday/ftgmac100.h | 6 ++++
2 files changed, 59 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index 5a578a62df67..263594de0e07 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -8,6 +8,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/reset.h>
#include <linux/dma-mapping.h>
@@ -42,6 +43,7 @@ enum ftgmac100_mac_id {
};
#define FTGMAC100_QUIRK_RMII_ENABLE BIT(0)
+#define FTGMAC100_QUIRK_DMA_35BIT BIT(1)
struct ftgmac100_match_data {
enum ftgmac100_mac_id mac_id;
@@ -303,10 +305,16 @@ static void ftgmac100_init_hw(struct ftgmac100 *priv)
iowrite32(reg, priv->base + FTGMAC100_OFFSET_ISR);
/* Setup RX ring buffer base */
- iowrite32(priv->rxdes_dma, priv->base + FTGMAC100_OFFSET_RXR_BADR);
+ iowrite32(lower_32_bits(priv->rxdes_dma), priv->base + FTGMAC100_OFFSET_RXR_BADR);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ iowrite32(upper_32_bits(priv->rxdes_dma),
+ priv->base + FTGMAC100_OFFSET_RXR_BADDR_HIGH);
/* Setup TX ring buffer base */
- iowrite32(priv->txdes_dma, priv->base + FTGMAC100_OFFSET_NPTXR_BADR);
+ iowrite32(lower_32_bits(priv->txdes_dma), priv->base + FTGMAC100_OFFSET_NPTXR_BADR);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ iowrite32(upper_32_bits(priv->txdes_dma),
+ priv->base + FTGMAC100_OFFSET_TXR_BADDR_HIGH);
/* Configure RX buffer size */
iowrite32(FTGMAC100_RBSR_SIZE(RX_BUF_SIZE),
@@ -474,7 +482,10 @@ static int ftgmac100_alloc_rx_buf(struct ftgmac100 *priv, unsigned int entry,
priv->rx_skbs[entry] = skb;
/* Store DMA address into RX desc */
- rxdes->rxdes3 = cpu_to_le32(map);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ rxdes->rxdes2 = cpu_to_le32(FIELD_PREP(FTGMAC100_RXDES2_RXBUF_BADR_HI,
+ upper_32_bits(map)));
+ rxdes->rxdes3 = cpu_to_le32(lower_32_bits(map));
/* Ensure the above is ordered vs clearing the OWN bit */
dma_wmb();
@@ -601,6 +612,9 @@ static bool ftgmac100_rx_packet(struct ftgmac100 *priv, int *processed)
/* Tear down DMA mapping, do necessary cache management */
map = le32_to_cpu(rxdes->rxdes3);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ map |= (u64)FIELD_GET(FTGMAC100_RXDES2_RXBUF_BADR_HI,
+ le32_to_cpu(rxdes->rxdes2)) << 32;
#if defined(CONFIG_ARM) && !defined(CONFIG_ARM_DMA_USE_IOMMU)
/* When we don't have an iommu, we can save cycles by not
@@ -677,9 +691,14 @@ static void ftgmac100_free_tx_packet(struct ftgmac100 *priv,
struct ftgmac100_txdes *txdes,
u32 ctl_stat)
{
- dma_addr_t map = le32_to_cpu(txdes->txdes3);
+ dma_addr_t map;
size_t len;
+ map = le32_to_cpu(txdes->txdes3);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ map |= (u64)FIELD_GET(FTGMAC100_TXDES2_TXBUF_BADR_HI,
+ le32_to_cpu(txdes->txdes2)) << 32;
+
if (ctl_stat & FTGMAC100_TXDES0_FTS) {
len = skb_headlen(skb);
dma_unmap_single(priv->dev, map, len, DMA_TO_DEVICE);
@@ -833,7 +852,10 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,
f_ctl_stat |= FTGMAC100_TXDES0_FTS;
if (nfrags == 0)
f_ctl_stat |= FTGMAC100_TXDES0_LTS;
- txdes->txdes3 = cpu_to_le32(map);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ txdes->txdes2 = cpu_to_le32(FIELD_PREP(FTGMAC100_TXDES2_TXBUF_BADR_HI,
+ upper_32_bits(map)));
+ txdes->txdes3 = cpu_to_le32(lower_32_bits(map));
txdes->txdes1 = cpu_to_le32(csum_vlan);
/* Next descriptor */
@@ -861,7 +883,10 @@ static netdev_tx_t ftgmac100_hard_start_xmit(struct sk_buff *skb,
ctl_stat |= FTGMAC100_TXDES0_LTS;
txdes->txdes0 = cpu_to_le32(ctl_stat);
txdes->txdes1 = 0;
- txdes->txdes3 = cpu_to_le32(map);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ txdes->txdes2 = cpu_to_le32(FIELD_PREP(FTGMAC100_TXDES2_TXBUF_BADR_HI,
+ upper_32_bits(map)));
+ txdes->txdes3 = cpu_to_le32(lower_32_bits(map));
/* Next one */
pointer = ftgmac100_next_tx_pointer(priv, pointer);
@@ -936,7 +961,12 @@ static void ftgmac100_free_buffers(struct ftgmac100 *priv)
for (i = 0; i < priv->rx_q_entries; i++) {
struct ftgmac100_rxdes *rxdes = &priv->rxdes[i];
struct sk_buff *skb = priv->rx_skbs[i];
- dma_addr_t map = le32_to_cpu(rxdes->rxdes3);
+ dma_addr_t map;
+
+ map = le32_to_cpu(rxdes->rxdes3);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT)
+ map |= (u64)FIELD_GET(FTGMAC100_RXDES2_RXBUF_BADR_HI,
+ le32_to_cpu(rxdes->rxdes2)) << 32;
if (!skb)
continue;
@@ -1055,7 +1085,12 @@ static void ftgmac100_init_rings(struct ftgmac100 *priv)
for (i = 0; i < priv->rx_q_entries; i++) {
rxdes = &priv->rxdes[i];
rxdes->rxdes0 = 0;
- rxdes->rxdes3 = cpu_to_le32(priv->rx_scratch_dma);
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT) {
+ u32 hi = upper_32_bits(priv->rx_scratch_dma);
+
+ rxdes->rxdes2 = cpu_to_le32(FIELD_PREP(FTGMAC100_RXDES2_RXBUF_BADR_HI, hi));
+ }
+ rxdes->rxdes3 = cpu_to_le32(lower_32_bits(priv->rx_scratch_dma));
}
/* Mark the end of the ring */
rxdes->rxdes0 |= cpu_to_le32(priv->rxdes0_edorr_mask);
@@ -2104,6 +2139,14 @@ static int ftgmac100_probe(struct platform_device *pdev)
netdev->hw_features &= ~(NETIF_F_HW_CSUM | NETIF_F_RXCSUM);
netdev->features |= netdev->hw_features;
+ if (priv->quirks & FTGMAC100_QUIRK_DMA_35BIT) {
+ err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(35));
+ if (err) {
+ dev_err(&pdev->dev, "35-bit DMA enable failed\n");
+ goto err;
+ }
+ }
+
/* register network device */
err = register_netdev(netdev);
if (err) {
@@ -2156,7 +2199,8 @@ static const struct ftgmac100_match_data ftgmac100_match_data_ast2600 = {
static const struct ftgmac100_match_data ftgmac100_match_data_ast2700 = {
.mac_id = FTGMAC100_AST2700,
- .quirks = FTGMAC100_QUIRK_RMII_ENABLE,
+ .quirks = FTGMAC100_QUIRK_RMII_ENABLE |
+ FTGMAC100_QUIRK_DMA_35BIT,
};
static const struct ftgmac100_match_data ftgmac100_match_data_faraday = {
diff --git a/drivers/net/ethernet/faraday/ftgmac100.h b/drivers/net/ethernet/faraday/ftgmac100.h
index 8c35c895b146..0c244b1c0a35 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.h
+++ b/drivers/net/ethernet/faraday/ftgmac100.h
@@ -57,6 +57,9 @@
#define FTGMAC100_OFFSET_RX_RUNT 0xc0
#define FTGMAC100_OFFSET_RX_CRCER_FTL 0xc4
#define FTGMAC100_OFFSET_RX_COL_LOST 0xc8
+/* reserved 0xcc - 0x178 */
+#define FTGMAC100_OFFSET_TXR_BADDR_HIGH 0x17c
+#define FTGMAC100_OFFSET_RXR_BADDR_HIGH 0x18c
/*
* Interrupt status register & interrupt enable register
@@ -226,6 +229,7 @@ struct ftgmac100_txdes {
#define FTGMAC100_TXDES1_TX2FIC (1 << 30)
#define FTGMAC100_TXDES1_TXIC (1 << 31)
+#define FTGMAC100_TXDES2_TXBUF_BADR_HI GENMASK(18, 16)
/*
* Receive descriptor, aligned to 16 bytes
*/
@@ -272,4 +276,6 @@ struct ftgmac100_rxdes {
#define FTGMAC100_RXDES1_UDP_CHKSUM_ERR (1 << 26)
#define FTGMAC100_RXDES1_IP_CHKSUM_ERR (1 << 27)
+#define FTGMAC100_RXDES2_RXBUF_BADR_HI GENMASK(18, 16)
+
#endif /* __FTGMAC100_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH net-next v3 6/6] net: ftgmac100: Allow building on ARM64
2026-10-15 6:46 [PATCH net-next v3 0/6] net: ftgmac100: Add AST2700 support Jacky Chou
` (4 preceding siblings ...)
2026-10-15 6:46 ` [PATCH net-next v3 5/6] net: ftgmac100: Add AST2700 upper DMA address support Jacky Chou
@ 2026-10-15 6:46 ` Jacky Chou
5 siblings, 0 replies; 8+ messages in thread
From: Jacky Chou @ 2026-10-15 6:46 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Po-Yu Chuang,
Eric Dumazet, Heiner Kallweit, Russell King, Eric Dumazet
Cc: netdev, devicetree, linux-kernel, Jacky Chou
Allow the Faraday vendor menu and FTGMAC100 driver to be selected on
ARM64 so AST2700 platforms can enable the MAC. The driver now programs
the upper DMA address fields, so it no longer needs to be marked BROKEN
for 64-bit builds.
AST2700 has no dedicated MACH_ASPEED_G7 symbol; unlike the 32-bit
generations it is only gated by the common ARCH_ASPEED symbol. On
32-bit Aspeed platforms, arch/arm/mach-aspeed/Kconfig nests
MACH_ASPEED_G4/G5/G6 under "if ARCH_ASPEED", so MACH_ASPEED_G6 already
implies ARCH_ASPEED and is redundant once ARCH_ASPEED is part of the
condition. Drop it and select MDIO_ASPEED directly on ARCH_ASPEED.
This does widen the MDIO_ASPEED select beyond AST2600: it is now also
selected for AST2400/AST2500, which keep driving their embedded MDIO
controller from FTGMAC100 itself and have no MDIO node for this driver
to bind to, so it is built but stays unused there. Update the
MDIO_ASPEED help text to describe this.
Signed-off-by: Jacky Chou <jacky_chou@aspeedtech.com>
---
drivers/net/ethernet/faraday/Kconfig | 7 +++----
drivers/net/mdio/Kconfig | 16 ++++++++++------
2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/faraday/Kconfig b/drivers/net/ethernet/faraday/Kconfig
index 474073c7f94d..9acc2d260c1f 100644
--- a/drivers/net/ethernet/faraday/Kconfig
+++ b/drivers/net/ethernet/faraday/Kconfig
@@ -6,7 +6,7 @@
config NET_VENDOR_FARADAY
bool "Faraday devices"
default y
- depends on ARM || COMPILE_TEST
+ depends on ARM || ARM64 || COMPILE_TEST
help
If you have a network (Ethernet) card belonging to this class, say Y.
@@ -28,11 +28,10 @@ config FTMAC100
config FTGMAC100
tristate "Faraday FTGMAC100 Gigabit Ethernet support"
- depends on ARM || COMPILE_TEST
- depends on !64BIT || BROKEN
+ depends on ARM || ARM64 || COMPILE_TEST
select PHYLIB
select FIXED_PHY
- select MDIO_ASPEED if MACH_ASPEED_G6
+ select MDIO_ASPEED if ARCH_ASPEED
select CRC32
help
This driver supports the FTGMAC100 Gigabit Ethernet controller
diff --git a/drivers/net/mdio/Kconfig b/drivers/net/mdio/Kconfig
index d44278f26fab..d784782c230f 100644
--- a/drivers/net/mdio/Kconfig
+++ b/drivers/net/mdio/Kconfig
@@ -50,12 +50,16 @@ config MDIO_ASPEED
depends on OF_MDIO && HAS_IOMEM
help
This module provides a driver for the independent MDIO bus
- controllers found in the ASPEED AST2600 SoC. This is a driver for the
- third revision of the ASPEED MDIO register interface - the first two
- revisions are the "old" and "new" interfaces found in the AST2400 and
- AST2500, embedded in the MAC. For legacy reasons, FTGMAC100 driver
- continues to drive the embedded MDIO controller for the AST2400 and
- AST2500 SoCs, so say N if AST2600 support is not required.
+ controllers found in the ASPEED AST2600 and AST2700 SoCs. This is a
+ driver for the third revision of the ASPEED MDIO register interface -
+ the first two revisions are the "old" and "new" interfaces found in
+ the AST2400 and AST2500, embedded in the MAC. For legacy reasons,
+ FTGMAC100 driver continues to drive the embedded MDIO controller for
+ the AST2400 and AST2500 SoCs. AST2700 has no dedicated MACH_ASPEED_G7
+ symbol and is only gated by ARCH_ASPEED, so FTGMAC100 now
+ unconditionally selects this driver on every ARCH_ASPEED platform,
+ including the older AST2400/AST2500 SoCs where it has no MDIO node to
+ bind to.
config MDIO_BITBANG
tristate "Bitbanged MDIO buses"
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread