void __init ibm_prep_init(void) { if (have_residual_data) { u32 addr, real_addr, len, offset; PPC_DEVICE *mpic; PnP_TAG_PACKET *pkt; /* Use the PReP residual data to determine if an OpenPIC is * present. If so, get the large vendor packet which will * tell us the base address and length in memory. * If we are successful, ioremap the memory area and set * OpenPIC_Addr (this indicates that the OpenPIC was found). */ mpic = residual_find_device(-1, NULL, SystemPeripheral, ProgrammableInterruptController, MPIC, 0); if (!mpic) return; pkt = PnP_find_large_vendor_packet(res->DevicePnPHeap + mpic->AllocatedOffset, 9, 0); if (!pkt) return; #define p pkt->L4_Pack.L4_Data.L4_PPCPack if (p.PPCData[1] == 32) { switch (p.PPCData[0]) { case 1: offset = PREP_ISA_IO_BASE; break; case 2: offset = PREP_ISA_MEM_BASE; break; default: return; /* Not I/O or memory?? */ } } else return; /* Not a 32-bit address */ real_addr = ld_le32((unsigned int *) (p.PPCData + 4)); if (real_addr == 0xffffffff) return; /* Adjust address to be as seen by CPU */ addr = real_addr + offset; len = ld_le32((unsigned int *) (p.PPCData + 12)); if (!len) return; #undef p OpenPIC_Addr = ioremap(addr, len); ppc_md.get_irq = openpic_get_irq; OpenPIC_InitSenses = prep_openpic_initsenses; OpenPIC_NumInitSenses = sizeof(prep_openpic_initsenses); printk(KERN_INFO "MPIC at 0x%08x (0x%08x), length 0x%08x " "mapped to 0x%p\n", addr, real_addr, len, OpenPIC_Addr); } }
void detect_host_bridge(void) { PPC_DEVICE *hostbridge; uint32_t id0; uint32_t tmp; /* * This code assumes that the host bridge is located at * bus 0, dev 0, func 0 AND that the old pre PCI 2.1 * standard devices detection mechanism that was used on PC * (still used in BSD source code) works. */ hostbridge=residual_find_device(&residualCopy, PROCESSORDEVICE, NULL, BridgeController, PCIBridge, -1, 0); if (hostbridge) { if (hostbridge->DeviceId.Interface==PCIBridgeIndirect) { pci.pci_functions=&pci_indirect_functions; /* Should be extracted from residual data, * indeed MPC106 in CHRP mode is different, * but we should not use residual data in * this case anyway. */ pci.pci_config_addr = ((volatile unsigned char *) (ptr_mem_map->io_base+0xcf8)); pci.pci_config_data = ptr_mem_map->io_base+0xcfc; } else if(hostbridge->DeviceId.Interface==PCIBridgeDirect) { pci.pci_functions=&pci_direct_functions; pci.pci_config_data=(unsigned char *) 0x80800000; } else { } } else { /* Let us try by experimentation at our own risk! */ pci.pci_functions = &pci_direct_functions; /* On all direct bridges I know the host bridge itself * appears as device 0 function 0. */ pci_read_config_dword(0, 0, 0, PCI_VENDOR_ID, &id0); if (id0==~0U) { pci.pci_functions = &pci_indirect_functions; pci.pci_config_addr = ((volatile unsigned char*) (ptr_mem_map->io_base+0xcf8)); pci.pci_config_data = ((volatile unsigned char*)ptr_mem_map->io_base+0xcfc); } /* Here we should check that the host bridge is actually * present, but if it not, we are in such a desperate * situation, that we probably can't even tell it. */ } pci_read_config_dword(0, 0, 0, 0, &id0); #ifdef SHOW_RAVEN_SETTINGS printk("idreg 0 = 0x%x\n",id0); #endif if((id0 == PCI_VENDOR_ID_MOTOROLA + (PCI_DEVICE_ID_MOTOROLA_RAVEN<<16)) || (id0 == PCI_VENDOR_ID_MOTOROLA + (PCI_DEVICE_ID_MOTOROLA_HAWK<<16))) { /* * We have a Raven bridge. We will get information about its settings */ pci_read_config_dword(0, 0, 0, PCI_COMMAND, &id0); #ifdef SHOW_RAVEN_SETTING printk("RAVEN PCI command register = %x\n",id0); #endif id0 |= RAVEN_CLEAR_EVENTS_MASK; pci_write_config_dword(0, 0, 0, PCI_COMMAND, id0); pci_read_config_dword(0, 0, 0, PCI_COMMAND, &id0); #ifdef SHOW_RAVEN_SETTING printk("After error clearing RAVEN PCI command register = %x\n",id0); #endif if (id0 & RAVEN_MPIC_IOSPACE_ENABLE) { pci_read_config_dword(0, 0, 0,PCI_BASE_ADDRESS_0, &tmp); #ifdef SHOW_RAVEN_SETTING printk("Raven MPIC is accessed via IO Space Access at address : %x\n",(tmp & ~0x1)); #endif } if (id0 & RAVEN_MPIC_MEMSPACE_ENABLE) { pci_read_config_dword(0, 0, 0,PCI_BASE_ADDRESS_1, &tmp); #ifdef SHOW_RAVEN_SETTING printk("Raven MPIC is accessed via memory Space Access at address : %x\n", tmp); #endif OpenPIC=(volatile struct OpenPIC *) (tmp + PREP_ISA_MEM_BASE); printk("OpenPIC found at %x.\n", OpenPIC); } } #if BSP_PCI_IRQ_NUMBER > 0 if (OpenPIC == (volatile struct OpenPIC *)0) { BSP_panic("OpenPic Not found\n"); } #endif }