]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Fix 400 MHz FSB readout on elk
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 14 May 2020 12:38:36 +0000 (15:38 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 19 May 2020 09:06:55 +0000 (12:06 +0300)
Looks like elk redefines some of the CLKCFG FSB values to
make room for 400 MHz FSB. The setting overlaps with one of
the 266MHz settings (which is even documented in the ctg docs,
and cofirmed to be correct on my ctg). So we limit the special
case to elk only.

Though it might also be that we have some kind of desktop vs.
mobile difference going on here as eg. both g35 and elk
use 0x0 for the 266 MHz setting, vs. 0x6 used by ctg). The
g35 doesn't let me select 400MHz for the FSB strap so can't
confirm which way it would go here. But anyways as it seems
only elk has the 400MHz option we shouldn't lose anything
by limiting the special case to it alone.

My earlier experiments on this appear to have been nonsense as
the comment I added claims that FSB strap of 400MHz results in
a value of 0x4, but I've now retested it and I definitely get a
value of 0x6 instead. So let's remove that bogus comment.

v2: s/_ELK/_ALT/ in the define in anticipation of a full
    mobile vs. desktop CLKCFG split

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200514123838.3017-1-ville.syrjala@linux.intel.com
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/display/intel_cdclk.c
drivers/gpu/drm/i915/i915_reg.h

index 979a0241fdcbf3c0176833a3587f58dc549d9351..c17cf611625caf77d643de118fd6ec57eeba4463 100644 (file)
@@ -2705,8 +2705,13 @@ static int g4x_hrawclk(struct drm_i915_private *dev_priv)
        u32 clkcfg;
 
        /* hrawclock is 1/4 the FSB frequency */
-       clkcfg = intel_de_read(dev_priv, CLKCFG);
-       switch (clkcfg & CLKCFG_FSB_MASK) {
+       clkcfg = intel_de_read(dev_priv, CLKCFG) & CLKCFG_FSB_MASK;
+
+       /* ELK seems to redefine some of the values */
+       if (IS_G45(dev_priv) && clkcfg == CLKCFG_FSB_1600_ALT)
+               return 400000;
+
+       switch (clkcfg) {
        case CLKCFG_FSB_400:
                return 100000;
        case CLKCFG_FSB_533:
index 6c076a24eb822fa4fcfbc4a575d852cf7b6b0cc2..10187780e06ca8ad0f20572f4aad9fec6d5cc833 100644 (file)
@@ -3775,12 +3775,8 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define CLKCFG_FSB_1067                                        (6 << 0)        /* hrawclk 266 */
 #define CLKCFG_FSB_1067_ALT                            (0 << 0)        /* hrawclk 266 */
 #define CLKCFG_FSB_1333                                        (7 << 0)        /* hrawclk 333 */
-/*
- * Note that on at least on ELK the below value is reported for both
- * 333 and 400 MHz BIOS FSB setting, but given that the gmch datasheet
- * lists only 200/266/333 MHz FSB as supported let's decode it as 333 MHz.
- */
 #define CLKCFG_FSB_1333_ALT                            (4 << 0)        /* hrawclk 333 */
+#define CLKCFG_FSB_1600_ALT                            (6 << 0)        /* hrawclk 400 */
 #define CLKCFG_FSB_MASK                                        (7 << 0)
 #define CLKCFG_MEM_533                                 (1 << 4)
 #define CLKCFG_MEM_667                                 (2 << 4)