On Fri, May 13, 2016 at 2:11 PM, Bharata B Rao <bharata....@gmail.com> wrote: > On Wed, May 4, 2016 at 12:22 PM, Alexey Kardashevskiy <a...@ozlabs.ru> wrote: >> +static void rtas_ibm_create_pe_dma_window(PowerPCCPU *cpu, >> + sPAPRMachineState *spapr, >> + uint32_t token, uint32_t nargs, >> + target_ulong args, >> + uint32_t nret, target_ulong rets) >> +{ >> + sPAPRPHBState *sphb; >> + sPAPRTCETable *tcet = NULL; >> + uint32_t addr, page_shift, window_shift, liobn; >> + uint64_t buid; >> + >> + if ((nargs != 5) || (nret != 4)) { >> + goto param_error_exit; >> + } >> + >> + buid = ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 2); >> + addr = rtas_ld(args, 0); >> + sphb = spapr_pci_find_phb(spapr, buid); >> + if (!sphb || !sphb->ddw_enabled) { >> + goto param_error_exit; >> + } >> + >> + page_shift = rtas_ld(args, 3); >> + window_shift = rtas_ld(args, 4); > > Kernel has a bug due to which wrong window_shift gets returned here. I > have posted possible fix here: > https://patchwork.ozlabs.org/patch/621497/ > > I have tried to work around this issue in QEMU too > https://lists.nongnu.org/archive/html/qemu-ppc/2016-04/msg00226.html > > But the above work around involves changing the memory representation > in DT. Hence I feel until the guest kernel changes are available, a > simpler work around would be to discard the window_shift value above > and recalculate the right value as below: > > if (machine->ram_size == machine->maxram_size) { > max_window_size = machine->ram_size; > } else { > MemoryHotplugState *hpms = &spapr->hotplug_memory; > max_window_size = hpms->base + memory_region_size(&hpms->mr); > } > window_shift = max_window_size >> SPAPR_TCE_PAGE_SHIFT; > > and create DDW based on this calculated window_shift value. Does that > sound reasonable ?
Sorry, missed mentioning earlier that incorrect DDW value here causes memory hotplug to fail. > > Regards, > Bharata. -- http://raobharata.wordpress.com/