pci.c (810813c47a564416f6306ae214e2661366c987a7) pci.c (8633186209e35dfafc27c3d0f0d5e702ab47265f)
1/*
2 * Copyright 2014 IBM Corp.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 */

--- 401 unchanged lines hidden (view full) ---

410 if (retry++ > 5) {
411 pr_err("PSL: Timebase sync: giving up!\n");
412 return -EIO;
413 }
414 psl_tb = cxl_p1_read(adapter, CXL_PSL_Timebase);
415 delta = mftb() - psl_tb;
416 if (delta < 0)
417 delta = -delta;
1/*
2 * Copyright 2014 IBM Corp.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
8 */

--- 401 unchanged lines hidden (view full) ---

410 if (retry++ > 5) {
411 pr_err("PSL: Timebase sync: giving up!\n");
412 return -EIO;
413 }
414 psl_tb = cxl_p1_read(adapter, CXL_PSL_Timebase);
415 delta = mftb() - psl_tb;
416 if (delta < 0)
417 delta = -delta;
418 } while (tb_to_ns(delta) > 16000);
418 } while (cputime_to_usecs(delta) > 16);
419
420 return 0;
421}
422
423static int init_implementation_afu_regs(struct cxl_afu *afu)
424{
425 /* read/write masks for this slice */
426 cxl_p1n_write(afu, CXL_PSL_APCALLOC_A, 0xFFFFFFFEFEFEFEFEULL);

--- 172 unchanged lines hidden (view full) ---

599 afu->p1n_mmio = NULL;
600 }
601 if (afu->afu_desc_mmio) {
602 iounmap(afu->afu_desc_mmio);
603 afu->afu_desc_mmio = NULL;
604 }
605}
606
419
420 return 0;
421}
422
423static int init_implementation_afu_regs(struct cxl_afu *afu)
424{
425 /* read/write masks for this slice */
426 cxl_p1n_write(afu, CXL_PSL_APCALLOC_A, 0xFFFFFFFEFEFEFEFEULL);

--- 172 unchanged lines hidden (view full) ---

599 afu->p1n_mmio = NULL;
600 }
601 if (afu->afu_desc_mmio) {
602 iounmap(afu->afu_desc_mmio);
603 afu->afu_desc_mmio = NULL;
604 }
605}
606
607static void cxl_release_afu(struct device *dev)
607void cxl_release_afu(struct device *dev)
608{
609 struct cxl_afu *afu = to_cxl_afu(dev);
610
611 pr_devel("cxl_release_afu\n");
612
613 idr_destroy(&afu->contexts_idr);
614 cxl_release_spa(afu);
615
616 kfree(afu);
617}
618
608{
609 struct cxl_afu *afu = to_cxl_afu(dev);
610
611 pr_devel("cxl_release_afu\n");
612
613 idr_destroy(&afu->contexts_idr);
614 cxl_release_spa(afu);
615
616 kfree(afu);
617}
618
619static struct cxl_afu *cxl_alloc_afu(struct cxl *adapter, int slice)
620{
621 struct cxl_afu *afu;
622
623 if (!(afu = kzalloc(sizeof(struct cxl_afu), GFP_KERNEL)))
624 return NULL;
625
626 afu->adapter = adapter;
627 afu->dev.parent = &adapter->dev;
628 afu->dev.release = cxl_release_afu;
629 afu->slice = slice;
630 idr_init(&afu->contexts_idr);
631 mutex_init(&afu->contexts_lock);
632 spin_lock_init(&afu->afu_cntl_lock);
633 mutex_init(&afu->spa_mutex);
634
635 afu->prefault_mode = CXL_PREFAULT_NONE;
636 afu->irqs_max = afu->adapter->user_irqs;
637
638 return afu;
639}
640
641/* Expects AFU struct to have recently been zeroed out */
642static int cxl_read_afu_descriptor(struct cxl_afu *afu)
643{
644 u64 val;
645
646 val = AFUD_READ_INFO(afu);
647 afu->pp_irqs = AFUD_NUM_INTS_PER_PROC(val);
648 afu->max_procs_virtualised = AFUD_NUM_PROCS(val);

--- 451 unchanged lines hidden (view full) ---

1100
1101 pr_devel("cxl_release_adapter\n");
1102
1103 cxl_remove_adapter_nr(adapter);
1104
1105 kfree(adapter);
1106}
1107
619/* Expects AFU struct to have recently been zeroed out */
620static int cxl_read_afu_descriptor(struct cxl_afu *afu)
621{
622 u64 val;
623
624 val = AFUD_READ_INFO(afu);
625 afu->pp_irqs = AFUD_NUM_INTS_PER_PROC(val);
626 afu->max_procs_virtualised = AFUD_NUM_PROCS(val);

--- 451 unchanged lines hidden (view full) ---

1078
1079 pr_devel("cxl_release_adapter\n");
1080
1081 cxl_remove_adapter_nr(adapter);
1082
1083 kfree(adapter);
1084}
1085
1108static struct cxl *cxl_alloc_adapter(void)
1109{
1110 struct cxl *adapter;
1111
1112 if (!(adapter = kzalloc(sizeof(struct cxl), GFP_KERNEL)))
1113 return NULL;
1114
1115 spin_lock_init(&adapter->afu_list_lock);
1116
1117 if (cxl_alloc_adapter_nr(adapter))
1118 goto err1;
1119
1120 if (dev_set_name(&adapter->dev, "card%i", adapter->adapter_num))
1121 goto err2;
1122
1123 return adapter;
1124
1125err2:
1126 cxl_remove_adapter_nr(adapter);
1127err1:
1128 kfree(adapter);
1129 return NULL;
1130}
1131
1132#define CXL_PSL_ErrIVTE_tberror (0x1ull << (63-31))
1133
1134static int sanitise_adapter_regs(struct cxl *adapter)
1135{
1136 /* Clear PSL tberror bit by writing 1 to it */
1137 cxl_p1_write(adapter, CXL_PSL_ErrIVTE, CXL_PSL_ErrIVTE_tberror);
1138 return cxl_tlb_slb_invalidate(adapter);
1139}

--- 441 unchanged lines hidden ---
1086#define CXL_PSL_ErrIVTE_tberror (0x1ull << (63-31))
1087
1088static int sanitise_adapter_regs(struct cxl *adapter)
1089{
1090 /* Clear PSL tberror bit by writing 1 to it */
1091 cxl_p1_write(adapter, CXL_PSL_ErrIVTE, CXL_PSL_ErrIVTE_tberror);
1092 return cxl_tlb_slb_invalidate(adapter);
1093}

--- 441 unchanged lines hidden ---