Commit ff9bc20c authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915/bios: Use per-device debugs for VBT related stuff

Switch to drm_dbg_kms() in the VBT code so we see which
device generated the debugs. Need to plumb i915 a bit deeper
to make that happen.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240208151720.7866-8-ville.syrjala@linux.intel.comReviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
parent abe6af16
...@@ -1759,7 +1759,8 @@ parse_mipi_config(struct drm_i915_private *i915, ...@@ -1759,7 +1759,8 @@ parse_mipi_config(struct drm_i915_private *i915,
/* Find the sequence block and size for the given panel. */ /* Find the sequence block and size for the given panel. */
static const u8 * static const u8 *
find_panel_sequence_block(const struct bdb_mipi_sequence *sequence, find_panel_sequence_block(struct drm_i915_private *i915,
const struct bdb_mipi_sequence *sequence,
u16 panel_id, u32 *seq_size) u16 panel_id, u32 *seq_size)
{ {
u32 total = get_blocksize(sequence); u32 total = get_blocksize(sequence);
...@@ -1776,7 +1777,7 @@ find_panel_sequence_block(const struct bdb_mipi_sequence *sequence, ...@@ -1776,7 +1777,7 @@ find_panel_sequence_block(const struct bdb_mipi_sequence *sequence,
for (i = 0; i < MAX_MIPI_CONFIGURATIONS && index < total; i++) { for (i = 0; i < MAX_MIPI_CONFIGURATIONS && index < total; i++) {
if (index + header_size > total) { if (index + header_size > total) {
DRM_ERROR("Invalid sequence block (header)\n"); drm_err(&i915->drm, "Invalid sequence block (header)\n");
return NULL; return NULL;
} }
...@@ -1789,7 +1790,7 @@ find_panel_sequence_block(const struct bdb_mipi_sequence *sequence, ...@@ -1789,7 +1790,7 @@ find_panel_sequence_block(const struct bdb_mipi_sequence *sequence,
index += header_size; index += header_size;
if (index + current_size > total) { if (index + current_size > total) {
DRM_ERROR("Invalid sequence block\n"); drm_err(&i915->drm, "Invalid sequence block\n");
return NULL; return NULL;
} }
...@@ -1801,12 +1802,13 @@ find_panel_sequence_block(const struct bdb_mipi_sequence *sequence, ...@@ -1801,12 +1802,13 @@ find_panel_sequence_block(const struct bdb_mipi_sequence *sequence,
index += current_size; index += current_size;
} }
DRM_ERROR("Sequence block detected but no valid configuration\n"); drm_err(&i915->drm, "Sequence block detected but no valid configuration\n");
return NULL; return NULL;
} }
static int goto_next_sequence(const u8 *data, int index, int total) static int goto_next_sequence(struct drm_i915_private *i915,
const u8 *data, int index, int total)
{ {
u16 len; u16 len;
...@@ -1836,7 +1838,7 @@ static int goto_next_sequence(const u8 *data, int index, int total) ...@@ -1836,7 +1838,7 @@ static int goto_next_sequence(const u8 *data, int index, int total)
len = *(data + index + 6) + 7; len = *(data + index + 6) + 7;
break; break;
default: default:
DRM_ERROR("Unknown operation byte\n"); drm_err(&i915->drm, "Unknown operation byte\n");
return 0; return 0;
} }
} }
...@@ -1844,7 +1846,8 @@ static int goto_next_sequence(const u8 *data, int index, int total) ...@@ -1844,7 +1846,8 @@ static int goto_next_sequence(const u8 *data, int index, int total)
return 0; return 0;
} }
static int goto_next_sequence_v3(const u8 *data, int index, int total) static int goto_next_sequence_v3(struct drm_i915_private *i915,
const u8 *data, int index, int total)
{ {
int seq_end; int seq_end;
u16 len; u16 len;
...@@ -1855,7 +1858,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total) ...@@ -1855,7 +1858,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total)
* checking on the structure. * checking on the structure.
*/ */
if (total < 5) { if (total < 5) {
DRM_ERROR("Too small sequence size\n"); drm_err(&i915->drm, "Too small sequence size\n");
return 0; return 0;
} }
...@@ -1872,7 +1875,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total) ...@@ -1872,7 +1875,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total)
seq_end = index + size_of_sequence; seq_end = index + size_of_sequence;
if (seq_end > total) { if (seq_end > total) {
DRM_ERROR("Invalid sequence size\n"); drm_err(&i915->drm, "Invalid sequence size\n");
return 0; return 0;
} }
...@@ -1882,7 +1885,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total) ...@@ -1882,7 +1885,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total)
if (operation_byte == MIPI_SEQ_ELEM_END) { if (operation_byte == MIPI_SEQ_ELEM_END) {
if (index != seq_end) { if (index != seq_end) {
DRM_ERROR("Invalid element structure\n"); drm_err(&i915->drm, "Invalid element structure\n");
return 0; return 0;
} }
return index; return index;
...@@ -1904,7 +1907,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total) ...@@ -1904,7 +1907,7 @@ static int goto_next_sequence_v3(const u8 *data, int index, int total)
case MIPI_SEQ_ELEM_PMIC: case MIPI_SEQ_ELEM_PMIC:
break; break;
default: default:
DRM_ERROR("Unknown operation byte %u\n", drm_err(&i915->drm, "Unknown operation byte %u\n",
operation_byte); operation_byte);
break; break;
} }
...@@ -2030,7 +2033,7 @@ parse_mipi_sequence(struct drm_i915_private *i915, ...@@ -2030,7 +2033,7 @@ parse_mipi_sequence(struct drm_i915_private *i915,
drm_dbg(&i915->drm, "Found MIPI sequence block v%u\n", drm_dbg(&i915->drm, "Found MIPI sequence block v%u\n",
sequence->version); sequence->version);
seq_data = find_panel_sequence_block(sequence, panel_type, &seq_size); seq_data = find_panel_sequence_block(i915, sequence, panel_type, &seq_size);
if (!seq_data) if (!seq_data)
return; return;
...@@ -2058,9 +2061,9 @@ parse_mipi_sequence(struct drm_i915_private *i915, ...@@ -2058,9 +2061,9 @@ parse_mipi_sequence(struct drm_i915_private *i915,
panel->vbt.dsi.sequence[seq_id] = data + index; panel->vbt.dsi.sequence[seq_id] = data + index;
if (sequence->version >= 3) if (sequence->version >= 3)
index = goto_next_sequence_v3(data, index, seq_size); index = goto_next_sequence_v3(i915, data, index, seq_size);
else else
index = goto_next_sequence(data, index, seq_size); index = goto_next_sequence(i915, data, index, seq_size);
if (!index) { if (!index) {
drm_err(&i915->drm, "Invalid sequence %u\n", drm_err(&i915->drm, "Invalid sequence %u\n",
seq_id); seq_id);
...@@ -2135,12 +2138,13 @@ parse_compression_parameters(struct drm_i915_private *i915) ...@@ -2135,12 +2138,13 @@ parse_compression_parameters(struct drm_i915_private *i915)
} }
} }
static u8 translate_iboost(u8 val) static u8 translate_iboost(struct drm_i915_private *i915, u8 val)
{ {
static const u8 mapping[] = { 1, 3, 7 }; /* See VBT spec */ static const u8 mapping[] = { 1, 3, 7 }; /* See VBT spec */
if (val >= ARRAY_SIZE(mapping)) { if (val >= ARRAY_SIZE(mapping)) {
DRM_DEBUG_KMS("Unsupported I_boost value found in VBT (%d), display may not work properly\n", val); drm_dbg_kms(&i915->drm,
"Unsupported I_boost value found in VBT (%d), display may not work properly\n", val);
return 0; return 0;
} }
return mapping[val]; return mapping[val];
...@@ -2897,12 +2901,14 @@ static const struct bdb_header *get_bdb_header(const struct vbt_header *vbt) ...@@ -2897,12 +2901,14 @@ static const struct bdb_header *get_bdb_header(const struct vbt_header *vbt)
/** /**
* intel_bios_is_valid_vbt - does the given buffer contain a valid VBT * intel_bios_is_valid_vbt - does the given buffer contain a valid VBT
* @i915: the device
* @buf: pointer to a buffer to validate * @buf: pointer to a buffer to validate
* @size: size of the buffer * @size: size of the buffer
* *
* Returns true on valid VBT. * Returns true on valid VBT.
*/ */
bool intel_bios_is_valid_vbt(const void *buf, size_t size) bool intel_bios_is_valid_vbt(struct drm_i915_private *i915,
const void *buf, size_t size)
{ {
const struct vbt_header *vbt = buf; const struct vbt_header *vbt = buf;
const struct bdb_header *bdb; const struct bdb_header *bdb;
...@@ -2911,17 +2917,17 @@ bool intel_bios_is_valid_vbt(const void *buf, size_t size) ...@@ -2911,17 +2917,17 @@ bool intel_bios_is_valid_vbt(const void *buf, size_t size)
return false; return false;
if (sizeof(struct vbt_header) > size) { if (sizeof(struct vbt_header) > size) {
DRM_DEBUG_KMS("VBT header incomplete\n"); drm_dbg_kms(&i915->drm, "VBT header incomplete\n");
return false; return false;
} }
if (memcmp(vbt->signature, "$VBT", 4)) { if (memcmp(vbt->signature, "$VBT", 4)) {
DRM_DEBUG_KMS("VBT invalid signature\n"); drm_dbg_kms(&i915->drm, "VBT invalid signature\n");
return false; return false;
} }
if (vbt->vbt_size > size) { if (vbt->vbt_size > size) {
DRM_DEBUG_KMS("VBT incomplete (vbt_size overflows)\n"); drm_dbg_kms(&i915->drm, "VBT incomplete (vbt_size overflows)\n");
return false; return false;
} }
...@@ -2931,13 +2937,13 @@ bool intel_bios_is_valid_vbt(const void *buf, size_t size) ...@@ -2931,13 +2937,13 @@ bool intel_bios_is_valid_vbt(const void *buf, size_t size)
vbt->bdb_offset, vbt->bdb_offset,
sizeof(struct bdb_header), sizeof(struct bdb_header),
size)) { size)) {
DRM_DEBUG_KMS("BDB header incomplete\n"); drm_dbg_kms(&i915->drm, "BDB header incomplete\n");
return false; return false;
} }
bdb = get_bdb_header(vbt); bdb = get_bdb_header(vbt);
if (range_overflows_t(size_t, vbt->bdb_offset, bdb->bdb_size, size)) { if (range_overflows_t(size_t, vbt->bdb_offset, bdb->bdb_size, size)) {
DRM_DEBUG_KMS("BDB incomplete\n"); drm_dbg_kms(&i915->drm, "BDB incomplete\n");
return false; return false;
} }
...@@ -2989,7 +2995,7 @@ static struct vbt_header *spi_oprom_get_vbt(struct drm_i915_private *i915) ...@@ -2989,7 +2995,7 @@ static struct vbt_header *spi_oprom_get_vbt(struct drm_i915_private *i915)
for (count = 0; count < vbt_size; count += 4) for (count = 0; count < vbt_size; count += 4)
*(vbt + store++) = intel_spi_read(&i915->uncore, found + count); *(vbt + store++) = intel_spi_read(&i915->uncore, found + count);
if (!intel_bios_is_valid_vbt(vbt, vbt_size)) if (!intel_bios_is_valid_vbt(i915, vbt, vbt_size))
goto err_free_vbt; goto err_free_vbt;
drm_dbg_kms(&i915->drm, "Found valid VBT in SPI flash\n"); drm_dbg_kms(&i915->drm, "Found valid VBT in SPI flash\n");
...@@ -3046,7 +3052,7 @@ static struct vbt_header *oprom_get_vbt(struct drm_i915_private *i915) ...@@ -3046,7 +3052,7 @@ static struct vbt_header *oprom_get_vbt(struct drm_i915_private *i915)
memcpy_fromio(vbt, p, vbt_size); memcpy_fromio(vbt, p, vbt_size);
if (!intel_bios_is_valid_vbt(vbt, vbt_size)) if (!intel_bios_is_valid_vbt(i915, vbt, vbt_size))
goto err_free_vbt; goto err_free_vbt;
pci_unmap_rom(pdev, oprom); pci_unmap_rom(pdev, oprom);
...@@ -3398,6 +3404,7 @@ static void fill_dsc(struct intel_crtc_state *crtc_state, ...@@ -3398,6 +3404,7 @@ static void fill_dsc(struct intel_crtc_state *crtc_state,
struct dsc_compression_parameters_entry *dsc, struct dsc_compression_parameters_entry *dsc,
int dsc_max_bpc) int dsc_max_bpc)
{ {
struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config; struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
int bpc = 8; int bpc = 8;
...@@ -3411,7 +3418,7 @@ static void fill_dsc(struct intel_crtc_state *crtc_state, ...@@ -3411,7 +3418,7 @@ static void fill_dsc(struct intel_crtc_state *crtc_state,
else if (dsc->support_8bpc && dsc_max_bpc >= 8) else if (dsc->support_8bpc && dsc_max_bpc >= 8)
bpc = 8; bpc = 8;
else else
DRM_DEBUG_KMS("VBT: Unsupported BPC %d for DCS\n", drm_dbg_kms(&i915->drm, "VBT: Unsupported BPC %d for DCS\n",
dsc_max_bpc); dsc_max_bpc);
crtc_state->pipe_bpp = bpc * 3; crtc_state->pipe_bpp = bpc * 3;
...@@ -3432,14 +3439,14 @@ static void fill_dsc(struct intel_crtc_state *crtc_state, ...@@ -3432,14 +3439,14 @@ static void fill_dsc(struct intel_crtc_state *crtc_state,
} else { } else {
/* FIXME */ /* FIXME */
if (!(dsc->slices_per_line & BIT(0))) if (!(dsc->slices_per_line & BIT(0)))
DRM_DEBUG_KMS("VBT: Unsupported DSC slice count for DSI\n"); drm_dbg_kms(&i915->drm, "VBT: Unsupported DSC slice count for DSI\n");
crtc_state->dsc.slice_count = 1; crtc_state->dsc.slice_count = 1;
} }
if (crtc_state->hw.adjusted_mode.crtc_hdisplay % if (crtc_state->hw.adjusted_mode.crtc_hdisplay %
crtc_state->dsc.slice_count != 0) crtc_state->dsc.slice_count != 0)
DRM_DEBUG_KMS("VBT: DSC hdisplay %d not divisible by slice count %d\n", drm_dbg_kms(&i915->drm, "VBT: DSC hdisplay %d not divisible by slice count %d\n",
crtc_state->hw.adjusted_mode.crtc_hdisplay, crtc_state->hw.adjusted_mode.crtc_hdisplay,
crtc_state->dsc.slice_count); crtc_state->dsc.slice_count);
...@@ -3597,7 +3604,7 @@ int intel_bios_dp_boost_level(const struct intel_bios_encoder_data *devdata) ...@@ -3597,7 +3604,7 @@ int intel_bios_dp_boost_level(const struct intel_bios_encoder_data *devdata)
if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost) if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost)
return 0; return 0;
return translate_iboost(devdata->child.dp_iboost_level); return translate_iboost(devdata->i915, devdata->child.dp_iboost_level);
} }
int intel_bios_hdmi_boost_level(const struct intel_bios_encoder_data *devdata) int intel_bios_hdmi_boost_level(const struct intel_bios_encoder_data *devdata)
...@@ -3605,7 +3612,7 @@ int intel_bios_hdmi_boost_level(const struct intel_bios_encoder_data *devdata) ...@@ -3605,7 +3612,7 @@ int intel_bios_hdmi_boost_level(const struct intel_bios_encoder_data *devdata)
if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost) if (!devdata || devdata->i915->display.vbt.version < 196 || !devdata->child.iboost)
return 0; return 0;
return translate_iboost(devdata->child.hdmi_iboost_level); return translate_iboost(devdata->i915, devdata->child.hdmi_iboost_level);
} }
int intel_bios_hdmi_ddc_pin(const struct intel_bios_encoder_data *devdata) int intel_bios_hdmi_ddc_pin(const struct intel_bios_encoder_data *devdata)
......
...@@ -242,7 +242,8 @@ void intel_bios_init_panel_late(struct drm_i915_private *dev_priv, ...@@ -242,7 +242,8 @@ void intel_bios_init_panel_late(struct drm_i915_private *dev_priv,
const struct drm_edid *drm_edid); const struct drm_edid *drm_edid);
void intel_bios_fini_panel(struct intel_panel *panel); void intel_bios_fini_panel(struct intel_panel *panel);
void intel_bios_driver_remove(struct drm_i915_private *dev_priv); void intel_bios_driver_remove(struct drm_i915_private *dev_priv);
bool intel_bios_is_valid_vbt(const void *buf, size_t size); bool intel_bios_is_valid_vbt(struct drm_i915_private *i915,
const void *buf, size_t size);
bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv); bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv);
bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin); bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin);
bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port port); bool intel_bios_is_port_present(struct drm_i915_private *dev_priv, enum port port);
......
...@@ -887,7 +887,7 @@ static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv) ...@@ -887,7 +887,7 @@ static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv)
return ret; return ret;
} }
if (intel_bios_is_valid_vbt(fw->data, fw->size)) { if (intel_bios_is_valid_vbt(dev_priv, fw->data, fw->size)) {
opregion->vbt_firmware = kmemdup(fw->data, fw->size, GFP_KERNEL); opregion->vbt_firmware = kmemdup(fw->data, fw->size, GFP_KERNEL);
if (opregion->vbt_firmware) { if (opregion->vbt_firmware) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
...@@ -1034,7 +1034,7 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv) ...@@ -1034,7 +1034,7 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
vbt = opregion->rvda; vbt = opregion->rvda;
vbt_size = opregion->asle->rvds; vbt_size = opregion->asle->rvds;
if (intel_bios_is_valid_vbt(vbt, vbt_size)) { if (intel_bios_is_valid_vbt(dev_priv, vbt, vbt_size)) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Found valid VBT in ACPI OpRegion (RVDA)\n"); "Found valid VBT in ACPI OpRegion (RVDA)\n");
opregion->vbt = vbt; opregion->vbt = vbt;
...@@ -1059,7 +1059,7 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv) ...@@ -1059,7 +1059,7 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
vbt_size = (mboxes & MBOX_ASLE_EXT) ? vbt_size = (mboxes & MBOX_ASLE_EXT) ?
OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE; OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
vbt_size -= OPREGION_VBT_OFFSET; vbt_size -= OPREGION_VBT_OFFSET;
if (intel_bios_is_valid_vbt(vbt, vbt_size)) { if (intel_bios_is_valid_vbt(dev_priv, vbt, vbt_size)) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Found valid VBT in ACPI OpRegion (Mailbox #4)\n"); "Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
opregion->vbt = vbt; opregion->vbt = vbt;
......
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