Skip to content

Commit

Permalink
ps3fb: Update for firmware 2.10
Browse files Browse the repository at this point in the history
ps3fb: Update for firmware 2.10

As of PS3 firmware version 2.10, the GPU command buffer size must be at least 2
MiB large. Since we use only a small part of the GPU command buffer and don't
want to waste precious XDR memory, move the GPU command buffer back to the
start of the XDR memory reserved for ps3fb and let the unused part overlap with
the actual frame buffer.

Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Geert Uytterhoeven authored and Linus Torvalds committed Dec 19, 2007
1 parent c7eeae7 commit 9ac67a3
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions drivers/video/ps3fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
#define L1GPU_DISPLAY_SYNC_HSYNC 1
#define L1GPU_DISPLAY_SYNC_VSYNC 2

#define GPU_CMD_BUF_SIZE (64 * 1024)
#define GPU_CMD_BUF_SIZE (2 * 1024 * 1024)
#define GPU_FB_START (64 * 1024)
#define GPU_IOIF (0x0d000000UL)
#define GPU_ALIGN_UP(x) _ALIGN_UP((x), 64)
#define GPU_MAX_LINE_LENGTH (65536 - 64)
Expand Down Expand Up @@ -406,6 +407,7 @@ static void ps3fb_sync_image(struct device *dev, u64 frame_offset,
if (src_line_length != dst_line_length)
line_length |= (u64)src_line_length << 32;

src_offset += GPU_FB_START;
status = lv1_gpu_context_attribute(ps3fb.context_handle,
L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT,
dst_offset, GPU_IOIF + src_offset,
Expand Down Expand Up @@ -976,9 +978,8 @@ static int ps3fb_xdr_settings(u64 xdr_lpar, struct device *dev)

status = lv1_gpu_context_attribute(ps3fb.context_handle,
L1GPU_CONTEXT_ATTRIBUTE_FB_SETUP,
xdr_lpar + ps3fb.xdr_size,
GPU_CMD_BUF_SIZE,
GPU_IOIF + ps3fb.xdr_size, 0);
xdr_lpar, GPU_CMD_BUF_SIZE,
GPU_IOIF, 0);
if (status) {
dev_err(dev,
"%s: lv1_gpu_context_attribute FB_SETUP failed: %d\n",
Expand Down Expand Up @@ -1061,6 +1062,11 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
struct task_struct *task;
unsigned long max_ps3fb_size;

if (ps3fb_videomemory.size < GPU_CMD_BUF_SIZE) {
dev_err(&dev->core, "%s: Not enough video memory\n", __func__);
return -ENOMEM;
}

status = ps3_open_hv_device(dev);
if (status) {
dev_err(&dev->core, "%s: ps3_open_hv_device failed\n",
Expand Down Expand Up @@ -1131,8 +1137,14 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
/* Clear memory to prevent kernel info leakage into userspace */
memset(ps3fb.xdr_ea, 0, ps3fb_videomemory.size);

/* The GPU command buffer is at the end of video memory */
ps3fb.xdr_size = ps3fb_videomemory.size - GPU_CMD_BUF_SIZE;
/*
* The GPU command buffer is at the start of video memory
* As we don't use the full command buffer, we can put the actual
* frame buffer at offset GPU_FB_START and save some precious XDR
* memory
*/
ps3fb.xdr_ea += GPU_FB_START;
ps3fb.xdr_size = ps3fb_videomemory.size - GPU_FB_START;

retval = ps3fb_xdr_settings(xdr_lpar, &dev->core);
if (retval)
Expand Down

0 comments on commit 9ac67a3

Please sign in to comment.