Merge zizzer.eecs.umich.edu:/z/m5/Bitkeeper/m5
[gem5.git] / dev / pcidev.hh
index 85f3442982023eb34368aae1dbe42876d658a145..73d2e3c449e167b1534d068581305409c9dea533 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__
+#ifndef __DEV_PCIDEV_HH__
+#define __DEV_PCIDEV_HH__
 
-#include "mem/functional_mem/mmap_device.hh"
+#include "dev/io_device.hh"
 #include "dev/pcireg.h"
-class PCIConfigAll;
+#include "dev/platform.hh"
 
-/*
- * PCI device configuration device.
+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)
+    {
+        memset(config.data, 0, sizeof(config.data));
+        memset(BARAddrs, 0, sizeof(BARAddrs));
+        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];
+};
+
+/**
+ * PCI device, base implemnation is only config space.
  * Each device is connected to a PCIConfigSpace device
  * which returns -1 for everything but the pcidevs that
  * register with it. This object registers with the PCIConfig space
  * object.
  */
-class PciDev : public MMapDevice
+class PciDev : public DmaDevice
 {
-  private:
-    uint32_t Bus;
-    uint32_t Device;
-    uint32_t Function;
+  protected:
+    struct Params;
+    Params *_params;
+
   public:
-    PciDev(const std::string &name, PCIConfigAll *cf, uint32_t bus,
-           uint32_t dev, uint32_t func);
+    struct Params
+    {
+        std::string name;
+        Platform *plat;
+        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;
 
-    PCIConfigAll *ConfigSpace;
+        /** The device number we have */
+        uint32_t deviceNum;
+
+        /** The function number */
+        uint32_t functionNum;
+    };
+    const Params *params() const { return _params; }
+
+  protected:
+    /** 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];
+
+  protected:
+    Platform *plat;
+    PciConfigData *configData;
+
+  public:
+    Addr pciToDma(Addr pciAddr) const
+    { return plat->pciToDma(pciAddr); }
+
+    void
+    intrPost()
+    { plat->postPciInt(configData->config.hdr.pci0.interruptLine); }
+
+    void
+    intrClear()
+    { plat->clearPciInt(configData->config.hdr.pci0.interruptLine); }
+
+  public:
+    /**
+     * Constructor for PCI Dev. This function copies data from the
+     * config file object PCIConfigData and registers the device with
+     * a PciConfigAll object.
+     */
+    PciDev(Params *params);
+
+    virtual Fault read(MemReqPtr &req, uint8_t *data) {
+        return No_Fault;
+    }
+    virtual Fault write(MemReqPtr &req, const uint8_t *data) {
+        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);
-    virtual void ReadConfig(int offset, int size, uint8_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);
 };
 
-#endif // __PCI_DEV_HH__
+#endif // __DEV_PCIDEV_HH__