[ofw] [PATCH 6/9] uvp: obtain desired interface by GUID
Leonid Keller
leonid at mellanox.co.il
Thu Jun 26 05:38:04 PDT 2008
Did this changes correspond to the current state of WinVerbs branch ?
I see for example in mlx4.c and old uvp_get_interface() as before the
below patch.
> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org
> [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Sean Hefty
> Sent: Thursday, June 26, 2008 2:56 AM
> To: Hefty, Sean; ofw at lists.openfabrics.org
> Subject: [ofw] [PATCH 6/9] uvp: obtain desired interface by GUID
>
> The current uvp_get_interface() routine takes a structure as input.
> Included in the structure is a version number.
>
> A better solution to supporting multiple interfaces is to
> define interfaces using GUIDs. This not only allows
> different versions of the same interface (for example the UVP
> interface), but also provides a mechanism that can be used to
> add new interfaces without affecting existing ABIs or APIs.
>
> This will make it easier to extend the existing interfaces in
> the future.
>
> Signed-off-by: Sean Hefty <sean.hefty at intel.com>
> ---
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:'
> trunk/core/al/user/ual_ca.c branches\winverbs/core/al/user/ual_ca.c
> --- trunk/core/al/user/ual_ca.c 2008-06-03
> 21:35:25.166625000 -0700
> +++ branches\winverbs/core/al/user/ual_ca.c 2008-06-03
> 21:24:28.322875000 -0700
> @@ -116,7 +116,8 @@ open_vendor_lib(
> return IB_SUCCESS;
> }
>
> - pfn_uvp_ifc = al_get_uvp_ifc_pfn( h_lib );
> + pfn_uvp_ifc = (uvp_get_interface_t)
> + GetProcAddress( h_lib,
> "uvp_get_interface" );
> if( !pfn_uvp_ifc )
> {
> #if defined( _DEBUG_ )
> @@ -131,7 +132,7 @@ open_vendor_lib(
> }
>
> /* Query the vendor-supported user-mode functions */
> - pfn_uvp_ifc( &p_vca_intf->user_verbs );
> + pfn_uvp_ifc( IID_UVP, &p_vca_intf->user_verbs );
> p_vca_intf->h_uvp_lib = h_lib;
> AL_EXIT( AL_DBG_CA );
> return IB_SUCCESS;
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:'
> trunk/core/al/user/ual_support.h
> branches\winverbs/core/al/user/ual_support.h
> --- trunk/core/al/user/ual_support.h 2008-06-03
> 21:35:25.182250000 -0700
> +++ branches\winverbs/core/al/user/ual_support.h
> 2008-06-03 21:24:28.338500000 -0700
> @@ -80,14 +80,6 @@ al_unload_uvp(
> FreeLibrary( h_uvp_lib );
> }
>
> -static inline uvp_get_interface_t
> -al_get_uvp_ifc_pfn(
> - IN void
> *h_uvp_lib )
> -{
> - return (uvp_get_interface_t)
> - GetProcAddress( h_uvp_lib, "uvp_get_interface" );
> -}
> -
> static inline void
> al_uvp_lib_err(
> IN uint32_t
> dbg_lvl,
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:'
> trunk/hw/mlx4/user/hca/mlx4.c
> branches\winverbs/hw/mlx4/user/hca/mlx4.c
> --- trunk/hw/mlx4/user/hca/mlx4.c 2008-06-03
> 21:35:25.197875000 -0700
> +++ branches\winverbs/hw/mlx4/user/hca/mlx4.c 2008-06-03
> 21:24:28.354125000 -0700
> @@ -180,22 +180,8 @@ void mlx4_free_context(struct ibv_contex
> cl_free(context);
> }
>
> -__declspec(dllexport) ib_api_status_t
> -uvp_get_interface (
> - IN OUT uvp_interface_t *p_uvp )
> +static void __get_uvp_interface(uvp_interface_t *p_uvp)
> {
> - CL_ASSERT(p_uvp);
> -
> - /*
> - * Version of the header file this interface export can handle
> - */
> - p_uvp->version = 0x101;
> - p_uvp->guid = 0x12345678;
> -
> -
> - /*
> - * CA Management
> - */
> p_uvp->pre_open_ca = mlx4_pre_open_ca;
> p_uvp->post_open_ca = mlx4_post_open_ca;
> p_uvp->pre_query_ca = mlx4_pre_query_ca;
> @@ -298,30 +284,47 @@ uvp_get_interface (
> p_uvp->rearm_n_cq = NULL;
> p_uvp->peek_cq = NULL;
> p_uvp->bind_mw = NULL;
> +}
>
> +/* TODO: define and expose XRC through new interface GUID */
> #ifdef XRC_SUPPORT
> +static void __get_xrc_interface(uvp_xrc_interface_t *p_xrc) {
> /*
> * XRC Management Verbs
> */
> p_uvp->pre_create_xrc_srq =
> mlx4_pre_create_xrc_srq;
> - p_uvp->post_create_xrc_srq = mlx4_post_create_xrc_srq;
> - p_uvp->pre_open_xrc_domain = mlx4_pre_open_xrc_domain;
> - p_uvp->post_open_xrc_domain = mlx4_post_open_xrc_domain;
> - p_uvp->pre_close_xrc_domain = NULL;
> + p_uvp->post_create_xrc_srq =
> mlx4_post_create_xrc_srq;
> + p_uvp->pre_open_xrc_domain =
> mlx4_pre_open_xrc_domain;
> + p_uvp->post_open_xrc_domain =
> mlx4_post_open_xrc_domain;
> + p_uvp->pre_close_xrc_domain = NULL;
> p_uvp->post_close_xrc_domain = mlx4_post_close_xrc_domain;
> p_uvp->pre_create_xrc_rcv_qp = NULL;
> p_uvp->post_create_xrc_rcv_qp = NULL;
> p_uvp->pre_modify_xrc_rcv_qp = NULL;
> p_uvp->post_modify_xrc_rcv_qp = NULL;
> - p_uvp->pre_query_xrc_rcv_qp = NULL;
> + p_uvp->pre_query_xrc_rcv_qp = NULL;
> p_uvp->post_query_xrc_rcv_qp = NULL;
> - p_uvp->pre_reg_xrc_rcv_qp = NULL;
> - p_uvp->post_reg_xrc_rcv_qp = NULL;
> - p_uvp->pre_unreg_xrc_rcv_qp = NULL;
> + p_uvp->pre_reg_xrc_rcv_qp = NULL;
> + p_uvp->post_reg_xrc_rcv_qp = NULL;
> + p_uvp->pre_unreg_xrc_rcv_qp = NULL;
> p_uvp->post_unreg_xrc_rcv_qp = NULL;
> +}
> #endif
>
> - return IB_SUCCESS;
> -}
> +__declspec(dllexport) ib_api_status_t
> +uvp_get_interface (GUID iid, void* pifc) {
> + ib_api_status_t status = IB_SUCCESS;
>
> + if (IsEqualGUID(&iid, &IID_UVP))
> + {
> + __get_uvp_interface((uvp_interface_t *) pifc);
> + }
> + else
> + {
> + status = IB_UNSUPPORTED;
> + }
>
> + return status;
> +}
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:'
> trunk/hw/mthca/user/mlnx_ual_main.c
> branches\winverbs/hw/mthca/user/mlnx_ual_main.c
> --- trunk/hw/mthca/user/mlnx_ual_main.c 2008-06-03
> 21:35:25.213500000 -0700
> +++ branches\winverbs/hw/mthca/user/mlnx_ual_main.c
> 2008-06-03 21:24:28.369750000 -0700
> @@ -135,70 +135,30 @@ uvp_init()
>
> __declspec(dllexport) ib_api_status_t
> uvp_get_interface (
> - IN OUT uvp_interface_t *p_uvp )
> + IN GUID iid,
> + IN void* pifc)
> {
> + ib_api_status_t status = IB_SUCCESS;
> +
> UVP_ENTER(UVP_DBG_SHIM);
>
> - CL_ASSERT(p_uvp);
> - /*
> - * Version of the header file this interface export can handle
> - */
> - p_uvp->version = 0x101;
> - p_uvp->guid = 0x12345678;
> -
> - /*
> - * CA Management
> - */
> - mlnx_get_ca_interface (p_uvp);
> -
> - /*
> - * Protection Domain
> - */
> - mlnx_get_pd_interface (p_uvp);
> -
> - /*
> - * SRQ Management Verbs
> - */
> - mlnx_get_srq_interface (p_uvp);
> -
> - /*
> - * QP Management Verbs
> - */
> - mlnx_get_qp_interface (p_uvp);
> -
> - /*
> - * Completion Queue Management Verbs
> - */
> - mlnx_get_cq_interface (p_uvp);
> -
> - /*
> - * AV Management
> - */
> - mlnx_get_av_interface(p_uvp);
> -
> - /*
> - * Memory Region / Window Management Verbs
> - */
> - mlnx_get_mrw_interface (p_uvp);
> -
> - /*
> - * Multicast Support Verbs
> - */
> - mlnx_get_mcast_interface (p_uvp);
> -
> - /*
> - * OS bypass (send, receive, poll/notify cq)
> - */
> - mlnx_get_osbypass_interface(p_uvp);
> -
> -
> - /*
> - * Local MAD support, for HCA's that do not support
> - * Agents in the HW.
> - * ??? Do we need this for user-mode ???
> - */
> + if (IsEqualGUID(&iid, &IID_UVP))
> + {
> + mlnx_get_ca_interface((uvp_interface_t *) pifc);
> + mlnx_get_pd_interface((uvp_interface_t *) pifc);
> + mlnx_get_srq_interface((uvp_interface_t *) pifc);
> + mlnx_get_qp_interface((uvp_interface_t *) pifc);
> + mlnx_get_cq_interface((uvp_interface_t *) pifc);
> + mlnx_get_av_interface((uvp_interface_t *) pifc);
> + mlnx_get_mrw_interface((uvp_interface_t *) pifc);
> + mlnx_get_mcast_interface((uvp_interface_t *) pifc);
> + mlnx_get_osbypass_interface((uvp_interface_t *) pifc);
> + }
> + else
> + {
> + status = IB_UNSUPPORTED;
> + }
>
> - UVP_EXIT(UVP_DBG_SHIM);
> - return IB_SUCCESS;
> + UVP_EXIT(UVP_DBG_SHIM);
> + return status;
> }
> -
> diff -up -r -X trunk\docs\dontdiff.txt -I '\$Id:'
> trunk/inc/user/iba/ib_uvp.h branches\winverbs/inc/user/iba/ib_uvp.h
> --- trunk/inc/user/iba/ib_uvp.h 2008-06-03
> 21:35:25.229125000 -0700
> +++ branches\winverbs/inc/user/iba/ib_uvp.h 2008-06-03
> 21:24:28.385375000 -0700
> @@ -36,6 +36,7 @@
> #include <complib/cl_types.h>
> #include <iba/ib_types.h>
> #include <iba/ib_ci.h>
> +#include <initguid.h>
>
> /****h* UAL_UVP_Interface/user-mode Verbs
> * NAME
> @@ -3342,121 +3343,61 @@ typedef void
>
> /********/
>
> -/********/
> -
> -/****s* user-mode Verbs/uvp_interface_t
> -* NAME
> -* uvp_interface_t -- Interface holding supported Vendor APIs
> -*
> -* PURPOSE
> -* The following structure is supplied by a Vendor library
> -* providing verbs functionality.
> -*
> -* SOURCE
> -*/
> typedef struct _uvp_interface
> {
> - ib_net64_t guid;
> - /*
> - * Version of the header file this interface export can handle
> - */
> - uint32_t version;
> -
> - /* Version 2.00 APIs */
> -
> - /*
> - * HCA Access Verbs
> - */
> uvp_pre_open_ca_t pre_open_ca;
> uvp_post_open_ca_t post_open_ca;
> -
> uvp_pre_query_ca pre_query_ca;
> uvp_post_query_ca_t post_query_ca;
> -
> uvp_pre_modify_ca pre_modify_ca;
> uvp_post_modify_ca_t post_modify_ca;
> -
> uvp_pre_close_ca_t pre_close_ca;
> uvp_post_close_ca_t post_close_ca;
>
> uvp_pre_ci_call pre_ci_call;
> uvp_post_ci_call post_ci_call;
>
> -
> - /*
> - * Protection Domain
> - */
> uvp_pre_allocate_pd pre_allocate_pd;
> uvp_post_allocate_pd_t post_allocate_pd;
> uvp_pre_deallocate_pd pre_deallocate_pd;
> uvp_post_deallocate_pd_t post_deallocate_pd;
>
> - /*
> - * Address Vector Management Verbs
> - */
> -
> uvp_pre_create_av pre_create_av;
> uvp_post_create_av_t post_create_av;
> -
> uvp_pre_query_av pre_query_av;
> uvp_post_query_av_t post_query_av;
> -
> uvp_pre_modify_av pre_modify_av;
> uvp_post_modify_av_t post_modify_av;
> uvp_pre_destroy_av pre_destroy_av;
> uvp_post_destroy_av_t post_destroy_av;
>
> - /*
> - * SRQ Management Verbs
> - */
> - uvp_pre_create_srq pre_create_srq;
> + uvp_pre_create_srq pre_create_srq;
> uvp_post_create_srq_t post_create_srq;
> -
> - uvp_pre_modify_srq pre_modify_srq;
> + uvp_pre_modify_srq pre_modify_srq;
> uvp_post_modify_srq_t post_modify_srq;
> -
> - uvp_pre_query_srq pre_query_srq;
> + uvp_pre_query_srq pre_query_srq;
> uvp_post_query_srq_t post_query_srq;
> -
> - uvp_pre_destroy_srq pre_destroy_srq;
> + uvp_pre_destroy_srq pre_destroy_srq;
> uvp_post_destroy_srq_t post_destroy_srq;
>
> -
> - /*
> - * QP Management Verbs
> - */
> uvp_pre_create_qp pre_create_qp;
> uvp_post_create_qp_t post_create_qp;
> -
> - /* No support for create_spl_qp, UAL will return error */
> -
> uvp_pre_modify_qp pre_modify_qp;
> uvp_post_modify_qp_t post_modify_qp;
> -
> uvp_pre_query_qp pre_query_qp;
> uvp_post_query_qp_t post_query_qp;
> -
> uvp_pre_destroy_qp pre_destroy_qp;
> uvp_post_destroy_qp_t post_destroy_qp;
>
> - /*
> - * Completion Queue Management Verbs
> - */
> uvp_pre_create_cq pre_create_cq;
> uvp_post_create_cq_t post_create_cq;
> -
> uvp_pre_query_cq pre_query_cq;
> uvp_post_query_cq_t post_query_cq;
> -
> uvp_pre_resize_cq pre_resize_cq;
> uvp_post_resize_cq_t post_resize_cq;
> -
> uvp_pre_destroy_cq pre_destroy_cq;
> uvp_post_destroy_cq_t post_destroy_cq;
>
> - /*
> - * Memory Window Verbs
> - */
> uvp_pre_create_mw pre_create_mw;
> uvp_post_create_mw_t post_create_mw;
> uvp_pre_query_mw pre_query_mw;
> @@ -3464,38 +3405,21 @@ typedef struct _uvp_interface
> uvp_pre_destroy_mw pre_destroy_mw;
> uvp_post_destroy_mw_t post_destroy_mw;
>
> - /* No pre/post functions for bind */
> uvp_bind_mw bind_mw;
> -
> - /*
> - * Work Request Processing Verbs
> - * Should the types be same as Verbs?
> - */
> uvp_post_send post_send;
> uvp_post_recv post_recv;
> uvp_post_srq_recv post_srq_recv;
>
> - /*
> - * Completion Processing and
> - * Completion Notification Request Verbs.
> - * Should the types be same as Verbs?
> - */
> uvp_peek_cq peek_cq;
> uvp_poll_cq poll_cq;
> uvp_rearm_cq rearm_cq;
> uvp_rearm_n_cq rearm_n_cq;
>
> - /*
> - * Multicast Support Verbs
> - */
> uvp_pre_attach_mcast pre_attach_mcast;
> uvp_post_attach_mcast post_attach_mcast;
> uvp_pre_detach_mcast pre_detach_mcast;
> uvp_post_detach_mcast post_detach_mcast;
>
> - /*
> - * ND Support Verbs
> - */
> uvp_nd_modify_qp_t nd_modify_qp;
> uvp_nd_get_qp_state_t nd_get_qp_state;
> uvp_wv_pre_create_qp wv_pre_create_qp;
> @@ -3503,46 +3427,11 @@ typedef struct _uvp_interface
>
> } uvp_interface_t;
>
> -/********/
> +// {A1F1EA66-4D17-4d04-B910-893F658241D0}
> +DEFINE_GUID(IID_UVP,
> +0xa1f1ea66, 0x4d17, 0x4d04, 0xb9, 0x10, 0x89, 0x3f, 0x65,
> 0x82, 0x41,
> +0xd0);
>
> -/****f* user-mode Verbs/uvp_get_interface
> -* NAME
> -* uvp_get_interface -- Get the Vendor's supported Verbs calls
> -*
> -* SYNOPSIS
> -*/
> typedef ib_api_status_t
> -(AL_API *uvp_get_interface_t)(
> - IN OUT uvp_interface_t*
> const p_uvp );
> -/*
> -* DESCRIPTION
> -* This routine is called by UAL to get the functions supported by
> -* a vendor's library. Upon discovering a new CA, UAL will look for
> -* the appropriate vendor library, load the library and query using
> -* this function to get the supported interfaces.
> -*
> -* If the vendor does not support an interface function,
> it should be
> -* set to NULL in the interface structure returned.
> -*
> -* PARAMETERS
> -* p_uvp
> -* [in out] Pointer to the uvp_interface_t
> structure that has the function
> -* vector to support verbs functionality.
> -*
> -* RETURN VALUE
> -* IB_SUCCESS
> -* The registration is successful.
> -* IB_INSUFFICIENT_MEMORY
> -* Insufficient memory to satisfy request
> -*
> -* PORTABILITY
> -* User mode
> -*
> -* SEE ALSO
> -* uvp_interface_t
> -*
> -********/
> -
> -/********/
> +(AL_API *uvp_get_interface_t)(GUID iid, void* pifc);
>
> #endif // __IB_UAL_UVP_H__
>
>
> _______________________________________________
> ofw mailing list
> ofw at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
>
More information about the ofw
mailing list