drm/i915: ignore LVDS on intel graphics systems that lie about having it
There are a number of small form factor desktop systems with Intel mobile graphics chips that lie and say they have an LVDS. With kernel mode-setting, this becomes a problem, and makes native resolution boot go haywire -- for example, my Dell Studio Hybrid, hooked to a 1920x1080 display claims to have a 1024x768 LVDS, and the resulting graphical boot on the 1920x1080 display uses only the top left 1024x768, and auto-configured X will end up only 1024x768 as well. With this change, graphical boot and X both do 1920x1080 as expected. Note that we're simply embracing and extending the early bail-out code in place for the Mac Mini here. The xorg intel driver uses pci subsystem device and vendor id for matching, while we're using dmi lookups here. The MSI addition is courtesy of and tested by Bill Nottingham. Signed-off-by: Jarod Wilson <jarod@redhat.com> Tested-by: Bill Nottingham <notting@redhat.com> Signed-off-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Родитель
802c7eb646
Коммит
425d244c86
|
@ -384,7 +384,51 @@ static const struct drm_encoder_funcs intel_lvds_enc_funcs = {
|
||||||
.destroy = intel_lvds_enc_destroy,
|
.destroy = intel_lvds_enc_destroy,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int __init intel_no_lvds_dmi_callback(const struct dmi_system_id *id)
|
||||||
|
{
|
||||||
|
DRM_DEBUG("Skipping LVDS initialization for %s\n", id->ident);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* These systems claim to have LVDS, but really don't */
|
||||||
|
static const struct dmi_system_id __initdata intel_no_lvds[] = {
|
||||||
|
{
|
||||||
|
.callback = intel_no_lvds_dmi_callback,
|
||||||
|
.ident = "Apple Mac Mini (Core series)",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.callback = intel_no_lvds_dmi_callback,
|
||||||
|
.ident = "Apple Mac Mini (Core 2 series)",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini2,1"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.callback = intel_no_lvds_dmi_callback,
|
||||||
|
.ident = "MSI IM-945GSE-A",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "MSI"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "A9830IMS"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.callback = intel_no_lvds_dmi_callback,
|
||||||
|
.ident = "Dell Studio Hybrid",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Studio Hybrid 140g"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
/* FIXME: add a check for the Aopen Mini PC */
|
||||||
|
|
||||||
|
{ } /* terminating entry */
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* intel_lvds_init - setup LVDS connectors on this device
|
* intel_lvds_init - setup LVDS connectors on this device
|
||||||
|
@ -404,15 +448,9 @@ void intel_lvds_init(struct drm_device *dev)
|
||||||
u32 lvds;
|
u32 lvds;
|
||||||
int pipe;
|
int pipe;
|
||||||
|
|
||||||
/* Blacklist machines that we know falsely report LVDS. */
|
/* Skip init on machines we know falsely report LVDS */
|
||||||
/* FIXME: add a check for the Aopen Mini PC */
|
if (dmi_check_system(intel_no_lvds))
|
||||||
|
|
||||||
/* Apple Mac Mini Core Duo and Mac Mini Core 2 Duo */
|
|
||||||
if(dmi_match(DMI_PRODUCT_NAME, "Macmini1,1") ||
|
|
||||||
dmi_match(DMI_PRODUCT_NAME, "Macmini2,1")) {
|
|
||||||
DRM_DEBUG("Skipping LVDS initialization for Apple Mac Mini\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
|
intel_output = kzalloc(sizeof(struct intel_output), GFP_KERNEL);
|
||||||
if (!intel_output) {
|
if (!intel_output) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче