[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