media: ivtv: add parameter to enable ivtvfb on x86 PAT systems
ivtvfb was previously disabled for x86 PAT-enabled systems
by commit 1bf1735b47
("x86/mm/pat, drivers/media/ivtv:
Use arch_phys_wc_add() and require PAT disabled") as a
workaround to abstract MTRR code away from device drivers.
The driver is not easily upgradable to the PAT-aware
ioremap_wc() API since the firmware hides the address
ranges that should be marked write-combined from the driver.
However, since a write-combined cache on the framebuffer
is only a performance enhancement not a requirement for
the framebuffer to function, completely disabling the driver
in this configuration is not necessary.
Add force_pat module parameter and a corresponding kernel
configuration parameter to optionally force initialization
on PAT-enabled x86 systems with a warning about the lack of
write-combined caching, and document the reasons the driver
cannot be easily updated to support wc caching on all systems.
Signed-off-by: Nick French <naf@ou.edu>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
[hverkuil-cisco@xs4all.nl: fix typo, split long pr_ lines up]
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
dc60a4cfb7
commit
526daee730
|
@ -70,8 +70,25 @@ config VIDEO_FB_IVTV
|
||||||
This is used in the Hauppauge PVR-350 card. There is a driver
|
This is used in the Hauppauge PVR-350 card. There is a driver
|
||||||
homepage at <http://www.ivtvdriver.org>.
|
homepage at <http://www.ivtvdriver.org>.
|
||||||
|
|
||||||
In order to use this module, you will need to boot with PAT disabled
|
|
||||||
on x86 systems, using the nopat kernel parameter.
|
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called ivtvfb.
|
module will be called ivtvfb.
|
||||||
|
|
||||||
|
config VIDEO_FB_IVTV_FORCE_PAT
|
||||||
|
bool "force cx23415 framebuffer init with x86 PAT enabled"
|
||||||
|
depends on VIDEO_FB_IVTV && X86_PAT
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
With PAT enabled, the cx23415 framebuffer driver does not
|
||||||
|
utilize write-combined caching on the framebuffer memory.
|
||||||
|
For this reason, the driver will by default disable itself
|
||||||
|
when initializied on a kernel with PAT enabled (i.e. not
|
||||||
|
using the nopat kernel parameter).
|
||||||
|
|
||||||
|
The driver is not easily upgradable to the PAT-aware
|
||||||
|
ioremap_wc() API since the firmware hides the address
|
||||||
|
ranges that should be marked write-combined from the driver.
|
||||||
|
|
||||||
|
With this setting enabled, the framebuffer will initialize on
|
||||||
|
PAT-enabled systems but the framebuffer memory will be uncached.
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
|
@ -55,6 +55,7 @@
|
||||||
/* card parameters */
|
/* card parameters */
|
||||||
static int ivtvfb_card_id = -1;
|
static int ivtvfb_card_id = -1;
|
||||||
static int ivtvfb_debug = 0;
|
static int ivtvfb_debug = 0;
|
||||||
|
static bool ivtvfb_force_pat = IS_ENABLED(CONFIG_VIDEO_FB_IVTV_FORCE_PAT);
|
||||||
static bool osd_laced;
|
static bool osd_laced;
|
||||||
static int osd_depth;
|
static int osd_depth;
|
||||||
static int osd_upper;
|
static int osd_upper;
|
||||||
|
@ -64,6 +65,7 @@ static int osd_xres;
|
||||||
|
|
||||||
module_param(ivtvfb_card_id, int, 0444);
|
module_param(ivtvfb_card_id, int, 0444);
|
||||||
module_param_named(debug,ivtvfb_debug, int, 0644);
|
module_param_named(debug,ivtvfb_debug, int, 0644);
|
||||||
|
module_param_named(force_pat, ivtvfb_force_pat, bool, 0644);
|
||||||
module_param(osd_laced, bool, 0444);
|
module_param(osd_laced, bool, 0444);
|
||||||
module_param(osd_depth, int, 0444);
|
module_param(osd_depth, int, 0444);
|
||||||
module_param(osd_upper, int, 0444);
|
module_param(osd_upper, int, 0444);
|
||||||
|
@ -79,6 +81,9 @@ MODULE_PARM_DESC(debug,
|
||||||
"Debug level (bitmask). Default: errors only\n"
|
"Debug level (bitmask). Default: errors only\n"
|
||||||
"\t\t\t(debug = 3 gives full debugging)");
|
"\t\t\t(debug = 3 gives full debugging)");
|
||||||
|
|
||||||
|
MODULE_PARM_DESC(force_pat,
|
||||||
|
"Force initialization on x86 PAT-enabled systems (bool).\n");
|
||||||
|
|
||||||
/* Why upper, left, xres, yres, depth, laced ? To match terminology used
|
/* Why upper, left, xres, yres, depth, laced ? To match terminology used
|
||||||
by fbset.
|
by fbset.
|
||||||
Why start at 1 for left & upper coordinate ? Because X doesn't allow 0 */
|
Why start at 1 for left & upper coordinate ? Because X doesn't allow 0 */
|
||||||
|
@ -1167,8 +1172,15 @@ static int ivtvfb_init_card(struct ivtv *itv)
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
if (pat_enabled()) {
|
if (pat_enabled()) {
|
||||||
pr_warn("ivtvfb needs PAT disabled, boot with nopat kernel parameter\n");
|
if (ivtvfb_force_pat) {
|
||||||
return -ENODEV;
|
pr_info("PAT is enabled. Write-combined framebuffer caching will be disabled.\n");
|
||||||
|
pr_info("To enable caching, boot with nopat kernel parameter\n");
|
||||||
|
} else {
|
||||||
|
pr_warn("ivtvfb needs PAT disabled for write-combined framebuffer caching.\n");
|
||||||
|
pr_warn("Boot with nopat kernel parameter to use caching, or use the\n");
|
||||||
|
pr_warn("force_pat module parameter to run with caching disabled\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue