/*
 * From Coreboot file of the same name
 *
 * Copyright (C) 2012 Chromium OS Authors
 *
 * SPDX-License-Identifier:	GPL-2.0
 */

/* mailbox 0: header */
__packed struct opregion_header {
	u8	signature[16];
	u32	size;
	u32	version;
	u8	sbios_version[32];
	u8	vbios_version[16];
	u8	driver_version[16];
	u32	mailboxes;
	u8	reserved[164];
};

#define IGD_OPREGION_SIGNATURE "IntelGraphicsMem"
#define IGD_OPREGION_VERSION  2

#define IGD_MBOX1	(1 << 0)
#define IGD_MBOX2	(1 << 1)
#define IGD_MBOX3	(1 << 2)
#define IGD_MBOX4	(1 << 3)
#define IGD_MBOX5	(1 << 4)

#define MAILBOXES_MOBILE  (IGD_MBOX1 | IGD_MBOX2 | IGD_MBOX3 | \
			   IGD_MBOX4 | IGD_MBOX5)
#define MAILBOXES_DESKTOP (IGD_MBOX2 | IGD_MBOX4)

#define SBIOS_VERSION_SIZE 32

/* mailbox 1: public acpi methods */
__packed struct opregion_mailbox1 {
	u32	drdy;
	u32	csts;
	u32	cevt;
	u8	reserved1[20];
	u32	didl[8];
	u32	cpdl[8];
	u32	cadl[8];
	u32	nadl[8];
	u32	aslp;
	u32	tidx;
	u32	chpd;
	u32	clid;
	u32	cdck;
	u32	sxsw;
	u32	evts;
	u32	cnot;
	u32	nrdy;
	u8	reserved2[60];
};

/* mailbox 2: software sci interface */
__packed struct opregion_mailbox2 {
	u32	scic;
	u32	parm;
	u32	dslp;
	u8	reserved[244];
};

/* mailbox 3: power conservation */
__packed struct opregion_mailbox3 {
	u32	ardy;
	u32	aslc;
	u32	tche;
	u32	alsi;
	u32	bclp;
	u32	pfit;
	u32	cblv;
	u16	bclm[20];
	u32	cpfm;
	u32	epfm;
	u8	plut[74];
	u32	pfmb;
	u32	ccdv;
	u32	pcft;
	u8	reserved[94];
};

#define IGD_BACKLIGHT_BRIGHTNESS 0xff
#define IGD_INITIAL_BRIGHTNESS 0x64

#define IGD_FIELD_VALID	(1 << 31)
#define IGD_WORD_FIELD_VALID (1 << 15)
#define IGD_PFIT_STRETCH 6

/* mailbox 4: vbt */
__packed struct {
	u8 gvd1[7168];
} opregion_vbt_t;

/* IGD OpRegion */
__packed struct igd_opregion {
	opregion_header_t header;
	opregion_mailbox1_t mailbox1;
	opregion_mailbox2_t mailbox2;
	opregion_mailbox3_t mailbox3;
	opregion_vbt_t vbt;
};

/* Intel Video BIOS (Option ROM) */
__packed struct optionrom_header {
	u16	signature;
	u8	size;
	u8	reserved[21];
	u16	pcir_offset;
	u16	vbt_offset;
};

#define OPROM_SIGNATURE 0xaa55

__packed struct optionrom_pcir {
	u32 signature;
	u16 vendor;
	u16 device;
	u16 reserved1;
	u16 length;
	u8  revision;
	u8  classcode[3];
	u16 imagelength;
	u16 coderevision;
	u8  codetype;
	u8  indicator;
	u16 reserved2;
};

__packed struct optionrom_vbt {
	u8  hdr_signature[20];
	u16 hdr_version;
	u16 hdr_size;
	u16 hdr_vbt_size;
	u8  hdr_vbt_checksum;
	u8  hdr_reserved;
	u32 hdr_vbt_datablock;
	u32 hdr_aim[4];
	u8  datahdr_signature[16];
	u16 datahdr_version;
	u16 datahdr_size;
	u16 datahdr_datablocksize;
	u8  coreblock_id;
	u16 coreblock_size;
	u16 coreblock_biossize;
	u8  coreblock_biostype;
	u8  coreblock_releasestatus;
	u8  coreblock_hwsupported;
	u8  coreblock_integratedhw;
	u8  coreblock_biosbuild[4];
	u8  coreblock_biossignon[155];
};

#define VBT_SIGNATURE 0x54425624