First version of host1x intro

Lucas Stach dev at lynxeye.de
Thu Dec 6 00:00:36 PST 2012


Am Donnerstag, den 06.12.2012, 15:49 +0800 schrieb Mark Zhang:
> On 12/06/2012 03:20 PM, Lucas Stach wrote:
> > Am Donnerstag, den 06.12.2012, 15:06 +0800 schrieb Mark Zhang:
> > [...]
> >>> First action taken is taking a reference to all buffers in the command
> >>> stream. This includes the command stream buffers themselves, but also
> >>> the target buffers. We also map each buffer to target hardware to get a
> >>> device virtual address.
> >>>
> >>> After this, relocation information is processed. Each reference to
> >>> target buffers in command stream are replaced with device virtual
> >>> addresses. The relocation information contains the reference to target
> >>> buffer, and to command stream to be able to do this.
> >>
> >> Could you explain more about this "relocation information"? I assume the
> >> "target buffers" here mentioned are some memory saving, e.g, textures,
> >> compressed video data which need to be decoded...
> >> But the userspace should already allocate the memory to save them, why
> >> we need to relocate?
> >>
> > "Relocation" is the term used to express the fixup of addresses in the
> > command buffer. You are right, the memory is allocated and stays the
> > same, but userspace can not know where in the GPU address space a
> > specific buffer is bound (maybe it's even unbound at the time, when
> > userspace stitches together the pushbuf). So userspace dumps some kind
> > of dummy information into the command stream instead of a real buffer
> > address. With the relocation information (which is kind of a sideband
> > buffer to the commandbuf) it then tells the kernel to insert real GPU
> > virtual addresses in the locations of the dummy info. For the kernel to
> > do so, it needs to know:
> > 1. where in the command stream is a dummy address
> > 2. which buffers address should be inserted instead
> > 3. which offset into this buffer should be added to the address to be
> > inserted
> > 
> 
> OK. So these relocation addresses are used to let userspace tells kernel
> which buffers mentioned in the command should be relocated to addresses
> which host1x clients able to reach.
> 
Yep, preferably all buffers referenced by a command stream should
already be set up in such a position (CMA with Tegra2) or the relocation
should be nothing more than setting up IOMMU page tables (Tegra3).

> I'm also wondering that, if our driver understands the stuffs in the
> commands, maybe we can find out all addresses in the command, in that
> way, we will not need userspace tells us which are the addresses need to
> be relocated, right?

No. How will the kernel ever know which buffer gets referenced in a
command stream? All the kernel sees is is a command stream with
something like "blit data to address 0xADDR" in it. The only info that
you can gather from that is that there must be some buffer to blit into.
Neither do you know which buffer the stuff should be going to, nor can
you know if you blit to offset zero in this buffer. It's perfectly valid
to only use a subregion of a buffer.

Or maybe I'm misunderstanding you and you mean it the other way around.
You don't let userspace dictate the addresses, the relocation
information just tells the kernel to find the addresses of the
referenced buffers for you and insert them, instead of the dummy
information, into the command stream.

Regards,
Lucas




More information about the dri-devel mailing list