Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/hp700/gsc add console support, based on other platf...



details:   https://anonhg.NetBSD.org/src/rev/c7e71dba559f
branches:  trunk
changeset: 556062:c7e71dba559f
user:      chs <chs%NetBSD.org@localhost>
date:      Sun Dec 07 02:17:22 2003 +0000

description:
add console support, based on other platforms.  from Jochen Kunz.

diffstat:

 sys/arch/hp700/gsc/com_gsc.c |  96 ++++++++++++++++++-------------------------
 1 files changed, 40 insertions(+), 56 deletions(-)

diffs (165 lines):

diff -r 5c52b0487f64 -r c7e71dba559f sys/arch/hp700/gsc/com_gsc.c
--- a/sys/arch/hp700/gsc/com_gsc.c      Sun Dec 07 02:01:25 2003 +0000
+++ b/sys/arch/hp700/gsc/com_gsc.c      Sun Dec 07 02:17:22 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: com_gsc.c,v 1.8 2003/11/20 03:58:47 chs Exp $  */
+/*     $NetBSD: com_gsc.c,v 1.9 2003/12/07 02:17:22 chs Exp $  */
 
 /*     $OpenBSD: com_gsc.c,v 1.8 2000/03/13 14:39:59 mickey Exp $      */
 
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: com_gsc.c,v 1.8 2003/11/20 03:58:47 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: com_gsc.c,v 1.9 2003/12/07 02:17:22 chs Exp $");
 
 #include "opt_kgdb.h"
 
@@ -56,6 +56,7 @@
 
 #include <hp700/dev/cpudevs.h>
 #include <hp700/gsc/gscbusvar.h>
+#include <hp700/hp700/machdep.h>
 
 #define        COMGSC_OFFSET   0x800
 #define        COMGSC_FREQUENCY (1843200 * 4) /* 16-bit baud rate divisor */
@@ -66,10 +67,10 @@
 
 struct com_gsc_softc {
        struct  com_softc sc_com;       /* real "com" softc */
- 
+
        /* GSC-specific goo. */
        void    *sc_ih;                 /* interrupt handler */
-}; 
+};
 
 int    com_gsc_probe(struct device *, struct cfdata *, void *);
 void   com_gsc_attach(struct device *, struct device *, void *);
@@ -81,47 +82,12 @@
 com_gsc_probe(struct device *parent, struct cfdata *match, void *aux)
 {
        struct gsc_attach_args *ga = aux;
-       bus_space_handle_t ioh;
-       int rv;
 
        if (ga->ga_type.iodc_type != HPPA_TYPE_FIO ||
            (ga->ga_type.iodc_sv_model != HPPA_FIO_GRS232 &&
-            (ga->ga_type.iodc_sv_model != HPPA_FIO_RS232)))
+            ga->ga_type.iodc_sv_model != HPPA_FIO_RS232))
                return 0;
 
-#if 1
-       /*
-        * XXX fredette - don't match anything unless it
-        * happens to be the KGDB port, since any other
-        * port might be a serial console, and I haven't
-        * done any console work yet.
-        */
-       if (
-#ifdef KGDB
-           ga->ga_hpa != KGDBADDR
-#else
-           /* CONSTCOND */ 1
-#endif
-           )
-               return 0;
-#endif
-
-       /*
-        * If this port is the console or a KGDB port,
-        * we definitely match, otherwise map and probe
-        * the port.
-        */
-       if (!com_is_console(ga->ga_iot, ga->ga_hpa + COMGSC_OFFSET, 0)) {
-               if (bus_space_map(ga->ga_iot, ga->ga_hpa + COMGSC_OFFSET, 
-                                 COM_NPORTS, 0, &ioh))
-                       return 0;
-               rv = comprobe1(ga->ga_iot, ioh);
-               bus_space_unmap(ga->ga_iot, ioh, COM_NPORTS);
-               if (!rv)
-                       return 0;
-       }
-
-       /* Success. */
        return 1;
 }
 
@@ -131,6 +97,7 @@
        struct com_gsc_softc *gsc = (void *)self;
        struct com_softc *sc = &gsc->sc_com;
        struct gsc_attach_args *ga = aux;
+       int pagezero_cookie;
 
        sc->sc_hwflags = 0;
        sc->sc_swflags = 0;
@@ -138,22 +105,41 @@
        sc->sc_iobase = (bus_addr_t)ga->ga_hpa + COMGSC_OFFSET;
        sc->sc_frequency = COMGSC_FREQUENCY;
 
+       /* Test if this is the console.  Compare either HPA or device path. */
+       pagezero_cookie = hp700_pagezero_map();
+       if ((hppa_hpa_t)PAGE0->mem_cons.pz_hpa == ga->ga_hpa ) {
+
+               /*
+                * This port is the console.  In this case we must call
+                * comcnattach() and later com_is_console() to initialize
+                * everything properly.
+                */
+
+               if (comcnattach(sc->sc_iot, sc->sc_iobase, B9600,
+                   sc->sc_frequency, COM_TYPE_NORMAL,
+                   (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8) != 0) {
+                       printf(": can't comcnattach\n");
+                       hp700_pagezero_unmap(pagezero_cookie);
+                       return;
+               }
+       }
+       hp700_pagezero_unmap(pagezero_cookie);
+
+       /*
+        * Get the already initialized console ioh via com_is_console() if
+        * this is the console or map the I/O space if this isn't the console.
+        */
+
        if (!com_is_console(sc->sc_iot, sc->sc_iobase, &sc->sc_ioh) &&
-           bus_space_map(sc->sc_iot, sc->sc_iobase,
-                         COM_NPORTS, 0, &sc->sc_ioh)) {
-               printf(": can't map i/o space\n");
+           bus_space_map(sc->sc_iot, sc->sc_iobase, COM_NPORTS, 0,
+           &sc->sc_ioh) != 0) {
+               printf(": can't map I/O space\n");
                return;
        }
 
-#if notyet
-       *(volatile u_int8_t *)ga->ga_hpa = 0xd0;        /* reset */
-       DELAY(1000);
-#endif
-
        com_attach_subr(sc);
        gsc->sc_ih = hp700_intr_establish(&sc->sc_dev, IPL_TTY,
-                                         comintr, sc,
-                                         ga->ga_int_reg, ga->ga_irq);
+           comintr, sc, ga->ga_int_reg, ga->ga_irq);
 }
 
 #ifdef KGDB
@@ -165,12 +151,10 @@
 
        printf("kgdb: attaching com at 0x%x at %d baud...",
                KGDBADDR, KGDBRATE);
-       error = com_kgdb_attach(&hppa_bustag, 
-                               KGDBADDR + COMGSC_OFFSET, 
-                               KGDBRATE, COMGSC_FREQUENCY,
-                               COM_TYPE_NORMAL,
-          /* 8N1 */
-          ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8));
+       error = com_kgdb_attach(&hppa_bustag, KGDBADDR + COMGSC_OFFSET,
+                               KGDBRATE, COMGSC_FREQUENCY, COM_TYPE_NORMAL,
+                               ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) |
+                                CS8));
        if (error) {
                printf(" failed (%d)\n", error);
        } else {



Home | Main Index | Thread Index | Old Index