/* SPDX-License-Identifier: GPL-2.0-or-later */

#include <acpi/acpigen.h>
#include <stdio.h>
#include <string.h>
#include "i915.h"

void
drivers_intel_gma_displays_ssdt_generate(const struct i915_gpu_controller_info *conf)
{
	size_t i;
	const char *names[] = { "UNK", "VGA", "TV", "DVI", "LCD" };
	int counters[ARRAY_SIZE(names)] = { 0 };

	if (!conf->ndid)
		return;

	acpigen_write_scope("\\_SB.PCI0.GFX0");

	/*
	  Method (_DOD, 0)
	  {
		Return (Package() {
				0x5a5a5a5a,
				0x5a5a5a5a,
				0x5a5a5a5a
			})
	  }
	*/
	acpigen_write_method("_DOD", 0);

	acpigen_emit_byte(RETURN_OP);
	acpigen_write_package(conf->ndid);
	for (i = 0; i < conf->ndid; i++) {
		acpigen_write_dword(conf->did[i] | 0x80010000);
	}
	acpigen_pop_len(); /* End Package. */

	acpigen_pop_len(); /* End Method. */

	for (i = 0; i < conf->ndid; i++) {
		char name[5];
		int kind;

		kind = (conf->did[i] >> 8) & 0xf;
		if (kind >= ARRAY_SIZE(names)) {
			kind = 0;
		}

		snprintf(name, sizeof(name), "%s%d", names[kind], counters[kind]);
		counters[kind]++;

		/* Device (LCD0) */
		acpigen_write_device(name);

		/* Name (_ADR, 0x0410) */
		acpigen_write_name_dword("_ADR", conf->did[i] & 0xffff);

		/* ACPI brightness for LCD.  */
		if (kind == 4) {
			/*
			  Method (_BCL, 0, NotSerialized)
			  {
				Return (^^XBCL())
			  }
			*/
			acpigen_write_method("_BCL", 0);
			acpigen_emit_byte(RETURN_OP);
			acpigen_emit_namestring("^^XBCL");
			acpigen_pop_len();

			/*
			  Method (_BCM, 1, NotSerialized)
			  {
				^^XBCM(Arg0)
			  }
			*/
			acpigen_write_method("_BCM", 1);
			acpigen_emit_namestring("^^XBCM");
			acpigen_emit_byte(ARG0_OP);
			acpigen_pop_len();

			/*
			  Method (_BQC, 0, NotSerialized)
			  {
				Return (^^XBQC())
			  }
			*/
			acpigen_write_method("_BQC", 0);
			acpigen_emit_byte(RETURN_OP);
			acpigen_emit_namestring("^^XBQC");
			acpigen_pop_len();
		}

		/*
		 * _DCS, _DGS and _DSS are required by specification. However,
		 * we never implemented them properly, and no OS driver com-
		 * plained yet. So we stub them out and keep the traditional
		 * behavior in case an OS driver checks for their existence.
		 */

		/*
		  Method(_DCS, 0)
		  {
			Return (0x1d)
		  }
		*/
		acpigen_write_method("_DCS", 0);
		acpigen_write_return_integer(0x1d);
		acpigen_pop_len();

		/*
		  Method(_DGS, 0)
		  {
			Return (0)
		  }
		*/
		acpigen_write_method("_DGS", 0);
		acpigen_write_return_integer(0);
		acpigen_pop_len();

		/*
		  Method(_DSS, 1)
		  {
		  }
		*/
		acpigen_write_method("_DSS", 1);
		acpigen_pop_len();

		acpigen_pop_len(); /* End Device. */
	}

	acpigen_pop_len(); /* End Scope. */
}
