ocxl_hw.c (34356B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * CXL Flash Device Driver 4 * 5 * Written by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation 6 * Uma Krishnan <ukrishn@linux.vnet.ibm.com>, IBM Corporation 7 * 8 * Copyright (C) 2018 IBM Corporation 9 */ 10 11#include <linux/file.h> 12#include <linux/idr.h> 13#include <linux/module.h> 14#include <linux/mount.h> 15#include <linux/pseudo_fs.h> 16#include <linux/poll.h> 17#include <linux/sched/signal.h> 18#include <linux/interrupt.h> 19#include <asm/xive.h> 20#include <misc/ocxl.h> 21 22#include <uapi/misc/cxl.h> 23 24#include "backend.h" 25#include "ocxl_hw.h" 26 27/* 28 * Pseudo-filesystem to allocate inodes. 29 */ 30 31#define OCXLFLASH_FS_MAGIC 0x1697698f 32 33static int ocxlflash_fs_cnt; 34static struct vfsmount *ocxlflash_vfs_mount; 35 36static int ocxlflash_fs_init_fs_context(struct fs_context *fc) 37{ 38 return init_pseudo(fc, OCXLFLASH_FS_MAGIC) ? 0 : -ENOMEM; 39} 40 41static struct file_system_type ocxlflash_fs_type = { 42 .name = "ocxlflash", 43 .owner = THIS_MODULE, 44 .init_fs_context = ocxlflash_fs_init_fs_context, 45 .kill_sb = kill_anon_super, 46}; 47 48/* 49 * ocxlflash_release_mapping() - release the memory mapping 50 * @ctx: Context whose mapping is to be released. 51 */ 52static void ocxlflash_release_mapping(struct ocxlflash_context *ctx) 53{ 54 if (ctx->mapping) 55 simple_release_fs(&ocxlflash_vfs_mount, &ocxlflash_fs_cnt); 56 ctx->mapping = NULL; 57} 58 59/* 60 * ocxlflash_getfile() - allocate pseudo filesystem, inode, and the file 61 * @dev: Generic device of the host. 62 * @name: Name of the pseudo filesystem. 63 * @fops: File operations. 64 * @priv: Private data. 65 * @flags: Flags for the file. 66 * 67 * Return: pointer to the file on success, ERR_PTR on failure 68 */ 69static struct file *ocxlflash_getfile(struct device *dev, const char *name, 70 const struct file_operations *fops, 71 void *priv, int flags) 72{ 73 struct file *file; 74 struct inode *inode; 75 int rc; 76 77 if (fops->owner && !try_module_get(fops->owner)) { 78 dev_err(dev, "%s: Owner does not exist\n", __func__); 79 rc = -ENOENT; 80 goto err1; 81 } 82 83 rc = simple_pin_fs(&ocxlflash_fs_type, &ocxlflash_vfs_mount, 84 &ocxlflash_fs_cnt); 85 if (unlikely(rc < 0)) { 86 dev_err(dev, "%s: Cannot mount ocxlflash pseudofs rc=%d\n", 87 __func__, rc); 88 goto err2; 89 } 90 91 inode = alloc_anon_inode(ocxlflash_vfs_mount->mnt_sb); 92 if (IS_ERR(inode)) { 93 rc = PTR_ERR(inode); 94 dev_err(dev, "%s: alloc_anon_inode failed rc=%d\n", 95 __func__, rc); 96 goto err3; 97 } 98 99 file = alloc_file_pseudo(inode, ocxlflash_vfs_mount, name, 100 flags & (O_ACCMODE | O_NONBLOCK), fops); 101 if (IS_ERR(file)) { 102 rc = PTR_ERR(file); 103 dev_err(dev, "%s: alloc_file failed rc=%d\n", 104 __func__, rc); 105 goto err4; 106 } 107 108 file->private_data = priv; 109out: 110 return file; 111err4: 112 iput(inode); 113err3: 114 simple_release_fs(&ocxlflash_vfs_mount, &ocxlflash_fs_cnt); 115err2: 116 module_put(fops->owner); 117err1: 118 file = ERR_PTR(rc); 119 goto out; 120} 121 122/** 123 * ocxlflash_psa_map() - map the process specific MMIO space 124 * @ctx_cookie: Adapter context for which the mapping needs to be done. 125 * 126 * Return: MMIO pointer of the mapped region 127 */ 128static void __iomem *ocxlflash_psa_map(void *ctx_cookie) 129{ 130 struct ocxlflash_context *ctx = ctx_cookie; 131 struct device *dev = ctx->hw_afu->dev; 132 133 mutex_lock(&ctx->state_mutex); 134 if (ctx->state != STARTED) { 135 dev_err(dev, "%s: Context not started, state=%d\n", __func__, 136 ctx->state); 137 mutex_unlock(&ctx->state_mutex); 138 return NULL; 139 } 140 mutex_unlock(&ctx->state_mutex); 141 142 return ioremap(ctx->psn_phys, ctx->psn_size); 143} 144 145/** 146 * ocxlflash_psa_unmap() - unmap the process specific MMIO space 147 * @addr: MMIO pointer to unmap. 148 */ 149static void ocxlflash_psa_unmap(void __iomem *addr) 150{ 151 iounmap(addr); 152} 153 154/** 155 * ocxlflash_process_element() - get process element of the adapter context 156 * @ctx_cookie: Adapter context associated with the process element. 157 * 158 * Return: process element of the adapter context 159 */ 160static int ocxlflash_process_element(void *ctx_cookie) 161{ 162 struct ocxlflash_context *ctx = ctx_cookie; 163 164 return ctx->pe; 165} 166 167/** 168 * afu_map_irq() - map the interrupt of the adapter context 169 * @flags: Flags. 170 * @ctx: Adapter context. 171 * @num: Per-context AFU interrupt number. 172 * @handler: Interrupt handler to register. 173 * @cookie: Interrupt handler private data. 174 * @name: Name of the interrupt. 175 * 176 * Return: 0 on success, -errno on failure 177 */ 178static int afu_map_irq(u64 flags, struct ocxlflash_context *ctx, int num, 179 irq_handler_t handler, void *cookie, char *name) 180{ 181 struct ocxl_hw_afu *afu = ctx->hw_afu; 182 struct device *dev = afu->dev; 183 struct ocxlflash_irqs *irq; 184 struct xive_irq_data *xd; 185 u32 virq; 186 int rc = 0; 187 188 if (num < 0 || num >= ctx->num_irqs) { 189 dev_err(dev, "%s: Interrupt %d not allocated\n", __func__, num); 190 rc = -ENOENT; 191 goto out; 192 } 193 194 irq = &ctx->irqs[num]; 195 virq = irq_create_mapping(NULL, irq->hwirq); 196 if (unlikely(!virq)) { 197 dev_err(dev, "%s: irq_create_mapping failed\n", __func__); 198 rc = -ENOMEM; 199 goto out; 200 } 201 202 rc = request_irq(virq, handler, 0, name, cookie); 203 if (unlikely(rc)) { 204 dev_err(dev, "%s: request_irq failed rc=%d\n", __func__, rc); 205 goto err1; 206 } 207 208 xd = irq_get_handler_data(virq); 209 if (unlikely(!xd)) { 210 dev_err(dev, "%s: Can't get interrupt data\n", __func__); 211 rc = -ENXIO; 212 goto err2; 213 } 214 215 irq->virq = virq; 216 irq->vtrig = xd->trig_mmio; 217out: 218 return rc; 219err2: 220 free_irq(virq, cookie); 221err1: 222 irq_dispose_mapping(virq); 223 goto out; 224} 225 226/** 227 * ocxlflash_map_afu_irq() - map the interrupt of the adapter context 228 * @ctx_cookie: Adapter context. 229 * @num: Per-context AFU interrupt number. 230 * @handler: Interrupt handler to register. 231 * @cookie: Interrupt handler private data. 232 * @name: Name of the interrupt. 233 * 234 * Return: 0 on success, -errno on failure 235 */ 236static int ocxlflash_map_afu_irq(void *ctx_cookie, int num, 237 irq_handler_t handler, void *cookie, 238 char *name) 239{ 240 return afu_map_irq(0, ctx_cookie, num, handler, cookie, name); 241} 242 243/** 244 * afu_unmap_irq() - unmap the interrupt 245 * @flags: Flags. 246 * @ctx: Adapter context. 247 * @num: Per-context AFU interrupt number. 248 * @cookie: Interrupt handler private data. 249 */ 250static void afu_unmap_irq(u64 flags, struct ocxlflash_context *ctx, int num, 251 void *cookie) 252{ 253 struct ocxl_hw_afu *afu = ctx->hw_afu; 254 struct device *dev = afu->dev; 255 struct ocxlflash_irqs *irq; 256 257 if (num < 0 || num >= ctx->num_irqs) { 258 dev_err(dev, "%s: Interrupt %d not allocated\n", __func__, num); 259 return; 260 } 261 262 irq = &ctx->irqs[num]; 263 264 if (irq_find_mapping(NULL, irq->hwirq)) { 265 free_irq(irq->virq, cookie); 266 irq_dispose_mapping(irq->virq); 267 } 268 269 memset(irq, 0, sizeof(*irq)); 270} 271 272/** 273 * ocxlflash_unmap_afu_irq() - unmap the interrupt 274 * @ctx_cookie: Adapter context. 275 * @num: Per-context AFU interrupt number. 276 * @cookie: Interrupt handler private data. 277 */ 278static void ocxlflash_unmap_afu_irq(void *ctx_cookie, int num, void *cookie) 279{ 280 return afu_unmap_irq(0, ctx_cookie, num, cookie); 281} 282 283/** 284 * ocxlflash_get_irq_objhndl() - get the object handle for an interrupt 285 * @ctx_cookie: Context associated with the interrupt. 286 * @irq: Interrupt number. 287 * 288 * Return: effective address of the mapped region 289 */ 290static u64 ocxlflash_get_irq_objhndl(void *ctx_cookie, int irq) 291{ 292 struct ocxlflash_context *ctx = ctx_cookie; 293 294 if (irq < 0 || irq >= ctx->num_irqs) 295 return 0; 296 297 return (__force u64)ctx->irqs[irq].vtrig; 298} 299 300/** 301 * ocxlflash_xsl_fault() - callback when translation error is triggered 302 * @data: Private data provided at callback registration, the context. 303 * @addr: Address that triggered the error. 304 * @dsisr: Value of dsisr register. 305 */ 306static void ocxlflash_xsl_fault(void *data, u64 addr, u64 dsisr) 307{ 308 struct ocxlflash_context *ctx = data; 309 310 spin_lock(&ctx->slock); 311 ctx->fault_addr = addr; 312 ctx->fault_dsisr = dsisr; 313 ctx->pending_fault = true; 314 spin_unlock(&ctx->slock); 315 316 wake_up_all(&ctx->wq); 317} 318 319/** 320 * start_context() - local routine to start a context 321 * @ctx: Adapter context to be started. 322 * 323 * Assign the context specific MMIO space, add and enable the PE. 324 * 325 * Return: 0 on success, -errno on failure 326 */ 327static int start_context(struct ocxlflash_context *ctx) 328{ 329 struct ocxl_hw_afu *afu = ctx->hw_afu; 330 struct ocxl_afu_config *acfg = &afu->acfg; 331 void *link_token = afu->link_token; 332 struct pci_dev *pdev = afu->pdev; 333 struct device *dev = afu->dev; 334 bool master = ctx->master; 335 struct mm_struct *mm; 336 int rc = 0; 337 u32 pid; 338 339 mutex_lock(&ctx->state_mutex); 340 if (ctx->state != OPENED) { 341 dev_err(dev, "%s: Context state invalid, state=%d\n", 342 __func__, ctx->state); 343 rc = -EINVAL; 344 goto out; 345 } 346 347 if (master) { 348 ctx->psn_size = acfg->global_mmio_size; 349 ctx->psn_phys = afu->gmmio_phys; 350 } else { 351 ctx->psn_size = acfg->pp_mmio_stride; 352 ctx->psn_phys = afu->ppmmio_phys + (ctx->pe * ctx->psn_size); 353 } 354 355 /* pid and mm not set for master contexts */ 356 if (master) { 357 pid = 0; 358 mm = NULL; 359 } else { 360 pid = current->mm->context.id; 361 mm = current->mm; 362 } 363 364 rc = ocxl_link_add_pe(link_token, ctx->pe, pid, 0, 0, 365 pci_dev_id(pdev), mm, ocxlflash_xsl_fault, 366 ctx); 367 if (unlikely(rc)) { 368 dev_err(dev, "%s: ocxl_link_add_pe failed rc=%d\n", 369 __func__, rc); 370 goto out; 371 } 372 373 ctx->state = STARTED; 374out: 375 mutex_unlock(&ctx->state_mutex); 376 return rc; 377} 378 379/** 380 * ocxlflash_start_context() - start a kernel context 381 * @ctx_cookie: Adapter context to be started. 382 * 383 * Return: 0 on success, -errno on failure 384 */ 385static int ocxlflash_start_context(void *ctx_cookie) 386{ 387 struct ocxlflash_context *ctx = ctx_cookie; 388 389 return start_context(ctx); 390} 391 392/** 393 * ocxlflash_stop_context() - stop a context 394 * @ctx_cookie: Adapter context to be stopped. 395 * 396 * Return: 0 on success, -errno on failure 397 */ 398static int ocxlflash_stop_context(void *ctx_cookie) 399{ 400 struct ocxlflash_context *ctx = ctx_cookie; 401 struct ocxl_hw_afu *afu = ctx->hw_afu; 402 struct ocxl_afu_config *acfg = &afu->acfg; 403 struct pci_dev *pdev = afu->pdev; 404 struct device *dev = afu->dev; 405 enum ocxlflash_ctx_state state; 406 int rc = 0; 407 408 mutex_lock(&ctx->state_mutex); 409 state = ctx->state; 410 ctx->state = CLOSED; 411 mutex_unlock(&ctx->state_mutex); 412 if (state != STARTED) 413 goto out; 414 415 rc = ocxl_config_terminate_pasid(pdev, acfg->dvsec_afu_control_pos, 416 ctx->pe); 417 if (unlikely(rc)) { 418 dev_err(dev, "%s: ocxl_config_terminate_pasid failed rc=%d\n", 419 __func__, rc); 420 /* If EBUSY, PE could be referenced in future by the AFU */ 421 if (rc == -EBUSY) 422 goto out; 423 } 424 425 rc = ocxl_link_remove_pe(afu->link_token, ctx->pe); 426 if (unlikely(rc)) { 427 dev_err(dev, "%s: ocxl_link_remove_pe failed rc=%d\n", 428 __func__, rc); 429 goto out; 430 } 431out: 432 return rc; 433} 434 435/** 436 * ocxlflash_afu_reset() - reset the AFU 437 * @ctx_cookie: Adapter context. 438 */ 439static int ocxlflash_afu_reset(void *ctx_cookie) 440{ 441 struct ocxlflash_context *ctx = ctx_cookie; 442 struct device *dev = ctx->hw_afu->dev; 443 444 /* Pending implementation from OCXL transport services */ 445 dev_err_once(dev, "%s: afu_reset() fop not supported\n", __func__); 446 447 /* Silently return success until it is implemented */ 448 return 0; 449} 450 451/** 452 * ocxlflash_set_master() - sets the context as master 453 * @ctx_cookie: Adapter context to set as master. 454 */ 455static void ocxlflash_set_master(void *ctx_cookie) 456{ 457 struct ocxlflash_context *ctx = ctx_cookie; 458 459 ctx->master = true; 460} 461 462/** 463 * ocxlflash_get_context() - obtains the context associated with the host 464 * @pdev: PCI device associated with the host. 465 * @afu_cookie: Hardware AFU associated with the host. 466 * 467 * Return: returns the pointer to host adapter context 468 */ 469static void *ocxlflash_get_context(struct pci_dev *pdev, void *afu_cookie) 470{ 471 struct ocxl_hw_afu *afu = afu_cookie; 472 473 return afu->ocxl_ctx; 474} 475 476/** 477 * ocxlflash_dev_context_init() - allocate and initialize an adapter context 478 * @pdev: PCI device associated with the host. 479 * @afu_cookie: Hardware AFU associated with the host. 480 * 481 * Return: returns the adapter context on success, ERR_PTR on failure 482 */ 483static void *ocxlflash_dev_context_init(struct pci_dev *pdev, void *afu_cookie) 484{ 485 struct ocxl_hw_afu *afu = afu_cookie; 486 struct device *dev = afu->dev; 487 struct ocxlflash_context *ctx; 488 int rc; 489 490 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); 491 if (unlikely(!ctx)) { 492 dev_err(dev, "%s: Context allocation failed\n", __func__); 493 rc = -ENOMEM; 494 goto err1; 495 } 496 497 idr_preload(GFP_KERNEL); 498 rc = idr_alloc(&afu->idr, ctx, 0, afu->max_pasid, GFP_NOWAIT); 499 idr_preload_end(); 500 if (unlikely(rc < 0)) { 501 dev_err(dev, "%s: idr_alloc failed rc=%d\n", __func__, rc); 502 goto err2; 503 } 504 505 spin_lock_init(&ctx->slock); 506 init_waitqueue_head(&ctx->wq); 507 mutex_init(&ctx->state_mutex); 508 509 ctx->state = OPENED; 510 ctx->pe = rc; 511 ctx->master = false; 512 ctx->mapping = NULL; 513 ctx->hw_afu = afu; 514 ctx->irq_bitmap = 0; 515 ctx->pending_irq = false; 516 ctx->pending_fault = false; 517out: 518 return ctx; 519err2: 520 kfree(ctx); 521err1: 522 ctx = ERR_PTR(rc); 523 goto out; 524} 525 526/** 527 * ocxlflash_release_context() - releases an adapter context 528 * @ctx_cookie: Adapter context to be released. 529 * 530 * Return: 0 on success, -errno on failure 531 */ 532static int ocxlflash_release_context(void *ctx_cookie) 533{ 534 struct ocxlflash_context *ctx = ctx_cookie; 535 struct device *dev; 536 int rc = 0; 537 538 if (!ctx) 539 goto out; 540 541 dev = ctx->hw_afu->dev; 542 mutex_lock(&ctx->state_mutex); 543 if (ctx->state >= STARTED) { 544 dev_err(dev, "%s: Context in use, state=%d\n", __func__, 545 ctx->state); 546 mutex_unlock(&ctx->state_mutex); 547 rc = -EBUSY; 548 goto out; 549 } 550 mutex_unlock(&ctx->state_mutex); 551 552 idr_remove(&ctx->hw_afu->idr, ctx->pe); 553 ocxlflash_release_mapping(ctx); 554 kfree(ctx); 555out: 556 return rc; 557} 558 559/** 560 * ocxlflash_perst_reloads_same_image() - sets the image reload policy 561 * @afu_cookie: Hardware AFU associated with the host. 562 * @image: Whether to load the same image on PERST. 563 */ 564static void ocxlflash_perst_reloads_same_image(void *afu_cookie, bool image) 565{ 566 struct ocxl_hw_afu *afu = afu_cookie; 567 568 afu->perst_same_image = image; 569} 570 571/** 572 * ocxlflash_read_adapter_vpd() - reads the adapter VPD 573 * @pdev: PCI device associated with the host. 574 * @buf: Buffer to get the VPD data. 575 * @count: Size of buffer (maximum bytes that can be read). 576 * 577 * Return: size of VPD on success, -errno on failure 578 */ 579static ssize_t ocxlflash_read_adapter_vpd(struct pci_dev *pdev, void *buf, 580 size_t count) 581{ 582 return pci_read_vpd(pdev, 0, count, buf); 583} 584 585/** 586 * free_afu_irqs() - internal service to free interrupts 587 * @ctx: Adapter context. 588 */ 589static void free_afu_irqs(struct ocxlflash_context *ctx) 590{ 591 struct ocxl_hw_afu *afu = ctx->hw_afu; 592 struct device *dev = afu->dev; 593 int i; 594 595 if (!ctx->irqs) { 596 dev_err(dev, "%s: Interrupts not allocated\n", __func__); 597 return; 598 } 599 600 for (i = ctx->num_irqs; i >= 0; i--) 601 ocxl_link_free_irq(afu->link_token, ctx->irqs[i].hwirq); 602 603 kfree(ctx->irqs); 604 ctx->irqs = NULL; 605} 606 607/** 608 * alloc_afu_irqs() - internal service to allocate interrupts 609 * @ctx: Context associated with the request. 610 * @num: Number of interrupts requested. 611 * 612 * Return: 0 on success, -errno on failure 613 */ 614static int alloc_afu_irqs(struct ocxlflash_context *ctx, int num) 615{ 616 struct ocxl_hw_afu *afu = ctx->hw_afu; 617 struct device *dev = afu->dev; 618 struct ocxlflash_irqs *irqs; 619 int rc = 0; 620 int hwirq; 621 int i; 622 623 if (ctx->irqs) { 624 dev_err(dev, "%s: Interrupts already allocated\n", __func__); 625 rc = -EEXIST; 626 goto out; 627 } 628 629 if (num > OCXL_MAX_IRQS) { 630 dev_err(dev, "%s: Too many interrupts num=%d\n", __func__, num); 631 rc = -EINVAL; 632 goto out; 633 } 634 635 irqs = kcalloc(num, sizeof(*irqs), GFP_KERNEL); 636 if (unlikely(!irqs)) { 637 dev_err(dev, "%s: Context irqs allocation failed\n", __func__); 638 rc = -ENOMEM; 639 goto out; 640 } 641 642 for (i = 0; i < num; i++) { 643 rc = ocxl_link_irq_alloc(afu->link_token, &hwirq); 644 if (unlikely(rc)) { 645 dev_err(dev, "%s: ocxl_link_irq_alloc failed rc=%d\n", 646 __func__, rc); 647 goto err; 648 } 649 650 irqs[i].hwirq = hwirq; 651 } 652 653 ctx->irqs = irqs; 654 ctx->num_irqs = num; 655out: 656 return rc; 657err: 658 for (i = i-1; i >= 0; i--) 659 ocxl_link_free_irq(afu->link_token, irqs[i].hwirq); 660 kfree(irqs); 661 goto out; 662} 663 664/** 665 * ocxlflash_allocate_afu_irqs() - allocates the requested number of interrupts 666 * @ctx_cookie: Context associated with the request. 667 * @num: Number of interrupts requested. 668 * 669 * Return: 0 on success, -errno on failure 670 */ 671static int ocxlflash_allocate_afu_irqs(void *ctx_cookie, int num) 672{ 673 return alloc_afu_irqs(ctx_cookie, num); 674} 675 676/** 677 * ocxlflash_free_afu_irqs() - frees the interrupts of an adapter context 678 * @ctx_cookie: Adapter context. 679 */ 680static void ocxlflash_free_afu_irqs(void *ctx_cookie) 681{ 682 free_afu_irqs(ctx_cookie); 683} 684 685/** 686 * ocxlflash_unconfig_afu() - unconfigure the AFU 687 * @afu: AFU associated with the host. 688 */ 689static void ocxlflash_unconfig_afu(struct ocxl_hw_afu *afu) 690{ 691 if (afu->gmmio_virt) { 692 iounmap(afu->gmmio_virt); 693 afu->gmmio_virt = NULL; 694 } 695} 696 697/** 698 * ocxlflash_destroy_afu() - destroy the AFU structure 699 * @afu_cookie: AFU to be freed. 700 */ 701static void ocxlflash_destroy_afu(void *afu_cookie) 702{ 703 struct ocxl_hw_afu *afu = afu_cookie; 704 int pos; 705 706 if (!afu) 707 return; 708 709 ocxlflash_release_context(afu->ocxl_ctx); 710 idr_destroy(&afu->idr); 711 712 /* Disable the AFU */ 713 pos = afu->acfg.dvsec_afu_control_pos; 714 ocxl_config_set_afu_state(afu->pdev, pos, 0); 715 716 ocxlflash_unconfig_afu(afu); 717 kfree(afu); 718} 719 720/** 721 * ocxlflash_config_fn() - configure the host function 722 * @pdev: PCI device associated with the host. 723 * @afu: AFU associated with the host. 724 * 725 * Return: 0 on success, -errno on failure 726 */ 727static int ocxlflash_config_fn(struct pci_dev *pdev, struct ocxl_hw_afu *afu) 728{ 729 struct ocxl_fn_config *fcfg = &afu->fcfg; 730 struct device *dev = &pdev->dev; 731 u16 base, enabled, supported; 732 int rc = 0; 733 734 /* Read DVSEC config of the function */ 735 rc = ocxl_config_read_function(pdev, fcfg); 736 if (unlikely(rc)) { 737 dev_err(dev, "%s: ocxl_config_read_function failed rc=%d\n", 738 __func__, rc); 739 goto out; 740 } 741 742 /* Check if function has AFUs defined, only 1 per function supported */ 743 if (fcfg->max_afu_index >= 0) { 744 afu->is_present = true; 745 if (fcfg->max_afu_index != 0) 746 dev_warn(dev, "%s: Unexpected AFU index value %d\n", 747 __func__, fcfg->max_afu_index); 748 } 749 750 rc = ocxl_config_get_actag_info(pdev, &base, &enabled, &supported); 751 if (unlikely(rc)) { 752 dev_err(dev, "%s: ocxl_config_get_actag_info failed rc=%d\n", 753 __func__, rc); 754 goto out; 755 } 756 757 afu->fn_actag_base = base; 758 afu->fn_actag_enabled = enabled; 759 760 ocxl_config_set_actag(pdev, fcfg->dvsec_function_pos, base, enabled); 761 dev_dbg(dev, "%s: Function acTag range base=%u enabled=%u\n", 762 __func__, base, enabled); 763 764 rc = ocxl_link_setup(pdev, 0, &afu->link_token); 765 if (unlikely(rc)) { 766 dev_err(dev, "%s: ocxl_link_setup failed rc=%d\n", 767 __func__, rc); 768 goto out; 769 } 770 771 rc = ocxl_config_set_TL(pdev, fcfg->dvsec_tl_pos); 772 if (unlikely(rc)) { 773 dev_err(dev, "%s: ocxl_config_set_TL failed rc=%d\n", 774 __func__, rc); 775 goto err; 776 } 777out: 778 return rc; 779err: 780 ocxl_link_release(pdev, afu->link_token); 781 goto out; 782} 783 784/** 785 * ocxlflash_unconfig_fn() - unconfigure the host function 786 * @pdev: PCI device associated with the host. 787 * @afu: AFU associated with the host. 788 */ 789static void ocxlflash_unconfig_fn(struct pci_dev *pdev, struct ocxl_hw_afu *afu) 790{ 791 ocxl_link_release(pdev, afu->link_token); 792} 793 794/** 795 * ocxlflash_map_mmio() - map the AFU MMIO space 796 * @afu: AFU associated with the host. 797 * 798 * Return: 0 on success, -errno on failure 799 */ 800static int ocxlflash_map_mmio(struct ocxl_hw_afu *afu) 801{ 802 struct ocxl_afu_config *acfg = &afu->acfg; 803 struct pci_dev *pdev = afu->pdev; 804 struct device *dev = afu->dev; 805 phys_addr_t gmmio, ppmmio; 806 int rc = 0; 807 808 rc = pci_request_region(pdev, acfg->global_mmio_bar, "ocxlflash"); 809 if (unlikely(rc)) { 810 dev_err(dev, "%s: pci_request_region for global failed rc=%d\n", 811 __func__, rc); 812 goto out; 813 } 814 gmmio = pci_resource_start(pdev, acfg->global_mmio_bar); 815 gmmio += acfg->global_mmio_offset; 816 817 rc = pci_request_region(pdev, acfg->pp_mmio_bar, "ocxlflash"); 818 if (unlikely(rc)) { 819 dev_err(dev, "%s: pci_request_region for pp bar failed rc=%d\n", 820 __func__, rc); 821 goto err1; 822 } 823 ppmmio = pci_resource_start(pdev, acfg->pp_mmio_bar); 824 ppmmio += acfg->pp_mmio_offset; 825 826 afu->gmmio_virt = ioremap(gmmio, acfg->global_mmio_size); 827 if (unlikely(!afu->gmmio_virt)) { 828 dev_err(dev, "%s: MMIO mapping failed\n", __func__); 829 rc = -ENOMEM; 830 goto err2; 831 } 832 833 afu->gmmio_phys = gmmio; 834 afu->ppmmio_phys = ppmmio; 835out: 836 return rc; 837err2: 838 pci_release_region(pdev, acfg->pp_mmio_bar); 839err1: 840 pci_release_region(pdev, acfg->global_mmio_bar); 841 goto out; 842} 843 844/** 845 * ocxlflash_config_afu() - configure the host AFU 846 * @pdev: PCI device associated with the host. 847 * @afu: AFU associated with the host. 848 * 849 * Must be called _after_ host function configuration. 850 * 851 * Return: 0 on success, -errno on failure 852 */ 853static int ocxlflash_config_afu(struct pci_dev *pdev, struct ocxl_hw_afu *afu) 854{ 855 struct ocxl_afu_config *acfg = &afu->acfg; 856 struct ocxl_fn_config *fcfg = &afu->fcfg; 857 struct device *dev = &pdev->dev; 858 int count; 859 int base; 860 int pos; 861 int rc = 0; 862 863 /* This HW AFU function does not have any AFUs defined */ 864 if (!afu->is_present) 865 goto out; 866 867 /* Read AFU config at index 0 */ 868 rc = ocxl_config_read_afu(pdev, fcfg, acfg, 0); 869 if (unlikely(rc)) { 870 dev_err(dev, "%s: ocxl_config_read_afu failed rc=%d\n", 871 __func__, rc); 872 goto out; 873 } 874 875 /* Only one AFU per function is supported, so actag_base is same */ 876 base = afu->fn_actag_base; 877 count = min_t(int, acfg->actag_supported, afu->fn_actag_enabled); 878 pos = acfg->dvsec_afu_control_pos; 879 880 ocxl_config_set_afu_actag(pdev, pos, base, count); 881 dev_dbg(dev, "%s: acTag base=%d enabled=%d\n", __func__, base, count); 882 afu->afu_actag_base = base; 883 afu->afu_actag_enabled = count; 884 afu->max_pasid = 1 << acfg->pasid_supported_log; 885 886 ocxl_config_set_afu_pasid(pdev, pos, 0, acfg->pasid_supported_log); 887 888 rc = ocxlflash_map_mmio(afu); 889 if (unlikely(rc)) { 890 dev_err(dev, "%s: ocxlflash_map_mmio failed rc=%d\n", 891 __func__, rc); 892 goto out; 893 } 894 895 /* Enable the AFU */ 896 ocxl_config_set_afu_state(pdev, acfg->dvsec_afu_control_pos, 1); 897out: 898 return rc; 899} 900 901/** 902 * ocxlflash_create_afu() - create the AFU for OCXL 903 * @pdev: PCI device associated with the host. 904 * 905 * Return: AFU on success, NULL on failure 906 */ 907static void *ocxlflash_create_afu(struct pci_dev *pdev) 908{ 909 struct device *dev = &pdev->dev; 910 struct ocxlflash_context *ctx; 911 struct ocxl_hw_afu *afu; 912 int rc; 913 914 afu = kzalloc(sizeof(*afu), GFP_KERNEL); 915 if (unlikely(!afu)) { 916 dev_err(dev, "%s: HW AFU allocation failed\n", __func__); 917 goto out; 918 } 919 920 afu->pdev = pdev; 921 afu->dev = dev; 922 idr_init(&afu->idr); 923 924 rc = ocxlflash_config_fn(pdev, afu); 925 if (unlikely(rc)) { 926 dev_err(dev, "%s: Function configuration failed rc=%d\n", 927 __func__, rc); 928 goto err1; 929 } 930 931 rc = ocxlflash_config_afu(pdev, afu); 932 if (unlikely(rc)) { 933 dev_err(dev, "%s: AFU configuration failed rc=%d\n", 934 __func__, rc); 935 goto err2; 936 } 937 938 ctx = ocxlflash_dev_context_init(pdev, afu); 939 if (IS_ERR(ctx)) { 940 rc = PTR_ERR(ctx); 941 dev_err(dev, "%s: ocxlflash_dev_context_init failed rc=%d\n", 942 __func__, rc); 943 goto err3; 944 } 945 946 afu->ocxl_ctx = ctx; 947out: 948 return afu; 949err3: 950 ocxlflash_unconfig_afu(afu); 951err2: 952 ocxlflash_unconfig_fn(pdev, afu); 953err1: 954 idr_destroy(&afu->idr); 955 kfree(afu); 956 afu = NULL; 957 goto out; 958} 959 960/** 961 * ctx_event_pending() - check for any event pending on the context 962 * @ctx: Context to be checked. 963 * 964 * Return: true if there is an event pending, false if none pending 965 */ 966static inline bool ctx_event_pending(struct ocxlflash_context *ctx) 967{ 968 if (ctx->pending_irq || ctx->pending_fault) 969 return true; 970 971 return false; 972} 973 974/** 975 * afu_poll() - poll the AFU for events on the context 976 * @file: File associated with the adapter context. 977 * @poll: Poll structure from the user. 978 * 979 * Return: poll mask 980 */ 981static unsigned int afu_poll(struct file *file, struct poll_table_struct *poll) 982{ 983 struct ocxlflash_context *ctx = file->private_data; 984 struct device *dev = ctx->hw_afu->dev; 985 ulong lock_flags; 986 int mask = 0; 987 988 poll_wait(file, &ctx->wq, poll); 989 990 spin_lock_irqsave(&ctx->slock, lock_flags); 991 if (ctx_event_pending(ctx)) 992 mask |= POLLIN | POLLRDNORM; 993 else if (ctx->state == CLOSED) 994 mask |= POLLERR; 995 spin_unlock_irqrestore(&ctx->slock, lock_flags); 996 997 dev_dbg(dev, "%s: Poll wait completed for pe %i mask %i\n", 998 __func__, ctx->pe, mask); 999 1000 return mask; 1001} 1002 1003/** 1004 * afu_read() - perform a read on the context for any event 1005 * @file: File associated with the adapter context. 1006 * @buf: Buffer to receive the data. 1007 * @count: Size of buffer (maximum bytes that can be read). 1008 * @off: Offset. 1009 * 1010 * Return: size of the data read on success, -errno on failure 1011 */ 1012static ssize_t afu_read(struct file *file, char __user *buf, size_t count, 1013 loff_t *off) 1014{ 1015 struct ocxlflash_context *ctx = file->private_data; 1016 struct device *dev = ctx->hw_afu->dev; 1017 struct cxl_event event; 1018 ulong lock_flags; 1019 ssize_t esize; 1020 ssize_t rc; 1021 int bit; 1022 DEFINE_WAIT(event_wait); 1023 1024 if (*off != 0) { 1025 dev_err(dev, "%s: Non-zero offset not supported, off=%lld\n", 1026 __func__, *off); 1027 rc = -EINVAL; 1028 goto out; 1029 } 1030 1031 spin_lock_irqsave(&ctx->slock, lock_flags); 1032 1033 for (;;) { 1034 prepare_to_wait(&ctx->wq, &event_wait, TASK_INTERRUPTIBLE); 1035 1036 if (ctx_event_pending(ctx) || (ctx->state == CLOSED)) 1037 break; 1038 1039 if (file->f_flags & O_NONBLOCK) { 1040 dev_err(dev, "%s: File cannot be blocked on I/O\n", 1041 __func__); 1042 rc = -EAGAIN; 1043 goto err; 1044 } 1045 1046 if (signal_pending(current)) { 1047 dev_err(dev, "%s: Signal pending on the process\n", 1048 __func__); 1049 rc = -ERESTARTSYS; 1050 goto err; 1051 } 1052 1053 spin_unlock_irqrestore(&ctx->slock, lock_flags); 1054 schedule(); 1055 spin_lock_irqsave(&ctx->slock, lock_flags); 1056 } 1057 1058 finish_wait(&ctx->wq, &event_wait); 1059 1060 memset(&event, 0, sizeof(event)); 1061 event.header.process_element = ctx->pe; 1062 event.header.size = sizeof(struct cxl_event_header); 1063 if (ctx->pending_irq) { 1064 esize = sizeof(struct cxl_event_afu_interrupt); 1065 event.header.size += esize; 1066 event.header.type = CXL_EVENT_AFU_INTERRUPT; 1067 1068 bit = find_first_bit(&ctx->irq_bitmap, ctx->num_irqs); 1069 clear_bit(bit, &ctx->irq_bitmap); 1070 event.irq.irq = bit + 1; 1071 if (bitmap_empty(&ctx->irq_bitmap, ctx->num_irqs)) 1072 ctx->pending_irq = false; 1073 } else if (ctx->pending_fault) { 1074 event.header.size += sizeof(struct cxl_event_data_storage); 1075 event.header.type = CXL_EVENT_DATA_STORAGE; 1076 event.fault.addr = ctx->fault_addr; 1077 event.fault.dsisr = ctx->fault_dsisr; 1078 ctx->pending_fault = false; 1079 } 1080 1081 spin_unlock_irqrestore(&ctx->slock, lock_flags); 1082 1083 if (copy_to_user(buf, &event, event.header.size)) { 1084 dev_err(dev, "%s: copy_to_user failed\n", __func__); 1085 rc = -EFAULT; 1086 goto out; 1087 } 1088 1089 rc = event.header.size; 1090out: 1091 return rc; 1092err: 1093 finish_wait(&ctx->wq, &event_wait); 1094 spin_unlock_irqrestore(&ctx->slock, lock_flags); 1095 goto out; 1096} 1097 1098/** 1099 * afu_release() - release and free the context 1100 * @inode: File inode pointer. 1101 * @file: File associated with the context. 1102 * 1103 * Return: 0 on success, -errno on failure 1104 */ 1105static int afu_release(struct inode *inode, struct file *file) 1106{ 1107 struct ocxlflash_context *ctx = file->private_data; 1108 int i; 1109 1110 /* Unmap and free the interrupts associated with the context */ 1111 for (i = ctx->num_irqs; i >= 0; i--) 1112 afu_unmap_irq(0, ctx, i, ctx); 1113 free_afu_irqs(ctx); 1114 1115 return ocxlflash_release_context(ctx); 1116} 1117 1118/** 1119 * ocxlflash_mmap_fault() - mmap fault handler 1120 * @vmf: VM fault associated with current fault. 1121 * 1122 * Return: 0 on success, -errno on failure 1123 */ 1124static vm_fault_t ocxlflash_mmap_fault(struct vm_fault *vmf) 1125{ 1126 struct vm_area_struct *vma = vmf->vma; 1127 struct ocxlflash_context *ctx = vma->vm_file->private_data; 1128 struct device *dev = ctx->hw_afu->dev; 1129 u64 mmio_area, offset; 1130 1131 offset = vmf->pgoff << PAGE_SHIFT; 1132 if (offset >= ctx->psn_size) 1133 return VM_FAULT_SIGBUS; 1134 1135 mutex_lock(&ctx->state_mutex); 1136 if (ctx->state != STARTED) { 1137 dev_err(dev, "%s: Context not started, state=%d\n", 1138 __func__, ctx->state); 1139 mutex_unlock(&ctx->state_mutex); 1140 return VM_FAULT_SIGBUS; 1141 } 1142 mutex_unlock(&ctx->state_mutex); 1143 1144 mmio_area = ctx->psn_phys; 1145 mmio_area += offset; 1146 1147 return vmf_insert_pfn(vma, vmf->address, mmio_area >> PAGE_SHIFT); 1148} 1149 1150static const struct vm_operations_struct ocxlflash_vmops = { 1151 .fault = ocxlflash_mmap_fault, 1152}; 1153 1154/** 1155 * afu_mmap() - map the fault handler operations 1156 * @file: File associated with the context. 1157 * @vma: VM area associated with mapping. 1158 * 1159 * Return: 0 on success, -errno on failure 1160 */ 1161static int afu_mmap(struct file *file, struct vm_area_struct *vma) 1162{ 1163 struct ocxlflash_context *ctx = file->private_data; 1164 1165 if ((vma_pages(vma) + vma->vm_pgoff) > 1166 (ctx->psn_size >> PAGE_SHIFT)) 1167 return -EINVAL; 1168 1169 vma->vm_flags |= VM_IO | VM_PFNMAP; 1170 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 1171 vma->vm_ops = &ocxlflash_vmops; 1172 return 0; 1173} 1174 1175static const struct file_operations ocxl_afu_fops = { 1176 .owner = THIS_MODULE, 1177 .poll = afu_poll, 1178 .read = afu_read, 1179 .release = afu_release, 1180 .mmap = afu_mmap, 1181}; 1182 1183#define PATCH_FOPS(NAME) \ 1184 do { if (!fops->NAME) fops->NAME = ocxl_afu_fops.NAME; } while (0) 1185 1186/** 1187 * ocxlflash_get_fd() - get file descriptor for an adapter context 1188 * @ctx_cookie: Adapter context. 1189 * @fops: File operations to be associated. 1190 * @fd: File descriptor to be returned back. 1191 * 1192 * Return: pointer to the file on success, ERR_PTR on failure 1193 */ 1194static struct file *ocxlflash_get_fd(void *ctx_cookie, 1195 struct file_operations *fops, int *fd) 1196{ 1197 struct ocxlflash_context *ctx = ctx_cookie; 1198 struct device *dev = ctx->hw_afu->dev; 1199 struct file *file; 1200 int flags, fdtmp; 1201 int rc = 0; 1202 char *name = NULL; 1203 1204 /* Only allow one fd per context */ 1205 if (ctx->mapping) { 1206 dev_err(dev, "%s: Context is already mapped to an fd\n", 1207 __func__); 1208 rc = -EEXIST; 1209 goto err1; 1210 } 1211 1212 flags = O_RDWR | O_CLOEXEC; 1213 1214 /* This code is similar to anon_inode_getfd() */ 1215 rc = get_unused_fd_flags(flags); 1216 if (unlikely(rc < 0)) { 1217 dev_err(dev, "%s: get_unused_fd_flags failed rc=%d\n", 1218 __func__, rc); 1219 goto err1; 1220 } 1221 fdtmp = rc; 1222 1223 /* Patch the file ops that are not defined */ 1224 if (fops) { 1225 PATCH_FOPS(poll); 1226 PATCH_FOPS(read); 1227 PATCH_FOPS(release); 1228 PATCH_FOPS(mmap); 1229 } else /* Use default ops */ 1230 fops = (struct file_operations *)&ocxl_afu_fops; 1231 1232 name = kasprintf(GFP_KERNEL, "ocxlflash:%d", ctx->pe); 1233 file = ocxlflash_getfile(dev, name, fops, ctx, flags); 1234 kfree(name); 1235 if (IS_ERR(file)) { 1236 rc = PTR_ERR(file); 1237 dev_err(dev, "%s: ocxlflash_getfile failed rc=%d\n", 1238 __func__, rc); 1239 goto err2; 1240 } 1241 1242 ctx->mapping = file->f_mapping; 1243 *fd = fdtmp; 1244out: 1245 return file; 1246err2: 1247 put_unused_fd(fdtmp); 1248err1: 1249 file = ERR_PTR(rc); 1250 goto out; 1251} 1252 1253/** 1254 * ocxlflash_fops_get_context() - get the context associated with the file 1255 * @file: File associated with the adapter context. 1256 * 1257 * Return: pointer to the context 1258 */ 1259static void *ocxlflash_fops_get_context(struct file *file) 1260{ 1261 return file->private_data; 1262} 1263 1264/** 1265 * ocxlflash_afu_irq() - interrupt handler for user contexts 1266 * @irq: Interrupt number. 1267 * @data: Private data provided at interrupt registration, the context. 1268 * 1269 * Return: Always return IRQ_HANDLED. 1270 */ 1271static irqreturn_t ocxlflash_afu_irq(int irq, void *data) 1272{ 1273 struct ocxlflash_context *ctx = data; 1274 struct device *dev = ctx->hw_afu->dev; 1275 int i; 1276 1277 dev_dbg(dev, "%s: Interrupt raised for pe %i virq %i\n", 1278 __func__, ctx->pe, irq); 1279 1280 for (i = 0; i < ctx->num_irqs; i++) { 1281 if (ctx->irqs[i].virq == irq) 1282 break; 1283 } 1284 if (unlikely(i >= ctx->num_irqs)) { 1285 dev_err(dev, "%s: Received AFU IRQ out of range\n", __func__); 1286 goto out; 1287 } 1288 1289 spin_lock(&ctx->slock); 1290 set_bit(i - 1, &ctx->irq_bitmap); 1291 ctx->pending_irq = true; 1292 spin_unlock(&ctx->slock); 1293 1294 wake_up_all(&ctx->wq); 1295out: 1296 return IRQ_HANDLED; 1297} 1298 1299/** 1300 * ocxlflash_start_work() - start a user context 1301 * @ctx_cookie: Context to be started. 1302 * @num_irqs: Number of interrupts requested. 1303 * 1304 * Return: 0 on success, -errno on failure 1305 */ 1306static int ocxlflash_start_work(void *ctx_cookie, u64 num_irqs) 1307{ 1308 struct ocxlflash_context *ctx = ctx_cookie; 1309 struct ocxl_hw_afu *afu = ctx->hw_afu; 1310 struct device *dev = afu->dev; 1311 char *name; 1312 int rc = 0; 1313 int i; 1314 1315 rc = alloc_afu_irqs(ctx, num_irqs); 1316 if (unlikely(rc < 0)) { 1317 dev_err(dev, "%s: alloc_afu_irqs failed rc=%d\n", __func__, rc); 1318 goto out; 1319 } 1320 1321 for (i = 0; i < num_irqs; i++) { 1322 name = kasprintf(GFP_KERNEL, "ocxlflash-%s-pe%i-%i", 1323 dev_name(dev), ctx->pe, i); 1324 rc = afu_map_irq(0, ctx, i, ocxlflash_afu_irq, ctx, name); 1325 kfree(name); 1326 if (unlikely(rc < 0)) { 1327 dev_err(dev, "%s: afu_map_irq failed rc=%d\n", 1328 __func__, rc); 1329 goto err; 1330 } 1331 } 1332 1333 rc = start_context(ctx); 1334 if (unlikely(rc)) { 1335 dev_err(dev, "%s: start_context failed rc=%d\n", __func__, rc); 1336 goto err; 1337 } 1338out: 1339 return rc; 1340err: 1341 for (i = i-1; i >= 0; i--) 1342 afu_unmap_irq(0, ctx, i, ctx); 1343 free_afu_irqs(ctx); 1344 goto out; 1345}; 1346 1347/** 1348 * ocxlflash_fd_mmap() - mmap handler for adapter file descriptor 1349 * @file: File installed with adapter file descriptor. 1350 * @vma: VM area associated with mapping. 1351 * 1352 * Return: 0 on success, -errno on failure 1353 */ 1354static int ocxlflash_fd_mmap(struct file *file, struct vm_area_struct *vma) 1355{ 1356 return afu_mmap(file, vma); 1357} 1358 1359/** 1360 * ocxlflash_fd_release() - release the context associated with the file 1361 * @inode: File inode pointer. 1362 * @file: File associated with the adapter context. 1363 * 1364 * Return: 0 on success, -errno on failure 1365 */ 1366static int ocxlflash_fd_release(struct inode *inode, struct file *file) 1367{ 1368 return afu_release(inode, file); 1369} 1370 1371/* Backend ops to ocxlflash services */ 1372const struct cxlflash_backend_ops cxlflash_ocxl_ops = { 1373 .module = THIS_MODULE, 1374 .psa_map = ocxlflash_psa_map, 1375 .psa_unmap = ocxlflash_psa_unmap, 1376 .process_element = ocxlflash_process_element, 1377 .map_afu_irq = ocxlflash_map_afu_irq, 1378 .unmap_afu_irq = ocxlflash_unmap_afu_irq, 1379 .get_irq_objhndl = ocxlflash_get_irq_objhndl, 1380 .start_context = ocxlflash_start_context, 1381 .stop_context = ocxlflash_stop_context, 1382 .afu_reset = ocxlflash_afu_reset, 1383 .set_master = ocxlflash_set_master, 1384 .get_context = ocxlflash_get_context, 1385 .dev_context_init = ocxlflash_dev_context_init, 1386 .release_context = ocxlflash_release_context, 1387 .perst_reloads_same_image = ocxlflash_perst_reloads_same_image, 1388 .read_adapter_vpd = ocxlflash_read_adapter_vpd, 1389 .allocate_afu_irqs = ocxlflash_allocate_afu_irqs, 1390 .free_afu_irqs = ocxlflash_free_afu_irqs, 1391 .create_afu = ocxlflash_create_afu, 1392 .destroy_afu = ocxlflash_destroy_afu, 1393 .get_fd = ocxlflash_get_fd, 1394 .fops_get_context = ocxlflash_fops_get_context, 1395 .start_work = ocxlflash_start_work, 1396 .fd_mmap = ocxlflash_fd_mmap, 1397 .fd_release = ocxlflash_fd_release, 1398};