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