> -----Original Message----- > From: Qemu-devel > [mailto:qemu-devel-bounces+shameerali.kolothum.thodi=huawei.com@nongn > u.org] On Behalf Of Igor Mammedov > Sent: 26 November 2019 08:57 > To: Shameerali Kolothum Thodi > Cc: peter.maydell@linaro.org; drjones@redhat.com; > xiaoguangrong.eric@gmail.com; shannon.zhaosl@gmail.com; > qemu-devel@nongnu.org; Linuxarm ; Auger Eric > ; qemu-arm@nongnu.org; xuwei (O) > ; lersek@redhat.com > Subject: Re: [PATCH 0/5] ARM virt: Add NVDIMM support [..] > > > 0xb8 Dirty No. -->Another read is attempted > > > > [Qemu]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buf size 0x8 > > > func_ret_status 3 --> Error status returned > > > > > > status 3 means that QEMU didn't like content of NRAM, and there is only > > > 1 place like this in nvdimm_dsm_func_read_fit() > > > if (read_fit->offset > fit->len) { > > > func_ret_status = NVDIMM_DSM_RET_STATUS_INVALID; > > > goto exit; > > > } > > > > > > so I'd start looking from here and check that QEMU gets expected data > > > in nvdimm_dsm_write(). In other words I'd try to trace/compare > > > content of DSM buffer (from qemu side). > > > > I had printed the DSM buffer previously and it looked same, I will double check > > that. Tried printing the buffer in both Qemu/AML code. On Amr64, ------------- (1st iteration with offset 0) [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: Read FIT: offset 0 FIT size 0xb8 Dirty Yes. [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buff: [QEMU]NVDIMM BUF[0x0] = 0xC0 [QEMU]NVDIMM BUF[0x1] = 0x0 [QEMU]NVDIMM BUF[0x2] = 0x0 [QEMU]NVDIMM BUF[0x3] = 0x0 [QEMU]NVDIMM BUF[0x4] = 0x0 [QEMU]NVDIMM BUF[0x5] = 0x0 [QEMU]NVDIMM BUF[0x6] = 0x0 [QEMU]NVDIMM BUF[0x7] = 0x0 [QEMU]NVDIMM BUF[0x8] = 0x0 [QEMU]NVDIMM BUF[0x9] = 0x0 [QEMU]NVDIMM BUF[0xA] = 0x38 [QEMU]NVDIMM BUF[0xB] = 0x0 [QEMU]NVDIMM BUF[0xC] = 0x2 [QEMU]NVDIMM BUF[0xD] = 0x0 [QEMU]NVDIMM BUF[0xE] = 0x3 [QEMU]NVDIMM BUF[0xF] = 0x0 ......... [QEMU]NVDIMM BUF[0xBC] = 0x0 [QEMU]NVDIMM BUF[0xBD] = 0x0 [QEMU]NVDIMM BUF[0xBE] = 0x0 [QEMU]NVDIMM BUF[0xBF] = 0x0 [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buf size 0xc0 func_ret_status 0 "AML:NVDIMM-NCAL: Rcvd RLEN 00000000000000C0" "AML:NVDIMM-NCAL TBUF[0000000000000000] = 0x00000000000000C0" "AML:NVDIMM-NCAL TBUF[0000000000000001] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000002] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000003] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000004] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000005] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000006] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000007] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000008] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000009] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[000000000000000A] = 0x0000000000000038" "AML:NVDIMM-NCAL TBUF[000000000000000B] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[000000000000000C] = 0x0000000000000002" "AML:NVDIMM-NCAL TBUF[000000000000000D] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[000000000000000E] = 0x0000000000000003" "AML:NVDIMM-NCAL TBUF[000000000000000F] = 0x0000000000000000" ........... "AML:NVDIMM-NCAL TBUF[00000000000000BC] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[00000000000000BD] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[00000000000000BE] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[00000000000000BF] = 0x0000000000000000" "AML:NVDIMM-NCAL: Creating OBUF with bytes 00000000000000BC" "AML:NVDIMM-NCAL: Created BUF(Local7) size 00000000000000BC" "AML:NVDIMM-RFIT Rcvd buf size 00000000000000BC" "AML:NVDIMM-RFIT Created NVDR.RFIT.BUFF size 00000000000000B8" "AML:NVDIMM-FIT: Rcvd buf size 00000000000000B8" -->All looks fine in first iteration. (2nd iteration with offset 0xb8) [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: Read FIT: offset 0xb8 FIT size 0xb8 Dirty No. [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buff: [QEMU]NVDIMM BUF[0x0] = 0x8 [QEMU]NVDIMM BUF[0x1] = 0x0 [QEMU]NVDIMM BUF[0x2] = 0x0 [QEMU]NVDIMM BUF[0x3] = 0x0 [QEMU]NVDIMM BUF[0x4] = 0x0 [QEMU]NVDIMM BUF[0x5] = 0x0 [QEMU]NVDIMM BUF[0x6] = 0x0 [QEMU]NVDIMM BUF[0x7] = 0x0 [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buf size 0x8 func_ret_status 0 "AML:NVDIMM-NCAL: Rcvd RLEN 0000000000000008" "AML:NVDIMM-NCAL TBUF[0000000000000000] = 0x0000000000000008" "AML:NVDIMM-NCAL TBUF[0000000000000001] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000002] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000003] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000004] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000005] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000006] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000007] = 0x0000000000000000" "AML:NVDIMM-NCAL: Creating OBUF with bytes 0000000000000004" -->Requested size is 4 "AML:NVDIMM-NCAL: Created BUF(Local7) size 0000000000000008" --> Created size is 8 !. "AML:NVDIMM-RFIT Rcvd buf size 0000000000000008" "AML:NVDIMM-RFIT Created NVDR.RFIT.BUFF size 0000000000000004" "AML:NVDIMM-FIT: Rcvd buf size 0000000000000008" -->Again wrong here. (3rd iteration with offset 0xc0 -->0xb8 + 0x8) [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: Read FIT: offset 0xc0 FIT size 0xb8 Dirty No. [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buff: [QEMU]NVDIMM BUF[0x0] = 0x8 [QEMU]NVDIMM BUF[0x1] = 0x0 [QEMU]NVDIMM BUF[0x2] = 0x0 [QEMU]NVDIMM BUF[0x3] = 0x0 [QEMU]NVDIMM BUF[0x4] = 0x3 [QEMU]NVDIMM BUF[0x5] = 0x0 [QEMU]NVDIMM BUF[0x6] = 0x0 [QEMU]NVDIMM BUF[0x7] = 0x0 [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buf size 0x8 func_ret_status 3 "AML:NVDIMM-NCAL: Rcvd RLEN 0000000000000008" "AML:NVDIMM-NCAL TBUF[0000000000000000] = 0x0000000000000008" "AML:NVDIMM-NCAL TBUF[0000000000000001] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000002] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000003] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000004] = 0x0000000000000003" "AML:NVDIMM-NCAL TBUF[0000000000000005] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000006] = 0x0000000000000000" "AML:NVDIMM-NCAL TBUF[0000000000000007] = 0x0000000000000000" "AML:NVDIMM-NCAL: Created BUF(Local7) size 0000000000000008" "AML:NVDIMM-RFIT: Zero Buff return, status 0000000000000003" -->Error status, return "AML:NVDIMM-FIT: Rcvd buf size 0000000000000000" "AML:NVDIMM-FIT: _FIT returned size 00000000000000C0" [KERNEL] acpi_nfit_init: NVDIMM: data 0xffff0000fc57de18 sz 0xc0 On x86 (1st iteration with offset 0) -Same as ARM64 (2nd iteration with offset 0xb8) [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: Read FIT: offset 0xb8 FIT size 0xb8 Dirty No. [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buff: [QEMU]NVDIMM BUF[0x0] = 0x8 [QEMU]NVDIMM BUF[0x1] = 0x0 [QEMU]NVDIMM BUF[0x2] = 0x0 [QEMU]NVDIMM BUF[0x3] = 0x0 [QEMU]NVDIMM BUF[0x4] = 0x0 [QEMU]NVDIMM BUF[0x5] = 0x0 [QEMU]NVDIMM BUF[0x6] = 0x0 [QEMU]NVDIMM BUF[0x7] = 0x0 [QEMU]NVDIMM:nvdimm_dsm_func_read_fit: read_fit_out buf size 0x8 func_ret_status 0 "AML:NVDIMM-NCAL: Rcvd RLEN 00000008" "AML:NVDIMM-NCAL TBUF[00000000] = 0x00000008" "AML:NVDIMM-NCAL TBUF[00000001] = 0x00000000" "AML:NVDIMM-NCAL TBUF[00000002] = 0x00000000" "AML:NVDIMM-NCAL TBUF[00000003] = 0x00000000" "AML:NVDIMM-NCAL TBUF[00000004] = 0x00000000" "AML:NVDIMM-NCAL TBUF[00000005] = 0x00000000" "AML:NVDIMM-NCAL TBUF[00000006] = 0x00000000" "AML:NVDIMM-NCAL TBUF[00000007] = 0x00000000" "AML:NVDIMM-NCAL: Creating OBUF with bytes 00000004" "AML:NVDIMM-NCAL: Created BUF(Local7) size 00000004" -->Correct size "AML:NVDIMM-RFIT Rcvd buf size 00000004" "AML:NVDIMM-FIT: Rcvd buf size 00000000" --> Hence there is no data payload. "AML:NVDIMM-FIT: _FIT returned size 000000B8" --> No 3rd iteration. Return correct size. [KERNEL] acpi_nfit_init: NVDIMM: data 0xffff8c6abd5b5518 sz 0xb8 Attached the SSDT.dsl used for debugging. I am still not clear why on ARM64, 2nd iteration case, the created buffer size in NCAL and RFIT methods have additional 4 bytes!. CreateField (ODAT, Zero, Local1, OBUF) Concatenate (Buffer (Zero){}, OBUF, Local7) Please let me know if you have any clue. Thanks, Shameer .