134d8a380SJack Steiner /* 234d8a380SJack Steiner * SN Platform GRU Driver 334d8a380SJack Steiner * 434d8a380SJack Steiner * GRU HANDLE DEFINITION 534d8a380SJack Steiner * 634d8a380SJack Steiner * Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. 734d8a380SJack Steiner * 834d8a380SJack Steiner * This program is free software; you can redistribute it and/or modify 934d8a380SJack Steiner * it under the terms of the GNU General Public License as published by 1034d8a380SJack Steiner * the Free Software Foundation; either version 2 of the License, or 1134d8a380SJack Steiner * (at your option) any later version. 1234d8a380SJack Steiner * 1334d8a380SJack Steiner * This program is distributed in the hope that it will be useful, 1434d8a380SJack Steiner * but WITHOUT ANY WARRANTY; without even the implied warranty of 1534d8a380SJack Steiner * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1634d8a380SJack Steiner * GNU General Public License for more details. 1734d8a380SJack Steiner * 1834d8a380SJack Steiner * You should have received a copy of the GNU General Public License 1934d8a380SJack Steiner * along with this program; if not, write to the Free Software 2034d8a380SJack Steiner * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 2134d8a380SJack Steiner */ 2234d8a380SJack Steiner 2334d8a380SJack Steiner #ifndef __GRUHANDLES_H__ 2434d8a380SJack Steiner #define __GRUHANDLES_H__ 2534d8a380SJack Steiner #include "gru_instructions.h" 2634d8a380SJack Steiner 2734d8a380SJack Steiner /* 2834d8a380SJack Steiner * Manifest constants for GRU Memory Map 2934d8a380SJack Steiner */ 3034d8a380SJack Steiner #define GRU_GSEG0_BASE 0 3134d8a380SJack Steiner #define GRU_MCS_BASE (64 * 1024 * 1024) 3234d8a380SJack Steiner #define GRU_SIZE (128UL * 1024 * 1024) 3334d8a380SJack Steiner 3434d8a380SJack Steiner /* Handle & resource counts */ 3534d8a380SJack Steiner #define GRU_NUM_CB 128 3634d8a380SJack Steiner #define GRU_NUM_DSR_BYTES (32 * 1024) 3734d8a380SJack Steiner #define GRU_NUM_TFM 16 3834d8a380SJack Steiner #define GRU_NUM_TGH 24 3934d8a380SJack Steiner #define GRU_NUM_CBE 128 4034d8a380SJack Steiner #define GRU_NUM_TFH 128 4134d8a380SJack Steiner #define GRU_NUM_CCH 16 4234d8a380SJack Steiner #define GRU_NUM_GSH 1 4334d8a380SJack Steiner 4434d8a380SJack Steiner /* Maximum resource counts that can be reserved by user programs */ 4534d8a380SJack Steiner #define GRU_NUM_USER_CBR GRU_NUM_CBE 4634d8a380SJack Steiner #define GRU_NUM_USER_DSR_BYTES GRU_NUM_DSR_BYTES 4734d8a380SJack Steiner 4834d8a380SJack Steiner /* Bytes per handle & handle stride. Code assumes all cb, tfh, cbe handles 4934d8a380SJack Steiner * are the same */ 5034d8a380SJack Steiner #define GRU_HANDLE_BYTES 64 5134d8a380SJack Steiner #define GRU_HANDLE_STRIDE 256 5234d8a380SJack Steiner 5334d8a380SJack Steiner /* Base addresses of handles */ 5434d8a380SJack Steiner #define GRU_TFM_BASE (GRU_MCS_BASE + 0x00000) 5534d8a380SJack Steiner #define GRU_TGH_BASE (GRU_MCS_BASE + 0x08000) 5634d8a380SJack Steiner #define GRU_CBE_BASE (GRU_MCS_BASE + 0x10000) 5734d8a380SJack Steiner #define GRU_TFH_BASE (GRU_MCS_BASE + 0x18000) 5834d8a380SJack Steiner #define GRU_CCH_BASE (GRU_MCS_BASE + 0x20000) 5934d8a380SJack Steiner #define GRU_GSH_BASE (GRU_MCS_BASE + 0x30000) 6034d8a380SJack Steiner 6134d8a380SJack Steiner /* User gseg constants */ 6234d8a380SJack Steiner #define GRU_GSEG_STRIDE (4 * 1024 * 1024) 6334d8a380SJack Steiner #define GSEG_BASE(a) ((a) & ~(GRU_GSEG_PAGESIZE - 1)) 6434d8a380SJack Steiner 6534d8a380SJack Steiner /* Data segment constants */ 6634d8a380SJack Steiner #define GRU_DSR_AU_BYTES 1024 6734d8a380SJack Steiner #define GRU_DSR_CL (GRU_NUM_DSR_BYTES / GRU_CACHE_LINE_BYTES) 6834d8a380SJack Steiner #define GRU_DSR_AU_CL (GRU_DSR_AU_BYTES / GRU_CACHE_LINE_BYTES) 6934d8a380SJack Steiner #define GRU_DSR_AU (GRU_NUM_DSR_BYTES / GRU_DSR_AU_BYTES) 7034d8a380SJack Steiner 7134d8a380SJack Steiner /* Control block constants */ 7234d8a380SJack Steiner #define GRU_CBR_AU_SIZE 2 7334d8a380SJack Steiner #define GRU_CBR_AU (GRU_NUM_CBE / GRU_CBR_AU_SIZE) 7434d8a380SJack Steiner 7534d8a380SJack Steiner /* Convert resource counts to the number of AU */ 7634d8a380SJack Steiner #define GRU_DS_BYTES_TO_AU(n) DIV_ROUND_UP(n, GRU_DSR_AU_BYTES) 7734d8a380SJack Steiner #define GRU_CB_COUNT_TO_AU(n) DIV_ROUND_UP(n, GRU_CBR_AU_SIZE) 7834d8a380SJack Steiner 7934d8a380SJack Steiner /* UV limits */ 8034d8a380SJack Steiner #define GRU_CHIPLETS_PER_HUB 2 8134d8a380SJack Steiner #define GRU_HUBS_PER_BLADE 1 8234d8a380SJack Steiner #define GRU_CHIPLETS_PER_BLADE (GRU_HUBS_PER_BLADE * GRU_CHIPLETS_PER_HUB) 8334d8a380SJack Steiner 8434d8a380SJack Steiner /* User GRU Gseg offsets */ 8534d8a380SJack Steiner #define GRU_CB_BASE 0 8634d8a380SJack Steiner #define GRU_CB_LIMIT (GRU_CB_BASE + GRU_HANDLE_STRIDE * GRU_NUM_CBE) 8734d8a380SJack Steiner #define GRU_DS_BASE 0x20000 8834d8a380SJack Steiner #define GRU_DS_LIMIT (GRU_DS_BASE + GRU_NUM_DSR_BYTES) 8934d8a380SJack Steiner 9034d8a380SJack Steiner /* Convert a GRU physical address to the chiplet offset */ 9134d8a380SJack Steiner #define GSEGPOFF(h) ((h) & (GRU_SIZE - 1)) 9234d8a380SJack Steiner 9334d8a380SJack Steiner /* Convert an arbitrary handle address to the beginning of the GRU segment */ 9434d8a380SJack Steiner #define GRUBASE(h) ((void *)((unsigned long)(h) & ~(GRU_SIZE - 1))) 9534d8a380SJack Steiner 9634d8a380SJack Steiner /* General addressing macros. */ 9734d8a380SJack Steiner static inline void *get_gseg_base_address(void *base, int ctxnum) 9834d8a380SJack Steiner { 9934d8a380SJack Steiner return (void *)(base + GRU_GSEG0_BASE + GRU_GSEG_STRIDE * ctxnum); 10034d8a380SJack Steiner } 10134d8a380SJack Steiner 10234d8a380SJack Steiner static inline void *get_gseg_base_address_cb(void *base, int ctxnum, int line) 10334d8a380SJack Steiner { 10434d8a380SJack Steiner return (void *)(get_gseg_base_address(base, ctxnum) + 10534d8a380SJack Steiner GRU_CB_BASE + GRU_HANDLE_STRIDE * line); 10634d8a380SJack Steiner } 10734d8a380SJack Steiner 10834d8a380SJack Steiner static inline void *get_gseg_base_address_ds(void *base, int ctxnum, int line) 10934d8a380SJack Steiner { 11034d8a380SJack Steiner return (void *)(get_gseg_base_address(base, ctxnum) + GRU_DS_BASE + 11134d8a380SJack Steiner GRU_CACHE_LINE_BYTES * line); 11234d8a380SJack Steiner } 11334d8a380SJack Steiner 11434d8a380SJack Steiner static inline struct gru_tlb_fault_map *get_tfm(void *base, int ctxnum) 11534d8a380SJack Steiner { 11634d8a380SJack Steiner return (struct gru_tlb_fault_map *)(base + GRU_TFM_BASE + 11734d8a380SJack Steiner ctxnum * GRU_HANDLE_STRIDE); 11834d8a380SJack Steiner } 11934d8a380SJack Steiner 12034d8a380SJack Steiner static inline struct gru_tlb_global_handle *get_tgh(void *base, int ctxnum) 12134d8a380SJack Steiner { 12234d8a380SJack Steiner return (struct gru_tlb_global_handle *)(base + GRU_TGH_BASE + 12334d8a380SJack Steiner ctxnum * GRU_HANDLE_STRIDE); 12434d8a380SJack Steiner } 12534d8a380SJack Steiner 12634d8a380SJack Steiner static inline struct gru_control_block_extended *get_cbe(void *base, int ctxnum) 12734d8a380SJack Steiner { 12834d8a380SJack Steiner return (struct gru_control_block_extended *)(base + GRU_CBE_BASE + 12934d8a380SJack Steiner ctxnum * GRU_HANDLE_STRIDE); 13034d8a380SJack Steiner } 13134d8a380SJack Steiner 13234d8a380SJack Steiner static inline struct gru_tlb_fault_handle *get_tfh(void *base, int ctxnum) 13334d8a380SJack Steiner { 13434d8a380SJack Steiner return (struct gru_tlb_fault_handle *)(base + GRU_TFH_BASE + 13534d8a380SJack Steiner ctxnum * GRU_HANDLE_STRIDE); 13634d8a380SJack Steiner } 13734d8a380SJack Steiner 13834d8a380SJack Steiner static inline struct gru_context_configuration_handle *get_cch(void *base, 13934d8a380SJack Steiner int ctxnum) 14034d8a380SJack Steiner { 14134d8a380SJack Steiner return (struct gru_context_configuration_handle *)(base + 14234d8a380SJack Steiner GRU_CCH_BASE + ctxnum * GRU_HANDLE_STRIDE); 14334d8a380SJack Steiner } 14434d8a380SJack Steiner 14534d8a380SJack Steiner static inline unsigned long get_cb_number(void *cb) 14634d8a380SJack Steiner { 14734d8a380SJack Steiner return (((unsigned long)cb - GRU_CB_BASE) % GRU_GSEG_PAGESIZE) / 14834d8a380SJack Steiner GRU_HANDLE_STRIDE; 14934d8a380SJack Steiner } 15034d8a380SJack Steiner 15134d8a380SJack Steiner /* byte offset to a specific GRU chiplet. (p=pnode, c=chiplet (0 or 1)*/ 15234d8a380SJack Steiner static inline unsigned long gru_chiplet_paddr(unsigned long paddr, int pnode, 15334d8a380SJack Steiner int chiplet) 15434d8a380SJack Steiner { 15534d8a380SJack Steiner return paddr + GRU_SIZE * (2 * pnode + chiplet); 15634d8a380SJack Steiner } 15734d8a380SJack Steiner 15834d8a380SJack Steiner static inline void *gru_chiplet_vaddr(void *vaddr, int pnode, int chiplet) 15934d8a380SJack Steiner { 16034d8a380SJack Steiner return vaddr + GRU_SIZE * (2 * pnode + chiplet); 16134d8a380SJack Steiner } 16234d8a380SJack Steiner 16334d8a380SJack Steiner 16434d8a380SJack Steiner 16534d8a380SJack Steiner /* 16634d8a380SJack Steiner * Global TLB Fault Map 16734d8a380SJack Steiner * Bitmap of outstanding TLB misses needing interrupt/polling service. 16834d8a380SJack Steiner * 16934d8a380SJack Steiner */ 17034d8a380SJack Steiner struct gru_tlb_fault_map { 17134d8a380SJack Steiner unsigned long fault_bits[BITS_TO_LONGS(GRU_NUM_CBE)]; 17234d8a380SJack Steiner unsigned long fill0[2]; 17334d8a380SJack Steiner unsigned long done_bits[BITS_TO_LONGS(GRU_NUM_CBE)]; 17434d8a380SJack Steiner unsigned long fill1[2]; 17534d8a380SJack Steiner }; 17634d8a380SJack Steiner 17734d8a380SJack Steiner /* 17834d8a380SJack Steiner * TGH - TLB Global Handle 17934d8a380SJack Steiner * Used for TLB flushing. 18034d8a380SJack Steiner * 18134d8a380SJack Steiner */ 18234d8a380SJack Steiner struct gru_tlb_global_handle { 18334d8a380SJack Steiner unsigned int cmd:1; /* DW 0 */ 18434d8a380SJack Steiner unsigned int delresp:1; 18534d8a380SJack Steiner unsigned int opc:1; 18634d8a380SJack Steiner unsigned int fill1:5; 18734d8a380SJack Steiner 18834d8a380SJack Steiner unsigned int fill2:8; 18934d8a380SJack Steiner 19034d8a380SJack Steiner unsigned int status:2; 19134d8a380SJack Steiner unsigned long fill3:2; 19234d8a380SJack Steiner unsigned int state:3; 19334d8a380SJack Steiner unsigned long fill4:1; 19434d8a380SJack Steiner 19534d8a380SJack Steiner unsigned int cause:3; 19634d8a380SJack Steiner unsigned long fill5:37; 19734d8a380SJack Steiner 19834d8a380SJack Steiner unsigned long vaddr:64; /* DW 1 */ 19934d8a380SJack Steiner 20034d8a380SJack Steiner unsigned int asid:24; /* DW 2 */ 20134d8a380SJack Steiner unsigned int fill6:8; 20234d8a380SJack Steiner 20334d8a380SJack Steiner unsigned int pagesize:5; 20434d8a380SJack Steiner unsigned int fill7:11; 20534d8a380SJack Steiner 20634d8a380SJack Steiner unsigned int global:1; 20734d8a380SJack Steiner unsigned int fill8:15; 20834d8a380SJack Steiner 20934d8a380SJack Steiner unsigned long vaddrmask:39; /* DW 3 */ 21034d8a380SJack Steiner unsigned int fill9:9; 21134d8a380SJack Steiner unsigned int n:10; 21234d8a380SJack Steiner unsigned int fill10:6; 21334d8a380SJack Steiner 21434d8a380SJack Steiner unsigned int ctxbitmap:16; /* DW4 */ 21534d8a380SJack Steiner unsigned long fill11[3]; 21634d8a380SJack Steiner }; 21734d8a380SJack Steiner 21834d8a380SJack Steiner enum gru_tgh_cmd { 21934d8a380SJack Steiner TGHCMD_START 22034d8a380SJack Steiner }; 22134d8a380SJack Steiner 22234d8a380SJack Steiner enum gru_tgh_opc { 22334d8a380SJack Steiner TGHOP_TLBNOP, 22434d8a380SJack Steiner TGHOP_TLBINV 22534d8a380SJack Steiner }; 22634d8a380SJack Steiner 22734d8a380SJack Steiner enum gru_tgh_status { 22834d8a380SJack Steiner TGHSTATUS_IDLE, 22934d8a380SJack Steiner TGHSTATUS_EXCEPTION, 23034d8a380SJack Steiner TGHSTATUS_ACTIVE 23134d8a380SJack Steiner }; 23234d8a380SJack Steiner 23334d8a380SJack Steiner enum gru_tgh_state { 23434d8a380SJack Steiner TGHSTATE_IDLE, 23534d8a380SJack Steiner TGHSTATE_PE_INVAL, 23634d8a380SJack Steiner TGHSTATE_INTERRUPT_INVAL, 23734d8a380SJack Steiner TGHSTATE_WAITDONE, 23834d8a380SJack Steiner TGHSTATE_RESTART_CTX, 23934d8a380SJack Steiner }; 24034d8a380SJack Steiner 24134d8a380SJack Steiner /* 24234d8a380SJack Steiner * TFH - TLB Global Handle 24334d8a380SJack Steiner * Used for TLB dropins into the GRU TLB. 24434d8a380SJack Steiner * 24534d8a380SJack Steiner */ 24634d8a380SJack Steiner struct gru_tlb_fault_handle { 24734d8a380SJack Steiner unsigned int cmd:1; /* DW 0 - low 32*/ 24834d8a380SJack Steiner unsigned int delresp:1; 24934d8a380SJack Steiner unsigned int fill0:2; 25034d8a380SJack Steiner unsigned int opc:3; 25134d8a380SJack Steiner unsigned int fill1:9; 25234d8a380SJack Steiner 25334d8a380SJack Steiner unsigned int status:2; 254cd1334f0SJack Steiner unsigned int fill2:2; 25534d8a380SJack Steiner unsigned int state:3; 25634d8a380SJack Steiner unsigned int fill3:1; 25734d8a380SJack Steiner 258cd1334f0SJack Steiner unsigned int cause:7; 25934d8a380SJack Steiner unsigned int fill4:1; 26034d8a380SJack Steiner 261cd1334f0SJack Steiner unsigned int indexway:12; /* DW 0 - high 32 */ 26234d8a380SJack Steiner unsigned int fill5:4; 26334d8a380SJack Steiner 26434d8a380SJack Steiner unsigned int ctxnum:4; 26534d8a380SJack Steiner unsigned int fill6:12; 26634d8a380SJack Steiner 26734d8a380SJack Steiner unsigned long missvaddr:64; /* DW 1 */ 26834d8a380SJack Steiner 26934d8a380SJack Steiner unsigned int missasid:24; /* DW 2 */ 27034d8a380SJack Steiner unsigned int fill7:8; 27134d8a380SJack Steiner unsigned int fillasid:24; 27234d8a380SJack Steiner unsigned int dirty:1; 27334d8a380SJack Steiner unsigned int gaa:2; 27434d8a380SJack Steiner unsigned long fill8:5; 27534d8a380SJack Steiner 27634d8a380SJack Steiner unsigned long pfn:41; /* DW 3 */ 27734d8a380SJack Steiner unsigned int fill9:7; 27834d8a380SJack Steiner unsigned int pagesize:5; 27934d8a380SJack Steiner unsigned int fill10:11; 28034d8a380SJack Steiner 28134d8a380SJack Steiner unsigned long fillvaddr:64; /* DW 4 */ 28234d8a380SJack Steiner 28334d8a380SJack Steiner unsigned long fill11[3]; 28434d8a380SJack Steiner }; 28534d8a380SJack Steiner 28634d8a380SJack Steiner enum gru_tfh_opc { 28734d8a380SJack Steiner TFHOP_NOOP, 28834d8a380SJack Steiner TFHOP_RESTART, 28934d8a380SJack Steiner TFHOP_WRITE_ONLY, 29034d8a380SJack Steiner TFHOP_WRITE_RESTART, 29134d8a380SJack Steiner TFHOP_EXCEPTION, 29234d8a380SJack Steiner TFHOP_USER_POLLING_MODE = 7, 29334d8a380SJack Steiner }; 29434d8a380SJack Steiner 29534d8a380SJack Steiner enum tfh_status { 29634d8a380SJack Steiner TFHSTATUS_IDLE, 29734d8a380SJack Steiner TFHSTATUS_EXCEPTION, 29834d8a380SJack Steiner TFHSTATUS_ACTIVE, 29934d8a380SJack Steiner }; 30034d8a380SJack Steiner 30134d8a380SJack Steiner enum tfh_state { 30234d8a380SJack Steiner TFHSTATE_INACTIVE, 30334d8a380SJack Steiner TFHSTATE_IDLE, 30434d8a380SJack Steiner TFHSTATE_MISS_UPM, 30534d8a380SJack Steiner TFHSTATE_MISS_FMM, 30634d8a380SJack Steiner TFHSTATE_HW_ERR, 30734d8a380SJack Steiner TFHSTATE_WRITE_TLB, 30834d8a380SJack Steiner TFHSTATE_RESTART_CBR, 30934d8a380SJack Steiner }; 31034d8a380SJack Steiner 31134d8a380SJack Steiner /* TFH cause bits */ 31234d8a380SJack Steiner enum tfh_cause { 31334d8a380SJack Steiner TFHCAUSE_NONE, 31434d8a380SJack Steiner TFHCAUSE_TLB_MISS, 31534d8a380SJack Steiner TFHCAUSE_TLB_MOD, 31634d8a380SJack Steiner TFHCAUSE_HW_ERROR_RR, 31734d8a380SJack Steiner TFHCAUSE_HW_ERROR_MAIN_ARRAY, 31834d8a380SJack Steiner TFHCAUSE_HW_ERROR_VALID, 31934d8a380SJack Steiner TFHCAUSE_HW_ERROR_PAGESIZE, 32034d8a380SJack Steiner TFHCAUSE_INSTRUCTION_EXCEPTION, 32134d8a380SJack Steiner TFHCAUSE_UNCORRECTIBLE_ERROR, 32234d8a380SJack Steiner }; 32334d8a380SJack Steiner 32434d8a380SJack Steiner /* GAA values */ 32534d8a380SJack Steiner #define GAA_RAM 0x0 32634d8a380SJack Steiner #define GAA_NCRAM 0x2 32734d8a380SJack Steiner #define GAA_MMIO 0x1 32834d8a380SJack Steiner #define GAA_REGISTER 0x3 32934d8a380SJack Steiner 33034d8a380SJack Steiner /* GRU paddr shift for pfn. (NOTE: shift is NOT by actual pagesize) */ 33134d8a380SJack Steiner #define GRU_PADDR_SHIFT 12 33234d8a380SJack Steiner 33334d8a380SJack Steiner /* 33434d8a380SJack Steiner * Context Configuration handle 33534d8a380SJack Steiner * Used to allocate resources to a GSEG context. 33634d8a380SJack Steiner * 33734d8a380SJack Steiner */ 33834d8a380SJack Steiner struct gru_context_configuration_handle { 33934d8a380SJack Steiner unsigned int cmd:1; /* DW0 */ 34034d8a380SJack Steiner unsigned int delresp:1; 34134d8a380SJack Steiner unsigned int opc:3; 34234d8a380SJack Steiner unsigned int unmap_enable:1; 34334d8a380SJack Steiner unsigned int req_slice_set_enable:1; 34434d8a380SJack Steiner unsigned int req_slice:2; 34534d8a380SJack Steiner unsigned int cb_int_enable:1; 34634d8a380SJack Steiner unsigned int tlb_int_enable:1; 34734d8a380SJack Steiner unsigned int tfm_fault_bit_enable:1; 34834d8a380SJack Steiner unsigned int tlb_int_select:4; 34934d8a380SJack Steiner 35034d8a380SJack Steiner unsigned int status:2; 35134d8a380SJack Steiner unsigned int state:2; 35234d8a380SJack Steiner unsigned int reserved2:4; 35334d8a380SJack Steiner 35434d8a380SJack Steiner unsigned int cause:4; 35534d8a380SJack Steiner unsigned int tfm_done_bit_enable:1; 35634d8a380SJack Steiner unsigned int unused:3; 35734d8a380SJack Steiner 35834d8a380SJack Steiner unsigned int dsr_allocation_map; 35934d8a380SJack Steiner 36034d8a380SJack Steiner unsigned long cbr_allocation_map; /* DW1 */ 36134d8a380SJack Steiner 36234d8a380SJack Steiner unsigned int asid[8]; /* DW 2 - 5 */ 36334d8a380SJack Steiner unsigned short sizeavail[8]; /* DW 6 - 7 */ 36434d8a380SJack Steiner } __attribute__ ((packed)); 36534d8a380SJack Steiner 36634d8a380SJack Steiner enum gru_cch_opc { 36734d8a380SJack Steiner CCHOP_START = 1, 36834d8a380SJack Steiner CCHOP_ALLOCATE, 36934d8a380SJack Steiner CCHOP_INTERRUPT, 37034d8a380SJack Steiner CCHOP_DEALLOCATE, 37134d8a380SJack Steiner CCHOP_INTERRUPT_SYNC, 37234d8a380SJack Steiner }; 37334d8a380SJack Steiner 37434d8a380SJack Steiner enum gru_cch_status { 37534d8a380SJack Steiner CCHSTATUS_IDLE, 37634d8a380SJack Steiner CCHSTATUS_EXCEPTION, 37734d8a380SJack Steiner CCHSTATUS_ACTIVE, 37834d8a380SJack Steiner }; 37934d8a380SJack Steiner 38034d8a380SJack Steiner enum gru_cch_state { 38134d8a380SJack Steiner CCHSTATE_INACTIVE, 38234d8a380SJack Steiner CCHSTATE_MAPPED, 38334d8a380SJack Steiner CCHSTATE_ACTIVE, 38434d8a380SJack Steiner CCHSTATE_INTERRUPTED, 38534d8a380SJack Steiner }; 38634d8a380SJack Steiner 38734d8a380SJack Steiner /* CCH Exception cause */ 38834d8a380SJack Steiner enum gru_cch_cause { 38934d8a380SJack Steiner CCHCAUSE_REGION_REGISTER_WRITE_ERROR = 1, 39034d8a380SJack Steiner CCHCAUSE_ILLEGAL_OPCODE = 2, 39134d8a380SJack Steiner CCHCAUSE_INVALID_START_REQUEST = 3, 39234d8a380SJack Steiner CCHCAUSE_INVALID_ALLOCATION_REQUEST = 4, 39334d8a380SJack Steiner CCHCAUSE_INVALID_DEALLOCATION_REQUEST = 5, 39434d8a380SJack Steiner CCHCAUSE_INVALID_INTERRUPT_REQUEST = 6, 39534d8a380SJack Steiner CCHCAUSE_CCH_BUSY = 7, 39634d8a380SJack Steiner CCHCAUSE_NO_CBRS_TO_ALLOCATE = 8, 39734d8a380SJack Steiner CCHCAUSE_BAD_TFM_CONFIG = 9, 39834d8a380SJack Steiner CCHCAUSE_CBR_RESOURCES_OVERSUBSCRIPED = 10, 39934d8a380SJack Steiner CCHCAUSE_DSR_RESOURCES_OVERSUBSCRIPED = 11, 40034d8a380SJack Steiner CCHCAUSE_CBR_DEALLOCATION_ERROR = 12, 40134d8a380SJack Steiner }; 40234d8a380SJack Steiner /* 40334d8a380SJack Steiner * CBE - Control Block Extended 40434d8a380SJack Steiner * Maintains internal GRU state for active CBs. 40534d8a380SJack Steiner * 40634d8a380SJack Steiner */ 40734d8a380SJack Steiner struct gru_control_block_extended { 40834d8a380SJack Steiner unsigned int reserved0:1; /* DW 0 - low */ 40934d8a380SJack Steiner unsigned int imacpy:3; 41034d8a380SJack Steiner unsigned int reserved1:4; 41134d8a380SJack Steiner unsigned int xtypecpy:3; 41234d8a380SJack Steiner unsigned int iaa0cpy:2; 41334d8a380SJack Steiner unsigned int iaa1cpy:2; 41434d8a380SJack Steiner unsigned int reserved2:1; 41534d8a380SJack Steiner unsigned int opccpy:8; 41634d8a380SJack Steiner unsigned int exopccpy:8; 41734d8a380SJack Steiner 41834d8a380SJack Steiner unsigned int idef2cpy:22; /* DW 0 - high */ 41934d8a380SJack Steiner unsigned int reserved3:10; 42034d8a380SJack Steiner 42134d8a380SJack Steiner unsigned int idef4cpy:22; /* DW 1 */ 42234d8a380SJack Steiner unsigned int reserved4:10; 42334d8a380SJack Steiner unsigned int idef4upd:22; 42434d8a380SJack Steiner unsigned int reserved5:10; 42534d8a380SJack Steiner 42634d8a380SJack Steiner unsigned long idef1upd:64; /* DW 2 */ 42734d8a380SJack Steiner 42834d8a380SJack Steiner unsigned long idef5cpy:64; /* DW 3 */ 42934d8a380SJack Steiner 43034d8a380SJack Steiner unsigned long idef6cpy:64; /* DW 4 */ 43134d8a380SJack Steiner 43234d8a380SJack Steiner unsigned long idef3upd:64; /* DW 5 */ 43334d8a380SJack Steiner 43434d8a380SJack Steiner unsigned long idef5upd:64; /* DW 6 */ 43534d8a380SJack Steiner 43634d8a380SJack Steiner unsigned int idef2upd:22; /* DW 7 */ 43734d8a380SJack Steiner unsigned int reserved6:10; 43834d8a380SJack Steiner 43934d8a380SJack Steiner unsigned int ecause:20; 44034d8a380SJack Steiner unsigned int cbrstate:4; 44134d8a380SJack Steiner unsigned int cbrexecstatus:8; 44234d8a380SJack Steiner }; 44334d8a380SJack Steiner 44434d8a380SJack Steiner enum gru_cbr_state { 44534d8a380SJack Steiner CBRSTATE_INACTIVE, 44634d8a380SJack Steiner CBRSTATE_IDLE, 44734d8a380SJack Steiner CBRSTATE_PE_CHECK, 44834d8a380SJack Steiner CBRSTATE_QUEUED, 44934d8a380SJack Steiner CBRSTATE_WAIT_RESPONSE, 45034d8a380SJack Steiner CBRSTATE_INTERRUPTED, 45134d8a380SJack Steiner CBRSTATE_INTERRUPTED_MISS_FMM, 45234d8a380SJack Steiner CBRSTATE_BUSY_INTERRUPT_MISS_FMM, 45334d8a380SJack Steiner CBRSTATE_INTERRUPTED_MISS_UPM, 45434d8a380SJack Steiner CBRSTATE_BUSY_INTERRUPTED_MISS_UPM, 45534d8a380SJack Steiner CBRSTATE_REQUEST_ISSUE, 45634d8a380SJack Steiner CBRSTATE_BUSY_INTERRUPT, 45734d8a380SJack Steiner }; 45834d8a380SJack Steiner 459cd1334f0SJack Steiner /* CBE cbrexecstatus bits - defined in gru_instructions.h*/ 46034d8a380SJack Steiner /* CBE ecause bits - defined in gru_instructions.h */ 46134d8a380SJack Steiner 46234d8a380SJack Steiner /* 46334d8a380SJack Steiner * Convert a processor pagesize into the strange encoded pagesize used by the 46434d8a380SJack Steiner * GRU. Processor pagesize is encoded as log of bytes per page. (or PAGE_SHIFT) 46534d8a380SJack Steiner * pagesize log pagesize grupagesize 46634d8a380SJack Steiner * 4k 12 0 46734d8a380SJack Steiner * 16k 14 1 46834d8a380SJack Steiner * 64k 16 2 46934d8a380SJack Steiner * 256k 18 3 47034d8a380SJack Steiner * 1m 20 4 47134d8a380SJack Steiner * 2m 21 5 47234d8a380SJack Steiner * 4m 22 6 47334d8a380SJack Steiner * 16m 24 7 47434d8a380SJack Steiner * 64m 26 8 47534d8a380SJack Steiner * ... 47634d8a380SJack Steiner */ 47734d8a380SJack Steiner #define GRU_PAGESIZE(sh) ((((sh) > 20 ? (sh) + 2 : (sh)) >> 1) - 6) 47834d8a380SJack Steiner #define GRU_SIZEAVAIL(sh) (1UL << GRU_PAGESIZE(sh)) 47934d8a380SJack Steiner 48034d8a380SJack Steiner /* minimum TLB purge count to ensure a full purge */ 48134d8a380SJack Steiner #define GRUMAXINVAL 1024UL 48234d8a380SJack Steiner 483a24e5e1cSJack Steiner int cch_allocate(struct gru_context_configuration_handle *cch, 4847b8274e9SJack Steiner int asidval, int sizeavail, unsigned long cbrmap, unsigned long dsrmap); 48534d8a380SJack Steiner 486a24e5e1cSJack Steiner int cch_start(struct gru_context_configuration_handle *cch); 487a24e5e1cSJack Steiner int cch_interrupt(struct gru_context_configuration_handle *cch); 488a24e5e1cSJack Steiner int cch_deallocate(struct gru_context_configuration_handle *cch); 489a24e5e1cSJack Steiner int cch_interrupt_sync(struct gru_context_configuration_handle *cch); 490a24e5e1cSJack Steiner int tgh_invalidate(struct gru_tlb_global_handle *tgh, unsigned long vaddr, 491a24e5e1cSJack Steiner unsigned long vaddrmask, int asid, int pagesize, int global, int n, 492a24e5e1cSJack Steiner unsigned short ctxbitmap); 493a24e5e1cSJack Steiner void tfh_write_only(struct gru_tlb_fault_handle *tfh, unsigned long pfn, 494a24e5e1cSJack Steiner unsigned long vaddr, int asid, int dirty, int pagesize); 495a24e5e1cSJack Steiner void tfh_write_restart(struct gru_tlb_fault_handle *tfh, unsigned long paddr, 496a24e5e1cSJack Steiner int gaa, unsigned long vaddr, int asid, int dirty, int pagesize); 497a24e5e1cSJack Steiner void tfh_restart(struct gru_tlb_fault_handle *tfh); 498a24e5e1cSJack Steiner void tfh_user_polling_mode(struct gru_tlb_fault_handle *tfh); 499a24e5e1cSJack Steiner void tfh_exception(struct gru_tlb_fault_handle *tfh); 50034d8a380SJack Steiner 50134d8a380SJack Steiner #endif /* __GRUHANDLES_H__ */ 502