| 140 | } |
| 141 | |
| 142 | static void |
| 143 | ntb_dev_intr_handler(void *param) |
| 144 | { |
| 145 | struct rte_rawdev *dev = (struct rte_rawdev *)param; |
| 146 | struct ntb_hw *hw = dev->dev_private; |
| 147 | uint32_t val_h, val_l; |
| 148 | uint64_t peer_mw_size; |
| 149 | uint64_t db_bits = 0; |
| 150 | uint8_t peer_mw_cnt; |
| 151 | int i = 0; |
| 152 | |
| 153 | if (hw->ntb_ops->db_read == NULL || |
| 154 | hw->ntb_ops->db_clear == NULL || |
| 155 | hw->ntb_ops->peer_db_set == NULL) { |
| 156 | NTB_LOG(ERR, "Doorbell is not supported."); |
| 157 | return; |
| 158 | } |
| 159 | |
| 160 | db_bits = (*hw->ntb_ops->db_read)(dev); |
| 161 | if (!db_bits) |
| 162 | NTB_LOG(ERR, "No doorbells"); |
| 163 | |
| 164 | /* Doorbell 0 is for peer device ready. */ |
| 165 | if (db_bits & 1) { |
| 166 | NTB_LOG(INFO, "DB0: Peer device is up."); |
| 167 | /* Clear received doorbell. */ |
| 168 | (*hw->ntb_ops->db_clear)(dev, 1); |
| 169 | |
| 170 | /** |
| 171 | * Peer dev is already up. All mw settings are already done. |
| 172 | * Skip them. |
| 173 | */ |
| 174 | if (hw->peer_dev_up) |
| 175 | return; |
| 176 | |
| 177 | if (hw->ntb_ops->spad_read == NULL) { |
| 178 | NTB_LOG(ERR, "Scratchpad read is not supported."); |
| 179 | return; |
| 180 | } |
| 181 | |
| 182 | /* Check if mw setting on the peer is the same as local. */ |
| 183 | peer_mw_cnt = (*hw->ntb_ops->spad_read)(dev, SPAD_NUM_MWS, 0); |
| 184 | if (peer_mw_cnt != hw->mw_cnt) { |
| 185 | NTB_LOG(ERR, "Both mw cnt must be the same."); |
| 186 | return; |
| 187 | } |
| 188 | |
| 189 | for (i = 0; i < hw->mw_cnt; i++) { |
| 190 | val_h = (*hw->ntb_ops->spad_read) |
| 191 | (dev, SPAD_MW0_SZ_H + 2 * i, 0); |
| 192 | val_l = (*hw->ntb_ops->spad_read) |
| 193 | (dev, SPAD_MW0_SZ_L + 2 * i, 0); |
| 194 | peer_mw_size = ((uint64_t)val_h << 32) | val_l; |
| 195 | NTB_LOG(DEBUG, "Peer %u mw size: 0x%"PRIx64"", i, |
| 196 | peer_mw_size); |
| 197 | if (peer_mw_size != hw->mw_size[i]) { |
| 198 | NTB_LOG(ERR, "Mw config must be the same."); |
| 199 | return; |
nothing calls this directly
no test coverage detected