NVNet : Converted into a PCI device

This commit is contained in:
PatrickvL 2017-12-15 18:33:36 +01:00 committed by patrickvl
parent 4d1225e181
commit 1b579e2c4b
4 changed files with 73 additions and 26 deletions

View File

@ -68,11 +68,14 @@ namespace xboxkrnl
#include "EEPROMDevice.h" // For EEPROMDevice
#include "LED.h" // For LED::Sequence
#include "SMCDevice.h" // For SMCDevice
#include "EmuNVNet.h" // For NVNetDevice
PCIBus* g_PCIBus;
SMBus* g_SMBus;
EEPROMDevice* g_EEPROM;
SMCDevice* g_SMC;
NVNetDevice* g_NVNet;
/* prevent name collisions */
namespace NtDll
@ -1038,6 +1041,9 @@ __declspec(noreturn) void CxbxKrnlInit
g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(1, 1)), g_SMBus);
g_NVNet = new NVNetDevice();
g_PCIBus->ConnectDevice(PCI_DEVID(0, PCI_DEVFN(4, 0)), g_NVNet);
// Always initialise NV2A: We may need it for disabled HLE patches too!
EmuNV2A_Init();

View File

@ -507,3 +507,56 @@ void EmuNVNet_Write(xbaddr addr, uint32_t value, int size)
DbgPrintf("NET : Write%d: %s (0x%.8X) = 0x%.8X\n", size, EmuNVNet_GetRegisterName(addr), addr, value);
}
/* NVNetDevice */
// PCI Device functions
void NVNetDevice::Init()
{
PCIBarRegister r;
// Register IO bar :
r.Raw.type = PCI_BAR_TYPE_IO;
r.IO.address = 0xE000;
RegisterBAR(0, 8, r.value);
// Register Memory bar :
r.Raw.type = PCI_BAR_TYPE_MEMORY;
r.Memory.address = NVNET_ADDR >> 4;
RegisterBAR(1, NVNET_SIZE, r.value);
m_DeviceId = 0x01C3;
m_VendorId = PCI_VENDOR_ID_NVIDIA;
}
void NVNetDevice::Reset()
{
}
uint32_t NVNetDevice::IORead(int barIndex, uint32_t port, unsigned size)
{
return 0;
}
void NVNetDevice::IOWrite(int BarIndex, uint32_t port, uint32_t value, unsigned size)
{
}
uint32_t NVNetDevice::MMIORead(int barIndex, uint32_t addr, unsigned size)
{
if (barIndex != 1) {
return 0;
}
return EmuNVNet_Read(addr, size * 8); // For now, forward
}
void NVNetDevice::MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size)
{
if (barIndex != 1) {
return;
}
EmuNVNet_Write(addr, value, size * 8); // For now, forward
}

View File

@ -31,13 +31,22 @@
// * All rights reserved
// *
// ******************************************************************
#ifndef EMUNVNET_H
#define EMUNVNET_H
#pragma once
#include "PCIDevice.h" // For PCIDevice
#define NVNET_ADDR 0xFEF00000
#define NVNET_SIZE 0x00000400
uint32_t EmuNVNet_Read(xbaddr addr, int size);
void EmuNVNet_Write(xbaddr addr, uint32_t value, int size);
class NVNetDevice : public PCIDevice {
public:
// PCI Device functions
void Init();
void Reset();
uint32_t IORead(int barIndex, uint32_t port, unsigned size);
void IOWrite(int BarIndex, uint32_t port, uint32_t value, unsigned size);
uint32_t MMIORead(int barIndex, uint32_t addr, unsigned size);
void MMIOWrite(int barIndex, uint32_t addr, uint32_t value, unsigned size);
};
#endif
extern NVNetDevice* g_NVNet;

View File

@ -210,8 +210,6 @@ uint32_t EmuX86_Read32Aligned(xbaddr addr)
// Access NV2A regardless weither HLE is disabled or not (ignoring bLLE_GPU)
value = EmuNV2A_Read(addr - NV2A_ADDR, 32);
// Note : EmuNV2A_Read32 does it's own logging
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
value = EmuNVNet_Read(addr - NVNET_ADDR, 32);
} else if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE);
} else {
@ -256,8 +254,6 @@ uint16_t EmuX86_Read16(xbaddr addr)
// Access NV2A regardless weither HLE is disabled or not
value = EmuNV2A_Read(addr - NV2A_ADDR, 16);
// Note : EmuNV2A_Read32 does it's own logging
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
value = EmuNVNet_Read(addr - NVNET_ADDR, 16);
} else if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE);
} else {
@ -289,8 +285,6 @@ uint8_t EmuX86_Read8(xbaddr addr)
// Access NV2A regardless weither HLE is disabled or not
value = EmuNV2A_Read(addr - NV2A_ADDR, 8);
// Note : EmuNV2A_Read32 does it's own logging
} else if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
value = EmuNVNet_Read(addr - NVNET_ADDR, 8);
} else if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
value = EmuFlash_Read32(addr - XBOX_FLASH_ROM_BASE);
} else {
@ -325,11 +319,6 @@ void EmuX86_Write32Aligned(xbaddr addr, uint32_t value)
return;
}
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
EmuNVNet_Write(addr - NVNET_ADDR, value, 32);
return;
}
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
EmuWarning("EmuX86_Write32Aligned(0x%08X, 0x%08X) [FLASH_ROM]", addr, value);
return;
@ -370,11 +359,6 @@ void EmuX86_Write16(xbaddr addr, uint16_t value)
return;
}
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
EmuNVNet_Write(addr - NVNET_ADDR, value, 16);
return;
}
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
EmuWarning("EmuX86_Write16(0x%08X, 0x%08X) [FLASH_ROM]", addr, value);
return;
@ -405,11 +389,6 @@ void EmuX86_Write8(xbaddr addr, uint8_t value)
return;
}
if (addr >= NVNET_ADDR && addr < NVNET_ADDR + NVNET_SIZE) {
EmuNVNet_Write(addr - NVNET_ADDR, value, 8);
return;
}
if (addr >= XBOX_FLASH_ROM_BASE) { // 0xFFF00000 - 0xFFFFFFF
EmuWarning("EmuX86_Write8(0x%08X, 0x%08X) [FLASH_ROM]", addr, value);
return;