Index | Thread | Search

From:
Theo Buehler <tb@theobuehler.org>
Subject:
Re: puc(4): make NM9900 attach
To:
Mark Kettenis <mark.kettenis@xs4all.nl>
Cc:
tech@openbsd.org
Date:
Thu, 3 Jul 2025 23:45:29 +0200

Download raw body.

Thread
On Thu, Jul 03, 2025 at 11:22:29PM +0200, Mark Kettenis wrote:
> > Date: Thu, 3 Jul 2025 10:49:00 +0200
> > From: Theo Buehler <tb@theobuehler.org>
> > 
> > On my Dell Precision 3640 build box I'm trying to get a serial
> > card (the one recommended by Dell) to work as kernel console. 
> > With the diff below the card attaches as
> > 
> > puc0 at pci3 dev 0 function 0 "NetMos Nm9900" rev 0x00: ports: 16 com
> > com4 at puc0 port 0 apic 2 int 16: st16650, 32 byte fifo
> > 
> > and after editing /etc/ttys to contain
> > 
> > tty04   "/usr/libexec/getty std.9600" vt220   on  secure
> > 
> > I can log in using 'cu -l usb0.0.000010 -s 9600' once init
> > ran on that machine.
> > 
> > The 'mach comaddr 0x00003000/0x0008' + 'set tty com4' bit described here
> 
> Hmm, I don't think the '/0x0008' bit is right.  But it probably
> doesn't matter.

Oh right. I should have deleted the /0x0008 part since this is just
strtou* parsing the first part of the number up to the /.

> > https://marc.info/?l=openbsd-misc&m=144159112421386&w=2
> > doesn't seem to work. Not sure if this is expected to work for efiboot
> > at all.
> 
> I don't see why it wouldn't work with efiboot, but I'm not sure I ever
> tested it.

ok, thanks. Maybe I just haven't managed to figure out the correct magic.

> > Here's the relevant bit of the pcidump.
> > 
> >  3:0:0: NetMos unknown
> > 	0x0000: Vendor ID: 9710, Product ID: 9900
> > 	0x0004: Command: 0100, Status: 0010
> 
> Hmm, that means PCI_COMMAND_IO_ENABLE isn't set, which means the
> device won't respond to io access.  That makes sense if the
> information was collected using a kernel that didn't include your
> diff.  Is that correct?

That's right. I thought it'd be better to show what's there without
my fiddling/guesswork, so I'm sure it's coherent.

My diff changes the information as follows, so the _IO_ _MEM_ and _MASTER_
commnds are enabled, if I understand correctly. 'n vectors (1 enabled)'
is added to all PCI devices with MSIs, where n is one of 1, 8, or 32.

--- nodiff	Thu Jul  3 23:25:49 2025
+++ withdiff	Thu Jul  3 23:26:01 2025
@@ -1,6 +1,6 @@
  3:0:0: NetMos unknown
 	0x0000: Vendor ID: 9710, Product ID: 9900
-	0x0004: Command: 0100, Status: 0010
+	0x0004: Command: 0107, Status: 0010
 	0x0008:	Class: 07 Communications, Subclass: 00 Serial,
 		Interface: 02, Revision: 00
 	0x000c: BIST: 00, Header Type: 80, Latency Timer: 00,
@@ -17,7 +17,7 @@
 	0x0038: 00000000
 	0x003c: Interrupt Pin: 01 Line: ff Min Gnt: 00 Max Lat: 00
 	0x0050: Capability 0x05: Message Signalled Interrupts (MSI)
-		Enabled: no
+		Enabled: no; 8 vectors (1 enabled)
 	0x0078: Capability 0x01: Power Management
 		State: D0
 	0x0080: Capability 0x10: PCI Express

or in full:

 3:0:0: NetMos unknown
	0x0000: Vendor ID: 9710, Product ID: 9900
	0x0004: Command: 0107, Status: 0010
	0x0008:	Class: 07 Communications, Subclass: 00 Serial,
		Interface: 02, Revision: 00
	0x000c: BIST: 00, Header Type: 80, Latency Timer: 00,
		Cache Line Size: 10
	0x0010: BAR io addr: 0x00003000/0x0008
	0x0014: BAR mem 32bit addr: 0x91101000/0x00001000
	0x0018: BAR empty (00000000)
	0x001c: BAR empty (00000000)
	0x0020: BAR empty (00000000)
	0x0024: BAR mem 32bit addr: 0x91100000/0x00001000
	0x0028: Cardbus CIS: 00000000
	0x002c: Subsystem Vendor ID: a000 Product ID: 1000
	0x0030: Expansion ROM Base Address: 00000000
	0x0038: 00000000
	0x003c: Interrupt Pin: 01 Line: ff Min Gnt: 00 Max Lat: 00
	0x0050: Capability 0x05: Message Signalled Interrupts (MSI)
		Enabled: no; 8 vectors (1 enabled)
	0x0078: Capability 0x01: Power Management
		State: D0
	0x0080: Capability 0x10: PCI Express
		Max Payload Size: 256 / 512 bytes
		Max Read Request Size: 512 bytes
		Link Speed: 2.5 / 2.5 GT/s
		Link Width: x1 / x1
	0x0100: Enhanced Capability 0x02: Virtual Channel Capability
	0x0800: Enhanced Capability 0x01: Advanced Error Reporting

