Loading drivers/infiniband/hw/hfi1/affinity.c +2 −1 Original line number Diff line number Diff line Loading @@ -125,6 +125,7 @@ int node_affinity_init(void) cpumask_weight(topology_sibling_cpumask( cpumask_first(&node_affinity.proc.mask) )); node_affinity.num_possible_nodes = num_possible_nodes(); node_affinity.num_online_nodes = num_online_nodes(); node_affinity.num_online_cpus = num_online_cpus(); Loading @@ -135,7 +136,7 @@ int node_affinity_init(void) */ init_real_cpu_mask(); hfi1_per_node_cntr = kcalloc(num_possible_nodes(), hfi1_per_node_cntr = kcalloc(node_affinity.num_possible_nodes, sizeof(*hfi1_per_node_cntr), GFP_KERNEL); if (!hfi1_per_node_cntr) return -ENOMEM; Loading drivers/infiniband/hw/hfi1/affinity.h +1 −8 Original line number Diff line number Diff line Loading @@ -70,14 +70,6 @@ struct cpu_mask_set { uint gen; }; struct hfi1_affinity { struct cpu_mask_set def_intr; struct cpu_mask_set rcv_intr; struct cpumask real_cpu_mask; /* spin lock to protect affinity struct */ spinlock_t lock; }; struct hfi1_msix_entry; /* Initialize non-HT cpu cores mask */ Loading Loading @@ -119,6 +111,7 @@ struct hfi1_affinity_node_list { struct cpumask real_cpu_mask; struct cpu_mask_set proc; int num_core_siblings; int num_possible_nodes; int num_online_nodes; int num_online_cpus; struct mutex lock; /* protects affinity nodes */ Loading drivers/infiniband/hw/hfi1/chip.c +6 −3 Original line number Diff line number Diff line Loading @@ -8488,7 +8488,10 @@ static int do_8051_command( */ if (type == HCMD_WRITE_LCB_CSR) { in_data |= ((*out_data) & 0xffffffffffull) << 8; reg = ((((*out_data) >> 40) & 0xff) << /* must preserve COMPLETED - it is tied to hardware */ reg = read_csr(dd, DC_DC8051_CFG_EXT_DEV_0); reg &= DC_DC8051_CFG_EXT_DEV_0_COMPLETED_SMASK; reg |= ((((*out_data) >> 40) & 0xff) << DC_DC8051_CFG_EXT_DEV_0_RETURN_CODE_SHIFT) | ((((*out_data) >> 48) & 0xffff) << DC_DC8051_CFG_EXT_DEV_0_RSP_DATA_SHIFT); Loading Loading @@ -9567,11 +9570,11 @@ int bringup_serdes(struct hfi1_pportdata *ppd) if (HFI1_CAP_IS_KSET(EXTENDED_PSN)) add_rcvctrl(dd, RCV_CTRL_RCV_EXTENDED_PSN_ENABLE_SMASK); guid = ppd->guid; guid = ppd->guids[HFI1_PORT_GUID_INDEX]; if (!guid) { if (dd->base_guid) guid = dd->base_guid + ppd->port - 1; ppd->guid = guid; ppd->guids[HFI1_PORT_GUID_INDEX] = guid; } /* Set linkinit_reason on power up per OPA spec */ Loading drivers/infiniband/hw/hfi1/chip_registers.h +3 −0 Original line number Diff line number Diff line Loading @@ -415,6 +415,9 @@ #define ASIC_CFG_SBUS_REQUEST_DATA_IN_SHIFT 32 #define ASIC_CFG_SBUS_REQUEST_RECEIVER_ADDR_SHIFT 0 #define ASIC_CFG_SCRATCH (ASIC + 0x000000000020) #define ASIC_CFG_SCRATCH_1 (ASIC_CFG_SCRATCH + 0x08) #define ASIC_CFG_SCRATCH_2 (ASIC_CFG_SCRATCH + 0x10) #define ASIC_CFG_SCRATCH_3 (ASIC_CFG_SCRATCH + 0x18) #define ASIC_CFG_THERM_POLL_EN (ASIC + 0x000000000050) #define ASIC_EEP_ADDR_CMD (ASIC + 0x000000000308) #define ASIC_EEP_ADDR_CMD_EP_ADDR_MASK 0xFFFFFFull Loading drivers/infiniband/hw/hfi1/debugfs.c +110 −0 Original line number Diff line number Diff line Loading @@ -541,6 +541,114 @@ static ssize_t asic_flags_write(struct file *file, const char __user *buf, return ret; } /* read the dc8051 memory */ static ssize_t dc8051_memory_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct hfi1_pportdata *ppd = private2ppd(file); ssize_t rval; void *tmp; loff_t start, end; /* the checks below expect the position to be positive */ if (*ppos < 0) return -EINVAL; tmp = kzalloc(DC8051_DATA_MEM_SIZE, GFP_KERNEL); if (!tmp) return -ENOMEM; /* * Fill in the requested portion of the temporary buffer from the * 8051 memory. The 8051 memory read is done in terms of 8 bytes. * Adjust start and end to fit. Skip reading anything if out of * range. */ start = *ppos & ~0x7; /* round down */ if (start < DC8051_DATA_MEM_SIZE) { end = (*ppos + count + 7) & ~0x7; /* round up */ if (end > DC8051_DATA_MEM_SIZE) end = DC8051_DATA_MEM_SIZE; rval = read_8051_data(ppd->dd, start, end - start, (u64 *)(tmp + start)); if (rval) goto done; } rval = simple_read_from_buffer(buf, count, ppos, tmp, DC8051_DATA_MEM_SIZE); done: kfree(tmp); return rval; } static ssize_t debugfs_lcb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct hfi1_pportdata *ppd = private2ppd(file); struct hfi1_devdata *dd = ppd->dd; unsigned long total, csr_off; u64 data; if (*ppos < 0) return -EINVAL; /* only read 8 byte quantities */ if ((count % 8) != 0) return -EINVAL; /* offset must be 8-byte aligned */ if ((*ppos % 8) != 0) return -EINVAL; /* do nothing if out of range or zero count */ if (*ppos >= (LCB_END - LCB_START) || !count) return 0; /* reduce count if needed */ if (*ppos + count > LCB_END - LCB_START) count = (LCB_END - LCB_START) - *ppos; csr_off = LCB_START + *ppos; for (total = 0; total < count; total += 8, csr_off += 8) { if (read_lcb_csr(dd, csr_off, (u64 *)&data)) break; /* failed */ if (put_user(data, (unsigned long __user *)(buf + total))) break; } *ppos += total; return total; } static ssize_t debugfs_lcb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct hfi1_pportdata *ppd = private2ppd(file); struct hfi1_devdata *dd = ppd->dd; unsigned long total, csr_off, data; if (*ppos < 0) return -EINVAL; /* only write 8 byte quantities */ if ((count % 8) != 0) return -EINVAL; /* offset must be 8-byte aligned */ if ((*ppos % 8) != 0) return -EINVAL; /* do nothing if out of range or zero count */ if (*ppos >= (LCB_END - LCB_START) || !count) return 0; /* reduce count if needed */ if (*ppos + count > LCB_END - LCB_START) count = (LCB_END - LCB_START) - *ppos; csr_off = LCB_START + *ppos; for (total = 0; total < count; total += 8, csr_off += 8) { if (get_user(data, (unsigned long __user *)(buf + total))) break; if (write_lcb_csr(dd, csr_off, data)) break; /* failed */ } *ppos += total; return total; } /* * read the per-port QSFP data for ppd */ Loading Loading @@ -931,6 +1039,8 @@ static const struct counter_info port_cntr_ops[] = { DEBUGFS_XOPS("qsfp2", qsfp2_debugfs_read, qsfp2_debugfs_write, qsfp2_debugfs_open, qsfp2_debugfs_release), DEBUGFS_OPS("asic_flags", asic_flags_read, asic_flags_write), DEBUGFS_OPS("dc8051_memory", dc8051_memory_read, NULL), DEBUGFS_OPS("lcb", debugfs_lcb_read, debugfs_lcb_write), }; static void *_sdma_cpu_list_seq_start(struct seq_file *s, loff_t *pos) Loading Loading
drivers/infiniband/hw/hfi1/affinity.c +2 −1 Original line number Diff line number Diff line Loading @@ -125,6 +125,7 @@ int node_affinity_init(void) cpumask_weight(topology_sibling_cpumask( cpumask_first(&node_affinity.proc.mask) )); node_affinity.num_possible_nodes = num_possible_nodes(); node_affinity.num_online_nodes = num_online_nodes(); node_affinity.num_online_cpus = num_online_cpus(); Loading @@ -135,7 +136,7 @@ int node_affinity_init(void) */ init_real_cpu_mask(); hfi1_per_node_cntr = kcalloc(num_possible_nodes(), hfi1_per_node_cntr = kcalloc(node_affinity.num_possible_nodes, sizeof(*hfi1_per_node_cntr), GFP_KERNEL); if (!hfi1_per_node_cntr) return -ENOMEM; Loading
drivers/infiniband/hw/hfi1/affinity.h +1 −8 Original line number Diff line number Diff line Loading @@ -70,14 +70,6 @@ struct cpu_mask_set { uint gen; }; struct hfi1_affinity { struct cpu_mask_set def_intr; struct cpu_mask_set rcv_intr; struct cpumask real_cpu_mask; /* spin lock to protect affinity struct */ spinlock_t lock; }; struct hfi1_msix_entry; /* Initialize non-HT cpu cores mask */ Loading Loading @@ -119,6 +111,7 @@ struct hfi1_affinity_node_list { struct cpumask real_cpu_mask; struct cpu_mask_set proc; int num_core_siblings; int num_possible_nodes; int num_online_nodes; int num_online_cpus; struct mutex lock; /* protects affinity nodes */ Loading
drivers/infiniband/hw/hfi1/chip.c +6 −3 Original line number Diff line number Diff line Loading @@ -8488,7 +8488,10 @@ static int do_8051_command( */ if (type == HCMD_WRITE_LCB_CSR) { in_data |= ((*out_data) & 0xffffffffffull) << 8; reg = ((((*out_data) >> 40) & 0xff) << /* must preserve COMPLETED - it is tied to hardware */ reg = read_csr(dd, DC_DC8051_CFG_EXT_DEV_0); reg &= DC_DC8051_CFG_EXT_DEV_0_COMPLETED_SMASK; reg |= ((((*out_data) >> 40) & 0xff) << DC_DC8051_CFG_EXT_DEV_0_RETURN_CODE_SHIFT) | ((((*out_data) >> 48) & 0xffff) << DC_DC8051_CFG_EXT_DEV_0_RSP_DATA_SHIFT); Loading Loading @@ -9567,11 +9570,11 @@ int bringup_serdes(struct hfi1_pportdata *ppd) if (HFI1_CAP_IS_KSET(EXTENDED_PSN)) add_rcvctrl(dd, RCV_CTRL_RCV_EXTENDED_PSN_ENABLE_SMASK); guid = ppd->guid; guid = ppd->guids[HFI1_PORT_GUID_INDEX]; if (!guid) { if (dd->base_guid) guid = dd->base_guid + ppd->port - 1; ppd->guid = guid; ppd->guids[HFI1_PORT_GUID_INDEX] = guid; } /* Set linkinit_reason on power up per OPA spec */ Loading
drivers/infiniband/hw/hfi1/chip_registers.h +3 −0 Original line number Diff line number Diff line Loading @@ -415,6 +415,9 @@ #define ASIC_CFG_SBUS_REQUEST_DATA_IN_SHIFT 32 #define ASIC_CFG_SBUS_REQUEST_RECEIVER_ADDR_SHIFT 0 #define ASIC_CFG_SCRATCH (ASIC + 0x000000000020) #define ASIC_CFG_SCRATCH_1 (ASIC_CFG_SCRATCH + 0x08) #define ASIC_CFG_SCRATCH_2 (ASIC_CFG_SCRATCH + 0x10) #define ASIC_CFG_SCRATCH_3 (ASIC_CFG_SCRATCH + 0x18) #define ASIC_CFG_THERM_POLL_EN (ASIC + 0x000000000050) #define ASIC_EEP_ADDR_CMD (ASIC + 0x000000000308) #define ASIC_EEP_ADDR_CMD_EP_ADDR_MASK 0xFFFFFFull Loading
drivers/infiniband/hw/hfi1/debugfs.c +110 −0 Original line number Diff line number Diff line Loading @@ -541,6 +541,114 @@ static ssize_t asic_flags_write(struct file *file, const char __user *buf, return ret; } /* read the dc8051 memory */ static ssize_t dc8051_memory_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct hfi1_pportdata *ppd = private2ppd(file); ssize_t rval; void *tmp; loff_t start, end; /* the checks below expect the position to be positive */ if (*ppos < 0) return -EINVAL; tmp = kzalloc(DC8051_DATA_MEM_SIZE, GFP_KERNEL); if (!tmp) return -ENOMEM; /* * Fill in the requested portion of the temporary buffer from the * 8051 memory. The 8051 memory read is done in terms of 8 bytes. * Adjust start and end to fit. Skip reading anything if out of * range. */ start = *ppos & ~0x7; /* round down */ if (start < DC8051_DATA_MEM_SIZE) { end = (*ppos + count + 7) & ~0x7; /* round up */ if (end > DC8051_DATA_MEM_SIZE) end = DC8051_DATA_MEM_SIZE; rval = read_8051_data(ppd->dd, start, end - start, (u64 *)(tmp + start)); if (rval) goto done; } rval = simple_read_from_buffer(buf, count, ppos, tmp, DC8051_DATA_MEM_SIZE); done: kfree(tmp); return rval; } static ssize_t debugfs_lcb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct hfi1_pportdata *ppd = private2ppd(file); struct hfi1_devdata *dd = ppd->dd; unsigned long total, csr_off; u64 data; if (*ppos < 0) return -EINVAL; /* only read 8 byte quantities */ if ((count % 8) != 0) return -EINVAL; /* offset must be 8-byte aligned */ if ((*ppos % 8) != 0) return -EINVAL; /* do nothing if out of range or zero count */ if (*ppos >= (LCB_END - LCB_START) || !count) return 0; /* reduce count if needed */ if (*ppos + count > LCB_END - LCB_START) count = (LCB_END - LCB_START) - *ppos; csr_off = LCB_START + *ppos; for (total = 0; total < count; total += 8, csr_off += 8) { if (read_lcb_csr(dd, csr_off, (u64 *)&data)) break; /* failed */ if (put_user(data, (unsigned long __user *)(buf + total))) break; } *ppos += total; return total; } static ssize_t debugfs_lcb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct hfi1_pportdata *ppd = private2ppd(file); struct hfi1_devdata *dd = ppd->dd; unsigned long total, csr_off, data; if (*ppos < 0) return -EINVAL; /* only write 8 byte quantities */ if ((count % 8) != 0) return -EINVAL; /* offset must be 8-byte aligned */ if ((*ppos % 8) != 0) return -EINVAL; /* do nothing if out of range or zero count */ if (*ppos >= (LCB_END - LCB_START) || !count) return 0; /* reduce count if needed */ if (*ppos + count > LCB_END - LCB_START) count = (LCB_END - LCB_START) - *ppos; csr_off = LCB_START + *ppos; for (total = 0; total < count; total += 8, csr_off += 8) { if (get_user(data, (unsigned long __user *)(buf + total))) break; if (write_lcb_csr(dd, csr_off, data)) break; /* failed */ } *ppos += total; return total; } /* * read the per-port QSFP data for ppd */ Loading Loading @@ -931,6 +1039,8 @@ static const struct counter_info port_cntr_ops[] = { DEBUGFS_XOPS("qsfp2", qsfp2_debugfs_read, qsfp2_debugfs_write, qsfp2_debugfs_open, qsfp2_debugfs_release), DEBUGFS_OPS("asic_flags", asic_flags_read, asic_flags_write), DEBUGFS_OPS("dc8051_memory", dc8051_memory_read, NULL), DEBUGFS_OPS("lcb", debugfs_lcb_read, debugfs_lcb_write), }; static void *_sdma_cpu_list_seq_start(struct seq_file *s, loff_t *pos) Loading