Hi, all.

 I made a patch to make sys/dev/pci/puccn.c usable than before.
This is NOT perfect, but it's better than before. I think this
patch is useful for further work, for example, to support MMIO
com device and support such devicees that the registers are
4 byte aligned without compile time option.

 http://www.netbsd.org/~msaitoh/puccn_20140124.dif

--------------------------------------
 - Fix a bug that the puc cn mechanism doesn't use the UART's frequency
   in pucdata.c's table.

 - Add a new option PUC_CNAUTO. If this option is set, consinit() in
   x86/x86/consinit.c checks puc com device to use it as console.
   Without this option, the behavior is the same as before.

 - Add a new config parameter PUC_CNBUS. The old code scans bus #0 only.
   If PUC_CNBUS is set, the specified number's bus will be scanned.

 - Rename comcnprobe() to puc_cnprobe() to make it clear.

 - Rename comcninit() to puc_cninit() to make it clear.

 - Add code for a device that a device's com register is MMIO (#if0 ed).
--------------------------------------


Index: sys/arch/x86/pci/pci_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/pci/pci_machdep.c,v
retrieving revision 1.63
diff -u -r1.63 pci_machdep.c
--- sys/arch/x86/pci/pci_machdep.c      25 Dec 2013 17:24:39 -0000      1.63
+++ sys/arch/x86/pci/pci_machdep.c      23 Jan 2014 18:56:22 -0000
@@ -110,6 +110,7 @@
 #include "opt_acpi.h"
 #include "opt_ddb.h"
 #include "opt_mpbios.h"
+#include "opt_puc.h"
 #include "opt_vga.h"
 #include "pci.h"
 #include "wsdisplay.h"
@@ -963,14 +964,21 @@
        return NULL;
 }

+#ifndef PUC_CNBUS
+#define PUC_CNBUS 0
+#endif
+
 #if NCOM > 0
 int
-cpu_comcnprobe(struct consdev *cn, struct pci_attach_args *pa)
+cpu_puc_cnprobe(struct consdev *cn, struct pci_attach_args *pa)
 {
        pci_mode_detect();
        pa->pa_iot = x86_bus_space_io;
+       pa->pa_memt = x86_bus_space_mem;
        pa->pa_pc = 0;
-       pa->pa_tag = pci_make_tag(0, 0, pci_bus_maxdevs(NULL, 0) - 1, 0);
+       pa->pa_tag = pci_make_tag(0, PUC_CNBUS, pci_bus_maxdevs(NULL, 0) - 1,
+                                 0);
+
        return 0;
 }
 #endif
Index: sys/arch/x86/x86/consinit.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/consinit.c,v
retrieving revision 1.24
diff -u -r1.24 consinit.c
--- sys/arch/x86/x86/consinit.c 13 Oct 2012 17:58:55 -0000      1.24
+++ sys/arch/x86/x86/consinit.c 23 Jan 2014 18:56:22 -0000
@@ -30,6 +30,7 @@
 __KERNEL_RCSID(0, "$NetBSD: consinit.c,v 1.24 2012/10/13 17:58:55 jdc Exp $");

 #include "opt_kgdb.h"
+#include "opt_puc.h"

 #include <sys/param.h>
 #include <sys/systm.h>
@@ -42,6 +43,7 @@
 #include "vga.h"
 #include "ega.h"
 #include "pcdisplay.h"
+#include "com_puc.h"
 #if (NVGA > 0) || (NEGA > 0) || (NPCDISPLAY > 0)
 #include <dev/ic/mc6845reg.h>
 #include <dev/ic/pcdisplayvar.h>
@@ -76,6 +78,9 @@
 #include <dev/ic/comreg.h>
 #include <dev/ic/comvar.h>
 #endif
+#if (NCOM_PUC > 0)
+#include <dev/pci/puccn.h>
+#endif

 #include "ukbd.h"
 #if (NUKBD > 0)
@@ -144,6 +149,7 @@
        const struct btinfo_console *consinfo;
        const struct btinfo_framebuffer *fbinfo;
        static int initted;
+       int rv;

        if (initted)
                return;
@@ -204,15 +210,22 @@
                int addr = consinfo->addr;
                int speed = consinfo->speed;

+#if (NCOM_PUC > 0) && defined(PUC_CNAUTO)
+               puc_cnprobe(NULL);
+               rv = puc_cninit(NULL);
+               if (rv == 0)
+                       return;
+#endif
+
                if (addr == 0)
                        addr = CONADDR;
                if (speed == 0)
                        speed = CONSPEED;

-               if (comcnattach(x86_bus_space_io, addr, speed,
-                               COM_FREQ, COM_TYPE_NORMAL, comcnmode))
+               rv = comcnattach(x86_bus_space_io, addr, speed,
+                                COM_FREQ, COM_TYPE_NORMAL, comcnmode);
+               if (rv != 0)
                        panic("can't init serial console @%x", consinfo->addr);
-
                return;
        }
 #endif
