Blame include/elf/nfp.h

Packit bbfece
/* NFP ELF support for BFD.
Packit bbfece
   Copyright (C) 2017-2018 Free Software Foundation, Inc.
Packit bbfece
   Contributed by Francois H. Theron <francois.theron@netronome.com>
Packit bbfece
Packit bbfece
   This file is part of BFD, the Binary File Descriptor library.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify
Packit bbfece
   it under the terms of the GNU General Public License as published by
Packit bbfece
   the Free Software Foundation; either version 3 of the License, or
Packit bbfece
   (at your option) any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit bbfece
   GNU General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU General Public License
Packit bbfece
   along with this program; if not, write to the Free Software Foundation,
Packit bbfece
   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
Packit bbfece
Packit bbfece
#ifndef _ELF_NFP_H
Packit bbfece
#define _ELF_NFP_H
Packit bbfece
Packit bbfece
#include "bfd.h"
Packit bbfece
#include "elf/common.h"
Packit bbfece
#include "elf/reloc-macros.h"
Packit bbfece
#include "bfd_stdint.h"
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
extern "C"
Packit bbfece
{
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#define ET_NFP_PARTIAL_REL (ET_LOPROC + ET_REL)
Packit bbfece
#define ET_NFP_PARTIAL_EXEC (ET_LOPROC + ET_EXEC)
Packit bbfece
Packit bbfece
/* NFP e_flags - chip family
Packit bbfece
   Valid values for FAMILY are:
Packit bbfece
   0x3200 - NFP-32xx
Packit bbfece
   0x6000 - NFP-6xxx/NFP-4xxx.  */
Packit bbfece
#define EF_NFP_MACH(ef_nfp)        (((ef_nfp) >> 8) & 0xFFFF)
Packit bbfece
#define EF_NFP_SET_MACH(nfp_fam)   (((nfp_fam) & 0xFFFF) << 8)
Packit bbfece
Packit bbfece
#define E_NFP_MACH_3200	0x3200
Packit bbfece
#define E_NFP_MACH_6000	0x6000
Packit bbfece
Packit bbfece
#define NFP_3200_CPPTGT_MSF0     1
Packit bbfece
#define NFP_3200_CPPTGT_QDR      2
Packit bbfece
#define NFP_3200_CPPTGT_MSF1     3
Packit bbfece
#define NFP_3200_CPPTGT_HASH     4
Packit bbfece
#define NFP_3200_CPPTGT_MU       7
Packit bbfece
#define NFP_3200_CPPTGT_GS       8
Packit bbfece
#define NFP_3200_CPPTGT_PCIE     9
Packit bbfece
#define NFP_3200_CPPTGT_ARM     10
Packit bbfece
#define NFP_3200_CPPTGT_CRYPTO  12
Packit bbfece
#define NFP_3200_CPPTGT_CAP     13
Packit bbfece
#define NFP_3200_CPPTGT_CT      14
Packit bbfece
#define NFP_3200_CPPTGT_CLS     15
Packit bbfece
Packit bbfece
#define NFP_6000_CPPTGT_NBI      1
Packit bbfece
#define NFP_6000_CPPTGT_VQDR     2
Packit bbfece
#define NFP_6000_CPPTGT_ILA      6
Packit bbfece
#define NFP_6000_CPPTGT_MU       7
Packit bbfece
#define NFP_6000_CPPTGT_PCIE     9
Packit bbfece
#define NFP_6000_CPPTGT_ARM     10
Packit bbfece
#define NFP_6000_CPPTGT_CRYPTO  12
Packit bbfece
#define NFP_6000_CPPTGT_CTXPB   14
Packit bbfece
#define NFP_6000_CPPTGT_CLS     15
Packit bbfece
Packit bbfece
/* NFP Section types
Packit bbfece
   MECONFIG - NFP-32xx only, ME CSR configurations
Packit bbfece
   INITREG - A generic register initialisation section (chip or ME CSRs/GPRs)
Packit bbfece
   UDEBUG - Legacy-style debug data section.  */
