[ofw] [PATCH] mlx4: add winverbs support

Sean Hefty sean.hefty at intel.com
Mon Aug 4 12:03:25 PDT 2008


Export the mlx4 channel interface via PnP query interface calls.  This
allows the driver to export its channel interface to multiple drivers,
such as WinVerbs. 

The patch also converts UNIX line-endings to Windows format in two places.

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
This allows mlx4 to support winverbs, similar to mthca support.  With this,
I was able to run the libibverbs examples and perftest programs on
mlx4 on x64 Server 2003.

I have not been able to run ibv_asyncwatch successfully on mlx4.  I started
a separate thread for this.

Index: hw/mlx4/kernel/hca/drv.c
===================================================================
--- hw/mlx4/kernel/hca/drv.c	(revision 1448)
+++ hw/mlx4/kernel/hca/drv.c	(working copy)
@@ -33,6 +33,7 @@
 #include "precomp.h"
 #include <initguid.h>
 #include <wdmguid.h>
+#include <rdma\verbs.h>
 
 #if defined(EVENT_TRACING)
 #ifdef offsetof
@@ -44,6 +45,9 @@
 #define DRV_VERSION	"1.0"
 #define DRV_RELDATE	"02/01/2008"
 
+#define MLX_VERBS_MIN_VERSION		2
+#define MLX_VERBS_MAX_VERSION		2
+
 GLOBALS g;
 
 /*
@@ -657,7 +661,7 @@
 
 	/* get node GUID */
 	err = __get_dev_info( p_fdo, &p_fdo->hca.guid, &p_fdo->hca.hw_ver );
