Module Name: src Committed By: skrll Date: Sun Nov 21 08:44:28 UTC 2021
Modified Files: src/sys/arch/arm/ep93xx: epcom.c epcomvar.h src/sys/arch/evbarm/tsarm: tsarm_machdep.c Log Message: PR port-evbarm/40307 options KGDB doesn't work for some evbarm hosts Apply patch from Lloyd Parkes with some KNF tweaks from me. To generate a diff of this commit: cvs rdiff -u -r1.33 -r1.34 src/sys/arch/arm/ep93xx/epcom.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/ep93xx/epcomvar.h cvs rdiff -u -r1.32 -r1.33 src/sys/arch/evbarm/tsarm/tsarm_machdep.c 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/arm/ep93xx/epcom.c diff -u src/sys/arch/arm/ep93xx/epcom.c:1.33 src/sys/arch/arm/ep93xx/epcom.c:1.34 --- src/sys/arch/arm/ep93xx/epcom.c:1.33 Sun Nov 21 08:25:26 2021 +++ src/sys/arch/arm/ep93xx/epcom.c Sun Nov 21 08:44:28 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: epcom.c,v 1.33 2021/11/21 08:25:26 skrll Exp $ */ +/* $NetBSD: epcom.c,v 1.34 2021/11/21 08:44:28 skrll Exp $ */ /* * Copyright (c) 1998, 1999, 2001, 2002, 2004 The NetBSD Foundation, Inc. * All rights reserved. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: epcom.c,v 1.33 2021/11/21 08:25:26 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: epcom.c,v 1.34 2021/11/21 08:44:28 skrll Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -144,9 +144,13 @@ static struct epcom_cons_softc { bus_addr_t sc_hwbase; int sc_ospeed; tcflag_t sc_cflag; - int sc_attached; } epcomcn_sc; +static int epcom_common_getc(struct epcom_cons_softc *, dev_t); +static void epcom_common_putc(struct epcom_cons_softc *, int); +static void epcominit(struct epcom_cons_softc *, bus_space_tag_t, + bus_addr_t, bus_space_handle_t, int, tcflag_t); + static struct cnm_state epcom_cnm_state; extern struct cfdriver epcom_cd; @@ -180,6 +184,19 @@ struct consdev epcomcons = { NULL, NULL, NODEV, CN_NORMAL }; +#if defined(KGDB) +#include <sys/kgdb.h> + +static int epcom_kgdb_getc(void *); +static void epcom_kgdb_putc(void *, int); + +/* + * Reuse the console softc structure because + * we'll be reusing the console I/O code. + */ +static struct epcom_cons_softc kgdb_sc; +#endif + #ifndef DEFAULT_COMSPEED #define DEFAULT_COMSPEED 115200 #endif @@ -197,7 +214,6 @@ epcom_attach_subr(struct epcom_softc *sc if (sc->sc_iot == epcomcn_sc.sc_iot && sc->sc_hwbase == epcomcn_sc.sc_hwbase) { - epcomcn_sc.sc_attached = 1; sc->sc_lcrlo = EPCOMSPEED2BRD(epcomcn_sc.sc_ospeed) & 0xff; sc->sc_lcrmid = EPCOMSPEED2BRD(epcomcn_sc.sc_ospeed) >> 8; @@ -236,6 +252,18 @@ epcom_attach_subr(struct epcom_softc *sc aprint_normal("%s: console\n", device_xname(sc->sc_dev)); } +#ifdef KGDB + /* + * Allow kgdb to "take over" this port. If this is + * the kgdb device, it has exclusive use. + */ + if (sc->sc_iot == kgdb_sc.sc_iot && + sc->sc_hwbase == kgdb_sc.sc_hwbase) { + SET(sc->sc_hwflags, COM_HW_KGDB); + printf("%s: kgdb\n", sc->sc_dev.dv_xname); + } +#endif + sc->sc_si = softint_establish(SOFTINT_SERIAL, epcomsoft, sc); #ifdef RND_COM @@ -786,35 +814,11 @@ int epcomcnattach(bus_space_tag_t iot, bus_addr_t iobase, bus_space_handle_t ioh, int ospeed, tcflag_t cflag) { - u_int lcrlo, lcrmid, lcrhi, ctrl, pwrcnt; - bus_space_handle_t syscon_ioh; - cn_tab = &epcomcons; cn_init_magic(&epcom_cnm_state); cn_set_magic("\047\001"); - epcomcn_sc.sc_iot = iot; - epcomcn_sc.sc_ioh = ioh; - epcomcn_sc.sc_hwbase = iobase; - epcomcn_sc.sc_ospeed = ospeed; - epcomcn_sc.sc_cflag = cflag; - - lcrhi = cflag2lcrhi(cflag); - lcrlo = EPCOMSPEED2BRD(ospeed) & 0xff; - lcrmid = EPCOMSPEED2BRD(ospeed) >> 8; - ctrl = Ctrl_UARTE; - - bus_space_map(iot, EP93XX_APB_HWBASE + EP93XX_APB_SYSCON, - EP93XX_APB_SYSCON_SIZE, 0, &syscon_ioh); - pwrcnt = bus_space_read_4(iot, syscon_ioh, EP93XX_SYSCON_PwrCnt); - pwrcnt &= ~(PwrCnt_UARTBAUD); - bus_space_write_4(iot, syscon_ioh, EP93XX_SYSCON_PwrCnt, pwrcnt); - bus_space_unmap(iot, syscon_ioh, EP93XX_APB_SYSCON_SIZE); - - bus_space_write_4(iot, ioh, EPCOM_LinCtrlLow, lcrlo); - bus_space_write_4(iot, ioh, EPCOM_LinCtrlMid, lcrmid); - bus_space_write_4(iot, ioh, EPCOM_LinCtrlHigh, lcrhi); - bus_space_write_4(iot, ioh, EPCOM_Ctrl, ctrl); + epcominit(&epcomcn_sc, iot, iobase, ioh, ospeed, cflag); return (0); } @@ -833,9 +837,15 @@ epcomcnpollc(dev_t dev, int on) void epcomcnputc(dev_t dev, int c) { + epcom_common_putc(&epcomcn_sc, c); +} + +static void +epcom_common_putc(struct epcom_cons_softc *sc, int c) +{ int s; - bus_space_tag_t iot = epcomcn_sc.sc_iot; - bus_space_handle_t ioh = epcomcn_sc.sc_ioh; + bus_space_tag_t iot = sc->sc_iot; + bus_space_handle_t ioh = sc->sc_ioh; s = splserial(); @@ -857,10 +867,16 @@ epcomcnputc(dev_t dev, int c) int epcomcngetc(dev_t dev) { + return epcom_common_getc (&epcomcn_sc, dev); +} + +static int +epcom_common_getc(struct epcom_cons_softc *sc, dev_t dev) +{ int c, sts; int s; - bus_space_tag_t iot = epcomcn_sc.sc_iot; - bus_space_handle_t ioh = epcomcn_sc.sc_ioh; + bus_space_tag_t iot = sc->sc_iot; + bus_space_handle_t ioh = sc->sc_ioh; s = splserial(); @@ -1138,3 +1154,79 @@ epcomintr(void* arg) #endif return (1); } + +#ifdef KGDB +int +epcom_kgdb_attach(bus_space_tag_t iot, bus_addr_t iobase, int rate, + tcflag_t cflag) +{ + bus_space_handle_t ioh; + + if (iot == epcomcn_sc.sc_iot && iobase == epcomcn_sc.sc_hwbase) { +#if !defined(DDB) + return EBUSY; /* cannot share with console */ +#else + /* + * XXX I have no intention of ever testing and code path + * implied by getting here + */ + kgdb_sc = epcomcn_sc; +#endif + } else { + bus_space_map(iot, iobase, EP93XX_APB_UART_SIZE, 0, &ioh); + epcominit(&kgdb_sc, iot, iobase, ioh, rate, cflag); + } + + kgdb_attach(epcom_kgdb_getc, epcom_kgdb_putc, &kgdb_sc); + kgdb_dev = 123; /* unneeded, only to satisfy some tests */ + + return 0; +} + +static int +epcom_kgdb_getc (void *sc) +{ + return epcom_common_getc(sc, NODEV); +} + +static void +epcom_kgdb_putc (void *sc, int c) +{ + epcom_common_putc(sc, c); +} +#endif /* KGDB */ + +/* + * Common code used for initialisation of the console or KGDB connection + */ +static void +epcominit(struct epcom_cons_softc *sc, bus_space_tag_t iot, + bus_addr_t iobase, bus_space_handle_t ioh, int rate, tcflag_t cflag) +{ + u_int lcrlo, lcrmid, lcrhi, ctrl, pwrcnt; + bus_space_handle_t syscon_ioh; + + sc->sc_iot = iot; + sc->sc_ioh = ioh; + sc->sc_hwbase = iobase; + sc->sc_ospeed = rate; + sc->sc_cflag = cflag; + + lcrhi = cflag2lcrhi(cflag); + lcrlo = EPCOMSPEED2BRD(rate) & 0xff; + lcrmid = EPCOMSPEED2BRD(rate) >> 8; + ctrl = Ctrl_UARTE; + + /* Make sure the UARTs are clocked at the system default rate */ + bus_space_map(iot, EP93XX_APB_HWBASE + EP93XX_APB_SYSCON, + EP93XX_APB_SYSCON_SIZE, 0, &syscon_ioh); + pwrcnt = bus_space_read_4(iot, syscon_ioh, EP93XX_SYSCON_PwrCnt); + pwrcnt &= ~(PwrCnt_UARTBAUD); + bus_space_write_4(iot, syscon_ioh, EP93XX_SYSCON_PwrCnt, pwrcnt); + bus_space_unmap(iot, syscon_ioh, EP93XX_APB_SYSCON_SIZE); + + bus_space_write_4(iot, ioh, EPCOM_LinCtrlLow, lcrlo); + bus_space_write_4(iot, ioh, EPCOM_LinCtrlMid, lcrmid); + bus_space_write_4(iot, ioh, EPCOM_LinCtrlHigh, lcrhi); + bus_space_write_4(iot, ioh, EPCOM_Ctrl, ctrl); +} Index: src/sys/arch/arm/ep93xx/epcomvar.h diff -u src/sys/arch/arm/ep93xx/epcomvar.h:1.8 src/sys/arch/arm/ep93xx/epcomvar.h:1.9 --- src/sys/arch/arm/ep93xx/epcomvar.h:1.8 Tue Apr 14 20:32:35 2015 +++ src/sys/arch/arm/ep93xx/epcomvar.h Sun Nov 21 08:44:28 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: epcomvar.h,v 1.8 2015/04/14 20:32:35 riastradh Exp $ */ +/* $NetBSD: epcomvar.h,v 1.9 2021/11/21 08:44:28 skrll Exp $ */ /*- * Copyright (c) 2004 Jesse Off * @@ -96,5 +96,6 @@ void epcom_attach_subr(struct epcom_soft int epcomintr(void* arg); int epcomcnattach(bus_space_tag_t, bus_addr_t, bus_space_handle_t, int, tcflag_t); +int epcom_kgdb_attach(bus_space_tag_t, bus_addr_t, int, tcflag_t); #endif /* _EPCOMVAR_H_ */ Index: src/sys/arch/evbarm/tsarm/tsarm_machdep.c diff -u src/sys/arch/evbarm/tsarm/tsarm_machdep.c:1.32 src/sys/arch/evbarm/tsarm/tsarm_machdep.c:1.33 --- src/sys/arch/evbarm/tsarm/tsarm_machdep.c:1.32 Tue Aug 17 22:00:29 2021 +++ src/sys/arch/evbarm/tsarm/tsarm_machdep.c Sun Nov 21 08:44:28 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: tsarm_machdep.c,v 1.32 2021/08/17 22:00:29 andvar Exp $ */ +/* $NetBSD: tsarm_machdep.c,v 1.33 2021/11/21 08:44:28 skrll Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tsarm_machdep.c,v 1.32 2021/08/17 22:00:29 andvar Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tsarm_machdep.c,v 1.33 2021/11/21 08:44:28 skrll Exp $"); #include "opt_arm_debug.h" #include "opt_console.h" @@ -829,8 +829,8 @@ consinit(void) #if KGDB #if NEPCOM > 0 if (strcmp(kgdb_devname, "epcom") == 0) { - com_kgdb_attach(&ep93xx_bs_tag, kgdb_devaddr, kgdb_devrate, - kgdb_devmode); + epcom_kgdb_attach(&ep93xx_bs_tag, kgdb_devaddr, kgdb_devrate, + kgdb_devmode); } #endif /* NEPCOM > 0 */ #endif /* KGDB */