projects
/
gem5.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix doxgyen comments
[gem5.git]
/
dev
/
ide_disk.hh
diff --git
a/dev/ide_disk.hh
b/dev/ide_disk.hh
index 016f827cc769bbb327d103ca95dce56bd1ecf6eb..f9a413e1ea2a011d925f03df75cfffa793645e11 100644
(file)
--- a/
dev/ide_disk.hh
+++ b/
dev/ide_disk.hh
@@
-1,5
+1,5
@@
/*
/*
- * Copyright (c) 200
3
The Regents of The University of Michigan
+ * Copyright (c) 200
4
The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@
-33,15
+33,16
@@
#ifndef __IDE_DISK_HH__
#define __IDE_DISK_HH__
#ifndef __IDE_DISK_HH__
#define __IDE_DISK_HH__
-#include "dev/ide.hh"
#include "dev/disk_image.hh"
#include "dev/disk_image.hh"
+#include "dev/ide_atareg.h"
+#include "dev/ide_wdcreg.h"
#include "dev/io_device.hh"
#include "sim/eventq.hh"
#define DMA_BACKOFF_PERIOD 200
#include "dev/io_device.hh"
#include "sim/eventq.hh"
#define DMA_BACKOFF_PERIOD 200
-#define MAX_DMA_SIZE
(131072) // 256 * SectorSize (512)
-#define MAX_MULTSECT (128)
+#define MAX_DMA_SIZE
(65536) // 64K
+#define MAX_MULTSECT
(128)
#define PRD_BASE_MASK 0xfffffffe
#define PRD_COUNT_MASK 0xfffe
#define PRD_BASE_MASK 0xfffffffe
#define PRD_COUNT_MASK 0xfffe
@@
-62,7
+63,7
@@
class PrdTableEntry {
return (entry.baseAddr & PRD_BASE_MASK);
}
return (entry.baseAddr & PRD_BASE_MASK);
}
- uint
16
_t getByteCount()
+ uint
32
_t getByteCount()
{
return ((entry.byteCount == 0) ? MAX_DMA_SIZE :
(entry.byteCount & PRD_COUNT_MASK));
{
return ((entry.byteCount == 0) ? MAX_DMA_SIZE :
(entry.byteCount & PRD_COUNT_MASK));
@@
-94,7
+95,9
@@
class PrdTableEntry {
#define STATUS_BSY_BIT 0x80
#define STATUS_DRDY_BIT 0x40
#define STATUS_DRQ_BIT 0x08
#define STATUS_BSY_BIT 0x80
#define STATUS_DRDY_BIT 0x40
#define STATUS_DRQ_BIT 0x08
-#define DRIVE_LBA_BIT 0x40
+#define STATUS_SEEK_BIT 0x10
+#define STATUS_DF_BIT 0x20
+#define DRIVE_LBA_BIT 0x40
#define DEV0 (0)
#define DEV1 (1)
#define DEV0 (0)
#define DEV1 (1)
@@
-114,17
+117,25
@@
typedef struct CommandReg {
uint8_t drive;
uint8_t head;
};
uint8_t drive;
uint8_t head;
};
- union {
- uint8_t status;
- uint8_t command;
- };
+ uint8_t command;
} CommandReg_t;
} CommandReg_t;
+typedef enum Events {
+ None = 0,
+ Transfer,
+ ReadWait,
+ WriteWait,
+ PrdRead,
+ DmaRead,
+ DmaWrite
+} Events_t;
+
typedef enum DevAction {
ACT_NONE = 0,
ACT_CMD_WRITE,
ACT_CMD_COMPLETE,
ACT_CMD_ERROR,
typedef enum DevAction {
ACT_NONE = 0,
ACT_CMD_WRITE,
ACT_CMD_COMPLETE,
ACT_CMD_ERROR,
+ ACT_SELECT_WRITE,
ACT_STAT_READ,
ACT_DATA_READY,
ACT_DATA_READ_BYTE,
ACT_STAT_READ,
ACT_DATA_READY,
ACT_DATA_READ_BYTE,
@@
-132,7
+143,9
@@
typedef enum DevAction {
ACT_DATA_WRITE_BYTE,
ACT_DATA_WRITE_SHORT,
ACT_DMA_READY,
ACT_DATA_WRITE_BYTE,
ACT_DATA_WRITE_SHORT,
ACT_DMA_READY,
- ACT_DMA_DONE
+ ACT_DMA_DONE,
+ ACT_SRST_SET,
+ ACT_SRST_CLEAR
} DevAction_t;
typedef enum DevState {
} DevAction_t;
typedef enum DevState {
@@
-141,6
+154,9
@@
typedef enum DevState {
Device_Idle_SI,
Device_Idle_NS,
Device_Idle_SI,
Device_Idle_NS,
+ // Software reset
+ Device_Srst,
+
// Non-data commands
Command_Execution,
// Non-data commands
Command_Execution,
@@
-184,14
+200,16
@@
class IdeDisk : public SimObject
PhysicalMemory *physmem;
protected:
PhysicalMemory *physmem;
protected:
- /** The disk delay in mi
lli
seconds. */
+ /** The disk delay in mi
cro
seconds. */
int diskDelay;
private:
/** Drive identification structure for this disk */
int diskDelay;
private:
/** Drive identification structure for this disk */
- struct
hd_driveid
driveID;
+ struct
ataparams
driveID;
/** Data buffer for transfers */
uint8_t *dataBuffer;
/** Data buffer for transfers */
uint8_t *dataBuffer;
+ /** Number of bytes in command data transfer */
+ uint32_t cmdBytes;
/** Number of bytes left in command data transfer */
uint32_t cmdBytesLeft;
/** Number of bytes left in DRQ block */
/** Number of bytes left in command data transfer */
uint32_t cmdBytesLeft;
/** Number of bytes left in DRQ block */
@@
-200,8
+218,8
@@
class IdeDisk : public SimObject
uint32_t curSector;
/** Command block registers */
CommandReg_t cmdReg;
uint32_t curSector;
/** Command block registers */
CommandReg_t cmdReg;
- /** S
hadow of the current command code
*/
- uint8_t
curCommand
;
+ /** S
tatus register
*/
+ uint8_t
status
;
/** Interrupt enable bit */
bool nIENBit;
/** Device state */
/** Interrupt enable bit */
bool nIENBit;
/** Device state */
@@
-214,6
+232,8
@@
class IdeDisk : public SimObject
uint32_t curPrdAddr;
/** PRD entry */
PrdTableEntry curPrd;
uint32_t curPrdAddr;
/** PRD entry */
PrdTableEntry curPrd;
+ /** Number of bytes transfered by DMA interface for current transfer */
+ uint32_t dmaInterfaceBytes;
/** Device ID (master=0/slave=1) */
int devID;
/** Interrupt pending */
/** Device ID (master=0/slave=1) */
int devID;
/** Interrupt pending */
@@
-229,13
+249,18
@@
class IdeDisk : public SimObject
* @param disk_delay The disk delay in milliseconds
*/
IdeDisk(const std::string &name, DiskImage *img, PhysicalMemory *phys,
* @param disk_delay The disk delay in milliseconds
*/
IdeDisk(const std::string &name, DiskImage *img, PhysicalMemory *phys,
- int id,
int
disk_delay);
+ int id,
Tick
disk_delay);
/**
* Delete the data buffer.
*/
~IdeDisk();
/**
* Delete the data buffer.
*/
~IdeDisk();
+ /**
+ * Reset the device state
+ */
+ void reset(int id);
+
/**
* Set the controller for this device
* @param c The IDE controller
/**
* Set the controller for this device
* @param c The IDE controller
@@
-294,17
+319,18
@@
class IdeDisk : public SimObject
void updateState(DevAction_t action);
// Utility functions
void updateState(DevAction_t action);
// Utility functions
- bool isBSYSet() { return (
cmdReg.
status & STATUS_BSY_BIT); }
+ bool isBSYSet() { return (status & STATUS_BSY_BIT); }
bool isIENSet() { return nIENBit; }
bool isIENSet() { return nIENBit; }
- bool isDEVSelect()
{ return ((cmdReg.drive & SELECT_DEV_BIT) == devID); }
+ bool isDEVSelect()
;
void setComplete()
{
// clear out the status byte
void setComplete()
{
// clear out the status byte
- cmdReg.status = 0;
-
+ status = 0;
// set the DRDY bit
// set the DRDY bit
- cmdReg.status |= STATUS_DRDY_BIT;
+ status |= STATUS_DRDY_BIT;
+ // set the SEEK bit
+ status |= STATUS_SEEK_BIT;
}
uint32_t getLBABase()
}
uint32_t getLBABase()
@@
-313,6
+339,10
@@
class IdeDisk : public SimObject
(cmdReg.cyl_low << 8) | (cmdReg.sec_num));
}
(cmdReg.cyl_low << 8) | (cmdReg.sec_num));
}
+ inline Addr pciToDma(Addr pciAddr);
+
+ uint32_t bytesInDmaPage(Addr curAddr, uint32_t bytesLeft);
+
/**
* Serialize this object to the given output stream.
* @param os The stream to serialize to.
/**
* Serialize this object to the given output stream.
* @param os The stream to serialize to.