diff options
| -rw-r--r-- | arch/ia64/kernel/palinfo.c | 8 | ||||
| -rw-r--r-- | arch/ia64/kernel/time.c | 2 | ||||
| -rw-r--r-- | arch/ia64/kernel/topology.c | 367 | ||||
| -rw-r--r-- | include/asm-ia64/pal.h | 34 |
4 files changed, 403 insertions, 8 deletions
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 89faa603c6be..6386f63c413e 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c | |||
| @@ -240,7 +240,7 @@ cache_info(char *page) | |||
| 240 | } | 240 | } |
| 241 | p += sprintf(p, | 241 | p += sprintf(p, |
| 242 | "%s Cache level %lu:\n" | 242 | "%s Cache level %lu:\n" |
| 243 | "\tSize : %lu bytes\n" | 243 | "\tSize : %u bytes\n" |
| 244 | "\tAttributes : ", | 244 | "\tAttributes : ", |
| 245 | cache_types[j+cci.pcci_unified], i+1, | 245 | cache_types[j+cci.pcci_unified], i+1, |
| 246 | cci.pcci_cache_size); | 246 | cci.pcci_cache_size); |
| @@ -648,9 +648,9 @@ frequency_info(char *page) | |||
| 648 | if (ia64_pal_freq_ratios(&proc, &bus, &itc) != 0) return 0; | 648 | if (ia64_pal_freq_ratios(&proc, &bus, &itc) != 0) return 0; |
| 649 | 649 | ||
| 650 | p += sprintf(p, | 650 | p += sprintf(p, |
| 651 | "Processor/Clock ratio : %ld/%ld\n" | 651 | "Processor/Clock ratio : %d/%d\n" |
| 652 | "Bus/Clock ratio : %ld/%ld\n" | 652 | "Bus/Clock ratio : %d/%d\n" |
| 653 | "ITC/Clock ratio : %ld/%ld\n", | 653 | "ITC/Clock ratio : %d/%d\n", |
| 654 | proc.num, proc.den, bus.num, bus.den, itc.num, itc.den); | 654 | proc.num, proc.den, bus.num, bus.den, itc.num, itc.den); |
| 655 | 655 | ||
| 656 | return p - page; | 656 | return p - page; |
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index ac167436e936..49958904045b 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
| @@ -188,7 +188,7 @@ ia64_init_itm (void) | |||
| 188 | itc_freq = (platform_base_freq*itc_ratio.num)/itc_ratio.den; | 188 | itc_freq = (platform_base_freq*itc_ratio.num)/itc_ratio.den; |
| 189 | 189 | ||
| 190 | local_cpu_data->itm_delta = (itc_freq + HZ/2) / HZ; | 190 | local_cpu_data->itm_delta = (itc_freq + HZ/2) / HZ; |
| 191 | printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%lu/%lu, " | 191 | printk(KERN_DEBUG "CPU %d: base freq=%lu.%03luMHz, ITC ratio=%u/%u, " |
| 192 | "ITC freq=%lu.%03luMHz", smp_processor_id(), | 192 | "ITC freq=%lu.%03luMHz", smp_processor_id(), |
| 193 | platform_base_freq / 1000000, (platform_base_freq / 1000) % 1000, | 193 | platform_base_freq / 1000000, (platform_base_freq / 1000) % 1000, |
| 194 | itc_ratio.num, itc_ratio.den, itc_freq / 1000000, (itc_freq / 1000) % 1000); | 194 | itc_ratio.num, itc_ratio.den, itc_freq / 1000000, (itc_freq / 1000) % 1000); |
diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index 3b6fd798c4d6..b47476d655f1 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c | |||
| @@ -9,6 +9,8 @@ | |||
| 9 | * 2002/08/07 Erich Focht <efocht@ess.nec.de> | 9 | * 2002/08/07 Erich Focht <efocht@ess.nec.de> |
| 10 | * Populate cpu entries in sysfs for non-numa systems as well | 10 | * Populate cpu entries in sysfs for non-numa systems as well |
| 11 | * Intel Corporation - Ashok Raj | 11 | * Intel Corporation - Ashok Raj |
| 12 | * 02/27/2006 Zhang, Yanmin | ||
| 13 | * Populate cpu cache entries in sysfs for cpu cache info | ||
| 12 | */ | 14 | */ |
| 13 | 15 | ||
| 14 | #include <linux/config.h> | 16 | #include <linux/config.h> |
| @@ -19,6 +21,7 @@ | |||
| 19 | #include <linux/init.h> | 21 | #include <linux/init.h> |
| 20 | #include <linux/bootmem.h> | 22 | #include <linux/bootmem.h> |
| 21 | #include <linux/nodemask.h> | 23 | #include <linux/nodemask.h> |
| 24 | #include <linux/notifier.h> | ||
| 22 | #include <asm/mmzone.h> | 25 | #include <asm/mmzone.h> |
| 23 | #include <asm/numa.h> | 26 | #include <asm/numa.h> |
| 24 | #include <asm/cpu.h> | 27 | #include <asm/cpu.h> |
| @@ -101,3 +104,367 @@ out: | |||
| 101 | } | 104 | } |
| 102 | 105 | ||
| 103 | subsys_initcall(topology_init); | 106 | subsys_initcall(topology_init); |
| 107 | |||
| 108 | |||
| 109 | /* | ||
| 110 | * Export cpu cache information through sysfs | ||
| 111 | */ | ||
| 112 | |||
| 113 | /* | ||
| 114 | * A bunch of string array to get pretty printing | ||
| 115 | */ | ||
| 116 | static const char *cache_types[] = { | ||
| 117 | "", /* not used */ | ||
| 118 | "Instruction", | ||
| 119 | "Data", | ||
| 120 | "Unified" /* unified */ | ||
| 121 | }; | ||
| 122 | |||
| 123 | static const char *cache_mattrib[]={ | ||
| 124 | "WriteThrough", | ||
| 125 | "WriteBack", | ||
| 126 | "", /* reserved */ | ||
| 127 | "" /* reserved */ | ||
| 128 | }; | ||
| 129 | |||
| 130 | struct cache_info { | ||
| 131 | pal_cache_config_info_t cci; | ||
| 132 | cpumask_t shared_cpu_map; | ||
| 133 | int level; | ||
| 134 | int type; | ||
| 135 | struct kobject kobj; | ||
| 136 | }; | ||
| 137 | |||
| 138 | struct cpu_cache_info { | ||
| 139 | struct cache_info *cache_leaves; | ||
| 140 | int num_cache_leaves; | ||
| 141 | struct kobject kobj; | ||
| 142 | }; | ||
| 143 | |||
| 144 | static struct cpu_cache_info all_cpu_cache_info[NR_CPUS]; | ||
| 145 | #define LEAF_KOBJECT_PTR(x,y) (&all_cpu_cache_info[x].cache_leaves[y]) | ||
| 146 | |||
| 147 | #ifdef CONFIG_SMP | ||
| 148 | static void cache_shared_cpu_map_setup( unsigned int cpu, | ||
| 149 | struct cache_info * this_leaf) | ||
| 150 | { | ||
| 151 | pal_cache_shared_info_t csi; | ||
| 152 | int num_shared, i = 0; | ||
| 153 | unsigned int j; | ||
| 154 | |||
| 155 | if (cpu_data(cpu)->threads_per_core <= 1 && | ||
| 156 | cpu_data(cpu)->cores_per_socket <= 1) { | ||
| 157 | cpu_set(cpu, this_leaf->shared_cpu_map); | ||
| 158 | return; | ||
| 159 | } | ||
| 160 | |||
| 161 | if (ia64_pal_cache_shared_info(this_leaf->level, | ||
| 162 | this_leaf->type, | ||
| 163 | 0, | ||
| 164 | &csi) != PAL_STATUS_SUCCESS) | ||
| 165 | return; | ||
| 166 | |||
| 167 | num_shared = (int) csi.num_shared; | ||
| 168 | do { | ||
| 169 | for_each_cpu(j) | ||
| 170 | if (cpu_data(cpu)->socket_id == cpu_data(j)->socket_id | ||
| 171 | && cpu_data(j)->core_id == csi.log1_cid | ||
| 172 | && cpu_data(j)->thread_id == csi.log1_tid) | ||
| 173 | cpu_set(j, this_leaf->shared_cpu_map); | ||
| 174 | |||
| 175 | i++; | ||
| 176 | } while (i < num_shared && | ||
| 177 | ia64_pal_cache_shared_info(this_leaf->level, | ||
| 178 | this_leaf->type, | ||
| 179 | i, | ||
| 180 | &csi) == PAL_STATUS_SUCCESS); | ||
| 181 | } | ||
| 182 | #else | ||
| 183 | static void cache_shared_cpu_map_setup(unsigned int cpu, | ||
| 184 | struct cache_info * this_leaf) | ||
| 185 | { | ||
| 186 | cpu_set(cpu, this_leaf->shared_cpu_map); | ||
| 187 | return; | ||
| 188 | } | ||
| 189 | #endif | ||
| 190 | |||
| 191 | static ssize_t show_coherency_line_size(struct cache_info *this_leaf, | ||
| 192 | char *buf) | ||
| 193 | { | ||
| 194 | return sprintf(buf, "%u\n", 1 << this_leaf->cci.pcci_line_size); | ||
| 195 | } | ||
| 196 | |||
| 197 | static ssize_t show_ways_of_associativity(struct cache_info *this_leaf, | ||
| 198 | char *buf) | ||
| 199 | { | ||
| 200 | return sprintf(buf, "%u\n", this_leaf->cci.pcci_assoc); | ||
| 201 | } | ||
| 202 | |||
| 203 | static ssize_t show_attributes(struct cache_info *this_leaf, char *buf) | ||
| 204 | { | ||
| 205 | return sprintf(buf, | ||
| 206 | "%s\n", | ||
| 207 | cache_mattrib[this_leaf->cci.pcci_cache_attr]); | ||
| 208 | } | ||
| 209 | |||
| 210 | static ssize_t show_size(struct cache_info *this_leaf, char *buf) | ||
| 211 | { | ||
| 212 | return sprintf(buf, "%uK\n", this_leaf->cci.pcci_cache_size / 1024); | ||
| 213 | } | ||
| 214 | |||
| 215 | static ssize_t show_number_of_sets(struct cache_info *this_leaf, char *buf) | ||
| 216 | { | ||
| 217 | unsigned number_of_sets = this_leaf->cci.pcci_cache_size; | ||
| 218 | number_of_sets /= this_leaf->cci.pcci_assoc; | ||
| 219 | number_of_sets /= 1 << this_leaf->cci.pcci_line_size; | ||
| 220 | |||
| 221 | return sprintf(buf, "%u\n", number_of_sets); | ||
| 222 | } | ||
| 223 | |||
| 224 | static ssize_t show_shared_cpu_map(struct cache_info *this_leaf, char *buf) | ||
| 225 | { | ||
| 226 | ssize_t len; | ||
| 227 | cpumask_t shared_cpu_map; | ||
| 228 | |||
| 229 | cpus_and(shared_cpu_map, this_leaf->shared_cpu_map, cpu_online_map); | ||
| 230 | len = cpumask_scnprintf(buf, NR_CPUS+1, shared_cpu_map); | ||
| 231 | len += sprintf(buf+len, "\n"); | ||
| 232 | return len; | ||
| 233 | } | ||
| 234 | |||
| 235 | static ssize_t show_type(struct cache_info *this_leaf, char *buf) | ||
| 236 | { | ||
| 237 | int type = this_leaf->type + this_leaf->cci.pcci_unified; | ||
| 238 | return sprintf(buf, "%s\n", cache_types[type]); | ||
| 239 | } | ||
| 240 | |||
| 241 | static ssize_t show_level(struct cache_info *this_leaf, char *buf) | ||
| 242 | { | ||
| 243 | return sprintf(buf, "%u\n", this_leaf->level); | ||
| 244 | } | ||
| 245 | |||
| 246 | struct cache_attr { | ||
| 247 | struct attribute attr; | ||
| 248 | ssize_t (*show)(struct cache_info *, char *); | ||
| 249 | ssize_t (*store)(struct cache_info *, const char *, size_t count); | ||
| 250 | }; | ||
| 251 | |||
| 252 | #ifdef define_one_ro | ||
| 253 | #undef define_one_ro | ||
| 254 | #endif | ||
| 255 | #define define_one_ro(_name) \ | ||
| 256 | static struct cache_attr _name = \ | ||
| 257 | __ATTR(_name, 0444, show_##_name, NULL) | ||
| 258 | |||
| 259 | define_one_ro(level); | ||
| 260 | define_one_ro(type); | ||
| 261 | define_one_ro(coherency_line_size); | ||
| 262 | define_one_ro(ways_of_associativity); | ||
| 263 | define_one_ro(size); | ||
| 264 | define_one_ro(number_of_sets); | ||
| 265 | define_one_ro(shared_cpu_map); | ||
| 266 | define_one_ro(attributes); | ||
| 267 | |||
| 268 | static struct attribute * cache_default_attrs[] = { | ||
| 269 | &type.attr, | ||
| 270 | &level.attr, | ||
| 271 | &coherency_line_size.attr, | ||
| 272 | &ways_of_associativity.attr, | ||
| 273 | &attributes.attr, | ||
| 274 | &size.attr, | ||
| 275 | &number_of_sets.attr, | ||
| 276 | &shared_cpu_map.attr, | ||
| 277 | NULL | ||
| 278 | }; | ||
| 279 | |||
| 280 | #define to_object(k) container_of(k, struct cache_info, kobj) | ||
| 281 | #define to_attr(a) container_of(a, struct cache_attr, attr) | ||
| 282 | |||
| 283 | static ssize_t cache_show(struct kobject * kobj, struct attribute * attr, char * buf) | ||
| 284 | { | ||
| 285 | struct cache_attr *fattr = to_attr(attr); | ||
| 286 | struct cache_info *this_leaf = to_object(kobj); | ||
| 287 | ssize_t ret; | ||
| 288 | |||
| 289 | ret = fattr->show ? fattr->show(this_leaf, buf) : 0; | ||
| 290 | return ret; | ||
| 291 | } | ||
| 292 | |||
| 293 | static struct sysfs_ops cache_sysfs_ops = { | ||
| 294 | .show = cache_show | ||
| 295 | }; | ||
| 296 | |||
| 297 | static struct kobj_type cache_ktype = { | ||
| 298 | .sysfs_ops = &cache_sysfs_ops, | ||
| 299 | .default_attrs = cache_default_attrs, | ||
| 300 | }; | ||
| 301 | |||
| 302 | static struct kobj_type cache_ktype_percpu_entry = { | ||
| 303 | .sysfs_ops = &cache_sysfs_ops, | ||
| 304 | }; | ||
| 305 | |||
| 306 | static void __cpuinit cpu_cache_sysfs_exit(unsigned int cpu) | ||
| 307 | { | ||
| 308 | if (all_cpu_cache_info[cpu].cache_leaves) { | ||
| 309 | kfree(all_cpu_cache_info[cpu].cache_leaves); | ||
| 310 | all_cpu_cache_info[cpu].cache_leaves = NULL; | ||
| 311 | } | ||
| 312 | all_cpu_cache_info[cpu].num_cache_leaves = 0; | ||
| 313 | memset(&all_cpu_cache_info[cpu].kobj, 0, sizeof(struct kobject)); | ||
| 314 | |||
| 315 | return; | ||
| 316 | } | ||
| 317 | |||
| 318 | static int __cpuinit cpu_cache_sysfs_init(unsigned int cpu) | ||
| 319 | { | ||
| 320 | u64 i, levels, unique_caches; | ||
| 321 | pal_cache_config_info_t cci; | ||
| 322 | int j; | ||
| 323 | s64 status; | ||
| 324 | struct cache_info *this_cache; | ||
| 325 | int num_cache_leaves = 0; | ||
| 326 | |||
| 327 | if ((status = ia64_pal_cache_summary(&levels, &unique_caches)) != 0) { | ||
| 328 | printk(KERN_ERR "ia64_pal_cache_summary=%ld\n", status); | ||
| 329 | return -1; | ||
| 330 | } | ||
| 331 | |||
| 332 | this_cache=kzalloc(sizeof(struct cache_info)*unique_caches, | ||
| 333 | GFP_KERNEL); | ||
| 334 | if (this_cache == NULL) | ||
| 335 | return -ENOMEM; | ||
| 336 | |||
| 337 | for (i=0; i < levels; i++) { | ||
| 338 | for (j=2; j >0 ; j--) { | ||
| 339 | if ((status=ia64_pal_cache_config_info(i,j, &cci)) != | ||
| 340 | PAL_STATUS_SUCCESS) | ||
| 341 | continue; | ||
| 342 | |||
| 343 | this_cache[num_cache_leaves].cci = cci; | ||
| 344 | this_cache[num_cache_leaves].level = i + 1; | ||
| 345 | this_cache[num_cache_leaves].type = j; | ||
| 346 | |||
| 347 | cache_shared_cpu_map_setup(cpu, | ||
| 348 | &this_cache[num_cache_leaves]); | ||
| 349 | num_cache_leaves ++; | ||
| 350 | } | ||
| 351 | } | ||
| 352 | |||
| 353 | all_cpu_cache_info[cpu].cache_leaves = this_cache; | ||
| 354 | all_cpu_cache_info[cpu].num_cache_leaves = num_cache_leaves; | ||
| 355 | |||
| 356 | memset(&all_cpu_cache_info[cpu].kobj, 0, sizeof(struct kobject)); | ||
| 357 | |||
| 358 | return 0; | ||
| 359 | } | ||
| 360 | |||
| 361 | /* Add cache interface for CPU device */ | ||
| 362 | static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | ||
| 363 | { | ||
| 364 | unsigned int cpu = sys_dev->id; | ||
| 365 | unsigned long i, j; | ||
| 366 | struct cache_info *this_object; | ||
| 367 | int retval = 0; | ||
| 368 | cpumask_t oldmask; | ||
| 369 | |||
| 370 | if (all_cpu_cache_info[cpu].kobj.parent) | ||
| 371 | return 0; | ||
| 372 | |||
| 373 | oldmask = current->cpus_allowed; | ||
| 374 | retval = set_cpus_allowed(current, cpumask_of_cpu(cpu)); | ||
| 375 | if (unlikely(retval)) | ||
| 376 | return retval; | ||
| 377 | |||
| 378 | retval = cpu_cache_sysfs_init(cpu); | ||
| 379 | set_cpus_allowed(current, oldmask); | ||
| 380 | if (unlikely(retval < 0)) | ||
| 381 | return retval; | ||
| 382 | |||
| 383 | all_cpu_cache_info[cpu].kobj.parent = &sys_dev->kobj; | ||
| 384 | kobject_set_name(&all_cpu_cache_info[cpu].kobj, "%s", "cache"); | ||
| 385 | all_cpu_cache_info[cpu].kobj.ktype = &cache_ktype_percpu_entry; | ||
| 386 | retval = kobject_register(&all_cpu_cache_info[cpu].kobj); | ||
| 387 | |||
| 388 | for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) { | ||
| 389 | this_object = LEAF_KOBJECT_PTR(cpu,i); | ||
| 390 | this_object->kobj.parent = &all_cpu_cache_info[cpu].kobj; | ||
| 391 | kobject_set_name(&(this_object->kobj), "index%1lu", i); | ||
| 392 | this_object->kobj.ktype = &cache_ktype; | ||
| 393 | retval = kobject_register(&(this_object->kobj)); | ||
| 394 | if (unlikely(retval)) { | ||
| 395 | for (j = 0; j < i; j++) { | ||
| 396 | kobject_unregister( | ||
| 397 | &(LEAF_KOBJECT_PTR(cpu,j)->kobj)); | ||
| 398 | } | ||
| 399 | kobject_unregister(&all_cpu_cache_info[cpu].kobj); | ||
| 400 | cpu_cache_sysfs_exit(cpu); | ||
| 401 | break; | ||
| 402 | } | ||
| 403 | } | ||
| 404 | return retval; | ||
| 405 | } | ||
| 406 | |||
| 407 | /* Remove cache interface for CPU device */ | ||
| 408 | static int __cpuinit cache_remove_dev(struct sys_device * sys_dev) | ||
| 409 | { | ||
| 410 | unsigned int cpu = sys_dev->id; | ||
| 411 | unsigned long i; | ||
| 412 | |||
| 413 | for (i = 0; i < all_cpu_cache_info[cpu].num_cache_leaves; i++) | ||
| 414 | kobject_unregister(&(LEAF_KOBJECT_PTR(cpu,i)->kobj)); | ||
| 415 | |||
| 416 | if (all_cpu_cache_info[cpu].kobj.parent) { | ||
| 417 | kobject_unregister(&all_cpu_cache_info[cpu].kobj); | ||
| 418 | memset(&all_cpu_cache_info[cpu].kobj, | ||
| 419 | 0, | ||
| 420 | sizeof(struct kobject)); | ||
| 421 | } | ||
| 422 | |||
| 423 | cpu_cache_sysfs_exit(cpu); | ||
| 424 | |||
| 425 | return 0; | ||
| 426 | } | ||
| 427 | |||
| 428 | /* | ||
| 429 | * When a cpu is hot-plugged, do a check and initiate | ||
| 430 | * cache kobject if necessary | ||
| 431 | */ | ||
| 432 | static int __cpuinit cache_cpu_callback(struct notifier_block *nfb, | ||
| 433 | unsigned long action, void *hcpu) | ||
| 434 | { | ||
| 435 | unsigned int cpu = (unsigned long)hcpu; | ||
| 436 | struct sys_device *sys_dev; | ||
| 437 | |||
| 438 | sys_dev = get_cpu_sysdev(cpu); | ||
| 439 | switch (action) { | ||
| 440 | case CPU_ONLINE: | ||
| 441 | cache_add_dev(sys_dev); | ||
| 442 | break; | ||
| 443 | case CPU_DEAD: | ||
| 444 | cache_remove_dev(sys_dev); | ||
| 445 | break; | ||
| 446 | } | ||
| 447 | return NOTIFY_OK; | ||
| 448 | } | ||
| 449 | |||
| 450 | static struct notifier_block cache_cpu_notifier = | ||
| 451 | { | ||
| 452 | .notifier_call = cache_cpu_callback | ||
| 453 | }; | ||
| 454 | |||
| 455 | static int __cpuinit cache_sysfs_init(void) | ||
| 456 | { | ||
| 457 | int i; | ||
| 458 | |||
| 459 | for_each_online_cpu(i) { | ||
| 460 | cache_cpu_callback(&cache_cpu_notifier, CPU_ONLINE, | ||
| 461 | (void *)(long)i); | ||
| 462 | } | ||
| 463 | |||
| 464 | register_cpu_notifier(&cache_cpu_notifier); | ||
| 465 | |||
| 466 | return 0; | ||
| 467 | } | ||
| 468 | |||
| 469 | device_initcall(cache_sysfs_init); | ||
| 470 | |||
diff --git a/include/asm-ia64/pal.h b/include/asm-ia64/pal.h index 4e7e6f23b08c..37e52a2836b0 100644 --- a/include/asm-ia64/pal.h +++ b/include/asm-ia64/pal.h | |||
| @@ -68,6 +68,7 @@ | |||
| 68 | #define PAL_SHUTDOWN 40 /* enter processor shutdown state */ | 68 | #define PAL_SHUTDOWN 40 /* enter processor shutdown state */ |
| 69 | #define PAL_PREFETCH_VISIBILITY 41 /* Make Processor Prefetches Visible */ | 69 | #define PAL_PREFETCH_VISIBILITY 41 /* Make Processor Prefetches Visible */ |
| 70 | #define PAL_LOGICAL_TO_PHYSICAL 42 /* returns information on logical to physical processor mapping */ | 70 | #define PAL_LOGICAL_TO_PHYSICAL 42 /* returns information on logical to physical processor mapping */ |
| 71 | #define PAL_CACHE_SHARED_INFO 43 /* returns information on caches shared by logical processor */ | ||
| 71 | 72 | ||
| 72 | #define PAL_COPY_PAL 256 /* relocate PAL procedures and PAL PMI */ | 73 | #define PAL_COPY_PAL 256 /* relocate PAL procedures and PAL PMI */ |
| 73 | #define PAL_HALT_INFO 257 /* return the low power capabilities of processor */ | 74 | #define PAL_HALT_INFO 257 /* return the low power capabilities of processor */ |
| @@ -130,7 +131,7 @@ typedef u64 pal_cache_line_state_t; | |||
| 130 | #define PAL_CACHE_LINE_STATE_MODIFIED 3 /* Modified */ | 131 | #define PAL_CACHE_LINE_STATE_MODIFIED 3 /* Modified */ |
| 131 | 132 | ||
| 132 | typedef struct pal_freq_ratio { | 133 | typedef struct pal_freq_ratio { |
| 133 | u64 den : 32, num : 32; /* numerator & denominator */ | 134 | u32 den, num; /* numerator & denominator */ |
| 134 | } itc_ratio, proc_ratio; | 135 | } itc_ratio, proc_ratio; |
| 135 | 136 | ||
| 136 | typedef union pal_cache_config_info_1_s { | 137 | typedef union pal_cache_config_info_1_s { |
| @@ -151,10 +152,10 @@ typedef union pal_cache_config_info_1_s { | |||
| 151 | 152 | ||
| 152 | typedef union pal_cache_config_info_2_s { | 153 | typedef union pal_cache_config_info_2_s { |
| 153 | struct { | 154 | struct { |
| 154 | u64 cache_size : 32, /*cache size in bytes*/ | 155 | u32 cache_size; /*cache size in bytes*/ |
| 155 | 156 | ||
| 156 | 157 | ||
| 157 | alias_boundary : 8, /* 39-32 aliased addr | 158 | u32 alias_boundary : 8, /* 39-32 aliased addr |
| 158 | * separation for max | 159 | * separation for max |
| 159 | * performance. | 160 | * performance. |
| 160 | */ | 161 | */ |
| @@ -1647,6 +1648,33 @@ ia64_pal_logical_to_phys(u64 proc_number, pal_logical_to_physical_t *mapping) | |||
| 1647 | 1648 | ||
| 1648 | return iprv.status; | 1649 | return iprv.status; |
| 1649 | } | 1650 | } |
| 1651 | |||
| 1652 | typedef struct pal_cache_shared_info_s | ||
| 1653 | { | ||
| 1654 | u64 num_shared; | ||
| 1655 | pal_proc_n_log_info1_t ppli1; | ||
| 1656 | pal_proc_n_log_info2_t ppli2; | ||
| 1657 | } pal_cache_shared_info_t; | ||
| 1658 | |||
| 1659 | /* Get information on logical to physical processor mappings. */ | ||
| 1660 | static inline s64 | ||
| 1661 | ia64_pal_cache_shared_info(u64 level, | ||
| 1662 | u64 type, | ||
| 1663 | u64 proc_number, | ||
| 1664 | pal_cache_shared_info_t *info) | ||
| 1665 | { | ||
| 1666 | struct ia64_pal_retval iprv; | ||
| 1667 | |||
| 1668 | PAL_CALL(iprv, PAL_CACHE_SHARED_INFO, level, type, proc_number); | ||
| 1669 | |||
| 1670 | if (iprv.status == PAL_STATUS_SUCCESS) { | ||
| 1671 | info->num_shared = iprv.v0; | ||
| 1672 | info->ppli1.ppli1_data = iprv.v1; | ||
| 1673 | info->ppli2.ppli2_data = iprv.v2; | ||
| 1674 | } | ||
| 1675 | |||
| 1676 | return iprv.status; | ||
| 1677 | } | ||
| 1650 | #endif /* __ASSEMBLY__ */ | 1678 | #endif /* __ASSEMBLY__ */ |
| 1651 | 1679 | ||
| 1652 | #endif /* _ASM_IA64_PAL_H */ | 1680 | #endif /* _ASM_IA64_PAL_H */ |
