Module Name: src Committed By: skrll Date: Sat Oct 26 15:49:43 UTC 2024
Modified Files: src/sys/arch/riscv/conf: GENERIC64 src/sys/arch/riscv/starfive: files.starfive Added Files: src/sys/arch/riscv/starfive: jh7100_gmac.c jh7110_eqos.c jh71x0_eth.c jh71x0_eth.h Log Message: risc-v: add ethernet support on JH71[01]0 support At present only the JH7110 EQOS support is enabled as it work. The JH7100 has cache coherency issues that need handling before the gmac can be enabled. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/riscv/conf/GENERIC64 cvs rdiff -u -r1.4 -r1.5 src/sys/arch/riscv/starfive/files.starfive cvs rdiff -u -r0 -r1.1 src/sys/arch/riscv/starfive/jh7100_gmac.c \ src/sys/arch/riscv/starfive/jh7110_eqos.c \ src/sys/arch/riscv/starfive/jh71x0_eth.c \ src/sys/arch/riscv/starfive/jh71x0_eth.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/riscv/conf/GENERIC64 diff -u src/sys/arch/riscv/conf/GENERIC64:1.11 src/sys/arch/riscv/conf/GENERIC64:1.12 --- src/sys/arch/riscv/conf/GENERIC64:1.11 Mon Aug 19 07:33:55 2024 +++ src/sys/arch/riscv/conf/GENERIC64 Sat Oct 26 15:49:43 2024 @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC64,v 1.11 2024/08/19 07:33:55 skrll Exp $ +# $NetBSD: GENERIC64,v 1.12 2024/10/26 15:49:43 skrll Exp $ # # GENERIC machine description file # @@ -90,5 +90,14 @@ usb* at usbus? include "dev/usb/usbdevices.config" midi* at midibus? +# Ethernet +#awge* at fdt? # DesignWare Gigabit Ethernet +eqos* at fdt? # DesignWare Ethernet QoS + +# MII/PHY support +micphy* at mii? phy ? # Micrel KSZ[89]xxx PHYs +mcommphy* at mii? phy ? # Motorcomm YT8511C/YT8511H PHYs +ukphy* at mii? phy ? # generic unknown PHYs + # Pull in optional local configuration - always at end cinclude "arch/riscv/conf/GENERIC64.local" Index: src/sys/arch/riscv/starfive/files.starfive diff -u src/sys/arch/riscv/starfive/files.starfive:1.4 src/sys/arch/riscv/starfive/files.starfive:1.5 --- src/sys/arch/riscv/starfive/files.starfive:1.4 Sat Jul 27 07:09:50 2024 +++ src/sys/arch/riscv/starfive/files.starfive Sat Oct 26 15:49:43 2024 @@ -1,4 +1,4 @@ -# $NetBSD: files.starfive,v 1.4 2024/07/27 07:09:50 skrll Exp $ +# $NetBSD: files.starfive,v 1.5 2024/10/26 15:49:43 skrll Exp $ # # Configuration info for StarFive SoCs # @@ -23,3 +23,14 @@ file arch/riscv/starfive/jh71x0_usb.c j device jh7100pinctrl attach jh7100pinctrl at fdt with jh7100_pinctrl file arch/riscv/starfive/jh7100_pinctrl.c jh7100_pinctrl + +# Ethernet +# JH7100 GMAC +attach awge at fdt with jh7100_gmac + +# JH7110 EOQS +attach eqos at fdt with jh7110_eqos + +file arch/riscv/starfive/jh7100_gmac.c jh7100_gmac +file arch/riscv/starfive/jh7110_eqos.c jh7110_eqos +file arch/riscv/starfive/jh71x0_eth.c jh7100_gmac | jh7110_eqos Added files: Index: src/sys/arch/riscv/starfive/jh7100_gmac.c diff -u /dev/null src/sys/arch/riscv/starfive/jh7100_gmac.c:1.1 --- /dev/null Sat Oct 26 15:49:43 2024 +++ src/sys/arch/riscv/starfive/jh7100_gmac.c Sat Oct 26 15:49:43 2024 @@ -0,0 +1,160 @@ +/* $NetBSD: jh7100_gmac.c,v 1.1 2024/10/26 15:49:43 skrll Exp $ */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: jh7100_gmac.c,v 1.1 2024/10/26 15:49:43 skrll Exp $"); + +#include <sys/param.h> + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/rndsource.h> + +#include <net/if_ether.h> +#include <net/if_media.h> + +#include <dev/fdt/fdtvar.h> + +#include <dev/mii/miivar.h> + +#include <dev/ic/dwc_gmac_var.h> +#include <dev/ic/dwc_gmac_reg.h> + +#include <prop/proplib.h> + +#include <riscv/starfive/jh71x0_eth.h> + +struct jh7100_gmac_softc { + struct dwc_gmac_softc sc_gmac; + struct jh71x0_eth_softc sc_jh71x0eth; +}; + +static void +jh7100_gmac_set_speed(struct dwc_gmac_softc *gmac_sc, int speed) +{ + struct jh7100_gmac_softc * const sc = + container_of(gmac_sc, struct jh7100_gmac_softc, sc_gmac); + struct jh71x0_eth_softc * const jheth_sc = &sc->sc_jh71x0eth; + + u_int rate = clk_get_rate(jheth_sc->sc_clk_tx); + switch (speed) { + case IFM_10_T: + rate = 2500000; + break; + case IFM_100_TX: + rate = 25000000; + break; + case IFM_1000_T: + rate = 125000000; + default: + // error unsupported + break; + } + + int error = clk_set_rate(jheth_sc->sc_clk_tx, rate); + if (error) + aprint_error_dev(jheth_sc->sc_dev, "failed to set TX rate %u", + rate); +} + +static int +jh7100_gmac_intr(void *arg) +{ + return dwc_gmac_intr(arg); +} + +/* Compat string(s) */ +static const struct device_compatible_entry compat_data[] = { + { .compat = "starfive,jh7100-dwmac" }, + DEVICE_COMPAT_EOL +}; + +static int +jh7100_gmac_match(device_t parent, cfdata_t cf, void *aux) +{ + struct fdt_attach_args * const faa = aux; + + return of_compatible_match(faa->faa_phandle, compat_data); +} + +static void +jh7100_gmac_attach(device_t parent, device_t self, void *aux) +{ + struct jh7100_gmac_softc * const sc = device_private(self); + struct jh71x0_eth_softc * const jheth_sc = &sc->sc_jh71x0eth; + struct dwc_gmac_softc * const gmac_sc = &sc->sc_gmac; + struct fdt_attach_args * const faa = aux; + const int phandle = faa->faa_phandle; + char intrstr[128]; + int error; + + sc->sc_gmac.sc_dev = self; + sc->sc_gmac.sc_bst = faa->faa_bst; + sc->sc_gmac.sc_dmat = faa->faa_dmat; + sc->sc_jh71x0eth.sc_dev = self; + sc->sc_jh71x0eth.sc_phy = MII_PHY_ANY; + sc->sc_jh71x0eth.sc_type = JH71X0ETH_GMAC; + + error = jh71x0_eth_attach(jheth_sc, faa, &sc->sc_gmac.sc_bsh); + if (error) + return; + + if (sc->sc_jh71x0eth.sc_clk_tx) { + sc->sc_gmac.sc_set_speed = jh7100_gmac_set_speed; + } + + aprint_naive("\n"); + aprint_normal(": Gigabit Ethernet Controller\n"); + + error = dwc_gmac_attach(gmac_sc, sc->sc_jh71x0eth.sc_phy, + GMAC_MII_CLK_150_250M_DIV102); + if (error) + return; + + if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) { + aprint_error(": failed to decode interrupt\n"); + return; + } + void *ih = fdtbus_intr_establish_xname(phandle, 0, IPL_NET, + FDT_INTR_MPSAFE, jh7100_gmac_intr, sc, device_xname(self)); + if (ih == NULL) { + aprint_error_dev(self, "failed to establish interrupt on %s\n", + intrstr); + // XXXNH unwind + return; + } + aprint_normal_dev(self, "interrupting on %s\n", intrstr); +} + + +CFATTACH_DECL_NEW(jh7100_gmac, sizeof(struct jh7100_gmac_softc), + jh7100_gmac_match, jh7100_gmac_attach, NULL, NULL); Index: src/sys/arch/riscv/starfive/jh7110_eqos.c diff -u /dev/null src/sys/arch/riscv/starfive/jh7110_eqos.c:1.1 --- /dev/null Sat Oct 26 15:49:43 2024 +++ src/sys/arch/riscv/starfive/jh7110_eqos.c Sat Oct 26 15:49:43 2024 @@ -0,0 +1,167 @@ +/* $NetBSD: jh7110_eqos.c,v 1.1 2024/10/26 15:49:43 skrll Exp $ */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: jh7110_eqos.c,v 1.1 2024/10/26 15:49:43 skrll Exp $"); + +#include <sys/param.h> + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/rndsource.h> + +#include <net/if_ether.h> +#include <net/if_media.h> + +#include <dev/fdt/fdtvar.h> +#include <dev/fdt/syscon.h> // maybe not + +#include <dev/mii/miivar.h> + +#include <dev/ic/dwc_eqos_var.h> + +#include <prop/proplib.h> + +#include <riscv/starfive/jh71x0_eth.h> + + + + +struct jh7110_eqos_softc { + struct eqos_softc sc_eqos; + struct jh71x0_eth_softc sc_jh71x0eth; +}; + +static void +jh7110_parse_phyprops(struct jh7110_eqos_softc *jh_sc, int phandle) +{ + struct eqos_softc * const sc = &jh_sc->sc_eqos; + prop_dictionary_t dict = device_properties(sc->sc_dev); + + if (of_hasprop(phandle, "motorcomm,tx-clk-adj-enabled")) { + prop_dictionary_set_bool(dict, "motorcomm,tx-clk-adj-enabled", + true); + } + if (of_hasprop(phandle, "motorcomm,tx-clk-100-inverted")) { + prop_dictionary_set_bool(dict, "motorcomm,tx-clk-100-inverted", + true); + } + if (of_hasprop(phandle, "motorcomm,tx-clk-1000-inverted")) { + prop_dictionary_set_bool(dict, "motorcomm,tx-clk-1000-inverted", + true); + } + + uint32_t val; + if (of_getprop_uint32(phandle, + "motorcomm,rx-clk-drv-microamp", &val) == 0) { + prop_dictionary_set_uint32(dict, + "motorcomm,rx-clk-drv-microamp", val); + } + if (of_getprop_uint32(phandle, + "motorcomm,rx-data-drv-microamp", &val) == 0) { + prop_dictionary_set_uint32(dict, + "motorcomm,rx-data-drv-microamp", val); + } + if (of_getprop_uint32(phandle, + "rx-internal-delay-ps", &val) == 0) { + prop_dictionary_set_uint32(dict, + "rx-internal-delay-ps", val); + } + if (of_getprop_uint32(phandle, + "tx-internal-delay-ps", &val) == 0) { + prop_dictionary_set_uint32(dict, + "tx-internal-delay-ps", val); + } +} + +/* Compat string(s) */ +static const struct device_compatible_entry compat_data[] = { + { .compat = "starfive,jh7110-dwmac" }, + DEVICE_COMPAT_EOL +}; + +static int +jh7110_eqos_match(device_t parent, cfdata_t cf, void *aux) +{ + struct fdt_attach_args * const faa = aux; + + return of_compatible_match(faa->faa_phandle, compat_data); +} +static void +jh7110_eqos_attach(device_t parent, device_t self, void *aux) +{ + struct jh7110_eqos_softc * const sc = device_private(self); + struct jh71x0_eth_softc * const jheth_sc = &sc->sc_jh71x0eth; + struct eqos_softc * const eqos_sc = &sc->sc_eqos; + struct fdt_attach_args * const faa = aux; + const int phandle = faa->faa_phandle; + char intrstr[128]; + int error; + + sc->sc_eqos.sc_dev = self; + sc->sc_eqos.sc_bst = faa->faa_bst; + sc->sc_eqos.sc_dmat = faa->faa_dmat; + sc->sc_jh71x0eth.sc_dev = self; + sc->sc_jh71x0eth.sc_phy = MII_PHY_ANY; + sc->sc_jh71x0eth.sc_type = JH71X0ETH_EQOS; + + error = jh71x0_eth_attach(jheth_sc, faa, &sc->sc_eqos.sc_bsh); + if (error) + return; + + jh7110_parse_phyprops(sc, sc->sc_jh71x0eth.sc_phandle_phy); + +// aprint_naive("\n"); +// aprint_normal(": Gigabit Ethernet Controller\n"); + +#define CSR_RATE_RGMII 125000000 /* default */ + eqos_sc->sc_csr_clock = CSR_RATE_RGMII; + error = eqos_attach(eqos_sc); + if (error) + return; + if (!fdtbus_intr_str(phandle, 0, intrstr, sizeof(intrstr))) { + aprint_error(": failed to decode interrupt\n"); + return; + } + void *ih = fdtbus_intr_establish_xname(phandle, 0, IPL_NET, + FDT_INTR_MPSAFE, eqos_intr, eqos_sc, device_xname(self)); + if (ih == NULL) { + aprint_error_dev(self, "failed to establish interrupt on %s\n", + intrstr); + // XXXNH unwind + return; + } + aprint_normal_dev(self, "interrupting on %s\n", intrstr); +} + +CFATTACH_DECL_NEW(jh7110_eqos, sizeof(struct jh7110_eqos_softc), + jh7110_eqos_match, jh7110_eqos_attach, NULL, NULL); Index: src/sys/arch/riscv/starfive/jh71x0_eth.c diff -u /dev/null src/sys/arch/riscv/starfive/jh71x0_eth.c:1.1 --- /dev/null Sat Oct 26 15:49:43 2024 +++ src/sys/arch/riscv/starfive/jh71x0_eth.c Sat Oct 26 15:49:43 2024 @@ -0,0 +1,179 @@ +/* $NetBSD: jh71x0_eth.c,v 1.1 2024/10/26 15:49:43 skrll Exp $ */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: jh71x0_eth.c,v 1.1 2024/10/26 15:49:43 skrll Exp $"); + +#include <sys/param.h> + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/rndsource.h> + +#include <net/if_ether.h> +#include <net/if_media.h> + +#include <dev/fdt/fdtvar.h> +#include <dev/fdt/syscon.h> + +#include <dev/mii/miivar.h> + +//#include <prop/proplib.h> + +#include <riscv/starfive/jh71x0_eth.h> + + +/* Register definitions */ + +#define STARFIVE_GMAC_PHY_INFT_RGMII 0x1 +#define STARFIVE_GMAC_PHY_INFT_RMII 0x4 +#define STARFIVE_GMAC_PHY_INFT_MASK __BITS(2, 0) + +#define JH7100_SYSMAIN_REGISTER49_DLYCHAIN 0xc8 + +static void +jh71x0_eth_set_phy_rgmii_id(struct jh71x0_eth_softc *jh_sc) +{ + const uint32_t reg = jh_sc->sc_phy_syscon_reg; + const uint32_t shift = jh_sc->sc_phy_syscon_shift; + + syscon_lock(jh_sc->sc_syscon); + uint32_t val = syscon_read_4(jh_sc->sc_syscon, reg); + val &= ~(STARFIVE_GMAC_PHY_INFT_MASK << shift); + val |= STARFIVE_GMAC_PHY_INFT_RGMII << shift; + syscon_write_4(jh_sc->sc_syscon, reg, val); + + if (jh_sc->sc_type == JH71X0ETH_GMAC) { + syscon_write_4(jh_sc->sc_syscon, + JH7100_SYSMAIN_REGISTER49_DLYCHAIN, 4); + } + + syscon_unlock(jh_sc->sc_syscon); +} + + +int +jh71x0_eth_attach(struct jh71x0_eth_softc *jh_sc, struct fdt_attach_args *faa, + bus_space_handle_t *bshp) +{ + const int phandle = faa->faa_phandle; + int phandle_phy; + bus_addr_t addr; + bus_size_t size; + int error; + int n; + + error = fdtbus_get_reg(phandle, 0, &addr, &size); + if (error) { + aprint_error(": couldn't get registers\n"); + return ENXIO; + } + + int len; + const u_int * const syscon_data = + fdtbus_get_prop(phandle, "starfive,syscon", &len); + if (syscon_data == NULL) { + aprint_error(": couldn't get 'starfive,syscon' property\n"); + return ENXIO; + } + if (len != 3 * sizeof(uint32_t)) { + aprint_error(": incorrect syscon data (len = %u)\n", + len); + return ENXIO; + } + + const int syscon_phandle = + fdtbus_get_phandle_from_native(be32dec(&syscon_data[0])); + + jh_sc->sc_syscon = fdtbus_syscon_lookup(syscon_phandle); + if (jh_sc->sc_syscon == NULL) { + aprint_error(": couldn't get syscon\n"); + return ENXIO; + } + + jh_sc->sc_phy_syscon_reg = be32dec(&syscon_data[1]); + jh_sc->sc_phy_syscon_shift = be32dec(&syscon_data[2]); + + if (bus_space_map(faa->faa_bst, addr, size, 0, bshp) != 0) { + aprint_error(": couldn't map registers\n"); + return ENXIO; + } + + /* enable clocks */ + struct clk *clk; + fdtbus_clock_assign(phandle); + for (n = 0; (clk = fdtbus_clock_get_index(phandle, n)) != NULL; n++) { + if (clk_enable(clk) != 0) { + aprint_error(": couldn't enable clock #%d\n", n); + return ENXIO; + } + } + /* de-assert resets */ + struct fdtbus_reset *rst; + for (n = 0; (rst = fdtbus_reset_get_index(phandle, n)) != NULL; n++) { + if (fdtbus_reset_deassert(rst) != 0) { + aprint_error(": couldn't de-assert reset #%d\n", n); + return ENXIO; + } + } + + const char *phy_mode = fdtbus_get_string(phandle, "phy-mode"); + if (phy_mode == NULL) + phy_mode = "rgmii-id"; /* default: RGMII */ + + phandle_phy = fdtbus_get_phandle(phandle, "phy-handle"); + if (phandle_phy > 0) { + of_getprop_uint32(phandle_phy, "reg", &jh_sc->sc_phy); + } + jh_sc->sc_phandle_phy = phandle_phy; + + if (strncmp(phy_mode, "rgmii-id", 8) == 0) { + jh71x0_eth_set_phy_rgmii_id(jh_sc); + } else { + aprint_error(": unsupported phy-mode '%s'\n", phy_mode); + return ENXIO; + } + + if (!of_hasprop(phandle, "starfive,tx-use-rgmii-clk")) { + jh_sc->sc_clk_tx = fdtbus_clock_get(phandle, "tx"); + } + + const uint8_t *macaddr = fdtbus_get_prop(phandle, "local-mac-address", + &len); + if (macaddr != NULL && len == ETHER_ADDR_LEN) { + prop_dictionary_t prop = device_properties(jh_sc->sc_dev); + prop_dictionary_set_data(prop, "mac-address", macaddr, len); + } + + return 0; +} + Index: src/sys/arch/riscv/starfive/jh71x0_eth.h diff -u /dev/null src/sys/arch/riscv/starfive/jh71x0_eth.h:1.1 --- /dev/null Sat Oct 26 15:49:43 2024 +++ src/sys/arch/riscv/starfive/jh71x0_eth.h Sat Oct 26 15:49:43 2024 @@ -0,0 +1,59 @@ +/* $NetBSD: jh71x0_eth.h,v 1.1 2024/10/26 15:49:43 skrll Exp $ */ + +/*- + * Copyright (c) 2024 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _STARFIVE_JH71X0ETH_H +#define _STARFIVE_JH71X0ETH_H + +enum jh7x10_eth_type { + JH71X0ETH_GMAC, + JH71X0ETH_EQOS, +}; + + +struct jh71x0_eth_softc { + enum jh7x10_eth_type sc_type; + device_t sc_dev; + + struct syscon * sc_syscon; + uint32_t sc_phy_syscon_reg; + uint32_t sc_phy_syscon_shift; + + int sc_phandle_phy; + int sc_phy; + + struct clk * sc_clk_tx; +}; + + +int jh71x0_eth_attach(struct jh71x0_eth_softc *, struct fdt_attach_args *, + bus_space_handle_t *); + +#endif