/*
 * Copyright (c) 2016 Google Inc.
 * Author: Kanoj Sarcar <kanoj@google.com>
 * See LICENSE for details.
 *
 * A majority of macros in this file should migrate to compat_todo.h,
 * which should hold source copied from Linux. Some part of macros
 * will also move into linux_compat.h to translate from Linux to
 * Akaros. A tiny portion should remain here, since those are stub
 * or hack definitions whose scope should be restricted only to mlx4u/
 * and udrvr/
 */
#include <linux_compat.h>

#include <arch/uaccess.h>	/* copy_from_user(), copy_to_user() */

#define access_ok(type, addr, size)     1

/*
 * Device file /dev/XXXX has a dentry and inode that is associated
 * with the "struct file" for each user process opening the device file.
 * Thus, we can stash private data into file->f_dentry->d_fs_info or
 * into file->f_dentry->d_inode->i_fs_info.
 */
#define set_fs_info(_p_, _v_)		\
	do { (_p_)->f_dentry->d_fs_info = (_v_); } while(0)
#define	get_fs_info(_p_)	((_p_)->f_dentry->d_fs_info)
#define	private_data			f_privdata

typedef uint8_t u8;
typedef uint8_t __u8;
typedef uint16_t u16;
typedef uint16_t __u16;
typedef uint32_t u32;
typedef uint32_t __u32;
typedef uint64_t u64;
typedef uint64_t __u64;

typedef int32_t	__s32;

typedef off64_t	loff_t;

typedef atomic_t			atomic64_t;

#define	atomic64_set			atomic_set
#define	atomic64_read			atomic_read
#define	atomic_dec_and_test(e)		atomic_sub_and_test(e, 1)
#define	atomic_inc_not_zero(p)		atomic_add_not_zero(p, 1)

#define	mutex_init(a)			qlock_init(a)
#define	mutex_lock(a)			qlock(a)
#define	mutex_unlock(a)			qunlock(a)

extern unsigned long pgprot_noncached(int vmprot);
extern unsigned long pgprot_writecombine(int vmprot);

#define is_vm_hugetlb_page(vma)	0

extern int map_upage_at_addr(struct proc *p, physaddr_t paddr, uintptr_t addr,
                             int pteprot, int dolock);
extern int get_user_page(struct proc *p, unsigned long uvastart, int write,
                         int force, struct page **plist);
extern void put_page(struct page *pagep);
extern void set_page_dirty_lock(struct page *pagep);

#define	io_remap_pfn_range(vma, vmstart, pfn, rangesz, pteprot)	\
	(rangesz == PAGE_SIZE ? map_upage_at_addr(current,	\
	((pfn) << PAGE_SHIFT), vmstart, pteprot, 1) : -1)

#define	get_user_pages(task, mm, uvastart, numpages, write, force,	\
	plist, vlist)							\
		get_user_page(task, uvastart, write, force, plist)

/* The foll is only true for mlx4/ code */
#define	read_lock(p)
#define	read_unlock(p)

#define	GFP_KERNEL			MEM_WAIT
#define	GFP_ATOMIC			0
#define	GFP_NOIO			MEM_WAIT
#define	GFP_NOWAIT			0

#define	__get_free_page(f)		kpage_alloc_addr()

static inline void free_page(unsigned long addr)
{
	if (addr != 0)
		kpages_free((void*)addr, PGSIZE);
}

#define	get_zeroed_page(f)		kpage_zalloc_addr()

#define	kzalloc(SZ, FL)			kzmalloc(SZ, FL)
#define	kcalloc(CNT, SZ, FL)		kzmalloc((CNT) * (SZ), FL)

#define	roundup_pow_of_two(E)		ROUNDUPPWR2(E)
#define	roundup(VAL, UP)		ROUNDUP(VAL, UP)
#define	min(A0, A1)			MIN(A0, A1)
#define	max(A0, A1)			MAX(A0, A1)

#define	LIST_HEAD(l)			LINUX_LIST_HEAD(l)

/*
 * Careful: these will replace "struct mutex" to "struct semaphore" but
 * also replace ptr->mutex to ptr->semaphore aka structure field rename.
 */
#define	mutex		semaphore
#define	rw_semaphore	semaphore

/* From include/linux/netdevice.h */
#define	dev_hold(p)
#define	dev_put(p)

#define	pr_info_once	printk

/* From Linux include/linux/scatterlist.h: move to compat_todo.h */
struct sg_table {
	struct scatterlist *sgl;
	unsigned int nents;
	unsigned int orig_nents;
};

extern int sg_alloc_table(struct sg_table *ptr, unsigned int npages, gfp_t mask);
void sg_free_table(struct sg_table *ptr);


/* From include/linux/compiler.h: move to compat_todo.h */
#define	__acquires(x)
#define	__releases(x)
#define	__acquire(x)			(void)0
#define	__release(x)			(void)0

/* From include/asm-generic/bug.h: move to compat_todo.h */
#define WARN_ON(condition) ({                                           \
        int __ret_warn_on = !!(condition);                              \
        if (unlikely(__ret_warn_on))                                    \
		printk("BUG: %s:%d/%s()!\n", __FILE__, __LINE__, __func__);\
        unlikely(__ret_warn_on);                                        \
})

#define	BUG_ON(condition)	\
	do {								\
		if (unlikely(condition))				\
			panic("BADBUG");				\
	} while(0)

#define	BUG()		BUG_ON(1)

/* Akaros cpu_to_be32() does not handle constants */
#undef cpu_to_be32
#define	___constant_swab32(x) ((__u32)(					\
	(((__u32)(x) & (__u32)0x000000ffUL) << 24) |			\
	(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |			\
	(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |			\
	(((__u32)(x) & (__u32)0xff000000UL) >> 24)))

#define	cpu_to_be32(x)							\
	(__builtin_constant_p((__u32)(x)) ?				\
	___constant_swab32(x) :						\
	byte_swap32(x))

#define	MAXITEMS	128

struct idr {
	spinlock_t	lock;
	void		*values[MAXITEMS];
};

#define	idr_destroy(p)
#define	idr_preload(f)
#define	idr_preload_end()

#define	DEFINE_IDR(name)			\
		struct idr name = { .lock = SPINLOCK_INITIALIZER }

void idr_remove(struct idr *idp, int id);
void *idr_find(struct idr *idr, int id);
int idr_alloc(struct idr *idp, void *ptr, int start, int end, gfp_t gfp_mask);

struct net_device {
	unsigned char dev_addr[MAX_ADDR_LEN];
};

/* Conflicting definitions in compat_todo.h */
#define	netif_carrier_ok(p)	1
#define	vm_area_struct		vm_region

#define	vm_start		vm_base
#define	vm_pgoff		vm_foff >> PAGE_SHIFT

#undef __init
#undef __exit
#define	__init	__attribute__((used))
#define	__exit	__attribute__((used))

struct cdev {
};

struct kobject {
};

typedef struct  wait_queue_head {
} wait_queue_head_t;

struct lock_class_key {
};

struct attribute {
};

struct ib_ud_header {
};

extern void sysfs_init(void);
struct file_operations;
extern void sysfs_create(int devnum, const struct file_operations *verb_fops,
                         void *ptr);

extern ssize_t check_old_abi(struct file *filp, const char __user *buf,
                             size_t count);
