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