device.hh revision 1278
1/* 2 * Copyright (c) 2004 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29/* @file 30 * Interface for devices using PCI configuration 31 */ 32 33#ifndef __DEV_PCIDEV_HH__ 34#define __DEV_PCIDEV_HH__ 35 36#include "dev/io_device.hh" 37#include "dev/pcireg.h" 38#include "dev/platform.hh" 39 40class PciConfigAll; 41class MemoryController; 42 43 44/** 45 * This class encapulates the first 64 bytes of a singles PCI 46 * devices config space that in configured by the configuration file. 47 */ 48class PciConfigData : public SimObject 49{ 50 public: 51 /** 52 * Constructor to initialize the devices config space to 0. 53 */ 54 PciConfigData(const std::string &name) 55 : SimObject(name) 56 { 57 memset(config.data, 0, sizeof(config.data)); 58 memset(BARAddrs, 0, sizeof(BARAddrs)); 59 memset(BARSize, 0, sizeof(BARSize)); 60 } 61 62 /** The first 64 bytes */ 63 PCIConfig config; 64 65 /** The size of the BARs */ 66 uint32_t BARSize[6]; 67 68 /** The addresses of the BARs */ 69 Addr BARAddrs[6]; 70}; 71 72/** 73 * PCI device, base implemnation is only config space. 74 * Each device is connected to a PCIConfigSpace device 75 * which returns -1 for everything but the pcidevs that 76 * register with it. This object registers with the PCIConfig space 77 * object. 78 */ 79class PciDev : public DmaDevice 80{ 81 protected: 82 struct Params; 83 Params *_params; 84 85 public: 86 struct Params 87 { 88 std::string name; 89 Platform *plat; 90 MemoryController *mmu; 91 92 /** 93 * A pointer to the configspace all object that calls us when 94 * a read comes to this particular device/function. 95 */ 96 PciConfigAll *configSpace; 97 98 /** 99 * A pointer to the object that contains the first 64 bytes of 100 * config space 101 */ 102 PciConfigData *configData; 103 104 /** The bus number we are on */ 105 uint32_t busNum; 106 107 /** The device number we have */ 108 uint32_t deviceNum; 109 110 /** The function number */ 111 uint32_t functionNum; 112 }; 113 const Params *params() const { return _params; } 114 115 protected: 116 /** The current config space. Unlike the PciConfigData this is 117 * updated during simulation while continues to refelect what was 118 * in the config file. 119 */ 120 PCIConfig config; 121 122 /** The size of the BARs */ 123 uint32_t BARSize[6]; 124 125 /** The current address mapping of the BARs */ 126 Addr BARAddrs[6]; 127 128 protected: 129 Platform *plat; 130 PciConfigData *configData; 131 132 public: 133 Addr pciToDma(Addr pciAddr) const 134 { return plat->pciToDma(pciAddr); } 135 136 void 137 intrPost() 138 { plat->postPciInt(configData->config.hdr.pci0.interruptLine); } 139 140 void 141 intrClear() 142 { plat->clearPciInt(configData->config.hdr.pci0.interruptLine); } 143 144 uint8_t 145 interruptLine() 146 { return configData->config.hdr.pci0.interruptLine; } 147 148 public: 149 /** 150 * Constructor for PCI Dev. This function copies data from the 151 * config file object PCIConfigData and registers the device with 152 * a PciConfigAll object. 153 */ 154 PciDev(Params *params); 155 156 virtual Fault read(MemReqPtr &req, uint8_t *data) { 157 return No_Fault; 158 } 159 virtual Fault write(MemReqPtr &req, const uint8_t *data) { 160 return No_Fault; 161 } 162 163 /** 164 * Write to the PCI config space data that is stored locally. This may be 165 * overridden by the device but at some point it will eventually call this 166 * for normal operations that it does not need to override. 167 * @param offset the offset into config space 168 * @param size the size of the write 169 * @param data the data to write 170 */ 171 virtual void WriteConfig(int offset, int size, uint32_t data); 172 173 174 /** 175 * Read from the PCI config space data that is stored locally. This may be 176 * overridden by the device but at some point it will eventually call this 177 * for normal operations that it does not need to override. 178 * @param offset the offset into config space 179 * @param size the size of the read 180 * @param data pointer to the location where the read value should be stored 181 */ 182 virtual void ReadConfig(int offset, int size, uint8_t *data); 183 184 /** 185 * Serialize this object to the given output stream. 186 * @param os The stream to serialize to. 187 */ 188 virtual void serialize(std::ostream &os); 189 190 /** 191 * Reconstruct the state of this object from a checkpoint. 192 * @param cp The checkpoint use. 193 * @param section The section name of this object 194 */ 195 virtual void unserialize(Checkpoint *cp, const std::string §ion); 196}; 197 198#endif // __DEV_PCIDEV_HH__ 199