ce.c (57186B)
1// SPDX-License-Identifier: ISC 2/* 3 * Copyright (c) 2005-2011 Atheros Communications Inc. 4 * Copyright (c) 2011-2017 Qualcomm Atheros, Inc. 5 * Copyright (c) 2018 The Linux Foundation. All rights reserved. 6 */ 7 8#include "hif.h" 9#include "ce.h" 10#include "debug.h" 11 12/* 13 * Support for Copy Engine hardware, which is mainly used for 14 * communication between Host and Target over a PCIe interconnect. 15 */ 16 17/* 18 * A single CopyEngine (CE) comprises two "rings": 19 * a source ring 20 * a destination ring 21 * 22 * Each ring consists of a number of descriptors which specify 23 * an address, length, and meta-data. 24 * 25 * Typically, one side of the PCIe/AHB/SNOC interconnect (Host or Target) 26 * controls one ring and the other side controls the other ring. 27 * The source side chooses when to initiate a transfer and it 28 * chooses what to send (buffer address, length). The destination 29 * side keeps a supply of "anonymous receive buffers" available and 30 * it handles incoming data as it arrives (when the destination 31 * receives an interrupt). 32 * 33 * The sender may send a simple buffer (address/length) or it may 34 * send a small list of buffers. When a small list is sent, hardware 35 * "gathers" these and they end up in a single destination buffer 36 * with a single interrupt. 37 * 38 * There are several "contexts" managed by this layer -- more, it 39 * may seem -- than should be needed. These are provided mainly for 40 * maximum flexibility and especially to facilitate a simpler HIF 41 * implementation. There are per-CopyEngine recv, send, and watermark 42 * contexts. These are supplied by the caller when a recv, send, 43 * or watermark handler is established and they are echoed back to 44 * the caller when the respective callbacks are invoked. There is 45 * also a per-transfer context supplied by the caller when a buffer 46 * (or sendlist) is sent and when a buffer is enqueued for recv. 47 * These per-transfer contexts are echoed back to the caller when 48 * the buffer is sent/received. 49 */ 50 51static inline u32 shadow_sr_wr_ind_addr(struct ath10k *ar, 52 struct ath10k_ce_pipe *ce_state) 53{ 54 u32 ce_id = ce_state->id; 55 u32 addr = 0; 56 57 switch (ce_id) { 58 case 0: 59 addr = 0x00032000; 60 break; 61 case 3: 62 addr = 0x0003200C; 63 break; 64 case 4: 65 addr = 0x00032010; 66 break; 67 case 5: 68 addr = 0x00032014; 69 break; 70 case 7: 71 addr = 0x0003201C; 72 break; 73 default: 74 ath10k_warn(ar, "invalid CE id: %d", ce_id); 75 break; 76 } 77 return addr; 78} 79 80static inline u32 shadow_dst_wr_ind_addr(struct ath10k *ar, 81 struct ath10k_ce_pipe *ce_state) 82{ 83 u32 ce_id = ce_state->id; 84 u32 addr = 0; 85 86 switch (ce_id) { 87 case 1: 88 addr = 0x00032034; 89 break; 90 case 2: 91 addr = 0x00032038; 92 break; 93 case 5: 94 addr = 0x00032044; 95 break; 96 case 7: 97 addr = 0x0003204C; 98 break; 99 case 8: 100 addr = 0x00032050; 101 break; 102 case 9: 103 addr = 0x00032054; 104 break; 105 case 10: 106 addr = 0x00032058; 107 break; 108 case 11: 109 addr = 0x0003205C; 110 break; 111 default: 112 ath10k_warn(ar, "invalid CE id: %d", ce_id); 113 break; 114 } 115 116 return addr; 117} 118 119static inline unsigned int 120ath10k_set_ring_byte(unsigned int offset, 121 struct ath10k_hw_ce_regs_addr_map *addr_map) 122{ 123 return ((offset << addr_map->lsb) & addr_map->mask); 124} 125 126static inline unsigned int 127ath10k_get_ring_byte(unsigned int offset, 128 struct ath10k_hw_ce_regs_addr_map *addr_map) 129{ 130 return ((offset & addr_map->mask) >> (addr_map->lsb)); 131} 132 133static inline u32 ath10k_ce_read32(struct ath10k *ar, u32 offset) 134{ 135 struct ath10k_ce *ce = ath10k_ce_priv(ar); 136 137 return ce->bus_ops->read32(ar, offset); 138} 139 140static inline void ath10k_ce_write32(struct ath10k *ar, u32 offset, u32 value) 141{ 142 struct ath10k_ce *ce = ath10k_ce_priv(ar); 143 144 ce->bus_ops->write32(ar, offset, value); 145} 146 147static inline void ath10k_ce_dest_ring_write_index_set(struct ath10k *ar, 148 u32 ce_ctrl_addr, 149 unsigned int n) 150{ 151 ath10k_ce_write32(ar, ce_ctrl_addr + 152 ar->hw_ce_regs->dst_wr_index_addr, n); 153} 154 155static inline u32 ath10k_ce_dest_ring_write_index_get(struct ath10k *ar, 156 u32 ce_ctrl_addr) 157{ 158 return ath10k_ce_read32(ar, ce_ctrl_addr + 159 ar->hw_ce_regs->dst_wr_index_addr); 160} 161 162static inline void ath10k_ce_src_ring_write_index_set(struct ath10k *ar, 163 u32 ce_ctrl_addr, 164 unsigned int n) 165{ 166 ath10k_ce_write32(ar, ce_ctrl_addr + 167 ar->hw_ce_regs->sr_wr_index_addr, n); 168} 169 170static inline u32 ath10k_ce_src_ring_write_index_get(struct ath10k *ar, 171 u32 ce_ctrl_addr) 172{ 173 return ath10k_ce_read32(ar, ce_ctrl_addr + 174 ar->hw_ce_regs->sr_wr_index_addr); 175} 176 177static inline u32 ath10k_ce_src_ring_read_index_from_ddr(struct ath10k *ar, 178 u32 ce_id) 179{ 180 struct ath10k_ce *ce = ath10k_ce_priv(ar); 181 182 return ce->vaddr_rri[ce_id] & CE_DDR_RRI_MASK; 183} 184 185static inline u32 ath10k_ce_src_ring_read_index_get(struct ath10k *ar, 186 u32 ce_ctrl_addr) 187{ 188 struct ath10k_ce *ce = ath10k_ce_priv(ar); 189 u32 ce_id = COPY_ENGINE_ID(ce_ctrl_addr); 190 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 191 u32 index; 192 193 if (ar->hw_params.rri_on_ddr && 194 (ce_state->attr_flags & CE_ATTR_DIS_INTR)) 195 index = ath10k_ce_src_ring_read_index_from_ddr(ar, ce_id); 196 else 197 index = ath10k_ce_read32(ar, ce_ctrl_addr + 198 ar->hw_ce_regs->current_srri_addr); 199 200 return index; 201} 202 203static inline void 204ath10k_ce_shadow_src_ring_write_index_set(struct ath10k *ar, 205 struct ath10k_ce_pipe *ce_state, 206 unsigned int value) 207{ 208 ath10k_ce_write32(ar, shadow_sr_wr_ind_addr(ar, ce_state), value); 209} 210 211static inline void 212ath10k_ce_shadow_dest_ring_write_index_set(struct ath10k *ar, 213 struct ath10k_ce_pipe *ce_state, 214 unsigned int value) 215{ 216 ath10k_ce_write32(ar, shadow_dst_wr_ind_addr(ar, ce_state), value); 217} 218 219static inline void ath10k_ce_src_ring_base_addr_set(struct ath10k *ar, 220 u32 ce_id, 221 u64 addr) 222{ 223 struct ath10k_ce *ce = ath10k_ce_priv(ar); 224 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 225 u32 ce_ctrl_addr = ath10k_ce_base_address(ar, ce_id); 226 u32 addr_lo = lower_32_bits(addr); 227 228 ath10k_ce_write32(ar, ce_ctrl_addr + 229 ar->hw_ce_regs->sr_base_addr_lo, addr_lo); 230 231 if (ce_state->ops->ce_set_src_ring_base_addr_hi) { 232 ce_state->ops->ce_set_src_ring_base_addr_hi(ar, ce_ctrl_addr, 233 addr); 234 } 235} 236 237static void ath10k_ce_set_src_ring_base_addr_hi(struct ath10k *ar, 238 u32 ce_ctrl_addr, 239 u64 addr) 240{ 241 u32 addr_hi = upper_32_bits(addr) & CE_DESC_ADDR_HI_MASK; 242 243 ath10k_ce_write32(ar, ce_ctrl_addr + 244 ar->hw_ce_regs->sr_base_addr_hi, addr_hi); 245} 246 247static inline void ath10k_ce_src_ring_size_set(struct ath10k *ar, 248 u32 ce_ctrl_addr, 249 unsigned int n) 250{ 251 ath10k_ce_write32(ar, ce_ctrl_addr + 252 ar->hw_ce_regs->sr_size_addr, n); 253} 254 255static inline void ath10k_ce_src_ring_dmax_set(struct ath10k *ar, 256 u32 ce_ctrl_addr, 257 unsigned int n) 258{ 259 struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs; 260 261 u32 ctrl1_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 262 ctrl_regs->addr); 263 264 ath10k_ce_write32(ar, ce_ctrl_addr + ctrl_regs->addr, 265 (ctrl1_addr & ~(ctrl_regs->dmax->mask)) | 266 ath10k_set_ring_byte(n, ctrl_regs->dmax)); 267} 268 269static inline void ath10k_ce_src_ring_byte_swap_set(struct ath10k *ar, 270 u32 ce_ctrl_addr, 271 unsigned int n) 272{ 273 struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs; 274 275 u32 ctrl1_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 276 ctrl_regs->addr); 277 278 ath10k_ce_write32(ar, ce_ctrl_addr + ctrl_regs->addr, 279 (ctrl1_addr & ~(ctrl_regs->src_ring->mask)) | 280 ath10k_set_ring_byte(n, ctrl_regs->src_ring)); 281} 282 283static inline void ath10k_ce_dest_ring_byte_swap_set(struct ath10k *ar, 284 u32 ce_ctrl_addr, 285 unsigned int n) 286{ 287 struct ath10k_hw_ce_ctrl1 *ctrl_regs = ar->hw_ce_regs->ctrl1_regs; 288 289 u32 ctrl1_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 290 ctrl_regs->addr); 291 292 ath10k_ce_write32(ar, ce_ctrl_addr + ctrl_regs->addr, 293 (ctrl1_addr & ~(ctrl_regs->dst_ring->mask)) | 294 ath10k_set_ring_byte(n, ctrl_regs->dst_ring)); 295} 296 297static inline 298 u32 ath10k_ce_dest_ring_read_index_from_ddr(struct ath10k *ar, u32 ce_id) 299{ 300 struct ath10k_ce *ce = ath10k_ce_priv(ar); 301 302 return (ce->vaddr_rri[ce_id] >> CE_DDR_DRRI_SHIFT) & 303 CE_DDR_RRI_MASK; 304} 305 306static inline u32 ath10k_ce_dest_ring_read_index_get(struct ath10k *ar, 307 u32 ce_ctrl_addr) 308{ 309 struct ath10k_ce *ce = ath10k_ce_priv(ar); 310 u32 ce_id = COPY_ENGINE_ID(ce_ctrl_addr); 311 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 312 u32 index; 313 314 if (ar->hw_params.rri_on_ddr && 315 (ce_state->attr_flags & CE_ATTR_DIS_INTR)) 316 index = ath10k_ce_dest_ring_read_index_from_ddr(ar, ce_id); 317 else 318 index = ath10k_ce_read32(ar, ce_ctrl_addr + 319 ar->hw_ce_regs->current_drri_addr); 320 321 return index; 322} 323 324static inline void ath10k_ce_dest_ring_base_addr_set(struct ath10k *ar, 325 u32 ce_id, 326 u64 addr) 327{ 328 struct ath10k_ce *ce = ath10k_ce_priv(ar); 329 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 330 u32 ce_ctrl_addr = ath10k_ce_base_address(ar, ce_id); 331 u32 addr_lo = lower_32_bits(addr); 332 333 ath10k_ce_write32(ar, ce_ctrl_addr + 334 ar->hw_ce_regs->dr_base_addr_lo, addr_lo); 335 336 if (ce_state->ops->ce_set_dest_ring_base_addr_hi) { 337 ce_state->ops->ce_set_dest_ring_base_addr_hi(ar, ce_ctrl_addr, 338 addr); 339 } 340} 341 342static void ath10k_ce_set_dest_ring_base_addr_hi(struct ath10k *ar, 343 u32 ce_ctrl_addr, 344 u64 addr) 345{ 346 u32 addr_hi = upper_32_bits(addr) & CE_DESC_ADDR_HI_MASK; 347 u32 reg_value; 348 349 reg_value = ath10k_ce_read32(ar, ce_ctrl_addr + 350 ar->hw_ce_regs->dr_base_addr_hi); 351 reg_value &= ~CE_DESC_ADDR_HI_MASK; 352 reg_value |= addr_hi; 353 ath10k_ce_write32(ar, ce_ctrl_addr + 354 ar->hw_ce_regs->dr_base_addr_hi, reg_value); 355} 356 357static inline void ath10k_ce_dest_ring_size_set(struct ath10k *ar, 358 u32 ce_ctrl_addr, 359 unsigned int n) 360{ 361 ath10k_ce_write32(ar, ce_ctrl_addr + 362 ar->hw_ce_regs->dr_size_addr, n); 363} 364 365static inline void ath10k_ce_src_ring_highmark_set(struct ath10k *ar, 366 u32 ce_ctrl_addr, 367 unsigned int n) 368{ 369 struct ath10k_hw_ce_dst_src_wm_regs *srcr_wm = ar->hw_ce_regs->wm_srcr; 370 u32 addr = ath10k_ce_read32(ar, ce_ctrl_addr + srcr_wm->addr); 371 372 ath10k_ce_write32(ar, ce_ctrl_addr + srcr_wm->addr, 373 (addr & ~(srcr_wm->wm_high->mask)) | 374 (ath10k_set_ring_byte(n, srcr_wm->wm_high))); 375} 376 377static inline void ath10k_ce_src_ring_lowmark_set(struct ath10k *ar, 378 u32 ce_ctrl_addr, 379 unsigned int n) 380{ 381 struct ath10k_hw_ce_dst_src_wm_regs *srcr_wm = ar->hw_ce_regs->wm_srcr; 382 u32 addr = ath10k_ce_read32(ar, ce_ctrl_addr + srcr_wm->addr); 383 384 ath10k_ce_write32(ar, ce_ctrl_addr + srcr_wm->addr, 385 (addr & ~(srcr_wm->wm_low->mask)) | 386 (ath10k_set_ring_byte(n, srcr_wm->wm_low))); 387} 388 389static inline void ath10k_ce_dest_ring_highmark_set(struct ath10k *ar, 390 u32 ce_ctrl_addr, 391 unsigned int n) 392{ 393 struct ath10k_hw_ce_dst_src_wm_regs *dstr_wm = ar->hw_ce_regs->wm_dstr; 394 u32 addr = ath10k_ce_read32(ar, ce_ctrl_addr + dstr_wm->addr); 395 396 ath10k_ce_write32(ar, ce_ctrl_addr + dstr_wm->addr, 397 (addr & ~(dstr_wm->wm_high->mask)) | 398 (ath10k_set_ring_byte(n, dstr_wm->wm_high))); 399} 400 401static inline void ath10k_ce_dest_ring_lowmark_set(struct ath10k *ar, 402 u32 ce_ctrl_addr, 403 unsigned int n) 404{ 405 struct ath10k_hw_ce_dst_src_wm_regs *dstr_wm = ar->hw_ce_regs->wm_dstr; 406 u32 addr = ath10k_ce_read32(ar, ce_ctrl_addr + dstr_wm->addr); 407 408 ath10k_ce_write32(ar, ce_ctrl_addr + dstr_wm->addr, 409 (addr & ~(dstr_wm->wm_low->mask)) | 410 (ath10k_set_ring_byte(n, dstr_wm->wm_low))); 411} 412 413static inline void ath10k_ce_copy_complete_inter_enable(struct ath10k *ar, 414 u32 ce_ctrl_addr) 415{ 416 struct ath10k_hw_ce_host_ie *host_ie = ar->hw_ce_regs->host_ie; 417 418 u32 host_ie_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 419 ar->hw_ce_regs->host_ie_addr); 420 421 ath10k_ce_write32(ar, ce_ctrl_addr + ar->hw_ce_regs->host_ie_addr, 422 host_ie_addr | host_ie->copy_complete->mask); 423} 424 425static inline void ath10k_ce_copy_complete_intr_disable(struct ath10k *ar, 426 u32 ce_ctrl_addr) 427{ 428 struct ath10k_hw_ce_host_ie *host_ie = ar->hw_ce_regs->host_ie; 429 430 u32 host_ie_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 431 ar->hw_ce_regs->host_ie_addr); 432 433 ath10k_ce_write32(ar, ce_ctrl_addr + ar->hw_ce_regs->host_ie_addr, 434 host_ie_addr & ~(host_ie->copy_complete->mask)); 435} 436 437static inline void ath10k_ce_watermark_intr_disable(struct ath10k *ar, 438 u32 ce_ctrl_addr) 439{ 440 struct ath10k_hw_ce_host_wm_regs *wm_regs = ar->hw_ce_regs->wm_regs; 441 442 u32 host_ie_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 443 ar->hw_ce_regs->host_ie_addr); 444 445 ath10k_ce_write32(ar, ce_ctrl_addr + ar->hw_ce_regs->host_ie_addr, 446 host_ie_addr & ~(wm_regs->wm_mask)); 447} 448 449static inline void ath10k_ce_error_intr_enable(struct ath10k *ar, 450 u32 ce_ctrl_addr) 451{ 452 struct ath10k_hw_ce_misc_regs *misc_regs = ar->hw_ce_regs->misc_regs; 453 454 u32 misc_ie_addr = ath10k_ce_read32(ar, ce_ctrl_addr + 455 ar->hw_ce_regs->misc_ie_addr); 456 457 ath10k_ce_write32(ar, 458 ce_ctrl_addr + ar->hw_ce_regs->misc_ie_addr, 459 misc_ie_addr | misc_regs->err_mask); 460} 461 462static inline void ath10k_ce_error_intr_disable(struct ath10k *ar, 463 u32 ce_ctrl_addr) 464{ 465 struct ath10k_hw_ce_misc_regs *misc_regs = ar->hw_ce_regs->misc_regs; 466 467 u32 misc_ie_addr = ath10k_ce_read32(ar, 468 ce_ctrl_addr + ar->hw_ce_regs->misc_ie_addr); 469 470 ath10k_ce_write32(ar, 471 ce_ctrl_addr + ar->hw_ce_regs->misc_ie_addr, 472 misc_ie_addr & ~(misc_regs->err_mask)); 473} 474 475static inline void ath10k_ce_engine_int_status_clear(struct ath10k *ar, 476 u32 ce_ctrl_addr, 477 unsigned int mask) 478{ 479 struct ath10k_hw_ce_host_wm_regs *wm_regs = ar->hw_ce_regs->wm_regs; 480 481 ath10k_ce_write32(ar, ce_ctrl_addr + wm_regs->addr, mask); 482} 483 484/* 485 * Guts of ath10k_ce_send. 486 * The caller takes responsibility for any needed locking. 487 */ 488static int _ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, 489 void *per_transfer_context, 490 dma_addr_t buffer, 491 unsigned int nbytes, 492 unsigned int transfer_id, 493 unsigned int flags) 494{ 495 struct ath10k *ar = ce_state->ar; 496 struct ath10k_ce_ring *src_ring = ce_state->src_ring; 497 struct ce_desc *desc, sdesc; 498 unsigned int nentries_mask = src_ring->nentries_mask; 499 unsigned int sw_index = src_ring->sw_index; 500 unsigned int write_index = src_ring->write_index; 501 u32 ctrl_addr = ce_state->ctrl_addr; 502 u32 desc_flags = 0; 503 int ret = 0; 504 505 if (nbytes > ce_state->src_sz_max) 506 ath10k_warn(ar, "%s: send more we can (nbytes: %d, max: %d)\n", 507 __func__, nbytes, ce_state->src_sz_max); 508 509 if (unlikely(CE_RING_DELTA(nentries_mask, 510 write_index, sw_index - 1) <= 0)) { 511 ret = -ENOSR; 512 goto exit; 513 } 514 515 desc = CE_SRC_RING_TO_DESC(src_ring->base_addr_owner_space, 516 write_index); 517 518 desc_flags |= SM(transfer_id, CE_DESC_FLAGS_META_DATA); 519 520 if (flags & CE_SEND_FLAG_GATHER) 521 desc_flags |= CE_DESC_FLAGS_GATHER; 522 if (flags & CE_SEND_FLAG_BYTE_SWAP) 523 desc_flags |= CE_DESC_FLAGS_BYTE_SWAP; 524 525 sdesc.addr = __cpu_to_le32(buffer); 526 sdesc.nbytes = __cpu_to_le16(nbytes); 527 sdesc.flags = __cpu_to_le16(desc_flags); 528 529 *desc = sdesc; 530 531 src_ring->per_transfer_context[write_index] = per_transfer_context; 532 533 /* Update Source Ring Write Index */ 534 write_index = CE_RING_IDX_INCR(nentries_mask, write_index); 535 536 /* WORKAROUND */ 537 if (!(flags & CE_SEND_FLAG_GATHER)) 538 ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, write_index); 539 540 src_ring->write_index = write_index; 541exit: 542 return ret; 543} 544 545static int _ath10k_ce_send_nolock_64(struct ath10k_ce_pipe *ce_state, 546 void *per_transfer_context, 547 dma_addr_t buffer, 548 unsigned int nbytes, 549 unsigned int transfer_id, 550 unsigned int flags) 551{ 552 struct ath10k *ar = ce_state->ar; 553 struct ath10k_ce_ring *src_ring = ce_state->src_ring; 554 struct ce_desc_64 *desc, sdesc; 555 unsigned int nentries_mask = src_ring->nentries_mask; 556 unsigned int sw_index; 557 unsigned int write_index = src_ring->write_index; 558 u32 ctrl_addr = ce_state->ctrl_addr; 559 __le32 *addr; 560 u32 desc_flags = 0; 561 int ret = 0; 562 563 if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) 564 return -ESHUTDOWN; 565 566 if (nbytes > ce_state->src_sz_max) 567 ath10k_warn(ar, "%s: send more we can (nbytes: %d, max: %d)\n", 568 __func__, nbytes, ce_state->src_sz_max); 569 570 if (ar->hw_params.rri_on_ddr) 571 sw_index = ath10k_ce_src_ring_read_index_from_ddr(ar, ce_state->id); 572 else 573 sw_index = src_ring->sw_index; 574 575 if (unlikely(CE_RING_DELTA(nentries_mask, 576 write_index, sw_index - 1) <= 0)) { 577 ret = -ENOSR; 578 goto exit; 579 } 580 581 desc = CE_SRC_RING_TO_DESC_64(src_ring->base_addr_owner_space, 582 write_index); 583 584 desc_flags |= SM(transfer_id, CE_DESC_FLAGS_META_DATA); 585 586 if (flags & CE_SEND_FLAG_GATHER) 587 desc_flags |= CE_DESC_FLAGS_GATHER; 588 589 if (flags & CE_SEND_FLAG_BYTE_SWAP) 590 desc_flags |= CE_DESC_FLAGS_BYTE_SWAP; 591 592 addr = (__le32 *)&sdesc.addr; 593 594 flags |= upper_32_bits(buffer) & CE_DESC_ADDR_HI_MASK; 595 addr[0] = __cpu_to_le32(buffer); 596 addr[1] = __cpu_to_le32(flags); 597 if (flags & CE_SEND_FLAG_GATHER) 598 addr[1] |= __cpu_to_le32(CE_WCN3990_DESC_FLAGS_GATHER); 599 else 600 addr[1] &= ~(__cpu_to_le32(CE_WCN3990_DESC_FLAGS_GATHER)); 601 602 sdesc.nbytes = __cpu_to_le16(nbytes); 603 sdesc.flags = __cpu_to_le16(desc_flags); 604 605 *desc = sdesc; 606 607 src_ring->per_transfer_context[write_index] = per_transfer_context; 608 609 /* Update Source Ring Write Index */ 610 write_index = CE_RING_IDX_INCR(nentries_mask, write_index); 611 612 if (!(flags & CE_SEND_FLAG_GATHER)) { 613 if (ar->hw_params.shadow_reg_support) 614 ath10k_ce_shadow_src_ring_write_index_set(ar, ce_state, 615 write_index); 616 else 617 ath10k_ce_src_ring_write_index_set(ar, ctrl_addr, 618 write_index); 619 } 620 621 src_ring->write_index = write_index; 622exit: 623 return ret; 624} 625 626int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state, 627 void *per_transfer_context, 628 dma_addr_t buffer, 629 unsigned int nbytes, 630 unsigned int transfer_id, 631 unsigned int flags) 632{ 633 return ce_state->ops->ce_send_nolock(ce_state, per_transfer_context, 634 buffer, nbytes, transfer_id, flags); 635} 636EXPORT_SYMBOL(ath10k_ce_send_nolock); 637 638void __ath10k_ce_send_revert(struct ath10k_ce_pipe *pipe) 639{ 640 struct ath10k *ar = pipe->ar; 641 struct ath10k_ce *ce = ath10k_ce_priv(ar); 642 struct ath10k_ce_ring *src_ring = pipe->src_ring; 643 u32 ctrl_addr = pipe->ctrl_addr; 644 645 lockdep_assert_held(&ce->ce_lock); 646 647 /* 648 * This function must be called only if there is an incomplete 649 * scatter-gather transfer (before index register is updated) 650 * that needs to be cleaned up. 651 */ 652 if (WARN_ON_ONCE(src_ring->write_index == src_ring->sw_index)) 653 return; 654 655 if (WARN_ON_ONCE(src_ring->write_index == 656 ath10k_ce_src_ring_write_index_get(ar, ctrl_addr))) 657 return; 658 659 src_ring->write_index--; 660 src_ring->write_index &= src_ring->nentries_mask; 661 662 src_ring->per_transfer_context[src_ring->write_index] = NULL; 663} 664EXPORT_SYMBOL(__ath10k_ce_send_revert); 665 666int ath10k_ce_send(struct ath10k_ce_pipe *ce_state, 667 void *per_transfer_context, 668 dma_addr_t buffer, 669 unsigned int nbytes, 670 unsigned int transfer_id, 671 unsigned int flags) 672{ 673 struct ath10k *ar = ce_state->ar; 674 struct ath10k_ce *ce = ath10k_ce_priv(ar); 675 int ret; 676 677 spin_lock_bh(&ce->ce_lock); 678 ret = ath10k_ce_send_nolock(ce_state, per_transfer_context, 679 buffer, nbytes, transfer_id, flags); 680 spin_unlock_bh(&ce->ce_lock); 681 682 return ret; 683} 684EXPORT_SYMBOL(ath10k_ce_send); 685 686int ath10k_ce_num_free_src_entries(struct ath10k_ce_pipe *pipe) 687{ 688 struct ath10k *ar = pipe->ar; 689 struct ath10k_ce *ce = ath10k_ce_priv(ar); 690 int delta; 691 692 spin_lock_bh(&ce->ce_lock); 693 delta = CE_RING_DELTA(pipe->src_ring->nentries_mask, 694 pipe->src_ring->write_index, 695 pipe->src_ring->sw_index - 1); 696 spin_unlock_bh(&ce->ce_lock); 697 698 return delta; 699} 700EXPORT_SYMBOL(ath10k_ce_num_free_src_entries); 701 702int __ath10k_ce_rx_num_free_bufs(struct ath10k_ce_pipe *pipe) 703{ 704 struct ath10k *ar = pipe->ar; 705 struct ath10k_ce *ce = ath10k_ce_priv(ar); 706 struct ath10k_ce_ring *dest_ring = pipe->dest_ring; 707 unsigned int nentries_mask = dest_ring->nentries_mask; 708 unsigned int write_index = dest_ring->write_index; 709 unsigned int sw_index = dest_ring->sw_index; 710 711 lockdep_assert_held(&ce->ce_lock); 712 713 return CE_RING_DELTA(nentries_mask, write_index, sw_index - 1); 714} 715EXPORT_SYMBOL(__ath10k_ce_rx_num_free_bufs); 716 717static int __ath10k_ce_rx_post_buf(struct ath10k_ce_pipe *pipe, void *ctx, 718 dma_addr_t paddr) 719{ 720 struct ath10k *ar = pipe->ar; 721 struct ath10k_ce *ce = ath10k_ce_priv(ar); 722 struct ath10k_ce_ring *dest_ring = pipe->dest_ring; 723 unsigned int nentries_mask = dest_ring->nentries_mask; 724 unsigned int write_index = dest_ring->write_index; 725 unsigned int sw_index = dest_ring->sw_index; 726 struct ce_desc *base = dest_ring->base_addr_owner_space; 727 struct ce_desc *desc = CE_DEST_RING_TO_DESC(base, write_index); 728 u32 ctrl_addr = pipe->ctrl_addr; 729 730 lockdep_assert_held(&ce->ce_lock); 731 732 if ((pipe->id != 5) && 733 CE_RING_DELTA(nentries_mask, write_index, sw_index - 1) == 0) 734 return -ENOSPC; 735 736 desc->addr = __cpu_to_le32(paddr); 737 desc->nbytes = 0; 738 739 dest_ring->per_transfer_context[write_index] = ctx; 740 write_index = CE_RING_IDX_INCR(nentries_mask, write_index); 741 ath10k_ce_dest_ring_write_index_set(ar, ctrl_addr, write_index); 742 dest_ring->write_index = write_index; 743 744 return 0; 745} 746 747static int __ath10k_ce_rx_post_buf_64(struct ath10k_ce_pipe *pipe, 748 void *ctx, 749 dma_addr_t paddr) 750{ 751 struct ath10k *ar = pipe->ar; 752 struct ath10k_ce *ce = ath10k_ce_priv(ar); 753 struct ath10k_ce_ring *dest_ring = pipe->dest_ring; 754 unsigned int nentries_mask = dest_ring->nentries_mask; 755 unsigned int write_index = dest_ring->write_index; 756 unsigned int sw_index = dest_ring->sw_index; 757 struct ce_desc_64 *base = dest_ring->base_addr_owner_space; 758 struct ce_desc_64 *desc = 759 CE_DEST_RING_TO_DESC_64(base, write_index); 760 u32 ctrl_addr = pipe->ctrl_addr; 761 762 lockdep_assert_held(&ce->ce_lock); 763 764 if (CE_RING_DELTA(nentries_mask, write_index, sw_index - 1) == 0) 765 return -ENOSPC; 766 767 desc->addr = __cpu_to_le64(paddr); 768 desc->addr &= __cpu_to_le64(CE_DESC_ADDR_MASK); 769 770 desc->nbytes = 0; 771 772 dest_ring->per_transfer_context[write_index] = ctx; 773 write_index = CE_RING_IDX_INCR(nentries_mask, write_index); 774 ath10k_ce_dest_ring_write_index_set(ar, ctrl_addr, write_index); 775 dest_ring->write_index = write_index; 776 777 return 0; 778} 779 780void ath10k_ce_rx_update_write_idx(struct ath10k_ce_pipe *pipe, u32 nentries) 781{ 782 struct ath10k *ar = pipe->ar; 783 struct ath10k_ce_ring *dest_ring = pipe->dest_ring; 784 unsigned int nentries_mask = dest_ring->nentries_mask; 785 unsigned int write_index = dest_ring->write_index; 786 u32 ctrl_addr = pipe->ctrl_addr; 787 u32 cur_write_idx = ath10k_ce_dest_ring_write_index_get(ar, ctrl_addr); 788 789 /* Prevent CE ring stuck issue that will occur when ring is full. 790 * Make sure that write index is 1 less than read index. 791 */ 792 if (((cur_write_idx + nentries) & nentries_mask) == dest_ring->sw_index) 793 nentries -= 1; 794 795 write_index = CE_RING_IDX_ADD(nentries_mask, write_index, nentries); 796 ath10k_ce_dest_ring_write_index_set(ar, ctrl_addr, write_index); 797 dest_ring->write_index = write_index; 798} 799EXPORT_SYMBOL(ath10k_ce_rx_update_write_idx); 800 801int ath10k_ce_rx_post_buf(struct ath10k_ce_pipe *pipe, void *ctx, 802 dma_addr_t paddr) 803{ 804 struct ath10k *ar = pipe->ar; 805 struct ath10k_ce *ce = ath10k_ce_priv(ar); 806 int ret; 807 808 spin_lock_bh(&ce->ce_lock); 809 ret = pipe->ops->ce_rx_post_buf(pipe, ctx, paddr); 810 spin_unlock_bh(&ce->ce_lock); 811 812 return ret; 813} 814EXPORT_SYMBOL(ath10k_ce_rx_post_buf); 815 816/* 817 * Guts of ath10k_ce_completed_recv_next. 818 * The caller takes responsibility for any necessary locking. 819 */ 820static int 821 _ath10k_ce_completed_recv_next_nolock(struct ath10k_ce_pipe *ce_state, 822 void **per_transfer_contextp, 823 unsigned int *nbytesp) 824{ 825 struct ath10k_ce_ring *dest_ring = ce_state->dest_ring; 826 unsigned int nentries_mask = dest_ring->nentries_mask; 827 unsigned int sw_index = dest_ring->sw_index; 828 829 struct ce_desc *base = dest_ring->base_addr_owner_space; 830 struct ce_desc *desc = CE_DEST_RING_TO_DESC(base, sw_index); 831 struct ce_desc sdesc; 832 u16 nbytes; 833 834 /* Copy in one go for performance reasons */ 835 sdesc = *desc; 836 837 nbytes = __le16_to_cpu(sdesc.nbytes); 838 if (nbytes == 0) { 839 /* 840 * This closes a relatively unusual race where the Host 841 * sees the updated DRRI before the update to the 842 * corresponding descriptor has completed. We treat this 843 * as a descriptor that is not yet done. 844 */ 845 return -EIO; 846 } 847 848 desc->nbytes = 0; 849 850 /* Return data from completed destination descriptor */ 851 *nbytesp = nbytes; 852 853 if (per_transfer_contextp) 854 *per_transfer_contextp = 855 dest_ring->per_transfer_context[sw_index]; 856 857 /* Copy engine 5 (HTT Rx) will reuse the same transfer context. 858 * So update transfer context all CEs except CE5. 859 */ 860 if (ce_state->id != 5) 861 dest_ring->per_transfer_context[sw_index] = NULL; 862 863 /* Update sw_index */ 864 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 865 dest_ring->sw_index = sw_index; 866 867 return 0; 868} 869 870static int 871_ath10k_ce_completed_recv_next_nolock_64(struct ath10k_ce_pipe *ce_state, 872 void **per_transfer_contextp, 873 unsigned int *nbytesp) 874{ 875 struct ath10k_ce_ring *dest_ring = ce_state->dest_ring; 876 unsigned int nentries_mask = dest_ring->nentries_mask; 877 unsigned int sw_index = dest_ring->sw_index; 878 struct ce_desc_64 *base = dest_ring->base_addr_owner_space; 879 struct ce_desc_64 *desc = 880 CE_DEST_RING_TO_DESC_64(base, sw_index); 881 struct ce_desc_64 sdesc; 882 u16 nbytes; 883 884 /* Copy in one go for performance reasons */ 885 sdesc = *desc; 886 887 nbytes = __le16_to_cpu(sdesc.nbytes); 888 if (nbytes == 0) { 889 /* This closes a relatively unusual race where the Host 890 * sees the updated DRRI before the update to the 891 * corresponding descriptor has completed. We treat this 892 * as a descriptor that is not yet done. 893 */ 894 return -EIO; 895 } 896 897 desc->nbytes = 0; 898 899 /* Return data from completed destination descriptor */ 900 *nbytesp = nbytes; 901 902 if (per_transfer_contextp) 903 *per_transfer_contextp = 904 dest_ring->per_transfer_context[sw_index]; 905 906 /* Copy engine 5 (HTT Rx) will reuse the same transfer context. 907 * So update transfer context all CEs except CE5. 908 */ 909 if (ce_state->id != 5) 910 dest_ring->per_transfer_context[sw_index] = NULL; 911 912 /* Update sw_index */ 913 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 914 dest_ring->sw_index = sw_index; 915 916 return 0; 917} 918 919int ath10k_ce_completed_recv_next_nolock(struct ath10k_ce_pipe *ce_state, 920 void **per_transfer_ctx, 921 unsigned int *nbytesp) 922{ 923 return ce_state->ops->ce_completed_recv_next_nolock(ce_state, 924 per_transfer_ctx, 925 nbytesp); 926} 927EXPORT_SYMBOL(ath10k_ce_completed_recv_next_nolock); 928 929int ath10k_ce_completed_recv_next(struct ath10k_ce_pipe *ce_state, 930 void **per_transfer_contextp, 931 unsigned int *nbytesp) 932{ 933 struct ath10k *ar = ce_state->ar; 934 struct ath10k_ce *ce = ath10k_ce_priv(ar); 935 int ret; 936 937 spin_lock_bh(&ce->ce_lock); 938 ret = ce_state->ops->ce_completed_recv_next_nolock(ce_state, 939 per_transfer_contextp, 940 nbytesp); 941 942 spin_unlock_bh(&ce->ce_lock); 943 944 return ret; 945} 946EXPORT_SYMBOL(ath10k_ce_completed_recv_next); 947 948static int _ath10k_ce_revoke_recv_next(struct ath10k_ce_pipe *ce_state, 949 void **per_transfer_contextp, 950 dma_addr_t *bufferp) 951{ 952 struct ath10k_ce_ring *dest_ring; 953 unsigned int nentries_mask; 954 unsigned int sw_index; 955 unsigned int write_index; 956 int ret; 957 struct ath10k *ar; 958 struct ath10k_ce *ce; 959 960 dest_ring = ce_state->dest_ring; 961 962 if (!dest_ring) 963 return -EIO; 964 965 ar = ce_state->ar; 966 ce = ath10k_ce_priv(ar); 967 968 spin_lock_bh(&ce->ce_lock); 969 970 nentries_mask = dest_ring->nentries_mask; 971 sw_index = dest_ring->sw_index; 972 write_index = dest_ring->write_index; 973 if (write_index != sw_index) { 974 struct ce_desc *base = dest_ring->base_addr_owner_space; 975 struct ce_desc *desc = CE_DEST_RING_TO_DESC(base, sw_index); 976 977 /* Return data from completed destination descriptor */ 978 *bufferp = __le32_to_cpu(desc->addr); 979 980 if (per_transfer_contextp) 981 *per_transfer_contextp = 982 dest_ring->per_transfer_context[sw_index]; 983 984 /* sanity */ 985 dest_ring->per_transfer_context[sw_index] = NULL; 986 desc->nbytes = 0; 987 988 /* Update sw_index */ 989 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 990 dest_ring->sw_index = sw_index; 991 ret = 0; 992 } else { 993 ret = -EIO; 994 } 995 996 spin_unlock_bh(&ce->ce_lock); 997 998 return ret; 999} 1000 1001static int _ath10k_ce_revoke_recv_next_64(struct ath10k_ce_pipe *ce_state, 1002 void **per_transfer_contextp, 1003 dma_addr_t *bufferp) 1004{ 1005 struct ath10k_ce_ring *dest_ring; 1006 unsigned int nentries_mask; 1007 unsigned int sw_index; 1008 unsigned int write_index; 1009 int ret; 1010 struct ath10k *ar; 1011 struct ath10k_ce *ce; 1012 1013 dest_ring = ce_state->dest_ring; 1014 1015 if (!dest_ring) 1016 return -EIO; 1017 1018 ar = ce_state->ar; 1019 ce = ath10k_ce_priv(ar); 1020 1021 spin_lock_bh(&ce->ce_lock); 1022 1023 nentries_mask = dest_ring->nentries_mask; 1024 sw_index = dest_ring->sw_index; 1025 write_index = dest_ring->write_index; 1026 if (write_index != sw_index) { 1027 struct ce_desc_64 *base = dest_ring->base_addr_owner_space; 1028 struct ce_desc_64 *desc = 1029 CE_DEST_RING_TO_DESC_64(base, sw_index); 1030 1031 /* Return data from completed destination descriptor */ 1032 *bufferp = __le64_to_cpu(desc->addr); 1033 1034 if (per_transfer_contextp) 1035 *per_transfer_contextp = 1036 dest_ring->per_transfer_context[sw_index]; 1037 1038 /* sanity */ 1039 dest_ring->per_transfer_context[sw_index] = NULL; 1040 desc->nbytes = 0; 1041 1042 /* Update sw_index */ 1043 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 1044 dest_ring->sw_index = sw_index; 1045 ret = 0; 1046 } else { 1047 ret = -EIO; 1048 } 1049 1050 spin_unlock_bh(&ce->ce_lock); 1051 1052 return ret; 1053} 1054 1055int ath10k_ce_revoke_recv_next(struct ath10k_ce_pipe *ce_state, 1056 void **per_transfer_contextp, 1057 dma_addr_t *bufferp) 1058{ 1059 return ce_state->ops->ce_revoke_recv_next(ce_state, 1060 per_transfer_contextp, 1061 bufferp); 1062} 1063EXPORT_SYMBOL(ath10k_ce_revoke_recv_next); 1064 1065/* 1066 * Guts of ath10k_ce_completed_send_next. 1067 * The caller takes responsibility for any necessary locking. 1068 */ 1069static int _ath10k_ce_completed_send_next_nolock(struct ath10k_ce_pipe *ce_state, 1070 void **per_transfer_contextp) 1071{ 1072 struct ath10k_ce_ring *src_ring = ce_state->src_ring; 1073 u32 ctrl_addr = ce_state->ctrl_addr; 1074 struct ath10k *ar = ce_state->ar; 1075 unsigned int nentries_mask = src_ring->nentries_mask; 1076 unsigned int sw_index = src_ring->sw_index; 1077 unsigned int read_index; 1078 struct ce_desc *desc; 1079 1080 if (src_ring->hw_index == sw_index) { 1081 /* 1082 * The SW completion index has caught up with the cached 1083 * version of the HW completion index. 1084 * Update the cached HW completion index to see whether 1085 * the SW has really caught up to the HW, or if the cached 1086 * value of the HW index has become stale. 1087 */ 1088 1089 read_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr); 1090 if (read_index == 0xffffffff) 1091 return -ENODEV; 1092 1093 read_index &= nentries_mask; 1094 src_ring->hw_index = read_index; 1095 } 1096 1097 if (ar->hw_params.rri_on_ddr) 1098 read_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr); 1099 else 1100 read_index = src_ring->hw_index; 1101 1102 if (read_index == sw_index) 1103 return -EIO; 1104 1105 if (per_transfer_contextp) 1106 *per_transfer_contextp = 1107 src_ring->per_transfer_context[sw_index]; 1108 1109 /* sanity */ 1110 src_ring->per_transfer_context[sw_index] = NULL; 1111 desc = CE_SRC_RING_TO_DESC(src_ring->base_addr_owner_space, 1112 sw_index); 1113 desc->nbytes = 0; 1114 1115 /* Update sw_index */ 1116 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 1117 src_ring->sw_index = sw_index; 1118 1119 return 0; 1120} 1121 1122static int _ath10k_ce_completed_send_next_nolock_64(struct ath10k_ce_pipe *ce_state, 1123 void **per_transfer_contextp) 1124{ 1125 struct ath10k_ce_ring *src_ring = ce_state->src_ring; 1126 u32 ctrl_addr = ce_state->ctrl_addr; 1127 struct ath10k *ar = ce_state->ar; 1128 unsigned int nentries_mask = src_ring->nentries_mask; 1129 unsigned int sw_index = src_ring->sw_index; 1130 unsigned int read_index; 1131 struct ce_desc_64 *desc; 1132 1133 if (src_ring->hw_index == sw_index) { 1134 /* 1135 * The SW completion index has caught up with the cached 1136 * version of the HW completion index. 1137 * Update the cached HW completion index to see whether 1138 * the SW has really caught up to the HW, or if the cached 1139 * value of the HW index has become stale. 1140 */ 1141 1142 read_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr); 1143 if (read_index == 0xffffffff) 1144 return -ENODEV; 1145 1146 read_index &= nentries_mask; 1147 src_ring->hw_index = read_index; 1148 } 1149 1150 if (ar->hw_params.rri_on_ddr) 1151 read_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr); 1152 else 1153 read_index = src_ring->hw_index; 1154 1155 if (read_index == sw_index) 1156 return -EIO; 1157 1158 if (per_transfer_contextp) 1159 *per_transfer_contextp = 1160 src_ring->per_transfer_context[sw_index]; 1161 1162 /* sanity */ 1163 src_ring->per_transfer_context[sw_index] = NULL; 1164 desc = CE_SRC_RING_TO_DESC_64(src_ring->base_addr_owner_space, 1165 sw_index); 1166 desc->nbytes = 0; 1167 1168 /* Update sw_index */ 1169 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 1170 src_ring->sw_index = sw_index; 1171 1172 return 0; 1173} 1174 1175int ath10k_ce_completed_send_next_nolock(struct ath10k_ce_pipe *ce_state, 1176 void **per_transfer_contextp) 1177{ 1178 return ce_state->ops->ce_completed_send_next_nolock(ce_state, 1179 per_transfer_contextp); 1180} 1181EXPORT_SYMBOL(ath10k_ce_completed_send_next_nolock); 1182 1183static void ath10k_ce_extract_desc_data(struct ath10k *ar, 1184 struct ath10k_ce_ring *src_ring, 1185 u32 sw_index, 1186 dma_addr_t *bufferp, 1187 u32 *nbytesp, 1188 u32 *transfer_idp) 1189{ 1190 struct ce_desc *base = src_ring->base_addr_owner_space; 1191 struct ce_desc *desc = CE_SRC_RING_TO_DESC(base, sw_index); 1192 1193 /* Return data from completed source descriptor */ 1194 *bufferp = __le32_to_cpu(desc->addr); 1195 *nbytesp = __le16_to_cpu(desc->nbytes); 1196 *transfer_idp = MS(__le16_to_cpu(desc->flags), 1197 CE_DESC_FLAGS_META_DATA); 1198} 1199 1200static void ath10k_ce_extract_desc_data_64(struct ath10k *ar, 1201 struct ath10k_ce_ring *src_ring, 1202 u32 sw_index, 1203 dma_addr_t *bufferp, 1204 u32 *nbytesp, 1205 u32 *transfer_idp) 1206{ 1207 struct ce_desc_64 *base = src_ring->base_addr_owner_space; 1208 struct ce_desc_64 *desc = 1209 CE_SRC_RING_TO_DESC_64(base, sw_index); 1210 1211 /* Return data from completed source descriptor */ 1212 *bufferp = __le64_to_cpu(desc->addr); 1213 *nbytesp = __le16_to_cpu(desc->nbytes); 1214 *transfer_idp = MS(__le16_to_cpu(desc->flags), 1215 CE_DESC_FLAGS_META_DATA); 1216} 1217 1218/* NB: Modeled after ath10k_ce_completed_send_next */ 1219int ath10k_ce_cancel_send_next(struct ath10k_ce_pipe *ce_state, 1220 void **per_transfer_contextp, 1221 dma_addr_t *bufferp, 1222 unsigned int *nbytesp, 1223 unsigned int *transfer_idp) 1224{ 1225 struct ath10k_ce_ring *src_ring; 1226 unsigned int nentries_mask; 1227 unsigned int sw_index; 1228 unsigned int write_index; 1229 int ret; 1230 struct ath10k *ar; 1231 struct ath10k_ce *ce; 1232 1233 src_ring = ce_state->src_ring; 1234 1235 if (!src_ring) 1236 return -EIO; 1237 1238 ar = ce_state->ar; 1239 ce = ath10k_ce_priv(ar); 1240 1241 spin_lock_bh(&ce->ce_lock); 1242 1243 nentries_mask = src_ring->nentries_mask; 1244 sw_index = src_ring->sw_index; 1245 write_index = src_ring->write_index; 1246 1247 if (write_index != sw_index) { 1248 ce_state->ops->ce_extract_desc_data(ar, src_ring, sw_index, 1249 bufferp, nbytesp, 1250 transfer_idp); 1251 1252 if (per_transfer_contextp) 1253 *per_transfer_contextp = 1254 src_ring->per_transfer_context[sw_index]; 1255 1256 /* sanity */ 1257 src_ring->per_transfer_context[sw_index] = NULL; 1258 1259 /* Update sw_index */ 1260 sw_index = CE_RING_IDX_INCR(nentries_mask, sw_index); 1261 src_ring->sw_index = sw_index; 1262 ret = 0; 1263 } else { 1264 ret = -EIO; 1265 } 1266 1267 spin_unlock_bh(&ce->ce_lock); 1268 1269 return ret; 1270} 1271EXPORT_SYMBOL(ath10k_ce_cancel_send_next); 1272 1273int ath10k_ce_completed_send_next(struct ath10k_ce_pipe *ce_state, 1274 void **per_transfer_contextp) 1275{ 1276 struct ath10k *ar = ce_state->ar; 1277 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1278 int ret; 1279 1280 spin_lock_bh(&ce->ce_lock); 1281 ret = ath10k_ce_completed_send_next_nolock(ce_state, 1282 per_transfer_contextp); 1283 spin_unlock_bh(&ce->ce_lock); 1284 1285 return ret; 1286} 1287EXPORT_SYMBOL(ath10k_ce_completed_send_next); 1288 1289/* 1290 * Guts of interrupt handler for per-engine interrupts on a particular CE. 1291 * 1292 * Invokes registered callbacks for recv_complete, 1293 * send_complete, and watermarks. 1294 */ 1295void ath10k_ce_per_engine_service(struct ath10k *ar, unsigned int ce_id) 1296{ 1297 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1298 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1299 struct ath10k_hw_ce_host_wm_regs *wm_regs = ar->hw_ce_regs->wm_regs; 1300 u32 ctrl_addr = ce_state->ctrl_addr; 1301 1302 /* 1303 * Clear before handling 1304 * 1305 * Misc CE interrupts are not being handled, but still need 1306 * to be cleared. 1307 * 1308 * NOTE: When the last copy engine interrupt is cleared the 1309 * hardware will go to sleep. Once this happens any access to 1310 * the CE registers can cause a hardware fault. 1311 */ 1312 ath10k_ce_engine_int_status_clear(ar, ctrl_addr, 1313 wm_regs->cc_mask | wm_regs->wm_mask); 1314 1315 if (ce_state->recv_cb) 1316 ce_state->recv_cb(ce_state); 1317 1318 if (ce_state->send_cb) 1319 ce_state->send_cb(ce_state); 1320} 1321EXPORT_SYMBOL(ath10k_ce_per_engine_service); 1322 1323/* 1324 * Handler for per-engine interrupts on ALL active CEs. 1325 * This is used in cases where the system is sharing a 1326 * single interrput for all CEs 1327 */ 1328 1329void ath10k_ce_per_engine_service_any(struct ath10k *ar) 1330{ 1331 int ce_id; 1332 u32 intr_summary; 1333 1334 intr_summary = ath10k_ce_interrupt_summary(ar); 1335 1336 for (ce_id = 0; intr_summary && (ce_id < CE_COUNT); ce_id++) { 1337 if (intr_summary & (1 << ce_id)) 1338 intr_summary &= ~(1 << ce_id); 1339 else 1340 /* no intr pending on this CE */ 1341 continue; 1342 1343 ath10k_ce_per_engine_service(ar, ce_id); 1344 } 1345} 1346EXPORT_SYMBOL(ath10k_ce_per_engine_service_any); 1347 1348/* 1349 * Adjust interrupts for the copy complete handler. 1350 * If it's needed for either send or recv, then unmask 1351 * this interrupt; otherwise, mask it. 1352 * 1353 * Called with ce_lock held. 1354 */ 1355static void ath10k_ce_per_engine_handler_adjust(struct ath10k_ce_pipe *ce_state) 1356{ 1357 u32 ctrl_addr = ce_state->ctrl_addr; 1358 struct ath10k *ar = ce_state->ar; 1359 bool disable_copy_compl_intr = ce_state->attr_flags & CE_ATTR_DIS_INTR; 1360 1361 if ((!disable_copy_compl_intr) && 1362 (ce_state->send_cb || ce_state->recv_cb)) 1363 ath10k_ce_copy_complete_inter_enable(ar, ctrl_addr); 1364 else 1365 ath10k_ce_copy_complete_intr_disable(ar, ctrl_addr); 1366 1367 ath10k_ce_watermark_intr_disable(ar, ctrl_addr); 1368} 1369 1370void ath10k_ce_disable_interrupt(struct ath10k *ar, int ce_id) 1371{ 1372 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1373 struct ath10k_ce_pipe *ce_state; 1374 u32 ctrl_addr; 1375 1376 ce_state = &ce->ce_states[ce_id]; 1377 if (ce_state->attr_flags & CE_ATTR_POLL) 1378 return; 1379 1380 ctrl_addr = ath10k_ce_base_address(ar, ce_id); 1381 1382 ath10k_ce_copy_complete_intr_disable(ar, ctrl_addr); 1383 ath10k_ce_error_intr_disable(ar, ctrl_addr); 1384 ath10k_ce_watermark_intr_disable(ar, ctrl_addr); 1385} 1386EXPORT_SYMBOL(ath10k_ce_disable_interrupt); 1387 1388void ath10k_ce_disable_interrupts(struct ath10k *ar) 1389{ 1390 int ce_id; 1391 1392 for (ce_id = 0; ce_id < CE_COUNT; ce_id++) 1393 ath10k_ce_disable_interrupt(ar, ce_id); 1394} 1395EXPORT_SYMBOL(ath10k_ce_disable_interrupts); 1396 1397void ath10k_ce_enable_interrupt(struct ath10k *ar, int ce_id) 1398{ 1399 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1400 struct ath10k_ce_pipe *ce_state; 1401 1402 ce_state = &ce->ce_states[ce_id]; 1403 if (ce_state->attr_flags & CE_ATTR_POLL) 1404 return; 1405 1406 ath10k_ce_per_engine_handler_adjust(ce_state); 1407} 1408EXPORT_SYMBOL(ath10k_ce_enable_interrupt); 1409 1410void ath10k_ce_enable_interrupts(struct ath10k *ar) 1411{ 1412 int ce_id; 1413 1414 /* Enable interrupts for copy engine that 1415 * are not using polling mode. 1416 */ 1417 for (ce_id = 0; ce_id < CE_COUNT; ce_id++) 1418 ath10k_ce_enable_interrupt(ar, ce_id); 1419} 1420EXPORT_SYMBOL(ath10k_ce_enable_interrupts); 1421 1422static int ath10k_ce_init_src_ring(struct ath10k *ar, 1423 unsigned int ce_id, 1424 const struct ce_attr *attr) 1425{ 1426 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1427 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1428 struct ath10k_ce_ring *src_ring = ce_state->src_ring; 1429 u32 nentries, ctrl_addr = ath10k_ce_base_address(ar, ce_id); 1430 1431 nentries = roundup_pow_of_two(attr->src_nentries); 1432 1433 if (ar->hw_params.target_64bit) 1434 memset(src_ring->base_addr_owner_space, 0, 1435 nentries * sizeof(struct ce_desc_64)); 1436 else 1437 memset(src_ring->base_addr_owner_space, 0, 1438 nentries * sizeof(struct ce_desc)); 1439 1440 src_ring->sw_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr); 1441 src_ring->sw_index &= src_ring->nentries_mask; 1442 src_ring->hw_index = src_ring->sw_index; 1443 1444 src_ring->write_index = 1445 ath10k_ce_src_ring_write_index_get(ar, ctrl_addr); 1446 src_ring->write_index &= src_ring->nentries_mask; 1447 1448 ath10k_ce_src_ring_base_addr_set(ar, ce_id, 1449 src_ring->base_addr_ce_space); 1450 ath10k_ce_src_ring_size_set(ar, ctrl_addr, nentries); 1451 ath10k_ce_src_ring_dmax_set(ar, ctrl_addr, attr->src_sz_max); 1452 ath10k_ce_src_ring_byte_swap_set(ar, ctrl_addr, 0); 1453 ath10k_ce_src_ring_lowmark_set(ar, ctrl_addr, 0); 1454 ath10k_ce_src_ring_highmark_set(ar, ctrl_addr, nentries); 1455 1456 ath10k_dbg(ar, ATH10K_DBG_BOOT, 1457 "boot init ce src ring id %d entries %d base_addr %pK\n", 1458 ce_id, nentries, src_ring->base_addr_owner_space); 1459 1460 return 0; 1461} 1462 1463static int ath10k_ce_init_dest_ring(struct ath10k *ar, 1464 unsigned int ce_id, 1465 const struct ce_attr *attr) 1466{ 1467 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1468 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1469 struct ath10k_ce_ring *dest_ring = ce_state->dest_ring; 1470 u32 nentries, ctrl_addr = ath10k_ce_base_address(ar, ce_id); 1471 1472 nentries = roundup_pow_of_two(attr->dest_nentries); 1473 1474 if (ar->hw_params.target_64bit) 1475 memset(dest_ring->base_addr_owner_space, 0, 1476 nentries * sizeof(struct ce_desc_64)); 1477 else 1478 memset(dest_ring->base_addr_owner_space, 0, 1479 nentries * sizeof(struct ce_desc)); 1480 1481 dest_ring->sw_index = ath10k_ce_dest_ring_read_index_get(ar, ctrl_addr); 1482 dest_ring->sw_index &= dest_ring->nentries_mask; 1483 dest_ring->write_index = 1484 ath10k_ce_dest_ring_write_index_get(ar, ctrl_addr); 1485 dest_ring->write_index &= dest_ring->nentries_mask; 1486 1487 ath10k_ce_dest_ring_base_addr_set(ar, ce_id, 1488 dest_ring->base_addr_ce_space); 1489 ath10k_ce_dest_ring_size_set(ar, ctrl_addr, nentries); 1490 ath10k_ce_dest_ring_byte_swap_set(ar, ctrl_addr, 0); 1491 ath10k_ce_dest_ring_lowmark_set(ar, ctrl_addr, 0); 1492 ath10k_ce_dest_ring_highmark_set(ar, ctrl_addr, nentries); 1493 1494 ath10k_dbg(ar, ATH10K_DBG_BOOT, 1495 "boot ce dest ring id %d entries %d base_addr %pK\n", 1496 ce_id, nentries, dest_ring->base_addr_owner_space); 1497 1498 return 0; 1499} 1500 1501static int ath10k_ce_alloc_shadow_base(struct ath10k *ar, 1502 struct ath10k_ce_ring *src_ring, 1503 u32 nentries) 1504{ 1505 src_ring->shadow_base_unaligned = kcalloc(nentries, 1506 sizeof(struct ce_desc_64), 1507 GFP_KERNEL); 1508 if (!src_ring->shadow_base_unaligned) 1509 return -ENOMEM; 1510 1511 src_ring->shadow_base = (struct ce_desc_64 *) 1512 PTR_ALIGN(src_ring->shadow_base_unaligned, 1513 CE_DESC_RING_ALIGN); 1514 return 0; 1515} 1516 1517static struct ath10k_ce_ring * 1518ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id, 1519 const struct ce_attr *attr) 1520{ 1521 struct ath10k_ce_ring *src_ring; 1522 u32 nentries = attr->src_nentries; 1523 dma_addr_t base_addr; 1524 int ret; 1525 1526 nentries = roundup_pow_of_two(nentries); 1527 1528 src_ring = kzalloc(struct_size(src_ring, per_transfer_context, 1529 nentries), GFP_KERNEL); 1530 if (src_ring == NULL) 1531 return ERR_PTR(-ENOMEM); 1532 1533 src_ring->nentries = nentries; 1534 src_ring->nentries_mask = nentries - 1; 1535 1536 /* 1537 * Legacy platforms that do not support cache 1538 * coherent DMA are unsupported 1539 */ 1540 src_ring->base_addr_owner_space_unaligned = 1541 dma_alloc_coherent(ar->dev, 1542 (nentries * sizeof(struct ce_desc) + 1543 CE_DESC_RING_ALIGN), 1544 &base_addr, GFP_KERNEL); 1545 if (!src_ring->base_addr_owner_space_unaligned) { 1546 kfree(src_ring); 1547 return ERR_PTR(-ENOMEM); 1548 } 1549 1550 src_ring->base_addr_ce_space_unaligned = base_addr; 1551 1552 src_ring->base_addr_owner_space = 1553 PTR_ALIGN(src_ring->base_addr_owner_space_unaligned, 1554 CE_DESC_RING_ALIGN); 1555 src_ring->base_addr_ce_space = 1556 ALIGN(src_ring->base_addr_ce_space_unaligned, 1557 CE_DESC_RING_ALIGN); 1558 1559 if (ar->hw_params.shadow_reg_support) { 1560 ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries); 1561 if (ret) { 1562 dma_free_coherent(ar->dev, 1563 (nentries * sizeof(struct ce_desc) + 1564 CE_DESC_RING_ALIGN), 1565 src_ring->base_addr_owner_space_unaligned, 1566 base_addr); 1567 kfree(src_ring); 1568 return ERR_PTR(ret); 1569 } 1570 } 1571 1572 return src_ring; 1573} 1574 1575static struct ath10k_ce_ring * 1576ath10k_ce_alloc_src_ring_64(struct ath10k *ar, unsigned int ce_id, 1577 const struct ce_attr *attr) 1578{ 1579 struct ath10k_ce_ring *src_ring; 1580 u32 nentries = attr->src_nentries; 1581 dma_addr_t base_addr; 1582 int ret; 1583 1584 nentries = roundup_pow_of_two(nentries); 1585 1586 src_ring = kzalloc(struct_size(src_ring, per_transfer_context, 1587 nentries), GFP_KERNEL); 1588 if (!src_ring) 1589 return ERR_PTR(-ENOMEM); 1590 1591 src_ring->nentries = nentries; 1592 src_ring->nentries_mask = nentries - 1; 1593 1594 /* Legacy platforms that do not support cache 1595 * coherent DMA are unsupported 1596 */ 1597 src_ring->base_addr_owner_space_unaligned = 1598 dma_alloc_coherent(ar->dev, 1599 (nentries * sizeof(struct ce_desc_64) + 1600 CE_DESC_RING_ALIGN), 1601 &base_addr, GFP_KERNEL); 1602 if (!src_ring->base_addr_owner_space_unaligned) { 1603 kfree(src_ring); 1604 return ERR_PTR(-ENOMEM); 1605 } 1606 1607 src_ring->base_addr_ce_space_unaligned = base_addr; 1608 1609 src_ring->base_addr_owner_space = 1610 PTR_ALIGN(src_ring->base_addr_owner_space_unaligned, 1611 CE_DESC_RING_ALIGN); 1612 src_ring->base_addr_ce_space = 1613 ALIGN(src_ring->base_addr_ce_space_unaligned, 1614 CE_DESC_RING_ALIGN); 1615 1616 if (ar->hw_params.shadow_reg_support) { 1617 ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries); 1618 if (ret) { 1619 dma_free_coherent(ar->dev, 1620 (nentries * sizeof(struct ce_desc_64) + 1621 CE_DESC_RING_ALIGN), 1622 src_ring->base_addr_owner_space_unaligned, 1623 base_addr); 1624 kfree(src_ring); 1625 return ERR_PTR(ret); 1626 } 1627 } 1628 1629 return src_ring; 1630} 1631 1632static struct ath10k_ce_ring * 1633ath10k_ce_alloc_dest_ring(struct ath10k *ar, unsigned int ce_id, 1634 const struct ce_attr *attr) 1635{ 1636 struct ath10k_ce_ring *dest_ring; 1637 u32 nentries; 1638 dma_addr_t base_addr; 1639 1640 nentries = roundup_pow_of_two(attr->dest_nentries); 1641 1642 dest_ring = kzalloc(struct_size(dest_ring, per_transfer_context, 1643 nentries), GFP_KERNEL); 1644 if (dest_ring == NULL) 1645 return ERR_PTR(-ENOMEM); 1646 1647 dest_ring->nentries = nentries; 1648 dest_ring->nentries_mask = nentries - 1; 1649 1650 /* 1651 * Legacy platforms that do not support cache 1652 * coherent DMA are unsupported 1653 */ 1654 dest_ring->base_addr_owner_space_unaligned = 1655 dma_alloc_coherent(ar->dev, 1656 (nentries * sizeof(struct ce_desc) + 1657 CE_DESC_RING_ALIGN), 1658 &base_addr, GFP_KERNEL); 1659 if (!dest_ring->base_addr_owner_space_unaligned) { 1660 kfree(dest_ring); 1661 return ERR_PTR(-ENOMEM); 1662 } 1663 1664 dest_ring->base_addr_ce_space_unaligned = base_addr; 1665 1666 dest_ring->base_addr_owner_space = 1667 PTR_ALIGN(dest_ring->base_addr_owner_space_unaligned, 1668 CE_DESC_RING_ALIGN); 1669 dest_ring->base_addr_ce_space = 1670 ALIGN(dest_ring->base_addr_ce_space_unaligned, 1671 CE_DESC_RING_ALIGN); 1672 1673 return dest_ring; 1674} 1675 1676static struct ath10k_ce_ring * 1677ath10k_ce_alloc_dest_ring_64(struct ath10k *ar, unsigned int ce_id, 1678 const struct ce_attr *attr) 1679{ 1680 struct ath10k_ce_ring *dest_ring; 1681 u32 nentries; 1682 dma_addr_t base_addr; 1683 1684 nentries = roundup_pow_of_two(attr->dest_nentries); 1685 1686 dest_ring = kzalloc(struct_size(dest_ring, per_transfer_context, 1687 nentries), GFP_KERNEL); 1688 if (!dest_ring) 1689 return ERR_PTR(-ENOMEM); 1690 1691 dest_ring->nentries = nentries; 1692 dest_ring->nentries_mask = nentries - 1; 1693 1694 /* Legacy platforms that do not support cache 1695 * coherent DMA are unsupported 1696 */ 1697 dest_ring->base_addr_owner_space_unaligned = 1698 dma_alloc_coherent(ar->dev, 1699 (nentries * sizeof(struct ce_desc_64) + 1700 CE_DESC_RING_ALIGN), 1701 &base_addr, GFP_KERNEL); 1702 if (!dest_ring->base_addr_owner_space_unaligned) { 1703 kfree(dest_ring); 1704 return ERR_PTR(-ENOMEM); 1705 } 1706 1707 dest_ring->base_addr_ce_space_unaligned = base_addr; 1708 1709 /* Correctly initialize memory to 0 to prevent garbage 1710 * data crashing system when download firmware 1711 */ 1712 dest_ring->base_addr_owner_space = 1713 PTR_ALIGN(dest_ring->base_addr_owner_space_unaligned, 1714 CE_DESC_RING_ALIGN); 1715 dest_ring->base_addr_ce_space = 1716 ALIGN(dest_ring->base_addr_ce_space_unaligned, 1717 CE_DESC_RING_ALIGN); 1718 1719 return dest_ring; 1720} 1721 1722/* 1723 * Initialize a Copy Engine based on caller-supplied attributes. 1724 * This may be called once to initialize both source and destination 1725 * rings or it may be called twice for separate source and destination 1726 * initialization. It may be that only one side or the other is 1727 * initialized by software/firmware. 1728 */ 1729int ath10k_ce_init_pipe(struct ath10k *ar, unsigned int ce_id, 1730 const struct ce_attr *attr) 1731{ 1732 int ret; 1733 1734 if (attr->src_nentries) { 1735 ret = ath10k_ce_init_src_ring(ar, ce_id, attr); 1736 if (ret) { 1737 ath10k_err(ar, "Failed to initialize CE src ring for ID: %d (%d)\n", 1738 ce_id, ret); 1739 return ret; 1740 } 1741 } 1742 1743 if (attr->dest_nentries) { 1744 ret = ath10k_ce_init_dest_ring(ar, ce_id, attr); 1745 if (ret) { 1746 ath10k_err(ar, "Failed to initialize CE dest ring for ID: %d (%d)\n", 1747 ce_id, ret); 1748 return ret; 1749 } 1750 } 1751 1752 return 0; 1753} 1754EXPORT_SYMBOL(ath10k_ce_init_pipe); 1755 1756static void ath10k_ce_deinit_src_ring(struct ath10k *ar, unsigned int ce_id) 1757{ 1758 u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id); 1759 1760 ath10k_ce_src_ring_base_addr_set(ar, ce_id, 0); 1761 ath10k_ce_src_ring_size_set(ar, ctrl_addr, 0); 1762 ath10k_ce_src_ring_dmax_set(ar, ctrl_addr, 0); 1763 ath10k_ce_src_ring_highmark_set(ar, ctrl_addr, 0); 1764} 1765 1766static void ath10k_ce_deinit_dest_ring(struct ath10k *ar, unsigned int ce_id) 1767{ 1768 u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id); 1769 1770 ath10k_ce_dest_ring_base_addr_set(ar, ce_id, 0); 1771 ath10k_ce_dest_ring_size_set(ar, ctrl_addr, 0); 1772 ath10k_ce_dest_ring_highmark_set(ar, ctrl_addr, 0); 1773} 1774 1775void ath10k_ce_deinit_pipe(struct ath10k *ar, unsigned int ce_id) 1776{ 1777 ath10k_ce_deinit_src_ring(ar, ce_id); 1778 ath10k_ce_deinit_dest_ring(ar, ce_id); 1779} 1780EXPORT_SYMBOL(ath10k_ce_deinit_pipe); 1781 1782static void _ath10k_ce_free_pipe(struct ath10k *ar, int ce_id) 1783{ 1784 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1785 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1786 1787 if (ce_state->src_ring) { 1788 if (ar->hw_params.shadow_reg_support) 1789 kfree(ce_state->src_ring->shadow_base_unaligned); 1790 dma_free_coherent(ar->dev, 1791 (ce_state->src_ring->nentries * 1792 sizeof(struct ce_desc) + 1793 CE_DESC_RING_ALIGN), 1794 ce_state->src_ring->base_addr_owner_space, 1795 ce_state->src_ring->base_addr_ce_space); 1796 kfree(ce_state->src_ring); 1797 } 1798 1799 if (ce_state->dest_ring) { 1800 dma_free_coherent(ar->dev, 1801 (ce_state->dest_ring->nentries * 1802 sizeof(struct ce_desc) + 1803 CE_DESC_RING_ALIGN), 1804 ce_state->dest_ring->base_addr_owner_space, 1805 ce_state->dest_ring->base_addr_ce_space); 1806 kfree(ce_state->dest_ring); 1807 } 1808 1809 ce_state->src_ring = NULL; 1810 ce_state->dest_ring = NULL; 1811} 1812 1813static void _ath10k_ce_free_pipe_64(struct ath10k *ar, int ce_id) 1814{ 1815 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1816 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1817 1818 if (ce_state->src_ring) { 1819 if (ar->hw_params.shadow_reg_support) 1820 kfree(ce_state->src_ring->shadow_base_unaligned); 1821 dma_free_coherent(ar->dev, 1822 (ce_state->src_ring->nentries * 1823 sizeof(struct ce_desc_64) + 1824 CE_DESC_RING_ALIGN), 1825 ce_state->src_ring->base_addr_owner_space, 1826 ce_state->src_ring->base_addr_ce_space); 1827 kfree(ce_state->src_ring); 1828 } 1829 1830 if (ce_state->dest_ring) { 1831 dma_free_coherent(ar->dev, 1832 (ce_state->dest_ring->nentries * 1833 sizeof(struct ce_desc_64) + 1834 CE_DESC_RING_ALIGN), 1835 ce_state->dest_ring->base_addr_owner_space, 1836 ce_state->dest_ring->base_addr_ce_space); 1837 kfree(ce_state->dest_ring); 1838 } 1839 1840 ce_state->src_ring = NULL; 1841 ce_state->dest_ring = NULL; 1842} 1843 1844void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id) 1845{ 1846 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1847 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1848 1849 ce_state->ops->ce_free_pipe(ar, ce_id); 1850} 1851EXPORT_SYMBOL(ath10k_ce_free_pipe); 1852 1853void ath10k_ce_dump_registers(struct ath10k *ar, 1854 struct ath10k_fw_crash_data *crash_data) 1855{ 1856 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1857 struct ath10k_ce_crash_data ce_data; 1858 u32 addr, id; 1859 1860 lockdep_assert_held(&ar->dump_mutex); 1861 1862 ath10k_err(ar, "Copy Engine register dump:\n"); 1863 1864 spin_lock_bh(&ce->ce_lock); 1865 for (id = 0; id < CE_COUNT; id++) { 1866 addr = ath10k_ce_base_address(ar, id); 1867 ce_data.base_addr = cpu_to_le32(addr); 1868 1869 ce_data.src_wr_idx = 1870 cpu_to_le32(ath10k_ce_src_ring_write_index_get(ar, addr)); 1871 ce_data.src_r_idx = 1872 cpu_to_le32(ath10k_ce_src_ring_read_index_get(ar, addr)); 1873 ce_data.dst_wr_idx = 1874 cpu_to_le32(ath10k_ce_dest_ring_write_index_get(ar, addr)); 1875 ce_data.dst_r_idx = 1876 cpu_to_le32(ath10k_ce_dest_ring_read_index_get(ar, addr)); 1877 1878 if (crash_data) 1879 crash_data->ce_crash_data[id] = ce_data; 1880 1881 ath10k_err(ar, "[%02d]: 0x%08x %3u %3u %3u %3u", id, 1882 le32_to_cpu(ce_data.base_addr), 1883 le32_to_cpu(ce_data.src_wr_idx), 1884 le32_to_cpu(ce_data.src_r_idx), 1885 le32_to_cpu(ce_data.dst_wr_idx), 1886 le32_to_cpu(ce_data.dst_r_idx)); 1887 } 1888 1889 spin_unlock_bh(&ce->ce_lock); 1890} 1891EXPORT_SYMBOL(ath10k_ce_dump_registers); 1892 1893static const struct ath10k_ce_ops ce_ops = { 1894 .ce_alloc_src_ring = ath10k_ce_alloc_src_ring, 1895 .ce_alloc_dst_ring = ath10k_ce_alloc_dest_ring, 1896 .ce_rx_post_buf = __ath10k_ce_rx_post_buf, 1897 .ce_completed_recv_next_nolock = _ath10k_ce_completed_recv_next_nolock, 1898 .ce_revoke_recv_next = _ath10k_ce_revoke_recv_next, 1899 .ce_extract_desc_data = ath10k_ce_extract_desc_data, 1900 .ce_free_pipe = _ath10k_ce_free_pipe, 1901 .ce_send_nolock = _ath10k_ce_send_nolock, 1902 .ce_set_src_ring_base_addr_hi = NULL, 1903 .ce_set_dest_ring_base_addr_hi = NULL, 1904 .ce_completed_send_next_nolock = _ath10k_ce_completed_send_next_nolock, 1905}; 1906 1907static const struct ath10k_ce_ops ce_64_ops = { 1908 .ce_alloc_src_ring = ath10k_ce_alloc_src_ring_64, 1909 .ce_alloc_dst_ring = ath10k_ce_alloc_dest_ring_64, 1910 .ce_rx_post_buf = __ath10k_ce_rx_post_buf_64, 1911 .ce_completed_recv_next_nolock = 1912 _ath10k_ce_completed_recv_next_nolock_64, 1913 .ce_revoke_recv_next = _ath10k_ce_revoke_recv_next_64, 1914 .ce_extract_desc_data = ath10k_ce_extract_desc_data_64, 1915 .ce_free_pipe = _ath10k_ce_free_pipe_64, 1916 .ce_send_nolock = _ath10k_ce_send_nolock_64, 1917 .ce_set_src_ring_base_addr_hi = ath10k_ce_set_src_ring_base_addr_hi, 1918 .ce_set_dest_ring_base_addr_hi = ath10k_ce_set_dest_ring_base_addr_hi, 1919 .ce_completed_send_next_nolock = _ath10k_ce_completed_send_next_nolock_64, 1920}; 1921 1922static void ath10k_ce_set_ops(struct ath10k *ar, 1923 struct ath10k_ce_pipe *ce_state) 1924{ 1925 switch (ar->hw_rev) { 1926 case ATH10K_HW_WCN3990: 1927 ce_state->ops = &ce_64_ops; 1928 break; 1929 default: 1930 ce_state->ops = &ce_ops; 1931 break; 1932 } 1933} 1934 1935int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id, 1936 const struct ce_attr *attr) 1937{ 1938 struct ath10k_ce *ce = ath10k_ce_priv(ar); 1939 struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id]; 1940 int ret; 1941 1942 ath10k_ce_set_ops(ar, ce_state); 1943 /* Make sure there's enough CE ringbuffer entries for HTT TX to avoid 1944 * additional TX locking checks. 1945 * 1946 * For the lack of a better place do the check here. 1947 */ 1948 BUILD_BUG_ON(2 * TARGET_NUM_MSDU_DESC > 1949 (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); 1950 BUILD_BUG_ON(2 * TARGET_10_4_NUM_MSDU_DESC_PFC > 1951 (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); 1952 BUILD_BUG_ON(2 * TARGET_TLV_NUM_MSDU_DESC > 1953 (CE_HTT_H2T_MSG_SRC_NENTRIES - 1)); 1954 1955 ce_state->ar = ar; 1956 ce_state->id = ce_id; 1957 ce_state->ctrl_addr = ath10k_ce_base_address(ar, ce_id); 1958 ce_state->attr_flags = attr->flags; 1959 ce_state->src_sz_max = attr->src_sz_max; 1960 1961 if (attr->src_nentries) 1962 ce_state->send_cb = attr->send_cb; 1963 1964 if (attr->dest_nentries) 1965 ce_state->recv_cb = attr->recv_cb; 1966 1967 if (attr->src_nentries) { 1968 ce_state->src_ring = 1969 ce_state->ops->ce_alloc_src_ring(ar, ce_id, attr); 1970 if (IS_ERR(ce_state->src_ring)) { 1971 ret = PTR_ERR(ce_state->src_ring); 1972 ath10k_err(ar, "failed to alloc CE src ring %d: %d\n", 1973 ce_id, ret); 1974 ce_state->src_ring = NULL; 1975 return ret; 1976 } 1977 } 1978 1979 if (attr->dest_nentries) { 1980 ce_state->dest_ring = ce_state->ops->ce_alloc_dst_ring(ar, 1981 ce_id, 1982 attr); 1983 if (IS_ERR(ce_state->dest_ring)) { 1984 ret = PTR_ERR(ce_state->dest_ring); 1985 ath10k_err(ar, "failed to alloc CE dest ring %d: %d\n", 1986 ce_id, ret); 1987 ce_state->dest_ring = NULL; 1988 return ret; 1989 } 1990 } 1991 1992 return 0; 1993} 1994EXPORT_SYMBOL(ath10k_ce_alloc_pipe); 1995 1996void ath10k_ce_alloc_rri(struct ath10k *ar) 1997{ 1998 int i; 1999 u32 value; 2000 u32 ctrl1_regs; 2001 u32 ce_base_addr; 2002 struct ath10k_ce *ce = ath10k_ce_priv(ar); 2003 2004 ce->vaddr_rri = dma_alloc_coherent(ar->dev, 2005 (CE_COUNT * sizeof(u32)), 2006 &ce->paddr_rri, GFP_KERNEL); 2007 2008 if (!ce->vaddr_rri) 2009 return; 2010 2011 ath10k_ce_write32(ar, ar->hw_ce_regs->ce_rri_low, 2012 lower_32_bits(ce->paddr_rri)); 2013 ath10k_ce_write32(ar, ar->hw_ce_regs->ce_rri_high, 2014 (upper_32_bits(ce->paddr_rri) & 2015 CE_DESC_ADDR_HI_MASK)); 2016 2017 for (i = 0; i < CE_COUNT; i++) { 2018 ctrl1_regs = ar->hw_ce_regs->ctrl1_regs->addr; 2019 ce_base_addr = ath10k_ce_base_address(ar, i); 2020 value = ath10k_ce_read32(ar, ce_base_addr + ctrl1_regs); 2021 value |= ar->hw_ce_regs->upd->mask; 2022 ath10k_ce_write32(ar, ce_base_addr + ctrl1_regs, value); 2023 } 2024} 2025EXPORT_SYMBOL(ath10k_ce_alloc_rri); 2026 2027void ath10k_ce_free_rri(struct ath10k *ar) 2028{ 2029 struct ath10k_ce *ce = ath10k_ce_priv(ar); 2030 2031 dma_free_coherent(ar->dev, (CE_COUNT * sizeof(u32)), 2032 ce->vaddr_rri, 2033 ce->paddr_rri); 2034} 2035EXPORT_SYMBOL(ath10k_ce_free_rri);