diff options
Diffstat (limited to 'arch/powerpc/kernel/cacheinfo.c')
| -rw-r--r-- | arch/powerpc/kernel/cacheinfo.c | 69 | 
1 files changed, 40 insertions, 29 deletions
diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c index a3c684b4c86..40198d50b4c 100644 --- a/arch/powerpc/kernel/cacheinfo.c +++ b/arch/powerpc/kernel/cacheinfo.c @@ -12,7 +12,6 @@  #include <linux/cpu.h>  #include <linux/cpumask.h> -#include <linux/init.h>  #include <linux/kernel.h>  #include <linux/kobject.h>  #include <linux/list.h> @@ -131,7 +130,8 @@ static const char *cache_type_string(const struct cache *cache)  	return cache_type_info[cache->type].name;  } -static void __cpuinit cache_init(struct cache *cache, int type, int level, struct device_node *ofnode) +static void cache_init(struct cache *cache, int type, int level, +		       struct device_node *ofnode)  {  	cache->type = type;  	cache->level = level; @@ -140,7 +140,7 @@ static void __cpuinit cache_init(struct cache *cache, int type, int level, struc  	list_add(&cache->list, &cache_list);  } -static struct cache *__cpuinit new_cache(int type, int level, struct device_node *ofnode) +static struct cache *new_cache(int type, int level, struct device_node *ofnode)  {  	struct cache *cache; @@ -195,7 +195,7 @@ static void cache_cpu_set(struct cache *cache, int cpu)  static int cache_size(const struct cache *cache, unsigned int *ret)  {  	const char *propname; -	const u32 *cache_size; +	const __be32 *cache_size;  	propname = cache_type_info[cache->type].size_prop; @@ -203,7 +203,7 @@ static int cache_size(const struct cache *cache, unsigned int *ret)  	if (!cache_size)  		return -ENODEV; -	*ret = *cache_size; +	*ret = of_read_number(cache_size, 1);  	return 0;  } @@ -221,7 +221,7 @@ static int cache_size_kb(const struct cache *cache, unsigned int *ret)  /* not cache_line_size() because that's a macro in include/linux/cache.h */  static int cache_get_line_size(const struct cache *cache, unsigned int *ret)  { -	const u32 *line_size; +	const __be32 *line_size;  	int i, lim;  	lim = ARRAY_SIZE(cache_type_info[cache->type].line_size_props); @@ -238,14 +238,14 @@ static int cache_get_line_size(const struct cache *cache, unsigned int *ret)  	if (!line_size)  		return -ENODEV; -	*ret = *line_size; +	*ret = of_read_number(line_size, 1);  	return 0;  }  static int cache_nr_sets(const struct cache *cache, unsigned int *ret)  {  	const char *propname; -	const u32 *nr_sets; +	const __be32 *nr_sets;  	propname = cache_type_info[cache->type].nr_sets_prop; @@ -253,7 +253,7 @@ static int cache_nr_sets(const struct cache *cache, unsigned int *ret)  	if (!nr_sets)  		return -ENODEV; -	*ret = *nr_sets; +	*ret = of_read_number(nr_sets, 1);  	return 0;  } @@ -324,7 +324,8 @@ static bool cache_node_is_unified(const struct device_node *np)  	return of_get_property(np, "cache-unified", NULL);  } -static struct cache *__cpuinit cache_do_one_devnode_unified(struct device_node *node, int level) +static struct cache *cache_do_one_devnode_unified(struct device_node *node, +						  int level)  {  	struct cache *cache; @@ -335,7 +336,8 @@ static struct cache *__cpuinit cache_do_one_devnode_unified(struct device_node *  	return cache;  } -static struct cache *__cpuinit cache_do_one_devnode_split(struct device_node *node, int level) +static struct cache *cache_do_one_devnode_split(struct device_node *node, +						int level)  {  	struct cache *dcache, *icache; @@ -357,7 +359,7 @@ err:  	return NULL;  } -static struct cache *__cpuinit cache_do_one_devnode(struct device_node *node, int level) +static struct cache *cache_do_one_devnode(struct device_node *node, int level)  {  	struct cache *cache; @@ -369,7 +371,8 @@ static struct cache *__cpuinit cache_do_one_devnode(struct device_node *node, in  	return cache;  } -static struct cache *__cpuinit cache_lookup_or_instantiate(struct device_node *node, int level) +static struct cache *cache_lookup_or_instantiate(struct device_node *node, +						 int level)  {  	struct cache *cache; @@ -385,7 +388,7 @@ static struct cache *__cpuinit cache_lookup_or_instantiate(struct device_node *n  	return cache;  } -static void __cpuinit link_cache_lists(struct cache *smaller, struct cache *bigger) +static void link_cache_lists(struct cache *smaller, struct cache *bigger)  {  	while (smaller->next_local) {  		if (smaller->next_local == bigger) @@ -396,13 +399,13 @@ static void __cpuinit link_cache_lists(struct cache *smaller, struct cache *bigg  	smaller->next_local = bigger;  } -static void __cpuinit do_subsidiary_caches_debugcheck(struct cache *cache) +static void do_subsidiary_caches_debugcheck(struct cache *cache)  {  	WARN_ON_ONCE(cache->level != 1);  	WARN_ON_ONCE(strcmp(cache->ofnode->type, "cpu"));  } -static void __cpuinit do_subsidiary_caches(struct cache *cache) +static void do_subsidiary_caches(struct cache *cache)  {  	struct device_node *subcache_node;  	int level = cache->level; @@ -423,7 +426,7 @@ static void __cpuinit do_subsidiary_caches(struct cache *cache)  	}  } -static struct cache *__cpuinit cache_chain_instantiate(unsigned int cpu_id) +static struct cache *cache_chain_instantiate(unsigned int cpu_id)  {  	struct device_node *cpu_node;  	struct cache *cpu_cache = NULL; @@ -448,18 +451,18 @@ out:  	return cpu_cache;  } -static struct cache_dir *__cpuinit cacheinfo_create_cache_dir(unsigned int cpu_id) +static struct cache_dir *cacheinfo_create_cache_dir(unsigned int cpu_id)  {  	struct cache_dir *cache_dir; -	struct sys_device *sysdev; +	struct device *dev;  	struct kobject *kobj = NULL; -	sysdev = get_cpu_sysdev(cpu_id); -	WARN_ONCE(!sysdev, "no sysdev for CPU %i\n", cpu_id); -	if (!sysdev) +	dev = get_cpu_device(cpu_id); +	WARN_ONCE(!dev, "no dev for CPU %i\n", cpu_id); +	if (!dev)  		goto err; -	kobj = kobject_create_and_add("cache", &sysdev->kobj); +	kobj = kobject_create_and_add("cache", &dev->kobj);  	if (!kobj)  		goto err; @@ -653,7 +656,7 @@ static struct kobj_type cache_index_type = {  	.default_attrs = cache_index_default_attrs,  }; -static void __cpuinit cacheinfo_create_index_opt_attrs(struct cache_index_dir *dir) +static void cacheinfo_create_index_opt_attrs(struct cache_index_dir *dir)  {  	const char *cache_name;  	const char *cache_type; @@ -696,7 +699,8 @@ static void __cpuinit cacheinfo_create_index_opt_attrs(struct cache_index_dir *d  	kfree(buf);  } -static void __cpuinit cacheinfo_create_index_dir(struct cache *cache, int index, struct cache_dir *cache_dir) +static void cacheinfo_create_index_dir(struct cache *cache, int index, +				       struct cache_dir *cache_dir)  {  	struct cache_index_dir *index_dir;  	int rc; @@ -722,7 +726,8 @@ err:  	kfree(index_dir);  } -static void __cpuinit cacheinfo_sysfs_populate(unsigned int cpu_id, struct cache *cache_list) +static void cacheinfo_sysfs_populate(unsigned int cpu_id, +				     struct cache *cache_list)  {  	struct cache_dir *cache_dir;  	struct cache *cache; @@ -740,7 +745,7 @@ static void __cpuinit cacheinfo_sysfs_populate(unsigned int cpu_id, struct cache  	}  } -void __cpuinit cacheinfo_cpu_online(unsigned int cpu_id) +void cacheinfo_cpu_online(unsigned int cpu_id)  {  	struct cache *cache; @@ -751,7 +756,10 @@ void __cpuinit cacheinfo_cpu_online(unsigned int cpu_id)  	cacheinfo_sysfs_populate(cpu_id, cache);  } -#ifdef CONFIG_HOTPLUG_CPU /* functions needed for cpu offline */ +/* functions needed to remove cache entry for cpu offline or suspend/resume */ + +#if (defined(CONFIG_PPC_PSERIES) && defined(CONFIG_SUSPEND)) || \ +    defined(CONFIG_HOTPLUG_CPU)  static struct cache *cache_lookup_by_cpu(unsigned int cpu_id)  { @@ -788,6 +796,9 @@ static void remove_cache_dir(struct cache_dir *cache_dir)  {  	remove_index_dirs(cache_dir); +	/* Remove cache dir from sysfs */ +	kobject_del(cache_dir->kobj); +  	kobject_put(cache_dir->kobj);  	kfree(cache_dir); @@ -835,4 +846,4 @@ void cacheinfo_cpu_offline(unsigned int cpu_id)  	if (cache)  		cache_cpu_clear(cache, cpu_id);  } -#endif /* CONFIG_HOTPLUG_CPU */ +#endif /* (CONFIG_PPC_PSERIES && CONFIG_SUSPEND) || CONFIG_HOTPLUG_CPU */  | 
