Merge tag 'v4.2-rc1' into patchwork
Linux 4.2-rc1 * tag 'v4.2-rc1': (12415 commits) Linux 4.2-rc1 bluetooth: fix list handling 9p: cope with bogus responses from server in p9_client_{read,write} p9_client_write(): avoid double p9_free_req() 9p: forgetting to cancel request on interrupted zero-copy RPC dax: bdev_direct_access() may sleep block: Add support for DAX reads/writes to block devices dax: Use copy_from_iter_nocache dax: Add block size note to documentation NTB: Add split BAR output for debugfs stats NTB: Change WARN_ON_ONCE to pr_warn_once on unsafe NTB: Print driver name and version in module init NTB: Increase transport MTU to 64k from 16k NTB: Rename Intel code names to platform names NTB: Default to CPU memcpy for performance NTB: Improve performance with write combining NTB: Use NUMA memory in Intel driver NTB: Use NUMA memory and DMA chan in transport NTB: Rate limit ntb_qp_link_work NTB: Add tool test client ...
这个提交包含在:
@@ -15,7 +15,6 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kthread.h>
|
||||
|
@@ -57,5 +57,8 @@ config VIDEO_FB_IVTV
|
||||
This is used in the Hauppauge PVR-350 card. There is a driver
|
||||
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
|
||||
module will be called ivtvfb.
|
||||
|
@@ -44,8 +44,8 @@
|
||||
#include <linux/ivtvfb.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#ifdef CONFIG_MTRR
|
||||
#include <asm/mtrr.h>
|
||||
#ifdef CONFIG_X86_64
|
||||
#include <asm/pat.h>
|
||||
#endif
|
||||
|
||||
#include "ivtv-driver.h"
|
||||
@@ -155,12 +155,11 @@ struct osd_info {
|
||||
/* Buffer size */
|
||||
u32 video_buffer_size;
|
||||
|
||||
#ifdef CONFIG_MTRR
|
||||
/* video_base rounded down as required by hardware MTRRs */
|
||||
unsigned long fb_start_aligned_physaddr;
|
||||
/* video_base rounded up as required by hardware MTRRs */
|
||||
unsigned long fb_end_aligned_physaddr;
|
||||
#endif
|
||||
int wc_cookie;
|
||||
|
||||
/* Store the buffer offset */
|
||||
int set_osd_coords_x;
|
||||
@@ -1099,6 +1098,8 @@ static int ivtvfb_init_vidmode(struct ivtv *itv)
|
||||
static int ivtvfb_init_io(struct ivtv *itv)
|
||||
{
|
||||
struct osd_info *oi = itv->osd_info;
|
||||
/* Find the largest power of two that maps the whole buffer */
|
||||
int size_shift = 31;
|
||||
|
||||
mutex_lock(&itv->serialize_lock);
|
||||
if (ivtv_init_on_first_open(itv)) {
|
||||
@@ -1132,29 +1133,16 @@ static int ivtvfb_init_io(struct ivtv *itv)
|
||||
oi->video_pbase, oi->video_vbase,
|
||||
oi->video_buffer_size / 1024);
|
||||
|
||||
#ifdef CONFIG_MTRR
|
||||
{
|
||||
/* Find the largest power of two that maps the whole buffer */
|
||||
int size_shift = 31;
|
||||
|
||||
while (!(oi->video_buffer_size & (1 << size_shift))) {
|
||||
size_shift--;
|
||||
}
|
||||
size_shift++;
|
||||
oi->fb_start_aligned_physaddr = oi->video_pbase & ~((1 << size_shift) - 1);
|
||||
oi->fb_end_aligned_physaddr = oi->video_pbase + oi->video_buffer_size;
|
||||
oi->fb_end_aligned_physaddr += (1 << size_shift) - 1;
|
||||
oi->fb_end_aligned_physaddr &= ~((1 << size_shift) - 1);
|
||||
if (mtrr_add(oi->fb_start_aligned_physaddr,
|
||||
oi->fb_end_aligned_physaddr - oi->fb_start_aligned_physaddr,
|
||||
MTRR_TYPE_WRCOMB, 1) < 0) {
|
||||
IVTVFB_INFO("disabled mttr\n");
|
||||
oi->fb_start_aligned_physaddr = 0;
|
||||
oi->fb_end_aligned_physaddr = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
while (!(oi->video_buffer_size & (1 << size_shift)))
|
||||
size_shift--;
|
||||
size_shift++;
|
||||
oi->fb_start_aligned_physaddr = oi->video_pbase & ~((1 << size_shift) - 1);
|
||||
oi->fb_end_aligned_physaddr = oi->video_pbase + oi->video_buffer_size;
|
||||
oi->fb_end_aligned_physaddr += (1 << size_shift) - 1;
|
||||
oi->fb_end_aligned_physaddr &= ~((1 << size_shift) - 1);
|
||||
oi->wc_cookie = arch_phys_wc_add(oi->fb_start_aligned_physaddr,
|
||||
oi->fb_end_aligned_physaddr -
|
||||
oi->fb_start_aligned_physaddr);
|
||||
/* Blank the entire osd. */
|
||||
memset_io(oi->video_vbase, 0, oi->video_buffer_size);
|
||||
|
||||
@@ -1172,14 +1160,7 @@ static void ivtvfb_release_buffers (struct ivtv *itv)
|
||||
|
||||
/* Release pseudo palette */
|
||||
kfree(oi->ivtvfb_info.pseudo_palette);
|
||||
|
||||
#ifdef CONFIG_MTRR
|
||||
if (oi->fb_end_aligned_physaddr) {
|
||||
mtrr_del(-1, oi->fb_start_aligned_physaddr,
|
||||
oi->fb_end_aligned_physaddr - oi->fb_start_aligned_physaddr);
|
||||
}
|
||||
#endif
|
||||
|
||||
arch_phys_wc_del(oi->wc_cookie);
|
||||
kfree(oi);
|
||||
itv->osd_info = NULL;
|
||||
}
|
||||
@@ -1284,6 +1265,13 @@ static int __init ivtvfb_init(void)
|
||||
int registered = 0;
|
||||
int err;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
if (WARN(pat_enabled(),
|
||||
"ivtvfb needs PAT disabled, boot with nopat kernel parameter\n")) {
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ivtvfb_card_id < -1 || ivtvfb_card_id >= IVTV_MAX_CARDS) {
|
||||
printk(KERN_ERR "ivtvfb: ivtvfb_card_id parameter is out of range (valid range: -1 - %d)\n",
|
||||
IVTV_MAX_CARDS - 1);
|
||||
|
在新工单中引用
屏蔽一个用户