On Mon, Jul 11, 2022 at 12:13:38PM +0200, Mark Kettenis wrote:
> > Date: Wed, 06 Jul 2022 15:45:05 -0500
> > From: j...@entropicblur.com
> > 
> > Hi all,
> > 
> > I had an unused Le Potato SBC lying around, so I took a crack at 
> > installing OpenBSD/arm64 on it. The board is similar to the supported 
> > ODROID-C4 and can boot the install kernel successfully, but there are 
> > many unconfigured devices. I was not able to complete an install because 
> > neither USB nor microSD storage was available. The dwge network 
> > interface is detected but nonfunctional because the PHY is not 
> > configured.
> > 
> > I understand that this is an unsupported board and I had no expectation 
> > of success or support, but I'm passing this info along in case there is 
> > any developer interest.
> > 
> > For reference, this is the board:
> > 
> > https://libre.computer/products/s905x/
> > 
> > I used the meson-gxl-s905x-libretech-cc.dtb file from OpenBSD's dtb 
> > package and the u-boot-2020-07-r1.sd.bin from here:
> > 
> > http://share.loverpi.com/board/libre-computer-project/libre-computer-board/aml-s905x-cc/firmware/
> > 
> > I used the latest snap miniroot71.img, dated July 06.
> > 
> > Dmesg from the install kernel:
> > 
> > Copyright (c) 1982, 1986, 1989, 1991, 1993
> >          The Regents of the University of California.  All rights 
> > reserved.
> > Copyright (c) 1995-2022 OpenBSD. All rights reserved.  
> > https://www.OpenBSD.org
> > 
> > OpenBSD 7.1-current (RAMDISK) #1616: Tue Jul  5 10:44:45 MDT 2022
> >      dera...@arm64.openbsd.org:/usr/src/sys/arch/arm64/compile/RAMDISK
> > real mem  = 2039029760 (1944MB)
> > avail mem = 1939697664 (1849MB)
> > random: good seed from bootblocks
> > mainbus0 at root: Libre Computer AML-S905X-CC
> > psci0 at mainbus0: PSCI 0.2
> > cpu0 at mainbus0 mpidr 0: ARM Cortex-A53 r0p4
> > cpu0: 32KB 64b/line 2-way L1 VIPT I-cache, 32KB 64b/line 4-way L1 
> > D-cache
> > cpu0: 256KB 64b/line 16-way L2 cache
> > cpu0: CRC32,SHA2,SHA1,AES+PMULL,ASID16
> > efi0 at mainbus0: UEFI 2.8
> > efi0: Das U-Boot rev 0x20200700
> > "arm-pmu" at mainbus0 not configured
> > agtimer0 at mainbus0: 24000 kHz
> > "xtal-clk" at mainbus0 not configured
> > "firmware" at mainbus0 not configured
> > "efuse" at mainbus0 not configured
> > "scpi" at mainbus0 not configured
> > simplebus0 at mainbus0: "soc"
> > ampintc0 at simplebus0 nirq 256, ncpu 4: "interrupt-controller"
> > simplebus1 at simplebus0: "bus"
> > "interrupt-controller" at simplebus1 not configured
> > "reset-controller" at simplebus1 not configured
> > "adc" at simplebus1 not configured
> > "clock-measure" at simplebus1 not configured
> > "spi" at simplebus1 not configured
> > "watchdog" at simplebus1 not configured
> > "sram" at simplebus0 not configured
> > simplebus2 at simplebus0: "bus"
> > syscon0 at simplebus2: "sys-ctrl"
> > "power-controller-vpu" at syscon0 not configured
> > "clock-controller" at syscon0 not configured
> > syscon1 at simplebus2: "ao-secure"
> > "cec" at simplebus2 not configured
> > amluart0 at simplebus2: console
> > "ir" at simplebus2 not configured
> > "pinctrl" at simplebus2 not configured
> > "video-codec" at simplebus0 not configured
> > simplebus3 at simplebus0: "bus"
> > amlrng0 at simplebus3
> > "pinctrl" at simplebus3 not configured
> > "eth-phy-mux" at simplebus3 not configured
> > simplebus4 at simplebus0: "bus"
> > "video-lut" at simplebus4 not configured
> > simplebus5 at simplebus0: "bus"
> > syscon2 at simplebus5: "system-controller"
> > "clock-controller" at syscon2 not configured
> > "mailbox" at simplebus5 not configured
> > dwge0 at simplebus0: rev 0x37, address ea:b1:7f:b1:44:67
> > dwge0: no PHY found!
> > simplebus6 at simplebus0: "apb"
> > "mmc" at simplebus6 not configured
> > "mmc" at simplebus6 not configured
> > "phy" at simplebus6 not configured
> > "phy" at simplebus6 not configured
> > "phy" at simplebus6 not configured
> > "gpu" at simplebus6 not configured
> > "vpu" at simplebus0 not configured
> > "hdmi-tx" at simplebus0 not configured
> > "usb" at simplebus0 not configured
> > "crypto" at simplebus0 not configured
> > "cvbs-connector" at mainbus0 not configured
> > "emmc-pwrseq" at mainbus0 not configured
> > "hdmi-connector" at mainbus0 not configured
> > "leds" at mainbus0 not configured
> > "regulator-hdmi-5v" at mainbus0 not configured
> > "regulator-vcc_3v3" at mainbus0 not configured
> > "regulator-vcc-card" at mainbus0 not configured
> > "regulator-vddio_ao18" at mainbus0 not configured
> > "regulator-vddio_boot" at mainbus0 not configured
> > simplefb0 at mainbus0: 720x576, 32bpp
> > wsdisplay0 at simplefb0
> > wsdisplay0: screen 0 added (std, vt100 emulation)
> > softraid0 at root
> > scsibus0 at softraid0: 256 targets
> > root on rd0a swap on rd0b dump on rd0b
> > WARNING: CHECK AND RESET THE DATE!
> > 
> > If there is any developer interest, I'm happy to do what I can to help.
> 
> Hi Joe,
> 
> This board is based on a different SoC than the ODROID-C4.  We'll need
> to add support for this SoC to the amlclock(4), amlreset(4),
> amplpinctrl(4) and amldwusb(4) drivers.  Shouldn't be too difficult
> but it is a bit of work.  If you're willing to test diffs with a
> relatively quick tunraround I can give it a go.  Otherwise somebody
> would need to send me a board with that SoC.

