root/drivers/net/wireless/ath/ath10k/ce.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. shadow_sr_wr_ind_addr
  2. shadow_dst_wr_ind_addr
  3. ath10k_set_ring_byte
  4. ath10k_get_ring_byte
  5. ath10k_ce_read32
  6. ath10k_ce_write32
  7. ath10k_ce_dest_ring_write_index_set
  8. ath10k_ce_dest_ring_write_index_get
  9. ath10k_ce_src_ring_write_index_set
  10. ath10k_ce_src_ring_write_index_get
  11. ath10k_ce_src_ring_read_index_from_ddr
  12. ath10k_ce_src_ring_read_index_get
  13. ath10k_ce_shadow_src_ring_write_index_set
  14. ath10k_ce_shadow_dest_ring_write_index_set
  15. ath10k_ce_src_ring_base_addr_set
  16. ath10k_ce_set_src_ring_base_addr_hi
  17. ath10k_ce_src_ring_size_set
  18. ath10k_ce_src_ring_dmax_set
  19. ath10k_ce_src_ring_byte_swap_set
  20. ath10k_ce_dest_ring_byte_swap_set
  21. ath10k_ce_dest_ring_read_index_from_ddr
  22. ath10k_ce_dest_ring_read_index_get
  23. ath10k_ce_dest_ring_base_addr_set
  24. ath10k_ce_set_dest_ring_base_addr_hi
  25. ath10k_ce_dest_ring_size_set
  26. ath10k_ce_src_ring_highmark_set
  27. ath10k_ce_src_ring_lowmark_set
  28. ath10k_ce_dest_ring_highmark_set
  29. ath10k_ce_dest_ring_lowmark_set
  30. ath10k_ce_copy_complete_inter_enable
  31. ath10k_ce_copy_complete_intr_disable
  32. ath10k_ce_watermark_intr_disable
  33. ath10k_ce_error_intr_enable
  34. ath10k_ce_error_intr_disable
  35. ath10k_ce_engine_int_status_clear
  36. _ath10k_ce_send_nolock
  37. _ath10k_ce_send_nolock_64
  38. ath10k_ce_send_nolock
  39. __ath10k_ce_send_revert
  40. ath10k_ce_send
  41. ath10k_ce_num_free_src_entries
  42. __ath10k_ce_rx_num_free_bufs
  43. __ath10k_ce_rx_post_buf
  44. __ath10k_ce_rx_post_buf_64
  45. ath10k_ce_rx_update_write_idx
  46. ath10k_ce_rx_post_buf
  47. _ath10k_ce_completed_recv_next_nolock
  48. _ath10k_ce_completed_recv_next_nolock_64
  49. ath10k_ce_completed_recv_next_nolock
  50. ath10k_ce_completed_recv_next
  51. _ath10k_ce_revoke_recv_next
  52. _ath10k_ce_revoke_recv_next_64
  53. ath10k_ce_revoke_recv_next
  54. _ath10k_ce_completed_send_next_nolock
  55. _ath10k_ce_completed_send_next_nolock_64
  56. ath10k_ce_completed_send_next_nolock
  57. ath10k_ce_extract_desc_data
  58. ath10k_ce_extract_desc_data_64
  59. ath10k_ce_cancel_send_next
  60. ath10k_ce_completed_send_next
  61. ath10k_ce_per_engine_service
  62. ath10k_ce_per_engine_service_any
  63. ath10k_ce_per_engine_handler_adjust
  64. ath10k_ce_disable_interrupts
  65. ath10k_ce_enable_interrupts
  66. ath10k_ce_init_src_ring
  67. ath10k_ce_init_dest_ring
  68. ath10k_ce_alloc_shadow_base
  69. ath10k_ce_alloc_src_ring
  70. ath10k_ce_alloc_src_ring_64
  71. ath10k_ce_alloc_dest_ring
  72. ath10k_ce_alloc_dest_ring_64
  73. ath10k_ce_init_pipe
  74. ath10k_ce_deinit_src_ring
  75. ath10k_ce_deinit_dest_ring
  76. ath10k_ce_deinit_pipe
  77. _ath10k_ce_free_pipe
  78. _ath10k_ce_free_pipe_64
  79. ath10k_ce_free_pipe
  80. ath10k_ce_dump_registers
  81. ath10k_ce_set_ops
  82. ath10k_ce_alloc_pipe
  83. ath10k_ce_alloc_rri
  84. ath10k_ce_free_rri

   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 
  51 static 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 
  80 static 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 
 119 static inline unsigned int
 120 ath10k_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 
 126 static inline unsigned int
 127 ath10k_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 
 133 static 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 
 140 static 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 
 147 static 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 
 155 static 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 
 162 static 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 
 170 static 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 
 177 static 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 
 185 static 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 
 203 static inline void
 204 ath10k_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 
 211 static inline void
 212 ath10k_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 
 219 static 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 
 237 static 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 
 247 static 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 
 255 static 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 
 269 static 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 
 283 static 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 
 297 static 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 
 306 static 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 
 324 static 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 
 342 static 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 
 357 static 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 
 365 static 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 
 377 static 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 
 389 static 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 
 401 static 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 
 413 static 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 
 425 static 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 
 437 static 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 
 449 static 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 
 462 static 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 
 475 static 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  */
 488 static 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;
 541 exit:
 542         return ret;
 543 }
 544 
 545 static 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;
 622 exit:
 623         return ret;
 624 }
 625 
 626 int 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 }
 636 EXPORT_SYMBOL(ath10k_ce_send_nolock);
 637 
 638 void __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 }
 664 EXPORT_SYMBOL(__ath10k_ce_send_revert);
 665 
 666 int 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 }
 684 EXPORT_SYMBOL(ath10k_ce_send);
 685 
 686 int 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 }
 700 EXPORT_SYMBOL(ath10k_ce_num_free_src_entries);
 701 
 702 int __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 }
 715 EXPORT_SYMBOL(__ath10k_ce_rx_num_free_bufs);
 716 
 717 static 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 
 747 static 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 
 780 void 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 }
 799 EXPORT_SYMBOL(ath10k_ce_rx_update_write_idx);
 800 
 801 int 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 }
 814 EXPORT_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  */
 820 static 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 
 870 static 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 
 919 int 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 }
 927 EXPORT_SYMBOL(ath10k_ce_completed_recv_next_nolock);
 928 
 929 int 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 }
 946 EXPORT_SYMBOL(ath10k_ce_completed_recv_next);
 947 
 948 static 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 
