/*
 * (C) Copyright 2012 Quantenna Communications Inc.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#ifndef __TOPAZ_HBM_H
#define __TOPAZ_HBM_H

#include <linux/skbuff.h>
#include <qtn/qtn_buffers.h>
#include <qtn/topaz_hbm_cpuif.h>

#include <qtn/dmautil.h>
#include <asm/cacheflush.h>

#define topaz_hbm_attach_skb(buf_virt, pool)		\
	_topaz_hbm_attach_skb((buf_virt), (pool)	\
			QTN_SKB_ALLOC_TRACE_ARGSRC)
struct sk_buff *_topaz_hbm_attach_skb(void *buf_virt, int8_t pool
		QTN_SKB_ALLOC_TRACE_ARGS);

#define topaz_hbm_attach_skb_bus(buf_bus, pool)	\
	_topaz_hbm_attach_skb_bus((buf_bus), (pool)	\
			QTN_SKB_ALLOC_TRACE_ARGSRC)
static inline struct sk_buff *
_topaz_hbm_attach_skb_bus(void *buf_bus, int8_t pool
		QTN_SKB_ALLOC_TRACE_ARGS)
{
	void *buf_virt;

	if (unlikely(buf_bus == NULL)) {
		return NULL;
	}

	buf_virt = bus_to_virt((uintptr_t) buf_bus);
	if (unlikely(buf_virt == RUBY_BAD_VIRT_ADDR)) {
		return NULL;
	}

	return _topaz_hbm_attach_skb(buf_virt, pool
			QTN_SKB_ALLOC_TRACE_ARGVARS);
}

static inline void topaz_hbm_flush_skb_cache(struct sk_buff *skb)
{
	uintptr_t flush_start = (uintptr_t) align_buf_cache(skb->head);
	uintptr_t flush_end = align_val_up((uintptr_t) skb_end_pointer(skb),
			dma_get_cache_alignment());
	if (!skb->cache_is_cleaned)
		flush_and_inv_dcache_range(flush_start, flush_end);
}

void topaz_hbm_filter_txdone_pool(void);
void topaz_hbm_filter_txdone_buf(void *const buf_bus);
unsigned int topaz_hbm_pool_available(int8_t pool);
#ifdef TOPAZ_EMAC_NULL_BUF_WR
extern void (*topaz_emac_null_buf_del_cb)(void);
#endif

void topaz_hbm_release_buf_safe(void *const pkt_bus);

struct sk_buff *topaz_hbm_attach_skb_quarantine(void *buf_virt, int pool, int len, uint8_t **whole_frm_hdr);

#endif	/* __TOPAZ_HBM_H */

