xref: /linux/include/linux/ism.h (revision b3bf7602)
11baedb13SStefan Raspl /* SPDX-License-Identifier: GPL-2.0 */
21baedb13SStefan Raspl /*
31baedb13SStefan Raspl  *  Internal Shared Memory
41baedb13SStefan Raspl  *
51baedb13SStefan Raspl  *  Definitions for the ISM module
61baedb13SStefan Raspl  *
71baedb13SStefan Raspl  *  Copyright IBM Corp. 2022
81baedb13SStefan Raspl  */
91baedb13SStefan Raspl #ifndef _ISM_H
101baedb13SStefan Raspl #define _ISM_H
111baedb13SStefan Raspl 
1289e7d2baSStefan Raspl #include <linux/workqueue.h>
1389e7d2baSStefan Raspl 
141baedb13SStefan Raspl struct ism_dmb {
151baedb13SStefan Raspl 	u64 dmb_tok;
161baedb13SStefan Raspl 	u64 rgid;
171baedb13SStefan Raspl 	u32 dmb_len;
181baedb13SStefan Raspl 	u32 sba_idx;
191baedb13SStefan Raspl 	u32 vlan_valid;
201baedb13SStefan Raspl 	u32 vlan_id;
211baedb13SStefan Raspl 	void *cpu_addr;
221baedb13SStefan Raspl 	dma_addr_t dma_addr;
231baedb13SStefan Raspl };
241baedb13SStefan Raspl 
2589e7d2baSStefan Raspl /* Unless we gain unexpected popularity, this limit should hold for a while */
2689e7d2baSStefan Raspl #define MAX_CLIENTS		8
2789e7d2baSStefan Raspl #define ISM_NR_DMBS		1920
2889e7d2baSStefan Raspl 
2989e7d2baSStefan Raspl struct ism_dev {
3089e7d2baSStefan Raspl 	spinlock_t lock; /* protects the ism device */
3189e7d2baSStefan Raspl 	struct list_head list;
3289e7d2baSStefan Raspl 	struct pci_dev *pdev;
3389e7d2baSStefan Raspl 
3489e7d2baSStefan Raspl 	struct ism_sba *sba;
3589e7d2baSStefan Raspl 	dma_addr_t sba_dma_addr;
3689e7d2baSStefan Raspl 	DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
3789e7d2baSStefan Raspl 	u8 *sba_client_arr;	/* entries are indices into 'clients' array */
3889e7d2baSStefan Raspl 	void *priv[MAX_CLIENTS];
3989e7d2baSStefan Raspl 
4089e7d2baSStefan Raspl 	struct ism_eq *ieq;
4189e7d2baSStefan Raspl 	dma_addr_t ieq_dma_addr;
4289e7d2baSStefan Raspl 
4389e7d2baSStefan Raspl 	struct device dev;
4489e7d2baSStefan Raspl 	u64 local_gid;
4589e7d2baSStefan Raspl 	int ieq_idx;
4689e7d2baSStefan Raspl 
47*6b5c13b5SNiklas Schnelle 	struct ism_client *subs[MAX_CLIENTS];
4889e7d2baSStefan Raspl };
4989e7d2baSStefan Raspl 
5089e7d2baSStefan Raspl struct ism_event {
5189e7d2baSStefan Raspl 	u32 type;
5289e7d2baSStefan Raspl 	u32 code;
5389e7d2baSStefan Raspl 	u64 tok;
5489e7d2baSStefan Raspl 	u64 time;
5589e7d2baSStefan Raspl 	u64 info;
5689e7d2baSStefan Raspl };
5789e7d2baSStefan Raspl 
5889e7d2baSStefan Raspl struct ism_client {
5989e7d2baSStefan Raspl 	const char *name;
6089e7d2baSStefan Raspl 	void (*add)(struct ism_dev *dev);
6189e7d2baSStefan Raspl 	void (*remove)(struct ism_dev *dev);
6289e7d2baSStefan Raspl 	void (*handle_event)(struct ism_dev *dev, struct ism_event *event);
6389e7d2baSStefan Raspl 	/* Parameter dmbemask contains a bit vector with updated DMBEs, if sent
6489e7d2baSStefan Raspl 	 * via ism_move_data(). Callback function must handle all active bits
6589e7d2baSStefan Raspl 	 * indicated by dmbemask.
6689e7d2baSStefan Raspl 	 */
6789e7d2baSStefan Raspl 	void (*handle_irq)(struct ism_dev *dev, unsigned int bit, u16 dmbemask);
6889e7d2baSStefan Raspl 	/* Private area - don't touch! */
6989e7d2baSStefan Raspl 	u8 id;
7089e7d2baSStefan Raspl };
7189e7d2baSStefan Raspl 
7289e7d2baSStefan Raspl int ism_register_client(struct ism_client *client);
7389e7d2baSStefan Raspl int  ism_unregister_client(struct ism_client *client);
ism_get_priv(struct ism_dev * dev,struct ism_client * client)7489e7d2baSStefan Raspl static inline void *ism_get_priv(struct ism_dev *dev,
7589e7d2baSStefan Raspl 				 struct ism_client *client) {
7689e7d2baSStefan Raspl 	return dev->priv[client->id];
7789e7d2baSStefan Raspl }
7889e7d2baSStefan Raspl 
ism_set_priv(struct ism_dev * dev,struct ism_client * client,void * priv)7989e7d2baSStefan Raspl static inline void ism_set_priv(struct ism_dev *dev, struct ism_client *client,
8089e7d2baSStefan Raspl 				void *priv) {
8189e7d2baSStefan Raspl 	dev->priv[client->id] = priv;
8289e7d2baSStefan Raspl }
8389e7d2baSStefan Raspl 
849de4df7bSStefan Raspl int  ism_register_dmb(struct ism_dev *dev, struct ism_dmb *dmb,
859de4df7bSStefan Raspl 		      struct ism_client *client);
869de4df7bSStefan Raspl int  ism_unregister_dmb(struct ism_dev *dev, struct ism_dmb *dmb);
879de4df7bSStefan Raspl int  ism_move(struct ism_dev *dev, u64 dmb_tok, unsigned int idx, bool sf,
889de4df7bSStefan Raspl 	      unsigned int offset, void *data, unsigned int size);
899de4df7bSStefan Raspl 
90820f2100SStefan Raspl const struct smcd_ops *ism_get_smcd_ops(void);
91820f2100SStefan Raspl 
921baedb13SStefan Raspl #endif	/* _ISM_H */
93