[coreboot] i915 status on x60.
Denis 'GNUtoo' Carikli
GNUtoo at no-log.org
Sun Mar 3 14:13:08 CET 2013
On Sun, 3 Mar 2013 14:01:35 +0100
Denis 'GNUtoo' Carikli <GNUtoo at no-log.org> wrote:
> So here's the code:
> int dspbase = (plane == 0 ? DSPABASE : DSPBBASE);
> [...]
> int dspstride = (plane == 0) ? DSPASTRIDE : DSPBSTRIDE;
> [...]
> Stride = pScrn->displayWidth * pI830->cpp;
> [...]
> OUTREG(dspstride, Stride);
> [...]
> OUTREG(dspbase, Start + Offset);
>
> The problem is how to replace Start + Offset, the code is
> quite complicated and I can't probably run it since it probably
> requires an old userspace.
So I followed a bit the code but gave up yesterday night(very late)
here:
/* Allocate aperture space for the given size and alignment, and
returns the
* memory allocation.
*
* Allocations are a minimum of a page, and will be at least
page-aligned.
*/
static i830_memory *
i830_allocate_aperture(ScrnInfoPtr pScrn, const char *name,
unsigned long size, unsigned long pitch,
unsigned long alignment, int flags,
enum tile_format tile_format)
{
[...]
for (scan = pI830->memory_list; scan->next != NULL; scan =
scan->next) {
mem->offset = ROUND_TO(scan->end, alignment);
if ((flags & NEED_PHYSICAL_ADDR) && mem->offset <
pI830->stolen_size) {
/* If the allocation is entirely within stolen memory, and
we're
* able to get the physical addresses out of the GTT and
check that
* it's contiguous (it ought to be), then we can do our
physical
* allocations there and not bother the kernel about it.
This
* helps avoid aperture fragmentation from our physical
* allocations.
*/
mem->bus_addr = i830_get_stolen_physical(pScrn, mem->offset,
mem->size);
if (mem->bus_addr == ((uint64_t)-1)) {
/* Move the start of the allocation to just past the
end of
* stolen memory.
*/
mem->offset = ROUND_TO(pI830->stolen_size, alignment);
}
}
if ((flags & NEED_NON_STOLEN) && mem->offset <
pI830->stolen_size) {
mem->offset = ROUND_TO(pI830->stolen_size, alignment);
}
mem->end = mem->offset + size;
if (flags & ALIGN_BOTH_ENDS)
mem->end = ROUND_TO(mem->end, alignment);
if (mem->end <= scan->next->offset)
break;
}
which is called by i830_allocate_memory(in i830_memory.c) which is
called by(in i830_allocate_2d_memory in i830_memory.c) :
pI830->front_buffer =
i830_allocate_framebuffer(pScrn, pI830, &pI830->FbMemBox,
FALSE);
Then we have in i830PipeSetBase(in i830_display.c):
Start = pI830->front_buffer->offset;
For the offset we have in the same file, same function:
Offset = ((y * pScrn->displayWidth + x) * pI830->cpp);
I don't know what does x and y represents, maybe they are 0?
Denis.
So I followed a bit the code but gave up yesterday night(very late)
here:
/* Allocate aperture space for the given size and alignment, and
returns the
* memory allocation.
*
* Allocations are a minimum of a page, and will be at least
page-aligned.
*/
static i830_memory *
i830_allocate_aperture(ScrnInfoPtr pScrn, const char *name,
unsigned long size, unsigned long pitch,
unsigned long alignment, int flags,
enum tile_format tile_format)
{
[...]
for (scan = pI830->memory_list; scan->next != NULL; scan =
scan->next) {
mem->offset = ROUND_TO(scan->end, alignment);
if ((flags & NEED_PHYSICAL_ADDR) && mem->offset <
pI830->stolen_size) {
/* If the allocation is entirely within stolen memory, and
we're
* able to get the physical addresses out of the GTT and
check that
* it's contiguous (it ought to be), then we can do our
physical
* allocations there and not bother the kernel about it.
This
* helps avoid aperture fragmentation from our physical
* allocations.
*/
mem->bus_addr = i830_get_stolen_physical(pScrn, mem->offset,
mem->size);
if (mem->bus_addr == ((uint64_t)-1)) {
/* Move the start of the allocation to just past the
end of
* stolen memory.
*/
mem->offset = ROUND_TO(pI830->stolen_size, alignment);
}
}
if ((flags & NEED_NON_STOLEN) && mem->offset <
pI830->stolen_size) {
mem->offset = ROUND_TO(pI830->stolen_size, alignment);
}
mem->end = mem->offset + size;
if (flags & ALIGN_BOTH_ENDS)
mem->end = ROUND_TO(mem->end, alignment);
if (mem->end <= scan->next->offset)
break;
}
which is called by i830_allocate_memory(in i830_memory.c) which is
called by(in i830_allocate_2d_memory in i830_memory.c) :
pI830->front_buffer =
i830_allocate_framebuffer(pScrn, pI830, &pI830->FbMemBox,
FALSE);
Then we have in i830PipeSetBase(in i830_display.c):
Start = pI830->front_buffer->offset;
For the offset we have in the same file, same function:
Offset = ((y * pScrn->displayWidth + x) * pI830->cpp);
I don't know what does x and y represents, maybe they are 0?
Denis.
More information about the coreboot
mailing list