I also took a look a this and decided to order a device. One thing I did
notice is that we lack a driver for the phy supply referenced from the
node that hopefully can attach as amlusbphy(4):

        phy@78000 {
                compatible = "amlogic,meson-gxl-usb2-phy";
                #phy-cells = <0x00>;
                reg = <0x00 0x78000 0x00 0x20>;
                clocks = <0x03 0x37>;
                clock-names = "phy";
                resets = <0x11 0x22>;
                reset-names = "phy";
                status = "okay";
                phy-supply = <0x2b>;
                phandle = <0x33>;
        };

        ...

        regulator-hdmi-5v {
                compatible = "regulator-fixed";
                regulator-name = "HDMI_5V";
                regulator-min-microvolt = <0x4c4b40>;
                regulator-max-microvolt = <0x4c4b40>;
                gpio = <0x23 0x13 0x00>;
                enable-active-high;
                regulator-always-on;
                phandle = <0x2b>;
        };

Being able to enable this regulator looks crucial based on this commit
from Linux:

        
https://github.com/torvalds/linux/commit/b83687f359d9b4128073f06ab7a06489eb04aa7c

I wrote a quick driver that attaches to all regulator-fixed nodes,
making all of them available through the regulator(9) API. This should
make the regulator_enable() call in amlusbphy(4) work. I'm wondering if
this approach makes sense or if a driver with more "restrictive" match
semantics is desirable?

diff --git sys/arch/arm64/conf/GENERIC sys/arch/arm64/conf/GENERIC
index 752643e8ce0..adc7459c9ab 100644
--- sys/arch/arm64/conf/GENERIC
+++ sys/arch/arm64/conf/GENERIC
@@ -94,6 +94,7 @@ ipmi*         at fdt?
 com*           at fdt?
 
 # Generic devices
+fxpwr*         at fdt? early 1
 iicmux*                at fdt?
 iic*           at iicmux?
 pinctrl*       at fdt? early 1
diff --git sys/arch/arm64/conf/RAMDISK sys/arch/arm64/conf/RAMDISK
index 94977fdff7d..ce030639992 100644
--- sys/arch/arm64/conf/RAMDISK
+++ sys/arch/arm64/conf/RAMDISK
@@ -82,6 +82,7 @@ ccp*          at fdt?         # AMD Cryptographic Co-processor
 com*           at fdt?
 
 # Generic devices
+fxpwr*         at fdt? early 1
 iicmux*                at fdt?
 iic*           at iicmux?
 pinctrl*       at fdt? early 1
diff --git sys/dev/fdt/files.fdt sys/dev/fdt/files.fdt
index ca24869c0f1..fb2216b3118 100644
--- sys/dev/fdt/files.fdt
+++ sys/dev/fdt/files.fdt
@@ -616,3 +616,7 @@ file        dev/fdt/gpiorestart.c           gpiorestart
 device tascodec
 attach tascodec at i2c
 file   dev/fdt/tascodec.c              tascodec
+
+device fxpwr
+attach fxpwr at fdt
+file   dev/fdt/fxpwr.c                 fxpwr
diff --git sys/dev/fdt/fxpwr.c sys/dev/fdt/fxpwr.c
new file mode 100644
index 00000000000..38fa7b94d72
--- /dev/null
+++ sys/dev/fdt/fxpwr.c
@@ -0,0 +1,67 @@
+/*     $OpenBSD$       */
+/*
+ * Copyright (c) 2022 Anton Lindqvist <an...@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+
+#include <machine/fdt.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_regulator.h>
+
+struct fxpwr_softc {
+       struct device           sc_dev;
+       struct regulator_device sc_rd;
+};
+
+int    fxpwr_match(struct device *, void *, void *);
+void   fxpwr_attach(struct device *, struct device *, void *);
+
+const struct cfattach fxpwr_ca = {
+       sizeof(struct fxpwr_softc), fxpwr_match, fxpwr_attach,
+       NULL, NULL,
+};
+
+struct cfdriver fxpwr_cd = {
+       NULL, "fxpwr", DV_DULL
+};
+
+int
+fxpwr_match(struct device *parent, void *match, void *aux)
+{
+       struct fdt_attach_args *fa = aux;
+
+       return OF_is_compatible(fa->fa_node, "regulator-fixed");
+}
+
+void
+fxpwr_attach(struct device *parent, struct device *self, void *aux)
+{
+       struct fxpwr_softc *sc = (struct fxpwr_softc *)self;
+       struct fdt_attach_args *fa = aux;
+       char name[32];
+
+       if (OF_getprop(fa->fa_node, "regulator-name", name, sizeof(name)) > 0) {
+               name[sizeof(name) - 1] = 0;
+               printf(": \"%s\"", name);
+       }
+       printf("\n");
+
+       sc->sc_rd.rd_node = fa->fa_node;
+       regulator_register(&sc->sc_rd);
+}

Reply via email to