p_io_stack->Parameters.QueryInterface.Version = 1;\r
p_io_stack->Parameters.QueryInterface.Size = 0;\r
p_io_stack->Parameters.QueryInterface.Interface = NULL;\r
- p_io_stack->Parameters.QueryInterface.InterfaceSpecificData = \r
- &p_ext->hca.hh_hndl;\r
+ { \r
+ void *p = &p_ext->hca.s;\r
+ memset( p, 0, sizeof(p_ext->hca.s) );\r
+ p_io_stack->Parameters.QueryInterface.InterfaceSpecificData = p;\r
+ }\r
p_io_stack->Parameters.QueryInterface.InterfaceType = \r
&GUID_MD_INTERFACE;\r
p_irp->IoStatus.Status = STATUS_NOT_SUPPORTED;\r
("Query interface for HCA handle returned %08x.\n", status) );\r
return status;\r
}\r
-\r
+ p_ext->hca.hh_hndl = p_ext->hca.s.hh_hndl;\r
+ \r
HCA_EXIT( HCA_DBG_PNP );\r
return status;\r
}\r
{\r
NTSTATUS status;\r
hca_dev_ext_t *p_ext;\r
- net64_t ca_guid = 0;\r
\r
HCA_ENTER( HCA_DBG_PNP );\r
\r
return status;\r
}\r
\r
- /* store HCA PDO */\r
- p_ext->hca.p_dev_obj = p_ext->cl_ext.p_pdo;\r
- status = fw_flash_get_ca_guid(p_ext->cl_ext.p_pdo, &ca_guid);\r
- if ( !NT_SUCCESS( status ) )\r
{\r
- HCA_TRACE( HCA_DBG_ERROR, \r
- ("fw_flash_get_ca_guid failed status =%#x.\n", status) );\r
- return status;\r
+ VAPI_hca_cap_t hca_cap;\r
+ int rc;\r
+\r
+ if (HH_OK != THH_hob_open_hca(p_ext->hca.hh_hndl, NULL, NULL)) {\r
+ status = IB_ERROR;\r
+ return status;\r
+ }\r
+ \r
+ rc = THH_hob_query(p_ext->hca.hh_hndl, &hca_cap);\r
+ if (rc != HH_OK) {\r
+ HCA_TRACE( HCA_DBG_ERROR, ("Error on getting guid (%#x).\n", rc) );\r
+ status = IB_ERROR;\r
+ return status;\r
+ }\r
+ p_ext->hca.guid = *(uint64_t *)hca_cap.node_guid;\r
+ p_ext->hca.p_dev_obj = p_ext->cl_ext.p_pdo;\r
+\r
+ THH_hob_close_hca(p_ext->hca.hh_hndl);\r
}\r
- p_ext->hca.guid = ca_guid;\r
+\r
mlnx_hca_insert( &p_ext->hca );\r
\r
/*\r
return status;\r
}\r
\r
+static NTSTATUS\r
+__map_crspace(\r
+ IN mlnx_hob_t * p_hob,\r
+ IN PVOID p_buf,\r
+ IN ULONG buf_size\r
+ )\r
+{\r
+ NTSTATUS status;\r
+ PMDL mdl_p;\r
+ mlnx_hca_t *p_hca = mlnx_hca_from_hh_hndl(p_hob->hh_hndl);\r
+ PVOID ua, ka; \r
+ ULONG sz; \r
+ struct _map_crspace *res_p = (struct _map_crspace *)p_buf;\r
+\r
+ HCA_ENTER( HCA_DBG_PNP );\r
+\r
+ // sanity checks\r
+ if ( buf_size < sizeof *res_p ) {\r
+ status = STATUS_INVALID_PARAMETER;\r
+ goto out;\r
+ }\r
+ if (p_hca == NULL) {\r
+ status = STATUS_UNSUCCESSFUL;\r
+ goto out;\r
+ }\r
+ ka = p_hca->s.kernel_crspace_addr;\r
+ sz = p_hca->s.kernel_crspace_size;\r
+ if ( sz == 0 || ka == NULL) {\r
+ HCA_TRACE( HCA_DBG_ERROR, ("No kernel mapping of CR space.\n") );\r
+ status = STATUS_UNSUCCESSFUL;\r
+ goto out;\r
+ }\r
+\r
+ // prepare for mapping to user space \r
+ mdl_p = IoAllocateMdl( ka, sz, FALSE,FALSE,NULL);\r
+ if (mdl_p == NULL) {\r
+ HCA_TRACE( HCA_DBG_ERROR, ("IoAllocateMdl failed.\n") );\r
+ status = STATUS_INSUFFICIENT_RESOURCES;\r
+ goto out;\r
+ }\r
+\r
+ // fill MDL\r
+ MmBuildMdlForNonPagedPool(mdl_p); \r
+ \r
+ // map the buffer into user space \r
+ ua = MmMapLockedPagesSpecifyCache( mdl_p, UserMode, MmNonCached, \r
+ NULL, FALSE, NormalPagePriority );\r
+ if (ua == NULL) {\r
+ HCA_TRACE( HCA_DBG_ERROR, ("MmMapLockedPagesSpecifyCache failed.\n") );\r
+ IoFreeMdl( mdl_p );\r
+ status = STATUS_UNSUCCESSFUL;\r
+ goto out;\r
+ }\r
+ \r
+ // fill the structure\r
+ res_p->va = ua;\r
+ res_p->size = sz;\r
+ res_p->ctx = mdl_p;\r
+ status = STATUS_SUCCESS;\r
+\r
+out: \r
+ HCA_EXIT( HCA_DBG_PNP );\r
+ return status;\r
+}\r
+\r
+static NTSTATUS\r
+__unmap_crspace(\r
+ IN PVOID p_buf,\r
+ IN ULONG buf_size\r
+ )\r
+{\r
+ NTSTATUS status;\r
+ PMDL mdl_p;\r
+ PVOID ua;\r
+ struct _unmap_crspace *parm = (struct _unmap_crspace *)p_buf;\r
+\r
+ HCA_ENTER( HCA_DBG_PNP );\r
+\r
+ // sanity checks\r
+ if ( buf_size < sizeof *parm ) {\r
+ status = STATUS_INVALID_PARAMETER;\r
+ goto out;\r
+ }\r
+ mdl_p = parm->ctx;\r
+ ua = parm->va;\r
+ if ( mdl_p == NULL || ua == NULL) {\r
+ status = STATUS_INVALID_PARAMETER;\r
+ goto out;\r
+ }\r
+\r
+ // do the work\r
+ MmUnmapLockedPages(ua, mdl_p);\r
+ IoFreeMdl( mdl_p );\r
+ status = STATUS_SUCCESS;\r
+\r
+out: \r
+ HCA_EXIT( HCA_DBG_PNP );\r
+ return status;\r
+}\r
+\r
+\r
ib_api_status_t\r
fw_access_ctrl(\r
IN const void* __ptr64 p_context,\r
\r
switch ( p_ci->command )\r
{\r
+ case FW_MAP_CRSPACE:\r
+ status = __map_crspace(p_hob, p_data, length);\r
+ break;\r
+ \r
+ case FW_UNMAP_CRSPACE:\r
+ status = __unmap_crspace(p_data, length);\r
+ break;\r
+ \r
case FW_READ: // read data from flash\r
if ( if_ready )\r
{\r
#define CPUMODE_MSK (0xc0000000UL)\r
#define CPUMODE_SHIFT (30)\r
\r
+/* buffer structure for FW_MAP_CRBASE */\r
+struct _map_crspace {\r
+ PVOID va; /* address of CRSPACE, mapped to user space */\r
+ PVOID ctx; /* opaque operation context; to be used in FW_UNMAP_CRBASE */\r
+ ULONG size; /* size of CRSPACE, mapped to user space */\r
+};\r
+\r
+struct _unmap_crspace {\r
+ PVOID va; /* address of CRSPACE, mapped to user space */\r
+ PVOID ctx; /* operation context, received in FW_MAP_CRBASE */\r
+};\r
+\r
/* Definitions intended to become shared with UM. Later... */\r
#define FW_READ 0x00\r
#define FW_WRITE 0x01\r
#define FW_READ_CMD 0x08\r
#define FW_WRITE_CMD 0x09\r
+#define FW_MAP_CRSPACE 0x0A\r
+#define FW_UNMAP_CRSPACE 0x0B\r
#define FW_OPEN_IF 0xe7\r
#define FW_CLOSE_IF 0x7e\r
\r
{\r
if( l_pIrpStack->Parameters.QueryInterface.InterfaceSpecificData )\r
{\r
- // Our interface. Return the HH HCA handle in \r
- // the "InterfaceSpecificData" member.\r
- *(HH_hca_hndl_t*)l_pIrpStack->Parameters.QueryInterface.\r
- InterfaceSpecificData = l_pMdDevContext->m_hHhHca;\r
- pi_pIrp->IoStatus.Status = STATUS_SUCCESS;\r
+ struct _hca_if {\r
+ HH_hca_hndl_t hh_hndl;\r
+ void * kernel_crspace_addr;\r
+ ULONG kernel_crspace_size;\r
+ } *if_p = l_pIrpStack->Parameters.QueryInterface.InterfaceSpecificData;\r
+ \r
+ // Our interface. Return the HH HCA handle and other data \r
+ if_p->hh_hndl = l_pMdDevContext->m_hHhHca;\r
+ if_p->kernel_crspace_addr = l_pMdDevContext->m_Cr.m_pKernelAddr;\r
+ if_p->kernel_crspace_size = l_pMdDevContext->m_Cr.m_ulKernelSize;\r
+ \r
+ pi_pIrp->IoStatus.Status = STATUS_SUCCESS;\r
l_Status = STATUS_SUCCESS;\r
break;\r
}\r