Packit bbfece
#define SHT_NFP_MECONFIG	(SHT_LOPROC + 1)
Packit bbfece
#define SHT_NFP_INITREG		(SHT_LOPROC + 2)
Packit bbfece
#define SHT_NFP_UDEBUG		SHT_LOUSER
Packit bbfece
Packit bbfece
/* NFP SECTION flags
Packit bbfece
     ELF-64 sh_flags is 64-bit, but there is no info on what the upper 32 bits
Packit bbfece
     are expected to be used for, it is not marked reserved either.
Packit bbfece
     We'll use them for NFP-specific flags since we don't use ELF-32.
Packit bbfece
Packit bbfece
   INIT - Sections that are loaded and executed before the final text
Packit bbfece
	  microcode.  Non-code INIT sections are loaded first, then other
Packit bbfece
	  memory secions, then INIT2 sections, then INIT-code sections.
Packit bbfece
   INIT2 - Sections that are loaded before INIT-code sections, used for
Packit bbfece
	   transient configuration before executing INIT-code section
Packit bbfece
	   microcode.
Packit bbfece
   SCS - The number of additional ME codestores being shared with the group's
Packit bbfece
	 base ME of the section, e.g. 0 for no SCS, 1 for dual and 3 for
Packit bbfece
	 quad.  If this is 0 it is possible that stagger-style SCS codestore
Packit bbfece
	 sections are being used.  For stagger-style each section is simply
Packit bbfece
	 loaded directly to the ME it is assigned to.  If these flags are
Packit bbfece
	 used, virtual address space loading will be used - one large section
Packit bbfece
	 loaded to the group's base ME will be packed across shared MEs by
Packit bbfece
	 hardware.  This is not available on all ME versions.
Packit bbfece
Packit bbfece
    NFP_ELF_SHF_GET_SCS (val) returns the number of additional codestores
Packit bbfece
    being shared with the group's base ME, e.g. 0 for no SCS,
Packit bbfece
    1 for dual SCS, 3 for quad SCS.  */
Packit bbfece
Packit bbfece
#define SHF_NFP_INIT		0x80000000
Packit bbfece
#define SHF_NFP_INIT2		0x40000000
Packit bbfece
#define SHF_NFP_SCS(shf)	(((shf) >> 32) & 0xFF)
Packit bbfece
#define SHF_NFP_SET_SCS(v)	(((BFD_HOST_U_64_BIT)((v) & 0xFF)) << 32)
Packit bbfece
Packit bbfece
/* NFP Section Info
Packit bbfece
   For PROGBITS and NOBITS sections:
Packit bbfece
     MEMTYPE - the memory type
Packit bbfece
     DOMAIN - The island ID and ME number where the data will be loaded.
Packit bbfece
	      For NFP-32xx, this is an island number or linear ME number.
Packit bbfece
	      For NFP-6xxx, DOMAIN<15:8> == island ID, DOMAIN<7:0> is 0 based
Packit bbfece
	      ME number (if applicable).
Packit bbfece
   For INITREG sections:
Packit bbfece
     ISLAND - island ID (if it's a ME target, ME numbers are in the
Packit bbfece
	      section data)
Packit bbfece
     CPPTGT - CPP Target ID
Packit bbfece
     CPPACTRD - CPP Read Action
Packit bbfece
     CPPTOKRD - CPP Read Token
Packit bbfece
     CPPACTWR - CPP Write Action
Packit bbfece
     CPPTOKWR - CPP Write Token
Packit bbfece
     ORDER - Controls the order in which the loader processes sections with
Packit bbfece
	     the same info fields.  */
