cell: move SPU affinity init to spu_management_of_ops
Subsystems (3)
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH v2 1/1 cell: move SPU affinity init to spu_management_of_ops
From: Andre Detsch <[email protected]>
This patch moves affinity initialization code from spu_base.c to a new spu_management_of_ops function (init_affinity), which is empty in the case of PS3. This fixes a linking problem that was happening when compiling for PS3.
Also, some small code style changes were made.
---
Arnd,
I rebased this to to Paul's powerpc git tree. This needs to go in for 2.6.23, as it fixes build breakage for PS3-only configs. Please check and ack.
-Geoff
arch/powerpc/platforms/cell/spu_base.c | 141 -------------------------- arch/powerpc/platforms/cell/spu_manage.c | 163 +++++++++++++++++++++++++++++++ arch/powerpc/platforms/ps3/spu.c | 6 + include/asm-powerpc/spu_priv1.h | 7 + 4 files changed, 177 insertions(+), 140 deletions(-)
arch/powerpc/platforms/cell/spu_base.c +1 -140
@@ -36,7 +36,6 @@#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);
@@ -636,138 +635,6 @@ static ssize_t spu_stat_show(struct sys_ static SYSDEV_ATTR(stat, 0644, spu_stat_show, NULL); -/* 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 struct spu *aff_devnode_spu (int cbe,struct device_node *dn) -{ -struct spu *spu; - -list_for_each_entry (spu, &cbe_spu_info[cbe].spus, cbe_list) -if (spu_devnode (spu) == dn) -return spu; -return NULL ; -} - -static struct spu * -aff_node_next_to (int cbe,struct device_node *target,struct device_node *avoid) -{ -struct spu *spu; -const phandle *vic_handles; -int lenp, i; - -list_for_each_entry (spu, &cbe_spu_info[cbe].spus, cbe_list) { -if (spu_devnode (spu) == avoid) -continue ; - vic_handles =get_property (spu_devnode (spu),"vicinity" , &lenp); -for (i=0 ; i < (lenp /sizeof (phandle)); i++) { -if (vic_handles[i] == target->linux_phandle) -return spu; - } - } -return NULL ; -} - -static void init_aff_fw_vicinity_node (int cbe) -{ -struct spu *spu, *last_spu; -struct device_node *vic_dn, *last_spu_dn; -phandle avoid_ph; -const phandle *vic_handles; -const char *name; -int lenp, i, added, mem_aff; - - last_spu = list_entry(cbe_spu_info[cbe].spus.next, struct spu, cbe_list); - avoid_ph =0 ; -for (added =1 ; added < cbe_spu_info[cbe].n_spus; added++) { - last_spu_dn =spu_devnode (last_spu); - vic_handles =get_property (last_spu_dn,"vicinity" , &lenp); - -for (i =0 ; i < (lenp /sizeof (phandle)); i++) { -if (vic_handles[i] == avoid_ph) -continue ; - - vic_dn =of_find_node_by_phandle (vic_handles[i]); -if (!vic_dn) -continue ; - - name =get_property (vic_dn,"name" ,NULL ); -if (strcmp (name,"spe" ) ==0 ) { - spu =aff_devnode_spu (cbe, vic_dn); - avoid_ph = last_spu_dn->linux_phandle; - } -else { - mem_aff =strcmp (name,"mic-tm" ) ==0 ; - spu =aff_node_next_to (cbe, vic_dn, last_spu_dn); -if (!spu) -continue ; -if (mem_aff) { - last_spu->has_mem_affinity =1 ; - spu->has_mem_affinity =1 ; - } - avoid_ph = vic_dn->linux_phandle; - } -list_add_tail (&spu->aff_list, &last_spu->aff_list); - last_spu = spu; -break ; - } - } -} - -static void init_aff_fw_vicinity (void ) -{ -int cbe; - -/* sets has_mem_affinity for each spu, as long as the -* spu->aff_list list, linking each spu to its neighbors -*/ -for (cbe =0 ; cbe <MAX_NUMNODES ; cbe++) -init_aff_fw_vicinity_node (cbe); -} -static int __init init_spu_base (void ) {int i, ret =0 ;
@@ -811,13 +678,7 @@ static int __init init_spu_base(void)mutex_unlock (&spu_full_list_mutex);spu_add_sysdev_attr (&attr_stat); -if (of_has_vicinity ()) { -init_aff_fw_vicinity (); - }else { -long root =of_get_flat_dt_root (); -if (of_flat_dt_is_compatible (root,"IBM,CPBW-1.0" )) -init_aff_QS20_harcoded (); - } +spu_init_affinity ();return 0 ;
arch/powerpc/platforms/cell/spu_manage.c +163 -0
171 lines not on this page · raw message
arch/powerpc/platforms/ps3/spu.c +6 -0
@@ -414,10 +414,16 @@ static int __init ps3_enumerate_spus(intreturn num_resource_id; } +static int ps3_init_affinity (void ) +{ +return 0 ; +} +const struct spu_management_ops spu_management_ps3_ops = { .enumerate_spus = ps3_enumerate_spus, .create_spu = ps3_create_spu, .destroy_spu = ps3_destroy_spu, + .init_affinity = ps3_init_affinity, };/* spu_priv1_ops */
include/asm-powerpc/spu_priv1.h +7 -0
@@ -178,6 +178,7 @@ struct spu_management_ops {int (*enumerate_spus)(int (*fn)(void *data));int (*create_spu)(struct spu *spu,void *data);int (*destroy_spu)(struct spu *spu); +int (*init_affinity)(void ); };extern const struct spu_management_ops * spu_management_ops;
@@ -200,6 +201,12 @@ spu_destroy_spu (struct spu *spu)return spu_management_ops->destroy_spu (spu); } +static inline int +spu_init_affinity (void ) +{ +return spu_management_ops->init_affinity (); +} +/* * The declarations folowing are put here for convenience * and only intended to be used by the platform setup code.
Quoted 11 lines · Geoff Levand
From: Andre Detsch <[email protected]>
This patch moves affinity initialization code from
spu_base.cto a newspu_management_of_opsfunction (init_affinity), which is empty in the case of PS3. This fixes a linking problem that was happening when compiling for PS3.
Also, some small code style changes were made.Signed-off-by Andre Detsch <[email protected]>Signed-off-by Geoff Levand <[email protected]>
Quoted 10 lines · Arnd Bergmann
Quoted 9 lines · Geoff Levand
From: Andre Detsch <[email protected]>
This patch moves affinity initialization code from
spu_base.cto a newspu_management_of_opsfunction (init_affinity), which is empty in the case of PS3. This fixes a linking problem that was happening when compiling for PS3.
Also, some small code style changes were made.
Quoted 5 lines
Quoted 2 lines
Signed-off-by Andre Detsch <[email protected]>Signed-off-by Geoff Levand <[email protected]>Acked-by Arnd Bergmann <[email protected]>
Hi Paul,
As this one fixes a build breakage, I would like you to queue it up for Linus to pull at the next opportunity.
-Geoff
Quoted 15 lines · Geoff Levand
Quoted 14 lines · Arnd Bergmann
Quoted 11 lines · Geoff Levand
From: Andre Detsch <[email protected]>
This patch moves affinity initialization code from
spu_base.cto a newspu_management_of_opsfunction (init_affinity), which is empty in the case of PS3. This fixes a linking problem that was happening when compiling for PS3.
Also, some small code style changes were made.Signed-off-by Andre Detsch <[email protected]>Signed-off-by Geoff Levand <[email protected]>
Quoted 6 lines
Quoted 1 line
Acked-by Arnd Bergmann <[email protected]>Hi Paul,
As this one fixes a build breakage, I would like you to queue it up for Linus to pull at the next opportunity.
Hi Paul,
Can we please get this one merged in ASAP.
-Geoff