Index: sys/dev/pci/files.pci
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/files.pci,v
retrieving revision 1.368
diff -u -r1.368 files.pci
--- sys/dev/pci/files.pci       21 Jan 2014 14:52:07 -0000      1.368
+++ sys/dev/pci/files.pci       23 Jan 2014 18:56:23 -0000
@@ -604,9 +604,11 @@
 attach puc at pci
 file   dev/pci/puc.c                   puc
 file   dev/pci/pucdata.c               puc
+defflag opt_puc.h      PUC_CNAUTO
+defparam opt_puc.h     PUC_CNBUS

 attach com at puc with com_puc
-file   dev/pci/com_puc.c               com_puc
+file   dev/pci/com_puc.c               com_puc needs-flag
 file   dev/pci/cyber.c                 com_puc
 file   dev/pci/puccn.c                 com_puc

Index: sys/dev/pci/puccn.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/puccn.c,v
retrieving revision 1.12
diff -u -r1.12 puccn.c
--- sys/dev/pci/puccn.c 23 Jan 2014 17:43:28 -0000      1.12
+++ sys/dev/pci/puccn.c 23 Jan 2014 18:56:23 -0000
@@ -75,6 +75,7 @@

 static bus_addr_t puccnbase;
 static bus_space_tag_t puctag;
+static int puccnflags;

 #ifdef KGDB
 static bus_addr_t pucgdbbase;
@@ -99,11 +100,10 @@

        /* Fetch our tags */
 #if defined(amd64) || defined(i386)
-       if (cpu_comcnprobe(cn, &pa) != 0)
+       if (cpu_puc_cnprobe(cn, &pa) != 0)
 #endif
                return 0;

-       puctag = pa.pa_iot;
        pci_decompose_tag(pa.pa_pc, pa.pa_tag, &bus, &maxdev, NULL);

        /* Scan through devices and find a communication class device. */
@@ -145,6 +145,8 @@
         */
        if (!foundport)
                return 0;
+
+       /* Clear foundport flag */
        foundport = 0;

        /* Check whether the device is in the puc device table or not */
@@ -166,12 +168,21 @@
        {
                if (desc->ports[i].type != PUC_PORT_TYPE_COM)
                        continue;
+               puccnflags = desc->ports[i].flags;
                base = pci_conf_read(pa.pa_pc, pa.pa_tag, desc->ports[i].bar);
                base += desc->ports[i].offset;

-               if (PCI_MAPREG_TYPE(base) != PCI_MAPREG_TYPE_IO)
-                       continue;
-               base = PCI_MAPREG_IO_ADDR(base);
+               if (PCI_MAPREG_TYPE(base) == PCI_MAPREG_TYPE_IO) {
+                       puctag = pa.pa_iot;
+                       base = PCI_MAPREG_IO_ADDR(base);
+               }
+#if 0 /* For MMIO device */
+               else {
+                       puctag = pa.pa_memt;
+                       base = PCI_MAPREG_MEM_ADDR(base);
+               }
+#endif
+
                if (com_is_console(puctag, base, NULL))
                        continue;
                foundport = 1;
@@ -183,8 +194,13 @@
                goto resume_scan;
        }

+#if 0
        cn->cn_pri = CN_REMOTE;
-       return PCI_MAPREG_IO_ADDR(base);
+#else
+       if (cn)
+               cn->cn_pri = CN_REMOTE;
+#endif
+       return base;
 }

 #ifdef KGDB
@@ -211,19 +227,21 @@
 #endif

 void
-comcnprobe(struct consdev *cn)
+puc_cnprobe(struct consdev *cn)
 {

        puccnbase = pucprobe_doit(cn);
 }

-void
-comcninit(struct consdev *cn)
+int
+puc_cninit(struct consdev *cn)
 {
+
        if (puccnbase == 0)
-               return;
+               return -1;

-       comcnattach(puctag, puccnbase, CONSPEED, COM_FREQ, COM_TYPE_NORMAL,
+       return comcnattach(puctag, puccnbase, CONSPEED,
+           puccnflags & PUC_COM_CLOCKMASK, COM_TYPE_NORMAL,
            CONMODE);
 }

Index: sys/dev/pci/puccn.h
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/puccn.h,v
retrieving revision 1.5
diff -u -r1.5 puccn.h
--- sys/dev/pci/puccn.h 22 Jul 2013 13:40:36 -0000      1.5
+++ sys/dev/pci/puccn.h 23 Jan 2014 18:56:23 -0000
@@ -35,6 +35,7 @@
  */

 #include <dev/cons.h>
+#include <dev/pci/pcivar.h>

 /*
  * Machine independent support for PCI serial console support.
@@ -44,4 +45,6 @@
  * used before the normal PCI bus initialization.
  */

-int cpu_comcnprobe(struct consdev *, struct pci_attach_args *);
+void puc_cnprobe(struct consdev *);
+int puc_cninit(struct consdev *);
+int cpu_puc_cnprobe(struct consdev *, struct pci_attach_args *);

-- 
-----------------------------------------------
                SAITOH Masanobu (msai...@execsw.org
                                 msai...@netbsd.org)

Reply via email to