better debugging of DMA operations
[gem5.git] / dev / pcidev.hh
index dcd3d1b8a5311db0e69dbcfb915e37e20205b881..c0fe47ac4461d54ba3255b368c14d0490c076d60 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2004 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  */
 
 /* @file
- * PCI configspace devices
+ * Interface for devices using PCI configuration
  */
 
 #ifndef __PCI_DEV_HH__
 #define __PCI_DEV_HH__
 
 #include "dev/pcireg.h"
-#include "sim/sim_object.hh"
-#include "mem/functional_mem/functional_memory.hh"
+#include "dev/io_device.hh"
 
-class PCIConfigAll;
+class PciConfigAll;
 class MemoryController;
 
+
+/**
+ * This class encapulates the first 64 bytes of a singles PCI
+ * devices config space that in configured by the configuration file.
+ */
 class PciConfigData : public SimObject
 {
   public:
+    /**
+     * Constructor to initialize the devices config space to 0.
+     */
     PciConfigData(const std::string &name)
         : SimObject(name)
     {
@@ -51,8 +58,13 @@ class PciConfigData : public SimObject
         memset(BARSize, 0, sizeof(BARSize));
     }
 
+    /** The first 64 bytes */
     PCIConfig config;
+
+    /** The size of the BARs */
     uint32_t BARSize[6];
+
+    /** The addresses of the BARs */
     Addr BARAddrs[6];
 };
 
@@ -63,22 +75,55 @@ class PciConfigData : public SimObject
  * register with it. This object registers with the PCIConfig space
  * object.
  */
-class PciDev : public FunctionalMemory
+class PciDev : public DmaDevice
 {
   protected:
-    MemoryController *MMU;
-    PCIConfigAll *ConfigSpace;
-    PciConfigData *ConfigData;
-    uint32_t Bus;
-    uint32_t Device;
-    uint32_t Function;
+    MemoryController *mmu;
+    /** A pointer to the configspace all object that calls
+     * us when a read comes to this particular device/function.
+     */
+    PciConfigAll *configSpace;
+
+    /**
+     * A pointer to the object that contains the first 64 bytes of
+     * config space
+     */
+    PciConfigData *configData;
+
+    /** The bus number we are on */
+    uint32_t busNum;
 
+    /** The device number we have */
+    uint32_t deviceNum;
+
+    /** The function number */
+    uint32_t functionNum;
+
+    /** The current config space. Unlike the PciConfigData this is updated
+     * during simulation while continues to refelect what was in the config file.
+     */
     PCIConfig config;
+
+    /** The size of the BARs */
     uint32_t BARSize[6];
+
+    /** The current address mapping of the BARs */
     Addr BARAddrs[6];
 
   public:
-    PciDev(const std::string &name, MemoryController *mmu, PCIConfigAll *cf,
+    /**
+     * Constructor for PCI Dev. This function copies data from the config file
+     * object PCIConfigData and registers the device with a PciConfigAll object.
+     * @param name name of the object
+     * @param mmu a pointer to the memory controller
+     * @param cf a pointer to the config space object that this device need to
+     *           register with
+     * @param cd A pointer to the config space values specified in the conig file
+     * @param bus the bus this device is on
+     * @param dev the device id of this device
+     * @param func the function number of this device
+     */
+    PciDev(const std::string &name, MemoryController *mmu, PciConfigAll *cf,
            PciConfigData *cd, uint32_t bus, uint32_t dev, uint32_t func);
 
     virtual Fault read(MemReqPtr &req, uint8_t *data) {
@@ -88,10 +133,38 @@ class PciDev : public FunctionalMemory
         return No_Fault;
     }
 
+    /**
+     * Write to the PCI config space data that is stored locally. This may be
+     * overridden by the device but at some point it will eventually call this
+     * for normal operations that it does not need to override.
+     * @param offset the offset into config space
+     * @param size the size of the write
+     * @param data the data to write
+     */
     virtual void WriteConfig(int offset, int size, uint32_t data);
+
+
+    /**
+     * Read from the PCI config space data that is stored locally. This may be
+     * overridden by the device but at some point it will eventually call this
+     * for normal operations that it does not need to override.
+     * @param offset the offset into config space
+     * @param size the size of the read
+     * @param data pointer to the location where the read value should be stored
+     */
     virtual void ReadConfig(int offset, int size, uint8_t *data);
 
+    /**
+     * Serialize this object to the given output stream.
+     * @param os The stream to serialize to.
+     */
     virtual void serialize(std::ostream &os);
+
+    /**
+     * Reconstruct the state of this object from a checkpoint.
+     * @param cp The checkpoint use.
+     * @param section The section name of this object
+     */
     virtual void unserialize(Checkpoint *cp, const std::string &section);
 };