From: Hanjun Guo <guohanjun@huawei.com>
To: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Hanjun Guo <hanjun.guo@linaro.org>,
Marc Zyngier <marc.zyngier@arm.com>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
<linux-acpi@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>, <linuxarm@huawei.com>,
Thomas Gleixner <tglx@linutronix.de>,
Greg KH <gregkh@linuxfoundation.org>,
Tomasz Nowicki <tn@semihalf.com>, Ma Jun <majun258@huawei.com>,
Kefeng Wang <wangkefeng.wang@huawei.com>,
"Agustin Vega-Frias" <agustinv@codeaurora.org>,
Sinan Kaya <okaya@codeaurora.org>, <huxinwei@huawei.com>,
<yimin@huawei.com>, Jon Masters <jcm@redhat.com>,
Matthias Brugger <mbrugger@suse.com>,
Xinwei Kong <kong.kongxinwei@hisilicon.com>
Subject: Re: [PATCH v7 09/15] ACPI: platform-msi: retrieve dev id from IORT
Date: Mon, 16 Jan 2017 21:21:04 +0800 [thread overview]
Message-ID: <587CC8C0.3040602@huawei.com> (raw)
In-Reply-To: <20170116112556.GA23703@red-moon>
On 2017/1/16 19:25, Lorenzo Pieralisi wrote:
> On Sat, Jan 14, 2017 at 12:28:35PM +0800, Hanjun Guo wrote:
>> Hi Lorenzo,
>>
>> On 2017/1/13 20:11, Lorenzo Pieralisi wrote:
>>> On Wed, Jan 11, 2017 at 11:06:33PM +0800, Hanjun Guo wrote:
>>>> For devices connecting to ITS, it needs dev id to identify itself, and
>>>> this dev id is represented in the IORT table in named component node
>>>> [1] for platform devices, so in this patch we will scan the IORT to
>>>> retrieve device's dev id.
>>>>
>>>> For named components we know that there are always two steps
>>>> involved (second optional):
>>>>
>>>> (1) Retrieve the initial id (this may well provide the final mapping)
>>>> (2) Map the id (optional if (1) represents the map type we need), this
>>>> is needed for use cases such as NC (named component) -> SMMU -> ITS
>>>> mappings.
>>>>
>>>> we have API iort_node_get_id() for step (1) above and
>>>> iort_node_map_rid() for step (2), so create a wrapper
>>>> iort_node_map_platform_id() to retrieve the dev id.
>>>>
>>>> [1]: https://static.docs.arm.com/den0049/b/DEN0049B_IO_Remapping_Table.pdf
>>> This patch should be split and IORT changes should be squashed with
>>> patch 10.
>> If split the changes for IORT and its platform msi, API introduced in IORT will
>> not be used in a single patch, seems violate the suggestion of "new introduced API
>> needs to be used in the same patch", did I miss something?
> Yes, I would introduce iort_node_map_platform_id() and in the same
> patch update current iort_node_get_id() users (ie iort_iommu_configure())
> to it. No functional change intended.
>
> Then in subsequent patches you can retrieve the ITS device id for
> platform devices through it.
Good point, I will update the patch set.
>
> Code is in your series, you just have to reshuffle it slightly.
>
>>>> Suggested-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
>>>> Suggested-by: Tomasz Nowicki <tn@semihalf.com>
>>>> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
>>>> Cc: Marc Zyngier <marc.zyngier@arm.com>
>>>> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
>>>> Cc: Sinan Kaya <okaya@codeaurora.org>
>>>> Cc: Tomasz Nowicki <tn@semihalf.com>
>>>> Cc: Thomas Gleixner <tglx@linutronix.de>
>>>> ---
>>>> drivers/acpi/arm64/iort.c | 56 +++++++++++++++++++++++++++
>>>> drivers/irqchip/irq-gic-v3-its-platform-msi.c | 4 +-
>>>> include/linux/acpi_iort.h | 8 ++++
>>>> 3 files changed, 67 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c
>>>> index 069a690..95fd20b 100644
>>>> --- a/drivers/acpi/arm64/iort.c
>>>> +++ b/drivers/acpi/arm64/iort.c
>>>> @@ -30,6 +30,7 @@
>>>> #define IORT_MSI_TYPE (1 << ACPI_IORT_NODE_ITS_GROUP)
>>>> #define IORT_IOMMU_TYPE ((1 << ACPI_IORT_NODE_SMMU) | \
>>>> (1 << ACPI_IORT_NODE_SMMU_V3))
>>>> +#define IORT_TYPE_ANY (IORT_MSI_TYPE | IORT_IOMMU_TYPE)
>>>>
>>>> struct iort_its_msi_chip {
>>>> struct list_head list;
>>>> @@ -406,6 +407,34 @@ static struct acpi_iort_node *iort_node_map_id(struct acpi_iort_node *node,
>>>> return NULL;
>>>> }
>>>>
>>>> +static
>>>> +struct acpi_iort_node *iort_node_map_platform_id(struct acpi_iort_node *node,
>>>> + u32 *id_out, u8 type_mask,
>>>> + int index)
>>>> +{
>>>> + struct acpi_iort_node *parent;
>>>> + u32 id;
>>>> +
>>>> + /* step 1: retrieve the initial dev id */
>>>> + parent = iort_node_get_id(node, &id, IORT_TYPE_ANY, index);
>>>> + if (!parent)
>>>> + return NULL;
>>>> +
>>>> + /*
>>>> + * optional step 2: map the initial dev id if its parent is not
>>>> + * the target type we wanted, map it again for the use cases such
>>>> + * as NC (named component) -> SMMU -> ITS. If the type is matched,
>>>> + * return the parent pointer directly.
>>>> + */
>>>> + if (!(IORT_TYPE_MASK(parent->type) & type_mask))
>>>> + parent = iort_node_map_id(parent, id, id_out, type_mask);
>>>> + else
>>>> + if (id_out)
>>> Remove this pointer check.
>> This was added because of NULL pointer reference, I passed NULL for id_out because I
>> only want to get its parent node, I think we have four options:
>>
>> - Introduce a new API to get the parent only from the scratch, but it will duplicate the code
>> a lot;
>>
>> - Don't check the id_out in iort_node_map_platform_id(), and introduce a wrapper and pass the
>> dummy id for iort_node_map_platform_id() :
>> static
>> struct acpi_iort_node *iort_node_get_platform_parent{struct device *dev, u8 type_mask}
>> {
>> struct acpi_iort_node *node, *parent = NULL;
>> int i;
>> u32 dummy_id;
>>
>> node = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,
>> iort_match_node_callback, dev);
>>
>> if (!node)
>> return NULL;
>>
>> for (i = 0; i < node->mapping_count; i++) {
>> /* we just want to get the parent node */
>> parent = iort_node_map_platform_id(node, &dummy_id,
>> IORT_MSI_TYPE, i);
>> if (parent)
>> break;
>> }
>>
>> return parent;
>> }
>>
>> - Similar solution as above but don't introduce wrapper, just use dummy_id if
>> iort_node_map_platform_id() is called;
>>
>> - Use the solution I proposed in this patch.
>>
>> Please share you suggestion on this :)
> I see. I would like to change the IORT mapping API functions to always pass
> in an argument:
>
> struct iort_idmap {
> struct acpi_iort_node *parent;
> u32 id;
> };
>
> and return an int, because current functions (eg iort_node_map_rid())
> return a parent IORT node but also the mapped id as a value-result
> and that's not easy to follow (also Sinan raised this point which I
> think it is fair).
>
> I think we'd better postpone this change to next cycle, so you can
> leave the pointer check:
>
> if (id_out)
>
> I will clean this up later, basically what we would end up doing to just
> retrieve the parent pointer would be the IORT equivalent of what we have
> in DT:
>
> of_parse_phandle()
> -> __of_parse_phandle_with_args() #we call it with cell_count == 0
>
>
> at the end of the day it is just to make code easier to follow, since it
> is functions internal to IORT compilation unit it is ok for now to leave
> it as-is.
>
OK, thank you very for the review.
Hanjun
next prev parent reply other threads:[~2017-01-16 13:24 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-11 15:06 [PATCH v7 00/15] ACPI platform MSI support and its example mbigen Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 01/15] ACPI: IORT: fix the indentation in iort_scan_node() Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 02/15] ACPI: IORT: add missing comment for iort_dev_find_its_id() Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 03/15] ACPI: IORT: minor cleanup for iort_match_node_callback() Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 04/15] irqchip: gic-v3-its: keep the head file include in alphabetic order Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 05/15] irqchip: gicv3-its: platform-msi: refactor its_pmsi_prepare() Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 06/15] irqchip: gicv3-its: platform-msi: refactor its_pmsi_init() to prepare for ACPI Hanjun Guo
2017-01-16 19:27 ` Matthias Brugger
2017-01-11 15:06 ` [PATCH v7 07/15] irqchip: gicv3-its: platform-msi: scan MADT to create platform msi domain Hanjun Guo
2017-01-17 9:25 ` Matthias Brugger
2017-01-11 15:06 ` [PATCH v7 08/15] ACPI: IORT: rename iort_node_map_rid() to make it generic Hanjun Guo
2017-01-13 11:47 ` Lorenzo Pieralisi
2017-01-14 3:25 ` Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 09/15] ACPI: platform-msi: retrieve dev id from IORT Hanjun Guo
2017-01-13 12:11 ` Lorenzo Pieralisi
2017-01-14 4:28 ` Hanjun Guo
2017-01-16 11:25 ` Lorenzo Pieralisi
2017-01-16 13:21 ` Hanjun Guo [this message]
2017-01-11 15:06 ` [PATCH v7 10/15] ACPI: IORT: move over to iort_node_map_platform_id() Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 11/15] ACPI: platform: setup MSI domain for ACPI based platform device Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 12/15] msi: platform: make platform_msi_create_device_domain() ACPI aware Hanjun Guo
2017-01-13 10:45 ` Lorenzo Pieralisi
2017-01-14 3:00 ` Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 13/15] irqchip: mbigen: drop module owner Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 14/15] irqchip: mbigen: introduce mbigen_of_create_domain() Hanjun Guo
2017-01-11 15:06 ` [PATCH v7 15/15] irqchip: mbigen: Add ACPI support Hanjun Guo
2017-01-13 10:21 ` Lorenzo Pieralisi
2017-01-14 2:56 ` Hanjun Guo
2017-01-16 11:38 ` Lorenzo Pieralisi
2017-01-16 14:23 ` Hanjun Guo
2017-01-16 15:24 ` Lorenzo Pieralisi
2017-01-17 11:59 ` Hanjun Guo
2017-01-13 10:23 ` [PATCH v7 00/15] ACPI platform MSI support and its example mbigen Ming Lei
2017-01-14 1:04 ` Hanjun Guo
2017-01-13 14:11 ` Wei Xu
2017-01-14 4:30 ` Hanjun Guo
2017-01-16 5:12 ` Sinan Kaya
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=587CC8C0.3040602@huawei.com \
--to=guohanjun@huawei.com \
--cc=agustinv@codeaurora.org \
--cc=gregkh@linuxfoundation.org \
--cc=hanjun.guo@linaro.org \
--cc=huxinwei@huawei.com \
--cc=jcm@redhat.com \
--cc=kong.kongxinwei@hisilicon.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=lorenzo.pieralisi@arm.com \
--cc=majun258@huawei.com \
--cc=marc.zyngier@arm.com \
--cc=mbrugger@suse.com \
--cc=okaya@codeaurora.org \
--cc=rjw@rjwysocki.net \
--cc=tglx@linutronix.de \
--cc=tn@semihalf.com \
--cc=wangkefeng.wang@huawei.com \
--cc=yimin@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).