ARM: Change how the AMBA device ID checking is done to make it more generic
This commit is contained in:
parent
330fada1aa
commit
c0ca01ec36
7 changed files with 64 additions and 45 deletions
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
from m5.params import *
|
from m5.params import *
|
||||||
from m5.proxy import *
|
from m5.proxy import *
|
||||||
from Device import BasicPioDevice, PioDevice, IsaFake, BadAddr
|
from Device import BasicPioDevice, PioDevice, IsaFake, BadAddr, DmaDevice
|
||||||
from Platform import Platform
|
from Platform import Platform
|
||||||
from Terminal import Terminal
|
from Terminal import Terminal
|
||||||
from Uart import Uart
|
from Uart import Uart
|
||||||
|
@ -51,6 +51,11 @@ class AmbaDevice(BasicPioDevice):
|
||||||
abstract = True
|
abstract = True
|
||||||
amba_id = Param.UInt32("ID of AMBA device for kernel detection")
|
amba_id = Param.UInt32("ID of AMBA device for kernel detection")
|
||||||
|
|
||||||
|
class AmbaDmaDevice(DmaDevice):
|
||||||
|
type = 'AmbaDmaDevice'
|
||||||
|
abstract = True
|
||||||
|
amba_id = Param.UInt32("ID of AMBA device for kernel detection")
|
||||||
|
|
||||||
class RealViewCtrl(BasicPioDevice):
|
class RealViewCtrl(BasicPioDevice):
|
||||||
type = 'RealViewCtrl'
|
type = 'RealViewCtrl'
|
||||||
proc_id = Param.UInt32(0x0C000000, "Platform ID")
|
proc_id = Param.UInt32(0x0C000000, "Platform ID")
|
||||||
|
|
|
@ -50,22 +50,29 @@ AmbaDevice::AmbaDevice(const Params *p)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
AmbaDmaDevice::AmbaDmaDevice(const Params *p)
|
||||||
AmbaDevice::readId(PacketPtr pkt)
|
: DmaDevice(p), ambaId(ULL(0xb105f00d00000000) | p->amba_id)
|
||||||
{
|
{
|
||||||
Addr daddr = pkt->getAddr() - pioAddr;
|
}
|
||||||
|
|
||||||
|
|
||||||
|
namespace AmbaDev {
|
||||||
|
bool
|
||||||
|
readId(PacketPtr pkt, uint64_t amba_id, Addr pio_addr)
|
||||||
|
{
|
||||||
|
Addr daddr = pkt->getAddr() - pio_addr;
|
||||||
if (daddr < AMBA_PER_ID0 || daddr > AMBA_CEL_ID3)
|
if (daddr < AMBA_PER_ID0 || daddr > AMBA_CEL_ID3)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
pkt->allocate();
|
pkt->allocate();
|
||||||
|
|
||||||
daddr -= AMBA_PER_ID0;
|
int byte = (daddr - AMBA_PER_ID0) << 1;
|
||||||
daddr <<= 1;
|
|
||||||
// Too noisy right now
|
// Too noisy right now
|
||||||
//DPRINTF(AMBA, "Returning %#x for offset %#x(%d)\n", (ambaId >> daddr) & 0xFF,
|
DPRINTF(AMBA, "Returning %#x for offset %#x(%d)\n", (amba_id >> byte) & 0xFF,
|
||||||
// pkt->getAddr() - pioAddr, daddr);
|
pkt->getAddr() - pio_addr, byte);
|
||||||
assert(pkt->getSize() == 4);
|
assert(pkt->getSize() == 4);
|
||||||
pkt->set<uint32_t>((ambaId >> daddr) & 0xFF);
|
pkt->set<uint32_t>((amba_id >> byte) & 0xFF);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace AmbaDev
|
||||||
|
|
|
@ -50,33 +50,45 @@
|
||||||
#define __DEV_ARM_AMBA_DEVICE_H__
|
#define __DEV_ARM_AMBA_DEVICE_H__
|
||||||
|
|
||||||
#include "base/range.hh"
|
#include "base/range.hh"
|
||||||
|
#include "mem/packet.hh"
|
||||||
|
#include "mem/packet_access.hh"
|
||||||
#include "dev/io_device.hh"
|
#include "dev/io_device.hh"
|
||||||
#include "params/AmbaDevice.hh"
|
#include "params/AmbaDevice.hh"
|
||||||
|
#include "params/AmbaDmaDevice.hh"
|
||||||
|
|
||||||
|
namespace AmbaDev {
|
||||||
|
|
||||||
|
const int AMBA_PER_ID0 = 0xFE0;
|
||||||
|
const int AMBA_PER_ID1 = 0xFE4;
|
||||||
|
const int AMBA_PER_ID2 = 0xFE8;
|
||||||
|
const int AMBA_PER_ID3 = 0xFEC;
|
||||||
|
const int AMBA_CEL_ID0 = 0xFF0;
|
||||||
|
const int AMBA_CEL_ID1 = 0xFF4;
|
||||||
|
const int AMBA_CEL_ID2 = 0xFF8;
|
||||||
|
const int AMBA_CEL_ID3 = 0xFFC;
|
||||||
|
|
||||||
|
bool readId(PacketPtr pkt, uint64_t amba_id, Addr pio_addr);
|
||||||
|
}
|
||||||
|
|
||||||
class AmbaDevice : public BasicPioDevice
|
class AmbaDevice : public BasicPioDevice
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
static const int AMBA_PER_ID0 = 0xFE0;
|
|
||||||
static const int AMBA_PER_ID1 = 0xFE4;
|
|
||||||
static const int AMBA_PER_ID2 = 0xFE8;
|
|
||||||
static const int AMBA_PER_ID3 = 0xFEC;
|
|
||||||
static const int AMBA_CEL_ID0 = 0xFF0;
|
|
||||||
static const int AMBA_CEL_ID1 = 0xFF4;
|
|
||||||
static const int AMBA_CEL_ID2 = 0xFF8;
|
|
||||||
static const int AMBA_CEL_ID3 = 0xFFC;
|
|
||||||
|
|
||||||
uint64_t ambaId;
|
uint64_t ambaId;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef AmbaDeviceParams Params;
|
typedef AmbaDeviceParams Params;
|
||||||
const Params *
|
|
||||||
params() const
|
|
||||||
{
|
|
||||||
return dynamic_cast<const Params *>(_params);
|
|
||||||
}
|
|
||||||
AmbaDevice(const Params *p);
|
AmbaDevice(const Params *p);
|
||||||
|
|
||||||
bool readId(PacketPtr pkt);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__DEV_ARM_AMBA_FAKE_H__
|
class AmbaDmaDevice : public DmaDevice
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
uint64_t ambaId;
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef AmbaDmaDeviceParams Params;
|
||||||
|
AmbaDmaDevice(const Params *p);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //__DEV_ARM_AMBA_DEVICE_H__
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
#include "mem/packet.hh"
|
#include "mem/packet.hh"
|
||||||
#include "mem/packet_access.hh"
|
#include "mem/packet_access.hh"
|
||||||
|
|
||||||
|
using namespace AmbaDev;
|
||||||
|
|
||||||
AmbaFake::AmbaFake(const Params *p)
|
AmbaFake::AmbaFake(const Params *p)
|
||||||
: AmbaDevice(p)
|
: AmbaDevice(p)
|
||||||
{
|
{
|
||||||
|
@ -62,7 +64,7 @@ AmbaFake::read(PacketPtr pkt)
|
||||||
DPRINTF(AMBA, " read register %#x\n", daddr);
|
DPRINTF(AMBA, " read register %#x\n", daddr);
|
||||||
|
|
||||||
pkt->set<uint32_t>(0);
|
pkt->set<uint32_t>(0);
|
||||||
if (!readId(pkt) && !params()->ignore_access)
|
if (!readId(pkt, ambaId, pioAddr) && !params()->ignore_access)
|
||||||
panic("Tried to read AmbaFake at offset %#x that doesn't exist\n", daddr);
|
panic("Tried to read AmbaFake at offset %#x that doesn't exist\n", daddr);
|
||||||
|
|
||||||
pkt->makeAtomicResponse();
|
pkt->makeAtomicResponse();
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
|
#include "dev/arm/amba_device.hh"
|
||||||
#include "dev/arm/gic.hh"
|
#include "dev/arm/gic.hh"
|
||||||
#include "dev/arm/pl011.hh"
|
#include "dev/arm/pl011.hh"
|
||||||
#include "dev/terminal.hh"
|
#include "dev/terminal.hh"
|
||||||
|
@ -113,15 +114,12 @@ Pl011::read(PacketPtr pkt)
|
||||||
data = maskInt;
|
data = maskInt;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (daddr >= UART_PER_ID0 && daddr <= UART_CEL_ID3) {
|
if (AmbaDev::readId(pkt, AMBA_ID, pioAddr)) {
|
||||||
// AMBA ID information
|
// Hack for variable size accesses
|
||||||
int byte;
|
data = pkt->get<uint32_t>();
|
||||||
byte = (daddr - UART_PER_ID0) << 1;
|
|
||||||
DPRINTF(AMBA, "--daddr=%#x shift=%d val=%#x\n", daddr, byte,
|
|
||||||
(ULL(0xb105f00d00341011) >> byte) & 0xFF);
|
|
||||||
data = (ULL(0xb105f00d00341011) >> byte) & 0xFF;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
panic("Tried to read PL011 at offset %#x that doesn't exist\n", daddr);
|
panic("Tried to read PL011 at offset %#x that doesn't exist\n", daddr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@ class Gic;
|
||||||
class Pl011 : public Uart
|
class Pl011 : public Uart
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
static const uint64_t AMBA_ID = ULL(0xb105f00d00341011);
|
||||||
static const int UART_DR = 0x000;
|
static const int UART_DR = 0x000;
|
||||||
static const int UART_FR = 0x018;
|
static const int UART_FR = 0x018;
|
||||||
static const int UART_FR_CTS = 0x001;
|
static const int UART_FR_CTS = 0x001;
|
||||||
|
@ -72,14 +73,6 @@ class Pl011 : public Uart
|
||||||
static const int UART_RIS = 0x03C;
|
static const int UART_RIS = 0x03C;
|
||||||
static const int UART_MIS = 0x040;
|
static const int UART_MIS = 0x040;
|
||||||
static const int UART_ICR = 0x044;
|
static const int UART_ICR = 0x044;
|
||||||
static const int UART_PER_ID0 = 0xFE0;
|
|
||||||
static const int UART_PER_ID1 = 0xFE4;
|
|
||||||
static const int UART_PER_ID2 = 0xFE8;
|
|
||||||
static const int UART_PER_ID3 = 0xFEC;
|
|
||||||
static const int UART_CEL_ID0 = 0xFF0;
|
|
||||||
static const int UART_CEL_ID1 = 0xFF4;
|
|
||||||
static const int UART_CEL_ID2 = 0xFF8;
|
|
||||||
static const int UART_CEL_ID3 = 0xFFC;
|
|
||||||
|
|
||||||
uint16_t control;
|
uint16_t control;
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
#include "mem/packet.hh"
|
#include "mem/packet.hh"
|
||||||
#include "mem/packet_access.hh"
|
#include "mem/packet_access.hh"
|
||||||
|
|
||||||
|
using namespace AmbaDev;
|
||||||
|
|
||||||
Sp804::Sp804(Params *p)
|
Sp804::Sp804(Params *p)
|
||||||
: AmbaDevice(p), gic(p->gic), timer0(name() + ".timer0", this, p->int_num0, p->clock0),
|
: AmbaDevice(p), gic(p->gic), timer0(name() + ".timer0", this, p->int_num0, p->clock0),
|
||||||
timer1(name() + ".timer1", this, p->int_num1, p->clock1)
|
timer1(name() + ".timer1", this, p->int_num1, p->clock1)
|
||||||
|
@ -71,7 +73,7 @@ Sp804::read(PacketPtr pkt)
|
||||||
timer0.read(pkt, daddr);
|
timer0.read(pkt, daddr);
|
||||||
else if ((daddr - Timer::Size) < Timer::Size)
|
else if ((daddr - Timer::Size) < Timer::Size)
|
||||||
timer1.read(pkt, daddr - Timer::Size);
|
timer1.read(pkt, daddr - Timer::Size);
|
||||||
else if (!readId(pkt))
|
else if (!readId(pkt, ambaId, pioAddr))
|
||||||
panic("Tried to read SP804 at offset %#x that doesn't exist\n", daddr);
|
panic("Tried to read SP804 at offset %#x that doesn't exist\n", daddr);
|
||||||
pkt->makeAtomicResponse();
|
pkt->makeAtomicResponse();
|
||||||
return pioDelay;
|
return pioDelay;
|
||||||
|
@ -127,7 +129,7 @@ Sp804::write(PacketPtr pkt)
|
||||||
timer0.write(pkt, daddr);
|
timer0.write(pkt, daddr);
|
||||||
else if ((daddr - Timer::Size) < Timer::Size)
|
else if ((daddr - Timer::Size) < Timer::Size)
|
||||||
timer1.write(pkt, daddr - Timer::Size);
|
timer1.write(pkt, daddr - Timer::Size);
|
||||||
else if (!readId(pkt))
|
else if (!readId(pkt, ambaId, pioAddr))
|
||||||
panic("Tried to write SP804 at offset %#x that doesn't exist\n", daddr);
|
panic("Tried to write SP804 at offset %#x that doesn't exist\n", daddr);
|
||||||
pkt->makeAtomicResponse();
|
pkt->makeAtomicResponse();
|
||||||
return pioDelay;
|
return pioDelay;
|
||||||
|
|
Loading…
Reference in a new issue