xref: /netbsd-src/sys/arch/netwinder/pci/pci_machdep.c (revision cbab9cadce21ae72fac13910001079fff214cc29)
1*cbab9cadSchs /*	$NetBSD: pci_machdep.c,v 1.7 2012/10/27 17:18:05 chs Exp $	*/
2ed517291Slukem 
3ed517291Slukem #include <sys/cdefs.h>
4*cbab9cadSchs __KERNEL_RCSID(0, "$NetBSD: pci_machdep.c,v 1.7 2012/10/27 17:18:05 chs Exp $");
5ed517291Slukem 
621b85badSmatt #include <sys/param.h>
721b85badSmatt #include <sys/device.h>
821b85badSmatt #include <dev/pci/pcireg.h>
921b85badSmatt #include <dev/pci/pcivar.h>
1021b85badSmatt 
11b20634ecSrearnsha #include <arm/footbridge/dc21285reg.h>
1221b85badSmatt 
1321b85badSmatt void
netwinder_pci_attach_hook(device_t parent,device_t self,struct pcibus_attach_args * pba)14*cbab9cadSchs netwinder_pci_attach_hook(device_t parent, device_t self,
15*cbab9cadSchs     struct pcibus_attach_args *pba)
1621b85badSmatt {
1721b85badSmatt 	pcireg_t regval;
1821b85badSmatt 	pcireg_t intreg;
1921b85badSmatt 	pcitag_t tag;
2021b85badSmatt 
2121b85badSmatt 	/*
2221b85badSmatt 	 * Initialize the TULIP
2321b85badSmatt 	 */
2421b85badSmatt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 9, 0);
2521b85badSmatt 	pci_conf_write(pba->pba_pc, tag,
2621b85badSmatt 		PCI_COMMAND_STATUS_REG,
2721b85badSmatt 		PCI_COMMAND_IO_ENABLE|
28cec76c24Schristos 		PCI_COMMAND_MEM_ENABLE|
2921b85badSmatt 		PCI_COMMAND_MASTER_ENABLE);
3021b85badSmatt 	intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
3121b85badSmatt 	intreg = PCI_INTERRUPT_CODE(
3221b85badSmatt 		PCI_INTERRUPT_LATENCY(intreg),
3321b85badSmatt 		PCI_INTERRUPT_GRANT(intreg),
3421b85badSmatt 		PCI_INTERRUPT_PIN(intreg),
3521b85badSmatt 		0x40|IRQ_IN_L1);
3621b85badSmatt 	pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
3721b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0x400 | PCI_MAPREG_TYPE_IO);
38cec76c24Schristos 	pci_conf_write(pba->pba_pc, tag, 0x14, 0x00800000);
3921b85badSmatt 
4021b85badSmatt 	/*
4121b85badSmatt 	 * Initialize the PCI NE2000
4221b85badSmatt 	 */
4321b85badSmatt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 12, 0);
4421b85badSmatt 	pci_conf_write(pba->pba_pc, tag,
4521b85badSmatt 				PCI_COMMAND_STATUS_REG,
4621b85badSmatt 				PCI_COMMAND_IO_ENABLE|
4721b85badSmatt 				PCI_COMMAND_MASTER_ENABLE);
4821b85badSmatt 	intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
4921b85badSmatt 	intreg = PCI_INTERRUPT_CODE(
5021b85badSmatt 		PCI_INTERRUPT_LATENCY(intreg),
5121b85badSmatt 		PCI_INTERRUPT_GRANT(intreg),
5221b85badSmatt 		PCI_INTERRUPT_PIN(intreg),
5321b85badSmatt 		0x40|IRQ_IN_L0);
5421b85badSmatt 	pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
5521b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0x300 | PCI_MAPREG_TYPE_IO);
5621b85badSmatt 
5721b85badSmatt #if 0
5821b85badSmatt 	/*
5921b85badSmatt 	 * Initialize the PCI-ISA Bridge
6021b85badSmatt 	 */
6121b85badSmatt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 0);
6221b85badSmatt 	pci_conf_write(pba->pba_pc, tag,
6321b85badSmatt 		PCI_COMMAND_STATUS_REG,
6421b85badSmatt 		PCI_COMMAND_IO_ENABLE|
6521b85badSmatt 		PCI_COMMAND_MEM_ENABLE|
6621b85badSmatt 		PCI_COMMAND_MASTER_ENABLE);
6721b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0);
6821b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x48,
6921b85badSmatt 		pci_conf_read(pba->pba_pc, tag, 0x48)|0xff);
7021b85badSmatt 
7121b85badSmatt 	regval = pci_conf_read(pba->pba_pc, tag, 0x40);
7221b85badSmatt 	regval &= 0xff00ff00;
7321b85badSmatt 	regval |= 0x00000022;
7421b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x40, regval);
7521b85badSmatt 
7621b85badSmatt 	regval = pci_conf_read(pba->pba_pc, tag, 0x80);
7721b85badSmatt 	regval &= 0x0000ff00;
7821b85badSmatt 	regval |= 0xe0010002;
7921b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x80, regval);
8021b85badSmatt #endif
8121b85badSmatt 
8221b85badSmatt 	/*
8321b85badSmatt 	 * Initialize the PCIIDE Controller
8421b85badSmatt 	 */
8521b85badSmatt 	tag = pci_make_tag(pba->pba_pc, pba->pba_bus, 11, 1);
8621b85badSmatt 	pci_conf_write(pba->pba_pc, tag,
8721b85badSmatt 		PCI_COMMAND_STATUS_REG,
8821b85badSmatt 		PCI_COMMAND_IO_ENABLE|
8921b85badSmatt 		PCI_COMMAND_MASTER_ENABLE);
9021b85badSmatt 
9121b85badSmatt 	regval = pci_conf_read(pba->pba_pc, tag, PCI_CLASS_REG);
9221b85badSmatt 	regval = PCI_CLASS_CODE(PCI_CLASS(regval), PCI_SUBCLASS(regval), 0x8A);
9321b85badSmatt 	pci_conf_write(pba->pba_pc, tag, PCI_CLASS_REG, regval);
9421b85badSmatt 
95c8f1f39dSmatt 	regval = pci_conf_read(pba->pba_pc, tag, 0x40);
96c8f1f39dSmatt 	regval &= ~0x10;	/* disable secondary port */
97c8f1f39dSmatt 	pci_conf_write(pba->pba_pc, tag, 0x40, regval);
98c8f1f39dSmatt 
9921b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x10, 0x01f0 | PCI_MAPREG_TYPE_IO);
10021b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x14, 0x03f4 | PCI_MAPREG_TYPE_IO);
10121b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x18, 0x0170 | PCI_MAPREG_TYPE_IO);
10221b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x1c, 0x0374 | PCI_MAPREG_TYPE_IO);
10321b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x20, 0xe800 | PCI_MAPREG_TYPE_IO);
10421b85badSmatt 	intreg = pci_conf_read(pba->pba_pc, tag, PCI_INTERRUPT_REG);
10521b85badSmatt 	intreg = PCI_INTERRUPT_CODE(
10621b85badSmatt 		PCI_INTERRUPT_LATENCY(intreg),
10721b85badSmatt 		PCI_INTERRUPT_GRANT(intreg),
10821b85badSmatt 		PCI_INTERRUPT_PIN(intreg),
10921b85badSmatt 		0x8e);
11021b85badSmatt 	pci_conf_write(pba->pba_pc, tag, PCI_INTERRUPT_REG, intreg);
11121b85badSmatt 
11221b85badSmatt 	/*
11321b85badSmatt 	 * Make sure we are in legacy mode
11421b85badSmatt 	 */
11521b85badSmatt 	regval = pci_conf_read(pba->pba_pc, tag, 0x40);
11621b85badSmatt 	regval &= ~0x800;
11721b85badSmatt 	pci_conf_write(pba->pba_pc, tag, 0x40, regval);
11821b85badSmatt }
119