From 5a4e3dc0a5af631b1723858bc50a9af1545392fb Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 23 Apr 2018 12:50:58 +0200 Subject: bsps: Move PCI drivers to bsps This patch is a part of the BSP source reorganization. Update #3285. --- .../powerpc/shared/pci/detect_raven_bridge.c | 197 ------- .../powerpc/shared/pci/generic_clear_hberrs.c | 63 -- c/src/lib/libbsp/powerpc/shared/pci/pci.c | 640 --------------------- .../lib/libbsp/powerpc/shared/pci/pcifinddevice.c | 212 ------- 4 files changed, 1112 deletions(-) delete mode 100644 c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c delete mode 100644 c/src/lib/libbsp/powerpc/shared/pci/generic_clear_hberrs.c delete mode 100644 c/src/lib/libbsp/powerpc/shared/pci/pci.c delete mode 100644 c/src/lib/libbsp/powerpc/shared/pci/pcifinddevice.c (limited to 'c/src/lib/libbsp/powerpc/shared/pci') diff --git a/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c b/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c deleted file mode 100644 index 0a1c04a2e2..0000000000 --- a/c/src/lib/libbsp/powerpc/shared/pci/detect_raven_bridge.c +++ /dev/null @@ -1,197 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#define SHOW_RAVEN_SETTINGS - -#define RAVEN_MPIC_IOSPACE_ENABLE 0x0001 -#define RAVEN_MPIC_MEMSPACE_ENABLE 0x0002 -#define RAVEN_MASTER_ENABLE 0x0004 -#define RAVEN_PARITY_CHECK_ENABLE 0x0040 -#define RAVEN_SYSTEM_ERROR_ENABLE 0x0100 -#define RAVEN_CLEAR_EVENTS_MASK 0xf9000000 - -#define RAVEN_MPIC_MEREN ((volatile unsigned *)0xfeff0020) -#define RAVEN_MPIC_MERST ((volatile unsigned *)0xfeff0024) -#define MEREN_VAL 0x2f00 - -#define pci BSP_pci_configuration - -extern const pci_config_access_functions pci_direct_functions; -extern const pci_config_access_functions pci_indirect_functions; - -#if defined(mvme2100) -/* FIXME - this should really be in a separate file - the 2100 doesn't - * have a raven chip so there is no point having 2100 code here - */ - -extern unsigned int EUMBBAR; - -void detect_host_bridge(void) -{ - /* - * If the processor is an 8240 or an 8245 then the PIC is built - * in instead of being on the PCI bus. The MVME2100 is using Processor - * Address Map B (CHRP) although the Programmer's Reference Guide says - * it defaults to Map A. - */ - /* We have an EPIC Interrupt Controller */ - OpenPIC = (volatile struct OpenPIC *) (EUMBBAR + BSP_OPEN_PIC_BASE_OFFSET); - pci.pci_functions = &pci_indirect_functions; - pci.pci_config_addr = (volatile unsigned char *) 0xfec00000; - pci.pci_config_data = (volatile unsigned char *) 0xfee00000; -} - -#else - -#if 0 -/* Unfortunately, PCI config space access to empty slots generates - * a 'signalled master abort' condition --> we can't really use - * the machine check interrupt for memory probing unless - * we use probing for PCI scanning also (which would make - * all that code either BSP dependent or requiring yet another - * API, sigh...). - * So for the moment, we just don't use MCP on all mvme2xxx - * boards (using the generic, hostbridge-independent 'clear' - * implementation [generic_clear_hberrs.c]). - */ -/* - * enableMCP: whether to enable MCP checkstop / machine check interrupts - * on the hostbridge and in HID0. - * - * NOTE: HID0 and MEREN are left alone if this flag is 0 - * - * quiet : be silent - * - * RETURNS : raven MERST register contents (lowermost 16 bits), 0 if - * there were no errors - */ -unsigned long -_BSP_clear_hostbridge_errors(int enableMCP, int quiet) -{ -unsigned merst; - - merst = in_be32(RAVEN_MPIC_MERST); - /* write back value to clear status */ - out_be32(RAVEN_MPIC_MERST, merst); - - if (enableMCP) { - if (!quiet) - printk("Enabling MCP generation on hostbridge errors\n"); - out_be32(RAVEN_MPIC_MEREN, MEREN_VAL); - } else { - out_be32(RAVEN_MPIC_MEREN, 0); - if ( !quiet && enableMCP ) { - printk("leaving MCP interrupt disabled\n"); - } - } - return (merst & 0xffff); -} -#endif - -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%" PRIu32 "\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 %p.\n", OpenPIC); - } - } - -#if BSP_PCI_IRQ_NUMBER > 0 - if (OpenPIC == (volatile struct OpenPIC *)0) { - rtems_panic("OpenPic Not found\n"); - } -#endif - -} - -#endif diff --git a/c/src/lib/libbsp/powerpc/shared/pci/generic_clear_hberrs.c b/c/src/lib/libbsp/powerpc/shared/pci/generic_clear_hberrs.c deleted file mode 100644 index 1bc4009b15..0000000000 --- a/c/src/lib/libbsp/powerpc/shared/pci/generic_clear_hberrs.c +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include - -#include -#include - -#include - -#define PCI_ERR_BITS 0xf900 -#define PCI_STATUS_OK(x) (!((x)&PCI_ERR_BITS)) - -/* For now, just clear errors in the PCI status reg. - * - * Returns: (for diagnostic purposes) - * original settings (i.e. before applying the clearing - * sequence) or the error bits or 0 if there were no errors. - * - */ - -unsigned short -(*_BSP_clear_vmebridge_errors)(int) = 0; - -unsigned long -_BSP_clear_hostbridge_errors(int enableMCP, int quiet) -{ -unsigned long rval; -unsigned short pcistat; -int count; - - if (enableMCP) - return -1; /* exceptions not supported / MCP not wired */ - - /* read error status for info return */ - pci_read_config_word(0,0,0,PCI_STATUS,&pcistat); - rval = pcistat; - - count=10; - do { - /* clear error reporting registers */ - - /* clear PCI status register */ - pci_write_config_word(0,0,0,PCI_STATUS, PCI_ERR_BITS); - - /* read new status */ - pci_read_config_word(0,0,0,PCI_STATUS, &pcistat); - - } while ( ! PCI_STATUS_OK(pcistat) && count-- ); - - if ( !PCI_STATUS_OK(rval) && !quiet) { - printk("Cleared PCI errors: pci_stat was 0x%04lx\n", rval); - } - if ( !PCI_STATUS_OK(pcistat) ) { - printk("Unable to clear PCI errors: still 0x%04x after 10 attempts\n", pcistat); - } - - rval &= PCI_ERR_BITS; - - /* Some VME bridges (Tsi148) don't propagate VME bus errors to PCI status reg. */ - if ( _BSP_clear_vmebridge_errors ) - rval |= _BSP_clear_vmebridge_errors(quiet)<<16; - - return rval; -} diff --git a/c/src/lib/libbsp/powerpc/shared/pci/pci.c b/c/src/lib/libbsp/powerpc/shared/pci/pci.c deleted file mode 100644 index f75151ad46..0000000000 --- a/c/src/lib/libbsp/powerpc/shared/pci/pci.c +++ /dev/null @@ -1,640 +0,0 @@ -/* - * pci.c : this file contains basic PCI Io functions. - * - * Copyright (C) 1999 valette@crf.canon.fr - * - * This code is heavily inspired by the public specification of STREAM V2 - * that can be found at : - * - * by following - * the STREAM API Specification Document link. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - * - * Till Straumann, , 1/2002 - * - separated bridge detection code out of this file - */ - -#include -#include - -#include -#include -#include - -#undef SHOW_PCI_SETTING - -/* allow for overriding these definitions */ -#ifndef PCI_CONFIG_ADDR -#define PCI_CONFIG_ADDR 0xcf8 -#endif -#ifndef PCI_CONFIG_DATA -#define PCI_CONFIG_DATA 0xcfc -#endif - -/* define a shortcut */ -#define pci BSP_pci_configuration - -#ifndef PCI_CONFIG_ADDR_VAL -#define PCI_CONFIG_ADDR_VAL(bus, slot, funcion, offset) \ - (0x80<<24|((bus)<<16)|(PCI_DEVFN((slot),(function))<<8)|(((offset)&~3))) -#endif - -#ifndef PCI_CONFIG_WR_ADDR -#define PCI_CONFIG_WR_ADDR( addr, val ) out_le32((volatile uint32_t*)(addr), (val)) -#endif - -#define PCI_CONFIG_SET_ADDR(addr, bus, slot,function,offset) \ - PCI_CONFIG_WR_ADDR((addr), PCI_CONFIG_ADDR_VAL((bus), (slot), (function), (offset))) - - -extern void detect_host_bridge(void); - -/* - * Bit encode for PCI_CONFIG_HEADER_TYPE register - */ -unsigned char ucMaxPCIBus; - -static int -indirect_pci_read_config_byte( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint8_t *val -) { - PCI_CONFIG_SET_ADDR(pci.pci_config_addr, bus, slot, function, offset); - *val = in_8(pci.pci_config_data + (offset&3)); - return PCIBIOS_SUCCESSFUL; -} - -static int -indirect_pci_read_config_word( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint16_t *val -) { - *val = 0xffff; - if (offset&1) - return PCIBIOS_BAD_REGISTER_NUMBER; - - PCI_CONFIG_SET_ADDR(pci.pci_config_addr, bus, slot, function, offset); - *val = in_le16((volatile uint16_t *)(pci.pci_config_data + (offset&3))); - return PCIBIOS_SUCCESSFUL; -} - -static int -indirect_pci_read_config_dword( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint32_t *val -) { - *val = 0xffffffff; - if (offset&3) - return PCIBIOS_BAD_REGISTER_NUMBER; - - PCI_CONFIG_SET_ADDR(pci.pci_config_addr, bus, slot, function, offset); - *val = in_le32((volatile uint32_t *)pci.pci_config_data); - return PCIBIOS_SUCCESSFUL; -} - -static int -indirect_pci_write_config_byte( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint8_t val -) { - PCI_CONFIG_SET_ADDR(pci.pci_config_addr, bus, slot, function, offset); - out_8(pci.pci_config_data + (offset&3), val); - return PCIBIOS_SUCCESSFUL; -} - -static int -indirect_pci_write_config_word( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint16_t val -) { - if (offset&1) - return PCIBIOS_BAD_REGISTER_NUMBER; - - PCI_CONFIG_SET_ADDR(pci.pci_config_addr, bus, slot, function, offset); - out_le16((volatile uint16_t *)(pci.pci_config_data + (offset&3)), val); - return PCIBIOS_SUCCESSFUL; -} - -static int -indirect_pci_write_config_dword( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint32_t val -) { - if (offset&3) - return PCIBIOS_BAD_REGISTER_NUMBER; - PCI_CONFIG_SET_ADDR(pci.pci_config_addr, bus, slot, function, offset); - out_le32((volatile uint32_t *)pci.pci_config_data, val); - return PCIBIOS_SUCCESSFUL; -} - -const pci_config_access_functions pci_indirect_functions = { - indirect_pci_read_config_byte, - indirect_pci_read_config_word, - indirect_pci_read_config_dword, - indirect_pci_write_config_byte, - indirect_pci_write_config_word, - indirect_pci_write_config_dword -}; - -rtems_pci_config_t BSP_pci_configuration = { - (volatile unsigned char*)PCI_CONFIG_ADDR, - (volatile unsigned char*)PCI_CONFIG_DATA, - &pci_indirect_functions -}; - -static int -direct_pci_read_config_byte( - unsigned char bus, - unsigned char slot, - unsigned char function, - unsigned char offset, - uint8_t *val -) { - if (bus != 0 || (1<pin_route[j].pin > -1; j++) { - if ( row->pin_route[j].pin == int_pin ) { - _nopin = 0; - - for (k=0; k<4 && row->pin_route[j].int_name[k] > -1; k++ ) { - if ( row->pin_route[j].int_name[k] == int_name ) { - _noname=0; break; - } - } - break; - } - } - - if( _nopin ) - { - printk("pci : Device %d:0x%02x:%d supplied a bogus interrupt_pin %d\n", pbus, pslot, pfun, int_pin ); - return -1; - } - else - { - if( _noname ) { - unsigned char v = row->pin_route[j].int_name[0]; - printk("pci : Device %d:0x%02x:%d supplied a suspicious interrupt_line %d, ", pbus, pslot, pfun, int_name ); - if ( (row->opts & PCI_FIXUP_OPT_OVERRIDE_NAME) && 255 != (v = row->pin_route[j].int_name[0]) ) { - printk("OVERRIDING with %d from fixup table\n", v); - pci_write_config_byte(pbus,pslot,pfun,PCI_INTERRUPT_LINE,v); - } else { - printk("using it anyway\n"); - } - } - } - return 0; -} - -struct pcibridge -{ - int bus; - int slot; -}; - -static int FindPCIbridge( int mybus, struct pcibridge *pb ) -{ - int pbus, pslot; - uint8_t bussec, buspri; - uint16_t devid, vendorid, dclass; - - for(pbus=0; pbus< pci_bus_count(); pbus++) { - for(pslot=0; pslot< PCI_MAX_DEVICES; pslot++) { - pci_read_config_word(pbus, pslot, 0, PCI_DEVICE_ID, &devid); - if ( devid == 0xffff ) continue; - - pci_read_config_word(pbus, pslot, 0, PCI_DEVICE_ID, &vendorid); - if ( vendorid == 0xffff ) continue; - - pci_read_config_word(pbus, pslot, 0, PCI_CLASS_DEVICE, &dclass); - - if ( dclass == PCI_CLASS_BRIDGE_PCI ) { - pci_read_config_byte(pbus, pslot, 0, PCI_PRIMARY_BUS, &buspri); - pci_read_config_byte(pbus, pslot, 0, PCI_SECONDARY_BUS, &bussec); - -#ifdef SHOW_PCI_SETTING - printk("pci : Found bridge at %d:0x%02x, mybus %d, pribus %d, secbus %d ", - pbus, pslot, mybus, buspri, bussec ); -#endif - if ( bussec == mybus ) { -#ifdef SHOW_PCI_SETTING - printk("match\n"); -#endif - /* found our nearest bridge going towards the root */ - pb->bus = pbus; - pb->slot = pslot; - - return 0; - } -#ifdef SHOW_PCI_SETTING - printk("no match\n"); -#endif - } - - } - } - return -1; -} - -void FixupPCI( const struct _int_map *bspmap, int (*swizzler)(int,int) ) -{ - unsigned char cvalue; - uint16_t devid; - int ismatch, i, j, pbus, pslot, pfun, int_pin, int_name, nfuns; - - /* - * If the device has a non-zero INTERRUPT_PIN, assign a bsp-specific - * INTERRUPT_NAME if one isn't already in place. Then, drivers can - * trivially use INTERRUPT_NAME to hook up with devices. - */ - - for (pbus=0; pbus< pci_bus_count(); pbus++) { - for (pslot=0; pslot< PCI_MAX_DEVICES; pslot++) { - pci_read_config_word(pbus, pslot, 0, PCI_DEVICE_ID, &devid); - if ( devid == 0xffff ) continue; - - /* got a device */ - pci_read_config_byte(pbus, pslot, 0, PCI_HEADER_TYPE, &cvalue); - nfuns = cvalue & PCI_HEADER_TYPE_MULTI_FUNCTION ? PCI_MAX_FUNCTIONS : 1; - - for (pfun=0; pfun< nfuns; pfun++) { - pci_read_config_word(pbus, pslot, pfun, PCI_DEVICE_ID, &devid); - if( devid == 0xffff ) continue; - - pci_read_config_byte( pbus, pslot, pfun, PCI_INTERRUPT_PIN, &cvalue); - int_pin = cvalue; - - pci_read_config_byte( pbus, pslot, pfun, PCI_INTERRUPT_LINE, &cvalue); - int_name = cvalue; - - /* printk("pci : device %d:0x%02x:%i devid %04x, intpin %d, intline %d\n", - pbus, pslot, pfun, devid, int_pin, int_name ); */ - -#ifdef SHOW_PCI_SETTING - { - unsigned short cmd,stat; - unsigned char lat, seclat, csize; - - pci_read_config_word(pbus,pslot,pfun,PCI_COMMAND, &cmd ); - pci_read_config_word(pbus,pslot,pfun,PCI_STATUS, &stat ); - pci_read_config_byte(pbus,pslot,pfun,PCI_LATENCY_TIMER, &lat ); - pci_read_config_byte(pbus,pslot,pfun,PCI_SEC_LATENCY_TIMER, &seclat ); - pci_read_config_byte(pbus,pslot,pfun,PCI_CACHE_LINE_SIZE, &csize ); - - - printk("pci : device %d:0x%02x:%d cmd %04X, stat %04X, latency %d, " - " sec_latency %d, clsize %d\n", pbus, pslot, pfun, cmd, stat, - lat, seclat, csize); - } -#endif - - if ( int_pin > 0 ) { - ismatch = 0; - - /* - * first run thru the bspmap table and see if we have an - * explicit configuration - */ - for (i=0; bspmap[i].bus > -1; i++) { - if ( bspmap[i].bus == pbus && bspmap[i].slot == pslot ) { - ismatch = -1; - /* we have a record in the table that gives specific - * pins and interrupts for devices in this slot */ - if ( int_name == 255 ) { - /* find the vector associated with whatever pin the - * device gives us - */ - for ( int_name=-1, j=0; bspmap[i].pin_route[j].pin > -1; j++ ) { - if ( bspmap[i].pin_route[j].pin == int_pin ) { - int_name = bspmap[i].pin_route[j].int_name[0]; - break; - } - } - if ( int_name == -1 ) { - printk("pci : Unable to resolve device %d:0x%02x:%d w/ swizzled int " - "pin %i to an interrupt_line.\n", pbus, pslot, pfun, int_pin ); - } else { - PRINT_MSG(); - pci_write_config_byte( pbus,pslot,pfun, - PCI_INTERRUPT_LINE,(cvalue= int_name, cvalue)); - } - } else { - test_intname( &bspmap[i],pbus,pslot,pfun,int_pin,int_name); - } - break; - } - } - - if ( !ismatch ) { - /* - * no match, which means we're on a bus someplace. Work - * backwards from it to one of our defined busses, - * swizzling thru each bridge on the way. - */ - - /* keep pbus, pslot pointed to the device being - * configured while we track down the bridges using - * tbus,tslot. We keep searching the routing table because - * we may end up finding our bridge in it - */ - - int tbus= pbus, tslot= pslot; - - for (;;) { - for (i=0; bspmap[i].bus > -1; i++) { - if ( bspmap[i].bus == tbus && - (bspmap[i].slot == tslot || bspmap[i].slot == -1) ) { - ismatch = -1; - /* found a record for this bus, so swizzle the - * int_pin which we then use to find the - * interrupt_name. - */ - - if ( int_name == 255 ) { - /* - * FIXME. I can't believe this little hack - * is right. It does not yield an error in - * convienently simple situations. - */ - if ( tbus ) int_pin = (*swizzler)(tslot,int_pin); - - /* - * int_pin points to the interrupt channel - * this card ends up delivering interrupts - * on. Find the int_name servicing it. - */ - for (int_name=-1, j=0; bspmap[i].pin_route[j].pin > -1; j++){ - if ( bspmap[i].pin_route[j].pin == int_pin ) { - int_name = bspmap[i].pin_route[j].int_name[0]; - break; - } - } - - if ( int_name == -1 ) { - printk("pci : Unable to resolve device %d:0x%02x:%d w/ swizzled " - "int pin %i to an interrupt_line.\n", - pbus, pslot, pfun, int_pin ); - } else { - PRINT_MSG(); - pci_write_config_byte(pbus,pslot,pfun, - PCI_INTERRUPT_LINE,(cvalue=int_name, cvalue)); - } - } else { - test_intname(&bspmap[i],pbus,pslot,pfun,int_pin,int_name); - } - goto donesearch; - } - } - - if ( !ismatch ) { - struct pcibridge pb; - - /* - * Haven't found our bus in the int map, so work - * upwards thru the bridges till we find it. - */ - - if ( FindPCIbridge( tbus, &pb )== 0 ) { - int_pin = (*swizzler)(tslot,int_pin); - - /* our next bridge up is on pb.bus, pb.slot- now - * instead of pointing to the device we're - * trying to configure, we move from bridge to - * bridge. - */ - - tbus = pb.bus; - tslot = pb.slot; - } else { - printk("pci : No bridge from bus %i towards root found\n", - tbus ); - goto donesearch; - } - } - } - } -donesearch: - - if ( !ismatch && int_pin != 0 && int_name == 255 ) { - printk("pci : Unable to match device %d:0x%02x:%d with an int " - "routing table entry\n", pbus, pslot, pfun ); - } - } - } - } - } -} - -/* - * This routine determines the maximum bus number in the system - */ -int pci_initialize(void) -{ - unsigned char ucSlotNumber, ucFnNumber, ucNumFuncs; - unsigned char ucHeader; - unsigned char ucMaxSubordinate; - uint32_t ulClass; - uint32_t ulDeviceID; - - detect_host_bridge(); - - /* - * Scan PCI bus 0 looking for PCI-PCI bridges - */ - for (ucSlotNumber=0;ucSlotNumber>= 16; - if (ulClass == PCI_CLASS_BRIDGE_PCI) { - /* We have found a PCI-PCI bridge */ - pci_read_config_byte(0, ucSlotNumber, ucFnNumber, - PCI_SUBORDINATE_BUS, &ucMaxSubordinate); - if (ucMaxSubordinate>ucMaxPCIBus) { - ucMaxPCIBus=ucMaxSubordinate; - } - } - } - } - return PCIB_ERR_SUCCESS; -} - -/* - * Return the number of PCI busses in the system - */ -unsigned char pci_bus_count(void) -{ - return (ucMaxPCIBus+1); -} diff --git a/c/src/lib/libbsp/powerpc/shared/pci/pcifinddevice.c b/c/src/lib/libbsp/powerpc/shared/pci/pcifinddevice.c deleted file mode 100644 index 8aad50547a..0000000000 --- a/c/src/lib/libbsp/powerpc/shared/pci/pcifinddevice.c +++ /dev/null @@ -1,212 +0,0 @@ -/* find a particular PCI device - * (we assume, the firmware configured the PCI bus[es] for us) - */ - -/* - * Authorship - * ---------- - * This software was created by - * Till Straumann , 2001, - * Stanford Linear Accelerator Center, Stanford University. - * - * Acknowledgement of sponsorship - * ------------------------------ - * This software was produced by - * the Stanford Linear Accelerator Center, Stanford University, - * under Contract DE-AC03-76SFO0515 with the Department of Energy. - * - * Government disclaimer of liability - * ---------------------------------- - * Neither the United States nor the United States Department of Energy, - * nor any of their employees, makes any warranty, express or implied, or - * assumes any legal liability or responsibility for the accuracy, - * completeness, or usefulness of any data, apparatus, product, or process - * disclosed, or represents that its use would not infringe privately owned - * rights. - * - * Stanford disclaimer of liability - * -------------------------------- - * Stanford University makes no representations or warranties, express or - * implied, nor assumes any liability for the use of this software. - * - * Stanford disclaimer of copyright - * -------------------------------- - * Stanford University, owner of the copyright, hereby disclaims its - * copyright and all other rights in this software. Hence, anyone may - * freely use it for any purpose without restriction. - * - * Maintenance of notices - * ---------------------- - * In the interest of clarity regarding the origin and status of this - * SLAC software, this and all the preceding Stanford University notices - * are to remain affixed to any copy or derivative of this software made - * or distributed by the recipient and are to be affixed to any copy of - * software made or distributed by the recipient that contains a copy or - * derivative of this software. - * - * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03 - */ - -#include -#include -#include -#include - -/* Stolen from i386... */ - -/* - * Make device signature from bus number, device number and function - * number - */ -#define PCIB_DEVSIG_MAKE(b,d,f) ((b<<8)|(d<<3)|(f)) - -/* - * Extract various parts from device signature - */ -#define PCIB_DEVSIG_BUS(x) (((x)>>8) &0xff) -#define PCIB_DEVSIG_DEV(x) (((x)>>3) & 0x1f) -#define PCIB_DEVSIG_FUNC(x) ((x) & 0x7) - -typedef struct { - unsigned short vid,did; - int inst; -} fd_arg; - -static int -find_dev_cb( - int bus, - int dev, - int fun, - void *uarg -) { -fd_arg *a = uarg; -unsigned short s; - - pci_read_config_word(bus,dev,fun,PCI_VENDOR_ID,&s); - if (a->vid == s) { - pci_read_config_word(bus,dev,fun,PCI_DEVICE_ID,&s); - if (a->did == s && 0 == a->inst-- ) { - a->inst = PCIB_DEVSIG_MAKE( bus, dev, fun ); - return 1; - } - } - return 0; -} - -int -pci_find_device( - unsigned short vendorid, - unsigned short deviceid, - int instance, - int *pbus, - int *pdev, - int *pfun -) { -fd_arg a; -void *h; - a.vid = vendorid; - a.did = deviceid; - a.inst = instance; - - if ( (h = BSP_pciScan(0, find_dev_cb, (void*)&a)) ) { - *pbus = PCIB_DEVSIG_BUS( a.inst ); - *pdev = PCIB_DEVSIG_DEV( a.inst ); - *pfun = PCIB_DEVSIG_FUNC( a.inst ); - return 0; - } - return -1; -} - -static int -dump_dev_cb( - int bus, - int dev, - int fun, - void *uarg -) -{ - uint16_t vi,di; - uint16_t cd,st; - uint32_t b1,b2; - uint8_t il,ip; - FILE *f = uarg; - - pci_read_config_word (bus, dev, fun, PCI_VENDOR_ID, &vi); - pci_read_config_word (bus, dev, fun, PCI_DEVICE_ID, &di); - pci_read_config_word (bus, dev, fun, PCI_COMMAND, &cd); - pci_read_config_word (bus, dev, fun, PCI_STATUS, &st); - pci_read_config_dword(bus, dev, fun, PCI_BASE_ADDRESS_0, &b1); - pci_read_config_dword(bus, dev, fun, PCI_BASE_ADDRESS_1, &b2); - pci_read_config_byte (bus, dev, fun, PCI_INTERRUPT_LINE, &il); - pci_read_config_byte (bus, dev, fun, PCI_INTERRUPT_PIN, &ip); - - /* fprintf(f,"%3d:0x%02x:%d 0x%04x-0x%04x: 0x%04x 0x%04x 0x%08x 0x%08x %d -> %3d (=0x%02x)\n", */ - fprintf(f,"%3d:0x%02x:%d 0x%04x-0x%04x: 0x%04x 0x%04x 0x%08" PRIx32 " 0x%08" PRIx32 " %d -> %3d (=0x%02x)\n", - bus, dev, fun, vi, di, cd, st, b1, b2, ip, il, il); - return 0; -} - -void -BSP_pciConfigDump(FILE *f) -{ - if ( !f ) - f = stdout; - fprintf(f,"BUS:SLOT:FUN VENDOR-DEV_ID: COMMAND STATUS BASE_ADDR0 BASE_ADDR1 IRQ_PIN -> IRQ_LINE\n"); - BSP_pciScan(0, dump_dev_cb, f); -} - -BSP_PciScanHandle -BSP_pciScan( - BSP_PciScanHandle handle, - BSP_PciScannerCb cb, - void *uarg -) { - - uint32_t d; - unsigned char bus,dev,fun,hd; - - bus = PCIB_DEVSIG_BUS( (unsigned long)handle ); - dev = PCIB_DEVSIG_DEV( (unsigned long)handle ); - fun = PCIB_DEVSIG_FUNC( (unsigned long)handle ); - - hd = fun > 0 ? PCI_MAX_FUNCTIONS : 1; - - for (; bus 0 ) { - if ( ++fun >= hd ) { - fun = 0; - if ( ++dev >= PCI_MAX_DEVICES ) { - dev = 0; - bus++; - } - } - return (void*) PCIB_DEVSIG_MAKE(bus,dev,fun); - } - } - } - } - return 0; -} -- cgit v1.2.3