Hi, > On 8 Mar 2025, at 13:37, Julien Grall <jul...@xen.org> wrote: > > Hi Jason, > > On 08/03/2025 00:02, Jason Andryuk wrote: >> On 2025-03-07 16:21, Julien Grall wrote: >>> Hi Jason, >>> >>> On 07/03/2025 17:58, Jason Andryuk wrote: >>>> On 2025-03-07 04:01, Julien Grall wrote: >>>>> Hi, >>>>> >>>>> On 06/03/2025 22:03, Jason Andryuk wrote: >>>>>> Add capabilities property to dom0less to allow building a >>>>>> disaggregated system. >>>>>> >>>>>> Introduce bootfdt.h to contain these constants. >>>>>> >>>>>> When using the hardware or xenstore capabilities, adjust the grant and >>>>>> event channel limits similar to dom0. >>>>> > > Also for the hardware domain, set directmap and iommu. This brings >>>>> its >>>>>> configuration in line with a dom0. >>>>> >>>>> Looking the device tree bindings, a user would be allowed to disable >>>>> "passthrough" or even "directmap". This means, we would never be able to >>>>> disable "directmap" for the hardware domain in the future with the >>>>> existing property (this is to avoid break backwards compatibility). >>>>> >>>>> Instead, I think we should check what the user provided and confirm this >>>>> is matching our expectation for an hardware domain. >>>> > >>>>> That said, I am not entirely sure why we should force directmap for the >>>>> HW domain. We are starting from a clean slate, so I think it would be >>>>> better to have by default no directmap and imposing the presence of an >>>>> IOMMU in the system. >>>> >>>> Ok, it seems like directmap is not necessary. It was helpful early on to >>>> get things booting, but I think it's no longer necessary after factoring >>>> out construct_hwdom(). >>>> >>>> What exactly do you mean by imposing with respect to the iommu? Require >>>> one, or mirror the dom0 code and set it for the hwdom? >>>> >>>> if ( iommu_enabled ) >>>> dom0_cfg.flags |= XEN_DOMCTL_CDF_iommu; >>> >>> I mean requires one. Without it, you would need to set directmap and I >>> don't think this should be allowed (at least for now) for the HW domain. >>> >>>> >>>>> Lastly, can you provide an example of what the hardware domain DT node >>>>> would looke like? >>>> >>>> I've attached a dump of /sys/firmware/fdt from hwdom. (This is direct >>>> mapped). >>> >>> Sorry if this was not clear, I am asking for the configuration you wrote in >>> the host DT for create the hardware domain. I am interested to know which >>> properties you set... >> I've attached the u-boot fdt commands which generate the DT. Hopefully that >> works for you. >>>> >>>>>> --- a/xen/arch/arm/dom0less-build.c >>>>>> +++ b/xen/arch/arm/dom0less-build.c >>>>>> @@ -12,6 +12,7 @@ >>>>>> #include <xen/sizes.h> >>>>>> #include <xen/vmap.h> >>>>>> +#include <public/bootfdt.h> >>>>>> #include <public/io/xs_wire.h> >>>>>> #include <asm/arm64/sve.h> >>>>>> @@ -994,6 +995,34 @@ void __init create_domUs(void) >>>>>> if ( (max_init_domid + 1) >= DOMID_FIRST_RESERVED ) >>>>>> panic("No more domain IDs available\n"); >>>>>> + if ( dt_property_read_u32(node, "capabilities", &val) ) >>>>>> + { >>>>>> + if ( val & ~DOMAIN_CAPS_MASK ) >>>>>> + panic("Invalid capabilities (%"PRIx32")\n", val); >>>>>> + >>>>>> + if ( val & DOMAIN_CAPS_CONTROL ) >>>>>> + flags |= CDF_privileged; >>>>>> + >>>>>> + if ( val & DOMAIN_CAPS_HARDWARE ) >>>>>> + { >>>>>> + if ( hardware_domain ) >>>>>> + panic("Only 1 hardware domain can be specified! >>>>>> (%pd)\n", >>>>>> + hardware_domain); >>>>>> + >>>>>> + d_cfg.max_grant_frames = gnttab_dom0_frames(); >>>>>> + d_cfg.max_evtchn_port = -1; >>>>> >>>>> What about d_cfg.arch.nr_spis? Are we expecting the user to pass >>>>> "nr_spis"? >>>> >>>> Further down, when nr_spis isn't specified in the DT, it defaults to: >>>> d_cfg.arch.nr_spis = gic_number_lines() - 32; >>> >>> Thanks. One further question, what if the user pass "nr_spis" for the HW >>> domain. Wouldn't this result to more issue further down the line? >> I'm not familiar with ARM, so I'll to whatever is best. I did put the >> capabilities first, thinking it would set defaults, and then later options >> could override them. > > I am not sure it is related to Arm. It is more that the HW domain is going to > re-use the memory layout of the host (this is including the mapping for the > GIC) and also have all the irqs with pirq == virq. > > I am a bit concerned that letting the users mistakenly tweaking the defaults > could prevent attaching devices (for instance if the IRQ ID is above > > nr_spis). > >>>> >>>> Dom0 does: >>>> /* >>>> * Xen vGIC supports a maximum of 992 interrupt lines. >>>> * 32 are substracted to cover local IRQs. >>>> */ >>>> dom0_cfg.arch.nr_spis = min(gic_number_lines(), (unsigned int) 992) - >>>> 32; >>>> if ( gic_number_lines() > 992 ) >>>> printk(XENLOG_WARNING "Maximum number of vGIC IRQs exceeded. \n"); >>>> >>>> So I think it's fine as-is? I could add the min() and warning if you >>>> think it's necessary. >>> >>> Regardless this discussion, I wonder why we didn't add the min(...) here >>> like for dom0 because we are using the same vGIC emulation. So the max SPIs >>> supported is the same... >>> >>> What I am trying to understand is whether it is ok to allow the user to >>> select "nr_spis", "vpl011" & co if they are either not honored (like for >>> vpl011) or could introduce further issue (like for nr_spis as the HW domain >>> is supposed to have the same configuration as dom0). >>> >>> I also don't think it is a good idea to silently ignore what the user >>> requested. So far, on Arm, we mainly decided to reject/panic early if the >>> setup is not correct. >> Again, I'll do whatever is best. > > Bertrand, Michal, Stefano, any opinions?
I definitely think that any user configuration mistake should end up in a panic, a warning message is definitely not enough. Here the user might discover or not at runtime that what he thought was configured is not. So a panic here would be better from my point of view. Cheers Bertrand > > Cheers, > > -- > Julien Grall