[Intel-gfx] [RFC/PATCH] render reclock quirks
Vedran Rodic
vrodic at gmail.com
Tue Oct 13 11:30:49 CEST 2009
Is reclocking supported on 945GM?
Thanks
On Fri, Oct 9, 2009 at 10:08 PM, Andrew Lutomirski <luto at mit.edu> wrote:
> Add a quirk to enable render reclocking on a Thinkpad X200s.
>
> Signed-off-by: Andy Lutomirski <luto at mit.edu>
> ---
> This probably shouldn't be applied as is, but it might be useful after
> some massaging.
>
> It also changes the !SUPPORTS_EDP logic, which used to disable render
> reclocking on everything that doesn't support eDP (which is everything
> shipping, AFAICT).
>
> It might be a better idea to just say "i915: VBIOS disables some power
> saving features. See Documentation/whatever.txt if you want to help
> us enable it."
>
> --Andy
>
>
> diff --git a/drivers/gpu/drm/i915/intel_bios.c
> b/drivers/gpu/drm/i915/intel_bios.c
> index 4337414..6a4bff5 100644
> --- a/drivers/gpu/drm/i915/intel_bios.c
> +++ b/drivers/gpu/drm/i915/intel_bios.c
> @@ -29,10 +29,15 @@
> #include "i915_drm.h"
> #include "i915_drv.h"
> #include "intel_bios.h"
> +#include <linux/dmi.h>
>
> #define SLAVE_ADDR1 0x70
> #define SLAVE_ADDR2 0x72
>
> +static bool render_reclock_quirk_avail;
> +static bool force_render_reclock;
> +module_param(force_render_reclock, bool, 0400);
> +
> static void *
> find_section(struct bdb_header *bdb, int section_id)
> {
> @@ -351,21 +356,51 @@ parse_driver_features(struct drm_i915_private *dev_priv,
> struct drm_device *dev = dev_priv->dev;
> struct bdb_driver_features *driver;
>
> - /* set default for chips without eDP */
> - if (!SUPPORTS_EDP(dev)) {
> - dev_priv->edp_support = 0;
> - return;
> - }
> -
> + /* Due to quirks, we continue even if driver == NULL. */
> driver = find_section(bdb, BDB_DRIVER_FEATURES);
> - if (!driver)
> - return;
>
> - if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
> + if (driver && SUPPORTS_EDP(dev) && driver->lvds_config ==
> BDB_DRIVER_FEATURE_EDP)
> dev_priv->edp_support = 1;
> + else
> + dev_priv->edp_support = 0;
>
> - if (driver->dual_frequency)
> + if (driver && driver->dual_frequency) {
> + dev_priv->render_reclock_avail = true;
> + } else if (render_reclock_quirk_avail) {
> + dev_priv->render_reclock_avail = true;
> + printk(KERN_INFO "i915: Quirk-enabling render reclocking\n");
> + } else if (force_render_reclock) {
> dev_priv->render_reclock_avail = true;
> + printk(KERN_WARNING "i915: Force-enabled render reclocking. If
> this works, please\n"
> + " email dmesg and dmidecode output to intel-gfx at lists.freedesktop.org\n");
> + } else {
> + printk(KERN_INFO "i915: Your VBIOS does not support render reclocking.\n"
> + " Set the module parameter force_render_reclock=1 to try
> forcing it on.");
> + }
> +}
> +
> +static int render_reclock_quirk(const struct dmi_system_id *d)
> +{
> + render_reclock_quirk_avail = true;
> + return 0;
> +}
> +
> +static void
> +load_quirks(void)
> +{
> + static const struct dmi_system_id sysids[] = {
> + {
> + .ident = "Lenovo X200s",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
> + DMI_MATCH(DMI_PRODUCT_VERSION,
> "ThinkPad X200s"),
> + },
> + .callback = render_reclock_quirk,
> + },
> + {}
> + };
> +
> + dmi_check_system(sysids);
> }
>
> /**
> @@ -393,6 +428,8 @@ intel_init_bios(struct drm_device *dev)
> size_t size;
> int i;
>
> + load_quirks();
> +
> bios = pci_map_rom(pdev, &size);
> if (!bios)
> return -1;
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
More information about the Intel-gfx
mailing list