1 // 2 // Copyright (c) 2010-2023 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 using System; 8 using System.Collections.Generic; 9 using System.Linq; 10 using Antmicro.Renode.Core; 11 using Antmicro.Renode.Core.Structure; 12 using Antmicro.Renode.Core.Structure.Registers; 13 using Antmicro.Renode.Logging; 14 using Antmicro.Renode.Peripherals.Bus; 15 using Antmicro.Renode.Utilities; 16 17 using Range = Antmicro.Renode.Core.Range; 18 19 namespace Antmicro.Renode.Peripherals.PCI 20 { 21 [AllowedTranslations(AllowedTranslation.ByteToDoubleWord | AllowedTranslation.WordToDoubleWord)] 22 public class MPFS_PCIe : SimpleContainer<IPCIePeripheral>, IDoubleWordPeripheral, IKnownSize, IPCIeRouter, IAbsoluteAddressAware 23 { MPFS_PCIe(IMachine machine)24 public MPFS_PCIe(IMachine machine) : base(machine) 25 { 26 var registersDictionary = new Dictionary<long, DoubleWordRegister> 27 { 28 //this register is not documented. It seems it contains the enabled flag, it may contain the port type, number of lanes, lane rate etc 29 {(long)Registers.GEN_SETTINGS, new DoubleWordRegister(this) 30 .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => true, name: "ROOT_PORT_ENABLE") 31 }, 32 {(long)Registers.ECC_CONTROL, new DoubleWordRegister(this) 33 .WithTag("TX_RAM_INJ_ERR", 0, 4) 34 .WithTag("RX_RAM_INJ_ERR", 4, 4) 35 .WithTag("PCIe2AXI_RAM_INJ_ERR", 8, 4) 36 .WithTag("AXI2PCIe_RAM_INJ_ERR", 12, 4) 37 .WithReservedBits(16, 8) 38 .WithTag("TX_RAM_ECC_BYPASS", 24, 1) 39 .WithTag("RX_RAM_ECC_BYPASS", 25, 1) 40 .WithTag("PCIe2AXI_RAM_ECC_BYPASS", 26, 1) 41 .WithTag("AXI2PCIe_RAM_ECC_BYPASS", 27, 1) 42 .WithReservedBits(28, 4) 43 }, 44 //most likely w1c, unclear from the docs 45 {(long)Registers.PCIE_EVENT_INT, new DoubleWordRegister(this) 46 .WithTag("L2_EXIT_INT", 0, 1) 47 .WithTag("HOTRST_EXIT_INT", 1, 1) 48 .WithTag("DLUP_EXIT_INT", 2, 1) 49 .WithReservedBits(3, 13) 50 .WithTag("L2_EXIT_INT_MASK", 16, 1) 51 .WithTag("HOTRST_EXIT_INT_MASK", 17, 1) 52 .WithTag("DLUP_EXIT_INT_MASK", 18, 1) 53 .WithReservedBits(19, 13) 54 }, 55 //correctable ecc-related memory errors, probably w1c 56 {(long)Registers.SEC_ERROR_INT, new DoubleWordRegister(this) 57 .WithTag("TX_RAM_SEC_ERR_INT", 0, 4) 58 .WithTag("RX_RAM_SEC_ERR_INT", 4, 4) 59 .WithTag("PCIE2AXI_RAM_SEC_ERR_INT", 8, 4) 60 .WithTag("AXI2PCIE_RAM_SEC_ERR_INT", 12, 4) 61 .WithReservedBits(16, 16) 62 }, 63 //uncorrectable ecc-related memory errors, probably w1c 64 {(long)Registers.DED_ERROR_INT, new DoubleWordRegister(this) 65 .WithTag("TX_RAM_DED_ERR_INT", 0, 4) 66 .WithTag("RX_RAM_DED_ERR_INT", 4, 4) 67 .WithTag("PCIE2AXI_RAM_DED_ERR_INT", 8, 4) 68 .WithTag("AXI2PCIE_RAM_DED_ERR_INT", 12, 4) 69 .WithReservedBits(16, 16) 70 }, 71 //this is the "standard" interrupt mask register, 1 to enable interrupt source 72 {(long)Registers.IMASK_LOCAL, new DoubleWordRegister(this) 73 .WithTag("IMASK_DMA_END_ENGINE_0", 0, 1) 74 .WithTag("IMASK_DMA_END_ENGINE_1", 1, 1) 75 .WithReservedBits(2, 6) 76 .WithTag("IMASK_DMA_ERROR_ENGINE_0", 8, 1) 77 .WithTag("IMASK_DMA_ERROR_ENGINE_1", 9, 1) 78 .WithReservedBits(10, 6) 79 .WithTag("IMASK_A_ATR_EVT_POST_ERR", 16, 1) 80 .WithTag("IMASK_A_ATR_EVT_FETCH_ERR", 17, 1) 81 .WithTag("IMASK_A_ATR_EVT_DISCARD_ERR", 18, 1) 82 .WithTag("IMASK_A_ATR_EVT_DOORBELL", 19, 1) 83 .WithTag("IMASK_P_ATR_EVT_POST_ERR", 20, 1) 84 .WithTag("IMASK_P_ATR_EVT_FETCH_ERR", 21, 1) 85 .WithTag("IMASK_P_ATR_EVT_DISCARD_ERR", 22, 1) 86 .WithTag("IMASK_P_ATR_EVT_DOORBELL", 23, 1) 87 .WithTag("IMASK_PM_MSI_INT_INTA", 24, 1) 88 .WithTag("IMASK_PM_MSI_INT_INTB", 25, 1) 89 .WithTag("IMASK_PM_MSI_INT_INTC", 26, 1) 90 .WithTag("IMASK_PM_MSI_INT_INTD", 27, 1) 91 .WithTag("IMASK_PM_MSI_INT_MSI", 28, 1) 92 .WithTag("IMASK_PM_MSI_INT_AER_EVT", 29, 1) 93 .WithTag("IMASK_PM_MSI_INT_EVENTS", 30, 1) 94 .WithTag("IMASK_PM_MSI_INT_SYS_ERR", 31, 1) 95 }, 96 //this is the "standard" interrupt status register, w1c 97 {(long)Registers.ISTATUS_LOCAL, new DoubleWordRegister(this) 98 .WithTag("DMA_END_ENGINE_0", 0, 1) 99 .WithTag("DMA_END_ENGINE_1", 1, 1) 100 .WithReservedBits(2, 6) 101 .WithTag("DMA_ERROR_ENGINE_0", 8, 1) 102 .WithTag("DMA_ERROR_ENGINE_1", 9, 1) 103 .WithReservedBits(10, 6) 104 .WithTag("A_ATR_EVT_POST_ERR", 16, 1) 105 .WithTag("A_ATR_EVT_FETCH_ERR", 17, 1) 106 .WithTag("A_ATR_EVT_DISCARD_ERR", 18, 1) 107 .WithTag("A_ATR_EVT_DOORBELL", 19, 1) 108 .WithTag("P_ATR_EVT_POST_ERR", 20, 1) 109 .WithTag("P_ATR_EVT_FETCH_ERR", 21, 1) 110 .WithTag("P_ATR_EVT_DISCARD_ERR", 22, 1) 111 .WithTag("P_ATR_EVT_DOORBELL", 23, 1) 112 .WithTag("PM_MSI_INT_INTA", 24, 1) 113 .WithTag("PM_MSI_INT_INTB", 25, 1) 114 .WithTag("PM_MSI_INT_INTC", 26, 1) 115 .WithTag("PM_MSI_INT_INTD", 27, 1) 116 .WithTag("PM_MSI_INT_MSI", 28, 1) 117 .WithTag("PM_MSI_INT_AER_EVT", 29, 1) 118 .WithTag("PM_MSI_INT_EVENTS", 30, 1) 119 .WithTag("PM_MSI_INT_SYS_ERR", 31, 1) 120 }, 121 //this should reflect bits in ISTATUS_HOST, but it's described as a one field 122 {(long)Registers.IMASK_HOST, new DoubleWordRegister(this) 123 .WithTag("INT_MASK_HOST", 0, 32) 124 }, 125 //this should reflect bits in ISTATUS_LOCAL. The docs say that the host processor monitors and clears these bits (w1c), but the software writes it anyway) 126 {(long)Registers.ISTATUS_HOST, new DoubleWordRegister(this) 127 .WithTag("DMA_END", 0, 8) 128 .WithTag("DMA_ERROR", 8, 2) 129 .WithTag("A_ATR_EVT", 10, 10) 130 .WithTag("P_ATR_EVT", 20, 4) 131 .WithTag("INT_REQUEST", 24, 8) 132 }, 133 }; 134 for(var i = 0; i < NumberOfTranslationTables; i++) 135 { 136 pcieAddressTables[i] = new AddressTranslationTable(this); 137 axiAddressTables[i] = new AddressTranslationTable(this); 138 CreateAddressTranslationRegisters(registersDictionary, i, true); 139 CreateAddressTranslationRegisters(registersDictionary, i, false); 140 } 141 registers = new DoubleWordRegisterCollection(this, registersDictionary); 142 } 143 ReadDoubleWord(long offset)144 public uint ReadDoubleWord(long offset) 145 { 146 return registers.Read(offset); 147 } 148 WriteDoubleWord(long offset, uint value)149 public void WriteDoubleWord(long offset, uint value) 150 { 151 registers.Write(offset, value); 152 } 153 154 [ConnectionRegion("ecam")] WriteDoubleWordEcam(long offset, uint value)155 public void WriteDoubleWordEcam(long offset, uint value) 156 { 157 158 var table = axiAddressTables.SingleOrDefault(x => x.DoesAddressHit(currentAccessAbsoluteAddress)); 159 if(table == null) 160 { 161 this.Log(LogLevel.Warning, "Trying to access memory at 0x{0:X} writing 0x{1:X} without address translation configured.", currentAccessAbsoluteAddress, value); 162 this.LogUnhandledWrite(offset, value); 163 return; 164 } 165 var translatedAddress = table.Translate(currentAccessAbsoluteAddress); 166 if(table.TargetSpace == PCIeSpace.Configuration) 167 { 168 if(!TryDoEcamLookup(offset, out var result)) 169 { 170 this.LogUnhandledWrite(offset, value); 171 return; 172 } 173 result.Endpoint.ConfigurationWriteDoubleWord(result.EcamAddress.Offset, value); 174 } 175 else if(table.TargetSpace == PCIeSpace.TxRx) 176 { 177 var barCandidates = memoryMap.Where(x => x.Key.Contains(translatedAddress)); 178 if(!barCandidates.Any()) 179 { 180 this.Log(LogLevel.Warning, "Trying to write to a BAR at 0x{0:X}, but nothing is registered there, value 0x{1:X}.", translatedAddress, value); 181 return; 182 } 183 //This should not be required, but we need to improve RegisterBar first 184 var targetBarEntry = barCandidates.Single(); 185 targetBarEntry.Value.TargetPeripheral.MemoryWriteDoubleWord(targetBarEntry.Value.BarNumber, (long)(translatedAddress - targetBarEntry.Key.StartAddress), value); 186 } 187 else 188 { 189 this.Log(LogLevel.Warning, "Trying to write to the PCIe space at 0x{0:X} in an unsupported mode {1}, value 0x{2:X}.", offset, table.TargetSpace, value); 190 return; 191 } 192 } 193 194 [ConnectionRegion("ecam")] ReadDoubleWordEcam(long offset)195 public uint ReadDoubleWordEcam(long offset) 196 { 197 var table = axiAddressTables.SingleOrDefault(x => x.DoesAddressHit(currentAccessAbsoluteAddress)); 198 if(table == null) 199 { 200 this.Log(LogLevel.Warning, "Trying to access memory at 0x{0:X} without address translation configured.", currentAccessAbsoluteAddress); 201 this.LogUnhandledRead(offset); 202 return 0; 203 } 204 var translatedAddress = table.Translate(currentAccessAbsoluteAddress); 205 if(table.TargetSpace == PCIeSpace.Configuration) 206 { 207 if(!TryDoEcamLookup(offset, out var result)) 208 { 209 this.LogUnhandledRead(offset); 210 return FunctionNotImplemented; 211 } 212 return result.Endpoint.ConfigurationReadDoubleWord(result.EcamAddress.Offset); 213 } 214 else if(table.TargetSpace == PCIeSpace.TxRx) 215 { 216 var barCandidates = memoryMap.Where(x => x.Key.Contains(translatedAddress)); 217 if(!barCandidates.Any()) 218 { 219 this.Log(LogLevel.Warning, "Trying to read from a BAR at 0x{0:X}, but nothing is registered there.", translatedAddress); 220 return 0; 221 } 222 //This should not be required, but we need to improve RegisterBar first 223 var targetBarEntry = barCandidates.Single(); 224 return targetBarEntry.Value.TargetPeripheral.MemoryReadDoubleWord(targetBarEntry.Value.BarNumber, (long)(translatedAddress - targetBarEntry.Key.StartAddress)); 225 } 226 else 227 { 228 this.Log(LogLevel.Warning, "Trying to read from the PCIe space at 0x{0:X} in an unsupported mode {1}.", offset, table.TargetSpace); 229 return 0; 230 } 231 } 232 Reset()233 public override void Reset() 234 { 235 registers.Reset(); 236 } 237 SetAbsoluteAddress(ulong address)238 public void SetAbsoluteAddress(ulong address) 239 { 240 currentAccessAbsoluteAddress = address & ~3ul; 241 } 242 243 public long Size => 0x4000; 244 TryDoEcamLookup(long offset, out EcamLookupResult result)245 private bool TryDoEcamLookup(long offset, out EcamLookupResult result) 246 { 247 result = new EcamLookupResult(); 248 result.EcamAddress = new EcamAddress((uint)offset); // the case is safe as we are interested in lower 28 bits 249 return result.EcamAddress.Device == 0 && TryGetByAddress(result.EcamAddress.Bus, out result.Endpoint); // this works if we have a flat structure only! 250 } 251 CreateAddressTranslationRegisters(Dictionary<long, DoubleWordRegister> registers, int tableNumber, bool isPcieTable)252 private void CreateAddressTranslationRegisters(Dictionary<long, DoubleWordRegister> registers, int tableNumber, bool isPcieTable) 253 { 254 var table = isPcieTable ? pcieAddressTables[tableNumber] : axiAddressTables[tableNumber]; 255 var baseOffset = (long)(isPcieTable ? Registers.ATR0_PCIE_WIN0_SRCADDR_PARAM : Registers.ATR0_AXI4_SLV0_SRCADDR_PARAM) 256 + tableNumber * (Registers.ATR1_AXI4_SLV0_SRCADDR_PARAM - Registers.ATR0_AXI4_SLV0_SRCADDR_PARAM); 257 registers.Add(baseOffset + (long)AddressTranslationRegisters.SourceAddressLowAndParameters, new DoubleWordRegister(this) 258 .WithFlag(0, changeCallback: (_, value) => table.Enabled = value, 259 valueProviderCallback: _ => table.Enabled, name: "ATR_IMPL") 260 .WithValueField(1, 6, changeCallback: (_, value) => table.SizePower = (uint)value, 261 valueProviderCallback: _ => table.SizePower, name: "ATR_SIZE") 262 .WithReservedBits(7, 5) 263 .WithValueField(12, 20, changeCallback: (_, value) => BitHelper.UpdateWithShifted(ref table.SourceAddress, value, 12, 20), 264 valueProviderCallback: _ => (uint)BitHelper.GetValue(table.SourceAddress, 12, 20), name: "SRC_ADDR[31:12]") 265 ); 266 registers.Add(baseOffset + (long)AddressTranslationRegisters.SourceAddressHigh, new DoubleWordRegister(this) 267 .WithValueField(0, 32, changeCallback: (_, value) => BitHelper.UpdateWithShifted(ref table.SourceAddress, value, 32, 32), 268 valueProviderCallback: _ => (uint)BitHelper.GetValue(table.SourceAddress, 32, 32), name: "SRC_ADDR[63:32]") 269 ); 270 registers.Add(baseOffset + (long)AddressTranslationRegisters.DestinationAddressLow, new DoubleWordRegister(this) 271 .WithReservedBits(0, 12) 272 .WithValueField(12, 20, changeCallback: (_, value) => BitHelper.UpdateWithShifted(ref table.DestinationAddress, value, 12, 20), 273 valueProviderCallback: _ => (uint)BitHelper.GetValue(table.DestinationAddress, 12, 20), name: "TRSL_ADDR_LSB") 274 ); 275 registers.Add(baseOffset + (long)AddressTranslationRegisters.DestinationAddressHigh, new DoubleWordRegister(this) 276 .WithValueField(0, 32, changeCallback: (_, value) => BitHelper.UpdateWithShifted(ref table.SourceAddress, value, 32, 32), 277 valueProviderCallback: _ => (uint)BitHelper.GetValue(table.SourceAddress, 32, 32), name: "TRSL_ADDR_UDW") 278 ); 279 registers.Add(baseOffset + (long)AddressTranslationRegisters.TranslationParametersLow, new DoubleWordRegister(this) 280 .WithEnumField(0, 4, changeCallback: (_, value) => table.TargetSpace = value, 281 valueProviderCallback: (PCIeSpace _) => table.TargetSpace, name: "TRSL_ID") 282 .WithReservedBits(4, 12) 283 .WithTag("TRSF_PARAM", 16, 12) 284 .WithReservedBits(28, 4) 285 ); 286 registers.Add(baseOffset + (long)AddressTranslationRegisters.TranslationMaskLow, new DoubleWordRegister(this) 287 .WithValueField(0, 32, valueProviderCallback: _ => (uint)BitHelper.GetValue(table.TranslationMask, 0, 32), name: "TRSL_MASK") 288 ); 289 registers.Add(baseOffset + (long)AddressTranslationRegisters.TranslationMaskHigh, new DoubleWordRegister(this) 290 .WithValueField(0, 32, valueProviderCallback: _ => (uint)BitHelper.GetValue(table .TranslationMask, 32, 32), name: "TRSL_MASK") 291 ); 292 } 293 RegisterBar(Range range, IPCIePeripheral peripheral, uint bar)294 public void RegisterBar(Range range, IPCIePeripheral peripheral, uint bar) 295 { 296 //This has to be improved greatly. 297 //1. have fast search 298 //2. invalidate overlaps 299 var previousRegistration = memoryMap.Where(x => x.Value.BarNumber == bar && x.Value.TargetPeripheral == peripheral).Select(x => x.Key); 300 if(previousRegistration.Any()) 301 { 302 memoryMap.Remove(previousRegistration.SingleOrDefault()); 303 } 304 memoryMap[range] = new TargetBar { BarNumber = bar, TargetPeripheral = peripheral }; 305 } 306 307 private ulong currentAccessAbsoluteAddress; 308 private readonly DoubleWordRegisterCollection registers; 309 310 private readonly AddressTranslationTable[] pcieAddressTables = new AddressTranslationTable[NumberOfTranslationTables]; 311 private readonly AddressTranslationTable[] axiAddressTables = new AddressTranslationTable[NumberOfTranslationTables]; 312 private readonly Dictionary<Range, TargetBar> memoryMap = new Dictionary<Range, TargetBar>(); 313 314 private const int NumberOfTranslationTables = 6; 315 316 private const uint FunctionNotImplemented = 0xFFFF; 317 318 protected struct TargetBar 319 { 320 public IPCIePeripheral TargetPeripheral; 321 public uint BarNumber; 322 } 323 324 private struct EcamLookupResult 325 { 326 public IPCIePeripheral Endpoint; 327 public EcamAddress EcamAddress; 328 } 329 330 private struct EcamAddress 331 { EcamAddressAntmicro.Renode.Peripherals.PCI.MPFS_PCIe.EcamAddress332 public EcamAddress(uint address) : this() 333 { 334 Bus = (int)BitHelper.GetValue(address, 20, 8); 335 Device = (int)BitHelper.GetValue(address, 15, 5); 336 Function = (int)BitHelper.GetValue(address, 12, 3); 337 Offset = BitHelper.GetValue(address, 0, 12); 338 } 339 340 public int Bus; 341 public int Device; 342 public int Function; 343 public uint Offset; 344 } 345 346 private class AddressTranslationTable 347 { AddressTranslationTable(MPFS_PCIe parent)348 public AddressTranslationTable(MPFS_PCIe parent) 349 { 350 this.parent = parent; 351 this.size = MinSize; 352 } 353 Translate(ulong address)354 public ulong Translate(ulong address) 355 { 356 return address - SourceAddress + DestinationAddress; 357 } 358 DoesAddressHit(ulong address)359 public bool DoesAddressHit(ulong address) 360 { 361 return Enabled && address >= SourceAddress && ((address - SourceAddress) & TranslationMask) == 0; 362 } 363 364 public uint SizePower 365 { 366 get 367 { 368 return size; 369 } 370 set 371 { 372 if(value > MaxSize || value < MinSize) 373 { 374 parent.Log(LogLevel.Warning, "Trying to set address translation table size out of bounds: writing {0} when should be between {1} and {2}. Ignoring.", value, MinSize, MaxSize); 375 } 376 size = value; 377 } 378 } 379 380 public bool Enabled; 381 public ulong SourceAddress; 382 public ulong DestinationAddress; 383 384 public PCIeSpace TargetSpace; 385 386 // we handle 63 separately as it would overflow the ulong. The result is correct. 387 public ulong TranslationMask => size == MaxSize ? 0ul : 0ul - (2ul << ((int)SizePower + 1)); 388 389 private uint size; 390 private MPFS_PCIe parent; 391 392 private const int MinSize = 11; 393 private const int MaxSize = 63; 394 } 395 396 private enum AddressTranslationRegisters 397 { 398 SourceAddressLowAndParameters = 0x0, 399 SourceAddressHigh = 0x4, 400 DestinationAddressLow = 0x8, 401 DestinationAddressHigh = 0xC, 402 TranslationParametersLow = 0x10, 403 Reserved = 0x14, 404 TranslationMaskLow = 0x18, 405 TranslationMaskHigh = 0x1C, 406 } 407 408 private enum Registers 409 { 410 /* PCIE Bridge Control Registers */ 411 BRIDGE_VER = 0x0, 412 BRIDGE_BUS = 0x4, 413 BRIDGE_IMPL_IF = 0x8, 414 /* reserved */ 415 PCIE_IF_CONF = 0x10, 416 PCIE_BASIC_CONF = 0x14, 417 PCIE_BASIC_STATUS = 0x18, 418 /* reserved */ 419 AXI_SLVL_CONF = 0x24, 420 /* reserved */ 421 AXI_MST0_CONF = 0x30, 422 AXI_SLV0_CONF = 0x34, 423 /* reserved */ 424 GEN_SETTINGS = 0x80, 425 PCIE_CFGCTRL = 0x84, 426 PCIE_PIPE_DW0 = 0x88, 427 PCIE_PIPE_DW1 = 0x8C, 428 PCIE_VC_CRED_DW0 = 0x90, 429 PCIE_VC_CRED_DW1 = 0x94, 430 PCIE_PCI_IDS_DW0 = 0x98, 431 PCIE_PCI_IDS_DW1 = 0x9C, 432 PCIE_PCI_IDS_DW2 = 0xA0, 433 PCIE_PCI_LPM = 0xA4, 434 PCIE_PCI_IRQ_DW0 = 0xA8, 435 PCIE_PCI_IRQ_DW1 = 0xAC, 436 PCIE_PCI_IRQ_DW2 = 0xB0, 437 PCIE_PCI_IOV_DW0 = 0xB4, 438 PCIE_PCI_IOV_DW1 = 0xB8, 439 /* reserved */ 440 PCIE_PEX_DEV = 0xC0, 441 PCIE_PEX_DEV2 = 0xC4, 442 PCIE_PEX_LINK = 0xC8, 443 PCIE_PEX_SLOT = 0xCC, 444 PCIE_PEX_ROOT_VC = 0xD0, 445 PCIE_PEX_SPC = 0xD4, 446 PCIE_PEX_SPC2 = 0xD8, 447 PCIE_PEX_NFTS = 0xDC, 448 PCIE_PEX_L1SS = 0xE0, 449 PCIE_BAR_01_DW0 = 0xE4, 450 PCIE_BAR_01_DW1 = 0xE8, 451 PCIE_BAR_23_DW0 = 0xEC, 452 PCIE_BAR_23_DW1 = 0xF0, 453 PCIE_BAR_45_DW0 = 0xF4, 454 PCIE_BAR_45_DW1 = 0xF8, 455 PCIE_BAR_WIN = 0xFC, 456 PCIE_EQ_PRESET_DW0 = 0x100, 457 PCIE_EQ_PRESET_DW1 = 0x104, 458 PCIE_EQ_PRESET_DW2 = 0x108, 459 PCIE_EQ_PRESET_DW3 = 0x10C, 460 PCIE_EQ_PRESET_DW4 = 0x110, 461 PCIE_EQ_PRESET_DW5 = 0x114, 462 PCIE_EQ_PRESET_DW6 = 0x118, 463 PCIE_EQ_PRESET_DW7 = 0x11C, 464 PCIE_SRIOV_DW0 = 0x120, 465 PCIE_SRIOV_DW1 = 0x124, 466 PCIE_SRIOV_DW2 = 0x128, 467 PCIE_SRIOV_DW3 = 0x12C, 468 PCIE_SRIOV_DW4 = 0x130, 469 PCIE_SRIOV_DW5 = 0x134, 470 PCIE_SRIOV_DW6 = 0x138, 471 PCIE_SRIOV_DW7 = 0x13C, 472 PCIE_CFGNUM = 0x140, 473 /* reserved */ 474 PM_CONF_DW0 = 0x174, 475 PM_CONF_DW1 = 0x178, 476 PM_CONF_DW2 = 0x17C, 477 IMASK_LOCAL = 0x180, 478 ISTATUS_LOCAL = 0x184, 479 IMASK_HOST = 0x188, 480 ISTATUS_HOST = 0x18C, 481 IMSI_ADDR = 0x190, 482 ISTATUS_MSI = 0x194, 483 ICMD_PM = 0x198, 484 ISTATUS_PM = 0x19C, 485 ATS_PRI_REPORT = 0x1A0, 486 LTR_VALUES = 0x1A4, 487 /* reserved */ 488 ISTATUS_DMA0 = 0x1B0, 489 ISTATUS_DMA1 = 0x1B4, 490 /* reserved */ 491 ISTATUS_P_ADT_WIN0 = 0x1D8, 492 ISTATUS_P_ADT_WIN1 = 0x1DC, 493 ISTATUS_A_ADT_SLV0 = 0x1E0, 494 ISTATUS_A_ADT_SLV1 = 0x1E4, 495 ISTATUS_A_ADT_SLV2 = 0x1E8, 496 ISTATUS_A_ADT_SLV3 = 0x1EC, 497 /* reserved */ 498 ROUTING_RULES_R_DW0 = 0x200, 499 ROUTING_RULES_R_DW1 = 0x204, 500 ROUTING_RULES_R_DW2 = 0x208, 501 ROUTING_RULES_R_DW3 = 0x20C, 502 ROUTING_RULES_R_DW4 = 0x210, 503 ROUTING_RULES_R_DW5 = 0x214, 504 ROUTING_RULES_R_DW6 = 0x218, 505 ROUTING_RULES_R_DW7 = 0x21C, 506 ROUTING_RULES_R_DW8 = 0x220, 507 ROUTING_RULES_R_DW9 = 0x224, 508 ROUTING_RULES_R_DW10 = 0x228, 509 ROUTING_RULES_R_DW11 = 0x22C, 510 ROUTING_RULES_R_DW12 = 0x230, 511 ROUTING_RULES_R_DW13 = 0x234, 512 ROUTING_RULES_R_DW14 = 0x238, 513 ROUTING_RULES_R_DW15 = 0x23C, 514 ROUTING_RULES_W_DW0 = 0x240, 515 ROUTING_RULES_W_DW1 = 0x244, 516 ROUTING_RULES_W_DW2 = 0x248, 517 ROUTING_RULES_W_DW3 = 0x24C, 518 ROUTING_RULES_W_DW4 = 0x250, 519 ROUTING_RULES_W_DW5 = 0x254, 520 ROUTING_RULES_W_DW6 = 0x258, 521 ROUTING_RULES_W_DW7 = 0x25C, 522 ROUTING_RULES_W_DW8 = 0x260, 523 ROUTING_RULES_W_DW9 = 0x264, 524 ROUTING_RULES_W_DW10 = 0x268, 525 ROUTING_RULES_W_DW11 = 0x26C, 526 ROUTING_RULES_W_DW12 = 0x270, 527 ROUTING_RULES_W_DW13 = 0x274, 528 ROUTING_RULES_W_DW14 = 0x278, 529 ROUTING_RULES_W_DW15 = 0x27C, 530 ARBITRATION_RULES_DW0 = 0x280, 531 ARBITRATION_RULES_DW1 = 0x284, 532 ARBITRATION_RULES_DW2 = 0x288, 533 ARBITRATION_RULES_DW3 = 0x28C, 534 ARBITRATION_RULES_DW4 = 0x290, 535 ARBITRATION_RULES_DW5 = 0x294, 536 ARBITRATION_RULES_DW6 = 0x298, 537 ARBITRATION_RULES_DW7 = 0x29C, 538 ARBITRATION_RULES_DW8 = 0x2A0, 539 ARBITRATION_RULES_DW9 = 0x2A4, 540 ARBITRATION_RULES_DW10 = 0x2A8, 541 ARBITRATION_RULES_DW11 = 0x2AC, 542 ARBITRATION_RULES_DW12 = 0x2B0, 543 ARBITRATION_RULES_DW13 = 0x2B4, 544 ARBITRATION_RULES_DW14 = 0x2B8, 545 ARBITRATION_RULES_DW15 = 0x2BC, 546 PRIORITY_RULES_DW0 = 0x2C0, 547 PRIORITY_RULES_DW1 = 0x2C4, 548 PRIORITY_RULES_DW2 = 0x2C8, 549 PRIORITY_RULES_DW3 = 0x2CC, 550 PRIORITY_RULES_DW4 = 0x2D0, 551 PRIORITY_RULES_DW5 = 0x2D4, 552 PRIORITY_RULES_DW6 = 0x2D8, 553 PRIORITY_RULES_DW7 = 0x2DC, 554 PRIORITY_RULES_DW8 = 0x2E0, 555 PRIORITY_RULES_DW9 = 0x2E4, 556 PRIORITY_RULES_DW10 = 0x2E8, 557 PRIORITY_RULES_DW11 = 0x2EC, 558 PRIORITY_RULES_DW12 = 0x2F0, 559 PRIORITY_RULES_DW13 = 0x2F4, 560 PRIORITY_RULES_DW14 = 0x2F8, 561 PRIORITY_RULES_DW15 = 0x2FC, 562 /* reserved */ 563 P2A_TC_QOS_CONV = 0x3C0, 564 P2A_ATTR_CACHE_CONV = 0x3C4, 565 P2A_NC_BASE_ADDR_DW0 = 0x3C8, 566 P2A_NC_BASE_ADDR_DW1 = 0x3CC, 567 /* reserved */ 568 DMA0_SRC_PARAM = 0x400, 569 DMA0_DESTPARAM = 0x404, 570 DMA0_SRCADDR_LDW = 0x408, 571 DMA0_SRCADDR_UDW = 0x40C, 572 DMA0_DESTADDR_LDW = 0x410, 573 DMA0_DESTADDR_UDW = 0x414, 574 DMA0_LENGTH = 0x418, 575 DMA0_CONTROL = 0x41C, 576 DMA0_STATUS = 0x420, 577 DMA0_PRC_LENGTH = 0x424, 578 DMA0_SHARE_ACCESS = 0x428, 579 /* reserved */ 580 DMA1_SRC_PARAM = 0x440, 581 DMA1_DESTPARAM = 0x444, 582 DMA1_SRCADDR_LDW = 0x448, 583 DMA1_SRCADDR_UDW = 0x44C, 584 DMA1_DESTADDR_LDW = 0x450, 585 DMA1_DESTADDR_UDW = 0x454, 586 DMA1_LENGTH = 0x458, 587 DMA1_CONTROL = 0x45C, 588 DMA1_STATUS = 0x460, 589 DMA1_PRC_LENGTH = 0x464, 590 DMA1_SHARE_ACCESS = 0x468, 591 /* reserved */ 592 ATR0_PCIE_WIN0_SRCADDR_PARAM = 0x600, 593 ATR0_PCIE_WIN0_SRC_ADDR = 0x604, 594 ATR0_PCIE_WIN0_TRSL_ADDR_LSB = 0x608, 595 ATR0_PCIE_WIN0_TRSL_ADDR_UDW = 0x60C, 596 ATR0_PCIE_WIN0_TRSL_PARAM = 0x610, 597 /* reserved */ 598 ATR0_PCIE_WIN0_TRSL_MASK_DW0 = 0x618, 599 ATR0_PCIE_WIN0_TRSL_MASK_DW1 = 0x61C, 600 ATR1_PCIE_WIN0_SRCADDR_PARAM = 0x620, 601 ATR1_PCIE_WIN0_SRC_ADDR = 0x624, 602 ATR1_PCIE_WIN0_TRSL_ADDR_LSB = 0x628, 603 ATR1_PCIE_WIN0_TRSL_ADDR_UDW = 0x62C, 604 ATR1_PCIE_WIN0_TRSL_PARAM = 0x630, 605 /* reserved */ 606 ATR1_PCIE_WIN0_TRSL_MASK_DW0 = 0x638, 607 ATR1_PCIE_WIN0_TRSL_MASK_DW1 = 0x63C, 608 ATR2_PCIE_WIN0_SRCADDR_PARAM = 0x640, 609 ATR2_PCIE_WIN0_SRC_ADDR = 0x644, 610 ATR2_PCIE_WIN0_TRSL_ADDR_LSB = 0x648, 611 ATR2_PCIE_WIN0_TRSL_ADDR_UDW = 0x64C, 612 ATR2_PCIE_WIN0_TRSL_PARAM = 0x650, 613 /* reserved */ 614 ATR2_PCIE_WIN0_TRSL_MASK_DW0 = 0x658, 615 ATR2_PCIE_WIN0_TRSL_MASK_DW1 = 0x65C, 616 ATR3_PCIE_WIN0_SRCADDR_PARAM = 0x660, 617 ATR3_PCIE_WIN0_SRC_ADDR = 0x664, 618 ATR3_PCIE_WIN0_TRSL_ADDR_LSB = 0x668, 619 ATR3_PCIE_WIN0_TRSL_ADDR_UDW = 0x66C, 620 ATR3_PCIE_WIN0_TRSL_PARAM = 0x670, 621 /* reserved */ 622 ATR3_PCIE_WIN0_TRSL_MASK_DW0 = 0x678, 623 ATR3_PCIE_WIN0_TRSL_MASK_DW1 = 0x67C, 624 ATR4_PCIE_WIN0_SRCADDR_PARAM = 0x680, 625 ATR4_PCIE_WIN0_SRC_ADDR = 0x684, 626 ATR4_PCIE_WIN0_TRSL_ADDR_LSB = 0x688, 627 ATR4_PCIE_WIN0_TRSL_ADDR_UDW = 0x68C, 628 ATR4_PCIE_WIN0_TRSL_PARAM = 0x690, 629 /* reserved */ 630 ATR4_PCIE_WIN0_TRSL_MASK_DW0 = 0x698, 631 ATR4_PCIE_WIN0_TRSL_MASK_DW1 = 0x69C, 632 ATR5_PCIE_WIN0_SRCADDR_PARAM = 0x6A0, 633 ATR5_PCIE_WIN0_SRC_ADDR = 0x6A4, 634 ATR5_PCIE_WIN0_TRSL_ADDR_LSB = 0x6A8, 635 ATR5_PCIE_WIN0_TRSL_ADDR_UDW = 0x6AC, 636 ATR5_PCIE_WIN0_TRSL_PARAM = 0x6B0, 637 /* reserved */ 638 ATR5_PCIE_WIN0_TRSL_MASK_DW0 = 0x6B8, 639 ATR5_PCIE_WIN0_TRSL_MASK_DW1 = 0x6BC, 640 ATR6_PCIE_WIN0_SRCADDR_PARAM = 0x6C0, 641 ATR6_PCIE_WIN0_SRC_ADDR = 0x6C4, 642 ATR6_PCIE_WIN0_TRSL_ADDR_LSB = 0x6C8, 643 ATR6_PCIE_WIN0_TRSL_ADDR_UDW = 0x6CC, 644 ATR6_PCIE_WIN0_TRSL_PARAM = 0x6D0, 645 /* reserved */ 646 ATR6_PCIE_WIN0_TRSL_MASK_DW0 = 0x6D8, 647 ATR6_PCIE_WIN0_TRSL_MASK_DW1 = 0x6DC, 648 ATR7_PCIE_WIN0_SRCADDR_PARAM = 0x6E0, 649 ATR7_PCIE_WIN0_SRC_ADDR = 0x6E4, 650 ATR7_PCIE_WIN0_TRSL_ADDR_LSB = 0x6E8, 651 ATR7_PCIE_WIN0_TRSL_ADDR_UDW = 0x6EC, 652 ATR7_PCIE_WIN0_TRSL_PARAM = 0x6F0, 653 /* reserved */ 654 ATR7_PCIE_WIN0_TRSL_MASK_DW0 = 0x6F8, 655 ATR7_PCIE_WIN0_TRSL_MASK_DW1 = 0x6FC, 656 657 ATR0_PCIE_WIN1_SRCADDR_PARAM = 0x700, 658 ATR0_PCIE_WIN1_SRC_ADDR = 0x704, 659 ATR0_PCIE_WIN1_TRSL_ADDR_LSB = 0x708, 660 ATR0_PCIE_WIN1_TRSL_ADDR_UDW = 0x70C, 661 ATR0_PCIE_WIN1_TRSL_PARAM = 0x710, 662 /* reserved */ 663 ATR0_PCIE_WIN1_TRSL_MASK_DW0 = 0x718, 664 ATR0_PCIE_WIN1_TRSL_MASK_DW1 = 0x71C, 665 ATR1_PCIE_WIN1_SRCADDR_PARAM = 0x720, 666 ATR1_PCIE_WIN1_SRC_ADDR = 0x724, 667 ATR1_PCIE_WIN1_TRSL_ADDR_LSB = 0x728, 668 ATR1_PCIE_WIN1_TRSL_ADDR_UDW = 0x72C, 669 ATR1_PCIE_WIN1_TRSL_PARAM = 0x730, 670 /* reserved */ 671 ATR1_PCIE_WIN1_TRSL_MASK_DW0 = 0x738, 672 ATR1_PCIE_WIN1_TRSL_MASK_DW1 = 0x73C, 673 ATR2_PCIE_WIN1_SRCADDR_PARAM = 0x740, 674 ATR2_PCIE_WIN1_SRC_ADDR = 0x744, 675 ATR2_PCIE_WIN1_TRSL_ADDR_LSB = 0x748, 676 ATR2_PCIE_WIN1_TRSL_ADDR_UDW = 0x74C, 677 ATR2_PCIE_WIN1_TRSL_PARAM = 0x750, 678 /* reserved */ 679 ATR2_PCIE_WIN1_TRSL_MASK_DW0 = 0x758, 680 ATR2_PCIE_WIN1_TRSL_MASK_DW1 = 0x75C, 681 ATR3_PCIE_WIN1_SRCADDR_PARAM = 0x760, 682 ATR3_PCIE_WIN1_SRC_ADDR = 0x764, 683 ATR3_PCIE_WIN1_TRSL_ADDR_LSB = 0x768, 684 ATR3_PCIE_WIN1_TRSL_ADDR_UDW = 0x76C, 685 ATR3_PCIE_WIN1_TRSL_PARAM = 0x770, 686 /* reserved */ 687 ATR3_PCIE_WIN1_TRSL_MASK_DW0 = 0x778, 688 ATR3_PCIE_WIN1_TRSL_MASK_DW1 = 0x77C, 689 ATR4_PCIE_WIN1_SRCADDR_PARAM = 0x780, 690 ATR4_PCIE_WIN1_SRC_ADDR = 0x784, 691 ATR4_PCIE_WIN1_TRSL_ADDR_LSB = 0x788, 692 ATR4_PCIE_WIN1_TRSL_ADDR_UDW = 0x78C, 693 ATR4_PCIE_WIN1_TRSL_PARAM = 0x790, 694 /* reserved */ 695 ATR4_PCIE_WIN1_TRSL_MASK_DW0 = 0x798, 696 ATR4_PCIE_WIN1_TRSL_MASK_DW1 = 0x79C, 697 ATR5_PCIE_WIN1_SRCADDR_PARAM = 0x7A0, 698 ATR5_PCIE_WIN1_SRC_ADDR = 0x7A4, 699 ATR5_PCIE_WIN1_TRSL_ADDR_LSB = 0x7A8, 700 ATR5_PCIE_WIN1_TRSL_ADDR_UDW = 0x7AC, 701 ATR5_PCIE_WIN1_TRSL_PARAM = 0x7B0, 702 /* reserved */ 703 ATR5_PCIE_WIN1_TRSL_MASK_DW0 = 0x7B8, 704 ATR5_PCIE_WIN1_TRSL_MASK_DW1 = 0x7BC, 705 ATR6_PCIE_WIN1_SRCADDR_PARAM = 0x7C0, 706 ATR6_PCIE_WIN1_SRC_ADDR = 0x7C4, 707 ATR6_PCIE_WIN1_TRSL_ADDR_LSB = 0x7C8, 708 ATR6_PCIE_WIN1_TRSL_ADDR_UDW = 0x7CC, 709 ATR6_PCIE_WIN1_TRSL_PARAM = 0x7D0, 710 /* reserved */ 711 ATR6_PCIE_WIN1_TRSL_MASK_DW0 = 0x7D8, 712 ATR6_PCIE_WIN1_TRSL_MASK_DW1 = 0x7DC, 713 ATR7_PCIE_WIN1_SRCADDR_PARAM = 0x7E0, 714 ATR7_PCIE_WIN1_SRC_ADDR = 0x7E4, 715 ATR7_PCIE_WIN1_TRSL_ADDR_LSB = 0x7E8, 716 ATR7_PCIE_WIN1_TRSL_ADDR_UDW = 0x7EC, 717 ATR7_PCIE_WIN1_TRSL_PARAM = 0x7F0, 718 /* reserved */ 719 ATR7_PCIE_WIN1_TRSL_MASK_DW0 = 0x7F8, 720 ATR7_PCIE_WIN1_TRSL_MASK_DW1 = 0x7FC, 721 722 ATR0_AXI4_SLV0_SRCADDR_PARAM = 0x800, 723 ATR0_AXI4_SLV0_SRC_ADDR = 0x804, 724 ATR0_AXI4_SLV0_TRSL_ADDR_LSB = 0x808, 725 ATR0_AXI4_SLV0_TRSL_ADDR_UDW = 0x80C, 726 ATR0_AXI4_SLV0_TRSL_PARAM = 0x810, 727 /* reserved */ 728 ATR0_AXI4_SLV0_TRSL_MASK_DW0 = 0x818, 729 ATR0_AXI4_SLV0_TRSL_MASK_DW1 = 0x81C, 730 ATR1_AXI4_SLV0_SRCADDR_PARAM = 0x820, 731 ATR1_AXI4_SLV0_SRC_ADDR = 0x824, 732 ATR1_AXI4_SLV0_TRSL_ADDR_LSB = 0x828, 733 ATR1_AXI4_SLV0_TRSL_ADDR_UDW = 0x82C, 734 ATR1_AXI4_SLV0_TRSL_PARAM = 0x830, 735 /* reserved */ 736 ATR1_AXI4_SLV0_TRSL_MASK_DW0 = 0x838, 737 ATR1_AXI4_SLV0_TRSL_MASK_DW1 = 0x83C, 738 ATR2_AXI4_SLV0_SRCADDR_PARAM = 0x840, 739 ATR2_AXI4_SLV0_SRC_ADDR = 0x844, 740 ATR2_AXI4_SLV0_TRSL_ADDR_LSB = 0x848, 741 ATR2_AXI4_SLV0_TRSL_ADDR_UDW = 0x84C, 742 ATR2_AXI4_SLV0_TRSL_PARAM = 0x850, 743 /* reserved */ 744 ATR2_AXI4_SLV0_TRSL_MASK_DW0 = 0x858, 745 ATR2_AXI4_SLV0_TRSL_MASK_DW1 = 0x85C, 746 ATR3_AXI4_SLV0_SRCADDR_PARAM = 0x860, 747 ATR3_AXI4_SLV0_SRC_ADDR = 0x864, 748 ATR3_AXI4_SLV0_TRSL_ADDR_LSB = 0x868, 749 ATR3_AXI4_SLV0_TRSL_ADDR_UDW = 0x86C, 750 ATR3_AXI4_SLV0_TRSL_PARAM = 0x870, 751 /* reserved */ 752 ATR3_AXI4_SLV0_TRSL_MASK_DW0 = 0x878, 753 ATR3_AXI4_SLV0_TRSL_MASK_DW1 = 0x87C, 754 ATR4_AXI4_SLV0_SRCADDR_PARAM = 0x880, 755 ATR4_AXI4_SLV0_SRC_ADDR = 0x884, 756 ATR4_AXI4_SLV0_TRSL_ADDR_LSB = 0x888, 757 ATR4_AXI4_SLV0_TRSL_ADDR_UDW = 0x88C, 758 ATR4_AXI4_SLV0_TRSL_PARAM = 0x890, 759 /* reserved */ 760 ATR4_AXI4_SLV0_TRSL_MASK_DW0 = 0x898, 761 ATR4_AXI4_SLV0_TRSL_MASK_DW1 = 0x89C, 762 ATR5_AXI4_SLV0_SRCADDR_PARAM = 0x8A0, 763 ATR5_AXI4_SLV0_SRC_ADDR = 0x8A4, 764 ATR5_AXI4_SLV0_TRSL_ADDR_LSB = 0x8A8, 765 ATR5_AXI4_SLV0_TRSL_ADDR_UDW = 0x8AC, 766 ATR5_AXI4_SLV0_TRSL_PARAM = 0x8B0, 767 /* reserved */ 768 ATR5_AXI4_SLV0_TRSL_MASK_DW0 = 0x8B8, 769 ATR5_AXI4_SLV0_TRSL_MASK_DW1 = 0x8BC, 770 ATR6_AXI4_SLV0_SRCADDR_PARAM = 0x8C0, 771 ATR6_AXI4_SLV0_SRC_ADDR = 0x8C4, 772 ATR6_AXI4_SLV0_TRSL_ADDR_LSB = 0x8C8, 773 ATR6_AXI4_SLV0_TRSL_ADDR_UDW = 0x8CC, 774 ATR6_AXI4_SLV0_TRSL_PARAM = 0x8D0, 775 /* reserved */ 776 ATR6_AXI4_SLV0_TRSL_MASK_DW0 = 0x8D8, 777 ATR6_AXI4_SLV0_TRSL_MASK_DW1 = 0x8DC, 778 ATR7_AXI4_SLV0_SRCADDR_PARAM = 0x8E0, 779 ATR7_AXI4_SLV0_SRC_ADDR = 0x8E4, 780 ATR7_AXI4_SLV0_TRSL_ADDR_LSB = 0x8E8, 781 ATR7_AXI4_SLV0_TRSL_ADDR_UDW = 0x8EC, 782 ATR7_AXI4_SLV0_TRSL_PARAM = 0x8F0, 783 /* reserved */ 784 ATR7_AXI4_SLV0_TRSL_MASK_DW0 = 0x8F8, 785 ATR7_AXI4_SLV0_TRSL_MASK_DW1 = 0x8FC, 786 787 /* PCIE Control Registers */ 788 SEC_ERROR_EVENT_CNT = 0x2020, 789 DED_ERROR_EVENT_CNT = 0x2024, 790 SEC_ERROR_INT = 0x2028, 791 SEC_ERROR_INT_MASK = 0x202C, // 0x220C according to the docs. A typo? 792 DED_ERROR_INT = 0x2030, 793 DED_ERROR_INT_MASK = 0x2034, 794 ECC_CONTROL = 0x2038, 795 ECC_ERR_LOC = 0x203C, 796 RAM_MARGIN_1 = 0x2040, 797 RAM_MARGIN_2 = 0x2044, 798 RAM_POWER_CONTROL = 0x2048, 799 /* reserved */ 800 DEBUG_SEL = 0x2050, 801 /* reserved */ 802 LTSSM_STATE = 0x205C, 803 PHY_COMMON_INTERFACE = 0x2060, 804 PL_TX_LANEIF_0 = 0x2064, 805 PL_RX_LANEIF_0 = 0x2068, 806 PL_WAKECLKREQ = 0x206C, 807 /* reserved */ 808 PCICONF_PCI_IDS_OVERRIDE = 0x2080, 809 PCICONF_PCI_IDS_31_0 = 0x2084, 810 PCICONF_PCI_IDS_63_32 = 0x2088, 811 PCICONF_PCI_IDS_95_64 = 0x208C, 812 /* reserved */ 813 PCIE_PEX_DEV_LINK_SPC2 = 0x20A0, 814 //PCIE_PEX_SPC = 0x20A4, <-- available in the header, but not in the docs. The same name occurs under 0xD4 815 /* reserved */ 816 PCIE_AXI_MASTER_ATR_CFG0 = 0x2100, 817 PCIE_AXI_MASTER_ATR_CFG1 = 0x2104, 818 PCIE_AXI_MASTER_ATR_CFG2 = 0x2108, 819 /* reserved */ 820 AXI_SLAVE_PCIE_ATR_CFG0 = 0x2120, 821 AXI_SLAVE_PCIE_ATR_CFG1 = 0x2124, 822 AXI_SLAVE_PCIE_ATR_CFG2 = 0x2128, 823 /* reserved */ 824 PCIE_BAR_01 = 0x2140, 825 PCIE_BAR_23 = 0x2144, 826 PCIE_BAR_45 = 0x2148, 827 PCIE_EVENT_INT = 0x214C, 828 } 829 } 830 }