Lines Matching refs:mdev
136 static int mthca_tune_pci(struct mthca_dev *mdev)
142 if (pci_find_capability(mdev->pdev, PCI_CAP_ID_PCIX)) {
143 if (pcix_set_mmrbc(mdev->pdev, pcix_get_max_mmrbc(mdev->pdev))) {
144 mthca_err(mdev, "Couldn't set PCI-X max read count, "
148 } else if (!(mdev->mthca_flags & MTHCA_FLAG_PCIE))
149 mthca_info(mdev, "No PCI-X capability, not setting RBC.\n");
151 if (pci_is_pcie(mdev->pdev)) {
152 if (pcie_set_readrq(mdev->pdev, 4096)) {
153 mthca_err(mdev, "Couldn't write PCI Express read request, "
157 } else if (mdev->mthca_flags & MTHCA_FLAG_PCIE)
158 mthca_info(mdev, "No PCI Express capability, "
164 static int mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
168 mdev->limits.mtt_seg_size = (1 << log_mtts_per_seg) * 8;
169 err = mthca_QUERY_DEV_LIM(mdev, dev_lim);
171 mthca_err(mdev, "QUERY_DEV_LIM command returned %d"
176 mthca_err(mdev, "HCA minimum page size of %d bigger than "
182 mthca_err(mdev, "HCA has %d ports, but we only support %d, "
188 if (dev_lim->uar_size > pci_resource_len(mdev->pdev, 2)) {
189 mthca_err(mdev, "HCA reported UAR size of 0x%x bigger than "
192 (unsigned long long)pci_resource_len(mdev->pdev, 2));
196 mdev->limits.num_ports = dev_lim->num_ports;
197 mdev->limits.vl_cap = dev_lim->max_vl;
198 mdev->limits.mtu_cap = dev_lim->max_mtu;
199 mdev->limits.gid_table_len = dev_lim->max_gids;
200 mdev->limits.pkey_table_len = dev_lim->max_pkeys;
201 mdev->limits.local_ca_ack_delay = dev_lim->local_ca_ack_delay;
207 mdev->limits.max_sg = min_t(int, dev_lim->max_sg,
210 (mthca_is_memfree(mdev) ?
214 mdev->limits.max_wqes = dev_lim->max_qp_sz;
215 mdev->limits.max_qp_init_rdma = dev_lim->max_requester_per_qp;
216 mdev->limits.reserved_qps = dev_lim->reserved_qps;
217 mdev->limits.max_srq_wqes = dev_lim->max_srq_sz;
218 mdev->limits.reserved_srqs = dev_lim->reserved_srqs;
219 mdev->limits.reserved_eecs = dev_lim->reserved_eecs;
220 mdev->limits.max_desc_sz = dev_lim->max_desc_sz;
221 mdev->limits.max_srq_sge = mthca_max_srq_sge(mdev);
227 mdev->limits.max_cqes = dev_lim->max_cq_sz - 1;
228 mdev->limits.reserved_cqs = dev_lim->reserved_cqs;
229 mdev->limits.reserved_eqs = dev_lim->reserved_eqs;
230 mdev->limits.reserved_mtts = dev_lim->reserved_mtts;
231 mdev->limits.reserved_mrws = dev_lim->reserved_mrws;
232 mdev->limits.reserved_uars = dev_lim->reserved_uars;
233 mdev->limits.reserved_pds = dev_lim->reserved_pds;
234 mdev->limits.port_width_cap = dev_lim->max_port_width;
235 mdev->limits.page_size_cap = ~(u32) (dev_lim->min_page_sz - 1);
236 mdev->limits.flags = dev_lim->flags;
244 mdev->limits.stat_rate_support = dev_lim->stat_rate_support;
245 else if (mdev->mthca_flags & MTHCA_FLAG_SINAI_OPT)
246 mdev->limits.stat_rate_support = 0xf;
248 mdev->limits.stat_rate_support = 0x3;
257 mdev->device_cap_flags = IB_DEVICE_CHANGE_PHY_PORT |
263 mdev->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR;
266 mdev->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR;
269 mdev->device_cap_flags |= IB_DEVICE_RAW_MULTI;
272 mdev->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG;
275 mdev->device_cap_flags |= IB_DEVICE_UD_AV_PORT_ENFORCE;
278 mdev->mthca_flags |= MTHCA_FLAG_SRQ;
280 if (mthca_is_memfree(mdev))
282 mdev->device_cap_flags |= IB_DEVICE_UD_IP_CSUM;
287 static int mthca_init_tavor(struct mthca_dev *mdev)
295 err = mthca_SYS_EN(mdev);
297 mthca_err(mdev, "SYS_EN command returned %d, aborting.\n", err);
301 err = mthca_QUERY_FW(mdev);
303 mthca_err(mdev, "QUERY_FW command returned %d,"
307 err = mthca_QUERY_DDR(mdev);
309 mthca_err(mdev, "QUERY_DDR command returned %d, aborting.\n", err);
313 err = mthca_dev_lim(mdev, &dev_lim);
315 mthca_err(mdev, "QUERY_DEV_LIM command returned %d, aborting.\n", err);
322 if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
325 size = mthca_make_profile(mdev, &profile, &dev_lim, &init_hca);
331 err = mthca_INIT_HCA(mdev, &init_hca);
333 mthca_err(mdev, "INIT_HCA command returned %d, aborting.\n", err);
340 mthca_SYS_DIS(mdev);
345 static int mthca_load_fw(struct mthca_dev *mdev)
351 mdev->fw.arbel.fw_icm =
352 mthca_alloc_icm(mdev, mdev->fw.arbel.fw_pages,
354 if (!mdev->fw.arbel.fw_icm) {
355 mthca_err(mdev, "Couldn't allocate FW area, aborting.\n");
359 err = mthca_MAP_FA(mdev, mdev->fw.arbel.fw_icm);
361 mthca_err(mdev, "MAP_FA command returned %d, aborting.\n", err);
364 err = mthca_RUN_FW(mdev);
366 mthca_err(mdev, "RUN_FW command returned %d, aborting.\n", err);
373 mthca_UNMAP_FA(mdev);
376 mthca_free_icm(mdev, mdev->fw.arbel.fw_icm, 0);
380 static int mthca_init_icm(struct mthca_dev *mdev,
388 err = mthca_SET_ICM_SIZE(mdev, icm_size, &aux_pages);
390 mthca_err(mdev, "SET_ICM_SIZE command returned %d, aborting.\n", err);
394 mthca_dbg(mdev, "%lld KB of HCA context requires %lld KB aux memory.\n",
398 mdev->fw.arbel.aux_icm = mthca_alloc_icm(mdev, aux_pages,
400 if (!mdev->fw.arbel.aux_icm) {
401 mthca_err(mdev, "Couldn't allocate aux memory, aborting.\n");
405 err = mthca_MAP_ICM_AUX(mdev, mdev->fw.arbel.aux_icm);
407 mthca_err(mdev, "MAP_ICM_AUX returned %d, aborting.\n", err);
411 err = mthca_map_eq_icm(mdev, init_hca->eqc_base);
413 mthca_err(mdev, "Failed to map EQ context memory, aborting.\n");
418 mdev->limits.reserved_mtts = ALIGN(mdev->limits.reserved_mtts * mdev->limits.mtt_seg_size,
419 dma_get_cache_alignment()) / mdev->limits.mtt_seg_size;
421 mdev->mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca->mtt_base,
422 mdev->limits.mtt_seg_size,
423 mdev->limits.num_mtt_segs,
424 mdev->limits.reserved_mtts,
426 if (!mdev->mr_table.mtt_table) {
427 mthca_err(mdev, "Failed to map MTT context memory, aborting.\n");
432 mdev->mr_table.mpt_table = mthca_alloc_icm_table(mdev, init_hca->mpt_base,
434 mdev->limits.num_mpts,
435 mdev->limits.reserved_mrws,
437 if (!mdev->mr_table.mpt_table) {
438 mthca_err(mdev, "Failed to map MPT context memory, aborting.\n");
443 mdev->qp_table.qp_table = mthca_alloc_icm_table(mdev, init_hca->qpc_base,
445 mdev->limits.num_qps,
446 mdev->limits.reserved_qps,
448 if (!mdev->qp_table.qp_table) {
449 mthca_err(mdev, "Failed to map QP context memory, aborting.\n");
454 mdev->qp_table.eqp_table = mthca_alloc_icm_table(mdev, init_hca->eqpc_base,
456 mdev->limits.num_qps,
457 mdev->limits.reserved_qps,
459 if (!mdev->qp_table.eqp_table) {
460 mthca_err(mdev, "Failed to map EQP context memory, aborting.\n");
465 mdev->qp_table.rdb_table = mthca_alloc_icm_table(mdev, init_hca->rdb_base,
467 mdev->limits.num_qps <<
468 mdev->qp_table.rdb_shift, 0,
470 if (!mdev->qp_table.rdb_table) {
471 mthca_err(mdev, "Failed to map RDB context memory, aborting\n");
476 mdev->cq_table.table = mthca_alloc_icm_table(mdev, init_hca->cqc_base,
478 mdev->limits.num_cqs,
479 mdev->limits.reserved_cqs,
481 if (!mdev->cq_table.table) {
482 mthca_err(mdev, "Failed to map CQ context memory, aborting.\n");
487 if (mdev->mthca_flags & MTHCA_FLAG_SRQ) {
488 mdev->srq_table.table =
489 mthca_alloc_icm_table(mdev, init_hca->srqc_base,
491 mdev->limits.num_srqs,
492 mdev->limits.reserved_srqs,
494 if (!mdev->srq_table.table) {
495 mthca_err(mdev, "Failed to map SRQ context memory, "
507 mdev->mcg_table.table = mthca_alloc_icm_table(mdev, init_hca->mc_base,
509 mdev->limits.num_mgms +
510 mdev->limits.num_amgms,
511 mdev->limits.num_mgms +
512 mdev->limits.num_amgms,
514 if (!mdev->mcg_table.table) {
515 mthca_err(mdev, "Failed to map MCG context memory, aborting.\n");
523 if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
524 mthca_free_icm_table(mdev, mdev->srq_table.table);
527 mthca_free_icm_table(mdev, mdev->cq_table.table);
530 mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
533 mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
536 mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
539 mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
542 mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
545 mthca_unmap_eq_icm(mdev);
548 mthca_UNMAP_ICM_AUX(mdev);
551 mthca_free_icm(mdev, mdev->fw.arbel.aux_icm, 0);
556 static void mthca_free_icms(struct mthca_dev *mdev)
559 mthca_free_icm_table(mdev, mdev->mcg_table.table);
560 if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
561 mthca_free_icm_table(mdev, mdev->srq_table.table);
562 mthca_free_icm_table(mdev, mdev->cq_table.table);
563 mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
564 mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
565 mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
566 mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
567 mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
568 mthca_unmap_eq_icm(mdev);
570 mthca_UNMAP_ICM_AUX(mdev);
571 mthca_free_icm(mdev, mdev->fw.arbel.aux_icm, 0);
574 static int mthca_init_arbel(struct mthca_dev *mdev)
582 err = mthca_QUERY_FW(mdev);
584 mthca_err(mdev, "QUERY_FW command failed %d, aborting.\n", err);
588 err = mthca_ENABLE_LAM(mdev);
590 mthca_dbg(mdev, "No HCA-attached memory (running in MemFree mode)\n");
591 mdev->mthca_flags |= MTHCA_FLAG_NO_LAM;
593 mthca_err(mdev, "ENABLE_LAM returned %d, aborting.\n", err);
597 err = mthca_load_fw(mdev);
599 mthca_err(mdev, "Loading FW returned %d, aborting.\n", err);
603 err = mthca_dev_lim(mdev, &dev_lim);
605 mthca_err(mdev, "QUERY_DEV_LIM returned %d, aborting.\n", err);
612 if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
615 icm_size = mthca_make_profile(mdev, &profile, &dev_lim, &init_hca);
621 err = mthca_init_icm(mdev, &dev_lim, &init_hca, icm_size);
625 err = mthca_INIT_HCA(mdev, &init_hca);
627 mthca_err(mdev, "INIT_HCA command returned %d, aborting.\n", err);
634 mthca_free_icms(mdev);
637 mthca_UNMAP_FA(mdev);
638 mthca_free_icm(mdev, mdev->fw.arbel.fw_icm, 0);
641 if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))
642 mthca_DISABLE_LAM(mdev);
647 static void mthca_close_hca(struct mthca_dev *mdev)
649 mthca_CLOSE_HCA(mdev, 0);
651 if (mthca_is_memfree(mdev)) {
652 mthca_free_icms(mdev);
654 mthca_UNMAP_FA(mdev);
655 mthca_free_icm(mdev, mdev->fw.arbel.fw_icm, 0);
657 if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))
658 mthca_DISABLE_LAM(mdev);
660 mthca_SYS_DIS(mdev);
663 static int mthca_init_hca(struct mthca_dev *mdev)
668 if (mthca_is_memfree(mdev))
669 err = mthca_init_arbel(mdev);
671 err = mthca_init_tavor(mdev);
676 err = mthca_QUERY_ADAPTER(mdev, &adapter);
678 mthca_err(mdev, "QUERY_ADAPTER command returned %d, aborting.\n", err);
682 mdev->eq_table.inta_pin = adapter.inta_pin;
683 if (!mthca_is_memfree(mdev))
684 mdev->rev_id = adapter.revision_id;
685 memcpy(mdev->board_id, adapter.board_id, sizeof mdev->board_id);
690 mthca_close_hca(mdev);
851 static int mthca_enable_msi_x(struct mthca_dev *mdev)
855 err = pci_alloc_irq_vectors(mdev->pdev, 3, 3, PCI_IRQ_MSIX);
859 mdev->eq_table.eq[MTHCA_EQ_COMP ].msi_x_vector =
860 pci_irq_vector(mdev->pdev, 0);
861 mdev->eq_table.eq[MTHCA_EQ_ASYNC].msi_x_vector =
862 pci_irq_vector(mdev->pdev, 1);
863 mdev->eq_table.eq[MTHCA_EQ_CMD ].msi_x_vector =
864 pci_irq_vector(mdev->pdev, 2);
901 struct mthca_dev *mdev;
964 mdev = ib_alloc_device(mthca_dev, ib_dev);
965 if (!mdev) {
972 mdev->pdev = pdev;
974 mdev->mthca_flags = mthca_hca_table[hca_type].flags;
976 mdev->mthca_flags |= MTHCA_FLAG_DDR_HIDDEN;
983 err = mthca_reset(mdev);
985 mthca_err(mdev, "Failed to reset HCA, aborting.\n");
989 err = mthca_cmd_init(mdev);
991 mthca_err(mdev, "Failed to init command interface, aborting.\n");
995 err = mthca_tune_pci(mdev);
999 err = mthca_init_hca(mdev);
1003 if (mdev->fw_ver < mthca_hca_table[hca_type].latest_fw) {
1004 mthca_warn(mdev, "HCA FW version %d.%d.%03d is old (%d.%d.%03d is current).\n",
1005 (int) (mdev->fw_ver >> 32), (int) (mdev->fw_ver >> 16) & 0xffff,
1006 (int) (mdev->fw_ver & 0xffff),
1010 mthca_warn(mdev, "If you have problems, try updating your HCA FW.\n");
1013 if (msi_x && !mthca_enable_msi_x(mdev))
1014 mdev->mthca_flags |= MTHCA_FLAG_MSI_X;
1016 err = mthca_setup_hca(mdev);
1017 if (err == -EBUSY && (mdev->mthca_flags & MTHCA_FLAG_MSI_X)) {
1019 mdev->mthca_flags &= ~MTHCA_FLAG_MSI_X;
1021 err = mthca_setup_hca(mdev);
1027 err = mthca_register_device(mdev);
1031 err = mthca_create_agents(mdev);
1035 pci_set_drvdata(pdev, mdev);
1036 mdev->hca_type = hca_type;
1038 mdev->active = true;
1043 mthca_unregister_device(mdev);
1046 mthca_cleanup_mcg_table(mdev);
1047 mthca_cleanup_av_table(mdev);
1048 mthca_cleanup_qp_table(mdev);
1049 mthca_cleanup_srq_table(mdev);
1050 mthca_cleanup_cq_table(mdev);
1051 mthca_cmd_use_polling(mdev);
1052 mthca_cleanup_eq_table(mdev);
1054 mthca_pd_free(mdev, &mdev->driver_pd);
1056 mthca_cleanup_mr_table(mdev);
1057 mthca_cleanup_pd_table(mdev);
1058 mthca_cleanup_uar_table(mdev);
1061 if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
1064 mthca_close_hca(mdev);
1067 mthca_cmd_cleanup(mdev);
1070 ib_dealloc_device(&mdev->ib_dev);
1083 struct mthca_dev *mdev = pci_get_drvdata(pdev);
1086 if (mdev) {
1087 mthca_free_agents(mdev);
1088 mthca_unregister_device(mdev);
1090 for (p = 1; p <= mdev->limits.num_ports; ++p)
1091 mthca_CLOSE_IB(mdev, p);
1093 mthca_cleanup_mcg_table(mdev);
1094 mthca_cleanup_av_table(mdev);
1095 mthca_cleanup_qp_table(mdev);
1096 mthca_cleanup_srq_table(mdev);
1097 mthca_cleanup_cq_table(mdev);
1098 mthca_cmd_use_polling(mdev);
1099 mthca_cleanup_eq_table(mdev);
1101 mthca_pd_free(mdev, &mdev->driver_pd);
1103 mthca_cleanup_mr_table(mdev);
1104 mthca_cleanup_pd_table(mdev);
1106 iounmap(mdev->kar);
1107 mthca_uar_free(mdev, &mdev->driver_uar);
1108 mthca_cleanup_uar_table(mdev);
1109 mthca_close_hca(mdev);
1110 mthca_cmd_cleanup(mdev);
1112 if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
1115 ib_dealloc_device(&mdev->ib_dev);
1124 struct mthca_dev *mdev;
1127 mdev = pci_get_drvdata(pdev);
1128 if (!mdev)
1130 hca_type = mdev->hca_type;