0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #ifndef __CVMX_L2C_H__
0034 #define __CVMX_L2C_H__
0035
0036 #include <uapi/asm/bitfield.h>
0037
0038 #define CVMX_L2_ASSOC cvmx_l2c_get_num_assoc()
0039 #define CVMX_L2_SET_BITS cvmx_l2c_get_set_bits()
0040 #define CVMX_L2_SETS cvmx_l2c_get_num_sets()
0041
0042
0043 #define CVMX_L2C_IDX_ADDR_SHIFT 7
0044 #define CVMX_L2C_IDX_MASK (cvmx_l2c_get_num_sets() - 1)
0045
0046
0047 #define CVMX_L2C_TAG_ADDR_ALIAS_SHIFT (CVMX_L2C_IDX_ADDR_SHIFT + \
0048 cvmx_l2c_get_set_bits())
0049 #define CVMX_L2C_ALIAS_MASK (CVMX_L2C_IDX_MASK << CVMX_L2C_TAG_ADDR_ALIAS_SHIFT)
0050 #define CVMX_L2C_MEMBANK_SELECT_SIZE 4096
0051
0052
0053 #define CVMX_L2C_TADS 1
0054
0055 union cvmx_l2c_tag {
0056 uint64_t u64;
0057 struct {
0058 __BITFIELD_FIELD(uint64_t reserved:28,
0059 __BITFIELD_FIELD(uint64_t V:1,
0060 __BITFIELD_FIELD(uint64_t D:1,
0061 __BITFIELD_FIELD(uint64_t L:1,
0062 __BITFIELD_FIELD(uint64_t U:1,
0063 __BITFIELD_FIELD(uint64_t addr:32,
0064 ;))))))
0065 } s;
0066 };
0067
0068
0069 enum cvmx_l2c_event {
0070 CVMX_L2C_EVENT_CYCLES = 0,
0071 CVMX_L2C_EVENT_INSTRUCTION_MISS = 1,
0072 CVMX_L2C_EVENT_INSTRUCTION_HIT = 2,
0073 CVMX_L2C_EVENT_DATA_MISS = 3,
0074 CVMX_L2C_EVENT_DATA_HIT = 4,
0075 CVMX_L2C_EVENT_MISS = 5,
0076 CVMX_L2C_EVENT_HIT = 6,
0077 CVMX_L2C_EVENT_VICTIM_HIT = 7,
0078 CVMX_L2C_EVENT_INDEX_CONFLICT = 8,
0079 CVMX_L2C_EVENT_TAG_PROBE = 9,
0080 CVMX_L2C_EVENT_TAG_UPDATE = 10,
0081 CVMX_L2C_EVENT_TAG_COMPLETE = 11,
0082 CVMX_L2C_EVENT_TAG_DIRTY = 12,
0083 CVMX_L2C_EVENT_DATA_STORE_NOP = 13,
0084 CVMX_L2C_EVENT_DATA_STORE_READ = 14,
0085 CVMX_L2C_EVENT_DATA_STORE_WRITE = 15,
0086 CVMX_L2C_EVENT_FILL_DATA_VALID = 16,
0087 CVMX_L2C_EVENT_WRITE_REQUEST = 17,
0088 CVMX_L2C_EVENT_READ_REQUEST = 18,
0089 CVMX_L2C_EVENT_WRITE_DATA_VALID = 19,
0090 CVMX_L2C_EVENT_XMC_NOP = 20,
0091 CVMX_L2C_EVENT_XMC_LDT = 21,
0092 CVMX_L2C_EVENT_XMC_LDI = 22,
0093 CVMX_L2C_EVENT_XMC_LDD = 23,
0094 CVMX_L2C_EVENT_XMC_STF = 24,
0095 CVMX_L2C_EVENT_XMC_STT = 25,
0096 CVMX_L2C_EVENT_XMC_STP = 26,
0097 CVMX_L2C_EVENT_XMC_STC = 27,
0098 CVMX_L2C_EVENT_XMC_DWB = 28,
0099 CVMX_L2C_EVENT_XMC_PL2 = 29,
0100 CVMX_L2C_EVENT_XMC_PSL1 = 30,
0101 CVMX_L2C_EVENT_XMC_IOBLD = 31,
0102 CVMX_L2C_EVENT_XMC_IOBST = 32,
0103 CVMX_L2C_EVENT_XMC_IOBDMA = 33,
0104 CVMX_L2C_EVENT_XMC_IOBRSP = 34,
0105 CVMX_L2C_EVENT_XMC_BUS_VALID = 35,
0106 CVMX_L2C_EVENT_XMC_MEM_DATA = 36,
0107 CVMX_L2C_EVENT_XMC_REFL_DATA = 37,
0108 CVMX_L2C_EVENT_XMC_IOBRSP_DATA = 38,
0109 CVMX_L2C_EVENT_RSC_NOP = 39,
0110 CVMX_L2C_EVENT_RSC_STDN = 40,
0111 CVMX_L2C_EVENT_RSC_FILL = 41,
0112 CVMX_L2C_EVENT_RSC_REFL = 42,
0113 CVMX_L2C_EVENT_RSC_STIN = 43,
0114 CVMX_L2C_EVENT_RSC_SCIN = 44,
0115 CVMX_L2C_EVENT_RSC_SCFL = 45,
0116 CVMX_L2C_EVENT_RSC_SCDN = 46,
0117 CVMX_L2C_EVENT_RSC_DATA_VALID = 47,
0118 CVMX_L2C_EVENT_RSC_VALID_FILL = 48,
0119 CVMX_L2C_EVENT_RSC_VALID_STRSP = 49,
0120 CVMX_L2C_EVENT_RSC_VALID_REFL = 50,
0121 CVMX_L2C_EVENT_LRF_REQ = 51,
0122 CVMX_L2C_EVENT_DT_RD_ALLOC = 52,
0123 CVMX_L2C_EVENT_DT_WR_INVAL = 53,
0124 CVMX_L2C_EVENT_MAX
0125 };
0126
0127
0128 enum cvmx_l2c_tad_event {
0129 CVMX_L2C_TAD_EVENT_NONE = 0,
0130 CVMX_L2C_TAD_EVENT_TAG_HIT = 1,
0131 CVMX_L2C_TAD_EVENT_TAG_MISS = 2,
0132 CVMX_L2C_TAD_EVENT_TAG_NOALLOC = 3,
0133 CVMX_L2C_TAD_EVENT_TAG_VICTIM = 4,
0134 CVMX_L2C_TAD_EVENT_SC_FAIL = 5,
0135 CVMX_L2C_TAD_EVENT_SC_PASS = 6,
0136 CVMX_L2C_TAD_EVENT_LFB_VALID = 7,
0137 CVMX_L2C_TAD_EVENT_LFB_WAIT_LFB = 8,
0138 CVMX_L2C_TAD_EVENT_LFB_WAIT_VAB = 9,
0139 CVMX_L2C_TAD_EVENT_QUAD0_INDEX = 128,
0140 CVMX_L2C_TAD_EVENT_QUAD0_READ = 129,
0141 CVMX_L2C_TAD_EVENT_QUAD0_BANK = 130,
0142 CVMX_L2C_TAD_EVENT_QUAD0_WDAT = 131,
0143 CVMX_L2C_TAD_EVENT_QUAD1_INDEX = 144,
0144 CVMX_L2C_TAD_EVENT_QUAD1_READ = 145,
0145 CVMX_L2C_TAD_EVENT_QUAD1_BANK = 146,
0146 CVMX_L2C_TAD_EVENT_QUAD1_WDAT = 147,
0147 CVMX_L2C_TAD_EVENT_QUAD2_INDEX = 160,
0148 CVMX_L2C_TAD_EVENT_QUAD2_READ = 161,
0149 CVMX_L2C_TAD_EVENT_QUAD2_BANK = 162,
0150 CVMX_L2C_TAD_EVENT_QUAD2_WDAT = 163,
0151 CVMX_L2C_TAD_EVENT_QUAD3_INDEX = 176,
0152 CVMX_L2C_TAD_EVENT_QUAD3_READ = 177,
0153 CVMX_L2C_TAD_EVENT_QUAD3_BANK = 178,
0154 CVMX_L2C_TAD_EVENT_QUAD3_WDAT = 179,
0155 CVMX_L2C_TAD_EVENT_MAX
0156 };
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 void cvmx_l2c_config_perf(uint32_t counter, enum cvmx_l2c_event event,
0170 uint32_t clear_on_read);
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180 uint64_t cvmx_l2c_read_perf(uint32_t counter);
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191 int cvmx_l2c_get_core_way_partition(uint32_t core);
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209 int cvmx_l2c_set_core_way_partition(uint32_t core, uint32_t mask);
0210
0211
0212
0213
0214
0215
0216
0217
0218 int cvmx_l2c_get_hw_way_partition(void);
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235 int cvmx_l2c_set_hw_way_partition(uint32_t mask);
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246 int cvmx_l2c_lock_line(uint64_t addr);
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 int cvmx_l2c_lock_mem_region(uint64_t start, uint64_t len);
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278 int cvmx_l2c_unlock_line(uint64_t address);
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288 int cvmx_l2c_unlock_mem_region(uint64_t start, uint64_t len);
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299 union cvmx_l2c_tag cvmx_l2c_get_tag(uint32_t association, uint32_t index);
0300
0301
0302 static inline union cvmx_l2c_tag cvmx_get_l2c_tag(uint32_t association,
0303 uint32_t index)
0304 __attribute__((deprecated));
0305 static inline union cvmx_l2c_tag cvmx_get_l2c_tag(uint32_t association,
0306 uint32_t index)
0307 {
0308 return cvmx_l2c_get_tag(association, index);
0309 }
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319 uint32_t cvmx_l2c_address_to_index(uint64_t addr);
0320
0321
0322
0323
0324
0325
0326 void cvmx_l2c_flush(void);
0327
0328
0329
0330
0331
0332
0333 int cvmx_l2c_get_cache_size_bytes(void);
0334
0335
0336
0337
0338
0339
0340 int cvmx_l2c_get_num_sets(void);
0341
0342
0343
0344
0345
0346 int cvmx_l2c_get_set_bits(void);
0347
0348
0349
0350
0351
0352 int cvmx_l2c_get_num_assoc(void);
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362 void cvmx_l2c_flush_line(uint32_t assoc, uint32_t index);
0363
0364 #endif