Lines Matching +full:inter +full:- +full:chip

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
81 /* EIO node 0 is in charge of inter-node interrupt dispatch */ in eiointc_set_irq_route()
96 struct eiointc_priv *priv = d->domain->host_data; in eiointc_set_irq_affinity()
101 cpumask_and(&intersect_affinity, &intersect_affinity, &priv->cpuspan_map); in eiointc_set_irq_affinity()
105 return -EINVAL; in eiointc_set_irq_affinity()
109 vector = d->hwirq; in eiointc_set_irq_affinity()
114 0x0, priv->node * CORES_PER_EIO_NODE); in eiointc_set_irq_affinity()
117 eiointc_set_irq_route(vector, cpu, priv->node, &priv->node_map); in eiointc_set_irq_affinity()
121 0x0, priv->node * CORES_PER_EIO_NODE); in eiointc_set_irq_affinity()
135 if (node_isset(node, eiointc_priv[i]->node_map)) in eiointc_index()
139 return -1; in eiointc_index()
151 return -1; in eiointc_router_init()
157 for (i = 0; i < eiointc_priv[0]->vec_count / 32; i++) { in eiointc_router_init()
162 for (i = 0; i < eiointc_priv[0]->vec_count / 32 / 4; i++) { in eiointc_router_init()
168 for (i = 0; i < eiointc_priv[0]->vec_count / 4; i++) { in eiointc_router_init()
169 /* Route to Node-0 Core-0 */ in eiointc_router_init()
173 bit = (eiointc_priv[index]->node << 4) | 1; in eiointc_router_init()
179 for (i = 0; i < eiointc_priv[0]->vec_count / 32; i++) { in eiointc_router_init()
194 struct irq_chip *chip = irq_desc_get_chip(desc); in eiointc_irq_dispatch() local
197 chained_irq_enter(chip, desc); in eiointc_irq_dispatch()
199 for (i = 0; i < eiointc_priv[0]->vec_count / VEC_COUNT_PER_REG; i++) { in eiointc_irq_dispatch()
206 generic_handle_domain_irq(priv->eiointc_domain, irq); in eiointc_irq_dispatch()
215 chained_irq_exit(chip, desc); in eiointc_irq_dispatch()
244 struct eiointc_priv *priv = domain->host_data; in eiointc_domain_alloc()
314 for (j = 0; j < eiointc_priv[0]->vec_count; j++) { in eiointc_resume()
315 desc = irq_resolve_mapping(eiointc_priv[i]->eiointc_domain, j); in eiointc_resume()
316 if (desc && desc->handle_irq && desc->handle_irq != handle_bad_irq) { in eiointc_resume()
317 raw_spin_lock(&desc->lock); in eiointc_resume()
318 irq_data = irq_domain_get_irq_data(eiointc_priv[i]->eiointc_domain, irq_desc_get_irq(desc)); in eiointc_resume()
319 eiointc_set_irq_affinity(irq_data, irq_data->common->affinity, 0); in eiointc_resume()
320 raw_spin_unlock(&desc->lock); in eiointc_resume()
335 unsigned int node = (pchpic_entry->address >> 44) & 0xf; in pch_pic_parse_madt()
352 node = cpu_to_node(eiointc_priv[nr_pics - 1]->node * CORES_PER_EIO_NODE); in pch_msi_parse_madt()
354 node = eiointc_priv[nr_pics - 1]->node; in pch_msi_parse_madt()
384 node_map = node_map ? node_map : -1ULL; in eiointc_init()
387 node_set(cpu_to_eio_node(i), priv->node_map); in eiointc_init()
388 cpumask_or(&priv->cpuspan_map, &priv->cpuspan_map, in eiointc_init()
393 priv->eiointc_domain = irq_domain_create_linear(priv->domain_handle, in eiointc_init()
394 priv->vec_count, in eiointc_init()
397 if (!priv->eiointc_domain) { in eiointc_init()
398 pr_err("loongson-extioi: cannot add IRQ domain\n"); in eiointc_init()
399 return -ENOMEM; in eiointc_init()
425 return -ENOMEM; in eiointc_acpi_init()
427 priv->domain_handle = irq_domain_alloc_named_id_fwnode("EIOPIC", in eiointc_acpi_init()
428 acpi_eiointc->node); in eiointc_acpi_init()
429 if (!priv->domain_handle) { in eiointc_acpi_init()
434 priv->vec_count = VEC_COUNT; in eiointc_acpi_init()
435 priv->node = acpi_eiointc->node; in eiointc_acpi_init()
437 parent_irq = irq_create_mapping(parent, acpi_eiointc->cascade); in eiointc_acpi_init()
439 ret = eiointc_init(priv, parent_irq, acpi_eiointc->node_map); in eiointc_acpi_init()
444 node = cpu_to_node(acpi_eiointc->node * CORES_PER_EIO_NODE); in eiointc_acpi_init()
446 node = acpi_eiointc->node; in eiointc_acpi_init()
447 acpi_set_vec_parent(node, priv->eiointc_domain, pch_group); in eiointc_acpi_init()
448 acpi_set_vec_parent(node, priv->eiointc_domain, msi_group); in eiointc_acpi_init()
457 irq_domain_free_fwnode(priv->domain_handle); in eiointc_acpi_init()
458 priv->domain_handle = NULL; in eiointc_acpi_init()
462 return -ENOMEM; in eiointc_acpi_init()
473 return -ENOMEM; in eiointc_of_init()
477 ret = -ENODEV; in eiointc_of_init()
489 if (of_device_is_compatible(of_node, "loongson,ls2k0500-eiointc")) in eiointc_of_init()
490 priv->vec_count = 128; in eiointc_of_init()
492 priv->vec_count = VEC_COUNT; in eiointc_of_init()
494 priv->node = 0; in eiointc_of_init()
495 priv->domain_handle = of_node_to_fwnode(of_node); in eiointc_of_init()
508 IRQCHIP_DECLARE(loongson_ls2k0500_eiointc, "loongson,ls2k0500-eiointc", eiointc_of_init);
509 IRQCHIP_DECLARE(loongson_ls2k2000_eiointc, "loongson,ls2k2000-eiointc", eiointc_of_init);