Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 62255
b: refs/heads/master
c: 3ad216c
h: refs/heads/master
i:
  62253: 557f258
  62251: d9221db
  62247: 979de4f
  62239: 826fc24
v: v3
  • Loading branch information
Arnd Bergmann authored and Arnd Bergmann committed Jul 20, 2007
1 parent e9fdf46 commit 18bc381
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9d92af621f193c1c889ac8b6fd8c987ccd8aae1f
refs/heads/master: 3ad216cae837d90415c605e1149e6fd88f51c973
55 changes: 54 additions & 1 deletion trunk/arch/powerpc/platforms/cell/spu_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include <asm/spu.h>
#include <asm/spu_priv1.h>
#include <asm/xmon.h>
#include <asm/prom.h>
#include "spu_priv1_mmio.h"

const struct spu_management_ops *spu_management_ops;
EXPORT_SYMBOL_GPL(spu_management_ops);
Expand Down Expand Up @@ -657,6 +659,52 @@ static SYSDEV_ATTR(stat, 0644, spu_stat_show, NULL);
struct cbe_spu_info cbe_spu_info[MAX_NUMNODES];
EXPORT_SYMBOL_GPL(cbe_spu_info);

/* Hardcoded affinity idxs for QS20 */
#define SPES_PER_BE 8
static int QS20_reg_idxs[SPES_PER_BE] = { 0, 2, 4, 6, 7, 5, 3, 1 };
static int QS20_reg_memory[SPES_PER_BE] = { 1, 1, 0, 0, 0, 0, 0, 0 };

static struct spu *spu_lookup_reg(int node, u32 reg)
{
struct spu *spu;

list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) {
if (*(u32 *)get_property(spu_devnode(spu), "reg", NULL) == reg)
return spu;
}
return NULL;
}

static void init_aff_QS20_harcoded(void)
{
int node, i;
struct spu *last_spu, *spu;
u32 reg;

for (node = 0; node < MAX_NUMNODES; node++) {
last_spu = NULL;
for (i = 0; i < SPES_PER_BE; i++) {
reg = QS20_reg_idxs[i];
spu = spu_lookup_reg(node, reg);
if (!spu)
continue;
spu->has_mem_affinity = QS20_reg_memory[reg];
if (last_spu)
list_add_tail(&spu->aff_list,
&last_spu->aff_list);
last_spu = spu;
}
}
}

static int of_has_vicinity(void)
{
struct spu* spu;

spu = list_entry(cbe_spu_info[0].spus.next, struct spu, cbe_list);
return of_find_property(spu_devnode(spu), "vicinity", NULL) != NULL;
}

static int __init init_spu_base(void)
{
int i, ret = 0;
Expand Down Expand Up @@ -698,12 +746,17 @@ static int __init init_spu_base(void)
crash_register_spus(&spu_full_list);
spu_add_sysdev_attr(&attr_stat);

if (!of_has_vicinity()) {
long root = of_get_flat_dt_root();
if (of_flat_dt_is_compatible(root, "IBM,CPBW-1.0"))
init_aff_QS20_harcoded();
}

return 0;

out_unregister_sysdev_class:
sysdev_class_unregister(&spu_sysdev_class);
out:

return ret;
}
module_init(init_spu_base);
Expand Down

0 comments on commit 18bc381

Please sign in to comment.