162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2017 IBM Corp.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _MISC_CXLLIB_H
762306a36Sopenharmony_ci#define _MISC_CXLLIB_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/pci.h>
1062306a36Sopenharmony_ci#include <asm/reg.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci * cxl driver exports a in-kernel 'library' API which can be called by
1462306a36Sopenharmony_ci * other drivers to help interacting with an IBM XSL.
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*
1862306a36Sopenharmony_ci * tells whether capi is supported on the PCIe slot where the
1962306a36Sopenharmony_ci * device is seated
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci * Input:
2262306a36Sopenharmony_ci *	dev: device whose slot needs to be checked
2362306a36Sopenharmony_ci *	flags: 0 for the time being
2462306a36Sopenharmony_ci */
2562306a36Sopenharmony_cibool cxllib_slot_is_supported(struct pci_dev *dev, unsigned long flags);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/*
2962306a36Sopenharmony_ci * Returns the configuration parameters to be used by the XSL or device
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * Input:
3262306a36Sopenharmony_ci *	dev: device, used to find PHB
3362306a36Sopenharmony_ci * Output:
3462306a36Sopenharmony_ci *	struct cxllib_xsl_config:
3562306a36Sopenharmony_ci *		version
3662306a36Sopenharmony_ci *		capi BAR address, i.e. 0x2000000000000-0x2FFFFFFFFFFFF
3762306a36Sopenharmony_ci *		capi BAR size
3862306a36Sopenharmony_ci *		data send control (XSL_DSNCTL)
3962306a36Sopenharmony_ci *		dummy read address (XSL_DRA)
4062306a36Sopenharmony_ci */
4162306a36Sopenharmony_ci#define CXL_XSL_CONFIG_VERSION1		1
4262306a36Sopenharmony_cistruct cxllib_xsl_config {
4362306a36Sopenharmony_ci	u32	version;     /* format version for register encoding */
4462306a36Sopenharmony_ci	u32	log_bar_size;/* log size of the capi_window */
4562306a36Sopenharmony_ci	u64	bar_addr;    /* address of the start of capi window */
4662306a36Sopenharmony_ci	u64	dsnctl;      /* matches definition of XSL_DSNCTL */
4762306a36Sopenharmony_ci	u64	dra;         /* real address that can be used for dummy read */
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciint cxllib_get_xsl_config(struct pci_dev *dev, struct cxllib_xsl_config *cfg);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/*
5462306a36Sopenharmony_ci * Activate capi for the pci host bridge associated with the device.
5562306a36Sopenharmony_ci * Can be extended to deactivate once we know how to do it.
5662306a36Sopenharmony_ci * Device must be ready to accept messages from the CAPP unit and
5762306a36Sopenharmony_ci * respond accordingly (TLB invalidates, ...)
5862306a36Sopenharmony_ci *
5962306a36Sopenharmony_ci * PHB is switched to capi mode through calls to skiboot.
6062306a36Sopenharmony_ci * CAPP snooping is activated
6162306a36Sopenharmony_ci *
6262306a36Sopenharmony_ci * Input:
6362306a36Sopenharmony_ci *	dev: device whose PHB should switch mode
6462306a36Sopenharmony_ci *	mode: mode to switch to i.e. CAPI or PCI
6562306a36Sopenharmony_ci *	flags: options related to the mode
6662306a36Sopenharmony_ci */
6762306a36Sopenharmony_cienum cxllib_mode {
6862306a36Sopenharmony_ci	CXL_MODE_CXL,
6962306a36Sopenharmony_ci	CXL_MODE_PCI,
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define CXL_MODE_NO_DMA       0
7362306a36Sopenharmony_ci#define CXL_MODE_DMA_TVT0     1
7462306a36Sopenharmony_ci#define CXL_MODE_DMA_TVT1     2
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciint cxllib_switch_phb_mode(struct pci_dev *dev, enum cxllib_mode mode,
7762306a36Sopenharmony_ci			unsigned long flags);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/*
8162306a36Sopenharmony_ci * Set the device for capi DMA.
8262306a36Sopenharmony_ci * Define its dma_ops and dma offset so that allocations will be using TVT#1
8362306a36Sopenharmony_ci *
8462306a36Sopenharmony_ci * Input:
8562306a36Sopenharmony_ci *	dev: device to set
8662306a36Sopenharmony_ci *	flags: options. CXL_MODE_DMA_TVT1 should be used
8762306a36Sopenharmony_ci */
8862306a36Sopenharmony_ciint cxllib_set_device_dma(struct pci_dev *dev, unsigned long flags);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/*
9262306a36Sopenharmony_ci * Get the Process Element structure for the given thread
9362306a36Sopenharmony_ci *
9462306a36Sopenharmony_ci * Input:
9562306a36Sopenharmony_ci *    task: task_struct for the context of the translation
9662306a36Sopenharmony_ci *    translation_mode: whether addresses should be translated
9762306a36Sopenharmony_ci * Output:
9862306a36Sopenharmony_ci *    attr: attributes to fill up the Process Element structure from CAIA
9962306a36Sopenharmony_ci */
10062306a36Sopenharmony_cistruct cxllib_pe_attributes {
10162306a36Sopenharmony_ci	u64 sr;
10262306a36Sopenharmony_ci	u32 lpid;
10362306a36Sopenharmony_ci	u32 tid;
10462306a36Sopenharmony_ci	u32 pid;
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci#define CXL_TRANSLATED_MODE 0
10762306a36Sopenharmony_ci#define CXL_REAL_MODE 1
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciint cxllib_get_PE_attributes(struct task_struct *task,
11062306a36Sopenharmony_ci	     unsigned long translation_mode, struct cxllib_pe_attributes *attr);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci/*
11462306a36Sopenharmony_ci * Handle memory fault.
11562306a36Sopenharmony_ci * Fault in all the pages of the specified buffer for the permissions
11662306a36Sopenharmony_ci * provided in ‘flags’
11762306a36Sopenharmony_ci *
11862306a36Sopenharmony_ci * Shouldn't be called from interrupt context
11962306a36Sopenharmony_ci *
12062306a36Sopenharmony_ci * Input:
12162306a36Sopenharmony_ci *	mm: struct mm for the thread faulting the pages
12262306a36Sopenharmony_ci *	addr: base address of the buffer to page in
12362306a36Sopenharmony_ci *	size: size of the buffer to page in
12462306a36Sopenharmony_ci *	flags: permission requested (DSISR_ISSTORE...)
12562306a36Sopenharmony_ci */
12662306a36Sopenharmony_ciint cxllib_handle_fault(struct mm_struct *mm, u64 addr, u64 size, u64 flags);
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#endif /* _MISC_CXLLIB_H */
130