- /** Get offset into register file from access address */
- Addr getOffset(const Addr &addr) {
- Addr offset = addr;
-
- if (addr >= pri_cmd_addr && addr < (pri_cmd_addr + pri_cmd_size)) {
- offset -= pri_cmd_addr;
- offset += CMD0;
- } else if (addr >= pri_ctrl_addr &&
- addr < (pri_ctrl_addr + pri_ctrl_size)) {
- offset -= pri_ctrl_addr;
- offset += CTRL0;
- } else if (addr >= sec_cmd_addr &&
- addr < (sec_cmd_addr + sec_cmd_size)) {
- offset -= sec_cmd_addr;
- offset += CMD1;
- } else if (addr >= sec_ctrl_addr &&
- addr < (sec_ctrl_addr + sec_ctrl_size)) {
- offset -= sec_ctrl_addr;
- offset += CTRL1;
- } else if (addr >= bmi_addr && addr < (bmi_addr + bmi_size)) {
- offset -= bmi_addr;
- offset += BMI;
- } else {
- panic("IDE controller access to invalid address: %#x\n", addr);
- }
-
- return offset;
- };
- /** Select the disk based on the register offset */
- int getDisk(const Addr &offset) {
- int disk = 0;
-
- // If the offset is in the channel 1 range, disks are 2 or 3
- if (offset >= CMD1 && offset < BMI && offset >= (BMI + BMIC1))
- disk += 2;
-
- if (disk < 2) {
- if (regs[CMD0 + IDE_STATUS_OFFSET] & 0x10)
- disk += 1;
- } else {
- if (regs[CMD1 + IDE_STATUS_OFFSET] & 0x10)
- disk += 1;
- }
-
- return disk;
- };
+ /** Parse the access address to pass on to device */
+ void parseAddr(const Addr &addr, Addr &offset, bool &primary,
+ RegType_t &type);
+
+ /** Select the disk based on the channel and device bit */
+ int getDisk(bool primary);
+
+ /** Select the disk based on a pointer */
+ int getDisk(IdeDisk *diskPtr);
+
+ public:
+ /** See if a disk is selected based on its pointer */
+ bool isDiskSelected(IdeDisk *diskPtr);