[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by
From: |
Igor Mammedov |
Subject: |
Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI |
Date: |
Mon, 9 Nov 2015 12:13:31 +0100 |
On Fri, 6 Nov 2015 16:31:43 +0800
Xiao Guangrong <address@hidden> wrote:
>
>
> On 11/05/2015 10:49 PM, Igor Mammedov wrote:
> > On Thu, 5 Nov 2015 21:33:39 +0800
> > Xiao Guangrong <address@hidden> wrote:
> >
> >>
> >>
> >> On 11/05/2015 09:03 PM, Igor Mammedov wrote:
> >>> On Thu, 5 Nov 2015 18:15:31 +0800
> >>> Xiao Guangrong <address@hidden> wrote:
> >>>
> >>>>
> >>>>
> >>>> On 11/05/2015 05:58 PM, Igor Mammedov wrote:
> >>>>> On Mon, 2 Nov 2015 17:13:27 +0800
> >>>>> Xiao Guangrong <address@hidden> wrote:
> >>>>>
> >>>>>> A page staring from 0xFF00000 and IO port 0x0a18 - 0xa1b in guest are
> >>>>> ^^ missing one 0???
> >>>>>
> >>>>>> reserved for NVDIMM ACPI emulation, refer to docs/specs/acpi_nvdimm.txt
> >>>>>> for detailed design
> >>>>>>
> >>>>>> A parameter, 'nvdimm-support', is introduced for PIIX4_PM and ICH9-LPC
> >>>>>> that controls if nvdimm support is enabled, it is true on default and
> >>>>>> it is false on 2.4 and its earlier version to keep compatibility
> >>>>>>
> >>>>>> Signed-off-by: Xiao Guangrong <address@hidden>
> >>>>> [...]
> >>>>>
> >>>>>> @@ -33,6 +33,15 @@
> >>>>>> */
> >>>>>> #define MIN_NAMESPACE_LABEL_SIZE (128UL << 10)
> >>>>>>
> >>>>>> +/*
> >>>>>> + * A page staring from 0xFF00000 and IO port 0x0a18 - 0xa1b in guest
> >>>>>> are
> >>>>> ^^^ missing 0 or value in define
> >>>>> below has an extra 0
> >>>>>
> >>>>>> + * reserved for NVDIMM ACPI emulation, refer to
> >>>>>> docs/specs/acpi_nvdimm.txt
> >>>>>> + * for detailed design.
> >>>>>> + */
> >>>>>> +#define NVDIMM_ACPI_MEM_BASE 0xFF000000ULL
> >>>>> it still maps RAM at arbitrary place,
> >>>>> that's the reason why VMGenID patches hasn't been merged for
> >>>>> more than several months.
> >>>>> I'm not against of using (more exactly I'm for it) direct mapping
> >>>>> but we should reach consensus when and how to use it first.
> >>>>>
> >>>>> I'd wouldn't use addresses below 4G as it may be used firmware or
> >>>>> legacy hardware and I won't bet that 0xFF000000ULL won't conflict
> >>>>> with anything.
> >>>>> An alternative place to allocate reserve from could be high memory.
> >>>>> For pc we have "reserved-memory-end" which currently makes sure
> >>>>> that hotpluggable memory range isn't used by firmware.
> >>>>>
> >>>>> How about making API that allows to map additional memory
> >>>>> ranges before reserved-memory-end and pushes it up as mappings are
> >>>>> added.
[...]
>
> Really a good study case to me, i tried your patch and moved the 64 bit
> staffs to the private method, it worked. :)
>
> Igor, is this the API you want?
Lets get ack from Michael on the idea of RAM mapping before
"reserved-memory-end" first.
If he rejects it then there isn't any other way except of switching
to MMIO instead.
>
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index 6bf569a..aba29df 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1291,6 +1291,38 @@ FWCfgState *xen_load_linux(PCMachineState *pcms,
> return fw_cfg;
> }
>
> +static void pc_reserve_high_memory_init(PCMachineState *pcms,
> + uint64_t base, uint64_t align)
> +{
> + pcms->reserve_high_memory.current_addr = ROUND_UP(base, align);
> +}
> +
> +static uint64_t
> +pc_reserve_high_memory_end(PCMachineState *pcms, int64_t align)
> +{
> + return ROUND_UP(pcms->reserve_high_memory.current_addr, align);
> +}
> +
> +uint64_t pc_reserve_high_memory(PCMachineState *pcms, uint64_t size,
> + int64_t align, Error **errp)
> +{
> + uint64_t end_addr, current_addr = pcms->reserve_high_memory.current_addr;
> +
> + if (!current_addr) {
> + error_setg(errp, "reserved high memory is not initialized.");
> + return 0;
> + }
> +
> + end_addr = pc_reserve_high_memory_end(pcms, align) + size;
> + if (current_addr > end_addr) {
> + error_setg(errp, "reserved high memory is not enough.");
> + return 0;
> + }
> +
> + pcms->reserve_high_memory.current_addr = end_addr;
> + return end_addr;
> +}
> +
> FWCfgState *pc_memory_init(PCMachineState *pcms,
> MemoryRegion *system_memory,
> MemoryRegion *rom_memory,
> @@ -1379,6 +1411,8 @@ FWCfgState *pc_memory_init(PCMachineState *pcms,
> "hotplug-memory", hotplug_mem_size);
> memory_region_add_subregion(system_memory,
> pcms->hotplug_memory.base,
> &pcms->hotplug_memory.mr);
> + pc_reserve_high_memory_init(pcms, pcms->hotplug_memory.base +
> + hotplug_mem_size, 1ULL << 30);
> }
>
> /* Initialize PC system firmware */
> @@ -1403,7 +1437,7 @@ FWCfgState *pc_memory_init(PCMachineState *pcms,
> uint64_t res_mem_end = pcms->hotplug_memory.base;
>
> if (!pcmc->broken_reserved_end) {
> - res_mem_end += memory_region_size(&pcms->hotplug_memory.mr);
> + res_mem_end = pc_reserve_high_memory_end(pcms, 0x1ULL << 30);
> }
> *val = cpu_to_le64(ROUND_UP(res_mem_end, 0x1ULL << 30));
> fw_cfg_add_file(fw_cfg, "etc/reserved-memory-end", val,
> sizeof(*val));
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 47162cf..fae3fea 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -20,6 +20,11 @@
>
> #define HPET_INTCAP "hpet-intcap"
>
> +struct PCReserveHighMemory {
> + uint64_t current_addr;
> +};
> +typedef struct PCReserveHighMemory PCReserveHighMemory;
> +
> /**
> * PCMachineState:
> * @acpi_dev: link to ACPI PM device that performs ACPI hotplug handling
> @@ -41,6 +46,7 @@ struct PCMachineState {
> OnOffAuto smm;
> bool enforce_aligned_dimm;
> ram_addr_t below_4g_mem_size, above_4g_mem_size;
> + PCReserveHighMemory reserve_high_memory;
> };
>
> #define PC_MACHINE_ACPI_DEVICE_PROP "acpi-device"
> @@ -175,6 +181,9 @@ PcGuestInfo *pc_guest_info_init(PCMachineState *pcms);
>
> void pc_set_legacy_acpi_data_size(void);
>
> +uint64_t pc_reserve_high_memory(PCMachineState *pcms, uint64_t size,
> + int64_t align, Error **errp);
> +
> #define PCI_HOST_PROP_PCI_HOLE_START "pci-hole-start"
> #define PCI_HOST_PROP_PCI_HOLE_END "pci-hole-end"
> #define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
>
>
> >
> >>>>
> >>>> The luck thing is, the ACPI part is not ABI, we can move it to the high
> >>>> memory if QEMU supports XSDT is ready in future development.
> >>> But mapped control region is ABI and we can't change it if we find out
> >>> later
> >>> that it breaks something.
> >>
> >> But the ACPI code is completely built by QEMU, which is transparent to
> >> guest
> >> and guest should not depend on it, no?
> > unfortunately no, think about cross-version migration.
>
> It makes sense. Stupid me. :(
>
>
>
- [Qemu-devel] [PATCH v7 16/35] pc-dimm: drop the prefix of pc-dimm, (continued)
- [Qemu-devel] [PATCH v7 16/35] pc-dimm: drop the prefix of pc-dimm, Xiao Guangrong, 2015/11/02
- [Qemu-devel] [PATCH v7 29/35] nvdimm acpi: support function 0, Xiao Guangrong, 2015/11/02
- [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Xiao Guangrong, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Igor Mammedov, 2015/11/05
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Xiao Guangrong, 2015/11/05
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Igor Mammedov, 2015/11/05
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Xiao Guangrong, 2015/11/05
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Igor Mammedov, 2015/11/05
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Xiao Guangrong, 2015/11/06
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI, Xiao Guangrong, 2015/11/06
- Re: [Qemu-devel] [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI,
Igor Mammedov <=
- [Qemu-devel] Ask for ACK (was Re: [PATCH v7 25/35] nvdimm acpi: init the resource used by NVDIMM ACPI), Xiao Guangrong, 2015/11/10
[Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Xiao Guangrong, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Vladimir Sementsov-Ogievskiy, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Xiao Guangrong, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Vladimir Sementsov-Ogievskiy, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Xiao Guangrong, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Vladimir Sementsov-Ogievskiy, 2015/11/02
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Xiao Guangrong, 2015/11/03
- Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Vladimir Sementsov-Ogievskiy, 2015/11/05
Re: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region, Eduardo Habkost, 2015/11/05