device.hh revision 1149
15443Sgblack@eecs.umich.edu/*
25443Sgblack@eecs.umich.edu * Copyright (c) 2004 The Regents of The University of Michigan
35443Sgblack@eecs.umich.edu * All rights reserved.
45443Sgblack@eecs.umich.edu *
55443Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65443Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75443Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85443Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95443Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105443Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115443Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125443Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135443Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145443Sgblack@eecs.umich.edu * this software without specific prior written permission.
155443Sgblack@eecs.umich.edu *
165443Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175443Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185443Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195443Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205443Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215443Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225443Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235443Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245443Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255443Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265443Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275443Sgblack@eecs.umich.edu */
285443Sgblack@eecs.umich.edu
295443Sgblack@eecs.umich.edu/* @file
305443Sgblack@eecs.umich.edu * Interface for devices using PCI configuration
315443Sgblack@eecs.umich.edu */
325443Sgblack@eecs.umich.edu
335443Sgblack@eecs.umich.edu#ifndef __DEV_PCIDEV_HH__
345443Sgblack@eecs.umich.edu#define __DEV_PCIDEV_HH__
355443Sgblack@eecs.umich.edu
365606Snate@binkert.org#include "dev/io_device.hh"
375606Snate@binkert.org#include "dev/pcireg.h"
385606Snate@binkert.org#include "dev/platform.hh"
395443Sgblack@eecs.umich.edu
405443Sgblack@eecs.umich.educlass PciConfigAll;
415443Sgblack@eecs.umich.educlass MemoryController;
425443Sgblack@eecs.umich.edu
435443Sgblack@eecs.umich.edu
445443Sgblack@eecs.umich.edu/**
455606Snate@binkert.org * This class encapulates the first 64 bytes of a singles PCI
465443Sgblack@eecs.umich.edu * devices config space that in configured by the configuration file.
475635Sgblack@eecs.umich.edu */
485443Sgblack@eecs.umich.educlass PciConfigData : public SimObject
495443Sgblack@eecs.umich.edu{
505443Sgblack@eecs.umich.edu  public:
515443Sgblack@eecs.umich.edu    /**
525443Sgblack@eecs.umich.edu     * Constructor to initialize the devices config space to 0.
535443Sgblack@eecs.umich.edu     */
545443Sgblack@eecs.umich.edu    PciConfigData(const std::string &name)
555443Sgblack@eecs.umich.edu        : SimObject(name)
565443Sgblack@eecs.umich.edu    {
575443Sgblack@eecs.umich.edu        memset(config.data, 0, sizeof(config.data));
585443Sgblack@eecs.umich.edu        memset(BARAddrs, 0, sizeof(BARAddrs));
595443Sgblack@eecs.umich.edu        memset(BARSize, 0, sizeof(BARSize));
605443Sgblack@eecs.umich.edu    }
615443Sgblack@eecs.umich.edu
625443Sgblack@eecs.umich.edu    /** The first 64 bytes */
635443Sgblack@eecs.umich.edu    PCIConfig config;
645443Sgblack@eecs.umich.edu
655443Sgblack@eecs.umich.edu    /** The size of the BARs */
665443Sgblack@eecs.umich.edu    uint32_t BARSize[6];
675443Sgblack@eecs.umich.edu
685443Sgblack@eecs.umich.edu    /** The addresses of the BARs */
695443Sgblack@eecs.umich.edu    Addr BARAddrs[6];
705443Sgblack@eecs.umich.edu};
715443Sgblack@eecs.umich.edu
725443Sgblack@eecs.umich.edu/**
735443Sgblack@eecs.umich.edu * PCI device, base implemnation is only config space.
745443Sgblack@eecs.umich.edu * Each device is connected to a PCIConfigSpace device
755443Sgblack@eecs.umich.edu * which returns -1 for everything but the pcidevs that
765443Sgblack@eecs.umich.edu * register with it. This object registers with the PCIConfig space
775443Sgblack@eecs.umich.edu * object.
785443Sgblack@eecs.umich.edu */
795443Sgblack@eecs.umich.educlass PciDev : public DmaDevice
805443Sgblack@eecs.umich.edu{
815443Sgblack@eecs.umich.edu  protected:
825443Sgblack@eecs.umich.edu    struct Params;
835443Sgblack@eecs.umich.edu    Params *_params;
845443Sgblack@eecs.umich.edu
855443Sgblack@eecs.umich.edu  public:
865443Sgblack@eecs.umich.edu    struct Params
875443Sgblack@eecs.umich.edu    {
885443Sgblack@eecs.umich.edu        std::string name;
895443Sgblack@eecs.umich.edu        Platform *plat;
905443Sgblack@eecs.umich.edu        MemoryController *mmu;
915443Sgblack@eecs.umich.edu
925443Sgblack@eecs.umich.edu        /**
935642Sgblack@eecs.umich.edu         * A pointer to the configspace all object that calls us when
945443Sgblack@eecs.umich.edu         * a read comes to this particular device/function.
955443Sgblack@eecs.umich.edu         */
965443Sgblack@eecs.umich.edu        PciConfigAll *configSpace;
975443Sgblack@eecs.umich.edu
985443Sgblack@eecs.umich.edu        /**
995444Sgblack@eecs.umich.edu         * A pointer to the object that contains the first 64 bytes of
1005444Sgblack@eecs.umich.edu         * config space
1016067Sgblack@eecs.umich.edu         */
1026067Sgblack@eecs.umich.edu        PciConfigData *configData;
1035443Sgblack@eecs.umich.edu
1045443Sgblack@eecs.umich.edu        /** The bus number we are on */
1055443Sgblack@eecs.umich.edu        uint32_t busNum;
1065443Sgblack@eecs.umich.edu
1075443Sgblack@eecs.umich.edu        /** The device number we have */
1085443Sgblack@eecs.umich.edu        uint32_t deviceNum;
1095642Sgblack@eecs.umich.edu
1105642Sgblack@eecs.umich.edu        /** The function number */
1115443Sgblack@eecs.umich.edu        uint32_t functionNum;
1125443Sgblack@eecs.umich.edu    };
1136067Sgblack@eecs.umich.edu    const Params *params() const { return _params; }
1146067Sgblack@eecs.umich.edu
1155443Sgblack@eecs.umich.edu  protected:
1165443Sgblack@eecs.umich.edu    /** The current config space. Unlike the PciConfigData this is
1175443Sgblack@eecs.umich.edu     * updated during simulation while continues to refelect what was
1185443Sgblack@eecs.umich.edu     * in the config file.
1195443Sgblack@eecs.umich.edu     */
1205443Sgblack@eecs.umich.edu    PCIConfig config;
1215443Sgblack@eecs.umich.edu
1225443Sgblack@eecs.umich.edu    /** The size of the BARs */
1235443Sgblack@eecs.umich.edu    uint32_t BARSize[6];
1245443Sgblack@eecs.umich.edu
1255443Sgblack@eecs.umich.edu    /** The current address mapping of the BARs */
1265443Sgblack@eecs.umich.edu    Addr BARAddrs[6];
1275443Sgblack@eecs.umich.edu
1285443Sgblack@eecs.umich.edu  protected:
1295443Sgblack@eecs.umich.edu    Platform *plat;
1305443Sgblack@eecs.umich.edu    PciConfigData *configData;
1315443Sgblack@eecs.umich.edu
1325443Sgblack@eecs.umich.edu  public:
1335443Sgblack@eecs.umich.edu    Addr pciToDma(Addr pciAddr) const
1345443Sgblack@eecs.umich.edu    { return plat->pciToDma(pciAddr); }
1355443Sgblack@eecs.umich.edu
1365443Sgblack@eecs.umich.edu    void
1375606Snate@binkert.org    intrPost()
1385606Snate@binkert.org    { plat->postPciInt(configData->config.hdr.pci0.interruptLine); }
1395606Snate@binkert.org
1405443Sgblack@eecs.umich.edu    void
1415642Sgblack@eecs.umich.edu    intrClear()
1425443Sgblack@eecs.umich.edu    { plat->clearPciInt(configData->config.hdr.pci0.interruptLine); }
1435443Sgblack@eecs.umich.edu
1445443Sgblack@eecs.umich.edu  public:
1455443Sgblack@eecs.umich.edu    /**
1466067Sgblack@eecs.umich.edu     * Constructor for PCI Dev. This function copies data from the
1476067Sgblack@eecs.umich.edu     * config file object PCIConfigData and registers the device with
1486067Sgblack@eecs.umich.edu     * a PciConfigAll object.
1495443Sgblack@eecs.umich.edu     */
1505443Sgblack@eecs.umich.edu    PciDev(Params *params);
1515443Sgblack@eecs.umich.edu
1525443Sgblack@eecs.umich.edu    virtual Fault read(MemReqPtr &req, uint8_t *data) {
1535443Sgblack@eecs.umich.edu        return No_Fault;
1545443Sgblack@eecs.umich.edu    }
1555443Sgblack@eecs.umich.edu    virtual Fault write(MemReqPtr &req, const uint8_t *data) {
1565443Sgblack@eecs.umich.edu        return No_Fault;
1575443Sgblack@eecs.umich.edu    }
1585443Sgblack@eecs.umich.edu
1595443Sgblack@eecs.umich.edu    /**
1605443Sgblack@eecs.umich.edu     * Write to the PCI config space data that is stored locally. This may be
1615443Sgblack@eecs.umich.edu     * overridden by the device but at some point it will eventually call this
1625443Sgblack@eecs.umich.edu     * for normal operations that it does not need to override.
1635443Sgblack@eecs.umich.edu     * @param offset the offset into config space
1645443Sgblack@eecs.umich.edu     * @param size the size of the write
1655443Sgblack@eecs.umich.edu     * @param data the data to write
1665443Sgblack@eecs.umich.edu     */
1675443Sgblack@eecs.umich.edu    virtual void WriteConfig(int offset, int size, uint32_t data);
1685443Sgblack@eecs.umich.edu
1695443Sgblack@eecs.umich.edu
1705443Sgblack@eecs.umich.edu    /**
1715443Sgblack@eecs.umich.edu     * Read from the PCI config space data that is stored locally. This may be
1725443Sgblack@eecs.umich.edu     * overridden by the device but at some point it will eventually call this
1735443Sgblack@eecs.umich.edu     * for normal operations that it does not need to override.
1745443Sgblack@eecs.umich.edu     * @param offset the offset into config space
1755443Sgblack@eecs.umich.edu     * @param size the size of the read
1765443Sgblack@eecs.umich.edu     * @param data pointer to the location where the read value should be stored
1775443Sgblack@eecs.umich.edu     */
1785443Sgblack@eecs.umich.edu    virtual void ReadConfig(int offset, int size, uint8_t *data);
1795443Sgblack@eecs.umich.edu
1805443Sgblack@eecs.umich.edu    /**
1815443Sgblack@eecs.umich.edu     * Serialize this object to the given output stream.
1825443Sgblack@eecs.umich.edu     * @param os The stream to serialize to.
1835443Sgblack@eecs.umich.edu     */
1845635Sgblack@eecs.umich.edu    virtual void serialize(std::ostream &os);
1855443Sgblack@eecs.umich.edu
1865443Sgblack@eecs.umich.edu    /**
1875443Sgblack@eecs.umich.edu     * Reconstruct the state of this object from a checkpoint.
1885443Sgblack@eecs.umich.edu     * @param cp The checkpoint use.
1895443Sgblack@eecs.umich.edu     * @param section The section name of this object
1905443Sgblack@eecs.umich.edu     */
1915642Sgblack@eecs.umich.edu    virtual void unserialize(Checkpoint *cp, const std::string &section);
1925642Sgblack@eecs.umich.edu};
1935642Sgblack@eecs.umich.edu
1945642Sgblack@eecs.umich.edu#endif // __DEV_PCIDEV_HH__
1955642Sgblack@eecs.umich.edu