On Thu, Feb 23, 2023 at 05:46:04PM +0300, Mikhail wrote: > On Thu, Feb 16, 2023 at 02:34:11PM +0300, Mikhail wrote: > > We have a redmi laptop where I want to install OpenBSD current, but > > the keyboard there is not functional, install image boots fine, but > > when I try to press any key, after a delay of 1-2 seconds, I see a > > repetitive echo on the screen. For example, I'd like to answer 'i' for > > the initial installer question, but instead of 'i' I get 'iiiiiii', > > pressing backspace removes all seven i's. > > > > External USB keyboard works fine, also native keyboard works fine in > > boot> prompt. > > > > Currently I have only webmail access, so I'd better include the dmesg > > as attachment, otherwise gmail will insert line breaks or fix it > > another way if I paste it directly. > > I tried to use latest ubuntu on this laptop and keyboard didn't work > with it also, Kali linux worked fine though. > > After some googling I came up with the following patch to linux kernel: > https://lore.kernel.org/all/20220712020058.90374-1-gch981...@gmail.com/ > > I compiled linux 6.1.12 on Kali with and without the patch and I can > confirm that without the patch my keyboard becomes non-functional. > > The laptop is Redmi Book Pro 14 2022.
DSDT defines KBC0's (PNP0303, a keyboard) IRQ as IRQ (Edge, ActiveLow, Shared, ) and pckbc_isa_attach defaults to ActiveHigh. As the link in my previous email says: > There's an active low keyboard IRQ on AMD Ryzen 6000 and it will stay > this way on newer platforms. With the inlined patch I'm able to use native laptop keyboard, but I'm sure it will break other keyboards. Does anyone has an idea how to improve it? diff --git a/sys/dev/isa/pckbc_isa.c b/sys/dev/isa/pckbc_isa.c index e94fd7e52..ca7ec6c9f 100644 --- a/sys/dev/isa/pckbc_isa.c +++ b/sys/dev/isa/pckbc_isa.c @@ -140,7 +140,7 @@ pckbc_isa_attach(struct device *parent, struct device *self, void *aux) for (slot = 0; slot < PCKBC_NSLOTS; slot++) { rv = isa_intr_establish(ia->ia_ic, ia->ipa_irq[slot].num, - IST_EDGE, IPL_TTY, pckbcintr, sc, sc->sc_dv.dv_xname); + IST_LEVEL, IPL_TTY, pckbcintr, sc, sc->sc_dv.dv_xname); if (rv == NULL) { printf("%s: unable to establish interrupt for irq %d\n", sc->sc_dv.dv_xname, ia->ipa_irq[slot].num);