Packit bbfece
Packit bbfece
#define SHI_NFP_DOMAIN(shi)		(((shi) >> 16) & 0xFFFF)
Packit bbfece
#define SHI_NFP_MEMTYPE(shi)		( (shi) & 0xFFFF)
Packit bbfece
#define SHI_NFP_SET_DOMAIN(v)		(((v) & 0xFFFF) << 16)
Packit bbfece
#define SHI_NFP_SET_MEMTYPE(v)		( (v) & 0xFFFF)
Packit bbfece
Packit bbfece
#define SHI_NFP_IREG_ISLAND(shi)	(((shi) >> 26) & 0x3F)
Packit bbfece
#define SHI_NFP_IREG_CPPTGT(shi)	(((shi) >> 22) &  0xF)
Packit bbfece
#define SHI_NFP_IREG_CPPACTRD(shi)	(((shi) >> 17) & 0x1F)
Packit bbfece
#define SHI_NFP_IREG_CPPTOKRD(shi)	(((shi) >> 15) &  0x3)
Packit bbfece
#define SHI_NFP_IREG_CPPACTWR(shi)	(((shi) >> 10) & 0x1F)
Packit bbfece
#define SHI_NFP_IREG_CPPTOKWR(shi)	(((shi) >> 8)  &  0x3)
Packit bbfece
#define SHI_NFP_IREG_ORDER(shi)		( (shi) & 0xFF)
Packit bbfece
#define SHI_NFP_SET_IREG_ISLAND(v)	(((v) & 0x3F) << 26)
Packit bbfece
#define SHI_NFP_SET_IREG_CPPTGT(v)	(((v) &  0xF) << 22)
Packit bbfece
#define SHI_NFP_SET_IREG_CPPACTRD(v)	(((v) & 0x1F) << 17)
Packit bbfece
#define SHI_NFP_SET_IREG_CPPTOKRD(v)	(((v) &  0x3) << 15)
Packit bbfece
#define SHI_NFP_SET_IREG_CPPACTWR(v)	(((v) & 0x1F) << 10)
Packit bbfece
#define SHI_NFP_SET_IREG_CPPTOKWR(v)	(((v) &  0x3) << 8)
Packit bbfece
#define SHI_NFP_SET_IREG_ORDER(v)	( (v) & 0xFF)
Packit bbfece
Packit bbfece
/* CtXpb/reflect_read_sig_init/reflect_write_sig_init
Packit bbfece
   identifies Init-CSR sections for ME CSRs.  */
Packit bbfece
#define SHI_NFP_6000_IS_IREG_MECSR(shi) ( \
Packit bbfece
  SHI_NFP_IREG_CPPTGT (shi) == NFP_6000_CPPTGT_CTXPB \
Packit bbfece
  && SHI_NFP_IREG_CPPACTRD (shi) == 2 \
Packit bbfece
  && SHI_NFP_IREG_CPPTOKRD (shi) == 1 \
Packit bbfece
  && SHI_NFP_IREG_CPPACTWR (shi) == 3 \
Packit bbfece
  && SHI_NFP_IREG_CPPTOKWR (shi) == 1 \
Packit bbfece
)
Packit bbfece
Packit bbfece
/* Transient INITREG sections will be validated against the target
Packit bbfece
   but will not be kept - validate, write or read and discard.
Packit bbfece
   They will still be handled last (in order).  */
Packit bbfece
#define SHI_NFP_IREG_ORDER_TRANSIENT	0xFF
Packit bbfece
Packit bbfece
/* Below are some extra macros to translate SHI fields in more specific
Packit bbfece
   contexts.
Packit bbfece
Packit bbfece
   For NFP-32xx, DOMAIN is set to a global linear ME number (0 to 39).
Packit bbfece
   An NFP-32xx has 8 MEs per island and up to 5 islands.  */
