gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
device.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2004-2005 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
41 /* @file
42  * Interface for devices using PCI configuration
43  */
44 
45 #ifndef __DEV_PCI_DEVICE_HH__
46 #define __DEV_PCI_DEVICE_HH__
47 
48 #include <cstring>
49 #include <vector>
50 
51 #include "dev/dma_device.hh"
52 #include "dev/pci/host.hh"
53 #include "dev/pci/pcireg.h"
54 #include "params/PciDevice.hh"
55 #include "sim/byteswap.hh"
56 
57 #define BAR_IO_MASK 0x3
58 #define BAR_MEM_MASK 0xF
59 #define BAR_IO_SPACE_BIT 0x1
60 #define BAR_IO_SPACE(x) ((x) & BAR_IO_SPACE_BIT)
61 #define BAR_NUMBER(x) (((x) - PCI0_BASE_ADDR0) >> 0x2);
62 
66 class PciDevice : public DmaDevice
67 {
68  protected:
70 
73 
77  const int PMCAP_BASE;
78  const int PMCAP_ID_OFFSET;
79  const int PMCAP_PC_OFFSET;
80  const int PMCAP_PMCS_OFFSET;
82 
83  const int MSICAP_BASE;
85 
86  const int MSIXCAP_BASE;
87  const int MSIXCAP_ID_OFFSET;
88  const int MSIXCAP_MXC_OFFSET;
96 
97  const int PXCAP_BASE;
104 
106  uint32_t BARSize[6];
107 
110 
112  bool legacyIO[6];
113 
117  bool
118  isLargeBAR(int bar) const
119  {
120  return bits(config.baseAddr[bar], 2, 1) == 0x2;
121  }
122 
127  bool
128  isBAR(Addr addr, int bar) const
129  {
130  assert(bar >= 0 && bar < 6);
131  return BARAddrs[bar] <= addr && addr < BARAddrs[bar] + BARSize[bar];
132  }
133 
138  int
140  {
141  for (int i = 0; i <= 5; ++i)
142  if (isBAR(addr, i))
143  return i;
144 
145  return -1;
146  }
147 
157  bool
158  getBAR(Addr addr, int &bar, Addr &offs)
159  {
160  int b = getBAR(addr);
161  if (b < 0)
162  return false;
163 
164  offs = addr - BARAddrs[b];
165  bar = b;
166  return true;
167  }
168 
169  public: // Host configuration interface
176  virtual Tick writeConfig(PacketPtr pkt);
177 
178 
185  virtual Tick readConfig(PacketPtr pkt);
186 
187  protected:
189 
192 
193  public:
194  Addr pciToDma(Addr pci_addr) const {
195  return hostInterface.dmaAddr(pci_addr);
196  }
197 
198  void intrPost() { hostInterface.postInt(); }
199  void intrClear() { hostInterface.clearInt(); }
200 
201  uint8_t interruptLine() const { return letoh(config.interruptLine); }
202 
208  AddrRangeList getAddrRanges() const override;
209 
215  PciDevice(const PciDeviceParams *params);
216 
221  void serialize(CheckpointOut &cp) const override;
222 
228  void unserialize(CheckpointIn &cp) override;
229 
230  const PciBusAddr &busAddr() const { return _busAddr; }
231 };
232 #endif // __DEV_PCI_DEVICE_HH__
MSICAP msicap
Definition: device.hh:84
void unserialize(CheckpointIn &cp) override
Reconstruct the state of this object from a checkpoint.
Definition: device.cc:507
Addr pciToDma(Addr pci_addr) const
Definition: device.hh:194
Defines the PCI Express capability register and its associated bitfields for a PCIe device...
Definition: pcireg.h:304
Bitfield< 7 > i
PCI device, base implementation is only config space.
Definition: device.hh:66
const int MSIXCAP_MXC_OFFSET
Definition: device.hh:88
const PciBusAddr _busAddr
Definition: device.hh:69
const int MSICAP_BASE
Definition: device.hh:83
ip6_addr_t addr
Definition: inet.hh:330
MSIXCAP msixcap
Definition: device.hh:95
Defines the MSI Capability register and its associated bitfields for the a PCI/PCIe device...
Definition: pcireg.h:238
const int PMCAP_PC_OFFSET
Definition: device.hh:79
uint8_t interruptLine
Definition: pcireg.h:79
PMCAP pmcap
Definition: device.hh:81
T letoh(T value)
Definition: byteswap.hh:141
Definition: cprintf.cc:40
const int MSIXCAP_MPBA_OFFSET
Definition: device.hh:90
PciDevice(const PciDeviceParams *params)
Constructor for PCI Dev.
Definition: device.cc:62
PXCAP pxcap
Definition: device.hh:98
bool isLargeBAR(int bar) const
Does the given BAR represent 32 lower bits of a 64-bit address?
Definition: device.hh:118
const PciBusAddr & busAddr() const
Definition: device.hh:230
bool isBAR(Addr addr, int bar) const
Does the given address lie within the space mapped by the given base address register?
Definition: device.hh:128
Bitfield< 7 > b
int MSIX_TABLE_END
Definition: device.hh:92
const int MSIXCAP_ID_OFFSET
Definition: device.hh:87
Defines the Power Management capability register and all its associated bitfields for a PCIe device...
Definition: pcireg.h:205
bool legacyIO[6]
Whether the BARs are really hardwired legacy IO locations.
Definition: device.hh:112
void clearInt()
Clear a posted PCI interrupt.
Definition: host.cc:110
uint64_t Tick
Tick count type.
Definition: types.hh:61
virtual Tick writeConfig(PacketPtr pkt)
Write to the PCI config space data that is stored locally.
Definition: device.cc:284
uint8_t interruptLine() const
Definition: device.hh:201
int MSIX_PBA_END
Definition: device.hh:94
Addr dmaAddr(Addr addr) const
Calculate the physical address of a prefetchable memory location in the PCI address space...
Definition: host.hh:146
virtual Tick readConfig(PacketPtr pkt)
Read from the PCI config space data that is stored locally.
Definition: device.cc:216
int getBAR(Addr addr)
Which base address register (if any) maps the given address?
Definition: device.hh:139
Tick pioDelay
Definition: device.hh:190
int MSIX_TABLE_OFFSET
Definition: device.hh:91
Tick configDelay
Definition: device.hh:191
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:140
bool getBAR(Addr addr, int &bar, Addr &offs)
Which base address register (if any) maps the given address?
Definition: device.hh:158
std::vector< MSIXTable > msix_table
MSIX Table and PBA Structures.
Definition: device.hh:102
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:249
Addr BARAddrs[6]
The current address mapping of the BARs.
Definition: device.hh:109
const Params * params() const
Definition: io_device.hh:136
AddrRangeList getAddrRanges() const override
Determine the address ranges that this device responds to.
Definition: device.cc:273
int MSIX_PBA_OFFSET
Definition: device.hh:93
std::ostream CheckpointOut
Definition: serialize.hh:63
Callback interface from PCI devices to the host.
Definition: host.hh:91
const int PMCAP_ID_OFFSET
Definition: device.hh:78
std::vector< MSIXPbaEntry > msix_pba
Definition: device.hh:103
const int PMCAP_BASE
The capability list structures and base addresses.
Definition: device.hh:77
const int PXCAP_BASE
Definition: device.hh:97
const int PMCAP_PMCS_OFFSET
Definition: device.hh:80
PciHost::DeviceInterface hostInterface
Definition: device.hh:188
T bits(T val, int first, int last)
Extract the bitfield from position &#39;first&#39; to &#39;last&#39; (inclusive) from &#39;val&#39; and right justify it...
Definition: bitfield.hh:71
void postInt()
Post a PCI interrupt to the CPU.
Definition: host.cc:102
void intrPost()
Definition: device.hh:198
PCIConfig config
The current config space.
Definition: device.hh:72
uint32_t baseAddr[6]
Definition: pcireg.h:69
const int MSIXCAP_BASE
Definition: device.hh:86
void intrClear()
Definition: device.hh:199
void serialize(CheckpointOut &cp) const override
Serialize this object to the given output stream.
Definition: device.cc:442
uint32_t BARSize[6]
The size of the BARs.
Definition: device.hh:106
const int MSIXCAP_MTAB_OFFSET
Definition: device.hh:89

Generated on Mon Jun 8 2020 15:45:08 for gem5 by doxygen 1.8.13