forked from KolibriOS/kolibrios
i915-4.4 update
git-svn-id: svn://kolibrios.org@6103 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
cf125b5b49
commit
5d98dda3cf
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
//#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
//#include <linux/pnp.h>
|
//#include <linux/pnp.h>
|
||||||
//#include <linux/vga_switcheroo.h>
|
//#include <linux/vga_switcheroo.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
//#include <acpi/video.h>
|
#include <linux/pm.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen);
|
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen);
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||||
|
|
||||||
|
#include <linux/sysrq.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/circ_buf.h>
|
#include <linux/circ_buf.h>
|
||||||
#include <drm/drmP.h>
|
#include <drm/drmP.h>
|
||||||
|
@ -1085,6 +1085,14 @@ intel_dp_aux_init(struct intel_dp *intel_dp, struct intel_connector *connector)
|
|||||||
name, ret);
|
name, ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = sysfs_create_link(&connector->base.kdev->kobj,
|
||||||
|
&intel_dp->aux.ddc.dev.kobj,
|
||||||
|
intel_dp->aux.ddc.dev.kobj.name);
|
||||||
|
if (ret < 0) {
|
||||||
|
DRM_ERROR("sysfs_create_link() for %s failed (%d)\n", name, ret);
|
||||||
|
drm_dp_aux_unregister(&intel_dp->aux);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1092,6 +1100,9 @@ intel_dp_connector_unregister(struct intel_connector *intel_connector)
|
|||||||
{
|
{
|
||||||
struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base);
|
struct intel_dp *intel_dp = intel_attached_dp(&intel_connector->base);
|
||||||
|
|
||||||
|
if (!intel_connector->mst_port)
|
||||||
|
sysfs_remove_link(&intel_connector->base.kdev->kobj,
|
||||||
|
intel_dp->aux.ddc.dev.kobj.name);
|
||||||
intel_connector_unregister(intel_connector);
|
intel_connector_unregister(intel_connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
||||||
|
|
||||||
#include <linux/acpi.h>
|
#include <linux/acpi.h>
|
||||||
#include <acpi/video.h>
|
#include <acpi/video.h>
|
||||||
|
|
||||||
|
@ -2347,6 +2347,8 @@ intel_sdvo_connector_unregister(struct intel_connector *intel_connector)
|
|||||||
drm_connector = &intel_connector->base;
|
drm_connector = &intel_connector->base;
|
||||||
sdvo_encoder = intel_attached_sdvo(&intel_connector->base);
|
sdvo_encoder = intel_attached_sdvo(&intel_connector->base);
|
||||||
|
|
||||||
|
sysfs_remove_link(&drm_connector->kdev->kobj,
|
||||||
|
sdvo_encoder->ddc.dev.kobj.name);
|
||||||
intel_connector_unregister(intel_connector);
|
intel_connector_unregister(intel_connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2379,6 +2381,12 @@ intel_sdvo_connector_init(struct intel_sdvo_connector *connector,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err1;
|
goto err1;
|
||||||
|
|
||||||
|
ret = sysfs_create_link(&drm_connector->kdev->kobj,
|
||||||
|
&encoder->ddc.dev.kobj,
|
||||||
|
encoder->ddc.dev.kobj.name);
|
||||||
|
if (ret < 0)
|
||||||
|
goto err2;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err2:
|
err2:
|
||||||
|
@ -85,9 +85,8 @@ void intel_pipe_update_start(struct intel_crtc *crtc)
|
|||||||
enum pipe pipe = crtc->pipe;
|
enum pipe pipe = crtc->pipe;
|
||||||
long timeout = msecs_to_jiffies_timeout(1);
|
long timeout = msecs_to_jiffies_timeout(1);
|
||||||
int scanline, min, max, vblank_start;
|
int scanline, min, max, vblank_start;
|
||||||
#if 0
|
wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
|
||||||
// wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base);
|
DEFINE_WAIT(wait);
|
||||||
// DEFINE_WAIT(wait);
|
|
||||||
|
|
||||||
vblank_start = adjusted_mode->crtc_vblank_start;
|
vblank_start = adjusted_mode->crtc_vblank_start;
|
||||||
if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
|
if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
|
||||||
@ -97,11 +96,13 @@ void intel_pipe_update_start(struct intel_crtc *crtc)
|
|||||||
min = vblank_start - usecs_to_scanlines(adjusted_mode, 100);
|
min = vblank_start - usecs_to_scanlines(adjusted_mode, 100);
|
||||||
max = vblank_start - 1;
|
max = vblank_start - 1;
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
if (min <= 0 || max <= 0)
|
if (min <= 0 || max <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// if (WARN_ON(drm_vblank_get(dev, pipe)))
|
if (WARN_ON(drm_crtc_vblank_get(&crtc->base)))
|
||||||
// return false;
|
return;
|
||||||
|
|
||||||
crtc->debug.min_vbl = min;
|
crtc->debug.min_vbl = min;
|
||||||
crtc->debug.max_vbl = max;
|
crtc->debug.max_vbl = max;
|
||||||
@ -125,15 +126,21 @@ void intel_pipe_update_start(struct intel_crtc *crtc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
schedule_timeout(timeout);
|
{
|
||||||
timeout = 0;
|
unsigned long expire;
|
||||||
// local_irq_disable();
|
expire = timeout + jiffies;
|
||||||
|
WaitEventTimeout(wait.evnt, timeout);;
|
||||||
|
timeout = expire - jiffies;
|
||||||
|
timeout = timeout < 0 ? 0 : timeout;
|
||||||
|
}
|
||||||
|
local_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
finish_wait(wq, &wait);
|
finish_wait(wq, &wait);
|
||||||
#endif
|
|
||||||
|
drm_crtc_vblank_put(&crtc->base);
|
||||||
|
|
||||||
crtc->debug.scanline_start = scanline;
|
crtc->debug.scanline_start = scanline;
|
||||||
crtc->debug.start_vbl_time = ktime_get();
|
crtc->debug.start_vbl_time = ktime_get();
|
||||||
@ -162,7 +169,7 @@ void intel_pipe_update_end(struct intel_crtc *crtc)
|
|||||||
|
|
||||||
trace_i915_pipe_update_end(crtc, end_vbl_count, scanline_end);
|
trace_i915_pipe_update_end(crtc, end_vbl_count, scanline_end);
|
||||||
|
|
||||||
// local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
if (crtc->debug.start_vbl_count &&
|
if (crtc->debug.start_vbl_count &&
|
||||||
crtc->debug.start_vbl_count != end_vbl_count) {
|
crtc->debug.start_vbl_count != end_vbl_count) {
|
||||||
|
@ -74,8 +74,6 @@ static int set_mode(struct drm_device *dev, struct drm_connector *connector,
|
|||||||
int stride;
|
int stride;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
drm_modeset_lock_all(dev);
|
drm_modeset_lock_all(dev);
|
||||||
|
|
||||||
list_for_each_entry(tmpc, &dev->mode_config.connector_list, head)
|
list_for_each_entry(tmpc, &dev->mode_config.connector_list, head)
|
||||||
@ -206,8 +204,6 @@ do_set:
|
|||||||
|
|
||||||
drm_modeset_unlock_all(dev);
|
drm_modeset_unlock_all(dev);
|
||||||
|
|
||||||
LEAVE();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,8 +219,6 @@ static int set_mode_ex(struct drm_device *dev,
|
|||||||
int stride;
|
int stride;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
drm_modeset_lock_all(dev);
|
drm_modeset_lock_all(dev);
|
||||||
|
|
||||||
list_for_each_entry(tmpc, &dev->mode_config.connector_list, head)
|
list_for_each_entry(tmpc, &dev->mode_config.connector_list, head)
|
||||||
@ -322,8 +316,6 @@ ENTER();
|
|||||||
|
|
||||||
drm_modeset_unlock_all(dev);
|
drm_modeset_unlock_all(dev);
|
||||||
|
|
||||||
LEAVE();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,10 +414,7 @@ static struct drm_connector* get_cmdline_connector(struct drm_device *dev, const
|
|||||||
static int choose_config(struct drm_device *dev, struct drm_connector **boot_connector,
|
static int choose_config(struct drm_device *dev, struct drm_connector **boot_connector,
|
||||||
struct drm_crtc **boot_crtc)
|
struct drm_crtc **boot_crtc)
|
||||||
{
|
{
|
||||||
const struct drm_connector_helper_funcs *connector_funcs;
|
struct drm_connector *connector;
|
||||||
struct drm_connector *connector = NULL;
|
|
||||||
struct drm_encoder *encoder = NULL;
|
|
||||||
struct drm_crtc *crtc = NULL;
|
|
||||||
|
|
||||||
if((i915.cmdline_mode != NULL) && (*i915.cmdline_mode != 0))
|
if((i915.cmdline_mode != NULL) && (*i915.cmdline_mode != 0))
|
||||||
{
|
{
|
||||||
@ -451,6 +440,7 @@ static int choose_config(struct drm_device *dev, struct drm_connector **boot_con
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static int get_boot_mode(struct drm_connector *connector, videomode_t *usermode)
|
static int get_boot_mode(struct drm_connector *connector, videomode_t *usermode)
|
||||||
{
|
{
|
||||||
struct drm_display_mode *mode;
|
struct drm_display_mode *mode;
|
||||||
@ -481,8 +471,6 @@ int init_display_kms(struct drm_device *dev, videomode_t *usermode)
|
|||||||
u32 ifl;
|
u32 ifl;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ENTER();
|
|
||||||
|
|
||||||
mutex_lock(&dev->mode_config.mutex);
|
mutex_lock(&dev->mode_config.mutex);
|
||||||
ret = choose_config(dev, &connector, &crtc);
|
ret = choose_config(dev, &connector, &crtc);
|
||||||
if(ret)
|
if(ret)
|
||||||
@ -571,8 +559,6 @@ ENTER();
|
|||||||
err = init_bitmaps();
|
err = init_bitmaps();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LEAVE();
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -581,13 +567,12 @@ int set_cmdline_mode_ext(struct drm_device *dev, const char *cmdline)
|
|||||||
{
|
{
|
||||||
struct drm_connector_helper_funcs *connector_funcs;
|
struct drm_connector_helper_funcs *connector_funcs;
|
||||||
struct drm_connector *connector;
|
struct drm_connector *connector;
|
||||||
struct drm_cmdline_mode cmd_mode;
|
struct drm_cmdline_mode cmd_mode = {0};
|
||||||
struct drm_display_mode *mode;
|
struct drm_display_mode *mode;
|
||||||
char *mode_option;
|
char *mode_option;
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
char con_edid[128];
|
char con_edid[128];
|
||||||
|
|
||||||
ENTER();
|
|
||||||
if((cmdline == NULL) || (*cmdline == 0))
|
if((cmdline == NULL) || (*cmdline == 0))
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
@ -604,8 +589,6 @@ ENTER();
|
|||||||
|
|
||||||
mode_option++;
|
mode_option++;
|
||||||
|
|
||||||
__builtin_memset(&cmd_mode, 0, sizeof(cmd_mode));
|
|
||||||
|
|
||||||
if( !drm_mode_parse_command_line_for_connector(mode_option, connector, &cmd_mode))
|
if( !drm_mode_parse_command_line_for_connector(mode_option, connector, &cmd_mode))
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
|
|
||||||
@ -633,10 +616,69 @@ ENTER();
|
|||||||
|
|
||||||
drm_mode_destroy(dev, mode);
|
drm_mode_destroy(dev, mode);
|
||||||
|
|
||||||
LEAVE();
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void list_connectors(struct drm_device *dev)
|
||||||
|
{
|
||||||
|
struct drm_connector *connector;
|
||||||
|
char con_edid[128];
|
||||||
|
|
||||||
|
mutex_lock(&dev->mode_config.mutex);
|
||||||
|
list_for_each_entry(connector, &dev->mode_config.connector_list, head)
|
||||||
|
{
|
||||||
|
if( connector->status != connector_status_connected)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
memcpy(con_edid, connector->edid_blob_ptr->data, 128);
|
||||||
|
|
||||||
|
if(connector == os_display->connector)
|
||||||
|
{
|
||||||
|
printf("%s mode %dx%d connected %s model %x serial number %u\n",
|
||||||
|
connector->name, os_display->width, os_display->height,
|
||||||
|
manufacturer_name(con_edid + 0x08),
|
||||||
|
(unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
|
||||||
|
(unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
|
||||||
|
+ (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s connected: %s model %x serial number %u\n",
|
||||||
|
connector->name, manufacturer_name(con_edid + 0x08),
|
||||||
|
(unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
|
||||||
|
(unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
|
||||||
|
+ (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
int list_connector_modes(struct drm_device *dev, const char* name)
|
||||||
|
{
|
||||||
|
struct drm_connector *connector;
|
||||||
|
struct drm_display_mode *drmmode;
|
||||||
|
|
||||||
|
mutex_lock(&dev->mode_config.mutex);
|
||||||
|
|
||||||
|
connector = get_cmdline_connector(dev, name);
|
||||||
|
if(connector == NULL)
|
||||||
|
{
|
||||||
|
mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
return EINVAL;
|
||||||
|
};
|
||||||
|
|
||||||
|
printf("connector %s probed modes :\n", connector->name);
|
||||||
|
|
||||||
|
list_for_each_entry(drmmode, &connector->modes, head)
|
||||||
|
{
|
||||||
|
printf("%dx%d@%d\n", drmmode->hdisplay, drmmode->vdisplay, drm_mode_vrefresh(drmmode));
|
||||||
|
};
|
||||||
|
|
||||||
|
mutex_unlock(&dev->mode_config.mutex);
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
int get_videomodes(videomode_t *mode, int *count)
|
int get_videomodes(videomode_t *mode, int *count)
|
||||||
{
|
{
|
||||||
int err = -1;
|
int err = -1;
|
||||||
|
@ -277,6 +277,7 @@ int do_command_line(const char* usercmd)
|
|||||||
char *cmdline;
|
char *cmdline;
|
||||||
int argc, i, c;
|
int argc, i, c;
|
||||||
char **argv;
|
char **argv;
|
||||||
|
int retval = 0;
|
||||||
|
|
||||||
if( (usercmd == NULL) || (*usercmd == 0) )
|
if( (usercmd == NULL) || (*usercmd == 0) )
|
||||||
return 1;
|
return 1;
|
||||||
@ -295,6 +296,8 @@ int do_command_line(const char* usercmd)
|
|||||||
{
|
{
|
||||||
static struct option long_options[] =
|
static struct option long_options[] =
|
||||||
{
|
{
|
||||||
|
{"list-connectors", no_argument, 0, OPTION_CONNECTORS},
|
||||||
|
{"list-connector-modes", required_argument, 0, OPTION_CONN_MODES},
|
||||||
{"video", required_argument, 0, 'v'},
|
{"video", required_argument, 0, 'v'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
@ -311,14 +314,22 @@ int do_command_line(const char* usercmd)
|
|||||||
{
|
{
|
||||||
case 'v':
|
case 'v':
|
||||||
printf("cmdline_mode %s\n",optarg);
|
printf("cmdline_mode %s\n",optarg);
|
||||||
set_cmdline_mode_ext(main_device, optarg);
|
retval = set_cmdline_mode_ext(main_device, optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPTION_CONNECTORS:
|
||||||
|
list_connectors(main_device);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPTION_CONN_MODES:
|
||||||
|
retval = list_connector_modes(main_device, optarg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
__builtin_free(argv);
|
__builtin_free(argv);
|
||||||
__builtin_free(cmdline);
|
__builtin_free(cmdline);
|
||||||
|
|
||||||
return 0;
|
return retval;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CURRENT_API 0x0200 /* 2.00 */
|
#define CURRENT_API 0x0200 /* 2.00 */
|
||||||
@ -856,31 +867,3 @@ static char* parse_mode(char *p, videomode_t *mode)
|
|||||||
return p;
|
return p;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <linux/math64.h>
|
|
||||||
|
|
||||||
u64 long_div(u64 dividend, u64 divisor)
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
u32 high = divisor >> 32;
|
|
||||||
u64 quot;
|
|
||||||
|
|
||||||
if (high == 0) {
|
|
||||||
quot = div_u64(dividend, divisor);
|
|
||||||
} else {
|
|
||||||
int n = 1 + fls(high);
|
|
||||||
quot = div_u64(dividend >> n, divisor >> n);
|
|
||||||
|
|
||||||
if (quot != 0)
|
|
||||||
quot--;
|
|
||||||
if ((dividend - quot * divisor) >= divisor)
|
|
||||||
quot++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return quot;
|
|
||||||
#endif
|
|
||||||
// return dividend / divisor;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -973,34 +973,6 @@ int split_cmdline(char *cmdline, char **argv)
|
|||||||
return argc;
|
return argc;
|
||||||
};
|
};
|
||||||
|
|
||||||
char *strstr(const char *cs, const char *ct)
|
|
||||||
{
|
|
||||||
int d0, d1;
|
|
||||||
register char *__res;
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"movl %6,%%edi\n\t"
|
|
||||||
"repne\n\t"
|
|
||||||
"scasb\n\t"
|
|
||||||
"notl %%ecx\n\t"
|
|
||||||
"decl %%ecx\n\t" /* NOTE! This also sets Z if searchstring='' */
|
|
||||||
"movl %%ecx,%%edx\n"
|
|
||||||
"1:\tmovl %6,%%edi\n\t"
|
|
||||||
"movl %%esi,%%eax\n\t"
|
|
||||||
"movl %%edx,%%ecx\n\t"
|
|
||||||
"repe\n\t"
|
|
||||||
"cmpsb\n\t"
|
|
||||||
"je 2f\n\t" /* also works for empty string, see above */
|
|
||||||
"xchgl %%eax,%%esi\n\t"
|
|
||||||
"incl %%esi\n\t"
|
|
||||||
"cmpb $0,-1(%%eax)\n\t"
|
|
||||||
"jne 1b\n\t"
|
|
||||||
"xorl %%eax,%%eax\n\t"
|
|
||||||
"2:"
|
|
||||||
: "=a" (__res), "=&c" (d0), "=&S" (d1)
|
|
||||||
: "0" (0), "1" (0xffffffff), "2" (cs), "g" (ct)
|
|
||||||
: "dx", "di");
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
fb_get_options(const char *name, char **option)
|
fb_get_options(const char *name, char **option)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user