/* * Copyright (c) 2007-2008 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2009-2012 Mellanox Technologies. All rights reserved. * * Copyright (c) 2009-2012 Oak Ridge National Laboratory. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */ #ifndef OMPI_COMMON_OFACM_BASE_H #define OMPI_COMMON_OFACM_BASE_H #include "ompi_config.h" #include #include #include "connect.h" BEGIN_C_DECLS #define HAVE_XRC (1 == OMPI_HAVE_CONNECTX_XRC) extern int ompi_common_ofacm_base_output; extern int ompi_common_ofacm_base_verbose; /* disabled by default */ /* File for sl data produced only for a 3D-Torus Cluster */ extern char* ompi_common_ofacm_three_dim_torus; static inline int ompi_common_ofacm_base_err(const char* fmt, ...) { va_list list; int ret; va_start(list, fmt); ret = vfprintf(stderr, fmt, list); va_end(list); return ret; } #define OFACM_ERROR(args) \ do { \ ompi_common_ofacm_base_err("[%s]%s[%s:%d:%s] ", \ ompi_process_info.nodename, \ OMPI_NAME_PRINT(OMPI_PROC_MY_NAME), \ __FILE__, __LINE__, __func__); \ ompi_common_ofacm_base_err args; \ ompi_common_ofacm_base_err("\n"); \ } while(0); #if OPAL_ENABLE_DEBUG #define OFACM_VERBOSE(args) \ do { \ if(ompi_common_ofacm_base_verbose > 0) { \ ompi_common_ofacm_base_err("[%s]%s[%s:%d:%s] ", \ ompi_process_info.nodename, \ OMPI_NAME_PRINT(OMPI_PROC_MY_NAME), \ __FILE__, __LINE__, __func__); \ ompi_common_ofacm_base_err args; \ ompi_common_ofacm_base_err("\n"); \ } \ } while(0); #else #define OFACM_VERBOSE(args) #endif /* * PUBLIC functions * **************** */ /* * Open function */ OMPI_DECLSPEC int ompi_common_ofacm_base_register(mca_base_component_t *base); /* * Query CPCs to see if they want to run on a specific port. * Input: * port - port information * Output: * cpcs - list of availible cpcs * num_cpcs - number of cpcs */ OMPI_DECLSPEC int ompi_common_ofacm_base_select_for_local_port (ompi_common_ofacm_base_dev_desc_t *dev, ompi_common_ofacm_base_module_t ***cpcs, int *num_cpcs); /* * Select function * Input: * local_cpcs - local cpc modules * num_local_cpcs - number of local cpc modules * remote_cpc_data - cpc information from remote peer * remote_cpc_data_count - num of remote information from remote peer * Output: * ret_local_cpc - matched cpc module * ret_remote_cpc_data - matched remote cpc data */ OMPI_DECLSPEC int ompi_common_ofacm_base_find_match (ompi_common_ofacm_base_module_t **local_cpcs, int num_local_cpcs, ompi_common_ofacm_base_module_data_t *remote_cpc_data, int remote_cpc_data_count, ompi_common_ofacm_base_module_t **ret_local_cpc, ompi_common_ofacm_base_module_data_t **ret_remote_cpc_data); /* * Find a CPC's index so that we can send it in the modex */ OMPI_DECLSPEC int ompi_common_ofacm_base_get_cpc_index (ompi_common_ofacm_base_component_t *cpc); /* * Start a new connection to an endpoint */ OMPI_DECLSPEC int ompi_common_ofacm_base_start_connect (struct ompi_common_ofacm_base_local_connection_context_t *context); /* * Component-wide CPC finalize */ OMPI_DECLSPEC void ompi_common_ofacm_base_finalize(void); /* * Component-wide CPC init */ OMPI_DECLSPEC int ompi_common_ofacm_base_init(void); /* * Lookup a CPC by its index (received from the modex) */ OMPI_DECLSPEC ompi_common_ofacm_base_component_t * ompi_common_ofacm_base_get_cpc_byindex(uint8_t index); /* * PRIVATE functions (called only by cpcs) * *************************************** */ /* * Proc initialization function */ void ompi_common_ofacm_base_proc_setup (ompi_common_ofacm_base_proc_t *proc, ompi_common_ofacm_base_local_connection_context_t *context, ompi_proc_t *proc_ompi); /* * Context initialization function */ int ompi_common_ofacm_base_context_init (ompi_common_ofacm_base_local_connection_context_t *context, ompi_common_ofacm_base_module_t *cpc, ompi_common_ofacm_base_context_connect_cb_fn_t connect_cb, ompi_common_ofacm_base_context_error_cb_fn_t error_cb, ompi_common_ofacm_base_context_prepare_recv_cb_fn_t prepare_recv_cb, ompi_common_ofacm_base_proc_t *proc, ompi_common_ofacm_base_qp_config_t *qp_config, struct ibv_pd *pd, uint64_t subnet_id, int cpc_type, uint16_t lid, uint16_t rem_lid, int32_t user_context_index, void *user_context); /* * Remote context initialization. * Returns operation status */ int ompi_common_ofacm_base_remote_context_init (ompi_common_ofacm_base_remote_connection_context_t *context, int num_qps, int num_srqs); /* Find OFACM proc on specific component */ ompi_common_ofacm_base_proc_t* ompi_common_ofacm_base_find_proc (ompi_common_ofacm_base_component_t *component, ompi_proc_t *proc); #if 0 /* * Allocate a CTS frag */ int ompi_common_ofacm_base_alloc_cts( struct mca_btl_base_endpoint_t *endpoint); /* * Free a CTS frag */ int ompi_common_ofacm_base_free_cts( struct mca_btl_base_endpoint_t *endpoint); #endif END_C_DECLS #endif