1001 static 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 
1055 int 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 }
1063 EXPORT_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  */
1069 static 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 
1122 static 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 
1175 int 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 }
1181 EXPORT_SYMBOL(ath10k_ce_completed_send_next_nolock);
1182 
1183 static 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 
1200 static 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 */
1219 int 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 }
1271 EXPORT_SYMBOL(ath10k_ce_cancel_send_next);
1272 
1273 int 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 }
1287 EXPORT_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  */
1295 void 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         spin_lock_bh(&ce->ce_lock);
1303 
1304         /* Clear the copy-complete interrupts that will be handled here. */
1305         ath10k_ce_engine_int_status_clear(ar, ctrl_addr,
1306                                           wm_regs->cc_mask);
1307 
1308         spin_unlock_bh(&ce->ce_lock);
1309 
1310         if (ce_state->recv_cb)
1311                 ce_state->recv_cb(ce_state);
1312 
1313         if (ce_state->send_cb)
1314                 ce_state->send_cb(ce_state);
1315 
1316         spin_lock_bh(&ce->ce_lock);
1317 
1318         /*
1319          * Misc CE interrupts are not being handled, but still need
1320          * to be cleared.
1321          */
1322         ath10k_ce_engine_int_status_clear(ar, ctrl_addr, wm_regs->wm_mask);
1323 
1324         spin_unlock_bh(&ce->ce_lock);
1325 }
1326 EXPORT_SYMBOL(ath10k_ce_per_engine_service);
1327 
1328 /*
1329  * Handler for per-engine interrupts on ALL active CEs.
1330  * This is used in cases where the system is sharing a
1331  * single interrput for all CEs
1332  */
1333 
1334 void ath10k_ce_per_engine_service_any(struct ath10k *ar)
1335 {
1336         int ce_id;
1337         u32 intr_summary;
1338 
1339         intr_summary = ath10k_ce_interrupt_summary(ar);
1340 
1341         for (ce_id = 0; intr_summary && (ce_id < CE_COUNT); ce_id++) {
1342                 if (intr_summary & (1 << ce_id))
1343                         intr_summary &= ~(1 << ce_id);
1344                 else
1345                         /* no intr pending on this CE */
1346                         continue;
1347 
1348                 ath10k_ce_per_engine_service(ar, ce_id);
1349         }
1350 }
1351 EXPORT_SYMBOL(ath10k_ce_per_engine_service_any);
1352 
1353 /*
1354  * Adjust interrupts for the copy complete handler.
1355  * If it's needed for either send or recv, then unmask
1356  * this interrupt; otherwise, mask it.
1357  *
1358  * Called with ce_lock held.
1359  */
1360 static void ath10k_ce_per_engine_handler_adjust(struct ath10k_ce_pipe *ce_state)
1361 {
1362         u32 ctrl_addr = ce_state->ctrl_addr;
1363         struct ath10k *ar = ce_state->ar;
1364         bool disable_copy_compl_intr = ce_state->attr_flags & CE_ATTR_DIS_INTR;
1365 
1366         if ((!disable_copy_compl_intr) &&
1367             (ce_state->send_cb || ce_state->recv_cb))
1368                 ath10k_ce_copy_complete_inter_enable(ar, ctrl_addr);
1369         else
1370                 ath10k_ce_copy_complete_intr_disable(ar, ctrl_addr);
1371 
1372         ath10k_ce_watermark_intr_disable(ar, ctrl_addr);
1373 }
1374 
1375 int ath10k_ce_disable_interrupts(struct ath10k *ar)
1376 {
1377         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1378         struct ath10k_ce_pipe *ce_state;
1379         u32 ctrl_addr;
1380         int ce_id;
1381 
1382         for (ce_id = 0; ce_id < CE_COUNT; ce_id++) {
1383                 ce_state  = &ce->ce_states[ce_id];
1384                 if (ce_state->attr_flags & CE_ATTR_POLL)
1385                         continue;
1386 
1387                 ctrl_addr = ath10k_ce_base_address(ar, ce_id);
1388 
1389                 ath10k_ce_copy_complete_intr_disable(ar, ctrl_addr);
1390                 ath10k_ce_error_intr_disable(ar, ctrl_addr);
1391                 ath10k_ce_watermark_intr_disable(ar, ctrl_addr);
1392         }
1393 
1394         return 0;
1395 }
1396 EXPORT_SYMBOL(ath10k_ce_disable_interrupts);
1397 
1398 void ath10k_ce_enable_interrupts(struct ath10k *ar)
1399 {
1400         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1401         int ce_id;
1402         struct ath10k_ce_pipe *ce_state;
1403 
1404         /* Enable interrupts for copy engine that
1405          * are not using polling mode.
1406          */
1407         for (ce_id = 0; ce_id < CE_COUNT; ce_id++) {
1408                 ce_state  = &ce->ce_states[ce_id];
1409                 if (ce_state->attr_flags & CE_ATTR_POLL)
1410                         continue;
1411 
1412                 ath10k_ce_per_engine_handler_adjust(ce_state);
1413         }
1414 }
1415 EXPORT_SYMBOL(ath10k_ce_enable_interrupts);
1416 
1417 static int ath10k_ce_init_src_ring(struct ath10k *ar,
1418                                    unsigned int ce_id,
1419                                    const struct ce_attr *attr)
1420 {
1421         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1422         struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
1423         struct ath10k_ce_ring *src_ring = ce_state->src_ring;
1424         u32 nentries, ctrl_addr = ath10k_ce_base_address(ar, ce_id);
1425 
1426         nentries = roundup_pow_of_two(attr->src_nentries);
1427 
1428         if (ar->hw_params.target_64bit)
1429                 memset(src_ring->base_addr_owner_space, 0,
1430                        nentries * sizeof(struct ce_desc_64));
1431         else
1432                 memset(src_ring->base_addr_owner_space, 0,
1433                        nentries * sizeof(struct ce_desc));
1434 
1435         src_ring->sw_index = ath10k_ce_src_ring_read_index_get(ar, ctrl_addr);
1436         src_ring->sw_index &= src_ring->nentries_mask;
1437         src_ring->hw_index = src_ring->sw_index;
1438 
1439         src_ring->write_index =
1440                 ath10k_ce_src_ring_write_index_get(ar, ctrl_addr);
1441         src_ring->write_index &= src_ring->nentries_mask;
1442 
1443         ath10k_ce_src_ring_base_addr_set(ar, ce_id,
1444                                          src_ring->base_addr_ce_space);
1445         ath10k_ce_src_ring_size_set(ar, ctrl_addr, nentries);
1446         ath10k_ce_src_ring_dmax_set(ar, ctrl_addr, attr->src_sz_max);
1447         ath10k_ce_src_ring_byte_swap_set(ar, ctrl_addr, 0);
1448         ath10k_ce_src_ring_lowmark_set(ar, ctrl_addr, 0);
1449         ath10k_ce_src_ring_highmark_set(ar, ctrl_addr, nentries);
1450 
1451         ath10k_dbg(ar, ATH10K_DBG_BOOT,
1452                    "boot init ce src ring id %d entries %d base_addr %pK\n",
1453                    ce_id, nentries, src_ring->base_addr_owner_space);
1454 
1455         return 0;
1456 }
1457 
1458 static int ath10k_ce_init_dest_ring(struct ath10k *ar,
1459                                     unsigned int ce_id,
1460                                     const struct ce_attr *attr)
1461 {
1462         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1463         struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
1464         struct ath10k_ce_ring *dest_ring = ce_state->dest_ring;
1465         u32 nentries, ctrl_addr = ath10k_ce_base_address(ar, ce_id);
1466 
1467         nentries = roundup_pow_of_two(attr->dest_nentries);
1468 
1469         if (ar->hw_params.target_64bit)
1470                 memset(dest_ring->base_addr_owner_space, 0,
1471                        nentries * sizeof(struct ce_desc_64));
1472         else
1473                 memset(dest_ring->base_addr_owner_space, 0,
1474                        nentries * sizeof(struct ce_desc));
1475 
1476         dest_ring->sw_index = ath10k_ce_dest_ring_read_index_get(ar, ctrl_addr);
1477         dest_ring->sw_index &= dest_ring->nentries_mask;
1478         dest_ring->write_index =
1479                 ath10k_ce_dest_ring_write_index_get(ar, ctrl_addr);
1480         dest_ring->write_index &= dest_ring->nentries_mask;
1481 
1482         ath10k_ce_dest_ring_base_addr_set(ar, ce_id,
1483                                           dest_ring->base_addr_ce_space);
1484         ath10k_ce_dest_ring_size_set(ar, ctrl_addr, nentries);
1485         ath10k_ce_dest_ring_byte_swap_set(ar, ctrl_addr, 0);
1486         ath10k_ce_dest_ring_lowmark_set(ar, ctrl_addr, 0);
1487         ath10k_ce_dest_ring_highmark_set(ar, ctrl_addr, nentries);
1488 
1489         ath10k_dbg(ar, ATH10K_DBG_BOOT,
1490                    "boot ce dest ring id %d entries %d base_addr %pK\n",
1491                    ce_id, nentries, dest_ring->base_addr_owner_space);
1492 
1493         return 0;
1494 }
1495 
1496 static int ath10k_ce_alloc_shadow_base(struct ath10k *ar,
1497                                        struct ath10k_ce_ring *src_ring,
1498                                        u32 nentries)
1499 {
1500         src_ring->shadow_base_unaligned = kcalloc(nentries,
1501                                                   sizeof(struct ce_desc_64),
1502                                                   GFP_KERNEL);
1503         if (!src_ring->shadow_base_unaligned)
1504                 return -ENOMEM;
1505 
1506         src_ring->shadow_base = (struct ce_desc_64 *)
1507                         PTR_ALIGN(src_ring->shadow_base_unaligned,
1508                                   CE_DESC_RING_ALIGN);
1509         return 0;
1510 }
1511 
1512 static struct ath10k_ce_ring *
1513 ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id,
1514                          const struct ce_attr *attr)
1515 {
1516         struct ath10k_ce_ring *src_ring;
1517         u32 nentries = attr->src_nentries;
1518         dma_addr_t base_addr;
1519         int ret;
1520 
1521         nentries = roundup_pow_of_two(nentries);
1522 
1523         src_ring = kzalloc(struct_size(src_ring, per_transfer_context,
1524                                        nentries), GFP_KERNEL);
1525         if (src_ring == NULL)
1526                 return ERR_PTR(-ENOMEM);
1527 
1528         src_ring->nentries = nentries;
1529         src_ring->nentries_mask = nentries - 1;
1530 
1531         /*
1532          * Legacy platforms that do not support cache
1533          * coherent DMA are unsupported
1534          */
1535         src_ring->base_addr_owner_space_unaligned =
1536                 dma_alloc_coherent(ar->dev,
1537                                    (nentries * sizeof(struct ce_desc) +
1538                                     CE_DESC_RING_ALIGN),
1539                                    &base_addr, GFP_KERNEL);
1540         if (!src_ring->base_addr_owner_space_unaligned) {
1541                 kfree(src_ring);
1542                 return ERR_PTR(-ENOMEM);
1543         }
1544 
1545         src_ring->base_addr_ce_space_unaligned = base_addr;
1546 
1547         src_ring->base_addr_owner_space =
1548                         PTR_ALIGN(src_ring->base_addr_owner_space_unaligned,
1549                                   CE_DESC_RING_ALIGN);
1550         src_ring->base_addr_ce_space =
1551                         ALIGN(src_ring->base_addr_ce_space_unaligned,
1552                               CE_DESC_RING_ALIGN);
1553 
1554         if (ar->hw_params.shadow_reg_support) {
1555                 ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries);
1556                 if (ret) {
1557                         dma_free_coherent(ar->dev,
1558                                           (nentries * sizeof(struct ce_desc_64) +
1559                                            CE_DESC_RING_ALIGN),
1560                                           src_ring->base_addr_owner_space_unaligned,
1561                                           base_addr);
1562                         kfree(src_ring);
1563                         return ERR_PTR(ret);
1564                 }
1565         }
1566 
1567         return src_ring;
1568 }
1569 
1570 static struct ath10k_ce_ring *
1571 ath10k_ce_alloc_src_ring_64(struct ath10k *ar, unsigned int ce_id,
1572                             const struct ce_attr *attr)
1573 {
1574         struct ath10k_ce_ring *src_ring;
1575         u32 nentries = attr->src_nentries;
1576         dma_addr_t base_addr;
1577         int ret;
1578 
1579         nentries = roundup_pow_of_two(nentries);
1580 
1581         src_ring = kzalloc(struct_size(src_ring, per_transfer_context,
1582                                        nentries), GFP_KERNEL);
1583         if (!src_ring)
1584                 return ERR_PTR(-ENOMEM);
1585 
1586         src_ring->nentries = nentries;
1587         src_ring->nentries_mask = nentries - 1;
1588 
1589         /* Legacy platforms that do not support cache
1590          * coherent DMA are unsupported
1591          */
1592         src_ring->base_addr_owner_space_unaligned =
1593                 dma_alloc_coherent(ar->dev,
1594                                    (nentries * sizeof(struct ce_desc_64) +
1595                                     CE_DESC_RING_ALIGN),
1596                                    &base_addr, GFP_KERNEL);
1597         if (!src_ring->base_addr_owner_space_unaligned) {
1598                 kfree(src_ring);
1599                 return ERR_PTR(-ENOMEM);
1600         }
1601 
1602         src_ring->base_addr_ce_space_unaligned = base_addr;
1603 
1604         src_ring->base_addr_owner_space =
1605                         PTR_ALIGN(src_ring->base_addr_owner_space_unaligned,
1606                                   CE_DESC_RING_ALIGN);
1607         src_ring->base_addr_ce_space =
1608                         ALIGN(src_ring->base_addr_ce_space_unaligned,
1609                               CE_DESC_RING_ALIGN);
1610 
1611         if (ar->hw_params.shadow_reg_support) {
1612                 ret = ath10k_ce_alloc_shadow_base(ar, src_ring, nentries);
1613                 if (ret) {
1614                         dma_free_coherent(ar->dev,
1615                                           (nentries * sizeof(struct ce_desc_64) +
1616                                            CE_DESC_RING_ALIGN),
1617                                           src_ring->base_addr_owner_space_unaligned,
1618                                           base_addr);
1619                         kfree(src_ring);
1620                         return ERR_PTR(ret);
1621                 }
1622         }
1623 
1624         return src_ring;
1625 }
1626 
1627 static struct ath10k_ce_ring *
1628 ath10k_ce_alloc_dest_ring(struct ath10k *ar, unsigned int ce_id,
1629                           const struct ce_attr *attr)
1630 {
1631         struct ath10k_ce_ring *dest_ring;
1632         u32 nentries;
1633         dma_addr_t base_addr;
1634 
1635         nentries = roundup_pow_of_two(attr->dest_nentries);
1636 
1637         dest_ring = kzalloc(struct_size(dest_ring, per_transfer_context,
1638                                         nentries), GFP_KERNEL);
1639         if (dest_ring == NULL)
1640                 return ERR_PTR(-ENOMEM);
1641 
1642         dest_ring->nentries = nentries;
1643         dest_ring->nentries_mask = nentries - 1;
1644 
1645         /*
1646          * Legacy platforms that do not support cache
1647          * coherent DMA are unsupported
1648          */
1649         dest_ring->base_addr_owner_space_unaligned =
1650                 dma_alloc_coherent(ar->dev,
1651                                    (nentries * sizeof(struct ce_desc) +
1652                                     CE_DESC_RING_ALIGN),
1653                                    &base_addr, GFP_KERNEL);
1654         if (!dest_ring->base_addr_owner_space_unaligned) {
1655                 kfree(dest_ring);
1656                 return ERR_PTR(-ENOMEM);
1657         }
1658 
1659         dest_ring->base_addr_ce_space_unaligned = base_addr;
1660 
1661         dest_ring->base_addr_owner_space =
1662                         PTR_ALIGN(dest_ring->base_addr_owner_space_unaligned,
1663                                   CE_DESC_RING_ALIGN);
1664         dest_ring->base_addr_ce_space =
1665                                 ALIGN(dest_ring->base_addr_ce_space_unaligned,
1666                                       CE_DESC_RING_ALIGN);
1667 
1668         return dest_ring;
1669 }
1670 
1671 static struct ath10k_ce_ring *
1672 ath10k_ce_alloc_dest_ring_64(struct ath10k *ar, unsigned int ce_id,
1673                              const struct ce_attr *attr)
1674 {
1675         struct ath10k_ce_ring *dest_ring;
1676         u32 nentries;
1677         dma_addr_t base_addr;
1678 
1679         nentries = roundup_pow_of_two(attr->dest_nentries);
1680 
1681         dest_ring = kzalloc(struct_size(dest_ring, per_transfer_context,
1682                                         nentries), GFP_KERNEL);
1683         if (!dest_ring)
1684                 return ERR_PTR(-ENOMEM);
1685 
1686         dest_ring->nentries = nentries;
1687         dest_ring->nentries_mask = nentries - 1;
1688 
1689         /* Legacy platforms that do not support cache
1690          * coherent DMA are unsupported
1691          */
1692         dest_ring->base_addr_owner_space_unaligned =
1693                 dma_alloc_coherent(ar->dev,
1694                                    (nentries * sizeof(struct ce_desc_64) +
1695                                     CE_DESC_RING_ALIGN),
1696                                    &base_addr, GFP_KERNEL);
1697         if (!dest_ring->base_addr_owner_space_unaligned) {
1698                 kfree(dest_ring);
1699                 return ERR_PTR(-ENOMEM);
1700         }
1701 
1702         dest_ring->base_addr_ce_space_unaligned = base_addr;
1703 
1704         /* Correctly initialize memory to 0 to prevent garbage
1705          * data crashing system when download firmware
1706          */
1707         memset(dest_ring->base_addr_owner_space_unaligned, 0,
1708                nentries * sizeof(struct ce_desc_64) + CE_DESC_RING_ALIGN);
1709 
1710         dest_ring->base_addr_owner_space =
1711                         PTR_ALIGN(dest_ring->base_addr_owner_space_unaligned,
1712                                   CE_DESC_RING_ALIGN);
1713         dest_ring->base_addr_ce_space =
1714                         ALIGN(dest_ring->base_addr_ce_space_unaligned,
1715                               CE_DESC_RING_ALIGN);
1716 
1717         return dest_ring;
1718 }
1719 
1720 /*
1721  * Initialize a Copy Engine based on caller-supplied attributes.
1722  * This may be called once to initialize both source and destination
1723  * rings or it may be called twice for separate source and destination
1724  * initialization. It may be that only one side or the other is
1725  * initialized by software/firmware.
1726  */
1727 int ath10k_ce_init_pipe(struct ath10k *ar, unsigned int ce_id,
1728                         const struct ce_attr *attr)
1729 {
1730         int ret;
1731 
1732         if (attr->src_nentries) {
1733                 ret = ath10k_ce_init_src_ring(ar, ce_id, attr);
1734                 if (ret) {
1735                         ath10k_err(ar, "Failed to initialize CE src ring for ID: %d (%d)\n",
1736                                    ce_id, ret);
1737                         return ret;
1738                 }
1739         }
1740 
1741         if (attr->dest_nentries) {
1742                 ret = ath10k_ce_init_dest_ring(ar, ce_id, attr);
1743                 if (ret) {
1744                         ath10k_err(ar, "Failed to initialize CE dest ring for ID: %d (%d)\n",
1745                                    ce_id, ret);
1746                         return ret;
1747                 }
1748         }
1749 
1750         return 0;
1751 }
1752 EXPORT_SYMBOL(ath10k_ce_init_pipe);
1753 
1754 static void ath10k_ce_deinit_src_ring(struct ath10k *ar, unsigned int ce_id)
1755 {
1756         u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id);
1757 
1758         ath10k_ce_src_ring_base_addr_set(ar, ce_id, 0);
1759         ath10k_ce_src_ring_size_set(ar, ctrl_addr, 0);
1760         ath10k_ce_src_ring_dmax_set(ar, ctrl_addr, 0);
1761         ath10k_ce_src_ring_highmark_set(ar, ctrl_addr, 0);
1762 }
1763 
1764 static void ath10k_ce_deinit_dest_ring(struct ath10k *ar, unsigned int ce_id)
1765 {
1766         u32 ctrl_addr = ath10k_ce_base_address(ar, ce_id);
1767 
1768         ath10k_ce_dest_ring_base_addr_set(ar, ce_id, 0);
1769         ath10k_ce_dest_ring_size_set(ar, ctrl_addr, 0);
1770         ath10k_ce_dest_ring_highmark_set(ar, ctrl_addr, 0);
1771 }
1772 
1773 void ath10k_ce_deinit_pipe(struct ath10k *ar, unsigned int ce_id)
1774 {
1775         ath10k_ce_deinit_src_ring(ar, ce_id);
1776         ath10k_ce_deinit_dest_ring(ar, ce_id);
1777 }
1778 EXPORT_SYMBOL(ath10k_ce_deinit_pipe);
1779 
1780 static void _ath10k_ce_free_pipe(struct ath10k *ar, int ce_id)
1781 {
1782         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1783         struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
1784 
1785         if (ce_state->src_ring) {
1786                 if (ar->hw_params.shadow_reg_support)
1787                         kfree(ce_state->src_ring->shadow_base_unaligned);
1788                 dma_free_coherent(ar->dev,
1789                                   (ce_state->src_ring->nentries *
1790                                    sizeof(struct ce_desc) +
1791                                    CE_DESC_RING_ALIGN),
1792                                   ce_state->src_ring->base_addr_owner_space,
1793                                   ce_state->src_ring->base_addr_ce_space);
1794                 kfree(ce_state->src_ring);
1795         }
1796 
1797         if (ce_state->dest_ring) {
1798                 dma_free_coherent(ar->dev,
1799                                   (ce_state->dest_ring->nentries *
1800                                    sizeof(struct ce_desc) +
1801                                    CE_DESC_RING_ALIGN),
1802                                   ce_state->dest_ring->base_addr_owner_space,
1803                                   ce_state->dest_ring->base_addr_ce_space);
1804                 kfree(ce_state->dest_ring);
1805         }
1806 
1807         ce_state->src_ring = NULL;
1808         ce_state->dest_ring = NULL;
1809 }
1810 
1811 static void _ath10k_ce_free_pipe_64(struct ath10k *ar, int ce_id)
1812 {
1813         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1814         struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
1815 
1816         if (ce_state->src_ring) {
1817                 if (ar->hw_params.shadow_reg_support)
1818                         kfree(ce_state->src_ring->shadow_base_unaligned);
1819                 dma_free_coherent(ar->dev,
1820                                   (ce_state->src_ring->nentries *
1821                                    sizeof(struct ce_desc_64) +
1822                                    CE_DESC_RING_ALIGN),
1823                                   ce_state->src_ring->base_addr_owner_space,
1824                                   ce_state->src_ring->base_addr_ce_space);
1825                 kfree(ce_state->src_ring);
1826         }
1827 
1828         if (ce_state->dest_ring) {
1829                 dma_free_coherent(ar->dev,
1830                                   (ce_state->dest_ring->nentries *
1831                                    sizeof(struct ce_desc_64) +
1832                                    CE_DESC_RING_ALIGN),
1833                                   ce_state->dest_ring->base_addr_owner_space,
1834                                   ce_state->dest_ring->base_addr_ce_space);
1835                 kfree(ce_state->dest_ring);
1836         }
1837 
1838         ce_state->src_ring = NULL;
1839         ce_state->dest_ring = NULL;
1840 }
1841 
1842 void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id)
1843 {
1844         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1845         struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
1846 
1847         ce_state->ops->ce_free_pipe(ar, ce_id);
1848 }
1849 EXPORT_SYMBOL(ath10k_ce_free_pipe);
1850 
1851 void ath10k_ce_dump_registers(struct ath10k *ar,
1852                               struct ath10k_fw_crash_data *crash_data)
1853 {
1854         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1855         struct ath10k_ce_crash_data ce_data;
1856         u32 addr, id;
1857 
1858         lockdep_assert_held(&ar->dump_mutex);
1859 
1860         ath10k_err(ar, "Copy Engine register dump:\n");
1861 
1862         spin_lock_bh(&ce->ce_lock);
1863         for (id = 0; id < CE_COUNT; id++) {
1864                 addr = ath10k_ce_base_address(ar, id);
1865                 ce_data.base_addr = cpu_to_le32(addr);
1866 
1867                 ce_data.src_wr_idx =
1868                         cpu_to_le32(ath10k_ce_src_ring_write_index_get(ar, addr));
1869                 ce_data.src_r_idx =
1870                         cpu_to_le32(ath10k_ce_src_ring_read_index_get(ar, addr));
1871                 ce_data.dst_wr_idx =
1872                         cpu_to_le32(ath10k_ce_dest_ring_write_index_get(ar, addr));
1873                 ce_data.dst_r_idx =
1874                         cpu_to_le32(ath10k_ce_dest_ring_read_index_get(ar, addr));
1875 
1876                 if (crash_data)
1877                         crash_data->ce_crash_data[id] = ce_data;
1878 
1879                 ath10k_err(ar, "[%02d]: 0x%08x %3u %3u %3u %3u", id,
1880                            le32_to_cpu(ce_data.base_addr),
1881                            le32_to_cpu(ce_data.src_wr_idx),
1882                            le32_to_cpu(ce_data.src_r_idx),
1883                            le32_to_cpu(ce_data.dst_wr_idx),
1884                            le32_to_cpu(ce_data.dst_r_idx));
1885         }
1886 
1887         spin_unlock_bh(&ce->ce_lock);
1888 }
1889 EXPORT_SYMBOL(ath10k_ce_dump_registers);
1890 
1891 static const struct ath10k_ce_ops ce_ops = {
1892         .ce_alloc_src_ring = ath10k_ce_alloc_src_ring,
1893         .ce_alloc_dst_ring = ath10k_ce_alloc_dest_ring,
1894         .ce_rx_post_buf = __ath10k_ce_rx_post_buf,
1895         .ce_completed_recv_next_nolock = _ath10k_ce_completed_recv_next_nolock,
1896         .ce_revoke_recv_next = _ath10k_ce_revoke_recv_next,
1897         .ce_extract_desc_data = ath10k_ce_extract_desc_data,
1898         .ce_free_pipe = _ath10k_ce_free_pipe,
1899         .ce_send_nolock = _ath10k_ce_send_nolock,
1900         .ce_set_src_ring_base_addr_hi = NULL,
1901         .ce_set_dest_ring_base_addr_hi = NULL,
1902         .ce_completed_send_next_nolock = _ath10k_ce_completed_send_next_nolock,
1903 };
1904 
1905 static const struct ath10k_ce_ops ce_64_ops = {
1906         .ce_alloc_src_ring = ath10k_ce_alloc_src_ring_64,
1907         .ce_alloc_dst_ring = ath10k_ce_alloc_dest_ring_64,
1908         .ce_rx_post_buf = __ath10k_ce_rx_post_buf_64,
1909         .ce_completed_recv_next_nolock =
1910                                 _ath10k_ce_completed_recv_next_nolock_64,
1911         .ce_revoke_recv_next = _ath10k_ce_revoke_recv_next_64,
1912         .ce_extract_desc_data = ath10k_ce_extract_desc_data_64,
1913         .ce_free_pipe = _ath10k_ce_free_pipe_64,
1914         .ce_send_nolock = _ath10k_ce_send_nolock_64,
1915         .ce_set_src_ring_base_addr_hi = ath10k_ce_set_src_ring_base_addr_hi,
1916         .ce_set_dest_ring_base_addr_hi = ath10k_ce_set_dest_ring_base_addr_hi,
1917         .ce_completed_send_next_nolock = _ath10k_ce_completed_send_next_nolock_64,
1918 };
1919 
1920 static void ath10k_ce_set_ops(struct ath10k *ar,
1921                               struct ath10k_ce_pipe *ce_state)
1922 {
1923         switch (ar->hw_rev) {
1924         case ATH10K_HW_WCN3990:
1925                 ce_state->ops = &ce_64_ops;
1926                 break;
1927         default:
1928                 ce_state->ops = &ce_ops;
1929                 break;
1930         }
1931 }
1932 
1933 int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id,
1934                          const struct ce_attr *attr)
1935 {
1936         struct ath10k_ce *ce = ath10k_ce_priv(ar);
1937         struct ath10k_ce_pipe *ce_state = &ce->ce_states[ce_id];
1938         int ret;
1939 
1940         ath10k_ce_set_ops(ar, ce_state);
1941         /* Make sure there's enough CE ringbuffer entries for HTT TX to avoid
1942          * additional TX locking checks.
1943          *
1944          * For the lack of a better place do the check here.
1945          */
1946         BUILD_BUG_ON(2 * TARGET_NUM_MSDU_DESC >
1947                      (CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
1948         BUILD_BUG_ON(2 * TARGET_10_4_NUM_MSDU_DESC_PFC >
1949                      (CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
1950         BUILD_BUG_ON(2 * TARGET_TLV_NUM_MSDU_DESC >
1951                      (CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
1952 
1953         ce_state->ar = ar;
1954         ce_state->id = ce_id;
1955         ce_state->ctrl_addr = ath10k_ce_base_address(ar, ce_id);
1956         ce_state->attr_flags = attr->flags;
1957         ce_state->src_sz_max = attr->src_sz_max;
1958 
1959         if (attr->src_nentries)
1960                 ce_state->send_cb = attr->send_cb;
1961 
1962         if (attr->dest_nentries)
1963                 ce_state->recv_cb = attr->recv_cb;
1964 
1965         if (attr->src_nentries) {
1966                 ce_state->src_ring =
1967                         ce_state->ops->ce_alloc_src_ring(ar, ce_id, attr);
1968                 if (IS_ERR(ce_state->src_ring)) {
1969                         ret = PTR_ERR(ce_state->src_ring);
1970                         ath10k_err(ar, "failed to alloc CE src ring %d: %d\n",
1971                                    ce_id, ret);
1972                         ce_state->src_ring = NULL;
1973                         return ret;
1974                 }
1975         }
1976 
1977         if (attr->dest_nentries) {
1978                 ce_state->dest_ring = ce_state->ops->ce_alloc_dst_ring(ar,
1979                                                                         ce_id,
1980                                                                         attr);
1981                 if (IS_ERR(ce_state->dest_ring)) {
1982                         ret = PTR_ERR(ce_state->dest_ring);
1983                         ath10k_err(ar, "failed to alloc CE dest ring %d: %d\n",
1984                                    ce_id, ret);
1985                         ce_state->dest_ring = NULL;
1986                         return ret;
1987                 }
1988         }
1989 
1990         return 0;
1991 }
1992 EXPORT_SYMBOL(ath10k_ce_alloc_pipe);
1993 
1994 void ath10k_ce_alloc_rri(struct ath10k *ar)
1995 {
1996         int i;
1997         u32 value;
1998         u32 ctrl1_regs;
1999         u32 ce_base_addr;
2000         struct ath10k_ce *ce = ath10k_ce_priv(ar);
2001 
2002         ce->vaddr_rri = dma_alloc_coherent(ar->dev,
2003                                            (CE_COUNT * sizeof(u32)),
2004                                            &ce->paddr_rri, GFP_KERNEL);
2005 
2006         if (!ce->vaddr_rri)
2007                 return;
2008 
2009         ath10k_ce_write32(ar, ar->hw_ce_regs->ce_rri_low,
2010                           lower_32_bits(ce->paddr_rri));
2011         ath10k_ce_write32(ar, ar->hw_ce_regs->ce_rri_high,
2012                           (upper_32_bits(ce->paddr_rri) &
2013                           CE_DESC_ADDR_HI_MASK));
2014 
2015         for (i = 0; i < CE_COUNT; i++) {
2016                 ctrl1_regs = ar->hw_ce_regs->ctrl1_regs->addr;
2017                 ce_base_addr = ath10k_ce_base_address(ar, i);
2018                 value = ath10k_ce_read32(ar, ce_base_addr + ctrl1_regs);
2019                 value |= ar->hw_ce_regs->upd->mask;
2020                 ath10k_ce_write32(ar, ce_base_addr + ctrl1_regs, value);
2021         }
2022 
2023         memset(ce->vaddr_rri, 0, CE_COUNT * sizeof(u32));
2024 }
2025 EXPORT_SYMBOL(ath10k_ce_alloc_rri);
2026 
2027 void 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 }
2035 EXPORT_SYMBOL(ath10k_ce_free_rri);

/* [<][>][^][v][top][bottom][index][help] */