|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 12/13] xen/iommu: smmu: Add Xen specific code to be able to use the driver
Hi Ian,
On 20/02/15 13:23, Ian Campbell wrote:
> On Fri, 2015-02-06 at 13:20 +0000, Stefano Stabellini wrote:
>>> +#define iommu_group_get_iommudata(group) (group)->cfg
>>
>> I would move all the Xen stuff at the beginning of the file or maybe to
>> a separate file. You could #include the linux smmu driver into it.
>> Maybe we cannot have runtime patching of this file, but at least we can
>> keep Xen and Linux stuff clearly separate.
>
> I was going to suggest something similar e.g. #include <ssmu-xen-shim.h>
> or something.
See my comment on Stefano's mail for this.
>>
>>
>>> static DEFINE_SPINLOCK(arm_smmu_devices_lock);
>>> static LIST_HEAD(arm_smmu_devices);
>>>
>>> @@ -455,6 +690,8 @@ static void parse_driver_options(struct arm_smmu_device
>>> *smmu)
>>>
>>> static struct device_node *dev_get_dev_node(struct device *dev)
>>> {
>>> + /* Xen: TODO: Add support for PCI */
>>> +#if 0
>>> if (dev_is_pci(dev)) {
>>> struct pci_bus *bus = to_pci_dev(dev)->bus;
>>>
>>> @@ -462,7 +699,7 @@ static struct device_node *dev_get_dev_node(struct
>>> device *dev)
>>> bus = bus->parent;
>>> return bus->bridge->parent->of_node;
>>> }
>>> -
>>> +#endif
>>
>> Would it be possible instead to add:
>>
>> #define dev_is_pci (0)
>>
>> above among the Xen definitions?
>
> Would be preferable if possible.
It's already done but ... if (0) doesn't mean the code inside the if
could be invalid.
In this specific case, we don't have a field struct pci_bus *bus in our
pci_dev. So it won't compile.
>>
>>> @@ -700,11 +938,10 @@ static irqreturn_t arm_smmu_context_fault(int irq,
>>> void *dev)
>>> /* Retry or terminate any stalled transactions */
>>> if (fsr & FSR_SS)
>>> writel_relaxed(resume, cb_base + ARM_SMMU_CB_RESUME);
>>> -
>>> - return ret;
>>> }
>>
>> For the sake of minimizing the changes to Linux functions, could you
>> write a wrapper around this function instead? That might allow you to
>> remove the changes related to the return value.
>
> typedef void irqreturn_t; and "#define IRQ_NONE /**/" etc perhaps?
>
> Or even just cast the function in the call to request_irq, the differing
> return type shouldn't cause a problem in this context I think.
I can give a look.
>>
>>
>>> +/* Xen: Page tables are shared with the processor */
>>> +#if 0
>>> static void arm_smmu_flush_pgtable(struct arm_smmu_device *smmu, void
>>> *addr,
>>> size_t size)
>>> {
>>> @@ -749,6 +987,7 @@ static void arm_smmu_flush_pgtable(struct
>>> arm_smmu_device *smmu, void *addr,
>>> DMA_TO_DEVICE);
>>> }
>>> }
>>> +#endif
>>
>> But then you need to fix all the call sites. I think it is best to add a
>> return at the beginning of the function.
>
> Or add a nop stub... (return sounds better though)
I don't succeed to make my point on this kind of things...
While I agree that we have to minimize the changes in the code. We
shouldn't do it at the cost of an incomprehensible cost.
The function arm_smmu_flush_pgtable doesn't make any sense at all on Xen
(the parameter are even invalid).
Furthermore there is only one call site.
>>> +#if CONFIG_ARM_32
>>> + /* Xen: Midway is using 40-bit address space.
>
> I'm a bit surprised that the upstream driver isn't prepared to cope with
> this sort of thing, there are a few LPAE arm32 systems around these
> days. I had the same thought around the " /* Xen: The fault address
> maybe higher than 32 bits on arm32 */" comment too.
At the time I resynced the SMMU drivers, they were using short page
tables. And therefore the number of address bits was limited for the guest.
I don't plan to lose again minimum 2 weeks for re-syncing the driver soon.
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |