Lines Matching +full:io +full:- +full:hv
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 #define pr_fmt(fmt) "hv-gpci: " fmt
16 #include <asm/io.h>
18 #include "hv-gpci.h"
19 #include "hv-common.h"
23 * perf stat -e 'hv_gpci/counter_info_version=3,offset=0,length=8,
34 * used depends on the event. See REQUEST_IDX_KIND in hv-gpci-requests.h
46 /* u8, bytes of data (1-8) */
86 return -EIO; \
139 arg->params.counter_request = cpu_to_be32(req); in systeminfo_gpci_request()
140 arg->params.starting_index = cpu_to_be32(starting_index); in systeminfo_gpci_request()
141 arg->params.secondary_index = cpu_to_be16(secondary_index); in systeminfo_gpci_request()
157 return -EPERM; in systeminfo_gpci_request()
161 * because of invalid buffer-length/address or due to some hardware in systeminfo_gpci_request()
165 return -EIO; in systeminfo_gpci_request()
176 for (i = 0; i < be16_to_cpu(arg->params.returned_values); i++) { in systeminfo_gpci_request()
177 j = i * be16_to_cpu(arg->params.cv_element_size); in systeminfo_gpci_request()
179 for (; j < (i + 1) * be16_to_cpu(arg->params.cv_element_size); j++) in systeminfo_gpci_request()
180 *n += sprintf(buf + *n, "%02x", (u8)arg->bytes[j]); in systeminfo_gpci_request()
186 return -EFBIG; in systeminfo_gpci_request()
227 int returned_values = be16_to_cpu(arg->params.returned_values); in processor_bus_topology_show()
228 int elementsize = be16_to_cpu(arg->params.cv_element_size); in processor_bus_topology_show()
229 int last_element = (returned_values - 1) * elementsize; in processor_bus_topology_show()
236 u32 starting_index = arg->bytes[last_element + 3] + in processor_bus_topology_show()
237 (arg->bytes[last_element + 2] << 8) + in processor_bus_topology_show()
238 (arg->bytes[last_element + 1] << 16) + in processor_bus_topology_show()
239 (arg->bytes[last_element] << 24) + 1; in processor_bus_topology_show()
295 int returned_values = be16_to_cpu(arg->params.returned_values); in processor_config_show()
296 int elementsize = be16_to_cpu(arg->params.cv_element_size); in processor_config_show()
297 int last_element = (returned_values - 1) * elementsize; in processor_config_show()
304 u32 starting_index = arg->bytes[last_element + 3] + in processor_config_show()
305 (arg->bytes[last_element + 2] << 8) + in processor_config_show()
306 (arg->bytes[last_element + 1] << 16) + in processor_config_show()
307 (arg->bytes[last_element] << 24) + 1; in processor_config_show()
363 int returned_values = be16_to_cpu(arg->params.returned_values); in affinity_domain_via_virtual_processor_show()
364 int elementsize = be16_to_cpu(arg->params.cv_element_size); in affinity_domain_via_virtual_processor_show()
365 int last_element = (returned_values - 1) * elementsize; in affinity_domain_via_virtual_processor_show()
375 u32 starting_index = arg->bytes[last_element + 1] + (arg->bytes[last_element] << 8); in affinity_domain_via_virtual_processor_show()
376 u16 secondary_index = arg->bytes[last_element + 3] + in affinity_domain_via_virtual_processor_show()
377 (arg->bytes[last_element + 2] << 8) + 1; in affinity_domain_via_virtual_processor_show()
433 int returned_values = be16_to_cpu(arg->params.returned_values); in affinity_domain_via_domain_show()
434 int elementsize = be16_to_cpu(arg->params.cv_element_size); in affinity_domain_via_domain_show()
435 int last_element = (returned_values - 1) * elementsize; in affinity_domain_via_domain_show()
442 u32 starting_index = arg->bytes[last_element + 1] + in affinity_domain_via_domain_show()
443 (arg->bytes[last_element] << 8) + 1; in affinity_domain_via_domain_show()
477 * request is variable-size. For this counter request type, in affinity_domain_via_partition_result_parse()
487 *n += sprintf(buf + *n, "%02x", (u8)arg->bytes[k]); in affinity_domain_via_partition_result_parse()
490 total_affinity_domain_ele = (u8)arg->bytes[k - 2] << 8 | (u8)arg->bytes[k - 3]; in affinity_domain_via_partition_result_parse()
491 size_of_each_affinity_domain_ele = (u8)arg->bytes[k] << 8 | (u8)arg->bytes[k - 1]; in affinity_domain_via_partition_result_parse()
495 *n += sprintf(buf + *n, "%02x", (u8)arg->bytes[k]); in affinity_domain_via_partition_result_parse()
528 arg->params.counter_request = cpu_to_be32(sysinfo_counter_request[AFFINITY_DOMAIN_VIA_PAR]); in affinity_domain_via_partition_show()
529 arg->params.starting_index = cpu_to_be32(0); in affinity_domain_via_partition_show()
550 be16_to_cpu(arg->params.returned_values) - 1, in affinity_domain_via_partition_show()
551 be16_to_cpu(arg->params.cv_element_size), buf, in affinity_domain_via_partition_show()
557 return -EFBIG; in affinity_domain_via_partition_show()
565 starting_index = (u8)arg->bytes[last_element] << 8 | in affinity_domain_via_partition_show()
566 (u8)arg->bytes[last_element + 1]; in affinity_domain_via_partition_show()
569 arg->params.counter_request = cpu_to_be32( in affinity_domain_via_partition_show()
571 arg->params.starting_index = cpu_to_be32(starting_index); in affinity_domain_via_partition_show()
582 be16_to_cpu(arg->params.returned_values), in affinity_domain_via_partition_show()
583 be16_to_cpu(arg->params.cv_element_size), in affinity_domain_via_partition_show()
603 return -EPERM; in affinity_domain_via_partition_show()
607 * because of invalid buffer-length/address or due to some hardware in affinity_domain_via_partition_show()
610 return -EIO; in affinity_domain_via_partition_show()
691 arg->params.counter_request = cpu_to_be32(req); in single_gpci_request()
692 arg->params.starting_index = cpu_to_be32(starting_index); in single_gpci_request()
693 arg->params.secondary_index = cpu_to_be16(secondary_index); in single_gpci_request()
694 arg->params.counter_info_version_in = version_in; in single_gpci_request()
709 if (ret == H_PARAMETER && be32_to_cpu(arg->params.detail_rc) == 0x1B) in single_gpci_request()
723 count |= (u64)(arg->bytes[i]) << ((length - 1 - (i - offset)) * 8); in single_gpci_request()
750 prev = local64_xchg(&event->hw.prev_count, now); in h_gpci_event_update()
751 local64_add(now - prev, &event->count); in h_gpci_event_update()
756 local64_set(&event->hw.prev_count, h_gpci_get_value(event)); in h_gpci_event_start()
779 if (event->attr.type != event->pmu->type) in h_gpci_event_init()
780 return -ENOENT; in h_gpci_event_init()
783 if (event->attr.config2) { in h_gpci_event_init()
785 return -EINVAL; in h_gpci_event_init()
790 return -EOPNOTSUPP; in h_gpci_event_init()
795 return -EINVAL; in h_gpci_event_init()
803 return -EINVAL; in h_gpci_event_init()
821 return -EPERM; in h_gpci_event_init()
825 return -EINVAL; in h_gpci_event_init()
866 return -1; in ppc_hv_gpci_cpu_offline()
901 arg->params.counter_request = cpu_to_be32(req); in sysinfo_device_attr_create()
917 sysfs_attr_init(&attr->attr); in sysinfo_device_attr_create()
918 attr->attr.mode = 0444; in sysinfo_device_attr_create()
922 attr->attr.name = "processor_bus_topology"; in sysinfo_device_attr_create()
923 attr->show = processor_bus_topology_show; in sysinfo_device_attr_create()
926 attr->attr.name = "processor_config"; in sysinfo_device_attr_create()
927 attr->show = processor_config_show; in sysinfo_device_attr_create()
930 attr->attr.name = "affinity_domain_via_virtual_processor"; in sysinfo_device_attr_create()
931 attr->show = affinity_domain_via_virtual_processor_show; in sysinfo_device_attr_create()
934 attr->attr.name = "affinity_domain_via_domain"; in sysinfo_device_attr_create()
935 attr->show = affinity_domain_via_domain_show; in sysinfo_device_attr_create()
938 attr->attr.name = "affinity_domain_via_partition"; in sysinfo_device_attr_create()
939 attr->show = affinity_domain_via_partition_show; in sysinfo_device_attr_create()
951 struct device_attribute *attr[INTERFACE_NULL_ATTR - INTERFACE_PROCESSOR_BUS_TOPOLOGY_ATTR]; in add_sysinfo_interface_files()
954 sysfs_count = INTERFACE_NULL_ATTR - INTERFACE_PROCESSOR_BUS_TOPOLOGY_ATTR; in add_sysinfo_interface_files()
967 interface_attrs[i + INTERFACE_PROCESSOR_BUS_TOPOLOGY_ATTR] = &attr[i]->attr; in add_sysinfo_interface_files()
980 i--; in add_sysinfo_interface_files()
996 return -ENODEV; in hv_gpci_init()
1003 return -ENODEV; in hv_gpci_init()
1024 arg->params.counter_request = cpu_to_be32(0x10); in hv_gpci_init()
1030 arg->params.counter_info_version_out = 0x8; in hv_gpci_init()
1035 * required hv-gpci event list. in hv_gpci_init()
1037 if (arg->params.counter_info_version_out >= 0x8) in hv_gpci_init()
1044 r = perf_pmu_register(&h_gpci_pmu, h_gpci_pmu.name, -1); in hv_gpci_init()