From 9ae74e5e4a335ca73a466d91ed7ad287165ed2b6 Mon Sep 17 00:00:00 2001 From: mglocker Date: Wed, 31 Jul 2024 10:07:33 +0000 Subject: [PATCH] Add ufshci(4) at fdt support. This lets me boot the Samsung Galaxy Book4 Edge in DT mode with ufshci(4), based on a WIP DTB file. ok kettenis@ --- share/man/man4/ufshci.4 | 5 ++- sys/arch/arm64/conf/GENERIC | 3 +- sys/arch/arm64/conf/RAMDISK | 3 +- sys/dev/fdt/files.fdt | 5 ++- sys/dev/fdt/ufshci_fdt.c | 90 +++++++++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 sys/dev/fdt/ufshci_fdt.c diff --git a/share/man/man4/ufshci.4 b/share/man/man4/ufshci.4 index 969cb4f725b..4b1cf54c490 100644 --- a/share/man/man4/ufshci.4 +++ b/share/man/man4/ufshci.4 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ufshci.4,v 1.2 2024/04/09 14:58:41 mglocker Exp $ +.\" $OpenBSD: ufshci.4,v 1.3 2024/07/31 10:07:33 mglocker Exp $ .\" .\" Copyright (c) 2023 Marcus Glocker .\" @@ -15,7 +15,7 @@ .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" .\" -.Dd $Mdocdate: April 9 2024 $ +.Dd $Mdocdate: July 31 2024 $ .Dt UFSHCI 4 .Os .Sh NAME @@ -23,6 +23,7 @@ .Nd Universal Flash Storage Host Controller Interface .Sh SYNOPSIS .Cd "ufshci* at acpi?" +.Cd "ufshci* at fdt?" .Cd "ufshci* at pci?" .Sh DESCRIPTION The diff --git a/sys/arch/arm64/conf/GENERIC b/sys/arch/arm64/conf/GENERIC index e2c746bdcb3..f6bb7ef92e1 100644 --- a/sys/arch/arm64/conf/GENERIC +++ b/sys/arch/arm64/conf/GENERIC @@ -1,4 +1,4 @@ -# $OpenBSD: GENERIC,v 1.287 2024/07/30 19:47:05 mglocker Exp $ +# $OpenBSD: GENERIC,v 1.288 2024/07/31 10:07:33 mglocker Exp $ # # GENERIC machine description file # @@ -96,6 +96,7 @@ smmu* at fdt? xhci* at fdt? ccp* at fdt? # AMD Cryptographic Co-processor ipmi* at fdt? +ufshci* at fdt? # NS16550 compatible serial ports com* at fdt? diff --git a/sys/arch/arm64/conf/RAMDISK b/sys/arch/arm64/conf/RAMDISK index 6cb8d2d7389..344acd0f605 100644 --- a/sys/arch/arm64/conf/RAMDISK +++ b/sys/arch/arm64/conf/RAMDISK @@ -1,4 +1,4 @@ -# $OpenBSD: RAMDISK,v 1.217 2024/07/30 19:47:05 mglocker Exp $ +# $OpenBSD: RAMDISK,v 1.218 2024/07/31 10:07:33 mglocker Exp $ machine arm64 maxusers 4 @@ -83,6 +83,7 @@ bwfm* at sdmmc? # Broadcom FullMAC smmu* at fdt? xhci* at fdt? ccp* at fdt? # AMD Cryptographic Co-processor +ufshci* at fdt? # NS16550 compatible serial ports com* at fdt? diff --git a/sys/dev/fdt/files.fdt b/sys/dev/fdt/files.fdt index 3a5a417f058..23d1607f46f 100644 --- a/sys/dev/fdt/files.fdt +++ b/sys/dev/fdt/files.fdt @@ -1,4 +1,4 @@ -# $OpenBSD: files.fdt,v 1.202 2024/03/27 15:15:00 patrick Exp $ +# $OpenBSD: files.fdt,v 1.203 2024/07/31 10:07:33 mglocker Exp $ # # Config file and device description for machine-independent FDT code. # Included by ports that need it. @@ -229,6 +229,9 @@ file dev/fdt/sdhc_fdt.c sdhc_fdt attach xhci at fdt with xhci_fdt file dev/fdt/xhci_fdt.c xhci_fdt +attach ufshci at fdt with ufshci_fdt +file dev/fdt/ufshci_fdt.c ufshci_fdt + device syscon: fdt attach syscon at fdt file dev/fdt/syscon.c syscon diff --git a/sys/dev/fdt/ufshci_fdt.c b/sys/dev/fdt/ufshci_fdt.c new file mode 100644 index 00000000000..92ea5ca4caf --- /dev/null +++ b/sys/dev/fdt/ufshci_fdt.c @@ -0,0 +1,90 @@ +/* $OpenBSD: ufshci_fdt.c,v 1.1 2024/07/31 10:07:33 mglocker Exp $ */ +/* + * Copyright (c) 2024 Marcus Glocker + * + * 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 +#include + +#include + +#include +#include +#include +#include + +#include +#include + +#include + +int ufshci_fdt_match(struct device *, void *, void *); +void ufshci_fdt_attach(struct device *, struct device *, void *); + +const struct cfattach ufshci_fdt_ca = { + sizeof(struct ufshci_softc), + ufshci_fdt_match, + ufshci_fdt_attach +}; + +int +ufshci_fdt_match(struct device *parent, void *match, void *aux) +{ + struct fdt_attach_args *faa = aux; + + return OF_is_compatible(faa->fa_node, "jedec,ufs-2.0"); +} + +void +ufshci_fdt_attach(struct device *parent, struct device *self, void *aux) +{ + struct ufshci_softc *sc = (struct ufshci_softc *)self; + struct fdt_attach_args *faa = aux; + void *ih; + + if (faa->fa_nreg < 1) + return; + + sc->sc_iot = faa->fa_iot; + sc->sc_ios = faa->fa_reg[0].size; + sc->sc_dmat = faa->fa_dmat; + + if (bus_space_map(sc->sc_iot, faa->fa_reg[0].addr, + faa->fa_reg[0].size, 0, &sc->sc_ioh)) { + printf(": can't map registers\n"); + return; + } + + ih = fdt_intr_establish(faa->fa_node, IPL_BIO, + ufshci_intr, sc, sc->sc_dev.dv_xname); + if (ih == NULL) { + printf(": can't establish interrupt\n"); + goto unmap; + } + + clock_set_assigned(faa->fa_node); + clock_enable_all(faa->fa_node); + phy_enable(faa->fa_node, "ufsphy"); + + if (ufshci_attach(sc) != 0) + goto irq; + + return; + +irq: + fdt_intr_disestablish(ih); +unmap: + bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios); +} -- 2.20.1