X86: Get PCI config space to work, and adjust address space prefix numbering scheme.

--HG--
extra : convert_revision : 2b382f478ee8cde3a35aa4c105196f200bc7afa6
This commit is contained in:
Gabe Black 2008-02-26 23:38:01 -05:00
parent 8c0baf2ce4
commit 7bde0285e5
8 changed files with 50 additions and 8 deletions

View file

@ -156,7 +156,7 @@ def makeLinuxMipsSystem(mem_mode, mdesc = None):
return self
def x86IOAddress(port):
IO_address_space_base = 0x1000000000000000
IO_address_space_base = 0x8000000000000000
return IO_address_space_base + port;
def makeLinuxX86System(mem_mode, mdesc = None):
@ -189,6 +189,7 @@ def makeLinuxX86System(mem_mode, mdesc = None):
# Platform
self.opteron = Opteron()
self.opteron.attachIO(self.iobus)
self.intrctrl = IntrControl()

View file

@ -339,6 +339,8 @@ namespace X86ISA
//XXX Add "Model-Specific Registers"
MISCREG_PCI_CONFIG_ADDRESS,
NUM_MISCREGS
};

View file

@ -64,6 +64,7 @@
* ISA-specific helper functions for memory mapped IPR accesses.
*/
#include "arch/x86/miscregs.hh"
#include "config/full_system.hh"
#include "cpu/base.hh"
#include "cpu/thread_context.hh"
@ -88,8 +89,13 @@ namespace X86ISA
#if !FULL_SYSTEM
panic("Shouldn't have a memory mapped register in SE\n");
#else
xc->setMiscReg(pkt->getAddr() / sizeof(MiscReg),
gtoh(pkt->get<uint64_t>()));
MiscRegIndex index = (MiscRegIndex)(pkt->getAddr() / sizeof(MiscReg));
if (index == MISCREG_PCI_CONFIG_ADDRESS) {
xc->setMiscReg(index, gtoh(pkt->get<uint32_t>()));
} else {
xc->setMiscReg(pkt->getAddr() / sizeof(MiscReg),
gtoh(pkt->get<uint64_t>()));
}
#endif
return xc->getCpuPtr()->ticks(1);
}

View file

@ -76,7 +76,7 @@
namespace X86ISA {
TLB::TLB(const Params *p) : SimObject(p), size(p->size)
TLB::TLB(const Params *p) : SimObject(p), configAddress(0), size(p->size)
{
tlb = new TlbEntry[size];
std::memset(tlb, 0, sizeof(TlbEntry) * size);
@ -147,6 +147,12 @@ TLB::invalidateAll()
}
}
void
TLB::setConfigAddress(uint32_t addr)
{
configAddress = addr;
}
void
TLB::invalidateNonGlobal()
{
@ -478,7 +484,19 @@ TLB::translate(RequestPtr &req, ThreadContext *tc, bool write, bool execute)
// Make sure the address fits in the expected 16 bit IO address
// space.
assert(!(IOPort & ~0xFFFF));
req->setPaddr(PhysAddrPrefixIO | IOPort);
if (IOPort == 0xCF8 && req->getSize() == 4) {
req->setMmapedIpr(true);
req->setPaddr(MISCREG_PCI_CONFIG_ADDRESS * sizeof(MiscReg));
} else if ((IOPort & ~mask(2)) == 0xCFC) {
Addr configAddress =
tc->readMiscRegNoEffect(MISCREG_PCI_CONFIG_ADDRESS);
if (bits(configAddress, 31, 31)) {
req->setPaddr(PhysAddrPrefixPciConfig |
bits(configAddress, 30, 0));
}
} else {
req->setPaddr(PhysAddrPrefixIO | IOPort);
}
return NoFault;
} else {
panic("Access to unrecognized internal address space %#x.\n",

View file

@ -90,6 +90,7 @@ namespace X86ISA
friend class FakeDTLBFault;
bool _allowNX;
uint32_t configAddress;
public:
bool allowNX() const
@ -104,6 +105,8 @@ namespace X86ISA
TlbEntry *lookup(Addr va, bool update_lru = true);
void setConfigAddress(uint32_t addr);
#if FULL_SYSTEM
protected:

View file

@ -88,7 +88,8 @@ namespace X86ISA
const Addr IntAddrPrefixMSR = ULL(0x200000000);
const Addr IntAddrPrefixIO = ULL(0x300000000);
const Addr PhysAddrPrefixIO = ULL(0x1000000000000000);
const Addr PhysAddrPrefixIO = ULL(0x8000000000000000);
const Addr PhysAddrPrefixPciConfig = ULL(0xC000000000000000);
}
#endif //__ARCH_X86_X86TRAITS_HH__

View file

@ -3,8 +3,16 @@ from m5.proxy import *
from Device import BasicPioDevice, PioDevice, IsaFake, BadAddr
from Uart import Uart8250
from Platform import Platform
from Pci import PciConfigAll
from SimConsole import SimConsole
class Opteron(Platform):
type = 'Opteron'
system = Param.System(Parent.any, "system")
pciconfig = PciConfigAll()
def attachIO(self, bus):
self.pciconfig.pio = bus.default
bus.responder_set = True
bus.responder = self.pciconfig

View file

@ -36,6 +36,7 @@
#include <string>
#include <vector>
#include "arch/x86/x86_traits.hh"
#include "cpu/intr_control.hh"
#include "dev/simconsole.hh"
#include "dev/x86/opteron.hh"
@ -95,8 +96,10 @@ Opteron::pciToDma(Addr pciAddr) const
Addr
Opteron::calcConfigAddr(int bus, int dev, int func)
{
panic("Need implementation\n");
M5_DUMMY_RETURN
assert(func < 8);
assert(dev < 32);
assert(bus == 0);
return (PhysAddrPrefixPciConfig | (func << 8) | (dev << 11));
}
Opteron *