ide_ctrl.hh revision 11169
12131SN/A/* 22131SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan 32131SN/A * All rights reserved. 42131SN/A * 52131SN/A * Redistribution and use in source and binary forms, with or without 62131SN/A * modification, are permitted provided that the following conditions are 72131SN/A * met: redistributions of source code must retain the above copyright 82131SN/A * notice, this list of conditions and the following disclaimer; 92131SN/A * redistributions in binary form must reproduce the above copyright 102131SN/A * notice, this list of conditions and the following disclaimer in the 112131SN/A * documentation and/or other materials provided with the distribution; 122131SN/A * neither the name of the copyright holders nor the names of its 132131SN/A * contributors may be used to endorse or promote products derived from 142131SN/A * this software without specific prior written permission. 152131SN/A * 162131SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172131SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182131SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192131SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202131SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212131SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222131SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232131SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242131SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252131SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262131SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282935Sksewell@umich.edu * Authors: Andrew Schultz 292935Sksewell@umich.edu * Miguel Serrano 302131SN/A */ 312131SN/A 322239SN/A/** @file 332680Sktlim@umich.edu * Simple PCI IDE controller with bus mastering capability and UDMA 342447SN/A * modeled after controller in the Intel PIIX4 chip 352447SN/A */ 362935Sksewell@umich.edu 372800Ssaidi@eecs.umich.edu#ifndef __IDE_CTRL_HH__ 382800Ssaidi@eecs.umich.edu#define __IDE_CTRL_HH__ 392800Ssaidi@eecs.umich.edu 402800Ssaidi@eecs.umich.edu#include "base/bitunion.hh" 412131SN/A#include "dev/io_device.hh" 422447SN/A#include "dev/pcidev.hh" 432447SN/A#include "dev/pcireg.h" 442131SN/A#include "params/IdeController.hh" 452479SN/A 462447SN/Aclass IdeDisk; 472447SN/A 482131SN/A/** 492479SN/A * Device model for an Intel PIIX4 IDE controller 502447SN/A */ 512447SN/A 522447SN/Aclass IdeController : public PciDevice 532447SN/A{ 542447SN/A private: 552447SN/A // Bus master IDE status register bit fields 562447SN/A BitUnion8(BMIStatusReg) 572447SN/A Bitfield<6> dmaCap0; 582447SN/A Bitfield<5> dmaCap1; 592447SN/A Bitfield<2> intStatus; 602447SN/A Bitfield<1> dmaError; 612800Ssaidi@eecs.umich.edu Bitfield<0> active; 622800Ssaidi@eecs.umich.edu EndBitUnion(BMIStatusReg) 632800Ssaidi@eecs.umich.edu 642800Ssaidi@eecs.umich.edu BitUnion8(BMICommandReg) 652800Ssaidi@eecs.umich.edu Bitfield<3> rw; 662800Ssaidi@eecs.umich.edu Bitfield<0> startStop; 672447SN/A EndBitUnion(BMICommandReg) 682447SN/A 692447SN/A struct Channel 702447SN/A { 712447SN/A std::string _name; 722447SN/A 732447SN/A const std::string 742447SN/A name() 752447SN/A { 762447SN/A return _name; 772447SN/A } 782447SN/A 792447SN/A /** Command and control block registers */ 802447SN/A Addr cmdAddr, cmdSize, ctrlAddr, ctrlSize; 812447SN/A 822447SN/A /** Registers used for bus master interface */ 832447SN/A struct BMIRegs 842447SN/A { 852447SN/A BMICommandReg command; 862447SN/A uint8_t reserved0; 872447SN/A BMIStatusReg status; 882447SN/A uint8_t reserved1; 892447SN/A uint32_t bmidtp; 902447SN/A } bmiRegs; 912447SN/A 922447SN/A /** IDE disks connected to this controller */ 932447SN/A IdeDisk *master, *slave; 942447SN/A 952447SN/A /** Currently selected disk */ 962447SN/A IdeDisk *selected; 972447SN/A 982447SN/A bool selectBit; 992447SN/A 1002447SN/A void 1012447SN/A select(bool selSlave) 1022447SN/A { 1032447SN/A selectBit = selSlave; 1042447SN/A selected = selectBit ? slave : master; 1052447SN/A } 1062447SN/A 1072447SN/A void accessCommand(Addr offset, int size, uint8_t *data, bool read); 1082447SN/A void accessControl(Addr offset, int size, uint8_t *data, bool read); 1092447SN/A void accessBMI(Addr offset, int size, uint8_t *data, bool read); 1102447SN/A 1112447SN/A Channel(std::string newName, Addr _cmdSize, Addr _ctrlSize); 1122447SN/A ~Channel(); 1132447SN/A 1142447SN/A void serialize(const std::string &base, std::ostream &os) const; 1152800Ssaidi@eecs.umich.edu void unserialize(const std::string &base, CheckpointIn &cp); 1162800Ssaidi@eecs.umich.edu }; 1172800Ssaidi@eecs.umich.edu 1182800Ssaidi@eecs.umich.edu Channel primary; 1192800Ssaidi@eecs.umich.edu Channel secondary; 1202800Ssaidi@eecs.umich.edu 1212800Ssaidi@eecs.umich.edu /** Bus master interface (BMI) registers */ 1222800Ssaidi@eecs.umich.edu Addr bmiAddr, bmiSize; 1232800Ssaidi@eecs.umich.edu 1242800Ssaidi@eecs.umich.edu /** Registers used in device specific PCI configuration */ 1252800Ssaidi@eecs.umich.edu uint16_t primaryTiming, secondaryTiming; 1262800Ssaidi@eecs.umich.edu uint8_t deviceTiming; 1272800Ssaidi@eecs.umich.edu uint8_t udmaControl; 1282800Ssaidi@eecs.umich.edu uint16_t udmaTiming; 1292800Ssaidi@eecs.umich.edu uint16_t ideConfig; 1302800Ssaidi@eecs.umich.edu 1312800Ssaidi@eecs.umich.edu // Internal management variables 1322800Ssaidi@eecs.umich.edu bool ioEnabled; 1332800Ssaidi@eecs.umich.edu bool bmEnabled; 1342800Ssaidi@eecs.umich.edu 1352447SN/A uint32_t ioShift, ctrlOffset; 1362447SN/A 137 void dispatchAccess(PacketPtr pkt, bool read); 138 139 public: 140 typedef IdeControllerParams Params; 141 const Params *params() const { return (const Params *)_params; } 142 IdeController(Params *p); 143 144 /** See if a disk is selected based on its pointer */ 145 bool isDiskSelected(IdeDisk *diskPtr); 146 147 void intrPost(); 148 149 Tick writeConfig(PacketPtr pkt) override; 150 Tick readConfig(PacketPtr pkt) override; 151 152 void setDmaComplete(IdeDisk *disk); 153 154 Tick read(PacketPtr pkt) override; 155 Tick write(PacketPtr pkt) override; 156 157 void serialize(CheckpointOut &cp) const override; 158 void unserialize(CheckpointIn &cp) override; 159}; 160#endif // __IDE_CTRL_HH_ 161