diff --git a/drivers/infiniband/hw/efa/efa.h b/drivers/infiniband/hw/efa/efa.h
new file mode 100644
index 000000000000..607ae107ac2c
--- /dev/null
+++ b/drivers/infiniband/hw/efa/efa.h
@@ -0,0 +1,202 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */
+/*
+ * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved.
+ */
+
+#ifndef _EFA_H_
+#define _EFA_H_
+
+#include <linux/bitops.h>
+#include <linux/idr.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/sched.h>
+
+#include <rdma/efa-abi.h>
+#include <rdma/ib_verbs.h>
+
+#include "efa_com_cmd.h"
+
+#define DRV_MODULE_NAME         "efa"
+#define DEVICE_NAME             "Elastic Fabric Adapter (EFA)"
+
+#define EFA_IRQNAME_SIZE        40
+
+/* 1 for AENQ + ADMIN */
+#define EFA_NUM_MSIX_VEC                  1
+#define EFA_MGMNT_MSIX_VEC_IDX            0
+
+#define efa_dbg(_dev, format, ...)                                      \
+	dev_dbg(_dev, "(pid %d) %s: " format, current->pid,             \
+		__func__, ##__VA_ARGS__)
+#define efa_info(_dev, format, ...)                                     \
+	dev_info(_dev, "(pid %d) %s: " format, current->pid,            \
+		 __func__, ##__VA_ARGS__)
+#define efa_warn(_dev, format, ...)                                     \
+	dev_warn(_dev, "(pid %d) %s: " format, current->pid,            \
+		 __func__, ##__VA_ARGS__)
+#define efa_err(_dev, format, ...)                                      \
+	dev_err(_dev, "(pid %d) %s: " format, current->pid,             \
+		__func__, ##__VA_ARGS__)
+#define efa_err_rl(_dev, format, ...)                                   \
+	dev_err_ratelimited(_dev, "(pid %d) %s: " format, current->pid, \
+			    __func__, ##__VA_ARGS__)
+
+#define efa_stat_inc(dev, stat)                                         \
+	do {                                                            \
+		typeof(dev) _dev = dev;                                 \
+		unsigned long flags;                                    \
+									\
+		spin_lock_irqsave(&_dev->stats_lock, flags);            \
+		(stat)++;                                               \
+		spin_unlock_irqrestore(&_dev->stats_lock, flags);       \
+	} while (0)
+
+enum {
+	EFA_DEVICE_RUNNING_BIT,
+	EFA_MSIX_ENABLED_BIT
+};
+
+struct efa_irq {
+	irq_handler_t handler;
+	void *data;
+	int cpu;
+	u32 vector;
+	cpumask_t affinity_hint_mask;
+	char name[EFA_IRQNAME_SIZE];
+};
+
+struct efa_sw_stats {
+	u64 alloc_pd_err;
+	u64 create_qp_err;
+	u64 create_cq_err;
+	u64 reg_mr_err;
+	u64 alloc_ucontext_err;
+	u64 create_ah_err;
+};
+
+struct efa_stats {
+	struct efa_sw_stats sw_stats;
+	u64                 keep_alive_rcvd;
+};
+
+struct efa_dev {
+	struct ib_device        ibdev;
+	struct pci_dev         *pdev;
+	struct efa_com_dev     *edev;
+	struct efa_com_get_device_attr_result dev_attr;
+
+	u64                     reg_bar_addr;
+	u64                     reg_bar_len;
+	u64                     mem_bar_addr;
+	u64                     mem_bar_len;
+	u64                     db_bar_addr;
+	u64                     db_bar_len;
+	u8                      addr[EFA_GID_SIZE];
+	u32                     mtu;
+
+	int                     admin_msix_vector_idx;
+	unsigned long           state;
+	struct efa_irq          admin_irq;
+
+	struct efa_stats        stats;
+	spinlock_t              stats_lock; /* Protects stats */
+};
+
+struct efa_ucontext {
+	struct ib_ucontext      ibucontext;
+	/* Protects ucontext state */
+	struct mutex            lock;
+	struct list_head        pending_mmaps;
+	u64                     mmap_key;
+	u16                     uarn;
+};
+
+struct efa_pd {
+	struct ib_pd    ibpd;
+	u16             pdn;
+};
+
+struct efa_mr {
+	struct ib_mr     ibmr;
+	struct ib_umem  *umem;
+};
+
+struct efa_cq {
+	struct ib_cq               ibcq;
+	struct efa_ucontext       *ucontext;
+	dma_addr_t                 dma_addr;
+	void                      *cpu_addr;
+	size_t                     size;
+	u16                        cq_idx;
+};
+
+struct efa_qp {
+	struct ib_qp            ibqp;
+	dma_addr_t              rq_dma_addr;
+	void                   *rq_cpu_addr;
+	size_t                  rq_size;
+	enum ib_qp_state        state;
+	u32                     qp_handle;
+	u32                     max_send_wr;
+	u32                     max_recv_wr;
+	u32                     max_send_sge;
+	u32                     max_recv_sge;
+	u32                     max_inline_data;
+};
+
+struct efa_ah {
+	struct ib_ah    ibah;
+	u16             ah;
+	/* dest_addr */
+	u8              id[EFA_GID_SIZE];
+};
+
+int efa_query_device(struct ib_device *ibdev,
+		     struct ib_device_attr *props,
+		     struct ib_udata *udata);
+int efa_query_port(struct ib_device *ibdev, u8 port,
+		   struct ib_port_attr *props);
+int efa_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
+		 int qp_attr_mask,
+		 struct ib_qp_init_attr *qp_init_attr);
+int efa_query_gid(struct ib_device *ibdev, u8 port, int index,
+		  union ib_gid *gid);
+int efa_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
+		   u16 *pkey);
+int efa_alloc_pd(struct ib_pd *ibpd,
+		 struct ib_ucontext *ibucontext,
+		 struct ib_udata *udata);
+void efa_dealloc_pd(struct ib_pd *ibpd);
+int efa_destroy_qp_handle(struct efa_dev *dev, u32 qp_handle);
+int efa_destroy_qp(struct ib_qp *ibqp);
+struct ib_qp *efa_create_qp(struct ib_pd *ibpd,
+			    struct ib_qp_init_attr *init_attr,
+			    struct ib_udata *udata);
+int efa_destroy_cq(struct ib_cq *ibcq);
+struct ib_cq *efa_create_cq(struct ib_device *ibdev,
+			    const struct ib_cq_init_attr *attr,
+			    struct ib_ucontext *ibucontext,
+			    struct ib_udata *udata);
+struct ib_mr *efa_reg_mr(struct ib_pd *ibpd, u64 start, u64 length,
+			 u64 virt_addr, int access_flags,
+			 struct ib_udata *udata);
+int efa_dereg_mr(struct ib_mr *ibmr);
+int efa_get_port_immutable(struct ib_device *ibdev, u8 port_num,
+			   struct ib_port_immutable *immutable);
+struct ib_ucontext *efa_alloc_ucontext(struct ib_device *ibdev,
+				       struct ib_udata *udata);
+int efa_dealloc_ucontext(struct ib_ucontext *ibucontext);
+int efa_mmap(struct ib_ucontext *ibucontext,
+	     struct vm_area_struct *vma);
+struct ib_ah *efa_create_ah(struct ib_pd *ibpd,
+			    struct rdma_ah_attr *ah_attr,
+			    u32 flags,
+			    struct ib_udata *udata);
+int efa_destroy_ah(struct ib_ah *ibah, u32 flags);
+int efa_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
+		  int qp_attr_mask, struct ib_udata *udata);
+enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
+					 u8 port_num);
+
+#endif /* _EFA_H_ */
