Subject: Re: issues with com and non-PCI platforms.... a proposal
To: None <garrett_damore@tadpole.com>
From: Warner Losh <imp@bsdimp.com>
List: tech-kern
Date: 03/07/2006 07:00:37
From: "Garrett D'Amore" <garrett_damore@tadpole.com>
Subject: issues with com and non-PCI platforms.... a proposal
Date: Mon, 06 Mar 2006 19:13:58 -0800
> I have a few hardware platforms that have a basically compatible 16550
> chip on them, but they do something "funny".
>
> E.g. one chip maps registers at 4 byte offsets.
>
> Another does the same, but changes which end of the 32-bit word the
> registers are located at.
>
> Yet another has the transmit and receive data registers in separate offsets.
>
> Fundamentally though, these are all 16550 variants or workalikes.
In FreeBSD we support the Japanese "pc98" platform (NEC PC-9801 and
PC-9821 series of machines). These machines often have standard
devices glued into the system in non-standard ways. These machines
are all low performance by today's standards (the fastest one I was
able to buy was 400MHz, and the fastest I've been able to track down
via overclocking pages is 600MHz).
> My proposal is to *change* com so that instead of using fixed offsets,
> it uses a register look up table. E.g.
>
> bus_offset_t sc_regoffs[NCOM_PORTS];
>
> #define GETREG(x) bus_space_read_1(bst, bsh, sc_regoffs[x])
>
> Then the various attachment points can populate these registers as they
> see fit.
This is the approach that we take with the pc98 hardware on FreeBSD.
This approach has the advantage of being able to say something like:
#ifdef __HAS_ODD_COM_OFFSETS
bus_offset_t sc_regoffs[];
#endif
in the softc and
#ifdef __HAS_ODD_COM_OFFSETS
#define GETREG(x) bus_space_read_1(bst, bsh, sc_regoffs[x])
#else
#define GETREG(x) bus_space_read_1(bst, bsh, x)
#endif
For those machines that only support traditional 16550 register
layouts. If all register access goes through the macros, then you
can have the best of both worlds...
> Objections I expect to hear are primarily performance related w.r.t.
> older (non-FIFO) parts. Do folks still use these and expect to be able
> to do so for high performance applications? I think if your ability to
> service the interrupt and keep up with the line is limited by an extra
> register index, then you probably are trying to drive your line too
> fast. ;-)
>
> Let me know what folks think. I'd love to clean this code up a bit.
>
> Assuming folks are agreeable, I'd like to have willing volunteers for
> testers too, since I don't have all the various incarnations of serial
> ports that are out there.
Warner