> 
> > 	0x0008:	Class: 07 Communications, Subclass: 00 Serial,
> > 		Interface: 02, Revision: 00
> > 	0x000c: BIST: 00, Header Type: 80, Latency Timer: 00,
> > 		Cache Line Size: 10
> > 	0x0010: BAR io addr: 0x00003000/0x0008
> > 	0x0014: BAR mem 32bit addr: 0x91101000/0x00001000
> > 	0x0018: BAR empty (00000000)
> > 	0x001c: BAR empty (00000000)
> > 	0x0020: BAR empty (00000000)
> > 	0x0024: BAR mem 32bit addr: 0x91100000/0x00001000
> > 	0x0028: Cardbus CIS: 00000000
> > 	0x002c: Subsystem Vendor ID: a000 Product ID: 1000
> > 	0x0030: Expansion ROM Base Address: 00000000
> > 	0x0038: 00000000
> > 	0x003c: Interrupt Pin: 01 Line: ff Min Gnt: 00 Max Lat: 00
> > 	0x0050: Capability 0x05: Message Signalled Interrupts (MSI)
> > 		Enabled: no
> > 	0x0078: Capability 0x01: Power Management
> > 		State: D0
> > 	0x0080: Capability 0x10: PCI Express
> > 		Max Payload Size: 256 / 512 bytes
> > 		Max Read Request Size: 512 bytes
> > 		Link Speed: 2.5 / 2.5 GT/s
> > 		Link Width: x1 / x1
> > 	0x0100: Enhanced Capability 0x02: Virtual Channel Capability
> > 	0x0800: Enhanced Capability 0x01: Advanced Error Reporting
> > 
> > The pucdata.c diff is adapted from the NM9901, omitting the parallel part
> > since I couldn't find any hint on that in my dump.
> > 
> > There was another, much more involved, puc(4) diff recently but this one
> > should not conflict with it and seems independent:
> > https://marc.info/?l=openbsd-tech&m=175080329526382&w=2
> 
> This diff is ok kettenis@

Thanks.

> 
> > Index: sys/dev/pci/pcidevs
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/pcidevs,v
> > diff -u -p -r1.2101 pcidevs
> > --- sys/dev/pci/pcidevs	21 Jun 2025 20:17:35 -0000	1.2101
> > +++ sys/dev/pci/pcidevs	23 Jun 2025 13:42:52 -0000
> > @@ -7822,6 +7822,7 @@ product NETMOS NM9820		0x9820	Nm9820
> >  product NETMOS NM9835		0x9835	Nm9835
> >  product NETMOS NM9845		0x9845	Nm9845
> >  product NETMOS NM9865		0x9865	Nm9865
> > +product NETMOS NM9900		0x9900	Nm9900
> >  product NETMOS NM9901		0x9901	Nm9901
> >  product NETMOS NM9922		0x9922	Nm9922
> >  
> > Index: sys/dev/pci/pucdata.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/pucdata.c,v
> > diff -u -p -r1.121 pucdata.c
> > --- sys/dev/pci/pucdata.c	9 Nov 2024 10:23:06 -0000	1.121
> > +++ sys/dev/pci/pucdata.c	19 Jun 2025 18:18:40 -0000
> > @@ -1665,6 +1665,15 @@ const struct puc_device_description puc_
> >  	},
> >  
> >  	/* NetMos PCIe Peripheral Controller :UART part */
> > +	{   /* "NetMos NM9900 UART" */
> > +	    {   PCI_VENDOR_NETMOS, PCI_PRODUCT_NETMOS_NM9900, 0xa000, 0x1000 },
> > +	    {	0xffff,	0xffff,				      0xffff, 0xffff },
> > +	    {
> > +		{ PUC_PORT_COM, 0x10, 0x0000 },
> > +	    },
> > +	},
> > +
> > +	/* NetMos PCIe Peripheral Controller :UART part */
> >  	{   /* "NetMos NM9901 UART" */
> >  	    {   PCI_VENDOR_NETMOS, PCI_PRODUCT_NETMOS_NM9901, 0xa000, 0x1000 },
> >  	    {	0xffff,	0xffff,				      0xffff, 0xffff },
> > 
> >