162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * CXL Flash Device Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Written by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation 662306a36Sopenharmony_ci * Uma Krishnan <ukrishn@linux.vnet.ibm.com>, IBM Corporation 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 2018 IBM Corporation 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <misc/cxl.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "backend.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* 1662306a36Sopenharmony_ci * The following routines map the cxlflash backend operations to existing CXL 1762306a36Sopenharmony_ci * kernel API function and are largely simple shims that provide an abstraction 1862306a36Sopenharmony_ci * for converting generic context and AFU cookies into cxl_context or cxl_afu 1962306a36Sopenharmony_ci * pointers. 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic void __iomem *cxlflash_psa_map(void *ctx_cookie) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci return cxl_psa_map(ctx_cookie); 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic void cxlflash_psa_unmap(void __iomem *addr) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci cxl_psa_unmap(addr); 3062306a36Sopenharmony_ci} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic int cxlflash_process_element(void *ctx_cookie) 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci return cxl_process_element(ctx_cookie); 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic int cxlflash_map_afu_irq(void *ctx_cookie, int num, 3862306a36Sopenharmony_ci irq_handler_t handler, void *cookie, char *name) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci return cxl_map_afu_irq(ctx_cookie, num, handler, cookie, name); 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic void cxlflash_unmap_afu_irq(void *ctx_cookie, int num, void *cookie) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci cxl_unmap_afu_irq(ctx_cookie, num, cookie); 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic u64 cxlflash_get_irq_objhndl(void *ctx_cookie, int irq) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci /* Dummy fop for cxl */ 5162306a36Sopenharmony_ci return 0; 5262306a36Sopenharmony_ci} 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic int cxlflash_start_context(void *ctx_cookie) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci return cxl_start_context(ctx_cookie, 0, NULL); 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistatic int cxlflash_stop_context(void *ctx_cookie) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci return cxl_stop_context(ctx_cookie); 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic int cxlflash_afu_reset(void *ctx_cookie) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci return cxl_afu_reset(ctx_cookie); 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic void cxlflash_set_master(void *ctx_cookie) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci cxl_set_master(ctx_cookie); 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic void *cxlflash_get_context(struct pci_dev *dev, void *afu_cookie) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci return cxl_get_context(dev); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic void *cxlflash_dev_context_init(struct pci_dev *dev, void *afu_cookie) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci return cxl_dev_context_init(dev); 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic int cxlflash_release_context(void *ctx_cookie) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci return cxl_release_context(ctx_cookie); 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistatic void cxlflash_perst_reloads_same_image(void *afu_cookie, bool image) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci cxl_perst_reloads_same_image(afu_cookie, image); 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic ssize_t cxlflash_read_adapter_vpd(struct pci_dev *dev, 9562306a36Sopenharmony_ci void *buf, size_t count) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci return cxl_read_adapter_vpd(dev, buf, count); 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic int cxlflash_allocate_afu_irqs(void *ctx_cookie, int num) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci return cxl_allocate_afu_irqs(ctx_cookie, num); 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic void cxlflash_free_afu_irqs(void *ctx_cookie) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci cxl_free_afu_irqs(ctx_cookie); 10862306a36Sopenharmony_ci} 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_cistatic void *cxlflash_create_afu(struct pci_dev *dev) 11162306a36Sopenharmony_ci{ 11262306a36Sopenharmony_ci return cxl_pci_to_afu(dev); 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic void cxlflash_destroy_afu(void *afu) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci /* Dummy fop for cxl */ 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistatic struct file *cxlflash_get_fd(void *ctx_cookie, 12162306a36Sopenharmony_ci struct file_operations *fops, int *fd) 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci return cxl_get_fd(ctx_cookie, fops, fd); 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic void *cxlflash_fops_get_context(struct file *file) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci return cxl_fops_get_context(file); 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cistatic int cxlflash_start_work(void *ctx_cookie, u64 irqs) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci struct cxl_ioctl_start_work work = { 0 }; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci work.num_interrupts = irqs; 13662306a36Sopenharmony_ci work.flags = CXL_START_WORK_NUM_IRQS; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci return cxl_start_work(ctx_cookie, &work); 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistatic int cxlflash_fd_mmap(struct file *file, struct vm_area_struct *vm) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci return cxl_fd_mmap(file, vm); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic int cxlflash_fd_release(struct inode *inode, struct file *file) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci return cxl_fd_release(inode, file); 14962306a36Sopenharmony_ci} 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ciconst struct cxlflash_backend_ops cxlflash_cxl_ops = { 15262306a36Sopenharmony_ci .module = THIS_MODULE, 15362306a36Sopenharmony_ci .psa_map = cxlflash_psa_map, 15462306a36Sopenharmony_ci .psa_unmap = cxlflash_psa_unmap, 15562306a36Sopenharmony_ci .process_element = cxlflash_process_element, 15662306a36Sopenharmony_ci .map_afu_irq = cxlflash_map_afu_irq, 15762306a36Sopenharmony_ci .unmap_afu_irq = cxlflash_unmap_afu_irq, 15862306a36Sopenharmony_ci .get_irq_objhndl = cxlflash_get_irq_objhndl, 15962306a36Sopenharmony_ci .start_context = cxlflash_start_context, 16062306a36Sopenharmony_ci .stop_context = cxlflash_stop_context, 16162306a36Sopenharmony_ci .afu_reset = cxlflash_afu_reset, 16262306a36Sopenharmony_ci .set_master = cxlflash_set_master, 16362306a36Sopenharmony_ci .get_context = cxlflash_get_context, 16462306a36Sopenharmony_ci .dev_context_init = cxlflash_dev_context_init, 16562306a36Sopenharmony_ci .release_context = cxlflash_release_context, 16662306a36Sopenharmony_ci .perst_reloads_same_image = cxlflash_perst_reloads_same_image, 16762306a36Sopenharmony_ci .read_adapter_vpd = cxlflash_read_adapter_vpd, 16862306a36Sopenharmony_ci .allocate_afu_irqs = cxlflash_allocate_afu_irqs, 16962306a36Sopenharmony_ci .free_afu_irqs = cxlflash_free_afu_irqs, 17062306a36Sopenharmony_ci .create_afu = cxlflash_create_afu, 17162306a36Sopenharmony_ci .destroy_afu = cxlflash_destroy_afu, 17262306a36Sopenharmony_ci .get_fd = cxlflash_get_fd, 17362306a36Sopenharmony_ci .fops_get_context = cxlflash_fops_get_context, 17462306a36Sopenharmony_ci .start_work = cxlflash_start_work, 17562306a36Sopenharmony_ci .fd_mmap = cxlflash_fd_mmap, 17662306a36Sopenharmony_ci .fd_release = cxlflash_fd_release, 17762306a36Sopenharmony_ci}; 178