mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 23:20:05 +00:00
A set of interrupt chip driver fixes:
- A fix for a long standing bug in the ARM GICv3 redistributor polling which uses the wrong bit number to test. - Prevent translation of bogus ACPI table entries which map device interrupts into the IPI space on ARM GICs. - Don't write into the pending register of ARM GICV4 before the scan in hardware has completed. - A set of build and correctness fixes for the Qualcomm MPM driver -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmJSzCQTHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYobYVD/9WP+8WMN+EUWtL4+fbSFswjvlXtSjY wURTtcu4Vfadoren5f6I7aEOmgJhC3iUY4R8u9ftvuKi5lh8M2TWVMyFDXfYQa/3 qGlIHfVPQe3AtN/bY1nFnpkFWCVFhfA6EfKOOsBV6/lmP28gSytepc9B29rqfIQM d67GC2MeidSVpxM4AtS2Dguiq+v/MdDcA1P2oMFcpkYwsPSpPNHdrn8F1EbJyXfV O8bZ1stlPRaMTtLb7Dzkpo0JhW6okaLDHDAo2HiXB23PciW7JdzsALvWsidosBuG /b63YHJQqEEk/8sIZDlf84xOUkkOTA6sWpqdxVlzMA71jfMnIs/YEtIQ41paEwE2 MEZPyygVnE8vPmjMjM8dypcQAK/IdAoqyWlbtlNfc+6BFvA6wMLTG+ipG9nEkAiI YvmEI4PUdDa2hrV2S/ExHGyyVhtXZBHT13YFHmspm8cHOkPtUjPSXhVztLv9oQHR yCD1rpqv/zYPVDXNXR6jG+idDkc1L/emFl/3X/vkabbt2bZs8DAJf03sdU8sbAl8 2goG5JREJZI07bCSPdovi1xN8gPlHkZeiv3dFPN3r4Sghxp/H2G+YlMZSD/H9Nti YhH3zXgWKpfEUAaSGyNXl/6RkvUJ5+ZCOuZkZPJtmsn8ptXhb+Z2u4f69ZqlI0LE bkd0uATF50ZwBA== =SJ8P -----END PGP SIGNATURE----- Merge tag 'irq-urgent-2022-04-10' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull irq fixes from Thomas Gleixner: "A set of interrupt chip driver fixes: - A fix for a long standing bug in the ARM GICv3 redistributor polling which uses the wrong bit number to test. - Prevent translation of bogus ACPI table entries which map device interrupts into the IPI space on ARM GICs. - Don't write into the pending register of ARM GICV4 before the scan in hardware has completed. - A set of build and correctness fixes for the Qualcomm MPM driver" * tag 'irq-urgent-2022-04-10' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip/gic, gic-v3: Prevent GSI to SGI translations irqchip/gic-v3: Fix GICR_CTLR.RWP polling irqchip/gic-v4: Wait for GICR_VPENDBASER.Dirty to clear before descheduling irqchip/irq-qcom-mpm: fix return value check in qcom_mpm_init() irq/qcom-mpm: Fix build error without MAILBOX
This commit is contained in:
commit
1519610b53
@ -433,6 +433,7 @@ config QCOM_PDC
|
||||
config QCOM_MPM
|
||||
tristate "QCOM MPM"
|
||||
depends on ARCH_QCOM
|
||||
depends on MAILBOX
|
||||
select IRQ_DOMAIN_HIERARCHY
|
||||
help
|
||||
MSM Power Manager driver to manage and configure wakeup
|
||||
|
@ -3011,18 +3011,12 @@ static int __init allocate_lpi_tables(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u64 its_clear_vpend_valid(void __iomem *vlpi_base, u64 clr, u64 set)
|
||||
static u64 read_vpend_dirty_clear(void __iomem *vlpi_base)
|
||||
{
|
||||
u32 count = 1000000; /* 1s! */
|
||||
bool clean;
|
||||
u64 val;
|
||||
|
||||
val = gicr_read_vpendbaser(vlpi_base + GICR_VPENDBASER);
|
||||
val &= ~GICR_VPENDBASER_Valid;
|
||||
val &= ~clr;
|
||||
val |= set;
|
||||
gicr_write_vpendbaser(val, vlpi_base + GICR_VPENDBASER);
|
||||
|
||||
do {
|
||||
val = gicr_read_vpendbaser(vlpi_base + GICR_VPENDBASER);
|
||||
clean = !(val & GICR_VPENDBASER_Dirty);
|
||||
@ -3033,10 +3027,26 @@ static u64 its_clear_vpend_valid(void __iomem *vlpi_base, u64 clr, u64 set)
|
||||
}
|
||||
} while (!clean && count);
|
||||
|
||||
if (unlikely(val & GICR_VPENDBASER_Dirty)) {
|
||||
if (unlikely(!clean))
|
||||
pr_err_ratelimited("ITS virtual pending table not cleaning\n");
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static u64 its_clear_vpend_valid(void __iomem *vlpi_base, u64 clr, u64 set)
|
||||
{
|
||||
u64 val;
|
||||
|
||||
/* Make sure we wait until the RD is done with the initial scan */
|
||||
val = read_vpend_dirty_clear(vlpi_base);
|
||||
val &= ~GICR_VPENDBASER_Valid;
|
||||
val &= ~clr;
|
||||
val |= set;
|
||||
gicr_write_vpendbaser(val, vlpi_base + GICR_VPENDBASER);
|
||||
|
||||
val = read_vpend_dirty_clear(vlpi_base);
|
||||
if (unlikely(val & GICR_VPENDBASER_Dirty))
|
||||
val |= GICR_VPENDBASER_PendingLast;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
@ -206,11 +206,11 @@ static inline void __iomem *gic_dist_base(struct irq_data *d)
|
||||
}
|
||||
}
|
||||
|
||||
static void gic_do_wait_for_rwp(void __iomem *base)
|
||||
static void gic_do_wait_for_rwp(void __iomem *base, u32 bit)
|
||||
{
|
||||
u32 count = 1000000; /* 1s! */
|
||||
|
||||
while (readl_relaxed(base + GICD_CTLR) & GICD_CTLR_RWP) {
|
||||
while (readl_relaxed(base + GICD_CTLR) & bit) {
|
||||
count--;
|
||||
if (!count) {
|
||||
pr_err_ratelimited("RWP timeout, gone fishing\n");
|
||||
@ -224,13 +224,13 @@ static void gic_do_wait_for_rwp(void __iomem *base)
|
||||
/* Wait for completion of a distributor change */
|
||||
static void gic_dist_wait_for_rwp(void)
|
||||
{
|
||||
gic_do_wait_for_rwp(gic_data.dist_base);
|
||||
gic_do_wait_for_rwp(gic_data.dist_base, GICD_CTLR_RWP);
|
||||
}
|
||||
|
||||
/* Wait for completion of a redistributor change */
|
||||
static void gic_redist_wait_for_rwp(void)
|
||||
{
|
||||
gic_do_wait_for_rwp(gic_data_rdist_rd_base());
|
||||
gic_do_wait_for_rwp(gic_data_rdist_rd_base(), GICR_CTLR_RWP);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARM64
|
||||
@ -1466,6 +1466,12 @@ static int gic_irq_domain_translate(struct irq_domain *d,
|
||||
if(fwspec->param_count != 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (fwspec->param[0] < 16) {
|
||||
pr_err(FW_BUG "Illegal GSI%d translation request\n",
|
||||
fwspec->param[0]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*hwirq = fwspec->param[0];
|
||||
*type = fwspec->param[1];
|
||||
|
||||
|
@ -1123,6 +1123,12 @@ static int gic_irq_domain_translate(struct irq_domain *d,
|
||||
if(fwspec->param_count != 2)
|
||||
return -EINVAL;
|
||||
|
||||
if (fwspec->param[0] < 16) {
|
||||
pr_err(FW_BUG "Illegal GSI%d translation request\n",
|
||||
fwspec->param[0]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*hwirq = fwspec->param[0];
|
||||
*type = fwspec->param[1];
|
||||
|
||||
|
@ -375,7 +375,7 @@ static int qcom_mpm_init(struct device_node *np, struct device_node *parent)
|
||||
raw_spin_lock_init(&priv->lock);
|
||||
|
||||
priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (!priv->base)
|
||||
if (IS_ERR(priv->base))
|
||||
return PTR_ERR(priv->base);
|
||||
|
||||
for (i = 0; i < priv->reg_stride; i++) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user