Home | History | Annotate | Line # | Download | only in pci
pci_machdep.c revision 1.3.24.2
      1  1.3.24.1     skrll /*	$NetBSD: pci_machdep.c,v 1.3.24.2 2004/09/18 14:37:58 skrll Exp $	*/
      2  1.3.24.1     skrll 
      3  1.3.24.1     skrll #include <sys/cdefs.h>
      4  1.3.24.1     skrll __KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.3.24.2 2004/09/18 14:37:58 skrll Exp $");
      5  1.3.24.1     skrll 
      6       1.1      matt #include <sys/param.h>
      7       1.1      matt #include <sys/device.h>
      8       1.1      matt #include <dev/pci/pcireg.h>
      9       1.1      matt #include <dev/pci/pcivar.h>
     10       1.1      matt 
     11       1.3  rearnsha #include <arm/footbridge/dc21285reg.h>
     12       1.1      matt 
     13       1.1      matt void
     14       1.1      matt netwinder_pci_attach_hook (struct device *parent,
     15       1.1      matt 	struct device *self, struct pcibus_attach_args *pba)
     16       1.1      matt {
     17       1.1      matt 	pcireg_t regval;
     18       1.1      matt 	pcireg_t intreg;
     19       1.1      matt 	pcitag_t tag;
     20       1.1      matt 
     21       1.1      matt 	/*
     22       1.1      matt 	 * Initialize the TULIP
     23       1.1      matt 	 */
     24       1.1      matt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 9, 0);
     25       1.1      matt 	pci_conf_write(pba->pba_pc, tag,
     26       1.1      matt 		PCI_COMMAND_STATUS_REG,
     27       1.1      matt 		PCI_COMMAND_IO_ENABLE|
     28       1.1      matt 		PCI_COMMAND_MASTER_ENABLE);
     29       1.1      matt 	intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
     30       1.1      matt 	intreg = PCI_INTERRUPT_CODE(
     31       1.1      matt 		PCI_INTERRUPT_LATENCY(intreg),
     32       1.1      matt 		PCI_INTERRUPT_GRANT(intreg),
     33       1.1      matt 		PCI_INTERRUPT_PIN(intreg),
     34       1.1      matt 		0x40|IRQ_IN_L1);
     35       1.1      matt 	pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
     36       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0x400 | PCI_MAPREG_TYPE_IO);
     37       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x14, 0);
     38       1.1      matt 
     39       1.1      matt 	/*
     40       1.1      matt 	 * Initialize the PCI NE2000
     41       1.1      matt 	 */
     42       1.1      matt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 12, 0);
     43       1.1      matt 	pci_conf_write(pba->pba_pc, tag,
     44       1.1      matt 				PCI_COMMAND_STATUS_REG,
     45       1.1      matt 				PCI_COMMAND_IO_ENABLE|
     46       1.1      matt 				PCI_COMMAND_MASTER_ENABLE);
     47       1.1      matt 	intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
     48       1.1      matt 	intreg = PCI_INTERRUPT_CODE(
     49       1.1      matt 		PCI_INTERRUPT_LATENCY(intreg),
     50       1.1      matt 		PCI_INTERRUPT_GRANT(intreg),
     51       1.1      matt 		PCI_INTERRUPT_PIN(intreg),
     52       1.1      matt 		0x40|IRQ_IN_L0);
     53       1.1      matt 	pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
     54       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0x300 | PCI_MAPREG_TYPE_IO);
     55       1.1      matt 
     56       1.1      matt #if 0
     57       1.1      matt 	/*
     58       1.1      matt 	 * Initialize the PCI-ISA Bridge
     59       1.1      matt 	 */
     60       1.1      matt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 0);
     61       1.1      matt 	pci_conf_write(pba->pba_pc, tag,
     62       1.1      matt 		PCI_COMMAND_STATUS_REG,
     63       1.1      matt 		PCI_COMMAND_IO_ENABLE|
     64       1.1      matt 		PCI_COMMAND_MEM_ENABLE|
     65       1.1      matt 		PCI_COMMAND_MASTER_ENABLE);
     66       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0);
     67       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x48,
     68       1.1      matt 		pci_conf_read(pba->pba_pc, tag, 0x48)|0xff);
     69       1.1      matt 
     70       1.1      matt 	regval = pci_conf_read(pba->pba_pc, tag, 0x40);
     71       1.1      matt 	regval &= 0xff00ff00;
     72       1.1      matt 	regval |= 0x00000022;
     73       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x40, regval);
     74       1.1      matt 
     75       1.1      matt 	regval = pci_conf_read(pba->pba_pc, tag, 0x80);
     76       1.1      matt 	regval &= 0x0000ff00;
     77       1.1      matt 	regval |= 0xe0010002;
     78       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x80, regval);
     79       1.1      matt #endif
     80       1.1      matt 
     81       1.1      matt 	/*
     82       1.1      matt 	 * Initialize the PCIIDE Controller
     83       1.1      matt 	 */
     84       1.1      matt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 1);
     85       1.1      matt 	pci_conf_write(pba->pba_pc, tag,
     86       1.1      matt 		PCI_COMMAND_STATUS_REG,
     87       1.1      matt 		PCI_COMMAND_IO_ENABLE|
     88       1.1      matt 		PCI_COMMAND_MASTER_ENABLE);
     89       1.1      matt 
     90       1.1      matt 	regval = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG);
     91       1.1      matt 	regval = PCI_CLASS_CODE(PCI_CLASS(regval), PCI_SUBCLASS(regval), 0x8A);
     92       1.1      matt 	pci_conf_write(pba->pba_pc, tag, PCI_CLASS_REG, regval);
     93       1.1      matt 
     94       1.2      matt 	regval = pci_conf_read(pba->pba_pc, tag, 0x40);
     95       1.2      matt 	regval &= ~0x10;	/* disable secondary port */
     96       1.2      matt 	pci_conf_write(pba->pba_pc, tag, 0x40, regval);
     97       1.2      matt 
     98       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0x01f0 | PCI_MAPREG_TYPE_IO);
     99       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x14, 0x03f4 | PCI_MAPREG_TYPE_IO);
    100       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x18, 0x0170 | PCI_MAPREG_TYPE_IO);
    101       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x1c, 0x0374 | PCI_MAPREG_TYPE_IO);
    102       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x20, 0xe800 | PCI_MAPREG_TYPE_IO);
    103       1.1      matt 	intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
    104       1.1      matt 	intreg = PCI_INTERRUPT_CODE(
    105       1.1      matt 		PCI_INTERRUPT_LATENCY(intreg),
    106       1.1      matt 		PCI_INTERRUPT_GRANT(intreg),
    107       1.1      matt 		PCI_INTERRUPT_PIN(intreg),
    108       1.1      matt 		0x8e);
    109       1.1      matt 	pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
    110       1.1      matt 
    111       1.1      matt 	/*
    112       1.1      matt 	 * Make sure we are in legacy mode
    113       1.1      matt 	 */
    114       1.1      matt 	regval = pci_conf_read(pba->pba_pc, tag, 0x40);
    115       1.1      matt 	regval &= ~0x800;
    116       1.1      matt 	pci_conf_write(pba->pba_pc, tag, 0x40, regval);
    117       1.1      matt }
    118