Message ID | 1483363905-2806-6-git-send-email-hanjun.guo@linaro.org |
---|---|
State | New |
Headers | show |
On Tue, Jan 10, 2017 at 09:39:39PM +0800, Hanjun Guo wrote: [...] > >What you can do is create a wrapper, say iort_node_map_platform_id() > >(whose signature is equivalent to iort_node_map_rid() minus rid_in) > >that carries out the two steps outlined above. > > > >To do that I suggest the following: > > > >(1) I send a patch to "fix" iort_node_get_id() (ie index issue you > > reported) > > I prepared two simple patches, one is for fix the indentation and > the other is adding the missing kernel-doc comment, how about > sending the out for 4.10-rcx? For me it is fine depending on how Rafael wants to handle them, ie if he can batch those with the eg iort_node_get_id() fix I have just sent: https://patchwork.kernel.org/patch/9507041/ > >(2) We remove type_mask handling from iort_node_get_id() > > iort_node_get_id() for now only supports id single mappings, > Do we need to extend it for multi id mappings? seems Sinan's > platform have such cases. I am not really sure I understand what you mean here. > >(3) We create iort_node_map_platform_id() that (pseudo-code, I can > > write the patch if it is clearer): > > > >struct acpi_iort_node *iort_node_map_platform_id(u8 type_mask, int index, > > ...) > >{ > > u32 id, id_out; > > struct acpi_iort_node *parent = iort_node_get_id(&id, index); > > > > if (!parent) > > return NULL; > > > > /* we should probably rename iort_node_map_rid() too */ > > if (!(IORT_TYPE_MASK(parent->type) & type_mask) > > parent = iort_node_map_rid(parent, id, &id_out, type_mask); > > > > return parent; > >} > > > >(4) we update current iort_node_get_id() users and move them over > > to iort_node_map_platform_id() > > I think we need to prepare one patch for the above steps, or it > have functional changes for iort_node_get_id(), for example we > removed the type_mask handling from iort_node_get_id() and it > will break the case for SMMU if we only have requester id entries. If the question is "should we apply this change as a single logical patch" the answer is yes, it looks a simple one to me (basically it implies writing the function above and update the iort_node_get_id() existing callers with it). Does this answer your question ? Thanks ! Lorenzo
diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c index 174e983..ab7bae7 100644 --- a/drivers/acpi/arm64/iort.c +++ b/drivers/acpi/arm64/iort.c @@ -444,6 +444,32 @@ u32 iort_msi_map_rid(struct device *dev, u32 req_id) } /** + * iort_pmsi_get_dev_id() - Get the device id for a device + * @dev: The device for which the mapping is to be done. + * @dev_id: The device ID found. + * + * Returns: 0 for successful find a dev id, errors otherwise + */ +int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id) +{ + struct acpi_iort_node *node; + + if (!iort_table) + return -ENODEV; + + node = iort_find_dev_node(dev); + if (!node) { + dev_err(dev, "can't find related IORT node\n"); + return -ENODEV; + } + + if(!iort_node_get_id(node, dev_id, IORT_MSI_TYPE, 0)) + return -ENODEV; + + return 0; +} + +/** * iort_dev_find_its_id() - Find the ITS identifier for a device * @dev: The device. * @req_id: Device's Requster ID diff --git a/drivers/irqchip/irq-gic-v3-its-platform-msi.c b/drivers/irqchip/irq-gic-v3-its-platform-msi.c index 3c94278..16587a9 100644 --- a/drivers/irqchip/irq-gic-v3-its-platform-msi.c +++ b/drivers/irqchip/irq-gic-v3-its-platform-msi.c @@ -15,6 +15,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <linux/acpi_iort.h> #include <linux/device.h> #include <linux/msi.h> #include <linux/of.h> @@ -56,7 +57,8 @@ static int its_pmsi_prepare(struct irq_domain *domain, struct device *dev, msi_info = msi_get_domain_info(domain->parent); - ret = of_pmsi_get_dev_id(domain, dev, &dev_id); + ret = dev->of_node ? of_pmsi_get_dev_id(domain, dev, &dev_id) : + iort_pmsi_get_dev_id(dev, &dev_id); if (ret) return ret; diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h index 77e0809..ef99fd52 100644 --- a/include/linux/acpi_iort.h +++ b/include/linux/acpi_iort.h @@ -33,6 +33,7 @@ void acpi_iort_init(void); bool iort_node_match(u8 type); u32 iort_msi_map_rid(struct device *dev, u32 req_id); +int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id); struct irq_domain *iort_get_device_domain(struct device *dev, u32 req_id); /* IOMMU interface */ void iort_set_dma_mask(struct device *dev); @@ -42,9 +43,16 @@ static inline void acpi_iort_init(void) { } static inline bool iort_node_match(u8 type) { return false; } static inline u32 iort_msi_map_rid(struct device *dev, u32 req_id) { return req_id; } + static inline struct irq_domain *iort_get_device_domain(struct device *dev, u32 req_id) { return NULL; } + +static inline int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id) +{ + return -ENODEV; +} + /* IOMMU interface */ static inline void iort_set_dma_mask(struct device *dev) { } static inline