Lines Matching +full:row +full:- +full:stride
1 // SPDX-License-Identifier: GPL-2.0-only
8 * Ricardo Neri <ricardo.neri-calderon@linux.intel.com>
22 #define pr_fmt(fmt) "intel-hfi: " fmt
33 #include <linux/percpu-defs.h>
79 * struct hfi_cpu_data - HFI capabilities per CPU
92 * struct hfi_hdr - Header of the HFI table
104 * struct hfi_instance - Representation of an HFI instance (i.e., a table)
133 * struct hfi_features - Supported HFI features
135 * @cpu_stride: Stride size to locate the capability data of a logical
136 * processor within the table (i.e., row stride)
148 * struct hfi_cpu_info - Per-CPU attributes to consume HFI data
149 * @index: Row of this CPU in its HFI table
152 * Parameters to link a logical processor to an HFI table and a row within it.
159 static DEFINE_PER_CPU(struct hfi_cpu_info, hfi_cpu_info) = { .index = -1 };
176 raw_spin_lock_irq(&hfi_instance->table_lock); in get_hfi_caps()
177 for_each_cpu(cpu, hfi_instance->cpus) { in get_hfi_caps()
182 caps = hfi_instance->data + index * hfi_features.cpu_stride; in get_hfi_caps()
189 cpu_caps[i].performance = caps->perf_cap << 2; in get_hfi_caps()
190 cpu_caps[i].efficiency = caps->ee_cap << 2; in get_hfi_caps()
194 raw_spin_unlock_irq(&hfi_instance->table_lock); in get_hfi_caps()
208 cpu_count = cpumask_weight(hfi_instance->cpus); in update_capabilities()
230 cpu_count = cpu_count - i; in update_capabilities()
268 * local APIC is unmasked. Hence, info->hfi_instance cannot be NULL in intel_hfi_process_event()
271 hfi_instance = info->hfi_instance; in intel_hfi_process_event()
278 * On most systems, all CPUs in the package receive a package-level in intel_hfi_process_event()
283 if (!raw_spin_trylock(&hfi_instance->event_lock)) in intel_hfi_process_event()
289 raw_spin_unlock(&hfi_instance->event_lock); in intel_hfi_process_event()
298 new_timestamp = *(u64 *)hfi_instance->hw_table; in intel_hfi_process_event()
299 if (*hfi_instance->timestamp == new_timestamp) { in intel_hfi_process_event()
301 raw_spin_unlock(&hfi_instance->event_lock); in intel_hfi_process_event()
305 raw_spin_lock(&hfi_instance->table_lock); in intel_hfi_process_event()
311 memcpy(hfi_instance->local_table, hfi_instance->hw_table, in intel_hfi_process_event()
320 raw_spin_unlock(&hfi_instance->table_lock); in intel_hfi_process_event()
321 raw_spin_unlock(&hfi_instance->event_lock); in intel_hfi_process_event()
323 queue_delayed_work(hfi_updates_wq, &hfi_instance->update_work, in intel_hfi_process_event()
331 /* Do not re-read @cpu's index if it has already been initialized. */ in init_hfi_cpu_index()
332 if (info->index > -1) in init_hfi_cpu_index()
336 info->index = edx.split.index; in init_hfi_cpu_index()
345 /* The HFI header is below the time-stamp. */ in init_hfi_instance()
346 hfi_instance->hdr = hfi_instance->local_table + in init_hfi_instance()
347 sizeof(*hfi_instance->timestamp); in init_hfi_instance()
350 hfi_instance->data = hfi_instance->hdr + hfi_features.hdr_size; in init_hfi_instance()
368 hw_table_pa = virt_to_phys(hfi_instance->hw_table); in hfi_set_hw_table()
400 * intel_hfi_online() - Enable HFI on @cpu
428 hfi_instance = info->hfi_instance; in intel_hfi_online()
434 info->hfi_instance = hfi_instance; in intel_hfi_online()
446 if (hfi_instance->hdr) in intel_hfi_online()
451 * frame of the table. Hence, the allocated memory must be page-aligned. in intel_hfi_online()
457 hfi_instance->hw_table = alloc_pages_exact(hfi_features.nr_table_pages, in intel_hfi_online()
459 if (!hfi_instance->hw_table) in intel_hfi_online()
466 hfi_instance->local_table = kzalloc(hfi_features.nr_table_pages << PAGE_SHIFT, in intel_hfi_online()
468 if (!hfi_instance->local_table) in intel_hfi_online()
473 INIT_DELAYED_WORK(&hfi_instance->update_work, hfi_update_work_fn); in intel_hfi_online()
474 raw_spin_lock_init(&hfi_instance->table_lock); in intel_hfi_online()
475 raw_spin_lock_init(&hfi_instance->event_lock); in intel_hfi_online()
478 cpumask_set_cpu(cpu, hfi_instance->cpus); in intel_hfi_online()
481 if (cpumask_weight(hfi_instance->cpus) == 1) { in intel_hfi_online()
491 free_pages_exact(hfi_instance->hw_table, hfi_features.nr_table_pages); in intel_hfi_online()
496 * intel_hfi_offline() - Disable HFI on @cpu
511 * Check if @cpu as an associated, initialized (i.e., with a non-NULL in intel_hfi_offline()
515 hfi_instance = info->hfi_instance; in intel_hfi_offline()
519 if (!hfi_instance->hdr) in intel_hfi_offline()
523 cpumask_clear_cpu(cpu, hfi_instance->cpus); in intel_hfi_offline()
525 if (!cpumask_weight(hfi_instance->cpus)) in intel_hfi_offline()
537 return -ENODEV; in hfi_parse_features()
547 return -ENODEV; in hfi_parse_features()
580 struct hfi_instance *hfi_instance = info->hfi_instance; in hfi_do_enable()
623 if (!zalloc_cpumask_var(&hfi_instance->cpus, GFP_KERNEL)) in intel_hfi_init()
627 hfi_updates_wq = create_singlethread_workqueue("hfi-updates"); in intel_hfi_init()
638 free_cpumask_var(hfi_instance->cpus); in intel_hfi_init()