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); 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 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