From mboxrd@z Thu Jan 1 00:00:00 1970 From: ddaney@caviumnetworks.com (David Daney) Date: Tue, 9 Feb 2016 09:03:11 -0800 Subject: [PATCH] of/irq: Fix msi-map calculation for nonzero rid-base In-Reply-To: <9f6845195d03b0e0b0d187bb510fbf7bd497e836.1455015344.git.robin.murphy@arm.com> References: <9f6845195d03b0e0b0d187bb510fbf7bd497e836.1455015344.git.robin.murphy@arm.com> Message-ID: <56BA1BCF.8080309@caviumnetworks.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 02/09/2016 03:04 AM, Robin Murphy wrote: > The existing msi-map code is fine for shifting the entire RID space > upwards, but attempting finer-grained remapping reveals a bug. It turns > out that we are mistakenly treating the msi-base part as an offset, not > as a new base to remap onto, so things get squiffy when rid-base is > nonzero. Fix this, and at the same time add a sanity check against > having msi-map-mask clash with a nonzero rid-base, as that's another > thing one can easily get wrong. > > CC: > Signed-off-by: Robin Murphy This is equivalent to what I tested yesterday. Thanks for fixing it... Acked-by: David Daney > --- > drivers/of/irq.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/of/irq.c b/drivers/of/irq.c > index 7ee21ae..e7bfc17 100644 > --- a/drivers/of/irq.c > +++ b/drivers/of/irq.c > @@ -635,6 +635,13 @@ static u32 __of_msi_map_rid(struct device *dev, struct device_node **np, > msi_base = be32_to_cpup(msi_map + 2); > rid_len = be32_to_cpup(msi_map + 3); > > + if (rid_base & ~map_mask) { > + dev_err(parent_dev, > + "Invalid msi-map translation - msi-map-mask (0x%x) ignores rid-base (0x%x)\n", > + map_mask, rid_base); > + return rid_out; > + } > + > msi_controller_node = of_find_node_by_phandle(phandle); > > matched = (masked_rid >= rid_base && > @@ -654,7 +661,7 @@ static u32 __of_msi_map_rid(struct device *dev, struct device_node **np, > if (!matched) > return rid_out; > > - rid_out = masked_rid + msi_base; > + rid_out = masked_rid - rid_base + msi_base; > dev_dbg(dev, > "msi-map at: %s, using mask %08x, rid-base: %08x, msi-base: %08x, length: %08x, rid: %08x -> %08x\n", > dev_name(parent_dev), map_mask, rid_base, msi_base, > From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Daney Subject: Re: [PATCH] of/irq: Fix msi-map calculation for nonzero rid-base Date: Tue, 9 Feb 2016 09:03:11 -0800 Message-ID: <56BA1BCF.8080309@caviumnetworks.com> References: <9f6845195d03b0e0b0d187bb510fbf7bd497e836.1455015344.git.robin.murphy@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <9f6845195d03b0e0b0d187bb510fbf7bd497e836.1455015344.git.robin.murphy@arm.com> Sender: linux-kernel-owner@vger.kernel.org To: Robin Murphy Cc: robh+dt@kernel.org, frowand.list@gmail.com, grant.likely@linaro.org, devicetree@vger.kernel.org, marc.zyngier@arm.com, mark.rutland@arm.com, david.daney@cavium.com, stuart.yoder@nxp.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org List-Id: devicetree@vger.kernel.org On 02/09/2016 03:04 AM, Robin Murphy wrote: > The existing msi-map code is fine for shifting the entire RID space > upwards, but attempting finer-grained remapping reveals a bug. It turns > out that we are mistakenly treating the msi-base part as an offset, not > as a new base to remap onto, so things get squiffy when rid-base is > nonzero. Fix this, and at the same time add a sanity check against > having msi-map-mask clash with a nonzero rid-base, as that's another > thing one can easily get wrong. > > CC: > Signed-off-by: Robin Murphy This is equivalent to what I tested yesterday. Thanks for fixing it... Acked-by: David Daney > --- > drivers/of/irq.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/of/irq.c b/drivers/of/irq.c > index 7ee21ae..e7bfc17 100644 > --- a/drivers/of/irq.c > +++ b/drivers/of/irq.c > @@ -635,6 +635,13 @@ static u32 __of_msi_map_rid(struct device *dev, struct device_node **np, > msi_base = be32_to_cpup(msi_map + 2); > rid_len = be32_to_cpup(msi_map + 3); > > + if (rid_base & ~map_mask) { > + dev_err(parent_dev, > + "Invalid msi-map translation - msi-map-mask (0x%x) ignores rid-base (0x%x)\n", > + map_mask, rid_base); > + return rid_out; > + } > + > msi_controller_node = of_find_node_by_phandle(phandle); > > matched = (masked_rid >= rid_base && > @@ -654,7 +661,7 @@ static u32 __of_msi_map_rid(struct device *dev, struct device_node **np, > if (!matched) > return rid_out; > > - rid_out = masked_rid + msi_base; > + rid_out = masked_rid - rid_base + msi_base; > dev_dbg(dev, > "msi-map at: %s, using mask %08x, rid-base: %08x, msi-base: %08x, length: %08x, rid: %08x -> %08x\n", > dev_name(parent_dev), map_mask, rid_base, msi_base, > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757500AbcBIRDV (ORCPT ); Tue, 9 Feb 2016 12:03:21 -0500 Received: from mail-bn1on0085.outbound.protection.outlook.com ([157.56.110.85]:37312 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754160AbcBIRDS (ORCPT ); Tue, 9 Feb 2016 12:03:18 -0500 Authentication-Results: arm.com; dkim=none (message not signed) header.d=none;arm.com; dmarc=none action=none header.from=caviumnetworks.com; Message-ID: <56BA1BCF.8080309@caviumnetworks.com> Date: Tue, 9 Feb 2016 09:03:11 -0800 From: David Daney User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Robin Murphy CC: , , , , , , , , , , Subject: Re: [PATCH] of/irq: Fix msi-map calculation for nonzero rid-base References: <9f6845195d03b0e0b0d187bb510fbf7bd497e836.1455015344.git.robin.murphy@arm.com> In-Reply-To: <9f6845195d03b0e0b0d187bb510fbf7bd497e836.1455015344.git.robin.murphy@arm.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [64.2.3.194] X-ClientProxiedBy: SN2PR07CA014.namprd07.prod.outlook.com (10.255.174.31) To DM3PR07MB2140.namprd07.prod.outlook.com (25.164.4.146) X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2140;2:DL6yDUeEtSINflPGGvWu64dp7eC4yMtsLMCorpEjTKf56NUL6V8z9Ayi+mcJsNaMa8js4Lawx+a3O3p6PEZTOYe4zr2Sybf7kWor7S7xK62A+7fTf2dYmjBBfYM22IIyAhk90B8kAXSDKuspt//U2w==;3:FIBtKbBo2pU6jAPAcJdzb+bSabGuvvW4JW7wLZzuD/7ZWu8GaaEftdp9voR0qZjzIF2UcGtnmFQthqqzZYCbxyUm7lDPpHJU+sBaUnfbL/eJqaunoTs7nXcNscJC9w81;25:iuxkXF40maOe6QJN9pwzci4TguVFiQUPn3fJEzT6AFj5mZ0VzxKDBsmkWIuwIHIBmZNu8PMRLdAoR3aJ/DeAmSc5581UFLoKIVylowmHpMmutVP4r8iWpxx7fPM1zQTy/MJyvt9o6KpZnWtlXUoA3HGlGROhhMl6Wcmao1/U/qu4w1odyULJ3xeVvSLMg9orheyJWVi9hagOh+I50Jwdkh0qISdayxmX7MZZJsMeLP+U8u4I6TF5Tetzx9c03OxBWkl7nWim7za98ckbxWppT/vwqkfQc7kJ3soQEiolq3cqUNAvLGDnMzOigS4HledK X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2140; X-MS-Office365-Filtering-Correlation-Id: 5aaa7ab8-ff81-4a48-750e-08d33172e6c8 X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2140;20:ZAIofdM2KCFyiGH8Jz1BAv8D/AGIQCpRq6C660MblbmH3zbTipfclXkid61l2YlSQvt/FGsJkWAl0D/pPychYMJsdyNTFpdRp7cPXVQ5VIanqTUAnjs20rab3EfWiNG2wItjaD5da4YwrWmldm7omICv9Xy8wkclXiz/Yfe8gD+0OY/dwYIOv4xpUjSFvqdjKhZr3EOL3SSCjvkVpNdVBbP45XOsW4ai4qi6XIPveBsvbIn27pvAm1LML/VNCE9CxcH+/e1pYnx5L8K7gUcRqRXN//+B5aiX9c7dyyoxu75h0rZPDyYnrOHX8cBfhuTYxPc3d9SsiVmXQT8qyo+Rs4qz1RRbw3KC0F/P/QXQeBewgw/nRF0GHz9dtLo4Y5mpTFzeS7INAGlhcTB984UO/xLCBwdk3EM2Q/BKjHpVYN96ZDG/wDA1dMDOjEsHlFMHKKkXfTM0+02m7Hjf2TZkLWpHFPlpMS6znxh0G/m0lM9X/eeLO/4lC4n0NHQfGl4oCvGMS81WvbFlRL1X7R3k3aY/MkfF92TjxUFfdNjngsGGJm68g5McrIXOT/2WlshnAFgPRMaN4GogC+SCmHc6DogYJLHn12NqFUVMsRkz9+g= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046);SRVR:DM3PR07MB2140;BCL:0;PCL:0;RULEID:;SRVR:DM3PR07MB2140; X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2140;4:9W5JBbY0ommTQpNQPkGFHm2QGWGgJQVjiTnVno+MpuIzTva08QlLnWhHUrewxP3WPmF/mBGtEn+4ByFOuSXytquPrU26qds/lxQ7SrvN2AR7xpTEDKntKSCsvog1CKGT5qAvERO4hJZ36AzjieQXbQZuGRhmIrKBPDkzWRIWUj6iSr7EiW5Pb6YUaLBmHjLS2KIYjkDoInkbTxDkeYEGZGF36+CWvB/gHZ+Rtt0pyEhA9QLyRDNxe+8ULbM1w6cO+byOlA3fSlyD5TUdGG205dmBd1rxmvZZCULwoDrbrjOFwZth0s/TN6Z69xg3uly6ADjANEz+Eudsrp5TT4t9YB4mcDVQBjTxhUULBP1TZCOqREOykMmYnwck/v2dYOdjppJe8q+jY0ze0ZARJqbA+wxR+U2XtI1sMWE6QMvUrew= X-Forefront-PRVS: 08476BC6EF X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(52604005)(24454002)(377454003)(479174004)(230700001)(36756003)(19580405001)(19580395003)(80316001)(5008740100001)(65956001)(66066001)(5004730100002)(4326007)(83506001)(23756003)(2906002)(59896002)(47776003)(42186005)(33656002)(53416004)(110136002)(54356999)(76176999)(50986999)(189998001)(50466002)(87976001)(586003)(77096005)(92566002)(1096002)(3846002)(4001350100001)(5001960100002)(6116002)(2950100001)(7059030);DIR:OUT;SFP:1101;SCL:1;SRVR:DM3PR07MB2140;H:dl.caveonetworks.com;FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?iso-8859-1?Q?1;DM3PR07MB2140;23:yR4ncjJ/pK0WtAWFW+SqRHT3KYoD6p9xA+iik6R?= =?iso-8859-1?Q?AAnexRBKDh+2zhP4Ua0ZL3B5xqSZOawXy+uL7c6giVhswNTyhlikdSEtrw?= =?iso-8859-1?Q?Zahm3UMGTXRv/utgscEMiyirefVNGEqMM/pY0/Pduf0z3FhV3250Vnl7PJ?= =?iso-8859-1?Q?5NUXutV4agKw3R2mK8Yl7ZDAiPNgRGES2+7oaPC5s7ZRhz9qTaf2OYx251?= =?iso-8859-1?Q?F01oYvi7jwyCDHUSgi6SP9qXiA8zjwnVhjPfBw9xd+WRQJZstcuq2jOpP2?= =?iso-8859-1?Q?1ddMUX02jIqsBzWDm2Vy8J2R/3sKqXQ4FHI0rvAV67ttDJYWSGwaNOahpW?= =?iso-8859-1?Q?+O+aWQVsvRgb9UmuE0TQ2F1KHkOMfRYkKQPojwWiB/c2sMwH9WCeQmCrA7?= =?iso-8859-1?Q?3QZsqr2wTFW4wXRoC+qhGgHLVqgukKIG6ZPw4nVFluD5ohmO6emVH6mnCX?= =?iso-8859-1?Q?7GH4lH2AgkSWNlDPWn8t3lrykAbuyIRSR9+sTCZldZ67Shsiw0ZC9/ACg6?= =?iso-8859-1?Q?5bNKXi8Wbco8E/TjaF6Zjl8fPCos+H/EIQbmdAAamelgQyVkUm+0IQQUl/?= =?iso-8859-1?Q?+f/z6byQ/ERuZ+Zz/LGjDx/BWwMYD/TWw+WmrnvnW9CrbjGns88QPj/nK4?= =?iso-8859-1?Q?CE3OPo+AJWNDfFQYxig8hCOFTYExZhWrpWZkw0Xc3Qv90L5+8kKIvzrwmB?= =?iso-8859-1?Q?zoh5dzjKAK9zoaZQ4DKWRKrYmvuXv+RJdUzMDGUJ9zU9UNWhRDuTrNEqNs?= =?iso-8859-1?Q?YWFqw3YyWD9e1FrbxS1tYY4s10yd9+CXLcjqxbOwYDFp5x/yFzmcwwq8D3?= =?iso-8859-1?Q?o4Ttb05YPrZy1EUvE3s/1h071FlUo+8OvoPCDgA69hn2+adWep2I0AIt5W?= =?iso-8859-1?Q?KVdWYLqULaz5arZ3oRHSRQmK8aV2z6CF49FwGXXaVmzOMTOfWDZUyCSDtg?= =?iso-8859-1?Q?raDQaWhBCV+mU4rDEbh8nFTurRAw9Bcvh9oVHQ26qfuJzW78TmPmxz86BN?= =?iso-8859-1?Q?JvOM2/gsh1VIzRUlhVEcCe5+jqIH/whBt/dF8j4rXqYSileOfgKNA1bQXq?= =?iso-8859-1?Q?FB5cDkucasC6DRgmP9qIkjwUSurETdgrqcHjrIJT2i7VZfqgR55lriLY3t?= =?iso-8859-1?Q?ixxti?= X-Microsoft-Exchange-Diagnostics: 1;DM3PR07MB2140;5:P68kQspiCYARwqniE94WkrD9EBNlVW6VcqctSKT7xsUh72jp6Klia3J2eJG7H7cP4yKHlS+um7SijdHB9VKDjT/T5iILQ5ByEz4aO672qDRT2KsVdSLc2v+QDaIGK1ZCfitjUSJkQ5hEAcWiVS81xg==;24:qNkTdd1bljRpG8h/BVw6t7lqGng/vmciBs/BrnIX6Gw01YmRIvaPId8xccP1V8+PZn8uNLR5KsyaRvCjBcB6pG4aXAndiTqEKsEJdxwt0dQ= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Feb 2016 17:03:14.7140 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM3PR07MB2140 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/09/2016 03:04 AM, Robin Murphy wrote: > The existing msi-map code is fine for shifting the entire RID space > upwards, but attempting finer-grained remapping reveals a bug. It turns > out that we are mistakenly treating the msi-base part as an offset, not > as a new base to remap onto, so things get squiffy when rid-base is > nonzero. Fix this, and at the same time add a sanity check against > having msi-map-mask clash with a nonzero rid-base, as that's another > thing one can easily get wrong. > > CC: > Signed-off-by: Robin Murphy This is equivalent to what I tested yesterday. Thanks for fixing it... Acked-by: David Daney > --- > drivers/of/irq.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/of/irq.c b/drivers/of/irq.c > index 7ee21ae..e7bfc17 100644 > --- a/drivers/of/irq.c > +++ b/drivers/of/irq.c > @@ -635,6 +635,13 @@ static u32 __of_msi_map_rid(struct device *dev, struct device_node **np, > msi_base = be32_to_cpup(msi_map + 2); > rid_len = be32_to_cpup(msi_map + 3); > > + if (rid_base & ~map_mask) { > + dev_err(parent_dev, > + "Invalid msi-map translation - msi-map-mask (0x%x) ignores rid-base (0x%x)\n", > + map_mask, rid_base); > + return rid_out; > + } > + > msi_controller_node = of_find_node_by_phandle(phandle); > > matched = (masked_rid >= rid_base && > @@ -654,7 +661,7 @@ static u32 __of_msi_map_rid(struct device *dev, struct device_node **np, > if (!matched) > return rid_out; > > - rid_out = masked_rid + msi_base; > + rid_out = masked_rid - rid_base + msi_base; > dev_dbg(dev, > "msi-map at: %s, using mask %08x, rid-base: %08x, msi-base: %08x, length: %08x, rid: %08x -> %08x\n", > dev_name(parent_dev), map_mask, rid_base, msi_base, >