pci_machdep.c revision 1.7 1 1.7 chs /* $NetBSD: pci_machdep.c,v 1.7 2012/10/27 17:18:05 chs Exp $ */
2 1.4 lukem
3 1.4 lukem #include <sys/cdefs.h>
4 1.7 chs __KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.7 2012/10/27 17:18:05 chs Exp $");
5 1.4 lukem
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.7 chs netwinder_pci_attach_hook(device_t parent, device_t self,
15 1.7 chs 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.5 christos PCI_COMMAND_MEM_ENABLE|
29 1.1 matt PCI_COMMAND_MASTER_ENABLE);
30 1.1 matt intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
31 1.1 matt intreg = PCI_INTERRUPT_CODE(
32 1.1 matt PCI_INTERRUPT_LATENCY(intreg),
33 1.1 matt PCI_INTERRUPT_GRANT(intreg),
34 1.1 matt PCI_INTERRUPT_PIN(intreg),
35 1.1 matt 0x40|IRQ_IN_L1);
36 1.1 matt pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
37 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x10, 0x400 | PCI_MAPREG_TYPE_IO);
38 1.5 christos pci_conf_write(pba->pba_pc, tag, 0x14, 0x00800000);
39 1.1 matt
40 1.1 matt /*
41 1.1 matt * Initialize the PCI NE2000
42 1.1 matt */
43 1.1 matt tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 12, 0);
44 1.1 matt pci_conf_write(pba->pba_pc, tag,
45 1.1 matt PCI_COMMAND_STATUS_REG,
46 1.1 matt PCI_COMMAND_IO_ENABLE|
47 1.1 matt PCI_COMMAND_MASTER_ENABLE);
48 1.1 matt intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
49 1.1 matt intreg = PCI_INTERRUPT_CODE(
50 1.1 matt PCI_INTERRUPT_LATENCY(intreg),
51 1.1 matt PCI_INTERRUPT_GRANT(intreg),
52 1.1 matt PCI_INTERRUPT_PIN(intreg),
53 1.1 matt 0x40|IRQ_IN_L0);
54 1.1 matt pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
55 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x10, 0x300 | PCI_MAPREG_TYPE_IO);
56 1.1 matt
57 1.1 matt #if 0
58 1.1 matt /*
59 1.1 matt * Initialize the PCI-ISA Bridge
60 1.1 matt */
61 1.1 matt tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 0);
62 1.1 matt pci_conf_write(pba->pba_pc, tag,
63 1.1 matt PCI_COMMAND_STATUS_REG,
64 1.1 matt PCI_COMMAND_IO_ENABLE|
65 1.1 matt PCI_COMMAND_MEM_ENABLE|
66 1.1 matt PCI_COMMAND_MASTER_ENABLE);
67 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x10, 0);
68 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x48,
69 1.1 matt pci_conf_read(pba->pba_pc, tag, 0x48)|0xff);
70 1.1 matt
71 1.1 matt regval = pci_conf_read(pba->pba_pc, tag, 0x40);
72 1.1 matt regval &= 0xff00ff00;
73 1.1 matt regval |= 0x00000022;
74 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x40, regval);
75 1.1 matt
76 1.1 matt regval = pci_conf_read(pba->pba_pc, tag, 0x80);
77 1.1 matt regval &= 0x0000ff00;
78 1.1 matt regval |= 0xe0010002;
79 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x80, regval);
80 1.1 matt #endif
81 1.1 matt
82 1.1 matt /*
83 1.1 matt * Initialize the PCIIDE Controller
84 1.1 matt */
85 1.1 matt tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 1);
86 1.1 matt pci_conf_write(pba->pba_pc, tag,
87 1.1 matt PCI_COMMAND_STATUS_REG,
88 1.1 matt PCI_COMMAND_IO_ENABLE|
89 1.1 matt PCI_COMMAND_MASTER_ENABLE);
90 1.1 matt
91 1.1 matt regval = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG);
92 1.1 matt regval = PCI_CLASS_CODE(PCI_CLASS(regval), PCI_SUBCLASS(regval), 0x8A);
93 1.1 matt pci_conf_write(pba->pba_pc, tag, PCI_CLASS_REG, regval);
94 1.1 matt
95 1.2 matt regval = pci_conf_read(pba->pba_pc, tag, 0x40);
96 1.2 matt regval &= ~0x10; /* disable secondary port */
97 1.2 matt pci_conf_write(pba->pba_pc, tag, 0x40, regval);
98 1.2 matt
99 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x10, 0x01f0 | PCI_MAPREG_TYPE_IO);
100 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x14, 0x03f4 | PCI_MAPREG_TYPE_IO);
101 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x18, 0x0170 | PCI_MAPREG_TYPE_IO);
102 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x1c, 0x0374 | PCI_MAPREG_TYPE_IO);
103 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x20, 0xe800 | PCI_MAPREG_TYPE_IO);
104 1.1 matt intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
105 1.1 matt intreg = PCI_INTERRUPT_CODE(
106 1.1 matt PCI_INTERRUPT_LATENCY(intreg),
107 1.1 matt PCI_INTERRUPT_GRANT(intreg),
108 1.1 matt PCI_INTERRUPT_PIN(intreg),
109 1.1 matt 0x8e);
110 1.1 matt pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
111 1.1 matt
112 1.1 matt /*
113 1.1 matt * Make sure we are in legacy mode
114 1.1 matt */
115 1.1 matt regval = pci_conf_read(pba->pba_pc, tag, 0x40);
116 1.1 matt regval &= ~0x800;
117 1.1 matt pci_conf_write(pba->pba_pc, tag, 0x40, regval);
118 1.1 matt }
119