From 5d0c26c3172cb152492983a0e7b559ea838148fd Mon Sep 17 00:00:00 2001 From: stansmith Date: Tue, 11 Mar 2008 20:52:07 +0000 Subject: [PATCH] [MTHCA-KMDF] stubbed out, builds, move on to populating KMDF stubs. git-svn-id: svn://openib.tc.cornell.edu/gen1@987 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- branches/IBFD/hw/mthca/kmdf/SOURCES | 15 +- branches/IBFD/hw/mthca/kmdf/hca.rc | 12 +- branches/IBFD/hw/mthca/kmdf/hca_debug.h | 10 +- branches/IBFD/hw/mthca/kmdf/hca_driver.c | 11 +- branches/IBFD/hw/mthca/kmdf/hca_driver.h | 150 +++++++++++++++--- branches/IBFD/hw/mthca/kmdf/hca_pnp.c | 16 +- branches/IBFD/hw/mthca/kmdf/hca_pnp.h | 3 +- branches/IBFD/hw/mthca/kmdf/makefile.inc | 16 +- branches/IBFD/hw/mthca/kmdf/mt_device.c | 5 +- branches/IBFD/hw/mthca/kmdf/mthca.mof | 91 ++++++++++- .../hw/mthca/kmdf/{pcidrv.c => mthca_kmdf.c} | 0 branches/IBFD/hw/mthca/kmdf/mthca_mr.c | 2 +- .../mthca/kmdf/{public.h => mthca_public.h} | 0 branches/IBFD/hw/mthca/kmdf/mthca_qp.c | 2 +- branches/IBFD/hw/mthca/kmdf/mthca_srq.c | 4 +- branches/IBFD/hw/mthca/kmdf/trace.h | 4 + branches/IBFD/hw/mthca/kmdf/wmi.c | 62 +++++--- 17 files changed, 308 insertions(+), 95 deletions(-) rename branches/IBFD/hw/mthca/kmdf/{pcidrv.c => mthca_kmdf.c} (100%) rename branches/IBFD/hw/mthca/kmdf/{public.h => mthca_public.h} (100%) diff --git a/branches/IBFD/hw/mthca/kmdf/SOURCES b/branches/IBFD/hw/mthca/kmdf/SOURCES index 34fd5275..5d6266bd 100644 --- a/branches/IBFD/hw/mthca/kmdf/SOURCES +++ b/branches/IBFD/hw/mthca/kmdf/SOURCES @@ -16,7 +16,8 @@ INF_NAME=mthca SOURCES= \ mthca_log.mc \ hca.rc \ - pcidrv.c \ + mthca_kmdf.c \ + wmi.c \ mthca_log.c \ \ ..\hca_utils.c \ @@ -61,10 +62,11 @@ SOURCES= \ mthca_uar.c \ -INCLUDES=\ +INCLUDES=$(INCLUDES);\ ..; \ $(TRUNK)\inc; \ - $(TRUNK)\inc\kernel; + $(TRUNK)\inc\kernel; \ + $(TARGETPATH)\*; C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -D__LITTLE_ENDIAN @@ -75,10 +77,10 @@ TARGETLIBS= \ NTTARGETFILE0=$(OBJ_PATH)\$(O)\$(INF_NAME).bmf -NTTARGETFILES=$(OBJ_PATH)\$(O)\$(INF_NAME).inf - MISCFILES=$(NTTARGETFILES) +NTTARGETFILES=$(OBJ_PATH)\$(O)\$(INF_NAME).inf + #LINKER_FLAGS=/MAP !IFDEF ENABLE_EVENT_TRACING @@ -92,4 +94,5 @@ RUN_WPP= $(SOURCES) -km -ext: .c .h .C .H \ # -func:HCA_PRINT_EV(LEVEL,FLAGS,(MSG,...)) \ MSC_OPTIMIZATION=/Oi -MSC_WARNING_LEVEL= /W4 +# ignore volatile ignored warning @ line 318 in mt_atmoic.h +MSC_WARNING_LEVEL= /W4 /wd4197 /wd4324 /wd4201 diff --git a/branches/IBFD/hw/mthca/kmdf/hca.rc b/branches/IBFD/hw/mthca/kmdf/hca.rc index 3da45399..88cc9c03 100644 --- a/branches/IBFD/hw/mthca/kmdf/hca.rc +++ b/branches/IBFD/hw/mthca/kmdf/hca.rc @@ -33,14 +33,18 @@ #include #define VER_FILETYPE VFT_DRV -#define VER_FILESUBTYPE VFT2_UNKNOWN +#define VER_FILESUBTYPE VFT2_DRV_SYSTEM #ifdef DBG -#define VER_FILEDESCRIPTION_STR "HCA Driver WDF-KMDF (checked)" +#define VER_FILEDESCRIPTION_STR "WDF-KMDF HCA Driver (checked)" #else -#define VER_FILEDESCRIPTION_STR "HCA Driver WDF-KMDF" +#define VER_FILEDESCRIPTION_STR "WDF-KMDF HCA Driver" #endif #define VER_INTERNALNAME_STR "mthca.sys" #define VER_ORIGINALFILENAME_STR "mthca.sys" -#include + +#include "common.ver" #include + +mthcaWMI MOFDATA mthca.bmf + diff --git a/branches/IBFD/hw/mthca/kmdf/hca_debug.h b/branches/IBFD/hw/mthca/kmdf/hca_debug.h index 22822f01..3d631266 100644 --- a/branches/IBFD/hw/mthca/kmdf/hca_debug.h +++ b/branches/IBFD/hw/mthca/kmdf/hca_debug.h @@ -33,6 +33,8 @@ #ifndef _HCA_DEBUG_H_ #define _HCA_DEBUG_H_ +#include +#include extern uint32_t g_mthca_dbg_level; extern uint32_t g_mthca_dbg_flags; @@ -40,12 +42,12 @@ extern uint32_t g_mthca_dbg_flags; extern WCHAR g_wlog_buf[ MAX_LOG_BUF_LEN ]; extern UCHAR g_slog_buf[ MAX_LOG_BUF_LEN ]; -static void _build_str( const char * format, ... ) +static inline void __build_str( const char *format, ... ) { va_list p_arg; va_start(p_arg, format); - vsprintf((char *)g_slog_buf , format , p_arg); - swprintf(g_wlog_buf, L"%S", g_slog_buf); + RtlStringCbVPrintfA((char*)g_slog_buf, MAX_LOG_BUF_LEN, format , p_arg); + RtlStringCbPrintfW(g_wlog_buf, MAX_LOG_BUF_LEN, L"%S", g_slog_buf); va_end(p_arg); } @@ -57,7 +59,7 @@ static void _build_str( const char * format, ... ) case TRACE_LEVEL_WARNING: event_id = EVENT_MTHCA_ANY_WARN; break; \ default: event_id = EVENT_MTHCA_ANY_INFO; break; \ } \ - _build_str _msg_; \ + __build_str _msg_; \ WriteEventLogEntryStr( _obj_, (ULONG)event_id, 0, 0, g_wlog_buf, 0, 0 ); \ } diff --git a/branches/IBFD/hw/mthca/kmdf/hca_driver.c b/branches/IBFD/hw/mthca/kmdf/hca_driver.c index 48ca2864..b05a4661 100644 --- a/branches/IBFD/hw/mthca/kmdf/hca_driver.c +++ b/branches/IBFD/hw/mthca/kmdf/hca_driver.c @@ -63,18 +63,18 @@ #define TRACE_LEVEL_VERBOSE 5 // Detailed traces from intermediate steps */ uint32_t g_mthca_dbg_level = TRACE_LEVEL_INFORMATION; -uint32_t g_mthca_dbg_flags= 0xffff; +uint32_t g_mthca_dbg_flags= 0xffff | DBG_PNP; WCHAR g_wlog_buf[ MAX_LOG_BUF_LEN ]; UCHAR g_slog_buf[ MAX_LOG_BUF_LEN ]; uint32_t g_skip_tavor_reset=0; /* skip reset for Tavor cards */ -uint32_t g_disable_tavor_reset=1; /* disable Tavor reset for the next driver load */ +uint32_t g_disable_tavor_reset=1; /* disable Tavor reset for the next driver load */ uint32_t g_tune_pci=0; /* 0 - skip tuning PCI configuration space of HCAs */ uint32_t g_processor_affinity = 0; uint32_t g_max_DPC_time_us = 10000; uint32_t g_profile_qp_num = 0; uint32_t g_profile_rd_out = 0xffffffff; -UNICODE_STRING g_param_path; +UNICODE_STRING g_param_path; /* @@ -380,9 +380,8 @@ err_open_key: HCA_EXIT( HCA_DBG_DEV ); } -static void -hca_drv_unload( - IN PDRIVER_OBJECT p_driver_obj ) +void +hca_drv_unload( IN PDRIVER_OBJECT p_driver_obj ) { HCA_ENTER( HCA_DBG_DEV ); diff --git a/branches/IBFD/hw/mthca/kmdf/hca_driver.h b/branches/IBFD/hw/mthca/kmdf/hca_driver.h index c528449b..91bbe8b5 100644 --- a/branches/IBFD/hw/mthca/kmdf/hca_driver.h +++ b/branches/IBFD/hw/mthca/kmdf/hca_driver.h @@ -44,6 +44,7 @@ #include "hca_data.h" #include "mt_l2w.h" #include "hca_debug.h" +#include "trace.h" #include "hca_pnp.h" @@ -111,15 +112,26 @@ typedef struct _hca_bar } hca_bar_t; +// +// The WDF driver context extenstion contains global data to the KMDF driver. +// +typedef struct _DRIVER_CONTEXT { + + // WDFLOOKASIDE RecvLookaside; TBD + PDRIVER_OBJECT DrvObj; // top-level/DriverEntry driver object + +} DRIVER_CONTEXT, * PDRIVER_CONTEXT; +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(DRIVER_CONTEXT, GetDriverContext) + typedef struct _hca_dev_ext { /* ------------------------------------------------- * PNP DATA * ------------------------------------------------ */ - cl_pnp_po_ext_t cl_ext; /* COMPLIB PnP object */ - void * pnp_ifc_entry; /* Notification entry for PnP interface events. */ - void * pnp_target_entry; /* Notification entry for PnP target events. */ - PNP_DEVICE_STATE pnpState; /* state for PnP Manager */ + cl_pnp_po_ext_t cl_ext; /* COMPLIB PnP object */ + void *pnp_ifc_entry;/* Notification entry for PnP interface events. */ + void *pnp_target_entry;/* Notification entry for PnP target events. */ + PNP_DEVICE_STATE pnpState; /* state for PnP Manager */ /* ------------------------------------------------- * POWER MANAGER DATA @@ -133,37 +145,37 @@ typedef struct _hca_dev_ext /* ------------------------------------------------- * IB_AL DATA * ------------------------------------------------ */ - ib_ci_ifc_t ci_ifc; /* Interface for the lower edge of the IB_AL device. */ - hca_reg_state_t state; /* State for tracking registration with AL */ - DEVICE_OBJECT * p_al_dev; /* IB_AL FDO */ - FILE_OBJECT * p_al_file_obj; /* IB_AL file object */ - UNICODE_STRING al_sym_name; /* IB_AL symbolic name */ + ib_ci_ifc_t ci_ifc; /* IB_AL device: lower edge Interface */ + hca_reg_state_t state;/* State for tracking registration with AL */ + DEVICE_OBJECT * p_al_dev; /* IB_AL FDO */ + FILE_OBJECT * p_al_file_obj; /* IB_AL file object */ + UNICODE_STRING al_sym_name; /* IB_AL symbolic name */ /* ------------------------------------------------- * LOW LEVEL DRIVER' DATA * ------------------------------------------------ */ - mlnx_hca_t hca; - atomic32_t usecnt; /* the number of working applications*/ - cl_spinlock_t uctx_lock; // spinlock for the below chain - cl_qlist_t uctx_list; // chain of user contexts + mlnx_hca_t hca; + atomic32_t usecnt; /* the number of working applications*/ + cl_spinlock_t uctx_lock; // spinlock for the below chain + cl_qlist_t uctx_list; // chain of user contexts /* ------------------------------------------------- * OS DATA * ------------------------------------------------ */ - hca_bar_t bar[HCA_BAR_TYPE_MAX]; /* HCA memory bars */ - CM_PARTIAL_RESOURCE_DESCRIPTOR interruptInfo; /* HCA interrupt resources */ - PKINTERRUPT int_obj; /* HCA interrupt object */ - spinlock_t isr_lock; /* lock for the ISR */ - ULONG bus_number; /* HCA's bus number */ - BUS_INTERFACE_STANDARD hcaBusIfc; /* PCI bus interface */ + hca_bar_t bar[HCA_BAR_TYPE_MAX]; /* HCA memory bars */ + CM_PARTIAL_RESOURCE_DESCRIPTOR interruptInfo; /* HCA interrupt resource */ + PKINTERRUPT int_obj; /* HCA interrupt object */ + spinlock_t isr_lock; /* lock for the ISR */ + ULONG bus_number; /* HCA's bus number */ + BUS_INTERFACE_STANDARD hcaBusIfc; /* PCI bus interface */ /* ------------------------------------------------- * VARIABLES * ------------------------------------------------ */ - DMA_ADAPTER * p_dma_adapter; /* HCA adapter object */ - ULONG n_map_regs; /* num of allocated adapter map registers */ - PCI_COMMON_CONFIG hcaConfig; /* saved HCA PCI configuration header */ - int hca_hidden; /* flag: when set - no attached DDR memory */ + DMA_ADAPTER *p_dma_adapter; /* HCA adapter object */ + ULONG n_map_regs; /* num of allocated adapter map registers */ + PCI_COMMON_CONFIG hcaConfig; /* saved HCA PCI configuration header */ + int hca_hidden; /* flag: when set - no attached DDR memory */ WDFDEVICE WdfDevice; } hca_dev_ext_t, FDO_DATA, *PFDO_DATA; @@ -261,5 +273,97 @@ WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WORKER_ITEM_CONTEXT, GetWorkItemContext) #define _DRIVER_NAME_ "mthca" +typedef struct _MTHCA_WMI_STD_DATA { + + // TBD... XXX ? + UINT64 HcaGUID; + UINT64 Port0GUID; + UINT64 Port1GUID; + +} MTHCA_WMI_STD_DATA, * PMTHCA_WMI_STD_DATA; + + +// +// KMDF Function prototypes +// + +EVT_WDF_DRIVER_DEVICE_ADD HcaEvtDeviceAdd; + +EVT_WDF_OBJECT_CONTEXT_CLEANUP HcaEvtDriverContextCleanup; +EVT_WDF_DEVICE_CONTEXT_CLEANUP HcaEvtDeviceContextCleanup; + +EVT_WDF_DEVICE_D0_ENTRY HcaEvtDeviceD0Entry; +EVT_WDF_DEVICE_D0_EXIT HcaEvtDeviceD0Exit; +EVT_WDF_DEVICE_PREPARE_HARDWARE HcaEvtDevicePrepareHardware; +EVT_WDF_DEVICE_RELEASE_HARDWARE HcaEvtDeviceReleaseHardware; + +EVT_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP HcaEvtDeviceSelfManagedIoCleanup; +EVT_WDF_DEVICE_SELF_MANAGED_IO_INIT HcaEvtDeviceSelfManagedIoInit; +EVT_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND HcaEvtDeviceSelfManagedIoSuspend; +EVT_WDF_DEVICE_SELF_MANAGED_IO_RESTART HcaEvtDeviceSelfManagedIoRestart; + +EVT_WDF_DEVICE_SURPRISE_REMOVAL HcaEvtDeviceSurpriseRemoval; + +EVT_WDF_DEVICE_ARM_WAKE_FROM_S0 HcaEvtDeviceWakeArmS0; +EVT_WDF_DEVICE_ARM_WAKE_FROM_SX HcaEvtDeviceWakeArmSx; +EVT_WDF_DEVICE_DISARM_WAKE_FROM_S0 HcaEvtDeviceWakeDisarmS0; +EVT_WDF_DEVICE_DISARM_WAKE_FROM_SX HcaEvtDeviceWakeDisarmSx; +EVT_WDF_DEVICE_WAKE_FROM_S0_TRIGGERED HcaEvtDeviceWakeTriggeredS0; +EVT_WDF_DEVICE_WAKE_FROM_SX_TRIGGERED HcaEvtDeviceWakeTriggeredSx; +EVT_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED HcaEvtDeviceD0EntryPostInterruptsEnabled; +EVT_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED HcaEvtDeviceD0ExitPreInterruptsDisabled; + +EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL HcaEvtIoDeviceControl; + +NTSTATUS +HcaReturnResources ( + IN OUT PFDO_DATA FdoData + ); + +NTSTATUS +HcaSetPowerPolicy( + IN PFDO_DATA FdoData + ); + +NTSTATUS +HcaQueuePassiveLevelCallback( + IN PFDO_DATA FdoData, + IN PFN_WDF_WORKITEM CallbackFunction, + IN PVOID Context1, + IN PVOID Context2 + ); + +BOOLEAN +HcaReadRegistryValue( + __in PFDO_DATA FdoData, + __in PWCHAR Name, + __out PULONG Value + ); + +BOOLEAN +HcaWriteRegistryValue( + __in PFDO_DATA FdoData, + __in PWCHAR Name, + __in ULONG Value + ); + + +NTSTATUS +HcaWmiRegistration( + WDFDEVICE hDevice +); + +PCHAR +DbgDevicePowerString( + IN WDF_POWER_DEVICE_STATE Type + ); + + +BOOLEAN +HcaReadFdoRegistryKeyValue( + __in PWDFDEVICE_INIT DeviceInit, + __in PWCHAR Name, + __out PULONG Value + ); #endif /* !defined( _HCA_DRIVER_H_ ) */ diff --git a/branches/IBFD/hw/mthca/kmdf/hca_pnp.c b/branches/IBFD/hw/mthca/kmdf/hca_pnp.c index 9ef989e2..bec49210 100644 --- a/branches/IBFD/hw/mthca/kmdf/hca_pnp.c +++ b/branches/IBFD/hw/mthca/kmdf/hca_pnp.c @@ -209,12 +209,13 @@ hca_add_device( IN PDEVICE_OBJECT pPdo, IN PDEVICE_OBJECT p_dev_obj ) { - NTSTATUS status; - DEVICE_OBJECT *pNextDevObj; - hca_dev_ext_t *p_ext; + NTSTATUS status=STATUS_SUCCESS; + DEVICE_OBJECT *pNextDevObj; + hca_dev_ext_t *p_ext; - HCA_ENTER(HCA_DBG_PNP); + UNREFERENCED_PARAMETER(pDriverObj); + HCA_ENTER(HCA_DBG_PNP); #if 0 /* * Create the device so that we have a device extension to store stuff in. @@ -249,13 +250,16 @@ hca_add_device( } #endif +// XXX fixup pNextDevObj... STAN + pNextDevObj = NULL; + /* Inititalize the complib extension. */ - cl_init_pnp_po_ext( p_dev_obj, pNextDevObj, pPdo, 0, - &vfptrHcaPnp, NULL ); + cl_init_pnp_po_ext( p_dev_obj, pNextDevObj, pPdo, 0, &vfptrHcaPnp, NULL ); p_ext->state = HCA_ADDED; HCA_EXIT(HCA_DBG_PNP); + return status; } diff --git a/branches/IBFD/hw/mthca/kmdf/hca_pnp.h b/branches/IBFD/hw/mthca/kmdf/hca_pnp.h index 77a12347..3c121eae 100644 --- a/branches/IBFD/hw/mthca/kmdf/hca_pnp.h +++ b/branches/IBFD/hw/mthca/kmdf/hca_pnp.h @@ -38,7 +38,8 @@ void hca_init_vfptr( void ); NTSTATUS hca_add_device( IN PDRIVER_OBJECT pDriverObj, - IN PDEVICE_OBJECT pPdo ); + IN PDEVICE_OBJECT pPdo, + IN PDEVICE_OBJECT p_dev_obj ); #endif diff --git a/branches/IBFD/hw/mthca/kmdf/makefile.inc b/branches/IBFD/hw/mthca/kmdf/makefile.inc index 6d9a9d3d..1dddf69d 100644 --- a/branches/IBFD/hw/mthca/kmdf/makefile.inc +++ b/branches/IBFD/hw/mthca/kmdf/makefile.inc @@ -1,20 +1,16 @@ _LNG=$(LANGUAGE) -_INX=.. +_INX=. STAMP=stampinf -f $@ -a $(_BUILDARCH) -k $(KMDF_VERSION_MAJOR).$(KMDF_VERSION_MINOR) -$(OBJ_PATH)\$(O)\$(INF_NAME).inf: $(INF_NAME).inx - copy $(_INX)\$(@B).inx $@ +$(OBJ_PATH)\$(O)\$(INF_NAME).inf: $(_INX)\$(INF_NAME).inx + copy $(_INX)\$(INF_NAME).inx $@ $(STAMP) -mofcomp: $(OBJ_PATH)\$(O)\mthca.bmf $(OBJ_PATH)\$(O)\mthca.bmf: mthca.mof - mofcomp -B:$(OBJ_PATH)\$(O)\mthca.bmf mthca.mof - wmimofck $(OBJ_PATH)\$(O)\mthca.bmf - - - - + mofcomp -B:$@ mthca.mof + wmimofck $@ + wmimofck -m -h$(OBJ_PATH)\$O\mthcaMof.h -w$(OBJ_PATH)\$(O)\htm $@ diff --git a/branches/IBFD/hw/mthca/kmdf/mt_device.c b/branches/IBFD/hw/mthca/kmdf/mt_device.c index 9768f626..fe5e6854 100644 --- a/branches/IBFD/hw/mthca/kmdf/mt_device.c +++ b/branches/IBFD/hw/mthca/kmdf/mt_device.c @@ -130,6 +130,7 @@ static int alloc_name(char *name) char buf[IB_DEVICE_NAME_MAX]; struct ib_device *device; int i; + NTSTATUS status; inuse = (long *) get_zeroed_page(GFP_KERNEL); if (!inuse) @@ -140,7 +141,7 @@ static int alloc_name(char *name) continue; if (i < 0 || i >= PAGE_SIZE * 8) continue; - snprintf(buf, sizeof(buf)-1, name, i); + status = RtlStringCchPrintfA( buf, sizeof(buf)-1, name, i ); buf[sizeof(buf)-1] = '\0'; if (!strncmp(buf, device->name, IB_DEVICE_NAME_MAX)) set_bit(i, inuse); @@ -148,7 +149,7 @@ static int alloc_name(char *name) i = find_first_zero_bit((const unsigned long *)inuse, PAGE_SIZE * 8); free_page(inuse); - snprintf(buf, sizeof(buf)-1, name, i); + status = RtlStringCchPrintfA( buf, sizeof(buf)-1, name, i ); buf[sizeof(buf)-1] = '\0'; if (__ib_device_get_by_name(buf)) diff --git a/branches/IBFD/hw/mthca/kmdf/mthca.mof b/branches/IBFD/hw/mthca/kmdf/mthca.mof index a4ab2acc..22120833 100644 --- a/branches/IBFD/hw/mthca/kmdf/mthca.mof +++ b/branches/IBFD/hw/mthca/kmdf/mthca.mof @@ -2,18 +2,95 @@ [Dynamic, Provider("WMIProv"), WMI, - Description("PCIDRV Device Information"), - guid("{20E35E40-7179-4f89-A28C-12ED5A3CAAA5}"), + Description("mthca driver information"), + guid("{BBA21300-6DD3-11d2-B844-00C04FAD5171}"), locale("MS\\0x409")] -class PciDeviceInformation +class MthcaDeviceInformation { [key, read] - string InstanceName; - [read] boolean Active; + string InstanceName; + + [read] + boolean Active; + + [WmiDataId(1), + read, + Description("Number of errors that occurred on this device")] + uint32 ErrorCount; + + [WmiDataId(2), + read, + write, + Description("DebugPrintLevel property indicates the debug output level")] + uint32 DebugPrintLevel; + + [WmiDataId(3), + read, + write, + Description("DebugPrintFlags property indicates the debug output level")] + uint32 DebugPrintFlags; + + [WmiDataId(4), + read, + Description("The HCA Model Name.")] + string ModelName; + +}; + + +[WMI, Dynamic, Provider("WMIProv"), + guid("{01CDAFF1-C901-45b4-B359-B5542725E29C}"), + locale("MS\\0x409"), + WmiExpense(1), + Description("Notify HCA Arrival")] +class MthcaNotifyDeviceArrival : WMIEvent +{ + [key, read] + string InstanceName; + + [read] + boolean Active; + + [read, + Description("Device Model Name"), + WmiDataId(1)] + string ModelName; +}; + + +[WMI, + Dynamic, + Provider("WmiProv"), + Locale("MS\\0x409"), + Description("WMI method") : amended, + guid("CAAE7D9F-ACF7-4737-A4E9-01C29D3FE194")] +class MthcaControl +{ + [key, read] + string InstanceName; + + [read] + boolean Active; [WmiDataId(1), read, write, - Description("Current Mac Address of the NIC.")] - uint64 MacAddress; + Description("MTHCA Control Property")] + uint32 ControlValue; + + [Implemented, WmiMethodId(1)] + void MthcaControl1([in] uint32 InData, + [out] uint32 OutData); + + [Implemented, WmiMethodId(2)] + void MthcaControl2([in] uint32 InData1, + [in] uint32 InData2, + [out] uint32 OutData); + + [Implemented, WmiMethodId(3)] + void MthcaControl3([in] uint32 InData1, + [in] uint32 InData2, + [out] uint32 OutData1, + [out] uint32 OutData2); + }; diff --git a/branches/IBFD/hw/mthca/kmdf/pcidrv.c b/branches/IBFD/hw/mthca/kmdf/mthca_kmdf.c similarity index 100% rename from branches/IBFD/hw/mthca/kmdf/pcidrv.c rename to branches/IBFD/hw/mthca/kmdf/mthca_kmdf.c diff --git a/branches/IBFD/hw/mthca/kmdf/mthca_mr.c b/branches/IBFD/hw/mthca/kmdf/mthca_mr.c index 34ace963..542f75d1 100644 --- a/branches/IBFD/hw/mthca/kmdf/mthca_mr.c +++ b/branches/IBFD/hw/mthca/kmdf/mthca_mr.c @@ -876,7 +876,7 @@ int mthca_init_mr_table(struct mthca_dev *dev) dev->mr_table.tavor_fmr.mpt_base = ioremap(dev->mr_table.mpt_base, - (1 << i) * sizeof (struct mthca_mpt_entry), + (1ULL << i) * sizeof (struct mthca_mpt_entry), &dev->mr_table.tavor_fmr.mpt_base_size); if (!dev->mr_table.tavor_fmr.mpt_base) { diff --git a/branches/IBFD/hw/mthca/kmdf/public.h b/branches/IBFD/hw/mthca/kmdf/mthca_public.h similarity index 100% rename from branches/IBFD/hw/mthca/kmdf/public.h rename to branches/IBFD/hw/mthca/kmdf/mthca_public.h diff --git a/branches/IBFD/hw/mthca/kmdf/mthca_qp.c b/branches/IBFD/hw/mthca/kmdf/mthca_qp.c index e1f7c3a3..63969258 100644 --- a/branches/IBFD/hw/mthca/kmdf/mthca_qp.c +++ b/branches/IBFD/hw/mthca/kmdf/mthca_qp.c @@ -1174,7 +1174,7 @@ static int mthca_alloc_qp_common(struct mthca_dev *dev, next->ee_nds = cl_hton32(size); for (scatter = (void *) (next + 1); - (void *) scatter < (void *) ((u8*)next + (1 << qp->rq.wqe_shift)); + (void *) scatter < (void *) ((u8*)next + (1ULL << qp->rq.wqe_shift)); ++scatter) scatter->lkey = cl_hton32(MTHCA_INVAL_LKEY); } diff --git a/branches/IBFD/hw/mthca/kmdf/mthca_srq.c b/branches/IBFD/hw/mthca/kmdf/mthca_srq.c index 586f14f1..3c6f6dd0 100644 --- a/branches/IBFD/hw/mthca/kmdf/mthca_srq.c +++ b/branches/IBFD/hw/mthca/kmdf/mthca_srq.c @@ -185,7 +185,7 @@ static int mthca_alloc_srq_buf(struct mthca_dev *dev, struct mthca_pd *pd, *wqe_to_link(wqe) = i < srq->max - 1 ? i + 1 : -1; for (scatter = (struct mthca_data_seg *)(wqe + sizeof (struct mthca_next_seg)); - (void *) scatter < (void*)(wqe + (1 << srq->wqe_shift)); + (void *) scatter < (void*)(wqe + (1ULL << srq->wqe_shift)); ++scatter) scatter->lkey = cl_hton32(MTHCA_INVAL_LKEY); } @@ -712,7 +712,7 @@ int mthca_max_srq_sge(struct mthca_dev *dev) * the FW max_sg value returned. */ return min( (uint32_t)dev->limits.max_sg, - ((1 << (fls(dev->limits.max_desc_sz) - 1)) - + ((1ULL << (fls(dev->limits.max_desc_sz) - 1)) - sizeof (struct mthca_next_seg)) / sizeof (struct mthca_data_seg)); } diff --git a/branches/IBFD/hw/mthca/kmdf/trace.h b/branches/IBFD/hw/mthca/kmdf/trace.h index 27d8ed8b..8f57b683 100644 --- a/branches/IBFD/hw/mthca/kmdf/trace.h +++ b/branches/IBFD/hw/mthca/kmdf/trace.h @@ -23,6 +23,9 @@ Environment: --*/ +#if !defined(__TRACE_H__) +#define __TRACE_H__ 1 + #include // For TRACE_LEVEL definitions #if !defined(EVENT_TRACING) @@ -137,4 +140,5 @@ __inline xstr_t log_xstr(void * p, short l) { xstr_t xs = {(char*)p,l}; return x #endif +#endif /* !defined(__TRACE_H__) */ diff --git a/branches/IBFD/hw/mthca/kmdf/wmi.c b/branches/IBFD/hw/mthca/kmdf/wmi.c index 61a8db69..a235476c 100644 --- a/branches/IBFD/hw/mthca/kmdf/wmi.c +++ b/branches/IBFD/hw/mthca/kmdf/wmi.c @@ -22,14 +22,24 @@ Environment: --*/ -#include "precomp.h" +#include "hca_driver.h" + +#include +#include + +#include "mthca_public.h" +#include "mthcaMof.h" #if defined(EVENT_TRACING) #include "wmi.tmh" #endif +#define MOFRESOURCENAME L"mthcaWMI" + +#define MthcaDeviceInformation_SIZE FIELD_OFFSET(MthcaDeviceInformation, VariableData) + +WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(MthcaDeviceInformation, mthcaWmiGetData) -#define MOFRESOURCENAME L"PciDrvWMI" NTSTATUS EvtWmiDeviceInfoQueryInstance( @@ -46,16 +56,17 @@ EvtWmiDeviceInfoSetInstance( __in_bcount(InBufferSize) PVOID InBuffer ); +NTSTATUS +HcaWmiRegistration( WDFDEVICE Device ); + + #ifdef ALLOC_PRAGMA -#pragma alloc_text(PAGE, PciDrvWmiRegistration) #pragma alloc_text(PAGE, EvtWmiDeviceInfoQueryInstance) #pragma alloc_text(PAGE, EvtWmiDeviceInfoSetInstance) +#pragma alloc_text(PAGE, HcaWmiRegistration) #endif -NTSTATUS -PciDrvWmiRegistration( - WDFDEVICE Device - ) + /*++ Routine Description @@ -63,6 +74,9 @@ Routine Description instance of the device --*/ + +NTSTATUS +HcaWmiRegistration( WDFDEVICE Device ) { WDF_WMI_PROVIDER_CONFIG providerConfig; WDF_WMI_INSTANCE_CONFIG instanceConfig; @@ -78,8 +92,8 @@ Routine Description return status; } - WDF_WMI_PROVIDER_CONFIG_INIT(&providerConfig, &PCIDRV_WMI_STD_DATA_GUID); - providerConfig.MinInstanceBufferSize = sizeof(PCIDRV_WMI_STD_DATA); + WDF_WMI_PROVIDER_CONFIG_INIT(&providerConfig, &MTHCA_WMI_STD_DATA_GUID); + providerConfig.MinInstanceBufferSize = sizeof(MTHCA_WMI_STD_DATA); WDF_WMI_INSTANCE_CONFIG_INIT_PROVIDER_CONFIG(&instanceConfig, &providerConfig); instanceConfig.Register = TRUE; @@ -108,8 +122,7 @@ EvtWmiDeviceInfoQueryInstance( __in WDFWMIINSTANCE WmiInstance, __in ULONG OutBufferSize, __out_bcount_part(OutBufferSize, *BufferUsed) PVOID OutBuffer, - __out PULONG BufferUsed - ) + __out PULONG BufferUsed ) { PFDO_DATA fdoData; @@ -117,14 +130,17 @@ EvtWmiDeviceInfoQueryInstance( fdoData = FdoGetData(WdfWmiInstanceGetDevice(WmiInstance)); - // - // No need to check OutBufferSize since MinInstanceBufferSize was set when we - // created the instance - // - RtlZeroMemory(OutBuffer, OutBufferSize); - RtlCopyMemory(OutBuffer, fdoData->CurrentAddress, sizeof(fdoData->CurrentAddress)); + // Since the minimum buffer size required for querying the instance data wa + // already specified during the WMI instance setup, the Framework will make + // sure that the incoming buffer size is large enough for this instance + // query. There is no need to check the size of the given buffer again. + // The instance information can be copied directly to the given buffer. - *BufferUsed = sizeof(fdoData->CurrentAddress); + RtlZeroMemory(OutBuffer, OutBufferSize); + RtlCopyMemory(OutBuffer, + mthcaWmiGetData(WmiInstance), + MthcaDeviceInformation_SIZE); + *BufferUsed = MthcaDeviceInformation_SIZE; return STATUS_SUCCESS; } @@ -145,12 +161,14 @@ EvtWmiDeviceInfoSetInstance( fdoData = FdoGetData(WdfWmiInstanceGetDevice(WmiInstance)); // - // No need to check InBufferSize since MinInstanceBufferSize was set when we - // created the instance + // We will update only writable elements. // - ASSERT(InBufferSize >= sizeof(fdoData->CurrentAddress)); + g_mthca_dbg_level = mthcaWmiGetData(WmiInstance)->DebugPrintLevel = + ((PMthcaDeviceInformation)InBuffer)->DebugPrintLevel; + + g_mthca_dbg_flags = mthcaWmiGetData(WmiInstance)->DebugPrintFlags = + ((PMthcaDeviceInformation)InBuffer)->DebugPrintLevel; - RtlCopyMemory(fdoData->CurrentAddress, InBuffer, sizeof(fdoData->CurrentAddress)); return STATUS_SUCCESS; } -- 2.41.0