|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] xen/hvmloader: define a TOM register
On 25/02/2013 06:50, "Xudong Hao" <xudong.hao@xxxxxxxxx> wrote:
> v2:
> * Define TOM register as one byte
>
> Define a TOM(top of memory) register to report the base of PCI memory, so that
> qemu should update MMIO by reading this register value. TOM register are
> defined
> to one byte in PCI configure space, because that only upper 4 bit of PCI
> memory
> takes effect.
>
> With the combination of qemu upstream, this should be a fix for PCI MMIO hole
> configuration. Upstream qemu set 0xe0000000 as TOM, but guest bios may set
> MMIO
> to 0x80000000~0xe0000000.
Why does qemu (when used as the Xen device model) care about the location of
the PCI hole start?
-- Keir
> Signed-off-by: Xudong Hao <xudong.hao@xxxxxxxxx>
> Signed-off-by: Xiantao Zhang <xiantao.zhang@xxxxxxxxx>
> ---
> tools/firmware/hvmloader/pci.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
> index c7c87a7..6d03a6f 100644
> --- a/tools/firmware/hvmloader/pci.c
> +++ b/tools/firmware/hvmloader/pci.c
> @@ -34,6 +34,29 @@ unsigned long pci_mem_end = PCI_MEM_END;
> enum virtual_vga virtual_vga = VGA_none;
> unsigned long igd_opregion_pgbase = 0;
>
> +#define PCI_CLASS_BRIDGE_HOST 0x0600
> +#define PCI_VENDOR_ID_INTEL 0x8086
> +#define PCI_DEVICE_ID_INTEL_82441 0x1237
> +#define I440FX_PCI_HOLE_BASE 0xb0
> +
> +static void pci_adjust_pci_hole(uint8_t pci_hole_start)
> +{
> + uint16_t class, vendor_id, device_id;
> + if (pci_hole_start == 0xf0)
> + return;
> +
> + /* Check whether it is I440FX */
> + class = pci_readw(0, PCI_CLASS_DEVICE);
> + vendor_id = pci_readw(0, PCI_VENDOR_ID);
> + device_id = pci_readw(0, PCI_DEVICE_ID);
> +
> + if (class != PCI_CLASS_BRIDGE_HOST ||
> + vendor_id != PCI_VENDOR_ID_INTEL ||
> + device_id != PCI_DEVICE_ID_INTEL_82441)
> + return;
> + pci_writeb(0, I440FX_PCI_HOLE_BASE, pci_hole_start);
> +
> +}
> void pci_setup(void)
> {
> uint8_t is_64bar, using_64bar, bar64_relocate = 0;
> @@ -236,6 +259,7 @@ void pci_setup(void)
> BUG();
> hvm_info->high_mem_pgend += nr_pages;
> }
> + pci_adjust_pci_hole((uint8_t)(pci_mem_start >> 24));
>
> high_mem_resource.base = ((uint64_t)hvm_info->high_mem_pgend) <<
> PAGE_SHIFT;
> high_mem_resource.max = 1ull << cpu_phys_addr();
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |