From: John Hodge Date: Thu, 20 Dec 2012 01:59:57 +0000 (+0800) Subject: Kernel - Fixed VPCI bugs X-Git-Tag: rel0.15~597^2~27 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=547e8535ec9bd84f3508182618319155e69572f8;p=tpg%2Facess2.git Kernel - Fixed VPCI bugs --- diff --git a/KernelLand/Kernel/drv/pci.c b/KernelLand/Kernel/drv/pci.c index 2e1ce151..1df421ec 100644 --- a/KernelLand/Kernel/drv/pci.c +++ b/KernelLand/Kernel/drv/pci.c @@ -150,9 +150,15 @@ int PCI_Install(char **Arguments) devinfo->revision = gaVPCI_Devices[i].Class & 0xFF; devinfo->class = gaVPCI_Devices[i].Class >> 8; snprintf(devinfo->Name, sizeof(devinfo->Name), "%02x.%02x:%x", 0xFF, i, 0); + + #if LIST_DEVICES + Log_Log("PCI", "Device %i,%i:%i %06x => 0x%04x:0x%04x Rev %i", + 0xFF, i, 0, devinfo->class, + devinfo->vendor, devinfo->device, devinfo->revision); + #endif for(int j = 0; j < 256/4; j ++ ) - devinfo->ConfigCache[i] = VPCI_Read(&gaVPCI_Devices[i], j*4, 4); + devinfo->ConfigCache[j] = VPCI_Read(&gaVPCI_Devices[i], j*4, 4); memset(&devinfo->Node, 0, sizeof(devinfo->Node)); devinfo->Node.Inode = giPCI_DeviceCount; diff --git a/KernelLand/Kernel/drv/vpci.c b/KernelLand/Kernel/drv/vpci.c index 4fccdb85..e4288b6f 100644 --- a/KernelLand/Kernel/drv/vpci.c +++ b/KernelLand/Kernel/drv/vpci.c @@ -22,12 +22,14 @@ Uint32 VPCI_Read(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size) case 0: // Vendor[0:15], Device[16:31] tmp_dword = (Dev->Vendor) | (Dev->Device << 16); break; + // 1: Command[0:15], Status[16:31] case 2: // Class Code tmp_dword = Dev->Class; break; - // 1: Command[0:15], Status[16:31] // 3: Cache Line Size, Latency Timer, Header Type, BIST - // 4-9: BARs + case 4 ... 9: // 4-9: BARs + tmp_dword = Dev->BARs[ (Offset>>2) - 4 ]; + break; // 10: Unused (Cardbus CIS Pointer) // 11: Subsystem Vendor ID, Subsystem ID // 12: Expansion ROM Address @@ -35,7 +37,8 @@ Uint32 VPCI_Read(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size) // 14: Reserved // 15: Interrupt Line, Interrupt Pin, Min Grant, Max Latency default: - tmp_dword = Dev->Read(Dev->Ptr, Offset >> 2); + if( Dev->Read ) + tmp_dword = Dev->Read(Dev->Ptr, Offset >> 2); break; } @@ -66,7 +69,10 @@ void VPCI_Write(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size, Uint32 Data) return ; } - tmp_dword = Dev->Read(Dev->Ptr, Offset>>2); + if( Size != 4 && Dev->Read ) + tmp_dword = Dev->Read(Dev->Ptr, Offset>>2); + else + tmp_dword = 0; switch(Size) { case 4: tmp_dword = 0; break; @@ -80,5 +86,6 @@ void VPCI_Write(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size, Uint32 Data) break; } tmp_dword |= Data << ((Offset&3)*8); - Dev->Write(Dev->Ptr, Offset>>2, tmp_dword); + if( Dev->Write ) + Dev->Write(Dev->Ptr, Offset>>2, tmp_dword); }