diff --git a/src/drivers/net/thunderx.c b/src/drivers/net/thunderx.c index 63aa23ef0..306adc459 100644 --- a/src/drivers/net/thunderx.c +++ b/src/drivers/net/thunderx.c @@ -40,6 +40,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include "thunderx.h" +#include "thunderxcfg.h" /** @file * @@ -56,6 +57,10 @@ static LIST_HEAD ( txnic_pfs ); /** Debug colour for physical function and BGX messages */ #define TXNICCOL(x) ( &txnic_pfs + (x)->node ) +/** Board configuration protocol */ +static EFI_THUNDER_CONFIG_PROTOCOL *txcfg; +EFI_REQUEST_PROTOCOL ( EFI_THUNDER_CONFIG_PROTOCOL, &txcfg ); + /****************************************************************************** * * Diagnostics @@ -1478,6 +1483,39 @@ static void txnic_bgx_init ( struct txnic_bgx *bgx, unsigned int type ) { writeq ( global_config, ( bgx->regs + BGX_CMR_GLOBAL_CONFIG ) ); } +/** + * Get MAC address + * + * @v lmac Logical MAC + */ +static void txnic_bgx_mac ( struct txnic_lmac *lmac ) { + struct txnic_bgx *bgx = lmac->bgx; + BOARD_CFG *boardcfg; + NODE_CFG *nodecfg; + BGX_CFG *bgxcfg; + LMAC_CFG *lmaccfg; + + /* Extract MAC from Board Configuration protocol, if available */ + if ( txcfg ) { + boardcfg = txcfg->BoardConfig; + nodecfg = &boardcfg->Node[ bgx->node % MAX_NODES ]; + bgxcfg = &nodecfg->BgxCfg[ bgx->idx % BGX_PER_NODE_COUNT ]; + lmaccfg = &bgxcfg->Lmacs[ lmac->idx % LMAC_PER_BGX_COUNT ]; + lmac->mac.be64 = cpu_to_be64 ( lmaccfg->MacAddress ); + } else { + DBGC ( TXNICCOL ( bgx ), "TXNIC %d/%d/%d has no board " + "configuration protocol\n", bgx->node, bgx->idx, + lmac->idx ); + } + + /* Use random MAC address if none available */ + if ( ! lmac->mac.be64 ) { + DBGC ( TXNICCOL ( bgx ), "TXNIC %d/%d/%d has no MAC address\n", + bgx->node, bgx->idx, lmac->idx ); + eth_random_addr ( lmac->mac.raw ); + } +} + /** * Initialise Super PHY Unit (SPU) * @@ -1533,7 +1571,7 @@ static void txnic_bgx_lmac_init ( struct txnic_bgx *bgx, lmac->idx = TXNIC_VNIC_IDX ( bgx->idx, lmac_idx ); /* Set MAC address */ - eth_random_addr ( lmac->mac.raw ); + txnic_bgx_mac ( lmac ); /* Initialise PHY */ txnic_bgx_spu_init ( lmac ); diff --git a/src/drivers/net/thunderxcfg.h b/src/drivers/net/thunderxcfg.h new file mode 100644 index 000000000..661175862 --- /dev/null +++ b/src/drivers/net/thunderxcfg.h @@ -0,0 +1,211 @@ +#ifndef _THUNDERXCFG_H +#define _THUNDERXCFG_H + +/** @file + * + * Cavium ThunderX Board Configuration + * + * The definitions in this section are extracted from BSD-licensed + * (but non-public) portions of ThunderPkg. + * + */ + +FILE_LICENCE ( BSD2 ); + +#include + +/****************************************************************************** + * + * From ThunderxBoardConfig.h + * + ****************************************************************************** + * + * Header file for Cavium ThunderX Board Configurations + * Copyright (c) 2015, Cavium Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#define MAX_NODES 2 +#define CLUSTER_COUNT 3 +#define CORE_PER_CLUSTER_COUNT 16 +#define CORE_COUNT (CLUSTER_COUNT*CORE_PER_CLUSTER_COUNT) +#define BGX_PER_NODE_COUNT 2 +#define LMAC_PER_BGX_COUNT 4 +#define PEM_PER_NODE_COUNT 6 +#define LMC_PER_NODE_COUNT 4 +#define DIMM_PER_LMC_COUNT 2 + +#define THUNDERX_CPU_ID(node, cluster, core) (((node) << 16) | ((cluster) << 8) | (core)) + +//TODO: Put common type definitions in separate common include file +typedef enum { + BGX_MODE_SGMII, /* 1 lane, 1.250 Gbaud */ + BGX_MODE_XAUI, /* 4 lanes, 3.125 Gbaud */ + BGX_MODE_DXAUI, /* 4 lanes, 6.250 Gbaud */ + BGX_MODE_RXAUI, /* 2 lanes, 6.250 Gbaud */ + BGX_MODE_XFI, /* 1 lane, 10.3125 Gbaud */ + BGX_MODE_XLAUI, /* 4 lanes, 10.3125 Gbaud */ + BGX_MODE_10G_KR,/* 1 lane, 10.3125 Gbaud */ + BGX_MODE_40G_KR,/* 4 lanes, 10.3125 Gbaud */ + BGX_MODE_UNKNOWN +} BGX_MODE_T; + +typedef enum { + EBB8800, + EBB8804, + CRB_1S, + CRB_2S, + ASIANCAT, + GBT_MT60, + INVENTEC_P3E003, + BOARD_MAX +} BOARD_TYPE; + +typedef struct { + BOOLEAN Enabled; + UINT64 LaneToSds; + UINT64 MacAddress; +} LMAC_CFG; + +typedef struct { + BOOLEAN BgxEnabled; + BGX_MODE_T BgxMode; + UINTN LmacCount; //Maximum number of LMAcs + UINT64 BaseAddress; + UINT64 LmacType; + /* Bit mask of QLMs connected to this BGX */ + UINT64 QlmMask; + UINT64 QlmFreq; + BOOLEAN UseTraining; + LMAC_CFG Lmacs[LMAC_PER_BGX_COUNT]; +} BGX_CFG; + +typedef struct { + BOOLEAN PemUsable; +} PEM_CFG; + +typedef struct { + enum { NotPresent, Empty, Available } Status; + UINT8 Type; + UINT8 SubType; + UINT8 Rank; + UINT16 Mfg; + UINTN SizeMb; + UINTN Speed; + CHAR8 Serial[16]; + CHAR8 PartNo[24]; +} DIMM_CFG; + +typedef struct { + DIMM_CFG DimmCfg[DIMM_PER_LMC_COUNT]; +} LMC_CFG; + +typedef struct { + BOOLEAN Core[CORE_COUNT]; + BGX_CFG BgxCfg[BGX_PER_NODE_COUNT]; + PEM_CFG PemCfg[PEM_PER_NODE_COUNT]; + LMC_CFG LmcCfg[LMC_PER_NODE_COUNT]; + UINT64 RamStart; + UINT64 RamReserve; + UINT64 RamSize; + UINTN CPUSpeed; + UINTN CPUVersion; +} NODE_CFG; + +#define MAX_SERIAL 32 +#define MAX_REVISION 32 +typedef struct { + BOARD_TYPE BoardType; + CHAR8 Serial[MAX_SERIAL]; + CHAR8 Revision[MAX_REVISION]; + UINTN NumNodes; + UINTN BmcBootTwsiBus; + UINTN BmcBootTwsiAddr; + UINTN RtcTwsiBus; + UINTN RtcTwsiAddr; + /* IPMI support*/ + UINTN BmcIpmiTwsiBus; + UINTN BmcIpmiTwsiAddr; + NODE_CFG Node[MAX_NODES]; + UINT16 CpuClusterCount; + UINT16 CpuPerClusterCount; + UINT16 PcieSegmentCount; + UINT64 MacAddrRangeStart; + UINTN DdrSpeed; + UINT64 AcpiOemTableId; +} BOARD_CFG; + +/****************************************************************************** + * + * From ThunderConfigProtocol.h + * + ****************************************************************************** + * + * Thunder board Configuration Protocol + * + * Copyright (c) 2015, Cavium Inc. All rights reserved.
+ * + * This program and the accompanying materials are licensed and made + * available under the terms and conditions of the BSD License which + * accompanies this distribution. The full text of the license may + * be found at http://opensource.org/licenses/bsd-license.php + * + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" + * BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER + * EXPRESS OR IMPLIED. + * + */ + +#define EFI_THUNDER_CONFIG_PROTOCOL_GUID \ + {0xb75a0608, 0x99ff, 0x11e5, {0x9b, 0xeb, 0x00, 0x14, 0xd1, 0xfa, 0x23, 0x5c}} + +/// +/// Forward declaration +/// +typedef struct _EFI_THUNDER_CONFIG_PROTOCOL EFI_THUNDER_CONFIG_PROTOCOL; + +/// +/// Function prototypes +/// +typedef +EFI_STATUS +(EFIAPI *EFI_THUNDER_CONFIG_PROTOCOL_GET_CONFIG)( + IN EFI_THUNDER_CONFIG_PROTOCOL *This, + OUT BOARD_CFG** cfg + ); + +/// +/// Protocol structure +/// +typedef struct _EFI_THUNDER_CONFIG_PROTOCOL { + EFI_THUNDER_CONFIG_PROTOCOL_GET_CONFIG GetConfig; + BOARD_CFG* BoardConfig; +} EFI_THUNDER_CONFIG_PROTOCOL; + +#endif /* _THUNDERXCFG_H */