ps3fb: kill ps3fb_res
kill ps3fb_res[], as all information it contains can be obtained in some other way. Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com> Cc: "Antonino A. Daplas" <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d9a4ba6a28
commit
9f4f21b453
@ -134,42 +134,17 @@ static struct ps3fb_priv ps3fb;
|
|||||||
struct ps3fb_par {
|
struct ps3fb_par {
|
||||||
u32 pseudo_palette[16];
|
u32 pseudo_palette[16];
|
||||||
int mode_id, new_mode_id;
|
int mode_id, new_mode_id;
|
||||||
int res_index;
|
|
||||||
unsigned int num_frames; /* num of frame buffers */
|
unsigned int num_frames; /* num of frame buffers */
|
||||||
unsigned int width;
|
unsigned int width;
|
||||||
unsigned int height;
|
unsigned int height;
|
||||||
|
unsigned int ddr_line_length;
|
||||||
|
unsigned int ddr_frame_size;
|
||||||
|
unsigned int xdr_frame_size;
|
||||||
unsigned long full_offset; /* start of fullscreen DDR fb */
|
unsigned long full_offset; /* start of fullscreen DDR fb */
|
||||||
unsigned long fb_offset; /* start of actual DDR fb */
|
unsigned long fb_offset; /* start of actual DDR fb */
|
||||||
unsigned long pan_offset;
|
unsigned long pan_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ps3fb_res_table {
|
|
||||||
u32 xres;
|
|
||||||
u32 yres;
|
|
||||||
u32 xoff;
|
|
||||||
u32 yoff;
|
|
||||||
u32 type;
|
|
||||||
};
|
|
||||||
#define PS3FB_RES_FULL 1
|
|
||||||
static const struct ps3fb_res_table ps3fb_res[] = {
|
|
||||||
/* res_x,y margin_x,y full */
|
|
||||||
{ 720, 480, 72, 48 , 0},
|
|
||||||
{ 720, 576, 72, 58 , 0},
|
|
||||||
{ 1280, 720, 78, 38 , 0},
|
|
||||||
{ 1920, 1080, 116, 58 , 0},
|
|
||||||
/* full mode */
|
|
||||||
{ 720, 480, 0, 0 , PS3FB_RES_FULL},
|
|
||||||
{ 720, 576, 0, 0 , PS3FB_RES_FULL},
|
|
||||||
{ 1280, 720, 0, 0 , PS3FB_RES_FULL},
|
|
||||||
{ 1920, 1080, 0, 0 , PS3FB_RES_FULL},
|
|
||||||
/* vesa: normally full mode */
|
|
||||||
{ 1280, 768, 0, 0 , 0},
|
|
||||||
{ 1280, 1024, 0, 0 , 0},
|
|
||||||
{ 1920, 1200, 0, 0 , 0},
|
|
||||||
{ 0, 0, 0, 0 , 0} };
|
|
||||||
|
|
||||||
/* default resolution */
|
|
||||||
#define GPU_RES_INDEX 0 /* 720 x 480 */
|
|
||||||
|
|
||||||
static const struct fb_videomode ps3fb_modedb[] = {
|
static const struct fb_videomode ps3fb_modedb[] = {
|
||||||
/* 60 Hz broadcast modes (modes "1" to "5") */
|
/* 60 Hz broadcast modes (modes "1" to "5") */
|
||||||
@ -295,37 +270,6 @@ module_param(ps3fb_mode, int, 0);
|
|||||||
|
|
||||||
static char *mode_option __devinitdata;
|
static char *mode_option __devinitdata;
|
||||||
|
|
||||||
static int ps3fb_get_res_table(u32 xres, u32 yres, int mode)
|
|
||||||
{
|
|
||||||
int full_mode;
|
|
||||||
unsigned int i;
|
|
||||||
u32 x, y, f;
|
|
||||||
|
|
||||||
full_mode = (mode & PS3AV_MODE_FULL) ? PS3FB_RES_FULL : 0;
|
|
||||||
for (i = 0;; i++) {
|
|
||||||
x = ps3fb_res[i].xres;
|
|
||||||
y = ps3fb_res[i].yres;
|
|
||||||
f = ps3fb_res[i].type;
|
|
||||||
|
|
||||||
if (!x) {
|
|
||||||
pr_debug("ERROR: ps3fb_get_res_table()\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (full_mode == PS3FB_RES_FULL && f != PS3FB_RES_FULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (x == xres && (yres == 0 || y == yres))
|
|
||||||
break;
|
|
||||||
|
|
||||||
x = x - 2 * ps3fb_res[i].xoff;
|
|
||||||
y = y - 2 * ps3fb_res[i].yoff;
|
|
||||||
if (x == xres && (yres == 0 || y == yres))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int ps3fb_find_mode(const struct fb_var_screeninfo *var,
|
static unsigned int ps3fb_find_mode(const struct fb_var_screeninfo *var,
|
||||||
u32 *ddr_line_length, u32 *xdr_line_length)
|
u32 *ddr_line_length, u32 *xdr_line_length)
|
||||||
{
|
{
|
||||||
@ -433,8 +377,7 @@ static void ps3fb_sync_image(struct device *dev, u64 frame_offset,
|
|||||||
static int ps3fb_sync(struct fb_info *info, u32 frame)
|
static int ps3fb_sync(struct fb_info *info, u32 frame)
|
||||||
{
|
{
|
||||||
struct ps3fb_par *par = info->par;
|
struct ps3fb_par *par = info->par;
|
||||||
int i, error = 0;
|
int error = 0;
|
||||||
u32 ddr_line_length, xdr_line_length;
|
|
||||||
u64 ddr_base, xdr_base;
|
u64 ddr_base, xdr_base;
|
||||||
|
|
||||||
if (frame > par->num_frames - 1) {
|
if (frame > par->num_frames - 1) {
|
||||||
@ -444,16 +387,13 @@ static int ps3fb_sync(struct fb_info *info, u32 frame)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
i = par->res_index;
|
xdr_base = frame * par->xdr_frame_size;
|
||||||
xdr_line_length = info->fix.line_length;
|
ddr_base = frame * par->ddr_frame_size;
|
||||||
ddr_line_length = ps3fb_res[i].xres * BPP;
|
|
||||||
xdr_base = frame * info->var.yres_virtual * xdr_line_length;
|
|
||||||
ddr_base = frame * ps3fb_res[i].yres * ddr_line_length;
|
|
||||||
|
|
||||||
ps3fb_sync_image(info->device, ddr_base + par->full_offset,
|
ps3fb_sync_image(info->device, ddr_base + par->full_offset,
|
||||||
ddr_base + par->fb_offset, xdr_base + par->pan_offset,
|
ddr_base + par->fb_offset, xdr_base + par->pan_offset,
|
||||||
par->width, par->height, ddr_line_length,
|
par->width, par->height, par->ddr_line_length,
|
||||||
xdr_line_length);
|
info->fix.line_length);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return error;
|
return error;
|
||||||
@ -572,8 +512,9 @@ static int ps3fb_set_par(struct fb_info *info)
|
|||||||
{
|
{
|
||||||
struct ps3fb_par *par = info->par;
|
struct ps3fb_par *par = info->par;
|
||||||
unsigned int mode, ddr_line_length, xdr_line_length, lines, maxlines;
|
unsigned int mode, ddr_line_length, xdr_line_length, lines, maxlines;
|
||||||
int i;
|
unsigned int ddr_xoff, ddr_yoff;
|
||||||
unsigned long offset;
|
unsigned long offset;
|
||||||
|
const struct fb_videomode *vmode;
|
||||||
u64 dst;
|
u64 dst;
|
||||||
|
|
||||||
dev_dbg(info->device, "xres:%d xv:%d yres:%d yv:%d clock:%d\n",
|
dev_dbg(info->device, "xres:%d xv:%d yres:%d yv:%d clock:%d\n",
|
||||||
@ -584,8 +525,7 @@ static int ps3fb_set_par(struct fb_info *info)
|
|||||||
if (!mode)
|
if (!mode)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
i = ps3fb_get_res_table(info->var.xres, info->var.yres, mode);
|
vmode = ps3fb_default_mode(mode | PS3AV_MODE_FULL);
|
||||||
par->res_index = i;
|
|
||||||
|
|
||||||
info->fix.smem_start = virt_to_abs(ps3fb.xdr_ea);
|
info->fix.smem_start = virt_to_abs(ps3fb.xdr_ea);
|
||||||
info->fix.smem_len = ps3fb.xdr_size;
|
info->fix.smem_len = ps3fb.xdr_size;
|
||||||
@ -595,9 +535,12 @@ static int ps3fb_set_par(struct fb_info *info)
|
|||||||
|
|
||||||
info->screen_base = (char __iomem *)ps3fb.xdr_ea;
|
info->screen_base = (char __iomem *)ps3fb.xdr_ea;
|
||||||
|
|
||||||
|
par->ddr_line_length = ddr_line_length;
|
||||||
|
par->ddr_frame_size = vmode->yres * ddr_line_length;
|
||||||
|
par->xdr_frame_size = info->var.yres_virtual * xdr_line_length;
|
||||||
|
|
||||||
par->num_frames = ps3fb.xdr_size /
|
par->num_frames = ps3fb.xdr_size /
|
||||||
max(ps3fb_res[i].yres * ddr_line_length,
|
max(par->ddr_frame_size, par->xdr_frame_size);
|
||||||
info->var.yres_virtual * xdr_line_length);
|
|
||||||
|
|
||||||
/* Keep the special bits we cannot set using fb_var_screeninfo */
|
/* Keep the special bits we cannot set using fb_var_screeninfo */
|
||||||
par->new_mode_id = (par->new_mode_id & ~PS3AV_MODE_MASK) | mode;
|
par->new_mode_id = (par->new_mode_id & ~PS3AV_MODE_MASK) | mode;
|
||||||
@ -606,7 +549,9 @@ static int ps3fb_set_par(struct fb_info *info)
|
|||||||
par->height = info->var.yres;
|
par->height = info->var.yres;
|
||||||
|
|
||||||
/* Start of the virtual frame buffer (relative to fullscreen) */
|
/* Start of the virtual frame buffer (relative to fullscreen) */
|
||||||
offset = ps3fb_res[i].yoff * ddr_line_length + ps3fb_res[i].xoff * BPP;
|
ddr_xoff = info->var.left_margin - vmode->left_margin;
|
||||||
|
ddr_yoff = info->var.upper_margin - vmode->upper_margin;
|
||||||
|
offset = ddr_yoff * ddr_line_length + ddr_xoff * BPP;
|
||||||
|
|
||||||
par->fb_offset = GPU_ALIGN_UP(offset);
|
par->fb_offset = GPU_ALIGN_UP(offset);
|
||||||
par->full_offset = par->fb_offset - offset;
|
par->full_offset = par->fb_offset - offset;
|
||||||
@ -625,13 +570,13 @@ static int ps3fb_set_par(struct fb_info *info)
|
|||||||
memset(ps3fb.xdr_ea, 0, ps3fb.xdr_size);
|
memset(ps3fb.xdr_ea, 0, ps3fb.xdr_size);
|
||||||
|
|
||||||
/* Clear DDR frame buffer memory */
|
/* Clear DDR frame buffer memory */
|
||||||
lines = ps3fb_res[i].yres * par->num_frames;
|
lines = vmode->yres * par->num_frames;
|
||||||
if (par->full_offset)
|
if (par->full_offset)
|
||||||
lines++;
|
lines++;
|
||||||
maxlines = ps3fb.xdr_size / ddr_line_length;
|
maxlines = ps3fb.xdr_size / ddr_line_length;
|
||||||
for (dst = 0; lines; dst += maxlines * ddr_line_length) {
|
for (dst = 0; lines; dst += maxlines * ddr_line_length) {
|
||||||
unsigned int l = min(lines, maxlines);
|
unsigned int l = min(lines, maxlines);
|
||||||
ps3fb_sync_image(info->device, 0, dst, 0, ps3fb_res[i].xres, l,
|
ps3fb_sync_image(info->device, 0, dst, 0, vmode->xres, l,
|
||||||
ddr_line_length, ddr_line_length);
|
ddr_line_length, ddr_line_length);
|
||||||
lines -= l;
|
lines -= l;
|
||||||
}
|
}
|
||||||
@ -1052,14 +997,13 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
|
|||||||
struct fb_info *info;
|
struct fb_info *info;
|
||||||
struct ps3fb_par *par;
|
struct ps3fb_par *par;
|
||||||
int retval = -ENOMEM;
|
int retval = -ENOMEM;
|
||||||
u32 xres, yres;
|
|
||||||
u64 ddr_lpar = 0;
|
u64 ddr_lpar = 0;
|
||||||
u64 lpar_dma_control = 0;
|
u64 lpar_dma_control = 0;
|
||||||
u64 lpar_driver_info = 0;
|
u64 lpar_driver_info = 0;
|
||||||
u64 lpar_reports = 0;
|
u64 lpar_reports = 0;
|
||||||
u64 lpar_reports_size = 0;
|
u64 lpar_reports_size = 0;
|
||||||
u64 xdr_lpar;
|
u64 xdr_lpar;
|
||||||
int status, res_index;
|
int status;
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
unsigned long max_ps3fb_size;
|
unsigned long max_ps3fb_size;
|
||||||
|
|
||||||
@ -1079,13 +1023,6 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
|
|||||||
ps3fb_mode = ps3av_get_mode();
|
ps3fb_mode = ps3av_get_mode();
|
||||||
dev_dbg(&dev->core, "ps3fb_mode: %d\n", ps3fb_mode);
|
dev_dbg(&dev->core, "ps3fb_mode: %d\n", ps3fb_mode);
|
||||||
|
|
||||||
if (ps3fb_mode > 0 &&
|
|
||||||
!ps3av_video_mode2res(ps3fb_mode, &xres, &yres)) {
|
|
||||||
res_index = ps3fb_get_res_table(xres, yres, ps3fb_mode);
|
|
||||||
dev_dbg(&dev->core, "res_index:%d\n", res_index);
|
|
||||||
} else
|
|
||||||
res_index = GPU_RES_INDEX;
|
|
||||||
|
|
||||||
atomic_set(&ps3fb.f_count, -1); /* fbcon opens ps3fb */
|
atomic_set(&ps3fb.f_count, -1); /* fbcon opens ps3fb */
|
||||||
atomic_set(&ps3fb.ext_flip, 0); /* for flip with vsync */
|
atomic_set(&ps3fb.ext_flip, 0); /* for flip with vsync */
|
||||||
init_waitqueue_head(&ps3fb.wait_vsync);
|
init_waitqueue_head(&ps3fb.wait_vsync);
|
||||||
@ -1158,7 +1095,6 @@ static int __devinit ps3fb_probe(struct ps3_system_bus_device *dev)
|
|||||||
par = info->par;
|
par = info->par;
|
||||||
par->mode_id = ~ps3fb_mode; /* != ps3fb_mode, to trigger change */
|
par->mode_id = ~ps3fb_mode; /* != ps3fb_mode, to trigger change */
|
||||||
par->new_mode_id = ps3fb_mode;
|
par->new_mode_id = ps3fb_mode;
|
||||||
par->res_index = res_index;
|
|
||||||
par->num_frames = 1;
|
par->num_frames = 1;
|
||||||
|
|
||||||
info->screen_base = (char __iomem *)ps3fb.xdr_ea;
|
info->screen_base = (char __iomem *)ps3fb.xdr_ea;
|
||||||
|
Loading…
Reference in New Issue
Block a user