blob: 2ee1d63a8e2422d5bff0529c9251025cb3b61f0a [file] [log] [blame]
Nico Huber53ec8c52020-03-21 19:50:26 +01001/* SPDX-License-Identifier: GPL-2.0-or-later */
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +01002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpigen.h>
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +01004#include <string.h>
5#include "i915.h"
6
7void
8drivers_intel_gma_displays_ssdt_generate(const struct i915_gpu_controller_info *conf)
9{
10 size_t i;
11 const char *names[] = { "UNK", "VGA", "TV", "DVI", "LCD" };
Nico Huberbed7ad92020-03-21 19:09:45 +010012 int counters[ARRAY_SIZE(names)] = { 0 };
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010013
Nico Huber38641aa2020-03-31 17:51:18 +020014 if (!conf->ndid)
15 return;
16
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010017 acpigen_write_scope("\\_SB.PCI0.GFX0");
18
19 /*
Nico Huber53c17172020-03-21 18:47:24 +010020 Method (_DOD, 0)
21 {
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010022 Return (Package() {
23 0x5a5a5a5a,
24 0x5a5a5a5a,
25 0x5a5a5a5a
26 })
Nico Huber53c17172020-03-21 18:47:24 +010027 }
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010028 */
29 acpigen_write_method("_DOD", 0);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010030
Nico Huber53c17172020-03-21 18:47:24 +010031 acpigen_emit_byte(RETURN_OP);
32 acpigen_write_package(conf->ndid);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010033 for (i = 0; i < conf->ndid; i++) {
Elyes Haouas34677042023-08-26 16:42:11 +020034 acpigen_write_dword(conf->did[i] | 0x80010000);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010035 }
36 acpigen_pop_len(); /* End Package. */
Nico Huber53c17172020-03-21 18:47:24 +010037
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010038 acpigen_pop_len(); /* End Method. */
39
40 for (i = 0; i < conf->ndid; i++) {
Nico Huberc0be4102020-03-21 18:52:14 +010041 char name[5];
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010042 int kind;
Nico Huber53c17172020-03-21 18:47:24 +010043
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010044 kind = (conf->did[i] >> 8) & 0xf;
45 if (kind >= ARRAY_SIZE(names)) {
46 kind = 0;
47 }
Nico Huber53c17172020-03-21 18:47:24 +010048
Nico Huberc0be4102020-03-21 18:52:14 +010049 snprintf(name, sizeof(name), "%s%d", names[kind], counters[kind]);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010050 counters[kind]++;
Nico Huber53c17172020-03-21 18:47:24 +010051
52 /* Device (LCD0) */
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010053 acpigen_write_device(name);
Nico Huber53c17172020-03-21 18:47:24 +010054
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010055 /* Name (_ADR, 0x0410) */
56 acpigen_write_name_dword("_ADR", conf->did[i] & 0xffff);
57
58 /* ACPI brightness for LCD. */
59 if (kind == 4) {
60 /*
61 Method (_BCL, 0, NotSerialized)
62 {
Elyes HAOUAS0d8f1da2018-05-28 15:48:04 +020063 Return (^^XBCL())
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010064 }
65 */
66 acpigen_write_method("_BCL", 0);
Nico Huber53c17172020-03-21 18:47:24 +010067 acpigen_emit_byte(RETURN_OP);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010068 acpigen_emit_namestring("^^XBCL");
69 acpigen_pop_len();
70
71 /*
72 Method (_BCM, 1, NotSerialized)
73 {
Elyes HAOUAS0d8f1da2018-05-28 15:48:04 +020074 ^^XBCM(Arg0)
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010075 }
76 */
77 acpigen_write_method("_BCM", 1);
78 acpigen_emit_namestring("^^XBCM");
Nico Huber53c17172020-03-21 18:47:24 +010079 acpigen_emit_byte(ARG0_OP);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010080 acpigen_pop_len();
81
82 /*
83 Method (_BQC, 0, NotSerialized)
84 {
Elyes HAOUAS0d8f1da2018-05-28 15:48:04 +020085 Return (^^XBQC())
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010086 }
87 */
88 acpigen_write_method("_BQC", 0);
Nico Huber53c17172020-03-21 18:47:24 +010089 acpigen_emit_byte(RETURN_OP);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +010090 acpigen_emit_namestring("^^XBQC");
91 acpigen_pop_len();
92 }
93
94 /*
Nico Hubere98f6af2020-03-21 18:40:03 +010095 * _DCS, _DGS and _DSS are required by specification. However,
96 * we never implemented them properly, and no OS driver com-
97 * plained yet. So we stub them out and keep the traditional
98 * behavior in case an OS driver checks for their existence.
99 */
100
101 /*
102 Method(_DCS, 0)
103 {
104 Return (0x1d)
105 }
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100106 */
107 acpigen_write_method("_DCS", 0);
Nico Hubere98f6af2020-03-21 18:40:03 +0100108 acpigen_write_return_integer(0x1d);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100109 acpigen_pop_len();
110
111 /*
Nico Hubere98f6af2020-03-21 18:40:03 +0100112 Method(_DGS, 0)
113 {
114 Return (0)
115 }
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100116 */
117 acpigen_write_method("_DGS", 0);
Nico Hubere98f6af2020-03-21 18:40:03 +0100118 acpigen_write_return_integer(0);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100119 acpigen_pop_len();
120
121 /*
Nico Hubere98f6af2020-03-21 18:40:03 +0100122 Method(_DSS, 1)
123 {
124 }
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100125 */
Matt DeVillier17b1a692017-05-27 17:49:21 -0500126 acpigen_write_method("_DSS", 1);
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100127 acpigen_pop_len();
128
Nico Huber53c17172020-03-21 18:47:24 +0100129 acpigen_pop_len(); /* End Device. */
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100130 }
131
Nico Huber53c17172020-03-21 18:47:24 +0100132 acpigen_pop_len(); /* End Scope. */
Vladimir Serbinenkodd2bc3f2014-10-31 09:16:31 +0100133}