Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 May 2024 17:18:09 +0100
From:      Jessica Clarke <jrtc27@freebsd.org>
To:        Andrew Turner <andrew@FreeBSD.org>
Cc:        "src-committers@freebsd.org" <src-committers@FreeBSD.org>, "dev-commits-src-all@freebsd.org" <dev-commits-src-all@FreeBSD.org>, "dev-commits-src-main@freebsd.org" <dev-commits-src-main@FreeBSD.org>
Subject:   Re: git: 097bd33dd7a6 - main - uart: DBG2 support to find the debug uart
Message-ID:  <6E417087-31C3-4B5F-938A-88753F4F9043@freebsd.org>
In-Reply-To: <202405171612.44HGCneJ065061@gitrepo.freebsd.org>
References:  <202405171612.44HGCneJ065061@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 17 May 2024, at 17:12, Andrew Turner <andrew@FreeBSD.org> wrote:
>=20
> The branch main has been updated by andrew:
>=20
> URL: =
https://cgit.FreeBSD.org/src/commit/?id=3D097bd33dd7a687cd3ad7fd4bc7ededa3=
b9e00e28
>=20
> commit 097bd33dd7a687cd3ad7fd4bc7ededa3b9e00e28
> Author:     Andrew Turner <andrew@FreeBSD.org>
> AuthorDate: 2024-03-12 18:15:29 +0000
> Commit:     Andrew Turner <andrew@FreeBSD.org>
> CommitDate: 2024-05-17 16:07:15 +0000
>=20
>    uart: DBG2 support to find the debug uart
>=20
>    The Debug Port Table 2 (DBG2) contains information on which devices
>    can be used for debugging purposes.
>=20
>    Add support to the uart driver to use the DBG2 table when enabled =
from
>    loader.
>=20
>    Sponsored by:   Arm Ltd
>    Differential Revision:  https://reviews.freebsd.org/D44359
> ---
> sys/dev/uart/uart_cpu_acpi.c | 83 =
++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 83 insertions(+)
>=20
> diff --git a/sys/dev/uart/uart_cpu_acpi.c =
b/sys/dev/uart/uart_cpu_acpi.c
> index 9c9ffc1e3194..53fe459e64a1 100644
> --- a/sys/dev/uart/uart_cpu_acpi.c
> +++ b/sys/dev/uart/uart_cpu_acpi.c
> @@ -210,12 +210,95 @@ out:
> return (error);
> }
>=20
> +static int
> +uart_cpu_acpi_dbg2(struct uart_devinfo *di)
> +{
> + vm_paddr_t dbg2_physaddr;
> + ACPI_TABLE_DBG2 *dbg2;
> + ACPI_DBG2_DEVICE *dbg2_dev;
> + ACPI_GENERIC_ADDRESS *base_address;
> + struct acpi_uart_compat_data *cd;
> + struct uart_class *class;
> + int error;
> + bool found;
> +
> + /* Look for the SPCR table. */
> + dbg2_physaddr =3D acpi_find_table(ACPI_SIG_DBG2);
> + if (dbg2_physaddr =3D=3D 0)
> + return (ENXIO);
> +
> + dbg2 =3D acpi_map_table(dbg2_physaddr, ACPI_SIG_DBG2);
> + if (dbg2 =3D=3D NULL) {
> + printf("Unable to map the DBG2 table!\n");
> + return (ENXIO);
> + }
> +
> + error =3D ENXIO;
> +
> + dbg2_dev =3D (ACPI_DBG2_DEVICE *)((vm_offset_t)dbg2 + =
dbg2->InfoOffset);
> + found =3D false;
> + while ((vm_offset_t)dbg2_dev + dbg2_dev->Length <=3D

Can this please use uintptr_t or char * for pointer arithmetic rather
than the not-a-pointer vm_offset_t throughout?

Jess

> +    (vm_offset_t)dbg2 + dbg2->Header.Length) {
> + if (dbg2_dev->PortType !=3D ACPI_DBG2_SERIAL_PORT)
> + goto next;
> +
> + /* XXX: Too restrictive? */
> + if (dbg2_dev->RegisterCount !=3D 1)
> + goto next;
> +
> + cd =3D uart_cpu_acpi_scan(dbg2_dev->PortSubtype);
> + if (cd =3D=3D NULL)
> + goto next;
> +
> + class =3D cd->cd_class;
> + base_address =3D (ACPI_GENERIC_ADDRESS *)
> +    ((vm_offset_t)dbg2_dev + dbg2_dev->BaseAddressOffset);
> +
> + error =3D uart_cpu_acpi_init_devinfo(di, class, base_address);
> + if (error =3D=3D 0) {
> + found =3D true;
> + break;
> + }
> +
> +next:
> + dbg2_dev =3D (ACPI_DBG2_DEVICE *)
> +    ((vm_offset_t)dbg2_dev + dbg2_dev->Length);
> + }
> + if (!found)
> + goto out;
> +
> + /* XXX: Find the correct value */
> + di->baudrate =3D 115200;
> +
> + /* Apply device tweaks. */
> + if ((cd->cd_quirks & UART_F_IGNORE_SPCR_REGSHFT) =3D=3D
> +    UART_F_IGNORE_SPCR_REGSHFT) {
> + di->bas.regshft =3D cd->cd_regshft;
> + }
> +
> + /* Create a bus space handle. */
> + error =3D bus_space_map(di->bas.bst, base_address->Address,
> +    uart_getrange(class), 0, &di->bas.bsh);
> +
> +out:
> + acpi_unmap_table(dbg2);
> + return (error);
> +}
> +
> int
> uart_cpu_acpi_setup(int devtype, struct uart_devinfo *di)
> {
> + char *cp;
> +
> switch(devtype) {
> case UART_DEV_CONSOLE:
> return (uart_cpu_acpi_spcr(devtype, di));
> + case UART_DEV_DBGPORT:
> + /* Use the Debug Port Table 2 (DBG2) to find a debug uart */
> + cp =3D kern_getenv("hw.acpi.enable_dbg2");
> + if (cp !=3D NULL && strcasecmp(cp, "yes") =3D=3D 0)
> + return (uart_cpu_acpi_dbg2(di));
> + break;
> }
> return (ENXIO);
> }




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6E417087-31C3-4B5F-938A-88753F4F9043>