Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp234810pxb; Thu, 31 Mar 2022 04:18:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw5l55mLkU2L2BtUZlw22J9U9PiRqU8KKy8f/Mx9HOm6Q8Pju7QGAq5o/+IJXlyw/0yc0HI X-Received: by 2002:a17:902:9345:b0:153:4d7a:53d9 with SMTP id g5-20020a170902934500b001534d7a53d9mr41643057plp.116.1648725529871; Thu, 31 Mar 2022 04:18:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648725529; cv=none; d=google.com; s=arc-20160816; b=CzYfvU6rGKIGFG+WCG3u2v1sJ5MkTgThyznVTq3Ix3bkc/L01xiDgR/UUFmN6IsPh1 r819SsmMOf9GU/ikk/2TcgS0FWGtwvV7pKAqcST0+/UyW7QY/SAKpTwvaI8Je4FB2fsg IsgmTQZnRrS5zXC9iGbKiI5T4R7y9nMDjbgTOmNBtKgxL+q5EQ9V/W5AC/x5WxBzI4H0 KzK+thjFBXG5oN++ASdF7A83zEu8KEg7/jvA4ge9N7a2HjxnUcCJH988hJRS2TFy1wPp mXyw/7KI3BMDGHppl3xYSLt1QAfFFn6MZlM/6L5C6MWqvuVa5EfIupZro9Ymo1XGMBF3 v1Lw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:message-id :in-reply-to:subject:cc:to:from:date; bh=dHbRwf+cofHZ6XOWQef/tQJrW4cl65oGhMkutnPbvtE=; b=Ec5cKhstizWjM8SHuJTA9M51BIm+COlWvfHw1CzOvCNaU3kjo0qJdfL/uJkUeKHy8L fns4zA0mgSscqNIIeY0XPTtuploerbVumSmR5z+wypdCrGckz57WLM3is3T9h26IrwTf UbTGxGuCufdUromZ5/XEUuFvyRNt6vXSctIGyndGS8ZwRxdY+qIERU6/kg6xmP2nSf1t EO1d9csO1DeeBf1pbPCObAWolRo/OHsWq1T7EGwkqFFzGErlJR/VrVOyMhe44eoWOAMk OqYDnZGNGB+vtbCCSrVe5Sf/CeMnkQgcxl4eENqRtuk6glpkeljqSDrkPfBBTEMbrdMe g+AQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id j18-20020a170903025200b00153b2d165d4si22570191plh.476.2022.03.31.04.18.36; Thu, 31 Mar 2022 04:18:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231766AbiCaHNo (ORCPT + 99 others); Thu, 31 Mar 2022 03:13:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40620 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231985AbiCaHNF (ORCPT ); Thu, 31 Mar 2022 03:13:05 -0400 Received: from angie.orcam.me.uk (angie.orcam.me.uk [78.133.224.34]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 7B1717EB28; Thu, 31 Mar 2022 00:11:11 -0700 (PDT) Received: by angie.orcam.me.uk (Postfix, from userid 500) id D8F3992009C; Thu, 31 Mar 2022 09:11:10 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by angie.orcam.me.uk (Postfix) with ESMTP id D79EB92009B; Thu, 31 Mar 2022 08:11:10 +0100 (BST) Date: Thu, 31 Mar 2022 08:11:10 +0100 (BST) From: "Maciej W. Rozycki" To: Bjorn Helgaas , Thomas Gleixner , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" cc: Arnd Bergmann , Nikolai Zhubr , Michal Necasek , Dmitry Osipenko , Linus Torvalds , x86@kernel.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 4/5] x86/PCI: Fix ALi M1487 (IBC) PIRQ router link value interpretation In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (DEB 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix an issue with commit 1ce849c75534 ("x86/PCI: Add support for the ALi M1487 (IBC) PIRQ router") and correct ALi M1487 (IBC) PIRQ router link value (`pirq' cookie) interpretation according to findings in the BIOS. Credit to Nikolai Zhubr for the detective work as to the bit layout. Signed-off-by: Maciej W. Rozycki Cc: Nikolai Zhubr Fixes: 1ce849c75534 ("x86/PCI: Add support for the ALi M1487 (IBC) PIRQ router") Cc: stable@vger.kernel.org # v5.15+ --- No change from v3. New change in v3. --- arch/x86/pci/irq.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) linux-x86-pirq-router-finali-link.diff Index: linux-macro/arch/x86/pci/irq.c =================================================================== --- linux-macro.orig/arch/x86/pci/irq.c +++ linux-macro/arch/x86/pci/irq.c @@ -337,6 +337,15 @@ static void write_pc_conf_nybble(u8 base pc_conf_set(reg, x); } +/* + * FinALi pirq rules are as follows: + * + * - bit 0 selects between INTx Routing Table Mapping Registers, + * + * - bit 3 selects the nibble within the INTx Routing Table Mapping Register, + * + * - bits 7:4 map to bits 3:0 of the PCI INTx Sensitivity Register. + */ static int pirq_finali_get(struct pci_dev *router, struct pci_dev *dev, int pirq) { @@ -344,11 +353,13 @@ static int pirq_finali_get(struct pci_de 0, 9, 3, 10, 4, 5, 7, 6, 0, 11, 0, 12, 0, 14, 0, 15 }; unsigned long flags; + u8 index; u8 x; + index = (pirq & 1) << 1 | (pirq & 8) >> 3; raw_spin_lock_irqsave(&pc_conf_lock, flags); pc_conf_set(PC_CONF_FINALI_LOCK, PC_CONF_FINALI_LOCK_KEY); - x = irqmap[read_pc_conf_nybble(PC_CONF_FINALI_PCI_INTX_RT1, pirq - 1)]; + x = irqmap[read_pc_conf_nybble(PC_CONF_FINALI_PCI_INTX_RT1, index)]; pc_conf_set(PC_CONF_FINALI_LOCK, 0); raw_spin_unlock_irqrestore(&pc_conf_lock, flags); return x; @@ -362,13 +373,15 @@ static int pirq_finali_set(struct pci_de }; u8 val = irqmap[irq]; unsigned long flags; + u8 index; if (!val) return 0; + index = (pirq & 1) << 1 | (pirq & 8) >> 3; raw_spin_lock_irqsave(&pc_conf_lock, flags); pc_conf_set(PC_CONF_FINALI_LOCK, PC_CONF_FINALI_LOCK_KEY); - write_pc_conf_nybble(PC_CONF_FINALI_PCI_INTX_RT1, pirq - 1, val); + write_pc_conf_nybble(PC_CONF_FINALI_PCI_INTX_RT1, index, val); pc_conf_set(PC_CONF_FINALI_LOCK, 0); raw_spin_unlock_irqrestore(&pc_conf_lock, flags); return 1; @@ -377,7 +390,7 @@ static int pirq_finali_set(struct pci_de static int pirq_finali_lvl(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq) { - u8 mask = ~(1u << (pirq - 1)); + u8 mask = ~((pirq & 0xf0u) >> 4); unsigned long flags; u8 trig;