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 §ion); 1925642Sgblack@eecs.umich.edu}; 1935642Sgblack@eecs.umich.edu 1945642Sgblack@eecs.umich.edu#endif // __DEV_PCIDEV_HH__ 1955642Sgblack@eecs.umich.edu