X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fdrv%2Fpci.c;h=1f9e7285607bdc0029e349a924401b4a7d5f7a6b;hb=25f7e9ab0f31ca486c0c981a406d381e160637a4;hp=b6421e091c4ddf0869c71bd4ab39539587e686f8;hpb=8380f2bff65f8c87c9250341ef899f1ddbd2642e;p=tpg%2Facess2.git diff --git a/Kernel/drv/pci.c b/Kernel/drv/pci.c index b6421e09..1f9e7285 100644 --- a/Kernel/drv/pci.c +++ b/Kernel/drv/pci.c @@ -34,10 +34,10 @@ typedef struct sPCIDevice // === PROTOTYPES === int PCI_Install(char **Arguments); - int PCI_ScanBus(int ID); + int PCI_ScanBus(int ID, int bFill); char *PCI_ReadDirRoot(tVFS_Node *node, int pos); -tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, char *filename); +tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, const char *filename); Uint64 PCI_ReadDevice(tVFS_Node *node, Uint64 pos, Uint64 length, void *buffer); int PCI_CountDevices(Uint16 vendor, Uint16 device, Uint16 fcn); @@ -79,8 +79,8 @@ Uint32 gaPCI_BusBitmap[256/32]; // === CODE === /** - * \fn int PCI_Install() * \brief Scan the PCI Bus for devices + * \param Arguments Boot-time parameters */ int PCI_Install(char **Arguments) { @@ -99,8 +99,8 @@ int PCI_Install(char **Arguments) for( i = 0; i < MAX_RESERVED_PORT % 32; i ++ ) gaPCI_PortBitmap[MAX_RESERVED_PORT / 32] = 1 << i; - // Scan Bus - i = PCI_ScanBus(0); + // Scan Bus (Bus 0, Don't fill gPCI_Devices) + i = PCI_ScanBus(0, 0); if(i != MODULE_ERR_OK) return i; if(giPCI_DeviceCount == 0) { @@ -108,12 +108,23 @@ int PCI_Install(char **Arguments) return MODULE_ERR_NOTNEEDED; } - // Ensure the buffer is nice and tight - tmpPtr = realloc(gPCI_Devices, giPCI_DeviceCount*sizeof(tPCIDevice)); - if(tmpPtr == NULL) + // Allocate device buffer + tmpPtr = malloc(giPCI_DeviceCount * sizeof(tPCIDevice)); + if(tmpPtr == NULL) { + Log_Warning("PCI", "Malloc ERROR"); return MODULE_ERR_MALLOC; + } gPCI_Devices = tmpPtr; + Log_Log("PCI", "%i devices, filling structure", giPCI_DeviceCount); + + // Reset counts + giPCI_DeviceCount = 0; + giPCI_BusCount = 0; + memset(gaPCI_BusBitmap, 0, sizeof(gaPCI_BusBitmap)); + // Rescan, filling the PCI device array + PCI_ScanBus(0, 1); + // Complete Driver Structure gPCI_DriverStruct.RootNode.Size = giPCI_DeviceCount; @@ -125,12 +136,13 @@ int PCI_Install(char **Arguments) /** * \brief Scans a specific PCI Bus + * \param BusID PCI Bus ID to scan + * \param bFill Fill the \a gPCI_Devices array? */ -int PCI_ScanBus(int BusID) +int PCI_ScanBus(int BusID, int bFill) { int dev, fcn; tPCIDevice devInfo; - void *tmpPtr = NULL; if( gaPCI_BusBitmap[BusID/32] & (1 << (BusID%32)) ) return MODULE_ERR_OK; @@ -145,12 +157,6 @@ int PCI_ScanBus(int BusID) if(!PCI_EnumDevice(BusID, dev, fcn, &devInfo)) continue; - // Allocate - tmpPtr = realloc(gPCI_Devices, (giPCI_DeviceCount+1)*sizeof(tPCIDevice)); - if(tmpPtr == NULL) - return MODULE_ERR_MALLOC; - gPCI_Devices = tmpPtr; - if(devInfo.oc == PCI_OC_PCIBRIDGE) { #if LIST_DEVICES @@ -158,8 +164,8 @@ int PCI_ScanBus(int BusID) BusID, dev, fcn, devInfo.vendor, devInfo.device); #endif //TODO: Handle PCI-PCI Bridges - //PCI_ScanBus( ); - giPCI_BusCount++; + //PCI_ScanBus(devInfo.???, bFill); + giPCI_BusCount ++; } else { @@ -169,15 +175,17 @@ int PCI_ScanBus(int BusID) #endif } - devInfo.Node.Inode = giPCI_DeviceCount; - memcpy(&gPCI_Devices[giPCI_DeviceCount], &devInfo, sizeof(tPCIDevice)); + if( bFill ) { + devInfo.Node.Inode = giPCI_DeviceCount; + memcpy(&gPCI_Devices[giPCI_DeviceCount], &devInfo, sizeof(tPCIDevice)); + } giPCI_DeviceCount ++; // WTF is this for? // Maybe bit 23 must be set for the device to be valid? // - Actually, maybe 23 means that there are sub-functions if(fcn == 0) { - if( !(devInfo.ConfigCache[3] & 0x800000) ) + if( !(devInfo.ConfigCache[3] & 0x00800000) ) break; } } @@ -202,9 +210,9 @@ char *PCI_ReadDirRoot(tVFS_Node *Node, int Pos) return strdup( gPCI_Devices[Pos].Name ); } /** - * \fn tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, char *filename) + * \fn tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, const char *filename) */ -tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, char *filename) +tVFS_Node *PCI_FindDirRoot(tVFS_Node *node, const char *filename) { int bus,slot,fcn; int i; @@ -460,7 +468,6 @@ int PCI_EnumDevice(Uint16 bus, Uint16 slot, Uint16 fcn, tPCIDevice *info) { Uint16 vendor; int i; - Uint32 addr; vendor = PCI_CfgReadWord(bus, slot, fcn, 0x0|0); if(vendor == 0xFFFF) // Invalid Device @@ -475,16 +482,9 @@ int PCI_EnumDevice(Uint16 bus, Uint16 slot, Uint16 fcn, tPCIDevice *info) info->oc = PCI_CfgReadWord(bus, slot, fcn, 0x8|2); // Load Config Bytes - addr = 0x80000000 | ((Uint)bus<<16) | ((Uint)slot<<11) | ((Uint)fcn<<8); for(i=0;i<256/4;i++) { - #if 1 - outd(0xCF8, addr); - info->ConfigCache[i] = ind(0xCFC); - addr += 4; - #else info->ConfigCache[i] = PCI_CfgReadDWord(bus, slot, fcn, i*4); - #endif } //#if LIST_DEVICES @@ -526,10 +526,10 @@ Uint32 PCI_CfgReadDWord(Uint16 bus, Uint16 dev, Uint16 func, Uint16 offset) offset &= 0xFF; // 8 Bits address = 0x80000000 | ((Uint)bus<<16) | ((Uint)dev<<11) | ((Uint)func<<8) | (offset&0xFC); - Debug("PCI_CfgReadDWord: address = %x", address); outd(0xCF8, address); data = ind(0xCFC); + //Debug("PCI(0x%x) = 0x%08x", address, data); return data; } void PCI_CfgWriteDWord(Uint16 bus, Uint16 dev, Uint16 func, Uint16 offset, Uint32 data) @@ -547,38 +547,17 @@ void PCI_CfgWriteDWord(Uint16 bus, Uint16 dev, Uint16 func, Uint16 offset, Uint3 } Uint16 PCI_CfgReadWord(Uint16 bus, Uint16 dev, Uint16 func, Uint16 offset) { - Uint32 data; - - bus &= 0xFF; // 8 Bits - dev &= 0x1F; // 5 Bits - func &= 0x7; // 3 Bits - offset &= 0xFF; // 8 Bits - - //LogF("PCI_CfgReadWord: (bus=0x%x,dev=0x%x,func=%x,offset=0x%x)\n", bus, dev, func, offset); + Uint32 data = PCI_CfgReadDWord(bus, dev, func, offset); - outd(0xCF8, - 0x80000000 | ((Uint)bus<<16) | ((Uint)dev<<11) | ((Uint)func<<8) | (offset&0xFC) ); + data >>= (offset&2)*8; // Allow Access to Upper Word - data = ind(0xCFC); - data >>= (offset&2)*8; //Allow Access to Upper Word - //LogF("PCI_CfgReadWord: RETURN 0x%x\n", data&0xFFFF); return (Uint16)data; } Uint8 PCI_CfgReadByte(Uint16 bus, Uint16 dev, Uint16 func, Uint16 offset) { - Uint32 address; - Uint32 data; + Uint32 data = PCI_CfgReadDWord(bus, dev, func, offset); - bus &= 0xFF; // 8 Bits - dev &= 0x1F; // 4 Bits - func &= 0x7; // 3 Bits - offset &= 0xFF; // 8 Bits - - address = 0x80000000 | ((Uint)bus<<16) | ((Uint)dev<<11) | ((Uint)func<<8) | (offset&0xFC); - outd(0xCF8, address); - - data = ind(0xCFC); data >>= (offset&3)*8; //Allow Access to Upper Word return (Uint8)data; }