-	if (err) {
+	if (err) {
 
 		HCA_PRINT(TRACE_LEVEL_ERROR   ,HCA_DBG_LOW   ,
 			("can't get guid - ib_query_device() failed (%08X)\n", err ));
@@ -1039,6 +1043,12 @@
 		OUT			cl_irp_action_t* const		p_action );
 
 static NTSTATUS
+hca_query_interface(
+	IN				DEVICE_OBJECT* const		p_dev_obj,
+	IN				IRP* const					p_irp, 
+		OUT			cl_irp_action_t* const		p_action );
+
+static NTSTATUS
 hca_query_pnp_state(
 	IN				DEVICE_OBJECT* const		p_dev_obj,
 	IN				IRP* const					p_irp, 
@@ -1110,6 +1120,7 @@
 #pragma alloc_text (PAGE, hca_cancel_remove)
 #pragma alloc_text (PAGE, hca_surprise_remove)
 #pragma alloc_text (PAGE, hca_query_capabilities)
+#pragma alloc_text (PAGE, hca_query_interface)
 #pragma alloc_text (PAGE, hca_query_pnp_state)
 #pragma alloc_text (PAGE, hca_query_bus_relations)
 #pragma alloc_text (PAGE, hca_query_removal_relations)
@@ -1767,10 +1778,12 @@
 	p_fdo->bus_ib_ifc_taken = TRUE;
 	p_fdo->bus_ib_ifc.p_ibdev->x.p_fdo = p_fdo;
 	
+	InitializeListHead(&p_fdo->hca.event_list);
+	KeInitializeSpinLock(&p_fdo->hca.event_list_lock);
 
 	/* get node GUID */
 	err = __get_dev_info( p_fdo, &p_fdo->hca.guid, &p_fdo->hca.hw_ver );
-	if (err) {
+	if (err) {
 
 		HCA_PRINT(TRACE_LEVEL_ERROR   ,HCA_DBG_LOW   ,
 			("can't get guid - ib_query_device() failed (%08X)\n", err ));
@@ -2043,7 +2056,102 @@
 }
 
 
+static VOID
+__hca_noop( VOID *context )
+{
+	UNREFERENCED_PARAMETER(context);
+}
+
+
 static NTSTATUS
+__query_ci_ifc(
+	IN					DEVICE_OBJECT* const		p_dev_obj,
+	IN					IO_STACK_LOCATION* const	p_io_stack )
+{
+	RDMA_INTERFACE_VERBS	*p_ifc;
+	PFDO_DEVICE_DATA		p_fdo;
+	ci_interface_t			*p_hca_ifc;
+	NTSTATUS				status;
+	UINT8					version;
+
+	HCA_ENTER( HCA_DBG_PNP );
+
+	version = VerbsVersionMajor(p_io_stack->Parameters.QueryInterface.Version);
+	if( version < MLX_VERBS_MIN_VERSION || version > MLX_VERBS_MAX_VERSION )
+	{
+		status = STATUS_NOT_SUPPORTED;
+		goto exit;
+	}
+
+	if( p_io_stack->Parameters.QueryInterface.Size < sizeof(RDMA_INTERFACE_VERBS) )
+	{
+		status = STATUS_BUFFER_TOO_SMALL;
+		goto exit;
+	}
+
+	p_fdo = (PFDO_DEVICE_DATA)p_dev_obj->DeviceExtension;
+	p_hca_ifc = __alloc_hca_ifc( p_fdo );
+	if( !p_hca_ifc )
+	{
+		status = STATUS_NO_MEMORY;
+		goto exit;
+	}
+
+	p_ifc = (RDMA_INTERFACE_VERBS *) p_io_stack->Parameters.QueryInterface.Interface;
+
+	p_ifc->InterfaceHeader.Size = sizeof(RDMA_INTERFACE_VERBS);
+	p_ifc->InterfaceHeader.Version = VerbsVersion(version, 0);
+	p_ifc->InterfaceHeader.Context = p_dev_obj;
+	p_ifc->InterfaceHeader.InterfaceReference = __hca_noop;
+	p_ifc->InterfaceHeader.InterfaceDereference = __hca_noop;
+	p_ifc->Verbs = *p_hca_ifc;
+	p_ifc->Verbs.p_hca_dev = &p_fdo->hca;
+
+	ExFreePool( p_hca_ifc );
+	status = STATUS_SUCCESS;
+
+exit:
+	HCA_EXIT( HCA_DBG_PNP );
+	return status;
+}
+
+
+static NTSTATUS
+hca_query_interface(
+	IN				DEVICE_OBJECT* const		p_dev_obj,
+	IN				IRP* const					p_irp, 
+		OUT			cl_irp_action_t* const		p_action )
+{
+	NTSTATUS			status;
+	IO_STACK_LOCATION	*p_io_stack;
+
+	HCA_ENTER( HCA_DBG_PNP );
+
+#pragma warning( push, 3 )
+	PAGED_CODE();
+#pragma warning( pop )
+
+	p_io_stack = IoGetCurrentIrpStackLocation( p_irp );
+	
+	/* Compare requested GUID with our supported interface GUIDs. */
+	if( IsEqualGUID( p_io_stack->Parameters.QueryInterface.InterfaceType,
+		&GUID_RDMA_INTERFACE_VERBS ) )
+	{
+		status = __query_ci_ifc( p_dev_obj, p_io_stack );
+		*p_action = IrpComplete;
+	}
+	else
+	{
+		status = p_irp->IoStatus.Status;
+		*p_action = IrpSkip;
+	}
+
+	HCA_EXIT( HCA_DBG_PNP );
+	return status;
+}
+
+
+static NTSTATUS
 hca_query_pnp_state(
 	IN				DEVICE_OBJECT* const		p_dev_obj,
 	IN				IRP* const					p_irp, 
@@ -2523,7 +2631,7 @@
 	vfptrHcaPnp.pfn_query_resources = cl_irp_ignore;
 	vfptrHcaPnp.pfn_query_res_req = cl_irp_ignore;
 	vfptrHcaPnp.pfn_query_bus_info = cl_irp_ignore;
-	vfptrHcaPnp.pfn_query_interface = cl_irp_ignore;
+	vfptrHcaPnp.pfn_query_interface = hca_query_interface;
 	vfptrHcaPnp.pfn_read_config = cl_irp_ignore;
 	vfptrHcaPnp.pfn_write_config = cl_irp_ignore;
 	vfptrHcaPnp.pfn_eject = cl_irp_ignore;

-------------- next part --------------
A non-text attachment was scrubbed...
Name: mlx4-wv.patch
Type: application/octet-stream
Size: 4708 bytes
Desc: not available
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20080804/e696ee1b/attachment.obj>


More information about the ofw mailing list