diff --git a/sys/conf/files b/sys/conf/files index c0799a0c0f87..574677e9ef49 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -356,6 +356,7 @@ nfs/krpc_subr.c optional bootp pccard/pccard.c optional card pccard/pccard_beep.c optional card pccard/pcic.c optional pcic device-driver +pci/pcic_p.c optional pcic device-driver pci/aic7870.c optional ahc device-driver \ dependency "aic7xxx_reg.h $S/pci/aic7870.c" pci/brooktree848.c optional bktr device-driver diff --git a/sys/pccard/pcic_pci.c b/sys/pccard/pcic_pci.c new file mode 100644 index 000000000000..ce7d7d5d35a4 --- /dev/null +++ b/sys/pccard/pcic_pci.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 1997 Ted Faber + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Absolutely no warranty of function or purpose is made by the author + * Ted Faber. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * are met: + */ + +#include "pci.h" +#if NPCI > 0 + +#include +#include +#include +#include +#include +#include + +static u_long pcic_pci_count = 0; +static char *pcic_pci_probe __P((pcici_t, pcidi_t)); +static void pd6832_legacy_init __P((pcici_t tag, int unit)); +static void pcic_pci_attach __P((pcici_t, int)); + +static struct pci_device pcic_pci_driver = { + "pcic", + pcic_pci_probe, + pcic_pci_attach, + &pcic_pci_count, + NULL +}; + +DATA_SET (pcidevice_set, pcic_pci_driver); + +/* + * Return the ID string for a PD6832 if the vendor/product id matches, + * NULL otherwise. + */ + +static char* +pcic_pci_probe(pcici_t tag, pcidi_t type) +{ + switch(type) { + case PCI_DEVICE_ID_PCIC_PD6832: + return "Cirrus Logic CL-PD6832 CardBus Adapter"; + break; + default: + break; + } + return NULL; +} + +/* + * Set up the CL-PD6832 to look like a ISA based PCMCIA chip (a + * PD672X). This routine is called once per PCMCIA socket. + */ + +static void +pd6832_legacy_init(pcici_t tag, int unit) +{ + u_long bcr; /* to set interrupts */ + u_short io_port; /* the io_port to map this slot on */ + + + /* + * I think this should be a call to pci_map_port, but that + * routine won't map regiaters above 0x28, and the register we + * need to map is 0x44 + */ + + io_port = pci_conf_read(tag, PD6832_LEGACY_16BIT_IOADDR) + & ~PCI_MAP_IO; + + /* + * Configure the first I/O window to contain PD6832_NUM_REGS + * words and deactivate the second by setting the limit lower + * than the base + */ + + pci_conf_write(tag, PD6832_IO_BASE0, io_port | 1); + pci_conf_write(tag, PD6832_IO_LIMIT0, (io_port + PD6832_NUM_REGS) | 1); + + pci_conf_write(tag, PD6832_IO_BASE1, (io_port +0x20) | 1); + pci_conf_write(tag, PD6832_IO_LIMIT1, io_port | 1 ); + + + /* + * Set default operating mode (I/O port space) and allocate + * this socket to the current unit + */ + + pci_conf_write(tag, PCI_COMMAND_STATUS_REG, PD6832_COMMAND_DEFAULTS ); + pci_conf_write(tag, PD6832_SOCKET, unit); + + /* + * Set up the card inserted/card removed interrupts to come + * through the isa IRQ + */ + + bcr = pci_conf_read(tag, PD6832_BRIDGE_CONTROL); + bcr |= (PD6832_BCR_ISA_IRQ|PD6832_BCR_MGMT_IRQ_ENA); + pci_conf_write(tag, PD6832_BRIDGE_CONTROL, bcr); + + if (bootverbose) { + printf("CardBus: Legacy PC-card 16bit I/O address [0x%x]\n", + io_port); +#ifdef PCIC_DEBUG + { + int i,j; + + printf ("PCI Config space:\n"); + for (j = 0; j < 0x98; j += 16) { + printf("%02x: ", j); + for (i = 0; i < 16; i += 4) { + printf(" %08x", + pci_conf_read(tag, i+j)); + } + printf("\n"); + } + } +#endif + } +} + + +/* + * This will be a general PCI based card dispatch routine. Right now + * it only understands the CL-PD6832 + */ + +static void +pcic_pci_attach(pcici_t config_id, int unit) +{ + u_long pcic_type; /* The vendor id of the PCI pcic */ + + pcic_type = pci_conf_read(config_id, PCI_ID_REG); + + switch (pcic_type) { + case PCI_DEVICE_ID_PCIC_PD6832: + pd6832_legacy_init(config_id,unit); + break; + } + return; +} + +#endif /* NPCI > 0 */ diff --git a/sys/pccard/pcic_pci.h b/sys/pccard/pcic_pci.h new file mode 100644 index 000000000000..3d7473d78d43 --- /dev/null +++ b/sys/pccard/pcic_pci.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1997 Ted Faber + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Absolutely no warranty of function or purpose is made by the author + * Ted Faber. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* CL-PD6832 CardBus defines */ +#define PCI_DEVICE_ID_PCIC_PD6832 0x11101013ul + +/* PCI configuration registers */ +#define PD6832_IO_BASE0 0x002c +#define PD6832_IO_LIMIT0 0x0030 +#define PD6832_IO_BASE1 0x0034 +#define PD6832_IO_LIMIT1 0x0038 +#define PD6832_BRIDGE_CONTROL 0x003c +#define PD6832_LEGACY_16BIT_IOADDR 0x0044 +#define PD6832_SOCKET 0x004c + +/* Configuration constants */ +#define PD6832_BCR_MGMT_IRQ_ENA 0x08000000 +#define PD6832_BCR_ISA_IRQ 0x00800000 +#define PD6832_COMMAND_DEFAULTS 0x00000045 +#define PD6832_NUM_REGS 4 + +/* End of CL-PD6832 defines */ diff --git a/sys/pci/pcic_p.c b/sys/pci/pcic_p.c new file mode 100644 index 000000000000..ce7d7d5d35a4 --- /dev/null +++ b/sys/pci/pcic_p.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 1997 Ted Faber + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Absolutely no warranty of function or purpose is made by the author + * Ted Faber. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * are met: + */ + +#include "pci.h" +#if NPCI > 0 + +#include +#include +#include +#include +#include +#include + +static u_long pcic_pci_count = 0; +static char *pcic_pci_probe __P((pcici_t, pcidi_t)); +static void pd6832_legacy_init __P((pcici_t tag, int unit)); +static void pcic_pci_attach __P((pcici_t, int)); + +static struct pci_device pcic_pci_driver = { + "pcic", + pcic_pci_probe, + pcic_pci_attach, + &pcic_pci_count, + NULL +}; + +DATA_SET (pcidevice_set, pcic_pci_driver); + +/* + * Return the ID string for a PD6832 if the vendor/product id matches, + * NULL otherwise. + */ + +static char* +pcic_pci_probe(pcici_t tag, pcidi_t type) +{ + switch(type) { + case PCI_DEVICE_ID_PCIC_PD6832: + return "Cirrus Logic CL-PD6832 CardBus Adapter"; + break; + default: + break; + } + return NULL; +} + +/* + * Set up the CL-PD6832 to look like a ISA based PCMCIA chip (a + * PD672X). This routine is called once per PCMCIA socket. + */ + +static void +pd6832_legacy_init(pcici_t tag, int unit) +{ + u_long bcr; /* to set interrupts */ + u_short io_port; /* the io_port to map this slot on */ + + + /* + * I think this should be a call to pci_map_port, but that + * routine won't map regiaters above 0x28, and the register we + * need to map is 0x44 + */ + + io_port = pci_conf_read(tag, PD6832_LEGACY_16BIT_IOADDR) + & ~PCI_MAP_IO; + + /* + * Configure the first I/O window to contain PD6832_NUM_REGS + * words and deactivate the second by setting the limit lower + * than the base + */ + + pci_conf_write(tag, PD6832_IO_BASE0, io_port | 1); + pci_conf_write(tag, PD6832_IO_LIMIT0, (io_port + PD6832_NUM_REGS) | 1); + + pci_conf_write(tag, PD6832_IO_BASE1, (io_port +0x20) | 1); + pci_conf_write(tag, PD6832_IO_LIMIT1, io_port | 1 ); + + + /* + * Set default operating mode (I/O port space) and allocate + * this socket to the current unit + */ + + pci_conf_write(tag, PCI_COMMAND_STATUS_REG, PD6832_COMMAND_DEFAULTS ); + pci_conf_write(tag, PD6832_SOCKET, unit); + + /* + * Set up the card inserted/card removed interrupts to come + * through the isa IRQ + */ + + bcr = pci_conf_read(tag, PD6832_BRIDGE_CONTROL); + bcr |= (PD6832_BCR_ISA_IRQ|PD6832_BCR_MGMT_IRQ_ENA); + pci_conf_write(tag, PD6832_BRIDGE_CONTROL, bcr); + + if (bootverbose) { + printf("CardBus: Legacy PC-card 16bit I/O address [0x%x]\n", + io_port); +#ifdef PCIC_DEBUG + { + int i,j; + + printf ("PCI Config space:\n"); + for (j = 0; j < 0x98; j += 16) { + printf("%02x: ", j); + for (i = 0; i < 16; i += 4) { + printf(" %08x", + pci_conf_read(tag, i+j)); + } + printf("\n"); + } + } +#endif + } +} + + +/* + * This will be a general PCI based card dispatch routine. Right now + * it only understands the CL-PD6832 + */ + +static void +pcic_pci_attach(pcici_t config_id, int unit) +{ + u_long pcic_type; /* The vendor id of the PCI pcic */ + + pcic_type = pci_conf_read(config_id, PCI_ID_REG); + + switch (pcic_type) { + case PCI_DEVICE_ID_PCIC_PD6832: + pd6832_legacy_init(config_id,unit); + break; + } + return; +} + +#endif /* NPCI > 0 */ diff --git a/sys/pci/pcic_p.h b/sys/pci/pcic_p.h new file mode 100644 index 000000000000..3d7473d78d43 --- /dev/null +++ b/sys/pci/pcic_p.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 1997 Ted Faber + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Absolutely no warranty of function or purpose is made by the author + * Ted Faber. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/* CL-PD6832 CardBus defines */ +#define PCI_DEVICE_ID_PCIC_PD6832 0x11101013ul + +/* PCI configuration registers */ +#define PD6832_IO_BASE0 0x002c +#define PD6832_IO_LIMIT0 0x0030 +#define PD6832_IO_BASE1 0x0034 +#define PD6832_IO_LIMIT1 0x0038 +#define PD6832_BRIDGE_CONTROL 0x003c +#define PD6832_LEGACY_16BIT_IOADDR 0x0044 +#define PD6832_SOCKET 0x004c + +/* Configuration constants */ +#define PD6832_BCR_MGMT_IRQ_ENA 0x08000000 +#define PD6832_BCR_ISA_IRQ 0x00800000 +#define PD6832_COMMAND_DEFAULTS 0x00000045 +#define PD6832_NUM_REGS 4 + +/* End of CL-PD6832 defines */