/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Intel MIC Platform Software Stack (MPSS)
 *
 * Copyright(c) 2014 Intel Corporation.
 *
 * Intel Symmetric Communications Interface Bus driver.
 */
#ifndef _SCIF_BUS_H_
#define _SCIF_BUS_H_
/*
 * Everything a scif driver needs to work with any particular scif
 * hardware abstraction layer.
 */
#include <linux/dma-map-ops.h>

#include <linux/mic_common.h>
#include "../common/mic_dev.h"

struct scif_hw_dev_id {
	u32 device;
	u32 vendor;
};

#define MIC_SCIF_DEV 1
#define SCIF_DEV_ANY_ID 0xffffffff

/**
 * scif_hw_dev - representation of a hardware device abstracted for scif
 * @hw_ops: the hardware ops supported by this device
 * @id: the device type identification (used to match it with a driver)
 * @mmio: MMIO memory window
 * @aper: Aperture memory window
 * @dev: underlying device
 * @dnode - The destination node which this device will communicate with.
 * @snode - The source node for this device.
 * @dp - Self device page
 * @rdp - Remote device page
 * @dma_ch - Array of DMA channels
 * @num_dma_ch - Number of DMA channels available
 * @card_rel_da - Set to true if DMA addresses programmed in the DMA engine
 *		are relative to the card point of view
 */
struct scif_hw_dev {
	struct scif_hw_ops *hw_ops;
	struct scif_hw_dev_id id;
	struct mic_mw *mmio;
	struct mic_mw *aper;
	struct device dev;
	u8 dnode;
	u8 snode;
	void *dp;
	void __iomem *rdp;
	struct dma_chan **dma_ch;
	int num_dma_ch;
	bool card_rel_da;
};

/**
 * scif_driver - operations for a scif I/O driver
 * @driver: underlying device driver (populate name and owner).
 * @id_table: the ids serviced by this driver.
 * @probe: the function to call when a device is found.  Returns 0 or -errno.
 * @remove: the function to call when a device is removed.
 */
struct scif_driver {
	struct device_driver driver;
	const struct scif_hw_dev_id *id_table;
	int (*probe)(struct scif_hw_dev *dev);
	void (*remove)(struct scif_hw_dev *dev);
};

/**
 * scif_hw_ops - Hardware operations for accessing a SCIF device on the SCIF bus.
 *
 * @next_db: Obtain the next available doorbell.
 * @request_irq: Request an interrupt on a particular doorbell.
 * @free_irq: Free an interrupt requested previously.
 * @ack_interrupt: acknowledge an interrupt in the ISR.
 * @send_intr: Send an interrupt to the remote node on a specified doorbell.
 * @send_p2p_intr: Send an interrupt to the peer node on a specified doorbell
 * which is specifically targeted for a peer to peer node.
 * @remap: Map a buffer with the specified physical address and length.
 * @unmap: Unmap a buffer previously mapped.
 */
struct scif_hw_ops {
	int (*next_db)(struct scif_hw_dev *sdev);
	struct mic_irq * (*request_irq)(struct scif_hw_dev *sdev,
					irqreturn_t (*func)(int irq,
							    void *data),
					const char *name, void *data,
					int db);
	void (*free_irq)(struct scif_hw_dev *sdev,
			 struct mic_irq *cookie, void *data);
	void (*ack_interrupt)(struct scif_hw_dev *sdev, int num);
	void (*send_intr)(struct scif_hw_dev *sdev, int db);
	void (*send_p2p_intr)(struct scif_hw_dev *sdev, int db,
			      struct mic_mw *mw);
	void __iomem * (*remap)(struct scif_hw_dev *sdev,
				  phys_addr_t pa, size_t len);
	void (*unmap)(struct scif_hw_dev *sdev, void __iomem *va);
};

int scif_register_driver(struct scif_driver *driver);
void scif_unregister_driver(struct scif_driver *driver);
struct scif_hw_dev *
scif_register_device(struct device *pdev, int id,
		     const struct dma_map_ops *dma_ops,
		     struct scif_hw_ops *hw_ops, u8 dnode, u8 snode,
		     struct mic_mw *mmio, struct mic_mw *aper,
		     void *dp, void __iomem *rdp,
		     struct dma_chan **chan, int num_chan,
		     bool card_rel_da);
void scif_unregister_device(struct scif_hw_dev *sdev);

static inline struct scif_hw_dev *dev_to_scif(struct device *dev)
{
	return container_of(dev, struct scif_hw_dev, dev);
}

static inline struct scif_driver *drv_to_scif(struct device_driver *drv)
{
	return container_of(drv, struct scif_driver, driver);
}
#endif /* _SCIF_BUS_H */
