summaryrefslogtreecommitdiff
path: root/drivers/scsi/cxlflash/ocxl_hw.h
blob: 85b3fad2426387a0524cfa91bbd089406aa3944f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * CXL Flash Device Driver
 *
 * Written by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
 *	       Uma Krishnan <ukrishn@linux.vnet.ibm.com>, IBM Corporation
 *
 * Copyright (C) 2018 IBM Corporation
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#define OCXL_MAX_IRQS	4	/* Max interrupts per process */

struct ocxlflash_irqs {
	int hwirq;
	u64 ptrig;
};

/* OCXL hardware AFU associated with the host */
struct ocxl_hw_afu {
	struct ocxlflash_context *ocxl_ctx; /* Host context */
	struct pci_dev *pdev;		/* PCI device */
	struct device *dev;		/* Generic device */
	bool perst_same_image;		/* Same image loaded on perst */

	struct ocxl_fn_config fcfg;	/* DVSEC config of the function */
	struct ocxl_afu_config acfg;	/* AFU configuration data */

	int fn_actag_base;		/* Function acTag base */
	int fn_actag_enabled;		/* Function acTag number enabled */
	int afu_actag_base;		/* AFU acTag base */
	int afu_actag_enabled;		/* AFU acTag number enabled */

	phys_addr_t ppmmio_phys;	/* Per process MMIO space */
	phys_addr_t gmmio_phys;		/* Global AFU MMIO space */
	void __iomem *gmmio_virt;	/* Global MMIO map */

	void *link_token;		/* Link token for the SPA */
	struct idr idr;			/* IDR to manage contexts */
	int max_pasid;			/* Maximum number of contexts */
	bool is_present;		/* Function has AFUs defined */
};

struct ocxlflash_context {
	struct ocxl_hw_afu *hw_afu;	/* HW AFU back pointer */
	struct address_space *mapping;	/* Mapping for pseudo filesystem */
	bool master;			/* Whether this is a master context */
	int pe;				/* Process element */

	phys_addr_t psn_phys;		/* Process mapping */
	u64 psn_size;			/* Process mapping size */

	struct ocxlflash_irqs *irqs;	/* Pointer to array of structures */
	int num_irqs;			/* Number of interrupts */
};