541 +#include <sys/mkdev.h> |
541 +#include <sys/mkdev.h> |
542 +#endif |
542 +#endif |
543 |
543 |
544 #include "ibverbs.h" |
544 #include "ibverbs.h" |
545 |
545 |
546 @@ -93,6 +98,12 @@ |
546 +#define IBV_IS_VALID_UGID(gid) \ |
|
547 + (gid->raw[0] != 0xff) |
|
548 + |
|
549 +#define IBV_IS_VALID_MGID(gid) \ |
|
550 + ((gids->raw[0] == 0xff) && \ |
|
551 + ((gids->raw[1] == 0x0e) || (gids->raw[1] == 0x02) || \ |
|
552 + (gids->raw[1] == 0x05) || (gids->raw[1] == 0x08) || \ |
|
553 + (gids->raw[1] == 0x1e) || (gids->raw[1] == 0x12) || \ |
|
554 + (gids->raw[1] == 0x15) || (gids->raw[1] == 0x18))) |
|
555 + |
|
556 int ibv_rate_to_mult(enum ibv_rate rate) |
|
557 { |
|
558 switch (rate) { |
|
559 @@ -93,6 +108,12 @@ |
547 int __ibv_query_gid(struct ibv_context *context, uint8_t port_num, |
560 int __ibv_query_gid(struct ibv_context *context, uint8_t port_num, |
548 int index, union ibv_gid *gid) |
561 int index, union ibv_gid *gid) |
549 { |
562 { |
550 +#if defined(__SVR4) && defined(__sun) |
563 +#if defined(__SVR4) && defined(__sun) |
551 + extern int sol_ibv_query_gid(); |
564 + extern int sol_ibv_query_gid(); |
554 + |
567 + |
555 +#else |
568 +#else |
556 char name[24]; |
569 char name[24]; |
557 char attr[41]; |
570 char attr[41]; |
558 uint16_t val; |
571 uint16_t val; |
559 @@ -112,6 +123,7 @@ |
572 @@ -112,6 +133,7 @@ |
560 } |
573 } |
561 |
574 |
562 return 0; |
575 return 0; |
563 +#endif |
576 +#endif |
564 } |
577 } |
565 default_symver(__ibv_query_gid, ibv_query_gid); |
578 default_symver(__ibv_query_gid, ibv_query_gid); |
566 |
579 |
567 @@ -118,6 +130,12 @@ |
580 @@ -118,6 +140,12 @@ |
568 int __ibv_query_pkey(struct ibv_context *context, uint8_t port_num, |
581 int __ibv_query_pkey(struct ibv_context *context, uint8_t port_num, |
569 int index, uint16_t *pkey) |
582 int index, uint16_t *pkey) |
570 { |
583 { |
571 +#if defined(__SVR4) && defined(__sun) |
584 +#if defined(__SVR4) && defined(__sun) |
572 + extern int sol_ibv_query_pkey(); |
585 + extern int sol_ibv_query_pkey(); |
587 |
600 |
588 +int ibv_register_sm_events(struct ibv_context *context, |
601 +int ibv_register_sm_events(struct ibv_context *context, |
589 + ibv_sm_event_type_t event, uint_t gid_num, union ibv_gid *gids) |
602 + ibv_sm_event_type_t event, uint_t gid_num, union ibv_gid *gids) |
590 +{ |
603 +{ |
591 + struct ibv_reg_sm_event *cmd; |
604 + struct ibv_reg_sm_event *cmd; |
592 + int rc, cmd_size, data_size; |
605 + int cmd_size, data_size; |
593 + void *data_p; |
606 + void *data_p; |
594 + |
607 + |
595 + if (((gid_num > 0) && (gids == NULL)) || |
608 + if (((gid_num > 0) && (gids == NULL)) || |
596 + ((gid_num == 0) && (gids != NULL))) { |
609 + ((gid_num == 0) && (gids != NULL))) { |
597 + errno = EINVAL; |
610 + errno = EINVAL; |
622 + cmd_size = (sizeof (struct ibv_reg_sm_event)) + data_size; |
635 + cmd_size = (sizeof (struct ibv_reg_sm_event)) + data_size; |
623 + data_p = (void *)gids; |
636 + data_p = (void *)gids; |
624 + cmd = alloca(cmd_size); |
637 + cmd = alloca(cmd_size); |
625 + cmd->data_num = gid_num; |
638 + cmd->data_num = gid_num; |
626 + |
639 + |
|
640 + if ((event == IBV_SM_EVENT_UGID) && (!IBV_IS_VALID_UGID(gids))) { |
|
641 + errno = EINVAL; |
|
642 + return (-1); |
|
643 + } |
|
644 + |
|
645 + if ((event == IBV_SM_EVENT_MGID) && (!IBV_IS_VALID_MGID(gids))) { |
|
646 + errno = EINVAL; |
|
647 + return (-1); |
|
648 + } |
|
649 + |
627 + IBV_INIT_CMD(cmd, cmd_size, REG_SM_EVENT); |
650 + IBV_INIT_CMD(cmd, cmd_size, REG_SM_EVENT); |
628 + |
651 + |
629 + cmd->events = event; |
652 + cmd->events = event; |
630 + if (gid_num > 0) |
653 + if (gid_num > 0) |
631 + memcpy(cmd->driver_data, data_p, data_size); |
654 + memcpy(cmd->driver_data, data_p, data_size); |
632 + |
655 + |
633 + rc = write(context->cmd_fd, cmd, cmd_size); |
656 + if (write(context->cmd_fd, cmd, cmd_size) != cmd_size) { |
634 + if (rc < 0) { |
657 + errno = EINVAL; |
635 + errno = -rc; |
658 + return (-1); |
636 + rc = -1; |
659 + } |
637 + } |
660 + |
638 + |
661 + return (0); |
639 + return (rc); |
|
640 +} |
662 +} |
641 + |
663 + |
642 +int ibv_unregister_sm_events(struct ibv_context *context, |
664 +int ibv_unregister_sm_events(struct ibv_context *context, |
643 + ibv_sm_event_type_t event, uint_t gid_num, union ibv_gid *gids) |
665 + ibv_sm_event_type_t event, uint_t gid_num, union ibv_gid *gids) |
644 +{ |
666 +{ |
645 + struct ibv_unreg_sm_event *cmd; |
667 + struct ibv_unreg_sm_event *cmd; |
646 + int rc, cmd_size, data_size; |
668 + int cmd_size, data_size; |
647 + void *data_p; |
669 + void *data_p; |
648 + |
670 + |
649 + if (((gid_num > 0) && (gids == NULL)) || |
671 + if (((gid_num > 0) && (gids == NULL)) || |
650 + ((gid_num == 0) && (gids != NULL))) { |
672 + ((gid_num == 0) && (gids != NULL))) { |
651 + errno = EINVAL; |
673 + errno = EINVAL; |
676 + cmd_size = (sizeof (struct ibv_unreg_sm_event)) + data_size; |
698 + cmd_size = (sizeof (struct ibv_unreg_sm_event)) + data_size; |
677 + data_p = (void *)gids; |
699 + data_p = (void *)gids; |
678 + cmd = alloca(cmd_size); |
700 + cmd = alloca(cmd_size); |
679 + cmd->data_num = gid_num; |
701 + cmd->data_num = gid_num; |
680 + |
702 + |
|
703 + if ((event == IBV_SM_EVENT_UGID) && (!IBV_IS_VALID_UGID(gids))) { |
|
704 + errno = EINVAL; |
|
705 + return (-1); |
|
706 + } |
|
707 + |
|
708 + if ((event == IBV_SM_EVENT_MGID) && (!IBV_IS_VALID_MGID(gids))) { |
|
709 + errno = EINVAL; |
|
710 + return (-1); |
|
711 + } |
|
712 + |
681 + IBV_INIT_CMD(cmd, cmd_size, UNREG_SM_EVENT); |
713 + IBV_INIT_CMD(cmd, cmd_size, UNREG_SM_EVENT); |
682 + |
714 + |
683 + cmd->events = event; |
715 + cmd->events = event; |
684 + if (gid_num > 0) |
716 + if (gid_num > 0) |
685 + memcpy(cmd->driver_data, data_p, data_size); |
717 + memcpy(cmd->driver_data, data_p, data_size); |
686 + |
718 + |
687 + rc = write(context->cmd_fd, cmd, cmd_size); |
719 + if (write(context->cmd_fd, cmd, cmd_size) != cmd_size) { |
688 + if (rc < 0) { |
720 + errno = EINVAL; |
689 + errno = -rc; |
721 + return (-1); |
690 + rc = -1; |
722 + } |
691 + } |
723 + |
692 + |
724 + return (0); |
693 + return (rc); |
|
694 +} |
725 +} |
695 + |
726 + |
696 +int ibv_gid_reachable(struct ibv_context *context, |
727 +int ibv_gid_reachable(struct ibv_context *context, |
697 + uint_t port, union ibv_gid *gid_p, int timeout) |
728 + uint_t port, union ibv_gid *gid_p, int timeout) |
698 +{ |
729 +{ |
708 + |
739 + |
709 + memcpy(cmd->gid, gid_p, sizeof (*gid_p)); |
740 + memcpy(cmd->gid, gid_p, sizeof (*gid_p)); |
710 + |
741 + |
711 + rc = write(context->cmd_fd, cmd, sizeof(struct ibv_gid_reachable)); |
742 + rc = write(context->cmd_fd, cmd, sizeof(struct ibv_gid_reachable)); |
712 + if (rc < 0) { |
743 + if (rc < 0) { |
713 + errno = -rc; |
744 + return (-1); |
714 + rc = -1; |
745 + } |
715 + } |
746 + |
716 + |
747 + return (0); |
717 + return (rc); |
|
718 +} |
748 +} |
719 + |
749 + |
720 struct ibv_pd *__ibv_alloc_pd(struct ibv_context *context) |
750 struct ibv_pd *__ibv_alloc_pd(struct ibv_context *context) |
721 { |
751 { |
722 struct ibv_pd *pd; |
752 struct ibv_pd *pd; |
723 @@ -148,6 +299,27 @@ |
753 @@ -148,6 +326,27 @@ |
724 } |
754 } |
725 default_symver(__ibv_alloc_pd, ibv_alloc_pd); |
755 default_symver(__ibv_alloc_pd, ibv_alloc_pd); |
726 |
756 |
727 +struct ibv_shpd *__ibv_alloc_shpd(struct ibv_pd *pd, uint64_t share_key, struct ibv_shpd *shpd) |
757 +struct ibv_shpd *__ibv_alloc_shpd(struct ibv_pd *pd, uint64_t share_key, struct ibv_shpd *shpd) |
728 +{ |
758 +{ |
746 +default_symver(__ibv_share_pd, ibv_share_pd); |
776 +default_symver(__ibv_share_pd, ibv_share_pd); |
747 + |
777 + |
748 int __ibv_dealloc_pd(struct ibv_pd *pd) |
778 int __ibv_dealloc_pd(struct ibv_pd *pd) |
749 { |
779 { |
750 return pd->context->ops.dealloc_pd(pd); |
780 return pd->context->ops.dealloc_pd(pd); |
751 @@ -175,6 +347,27 @@ |
781 @@ -175,6 +374,27 @@ |
752 } |
782 } |
753 default_symver(__ibv_reg_mr, ibv_reg_mr); |
783 default_symver(__ibv_reg_mr, ibv_reg_mr); |
754 |
784 |
755 +struct ibv_mr *__ibv_reg_mr_relaxed(struct ibv_pd *pd, void *addr, |
785 +struct ibv_mr *__ibv_reg_mr_relaxed(struct ibv_pd *pd, void *addr, |
756 + size_t length, int access) |
786 + size_t length, int access) |
774 +default_symver(__ibv_reg_mr_relaxed, ibv_reg_mr_relaxed); |
804 +default_symver(__ibv_reg_mr_relaxed, ibv_reg_mr_relaxed); |
775 + |
805 + |
776 int __ibv_dereg_mr(struct ibv_mr *mr) |
806 int __ibv_dereg_mr(struct ibv_mr *mr) |
777 { |
807 { |
778 int ret; |
808 int ret; |
779 @@ -189,6 +382,26 @@ |
809 @@ -189,6 +409,26 @@ |
780 } |
810 } |
781 default_symver(__ibv_dereg_mr, ibv_dereg_mr); |
811 default_symver(__ibv_dereg_mr, ibv_dereg_mr); |
782 |
812 |
783 +int __ibv_dereg_mr_relaxed(struct ibv_mr *mr) |
813 +int __ibv_dereg_mr_relaxed(struct ibv_mr *mr) |
784 +{ |
814 +{ |
801 +default_symver(__ibv_flush_relaxed_mr, ibv_flush_relaxed_mr); |
831 +default_symver(__ibv_flush_relaxed_mr, ibv_flush_relaxed_mr); |
802 + |
832 + |
803 static struct ibv_comp_channel *ibv_create_comp_channel_v2(struct ibv_context *context) |
833 static struct ibv_comp_channel *ibv_create_comp_channel_v2(struct ibv_context *context) |
804 { |
834 { |
805 struct ibv_abi_compat_v2 *t = context->abi_compat; |
835 struct ibv_abi_compat_v2 *t = context->abi_compat; |
806 @@ -212,6 +425,10 @@ |
836 @@ -212,6 +452,10 @@ |
807 struct ibv_comp_channel *channel; |
837 struct ibv_comp_channel *channel; |
808 struct ibv_create_comp_channel cmd; |
838 struct ibv_create_comp_channel cmd; |
809 struct ibv_create_comp_channel_resp resp; |
839 struct ibv_create_comp_channel_resp resp; |
810 +#if defined(__SVR4) && defined(__sun) |
840 +#if defined(__SVR4) && defined(__sun) |
811 + int event_fd; |
841 + int event_fd; |
812 + struct stat fstat_buf; |
842 + struct stat fstat_buf; |
813 +#endif |
843 +#endif |
814 |
844 |
815 if (abi_ver <= 2) |
845 if (abi_ver <= 2) |
816 return ibv_create_comp_channel_v2(context); |
846 return ibv_create_comp_channel_v2(context); |
817 @@ -221,7 +438,23 @@ |
847 @@ -221,7 +465,23 @@ |
818 return NULL; |
848 return NULL; |
819 |
849 |
820 IBV_INIT_CMD_RESP(&cmd, sizeof cmd, CREATE_COMP_CHANNEL, &resp, sizeof resp); |
850 IBV_INIT_CMD_RESP(&cmd, sizeof cmd, CREATE_COMP_CHANNEL, &resp, sizeof resp); |
821 +#if defined(__SVR4) && defined(__sun) |
851 +#if defined(__SVR4) && defined(__sun) |
822 + event_fd = open("/dev/infiniband/ofs/uverbs:event", O_RDWR); |
852 + event_fd = open("/dev/infiniband/ofs/uverbs:event", O_RDWR); |