diff options
Diffstat (limited to 'drivers/misc/sgi-gru/grutables.h')
-rw-r--r-- | drivers/misc/sgi-gru/grutables.h | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/drivers/misc/sgi-gru/grutables.h b/drivers/misc/sgi-gru/grutables.h index a78f70deeb59..bf1eeb7553ed 100644 --- a/drivers/misc/sgi-gru/grutables.h +++ b/drivers/misc/sgi-gru/grutables.h | |||
@@ -153,6 +153,7 @@ | |||
153 | extern struct gru_stats_s gru_stats; | 153 | extern struct gru_stats_s gru_stats; |
154 | extern struct gru_blade_state *gru_base[]; | 154 | extern struct gru_blade_state *gru_base[]; |
155 | extern unsigned long gru_start_paddr, gru_end_paddr; | 155 | extern unsigned long gru_start_paddr, gru_end_paddr; |
156 | extern unsigned int gru_max_gids; | ||
156 | 157 | ||
157 | #define GRU_MAX_BLADES MAX_NUMNODES | 158 | #define GRU_MAX_BLADES MAX_NUMNODES |
158 | #define GRU_MAX_GRUS (GRU_MAX_BLADES * GRU_CHIPLETS_PER_BLADE) | 159 | #define GRU_MAX_GRUS (GRU_MAX_BLADES * GRU_CHIPLETS_PER_BLADE) |
@@ -184,7 +185,9 @@ struct gru_stats_s { | |||
184 | atomic_long_t asid_wrap; | 185 | atomic_long_t asid_wrap; |
185 | atomic_long_t asid_reuse; | 186 | atomic_long_t asid_reuse; |
186 | atomic_long_t intr; | 187 | atomic_long_t intr; |
188 | atomic_long_t intr_mm_lock_failed; | ||
187 | atomic_long_t call_os; | 189 | atomic_long_t call_os; |
190 | atomic_long_t call_os_offnode_reference; | ||
188 | atomic_long_t call_os_check_for_bug; | 191 | atomic_long_t call_os_check_for_bug; |
189 | atomic_long_t call_os_wait_queue; | 192 | atomic_long_t call_os_wait_queue; |
190 | atomic_long_t user_flush_tlb; | 193 | atomic_long_t user_flush_tlb; |
@@ -237,6 +240,17 @@ struct gru_stats_s { | |||
237 | 240 | ||
238 | }; | 241 | }; |
239 | 242 | ||
243 | enum mcs_op {cchop_allocate, cchop_start, cchop_interrupt, cchop_interrupt_sync, | ||
244 | cchop_deallocate, tghop_invalidate, mcsop_last}; | ||
245 | |||
246 | struct mcs_op_statistic { | ||
247 | atomic_long_t count; | ||
248 | atomic_long_t total; | ||
249 | unsigned long max; | ||
250 | }; | ||
251 | |||
252 | extern struct mcs_op_statistic mcs_op_statistics[mcsop_last]; | ||
253 | |||
240 | #define OPT_DPRINT 1 | 254 | #define OPT_DPRINT 1 |
241 | #define OPT_STATS 2 | 255 | #define OPT_STATS 2 |
242 | #define GRU_QUICKLOOK 4 | 256 | #define GRU_QUICKLOOK 4 |
@@ -278,13 +292,12 @@ struct gru_stats_s { | |||
278 | /* Generate a GRU asid value from a GRU base asid & a virtual address. */ | 292 | /* Generate a GRU asid value from a GRU base asid & a virtual address. */ |
279 | #if defined CONFIG_IA64 | 293 | #if defined CONFIG_IA64 |
280 | #define VADDR_HI_BIT 64 | 294 | #define VADDR_HI_BIT 64 |
281 | #define GRUREGION(addr) ((addr) >> (VADDR_HI_BIT - 3) & 3) | ||
282 | #elif defined CONFIG_X86_64 | 295 | #elif defined CONFIG_X86_64 |
283 | #define VADDR_HI_BIT 48 | 296 | #define VADDR_HI_BIT 48 |
284 | #define GRUREGION(addr) (0) /* ZZZ could do better */ | ||
285 | #else | 297 | #else |
286 | #error "Unsupported architecture" | 298 | #error "Unsupported architecture" |
287 | #endif | 299 | #endif |
300 | #define GRUREGION(addr) ((addr) >> (VADDR_HI_BIT - 3) & 3) | ||
288 | #define GRUASID(asid, addr) ((asid) + GRUREGION(addr)) | 301 | #define GRUASID(asid, addr) ((asid) + GRUREGION(addr)) |
289 | 302 | ||
290 | /*------------------------------------------------------------------------------ | 303 | /*------------------------------------------------------------------------------ |
@@ -297,12 +310,12 @@ struct gru_state; | |||
297 | * This structure is pointed to from the mmstruct via the notifier pointer. | 310 | * This structure is pointed to from the mmstruct via the notifier pointer. |
298 | * There is one of these per address space. | 311 | * There is one of these per address space. |
299 | */ | 312 | */ |
300 | struct gru_mm_tracker { | 313 | struct gru_mm_tracker { /* pack to reduce size */ |
301 | unsigned int mt_asid_gen; /* ASID wrap count */ | 314 | unsigned int mt_asid_gen:24; /* ASID wrap count */ |
302 | int mt_asid; /* current base ASID for gru */ | 315 | unsigned int mt_asid:24; /* current base ASID for gru */ |
303 | unsigned short mt_ctxbitmap; /* bitmap of contexts using | 316 | unsigned short mt_ctxbitmap:16;/* bitmap of contexts using |
304 | asid */ | 317 | asid */ |
305 | }; | 318 | } __attribute__ ((packed)); |
306 | 319 | ||
307 | struct gru_mm_struct { | 320 | struct gru_mm_struct { |
308 | struct mmu_notifier ms_notifier; | 321 | struct mmu_notifier ms_notifier; |
@@ -348,6 +361,7 @@ struct gru_thread_state { | |||
348 | long ts_user_options;/* misc user option flags */ | 361 | long ts_user_options;/* misc user option flags */ |
349 | pid_t ts_tgid_owner; /* task that is using the | 362 | pid_t ts_tgid_owner; /* task that is using the |
350 | context - for migration */ | 363 | context - for migration */ |
364 | unsigned short ts_sizeavail; /* Pagesizes in use */ | ||
351 | int ts_tsid; /* thread that owns the | 365 | int ts_tsid; /* thread that owns the |
352 | structure */ | 366 | structure */ |
353 | int ts_tlb_int_select;/* target cpu if interrupts | 367 | int ts_tlb_int_select;/* target cpu if interrupts |
@@ -359,6 +373,9 @@ struct gru_thread_state { | |||
359 | required for contest */ | 373 | required for contest */ |
360 | unsigned char ts_cbr_au_count;/* Number of CBR resources | 374 | unsigned char ts_cbr_au_count;/* Number of CBR resources |
361 | required for contest */ | 375 | required for contest */ |
376 | char ts_blade; /* If >= 0, migrate context if | ||
377 | ref from diferent blade */ | ||
378 | char ts_force_cch_reload; | ||
362 | char ts_force_unload;/* force context to be unloaded | 379 | char ts_force_unload;/* force context to be unloaded |
363 | after migration */ | 380 | after migration */ |
364 | char ts_cbr_idx[GRU_CBR_AU];/* CBR numbers of each | 381 | char ts_cbr_idx[GRU_CBR_AU];/* CBR numbers of each |
@@ -392,12 +409,12 @@ struct gru_state { | |||
392 | gru segments (64) */ | 409 | gru segments (64) */ |
393 | void *gs_gru_base_vaddr; /* Virtual address of | 410 | void *gs_gru_base_vaddr; /* Virtual address of |
394 | gru segments (64) */ | 411 | gru segments (64) */ |
395 | unsigned char gs_gid; /* unique GRU number */ | 412 | unsigned short gs_gid; /* unique GRU number */ |
413 | unsigned short gs_blade_id; /* blade of GRU */ | ||
396 | unsigned char gs_tgh_local_shift; /* used to pick TGH for | 414 | unsigned char gs_tgh_local_shift; /* used to pick TGH for |
397 | local flush */ | 415 | local flush */ |
398 | unsigned char gs_tgh_first_remote; /* starting TGH# for | 416 | unsigned char gs_tgh_first_remote; /* starting TGH# for |
399 | remote flush */ | 417 | remote flush */ |
400 | unsigned short gs_blade_id; /* blade of GRU */ | ||
401 | spinlock_t gs_asid_lock; /* lock used for | 418 | spinlock_t gs_asid_lock; /* lock used for |
402 | assigning asids */ | 419 | assigning asids */ |
403 | spinlock_t gs_lock; /* lock used for | 420 | spinlock_t gs_lock; /* lock used for |
@@ -492,6 +509,10 @@ struct gru_blade_state { | |||
492 | (i) < GRU_CHIPLETS_PER_BLADE; \ | 509 | (i) < GRU_CHIPLETS_PER_BLADE; \ |
493 | (i)++, (gru)++) | 510 | (i)++, (gru)++) |
494 | 511 | ||
512 | /* Scan all GRUs */ | ||
513 | #define foreach_gid(gid) \ | ||
514 | for ((gid) = 0; (gid) < gru_max_gids; (gid)++) | ||
515 | |||
495 | /* Scan all active GTSs on a gru. Note: must hold ss_lock to use this macro. */ | 516 | /* Scan all active GTSs on a gru. Note: must hold ss_lock to use this macro. */ |
496 | #define for_each_gts_on_gru(gts, gru, ctxnum) \ | 517 | #define for_each_gts_on_gru(gts, gru, ctxnum) \ |
497 | for ((ctxnum) = 0; (ctxnum) < GRU_NUM_CCH; (ctxnum)++) \ | 518 | for ((ctxnum) = 0; (ctxnum) < GRU_NUM_CCH; (ctxnum)++) \ |
@@ -578,9 +599,11 @@ extern struct gru_thread_state *gru_find_thread_state(struct vm_area_struct | |||
578 | extern struct gru_thread_state *gru_alloc_thread_state(struct vm_area_struct | 599 | extern struct gru_thread_state *gru_alloc_thread_state(struct vm_area_struct |
579 | *vma, int tsid); | 600 | *vma, int tsid); |
580 | extern void gru_unload_context(struct gru_thread_state *gts, int savestate); | 601 | extern void gru_unload_context(struct gru_thread_state *gts, int savestate); |
602 | extern int gru_update_cch(struct gru_thread_state *gts, int force_unload); | ||
581 | extern void gts_drop(struct gru_thread_state *gts); | 603 | extern void gts_drop(struct gru_thread_state *gts); |
582 | extern void gru_tgh_flush_init(struct gru_state *gru); | 604 | extern void gru_tgh_flush_init(struct gru_state *gru); |
583 | extern int gru_kservices_init(struct gru_state *gru); | 605 | extern int gru_kservices_init(struct gru_state *gru); |
606 | extern void gru_kservices_exit(struct gru_state *gru); | ||
584 | extern irqreturn_t gru_intr(int irq, void *dev_id); | 607 | extern irqreturn_t gru_intr(int irq, void *dev_id); |
585 | extern int gru_handle_user_call_os(unsigned long address); | 608 | extern int gru_handle_user_call_os(unsigned long address); |
586 | extern int gru_user_flush_tlb(unsigned long arg); | 609 | extern int gru_user_flush_tlb(unsigned long arg); |