cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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);