Skip to contentSkip to conversation

superio-locks

RFC PATCH New Jim Cromie 1 participant 1 message Jun 14, 2007

lore
Share & tools
lore

Jim Cromie

author
#0 lore raw

cover superio-locks

this patch set

01 - adds superio_locks -

drivers needing superio access register, and get a 'slot'with port-id info and a mutex,
multiple drivers share the same 'slot', and coordinate access with its mutex.

superio_find() - finds and reserves the slot, returned as ptr or
null
superio_release() - relinguishes the slot (ref-counted)

Once theyve got the reservation in struct superio * gate (as done in patches 2,3,4)
they *may* use

superio_lock(gate)
superio_inb(gate, addr),
superio_outb(gate, addr, val)

or they can do it themselves with inb/outb, and gate->sioaddr, etc. My objective was to be as

superio_find was chosen to fit the idiom used in hwmon/*.c

02 - use it in pc8736x_gpio

this driver keeps the slot for the lifetime of the module ( __init til __exit )

03 - uses it in pc87360

this driver keeps the slot for only during __init, since it only needs to read the ISA addresses of the Logical Devices in the chip.

04 - use it in rest of drivers/hwmon/*.c

this patch is compile-tested only, please review for sanity before you try running them.

OPERATION

Here they are, working on my soekris box
- with #define DEBUG 1, and sysctl -w kernel.printk=8

simple sharing:

soekris:~# modprobe pc8736x_gpio
[  201.308543] platform pc8736x_gpio.0: NatSemi pc8736x GPIO Driver 
Initializing
[  201.319118] got e9 want e1
[  201.322297] no devid:e1 at port:2e
[  201.325996] got e9 want e8
[  201.328770] no devid:e8 at port:2e
[  201.332375] got e9 want e4
[  201.335259] no devid:e4 at port:2e
[  201.338847] got e9 want e5
[  201.341728] no devid:e5 at port:2e
[  201.349112] allocating slot 0, addr 2e for device e9
[  201.354345] found devid:e9 port:2e users:1
[  201.371547] platform pc8736x_gpio.0: GPIO ioport 6600 reserved
soekris:~#
soekris:~# modprobe pc87360
[  201.757736] got e9 want e1
[  201.760694] no devid:e1 at port:2e
[  201.764317] got e9 want e8
[  201.767263] no devid:e8 at port:2e
[  201.770899] got e9 want e4
[  201.773669] no devid:e4 at port:2e
[  201.777248] got e9 want e5
[  201.780135] no devid:e5 at port:2e
[  201.783731] sharing port:2e dev:e9 users:2
[  201.788015] found devid:e9 port:2e users:2
[  201.806848] pc87360: Device 0x09 not activated
[  201.827262] pc87360 pc87360.26144: VLM conversion set to 1s period, 
160us delay
soekris:~#
soekris:~# rmmod pc8736x_gpio
[  206.934821] releasing last user of superio-port 2e
soekris:~# rmmod pc87360    

I removed both, but the slot released after the 1st, because the other module released it at end of init, and is no longer holding the reservation

soekris:~# modprobe pc87360
[  208.173676] got e9 want e1
[  208.176483] no devid:e1 at port:2e
[  208.180115] got e9 want e8
[  208.183028] no devid:e8 at port:2e
[  208.186625] got e9 want e4
[  208.189515] no devid:e4 at port:2e
[  208.192986] got e9 want e5
[  208.195865] no devid:e5 at port:2e
[  208.203700] allocating slot 0, addr 2e for device e9
[  208.209125] found devid:e9 port:2e users:1
[  208.214555] pc87360: Device 0x09 not activated
[  208.219853] releasing last user of superio-port 2e
[  208.252041] pc87360 pc87360.26144: VLM conversion set to 1s period, 
160us delay
soekris:~#

again, can see init-only usage by driver, and last-release message.

soekris:~# modprobe pc8736x_gpio
[  208.633842] platform pc8736x_gpio.0: NatSemi pc8736x GPIO Driver 
Initializing
[  208.643221] got e9 want e1
[  208.646017] no devid:e1 at port:2e
[  208.649634] got e9 want e8
[  208.652566] no devid:e8 at port:2e
[  208.656161] got e9 want e4
[  208.659108] no devid:e4 at port:2e
[  208.662584] got e9 want e5
[  208.665457] no devid:e5 at port:2e
[  208.680637] allocating slot 0, addr 2e for device e9
[  208.685846] found devid:e9 port:2e users:1
[  208.693420] platform pc8736x_gpio.0: GPIO ioport 6600 reserved
soekris:~#

can see here that we're the only holder of that reservation.

CAVEATS

- see 4
- Ive not thought much about the 16-bit device-id check ( I need hardware to sharpen this focus )
- superio_get() feels clumsy.

- superio_{enter,exit} are no-ops on my natsemi chip, so again the code is {}

the prob is (of course) that every chip does it differently, and superio_locks shouldnt care. Probably best to drop them from superio-locks API, and expect drivers to do them themselves.

Callbacks are possible but pointless, but given that the driver author must call enter & exit explicitly, they should just call their function directly.

- no device knowledge (digression - for later)

its tempting to (create another module) to have a Logical-device table, with strings to describe the LDs, etc. I dont want to dwell on it now, except to avoid foreclosing design options by bad choices now (in superio_locks).

struct sio_logical_device pc87366_units[] = {
        { 8,    "Floppy Disk Controller (FDC)" },
        { 8,    "Parallel Port (PP)" },         /* also 6 more at 0x400 */
        { 8,    "Serial Port 2 with IR (SP2)" },
       ...

I suspect that a pointer field in struct superio could carry whatever info a notional pc8736x_sio.ko would need, but might pose some reclamation issues.

such a module should support interrogating the LD's config-regs, extracting ISA addresses, etc, and could for example, add a bit more detail for display in /proc/ioports, which currently shows:

6008-600d : NatSemi SCx200 High-Resolution Timer
6100-613f : 0000:00:12.0
6100-612b : NatSemi SCx200 GPIO
6200-623f : 0000:00:12.0
6300-63ff : 0000:00:12.1
6500-653f : 0000:00:12.5
6600-660f : pc8736x_gpio
6620-662f : pc87360
6640-664f : pc87360
6640-664f : pc87360

I suspect that the multiple pc87360 regions are for the LDs controlled by hwmon/pc87360, since pc8736x_gpio also shows up (once). It would be cool if they said which ldn, something like

6620-662f : pc87360.voltages
6640-664f : pc87360.temps
6640-664f : pc87360.dunno

<aside> Does it look 'right' to you ?

- superio_locks may be relevant elsewhere (ACPI ?) but I havent thought about them

WHATS NEXT

- see if any drivers in patch 4 are sane/insane
probably break 4 into separate patches ..

- get the feedback --> fix the code
- submit formally
here ? LKML ? other subsystem MLs ?

thanks,
-jimc

_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors