16495Sspeer /* 26495Sspeer * CDDL HEADER START 36495Sspeer * 46495Sspeer * The contents of this file are subject to the terms of the 56495Sspeer * Common Development and Distribution License (the "License"). 66495Sspeer * You may not use this file except in compliance with the License. 76495Sspeer * 86495Sspeer * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96495Sspeer * or http://www.opensolaris.org/os/licensing. 106495Sspeer * See the License for the specific language governing permissions 116495Sspeer * and limitations under the License. 126495Sspeer * 136495Sspeer * When distributing Covered Code, include this CDDL HEADER in each 146495Sspeer * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156495Sspeer * If applicable, add the following below this CDDL HEADER, with the 166495Sspeer * fields enclosed by brackets "[]" replaced with your own identifying 176495Sspeer * information: Portions Copyright [yyyy] [name of copyright owner] 186495Sspeer * 196495Sspeer * CDDL HEADER END 206495Sspeer */ 216495Sspeer 226495Sspeer /* 23*11878SVenu.Iyer@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 246495Sspeer * Use is subject to license terms. 256495Sspeer */ 266495Sspeer 276495Sspeer #ifndef _SYS_NXGE_NXGE_HIO_H 286495Sspeer #define _SYS_NXGE_NXGE_HIO_H 296495Sspeer 306495Sspeer #ifdef __cplusplus 316495Sspeer extern "C" { 326495Sspeer #endif 336495Sspeer 346495Sspeer #include <nxge_mac.h> 356495Sspeer #include <nxge_ipp.h> 366495Sspeer #include <nxge_fflp.h> 378275SEric Cheng #include <sys/mac_provider.h> 386495Sspeer 396495Sspeer #define isLDOMservice(nxge) \ 406495Sspeer (nxge->environs == SOLARIS_SERVICE_DOMAIN) 416495Sspeer #define isLDOMguest(nxge) \ 426495Sspeer (nxge->environs == SOLARIS_GUEST_DOMAIN) 436495Sspeer #define isLDOMs(nxge) \ 446495Sspeer (isLDOMservice(nxge) || isLDOMguest(nxge)) 456495Sspeer 4610309SSriharsha.Basavapatna@Sun.COM #define NXGE_HIO_SHARE_MIN_CHANNELS 2 4710309SSriharsha.Basavapatna@Sun.COM #define NXGE_HIO_SHARE_MAX_CHANNELS 2 4810309SSriharsha.Basavapatna@Sun.COM 496495Sspeer /* ------------------------------------------------------------------ */ 506495Sspeer typedef uint8_t nx_rdc_t; 516495Sspeer typedef uint8_t nx_tdc_t; 526495Sspeer 536495Sspeer typedef uint64_t res_map_t; 546495Sspeer 556495Sspeer typedef uint64_t hv_rv_t; 566495Sspeer 576495Sspeer typedef hv_rv_t (*vr_assign)(uint64_t, uint64_t, uint32_t *); 586495Sspeer typedef hv_rv_t (*vr_unassign)(uint32_t); 596495Sspeer typedef hv_rv_t (*vr_getinfo)(uint32_t, uint64_t *, uint64_t *); 606495Sspeer 6111304SJanie.Lu@Sun.COM /* HV 2.0 API group functions */ 6211304SJanie.Lu@Sun.COM typedef hv_rv_t (*vr_cfgh_assign)(uint64_t, uint64_t, uint64_t, uint32_t *); 6311304SJanie.Lu@Sun.COM typedef hv_rv_t (*vrlp_cfgh_conf)(uint64_t, uint64_t, uint64_t, uint64_t, 6411304SJanie.Lu@Sun.COM uint64_t); 6511304SJanie.Lu@Sun.COM typedef hv_rv_t (*vrlp_cfgh_info)(uint64_t, uint64_t, uint64_t, uint64_t *, 6611304SJanie.Lu@Sun.COM uint64_t *); 6711304SJanie.Lu@Sun.COM 686495Sspeer 696495Sspeer typedef struct { 7011304SJanie.Lu@Sun.COM vr_assign assign; /* HV Major 1 interface */ 7111304SJanie.Lu@Sun.COM vr_cfgh_assign cfgh_assign; /* HV Major 2 interface */ 726495Sspeer vr_unassign unassign; 736495Sspeer vr_getinfo getinfo; 746495Sspeer } nxhv_vr_fp_t; 756495Sspeer 766495Sspeer typedef hv_rv_t (*vrlp_conf)(uint64_t, uint64_t, uint64_t, uint64_t); 776495Sspeer typedef hv_rv_t (*vrlp_info)(uint64_t, uint64_t, uint64_t *, uint64_t *); 786495Sspeer 796495Sspeer typedef hv_rv_t (*dc_assign)(uint32_t, uint64_t, uint64_t *); 806495Sspeer typedef hv_rv_t (*dc_unassign)(uint32_t, uint64_t); 816495Sspeer typedef hv_rv_t (*dc_getstate)(uint32_t, uint64_t, uint64_t *); 826495Sspeer typedef hv_rv_t (*dc_get_map)(uint32_t, uint64_t *); 836495Sspeer 846495Sspeer typedef hv_rv_t (*dc_getinfo)(uint32_t, uint64_t, uint64_t *, uint64_t *); 856495Sspeer 866495Sspeer typedef struct { 876495Sspeer dc_assign assign; 886495Sspeer dc_unassign unassign; 896495Sspeer dc_getstate getstate; 906495Sspeer dc_get_map get_map; 916495Sspeer 9211304SJanie.Lu@Sun.COM vrlp_conf lp_conf; /* HV Major 1 interface */ 9311304SJanie.Lu@Sun.COM vrlp_info lp_info; /* HV Major 1 interface */ 9411304SJanie.Lu@Sun.COM vrlp_cfgh_conf lp_cfgh_conf; /* HV Major 2 interface */ 9511304SJanie.Lu@Sun.COM vrlp_cfgh_info lp_cfgh_info; /* HV Major 2 interface */ 966495Sspeer dc_getinfo getinfo; 976495Sspeer } nxhv_dc_fp_t; 986495Sspeer 996495Sspeer typedef struct { 1006495Sspeer boolean_t ldoms; 1016495Sspeer nxhv_vr_fp_t vr; 1026495Sspeer nxhv_dc_fp_t tx; 1036495Sspeer nxhv_dc_fp_t rx; 1046495Sspeer } nxhv_fp_t; 1056495Sspeer 1066495Sspeer /* ------------------------------------------------------------------ */ 1076495Sspeer #define NXGE_VR_SR_MAX 8 /* There are 8 subregions (SR). */ 1086495Sspeer 1096495Sspeer typedef enum { 11010577SMichael.Speer@Sun.COM NXGE_HIO_TYPE_SERVICE = 0x80, /* We are a service domain driver. */ 11110577SMichael.Speer@Sun.COM NXGE_HIO_TYPE_GUEST /* We are a guest domain driver. */ 1126495Sspeer } nxge_hio_type_t; 1136495Sspeer 1146495Sspeer typedef enum { 1156495Sspeer FUNC0_MNT, 1166495Sspeer FUNC0_VIR = 0x1000000, 1176495Sspeer FUNC1_MNT = 0x2000000, 1186495Sspeer FUNC1_VIR = 0x3000000, 1196495Sspeer FUNC2_MNT = 0x4000000, 1206495Sspeer FUNC2_VIR = 0x5000000, 1216495Sspeer FUNC3_MNT = 0x6000000, 1226495Sspeer FUNC3_VIR = 0x7000000 1236495Sspeer } vr_base_address_t; 1246495Sspeer 1256495Sspeer #define VR_STEP 0x2000000 1266495Sspeer #define VR_VC_STEP 0x0004000 1276495Sspeer 1286495Sspeer typedef enum { /* 0-8 */ 1296495Sspeer FUNC0_VIR0, 1306495Sspeer FUNC0_VIR1, 1316495Sspeer FUNC1_VIR0, 1326495Sspeer FUNC1_VIR1, 1336495Sspeer FUNC2_VIR0, 1346495Sspeer FUNC2_VIR1, 1356495Sspeer FUNC3_VIR0, 1366495Sspeer FUNC3_VIR1, 1376495Sspeer FUNC_VIR_MAX 1386495Sspeer } vr_region_t; 1396495Sspeer 1406495Sspeer typedef enum { 1416495Sspeer VP_CHANNEL_0, 1426495Sspeer VP_CHANNEL_1, 1436495Sspeer VP_CHANNEL_2, 1446495Sspeer VP_CHANNEL_3, 1456495Sspeer VP_CHANNEL_4, 1466495Sspeer VP_CHANNEL_5, 1476495Sspeer VP_CHANNEL_6, 1486495Sspeer VP_CHANNEL_7, 1496495Sspeer VP_CHANNEL_MAX 1506495Sspeer } vp_channel_t; 1516495Sspeer 1526495Sspeer typedef enum { 1537950SMichael.Speer@Sun.COM VP_BOUND_TX = 1, 1546495Sspeer VP_BOUND_RX 1556495Sspeer } vpc_type_t; 1566495Sspeer 1576495Sspeer #define VP_VC_OFFSET(channel) (channel << 10) 1586495Sspeer #define VP_RDC_OFFSET (1 << 9) 1596495Sspeer 1606495Sspeer typedef enum { 1616495Sspeer RXDMA_CFIG1 = 0, 1626495Sspeer RXDMA_CFIG2 = 8, 1636495Sspeer RBR_CFIG_A = 0x10, 1646495Sspeer RBR_CFIG_B = 0x18, 1656495Sspeer RBR_KICK = 0x20, 1666495Sspeer RBR_STAT = 0x28, 1676495Sspeer RBR_HDH = 0x30, 1686495Sspeer RBR_HDL = 0x38, 1696495Sspeer RCRCFIG_A = 0x40, 1706495Sspeer RCRCFIG_B = 0x48, 1716495Sspeer RCRSTAT_A = 0x50, 1726495Sspeer RCRSTAT_B = 0x58, 1736495Sspeer RCRSTAT_C = 0x60, 1746495Sspeer RX_DMA_ENT_MSK = 0x68, 1756495Sspeer RX_DMA_CTL_STAT = 0x70, 1766495Sspeer RCR_FLSH = 0x78, 1776495Sspeer RXMISC = 0x90, 1786495Sspeer RX_DMA_CTL_STAT_DBG = 0x98 1796495Sspeer 1806495Sspeer } rdc_csr_offset_t; 1816495Sspeer 1826495Sspeer typedef enum { 1836495Sspeer Tx_RNG_CFIG = 0, 1846495Sspeer Tx_RNG_HDL = 0x10, 1856495Sspeer Tx_RNG_KICK = 0x18, 1866495Sspeer Tx_ENT_MASK = 0x20, 1876495Sspeer Tx_CS = 0x28, 1886495Sspeer TxDMA_MBH = 0x30, 1896495Sspeer TxDMA_MBL = 0x38, 1906495Sspeer TxDMA_PRE_ST = 0x40, 1916495Sspeer Tx_RNG_ERR_LOGH = 0x48, 1926495Sspeer Tx_RNG_ERR_LOGL = 0x50, 1936495Sspeer TDMC_INTR_DBG = 0x60, 1946495Sspeer Tx_CS_DBG = 0x68 1956495Sspeer 1966495Sspeer } tdc_csr_offset_t; 1976495Sspeer 1986495Sspeer /* 1996495Sspeer * ------------------------------------------------------------- 2006495Sspeer * These definitions are used to handle the virtual PIO_LDSV 2016495Sspeer * space of a VR. 2026495Sspeer * ------------------------------------------------------------- 2036495Sspeer */ 2046495Sspeer #define VLDG_OFFSET 0x2000 2056495Sspeer #define VLDG_SLL 5 2066495Sspeer 2076495Sspeer typedef enum { 2086495Sspeer PIO_LDSV0, /* ldf_0, 0-63 */ 2096495Sspeer PIO_LDSV1, /* ldf_1, 0-63 */ 2106495Sspeer PIO_LDSV2, /* ldf_0 & ldf_1, 64-69 */ 2116495Sspeer PIO_LDGIMGN /* arm/timer */ 2126495Sspeer 2136495Sspeer } pio_ld_op_t; 2146495Sspeer 2156495Sspeer #define VR_INTR_BLOCK_SIZE 8 2166495Sspeer #define HIO_INTR_BLOCK_SIZE 4 2176495Sspeer 2186495Sspeer /* ------------------------------------------------------------------ */ 2196495Sspeer typedef struct { 2206495Sspeer const char *name; 2216495Sspeer int offset; 2226495Sspeer } dmc_reg_name_t; 2236495Sspeer 2246495Sspeer typedef struct { 2256495Sspeer uintptr_t nxge; 2266495Sspeer dc_map_t map; 2276495Sspeer 2286495Sspeer } nx_rdc_tbl_t; 2296495Sspeer 2306495Sspeer typedef struct nxge_hio_vr { 2316495Sspeer uintptr_t nxge; 2326495Sspeer 2336495Sspeer uint32_t cookie; /* The HV cookie. */ 2346495Sspeer uintptr_t address; 2356495Sspeer size_t size; 2366495Sspeer vr_region_t region; /* 1 of 8 regions. */ 2376495Sspeer 2388275SEric Cheng int rdc_tbl; /* 1 of 8 RDC tables. */ 2398275SEric Cheng int tdc_tbl; /* 1 of 8 TDC tables. */ 2406495Sspeer ether_addr_t altmac; /* The alternate MAC address. */ 2418275SEric Cheng int slot; /* According to nxge_m_mmac_add(). */ 2426495Sspeer 2436495Sspeer nxge_grp_t rx_group; 2446495Sspeer nxge_grp_t tx_group; 2456495Sspeer 2466495Sspeer } nxge_hio_vr_t; 2476495Sspeer 2486495Sspeer typedef nxge_status_t (*dc_init_t)(nxge_t *, int); 2496495Sspeer typedef void (*dc_uninit_t)(nxge_t *, int); 2506495Sspeer 2516495Sspeer typedef struct { 2526495Sspeer uint32_t number; /* The LDG number assigned to this DC. */ 2536495Sspeer uint64_t index; /* Bits 7:5 of the (virtual) PIO_LDSV. */ 2546495Sspeer 2556495Sspeer uint64_t ldsv; /* The logical device number */ 2566495Sspeer uint64_t map; /* Currently unused */ 2576495Sspeer 2586495Sspeer int vector; /* The DDI vector number (index) */ 2596495Sspeer } hio_ldg_t; 2606495Sspeer 2616495Sspeer /* 2626495Sspeer * ------------------------------------------------------------- 2636495Sspeer * The service domain driver makes use of both <index>, the index 2646495Sspeer * into a VR's virtual page, and <channel>, the absolute channel 2656495Sspeer * number, what we will call here the physical channel number. 2666495Sspeer * 2676495Sspeer * The guest domain will set both fields to the same value, since 2686495Sspeer * it doesn't know any better. And if a service domain owns a 2696495Sspeer * DMA channel, it will also set both fields to the same value, 2706495Sspeer * since it is not using a VR per se. 2716495Sspeer * ------------------------------------------------------------- 2726495Sspeer */ 2736495Sspeer typedef struct nx_dc { 2746495Sspeer 2756495Sspeer struct nx_dc *next; 2766495Sspeer 2776495Sspeer nxge_hio_vr_t *vr; /* The VR belonged to. */ 2786495Sspeer 2796495Sspeer vp_channel_t page; /* VP_CHANNEL_0 - VP_CHANNEL_7 */ 2806495Sspeer nxge_channel_t channel; /* 1 of 16/24 channels */ 2816495Sspeer /* 2826495Sspeer * <channel> has its normal meaning. <page> refers to the 2836495Sspeer * virtual page of the VR that <channel> has been bound to. 2846495Sspeer * Therefore, in the service domain, <page> & <channel> 2856495Sspeer * are almost always different. While in a guest domain, 2866495Sspeer * they are always the same. 2876495Sspeer */ 2886495Sspeer vpc_type_t type; /* VP_BOUND_XX */ 2896495Sspeer dc_init_t init; /* nxge_init_xxdma_channel() */ 2906495Sspeer dc_uninit_t uninit; /* nxge_uninit_xxdma_channel() */ 2916495Sspeer 2927755SMisaki.Kataoka@Sun.COM nxge_grp_t *group; /* The group belonged to. */ 2936495Sspeer uint32_t cookie; /* The HV cookie. */ 2946495Sspeer 2956495Sspeer hio_ldg_t ldg; 2966495Sspeer boolean_t interrupting; /* Interrupt enabled? */ 2976495Sspeer 2986495Sspeer } nxge_hio_dc_t; 2996495Sspeer 3006495Sspeer typedef struct { 3016495Sspeer nxge_hio_type_t type; 3026495Sspeer 3036495Sspeer kmutex_t lock; 3047755SMisaki.Kataoka@Sun.COM int vrs; 3056495Sspeer unsigned sequence; 3066495Sspeer 3076495Sspeer nxhv_fp_t hio; 3086495Sspeer 3096495Sspeer /* vr[0] is reserved for the service domain. */ 3106495Sspeer nxge_hio_vr_t vr[NXGE_VR_SR_MAX]; /* subregion map */ 3116495Sspeer nxge_hio_dc_t rdc[NXGE_MAX_RDCS]; 3126495Sspeer nxge_hio_dc_t tdc[NXGE_MAX_TDCS]; 3136495Sspeer 3146495Sspeer nx_rdc_tbl_t rdc_tbl[NXGE_MAX_RDC_GROUPS]; 3156495Sspeer 3166495Sspeer } nxge_hio_data_t; 3176495Sspeer 3186495Sspeer /* 3196495Sspeer * ------------------------------------------------------------- 3206495Sspeer * prototypes 3216495Sspeer * ------------------------------------------------------------- 3226495Sspeer */ 3236495Sspeer extern void nxge_get_environs(nxge_t *); 3246495Sspeer extern int nxge_hio_init(nxge_t *); 3256495Sspeer extern void nxge_hio_uninit(nxge_t *); 3266495Sspeer 3276495Sspeer extern int nxge_dci_map(nxge_t *, vpc_type_t, int); 3286495Sspeer 3296495Sspeer /* 3306495Sspeer * --------------------------------------------------------------------- 3316495Sspeer * These are the general-purpose DMA channel group functions. That is, 3326495Sspeer * these functions are used to manage groups of TDCs or RDCs in an HIO 3336495Sspeer * environment. 3346495Sspeer * 3356495Sspeer * But is also expected that in the future they will be able to manage 3366495Sspeer * Crossbow groups. 3376495Sspeer * --------------------------------------------------------------------- 3386495Sspeer */ 3397755SMisaki.Kataoka@Sun.COM extern nxge_grp_t *nxge_grp_add(nxge_t *, nxge_grp_type_t); 3407755SMisaki.Kataoka@Sun.COM extern void nxge_grp_remove(nxge_t *, nxge_grp_t *); 3417755SMisaki.Kataoka@Sun.COM extern int nxge_grp_dc_add(nxge_t *, nxge_grp_t *, vpc_type_t, int); 3426495Sspeer extern void nxge_grp_dc_remove(nxge_t *, vpc_type_t, int); 3436495Sspeer extern nxge_hio_dc_t *nxge_grp_dc_find(nxge_t *, vpc_type_t, int); 3446495Sspeer 3456495Sspeer extern void nxge_delay(int); 3466495Sspeer extern const char *nxge_ddi_perror(int); 3476495Sspeer 3486495Sspeer /* 3496495Sspeer * --------------------------------------------------------------------- 3506495Sspeer * These are the Sun4v HIO function prototypes. 3516495Sspeer * --------------------------------------------------------------------- 3526495Sspeer */ 3536495Sspeer extern void nxge_hio_group_get(void *arg, mac_ring_type_t type, int group, 3546495Sspeer mac_group_info_t *infop, mac_group_handle_t ghdl); 3558275SEric Cheng extern int nxge_hio_share_alloc(void *arg, mac_share_handle_t *shandle); 3566495Sspeer extern void nxge_hio_share_free(mac_share_handle_t shandle); 3576495Sspeer extern void nxge_hio_share_query(mac_share_handle_t shandle, 3588275SEric Cheng mac_ring_type_t type, mac_ring_handle_t *rings, uint_t *n_rings); 3598275SEric Cheng extern int nxge_hio_share_add_group(mac_share_handle_t, 3608275SEric Cheng mac_group_driver_t); 3618275SEric Cheng extern int nxge_hio_share_rem_group(mac_share_handle_t, 3628275SEric Cheng mac_group_driver_t); 3638275SEric Cheng extern int nxge_hio_share_bind(mac_share_handle_t, uint64_t cookie, 3648275SEric Cheng uint64_t *rcookie); 3658275SEric Cheng extern void nxge_hio_share_unbind(mac_share_handle_t); 3668400SNicolas.Droux@Sun.COM extern int nxge_hio_rxdma_bind_intr(nxge_t *, rx_rcr_ring_t *, int); 3676495Sspeer 3686495Sspeer /* nxge_hio_guest.c */ 3696495Sspeer extern void nxge_hio_unregister(nxge_t *); 370*11878SVenu.Iyer@Sun.COM extern int nxge_hio_get_dc_htable_idx(nxge_t *nxge, vpc_type_t type, 371*11878SVenu.Iyer@Sun.COM uint32_t channel); 3726495Sspeer 3736495Sspeer extern int nxge_guest_regs_map(nxge_t *); 3746495Sspeer extern void nxge_guest_regs_map_free(nxge_t *); 3756495Sspeer 3766495Sspeer extern int nxge_hio_vr_add(nxge_t *nxge); 3776495Sspeer extern int nxge_hio_vr_release(nxge_t *nxge); 3786495Sspeer 3796495Sspeer extern nxge_status_t nxge_tdc_lp_conf(p_nxge_t, int); 3806495Sspeer extern nxge_status_t nxge_rdc_lp_conf(p_nxge_t, int); 3816495Sspeer 3826495Sspeer extern void nxge_hio_start_timer(nxge_t *); 3836495Sspeer 3846495Sspeer /* nxge_intr.c */ 3856495Sspeer extern nxge_status_t nxge_hio_intr_init(nxge_t *); 3866495Sspeer extern void nxge_hio_intr_uninit(nxge_t *); 3876495Sspeer 3886495Sspeer extern nxge_status_t nxge_intr_add(nxge_t *, vpc_type_t, int); 3896495Sspeer extern nxge_status_t nxge_intr_remove(nxge_t *, vpc_type_t, int); 3906495Sspeer 3916495Sspeer extern nxge_status_t nxge_hio_intr_add(nxge_t *, vpc_type_t, int); 3926495Sspeer extern nxge_status_t nxge_hio_intr_remove(nxge_t *, vpc_type_t, int); 3936495Sspeer 3946495Sspeer extern nxge_status_t nxge_hio_intr_add(nxge_t *, vpc_type_t, int); 3956495Sspeer extern nxge_status_t nxge_hio_intr_rem(nxge_t *, int); 3966495Sspeer 397*11878SVenu.Iyer@Sun.COM extern int nxge_hio_ldsv_add(nxge_t *, nxge_hio_dc_t *); 3986495Sspeer 3996495Sspeer extern void nxge_hio_ldsv_im(nxge_t *, nxge_ldg_t *, pio_ld_op_t, uint64_t *); 4006495Sspeer extern void nxge_hio_ldgimgn(nxge_t *, nxge_ldg_t *); 4016495Sspeer 4026495Sspeer /* nxge_hv.c */ 4036495Sspeer extern void nxge_hio_hv_init(nxge_t *); 4046495Sspeer 4056495Sspeer /* nxge_mac.c */ 4066495Sspeer extern int nxge_hio_hostinfo_get_rdc_table(p_nxge_t); 4076495Sspeer extern int nxge_hio_hostinfo_init(nxge_t *, nxge_hio_vr_t *, ether_addr_t *); 4086495Sspeer extern void nxge_hio_hostinfo_uninit(nxge_t *, nxge_hio_vr_t *); 4096495Sspeer 4106495Sspeer #ifdef __cplusplus 4116495Sspeer } 4126495Sspeer #endif 4136495Sspeer 4146495Sspeer #endif /* _SYS_NXGE_NXGE_HIO_H */ 415