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 35e7404d578e38223f4f3ea411de21fd295aa17d..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,6
+95,8
@@
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 STATUS_SEEK_BIT 0x10
+#define STATUS_DF_BIT 0x20
#define DRIVE_LBA_BIT 0x40
#define DEV0 (0)
#define DRIVE_LBA_BIT 0x40
#define DEV0 (0)
@@
-114,10
+117,7
@@
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;
typedef enum Events {
} CommandReg_t;
typedef enum Events {
@@
-135,6
+135,7
@@
typedef enum DevAction {
ACT_CMD_WRITE,
ACT_CMD_COMPLETE,
ACT_CMD_ERROR,
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,
@@
-142,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 {
@@
-151,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,
@@
-199,9
+205,11
@@
class IdeDisk : public SimObject
private:
/** Drive identification structure for this disk */
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 */
@@
-210,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 */
@@
-241,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
@@
-306,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()