Packit bbfece
Packit bbfece
#define SHI_NFP_3200_ISLAND(shi)	((SHI_NFP_DOMAIN (shi) >> 3) & 0x7)
Packit bbfece
#define SHI_NFP_3200_MENUM(shi)		( SHI_NFP_DOMAIN (shi)       & 0x7)
Packit bbfece
#define SHI_NFP_SET_3200_ISLAND(v)	SHI_NFP_SET_DOMAIN (((v) & 0x7) << 3)
Packit bbfece
#define SHI_NFP_SET_3200_MENUM(v)	SHI_NFP_SET_DOMAIN ( (v) & 0x7)
Packit bbfece
Packit bbfece
#define SHI_NFP_ISLAND(shi)		((SHI_NFP_DOMAIN (shi) >> 8) & 0xFF)
Packit bbfece
#define SHI_NFP_MENUM(shi)		( SHI_NFP_DOMAIN (shi)       & 0xFF)
Packit bbfece
#define SHI_NFP_SET_ISLAND(shi)		SHI_NFP_SET_DOMAIN (((shi) & 0xFF) << 8)
Packit bbfece
#define SHI_NFP_SET_MENUM(shi)		SHI_NFP_SET_DOMAIN ( (shi) & 0xFF)
Packit bbfece
Packit bbfece
#define SHI_NFP_MEMTYPE_NONE 		0
Packit bbfece
#define SHI_NFP_MEMTYPE_USTORE 		1
Packit bbfece
#define SHI_NFP_MEMTYPE_LMEM 		2
Packit bbfece
#define SHI_NFP_MEMTYPE_CLS 		3
Packit bbfece
#define SHI_NFP_MEMTYPE_DRAM 		4
Packit bbfece
#define SHI_NFP_MEMTYPE_MU 		4
Packit bbfece
#define SHI_NFP_MEMTYPE_SRAM 		5
Packit bbfece
#define SHI_NFP_MEMTYPE_GS 		6
Packit bbfece
#define SHI_NFP_MEMTYPE_PPC_LMEM 	7
Packit bbfece
#define SHI_NFP_MEMTYPE_PPC_SMEM 	8
Packit bbfece
#define SHI_NFP_MEMTYPE_EMU_CACHE 	9
Packit bbfece
Packit bbfece
/* VTP_FORCE is for use by the NFP Linker+Loader only.  */
Packit bbfece
#define NFP_IREG_VTP_FORCE		0
Packit bbfece
#define NFP_IREG_VTP_CONST		1
Packit bbfece
#define NFP_IREG_VTP_REQUIRED		2
Packit bbfece
#define NFP_IREG_VTP_VOLATILE_INIT	3
Packit bbfece
#define NFP_IREG_VTP_VOLATILE_NOINIT	4
Packit bbfece
#define NFP_IREG_VTP_INVALID		5
Packit bbfece
Packit bbfece
/* Init-CSR entry w0 fields:
Packit bbfece
   NLW - Not Last Word
Packit bbfece
   CTX - ME context number (if applicable)
Packit bbfece
   VTP - Value type
Packit bbfece
   COH - CPP Offset High 8 bits.  */
Packit bbfece
#define NFP_IREG_ENTRY_WO_NLW(w0) (((w0) >> 31) & 0x1)
Packit bbfece
#define NFP_IREG_ENTRY_WO_CTX(w0) (((w0) >> 28) & 0x7)
Packit bbfece
#define NFP_IREG_ENTRY_WO_VTP(w0) (((w0) >> 25) & 0x7)
Packit bbfece
#define NFP_IREG_ENTRY_WO_COH(w0) (((w0) >> 0) & 0xFF)
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  uint32_t w0;
Packit bbfece
  uint32_t cpp_offset_lo;
Packit bbfece
  uint32_t val;
Packit bbfece
  uint32_t mask;
