#define DRIVER_MAJOR 1
#define DRIVER_MINOR 0
+static uint xilinx_drm_fbdev_vres = 2;
+module_param_named(fbdev_vres, xilinx_drm_fbdev_vres, uint, 0444);
+MODULE_PARM_DESC(fbdev_vres,
+ "fbdev virtual resolution multiplier for fb (default: 2)");
+
/*
* TODO: The possible pipeline configurations are numerous with Xilinx soft IPs.
* It's not too bad for now, but the more proper way(Common Display Framework,
/* initialize xilinx framebuffer */
bpp = xilinx_drm_format_bpp(xilinx_drm_crtc_get_format(private->crtc));
align = xilinx_drm_crtc_get_align(private->crtc);
- private->fb = xilinx_drm_fb_init(drm, bpp, 1, 1, align);
+ private->fb = xilinx_drm_fb_init(drm, bpp, 1, 1, align,
+ xilinx_drm_fbdev_vres);
if (IS_ERR(private->fb)) {
DRM_ERROR("failed to initialize drm cma fb\n");
ret = PTR_ERR(private->fb);
struct drm_fb_helper fb_helper;
struct xilinx_drm_fb *fb;
unsigned int align;
+ unsigned int vres_mult;
};
static inline struct xilinx_drm_fbdev *to_fbdev(struct drm_fb_helper *fb_helper)
fbdev->align);
mode_cmd.pixel_format = xilinx_drm_get_format(drm);
+ mode_cmd.height *= fbdev->vres_mult;
size = mode_cmd.pitches[0] * mode_cmd.height;
obj = drm_gem_cma_create(drm, size);
if (IS_ERR(obj))
drm_fb_helper_fill_fix(fbi, base_fb->pitches[0], base_fb->depth);
drm_fb_helper_fill_var(fbi, fb_helper, base_fb->width, base_fb->height);
+ fbi->var.yres = base_fb->height / fbdev->vres_mult;
offset = fbi->var.xoffset * bytes_per_pixel;
offset += fbi->var.yoffset * base_fb->pitches[0];
* @num_crtc: number of CRTCs
* @max_conn_count: maximum number of connectors
* @align: alignment value for pitch
+ * @vres_mult: multiplier for virtual resolution
*
* This function is based on drm_fbdev_cma_init().
*
struct drm_fb_helper *
xilinx_drm_fb_init(struct drm_device *drm, unsigned int preferred_bpp,
unsigned int num_crtc, unsigned int max_conn_count,
- unsigned int align)
+ unsigned int align, unsigned int vres_mult)
{
struct xilinx_drm_fbdev *fbdev;
struct drm_fb_helper *fb_helper;
return ERR_PTR(-ENOMEM);
}
+ fbdev->vres_mult = vres_mult;
+
fbdev->align = align;
fb_helper = &fbdev->fb_helper;
drm_fb_helper_prepare(drm, fb_helper, &xilinx_drm_fb_helper_funcs);
struct drm_fb_helper *
xilinx_drm_fb_init(struct drm_device *drm, unsigned int preferred_bpp,
unsigned int num_crtc, unsigned int max_conn_count,
- unsigned int align);
+ unsigned int align, unsigned int vres_mult);
void xilinx_drm_fb_fini(struct drm_fb_helper *fb_helper);
void xilinx_drm_fb_restore_mode(struct drm_fb_helper *fb_helper);