[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Design doc of adding ACPI support for arm64 on Xen - version 3
This document is going to explain the design details of Xen booting with ACPI on ARM. Maybe parts of it may not be appropriate. Any comments are welcome. Changes v2->v3:* remove the two HVM_PARAMs for grant table and let linux kernel use xlated_setup_gnttab_pages() to setup grant table. * don't modify GTDT table * add definition of event-channel interrupt flag * state that route all Xen unused interrupt to Dom0 * state that reusing existing PCI bus_notifier for PCI devices MMIO mapping To Xen itself booting with ACPI, this is similar to Linux kernel except that Xen doesn't parse DSDT table. So I'll skip this part and focus on how Xen prepares ACPI tables for Dom0 and how Xen passes them to Dom0. 1. Copy and change some EFI and ACPI tables ------------------------------------------- a) Copy EFI_SYSTEM_TABLE and change the value of FirmwareVendor, VendorGuid, VendorTable, ConfigurationTable. These changes are not very special and it just assign values to these members. b) Create EFI_MEMORY_DESCRIPTOR table. This will add memory start and size information of Dom0. And Dom0 will get the memory information through this EFI table. c) Copy FADT table. Change the value of arm_boot_flags to enable PSCI and HVC. Let the hypervisor_id be "XenVMM" in order to tell Dom0 that it runs on Xen hypervisor, then Dom0 could through HVM_PARAM to get some informations for booting necessity, such as event-channel interrupt. Change header revison, length and checksum as well. d) Copy MADT table. According to the value of dom0_max_vcpus to change the number GICC entries. e) Create STAO table. This table is a new added one that's used to define a list of ACPI namespace names that are to be ignored by the OSPM in Dom0. Currently we use it to tell OSPM should ignore UART defined in SPCR table. f) Copy XSDT table. Add a new table entry for STAO and change other table's entries. g) Change the value of xsdt_physical_address in RSDP table. h) The rest of tables are not copied or changed. They are reused including DSDT, SPCR, GTDT, etc. All these tables will be copied to Dom0 memory except that the reused tables(DSDT, SPCR, GTDT, etc) will be mapped to Dom0. 2. Create minimal DT to pass required information to Dom0 ---------------------------------------------------------- The minimal DT mainly passes Dom0 bootargs, address and size of initrd (if available), address and size of uefi system table, address and size of uefi memory table, uefi-mmap-desc-size and uefi-mmap-desc-ver. An example of the minimal DT: / { #address-cells = <2>; #size-cells = <1>; chosen { bootargs = "kernel=Image console=hvc0 earlycon=pl011,0x1c090000 root=/dev/vda2 rw rootfstype=ext4 init=/bin/sh acpi=force"; linux,initrd-start = <0xXXXXXXXX>; linux,initrd-end = <0xXXXXXXXX>; linux,uefi-system-table = <0xXXXXXXXX>; linux,uefi-mmap-start = <0xXXXXXXXX>; linux,uefi-mmap-size = <0xXXXXXXXX>; linux,uefi-mmap-desc-size = <0xXXXXXXXX>; linux,uefi-mmap-desc-ver = <0xXXXXXXXX>; }; }; For details loook at https://github.com/torvalds/linux/blob/master/Documentation/arm/uefi.txt 3. Dom0 gets grant table and event channel irq information ----------------------------------------------------------- Make Linux call xlated_setup_gnttab_pages() to setup grant table. So it doesn't need Xen pass grant table start and size information to Dom0. To event channel interrupt, reuse HVM_PARAM_CALLBACK_IRQ and add a new delivery type to get it. val[63:56] == 3: val[15:8] is flag: val[7:0] is a PPI (ARM and ARM64 only) The definition of flag reusing the definition of xenv table. Bit 0 stands interrupt mode and bit 1 stands interrupt polarity. As said above, we assign the hypervisor_id be "XenVMM" to tell Dom0 that it runs on Xen hypervisor. Then Dom0 could get it through hypercall HVMOP_get_param. 4. Map MMIO regions ------------------- Register a bus_notifier for platform and amba bus in Linux. Add a new XENMAPSPACE "XENMAPSPACE_dev_mmio". Within the register, check if the device is newly added, then call hypercall XENMEM_add_to_physmap to map the mmio regions. For PCI bus device, it could reuse the existing PCI bus_notifier like X86. 5. Route device interrupts to Dom0 ---------------------------------- Route all the SPI interrupts to Dom0 before Dom0 booting, except the interrupts used by Xen. For uart, it could get the interrupt from SPCR table and exclude it. For SMMU, it could get the interrupts from IORT table and exclude them as well. Thanks, -- Shannon _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |