/**
 * Copyright (c) 2012-2012 Quantenna Communications, Inc.
 * All rights reserved.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 **/

#ifndef __QDPC_INIT_H_
#define __QDPC_INIT_H_

#include <asm/io.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include "topaz_vnet.h"

#define QDPC_MODULE_NAME                 "qdpc_ruby"
#define QDPC_DEV_NAME                    "qdpc_ruby"
#define QDPC_MODULE_VERSION              "1.0"

/* PCIe device information declarations */
#define  QDPC_VENDOR_ID                   0x1bb5
#define  QDPC_DEVICE_ID                   0x0008
#define  QDPC_PCIE_NUM_BARS               6

/* PCIe Configuration Space Defines */
#define	QDPC_LINK_DOWN	0xffffffff /* Used to indicate link went down */
#define	QDPC_VENDOR_ID_OFFSET	0x00
#define	QDPC_INT_LINE_OFFSET	0x3C
#define	QDPC_ROW_INCR_OFFSET	0x04
#undef	QDPC_CS_DEBUG

extern unsigned int (*qdpc_pci_readl)(void *addr);
extern void (*qdpc_pci_writel)(unsigned int val, void *addr);

/*
 * End-point(EP) is little-Endian.
 * These two macros are used for host side outbound window memory access.
 * Outbound here is host side view-point. So memory accessed by these two macros
 * should be on EP side.
 * NOTE: On some platforms, outbound hardware swap(byte order swap) should be
 * enabled for outbound memory access correctly. If enabled, Endian translation
 * will be done by hardware, and software Endian translation should be disabled.
 * */
#ifdef OUTBOUND_HW_SWAP
	#define le32_readl(x)           readl(x)
	#define le32_writel(x, addr)    writel(x, addr)
#else
	#define le32_readl(x)           le32_to_cpu(readl((x)))
	#define le32_writel(x, addr)    writel(cpu_to_le32((x)), addr)
#endif

static inline unsigned int qdpc_readl(void *addr)
{
	return readl(addr);
}
static inline void qdpc_writel(unsigned int val, void *addr)
{
	writel(val, addr);
}
static inline unsigned int qdpc_le32_readl(void *addr)
{
	return le32_to_cpu(readl((addr)));
}
static inline void qdpc_le32_writel(unsigned int val, void *addr)
{
	writel(cpu_to_le32((val)), addr);
}

static inline void qdpc_pcie_posted_write(uint32_t val, __iomem void *basereg)
{
	qdpc_pci_writel(val,basereg);
	/* flush posted write */
	qdpc_pci_readl(basereg);
}

static inline int qdpc_isbootstate(struct vmac_priv *p, uint32_t state) {
	__iomem uint32_t *status = &p->bda->bda_bootstate;
	uint32_t s = qdpc_pci_readl(status);
	return (s == state);
}
static inline int qdpc_booterror(struct vmac_priv *p) {
	__iomem uint32_t *status = &p->bda->bda_flags;
	uint32_t s = qdpc_pci_readl(status);
	return (s & PCIE_BDA_ERROR_MASK);
}
static inline void qdpc_setbootstate(struct vmac_priv *p, uint32_t state) {
	__iomem qdpc_pcie_bda_t *bda = p->bda;

	qdpc_pcie_posted_write(state, &bda->bda_bootstate);
}

/* Function prototypes */
int qdpc_pcie_init_intr_and_mem(struct vmac_priv *priv);
void qdpc_interrupt_target(struct vmac_priv *priv, uint32_t intr);
void qdpc_disable_irqs(struct vmac_priv *priv);
void qdpc_enable_irqs(struct vmac_priv *priv);
void qdpc_free_interrupt(struct pci_dev *pdev);
void qdpc_pcie_free_mem(struct pci_dev *pdev);
void qdpc_init_target_buffers(void *data);
int qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev);
void *qdpc_map_pciemem(unsigned long busaddr, size_t len);
void qdpc_unmap_pciemem(unsigned long busaddr, void *vaddr, size_t len);
int qdpc_unmap_iomem(struct vmac_priv *priv);
int32_t qdpc_set_dma_mask(struct vmac_priv *priv);

#endif
