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