Lines Matching +full:pic +full:- +full:base +full:- +full:vec
1 // SPDX-License-Identifier: GPL-2.0
4 * Loongson PCH PIC support
7 #define pr_fmt(fmt) "pch-pic: " fmt
39 void __iomem *base; member
54 void __iomem *addr = priv->base + offset + PIC_REG_IDX(bit) * 4; in pch_pic_bitset()
56 raw_spin_lock(&priv->pic_lock); in pch_pic_bitset()
60 raw_spin_unlock(&priv->pic_lock); in pch_pic_bitset()
66 void __iomem *addr = priv->base + offset + PIC_REG_IDX(bit) * 4; in pch_pic_bitclr()
68 raw_spin_lock(&priv->pic_lock); in pch_pic_bitclr()
72 raw_spin_unlock(&priv->pic_lock); in pch_pic_bitclr()
79 pch_pic_bitset(priv, PCH_PIC_MASK, d->hwirq); in pch_pic_mask_irq()
87 writel(BIT(PIC_REG_BIT(d->hwirq)), in pch_pic_unmask_irq()
88 priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4); in pch_pic_unmask_irq()
91 pch_pic_bitclr(priv, PCH_PIC_MASK, d->hwirq); in pch_pic_unmask_irq()
101 pch_pic_bitset(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
102 pch_pic_bitclr(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
106 pch_pic_bitset(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
107 pch_pic_bitset(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
111 pch_pic_bitclr(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
112 pch_pic_bitclr(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
116 pch_pic_bitclr(priv, PCH_PIC_EDGE, d->hwirq); in pch_pic_set_type()
117 pch_pic_bitset(priv, PCH_PIC_POL, d->hwirq); in pch_pic_set_type()
121 ret = -EINVAL; in pch_pic_set_type()
133 reg = readl(priv->base + PCH_PIC_EDGE + PIC_REG_IDX(d->hwirq) * 4); in pch_pic_ack_irq()
134 if (reg & BIT(PIC_REG_BIT(d->hwirq))) { in pch_pic_ack_irq()
135 writel(BIT(PIC_REG_BIT(d->hwirq)), in pch_pic_ack_irq()
136 priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4); in pch_pic_ack_irq()
142 .name = "PCH PIC",
155 struct pch_pic *priv = d->host_data; in pch_pic_domain_translate()
156 struct device_node *of_node = to_of_node(fwspec->fwnode); in pch_pic_domain_translate()
158 if (fwspec->param_count < 1) in pch_pic_domain_translate()
159 return -EINVAL; in pch_pic_domain_translate()
162 *hwirq = fwspec->param[0] + priv->ht_vec_base; in pch_pic_domain_translate()
163 *type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK; in pch_pic_domain_translate()
165 *hwirq = fwspec->param[0] - priv->gsi_base; in pch_pic_domain_translate()
180 struct pch_pic *priv = domain->host_data; in pch_pic_alloc()
186 parent_fwspec.fwnode = domain->parent->fwnode; in pch_pic_alloc()
214 writeb(priv->ht_vec_base + i, priv->base + PCH_INT_HTVEC(i)); in pch_pic_reset()
216 writeb(1, priv->base + PCH_INT_ROUTE(i)); in pch_pic_reset()
221 writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_MASK + 4 * i); in pch_pic_reset()
222 writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_CLR + 4 * i); in pch_pic_reset()
224 writel_relaxed(0, priv->base + PCH_PIC_AUTO0 + 4 * i); in pch_pic_reset()
225 writel_relaxed(0, priv->base + PCH_PIC_AUTO1 + 4 * i); in pch_pic_reset()
227 writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_HTMSI_EN + 4 * i); in pch_pic_reset()
239 return -ENOMEM; in pch_pic_init()
241 raw_spin_lock_init(&priv->pic_lock); in pch_pic_init()
242 priv->base = ioremap(addr, size); in pch_pic_init()
243 if (!priv->base) in pch_pic_init()
246 priv->ht_vec_base = vec_base; in pch_pic_init()
247 priv->vec_count = ((readq(priv->base) >> 48) & 0xff) + 1; in pch_pic_init()
248 priv->gsi_base = gsi_base; in pch_pic_init()
250 priv->pic_domain = irq_domain_create_hierarchy(parent_domain, 0, in pch_pic_init()
251 priv->vec_count, domain_handle, in pch_pic_init()
254 if (!priv->pic_domain) { in pch_pic_init()
266 iounmap(priv->base); in pch_pic_init()
270 return -EINVAL; in pch_pic_init()
283 return -EINVAL; in pch_pic_of_init()
288 return -ENXIO; in pch_pic_of_init()
291 if (of_property_read_u32(node, "loongson,pic-base-vec", &vec_base)) { in pch_pic_of_init()
292 pr_err("Failed to determine pic-base-vec\n"); in pch_pic_of_init()
293 return -EINVAL; in pch_pic_of_init()
304 IRQCHIP_DECLARE(pch_pic, "loongson,pch-pic-1.0", pch_pic_of_init);
318 return -1; in find_pch_pic()
320 if (gsi >= priv->gsi_base && gsi < (priv->gsi_base + priv->vec_count)) in find_pch_pic()
325 return -1; in find_pch_pic()
334 return pch_lpc_acpi_init(pch_pic_priv[0]->pic_domain, pchlpc_entry); in pch_lpc_parse_madt()
350 vec_base = acpi_pchpic->gsi_base - GSI_MIN_PCH_IRQ; in pch_pic_acpi_init()
352 domain_handle = irq_domain_alloc_fwnode(&acpi_pchpic->address); in pch_pic_acpi_init()
355 return -ENOMEM; in pch_pic_acpi_init()
358 ret = pch_pic_init(acpi_pchpic->address, acpi_pchpic->size, in pch_pic_acpi_init()
359 vec_base, parent, domain_handle, acpi_pchpic->gsi_base); in pch_pic_acpi_init()
366 if (acpi_pchpic->id == 0) in pch_pic_acpi_init()