From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755925AbbIWRMv (ORCPT ); Wed, 23 Sep 2015 13:12:51 -0400 Received: from mail-bl2on0083.outbound.protection.outlook.com ([65.55.169.83]:12000 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753254AbbIWRMt (ORCPT ); Wed, 23 Sep 2015 13:12:49 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=David.Daney@caviumnetworks.com; Message-ID: <5602DD87.1080805@caviumnetworks.com> Date: Wed, 23 Sep 2015 10:12:39 -0700 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: Rob Herring CC: David Daney , "linux-kernel@vger.kernel.org" , Will Deacon , Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , "linux-arm-kernel@lists.infradead.org" , "devicetree@vger.kernel.org" , Marc Zyngier , Grant Likely , Thomas Gleixner , Jason Cooper , David Daney , Frank Rowand Subject: Re: [PATCH v2 2/3] of/irq: Add new function of_msi_map_rid() References: <1442966406-13198-1-git-send-email-ddaney.cavm@gmail.com> <1442966406-13198-3-git-send-email-ddaney.cavm@gmail.com> In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [64.2.3.194] X-ClientProxiedBy: BLUPR07CA061.namprd07.prod.outlook.com (25.160.24.16) To BY1PR0701MB1721.namprd07.prod.outlook.com (25.162.111.140) X-Microsoft-Exchange-Diagnostics: 1;BY1PR0701MB1721;2:Yww8DC6hJvIVCdmIFUuNEP9vDwJYTAEmsXlwE+l+E870Oi1VRRPr0v+d8ujVRk3JCXEFr+tTlK2W+hqZH4GLRw5b+4qP9isV8DWEw3U7q9gE/ukZwTr+7fIUpcMzvSwMcx2e16ozxdOD2I3pcnrE7Bk1dLyHF0rWSuXAHMit560=;3:UvlJT/Pwa9wJBMl63QjOjT9Qk4IYPXb35OJpzvBC4PRfouHi5Zw3W2QnGa74Xf5NpAOYQ6VrMb0r+LJdsHpyM/Md8jqmKd9Zowpe1wrZGRMA79dqOIgFNvDOol7ojXW1P97qWymoc04Ms4bBH1obxQ==;25:Sz/QGbySBaWUSRVVv3wo2ky6BgcKOv+cre0AO/fD/jLPm1YeCkXATVxilhAmOXXU7mBAJEBaOBDYAxIGOwkXBiqMvJ2kphtvA8K9yNRDw6I8XHS2UhBdg3ia7T1dPRqyPb8QVFkx/2cEO8OI4hiegr7fCa43Dp5gcN/R8gKL7JiyFaqFMa6C4CkO076qgjv5F/l+9S37lU36E/V8agIctTsl2R6dyPioHhCb2UNNE+s+X0HKCM09FC+oSsJ+KcnTTGm0OtTcnu3lC/rXvyTphw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0701MB1721; X-Microsoft-Exchange-Diagnostics: 1;BY1PR0701MB1721;20:TZbZeJNyQNKOfly/Kz+IPi+O4YhMAuE+SwdQWeibwHCJYIYhXyGQ9OzVW7KHunc3qvTPiQY+0njFOmgSCz5OAvaySB8ixFBRdZ7s8cIrZy85TKb62yJ1avo1HMX1IzEq6VJzZb0g98jJ8CX4MoqC07h3mkBVSelNOQ0cFgJl426fgyb/I7xfgYj8xrCk5xXdx9LRZvyd6vDWdf2teeHgyPB6Wt5oUZhpOzkksM9gib5JqYDD/v3B3gnRGmU5zAxCKx01fGvTYZbxCbZXdlhXoNM+Lf+i9X5t+RMgd8fRkpzAO/IAAyHB4CvFXuSc6VMpkxKgZVPRdMwA86IjgEnElD5eDypyUNPv+4o5c1AFP20vxQUmSzr2vdC+eD6qjgkgiPDY4eD/9HIP1lXxa1Ourb7qNZ7V/cqevjF5hnMI8NI8eFu9Gz1LOVO9UBvTZbTQL03KyjJWRnyHEGXpRSJ3oRzbpJ8OyDDjlcrXc02vhA7a/n51t/gY6Qqo6HeAGoGT2ltLzeQXA2uKFdgV3mgALpiC5iytOZkeS8eXOOjncOFtWBac9GcuDiHyiVIaLAOIUt7KlvBu+NPuffSfkF0s+CA1KAAfcXz/Tk/LHoDk0zc= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(520078)(3002001);SRVR:BY1PR0701MB1721;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0701MB1721; X-Microsoft-Exchange-Diagnostics: 1;BY1PR0701MB1721;4:vqvGlEWPkaDXAxzm20KOHY/jNNCnwS4qZCIDUDYlYO0QtQNUO5E8flFlF6NeMYPNVGjI56jH85Rjw/RKU6+8YZfe8tUIZJ9acv0jZ1drf2pzEKL08SmzBkl/y7X84hG5KZs7i2dZQrfsWMqeBX9VdgwJF/1JezDOLJ69PSuN81eZ4DSFkOIt7vKi6fJrbnCM6n9ybCov/7nRVwMt60p1EzY9FioFtEN16pV672JDudYO8zL2oFjrRnnh6ku2VLO1XPCCwv7jc/krcc4Irw7H9fYRYc51ujqWDl27OrEWGPyqkQBCVcs/mmOlQKKg5dNWxe2cydwP05x1wbGKzzqhxqxPGOxv3V6pgtemlhF3I1E= X-Forefront-PRVS: 07083FF734 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(189002)(199003)(377454003)(479174004)(24454002)(64126003)(4001540100001)(81156007)(50986999)(105586002)(5004730100002)(50466002)(76176999)(87266999)(69596002)(5001960100002)(33656002)(19580405001)(80316001)(4001350100001)(65816999)(42186005)(77096005)(110136002)(54356999)(5007970100001)(19580395003)(46102003)(97736004)(122386002)(65956001)(64706001)(47776003)(66066001)(77156002)(68736005)(87976001)(23676002)(92566002)(62966003)(59896002)(53416004)(36756003)(5001920100001)(2950100001)(65806001)(101416001)(189998001)(106356001)(83506001)(5001860100001)(5001830100001)(40100003);DIR:OUT;SFP:1101;SCL:1;SRVR:BY1PR0701MB1721;H:dl.caveonetworks.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCWTFQUjA3MDFNQjE3MjE7MjM6SDF0VDlsb1ljWllHTHdKM3llQnhjcC9j?= =?utf-8?B?cUZNZU5ycllwQkRlY2l0NlJVT0YvUmpBaGNRSE8zclloMTB6WGowRldWUVp0?= =?utf-8?B?SUlYTWRIVThiTzZrbkxCbHU5NXRWTEJFNTVrSVQ1eGZWZUpuaitWR3B0OTJj?= =?utf-8?B?ZTFoVk5VYW1KandKa2FQeitobm90ZUhrWWx2Z25JRGh3dmh0Tno0SStWckFm?= =?utf-8?B?MUVCeWtscVFrT3U2Z1NmT3Z0aVI1d1FwUmJtTk9lWnVVTkpleEZES3hGR1Nw?= =?utf-8?B?ZzV6dHYrMERrQS96SWE1ZXVQNm1ENWpYa3l4dEZKU25ZMTVhaytjWXFGQ2lZ?= =?utf-8?B?WWZ2bjFjTVZ1dHZUeGk1WTBoSjdQd2hLZ0dkRHI3bmZvSTFGdE1TWno4OHpT?= =?utf-8?B?aGhIOWVFZHBERHFieFMzcnp0TWUrcERHaEJ5cWpDdHpjUHNmMlRQK0o4eS9I?= =?utf-8?B?NjhVbWkzbVVQOFBVYzVxczNVVFI4K2s5ek84d1FUdmR4UEVQcHRwQW4rRHJU?= =?utf-8?B?N01URTdZYVJORnBxYmZZZStsQ25tRklWWmFwS201cEFITlJQaE9BdjE2N3Fi?= =?utf-8?B?RWxML09kMlozU1FRYjJ3UlhiM0FDa1BNaUdrazRFZ0xYd0djN29ac0NkeVRx?= =?utf-8?B?NTBLRTlFT1dyTEdTSHp4QVVLKzVFejBnYk01Y3VDSkFIOHpBVStod0t6V3BY?= =?utf-8?B?b212V0hWamliL3BGNjNmVXhxcGJVdUk2aVZUVVpMcnJKVWUyeURxb1grNHpP?= =?utf-8?B?TlVVcWZ0d1ZtRUtuMFVYMFhYeWpsaVBlMkxQRUNCMWQra1hqN1dDclJGaDZn?= =?utf-8?B?TU5vbUFmWHJzNVdGa1lxVVZ3VGVVK2hybXhjNHZOVk4wamYwTXBtZ1V5dEFw?= =?utf-8?B?TVNJSGlaeHpCaHdJL2owT3FUbnFUUHcxNDBuSUdLMmF5YS95dnFYM3Vzem43?= =?utf-8?B?RDBGRnpUODFQUEk0WmEvTVR6RnM1dGY0bktpU3B5dmZMYlh3c2g4eGVkSWVS?= =?utf-8?B?b1VRVFhXK3NQV1NGamV3cysxTDBVdDQxcWppZGR1cDJtRTBwZU84bzN6U216?= =?utf-8?B?ZHdRdy9XbEx6TlllaXBxUTVaZWliUXZmZW9UMG1TY2N4MzFqbkh2NU84YVZJ?= =?utf-8?B?c0syNVVISE1lRWpzRDhHTEczL2JsOVpOeDdmRXVPelRKR0JMdzhpd0FiWnNa?= =?utf-8?B?OFB5eVF3VlJnVVhUeWJFTGVCQTh6UWl1NDA2R1VoQUJteVZFU2xoWHJ6eFZ3?= =?utf-8?B?UGV2UzVGQTBuODU2OW5vdnY0NDUxQ3Zia2RhM2YrMnJGSWY3Z29HcE5vallz?= =?utf-8?B?dWlIZVBDZEFQb3ZUL0NSZVBMdkYxOG00TVZwQVF3dG5aaXNrY1dWU0g4SWt0?= =?utf-8?B?STc2R3NweU1hcEVLRC9uaTJDblpBR0QrdC9EUWRrMVY4U2F3cENIcEQ3MEg2?= =?utf-8?B?cTFkb1UyRTRLNlF3WFlOMVBNeTlqRUFnOTMxYTVlclMwVjNrQXVBb3Q0U2FZ?= =?utf-8?B?ZGtiN0FYUzRHK3BuaVovS1krMVpGQTIrMVBnUkdFM085QkdmSFdxZFFSNEQ0?= =?utf-8?B?a2xDNHJMakdoeWNEMzFmbnQvSGJKNHV5VGlLSTlsdjAyWGhva3d6N05Lc0xK?= =?utf-8?B?anNqNlpib29iMDl2TTQzSGRiSWhzSU9YWXFzY1BQN1BkdDlib0FSaVd5b1Zs?= =?utf-8?B?QXhPT3NVZ3Bvd2dsTDJhanVOQzFjOGFOUFd6YjlhWWxTQjBFUGVnQ1EybTFw?= =?utf-8?B?OFozYlV0dlpIWTBXSE1uWXZJWlV1OTY5Y3BHMVBlMHBJUkxQV2dEdnNzZGVD?= =?utf-8?B?Z2JKQ0RaUkVjK1JOYXlsSlhCUHAxcWlhQlplN1hWSTFONlJlWjVycFJnQ2dp?= =?utf-8?B?TFUwYmdUbjJ6Z0tvN0RIL09hR2ZiSHJMSG9CSmpWOWF5d0NIcElNcFYzY1pT?= =?utf-8?B?OFVZWFlKMUk0N3c9PQ==?= X-Microsoft-Exchange-Diagnostics: 1;BY1PR0701MB1721;5:DHNYQ/2X8A7UKt1Le8Zzk3X6L0GS8yorOSjDJVlxVvpaQ4VUg8Hmumvq//Z8dO2RD189B2FW59k4Tl9EjcCUqFkhTyJ6Q8PNa0AwAyBjvjF0t0nX4KSgOy9CRKCZJO13Gtl+dUP2IOeuDUk031SSvw==;24:dgT65UOo31Um3mclt1AN0UB82aUga6tY/TgYhk9IPna+Atuk5KZRiFd7DI933lVHym3oDbld6S1RvUqpwAQFZSgKKQxDOeR5GPAgSQpgZMQ=;20:RxFbO4Kl8M65YnvHVpE7rHcbIOWwiHNoBnN/AeGjPiUr/xDVHkNeh3FqeUZQQML92e/x+c3idfWMpNPC9iv+WA== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Sep 2015 17:12:42.9109 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0701MB1721 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/23/2015 10:07 AM, Rob Herring wrote: > On Tue, Sep 22, 2015 at 7:00 PM, David Daney wrote: >> From: David Daney >> >> The device tree property "msi-map" specifies how to create the PCI >> requester id used in some MSI controllers. Add a new function >> of_msi_map_rid() that finds the msi-map property and applies its >> translation to a given requester id. >> >> Signed-off-by: David Daney >> --- >> drivers/of/irq.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> include/linux/of_irq.h | 7 ++++ >> 2 files changed, 93 insertions(+) >> >> diff --git a/drivers/of/irq.c b/drivers/of/irq.c >> index 55317fa..3f64d2e 100644 >> --- a/drivers/of/irq.c >> +++ b/drivers/of/irq.c >> @@ -598,3 +598,89 @@ void of_msi_configure(struct device *dev, struct device_node *np) >> d = irq_find_host(msi_np); >> dev_set_msi_domain(dev, d); >> } >> + >> +/** >> + * of_msi_map_rid - Map a MSI requester ID for a device. >> + * @dev: device for which the mapping is to be done. >> + * @msi_np: device node of the expected msi controller. >> + * @rid_in: unmapped MSI requester ID for the device. >> + * >> + * Walk up the device hierarchy looking for devices with a "msi-map" >> + * property. If found, apply the mapping to @rid_in. >> + * >> + * Returns the mapped MSI requester ID. >> + */ >> +u32 of_msi_map_rid(struct device *dev, struct device_node *msi_np, u32 rid_in) > > Generally, the OF API does not use struct device except for what is in > of/device.c. I'm guessing you need it here because you have devices > without DT nodes? Exactly right. As you can see we walk up the hierarchy until we find a device with the desired of_node ("msi-map"). > > We may want to handle this more like NUMA node IDs where we populate > data in struct device at creation time and looking at struct device > parents is independent of DT. How would this information be retrieved > with ACPI? ACPI has a table called _IORT that contains similar information. It would have to be extracted with an analogous facility. > >> +{ >> + struct device *parent_dev; >> + struct device_node *msi_controller_node; >> + const __be32 *msi_map; > >> + u32 map_mask, masked_rid; >> + u32 rid_base, msi_base, rid_len, phandle; > > One line please. OK. It looks like another revision of the patch is in order. > >> + int msi_map_len; >> + bool matched; >> + u32 rid_out = rid_in; >> + >> + /* >> + * Walk up the device parent links looking for one with a >> + * "msi-map" property. >> + */ >> + msi_map = NULL; > > init in the declaration. OK... > >> + for (parent_dev = dev; parent_dev; parent_dev = parent_dev->parent) { >> + if (!parent_dev->of_node) >> + continue; >> + >> + msi_map = of_get_property(parent_dev->of_node, >> + "msi-map", &msi_map_len); >> + if (!msi_map) >> + continue; >> + >> + if (msi_map_len % (4 * sizeof(__be32))) { >> + dev_err(parent_dev, "Error: Bad msi-map length: %d\n", >> + msi_map_len); >> + goto out; > > Just return here. > >> + } >> + /* We have a good parent_dev and msi_map, let's use them. */ >> + break; >> + } >> + if (!msi_map) >> + goto out; > > Just return here. > >> + >> + /* The default is to select all bits. */ >> + map_mask = 0xffffffff; >> + >> + /* >> + * Can be overridden by "msi-map-mask" property. If >> + * of_property_read_u32() fails, the default is used. >> + */ >> + of_property_read_u32(parent_dev->of_node, "msi-map-mask", &map_mask); >> + >> + masked_rid = map_mask & rid_in; >> + matched = false; >> + while (!matched && msi_map_len >= 4 * sizeof(__be32)) { >> + rid_base = be32_to_cpup(msi_map + 0); >> + phandle = be32_to_cpup(msi_map + 1); >> + msi_base = be32_to_cpup(msi_map + 2); >> + rid_len = be32_to_cpup(msi_map + 3); >> + >> + msi_controller_node = of_find_node_by_phandle(phandle); >> + >> + matched = masked_rid >= rid_base && >> + masked_rid < rid_base + rid_len && >> + msi_np == msi_controller_node; >> + >> + of_node_put(msi_controller_node); >> + msi_map_len -= 4 * sizeof(__be32); >> + msi_map += 4; >> + } >> + if (!matched) >> + goto out; > > Just return here. > >> + >> + rid_out = masked_rid + 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, >> + rid_len, rid_in, rid_out); >> +out: >> + return rid_out; >> +} >> diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h >> index 4bcbd58..8cd9334 100644 >> --- a/include/linux/of_irq.h >> +++ b/include/linux/of_irq.h >> @@ -75,6 +75,7 @@ static inline int of_irq_to_resource_table(struct device_node *dev, >> extern unsigned int irq_of_parse_and_map(struct device_node *node, int index); >> extern struct device_node *of_irq_find_parent(struct device_node *child); >> extern void of_msi_configure(struct device *dev, struct device_node *np); >> +u32 of_msi_map_rid(struct device *dev, struct device_node *msi_np, u32 rid_in); >> >> #else /* !CONFIG_OF */ >> static inline unsigned int irq_of_parse_and_map(struct device_node *dev, >> @@ -87,6 +88,12 @@ static inline void *of_irq_find_parent(struct device_node *child) >> { >> return NULL; >> } >> + >> +static inline u32 of_msi_map_rid(struct device *dev, >> + struct device_node *msi_np, u32 rid_in) >> +{ >> + return rid_in; >> +} >> #endif /* !CONFIG_OF */ >> >> #endif /* __OF_IRQ_H */ >> -- >> 1.9.1 >>