On Wed, May 04, 2016 at 07:26:15AM -0500, Chase Davis wrote:
> This was added to GENERIC:
> 
> sel* at acpi?
> 
> and these four lines were added to files.acpi:
> # SEL embedded controller
> device sel
> attach sel at acpi with sel_acpi
> file dev/acpi/sel_acpi.c sel_acpi
> 
> With SEL0002 being the first item in the array, shouldn't it at least
> match it if it exists? We will add NULL to the HID array and see what
> happens.
> 

I tossed your acpidump from last week. Is SEL0002 in your AML delimited
with a _HID section?

If not, you may want to attach this device ala acpisony or acpidock -
see sys/dev/acpi/acpi.c around line 1080 or so for an example. In that
case match the containing node instead.

PS - moving this discussion to tech@, where it belongs.

-ml

> On Tue, May 3, 2016 at 5:29 PM, Mike Larkin <[email protected]> wrote:
> > On Tue, May 03, 2016 at 03:32:34PM -0500, Chase Davis wrote:
> >> Mike,
> >>
> >> We took your suggestion and re-wrote the driver to model sdhc_acpi. I
> >> have attached the new code. However, the match function never returns
> >> a 1. We put temporary print statements in the match routine. It is
> >> being called several times during the kernel boot process, but it
> >> never finds a device with HID SEL0002. Do you have any suggestions for
> >> why it would show up in the DSDT tables when we do an acpidump, but
> >> that the match routine never finds it?
> >>
> >> This is a snippet from the dmesg boot log
> >>
> >> Attempting to match SEL: result (0)
> >> acpitimer0 at acpi0: 3579545 Hz, 24 bits
> >> Attempting to match SEL: result (0)
> >> Attempting to match SEL: result (0)
> >> Attempting to match SEL: result (0)
> >> Attempting to match SEL: result (0)
> >> acpihpet0 at acpi0: 14318179 Hz
> >> Attempting to match SEL: result (0)
> >> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat
> >>
> >> int
> >> sel_acpi_match(struct device *parent, void *match, void *aux)
> >> {
> >> struct acpi_attach_args *aaa = aux;
> >> struct cfdata *cf = match;
> >> printf("Attempting to match SEL: ");
> >> int res = acpi_matchhids(aaa, sel_hids, cf->cf_driver->cd_name);
> >> printf("result (%d)\n", res);
> >> return res;
> >> }
> >>
> >> Thanks,
> >> Chase
> >
> > I think this diff is missing some parts. Like GENERIC?
> >
> > Also, you need a NULL after your last HID or matchhids will walk all
> > through memory until it hits a NULL.
> >
> > -ml
> >
> >> /*    $OpenBSD: sel.c,v 1.0 2016/04/01 05:00:00 jsg Exp $     */
> >> /*
> >>  * Copyright (c) 2016 PREMIER System Integrators
> >>  *
> >>  * Permission to use, copy, modify, and distribute this software for any
> >>  * purpose with or without fee is hereby granted, provided that the above
> >>  * copyright notice and this permission notice appear in all copies.
> >>  *
> >>  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> >>  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> >>  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> >>  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> >>  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> >>  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> >>  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> >>  *
> >>  * Schweitzer Engineering Laboratories: SEL-3355 Embedded controller
> >> */
> >>
> >> #include <sys/types.h>
> >> #include <sys/param.h>
> >> #include <sys/systm.h>
> >> #include <sys/device.h>
> >> #include <sys/kernel.h>
> >> #include <sys/malloc.h>
> >>
> >> #include <machine/bus.h>
> >>
> >> #include <dev/acpi/acpireg.h>
> >> #include <dev/acpi/acpivar.h>
> >> #include <dev/acpi/acpidev.h>
> >> #include <dev/acpi/amltypes.h>
> >> #include <dev/acpi/dsdt.h>
> >>
> >> #include <dev/isa/selreg.h>
> >>
> >> struct sel_host;
> >>
> >> struct sel_softc {
> >>       /* sc_dev must be the first item in the struct */
> >>       struct device           sc_dev;
> >>       struct sel_host         **sc_host;
> >> };
> >>
> >> struct sel_acpi_softc {
> >>       struct sel_softc        sc;
> >>       struct acpi_softc       *sc_acpi;
> >>       struct aml_node         *sc_node;
> >>
> >>       /* device access through bus space */
> >>       bus_space_tag_t         sc_iot;
> >>       bus_space_handle_t      sc_ioh;
> >>       bus_addr_t              sc_addr;
> >>       bus_size_t              sc_size;
> >>
> >>       struct sel_host         *sc_host;
> >> };
> >>
> >> int sel_wait(bus_space_tag_t, bus_space_handle_t, bool);
> >>
> >> /* Autoconfiguration glue */
> >> int sel_acpi_match(struct device *, void *, void *);
> >> void sel_acpi_attach(struct device *, struct device *, void *);
> >> int sel_print(void *, const char *);
> >> int sel_wd_cb(void *, int);
> >>
> >> /* functions to interact with the controller */
> >> void sel_write_wdog(bus_space_tag_t, bus_space_handle_t, int);
> >> u_int8_t sel_read_wdog(bus_space_tag_t, bus_space_handle_t);
> >> u_int8_t sel_read_status(bus_space_tag_t, bus_space_handle_t);
> >> void sel_abort(bus_space_tag_t, bus_space_handle_t);
> >> u_int32_t sel_read_boardid(bus_space_tag_t, bus_space_handle_t);
> >> u_int32_t sel_read_mcversion(bus_space_tag_t, bus_space_handle_t);
> >> u_int16_t sel_read_pciboardid(bus_space_tag_t, bus_space_handle_t);
> >> u_int8_t sel_read_ledctl0(bus_space_tag_t, bus_space_handle_t);
> >> void sel_write_ledctl0(bus_space_tag_t, bus_space_handle_t, u_int8_t);
> >> u_int8_t sel_read_ledctl1(bus_space_tag_t, bus_space_handle_t);
> >> void sel_write_ledctl1(bus_space_tag_t, bus_space_handle_t, u_int8_t);
> >> u_int8_t sel_read_miscctl0(bus_space_tag_t, bus_space_handle_t);
> >> u_int8_t sel_read_miscctl1(bus_space_tag_t, bus_space_handle_t);
> >> void sel_read_modelno(bus_space_tag_t, bus_space_handle_t, char*);
> >> void sel_read_serialno(bus_space_tag_t, bus_space_handle_t, char*);
> >> void sel_read_configid(bus_space_tag_t, bus_space_handle_t, char*);
> >>
> >> /* macros to extract bits from the status register */
> >> #define EC_STATUS_IBF(status) (((status) >> 0x1) & 0x1)
> >> #define EC_STATUS_OBF(status) (((status) & 0x1))
> >> #define EC_STATUS_BUSY(status)        (((status) >> 0x4) & 0x1)
> >> #define EC_STATUS_STATE(status)       (((status) >> 0x6) & 0x3)
> >>
> >> struct cfattach sel_acpi_ca = {
> >>       sizeof(struct sel_acpi_softc), sel_acpi_match, sel_acpi_attach
> >> };
> >>
> >> struct cfdriver sel_cd = {
> >>       NULL, "sel", DV_DULL
> >> };
> >>
> >> const char* sel_hids[] = { "SEL0002" };
> >>
> >> int sel_wait(bus_space_tag_t iot, bus_space_handle_t ioh, bool useobf)
> >> {
> >>       uint32_t timeout = 0;
> >>       uint8_t status = 0;
> >>
> >>       while (timeout < 50) {
> >>               status = bus_space_read_1(iot, ioh, SELWD_CMD);
> >>               if ((EC_STATUS_IBF(status) == 0x0) &&
> >>                       (EC_STATUS_BUSY(status) == 0x0) &&
> >>                       (EC_STATUS_STATE(status) != 0x3) &&
> >>                       ((EC_STATUS_OBF(status) == 0x0) || !useobf)) {
> >>                       return 1;
> >>               }
> >>               delay(10);
> >>               ++timeout;
> >>       }
> >>       return 0;
> >> }
> >>
> >> static __inline void
> >> sel_conf_enable(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t cmd)
> >> {
> >>       /* write the desired command to the command register */
> >>       bus_space_write_1(iot, ioh, SELWD_CMD, cmd);
> >>       /* wait for controller to be ready */
> >>       sel_wait(iot,ioh,0);
> >> }
> >>
> >> static __inline u_int8_t
> >> sel_conf_read(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t target)
> >> {
> >>       /* write the target address to the data register */
> >>       bus_space_write_1(iot, ioh, SELWD_DATA, target);
> >>       /* wait for controller to be ready */
> >>       sel_wait(iot, ioh,1);
> >>       /* return the value from the data register */
> >>       return (bus_space_read_1(iot, ioh, SELWD_DATA));
> >> }
> >>
> >> static __inline void
> >> sel_conf_write(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t 
> >> target,
> >>       u_int8_t data)
> >> {
> >>       /* write the target address to the data register */
> >>       bus_space_write_1(iot, ioh, SELWD_DATA, target);
> >>       /* wait for controller to be ready */
> >>       sel_wait(iot, ioh,0);
> >>       /* write the desired data to the data register */
> >>       bus_space_write_1(iot, ioh, SELWD_DATA, data);
> >>       /* wait for controller to be ready */
> >>       sel_wait(iot, ioh,0);
> >> }
> >>
> >> int
> >> sel_acpi_parse_resources(union acpi_resource *crs, void *arg)
> >> {
> >>       struct sel_acpi_softc *sc = arg;
> >>       int type = AML_CRSTYPE(crs);
> >>
> >>       printf(" SEL parse resource type (%d)", type);
> >>
> >>       sc->sc_addr = crs->lr_m32fixed._bas;
> >>       sc->sc_size = crs->lr_m32fixed._len;
> >>
> >>       return 0;
> >> }
> >>
> >> int
> >> sel_acpi_match(struct device *parent, void *match, void *aux)
> >> {
> >>       struct acpi_attach_args *aaa = aux;
> >>       struct cfdata *cf = match;
> >>
> >>       printf("Attempting to match SEL: ");
> >>       int res = acpi_matchhids(aaa, sel_hids, cf->cf_driver->cd_name);
> >>       printf("result (%d)\n", res);
> >>       return res;
> >> }
> >>
> >> void
> >> sel_acpi_attach(struct device *parent, struct device *self, void *aux)
> >> {
> >>       struct acpi_attach_args *aaa = aux;
> >>       struct sel_acpi_softc *sc = (struct sel_acpi_softc *)self;
> >>       struct aml_value res;
> >>
> >>       sc->sc_acpi = (struct acpi_softc *)parent;
> >>       sc->sc_node = aaa->aaa_node;
> >>       printf(": %s", sc->sc_node->name);
> >>
> >>       if (aml_evalname(sc->ac_acpi, sc->sc_node, "_CRS", 0, NULL, &res)) {
> >>               printf(", can't find registers\n");
> >>               return;
> >>       }
> >>
> >>       aml_parse_resource(&res, sel_acpi_parse_resources, sc);
> >>       printf(" addr 0x%1x/0x%1x", sc->sc_addr, sc->sc_size);
> >>       if (sc->sc_addr == 0 || sc->sc_size == 0) {
> >>               printf("\n");
> >>               return;
> >>       }
> >>       printf(" irq %d", sc->sc_irq);
> >>
> >>       /* Match by device ID */
> >>       sc->sc_iot = aaa->aaa_memt;
> >>       if (bus_space_map(sc->sc_iot, sc->sc_addr, sc->sc_size, 0,
> >>          &sc->sc_ioh)) {
> >>               printf(", can't map registers\n");
> >>               return;
> >>       }
> >>
> >>       /* read from bus space first */
> >>       u_int8_t test = bus_space_read_1(sc->sc_iot, sc->sc_ioh, SELWD_DATA);
> >>       /* if 0xFF is returned, there is nothing at the specified address */
> >>       if (test == 0xff) {
> >>               bus_space_unmap(sc->sc_iot, sc->sc_ioh, SELWD_IOSIZE);
> >>               return;
> >>       }
> >>
> >>       /* read board ID */
> >>       u_int32_t devid = sel_read_boardid(sc->sc_iot, sc->sc_ioh);
> >>       printf(": SEL Board ID (%x)",devid);
> >>
> >>       /* read model number */
> >>       char *model = malloc(sizeof(char)*16, M_DEVBUF, M_WAITOK | M_ZERO);
> >>       sel_read_modelno(sc->sc_iot, sc->sc_ioh, model);
> >>       printf(", Model No (%s)",model);
> >>       free(model, M_DEVBUF, 0);
> >>
> >>       /* read serial number */
> >>       char *serial = malloc(sizeof(char)*16, M_DEVBUF, M_WAITOK | M_ZERO);
> >>       sel_read_serialno(sc->sc_iot, sc->sc_ioh, serial);
> >>       printf(", Serial No (%s)\n",serial);
> >>       free(serial, M_DEVBUF, 0);
> >>
> >>       /* write to Enabled and Alarm LEDs */
> >>       /* turns Enabled green and Alarm off */
> >>       u_int8_t led0 = 0x02;
> >>       sel_write_ledctl0(sc->sc_iot, sc->sc_ioh, led0);
> >>
> >>       /* write to Aux LEDs */
> >>       /* turns off the LEDs */
> >>       u_int8_t led1 = 0x00;
> >>       sel_write_ledctl1(sc->sc_iot, sc->sc_ioh, led1);
> >>
> >>       sc->sc.sc_host = &sc->sc_host;
> >>       //wdog_register(sel_wd_cb,sc);
> >> }
> >>
> >> int
> >> sel_wd_cb(void *arg, int period)
> >> {
> >>       /* This function is called by the watchdog daemon */
> >>       /* Get a reference to the software context */
> >>       struct sel_softc *sc = arg;
> >>       if (period < 0)
> >>               period = 0;
> >>       /* The period value is in seconds, the watchdog value is in 
> >> twos-of-secs */
> >>       int wd = period / 2;
> >>       /* write watchdog value */
> >>       sel_write_wdog(sc->sc_iot, sc->sc_ioh, wd);
> >>       /* return the period back to the daemon */
> >>       return period;
> >> }
> >>
> >> void
> >> sel_write_wdog(bus_space_tag_t iot, bus_space_handle_t ioh, int value)
> >> {
> >>       /* Check to make sure that the state is idle */
> >>       sel_abort(iot, ioh);
> >>       /* Write watchdog timer value */
> >>       /* write the WRITECFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_WRITECFG);
> >>       /* write the watchdog value to the watchdog address */
> >>       sel_conf_write(iot, ioh, SELWD_CFG_WATCHDOG, value);
> >> }
> >>
> >> u_int8_t
> >> sel_read_wdog(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the watchdog value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t wdog;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the WATCHDOG data value from the data register */
> >>       wdog = sel_conf_read(iot, ioh, SELWD_CFG_WATCHDOG);
> >>       return wdog;
> >> }
> >>
> >> u_int8_t
> >> sel_read_status(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the command/status register */
> >>       u_int8_t status = 0;
> >>       status = bus_space_read_1(iot, ioh, SELWD_CMD);
> >>       return status;
> >> }
> >>
> >> void
> >> sel_abort(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* write the abort value to the command/status register */
> >>       u_int8_t status = 0;
> >>       /* first read the status register */
> >>       status = bus_space_read_1(iot, ioh, SELWD_CMD);
> >>       /* if the state is IDLE return */
> >>       if (EC_STATUS_STATE(status) == 0)
> >>               return;
> >>       uint32_t timeout = 0;
> >>       /* make sure status is 0 before proceeding */
> >>       while (EC_STATUS_STATE(status) != 0 && timeout < 50) {
> >>               /* write the abort command */
> >>               bus_space_write_1(iot, ioh, SELWD_CMD, SELWD_CMD_ABORT);
> >>               /* wait until controller isn't busy */
> >>               sel_wait(iot, ioh, 0);
> >>               /* read the status register */
> >>               status = bus_space_read_1(iot, ioh, SELWD_CMD);
> >>               delay(10);
> >>               /* increment timeout */
> >>               ++timeout;
> >>       }
> >>
> >> }
> >>
> >> u_int32_t
> >> sel_read_boardid(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the board ID from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg0, reg1, reg2, reg3;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the BOARID0 data value from the data register */
> >>       reg0 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID0);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the BOARID1 data value from the data register */
> >>       reg1 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID1);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the BOARID2 data value from the data register */
> >>       reg2 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID2);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the BOARID3 data value from the data register */
> >>       reg3 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID3);
> >>
> >>       /* convert the 4 bytes into a 32 bit number */
> >>       u_int32_t boardid = (reg3 << 24) | (reg2 << 16) | (reg1 << 8) | reg0;
> >>       return boardid;
> >> }
> >>
> >> u_int32_t
> >> sel_read_mcversion(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the MC version from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg0, reg1, reg2, reg3;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the VERSION0 data value from the data register */
> >>       reg0 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION0);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the VERSION1 data value from the data register */
> >>       reg1 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION1);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the VERSION2 data value from the data register */
> >>       reg2 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION2);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the VERSION3 data value from the data register */
> >>       reg3 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION3);
> >>
> >>       /* convert the 4 bytes into a 32 bit number */
> >>       u_int32_t version = (reg3 << 24) | (reg2 << 16) | (reg1 << 8) | reg0;
> >>       return version;
> >> }
> >>
> >>
> >> u_int16_t
> >> sel_read_pciboardid(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the PCI board ID from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg0, reg1;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the PCIBRDID0 data value from the data register */
> >>       reg0 = sel_conf_read(iot, ioh, SELWD_CFG_PCIBRDID0);
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the PCIBRDID1 data value from the data register */
> >>       reg1 = sel_conf_read(iot, ioh, SELWD_CFG_PCIBRDID1);
> >>
> >>       /* convert the 2 bytes into a 16 bit number */
> >>       u_int16_t boardid = (reg1 << 8) | reg0;
> >>       return boardid;
> >> }
> >>
> >> u_int8_t
> >> sel_read_miscctl0(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the misc control 0 value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the MISCCTL0 data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_MISCCTL0);
> >>       return reg;
> >> }
> >>
> >> u_int8_t
> >> sel_read_miscctl1(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the misc control 1 value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the MISCCTL1 data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_MISCCTL1);
> >>       return reg;
> >> }
> >>
> >> u_int8_t
> >> sel_read_ledctl0(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the LED control 0 value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the LEDCTRL0 data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_LEDCTRL0);
> >>       return reg;
> >> }
> >>
> >> void
> >> sel_write_ledctl0(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t 
> >> data)
> >> {
> >>       /* write the LED control 0 value to the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       /* write the WRITECFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_WRITECFG);
> >>       /* write the LEDCTRL0 data value to the data register */
> >>       sel_conf_write(iot, ioh, SELWD_CFG_LEDCTRL0, data);
> >> }
> >>
> >> u_int8_t
> >> sel_read_ledctl1(bus_space_tag_t iot, bus_space_handle_t ioh)
> >> {
> >>       /* read the LED control 1 value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the LEDCTRL1 data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_LEDCTRL1);
> >>       return reg;
> >> }
> >>
> >>
> >> void
> >> sel_write_ledctl1(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t 
> >> data)
> >> {
> >>       /* write the LED control 1 value to the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       /* write the WRITECFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_WRITECFG);
> >>       /* write the LEDCTRL1 data value to the data register */
> >>       sel_conf_write(iot, ioh, SELWD_CFG_LEDCTRL1, data);
> >> }
> >>
> >> void
> >> sel_read_modelno(bus_space_tag_t iot, bus_space_handle_t ioh, char* model)
> >> {
> >>       /* read the MODEL NUMBER value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>       int i = 0;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the MODELNO data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_MODELNO);
> >>       while (reg != 0 && i < 15) {
> >>               model[i] = reg;
> >>               /* make sure status is 0 before proceeding */
> >>               sel_abort(iot, ioh);
> >>               /* write the READCFG command to the command register */
> >>               sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>               /* read the MODELNO data value from the data register */
> >>               reg = sel_conf_read(iot, ioh, SELWD_CFG_MODELNO);
> >>               i++;
> >>       }
> >>
> >> }
> >>
> >> void
> >> sel_read_serialno(bus_space_tag_t iot, bus_space_handle_t ioh, char* 
> >> serial)
> >> {
> >>       /* read the SERIAL NUMBER value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>       int i = 0;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the SERIALNO data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_SERIALNO);
> >>       while (reg != 0 && i < 15) {
> >>               serial[i] = reg;
> >>               /* make sure status is 0 before proceeding */
> >>               sel_abort(iot, ioh);
> >>               /* write the READCFG command to the command register */
> >>               sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>               /* read the SERIALNO data value from the data register */
> >>               reg = sel_conf_read(iot, ioh, SELWD_CFG_SERIALNO);
> >>               i++;
> >>       }
> >>
> >> }
> >>
> >> void
> >> sel_read_configid(bus_space_tag_t iot, bus_space_handle_t ioh, char* 
> >> configid)
> >> {
> >>       /* read the CONFIGURATION ID value from the controller */
> >>       /* make sure status is 0 before proceeding */
> >>       sel_abort(iot, ioh);
> >>       u_int8_t reg;
> >>       int i = 0;
> >>
> >>       /* write the READCFG command to the command register */
> >>       sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>       /* read the CONFIGID data value from the data register */
> >>       reg = sel_conf_read(iot, ioh, SELWD_CFG_CONFIGID);
> >>       while (reg != 0 && i < 15) {
> >>               configid[i] = reg;
> >>               /* make sure status is 0 before proceeding */
> >>               sel_abort(iot, ioh);
> >>               /* write the READCFG command to the command register */
> >>               sel_conf_enable(iot, ioh, SELWD_CMD_READCFG);
> >>               /* read the CONFIGID data value from the data register */
> >>               reg = sel_conf_read(iot, ioh, SELWD_CFG_CONFIGID);
> >>               i++;
> >>       }
> >>
> >> }
> >
> >> /*
> >>  *
> >>  * Definitions for the SEL Watchdog device.
> >>  *
> >>  */
> >>
> >> #define SELWD_DATA            0x00
> >> #define SELWD_CMD             0x01
> >> #define SELWD_IOSIZE          0x02
> >>
> >> /* Valid Device IDs */
> >> #define SELWD_DEV_3355                "3355"
> >> #define SELWD_DEV_3360                "3360"
> >>
> >> /* Config Register Map */
> >> #define SELWD_CFG_BOARDID0    0x00
> >> #define SELWD_CFG_BOARDID1    0x01
> >> #define SELWD_CFG_BOARDID2    0x02
> >> #define SELWD_CFG_BOARDID3    0x03
> >> #define SELWD_CFG_VERSION0    0x0c
> >> #define SELWD_CFG_VERSION1    0x0d
> >> #define SELWD_CFG_VERSION2    0x0e
> >> #define SELWD_CFG_VERSION3    0x0f
> >> #define SELWD_CFG_LEDCTRL0    0x10
> >> #define SELWD_CFG_LEDCTRL1    0x11
> >> #define SELWD_CFG_JUMPER0     0x20
> >> #define SELWD_CFG_WATCHDOG    0x30
> >> #define SELWD_CFG_SERIALCTL   0x40
> >> #define SELWD_CFG_MISCCTL0    0x42
> >> #define SELWD_CFG_MISCCTL1    0x43
> >> #define SELWD_CFG_SERIALNO    0x50
> >> #define SELWD_CFG_MODELNO     0x51
> >> #define SELWD_CFG_CONFIGID    0x52
> >> #define SELWD_CFG_PCIBRDID0   0x70
> >> #define SELWD_CFG_PCIBRDID1   0x71
> >>
> >> /* Command functions */
> >> #define SELWD_CMD_WRITECFG    0x10
> >> #define SELWD_CMD_WRITEDIAG   0x11
> >> #define SELWD_CMD_READCFG     0x20
> >> #define SELWD_CMD_READDIAG    0x21
> >> #define SELWD_CMD_ABORT               0x00
> >
> 
> 
> 
> -- 
> Chase Davis

Reply via email to