aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/lparcfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc/kernel/lparcfg.c')
-rw-r--r--arch/powerpc/kernel/lparcfg.c70
1 files changed, 34 insertions, 36 deletions
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c
index 50362b6ef6e9..84daabe2fcba 100644
--- a/arch/powerpc/kernel/lparcfg.c
+++ b/arch/powerpc/kernel/lparcfg.c
@@ -56,7 +56,7 @@ static unsigned long get_purr(void)
56 56
57 for_each_possible_cpu(cpu) { 57 for_each_possible_cpu(cpu) {
58 if (firmware_has_feature(FW_FEATURE_ISERIES)) 58 if (firmware_has_feature(FW_FEATURE_ISERIES))
59 sum_purr += lppaca[cpu].emulated_time_base; 59 sum_purr += lppaca_of(cpu).emulated_time_base;
60 else { 60 else {
61 struct cpu_usage *cu; 61 struct cpu_usage *cu;
62 62
@@ -132,34 +132,6 @@ static int iseries_lparcfg_data(struct seq_file *m, void *v)
132/* 132/*
133 * Methods used to fetch LPAR data when running on a pSeries platform. 133 * Methods used to fetch LPAR data when running on a pSeries platform.
134 */ 134 */
135/**
136 * h_get_mpp
137 * H_GET_MPP hcall returns info in 7 parms
138 */
139int h_get_mpp(struct hvcall_mpp_data *mpp_data)
140{
141 int rc;
142 unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
143
144 rc = plpar_hcall9(H_GET_MPP, retbuf);
145
146 mpp_data->entitled_mem = retbuf[0];
147 mpp_data->mapped_mem = retbuf[1];
148
149 mpp_data->group_num = (retbuf[2] >> 2 * 8) & 0xffff;
150 mpp_data->pool_num = retbuf[2] & 0xffff;
151
152 mpp_data->mem_weight = (retbuf[3] >> 7 * 8) & 0xff;
153 mpp_data->unallocated_mem_weight = (retbuf[3] >> 6 * 8) & 0xff;
154 mpp_data->unallocated_entitlement = retbuf[3] & 0xffffffffffff;
155
156 mpp_data->pool_size = retbuf[4];
157 mpp_data->loan_request = retbuf[5];
158 mpp_data->backing_mem = retbuf[6];
159
160 return rc;
161}
162EXPORT_SYMBOL(h_get_mpp);
163 135
164struct hvcall_ppp_data { 136struct hvcall_ppp_data {
165 u64 entitlement; 137 u64 entitlement;
@@ -262,8 +234,8 @@ static void parse_ppp_data(struct seq_file *m)
262 seq_printf(m, "system_active_processors=%d\n", 234 seq_printf(m, "system_active_processors=%d\n",
263 ppp_data.active_system_procs); 235 ppp_data.active_system_procs);
264 236
265 /* pool related entries are apropriate for shared configs */ 237 /* pool related entries are appropriate for shared configs */
266 if (lppaca[0].shared_proc) { 238 if (lppaca_of(0).shared_proc) {
267 unsigned long pool_idle_time, pool_procs; 239 unsigned long pool_idle_time, pool_procs;
268 240
269 seq_printf(m, "pool=%d\n", ppp_data.pool_num); 241 seq_printf(m, "pool=%d\n", ppp_data.pool_num);
@@ -345,6 +317,30 @@ static void parse_mpp_data(struct seq_file *m)
345 seq_printf(m, "backing_memory=%ld bytes\n", mpp_data.backing_mem); 317 seq_printf(m, "backing_memory=%ld bytes\n", mpp_data.backing_mem);
346} 318}
347 319
320/**
321 * parse_mpp_x_data
322 * Parse out data returned from h_get_mpp_x
323 */
324static void parse_mpp_x_data(struct seq_file *m)
325{
326 struct hvcall_mpp_x_data mpp_x_data;
327
328 if (!firmware_has_feature(FW_FEATURE_XCMO))
329 return;
330 if (h_get_mpp_x(&mpp_x_data))
331 return;
332
333 seq_printf(m, "coalesced_bytes=%ld\n", mpp_x_data.coalesced_bytes);
334
335 if (mpp_x_data.pool_coalesced_bytes)
336 seq_printf(m, "pool_coalesced_bytes=%ld\n",
337 mpp_x_data.pool_coalesced_bytes);
338 if (mpp_x_data.pool_purr_cycles)
339 seq_printf(m, "coalesce_pool_purr=%ld\n", mpp_x_data.pool_purr_cycles);
340 if (mpp_x_data.pool_spurr_cycles)
341 seq_printf(m, "coalesce_pool_spurr=%ld\n", mpp_x_data.pool_spurr_cycles);
342}
343
348#define SPLPAR_CHARACTERISTICS_TOKEN 20 344#define SPLPAR_CHARACTERISTICS_TOKEN 20
349#define SPLPAR_MAXLENGTH 1026*(sizeof(char)) 345#define SPLPAR_MAXLENGTH 1026*(sizeof(char))
350 346
@@ -460,8 +456,8 @@ static void pseries_cmo_data(struct seq_file *m)
460 return; 456 return;
461 457
462 for_each_possible_cpu(cpu) { 458 for_each_possible_cpu(cpu) {
463 cmo_faults += lppaca[cpu].cmo_faults; 459 cmo_faults += lppaca_of(cpu).cmo_faults;
464 cmo_fault_time += lppaca[cpu].cmo_fault_time; 460 cmo_fault_time += lppaca_of(cpu).cmo_fault_time;
465 } 461 }
466 462
467 seq_printf(m, "cmo_faults=%lu\n", cmo_faults); 463 seq_printf(m, "cmo_faults=%lu\n", cmo_faults);
@@ -479,8 +475,8 @@ static void splpar_dispatch_data(struct seq_file *m)
479 unsigned long dispatch_dispersions = 0; 475 unsigned long dispatch_dispersions = 0;
480 476
481 for_each_possible_cpu(cpu) { 477 for_each_possible_cpu(cpu) {
482 dispatches += lppaca[cpu].yield_count; 478 dispatches += lppaca_of(cpu).yield_count;
483 dispatch_dispersions += lppaca[cpu].dispersion_count; 479 dispatch_dispersions += lppaca_of(cpu).dispersion_count;
484 } 480 }
485 481
486 seq_printf(m, "dispatches=%lu\n", dispatches); 482 seq_printf(m, "dispatches=%lu\n", dispatches);
@@ -520,6 +516,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
520 parse_system_parameter_string(m); 516 parse_system_parameter_string(m);
521 parse_ppp_data(m); 517 parse_ppp_data(m);
522 parse_mpp_data(m); 518 parse_mpp_data(m);
519 parse_mpp_x_data(m);
523 pseries_cmo_data(m); 520 pseries_cmo_data(m);
524 splpar_dispatch_data(m); 521 splpar_dispatch_data(m);
525 522
@@ -545,7 +542,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
545 seq_printf(m, "partition_potential_processors=%d\n", 542 seq_printf(m, "partition_potential_processors=%d\n",
546 partition_potential_processors); 543 partition_potential_processors);
547 544
548 seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc); 545 seq_printf(m, "shared_processor_mode=%d\n", lppaca_of(0).shared_proc);
549 546
550 seq_printf(m, "slb_size=%d\n", mmu_slb_size); 547 seq_printf(m, "slb_size=%d\n", mmu_slb_size);
551 548
@@ -780,6 +777,7 @@ static const struct file_operations lparcfg_fops = {
780 .write = lparcfg_write, 777 .write = lparcfg_write,
781 .open = lparcfg_open, 778 .open = lparcfg_open,
782 .release = single_release, 779 .release = single_release,
780 .llseek = seq_lseek,
783}; 781};
784 782
785static int __init lparcfg_init(void) 783static int __init lparcfg_init(void)