Lines Matching refs:adapter

331 static int init_implementation_adapter_regs(struct cxl *adapter, struct pci_dev *dev)  in init_implementation_adapter_regs()  argument
350 cxl_p1_write(adapter, CXL_PSL_DSNDCTL, psl_dsnctl); in init_implementation_adapter_regs()
351 cxl_p1_write(adapter, CXL_PSL_RESLCKTO, 0x20000000200ULL); in init_implementation_adapter_regs()
353 cxl_p1_write(adapter, CXL_PSL_SNWRALLOC, 0x00000000FFFFFFFFULL); in init_implementation_adapter_regs()
355 cxl_p1_write(adapter, CXL_PSL_FIR_CNTL, 0x0800000000000000ULL); in init_implementation_adapter_regs()
357 cxl_p1_write(adapter, CXL_PSL_TRACE, 0x0000FF7C00000000ULL); in init_implementation_adapter_regs()
375 int cxl_setup_irq(struct cxl *adapter, unsigned int hwirq, in cxl_setup_irq() argument
378 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_setup_irq()
383 int cxl_update_image_control(struct cxl *adapter) in cxl_update_image_control() argument
385 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_update_image_control()
400 if (adapter->perst_loads_image) in cxl_update_image_control()
405 if (adapter->perst_select_user) in cxl_update_image_control()
418 int cxl_alloc_one_irq(struct cxl *adapter) in cxl_alloc_one_irq() argument
420 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_alloc_one_irq()
425 void cxl_release_one_irq(struct cxl *adapter, int hwirq) in cxl_release_one_irq() argument
427 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_release_one_irq()
432 int cxl_alloc_irq_ranges(struct cxl_irq_ranges *irqs, struct cxl *adapter, unsigned int num) in cxl_alloc_irq_ranges() argument
434 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_alloc_irq_ranges()
439 void cxl_release_irq_ranges(struct cxl_irq_ranges *irqs, struct cxl *adapter) in cxl_release_irq_ranges() argument
441 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_release_irq_ranges()
500 static int cxl_map_slice_regs(struct cxl_afu *afu, struct cxl *adapter, struct pci_dev *dev) in cxl_map_slice_regs() argument
508 afu->psn_phys = p2_base(dev) + (adapter->ps_off + (afu->slice * adapter->ps_size)); in cxl_map_slice_regs()
509 afu_desc = p2_base(dev) + adapter->afu_desc_off + (afu->slice * adapter->afu_desc_size); in cxl_map_slice_regs()
516 if (!(afu->afu_desc_mmio = ioremap(afu_desc, adapter->afu_desc_size))) in cxl_map_slice_regs()
547 static struct cxl_afu *cxl_alloc_afu(struct cxl *adapter, int slice) in cxl_alloc_afu() argument
554 afu->adapter = adapter; in cxl_alloc_afu()
555 afu->dev.parent = &adapter->dev; in cxl_alloc_afu()
564 afu->irqs_max = afu->adapter->user_irqs; in cxl_alloc_afu()
603 if (afu->psa && afu->adapter->ps_size < in cxl_afu_descriptor_looks_ok()
675 static int cxl_init_afu(struct cxl *adapter, int slice, struct pci_dev *dev) in cxl_init_afu() argument
681 if (!(afu = cxl_alloc_afu(adapter, slice))) in cxl_init_afu()
684 if ((rc = dev_set_name(&afu->dev, "afu%i.%i", adapter->adapter_num, slice))) in cxl_init_afu()
687 if ((rc = cxl_map_slice_regs(afu, adapter, dev))) in cxl_init_afu()
732 adapter->afu[afu->slice] = afu; in cxl_init_afu()
763 spin_lock(&afu->adapter->afu_list_lock); in cxl_remove_afu()
764 afu->adapter->afu[afu->slice] = NULL; in cxl_remove_afu()
765 spin_unlock(&afu->adapter->afu_list_lock); in cxl_remove_afu()
777 int cxl_reset(struct cxl *adapter) in cxl_reset() argument
779 struct pci_dev *dev = to_pci_dev(adapter->dev.parent); in cxl_reset()
795 static int cxl_map_adapter_regs(struct cxl *adapter, struct pci_dev *dev) in cxl_map_adapter_regs() argument
805 if (!(adapter->p1_mmio = ioremap(p1_base(dev), p1_size(dev)))) in cxl_map_adapter_regs()
808 if (!(adapter->p2_mmio = ioremap(p2_base(dev), p2_size(dev)))) in cxl_map_adapter_regs()
814 iounmap(adapter->p1_mmio); in cxl_map_adapter_regs()
815 adapter->p1_mmio = NULL; in cxl_map_adapter_regs()
824 static void cxl_unmap_adapter_regs(struct cxl *adapter) in cxl_unmap_adapter_regs() argument
826 if (adapter->p1_mmio) in cxl_unmap_adapter_regs()
827 iounmap(adapter->p1_mmio); in cxl_unmap_adapter_regs()
828 if (adapter->p2_mmio) in cxl_unmap_adapter_regs()
829 iounmap(adapter->p2_mmio); in cxl_unmap_adapter_regs()
832 static int cxl_read_vsec(struct cxl *adapter, struct pci_dev *dev) in cxl_read_vsec() argument
841 dev_err(&adapter->dev, "ABORTING: CXL VSEC not found!\n"); in cxl_read_vsec()
851 CXL_READ_VSEC_STATUS(dev, vsec, &adapter->vsec_status); in cxl_read_vsec()
852 CXL_READ_VSEC_PSL_REVISION(dev, vsec, &adapter->psl_rev); in cxl_read_vsec()
853 CXL_READ_VSEC_CAIA_MAJOR(dev, vsec, &adapter->caia_major); in cxl_read_vsec()
854 CXL_READ_VSEC_CAIA_MINOR(dev, vsec, &adapter->caia_minor); in cxl_read_vsec()
855 CXL_READ_VSEC_BASE_IMAGE(dev, vsec, &adapter->base_image); in cxl_read_vsec()
857 adapter->user_image_loaded = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED); in cxl_read_vsec()
858 adapter->perst_loads_image = true; in cxl_read_vsec()
859 adapter->perst_select_user = !!(image_state & CXL_VSEC_USER_IMAGE_LOADED); in cxl_read_vsec()
861 CXL_READ_VSEC_NAFUS(dev, vsec, &adapter->slices); in cxl_read_vsec()
869 adapter->ps_off = ps_off * 64 * 1024; in cxl_read_vsec()
870 adapter->ps_size = ps_size * 64 * 1024; in cxl_read_vsec()
871 adapter->afu_desc_off = afu_desc_off * 64 * 1024; in cxl_read_vsec()
872 adapter->afu_desc_size = afu_desc_size *64 * 1024; in cxl_read_vsec()
875 adapter->user_irqs = pnv_cxl_get_irq_count(dev) - 1 - 2*adapter->slices; in cxl_read_vsec()
880 static int cxl_vsec_looks_ok(struct cxl *adapter, struct pci_dev *dev) in cxl_vsec_looks_ok() argument
882 if (adapter->vsec_status & CXL_STATUS_SECOND_PORT) in cxl_vsec_looks_ok()
885 if (adapter->vsec_status & CXL_UNSUPPORTED_FEATURES) { in cxl_vsec_looks_ok()
886 dev_err(&adapter->dev, "ABORTING: CXL requires unsupported features\n"); in cxl_vsec_looks_ok()
890 if (!adapter->slices) { in cxl_vsec_looks_ok()
893 dev_err(&adapter->dev, "ABORTING: Device has no AFUs\n"); in cxl_vsec_looks_ok()
897 if (!adapter->afu_desc_off || !adapter->afu_desc_size) { in cxl_vsec_looks_ok()
898 dev_err(&adapter->dev, "ABORTING: VSEC shows no AFU descriptors\n"); in cxl_vsec_looks_ok()
902 if (adapter->ps_size > p2_size(dev) - adapter->ps_off) { in cxl_vsec_looks_ok()
903 dev_err(&adapter->dev, "ABORTING: Problem state size larger than " in cxl_vsec_looks_ok()
905 adapter->ps_size, p2_size(dev) - adapter->ps_off); in cxl_vsec_looks_ok()
914 struct cxl *adapter = to_cxl_adapter(dev); in cxl_release_adapter() local
918 kfree(adapter); in cxl_release_adapter()
923 struct cxl *adapter; in cxl_alloc_adapter() local
925 if (!(adapter = kzalloc(sizeof(struct cxl), GFP_KERNEL))) in cxl_alloc_adapter()
928 adapter->dev.parent = &dev->dev; in cxl_alloc_adapter()
929 adapter->dev.release = cxl_release_adapter; in cxl_alloc_adapter()
930 pci_set_drvdata(dev, adapter); in cxl_alloc_adapter()
931 spin_lock_init(&adapter->afu_list_lock); in cxl_alloc_adapter()
933 return adapter; in cxl_alloc_adapter()
936 static int sanitise_adapter_regs(struct cxl *adapter) in sanitise_adapter_regs() argument
938 cxl_p1_write(adapter, CXL_PSL_ErrIVTE, 0x0000000000000000); in sanitise_adapter_regs()
939 return cxl_tlb_slb_invalidate(adapter); in sanitise_adapter_regs()
944 struct cxl *adapter; in cxl_init_adapter() local
949 if (!(adapter = cxl_alloc_adapter(dev))) in cxl_init_adapter()
955 if ((rc = cxl_alloc_adapter_nr(adapter))) in cxl_init_adapter()
958 if ((rc = dev_set_name(&adapter->dev, "card%i", adapter->adapter_num))) in cxl_init_adapter()
961 if ((rc = cxl_read_vsec(adapter, dev))) in cxl_init_adapter()
964 if ((rc = cxl_vsec_looks_ok(adapter, dev))) in cxl_init_adapter()
967 if ((rc = cxl_update_image_control(adapter))) in cxl_init_adapter()
970 if ((rc = cxl_map_adapter_regs(adapter, dev))) in cxl_init_adapter()
973 if ((rc = sanitise_adapter_regs(adapter))) in cxl_init_adapter()
976 if ((rc = init_implementation_adapter_regs(adapter, dev))) in cxl_init_adapter()
988 if ((rc = cxl_register_psl_err_irq(adapter))) in cxl_init_adapter()
992 cxl_debugfs_adapter_add(adapter); in cxl_init_adapter()
998 if ((rc = cxl_register_adapter(adapter))) in cxl_init_adapter()
1001 if ((rc = cxl_sysfs_adapter_add(adapter))) in cxl_init_adapter()
1004 return adapter; in cxl_init_adapter()
1007 device_unregister(&adapter->dev); in cxl_init_adapter()
1009 cxl_debugfs_adapter_remove(adapter); in cxl_init_adapter()
1010 cxl_release_psl_err_irq(adapter); in cxl_init_adapter()
1012 cxl_unmap_adapter_regs(adapter); in cxl_init_adapter()
1014 cxl_remove_adapter_nr(adapter); in cxl_init_adapter()
1017 kfree(adapter); in cxl_init_adapter()
1021 static void cxl_remove_adapter(struct cxl *adapter) in cxl_remove_adapter() argument
1023 struct pci_dev *pdev = to_pci_dev(adapter->dev.parent); in cxl_remove_adapter()
1027 cxl_sysfs_adapter_remove(adapter); in cxl_remove_adapter()
1028 cxl_debugfs_adapter_remove(adapter); in cxl_remove_adapter()
1029 cxl_release_psl_err_irq(adapter); in cxl_remove_adapter()
1030 cxl_unmap_adapter_regs(adapter); in cxl_remove_adapter()
1031 cxl_remove_adapter_nr(adapter); in cxl_remove_adapter()
1033 device_unregister(&adapter->dev); in cxl_remove_adapter()
1042 struct cxl *adapter; in cxl_probe() local
1057 adapter = cxl_init_adapter(dev); in cxl_probe()
1058 if (IS_ERR(adapter)) { in cxl_probe()
1059 dev_err(&dev->dev, "cxl_init_adapter failed: %li\n", PTR_ERR(adapter)); in cxl_probe()
1060 return PTR_ERR(adapter); in cxl_probe()
1063 for (slice = 0; slice < adapter->slices; slice++) { in cxl_probe()
1064 if ((rc = cxl_init_afu(adapter, slice, dev))) in cxl_probe()
1073 struct cxl *adapter = pci_get_drvdata(dev); in cxl_remove() local
1082 for (afu = 0; afu < adapter->slices; afu++) in cxl_remove()
1083 cxl_remove_afu(adapter->afu[afu]); in cxl_remove()
1084 cxl_remove_adapter(adapter); in cxl_remove()