It looks like other devices have: Name (_HID, EisaId ("PNP0501")
instead of: Name (_HID, "SEL0002")

I'm not sure what the significance of EisaId is, but it doesn't show
up for our device.

On Wed, May 4, 2016 at 9:34 AM, Chase Davis <[email protected]> wrote:
> Mike,
>
> Yes I think that it is shown correctly. See attached file.
>
> Thanks,
> Chase
>
> On Wed, May 4, 2016 at 8:28 AM, Mike Larkin <[email protected]> wrote:
>> 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
>
>
>
> --
> Chase Davis



-- 
Chase Davis

Reply via email to