Lines Matching +full:ls2k0500 +full:- +full:eiointc
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
8 #define pr_fmt(fmt) "eiointc: " fmt
82 /* EIO node 0 is in charge of inter-node interrupt dispatch */ in eiointc_set_irq_route()
97 struct eiointc_priv *priv = d->domain->host_data; in eiointc_set_irq_affinity()
102 cpumask_and(&intersect_affinity, &intersect_affinity, &priv->cpuspan_map); in eiointc_set_irq_affinity()
106 return -EINVAL; in eiointc_set_irq_affinity()
110 vector = d->hwirq; in eiointc_set_irq_affinity()
115 0x0, priv->node * CORES_PER_EIO_NODE); in eiointc_set_irq_affinity()
118 eiointc_set_irq_route(vector, cpu, priv->node, &priv->node_map); in eiointc_set_irq_affinity()
122 0x0, priv->node * CORES_PER_EIO_NODE); in eiointc_set_irq_affinity()
136 if (node_isset(node, eiointc_priv[i]->node_map)) in eiointc_index()
140 return -1; in eiointc_index()
152 return -1; in eiointc_router_init()
158 for (i = 0; i < eiointc_priv[0]->vec_count / 32; i++) { in eiointc_router_init()
163 for (i = 0; i < eiointc_priv[0]->vec_count / 32 / 4; i++) { in eiointc_router_init()
169 for (i = 0; i < eiointc_priv[0]->vec_count / 4; i++) { in eiointc_router_init()
170 /* Route to Node-0 Core-0 */ in eiointc_router_init()
174 bit = (eiointc_priv[index]->node << 4) | 1; in eiointc_router_init()
180 for (i = 0; i < eiointc_priv[0]->vec_count / 32; i++) { in eiointc_router_init()
200 for (i = 0; i < eiointc_priv[0]->vec_count / VEC_COUNT_PER_REG; i++) { in eiointc_irq_dispatch()
207 generic_handle_domain_irq(priv->eiointc_domain, irq); in eiointc_irq_dispatch()
232 .name = "EIOINTC",
245 struct eiointc_priv *priv = domain->host_data; in eiointc_domain_alloc()
315 for (j = 0; j < eiointc_priv[0]->vec_count; j++) { in eiointc_resume()
316 desc = irq_resolve_mapping(eiointc_priv[i]->eiointc_domain, j); in eiointc_resume()
317 if (desc && desc->handle_irq && desc->handle_irq != handle_bad_irq) { in eiointc_resume()
318 raw_spin_lock(&desc->lock); in eiointc_resume()
319 irq_data = irq_domain_get_irq_data(eiointc_priv[i]->eiointc_domain, irq_desc_get_irq(desc)); in eiointc_resume()
320 eiointc_set_irq_affinity(irq_data, irq_data->common->affinity, 0); in eiointc_resume()
321 raw_spin_unlock(&desc->lock); in eiointc_resume()
336 unsigned int node = (pchpic_entry->address >> 44) & 0xf; in pch_pic_parse_madt()
353 node = early_cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE); in pch_msi_parse_madt()
355 node = eiointc_priv[nr_pics - 1]->node; in pch_msi_parse_madt()
385 node_map = node_map ? node_map : -1ULL; in eiointc_init()
388 node_set(cpu_to_eio_node(i), priv->node_map); in eiointc_init()
389 cpumask_or(&priv->cpuspan_map, &priv->cpuspan_map, in eiointc_init()
394 priv->eiointc_domain = irq_domain_create_linear(priv->domain_handle, in eiointc_init()
395 priv->vec_count, in eiointc_init()
398 if (!priv->eiointc_domain) { in eiointc_init()
399 pr_err("loongson-extioi: cannot add IRQ domain\n"); in eiointc_init()
400 return -ENOMEM; in eiointc_init()
426 return -ENOMEM; in eiointc_acpi_init()
428 priv->domain_handle = irq_domain_alloc_named_id_fwnode("EIOPIC", in eiointc_acpi_init()
429 acpi_eiointc->node); in eiointc_acpi_init()
430 if (!priv->domain_handle) { in eiointc_acpi_init()
435 priv->vec_count = VEC_COUNT; in eiointc_acpi_init()
436 priv->node = acpi_eiointc->node; in eiointc_acpi_init()
438 parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade); in eiointc_acpi_init()
440 ret = eiointc_init(priv, parent_irq, acpi_eiointc->node_map); in eiointc_acpi_init()
445 node = early_cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE); in eiointc_acpi_init()
447 node = acpi_eiointc->node; in eiointc_acpi_init()
448 acpi_set_vec_parent(node, priv->eiointc_domain, pch_group); in eiointc_acpi_init()
449 acpi_set_vec_parent(node, priv->eiointc_domain, msi_group); in eiointc_acpi_init()
458 irq_domain_free_fwnode(priv->domain_handle); in eiointc_acpi_init()
459 priv->domain_handle = NULL; in eiointc_acpi_init()
463 return -ENOMEM; in eiointc_acpi_init()
474 return -ENOMEM; in eiointc_of_init()
478 ret = -ENODEV; in eiointc_of_init()
487 * In particular, the number of devices supported by the LS2K0500 in eiointc_of_init()
490 if (of_device_is_compatible(of_node, "loongson,ls2k0500-eiointc")) in eiointc_of_init()
491 priv->vec_count = 128; in eiointc_of_init()
493 priv->vec_count = VEC_COUNT; in eiointc_of_init()
495 priv->node = 0; in eiointc_of_init()
496 priv->domain_handle = of_node_to_fwnode(of_node); in eiointc_of_init()
509 IRQCHIP_DECLARE(loongson_ls2k0500_eiointc, "loongson,ls2k0500-eiointc", eiointc_of_init);
510 IRQCHIP_DECLARE(loongson_ls2k2000_eiointc, "loongson,ls2k2000-eiointc", eiointc_of_init);