|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 11/11] xen/arm: smmuv3: Add support for SMMUv3 driver
Hello Oleksandr,
> On 19 Jan 2021, at 2:43 pm, Oleksandr <olekstysh@xxxxxxxxx> wrote:
>
>
> On 18.01.21 18:57, Rahul Singh wrote:
>> Hello Oleksandr,
>
> Hi Rahul
>
>
>>
>>> On 18 Jan 2021, at 4:20 pm, Oleksandr <olekstysh@xxxxxxxxx> wrote:
>>>
>>>
>>> On 18.01.21 17:33, Rahul Singh wrote:
>>>> Hello Oleksandr,
>>>>
>>>>> On 11 Jan 2021, at 4:39 pm, Oleksandr <olekstysh@xxxxxxxxx> wrote:
>>>>>
>>>>>
>>>>> Hi Rahul
>>> Hi Rahul
>>>
>>>
>>>>>
>>>>>>> -
>>>>>>> static int arm_smmu_device_probe(struct platform_device *pdev)
>>>>>>> {
>>>>>>> int irq, ret;
>>>>>>> - struct resource *res;
>>>>>>> - resource_size_t ioaddr;
>>>>>>> + paddr_t ioaddr, iosize;
>>>>>>> struct arm_smmu_device *smmu;
>>>>>>> - struct device *dev = &pdev->dev;
>>>>>>> - bool bypass;
>>>>>>> - smmu = devm_kzalloc(dev, sizeof(*smmu), GFP_KERNEL);
>>>>>>> + smmu = xzalloc(struct arm_smmu_device);
>>>>>>> if (!smmu) {
>>>>>>> - dev_err(dev, "failed to allocate arm_smmu_device\n");
>>>>>>> + dev_err(pdev, "failed to allocate arm_smmu_device\n");
>>>>>>> return -ENOMEM;
>>>>>>> }
>>>>>>> - smmu->dev = dev;
>>>>>>> + smmu->dev = pdev;
>>>>>>> - if (dev->of_node) {
>>>>>>> + if (pdev->of_node) {
>>>>>>> ret = arm_smmu_device_dt_probe(pdev, smmu);
>>>>>>> + if (ret)
>>>>>>> + return -EINVAL;
>>>>>>> } else {
>>>>>>> ret = arm_smmu_device_acpi_probe(pdev, smmu);
>>>>>>> if (ret == -ENODEV)
>>>>>>> return ret;
>>>>>>> }
>>>>>>> - /* Set bypass mode according to firmware probing result */
>>>>>>> - bypass = !!ret;
>>>>>>> -
>>>>>>> /* Base address */
>>>>>>> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>>>>>> - if (resource_size(res) < arm_smmu_resource_size(smmu)) {
>>>>>>> - dev_err(dev, "MMIO region too small (%pr)\n", res);
>>>>>>> + ret = dt_device_get_address(dev_to_dt(pdev), 0, &ioaddr, &iosize);
>>>>>>> + if (ret)
>>>>>>> + return -ENODEV;
>>>>>>> +
>>>>>>> + if (iosize < arm_smmu_resource_size(smmu)) {
>>>>>>> + dev_err(pdev, "MMIO region too small (%lx)\n", iosize);
>>>>>>> return -EINVAL;
>>>>>>> }
>>>>>>> - ioaddr = res->start;
>>>>>>> /*
>>>>>>> * Don't map the IMPLEMENTATION DEFINED regions, since they may
>>>>>>> contain
>>>>>>> - * the PMCG registers which are reserved by the PMU driver.
>>>>>>> + * the PMCG registers which are optional and currently not
>>>>>>> supported.
>>>>>>> */
>>>>>>> - smmu->base = arm_smmu_ioremap(dev, ioaddr, ARM_SMMU_REG_SZ);
>>>>>>> + smmu->base = ioremap_nocache(ioaddr, ARM_SMMU_REG_SZ);
>>>>>>> if (IS_ERR(smmu->base))
>>>>>>> return PTR_ERR(smmu->base);
>>>>>>> - if (arm_smmu_resource_size(smmu) > SZ_64K) {
>>>>>>> - smmu->page1 = arm_smmu_ioremap(dev, ioaddr + SZ_64K,
>>>>>>> + if (iosize > SZ_64K) {
>>>>>>> + smmu->page1 = ioremap_nocache(ioaddr + SZ_64K,
>>>>>>> ARM_SMMU_REG_SZ);
>>>>>>> if (IS_ERR(smmu->page1))
>>>>>>> return PTR_ERR(smmu->page1);
>>>>>>> @@ -2765,14 +3101,262 @@ static int arm_smmu_device_probe(struct
>>>>>>> platform_device *pdev)
>>>>>>> return ret;
>>>>>>> /* Reset the device */
>>>>>>> - ret = arm_smmu_device_reset(smmu, bypass);
>>>>>>> + ret = arm_smmu_device_reset(smmu);
>>>>>>> if (ret)
>>>>>>> return ret;
>>>>>>> + /*
>>>>>>> + * Keep a list of all probed devices. This will be used to query
>>>>>>> + * the smmu devices based on the fwnode.
>>>>>>> + */
>>>>>>> + INIT_LIST_HEAD(&smmu->devices);
>>>>>>> +
>>>>>>> + spin_lock(&arm_smmu_devices_lock);
>>>>>>> + list_add(&smmu->devices, &arm_smmu_devices);
>>>>>>> + spin_unlock(&arm_smmu_devices_lock);
>>>>> Looks like that we need some kind of manual roll-back logic here in case
>>>>> of error during probe (there is no real devm_*):
>>>>>
>>>>> iounmap, xfree, etc.
>>>> I agree with you that manual roll-back logic is good to have clean code
>>>> but in this scenario what I have found out that if there is an error
>>>> during probe arm_smmu_device_probe() will return and XEN will not continue
>>>> to boot (call panic function) , in that case if we free the memory also
>>>> there is no much difference. That why I decided not to modify the code
>>>> that we ported from Linux.
>>>>
>>>> XEN) I/O virtualisation disabled
>>>> (XEN)
>>>> (XEN) ****************************************
>>>> (XEN) Panic on CPU 0:
>>>> (XEN) Couldn't configure correctly all the IOMMUs.
>>>> (XEN) ****************************************
>>>> (XEN)
>>>> (XEN) Manual reset required ('noreboot' specified)
>>>>
>>>> Do we have a requirement to continue to boot the XEN if there is an IOMMU
>>>> available in the system and IOMMU probe is failed? If yes then I will
>>>> modify the code to free all the resources if there is error during probe.
>>> Xen won't call panic if IOMMU driver returns -ENODEV and will continue to
>>> boot. For example, if the IOMMU is present but cannot be used in Xen for
>>> some reason (doesn't support page table sharing, etc)
>> Yes you are right in case of IOMMU driver probe failed and return -ENODEV
>> XEN will continue to boot.
>>
>> I am thinking of if there is a problem with configuring the IOMMU HW and
>> return -ENODEV or for some reason if IOMMU is present cannot not be used in
>> XEN why we are silently allows XEN to boot and make the system insecure.
>> As end user might miss the error logs during boot and will think IOMMU is
>> enabled and system is secure but IOMMU is either disable or is working in
>> bypass mode.
>
> But, wouldn't end user notice that device passthrough is not functional then?
I am no sure but might be yes as I think if iommu is disabled we cannot
passthrough the device.
>
>
>>
>> I might be wrong, in that case as per my understanding we should return
>> error and call panic and let user decide either to fix the issue on next
>> boot or boot XEN with cmdline option "iommu=no”
> I got your point, but I am not sure I can answer precisely how Xen should
> behave in the situation above, I will let the maintainers comment on that.
> Just a note, the -ENODEV is also returned by the framework if the IOMMU is
> not present (please see iommu_hardware_setup() in
> drivers/passthrough/arm/iommu.c for the details), either Xen doesn't have a
> suitable driver for it or the IOMMU H/W is not available in the target SoC,
> etc. I am not quite sure we should call panic in such cases.
>
>
> Regarding the cleanup my point is that driver should be responsible of doing
> it if there is an error during initialization (and it cannot continue)
> regardless on how the common code would handle that (returned by driver)
> error. Now it panics on some conditions, tomorrow it will act differently,
> etc. If driver called panic by itself, it could _probably_ be in a position
> to leave resources unreleased then... This is my viewpoint which might be
> wrong.
Yes I agree with you and I will add the code to free resources if probe failed
and will send next version of the patch for review.
Regards,
Rahul
>
>
>>
>> Regards,
>> Rahul
>>
>>>
>>> --
>>> Regards,
>>>
>>> Oleksandr Tyshchenko
>
> --
> Regards,
>
> Oleksandr Tyshchenko
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |