1/* 2 * Copyright (c) 2014 ETH Zurich. 3 * All rights reserved. 4 * 5 * This file is distributed under the terms in the attached LICENSE file. 6 * If you do not find this file, copies can be found by writing to: 7 * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group. 8 */ 9 10#ifndef XEON_PHI_XEON_PHI_H_ 11#define XEON_PHI_XEON_PHI_H_ 12 13/// The maximum number of coprocessor cards in a system 14#define XEON_PHI_NUM_MAX 8 15 16#define XEON_PHI_CBOX_BASE 0x0ULL /* P54C Core */ 17#define XEON_PHI_TXS0_BASE 0x0800780000ULL /* Texture Sampler */ 18#define XEON_PHI_TXS1_BASE 0x0800770000ULL /* Texture Sampler */ 19#define XEON_PHI_TXS2_BASE 0x0800760000ULL /* Texture Sampler */ 20#define XEON_PHI_TXS3_BASE 0x0800750000ULL /* Texture Sampler */ 21#define XEON_PHI_TXS4_BASE 0x0800740000ULL /* Texture Sampler */ 22#define XEON_PHI_TXS5_BASE 0x0800730000ULL /* Texture Sampler */ 23#define XEON_PHI_TXS6_BASE 0x0800720000ULL /* Texture Sampler */ 24#define XEON_PHI_TXS7_BASE 0x0800710000ULL /* Texture Sampler */ 25#define XEON_PHI_DBOX0_BASE 0x08007C0000ULL /* Display Box Registers */ 26#define XEON_PHI_DBOX1_BASE 0x0800620000ULL /* Display Box Registers */ 27#define XEON_PHI_TD0_BASE 0x08007C0000ULL /* Dbox Tag Directory TD */ 28#define XEON_PHI_TD1_BASE 0x0800620000ULL /* Dbox Tag Directory TD */ 29#define XEON_PHI_VBOX_BASE 0x08007B0000ULL /* Video Box Registers */ 30#define XEON_PHI_SBOX_BASE 0x08007D0000ULL /* PCIE Box Registers */ 31#define XEON_PHI_GBOX0_BASE 0x08007A0000ULL /* Gbox Front Box Registers */ 32#define XEON_PHI_GBOX1_BASE 0x0800790000ULL /* Gbox Front Box Registers */ 33#define XEON_PHI_GBOX2_BASE 0x0800700000ULL /* Gbox Front Box Registers */ 34#define XEON_PHI_GBOX3_BASE 0x08006F0000ULL /* Gbox Front Box Registers */ 35#define XEON_PHI_GBOX4_BASE 0x08006D0000ULL /* Gbox Front Box Registers */ 36#define XEON_PHI_GBOX5_BASE 0x08006C0000ULL /* Gbox Front Box Registers */ 37#define XEON_PHI_GBOX6_BASE 0x08006B0000ULL /* Gbox Front Box Registers */ 38#define XEON_PHI_GBOX7_BASE 0x08006A0000ULL /* Gbox Front Box Registers */ 39#define XEON_PHI_REUT0_BASE 0x08007A0000ULL /* Gbox REUT interface Registers */ 40#define XEON_PHI_REUT1_BASE 0x0800790000ULL /* Gbox REUT interface Registers */ 41#define XEON_PHI_REUT2_BASE 0x0800700000ULL /* Gbox REUT interface Registers */ 42#define XEON_PHI_REUT3_BASE 0x08006F0000ULL /* Gbox REUT interface Registers */ 43#define XEON_PHI_REUT4_BASE 0x08006D0000ULL /* Gbox REUT interface Registers */ 44#define XEON_PHI_REUT5_BASE 0x08006C0000ULL /* Gbox REUT interface Registers */ 45#define XEON_PHI_REUT6_BASE 0x08006B0000ULL /* Gbox REUT interface Registers */ 46#define XEON_PHI_REUT7_BASE 0x08006A0000ULL /* Gbox REUT interface Registers */ 47 48#define XEON_PHI_GBOX_CHANNEL0_BASE 0x0 49#define XEON_PHI_GBOX_CHANNEL1_BASE 0x800 50#define XEON_PHI_GBOX_CHANNEL2_BASE 0x800 51#define XEON_PHI_GBOX_CHANNEL3_BASE 0x1000 52 53#define XEON_PHI_SBOX_SIZE (64*1024) 54#define XEON_PHI_SBOX_SIZE_BITS (16) 55 56// TODO: Verify these... 57#define XEON_PHI_GBOX_SIZE (64*1024) 58#define XEON_PHI_DBOX_SIZE (64*1024) 59#define XEON_PHI_CBOX_SIZE (64*1024) 60 61#define XEON_PHI_SYSMEM_BASE 0x8000000000UL 62#define XEON_PHI_SYSMEM_SIZE_BITS 39 63#define XEON_PHI_SYSMEM_SIZE (1ULL << XEON_PHI_SYSMEM_SIZE_BITS) 64#define XEON_PHI_SYSMEM_PAGE_SIZE (16UL*1024*1024*1024) 65#define XEON_PHI_SYSMEM_PAGE_BITS 34 66 67#define XEON_PHI_SYSMEM_KNC_BASE (XEON_PHI_SYSMEM_BASE + 25 * XEON_PHI_SYSMEM_PAGE_SIZE) 68 69#define XEON_PHI_MEM_MASK 0xFFFFFFFFFFULL 70 71//#define XEON_PHI_USE_HW_MODEL 72 73/** 74 * layout of the boot parameter data structure 75 * 76 * XXX: some fields will be overwritten by the Xeon Phi firmware! 77 */ 78struct xeon_phi_boot_params 79{ 80 uint8_t reserved[0x54]; 81 uint64_t tboot_addr; /* 0x058 */ 82 uint8_t _pad3[128]; /* 0x070 */ 83 uint8_t dummy[256]; 84 uint8_t _pad1[4]; 85 uint32_t scratch; /* Scratch field! *//* 0x1e4 */ 86 uint8_t _pad6[13]; /* 0x1eb */ 87 uint8_t setup_sects; /// must be at this very location !!! 88 uint16_t root_flags; 89 uint32_t syssize; /// must be at this very location !!! 90 uint16_t _pad2[5]; 91 uint32_t header; /// must be at this very location !!! 92 uint16_t version; 93 uint32_t realmode_swtch; 94 uint16_t start_sys; 95 uint16_t kernel_version; 96 uint8_t type_of_loader; 97 uint8_t loadflags; 98 uint16_t setup_move_size; 99 uint32_t code32_start; 100 uint32_t ramdisk_image; /// pointer to the multiboot image 101 uint32_t ramdisk_size; /// multiboot image size 102 uint32_t bootsect_kludge; 103 uint16_t loader_name; 104 uint8_t ext_loader_ver; 105 uint8_t ext_loader_type; 106 uint32_t payload_offset; 107 uint32_t initrd_addr_max; 108 uint32_t kernel_alignment; 109 uint8_t _pad4[4]; 110 uint32_t cmdline_size; /// size of the command line 111 uint32_t hardware_subarch; 112 uint64_t hardware_subarch_data; 113 uint32_t cmdline_ptr; /// pointer to the command line 114 uint32_t xeon_phi_id; 115 uint64_t msg_base; /// pointer to the host message base address 116 uint8_t msg_size_bits; /// size of the messaging channel 117 //uint64_t multiboot; /// pointer to the multiboot information 118 uint32_t mbi; 119}__attribute__((packed)); 120 121 122typedef uint8_t xphi_chan_type_t; 123 124typedef uint8_t xphi_id_t; 125 126typedef uint64_t xphi_dom_id_t; 127 128static inline xphi_dom_id_t xeon_phi_domain_build_id(xphi_id_t xid, 129 uint8_t core, 130 uint8_t is_host, 131 domainid_t domid) 132{ 133 xphi_dom_id_t did = xid; 134 did <<= 8; 135 did |= core; 136 did <<= 32; 137 did |=domid; 138 if (is_host) { 139 did |= (1UL << 63); 140 } 141 return did; 142} 143 144static inline xphi_id_t xeon_phi_domain_get_xid(xphi_dom_id_t domid) 145{ 146 return (0xFF & (domid >> 40)); 147} 148 149static inline xphi_id_t xeon_phi_domain_get_core(xphi_dom_id_t domid) 150{ 151 return (0xFF & (domid >> 32)); 152} 153 154static inline uint8_t xeon_phi_domain_is_on_host(xphi_dom_id_t domid) 155{ 156 return !!((1UL << 63) & domid); 157} 158 159 160#endif // XEON_PHI_XEON_PHI_H_ 161