| .. | .. |
|---|
| 81 | 81 | } |
|---|
| 82 | 82 | |
|---|
| 83 | 83 | /** |
|---|
| 84 | | - * Debug routine to dump the packet structure to the console |
|---|
| 85 | | - * |
|---|
| 86 | | - * @work: Work queue entry containing the packet to dump |
|---|
| 87 | | - * Returns |
|---|
| 88 | | - */ |
|---|
| 89 | | -int cvmx_helper_dump_packet(cvmx_wqe_t *work) |
|---|
| 90 | | -{ |
|---|
| 91 | | - uint64_t count; |
|---|
| 92 | | - uint64_t remaining_bytes; |
|---|
| 93 | | - union cvmx_buf_ptr buffer_ptr; |
|---|
| 94 | | - uint64_t start_of_buffer; |
|---|
| 95 | | - uint8_t *data_address; |
|---|
| 96 | | - uint8_t *end_of_data; |
|---|
| 97 | | - |
|---|
| 98 | | - cvmx_dprintf("Packet Length: %u\n", work->word1.len); |
|---|
| 99 | | - cvmx_dprintf(" Input Port: %u\n", cvmx_wqe_get_port(work)); |
|---|
| 100 | | - cvmx_dprintf(" QoS: %u\n", cvmx_wqe_get_qos(work)); |
|---|
| 101 | | - cvmx_dprintf(" Buffers: %u\n", work->word2.s.bufs); |
|---|
| 102 | | - |
|---|
| 103 | | - if (work->word2.s.bufs == 0) { |
|---|
| 104 | | - union cvmx_ipd_wqe_fpa_queue wqe_pool; |
|---|
| 105 | | - wqe_pool.u64 = cvmx_read_csr(CVMX_IPD_WQE_FPA_QUEUE); |
|---|
| 106 | | - buffer_ptr.u64 = 0; |
|---|
| 107 | | - buffer_ptr.s.pool = wqe_pool.s.wqe_pool; |
|---|
| 108 | | - buffer_ptr.s.size = 128; |
|---|
| 109 | | - buffer_ptr.s.addr = cvmx_ptr_to_phys(work->packet_data); |
|---|
| 110 | | - if (likely(!work->word2.s.not_IP)) { |
|---|
| 111 | | - union cvmx_pip_ip_offset pip_ip_offset; |
|---|
| 112 | | - pip_ip_offset.u64 = cvmx_read_csr(CVMX_PIP_IP_OFFSET); |
|---|
| 113 | | - buffer_ptr.s.addr += |
|---|
| 114 | | - (pip_ip_offset.s.offset << 3) - |
|---|
| 115 | | - work->word2.s.ip_offset; |
|---|
| 116 | | - buffer_ptr.s.addr += (work->word2.s.is_v6 ^ 1) << 2; |
|---|
| 117 | | - } else { |
|---|
| 118 | | - /* |
|---|
| 119 | | - * WARNING: This code assumes that the packet |
|---|
| 120 | | - * is not RAW. If it was, we would use |
|---|
| 121 | | - * PIP_GBL_CFG[RAW_SHF] instead of |
|---|
| 122 | | - * PIP_GBL_CFG[NIP_SHF]. |
|---|
| 123 | | - */ |
|---|
| 124 | | - union cvmx_pip_gbl_cfg pip_gbl_cfg; |
|---|
| 125 | | - pip_gbl_cfg.u64 = cvmx_read_csr(CVMX_PIP_GBL_CFG); |
|---|
| 126 | | - buffer_ptr.s.addr += pip_gbl_cfg.s.nip_shf; |
|---|
| 127 | | - } |
|---|
| 128 | | - } else |
|---|
| 129 | | - buffer_ptr = work->packet_ptr; |
|---|
| 130 | | - remaining_bytes = work->word1.len; |
|---|
| 131 | | - |
|---|
| 132 | | - while (remaining_bytes) { |
|---|
| 133 | | - start_of_buffer = |
|---|
| 134 | | - ((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7; |
|---|
| 135 | | - cvmx_dprintf(" Buffer Start:%llx\n", |
|---|
| 136 | | - (unsigned long long)start_of_buffer); |
|---|
| 137 | | - cvmx_dprintf(" Buffer I : %u\n", buffer_ptr.s.i); |
|---|
| 138 | | - cvmx_dprintf(" Buffer Back: %u\n", buffer_ptr.s.back); |
|---|
| 139 | | - cvmx_dprintf(" Buffer Pool: %u\n", buffer_ptr.s.pool); |
|---|
| 140 | | - cvmx_dprintf(" Buffer Data: %llx\n", |
|---|
| 141 | | - (unsigned long long)buffer_ptr.s.addr); |
|---|
| 142 | | - cvmx_dprintf(" Buffer Size: %u\n", buffer_ptr.s.size); |
|---|
| 143 | | - |
|---|
| 144 | | - cvmx_dprintf("\t\t"); |
|---|
| 145 | | - data_address = (uint8_t *) cvmx_phys_to_ptr(buffer_ptr.s.addr); |
|---|
| 146 | | - end_of_data = data_address + buffer_ptr.s.size; |
|---|
| 147 | | - count = 0; |
|---|
| 148 | | - while (data_address < end_of_data) { |
|---|
| 149 | | - if (remaining_bytes == 0) |
|---|
| 150 | | - break; |
|---|
| 151 | | - else |
|---|
| 152 | | - remaining_bytes--; |
|---|
| 153 | | - cvmx_dprintf("%02x", (unsigned int)*data_address); |
|---|
| 154 | | - data_address++; |
|---|
| 155 | | - if (remaining_bytes && (count == 7)) { |
|---|
| 156 | | - cvmx_dprintf("\n\t\t"); |
|---|
| 157 | | - count = 0; |
|---|
| 158 | | - } else |
|---|
| 159 | | - count++; |
|---|
| 160 | | - } |
|---|
| 161 | | - cvmx_dprintf("\n"); |
|---|
| 162 | | - |
|---|
| 163 | | - if (remaining_bytes) |
|---|
| 164 | | - buffer_ptr = *(union cvmx_buf_ptr *) |
|---|
| 165 | | - cvmx_phys_to_ptr(buffer_ptr.s.addr - 8); |
|---|
| 166 | | - } |
|---|
| 167 | | - return 0; |
|---|
| 168 | | -} |
|---|
| 169 | | - |
|---|
| 170 | | -/** |
|---|
| 171 | 84 | * Setup Random Early Drop on a specific input queue |
|---|
| 172 | 85 | * |
|---|
| 173 | 86 | * @queue: Input queue to setup RED on (0-7) |
|---|
| .. | .. |
|---|
| 179 | 92 | * than this many free packet buffers in FPA 0. |
|---|
| 180 | 93 | * Returns Zero on success. Negative on failure |
|---|
| 181 | 94 | */ |
|---|
| 182 | | -int cvmx_helper_setup_red_queue(int queue, int pass_thresh, int drop_thresh) |
|---|
| 95 | +static int cvmx_helper_setup_red_queue(int queue, int pass_thresh, |
|---|
| 96 | + int drop_thresh) |
|---|
| 183 | 97 | { |
|---|
| 184 | 98 | union cvmx_ipd_qosx_red_marks red_marks; |
|---|
| 185 | 99 | union cvmx_ipd_red_quex_param red_param; |
|---|