cvmx-pcie.h revision 210284
1/***********************license start*************** 2 * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights 3 * reserved. 4 * 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * * Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 * 18 * * Neither the name of Cavium Networks nor the names of 19 * its contributors may be used to endorse or promote products 20 * derived from this software without specific prior written 21 * permission. 22 * 23 * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 24 * AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS 25 * OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH 26 * RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY 27 * REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT 28 * DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES 29 * OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR 30 * PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET 31 * POSSESSION OR CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT 32 * OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 33 * 34 * 35 * For any questions regarding licensing please contact marketing@caviumnetworks.com 36 * 37 ***********************license end**************************************/ 38 39 40 41 42 43 44/** 45 * @file 46 * 47 * Interface to PCIe as a host(RC) or target(EP) 48 * 49 * <hr>$Revision: 41586 $<hr> 50 */ 51 52#ifndef __CVMX_PCIE_H__ 53#define __CVMX_PCIE_H__ 54 55#ifdef __cplusplus 56extern "C" { 57#endif 58 59typedef union 60{ 61 uint64_t u64; 62 struct 63 { 64 uint64_t upper : 2; /* Normally 2 for XKPHYS */ 65 uint64_t reserved_49_61 : 13; /* Must be zero */ 66 uint64_t io : 1; /* 1 for IO space access */ 67 uint64_t did : 5; /* PCIe DID = 3 */ 68 uint64_t subdid : 3; /* PCIe SubDID = 1 */ 69 uint64_t reserved_36_39 : 4; /* Must be zero */ 70 uint64_t es : 2; /* Endian swap = 1 */ 71 uint64_t port : 2; /* PCIe port 0,1 */ 72 uint64_t reserved_29_31 : 3; /* Must be zero */ 73 uint64_t ty : 1; /* Selects the type of the configuration request (0 = type 0, 1 = type 1). */ 74 uint64_t bus : 8; /* Target bus number sent in the ID in the request. */ 75 uint64_t dev : 5; /* Target device number sent in the ID in the request. Note that Dev must be 76 zero for type 0 configuration requests. */ 77 uint64_t func : 3; /* Target function number sent in the ID in the request. */ 78 uint64_t reg : 12; /* Selects a register in the configuration space of the target. */ 79 } config; 80 struct 81 { 82 uint64_t upper : 2; /* Normally 2 for XKPHYS */ 83 uint64_t reserved_49_61 : 13; /* Must be zero */ 84 uint64_t io : 1; /* 1 for IO space access */ 85 uint64_t did : 5; /* PCIe DID = 3 */ 86 uint64_t subdid : 3; /* PCIe SubDID = 2 */ 87 uint64_t reserved_36_39 : 4; /* Must be zero */ 88 uint64_t es : 2; /* Endian swap = 1 */ 89 uint64_t port : 2; /* PCIe port 0,1 */ 90 uint64_t address : 32; /* PCIe IO address */ 91 } io; 92 struct 93 { 94 uint64_t upper : 2; /* Normally 2 for XKPHYS */ 95 uint64_t reserved_49_61 : 13; /* Must be zero */ 96 uint64_t io : 1; /* 1 for IO space access */ 97 uint64_t did : 5; /* PCIe DID = 3 */ 98 uint64_t subdid : 3; /* PCIe SubDID = 3-6 */ 99 uint64_t reserved_36_39 : 4; /* Must be zero */ 100 uint64_t address : 36; /* PCIe Mem address */ 101 } mem; 102} cvmx_pcie_address_t; 103 104 105/** 106 * Return the Core virtual base address for PCIe IO access. IOs are 107 * read/written as an offset from this address. 108 * 109 * @param pcie_port PCIe port the IO is for 110 * 111 * @return 64bit Octeon IO base address for read/write 112 */ 113uint64_t cvmx_pcie_get_io_base_address(int pcie_port); 114 115/** 116 * Size of the IO address region returned at address 117 * cvmx_pcie_get_io_base_address() 118 * 119 * @param pcie_port PCIe port the IO is for 120 * 121 * @return Size of the IO window 122 */ 123uint64_t cvmx_pcie_get_io_size(int pcie_port); 124 125/** 126 * Return the Core virtual base address for PCIe MEM access. Memory is 127 * read/written as an offset from this address. 128 * 129 * @param pcie_port PCIe port the IO is for 130 * 131 * @return 64bit Octeon IO base address for read/write 132 */ 133uint64_t cvmx_pcie_get_mem_base_address(int pcie_port); 134 135/** 136 * Size of the Mem address region returned at address 137 * cvmx_pcie_get_mem_base_address() 138 * 139 * @param pcie_port PCIe port the IO is for 140 * 141 * @return Size of the Mem window 142 */ 143uint64_t cvmx_pcie_get_mem_size(int pcie_port); 144 145/** 146 * Initialize a PCIe port for use in host(RC) mode. It doesn't enumerate the bus. 147 * 148 * @param pcie_port PCIe port to initialize 149 * 150 * @return Zero on success 151 */ 152int cvmx_pcie_rc_initialize(int pcie_port); 153 154/** 155 * Shutdown a PCIe port and put it in reset 156 * 157 * @param pcie_port PCIe port to shutdown 158 * 159 * @return Zero on success 160 */ 161int cvmx_pcie_rc_shutdown(int pcie_port); 162 163/** 164 * Read 8bits from a Device's config space 165 * 166 * @param pcie_port PCIe port the device is on 167 * @param bus Sub bus 168 * @param dev Device ID 169 * @param fn Device sub function 170 * @param reg Register to access 171 * 172 * @return Result of the read 173 */ 174uint8_t cvmx_pcie_config_read8(int pcie_port, int bus, int dev, int fn, int reg); 175 176/** 177 * Read 16bits from a Device's config space 178 * 179 * @param pcie_port PCIe port the device is on 180 * @param bus Sub bus 181 * @param dev Device ID 182 * @param fn Device sub function 183 * @param reg Register to access 184 * 185 * @return Result of the read 186 */ 187uint16_t cvmx_pcie_config_read16(int pcie_port, int bus, int dev, int fn, int reg); 188 189/** 190 * Read 32bits from a Device's config space 191 * 192 * @param pcie_port PCIe port the device is on 193 * @param bus Sub bus 194 * @param dev Device ID 195 * @param fn Device sub function 196 * @param reg Register to access 197 * 198 * @return Result of the read 199 */ 200uint32_t cvmx_pcie_config_read32(int pcie_port, int bus, int dev, int fn, int reg); 201 202/** 203 * Write 8bits to a Device's config space 204 * 205 * @param pcie_port PCIe port the device is on 206 * @param bus Sub bus 207 * @param dev Device ID 208 * @param fn Device sub function 209 * @param reg Register to access 210 * @param val Value to write 211 */ 212void cvmx_pcie_config_write8(int pcie_port, int bus, int dev, int fn, int reg, uint8_t val); 213 214/** 215 * Write 16bits to a Device's config space 216 * 217 * @param pcie_port PCIe port the device is on 218 * @param bus Sub bus 219 * @param dev Device ID 220 * @param fn Device sub function 221 * @param reg Register to access 222 * @param val Value to write 223 */ 224void cvmx_pcie_config_write16(int pcie_port, int bus, int dev, int fn, int reg, uint16_t val); 225 226/** 227 * Write 32bits to a Device's config space 228 * 229 * @param pcie_port PCIe port the device is on 230 * @param bus Sub bus 231 * @param dev Device ID 232 * @param fn Device sub function 233 * @param reg Register to access 234 * @param val Value to write 235 */ 236void cvmx_pcie_config_write32(int pcie_port, int bus, int dev, int fn, int reg, uint32_t val); 237 238/** 239 * Read a PCIe config space register indirectly. This is used for 240 * registers of the form PCIEEP_CFG??? and PCIERC?_CFG???. 241 * 242 * @param pcie_port PCIe port to read from 243 * @param cfg_offset Address to read 244 * 245 * @return Value read 246 */ 247uint32_t cvmx_pcie_cfgx_read(int pcie_port, uint32_t cfg_offset); 248 249/** 250 * Write a PCIe config space register indirectly. This is used for 251 * registers of the form PCIEEP_CFG??? and PCIERC?_CFG???. 252 * 253 * @param pcie_port PCIe port to write to 254 * @param cfg_offset Address to write 255 * @param val Value to write 256 */ 257void cvmx_pcie_cfgx_write(int pcie_port, uint32_t cfg_offset, uint32_t val); 258 259/** 260 * Write a 32bit value to the Octeon NPEI register space 261 * 262 * @param address Address to write to 263 * @param val Value to write 264 */ 265static inline void cvmx_pcie_npei_write32(uint64_t address, uint32_t val) 266{ 267 cvmx_write64_uint32(address ^ 4, val); 268 cvmx_read64_uint32(address ^ 4); 269} 270 271/** 272 * Read a 32bit value from the Octeon NPEI register space 273 * 274 * @param address Address to read 275 * @return The result 276 */ 277static inline uint32_t cvmx_pcie_npei_read32(uint64_t address) 278{ 279 return cvmx_read64_uint32(address ^ 4); 280} 281 282/** 283 * Initialize a PCIe port for use in target(EP) mode. 284 * 285 * @return Zero on success 286 */ 287int cvmx_pcie_ep_initialize(void); 288 289/** 290 * Wait for posted PCIe read/writes to reach the other side of 291 * the internal PCIe switch. This will insure that core 292 * read/writes are posted before anything after this function 293 * is called. This may be necessary when writing to memory that 294 * will later be read using the DMA/PKT engines. 295 * 296 * @param pcie_port PCIe port to wait for 297 */ 298void cvmx_pcie_wait_for_pending(int pcie_port); 299 300#ifdef __cplusplus 301} 302#endif 303 304#endif 305