public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ni, Ruiyu" <ruiyu.ni@intel.com>
To: "Kirkendall, Garrett" <Garrett.Kirkendall@amd.com>,
	Laszlo Ersek <lersek@redhat.com>
Cc: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: Re: How do I access Prefetchable Memory region through EFI_PCI_IO_PROTOCOL
Date: Fri, 21 Sep 2018 07:25:40 +0000	[thread overview]
Message-ID: <734D49CCEBEEF84792F5B80ED585239D5BE2C9BD@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <SN1PR12MB015865930E4C6CFBF253BA34851C0@SN1PR12MB0158.namprd12.prod.outlook.com>

Garrett,
I think it's a real bug in the code. Thanks for reporting that.
I just submitted a Bz 1196 for this issue.
Patches are also sent out.

Thanks/Ray

> -----Original Message-----
> From: edk2-devel <edk2-devel-bounces@lists.01.org> On Behalf Of
> Kirkendall, Garrett
> Sent: Wednesday, September 19, 2018 9:53 AM
> To: Laszlo Ersek <lersek@redhat.com>
> Cc: Ni, Ruiyu <ruiyu.ni@intel.com>; edk2-devel@lists.01.org
> Subject: Re: [edk2] How do I access Prefetchable Memory region through
> EFI_PCI_IO_PROTOCOL
> 
> Ray, did you get a chance to look at the code and see how Prefetchable
> Memory regions should be handled?
> 
> GARRETT KIRKENDALL
> SMTS Firmware Engineer | CTE
> 7171 Southwest Parkway, Austin, TX 78735 USA AMD   facebook  |  amd.com
> 
> -----Original Message-----
> From: Laszlo Ersek <lersek@redhat.com>
> Sent: Sunday, September 16, 2018 5:20 AM
> To: Kirkendall, Garrett <Garrett.Kirkendall@amd.com>
> Cc: edk2-devel@lists.01.org; Ruiyu Ni <ruiyu.ni@intel.com>
> Subject: Re: [edk2] How do I access Prefetchable Memory region through
> EFI_PCI_IO_PROTOCOL
> 
> Adding Ray, and a comment at the bottom:
> 
> On 09/14/18 20:24, Kirkendall, Garrett wrote:
> > Hopefully someone can help me understand.
> >
> > I assume I should be able to access MMIO pointed to by a PCI devices
> Prefetchable Memory BAR.  I would think I would use
> EFI_PCI_IO_PROTOCOL.Mem.Read or Write.  This in turn will send the
> request up to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.Mem.Read or Write.
> >
> > MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c:
> > RootBridgeIoMemRead (Write) calls RootBridgeIoCheckParameter() to
> > verify that the request falls within the confines of the PCI root
> > bridge.  The below code verifies the address against non-prefetchable
> > MMIO regions and skips the prefetchable memory regions.  Is this
> > correct, and if so what is the method to read/write prefetchable
> > memory regions?  If I force
> EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM, then
> > I can access prefetchable memory regions because they are forced
> > within Mem.* and MemAbove4G.*
> >
> >
> >
> > EFI_STATUS
> > RootBridgeIoCheckParameter (
> >   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL        *This,
> >   IN OPERATION_TYPE                         OperationType,
> >   IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH  Width,
> >   IN UINT64                                 Address,
> >   IN UINTN                                  Count,
> >   IN VOID                                   *Buffer
> >   )
> > {
> > ...
> >   } else if (OperationType == MemOperation) {
> >     //
> >     // Allow Legacy MMIO access
> >     //
> >     if ((Address >= 0xA0000) && (Address + MultU64x32 (Count, Size)) <=
> 0xC0000) {
> >       if ((RootBridge->Attributes & EFI_PCI_ATTRIBUTE_VGA_MEMORY) != 0)
> {
> >         return EFI_SUCCESS;
> >       }
> >     }
> >     //
> >     // By comparing the Address against Limit we know which range to be
> used
> >     // for checking
> >     //
> >     if (Address + MultU64x32 (Count, Size) <= RootBridge->Mem.Limit + 1) {
> >       Base = RootBridge->Mem.Base;
> >       Limit = RootBridge->Mem.Limit;
> >     } else {
> >       Base = RootBridge->MemAbove4G.Base;
> >       Limit = RootBridge->MemAbove4G.Limit;
> >     }
> >   } else {
> > ...
> >
> 
> I'm not a PCI expert, but I think you are right; the code should permit access
> to the PMem / PMemAbove4G apertures as well. According to the PCI spec
> (--> fair use citation below),
> 
> "A PCI Express Function requesting memory resources through a BAR must
> set the BAR's Prefetchable bit unless the range contains locations with read
> side effects or locations in which the Function does not tolerate write
> merging."
> 
> IOW "prefetchable" means "there are no side effects to reading, and the
> Function tolerates write merging".
> 
> I don't see why that's reason for RootBridgeIoCheckParameter() to reject the
> access.
> 
> Ray, what's your take?
> 
> Thanks
> Laszlo
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel

      reply	other threads:[~2018-09-21  7:25 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-14 18:24 How do I access Prefetchable Memory region through EFI_PCI_IO_PROTOCOL Kirkendall, Garrett
2018-09-16 10:19 ` Laszlo Ersek
2018-09-19  1:53   ` Kirkendall, Garrett
2018-09-21  7:25     ` Ni, Ruiyu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=734D49CCEBEEF84792F5B80ED585239D5BE2C9BD@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox