Commit eb2983c0 authored by Jouni Högander's avatar Jouni Högander Committed by Jani Nikula
Browse files

drm/i915/opregion: add function to check if headless sku



Export headless sku bit (bit 13) from opregion->header->pcon as an
interface to check if our device is headless configuration.

This is mainly targeted for hybrid gfx systems. E.g. when display
is not supposed to be connected discrete graphics card it's
opregion can inform this is headless graphics card.

v3: Dummy version is now static inline function
v2: Check also opregion version

Bspec: 53441
Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarJouni Högander <jouni.hogander@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220610085429.52935-2-jouni.hogander@intel.com
parent 8d2ba05b
Loading
Loading
Loading
Loading
+14 −0
Original line number Original line Diff line number Diff line
@@ -53,6 +53,8 @@
#define MBOX_ASLE_EXT		BIT(4)	/* Mailbox #5 */
#define MBOX_ASLE_EXT		BIT(4)	/* Mailbox #5 */
#define MBOX_BACKLIGHT		BIT(5)	/* Mailbox #2 (valid from v3.x) */
#define MBOX_BACKLIGHT		BIT(5)	/* Mailbox #2 (valid from v3.x) */


#define PCON_HEADLESS_SKU	BIT(13)

struct opregion_header {
struct opregion_header {
	u8 signature[16];
	u8 signature[16];
	u32 size;
	u32 size;
@@ -1135,6 +1137,18 @@ struct edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
	return new_edid;
	return new_edid;
}
}


bool intel_opregion_headless_sku(struct drm_i915_private *i915)
{
	struct intel_opregion *opregion = &i915->opregion;
	struct opregion_header *header = opregion->header;

	if (!header || header->over.major < 2 ||
	    (header->over.major == 2 && header->over.minor < 3))
		return false;

	return opregion->header->pcon & PCON_HEADLESS_SKU;
}

void intel_opregion_register(struct drm_i915_private *i915)
void intel_opregion_register(struct drm_i915_private *i915)
{
{
	struct intel_opregion *opregion = &i915->opregion;
	struct intel_opregion *opregion = &i915->opregion;
+7 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,8 @@ int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
struct edid *intel_opregion_get_edid(struct intel_connector *connector);
struct edid *intel_opregion_get_edid(struct intel_connector *connector);


bool intel_opregion_headless_sku(struct drm_i915_private *i915);

#else /* CONFIG_ACPI*/
#else /* CONFIG_ACPI*/


static inline int intel_opregion_setup(struct drm_i915_private *dev_priv)
static inline int intel_opregion_setup(struct drm_i915_private *dev_priv)
@@ -127,6 +129,11 @@ intel_opregion_get_edid(struct intel_connector *connector)
	return NULL;
	return NULL;
}
}


static inline bool intel_opregion_headless_sku(struct drm_i915_private *i915)
{
	return false;
}

#endif /* CONFIG_ACPI */
#endif /* CONFIG_ACPI */


#endif
#endif