123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- /*
- This software is available to you under a choice of one of two
- licenses. You may choose to be licensed under the terms of the GNU
- General Public License (GPL) Version 2, available at
- <http://www.fsf.org/copyleft/gpl.html>, or the OpenIB.org BSD
- license, available in the LICENSE.TXT file accompanying this
- software. These details are also available at
- <http://openib.org/license.html>.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
- Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved.
- */
- #include "cmdif.h"
- #include "cmdif_priv.h"
- #include "mt25218.h"
-
- /*
- * cmd_sys_dis
- */
- static int cmd_sys_dis(void)
- {
- return 0;
- }
-
- /*
- * cmd_write_mgm
- */
- static int cmd_write_mgm(void *mg, __u16 index)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
- cmd_desc.opcode = MEMFREE_CMD_WRITE_MGM;
- cmd_desc.in_trans = TRANS_MAILBOX;
- cmd_desc.in_param_size = MT_STRUCT_SIZE(arbelprm_mgm_entry_st);
- cmd_desc.in_param = (__u32 *) mg;
- cmd_desc.input_modifier = index;
-
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_mod_stat_cfg
- */
- static int cmd_mod_stat_cfg(void)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
- cmd_desc.opcode = MEMFREE_CMD_MOD_STAT_CFG;
- cmd_desc.in_trans = TRANS_MAILBOX;
- cmd_desc.in_param_size = MT_STRUCT_SIZE(arbelprm_mod_stat_cfg_st);
- cmd_desc.in_param = get_inprm_buf();
- memset(cmd_desc.in_param, 0, cmd_desc.in_param_size);
-
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_query_fw
- */
- static int cmd_query_fw(struct query_fw_st *qfw)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_QUERY_FW;
- cmd_desc.out_trans = TRANS_MAILBOX;
- cmd_desc.out_param = get_outprm_buf();
- cmd_desc.out_param_size = MT_STRUCT_SIZE(arbelprm_query_fw_st);
-
- rc = cmd_invoke(&cmd_desc);
- if (!rc) {
- qfw->fw_rev_major =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, fw_rev_major);
- qfw->fw_rev_minor =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, fw_rev_minor);
- qfw->fw_rev_subminor =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, fw_rev_subminor);
-
- qfw->error_buf_start_h =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, error_buf_start_h);
- qfw->error_buf_start_l =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, error_buf_start_l);
- qfw->error_buf_size =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, error_buf_size);
-
- qfw->fw_pages =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st, fw_pages);
- qfw->eq_ci_table.addr_h =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st,
- eq_set_ci_base_addr_h);
- qfw->eq_ci_table.addr_l =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st,
- eq_set_ci_base_addr_l);
- qfw->clear_int_addr.addr_h =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st,
- clr_int_base_addr_h);
- qfw->clear_int_addr.addr_l =
- EX_FLD(cmd_desc.out_param, arbelprm_query_fw_st,
- clr_int_base_addr_l);
- }
-
- return rc;
- }
-
- /*
- * cmd_query_adapter
- */
- static int cmd_query_adapter(struct query_adapter_st *qa)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_QUERY_ADAPTER;
- cmd_desc.out_trans = TRANS_MAILBOX;
- cmd_desc.out_param = get_outprm_buf();
- cmd_desc.out_param_size = MT_STRUCT_SIZE(arbelprm_query_adapter_st);
-
- rc = cmd_invoke(&cmd_desc);
- if (!rc) {
- qa->intapin =
- EX_FLD(cmd_desc.out_param, arbelprm_query_adapter_st,
- intapin);
- }
-
- return rc;
- }
-
- /*
- * cmd_enable_lam
- */
- static int cmd_enable_lam(void)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_ENABLE_LAM;
- cmd_desc.opcode_modifier = 1; /* zero locally attached memory */
- cmd_desc.input_modifier = 0; /* disable fast refresh */
- cmd_desc.out_trans = TRANS_MAILBOX;
- cmd_desc.out_param = get_outprm_buf();
- cmd_desc.out_param_size = MT_STRUCT_SIZE(arbelprm_enable_lam_st);
-
- rc = cmd_invoke(&cmd_desc);
- if (rc) {
- }
-
- return rc;
- }
-
- /*
- * cmd_map_fa
- */
- static int cmd_map_fa(struct map_icm_st *map_fa_p)
- {
- int rc;
- command_fields_t cmd_desc;
- unsigned int in_param_size, i;
- unsigned long off;
-
- if (map_fa_p->num_vpm > MAX_VPM_PER_CALL) {
- return -1;
- }
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_MAP_FA;
- cmd_desc.input_modifier = map_fa_p->num_vpm;
- cmd_desc.in_trans = TRANS_MAILBOX;
- cmd_desc.in_param = get_inprm_buf();
- in_param_size =
- MT_STRUCT_SIZE(arbelprm_virtual_physical_mapping_st) *
- map_fa_p->num_vpm;
- cmd_desc.in_param_size = in_param_size;
- memset(cmd_desc.in_param, 0, in_param_size);
-
- for (i = 0; i < map_fa_p->num_vpm; ++i) {
- off = (unsigned long)(cmd_desc.in_param) +
- MT_STRUCT_SIZE(arbelprm_virtual_physical_mapping_st) * i;
- INS_FLD(map_fa_p->vpm_arr[i].va_h, off,
- arbelprm_virtual_physical_mapping_st, va_h);
- INS_FLD(map_fa_p->vpm_arr[i].va_l >> 12, off,
- arbelprm_virtual_physical_mapping_st, va_l);
- INS_FLD(map_fa_p->vpm_arr[i].pa_h, off,
- arbelprm_virtual_physical_mapping_st, pa_h);
- INS_FLD(map_fa_p->vpm_arr[i].pa_l >> 12, off,
- arbelprm_virtual_physical_mapping_st, pa_l);
- INS_FLD(map_fa_p->vpm_arr[i].log2_size, off,
- arbelprm_virtual_physical_mapping_st, log2size);
- }
-
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_unmap_fa
- */
- static int cmd_unmap_fa(void)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_UNMAP_FA;
-
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_run_fw
- */
- static int cmd_run_fw(void)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_RUN_FW;
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_set_icm_size
- */
- static int cmd_set_icm_size(__u32 icm_size, __u32 * aux_pages_p)
- {
- int rc;
- command_fields_t cmd_desc;
- __u32 iprm[2], oprm[2];
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_SET_ICM_SIZE;
-
- iprm[1] = icm_size;
- iprm[0] = 0;
- cmd_desc.in_trans = TRANS_IMMEDIATE;
- cmd_desc.in_param = iprm;
- cmd_desc.out_trans = TRANS_IMMEDIATE;
- cmd_desc.out_param = oprm;
- rc = cmd_invoke(&cmd_desc);
- if (!rc) {
- if (oprm[0]) {
- /* too many pages required */
- return -1;
- }
- *aux_pages_p = oprm[1];
- }
-
- return rc;
- }
-
- /*
- * cmd_map_icm_aux
- */
- static int cmd_map_icm_aux(struct map_icm_st *map_icm_aux_p)
- {
- int rc;
- command_fields_t cmd_desc;
- unsigned int in_param_size, i;
- unsigned long off;
-
- if (map_icm_aux_p->num_vpm > MAX_VPM_PER_CALL) {
- return -1;
- }
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_MAP_ICM_AUX;
- cmd_desc.input_modifier = map_icm_aux_p->num_vpm;
- cmd_desc.in_trans = TRANS_MAILBOX;
- cmd_desc.in_param = get_inprm_buf();
- in_param_size =
- MT_STRUCT_SIZE(arbelprm_virtual_physical_mapping_st) *
- map_icm_aux_p->num_vpm;
- cmd_desc.in_param_size = in_param_size;
- memset(cmd_desc.in_param, 0, in_param_size);
-
- for (i = 0; i < map_icm_aux_p->num_vpm; ++i) {
- off = (unsigned long)(cmd_desc.in_param) +
- MT_STRUCT_SIZE(arbelprm_virtual_physical_mapping_st) * i;
- INS_FLD(map_icm_aux_p->vpm_arr[i].va_h, off,
- arbelprm_virtual_physical_mapping_st, va_h);
- INS_FLD(map_icm_aux_p->vpm_arr[i].va_l >> 12, off,
- arbelprm_virtual_physical_mapping_st, va_l);
- INS_FLD(map_icm_aux_p->vpm_arr[i].pa_h, off,
- arbelprm_virtual_physical_mapping_st, pa_h);
- INS_FLD(map_icm_aux_p->vpm_arr[i].pa_l >> 12, off,
- arbelprm_virtual_physical_mapping_st, pa_l);
- INS_FLD(map_icm_aux_p->vpm_arr[i].log2_size, off,
- arbelprm_virtual_physical_mapping_st, log2size);
- }
-
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_map_icm
- */
- static int cmd_map_icm(struct map_icm_st *map_icm_p)
- {
- int rc;
- command_fields_t cmd_desc;
- unsigned int in_param_size, i;
- unsigned long off;
-
- if (map_icm_p->num_vpm > MAX_VPM_PER_CALL) {
- return -1;
- }
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_MAP_ICM;
- cmd_desc.input_modifier = map_icm_p->num_vpm;
- cmd_desc.in_trans = TRANS_MAILBOX;
- cmd_desc.in_param = get_inprm_buf();
- in_param_size =
- MT_STRUCT_SIZE(arbelprm_virtual_physical_mapping_st) *
- map_icm_p->num_vpm;
- cmd_desc.in_param_size = in_param_size;
- memset(cmd_desc.in_param, 0, in_param_size);
-
- for (i = 0; i < map_icm_p->num_vpm; ++i) {
- off = (unsigned long)(cmd_desc.in_param) +
- MT_STRUCT_SIZE(arbelprm_virtual_physical_mapping_st) * i;
- INS_FLD(map_icm_p->vpm_arr[i].va_h, off,
- arbelprm_virtual_physical_mapping_st, va_h);
- INS_FLD(map_icm_p->vpm_arr[i].va_l >> 12, off,
- arbelprm_virtual_physical_mapping_st, va_l);
- INS_FLD(map_icm_p->vpm_arr[i].pa_h, off,
- arbelprm_virtual_physical_mapping_st, pa_h);
- INS_FLD(map_icm_p->vpm_arr[i].pa_l >> 12, off,
- arbelprm_virtual_physical_mapping_st, pa_l);
- INS_FLD(map_icm_p->vpm_arr[i].log2_size, off,
- arbelprm_virtual_physical_mapping_st, log2size);
- }
-
- rc = cmd_invoke(&cmd_desc);
-
- return rc;
- }
-
- /*
- * cmd_query_dev_lim
- */
- static int cmd_query_dev_lim(struct dev_lim_st *dev_lim_p)
- {
- int rc;
- command_fields_t cmd_desc;
-
- memset(&cmd_desc, 0, sizeof cmd_desc);
-
- cmd_desc.opcode = MEMFREE_CMD_QUERY_DEV_LIM;
- cmd_desc.out_trans = TRANS_MAILBOX;
- cmd_desc.out_param = get_outprm_buf();
- cmd_desc.out_param_size = MT_STRUCT_SIZE(arbelprm_query_dev_lim_st);
-
- rc = cmd_invoke(&cmd_desc);
- if (!rc) {
- dev_lim_p->log2_rsvd_qps =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_qps);
- dev_lim_p->qpc_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- qpc_entry_sz);
-
- dev_lim_p->log2_rsvd_srqs =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_srqs);
- dev_lim_p->srq_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- srq_entry_sz);
-
- dev_lim_p->log2_rsvd_ees =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_ees);
- dev_lim_p->eec_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- eec_entry_sz);
-
- dev_lim_p->log2_rsvd_cqs =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_cqs);
- dev_lim_p->cqc_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- cqc_entry_sz);
-
- dev_lim_p->log2_rsvd_mtts =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_mtts);
- dev_lim_p->mtt_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- mtt_entry_sz);
-
- dev_lim_p->log2_rsvd_mrws =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_mrws);
- dev_lim_p->mpt_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- mpt_entry_sz);
-
- dev_lim_p->log2_rsvd_rdbs =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- log2_rsvd_rdbs);
-
- dev_lim_p->eqc_entry_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- eqc_entry_sz);
-
- dev_lim_p->max_icm_size_l =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- max_icm_size_l);
- dev_lim_p->max_icm_size_h =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- max_icm_size_h);
-
- dev_lim_p->num_rsvd_uars =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- num_rsvd_uars);
- dev_lim_p->uar_sz =
- EX_FLD(cmd_desc.out_param, arbelprm_query_dev_lim_st,
- uar_sz);
- }
-
- return rc;
- }
|