#include <sys/sysmacros.h>
#include <sys/types.h>
#include <sys/conf.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/modctl.h>
#include <sys/bitmap.h>
#include <sys/ib/adapters/tavor/tavor.h>
uint32_t tavor_alt_config_enable = 0;
uint32_t tavor_log_num_qp = TAVOR_NUM_QP_SHIFT_128;
uint32_t tavor_log_max_qp_sz = TAVOR_QP_SZ_SHIFT;
uint32_t tavor_wqe_max_sgl = TAVOR_NUM_WQE_SGL;
uint32_t tavor_log_num_cq = TAVOR_NUM_CQ_SHIFT_128;
uint32_t tavor_log_max_cq_sz = TAVOR_CQ_SZ_SHIFT;
uint32_t tavor_srq_enable = 1;
uint32_t tavor_log_num_srq = TAVOR_NUM_SRQ_SHIFT_128;
uint32_t tavor_log_max_srq_sz = TAVOR_SRQ_SZ_SHIFT;
uint32_t tavor_srq_max_sgl = TAVOR_SRQ_MAX_SGL;
uint32_t tavor_log_default_eq_sz = TAVOR_DEFAULT_EQ_SZ_SHIFT;
uint32_t tavor_log_num_rdb = TAVOR_NUM_RDB_SHIFT_128;
uint32_t tavor_log_num_mcg = TAVOR_NUM_MCG_SHIFT;
uint32_t tavor_num_qp_per_mcg = TAVOR_NUM_QP_PER_MCG;
uint32_t tavor_log_num_mcg_hash = TAVOR_NUM_MCG_HASH_SHIFT;
uint32_t tavor_log_num_mpt = TAVOR_NUM_MPT_SHIFT_128;
uint32_t tavor_log_max_mrw_sz = TAVOR_MAX_MEM_MPT_SHIFT_128;
uint32_t tavor_log_num_mttseg = TAVOR_NUM_MTTSEG_SHIFT;
uint32_t tavor_log_num_inmbox = TAVOR_NUM_MAILBOXES_SHIFT;
uint32_t tavor_log_num_outmbox = TAVOR_NUM_MAILBOXES_SHIFT;
uint32_t tavor_log_num_intr_inmbox = TAVOR_NUM_INTR_MAILBOXES_SHIFT;
uint32_t tavor_log_num_intr_outmbox = TAVOR_NUM_INTR_MAILBOXES_SHIFT;
uint32_t tavor_log_inmbox_size = TAVOR_MBOX_SIZE_SHIFT;
uint32_t tavor_log_outmbox_size = TAVOR_MBOX_SIZE_SHIFT;
uint32_t tavor_log_num_uar = TAVOR_NUM_UAR_SHIFT;
uint32_t tavor_log_num_pd = TAVOR_NUM_PD_SHIFT;
uint32_t tavor_log_num_ah = TAVOR_NUM_AH_SHIFT;
uint32_t tavor_log_max_pkeytbl = TAVOR_NUM_PKEYTBL_SHIFT;
uint32_t tavor_log_max_gidtbl = TAVOR_NUM_GIDTBL_SHIFT;
uint32_t tavor_hca_max_rdma_in_qp = TAVOR_HCA_MAX_RDMA_IN_QP;
uint32_t tavor_hca_max_rdma_out_qp = TAVOR_HCA_MAX_RDMA_OUT_QP;
uint32_t tavor_max_mtu = TAVOR_MAX_MTU;
uint32_t tavor_max_port_width = TAVOR_MAX_PORT_WIDTH;
uint32_t tavor_max_vlcap = TAVOR_MAX_VLCAP;
uint32_t tavor_num_ports = TAVOR_NUM_PORTS;
uint32_t tavor_qp0_agents_in_fw = 1;
uint32_t tavor_qp1_agents_in_fw = 0;
uint32_t tavor_streaming_consistent = 1;
uint32_t tavor_consistent_syncoverride = 0;
uint32_t tavor_iommu_bypass = 1;
uint32_t tavor_disable_streaming_on_bypass = 0;
uint32_t tavor_qp_wq_inddr = 0;
uint32_t tavor_srq_wq_inddr = 0;
uint32_t tavor_use_msi_if_avail = 1;
uint32_t tavor_sw_reset_delay = TAVOR_SW_RESET_DELAY;
uint32_t tavor_cmd_poll_delay = TAVOR_CMD_POLL_DELAY;
uint32_t tavor_cmd_poll_max = TAVOR_CMD_POLL_MAX;
uint32_t tavor_qp_ackreq_freq = TAVOR_QP_ACKREQ_FREQ;
#ifdef __sparc
int tavor_max_out_splt_trans = 0;
#else
int tavor_max_out_splt_trans = -1;
#endif
#ifdef __sparc
int tavor_max_mem_rd_byte_cnt = 0;
static void tavor_check_iommu_bypass(tavor_state_t *state,
tavor_cfg_profile_t *cp);
#else
int tavor_max_mem_rd_byte_cnt = -1;
#endif
static void tavor_cfg_wqe_sizes(tavor_cfg_profile_t *cp);
static void tavor_cfg_prop_lookup(tavor_state_t *state,
tavor_cfg_profile_t *cp);
int
tavor_cfg_profile_init_phase1(tavor_state_t *state)
{
tavor_cfg_profile_t *cp;
cp = (tavor_cfg_profile_t *)kmem_zalloc(sizeof (tavor_cfg_profile_t),
KM_SLEEP);
cp->cp_qp0_agents_in_fw = tavor_qp0_agents_in_fw;
cp->cp_qp1_agents_in_fw = tavor_qp1_agents_in_fw;
cp->cp_sw_reset_delay = tavor_sw_reset_delay;
cp->cp_cmd_poll_delay = tavor_cmd_poll_delay;
cp->cp_cmd_poll_max = tavor_cmd_poll_max;
cp->cp_ackreq_freq = tavor_qp_ackreq_freq;
cp->cp_max_out_splt_trans = tavor_max_out_splt_trans;
cp->cp_max_mem_rd_byte_cnt = tavor_max_mem_rd_byte_cnt;
cp->cp_srq_enable = tavor_srq_enable;
cp->cp_fmr_enable = 0;
cp->cp_fmr_max_remaps = 0;
if (tavor_alt_config_enable) {
cp->cp_log_num_outmbox = tavor_log_num_outmbox;
cp->cp_log_num_intr_outmbox = tavor_log_num_intr_outmbox;
cp->cp_log_outmbox_size = tavor_log_outmbox_size;
cp->cp_log_num_inmbox = tavor_log_num_inmbox;
cp->cp_log_num_intr_inmbox = tavor_log_num_intr_inmbox;
cp->cp_log_inmbox_size = tavor_log_inmbox_size;
cp->cp_log_num_srq = tavor_log_num_srq;
cp->cp_log_max_srq_sz = tavor_log_max_srq_sz;
} else if (state->ts_cfg_profile_setting >= TAVOR_DDR_SIZE_256) {
cp->cp_log_num_outmbox = TAVOR_NUM_MAILBOXES_SHIFT;
cp->cp_log_num_intr_outmbox =
TAVOR_NUM_INTR_MAILBOXES_SHIFT;
cp->cp_log_outmbox_size = TAVOR_MBOX_SIZE_SHIFT;
cp->cp_log_num_inmbox = TAVOR_NUM_MAILBOXES_SHIFT;
cp->cp_log_num_intr_inmbox =
TAVOR_NUM_INTR_MAILBOXES_SHIFT;
cp->cp_log_inmbox_size = TAVOR_MBOX_SIZE_SHIFT;
cp->cp_log_num_srq = TAVOR_NUM_SRQ_SHIFT_256;
cp->cp_log_max_srq_sz = TAVOR_SRQ_SZ_SHIFT;
} else if (state->ts_cfg_profile_setting == TAVOR_DDR_SIZE_128) {
cp->cp_log_num_outmbox = TAVOR_NUM_MAILBOXES_SHIFT;
cp->cp_log_num_intr_outmbox =
TAVOR_NUM_INTR_MAILBOXES_SHIFT;
cp->cp_log_outmbox_size = TAVOR_MBOX_SIZE_SHIFT;
cp->cp_log_num_inmbox = TAVOR_NUM_MAILBOXES_SHIFT;
cp->cp_log_num_intr_inmbox =
TAVOR_NUM_INTR_MAILBOXES_SHIFT;
cp->cp_log_inmbox_size = TAVOR_MBOX_SIZE_SHIFT;
cp->cp_log_num_srq = TAVOR_NUM_SRQ_SHIFT_128;
cp->cp_log_max_srq_sz = TAVOR_SRQ_SZ_SHIFT;
} else if (state->ts_cfg_profile_setting == TAVOR_DDR_SIZE_MIN) {
cp->cp_log_num_outmbox = TAVOR_NUM_MAILBOXES_SHIFT;
cp->cp_log_num_intr_outmbox =
TAVOR_NUM_INTR_MAILBOXES_SHIFT;
cp->cp_log_outmbox_size = TAVOR_MBOX_SIZE_SHIFT;
cp->cp_log_num_inmbox = TAVOR_NUM_MAILBOXES_SHIFT;
cp->cp_log_num_intr_inmbox =
TAVOR_NUM_INTR_MAILBOXES_SHIFT;
cp->cp_log_inmbox_size = TAVOR_MBOX_SIZE_SHIFT;
cp->cp_log_num_srq = TAVOR_NUM_SRQ_SHIFT_MIN;
cp->cp_log_max_srq_sz = TAVOR_SRQ_SZ_SHIFT_MIN;
} else {
return (DDI_FAILURE);
}
if (tavor_streaming_consistent == 0) {
#ifdef __sparc
cp->cp_streaming_consistent = DDI_DMA_STREAMING;
if (tavor_iommu_bypass != 0) {
kmem_free(cp, sizeof (tavor_cfg_profile_t));
return (DDI_FAILURE);
}
#else
cp->cp_streaming_consistent = DDI_DMA_CONSISTENT;
#endif
} else {
cp->cp_streaming_consistent = DDI_DMA_CONSISTENT;
}
cp->cp_consistent_syncoverride = tavor_consistent_syncoverride;
state->ts_cfg_profile = cp;
return (DDI_SUCCESS);
}
int
tavor_cfg_profile_init_phase2(tavor_state_t *state)
{
tavor_cfg_profile_t *cp;
cp = state->ts_cfg_profile;
ASSERT(state->ts_cfg_profile_setting != 0);
if (tavor_alt_config_enable) {
cp->cp_log_num_qp = tavor_log_num_qp;
cp->cp_log_max_qp_sz = tavor_log_max_qp_sz;
tavor_cfg_wqe_sizes(cp);
cp->cp_log_num_cq = tavor_log_num_cq;
cp->cp_log_max_cq_sz = tavor_log_max_cq_sz;
cp->cp_log_default_eq_sz = tavor_log_default_eq_sz;
cp->cp_log_num_rdb = tavor_log_num_rdb;
cp->cp_log_num_mcg = tavor_log_num_mcg;
cp->cp_num_qp_per_mcg = tavor_num_qp_per_mcg;
cp->cp_log_num_mcg_hash = tavor_log_num_mcg_hash;
cp->cp_log_num_mpt = tavor_log_num_mpt;
cp->cp_log_max_mrw_sz = tavor_log_max_mrw_sz;
cp->cp_log_num_mttseg = tavor_log_num_mttseg;
cp->cp_log_num_uar = tavor_log_num_uar;
cp->cp_log_num_pd = tavor_log_num_pd;
cp->cp_log_num_ah = tavor_log_num_ah;
cp->cp_log_max_pkeytbl = tavor_log_max_pkeytbl;
cp->cp_log_max_gidtbl = tavor_log_max_gidtbl;
cp->cp_hca_max_rdma_in_qp = tavor_hca_max_rdma_in_qp;
cp->cp_hca_max_rdma_out_qp = tavor_hca_max_rdma_out_qp;
cp->cp_max_mtu = tavor_max_mtu;
cp->cp_max_port_width = tavor_max_port_width;
cp->cp_max_vlcap = tavor_max_vlcap;
cp->cp_num_ports = tavor_num_ports;
cp->cp_qp0_agents_in_fw = tavor_qp0_agents_in_fw;
cp->cp_qp1_agents_in_fw = tavor_qp1_agents_in_fw;
cp->cp_sw_reset_delay = tavor_sw_reset_delay;
cp->cp_ackreq_freq = tavor_qp_ackreq_freq;
cp->cp_max_out_splt_trans = tavor_max_out_splt_trans;
cp->cp_max_mem_rd_byte_cnt = tavor_max_mem_rd_byte_cnt;
} else if (state->ts_cfg_profile_setting >= TAVOR_DDR_SIZE_256) {
cp->cp_log_num_qp = TAVOR_NUM_QP_SHIFT_256;
cp->cp_log_max_qp_sz = TAVOR_QP_SZ_SHIFT;
tavor_cfg_wqe_sizes(cp);
cp->cp_log_num_cq = TAVOR_NUM_CQ_SHIFT_256;
cp->cp_log_max_cq_sz = TAVOR_CQ_SZ_SHIFT;
cp->cp_log_default_eq_sz = TAVOR_DEFAULT_EQ_SZ_SHIFT;
cp->cp_log_num_rdb = TAVOR_NUM_RDB_SHIFT_256;
cp->cp_log_num_mcg = TAVOR_NUM_MCG_SHIFT;
cp->cp_num_qp_per_mcg = TAVOR_NUM_QP_PER_MCG;
cp->cp_log_num_mcg_hash = TAVOR_NUM_MCG_HASH_SHIFT;
cp->cp_log_num_mpt = TAVOR_NUM_MPT_SHIFT_256;
cp->cp_log_max_mrw_sz = TAVOR_MAX_MEM_MPT_SHIFT_256;
cp->cp_log_num_mttseg = TAVOR_NUM_MTTSEG_SHIFT;
cp->cp_log_num_uar = TAVOR_NUM_UAR_SHIFT;
cp->cp_log_num_pd = TAVOR_NUM_PD_SHIFT;
cp->cp_log_num_ah = TAVOR_NUM_AH_SHIFT;
cp->cp_log_max_pkeytbl = TAVOR_NUM_PKEYTBL_SHIFT;
cp->cp_log_max_gidtbl = TAVOR_NUM_GIDTBL_SHIFT;
cp->cp_hca_max_rdma_in_qp = TAVOR_HCA_MAX_RDMA_IN_QP;
cp->cp_hca_max_rdma_out_qp = TAVOR_HCA_MAX_RDMA_OUT_QP;
cp->cp_max_mtu = TAVOR_MAX_MTU;
cp->cp_max_port_width = TAVOR_MAX_PORT_WIDTH;
cp->cp_max_vlcap = TAVOR_MAX_VLCAP;
cp->cp_num_ports = TAVOR_NUM_PORTS;
cp->cp_qp0_agents_in_fw = tavor_qp0_agents_in_fw;
cp->cp_qp1_agents_in_fw = tavor_qp1_agents_in_fw;
cp->cp_sw_reset_delay = tavor_sw_reset_delay;
cp->cp_ackreq_freq = tavor_qp_ackreq_freq;
cp->cp_max_out_splt_trans = tavor_max_out_splt_trans;
cp->cp_max_mem_rd_byte_cnt = tavor_max_mem_rd_byte_cnt;
} else if (state->ts_cfg_profile_setting == TAVOR_DDR_SIZE_128) {
cp->cp_log_num_qp = TAVOR_NUM_QP_SHIFT_128;
cp->cp_log_max_qp_sz = TAVOR_QP_SZ_SHIFT;
tavor_cfg_wqe_sizes(cp);
cp->cp_log_num_cq = TAVOR_NUM_CQ_SHIFT_128;
cp->cp_log_max_cq_sz = TAVOR_CQ_SZ_SHIFT;
cp->cp_log_default_eq_sz = TAVOR_DEFAULT_EQ_SZ_SHIFT;
cp->cp_log_num_rdb = TAVOR_NUM_RDB_SHIFT_128;
cp->cp_log_num_mcg = TAVOR_NUM_MCG_SHIFT;
cp->cp_num_qp_per_mcg = TAVOR_NUM_QP_PER_MCG;
cp->cp_log_num_mcg_hash = TAVOR_NUM_MCG_HASH_SHIFT;
cp->cp_log_num_mpt = TAVOR_NUM_MPT_SHIFT_128;
cp->cp_log_max_mrw_sz = TAVOR_MAX_MEM_MPT_SHIFT_128;
cp->cp_log_num_mttseg = TAVOR_NUM_MTTSEG_SHIFT;
cp->cp_log_num_uar = TAVOR_NUM_UAR_SHIFT;
cp->cp_log_num_pd = TAVOR_NUM_PD_SHIFT;
cp->cp_log_num_ah = TAVOR_NUM_AH_SHIFT;
cp->cp_log_max_pkeytbl = TAVOR_NUM_PKEYTBL_SHIFT;
cp->cp_log_max_gidtbl = TAVOR_NUM_GIDTBL_SHIFT;
cp->cp_hca_max_rdma_in_qp = TAVOR_HCA_MAX_RDMA_IN_QP;
cp->cp_hca_max_rdma_out_qp = TAVOR_HCA_MAX_RDMA_OUT_QP;
cp->cp_max_mtu = TAVOR_MAX_MTU;
cp->cp_max_port_width = TAVOR_MAX_PORT_WIDTH;
cp->cp_max_vlcap = TAVOR_MAX_VLCAP;
cp->cp_num_ports = TAVOR_NUM_PORTS;
cp->cp_qp0_agents_in_fw = tavor_qp0_agents_in_fw;
cp->cp_qp1_agents_in_fw = tavor_qp1_agents_in_fw;
cp->cp_sw_reset_delay = tavor_sw_reset_delay;
cp->cp_ackreq_freq = tavor_qp_ackreq_freq;
cp->cp_max_out_splt_trans = tavor_max_out_splt_trans;
cp->cp_max_mem_rd_byte_cnt = tavor_max_mem_rd_byte_cnt;
} else if (state->ts_cfg_profile_setting == TAVOR_DDR_SIZE_MIN) {
cp->cp_log_num_qp = TAVOR_NUM_QP_SHIFT_MIN;
cp->cp_log_max_qp_sz = TAVOR_QP_SZ_SHIFT_MIN;
tavor_cfg_wqe_sizes(cp);
cp->cp_log_num_cq = TAVOR_NUM_CQ_SHIFT_MIN;
cp->cp_log_max_cq_sz = TAVOR_CQ_SZ_SHIFT_MIN;
cp->cp_log_default_eq_sz = TAVOR_DEFAULT_EQ_SZ_SHIFT;
cp->cp_log_num_rdb = TAVOR_NUM_RDB_SHIFT_MIN;
cp->cp_log_num_mcg = TAVOR_NUM_MCG_SHIFT_MIN;
cp->cp_num_qp_per_mcg = TAVOR_NUM_QP_PER_MCG_MIN;
cp->cp_log_num_mcg_hash = TAVOR_NUM_MCG_HASH_SHIFT_MIN;
cp->cp_log_num_mpt = TAVOR_NUM_MPT_SHIFT_MIN;
cp->cp_log_max_mrw_sz = TAVOR_MAX_MEM_MPT_SHIFT_MIN;
cp->cp_log_num_mttseg = TAVOR_NUM_MTTSEG_SHIFT_MIN;
cp->cp_log_num_uar = TAVOR_NUM_UAR_SHIFT_MIN;
cp->cp_log_num_pd = TAVOR_NUM_PD_SHIFT;
cp->cp_log_num_ah = TAVOR_NUM_AH_SHIFT_MIN;
cp->cp_log_max_pkeytbl = TAVOR_NUM_PKEYTBL_SHIFT;
cp->cp_log_max_gidtbl = TAVOR_NUM_GIDTBL_SHIFT;
cp->cp_hca_max_rdma_in_qp = TAVOR_HCA_MAX_RDMA_IN_QP;
cp->cp_hca_max_rdma_out_qp = TAVOR_HCA_MAX_RDMA_OUT_QP;
cp->cp_max_mtu = TAVOR_MAX_MTU;
cp->cp_max_port_width = TAVOR_MAX_PORT_WIDTH;
cp->cp_max_vlcap = TAVOR_MAX_VLCAP;
cp->cp_num_ports = TAVOR_NUM_PORTS;
cp->cp_qp0_agents_in_fw = tavor_qp0_agents_in_fw;
cp->cp_qp1_agents_in_fw = tavor_qp1_agents_in_fw;
cp->cp_sw_reset_delay = tavor_sw_reset_delay;
cp->cp_ackreq_freq = tavor_qp_ackreq_freq;
cp->cp_max_out_splt_trans = tavor_max_out_splt_trans;
cp->cp_max_mem_rd_byte_cnt = tavor_max_mem_rd_byte_cnt;
} else {
return (DDI_FAILURE);
}
#ifdef __sparc
if (tavor_iommu_bypass == 1) {
tavor_check_iommu_bypass(state, cp);
} else {
cp->cp_iommu_bypass = TAVOR_BINDMEM_NORMAL;
cp->cp_disable_streaming_on_bypass = 0;
}
#else
cp->cp_iommu_bypass = TAVOR_BINDMEM_NORMAL;
cp->cp_disable_streaming_on_bypass = 0;
#endif
cp->cp_qp_wq_inddr = (tavor_qp_wq_inddr == 0) ?
TAVOR_QUEUE_LOCATION_NORMAL : TAVOR_QUEUE_LOCATION_INDDR;
cp->cp_srq_wq_inddr = (tavor_srq_wq_inddr == 0) ?
TAVOR_QUEUE_LOCATION_NORMAL : TAVOR_QUEUE_LOCATION_INDDR;
cp->cp_use_msi_if_avail = tavor_use_msi_if_avail;
tavor_cfg_prop_lookup(state, cp);
return (DDI_SUCCESS);
}
void
tavor_cfg_profile_fini(tavor_state_t *state)
{
kmem_free(state->ts_cfg_profile, sizeof (tavor_cfg_profile_t));
}
static void
tavor_cfg_wqe_sizes(tavor_cfg_profile_t *cp)
{
uint_t max_size, log2;
uint_t max_sgl, real_max_sgl;
max_sgl = tavor_wqe_max_sgl;
max_size = (TAVOR_QP_WQE_MLX_QP1_HDRS + (max_sgl << 4));
log2 = highbit(max_size);
if (ISP2(max_size)) {
log2 = log2 - 1;
}
max_size = (1 << log2);
max_size = min(max_size, TAVOR_QP_WQE_MAX_SIZE);
real_max_sgl = (max_size - TAVOR_QP_WQE_MLX_QP1_HDRS) >> 4;
cp->cp_wqe_max_sgl = max_sgl;
cp->cp_wqe_real_max_sgl = real_max_sgl;
cp->cp_srq_max_sgl = tavor_srq_max_sgl;
}
static void
tavor_cfg_prop_lookup(tavor_state_t *state, tavor_cfg_profile_t *cp)
{
uint_t num_ports, nelementsp;
uchar_t *datap;
int status;
num_ports = ddi_prop_get_int(DDI_DEV_T_ANY, state->ts_dip,
DDI_PROP_DONTPASS, "#ports", 0);
if ((num_ports > TAVOR_NUM_PORTS) || (num_ports == 0)) {
return;
}
cp->cp_num_ports = num_ports;
#ifdef SUPPORTED_IN_1275_BINDING
status = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, state->ts_dip,
DDI_PROP_DONTPASS, "system-image-guid", &datap, &nelementsp);
if (status == DDI_PROP_SUCCESS) {
cp->cp_sysimgguid = ((uint64_t *)datap)[0];
ddi_prop_free(datap);
} else {
cmn_err(CE_NOTE,
"Unable to read OBP system-image-guid property");
}
#endif
status = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, state->ts_dip,
DDI_PROP_DONTPASS, "node-guid", &datap, &nelementsp);
if (status == DDI_PROP_SUCCESS) {
cp->cp_nodeguid = ((uint64_t *)datap)[0];
ddi_prop_free(datap);
} else {
cmn_err(CE_NOTE, "Unable to read OBP node-guid property");
}
if (num_ports == TAVOR_NUM_PORTS) {
status = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY,
state->ts_dip, DDI_PROP_DONTPASS, "port-2-guid", &datap,
&nelementsp);
if (status == DDI_PROP_SUCCESS) {
cp->cp_portguid[1] = ((uint64_t *)datap)[0];
ddi_prop_free(datap);
} else {
cmn_err(CE_NOTE,
"Unable to read OBP port-2-guid property");
}
}
status = ddi_prop_lookup_byte_array(DDI_DEV_T_ANY, state->ts_dip,
DDI_PROP_DONTPASS, "port-1-guid", &datap, &nelementsp);
if (status == DDI_PROP_SUCCESS) {
cp->cp_portguid[0] = ((uint64_t *)datap)[0];
ddi_prop_free(datap);
} else {
cmn_err(CE_NOTE, "Unable to read OBP port-1-guid property");
}
}
#ifdef __sparc
static void
tavor_check_iommu_bypass(tavor_state_t *state, tavor_cfg_profile_t *cp)
{
ddi_dma_handle_t dmahdl;
ddi_dma_attr_t dma_attr;
int status;
tavor_dma_attr_init(&dma_attr);
dma_attr.dma_attr_flags = DDI_DMA_FORCE_PHYSICAL;
status = ddi_dma_alloc_handle(state->ts_dip, &dma_attr,
DDI_DMA_SLEEP, NULL, &dmahdl);
if (status == DDI_DMA_BADATTR) {
cp->cp_iommu_bypass = TAVOR_BINDMEM_NORMAL;
cp->cp_disable_streaming_on_bypass = 0;
} else {
cp->cp_iommu_bypass = TAVOR_BINDMEM_BYPASS;
cp->cp_disable_streaming_on_bypass =
tavor_disable_streaming_on_bypass;
if (status == DDI_SUCCESS) {
ddi_dma_free_handle(&dmahdl);
}
}
}
#endif