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>