From: Rafael Machado <rafaelrodrigues.machado@gmail.com>
To: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Subject: DMA Buffer write operation not persisted
Date: Thu, 25 Jan 2018 18:53:06 +0000 [thread overview]
Message-ID: <CACgnt79qcR1L1KpA6sX7=Yi_t4_=11Cb3-ATJns0w7P13mWfeA@mail.gmail.com> (raw)
Hi everyone.
I'm currently work on a task, and I need to write some data at a DMA buffer.
At the UEFI Driver Writer's guide, at page 359 there is a sample code of
how to do that.
Considering that code and adapting to my scenario I got the following
function (some debug prints are present for clarification):
EFI_STATUS
EFIAPI
DoBusMasterWrite (
IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciIo,
IN UINT8 *HostAddress,
IN UINTN *Length,
IN UINT32 Value
)
{
EFI_STATUS Status;
UINTN NumberOfBytes;
EFI_PHYSICAL_ADDRESS DeviceAddress;
VOID *Mapping;
UINT64 ReadValue;
//
// Call Map() to retrieve the DeviceAddress to use for the bus
// master write operation. The Map() function may not support
// performing a DMA operation for the entire length, so it may
// be broken up into smaller DMA operations.
//
NumberOfBytes = *Length;
Status = PciIo->Map (PciIo, // This
EfiPciIoOperationBusMasterCommonBuffer, // Operation
(VOID *)HostAddress, // HostAddress
&NumberOfBytes, // NumberOfBytes
&DeviceAddress, //DeviceAddress
&Mapping //Mapping);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Write the data to the desired address
// This write operation also starts the DMA transaction
//
Status = PciIo->Mem.Write (PciIo, // This
EfiPciIoWidthUint32, // Width
*HostAddress,
1, // Count
&Value // Buffer
);
Print(L"NumberOfBytes: %d\r\n", NumberOfBytes);
Print(L"address: 0x%x\r\n", HostAddress);
Print(L"Value: 0x%x\r\n", Value);
Print(L"Status: %r\r\n", Status);
if (EFI_ERROR (Status)) {
return Status;
}
//
// The operations performed by PollMem() also flush all posted
// writes from the PCI bus master and through PCI-to-PCI bridges.
//
Status = PciIo->PollMem (PciIo, // This
EfiPciIoWidthUint32, // Width
*HostAddress, // Offset
0xFFFFFFFF,// Mask
Value,// Value
EFI_TIMER_PERIOD_SECONDS
(1), // Timeout
&ReadValue // Result
);
Print(L"Status2: %r\r\n", Status);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Call Flush() to flush all write transactions to system memory
//
Status = PciIo->Flush (PciIo);
Print(L"Status3: %r\r\n", Status);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Call Unmap() to complete the bus master write operation
//
Status = PciIo->Unmap (PciIo, Mapping);
Print(L"Status4: %r\r\n", Status);
if (EFI_ERROR (Status)) {
return Status;
}
return Status;
}
The output of this function is this:
NumberOfBytes: 4
address: 0xCCCAC000
Value: 0xAAAAA
Status: Success
Status2: Success
Status3: Success
Status4: Success
The problem is that when I try to read this memory content using the dmem
command at the efiShell the value 0xAAAAA cannot be found. Seems something
is locking the DMA trasaction.
Can someone give me some light?
Thanks and Regard
Rafael R. Machado
next reply other threads:[~2018-01-25 18:47 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-25 18:53 Rafael Machado [this message]
2018-01-25 19:04 ` DMA Buffer write operation not persisted Andrew Fish
2018-01-25 19:15 ` Rafael Machado
2018-01-25 19:52 ` Paulo Alcantara
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='CACgnt79qcR1L1KpA6sX7=Yi_t4_=11Cb3-ATJns0w7P13mWfeA@mail.gmail.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