]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[thunderx] Retrieve base MAC address via EFI_THUNDER_CONFIG_PROTOCOL
authorMichael Brown <mcb30@ipxe.org>
Mon, 13 Jun 2016 17:41:33 +0000 (18:41 +0100)
committerMichael Brown <mcb30@ipxe.org>
Sat, 18 Jun 2016 18:28:38 +0000 (19:28 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/drivers/net/thunderx.c
src/drivers/net/thunderxcfg.h [new file with mode: 0644]

index 63aa23ef09a3c95376d8da4d5fbc8f5c25f0bc3c..306adc459db6d60f734c0c4657d8e6ebffb49ab0 100644 (file)
@@ -40,6 +40,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <ipxe/pciea.h>
 #include <ipxe/umalloc.h>
 #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 (file)
index 0000000..6611758
--- /dev/null
@@ -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 <ipxe/efi/efi.h>
+
+/******************************************************************************
+ *
+ * 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.<BR>
+ *
+ *  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 */