678453a8ed49104d8adad58f3ba591bdc39883e8speer * CDDL HEADER START
678453a8ed49104d8adad58f3ba591bdc39883e8speer * The contents of this file are subject to the terms of the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Common Development and Distribution License (the "License").
678453a8ed49104d8adad58f3ba591bdc39883e8speer * You may not use this file except in compliance with the License.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
678453a8ed49104d8adad58f3ba591bdc39883e8speer * See the License for the specific language governing permissions
678453a8ed49104d8adad58f3ba591bdc39883e8speer * and limitations under the License.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * When distributing Covered Code, include this CDDL HEADER in each
678453a8ed49104d8adad58f3ba591bdc39883e8speer * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * If applicable, add the following below this CDDL HEADER, with the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * fields enclosed by brackets "[]" replaced with your own identifying
678453a8ed49104d8adad58f3ba591bdc39883e8speer * information: Portions Copyright [yyyy] [name of copyright owner]
678453a8ed49104d8adad58f3ba591bdc39883e8speer * CDDL HEADER END
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Use is subject to license terms.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This file manages the virtualization resources for Neptune
678453a8ed49104d8adad58f3ba591bdc39883e8speer * devices. That is, it implements a hybrid I/O (HIO) approach in the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Solaris kernel, whereby a guest domain on an LDOMs server may
678453a8ed49104d8adad58f3ba591bdc39883e8speer * request & use hardware resources from the service domain.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * External prototypes
678453a8ed49104d8adad58f3ba591bdc39883e8speerextern npi_status_t npi_rxdma_dump_rdc_table(npi_handle_t, uint8_t);
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* The following function may be found in nxge_main.c */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengextern int nxge_m_mmac_remove(void *arg, int slot);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengextern int nxge_m_mmac_add_g(void *arg, const uint8_t *maddr, int rdctbl,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerextern int nxge_rx_ring_start(mac_ring_driver_t rdriver, uint64_t mr_gen_num);
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* The following function may be found in nxge_[t|r]xdma.c */
678453a8ed49104d8adad58f3ba591bdc39883e8speerextern npi_status_t nxge_txdma_channel_disable(nxge_t *, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speerextern nxge_status_t nxge_disable_rxdma_channel(nxge_t *, uint16_t);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Local prototypes
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic void nxge_grp_dc_append(nxge_t *, nxge_grp_t *, nxge_hio_dc_t *);
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic nxge_hio_dc_t *nxge_grp_dc_unlink(nxge_t *, nxge_grp_t *, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These functions are used by both service & guest domains to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * decide whether they're running in an LDOMs/XEN environment
678453a8ed49104d8adad58f3ba591bdc39883e8speer * or not. If so, then the Hybrid I/O (HIO) module is initialized.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_get_environs
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Figure out if we are in a guest domain or not.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer * In the beginning, assume that we are running sans LDOMs/XEN.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Are we a hybrid I/O (HIO) guest domain driver?
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* So we can allocate properly-aligned memory. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Hybrid IO-capable guest domain"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer#if !defined(sun4v)
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_init
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the HIO module of the NXGE driver.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This is the non-hybrid I/O version of this function.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize share and ring group structures.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDCS; i++)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDC_GROUPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer nxge->rx_hio_groups[i].port_default_grp = B_FALSE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_dci_map
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Map a DMA channel index to a channel number.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * instance The instance number of the driver.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type The type of channel this is: Tx or Rx.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * index The index to convert to a channel number
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This function is called by nxge_ndd.c:nxge_param_set_port_rdc()
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-1);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are the general-purpose DMA channel group functions. That is,
678453a8ed49104d8adad58f3ba591bdc39883e8speer * these functions are used to manage groups of TDCs or RDCs in an HIO
678453a8ed49104d8adad58f3ba591bdc39883e8speer * environment.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * But is also expected that in the future they will be able to manage
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Crossbow groups.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * nxge_grp_cleanup(p_nxge_t nxge)
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Remove all outstanding groups.
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Find RX groups that need to be cleaned up.
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer for (i = 0; i < NXGE_LOGICAL_GROUP_MAX; i++) {
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer KMEM_FREE(set->group[i], sizeof (nxge_grp_t));
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer * Find TX groups that need to be cleaned up.
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer for (i = 0; i < NXGE_LOGICAL_GROUP_MAX; i++) {
651ce697a6d22736732dbe71681b0e026d33e467Michael Speer KMEM_FREE(set->group[i], sizeof (nxge_grp_t));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_add
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Add a group to an instance of NXGE.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type Tx or Rx
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Find an empty slot for this logical group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_LOGICAL_GROUP_MAX; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_add: %cgroup = %d.%d",
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_grp_t *group) /* The group to remove. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* While inside the mutex, deactivate <group>. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_remove(%c.%d.%d) called",
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Now, remove any DCs which are still active. */
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer * nxge_grp_dc_add
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Add a DMA channel to a VR/Group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The channel to add.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_grp_t *group, /* The group to add <channel> to. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_grp_dc_add"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_grp_dc_add: unknown type channel(%d)", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add: %cgroup = %d.%d.%d, channel = %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge->mac.portnum, group->sequence, group->count, channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* We may be in the process of removing this group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* This channel is already in use! */
678453a8ed49104d8adad58f3ba591bdc39883e8speer "nxge_grp_dc_add(%d): channel already in group", channel));
1d36aa9e69a7104197e5d02717082acf58af358aspeer if ((status = (*dc->init)(nxge, channel)) != NXGE_OK) {
1d36aa9e69a7104197e5d02717082acf58af358aspeer "nxge_grp_dc_add(%d): channel init failed", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_grp_dc_add"));
1d36aa9e69a7104197e5d02717082acf58af358aspeer return ((int)status);
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_grp_dc_remove"));
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer if ((dc = nxge_grp_dc_find(nxge, type, channel)) == 0)
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer (dc->channel == 0) && (dc->page == 0) && (dc->type == 0)) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer "DC remove: group = %d.%d.%d, %cdc %d",
1d36aa9e69a7104197e5d02717082acf58af358aspeer set = dc->type == VP_BOUND_TX ? &nxge->tx_set : &nxge->rx_set;
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Remove the DC from its group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_grp_dc_remove"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer current = (type == VP_BOUND_TX) ? &nhd->tdc[0] : &nhd->rdc[0];
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* We're in a guest domain. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_dc_append
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Append a DMA channel to a group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group to append to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * dc The DMA channel to append
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_dc_unlink
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unlink a DMA channel fromits linked list (group).
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group (linked list) to unlink from
678453a8ed49104d8adad58f3ba591bdc39883e8speer * dc The DMA channel to append
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (current == 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_grp_dc_map
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Map a linked list to an array of channel numbers.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group to remap.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * It is expected that the caller will hold the correct mutex.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer (void) memset(group->legend, 0, sizeof (group->legend));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are HIO debugging functions.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_delay
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Delay <seconds> number of seconds.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * group The group to append to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * dc The DMA channel to append
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This is a developer-only function.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "RXDMA_CFIG1", 0 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer { "Tx_RNG_CFIG", 0 },
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_xx2str
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Translate a register address into a string.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * offset The address of the register to translate.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are developer-only function.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speerconst char *
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speerconst char *
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_ddi_perror
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Map a DDI error number to a string.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ddi_error The DDI error number to map.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speerconst char *
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_SUCCESS");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_FAILURE");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_NOT_WELL_FORMED");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EAGAIN");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EINVAL");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ENOTSUP");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EPENDING");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ENOMEM");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_EBUSY");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ETRANSPORT");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("DDI_ECONTEXT");
678453a8ed49104d8adad58f3ba591bdc39883e8speer return ("Unknown error");
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer * These are Sun4v HIO function definitions
678453a8ed49104d8adad58f3ba591bdc39883e8speer * ---------------------------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer#if defined(sun4v)
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Local prototypes
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitastatic nxge_hio_vr_t *nxge_hio_vr_share(nxge_t *);
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitastatic void nxge_hio_unshare(nxge_hio_vr_t *);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int nxge_hio_addres(nxge_hio_vr_t *, mac_ring_type_t, uint64_t *);
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashitastatic void nxge_hio_remres(nxge_hio_vr_t *, mac_ring_type_t, res_map_t);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void nxge_hio_tdc_unshare(nxge_t *nxge, int dev_grpid, int channel);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic void nxge_hio_rdc_unshare(nxge_t *nxge, int dev_grpid, int channel);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengstatic int nxge_hio_dc_share(nxge_t *, nxge_hio_vr_t *, mac_ring_type_t, int);
678453a8ed49104d8adad58f3ba591bdc39883e8speerstatic void nxge_hio_dc_unshare(nxge_t *, nxge_hio_vr_t *,
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_init
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the HIO module of the NXGE driver.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Any domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nhd == 0) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * Versions supported now are:
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu * - major number >= 1 (NIU_MAJOR_VER).
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_init: hypervisor services "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "version %d.%d",
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize share and ring group structures.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDC_GROUPS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer nxge->rx_hio_groups[i].port_default_grp = B_FALSE;
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Fill in what we can.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize the share stuctures.
330cd344428055700fc03c465aa794ab0344c63dMichael Speer for (i = 0; i < NXGE_MAX_TDCS; i++)
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_VR_SR_MAX; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Fill in the HV HIO function pointers. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Hybrid IO-capable service domain"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#endif /* defined(sun4v) */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_group_mac_add(nxge_t *nxge, nxge_ring_group_t *g,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Initialize the NXGE RDC table data structure.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->port = NXGE_GET_PORT_NUM(nxge->function_num);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->config_method = RDC_TABLE_ENTRY_METHOD_REP;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->flag = B_TRUE; /* This group has been configured. */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Add the MAC address.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_m_mmac_add_g((void *)nxge, macaddr,
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speernxge_hio_set_unicst(void *arg, const uint8_t *macaddr)
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer bcopy(macaddr, (uint8_t *)&addrp, ETHERADDRL);
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer "<== nxge_m_unicst: set unitcast failed"));
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speernxge_hio_clear_unicst(p_nxge_t nxgep, const uint8_t *mac_addr)
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxge_ring_group_t *group = (nxge_ring_group_t *)arg;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxge_hio_vr_t *vr; /* The Virtualization Region */
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer if (!nxge->primary && group->port_default_grp) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer rv = nxge_hio_set_unicst((void *)nxge, mac_addr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * If the group is associated with a VR, then only one
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * address may be assigned to the group.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr = (nxge_hio_vr_t *)nxge->shares[group->sindex].vrp;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Program the mac address for the group.
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if ((rv = nxge_hio_group_mac_add(nxge, group, mac_addr)) != 0) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Chengfind_mac_slot(nxge_mmac_t *mmac_info, const uint8_t *mac_addr)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (memcmp(mmac_info->mac_pool[i].addr, mac_addr,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng return (-1);
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)arg;
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer if (group->port_default_grp && nxge->primary) {
2cf06b0d760c09adfc3af47b08e250f9d56736e6Michael Speer bcopy(mac_addr, (uint8_t *)&addrp, ETHERADDRL);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Remove the mac address for the group
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_m_mmac_remove(nxge, slot)) != 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)gdriver;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng ASSERT(group->nxgep->nxge_mac_state == NXGE_MAC_STARTED);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if (group->nxgep->nxge_mac_state != NXGE_MAC_STARTED)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng dev_gindex = group->nxgep->pt_config.hw_config.def_mac_rxdma_grpid +
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer rdc_grp_p = &group->nxgep->pt_config.rdc_grps[dev_gindex];
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Get an rdc table for this group.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Group ID is given by the caller, and that's the group it needs
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * to bind to. The default group is already bound when the driver
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * was attached.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For Group 0, it's RDC table was allocated at attach time
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * no need to allocate a new table.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rdctbl = group->nxgep->pt_config.hw_config.def_mac_rxdma_grpid;
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer (void) nxge_init_fzc_rdc_tbl(group->nxgep, rdc_grp_p, rdctbl);
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)gdriver;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Unbind the RDC table previously bound for this group.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Since RDC table for group 0 was allocated at attach
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * time, no need to unbind the table here.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng (void) nxge_fzc_rdc_tbl_unbind(group->nxgep, group->rdctbl);
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_group_get(void *arg, mac_ring_type_t type, int groupid,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->sindex = 0; /* not yet bound to a share */
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxgep->pt_config.hw_config.def_mac_rxdma_grpid +
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna if (nxgep->pt_config.hw_config.def_mac_rxdma_grpid ==
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna nxgep->pt_config.rdc_grps[dev_gindex].max_rdcs;
63f531d1cf94e7ff3e74e15ca709808d96e239f3Sriharsha Basavapatna infop->mgi_count = NXGE_HIO_SHARE_MAX_CHANNELS;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * 'groupid' for TX should be incremented by one since
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * the default group (groupid 0) is not known by the MAC layer
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng group->sindex = 0; /* not yet bound to a share */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* no rings associated with group initially */
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Ask the Hypervisor to set up the VR for us
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu if ((hv_rv = (*fp->assign)(vr->region, cookie, &vr->cookie))) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_share_assign: major %d "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu (nxge->niu_cfg_hdl, vr->region, cookie, &vr->cookie))) {
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_share_assign: major %d "
4df55fde49134f9735f84011f23a767c75e393c7Janie Lu "nxge_hio_share_assign: major %d "
678453a8ed49104d8adad58f3ba591bdc39883e8speer * For each shared TDC, ask the HV to find us an empty slot.
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_MAX_TDCS; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_assign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "tx->assign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Inform the caller about the slot chosen. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer * For each shared RDC, ask the HV to find us an empty slot.
678453a8ed49104d8adad58f3ba591bdc39883e8speer for (i = 0; i < NXGE_MAX_RDCS; i++) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_assign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "rx->assign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Inform the caller about the slot chosen. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_unassign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "tx->unassign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_unassign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "rx->unassign(%x, %d) failed: %ld",
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (hv_rv != 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_share_unassign: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "vr->assign(%x) failed: %ld",
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_alloc(void *arg, mac_share_handle_t *shandle)
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr; /* The Virtualization Region */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nhd->hio.vr.assign == 0 || nhd->hio.tx.assign == 0 ||
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, HIO_CTL, "HV assign function(s) NULL"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Get a VR.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->tmap = shp->rmap = 0; /* to be assigned by ms_sbind */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng shp->rxgroup = 0; /* to be assigned by ms_sadd */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_share"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Clear internal handle state.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Free VR resource.
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_query(mac_share_handle_t shandle, mac_ring_type_t type,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * In version 1.0, we may only give a VR 2 RDCs/TDCs. Not only that,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * but the HV has statically assigned the channels like so:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR0: RDC0 & RDC1
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR1: RDC2 & RDC3, etc.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * The TDCs are assigned in exactly the same way.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rings[0] = rh[(shp->index * 2) - offset].ring_handle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rings[1] = rh[(shp->index * 2 + 1) - offset].ring_handle;
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_add_group(mac_share_handle_t shandle,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *rg = (nxge_ring_group_t *)ghandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr; /* The Virtualization Region */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* the group is already bound to a share */
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * If we are adding a group 0 to a share, this
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * is not correct.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Make sure that the group has the right rings associated
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * for the share. In version 1.0, we may only give a VR
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * 2 RDCs. Not only that, but the HV has statically
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * assigned the channels like so:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR0: RDC0 & RDC1
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR1: RDC2 & RDC3, etc.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* a share can have at most 2 rings */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_RDCS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * A group with invalid rings was
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * attempted to bind to this share
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Make sure that the group has the right rings associated
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * for the share. In version 1.0, we may only give a VR
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * 2 TDCs. Not only that, but the HV has statically
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * assigned the channels like so:
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR0: TDC0 & TDC1
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * VR1: TDC2 & TDC3, etc.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* a share can have at most 2 rings */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < NXGE_MAX_TDCS; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * A group with invalid rings was
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * attempted to bind to this share
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng vr->tdc_tbl = nxge->pt_config.hw_config.def_mac_txdma_grpid +
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_rem_group(mac_share_handle_t shandle,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_ring_group_t *group = (nxge_ring_group_t *)ghandle;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_vr_t *vr; /* The Virtualization Region */
da14cebe459d3275048785f25bd869cb09b5307fEric Chengnxge_hio_share_bind(mac_share_handle_t shandle, uint64_t cookie,
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Add resources to the share.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For each DMA channel associated with the VR, bind its resources
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * to the VR.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rv = nxge_hio_addres(vr, MAC_RING_TYPE_TX, &tmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (rv != 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng rv = nxge_hio_addres(vr, MAC_RING_TYPE_RX, &rmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (rv != 0) {
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(vr, MAC_RING_TYPE_TX, tmap);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * Ask the Hypervisor to set up the VR and allocate slots for
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * each rings associated with the VR.
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(vr, MAC_RING_TYPE_TX, tmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* high 32 bits are cfg_hdl and low 32 bits are HV cookie */
678453a8ed49104d8adad58f3ba591bdc39883e8speer *rcookie = (((uint64_t)nxge->niu_cfg_hdl) << 32) | vr->cookie;
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_share_handle_t *shp = (nxge_share_handle_t *)shandle;
678453a8ed49104d8adad58f3ba591bdc39883e8speer * First, unassign the VR (take it back),
678453a8ed49104d8adad58f3ba591bdc39883e8speer * so we can enable interrupts again.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Free Ring Resources for TX and RX
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(shp->vrp, MAC_RING_TYPE_TX, shp->tmap);
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita nxge_hio_remres(shp->vrp, MAC_RING_TYPE_RX, shp->rmap);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_vr_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Find an unused Virtualization Region (VR).
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_vr_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Find an empty virtual region (VR). */
678453a8ed49104d8adad58f3ba591bdc39883e8speer // FUNC0_VIR0 'belongs' to NIU port 0.
678453a8ed49104d8adad58f3ba591bdc39883e8speer // FUNC2_VIR0 'belongs' to NIU port 1.
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Shares not supported on function(%d) at this time.\n",
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_vr_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_unshare"));
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "vr->nxge is NULL"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This function is no longer called, but I will keep it
678453a8ed49104d8adad58f3ba591bdc39883e8speer * here in case we want to revisit this topic in the future.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_hostinfo_uninit(nxge, vr);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * XXX: This is done by ms_sremove?
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * (void) nxge_fzc_rdc_tbl_unbind(nxge, vr->rdc_tbl);
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_unshare"));
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speernxge_hio_addres(nxge_hio_vr_t *vr, mac_ring_type_t type, uint64_t *map)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_addres"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For each ring associated with the group, add the resources
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * to the group and bind.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng max_dcs = (type == MAC_RING_TYPE_TX) ? NXGE_MAX_TDCS : NXGE_MAX_RDCS;
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* set->group is an array of group indexed by a port group id */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng /* set->group is an array of group indexed by a port group id */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng NXGE_DEBUG_MSG((nxge, HIO_CTL, "There is no rings associated "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "with this VR"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng for (i = 0; i < max_dcs; i++) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng if ((rv = nxge_hio_dc_share(nxge, vr, type, i)) < 0) {
ef523517a9229b22f61e722d44116e21a7a2675aMichael Speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_addres"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer/* ARGSUSED */
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_remres: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "vr->nxge is NULL"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_remres(%lx)", res_map));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * For each ring bound to the group, remove the DMA resources
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * from the group and unbind.
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (type == MAC_RING_TYPE_TX ? &vr->tx_group : &vr->rx_group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_remres: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_remres"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_tdc_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Share an unused TDC channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * A.7.3 Reconfigure Tx DMA channel
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Disable TxDMA A.9.6.10
678453a8ed49104d8adad58f3ba591bdc39883e8speer * [Rebind TxDMA channel to Port A.9.6.7]
678453a8ed49104d8adad58f3ba591bdc39883e8speer * We don't have to Rebind the TDC to the port - it always already bound.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Soft Reset TxDMA A.9.6.2
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This procedure will be executed by nxge_init_txdma_channel() in the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * guest domain:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Re-initialize TxDMA A.9.6.8
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure TxDMA
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable TxDMA A.9.6.9
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
330cd344428055700fc03c465aa794ab0344c63dMichael Speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_tdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Wait until this channel is idle.
22c0d73a5c6cb7149517b8e67999a551350b6698speer (void) atomic_swap_32(&ring->tx_ring_offline, NXGE_TX_RING_OFFLINING);
6895688e5f0e768b4c49108ae73903afa1bd1997speer * Wait for 30 seconds.
6895688e5f0e768b4c49108ae73903afa1bd1997speer if (count == 0) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_tdc_share: "
6895688e5f0e768b4c49108ae73903afa1bd1997speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_remove(nxge, VP_BOUND_TX, channel) != NXGE_OK) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_tdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to remove interrupt for TxDMA channel %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Disable TxDMA A.9.6.10 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* The SD is sharing this channel. */
1d36aa9e69a7104197e5d02717082acf58af358aspeer /* Soft Reset TxDMA A.9.6.2 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the DC-specific FZC control registers.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * -----------------------------------------------------
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_tdc_share: FZC TDC failed: %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_tdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_rdc_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Share an unused RDC channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This is the latest version of the procedure to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure an Rx DMA channel:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * A.6.3 Reconfigure Rx DMA channel
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Stop RxMAC A.9.2.6
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Drain IPP Port A.9.3.6
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Stop and reset RxDMA A.9.5.3
678453a8ed49104d8adad58f3ba591bdc39883e8speer * This procedure will be executed by nxge_init_rxdma_channel() in the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * guest domain:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize RxDMA A.9.5.4
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure RxDMA
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxDMA A.9.5.5
678453a8ed49104d8adad58f3ba591bdc39883e8speer * We will do this here, since the RDC is a canalis non grata:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxMAC A.9.2.10
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_rdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Disable interrupts. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_remove(nxge, VP_BOUND_RX, channel) != NXGE_OK) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to remove interrupt for RxDMA channel %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop RxMAC = A.9.2.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to disable RxMAC"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Drain IPP Port = A.9.3.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop and reset RxDMA = A.9.5.3 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer // De-assert EN: RXDMA_CFIG1[31] = 0 (DMC+00000 )
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_disable_rxdma_channel(nxge, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_share: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* The SD is sharing this channel. */
1d36aa9e69a7104197e5d02717082acf58af358aspeer // Assert RST: RXDMA_CFIG1[30] = 1
678453a8ed49104d8adad58f3ba591bdc39883e8speer * The guest domain will reconfigure the RDC later.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * But in the meantime, we must re-enable the Rx MAC so
678453a8ed49104d8adad58f3ba591bdc39883e8speer * that we can start receiving packets again on the
678453a8ed49104d8adad58f3ba591bdc39883e8speer * remaining RDCs:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxMAC = A.9.2.10
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_rdc_share: Rx MAC still disabled"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize the DC-specific FZC control registers.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * -----------------------------------------------------
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_rdc_share: RZC RDC failed: %ld", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (-EIO);
4ba491f53199ecfd5a928fdce7dc8f8aa9de4b9eMichael Speer * Update the RDC group.
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_rdc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_dc_share
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Share a DMA channel with a guest domain.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * vr The VR that <channel> will belong to.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type Tx or Rx.
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng * channel Channel to share
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_dc_share(%cdc %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* -------------------------------------------------- */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_rdc_unshare(nxge, vr->rdc_tbl, channel);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_tdc_unshare(nxge, vr->tdc_tbl, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Tag this channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * --------------------------------------------------
678453a8ed49104d8adad58f3ba591bdc39883e8speer dc = type == MAC_RING_TYPE_TX ? &nhd->tdc[channel] : &nhd->rdc[channel];
678453a8ed49104d8adad58f3ba591bdc39883e8speer * vr->[t|r]x_group is used by the service domain to
678453a8ed49104d8adad58f3ba591bdc39883e8speer * keep track of its shared DMA channels.
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (type == MAC_RING_TYPE_TX ? &vr->tx_group : &vr->rx_group);
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Initialize <group>, if necessary */
678453a8ed49104d8adad58f3ba591bdc39883e8speer "DC share: %cDC %d was assigned to slot %d",
678453a8ed49104d8adad58f3ba591bdc39883e8speer type == MAC_RING_TYPE_TX ? 'T' : 'R', channel, slot));
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_dc_share"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer return (0);
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_tdc_unshare
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unshare a TDC.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The channel to unshare (add again).
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_tdc_unshare"));
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng grpid = dev_grpid - nxge->pt_config.hw_config.def_mac_txdma_grpid;
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita if ((nxge_grp_dc_add(nxge, group, VP_BOUND_TX, channel))) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_tdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Re-add this interrupt. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_add(nxge, VP_BOUND_TX, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_tdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to add interrupt for TxDMA channel %d", channel));
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_tdc_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_rdc_unshare
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unshare an RDC: add it to the SD's RDC groups (tables).
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The channel to unshare (add again).
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_rdc_unshare"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop RxMAC = A.9.2.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer "Failed to disable RxMAC"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Drain IPP Port = A.9.3.6 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Stop and reset RxDMA = A.9.5.3 */
678453a8ed49104d8adad58f3ba591bdc39883e8speer // De-assert EN: RXDMA_CFIG1[31] = 0 (DMC+00000 )
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_disable_rxdma_channel(nxge, channel) != NXGE_OK) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_unshare: "
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng grpid = dev_grpid - nxge->pt_config.hw_config.def_mac_rxdma_grpid;
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Assert RST: RXDMA_CFIG1[30] = 1
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Initialize RxDMA A.9.5.4
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Reconfigure RxDMA
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxDMA A.9.5.5
6920a987a5562b1b71bcf972b76b8534eccd7b96Misaki Miyashita if ((nxge_grp_dc_add(nxge, group, VP_BOUND_RX, channel))) {
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Be sure to re-enable the RX MAC. */
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "nxge_hio_rdc_share: Rx MAC still disabled"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_ERROR_MSG((nxge, NXGE_ERR_CTL, "nxge_hio_rdc_unshare: "
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Enable RxMAC = A.9.2.10
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng "nxge_hio_rdc_share: Rx MAC still disabled"));
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Re-add this interrupt. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer if (nxge_intr_add(nxge, VP_BOUND_RX, channel) != NXGE_OK) {
e11f08147bbd4f6060125c2163dc2493ca18b82fMichael Speer "nxge_hio_rdc_unshare: Failed to add interrupt for "
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_rdc_unshare"));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer for (i = 0; i < NXGE_MAX_RDCS; i++) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer if (nxge->rx_ring_handles[i].channel == channel) {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer (mac_ring_driver_t)&nxge->rx_ring_handles[i],
678453a8ed49104d8adad58f3ba591bdc39883e8speer * nxge_hio_dc_unshare
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Unshare (reuse) a DMA channel.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Arguments:
678453a8ed49104d8adad58f3ba591bdc39883e8speer * vr The VR that <channel> belongs to.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * type Tx or Rx.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * channel The DMA channel to reuse.
678453a8ed49104d8adad58f3ba591bdc39883e8speer * Service domain
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "==> nxge_hio_dc_unshare(%cdc %d)",
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* Unlink the channel from its group. */
678453a8ed49104d8adad58f3ba591bdc39883e8speer /* -------------------------------------------------- */
678453a8ed49104d8adad58f3ba591bdc39883e8speer group = (type == MAC_RING_TYPE_TX) ? &vr->tx_group : &vr->rx_group;
678453a8ed49104d8adad58f3ba591bdc39883e8speer if ((dc = nxge_grp_dc_unlink(nxge, group, channel)) == 0) {
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_rdc_unshare(nxge, vr->rdc_tbl, channel);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng nxge_hio_tdc_unshare(nxge, vr->tdc_tbl, channel);
678453a8ed49104d8adad58f3ba591bdc39883e8speer NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_hio_dc_unshare"));
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * nxge_hio_rxdma_bind_intr():
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * For the guest domain driver, need to bind the interrupt group
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * and state to the rx_rcr_ring_t.
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Drouxnxge_hio_rxdma_bind_intr(nxge_t *nxge, rx_rcr_ring_t *ring, int channel)
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * Find the DMA channel.
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux if (!(dc = nxge_grp_dc_find(nxge, VP_BOUND_RX, channel))) {
08ac1c49adeb1b81324fa4e70a922581ad7ec309Nicolas Droux * Get the control structure.
678453a8ed49104d8adad58f3ba591bdc39883e8speer#endif /* if defined(sun4v) */