static int init_implementation_adapter_regs(struct cxl *adapter, struct pci_dev *dev) { struct device_node *np; const __be32 *prop; u64 psl_dsnctl; u64 chipid; if (!(np = pnv_pci_get_phb_node(dev))) return -ENODEV; while (np && !(prop = of_get_property(np, "ibm,chip-id", NULL))) np = of_get_next_parent(np); if (!np) return -ENODEV; chipid = be32_to_cpup(prop); of_node_put(np); /* Tell PSL where to route data to */ psl_dsnctl = 0x02E8900002000000ULL | (chipid << (63-5)); cxl_p1_write(adapter, CXL_PSL_DSNDCTL, psl_dsnctl); cxl_p1_write(adapter, CXL_PSL_RESLCKTO, 0x20000000200ULL); /* snoop write mask */ cxl_p1_write(adapter, CXL_PSL_SNWRALLOC, 0x00000000FFFFFFFFULL); /* set fir_accum */ cxl_p1_write(adapter, CXL_PSL_FIR_CNTL, 0x0800000000000000ULL); /* for debugging with trace arrays */ cxl_p1_write(adapter, CXL_PSL_TRACE, 0x0000FF7C00000000ULL); return 0; }
int cxl_register_psl_err_irq(struct cxl *adapter) { int rc; if ((rc = cxl_register_one_irq(adapter, cxl_irq_err, adapter, &adapter->err_hwirq, &adapter->err_virq))) return rc; cxl_p1_write(adapter, CXL_PSL_ErrIVTE, adapter->err_hwirq & 0xffff); return 0; }
void cxl_stop_trace(struct cxl *adapter) { int slice; /* Stop the trace */ cxl_p1_write(adapter, CXL_PSL_TRACE, 0x8000000000000017LL); /* Stop the slice traces */ spin_lock(&adapter->afu_list_lock); for (slice = 0; slice < adapter->slices; slice++) { if (adapter->afu[slice]) cxl_p1n_write(adapter->afu[slice], CXL_PSL_SLICE_TRACE, 0x8000000000000000LL); } spin_unlock(&adapter->afu_list_lock); }
static int sanitise_adapter_regs(struct cxl *adapter) { cxl_p1_write(adapter, CXL_PSL_ErrIVTE, 0x0000000000000000); return cxl_tlb_slb_invalidate(adapter); }
void cxl_release_psl_err_irq(struct cxl *adapter) { cxl_p1_write(adapter, CXL_PSL_ErrIVTE, 0x0000000000000000); cxl_unmap_irq(adapter->err_virq, adapter); cxl_release_one_irq(adapter, adapter->err_hwirq); }