On Mon, 2 Jun 2025 13:10:52 +0800
"[email protected]" <[email protected]> wrote:

> On Sun, 01 Jun 2025 13:23:06 -0400
> "Ted Unangst" <[email protected]> wrote:
> 
> > I think maybe we could go in this direction. This starts adding
> > support for the mux port to pckbc. It's missing the correct probe,
> > but you can change the 0 to 1 and it should work. 
> > 
> > FreeBSD does something like this.
> > 
> > Index: pckbc/pms.c
> > ===================================================================
> > RCS file: /home/cvs/src/sys/dev/pckbc/pms.c,v
> > diff -u -p -r1.101 pms.c
> > --- pckbc/pms.c     28 Apr 2025 13:35:39 -0000      1.101
> > +++ pckbc/pms.c     1 Jun 2025 17:17:03 -0000
> > @@ -717,6 +717,9 @@ pmsprobe(struct device *parent, void *ma
> >     if (pa->pa_slot != PCKBC_AUX_SLOT)
> >             return (0);
> >  
> > +   if (0)
> > +           pckbc_mux_enable(pa->pa_tag, 1);
> > +
> >     /* Flush any garbage. */
> >     pckbc_flush(pa->pa_tag, pa->pa_slot);
> >  
> > Index: ic/i8042reg.h
> > ===================================================================
> > RCS file: /home/cvs/src/sys/dev/ic/i8042reg.h,v
> > diff -u -p -r1.9 i8042reg.h
> > --- ic/i8042reg.h   5 May 2015 16:27:20 -0000       1.9
> > +++ ic/i8042reg.h   1 Jun 2025 17:07:42 -0000
> > @@ -21,6 +21,7 @@
> >  #define     KBC_KBDECHO    0xd2    /* echo to keyboard
> > port */ #define      KBC_AUXECHO    0xd3    /* echo to
> > auxiliary port */ #define    KBC_AUXWRITE   0xd4
> > /* write to auxiliary port */ +#define       KBC_MUXWRITE
> > 0x90        /* write to mux port */ #define
> > KBC_SELFTEST        0xaa    /* start self-test */
> > #define      KBC_KBDTEST    0xab    /* test keyboard
> > port */ #define      KBC_KBDDISABLE 0xad    /*
> > disable keyboard port */ Index: ic/pckbc.c
> > ===================================================================
> > RCS file: /home/cvs/src/sys/dev/ic/pckbc.c,v diff -u -p -r1.55
> > pckbc.c --- ic/pckbc.c      26 Aug 2023 15:01:00 -0000      1.55
> > +++ ic/pckbc.c      1 Jun 2025 17:15:52 -0000
> > @@ -220,7 +220,8 @@ pckbc_send_devcmd(struct pckbc_internal 
> >     bus_space_handle_t ioh_c = t->t_ioh_c;
> >  
> >     if (slot == PCKBC_AUX_SLOT) {
> > -           if (!pckbc_send_cmd(iot, ioh_c, KBC_AUXWRITE))
> > +           int cmd = t->t_muxport ? KBC_MUXWRITE +
> > t->t_muxport : KBC_AUXWRITE;
> > +           if (!pckbc_send_cmd(iot, ioh_c, cmd))
> >                     return (0);
> >     }
> >     if (!pckbc_wait_output(iot, ioh_c))
> > @@ -552,6 +553,13 @@ static struct pckbc_portcmd {
> >             KBC_AUXENABLE, KBC_AUXDISABLE,
> >     }
> >  };
> > +
> > +void
> > +pckbc_mux_enable(pckbc_tag_t self, int port)
> > +{
> > +   struct pckbc_internal *t = (struct pckbc_internal *)self;
> > +   t->t_muxport = port;
> > +}
> >  
> >  void
> >  pckbc_slot_enable(pckbc_tag_t self, pckbc_slot_t slot, int on)
> > Index: ic/pckbcvar.h
> > ===================================================================
> > RCS file: /home/cvs/src/sys/dev/ic/pckbcvar.h,v
> > diff -u -p -r1.17 pckbcvar.h
> > --- ic/pckbcvar.h   25 Jul 2023 10:00:44 -0000      1.17
> > +++ ic/pckbcvar.h   1 Jun 2025 17:17:34 -0000
> > @@ -60,6 +60,7 @@ struct pckbc_internal { 
> >  #define    PCKBC_FIXED_SET3        0x0004
> >  #define    PCKBC_CANT_TRANSLATE    (PCKBC_FIXED_SET2 |
> > PCKBC_FIXED_SET3) int t_haveaux;    /* controller has an aux
> > port */
> > +   int t_muxport;  /* use mux port for aux */
> >  
> >     struct pckbc_slotdata *t_slotdata[PCKBC_NSLOTS];
> >  
> > @@ -107,6 +108,7 @@ int pckbc_poll_data1(bus_space_tag_t, bu
> >  void pckbc_set_poll(pckbc_tag_t, pckbc_slot_t, int);
> >  int pckbc_xt_translation(pckbc_tag_t, int *);
> >  void pckbc_slot_enable(pckbc_tag_t, pckbc_slot_t, int);
> > +void pckbc_mux_enable(pckbc_tag_t, int);
> >  
> >  void pckbc_attach(struct pckbc_softc *, int);
> >  int pckbc_cnattach(bus_space_tag_t, bus_addr_t, bus_size_t, int);
> 
> Apologies for not noticing that the link I provided for the Aux
> Muxing spec proposal (the best documentation I was able to find) had
> rotted. It isn't a spec as such, more of an implementation proposal,
> but I couldn't find a formal spec doc.
> https://www.tonymacx86.com/attachments/ps2-mux-pdf.42272 has another
> copy. According to Section 3.6 Recommended Post Assignments, usually
> port AUX#0 (routing byte 0x90) isn't used, and the first internal
> pointing device is on AUX#1 (0x91). This seems to be the case on
> Let's Notes at least. So maybe KBC_MUXWRITE   0x91 would be a
> better default? I am wondering how Thinkpads with both a touchpad and
> trackpoint are handled by the existing driver. By the "hidden
> multiplexing" described in Sec 2.2?
> 

I built with this patch, (swapping the KBC_MUXWRITE to 0x91 as I'm
pretty sure that's correct according to chris's notes).

I'm running it now, though the touchpad still attaches as a pms0
device. Though, I didn't report this earlier I noticed something:

On the eariler snapshot, the boot process would hang for a brief moment
before attaching wsmouse0, but with this patch, it no longer does this.
Weird. Dmesg of the boot w/ this patch & 0x91 is attached, named
dmesg91.

The touchpad *does* still work in xenocara, but still not attaching as
a synaptics device which is still wrong. 

So, I went back and recompiled with 0x90 in KBC_MUXWRITE,

Same behavior as with 0x91. Dmesg from this boot is attached as dmesg90

Any other testing I can do for y'all is good w/ me. LMK if
there's anything I can help test. Thanks again.

-- 
iz (she/her)

> i like to say mundane things,
> there are too many uninteresting things
> that go unnoticed.

izder456 (dot) neocities (dot) org

Attachment: dmesg91
Description: Binary data

Attachment: dmesg90
Description: Binary data

Reply via email to