53 if (core >= cvmx_octeon_num_cores())
63 field = (core & 0x3) * 8;
97 if (core >= cvmx_octeon_num_cores())
109 field = (core & 0x3) * 8;
116 switch (core & 0xC) {
180 pfctl.
s.cnt0rdclr = clear_on_read;
185 pfctl.
s.cnt1rdclr = clear_on_read;
190 pfctl.
s.cnt2rdclr = clear_on_read;
196 pfctl.
s.cnt3rdclr = clear_on_read;
205 cvmx_dprintf(
"L2C performance counter events are different for this chip, mapping 'event' to cvmx_l2c_tad_event_t\n");
207 cvmx_dprintf(
"L2C counters don't support clear on read for this chip\n");
213 l2c_tadx_prf.
s.cnt0sel =
event;
216 l2c_tadx_prf.
s.cnt1sel =
event;
219 l2c_tadx_prf.
s.cnt2sel =
event;
223 l2c_tadx_prf.
s.cnt3sel =
event;
295 addr &= ~CVMX_CACHE_LINE_MASK;
296 ptr = (
volatile char *)cvmx_phys_to_ptr(addr);
322 for (way = 0; way < assoc; way++) {
327 if (l2c_tadx_tag.
s.valid && l2c_tadx_tag.
s.tag == tag)
338 if (!l2c_tadx_tag.
s.lock) {
350 cvmx_spinlock_lock(&cvmx_l2c_spinlock);
358 l2t_err.
s.lckerr = 1;
359 l2t_err.
s.lckerr2 = 1;
362 addr &= ~CVMX_CACHE_LINE_MASK;
365 l2cdbg.
s.ppnum = cvmx_get_core_num();
370 lckoff.
s.lck_offset = 0;
376 uint64_t addr_tmp = addr ^ (addr & ((1 << alias_shift) - 1)) >> CVMX_L2_SET_BITS;
377 lckbase.
s.lck_base = addr_tmp >> 7;
379 lckbase.
s.lck_base = addr >> 7;
382 lckbase.
s.lck_ena = 1;
389 lckbase.
s.lck_ena = 0;
399 if (l2t_err.
s.lckerr || l2t_err.
s.lckerr2)
402 cvmx_spinlock_unlock(&cvmx_l2c_spinlock);
413 start &= ~CVMX_CACHE_LINE_MASK;
437 for (
set = 0;
set < n_set;
set++) {
438 for (assoc = 0; assoc < n_assoc; assoc++) {
440 (assoc << assoc_shift) | (
set << set_shift));
445 for (
set = 0;
set < n_set;
set++)
446 for (assoc = 0; assoc < n_assoc; assoc++)
472 if (tag.
s.V && (tag.
s.addr == tag_addr)) {
489 if (tag.
s.V && (tag.
s.addr == tag_addr)) {
500 int num_unlocked = 0;
503 start &= ~CVMX_CACHE_LINE_MASK;
594 debug_val.s.ppnum =
core;
596 debug_val.s.set = assoc;
620 "sd %[dbg_val], 0(%[dbg_addr])\n\t"
621 "ld $0, 0(%[dbg_addr])\n\t"
622 "ld %[tag_val], 0(%[tag_addr])\n\t"
623 "sd $0, 0(%[dbg_addr])\n\t"
624 "ld $0, 0(%[dbg_addr])\n\t"
627 : [tag_val]
"=r" (tag_val)
628 : [dbg_addr]
"r" (dbg_addr), [dbg_val]
"r" (debug_val), [tag_addr]
"r" (debug_tag_addr)
643 cvmx_dprintf(
"ERROR: cvmx_l2c_get_tag association out of range\n");
647 cvmx_dprintf(
"ERROR: cvmx_l2c_get_tag index out of range (arg: %d, max: %d)\n",
666 tag.
s.V = l2c_tadx_tag.
s.valid;
667 tag.
s.D = l2c_tadx_tag.
s.dirty;
668 tag.
s.L = l2c_tadx_tag.
s.lock;
669 tag.
s.U = l2c_tadx_tag.
s.use;
670 tag.
s.addr = l2c_tadx_tag.
s.tag;
674 tmp_tag = __read_l2_tag(association,
index);
681 tag.
s.V = tmp_tag.cn58xx.V;
682 tag.
s.D = tmp_tag.cn58xx.D;
683 tag.
s.L = tmp_tag.cn58xx.L;
684 tag.
s.U = tmp_tag.cn58xx.U;
685 tag.
s.addr = tmp_tag.cn58xx.addr;
687 tag.
s.V = tmp_tag.cn38xx.V;
688 tag.
s.D = tmp_tag.cn38xx.D;
689 tag.
s.L = tmp_tag.cn38xx.L;
690 tag.
s.U = tmp_tag.cn38xx.U;
691 tag.
s.addr = tmp_tag.cn38xx.addr;
693 tag.
s.V = tmp_tag.cn31xx.V;
694 tag.
s.D = tmp_tag.cn31xx.D;
695 tag.
s.L = tmp_tag.cn31xx.L;
696 tag.
s.U = tmp_tag.cn31xx.U;
697 tag.
s.addr = tmp_tag.cn31xx.addr;
699 tag.
s.V = tmp_tag.cn30xx.V;
700 tag.
s.D = tmp_tag.cn30xx.D;
701 tag.
s.L = tmp_tag.cn30xx.L;
702 tag.
s.U = tmp_tag.cn30xx.U;
703 tag.
s.addr = tmp_tag.cn30xx.addr;
705 tag.
s.V = tmp_tag.cn50xx.V;
706 tag.
s.D = tmp_tag.cn50xx.D;
707 tag.
s.L = tmp_tag.cn50xx.L;
708 tag.
s.U = tmp_tag.cn50xx.U;
709 tag.
s.addr = tmp_tag.cn50xx.addr;
711 cvmx_dprintf(
"Unsupported OCTEON Model in %s\n", __func__);
725 indxalias = !l2c_ctl.
s.disidxalias;
729 indxalias = l2c_cfg.
s.idxalias;
769 cvmx_dprintf(
"Unsupported OCTEON Model in %s\n", __func__);
797 cvmx_dprintf(
"Unsupported OCTEON Model in %s\n", __func__);
819 if (mio_fus_dat3.
s.l2c_crip == 3)
821 else if (mio_fus_dat3.
s.l2c_crip == 2)
823 else if (mio_fus_dat3.
s.l2c_crip == 1)
833 if ((val.
u64 >> 35) & 0x1)
834 l2_assoc = l2_assoc >> 2;
835 else if ((val.
u64 >> 34) & 0x1)
836 l2_assoc = l2_assoc >> 1;
853 cvmx_dprintf(
"ERROR: cvmx_l2c_flush_line index out of range.\n");
859 cvmx_dprintf(
"ERROR: cvmx_l2c_flush_line association out of range.\n");
879 l2cdbg.
s.ppnum = cvmx_get_core_num();
882 l2cdbg.
s.set = assoc;
883 cvmx_spinlock_lock(&cvmx_l2c_spinlock);
899 cvmx_spinlock_unlock(&cvmx_l2c_spinlock);