diff options
author | Jack Steiner <steiner@sgi.com> | 2009-04-02 19:59:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-04-02 22:05:06 -0400 |
commit | e1c3219d06447dab8a87b96df1211d158e21071e (patch) | |
tree | aa3a5ea8af148d2d7d461d61618d7820f099148a /drivers/misc | |
parent | 6f2584f47474d29ce829604bfc8b56c10b352fdb (diff) |
sgi-gru: macro for scanning all gru chiplets
Add macro for scanning all active GRU chiplets. Maximum chiplet id is
saved during GRU initialization.
Signed-off-by: Jack Steiner <steiner@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/sgi-gru/grufault.c | 11 | ||||
-rw-r--r-- | drivers/misc/sgi-gru/grufile.c | 3 | ||||
-rw-r--r-- | drivers/misc/sgi-gru/gruprocfs.c | 4 | ||||
-rw-r--r-- | drivers/misc/sgi-gru/grutables.h | 9 |
4 files changed, 14 insertions, 13 deletions
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index bf6e9f7bed54..15507d31e62b 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
@@ -600,18 +600,11 @@ static int gru_unload_all_contexts(void) | |||
600 | { | 600 | { |
601 | struct gru_thread_state *gts; | 601 | struct gru_thread_state *gts; |
602 | struct gru_state *gru; | 602 | struct gru_state *gru; |
603 | int maxgid, gid, ctxnum; | 603 | int gid, ctxnum; |
604 | int nodesperblade; | ||
605 | 604 | ||
606 | if (!capable(CAP_SYS_ADMIN)) | 605 | if (!capable(CAP_SYS_ADMIN)) |
607 | return -EPERM; | 606 | return -EPERM; |
608 | if (num_online_nodes() > 1 && | 607 | foreach_gid(gid) { |
609 | (uv_node_to_blade_id(1) == uv_node_to_blade_id(0))) | ||
610 | nodesperblade = 2; | ||
611 | else | ||
612 | nodesperblade = 1; | ||
613 | maxgid = GRU_CHIPLETS_PER_BLADE * num_online_nodes() / nodesperblade; | ||
614 | for (gid = 0; gid < maxgid; gid++) { | ||
615 | gru = GID_TO_GRU(gid); | 608 | gru = GID_TO_GRU(gid); |
616 | spin_lock(&gru->gs_lock); | 609 | spin_lock(&gru->gs_lock); |
617 | for (ctxnum = 0; ctxnum < GRU_NUM_CCH; ctxnum++) { | 610 | for (ctxnum = 0; ctxnum < GRU_NUM_CCH; ctxnum++) { |
diff --git a/drivers/misc/sgi-gru/grufile.c b/drivers/misc/sgi-gru/grufile.c index f8dcdb1a0ec4..b7a21ce91496 100644 --- a/drivers/misc/sgi-gru/grufile.c +++ b/drivers/misc/sgi-gru/grufile.c | |||
@@ -47,6 +47,7 @@ | |||
47 | struct gru_blade_state *gru_base[GRU_MAX_BLADES] __read_mostly; | 47 | struct gru_blade_state *gru_base[GRU_MAX_BLADES] __read_mostly; |
48 | unsigned long gru_start_paddr __read_mostly; | 48 | unsigned long gru_start_paddr __read_mostly; |
49 | unsigned long gru_end_paddr __read_mostly; | 49 | unsigned long gru_end_paddr __read_mostly; |
50 | unsigned int gru_max_gids __read_mostly; | ||
50 | struct gru_stats_s gru_stats; | 51 | struct gru_stats_s gru_stats; |
51 | 52 | ||
52 | /* Guaranteed user available resources on each node */ | 53 | /* Guaranteed user available resources on each node */ |
@@ -276,6 +277,8 @@ static void gru_init_chiplet(struct gru_state *gru, unsigned long paddr, | |||
276 | gru->gs_dsr_map = (1UL << GRU_DSR_AU) - 1; | 277 | gru->gs_dsr_map = (1UL << GRU_DSR_AU) - 1; |
277 | gru->gs_asid_limit = MAX_ASID; | 278 | gru->gs_asid_limit = MAX_ASID; |
278 | gru_tgh_flush_init(gru); | 279 | gru_tgh_flush_init(gru); |
280 | if (gru->gs_gid >= gru_max_gids) | ||
281 | gru_max_gids = gru->gs_gid + 1; | ||
279 | gru_dbg(grudev, "bid %d, nid %d, gid %d, vaddr %p (0x%lx)\n", | 282 | gru_dbg(grudev, "bid %d, nid %d, gid %d, vaddr %p (0x%lx)\n", |
280 | bid, nid, gru->gs_gid, gru->gs_gru_base_vaddr, | 283 | bid, nid, gru->gs_gid, gru->gs_gru_base_vaddr, |
281 | gru->gs_gru_base_paddr); | 284 | gru->gs_gru_base_paddr); |
diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c index 8724551aa55e..ee74821b171c 100644 --- a/drivers/misc/sgi-gru/gruprocfs.c +++ b/drivers/misc/sgi-gru/gruprocfs.c | |||
@@ -226,7 +226,7 @@ static void seq_stop(struct seq_file *file, void *data) | |||
226 | 226 | ||
227 | static void *seq_start(struct seq_file *file, loff_t *gid) | 227 | static void *seq_start(struct seq_file *file, loff_t *gid) |
228 | { | 228 | { |
229 | if (*gid < GRU_MAX_GRUS) | 229 | if (*gid < gru_max_gids) |
230 | return gid; | 230 | return gid; |
231 | return NULL; | 231 | return NULL; |
232 | } | 232 | } |
@@ -234,7 +234,7 @@ static void *seq_start(struct seq_file *file, loff_t *gid) | |||
234 | static void *seq_next(struct seq_file *file, void *data, loff_t *gid) | 234 | static void *seq_next(struct seq_file *file, void *data, loff_t *gid) |
235 | { | 235 | { |
236 | (*gid)++; | 236 | (*gid)++; |
237 | if (*gid < GRU_MAX_GRUS) | 237 | if (*gid < gru_max_gids) |
238 | return gid; | 238 | return gid; |
239 | return NULL; | 239 | return NULL; |
240 | } | 240 | } |
diff --git a/drivers/misc/sgi-gru/grutables.h b/drivers/misc/sgi-gru/grutables.h index 685db88cc475..c6e0e3de07f3 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) |
@@ -406,12 +407,12 @@ struct gru_state { | |||
406 | gru segments (64) */ | 407 | gru segments (64) */ |
407 | void *gs_gru_base_vaddr; /* Virtual address of | 408 | void *gs_gru_base_vaddr; /* Virtual address of |
408 | gru segments (64) */ | 409 | gru segments (64) */ |
409 | unsigned char gs_gid; /* unique GRU number */ | 410 | unsigned short gs_gid; /* unique GRU number */ |
411 | unsigned short gs_blade_id; /* blade of GRU */ | ||
410 | unsigned char gs_tgh_local_shift; /* used to pick TGH for | 412 | unsigned char gs_tgh_local_shift; /* used to pick TGH for |
411 | local flush */ | 413 | local flush */ |
412 | unsigned char gs_tgh_first_remote; /* starting TGH# for | 414 | unsigned char gs_tgh_first_remote; /* starting TGH# for |
413 | remote flush */ | 415 | remote flush */ |
414 | unsigned short gs_blade_id; /* blade of GRU */ | ||
415 | spinlock_t gs_asid_lock; /* lock used for | 416 | spinlock_t gs_asid_lock; /* lock used for |
416 | assigning asids */ | 417 | assigning asids */ |
417 | spinlock_t gs_lock; /* lock used for | 418 | spinlock_t gs_lock; /* lock used for |
@@ -506,6 +507,10 @@ struct gru_blade_state { | |||
506 | (i) < GRU_CHIPLETS_PER_BLADE; \ | 507 | (i) < GRU_CHIPLETS_PER_BLADE; \ |
507 | (i)++, (gru)++) | 508 | (i)++, (gru)++) |
508 | 509 | ||
510 | /* Scan all GRUs */ | ||
511 | #define foreach_gid(gid) \ | ||
512 | for ((gid) = 0; (gid) < gru_max_gids; (gid)++) | ||
513 | |||
509 | /* Scan all active GTSs on a gru. Note: must hold ss_lock to use this macro. */ | 514 | /* Scan all active GTSs on a gru. Note: must hold ss_lock to use this macro. */ |
510 | #define for_each_gts_on_gru(gts, gru, ctxnum) \ | 515 | #define for_each_gts_on_gru(gts, gru, ctxnum) \ |
511 | for ((ctxnum) = 0; (ctxnum) < GRU_NUM_CCH; (ctxnum)++) \ | 516 | for ((ctxnum) = 0; (ctxnum) < GRU_NUM_CCH; (ctxnum)++) \ |