Merge zizzer:/bk/linux
into zower.eecs.umich.edu:/.automount/zizzer/z/alschult/DiskModel/linux --HG-- extra : convert_revision : 879834af81a124b1f1b546f1591713a8c36913e4
This commit is contained in:
commit
cd8db7669a
3 changed files with 94 additions and 4 deletions
|
@ -35,6 +35,7 @@
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "arch/alpha/pmap.h"
|
||||||
#include "base/cprintf.hh" // csprintf
|
#include "base/cprintf.hh" // csprintf
|
||||||
#include "base/trace.hh"
|
#include "base/trace.hh"
|
||||||
#include "dev/disk_image.hh"
|
#include "dev/disk_image.hh"
|
||||||
|
@ -60,7 +61,7 @@ IdeDisk::IdeDisk(const string &name, DiskImage *img, PhysicalMemory *phys,
|
||||||
dmaWriteWaitEvent(this), dmaPrdReadEvent(this),
|
dmaWriteWaitEvent(this), dmaPrdReadEvent(this),
|
||||||
dmaReadEvent(this), dmaWriteEvent(this)
|
dmaReadEvent(this), dmaWriteEvent(this)
|
||||||
{
|
{
|
||||||
diskDelay = (delay * ticksPerSecond / 1000) / image->size();
|
diskDelay = (delay * ticksPerSecond / 100000);
|
||||||
|
|
||||||
// initialize the data buffer and shadow registers
|
// initialize the data buffer and shadow registers
|
||||||
dataBuffer = new uint8_t[MAX_DMA_SIZE];
|
dataBuffer = new uint8_t[MAX_DMA_SIZE];
|
||||||
|
@ -153,6 +154,15 @@ IdeDisk::~IdeDisk()
|
||||||
delete [] dataBuffer;
|
delete [] dataBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Addr
|
||||||
|
IdeDisk::pciToDma(Addr &pciAddr)
|
||||||
|
{
|
||||||
|
if (ctrl)
|
||||||
|
return ctrl->tsunami->pchip->translatePciToDma(pciAddr);
|
||||||
|
else
|
||||||
|
panic("Access to unset controller!\n");
|
||||||
|
}
|
||||||
|
|
||||||
////
|
////
|
||||||
// Device registers read/write
|
// Device registers read/write
|
||||||
////
|
////
|
||||||
|
@ -309,6 +319,51 @@ IdeDisk::doDmaRead()
|
||||||
void
|
void
|
||||||
IdeDisk::dmaReadDone()
|
IdeDisk::dmaReadDone()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Addr curAddr = 0, dmaAddr = 0;
|
||||||
|
uint32_t bytesWritten = 0, bytesInPage = 0, bytesLeft = 0;
|
||||||
|
|
||||||
|
// set initial address
|
||||||
|
curAddr = curPrd.getBaseAddr();
|
||||||
|
|
||||||
|
// clear out the data buffer
|
||||||
|
memset(dataBuffer, 0, MAX_DMA_SIZE);
|
||||||
|
|
||||||
|
// read the data from memory via DMA into a data buffer
|
||||||
|
while (bytesWritten < curPrd.getByteCount()) {
|
||||||
|
if (cmdBytesLeft <= 0)
|
||||||
|
panic("DMA data is larger than # of sectors specified\n");
|
||||||
|
|
||||||
|
dmaAddr = pciToDma(curAddr);
|
||||||
|
|
||||||
|
// calculate how many bytes are in the current page
|
||||||
|
bytesLeft = curPrd.getByteCount() - bytesWritten;
|
||||||
|
bytesInPage = (bytesLeft > ALPHA_PGBYTES) ? ALPHA_PGBYTES : bytesLeft;
|
||||||
|
// check to make sure we don't cross a page boundary
|
||||||
|
if ((curAddr + bytesInPage) >
|
||||||
|
(alpha_trunc_page(curAddr) + ALPHA_PGBYTES))
|
||||||
|
|
||||||
|
bytesInPage = alpha_round_page(curAddr) - curAddr;
|
||||||
|
|
||||||
|
// copy the data from memory into the data buffer
|
||||||
|
/** @todo Use real DMA with interfaces here */
|
||||||
|
memcpy((void *)(dataBuffer + bytesWritten),
|
||||||
|
physmem->dma_addr(dmaAddr, bytesInPage),
|
||||||
|
bytesInPage);
|
||||||
|
|
||||||
|
curAddr += bytesInPage;
|
||||||
|
bytesWritten += bytesInPage;
|
||||||
|
cmdBytesLeft -= bytesInPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the data to the disk image
|
||||||
|
for (bytesWritten = 0;
|
||||||
|
bytesWritten < curPrd.getByteCount();
|
||||||
|
bytesWritten += SectorSize)
|
||||||
|
|
||||||
|
writeDisk(curSector++, (uint8_t *)(dataBuffer + bytesWritten));
|
||||||
|
|
||||||
|
#if 0
|
||||||
// actually copy the data from memory to data buffer
|
// actually copy the data from memory to data buffer
|
||||||
Addr dmaAddr =
|
Addr dmaAddr =
|
||||||
ctrl->tsunami->pchip->translatePciToDma(curPrd.getBaseAddr());
|
ctrl->tsunami->pchip->translatePciToDma(curPrd.getBaseAddr());
|
||||||
|
@ -327,6 +382,7 @@ IdeDisk::dmaReadDone()
|
||||||
bytesWritten += SectorSize;
|
bytesWritten += SectorSize;
|
||||||
cmdBytesLeft -= SectorSize;
|
cmdBytesLeft -= SectorSize;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// check for the EOT
|
// check for the EOT
|
||||||
if (curPrd.getEOT()){
|
if (curPrd.getEOT()){
|
||||||
|
@ -364,27 +420,59 @@ IdeDisk::doDmaWrite()
|
||||||
void
|
void
|
||||||
IdeDisk::dmaWriteDone()
|
IdeDisk::dmaWriteDone()
|
||||||
{
|
{
|
||||||
uint32_t bytesRead = 0;
|
Addr curAddr = 0, pageAddr = 0, dmaAddr = 0;
|
||||||
|
uint32_t bytesRead = 0, bytesInPage = 0;
|
||||||
|
|
||||||
|
// setup the initial page and DMA address
|
||||||
|
curAddr = curPrd.getBaseAddr();
|
||||||
|
pageAddr = alpha_trunc_page(curAddr);
|
||||||
|
dmaAddr = pciToDma(curAddr);
|
||||||
|
|
||||||
// clear out the data buffer
|
// clear out the data buffer
|
||||||
memset(dataBuffer, 0, MAX_DMA_SIZE);
|
memset(dataBuffer, 0, MAX_DMA_SIZE);
|
||||||
|
|
||||||
while (bytesRead < curPrd.getByteCount()) {
|
while (bytesRead < curPrd.getByteCount()) {
|
||||||
|
// see if we have crossed into a new page
|
||||||
|
if (pageAddr != alpha_trunc_page(curAddr)) {
|
||||||
|
// write the data to memory
|
||||||
|
/** @todo Do real DMA using interfaces here */
|
||||||
|
memcpy(physmem->dma_addr(dmaAddr, bytesInPage),
|
||||||
|
(void *)(dataBuffer + (bytesRead - bytesInPage)),
|
||||||
|
bytesInPage);
|
||||||
|
|
||||||
|
// update the DMA address and page address
|
||||||
|
pageAddr = alpha_trunc_page(curAddr);
|
||||||
|
dmaAddr = pciToDma(curAddr);
|
||||||
|
|
||||||
|
bytesInPage = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (cmdBytesLeft <= 0)
|
if (cmdBytesLeft <= 0)
|
||||||
panic("DMA requested data is larger than # sectors specified\n");
|
panic("DMA requested data is larger than # sectors specified\n");
|
||||||
|
|
||||||
readDisk(curSector++, (uint8_t *)(dataBuffer + bytesRead));
|
readDisk(curSector++, (uint8_t *)(dataBuffer + bytesRead));
|
||||||
|
|
||||||
|
curAddr += SectorSize;
|
||||||
bytesRead += SectorSize;
|
bytesRead += SectorSize;
|
||||||
|
bytesInPage += SectorSize;
|
||||||
cmdBytesLeft -= SectorSize;
|
cmdBytesLeft -= SectorSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy the data to memory
|
// write the last page worth read to memory
|
||||||
|
/** @todo Do real DMA using interfaces here */
|
||||||
|
if (bytesInPage != 0) {
|
||||||
|
memcpy(physmem->dma_addr(dmaAddr, bytesInPage),
|
||||||
|
(void *)(dataBuffer + (bytesRead - bytesInPage)),
|
||||||
|
bytesInPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
Addr dmaAddr = ctrl->tsunami->pchip->
|
Addr dmaAddr = ctrl->tsunami->pchip->
|
||||||
translatePciToDma(curPrd.getBaseAddr());
|
translatePciToDma(curPrd.getBaseAddr());
|
||||||
|
|
||||||
memcpy(physmem->dma_addr(dmaAddr, curPrd.getByteCount()),
|
memcpy(physmem->dma_addr(dmaAddr, curPrd.getByteCount()),
|
||||||
(void *)dataBuffer, curPrd.getByteCount());
|
(void *)dataBuffer, curPrd.getByteCount());
|
||||||
|
#endif
|
||||||
|
|
||||||
// check for the EOT
|
// check for the EOT
|
||||||
if (curPrd.getEOT()) {
|
if (curPrd.getEOT()) {
|
||||||
|
|
|
@ -313,6 +313,8 @@ class IdeDisk : public SimObject
|
||||||
(cmdReg.cyl_low << 8) | (cmdReg.sec_num));
|
(cmdReg.cyl_low << 8) | (cmdReg.sec_num));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline Addr pciToDma(Addr &pciAddr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serialize this object to the given output stream.
|
* Serialize this object to the given output stream.
|
||||||
* @param os The stream to serialize to.
|
* @param os The stream to serialize to.
|
||||||
|
|
|
@ -263,7 +263,7 @@ TsunamiPChip::translatePciToDma(Addr busAddr)
|
||||||
physmem->dma_addr(pteAddr, sizeof(uint64_t)),
|
physmem->dma_addr(pteAddr, sizeof(uint64_t)),
|
||||||
sizeof(uint64_t));
|
sizeof(uint64_t));
|
||||||
|
|
||||||
dmaAddr = ((pteEntry & ~0x1) << 12) | (busAddr & 0xfff);
|
dmaAddr = ((pteEntry & ~0x1) << 12) | (busAddr & 0x1fff);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
baMask = (wsm[i] & (0x7ff << 20)) | 0xfffff;
|
baMask = (wsm[i] & (0x7ff << 20)) | 0xfffff;
|
||||||
|
|
Loading…
Reference in a new issue