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
21 #include "irq-loongson.h"
53 * Routing registers are 32bit, and there is 8-bit route setting for every
112 /* EIO node 0 is in charge of inter-node interrupt dispatch */ in eiointc_set_irq_route()
137 struct eiointc_priv *priv = d->domain->host_data; in eiointc_set_irq_affinity()
141 cpu = cpumask_first_and_and(&priv->cpuspan_map, affinity, cpu_online_mask); in eiointc_set_irq_affinity()
144 return -EINVAL; in eiointc_set_irq_affinity()
147 vector = d->hwirq; in eiointc_set_irq_affinity()
150 if (priv->flags & EIOINTC_USE_CPU_ENCODE) { in eiointc_set_irq_affinity()
157 0x0, priv->node * CORES_PER_EIO_NODE); in eiointc_set_irq_affinity()
160 eiointc_set_irq_route(vector, cpu, priv->node, &priv->node_map); in eiointc_set_irq_affinity()
164 0x0, priv->node * CORES_PER_EIO_NODE); in eiointc_set_irq_affinity()
180 if (node_isset(node, eiointc_priv[i]->node_map)) in eiointc_index()
184 return -1; in eiointc_index()
197 return -EINVAL; in eiointc_router_init()
200 if (!(eiointc_priv[index]->flags & EIOINTC_USE_CPU_ENCODE)) in eiointc_router_init()
208 for (i = 0; i < eiointc_priv[0]->vec_count / 32; i++) { in eiointc_router_init()
213 for (i = 0; i < eiointc_priv[0]->vec_count / 32 / 4; i++) { in eiointc_router_init()
219 for (i = 0; i < eiointc_priv[0]->vec_count / 4; i++) { in eiointc_router_init()
220 /* Route to Node-0 Core-0 */ in eiointc_router_init()
221 if (eiointc_priv[index]->flags & EIOINTC_USE_CPU_ENCODE) in eiointc_router_init()
226 bit = (eiointc_priv[index]->node << 4) | 1; in eiointc_router_init()
232 for (i = 0; i < eiointc_priv[0]->vec_count / 32; i++) { in eiointc_router_init()
252 for (i = 0; i < eiointc_priv[0]->vec_count / VEC_COUNT_PER_REG; i++) { in eiointc_irq_dispatch()
265 generic_handle_domain_irq(priv->eiointc_domain, irq); in eiointc_irq_dispatch()
290 .name = "EIOINTC",
305 struct eiointc_priv *priv = domain->host_data; in eiointc_domain_alloc()
380 unsigned int node = (pchpic_entry->address >> 44) & 0xf; in pch_pic_parse_madt()
397 node = early_cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE); in pch_msi_parse_madt()
399 node = eiointc_priv[nr_pics - 1]->node; in pch_msi_parse_madt()
432 node_map = node_map ? node_map : -1ULL; in eiointc_init()
435 node_set(cpu_to_eio_node(i), priv->node_map); in eiointc_init()
436 cpumask_or(&priv->cpuspan_map, &priv->cpuspan_map, in eiointc_init()
441 priv->eiointc_domain = irq_domain_create_linear(priv->domain_handle, in eiointc_init()
442 priv->vec_count, in eiointc_init()
445 if (!priv->eiointc_domain) { in eiointc_init()
446 pr_err("loongson-extioi: cannot add IRQ domain\n"); in eiointc_init()
447 return -ENOMEM; in eiointc_init()
460 priv->flags = EIOINTC_USE_CPU_ENCODE; in eiointc_init()
471 "irqchip/loongarch/eiointc:starting", in eiointc_init()
487 return -ENOMEM; in eiointc_acpi_init()
489 priv->domain_handle = irq_domain_alloc_named_id_fwnode("EIOPIC", in eiointc_acpi_init()
490 acpi_eiointc->node); in eiointc_acpi_init()
491 if (!priv->domain_handle) { in eiointc_acpi_init()
496 priv->vec_count = VEC_COUNT; in eiointc_acpi_init()
497 priv->node = acpi_eiointc->node; in eiointc_acpi_init()
499 parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade); in eiointc_acpi_init()
501 ret = eiointc_init(priv, parent_irq, acpi_eiointc->node_map); in eiointc_acpi_init()
506 node = early_cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE); in eiointc_acpi_init()
508 node = acpi_eiointc->node; in eiointc_acpi_init()
509 acpi_set_vec_parent(node, priv->eiointc_domain, pch_group); in eiointc_acpi_init()
510 acpi_set_vec_parent(node, priv->eiointc_domain, msi_group); in eiointc_acpi_init()
519 irq_domain_free_fwnode(priv->domain_handle); in eiointc_acpi_init()
520 priv->domain_handle = NULL; in eiointc_acpi_init()
524 return -ENOMEM; in eiointc_acpi_init()
535 return -ENOMEM; in eiointc_of_init()
539 ret = -ENODEV; in eiointc_of_init()
548 * In particular, the number of devices supported by the LS2K0500 in eiointc_of_init()
551 if (of_device_is_compatible(of_node, "loongson,ls2k0500-eiointc")) in eiointc_of_init()
552 priv->vec_count = 128; in eiointc_of_init()
554 priv->vec_count = VEC_COUNT; in eiointc_of_init()
556 priv->node = 0; in eiointc_of_init()
557 priv->domain_handle = of_node_to_fwnode(of_node); in eiointc_of_init()
570 IRQCHIP_DECLARE(loongson_ls2k0500_eiointc, "loongson,ls2k0500-eiointc", eiointc_of_init);
571 IRQCHIP_DECLARE(loongson_ls2k2000_eiointc, "loongson,ls2k2000-eiointc", eiointc_of_init);