Nico Huber | 53ec8c5 | 2020-03-21 19:50:26 +0100 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 2 | |
Furquan Shaikh | 76cedd2 | 2020-05-02 10:24:23 -0700 | [diff] [blame] | 3 | #include <acpi/acpigen.h> |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 4 | #include <string.h> |
| 5 | #include "i915.h" |
| 6 | |
| 7 | void |
| 8 | drivers_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 Huber | bed7ad9 | 2020-03-21 19:09:45 +0100 | [diff] [blame] | 12 | int counters[ARRAY_SIZE(names)] = { 0 }; |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 13 | |
Nico Huber | 38641aa | 2020-03-31 17:51:18 +0200 | [diff] [blame] | 14 | if (!conf->ndid) |
| 15 | return; |
| 16 | |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 17 | acpigen_write_scope("\\_SB.PCI0.GFX0"); |
| 18 | |
| 19 | /* |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 20 | Method (_DOD, 0) |
| 21 | { |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 22 | Return (Package() { |
| 23 | 0x5a5a5a5a, |
| 24 | 0x5a5a5a5a, |
| 25 | 0x5a5a5a5a |
| 26 | }) |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 27 | } |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 28 | */ |
| 29 | acpigen_write_method("_DOD", 0); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 30 | |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 31 | acpigen_emit_byte(RETURN_OP); |
| 32 | acpigen_write_package(conf->ndid); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 33 | for (i = 0; i < conf->ndid; i++) { |
Elyes Haouas | 3467704 | 2023-08-26 16:42:11 +0200 | [diff] [blame^] | 34 | acpigen_write_dword(conf->did[i] | 0x80010000); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 35 | } |
| 36 | acpigen_pop_len(); /* End Package. */ |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 37 | |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 38 | acpigen_pop_len(); /* End Method. */ |
| 39 | |
| 40 | for (i = 0; i < conf->ndid; i++) { |
Nico Huber | c0be410 | 2020-03-21 18:52:14 +0100 | [diff] [blame] | 41 | char name[5]; |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 42 | int kind; |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 43 | |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 44 | kind = (conf->did[i] >> 8) & 0xf; |
| 45 | if (kind >= ARRAY_SIZE(names)) { |
| 46 | kind = 0; |
| 47 | } |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 48 | |
Nico Huber | c0be410 | 2020-03-21 18:52:14 +0100 | [diff] [blame] | 49 | snprintf(name, sizeof(name), "%s%d", names[kind], counters[kind]); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 50 | counters[kind]++; |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 51 | |
| 52 | /* Device (LCD0) */ |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 53 | acpigen_write_device(name); |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 54 | |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 55 | /* 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 HAOUAS | 0d8f1da | 2018-05-28 15:48:04 +0200 | [diff] [blame] | 63 | Return (^^XBCL()) |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 64 | } |
| 65 | */ |
| 66 | acpigen_write_method("_BCL", 0); |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 67 | acpigen_emit_byte(RETURN_OP); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 68 | acpigen_emit_namestring("^^XBCL"); |
| 69 | acpigen_pop_len(); |
| 70 | |
| 71 | /* |
| 72 | Method (_BCM, 1, NotSerialized) |
| 73 | { |
Elyes HAOUAS | 0d8f1da | 2018-05-28 15:48:04 +0200 | [diff] [blame] | 74 | ^^XBCM(Arg0) |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 75 | } |
| 76 | */ |
| 77 | acpigen_write_method("_BCM", 1); |
| 78 | acpigen_emit_namestring("^^XBCM"); |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 79 | acpigen_emit_byte(ARG0_OP); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 80 | acpigen_pop_len(); |
| 81 | |
| 82 | /* |
| 83 | Method (_BQC, 0, NotSerialized) |
| 84 | { |
Elyes HAOUAS | 0d8f1da | 2018-05-28 15:48:04 +0200 | [diff] [blame] | 85 | Return (^^XBQC()) |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 86 | } |
| 87 | */ |
| 88 | acpigen_write_method("_BQC", 0); |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 89 | acpigen_emit_byte(RETURN_OP); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 90 | acpigen_emit_namestring("^^XBQC"); |
| 91 | acpigen_pop_len(); |
| 92 | } |
| 93 | |
| 94 | /* |
Nico Huber | e98f6af | 2020-03-21 18:40:03 +0100 | [diff] [blame] | 95 | * _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 Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 106 | */ |
| 107 | acpigen_write_method("_DCS", 0); |
Nico Huber | e98f6af | 2020-03-21 18:40:03 +0100 | [diff] [blame] | 108 | acpigen_write_return_integer(0x1d); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 109 | acpigen_pop_len(); |
| 110 | |
| 111 | /* |
Nico Huber | e98f6af | 2020-03-21 18:40:03 +0100 | [diff] [blame] | 112 | Method(_DGS, 0) |
| 113 | { |
| 114 | Return (0) |
| 115 | } |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 116 | */ |
| 117 | acpigen_write_method("_DGS", 0); |
Nico Huber | e98f6af | 2020-03-21 18:40:03 +0100 | [diff] [blame] | 118 | acpigen_write_return_integer(0); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 119 | acpigen_pop_len(); |
| 120 | |
| 121 | /* |
Nico Huber | e98f6af | 2020-03-21 18:40:03 +0100 | [diff] [blame] | 122 | Method(_DSS, 1) |
| 123 | { |
| 124 | } |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 125 | */ |
Matt DeVillier | 17b1a69 | 2017-05-27 17:49:21 -0500 | [diff] [blame] | 126 | acpigen_write_method("_DSS", 1); |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 127 | acpigen_pop_len(); |
| 128 | |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 129 | acpigen_pop_len(); /* End Device. */ |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 130 | } |
| 131 | |
Nico Huber | 53c1717 | 2020-03-21 18:47:24 +0100 | [diff] [blame] | 132 | acpigen_pop_len(); /* End Scope. */ |
Vladimir Serbinenko | dd2bc3f | 2014-10-31 09:16:31 +0100 | [diff] [blame] | 133 | } |