Commit 54561b23 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Polish skl_is_16gb_dimm()

Pass the dimm struct to skl_is_16gb_dimm() rather than passing each
value separately. And let's replace the hardcoded set of values with
some simple arithmetic.

Also fix the byte vs. bit inconsistency in the debug message,
and polish the wording otherwise as well.

v2: Deobfuscate the math (Chris)
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190306203551.24592-4-ville.syrjala@linux.intel.com
parent ea411e6b
...@@ -1068,6 +1068,11 @@ static void intel_sanitize_options(struct drm_i915_private *dev_priv) ...@@ -1068,6 +1068,11 @@ static void intel_sanitize_options(struct drm_i915_private *dev_priv)
intel_gvt_sanitize_options(dev_priv); intel_gvt_sanitize_options(dev_priv);
} }
static int intel_dimm_num_devices(const struct dram_dimm_info *dimm)
{
return dimm->ranks * 64 / (dimm->width ?: 1);
}
/* Returns total GB for the whole DIMM */ /* Returns total GB for the whole DIMM */
static int skl_get_dimm_size(u16 val) static int skl_get_dimm_size(u16 val)
{ {
...@@ -1102,18 +1107,10 @@ static int skl_get_dimm_ranks(u16 val) ...@@ -1102,18 +1107,10 @@ static int skl_get_dimm_ranks(u16 val)
} }
static bool static bool
skl_is_16gb_dimm(u8 ranks, u8 size, u8 width) skl_is_16gb_dimm(const struct dram_dimm_info *dimm)
{ {
if (ranks == 1 && width == 8 && size == 16) /* Convert total GB to Gb per DRAM device */
return true; return 8 * dimm->size / (intel_dimm_num_devices(dimm) ?: 1) == 16;
else if (ranks == 2 && width == 8 && size == 32)
return true;
else if (ranks == 1 && width == 16 && size == 8)
return true;
else if (ranks == 2 && width == 16 && size == 16)
return true;
return false;
} }
static int static int
...@@ -1143,10 +1140,9 @@ skl_dram_get_channel_info(struct dram_channel_info *ch, u32 val) ...@@ -1143,10 +1140,9 @@ skl_dram_get_channel_info(struct dram_channel_info *ch, u32 val)
else else
ch->ranks = 1; ch->ranks = 1;
ch->is_16gb_dimm = skl_is_16gb_dimm(ch->l_info.ranks, ch->l_info.size, ch->is_16gb_dimm =
ch->l_info.width) || skl_is_16gb_dimm(&ch->l_info) ||
skl_is_16gb_dimm(ch->s_info.ranks, ch->s_info.size, skl_is_16gb_dimm(&ch->s_info);
ch->s_info.width);
DRM_DEBUG_KMS("(size:width:ranks) L(%uGB:X%u:%u) S(%uGB:X%u:%u)\n", DRM_DEBUG_KMS("(size:width:ranks) L(%uGB:X%u:%u) S(%uGB:X%u:%u)\n",
ch->l_info.size, ch->l_info.width, ch->l_info.ranks, ch->l_info.size, ch->l_info.width, ch->l_info.ranks,
...@@ -1364,7 +1360,7 @@ intel_get_dram_info(struct drm_i915_private *dev_priv) ...@@ -1364,7 +1360,7 @@ intel_get_dram_info(struct drm_i915_private *dev_priv)
sprintf(bandwidth_str, "unknown"); sprintf(bandwidth_str, "unknown");
DRM_DEBUG_KMS("DRAM bandwidth:%s, total-channels: %u\n", DRM_DEBUG_KMS("DRAM bandwidth:%s, total-channels: %u\n",
bandwidth_str, dram_info->num_channels); bandwidth_str, dram_info->num_channels);
DRM_DEBUG_KMS("DRAM ranks: %u, 16GB-dimm:%s\n", DRM_DEBUG_KMS("DRAM ranks: %u, 16Gb DIMMs: %s\n",
dram_info->ranks, yesno(dram_info->is_16gb_dimm)); dram_info->ranks, yesno(dram_info->is_16gb_dimm));
} }
......
...@@ -2052,10 +2052,12 @@ struct drm_i915_private { ...@@ -2052,10 +2052,12 @@ struct drm_i915_private {
*/ */
}; };
struct dram_dimm_info {
u8 size, width, ranks;
};
struct dram_channel_info { struct dram_channel_info {
struct info { struct dram_dimm_info l_info, s_info;
u8 size, width, ranks;
} l_info, s_info;
u8 ranks; u8 ranks;
bool is_16gb_dimm; bool is_16gb_dimm;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment