Lines Matching +full:spe +full:- +full:pmu
1 // SPDX-License-Identifier: GPL-2.0-only
18 #include <asm/cell-pmu.h>
66 * struct ps3_lpm_shadow_regs - Performance monitor shadow registers.
73 * The logical performance monitor provides a write-only interface to
91 * struct ps3_lpm_priv - Private lpm device data.
137 * lpm_priv - Static instance of the lpm data.
148 BUG_ON(!lpm_priv || !lpm_priv->sbd); in sbd_core()
149 return &lpm_priv->sbd->core; in sbd_core()
153 * use_start_stop_bookmark - Enable the PPU bookmark trace.
192 * ps3_read_phys_ctr - Read physical counter registers.
210 result = lv1_set_lpm_counter(lpm_priv->lpm_id, 0, 0, 0, 0, &counter0415, in ps3_read_phys_ctr()
236 * ps3_write_phys_ctr - Write physical counter registers.
285 result = lv1_set_lpm_counter(lpm_priv->lpm_id, in ps3_write_phys_ctr()
297 * ps3_read_ctr - Read counter.
306 u32 phys_ctr = ctr & (NR_PHYS_CTRS - 1); in ps3_read_ctr()
318 * ps3_write_ctr - Write counter.
329 phys_ctr = ctr & (NR_PHYS_CTRS - 1); in ps3_write_ctr()
345 * ps3_read_pm07_control - Read counter control registers.
357 * ps3_write_pm07_control - Write counter control registers.
374 result = lv1_set_lpm_counter_control(lpm_priv->lpm_id, ctr, val, mask, in ps3_write_pm07_control()
384 * ps3_read_pm - Read Other LPM control registers.
394 return lpm_priv->shadow.pm_control; in ps3_read_pm()
398 return lpm_priv->shadow.pm_start_stop; in ps3_read_pm()
400 result = lv1_set_lpm_interval(lpm_priv->lpm_id, 0, 0, &val); in ps3_read_pm()
409 return lpm_priv->shadow.group_control; in ps3_read_pm()
411 return lpm_priv->shadow.debug_bus_control; in ps3_read_pm()
413 result = lv1_get_lpm_interrupt_status(lpm_priv->lpm_id, in ps3_read_pm()
436 * ps3_write_pm - Write Other LPM control registers.
446 if (val != lpm_priv->shadow.group_control) in ps3_write_pm()
447 result = lv1_set_lpm_group_control(lpm_priv->lpm_id, in ps3_write_pm()
451 lpm_priv->shadow.group_control = val; in ps3_write_pm()
454 if (val != lpm_priv->shadow.debug_bus_control) in ps3_write_pm()
455 result = lv1_set_lpm_debug_bus_control(lpm_priv->lpm_id, in ps3_write_pm()
459 lpm_priv->shadow.debug_bus_control = val; in ps3_write_pm()
465 if (val != lpm_priv->shadow.pm_control) in ps3_write_pm()
466 result = lv1_set_lpm_general_control(lpm_priv->lpm_id, in ps3_write_pm()
471 lpm_priv->shadow.pm_control = val; in ps3_write_pm()
474 result = lv1_set_lpm_interval(lpm_priv->lpm_id, val, in ps3_write_pm()
478 if (val != lpm_priv->shadow.pm_start_stop) in ps3_write_pm()
479 result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id, in ps3_write_pm()
483 lpm_priv->shadow.pm_start_stop = val; in ps3_write_pm()
504 * ps3_get_ctr_size - Get the size of a physical counter.
525 * ps3_set_ctr_size - Set the size of a physical counter to 16 or 32 bits.
647 + subsubgroup - 1); in pm_translate_signal_group_number_on_island6()
673 subgroup = group - 20; in pm_signal_group_to_ps3_lv1_signal_group()
676 subgroup = group - 30; in pm_signal_group_to_ps3_lv1_signal_group()
679 subgroup = group - 40; in pm_signal_group_to_ps3_lv1_signal_group()
682 subgroup = group - 50; in pm_signal_group_to_ps3_lv1_signal_group()
685 subgroup = group - 60; in pm_signal_group_to_ps3_lv1_signal_group()
688 subgroup = group - 70; in pm_signal_group_to_ps3_lv1_signal_group()
691 subgroup = group - 80; in pm_signal_group_to_ps3_lv1_signal_group()
695 subgroup = group - 200; in pm_signal_group_to_ps3_lv1_signal_group()
699 subsubgroup = group - 650; in pm_signal_group_to_ps3_lv1_signal_group()
704 subsubgroup = group - 6500; in pm_signal_group_to_ps3_lv1_signal_group()
753 ret = lv1_set_lpm_signal(lpm_priv->lpm_id, lv1_signal_group, bus_select, in __ps3_set_signal()
783 signal_select = signal_select << (63 - signal_bit); in ps3_set_signal()
787 signal_select = (signal_select << (63 - signal_bit)) | 0x3; in ps3_set_signal()
797 * This parameter is only used for the PPE and SPE signals. in ps3_set_signal()
803 * PPE/SPE object. in ps3_set_signal()
809 attr2 = lpm_priv->pu_id; in ps3_set_signal()
812 * This parameter is only used for setting the SPE signal. in ps3_set_signal()
833 * ps3_enable_pm - Enable the entire performance monitoring unit.
844 lpm_priv->tb_count = 0; in ps3_enable_pm()
847 if (!(lpm_priv->shadow.pm_start_stop & in ps3_enable_pm()
850 result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id, in ps3_enable_pm()
867 result = lv1_start_lpm(lpm_priv->lpm_id); in ps3_enable_pm()
879 * ps3_disable_pm - Disable the entire performance monitoring unit.
889 result = lv1_stop_lpm(lpm_priv->lpm_id, &tmp); in ps3_disable_pm()
898 lpm_priv->tb_count = tmp; in ps3_disable_pm()
901 lpm_priv->tb_count, lpm_priv->tb_count); in ps3_disable_pm()
906 * ps3_lpm_copy_tb - Copy data from the trace buffer to a kernel buffer.
924 if (!lpm_priv->tb_cache) in ps3_lpm_copy_tb()
925 return -EPERM; in ps3_lpm_copy_tb()
927 if (offset >= lpm_priv->tb_count) in ps3_lpm_copy_tb()
930 count = min_t(u64, count, lpm_priv->tb_count - offset); in ps3_lpm_copy_tb()
933 const unsigned long request = count - *bytes_copied; in ps3_lpm_copy_tb()
936 result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset, in ps3_lpm_copy_tb()
945 return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL; in ps3_lpm_copy_tb()
948 memcpy(buf, lpm_priv->tb_cache, tmp); in ps3_lpm_copy_tb()
961 * ps3_lpm_copy_tb_to_user - Copy data from the trace buffer to a user buffer.
979 if (!lpm_priv->tb_cache) in ps3_lpm_copy_tb_to_user()
980 return -EPERM; in ps3_lpm_copy_tb_to_user()
982 if (offset >= lpm_priv->tb_count) in ps3_lpm_copy_tb_to_user()
985 count = min_t(u64, count, lpm_priv->tb_count - offset); in ps3_lpm_copy_tb_to_user()
988 const unsigned long request = count - *bytes_copied; in ps3_lpm_copy_tb_to_user()
991 result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset, in ps3_lpm_copy_tb_to_user()
999 return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL; in ps3_lpm_copy_tb_to_user()
1002 result = copy_to_user(buf, lpm_priv->tb_cache, tmp); in ps3_lpm_copy_tb_to_user()
1009 return -EFAULT; in ps3_lpm_copy_tb_to_user()
1024 * ps3_get_and_clear_pm_interrupts -
1037 * ps3_enable_pm_interrupts -
1051 * ps3_enable_pm_interrupts -
1064 * ps3_lpm_open - Open the logical performance monitor device.
1087 if (!atomic_add_unless(&lpm_priv->open, 1, 1)) { in ps3_lpm_open()
1089 return -EBUSY; in ps3_lpm_open()
1095 lpm_priv->tb_cache_size = 0; in ps3_lpm_open()
1096 lpm_priv->tb_cache_internal = NULL; in ps3_lpm_open()
1097 lpm_priv->tb_cache = NULL; in ps3_lpm_open()
1103 result = -EINVAL; in ps3_lpm_open()
1106 lpm_priv->tb_cache_size = tb_cache_size; in ps3_lpm_open()
1107 lpm_priv->tb_cache_internal = NULL; in ps3_lpm_open()
1108 lpm_priv->tb_cache = tb_cache; in ps3_lpm_open()
1110 lpm_priv->tb_cache_size = PS3_LPM_DEFAULT_TB_CACHE_SIZE; in ps3_lpm_open()
1111 lpm_priv->tb_cache_internal = kzalloc( in ps3_lpm_open()
1112 lpm_priv->tb_cache_size + 127, GFP_KERNEL); in ps3_lpm_open()
1113 if (!lpm_priv->tb_cache_internal) { in ps3_lpm_open()
1114 result = -ENOMEM; in ps3_lpm_open()
1117 lpm_priv->tb_cache = (void *)ALIGN( in ps3_lpm_open()
1118 (unsigned long)lpm_priv->tb_cache_internal, 128); in ps3_lpm_open()
1121 result = lv1_construct_lpm(lpm_priv->node_id, tb_type, 0, 0, in ps3_lpm_open()
1122 ps3_mm_phys_to_lpar(__pa(lpm_priv->tb_cache)), in ps3_lpm_open()
1123 lpm_priv->tb_cache_size, &lpm_priv->lpm_id, in ps3_lpm_open()
1124 &lpm_priv->outlet_id, &tb_size); in ps3_lpm_open()
1129 result = -EINVAL; in ps3_lpm_open()
1133 lpm_priv->shadow.pm_control = PS3_LPM_SHADOW_REG_INIT; in ps3_lpm_open()
1134 lpm_priv->shadow.pm_start_stop = PS3_LPM_SHADOW_REG_INIT; in ps3_lpm_open()
1135 lpm_priv->shadow.group_control = PS3_LPM_SHADOW_REG_INIT; in ps3_lpm_open()
1136 lpm_priv->shadow.debug_bus_control = PS3_LPM_SHADOW_REG_INIT; in ps3_lpm_open()
1139 "tb_size 0x%llx\n", __func__, __LINE__, lpm_priv->lpm_id, in ps3_lpm_open()
1140 lpm_priv->outlet_id, tb_size); in ps3_lpm_open()
1145 kfree(lpm_priv->tb_cache_internal); in ps3_lpm_open()
1146 lpm_priv->tb_cache_internal = NULL; in ps3_lpm_open()
1149 atomic_dec(&lpm_priv->open); in ps3_lpm_open()
1155 * ps3_lpm_close - Close the lpm device.
1163 lv1_destruct_lpm(lpm_priv->lpm_id); in ps3_lpm_close()
1164 lpm_priv->lpm_id = 0; in ps3_lpm_close()
1166 kfree(lpm_priv->tb_cache_internal); in ps3_lpm_close()
1167 lpm_priv->tb_cache_internal = NULL; in ps3_lpm_close()
1169 atomic_dec(&lpm_priv->open); in ps3_lpm_close()
1176 dev_dbg(&dev->core, " -> %s:%u\n", __func__, __LINE__); in ps3_lpm_probe()
1179 dev_info(&dev->core, "%s:%u: called twice\n", in ps3_lpm_probe()
1181 return -EBUSY; in ps3_lpm_probe()
1187 return -ENOMEM; in ps3_lpm_probe()
1189 lpm_priv->sbd = dev; in ps3_lpm_probe()
1190 lpm_priv->node_id = dev->lpm.node_id; in ps3_lpm_probe()
1191 lpm_priv->pu_id = dev->lpm.pu_id; in ps3_lpm_probe()
1192 lpm_priv->rights = dev->lpm.rights; in ps3_lpm_probe()
1194 dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__); in ps3_lpm_probe()
1201 dev_dbg(&dev->core, " -> %s:%u:\n", __func__, __LINE__); in ps3_lpm_remove()
1208 dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__); in ps3_lpm_remove()
1213 .core.name = "ps3-lpm",