Packit bbfece
} Elf_Nfp_InitRegEntry;
Packit bbfece
Packit bbfece
typedef struct
Packit bbfece
{
Packit bbfece
  uint32_t ctx_enables;
Packit bbfece
  uint32_t entry;
Packit bbfece
  uint32_t misc_control;
Packit bbfece
  uint32_t reserved;
Packit bbfece
} Elf_Nfp_MeConfig;
Packit bbfece
Packit bbfece
/* Relocations.  */
Packit bbfece
START_RELOC_NUMBERS (elf_nfp3200_reloc_type)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_NOTYPE, 0)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W32LE, 1)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SRC8_A, 2)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SRC8_B, 3)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_IMMED8_I, 4)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SC, 5)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_IMMED_LO16_I_A, 6)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_IMMED_LO16_I_B, 7)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SRC7_B, 8)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SRC7_A, 9)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SRC8_I_B, 10)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_SRC8_I_A, 11)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_IMMED_HI16_I_A, 12)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_IMMED_HI16_I_B, 13)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_0, 14)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_1, 15)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_2, 16)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_3, 17)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_4, 18)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_5, 19)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_RSVD_6, 20)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W64LE, 21)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W32BE, 22)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W64BE, 23)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W32LE_AND, 24)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W32BE_AND, 25)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W32LE_OR, 26)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W32BE_OR, 27)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W64LE_AND, 28)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W64BE_AND, 29)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W64LE_OR, 30)
Packit bbfece
    RELOC_NUMBER (R_NFP3200_W64BE_OR, 31)
Packit bbfece
END_RELOC_NUMBERS (R_NFP3200_MAX)
Packit bbfece
Packit bbfece
START_RELOC_NUMBERS (elf_nfp_reloc_type)
Packit bbfece
    RELOC_NUMBER (R_NFP_NOTYPE, 0)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32LE, 1)
Packit bbfece
    RELOC_NUMBER (R_NFP_SRC8_A, 2)
Packit bbfece
    RELOC_NUMBER (R_NFP_SRC8_B, 3)
Packit bbfece
    RELOC_NUMBER (R_NFP_IMMED8_I, 4)
Packit bbfece
    RELOC_NUMBER (R_NFP_SC, 5)
Packit bbfece
    RELOC_NUMBER (R_NFP_IMMED_LO16_I_A, 6)
Packit bbfece
    RELOC_NUMBER (R_NFP_IMMED_LO16_I_B, 7)
Packit bbfece
    RELOC_NUMBER (R_NFP_SRC7_B, 8)
Packit bbfece
    RELOC_NUMBER (R_NFP_SRC7_A, 9)
Packit bbfece
    RELOC_NUMBER (R_NFP_SRC8_I_B, 10)
Packit bbfece
    RELOC_NUMBER (R_NFP_SRC8_I_A, 11)
Packit bbfece
    RELOC_NUMBER (R_NFP_IMMED_HI16_I_A, 12)
Packit bbfece
    RELOC_NUMBER (R_NFP_IMMED_HI16_I_B, 13)
Packit bbfece
    RELOC_NUMBER (R_NFP_W64LE, 14)
Packit bbfece
    RELOC_NUMBER (R_NFP_SH_INFO, 15)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32BE, 16)
Packit bbfece
    RELOC_NUMBER (R_NFP_W64BE, 17)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32_29_24, 18)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32LE_AND, 19)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32BE_AND, 20)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32LE_OR, 21)
Packit bbfece
    RELOC_NUMBER (R_NFP_W32BE_OR, 22)
Packit bbfece
    RELOC_NUMBER (R_NFP_W64LE_AND, 23)
Packit bbfece
    RELOC_NUMBER (R_NFP_W64BE_AND, 24)
Packit bbfece
    RELOC_NUMBER (R_NFP_W64LE_OR, 25)
Packit bbfece
    RELOC_NUMBER (R_NFP_W64BE_OR, 26)
Packit bbfece
END_RELOC_NUMBERS (R_NFP_MAX)
Packit bbfece
Packit bbfece
#ifdef __cplusplus
Packit bbfece
}
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#endif /* _ELF_NFP_H */