i8259.hh revision 9807:63d7362bbdf2
14120Sgblack@eecs.umich.edu/*
24120Sgblack@eecs.umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan
34120Sgblack@eecs.umich.edu * All rights reserved.
44120Sgblack@eecs.umich.edu *
54120Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
64120Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
74120Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
84120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
94120Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
104120Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
114120Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
124120Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
134120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
144120Sgblack@eecs.umich.edu * this software without specific prior written permission.
154120Sgblack@eecs.umich.edu *
164120Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174120Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184120Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194120Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204120Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214120Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234120Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274120Sgblack@eecs.umich.edu *
284120Sgblack@eecs.umich.edu * Authors: Gabe Black
294120Sgblack@eecs.umich.edu */
304120Sgblack@eecs.umich.edu
314120Sgblack@eecs.umich.edu#ifndef __DEV_X86_I8259_HH__
324120Sgblack@eecs.umich.edu#define __DEV_X86_I8259_HH__
334120Sgblack@eecs.umich.edu
344120Sgblack@eecs.umich.edu#include "dev/x86/intdev.hh"
354120Sgblack@eecs.umich.edu#include "dev/io_device.hh"
364120Sgblack@eecs.umich.edu#include "enums/X86I8259CascadeMode.hh"
374120Sgblack@eecs.umich.edu#include "params/I8259.hh"
384120Sgblack@eecs.umich.edu
394120Sgblack@eecs.umich.edunamespace X86ISA
404120Sgblack@eecs.umich.edu{
414120Sgblack@eecs.umich.edu
424120Sgblack@eecs.umich.educlass I8259 : public BasicPioDevice, public IntDevice
434120Sgblack@eecs.umich.edu{
444120Sgblack@eecs.umich.edu  protected:
454120Sgblack@eecs.umich.edu    static const int NumLines = 8;
464120Sgblack@eecs.umich.edu    bool pinStates[NumLines];
474120Sgblack@eecs.umich.edu
484120Sgblack@eecs.umich.edu    Tick latency;
494120Sgblack@eecs.umich.edu    IntSourcePin *output;
504120Sgblack@eecs.umich.edu    Enums::X86I8259CascadeMode mode;
514120Sgblack@eecs.umich.edu    I8259 * slave;
524120Sgblack@eecs.umich.edu
534120Sgblack@eecs.umich.edu    // Interrupt Request Register
544120Sgblack@eecs.umich.edu    uint8_t IRR;
554120Sgblack@eecs.umich.edu    // In Service Register
564120Sgblack@eecs.umich.edu    uint8_t ISR;
574120Sgblack@eecs.umich.edu    // Interrupt Mask Register
584120Sgblack@eecs.umich.edu    uint8_t IMR;
594120Sgblack@eecs.umich.edu
604120Sgblack@eecs.umich.edu    // The higher order bits of the vector to return
615124Sgblack@eecs.umich.edu    uint8_t vectorOffset;
625237Sgblack@eecs.umich.edu
635236Sgblack@eecs.umich.edu    bool cascadeMode;
645124Sgblack@eecs.umich.edu    // A bit vector of lines with slaves attached, or the slave id, depending
655124Sgblack@eecs.umich.edu    // on if this is a master or slave PIC.
665124Sgblack@eecs.umich.edu    uint8_t cascadeBits;
675086Sgblack@eecs.umich.edu
685236Sgblack@eecs.umich.edu    bool edgeTriggered;
695086Sgblack@eecs.umich.edu    bool readIRR;
705086Sgblack@eecs.umich.edu
715086Sgblack@eecs.umich.edu    // State machine information for reading in initialization control words.
725086Sgblack@eecs.umich.edu    bool expectICW4;
735086Sgblack@eecs.umich.edu    int initControlWord;
745086Sgblack@eecs.umich.edu
755086Sgblack@eecs.umich.edu    // Whether or not the PIC is in auto EOI mode.
765086Sgblack@eecs.umich.edu    bool autoEOI;
775086Sgblack@eecs.umich.edu
785086Sgblack@eecs.umich.edu    void requestInterrupt(int line);
795086Sgblack@eecs.umich.edu    void handleEOI(int line);
805245Sgblack@eecs.umich.edu
815245Sgblack@eecs.umich.edu  public:
825118Sgblack@eecs.umich.edu    typedef I8259Params Params;
835118Sgblack@eecs.umich.edu
845236Sgblack@eecs.umich.edu    const Params *
855236Sgblack@eecs.umich.edu    params() const
865245Sgblack@eecs.umich.edu    {
875086Sgblack@eecs.umich.edu        return dynamic_cast<const Params *>(_params);
885124Sgblack@eecs.umich.edu    }
895124Sgblack@eecs.umich.edu
905124Sgblack@eecs.umich.edu    I8259(Params * p);
915236Sgblack@eecs.umich.edu
925245Sgblack@eecs.umich.edu    Tick read(PacketPtr pkt);
935357Sgblack@eecs.umich.edu    Tick write(PacketPtr pkt);
945237Sgblack@eecs.umich.edu
955124Sgblack@eecs.umich.edu    void
965245Sgblack@eecs.umich.edu    maskAll()
975245Sgblack@eecs.umich.edu    {
985245Sgblack@eecs.umich.edu        IMR = 0xFF;
995245Sgblack@eecs.umich.edu    }
1005245Sgblack@eecs.umich.edu
1015124Sgblack@eecs.umich.edu    void
1025124Sgblack@eecs.umich.edu    unmaskAll()
1035086Sgblack@eecs.umich.edu    {
1045124Sgblack@eecs.umich.edu        IMR = 0x00;
1055124Sgblack@eecs.umich.edu    }
1065124Sgblack@eecs.umich.edu
1075124Sgblack@eecs.umich.edu    void signalInterrupt(int line);
1085357Sgblack@eecs.umich.edu    void raiseInterruptPin(int number);
1095357Sgblack@eecs.umich.edu    void lowerInterruptPin(int number);
1105236Sgblack@eecs.umich.edu    int getVector();
1115236Sgblack@eecs.umich.edu
1125236Sgblack@eecs.umich.edu    virtual void serialize(std::ostream &os);
1135245Sgblack@eecs.umich.edu    virtual void unserialize(Checkpoint *cp, const std::string &section);
1145236Sgblack@eecs.umich.edu};
1155245Sgblack@eecs.umich.edu
1165236Sgblack@eecs.umich.edu} // namespace X86ISA
1175236Sgblack@eecs.umich.edu
1185242Sgblack@eecs.umich.edu#endif //__DEV_X86_I8259_HH__
1195242Sgblack@eecs.umich.edu